diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..e559023b1 --- /dev/null +++ b/.clang-format @@ -0,0 +1,13 @@ +BasedOnStyle: LLVM +BreakBeforeBraces: Linux +UseTab: Never +IndentWidth: 4 +TabWidth: 4 +ColumnLimit: 0 +AccessModifierOffset: -4 +AllowShortIfStatementsOnASingleLine: Always +AlignAfterOpenBracket: DontAlign +BreakConstructorInitializers: AfterColon +NamespaceIndentation: None +IndentCaseLabels: true +SortIncludes: Never diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..fb9105078 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug report +about: Is something not working as it should? Please report it here. +title: '' +labels: '' +assignees: '' + +--- + + + +**Short description** + + +**Steps to reproduce** + + +**Expected behavior** + + +**Additional information** + diff --git a/.github/ISSUE_TEMPLATE/camera-support---color-calibration.md b/.github/ISSUE_TEMPLATE/camera-support---color-calibration.md new file mode 100644 index 000000000..5b787c7aa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/camera-support---color-calibration.md @@ -0,0 +1,13 @@ +--- +name: Camera support / color calibration +about: Report new file formats or requests for color calibration support here +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature-request---enhancements.md b/.github/ISSUE_TEMPLATE/feature-request---enhancements.md new file mode 100644 index 000000000..9eccbe37c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request---enhancements.md @@ -0,0 +1,15 @@ +--- +name: Feature request / enhancements +about: Ideas and suggestions for improvement are always welcome! +title: '' +labels: '' +assignees: '' + +--- + + + + diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml new file mode 100644 index 000000000..6b286b68b --- /dev/null +++ b/.github/workflows/appimage.yml @@ -0,0 +1,201 @@ +name: AppImage Build +on: + push: + branches: + - dev + - releases + tags: + - '[0-9]+.*' + pull_request: + branches: + - dev + workflow_dispatch: +env: + publish_pre_dev_labels: '["Beep6581:ladenoise_improv"]' +jobs: + build: + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + matrix: + build_type: [release] + steps: + - name: Checkout source + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + echo "Running apt update." + sudo apt update + echo "Installing dependencies with apt." + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin + + - name: Configure build + run: | + export REF_NAME_FILTERED="$(echo '${{github.ref_name}}' | sed 's/[^A-z0-9_.-]//g')" + + echo "Setting cache suffix." + if [ '${{github.ref_type}}' == 'tag' ]; then + export CACHE_SUFFIX="" + else + export CACHE_SUFFIX="5-$REF_NAME_FILTERED" + fi + export CACHE_SUFFIX="$CACHE_SUFFIX-AppImage" + echo "Cache suffix is '$CACHE_SUFFIX'." + + echo "Making build directory." + mkdir build + echo "Changing working directory to the build directory." + cd build + + echo "Running CMake configure." + cmake \ + -DCMAKE_BUILD_TYPE='${{matrix.build_type}}' \ + -DCACHE_NAME_SUFFIX="$CACHE_SUFFIX" \ + -DPROC_TARGET_NUMBER="1" \ + -DBUILD_BUNDLE="ON" \ + -DBUNDLE_BASE_INSTALL_DIR="/" \ + -DOPTION_OMP="ON" \ + -DWITH_LTO="OFF" \ + -DWITH_PROF="OFF" \ + -DWITH_SAN="OFF" \ + -DWITH_SYSTEM_KLT="OFF" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLENSFUNDBDIR="../share/lensfun/version_1" \ + .. + + echo "Recording filtered ref name." + echo "REF_NAME_FILTERED=$REF_NAME_FILTERED" >> $GITHUB_ENV + + - name: Build RawTherapee + working-directory: ./build + run: | + echo "Running make install." + make -j$(nproc) install DESTDIR=AppDir/usr/bin + echo "Moving usr/bin/share to usr/share." + mv AppDir/usr/bin/share AppDir/usr/ + + - name: Include Lensfun + run: | + echo "Patching lensfun-update-data script." + sudo sed -i 's/HTTPError\(, ValueError\)/URLError\1/' $(which lensfun-update-data) + echo "Updating Lensfun database." + lensfun-update-data + echo "Creating Lensfun directory in the build directory." + mkdir -p build/AppDir/usr/share/lensfun + echo "Copying Lensfun database to the build directory." + cp -R ~/.local/share/lensfun/updates/* build/AppDir/usr/share/lensfun/ + + - name: Restore AppImage tools from cache + id: appimage-tools-cache + uses: actions/cache@v2 + with: + key: appimage-tools-1 + path: | + ./build/linuxdeploy-x86_64.AppImage + ./build/linuxdeploy-plugin-gtk.sh + + - name: Download AppImage tools + if: ${{steps.appimage-tools-cache.outputs.cache-hit != 'true'}} + working-directory: ./build + run: | + echo "Downloading linuxdeploy." + curl --location 'https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage' > linuxdeploy-x86_64.AppImage + echo "Downloading GTK plugin for linuxdeploy." + curl --location 'https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh' \ + | sed 's/^\(export GTK_THEME\)/#\1/' \ + > linuxdeploy-plugin-gtk.sh + echo "Setting execute bit on all AppImage tools." + chmod u+x linuxdeploy-* + + - name: Package AppImage + working-directory: ./build + run: | + echo "Creating artifact name." + if [ '${{github.ref_type}}' == 'tag' ]; then + ARTIFACT_NAME="RawTherapee_${REF_NAME_FILTERED}_${{matrix.build_type}}" + else + echo "Getting RawTherapee version." + export VERSION="$(grep -m 1 '^Version: .*$' 'AboutThisBuild.txt' | sed 's/^Version: \(.\+\)$/\1/')" + echo "Version is '$VERSION'." + FILTERED_VERSION="$(echo "$VERSION" | sed 's/[^A-z0-9_.-]//g')" + ARTIFACT_NAME="RawTherapee_${REF_NAME_FILTERED}_${FILTERED_VERSION}_${{matrix.build_type}}" + fi + echo "Artifact name is '$ARTIFACT_NAME'." + + echo "Generating AppImage file name." + export OUTPUT="$ARTIFACT_NAME.AppImage" + echo "AppImage file name will be '$OUTPUT'." + + echo "Packaging AppImage." + ./linuxdeploy-x86_64.AppImage \ + --appimage-extract-and-run \ + --appdir AppDir \ + --plugin gtk \ + --output appimage + + echo "Recording artifact name." + echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: ${{env.ARTIFACT_NAME}}.AppImage + path: ${{github.workspace}}/build/${{env.ARTIFACT_NAME}}.AppImage + + - name: Prepare for publishing + if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} + run: | + echo "Setting publish name." + PUBLISH_NAME="RawTherapee_${REF_NAME_FILTERED}_${{matrix.build_type}}" + echo "Publish name is '$PUBLISH_NAME'." + + echo "Renaming AppImage." + cp "build/$ARTIFACT_NAME.AppImage" "$PUBLISH_NAME.AppImage" + + echo "Creating version file." + cp "build/AboutThisBuild.txt" "$PUBLISH_NAME-AboutThisBuild.txt" + + echo "Recording publish name." + echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV + + - name: Publish artifacts + uses: softprops/action-gh-release@v1 + if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} + with: + tag_name: nightly-github-actions + files: | + ${{env.PUBLISH_NAME}}.AppImage + ${{env.PUBLISH_NAME}}-AboutThisBuild.txt + + - name: Prepare for publishing pre-dev + id: prepare-publish-pre-dev + if: ${{github.event_name == 'pull_request' && contains(fromJSON(env.publish_pre_dev_labels), github.event.pull_request.head.label)}} + run: | + echo "Making ref name." + REF_NAME_FILTERED="$(echo '${{github.event.pull_request.head.label}}' | tr ':' '_' | sed 's/[^A-z0-9_.-]//g')" + echo "Ref name is '$REF_NAME_FILTERED'." + + echo "Setting publish name." + PUBLISH_NAME="RawTherapee_${REF_NAME_FILTERED}_${{matrix.build_type}}" + echo "Publish name is '$PUBLISH_NAME'." + + echo "Renaming AppImage." + cp "build/$ARTIFACT_NAME.AppImage" "$PUBLISH_NAME.AppImage" + + echo "Creating version file." + cp "build/AboutThisBuild.txt" "$PUBLISH_NAME-AppImage-AboutThisBuild.txt" + + echo "Recording publish name." + echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV + + - name: Publish pre-dev artifacts + uses: softprops/action-gh-release@v1 + if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}} + with: + tag_name: pre-dev-github-actions + files: | + ${{env.PUBLISH_NAME}}.AppImage + ${{env.PUBLISH_NAME}}-AppImage-AboutThisBuild.txt diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000..b90d30e27 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,89 @@ +name: "CodeQL" + +on: + push: + branches: [ 'dev' ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ 'dev' ] + schedule: + - cron: '56 5 * * 1' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + build_type: [release] + language: [ 'cpp', 'python' ] + + steps: + - name: Checkout source + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + echo "Running apt update." + sudo apt update + echo "Installing dependencies with apt." + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin + + - name: Configure build + run: | + export REF_NAME_FILTERED="$(echo '${{github.ref_name}}' | sed 's/[^A-z0-9_.-]//g')" + echo "Setting cache suffix." + if [ '${{github.ref_type}}' == 'tag' ]; then + export CACHE_SUFFIX="" + else + export CACHE_SUFFIX="5-$REF_NAME_FILTERED" + fi + export CACHE_SUFFIX="$CACHE_SUFFIX-AppImage" + echo "Cache suffix is '$CACHE_SUFFIX'." + echo "Making build directory." + mkdir build + echo "Changing working directory to the build directory." + cd build + echo "Running CMake configure." + cmake \ + -DCMAKE_BUILD_TYPE='${{matrix.build_type}}' \ + -DCACHE_NAME_SUFFIX="$CACHE_SUFFIX" \ + -DPROC_TARGET_NUMBER="1" \ + -DBUILD_BUNDLE="ON" \ + -DBUNDLE_BASE_INSTALL_DIR="/" \ + -DOPTION_OMP="ON" \ + -DWITH_LTO="OFF" \ + -DWITH_PROF="OFF" \ + -DWITH_SAN="OFF" \ + -DWITH_SYSTEM_KLT="OFF" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLENSFUNDBDIR="../share/lensfun/version_1" \ + .. + echo "Recording filtered ref name." + echo "REF_NAME_FILTERED=$REF_NAME_FILTERED" >> $GITHUB_ENV + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + + - name: Build RawTherapee + working-directory: ./build + run: | + echo "Running make install." + make -j$(nproc) install DESTDIR=AppDir/usr/bin + echo "Moving usr/bin/share to usr/share." + mv AppDir/usr/bin/share AppDir/usr/ + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 000000000..3348d48b9 --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,111 @@ +name: macOS Build +on: + push: + branches: + - dev + - releases + tags: + - '[0-9]+.*' + pull_request: + branches: + - dev + workflow_dispatch: +jobs: + build: + runs-on: macos-11 + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: | + date -u + mkdir build + date +%s > build/stamp + brew uninstall --ignore-dependencies libtiff + brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info | tee -a depslog + date -u + echo "----====Pourage====----" + cat depslog | grep Pouring + zsh -c 'echo "Completed installation of dependencies in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"' + - name: Configure build system + env: + CMAKE_CXX_STANDARD: 11 + PKG_CONFIG_PATH: /usr/local/opt/libtiff/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig + RAW_THERAPEE_MAJOR: '5' + RAW_THERAPEE_MINOR: '8' + C_FLAGS: > + -arch x86_64 -mtune=generic -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/libtiff/include + run: | + # GITHUB_REF is the ref that triggered the build, like + # refs/heads/new-feature - the next line parses that to REF: the branch + # name only (new-feature) + export REF=${GITHUB_REF##*/} + export C_FLAGS=$(echo -e $C_FLAGS | tr -d '\n') + cd build && date -u && date +%s > configstamp + cmake \ + -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ + -DCMAKE_EXE_LINKER_FLAGS="-L. -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ + -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ + -DPROC_TARGET_NUMBER="1" \ + -DPROC_LABEL="generic processor" \ + -DCMAKE_OSX_ARCHITECTURES=$(uname -m) \ + -DWITH_LTO="OFF" \ + -DLENSFUNDBDIR="/Applications/RawTherapee.app/Contents/Resources/share/lensfun" \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_C_FLAGS="-arch x86_64 -Wno-pass-failed -Wno-deprecated-register -Wno-unused-command-line-argument" \ + -DCMAKE_CXX_FLAGS="-arch x86_64 -Wno-pass-failed -Wno-deprecated-register -Wno-unused-command-line-argument" \ + -DOpenMP_C_FLAGS="${C_FLAGS}" \ + -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ + -DOpenMP_C_LIB_NAMES=libomp \ + -DOpenMP_CXX_LIB_NAMES=libomp \ + -DOpenMP_libomp_LIBRARY=/usr/local/lib/libomp.dylib \ + -DCMAKE_AR=/usr/bin/ar \ + -DCMAKE_RANLIB=/usr/bin/ranlib \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ + -DOSX_CONTINUOUS=ON \ + .. + curl -L https://github.com/Homebrew/homebrew-core/raw/679923b4eb48a8dc7ecc1f05d06063cd79b3fc00/Formula/libomp.rb -o libomp.rb && brew install --formula libomp.rb + zsh -c 'echo "Configured in $(printf "%0.2f" $(($[$(date +%s)-$(cat configstamp)]/$((60.))))) minutes"' + - name: Compile RawTherapee + run: | + date -u && date +%s > build/compilestamp + cd build + export REF=${GITHUB_REF##*/} + make -j$(sysctl -a | grep machdep.cpu.thread_count | tail -c 2) install + zsh -c 'echo "Compiled in $(printf "%0.2f" $(($[$(date +%s)-$(cat compilestamp)]/$((60.))))) minutes"' + - name: Create application bundle + run: | + zsh + date +%s > build/bundlestamp && date -u && cd build + export REF=${GITHUB_REF##*/} && export LOCAL_PREFIX=/usr && sudo make macosx_bundle + export ARTIFACT=(RawTherapee*${CMAKE_BUILD_TYPE}.zip) + echo "=== artifact: ${ARTIFACT}" + # defining environment variables for next step as per + # https://github.com/actions/starter-workflows/issues/68 + echo "ARTIFACT_PATH=${GITHUB_WORKSPACE}/build/${ARTIFACT}" >> $GITHUB_ENV + echo "ARTIFACT_FILE=${ARTIFACT}" >> $GITHUB_ENV + zsh -c 'echo "Bundled in $(printf "%0.2f" $(($[$(date +%s)-$(cat bundlestamp)]/$((60.))))) minutes"' + printf '%s\n' \ + "REF: ${REF}" \ + "ARTIFACT: ${ARTIFACT}" \ + "ARTIFACT_PATH: ${ARTIFACT_PATH}" \ + "ARTIFACT_FILE: ${ARTIFACT_FILE}" \ + "PUBLISH_NAME: ${PUBLISH_NAME}" + exit + - uses: actions/upload-artifact@v3 + with: + name: ${{env.ARTIFACT_FILE}} + path: ${{env.ARTIFACT_PATH}} + - name: Finish build + run: | + date -u + zsh -c 'echo "Build completed in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"' + + - name: Publish artifacts + uses: softprops/action-gh-release@v1 + if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} + with: + tag_name: nightly-github-actions + files: | + ${{env.ARTIFACT_PATH}} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index bab7397a6..000000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: macOS build - -on: - push - -jobs: - build: - - runs-on: macos-latest - - steps: - - uses: actions/checkout@v1 - - name: Install dependencies - run: brew install gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++ little-cms2 libiptcdata fftw lensfun llvm expat pkgconfig libomp shared-mime-info - - name: patch libiconv - run: | - mkdir libiconv && cd libiconv - wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz - tar xf libiconv-1.16.tar.gz - cd libiconv-1.16 - patch -p1 < "${GITHUB_WORKSPACE}/tools/osx/libiconv_1.16_rt.patch" - mkdir build && cd build - destDir="$(pwd)" - ../configure --prefix=/opt/local --disable-static 'CFLAGS=-arch x86_64 -mmacosx-version-min=10.9' 'LDFLAGS=-arch x86_64 -mmacosx-version-min=10.9' CXXFLAGS="-arch x86_64 -mmacosx-version-min=10.9" - make --jobs - make DESTDIR="${destDir}" install - sudo mv opt/local /usr/local/opt/libiconv - - name: cmake - env: - CMAKE_CXX_STANDARD: 11 - PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig - RAW_THERAPEE_MAJOR: '5' - RAW_THERAPEE_MINOR: '7' - C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include - run: | - # GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature) - REF=${GITHUB_REF##*/} - mkdir build && cd build - cmake \ - -DCMAKE_BUILD_TYPE="release" \ - -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ - -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -L/usr/local/opt/gdk-pixbuf/lib -L/usr/local/opt/libiconv/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/libxml2/lib -L/usr/local/opt/expat/lib" \ - -DCACHE_NAME_SUFFIX="${RAW_THERAPEE_MAJOR}.${RAW_THERAPEE_MINOR}-${REF}" \ - -DPROC_TARGET_NUMBER="2" \ - -DPROC_LABEL="generic processor" \ - -DWITH_LTO="OFF" \ - -DLENSFUNDBDIR="./share/lensfun" \ - -DOpenMP_C_FLAGS=-fopenmp=libomp \ - -DOpenMP_CXX_FLAGS=-fopenmp=libomp \ - -DOpenMP_C_LIB_NAMES="libomp" \ - -DOpenMP_CXX_LIB_NAMES="libomp" \ - -DOpenMP_libomp_LIBRARY="/usr/local/lib/libomp.dylib" \ - -DOpenMP_C_FLAGS="${C_FLAGS}" \ - -DOpenMP_CXX_FLAGS="${C_FLAGS}" \ - -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ - -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ - .. - make --jobs - make install - sudo make macosx_bundle - ARTIFACT=(RawTherapee*.zip) - echo "=== artifact: ${ARTIFACT}" - # defining environment variables for next step as per https://github.com/actions/starter-workflows/issues/68 - echo "::set-env name=ARTIFACT_PATH::${GITHUB_WORKSPACE}/build/${ARTIFACT}" - echo "::set-env name=ARTIFACT_FILE::${ARTIFACT}" - - uses: actions/upload-artifact@v1 - with: - name: ${{env.ARTIFACT_FILE}} - path: ${{env.ARTIFACT_PATH}} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 000000000..bdcd98c1c --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,288 @@ +name: Windows Build +on: + push: + branches: + - dev + - releases + tags: + - '[0-9]+.*' + pull_request: + branches: + - dev + workflow_dispatch: +env: + publish_pre_dev_labels: '["Beep6581:ladenoise_improv"]' +jobs: + build: + runs-on: windows-2022 + defaults: + run: + shell: msys2 {0} + strategy: + fail-fast: false + matrix: + build_type: [release, debug] + steps: + - name: Checkout source + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install dependencies + uses: msys2/setup-msys2@v2 + with: + location: C:\msys2 + update: true + install: | + gzip + git + intltool + mingw-w64-x86_64-gcc + mingw-w64-x86_64-make + mingw-w64-x86_64-pkg-config + mingw-w64-x86_64-cmake + mingw-w64-x86_64-ninja + mingw-w64-x86_64-gtkmm3 + mingw-w64-x86_64-lcms2 + mingw-w64-x86_64-fftw + mingw-w64-x86_64-lensfun + mingw-w64-x86_64-libiptcdata + + - name: Configure build + run: | + export REF_NAME_FILTERED="$(echo '${{github.ref_name}}' | sed 's/[^A-z0-9_.-]//g')" + + if [ '${{github.ref_type}}' == 'tag' ]; then + export CACHE_SUFFIX="" + else + echo "Setting cache suffix." + export CACHE_SUFFIX="5-$REF_NAME_FILTERED" + echo "Cache suffix is '$CACHE_SUFFIX'." + fi + + echo "Making build directory." + mkdir build + echo "Changing working directory to the build directory." + cd build + + echo "Running CMake configure." + cmake \ + -G "Ninja" \ + -DCMAKE_BUILD_TYPE='${{matrix.build_type}}' \ + -DCACHE_NAME_SUFFIX="$CACHE_SUFFIX" \ + -DPROC_TARGET_NUMBER="1" \ + -DLENSFUNDBDIR="share/lensfun" \ + .. + + echo "Recording filtered ref name." + echo "REF_NAME_FILTERED=$REF_NAME_FILTERED" >> "$(cygpath -u $GITHUB_ENV)" + + - name: Build RawTherapee + working-directory: ./build + run: | + echo "Running CMake install." + cmake --build . --target install + + - name: Include Lensfun + run: | + echo "Patching lensfun-update-data script." + sed -i 's/HTTPError\(, ValueError\)/URLError\1/' $(which lensfun-update-data) + echo "Updating Lensfun database." + lensfun-update-data + echo "Creating Lensfun directory in the build directory." + mkdir -p 'build/${{matrix.build_type}}/share' + echo "Copying Lensfun database to the build directory." + cp -R "/C/msys2/msys64/mingw64/var/lib/lensfun-updates/version_1" 'build/${{matrix.build_type}}/share/lensfun' + + - name: Bundle dependencies + run: | + echo "Listing shared library dependencies." + ldd "./build/${{matrix.build_type}}/rawtherapee.exe" + echo "Finding DLLs to include." + DLLS=($(ldd "./build/${{matrix.build_type}}/rawtherapee.exe" | grep '/mingw64/bin/' | awk '{print($1)'})) + echo "Required DLLs are: ${DLLS[*]}" + + echo "Getting workspace path." + export BUILD_DIR="$(pwd)/build/${{matrix.build_type}}" + echo "Build directory is '$BUILD_DIR'." + echo "Changing working directory to MSYS2 MINGW64." + cd "/C/msys2/msys64/mingw64" + echo "Copying DLLs and EXEs." + + cd ./bin + cp \ + "gdbus.exe" \ + "gspawn-win64-helper.exe" \ + "gspawn-win64-helper-console.exe" \ + ${DLLS[*]} \ + "$BUILD_DIR" + cd - + + echo "Copying Adwaita theme." + mkdir -p "$BUILD_DIR/share/icons/Adwaita" + cd 'share/icons/Adwaita/' + mkdir -p "$BUILD_DIR/share/icons/Adwaita/symbolic" + cp -r \ + "symbolic/actions" \ + "symbolic/devices" \ + "symbolic/mimetypes" \ + "symbolic/places" \ + "symbolic/status" \ + "symbolic/ui" \ + "$BUILD_DIR/share/icons/Adwaita/symbolic" + cp 'index.theme' "$BUILD_DIR/share/icons/Adwaita" + mkdir -p "$BUILD_DIR/share/icons/Adwaita/cursors" + cp -r \ + "cursors/plus.cur" \ + "cursors/sb_h_double_arrow.cur" \ + "cursors/sb_left_arrow.cur" \ + "cursors/sb_right_arrow.cur" \ + "cursors/sb_v_double_arrow.cur" \ + "$BUILD_DIR/share/icons/Adwaita/cursors" + cd - + + echo "Copying GDK pixbuf." + mkdir -p "$BUILD_DIR/lib" + cp -r 'lib/gdk-pixbuf-2.0' "$BUILD_DIR/lib/gdk-pixbuf-2.0" + + echo "Copying GLib schemas." + mkdir -p "$BUILD_DIR/share/glib-2.0/schemas" + cp 'share/glib-2.0/schemas/gschemas.compiled' "$BUILD_DIR/share/glib-2.0/schemas" + + echo "Creating GTK settings.ini." + mkdir -p "$BUILD_DIR/share/gtk-3.0/" + echo -e '[Settings]\ngtk-button-images=1' > "$BUILD_DIR/share/gtk-3.0/settings.ini" + + - name: Create installer + if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} + working-directory: build/${{matrix.build_type}} + shell: pwsh + run: | + echo "Installing Inno Setup." + choco install innosetup + echo "Setup file:" + type "WindowsInnoSetup.iss" + echo "Creating installer from script." + iscc /F"installer" "WindowsInnoSetup.iss" + + - name: Prepare artifact name + run: | + if [ '${{github.ref_type}}' == 'tag' ]; then + ARTIFACT_NAME="RawTherapee_${REF_NAME_FILTERED}_win64_${{matrix.build_type}}" + else + echo "Getting RawTherapee version." + export VERSION="$(grep -m 1 '^Version: .*$' './build/${{matrix.build_type}}/AboutThisBuild.txt' | sed 's/^Version: \(.\+\)$/\1/')" + echo "Version is '$VERSION'." + FILTERED_VERSION="$(echo "$VERSION" | sed 's/[^A-z0-9_.-]//g')" + ARTIFACT_NAME="RawTherapee_${REF_NAME_FILTERED}_${FILTERED_VERSION}_win64_${{matrix.build_type}}" + fi + echo "Artifact name is '$ARTIFACT_NAME'." + + echo "Recording artifact name." + echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> "$(cygpath -u $GITHUB_ENV)" + echo "Recording RawTherapee version." + echo "RT_VERSION=$VERSION" >> "$(cygpath -u $GITHUB_ENV)" + + echo "Renaming artifact." + mv './build/${{matrix.build_type}}' "./build/$ARTIFACT_NAME" + if [ -e './build/installer.exe' ]; then + echo "Renaming installer." + mv './build/installer.exe' "./build/$ARTIFACT_NAME.exe" + fi + + - name: Create ZIP archive + shell: cmd + working-directory: ./build + run: | + echo "Zipping artifact." + 7z a -tzip "%ARTIFACT_NAME%.zip" "./%ARTIFACT_NAME%" + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: ${{env.ARTIFACT_NAME}} + path: build\${{env.ARTIFACT_NAME}} + + - name: Upload installer + if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} + uses: actions/upload-artifact@v2 + with: + name: ${{env.ARTIFACT_NAME}}.exe + path: build\${{env.ARTIFACT_NAME}}.exe + + - name: Prepare for publishing + if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} + run: | + echo "Setting publish name." + PUBLISH_NAME="RawTherapee_${REF_NAME_FILTERED}_win64_${{matrix.build_type}}" + echo "Publish name is '$PUBLISH_NAME'." + if [ "$ARTIFACT_NAME" != "$PUBLISH_NAME" ]; then + echo "Renaming ZIP file." + cp "build/$ARTIFACT_NAME.zip" "build/$PUBLISH_NAME.zip" + if [ -e "./build/$ARTIFACT_NAME.exe" ]; then + echo "Renaming installer." + mv "./build/$ARTIFACT_NAME.exe" "./build/$PUBLISH_NAME.exe" + fi + fi + echo "Creating version file." + cp "build/$ARTIFACT_NAME/AboutThisBuild.txt" "build/$PUBLISH_NAME-AboutThisBuild.txt" + + echo "Recording publish name." + echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" + + - name: Publish artifacts + uses: softprops/action-gh-release@v1 + if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} + with: + tag_name: nightly-github-actions + files: | + build/${{env.PUBLISH_NAME}}.zip + build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt + + - name: Publish installer + uses: softprops/action-gh-release@v1 + if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} + with: + tag_name: nightly-github-actions + files: build/${{env.PUBLISH_NAME}}.exe + + - name: Prepare for publishing pre-dev + id: prepare-publish-pre-dev + if: ${{github.event_name == 'pull_request' && contains(fromJSON(env.publish_pre_dev_labels), github.event.pull_request.head.label)}} + run: | + echo "Making ref name." + REF_NAME_FILTERED="$(echo '${{github.event.pull_request.head.label}}' | tr ':' '_' | sed 's/[^A-z0-9_.-]//g')" + echo "Ref name is '$REF_NAME_FILTERED'." + + echo "Setting publish name." + PUBLISH_NAME="RawTherapee_${REF_NAME_FILTERED}_win64_${{matrix.build_type}}" + echo "Publish name is '$PUBLISH_NAME'." + if [ "$ARTIFACT_NAME" != "$PUBLISH_NAME" ]; then + echo "Renaming ZIP file." + cp "build/$ARTIFACT_NAME.zip" "build/$PUBLISH_NAME.zip" + if [ -e "./build/$ARTIFACT_NAME.exe" ]; then + echo "Renaming installer." + mv "./build/$ARTIFACT_NAME.exe" "./build/$PUBLISH_NAME.exe" + fi + fi + echo "Creating version file." + cp "build/$ARTIFACT_NAME/AboutThisBuild.txt" "build/$PUBLISH_NAME-AboutThisBuild.txt" + + echo "Recording publish name." + echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" + + - name: Publish pre-dev artifacts + uses: softprops/action-gh-release@v1 + if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}} + with: + tag_name: pre-dev-github-actions + files: | + build/${{env.PUBLISH_NAME}}.zip + build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt + + - name: Publish pre-dev installer + uses: softprops/action-gh-release@v1 + if: ${{steps.prepare-publish-pre-dev.outcome == 'success' && matrix.build_type == 'release'}} + with: + tag_name: pre-dev-github-actions + files: build/${{env.PUBLISH_NAME}}.exe diff --git a/AUTHORS.txt b/AUTHORS.txt index 227390faa..374a7935b 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -5,8 +5,11 @@ Project initiator: Development contributors, in last name alphabetical order: + Harald Aust Roel Baars + Richard E Barber Martin Burri + Pierre Cabrera Javier Celaya Jacques Desmis Pavlov Dmitry @@ -14,12 +17,14 @@ Development contributors, in last name alphabetical order: Maciek Dworak Michael Ezra Flössie + Rüdiger Franke Jean-Christophe Frisch Ilias Giarimis Alberto Griggio Steve Herrell Philippe Hupé Wolfgang Kuehnel + Lawrence Lee Guokai Ma Emil Martinec Wyatt Olson @@ -30,14 +35,16 @@ Development contributors, in last name alphabetical order: Jan Rinze Alberto Romei Ben S. + Simon Segerblom Rex Andrey Skvortsov Fabio Suprani Anders Torger Ingo Weyrich Makoto Yoshida -Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name alphabetical order: +Other contributors (profiles, ideas, mockups, testing, forum activity, translations, tutorials etc.), in last name alphabetical order: + Andy Astbury Marcin Bajor Javier Bartol Thorsten Bartolomäus @@ -45,6 +52,7 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati Fernando Carello Rodrigo Nuno Bragança da Cunha Pat David + Jacques Dekker Reine Edvardsson Andrea Ferrero André Gauthier @@ -56,14 +64,19 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati Oscar de Lama Lebarhon Karl Loncarek + Patrick Lopatto + Francisco Lorés Jie Luo Paul Matthijsse Wim ter Meer Alberto Righetto Kostia (Kildor) Romanov + Henning Sidow Kalle Söderman + Wayne Sutton Johan Thor Vitalis Tiknius TooWaBoo Franz Trischberger Colin Walker + Martin Werner diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index f48d39b50..4d8f4f3fe 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -13,3 +13,7 @@ Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} OpenMP support: ${OPTION_OMP} MMAP support: ${WITH_MYFILE_MMAP} +Build OS: ${BUILDINFO_OS} +Build date: ${BUILDINFO_DATE} UTC +Build epoch: ${BUILDINFO_EPOCH} +Build UUID: ${BUILDINFO_UUID} diff --git a/CMakeLists.txt b/CMakeLists.txt index d7368f115..92888424c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,23 +1,34 @@ -cmake_minimum_required(VERSION 3.5) +# Use of SOURCE_DIR target property begins at cmake 3.7 +if(APPLE) + cmake_minimum_required(VERSION 3.7) +else() + cmake_minimum_required(VERSION 3.5) +endif() # Compiler id for Apple Clang if(APPLE) cmake_policy(SET CMP0025 NEW) + cmake_policy(SET CMP0037 NEW) endif() # 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) + 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 # command line to their current version of Eclipse: - #set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE) + # set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE) endif() 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) @@ -26,11 +37,26 @@ string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE) 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!") +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!") endif() -# We might want to build using the old C++ ABI, even when using a new GCC version: +# Warning for GCC vectorization issues, which causes problems #5749 and #6384: +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "10.0" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "10.2") + message(STATUS "WARNING: gcc ${CMAKE_CXX_COMPILER_VERSION} is known to miscompile RawTherapee when using -ftree-loop-vectorize, forcing the option to be off") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-tree-loop-vectorize") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-tree-loop-vectorize") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11.0") + message(STATUS "WARNING: gcc ${CMAKE_CXX_COMPILER_VERSION} is known to miscompile RawTherapee when using --ffp-contract=fast, forcing the option to be off") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffp-contract=off") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffp-contract=off") +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) endif() @@ -46,30 +72,75 @@ message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") -# Cache name suffix examples: "" = ~/.config/RawTherapee, "5" = ~/.config/RawTherapee-5, "_testing" = ~/.config/RawTherapee_testing -# Use "" for stable releases and "5-dev" for anything else. -set(CACHE_NAME_SUFFIX "" CACHE STRING "RawTherapee's cache folder suffix") +# Cache name suffix examples: "" = ~/.config/RawTherapee, "5" = +# ~/.config/RawTherapee-5, "_testing" = ~/.config/RawTherapee_testing Use "" for +# stable releases and "5-dev" for anything else. +set(CACHE_NAME_SUFFIX + "" + CACHE STRING "RawTherapee's cache folder suffix") -# By default we don't use a specific processor target, so PROC_TARGET_NUMBER is set to 0. -# Specify other values to optimize for specific processor architecture as listed in ProcessorTargets.cmake: -set(PROC_TARGET_NUMBER 0 CACHE STRING "Selected target processor from the list above (taken from ProcessorTargets.cmake)") +# For macOS only, OSX_DEV_BUILD option allows using relative paths instead of absolute +# paths. Consequently, for development builds, application can be launching without +# being bundled. However, file access can be restricted for some folder. +option(OSX_DEV_BUILD "Generate macOS development builds" OFF) + +# On macOS, optionally generate the final zip artifact file without version in the name for nightly upload purposes. +option(OSX_NIGHTLY "Generate a generically-named zip" OFF) + +# On macOS, optionally generate RawTherapee__macOS_.zip for the CI +option(OSX_CONTINUOUS "Generate a generically-named zip for CI" OFF) + +# Generate a universal macOS build +option(OSX_UNIVERSAL "Generate a universal app" OFF) + +# On macOS: merge the app via a specific url to generate a universal bundle with both x86_64 and arm64 +if(OSX_UNIVERSAL) + if(NOT "${OSX_UNIVERSAL_URL}") + if(CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") + set(OSX_UNIVERSAL_URL "file:///rawtherapee/latest/RawTherapee_macOS_x86_64_latest.zip" CACHE STRING "URL of x86_64 app for lipo") + else() + set(OSX_UNIVERSAL_URL "file:///rawtherapee/latest/RawTherapee_macOS_arm64_latest.zip" CACHE STRING "URL of arm64 app for lipo") + endif() + endif() +endif() + +# By default we don't use a specific processor target, so PROC_TARGET_NUMBER is +# set to 0. Specify other values to optimize for specific processor architecture +# as listed in ProcessorTargets.cmake: +set(PROC_TARGET_NUMBER + 0 + CACHE + STRING + "Selected target processor from the list above (taken from ProcessorTargets.cmake)" +) # Set special compilation flags for rtengine which get added to CMAKE_CXX_FLAGS: -# Some Linux distros build with -O2 instead of -O3. We explicitly enable auto vectorization by using -ftree-vectorize -set(RTENGINE_CXX_FLAGS "-ftree-vectorize" CACHE STRING "Special compilation flags for RTEngine") +# Some Linux distros build with -O2 instead of -O3. We explicitly enable auto +# vectorization by using -ftree-vectorize +set(RTENGINE_CXX_FLAGS + "-ftree-vectorize" + CACHE STRING "Special compilation flags for RTEngine") # Loads the ProcessorTargets list: include(ProcessorTargets.cmake) -set(PROC_LABEL "undefined" CACHE STRING "Target processor label, unused if PROC_TARGET_NUMBER = 0 or 2") -set(PROC_FLAGS "" CACHE STRING "Target processor related build/link flags") +set(PROC_LABEL + "undefined" + CACHE STRING + "Target processor label, unused if PROC_TARGET_NUMBER = 0 or 2") +set(PROC_FLAGS + "" + CACHE STRING "Target processor related build/link flags") if((NOT (PROC_TARGET_NUMBER EQUAL 0)) AND (NOT (PROC_TARGET_NUMBER EQUAL 2))) set(PROC_LABEL ${PROC_TARGET_${PROC_TARGET_NUMBER}_LABEL}) endif() -if(NOT(PROC_TARGET_NUMBER EQUAL 0)) +if(NOT (PROC_TARGET_NUMBER EQUAL 0)) set(PROC_FLAGS ${PROC_TARGET_${PROC_TARGET_NUMBER}_FLAGS}) endif() if(UNIX AND PROC_LABEL STREQUAL "undefined") - execute_process(COMMAND uname -p OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE cpu) + execute_process( + COMMAND uname -p + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE cpu) if("${cpu}" STREQUAL "unknown") set(PROC_LABEL "${CMAKE_SYSTEM_PROCESSOR}") else() @@ -77,7 +148,8 @@ if(UNIX AND PROC_LABEL STREQUAL "undefined") endif() endif() -# If PROC_FORCED_LABEL exists, its value is loaded in PROC_LABEL to override the one from ProcessorTargets: +# If PROC_FORCED_LABEL exists, its value is loaded in PROC_LABEL to override the +# one from ProcessorTargets: if(DEFINED PROC_FORCED_LABEL) set(PROC_LABEL ${PROC_FORCED_LABEL}) endif() @@ -87,10 +159,19 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PROC_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PROC_FLAGS}") 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): +# 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") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete") +# Do net set math errno, as we never check its value. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-math-errno") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-math-errno") + +# suppress warning https://github.com/Beep6581/RawTherapee/issues/6105 +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-attributes") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes") + # Special treatment for x87 and x86-32 SSE (see GitHub issue #4324) include(FindX87Math) if(HAVE_X87_MATH) @@ -106,21 +187,35 @@ endif() 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: - set(CMAKE_PREFIX_PATH $ENV{MINGW_BASEPATH} $ENV{GTKMM_BASEPATH} CACHE STRING "Additional search paths") + # 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: + set(CMAKE_PREFIX_PATH + $ENV{MINGW_BASEPATH} $ENV{GTKMM_BASEPATH} + CACHE STRING "Additional search paths") endif() -if(APPLE) - if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib") - message(STATUS "CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") +if(APPLE) # TODO make -mtune generic conditional and/or specifiable. + if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" + OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib -Wl,-headerpad_max_install_names -mtune=generic -framework Foundation" + ) + message( + STATUS + "CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}" + ) endif() # Set minimum system version - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.9") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.9") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -headerpad_max_install_names") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}" + ) + set(CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -Wl,-headerpad_max_install_names -mtune=generic -framework Foundation" + ) endif() option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) @@ -132,33 +227,53 @@ option(WITH_SAN "Build with run-time sanitizer" OFF) option(WITH_PROF "Build with profiling instrumentation" OFF) option(WITH_SYSTEM_KLT "Build using system KLT library." OFF) option(OPTION_OMP "Build with OpenMP support" ON) -option(STRICT_MUTEX "True (recommended): MyMutex will behave like POSIX Mutex; False: MyMutex will behave like POSIX RecMutex; Note: forced to ON for Debug builds" ON) -option(TRACE_MYRWMUTEX "Trace custom R/W Mutex (Debug builds only); redirecting std::out to a file is strongly recommended!" OFF) -option(AUTO_GDK_FLUSH "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" OFF) -#option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. Default is OFF" OFF) +option( + STRICT_MUTEX + "True (recommended): MyMutex will behave like POSIX Mutex; False: MyMutex will behave like POSIX RecMutex; Note: forced to ON for Debug builds" + ON) +option( + TRACE_MYRWMUTEX + "Trace custom R/W Mutex (Debug builds only); redirecting std::out to a file is strongly recommended!" + OFF) +option( + AUTO_GDK_FLUSH + "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" + OFF) +# option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. +# Default is OFF" OFF) option(ENABLE_TCMALLOC "Use the tcmalloc library if available" OFF) -set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") +set(TCMALLOC_LIB_DIR + "" + CACHE PATH "Custom path for the tcmalloc library") # Set installation directories: 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.") + 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) endif() if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR) if(APPLE) - set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/MacOS") + set(BUNDLE_BASE_INSTALL_DIR "${PROJECT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/MacOS") else() set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") endif() endif() if(BUILD_BUNDLE) - set(BINDIR .) - set(CMAKE_INSTALL_PREFIX "${BUNDLE_BASE_INSTALL_DIR}") + if(APPLE) + set(BINDIR "${BUNDLE_BASE_INSTALL_DIR}") + set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/build") + else() + set(BINDIR .) + set(CMAKE_INSTALL_PREFIX "${BUNDLE_BASE_INSTALL_DIR}") + endif() endif() if(NOT DEFINED BINDIR) @@ -168,7 +283,7 @@ endif() if(NOT DEFINED DATADIR) if(BUILD_BUNDLE) if(APPLE) - set(DATADIR "../../Resources") + set(DATADIR "${PROJECT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/Resources/share") else() set(DATADIR .) endif() @@ -180,7 +295,7 @@ endif() if(NOT DEFINED LIBDIR) if(BUILD_BUNDLE) if(APPLE) - set(LIBDIR "../../Frameworks") + set(LIBDIR "${PROJECT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE}/Frameworks") else() set(LIBDIR .) endif() @@ -200,7 +315,11 @@ endif() if(NOT DEFINED DOCDIR) if(BUILD_BUNDLE) - set(DOCDIR "${DATADIR}/share/doc") + if(APPLE) + set(DOCDIR "${DATADIR}/doc") + else() + set(DOCDIR "${DATADIR}/share/doc") + endif() else() set(DOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") endif() @@ -208,7 +327,11 @@ endif() if(NOT DEFINED CREDITSDIR) if(BUILD_BUNDLE) - set(CREDITSDIR "${DATADIR}") + if(APPLE) + set(CREDITSDIR "${DATADIR}/..") + else() + set(CREDITSDIR "${DATADIR}") + endif() else() set(CREDITSDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") endif() @@ -216,7 +339,11 @@ endif() if(NOT DEFINED LICENCEDIR) if(BUILD_BUNDLE) - set(LICENCEDIR "${DATADIR}") + if(APPLE) + set(LICENCEDIR "${CREDITSDIR}") + else() + set(LICENCEDIR "${DATADIR}") + endif() else() set(LICENCEDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") endif() @@ -225,7 +352,11 @@ endif() if(NOT DEFINED DESKTOPDIR) if(UNIX) if(BUILD_BUNDLE) - set(DESKTOPDIR "${DATADIR}/share/applications") + if(APPLE) + set(DESKTOPDIR "${DATADIR}/applications") + else() + set(DESKTOPDIR "${DATADIR}/share/applications") + endif() else() set(DESKTOPDIR "${CMAKE_INSTALL_PREFIX}/share/applications") endif() @@ -235,7 +366,11 @@ endif() if(NOT DEFINED ICONSDIR) if(UNIX) if(BUILD_BUNDLE) - set(ICONSDIR "${DATADIR}/share/icons") + if(APPLE) + set(ICONSDIR "${DATADIR}/icons") + else() + set(ICONSDIR "${DATADIR}/share/icons") + endif() else() set(ICONSDIR "${CMAKE_INSTALL_PREFIX}/share/icons") endif() @@ -245,32 +380,61 @@ endif() if(NOT DEFINED APPDATADIR) if(UNIX) if(BUILD_BUNDLE) - set(APPDATADIR "${DATADIR}/share/metainfo") + if(APPLE) + set(APPDATADIR "${DATADIR}/metainfo") + else() + set(APPDATADIR "${DATADIR}/share/metainfo") + endif() else() set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/metainfo") endif() endif() endif() -if(DEFINED LENSFUNDBDIR AND NOT IS_ABSOLUTE "${LENSFUNDBDIR}") - set(LENSFUNDBDIR "${DATADIR}/${LENSFUNDBDIR}") +if(NOT APPLE) + if(DEFINED LENSFUNDBDIR AND NOT IS_ABSOLUTE "${LENSFUNDBDIR}") + set(LENSFUNDBDIR "${DATADIR}/${LENSFUNDBDIR}") + endif() +else() + set(LENSFUNDBDIR "${LENSFUNDBDIR}") endif() if(APPLE) if("${CODESIGNID}") - set(CODESIGNID "${CODESIGNID}" CACHE STRING "Codesigning Identity") + set(CODESIGNID + "${CODESIGNID}" + CACHE STRING "Codesigning Identity") endif() if("${NOTARY}") - set(NOTARY "${NOTARY}" CACHE STRING "Notarization Identity") + set(NOTARY + "${NOTARY}" + CACHE STRING "Notarization Identity") + endif() + if("${LOCAL_PREFIX}") + set(LOCAL_PREFIX + "${LOCAL_PREFIX}" + CACHE STRING "macos/gtk parent directory ie /usr/local or /opt/local or /opt/homebrew (for arm64)") + else() + set(LOCAL_PREFIX + /usr/local + CACHE STRING "macos/gtk parent directory ie /usr/local (default) or /opt/local (macports) or /opt/homebrew (for arm64)") + endif() + if("${FANCY_DMG}") + set(FANCY_DMG + ON + CACHE BOOL + "Use the andreyvit/create-dmg script to make a fancy .dmg") 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() @@ -299,11 +463,11 @@ endif() find_package(PkgConfig) if(WIN32) - pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.22.24) - pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.22) + pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.22.24) + pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.22) else() - pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.16) - pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.16) + pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.16) + pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.16) endif() if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7") @@ -312,19 +476,26 @@ if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7") else() set(CERTAINTY "likely to") endif() - message(WARNING "\nWarning! You are using GTK+ version " ${GTK_VERSION} " which is " ${CERTAINTY} " have an issue where combobox menu scroll-arrows are missing when a Gtk::ComboBox list does not fit vertically on the screen. As a result, users of your build will not be able to select items in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.\nIt is recommended that you either downgrade GTK+ to <= 3.24.1 or upgrade to >= 3.24.7.") + message( + WARNING + "\nWarning! You are using GTK+ version " + ${GTK_VERSION} + " which is " + ${CERTAINTY} + " have an issue where combobox menu scroll-arrows are missing when a Gtk::ComboBox list does not fit vertically on the screen. As a result, users of your build will not be able to select items in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.\nIt is recommended that you either downgrade GTK+ to <= 3.24.1 or upgrade to >= 3.24.7." + ) endif() -pkg_check_modules (GLIB2 REQUIRED glib-2.0>=2.44) -pkg_check_modules (GLIBMM REQUIRED glibmm-2.4>=2.44) -pkg_check_modules (CAIROMM REQUIRED cairomm-1.0) -pkg_check_modules (GIO REQUIRED gio-2.0>=2.44) -pkg_check_modules (GIOMM REQUIRED giomm-2.4>=2.44) -pkg_check_modules (GTHREAD REQUIRED gthread-2.0>=2.44) -pkg_check_modules (GOBJECT REQUIRED gobject-2.0>=2.44) -pkg_check_modules (SIGC REQUIRED sigc++-2.0>=2.3.1) -pkg_check_modules (LENSFUN REQUIRED lensfun>=0.2) -pkg_check_modules (RSVG REQUIRED librsvg-2.0>=2.40) +pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.48) +pkg_check_modules(GLIBMM REQUIRED glibmm-2.4>=2.48) +pkg_check_modules(CAIROMM REQUIRED cairomm-1.0) +pkg_check_modules(GIO REQUIRED gio-2.0>=2.48) +pkg_check_modules(GIOMM REQUIRED giomm-2.4>=2.48) +pkg_check_modules(GTHREAD REQUIRED gthread-2.0>=2.48) +pkg_check_modules(GOBJECT REQUIRED gobject-2.0>=2.48) +pkg_check_modules(SIGC REQUIRED sigc++-2.0>=2.3.1) +pkg_check_modules(LENSFUN REQUIRED lensfun>=0.2) +pkg_check_modules(RSVG REQUIRED librsvg-2.0>=2.40) if(WIN32) add_definitions(-DWIN32) @@ -341,8 +512,14 @@ endif() pkg_check_modules(LCMS REQUIRED lcms2>=2.6) pkg_check_modules(EXPAT REQUIRED expat>=2.1) pkg_check_modules(FFTW3F REQUIRED fftw3f) + +#Set the appropriate FFTW flags on macOS +if(APPLE AND OPTION_OMP) + set(EXTRA_LIB "-L${LOCAL_PREFIX}/lib -lfftw3f_omp -lfftw3f -lm") +endif() + pkg_check_modules(IPTCDATA REQUIRED libiptcdata) -pkg_check_modules(TIFF REQUIRED libtiff-4>=4.0.4) +find_package(TIFF 4.0.4 REQUIRED) find_package(JPEG REQUIRED) find_package(PNG REQUIRED) find_package(ZLIB REQUIRED) @@ -351,8 +528,12 @@ if(WITH_SYSTEM_KLT) endif() # Check for libcanberra-gtk3 (sound events on Linux): -if(UNIX AND(NOT APPLE)) - pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3) +if(UNIX AND (NOT APPLE)) + option(USE_LIBCANBERRA "Build with libcanberra" ON) + if(USE_LIBCANBERRA) + pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3) + add_definitions(-DUSE_CANBERRA) + endif() endif() if(WITH_MYFILE_MMAP) @@ -362,9 +543,12 @@ endif() if(WITH_LTO) # Using LTO with older versions of binutils requires setting extra flags set(BINUTILS_VERSION_MININUM "2.29") - execute_process(COMMAND ar --version OUTPUT_VARIABLE BINUTILS_VERSION_DETECTED) - string(REGEX REPLACE ".* ([0-9.]+)\n.*" "\\1" BINUTILS_VERSION_DETECTED "${BINUTILS_VERSION_DETECTED}") - if("${BINUTILS_VERSION_DETECTED}" VERSION_LESS "${BINUTILS_VERSION_MININUM}") + 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) if(!CMAKE_AR) set(CMAKE_AR "/opt/local/bin/ar") @@ -376,7 +560,15 @@ if(WITH_LTO) 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} "\"") + 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") @@ -387,7 +579,8 @@ 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_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}") endif() if(WITH_PROF) @@ -396,11 +589,14 @@ if(WITH_PROF) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wcast-qual -Wno-deprecated-declarations -Wno-unused-result") +set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wcast-qual -Wno-deprecated-declarations -Wno-unused-result -Wunused-macros" +) if(OPTION_OMP) find_package(OpenMP) if(OPENMP_FOUND) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas") endif() endif() @@ -414,13 +610,14 @@ if(OPENMP_FOUND) set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${_f}) endforeach() check_c_source_compiles( -"#include + "#include int main() { fftwf_init_threads(); fftwf_plan_with_nthreads(1); return 0; -}" _fftw3f_multithread) +}" + _fftw3f_multithread) if(_fftw3f_multithread) add_definitions(-DRT_FFTW3F_OMP) else() @@ -438,30 +635,41 @@ get_filename_component(ABS_BINARY_DIR "${CMAKE_BINARY_DIR}" ABSOLUTE) set(OUT_OF_SOURCE_BUILD TRUE) if(ABS_SOURCE_DIR STREQUAL ABS_BINARY_DIR) set(OUT_OF_SOURCE_BUILD FALSE) - message(WARNING "You are performing an in-source build. This is discouraged. For an explanation and the advantages of out-of-source builds, please refer to http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F") + message( + WARNING + "You are performing an in-source build. This is discouraged. For an explanation and the advantages of out-of-source builds, please refer to http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F" + ) endif() -# Remove files which could require manual work. -# We will remove this after some time to have a clean build system without file modifications in the source tree again. (?) -set(OOSB_FILES "${PROJECT_SOURCE_DIR}/rtdata/rawtherapee.desktop" "${PROJECT_SOURCE_DIR}/rtgui/version.h" "${PROJECT_SOURCE_DIR}/rtgui/config.h" "${PROJECT_SOURCE_DIR}/AboutThisBuild.txt") +# Remove files which could require manual work. We will remove this after some +# time to have a clean build system without file modifications in the source +# tree again. (?) +set(OOSB_FILES + "${PROJECT_SOURCE_DIR}/rtdata/rawtherapee.desktop" + "${PROJECT_SOURCE_DIR}/rtgui/version.h" + "${PROJECT_SOURCE_DIR}/rtgui/config.h" + "${PROJECT_SOURCE_DIR}/AboutThisBuild.txt") if(OUT_OF_SOURCE_BUILD) foreach(f ${OOSB_FILES}) file(REMOVE "${f}") endforeach() endif() -# Check for generated files in the source tree which should not be there when doing an out-of-source build. -# Without checking for this it might happen that old versions are used for the compilation: +# Check for generated files in the source tree which should not be there when +# doing an out-of-source build. Without checking for this it might happen that +# old versions are used for the compilation: if(OUT_OF_SOURCE_BUILD) foreach(f ${OOSB_FILES}) if(EXISTS "${f}") - message(SEND_ERROR "Generated \"${f}\" found inside the source tree. Please remove it as it is a relic of the old build system and prevents valid compilation now.") + message( + SEND_ERROR + "Generated \"${f}\" found inside the source tree. Please remove it as it is a relic of the old build system and prevents valid compilation now." + ) endif() endforeach() endif() -### Start generating AboutThisBuild.txt -# Set the platform bit-depth: +# Start generating AboutThisBuild.txt Set the platform bit-depth: if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(PROC_BIT_DEPTH 32 bits) else() @@ -469,68 +677,99 @@ else() endif() # Get compiler name and version. -# Only CMake > 2.8.7 knows CMAKE_*_COMPILER_VERSION -if(CMAKE_VERSION VERSION_GREATER 2.8.7) - get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE) - set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}") -else() - execute_process(COMMAND gcc -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) - set(COMPILER_INFO "gcc ${GCC_VERSION}") +get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE) +set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}") + +# Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer +# flags): +set(CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPER_CMAKE_BUILD_TYPE}} ${RTENGINE_CXX_FLAGS}" +) +set(LFLAGS + "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}" +) + +if(NOT APPLE) + set(ABOUT_COMMAND_WITH_ARGS + ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} + -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} + -DPROC_LABEL:STRING="${PROC_LABEL}" + -DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}" + -DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DGTKMM_VERSION:STRING=${GTKMM_VERSION} + -DOPTION_OMP:STRING=${OPTION_OMP} + -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) endif() -# Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer flags): -set(CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPER_CMAKE_BUILD_TYPE}} ${RTENGINE_CXX_FLAGS}") -set(LFLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}") - -set(ABOUT_COMMAND_WITH_ARGS ${CMAKE_COMMAND} - -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} - -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} - -DPROC_LABEL:STRING="${PROC_LABEL}" - -DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}" - -DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DGTKMM_VERSION:STRING=${GTKMM_VERSION} - -DOPTION_OMP:STRING=${OPTION_OMP} - -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} - -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) - if(WIN32) - list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Windows + list( + APPEND + ABOUT_COMMAND_WITH_ARGS + -DSYSTEM:STRING=Windows -DCXX_FLAGS:STRING="${CXX_FLAGS}" -DLFLAGS:STRING="${LFLAGS}" -DCOMPILER_INFO:STRING="${COMPILER_INFO}" -DCMAKE_INSTALL_PREFIX:STRING="${CMAKE_INSTALL_PREFIX}" -DBIT_DEPTH:STRING="${CMAKE_SIZEOF_VOID_P}") elseif(APPLE) - list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Apple - -DCXX_FLAGS:STRING=${CXX_FLAGS} - -DLFLAGS:STRING=${LFLAGS} - -DCOMPILER_INFO:STRING=${COMPILER_INFO}) + set( + ABOUT_COMMAND_WITH_ARGS + ${CMAKE_COMMAND} + -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} + -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} + -DSYSTEM:STRING=Apple + -DCXX_FLAGS:STRING=${CXX_FLAGS} + -DLFLAGS:STRING=${LFLAGS} + -DCOMPILER_INFO:STRING=${COMPILER_INFO} + -DPROC_LABEL:STRING="${PROC_LABEL}" + -DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}" + -DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DGTKMM_VERSION:STRING=${GTKMM_VERSION} + -DOPTION_OMP:STRING=${OPTION_OMP} + -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION} + -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake) else() list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux - -DCXX_FLAGS:STRING=${CXX_FLAGS} - -DLFLAGS:STRING=${LFLAGS} - -DCOMPILER_INFO:STRING=${COMPILER_INFO}) + -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} + -DCOMPILER_INFO:STRING=${COMPILER_INFO}) +endif() +if(NOT APPLE) + list(APPEND + ABOUT_COMMAND_WITH_ARGS + -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake") endif() -list(APPEND ABOUT_COMMAND_WITH_ARGS -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake") - -add_custom_target(UpdateInfo ALL +add_custom_target( + UpdateInfo ALL COMMAND ${ABOUT_COMMAND_WITH_ARGS} COMMENT "Creating AboutThisBuild.txt and other version-dependent files") -### End generating AboutThisBuild.txt +# End generating AboutThisBuild.txt install(FILES AUTHORS.txt DESTINATION "${CREDITSDIR}") -install(FILES LICENSE.txt DESTINATION "${LICENCEDIR}") -install(FILES "${CMAKE_BINARY_DIR}/AboutThisBuild.txt" DESTINATION "${CREDITSDIR}") -install(FILES RELEASE_NOTES.txt DESTINATION "${CREDITSDIR}" OPTIONAL) +install(FILES LICENSE DESTINATION "${LICENCEDIR}") +install(FILES "${CMAKE_BINARY_DIR}/AboutThisBuild.txt" + DESTINATION "${CREDITSDIR}") +install( + FILES RELEASE_NOTES.txt + DESTINATION "${CREDITSDIR}" + OPTIONAL) -# The standard location for man pages in Linux is /usr/share/man -# Use "manpath" to see the search paths for man pages on your system. +# The standard location for man pages in Linux is /usr/share/man Use "manpath" +# to see the search paths for man pages on your system. if(BUILD_BUNDLE) - install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${DATADIR}/share/man/man1") + if(APPLE) + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" + DESTINATION "${DATADIR}/man/man1") + else() + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" + DESTINATION "${DATADIR}/share/man/man1") + endif() else() - install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1") + install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" + DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1") endif() if(WIN32) @@ -538,7 +777,8 @@ if(WIN32) endif() if(UNIX) - install(FILES com.rawtherapee.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 @@ -566,26 +806,38 @@ int main() lfDatabase *db = 0; bool b = db->LoadDirectory(0); return 0; -}" LENSFUN_HAS_LOAD_DIRECTORY) +}" + LENSFUN_HAS_LOAD_DIRECTORY) set(TCMALLOC_LIB_DIR) if(ENABLE_TCMALLOC) if(TCMALLOC_LIB_DIR) - find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} NO_DEFAULT_PATH) + find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} + NO_DEFAULT_PATH) else() - find_library(TCMALLOC_LIBRARIES tcmalloc) + # On Debian libtcmalloc-minimal4 has no .so symlink, so let's adjust for that + set(OLD_CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES}") + list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".so.4") + + find_library(TCMALLOC_LIBRARIES NAMES tcmalloc tcmalloc_minimal) + + set(CMAKE_FIND_LIBRARY_SUFFIXES "${OLD_CMAKE_FIND_LIBRARY_SUFFIXES}") + unset(OLD_CMAKE_FIND_LIBRARY_SUFFIXES) endif() if(TCMALLOC_LIBRARIES) message(STATUS "using tcmalloc library in ${TCMALLOC_LIBRARIES}") else() - set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) + set(TCMALLOC_LIBRARIES + "" + CACHE INTERNAL "" FORCE) message(STATUS "tcmalloc not found") endif() else() - set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) + set(TCMALLOC_LIBRARIES + "" + CACHE INTERNAL "" FORCE) endif() - add_subdirectory(rtexif) add_subdirectory(rtengine) add_subdirectory(rtgui) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f94454b63..041b273df 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,6 +16,7 @@ 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. +- Documentation for your work must be provided in order for your branch to be merged if it changes or adds anything the user should know about. The documentation can be provided in plain-text or markdown form as a comment in the issue or pull request. - 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: diff --git a/LICENSE.txt b/LICENSE similarity index 97% rename from LICENSE.txt rename to LICENSE index 653f0ac50..e963df829 100644 --- a/LICENSE.txt +++ b/LICENSE @@ -1,20 +1,3 @@ - RawTherapee - A powerful, cross-platform raw image processing program. - Copyright (C) 2004-2012 Gabor Horvath - Copyright (C) 2010-2019 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 - 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 this program. If not, see . - GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 diff --git a/ProcessorTargets.cmake b/ProcessorTargets.cmake index aa06b29ee..60fd1e35f 100644 --- a/ProcessorTargets.cmake +++ b/ProcessorTargets.cmake @@ -6,7 +6,13 @@ set(PROC_TARGET_1_FLAGS "-mtune=generic" CACHE STRING "Processor-1 flags") # This second choice should be used for your own build only set(PROC_TARGET_2_LABEL native CACHE STRING "Processor-2 label - use it for your own build") -set(PROC_TARGET_2_FLAGS "-march=native" CACHE STRING "Processor-2 flags") + +# The flag is different on x86 and Arm based processors +if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL arm64) + set(PROC_TARGET_2_FLAGS "-mcpu=native" CACHE STRING "Processor-2 flags") +else() + set(PROC_TARGET_2_FLAGS "-march=native" CACHE STRING "Processor-2 flags") +endif() # The later choices is intended to be used if you want to provide specific builds, but it should match your own processor # You can cross compile but you have to know what you're doing, this mechanism has not been designed for that @@ -32,5 +38,8 @@ set(PROC_TARGET_8_FLAGS "-march=athlon64" CACHE STRING "Processor-8 flags") set(PROC_TARGET_9_LABEL phenomX4 CACHE STRING "Processor-9 label - use it to provide a phenomX4 optimized build, if you have this processor") set(PROC_TARGET_9_FLAGS "-march=amdfam10" CACHE STRING "Processor-9 flags") +set(PROC_TARGET_10_LABEL sandybridge-ivybridge CACHE STRING "Processor set-10 label") +set(PROC_TARGET_10_FLAGS "-march=sandybridge -mtune=ivybridge" CACHE STRING "Processors set-10 flags") + #set(PROC_TARGET__LABEL procLabel CACHE STRING "Processor- label") #set(PROC_TARGET__FLAGS "procFlags" CACHE STRING "Processor- flags") diff --git a/README.md b/README.md index ae9efd9c8..64f4d08aa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ -![RawTherapee logo](https://www.rawtherapee.com/images/logos/rawtherapee_logo_discuss.png) + + + + RawTherapee logo + + +![RawTherapee screenshot](http://rawtherapee.com/images/carousel/100_rt59_provence_local_maskxxx.jpg) RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](https://www.gtk.org) front-end. It uses a patched version of [dcraw](https://www.dechifro.org/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process. diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 33a984c1c..510847c8a 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,21 +1,14 @@ -RAWTHERAPEE 5.7-dev RELEASE NOTES +RAWTHERAPEE 5.9-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. + + +IN GENERAL + Start by reading the "Getting Started" article on RawPedia: https://rawpedia.rawtherapee.com/ -While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that: -- Development versions only had limited testing, so there may be bugs unknown to us. -- You should report these bugs so that they get fixed for the next stable release. See - www.rawpedia.rawtherapee.com/How_to_write_useful_bug_reports -- 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 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. @@ -25,15 +18,21 @@ In order to use RawTherapee efficiently you should know that: - 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 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! +- All sliders support a fine-tuning mode which you can toggle by pressing the Shift key while dragging a slider. + + + +NEW FEATURES SINCE 5.9 -New features since 5.7: - TODO +- Added or improved support for cameras, raw formats and color profiles: + - TODO NEWS RELEVANT TO PACKAGE MAINTAINERS -New since 5.7: +New since 5.9: - TODO In general: @@ -74,18 +73,6 @@ https://discuss.pixls.us/c/software/rawtherapee -LIVE CHAT WITH USERS AND DEVELOPERS - -Network: freenode -Server: chat.freenode.net -Channel: #rawtherapee - -You can use freenode webchat to communicate without installing anything: -https://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1 -More information here: https://rawpedia.rawtherapee.com/IRC - - - REVISION HISTORY The complete changelog is available at: diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index d1f532506..b0c2bdff6 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -1,5 +1,9 @@ # cmakefile executed within a makefile target +if(APPLE) + set(PROJECT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") +endif() + # 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) @@ -10,10 +14,10 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) 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 + else() # Linux find_program(GIT_CMD git) set(SHELL "/bin/bash") - endif(WIN32) + endif() # Fail if Git is not installed if(GIT_CMD STREQUAL GIT_CMD-NOTFOUND) @@ -64,14 +68,23 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") endif() + execute_process(COMMAND uname -mrs OUTPUT_VARIABLE BUILDINFO_OS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date -Ru OUTPUT_VARIABLE BUILDINFO_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND date +%s OUTPUT_VARIABLE BUILDINFO_EPOCH OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND uuidgen COMMAND tr "A-Z" "a-z" OUTPUT_VARIABLE BUILDINFO_UUID OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Git checkout information:") - message(STATUS " Commit description: ${GIT_DESCRIBE}") - message(STATUS " Branch: ${GIT_BRANCH}") - message(STATUS " Commit: ${GIT_COMMIT}") - message(STATUS " Commit date: ${GIT_COMMIT_DATE}") - message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") - message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") - message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS " Commit description: ${GIT_DESCRIBE}") + message(STATUS " Branch: ${GIT_BRANCH}") + message(STATUS " Commit: ${GIT_COMMIT}") + message(STATUS " Commit date: ${GIT_COMMIT_DATE}") + message(STATUS " Commits since tag: ${GIT_COMMITS_SINCE_TAG}") + message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") + message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") + message(STATUS "Build information:") + message(STATUS " Build OS: ${BUILDINFO_OS}") + message(STATUS " Build date: ${BUILDINFO_DATE} UTC") + message(STATUS " Epoch: ${BUILDINFO_EPOCH}") + message(STATUS " UUID: ${BUILDINFO_UUID}") if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") @@ -79,10 +92,9 @@ if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) else() message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"") endif() - -else(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) +else() include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake") -endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) +endif() if(WIN32) if(BIT_DEPTH EQUAL 4) @@ -94,15 +106,15 @@ if(WIN32) 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") + set(ARCHITECTURE_ALLOWED "x64 ia64 arm64") # installing in 64 bits mode for all 64 bits processors, even for itanium architecture - set(INSTALL_MODE "x64 ia64") - endif(BIT_DEPTH EQUAL 4) + set(INSTALL_MODE "x64 ia64 arm64") + endif() # 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) +endif() # build version.h from template configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") diff --git a/cmake/modules/FindMacIntegration.cmake b/cmake/modules/FindMacIntegration.cmake index a67c31baa..a6729ad7f 100644 --- a/cmake/modules/FindMacIntegration.cmake +++ b/cmake/modules/FindMacIntegration.cmake @@ -24,7 +24,7 @@ mark_as_advanced(MACINTEGRATION_LIBRARY) # handle the QUIETLY and REQUIRED arguments and set MACINTEGRATION_FOUND to TRUE if # all listed variables are TRUE include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MACINTEGRATION DEFAULT_MSG MACINTEGRATION_LIBRARY MACINTEGRATION_INCLUDE_DIR) +find_package_handle_standard_args(MacIntegration DEFAULT_MSG MACINTEGRATION_LIBRARY MACINTEGRATION_INCLUDE_DIR) if(MACINTEGRATION_FOUND) set(MacIntegration_LIBRARIES ${MACINTEGRATION_LIBRARY}) diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml index 3a55109ba..7e4c0b3a5 100644 --- a/com.rawtherapee.RawTherapee.appdata.xml +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -19,13 +19,13 @@ https://www.paypal.me/rawtherapee https://rawpedia.rawtherapee.com https://www.rawtherapee.com - https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594 + https://rawpedia.rawtherapee.com/Main_Page#Localization rawtherapee.desktop + + - - diff --git a/header b/header index 966153c0e..a98fbbac1 100644 --- a/header +++ b/header @@ -7,7 +7,7 @@ * 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 diff --git a/licenses/sleef_LICENSE.txt b/licenses/sleef_LICENSE.txt new file mode 100644 index 000000000..8170d3224 --- /dev/null +++ b/licenses/sleef_LICENSE.txt @@ -0,0 +1,30 @@ +============================================================================= +Boost Software License - Version 1.0 + +This license applies to selected portions of the software derived from SLEEF +(https://sleef.org/), as noted in the applicable source file headers. +============================================================================= + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/rtdata/CMakeLists.txt b/rtdata/CMakeLists.txt index 46722ba01..eb4b5e934 100644 --- a/rtdata/CMakeLists.txt +++ b/rtdata/CMakeLists.txt @@ -29,9 +29,12 @@ if(UNIX) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/rawtherapee.desktop" DESTINATION ${DESKTOPDIR}) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/png/rawtherapee-logo-16.png" DESTINATION "${ICONSDIR}/hicolor/16x16/apps" RENAME rawtherapee.png) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/png/rawtherapee-logo-24.png" DESTINATION "${ICONSDIR}/hicolor/24x24/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/png/rawtherapee-logo-32.png" DESTINATION "${ICONSDIR}/hicolor/32x32/apps" RENAME rawtherapee.png) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/png/rawtherapee-logo-48.png" DESTINATION "${ICONSDIR}/hicolor/48x48/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/png/rawtherapee-logo-64.png" DESTINATION "${ICONSDIR}/hicolor/64x64/apps" RENAME rawtherapee.png) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/png/rawtherapee-logo-128.png" DESTINATION "${ICONSDIR}/hicolor/128x128/apps" RENAME rawtherapee.png) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/png/rawtherapee-logo-256.png" DESTINATION "${ICONSDIR}/hicolor/256x256/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/rt-logo.svg" DESTINATION "${ICONSDIR}/hicolor/scalable/apps" RENAME rawtherapee.svg) endif() install(FILES ${LANGUAGEFILES} DESTINATION "${DATADIR}/languages") @@ -44,8 +47,8 @@ if(WIN32) install(FILES ${FONTS} DESTINATION "${DATADIR}/fonts") endif() -install(DIRECTORY ${PROFILESDIR} DESTINATION "${DATADIR}" FILES_MATCHING PATTERN "*.pp3") -install(DIRECTORY ${THEMEDIR} DESTINATION "${DATADIR}") +install(DIRECTORY "${PROFILESDIR}" DESTINATION "${DATADIR}" FILES_MATCHING PATTERN "*.pp3") +install(DIRECTORY "${THEMEDIR}" DESTINATION "${DATADIR}") install(FILES ${IMG_SVG} DESTINATION "${DATADIR}/images") install(FILES ${IMG_PNG} DESTINATION "${DATADIR}/images") @@ -54,19 +57,15 @@ install(FILES ${IMG_ICO} DESTINATION "${DATADIR}/images") if(APPLE) # CMake escapes first item quote character. Do not remove 'DUMMY_VARIABLE=' set(MACOSX_BUNDLE_COMMAND DUMMY_VARIABLE= - PROJECT_NAME="${PROJECT_NAME}" + PROJECT_NAME=${PROJECT_NAME} PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}" - CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}" + CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} GTK_PREFIX="${GTK_PREFIX}") - if(PROC_BIT_DEPTH MATCHES 32) - list(APPEND MACOSX_BUNDLE_COMMAND PROC_BIT_DEPTH=32) - else() - list(APPEND MACOSX_BUNDLE_COMMAND PROC_BIT_DEPTH=64) - endif() - list(APPEND MACOSX_BUNDLE_COMMAND sh "${PROJECT_SOURCE_DIR}/tools/osx/macosx_bundle.sh") + list(APPEND MACOSX_BUNDLE_COMMAND PROC_BIT_DEPTH=64) + list(APPEND MACOSX_BUNDLE_COMMAND sh ${PROJECT_SOURCE_DIR}/tools/osx/macosx_bundle.sh) add_custom_target(macosx_bundle COMMAND ${MACOSX_BUNDLE_COMMAND} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/build COMMENT "Creating macOS bundle") endif() diff --git a/rtdata/dcpprofiles/Canon EOS 5D Mark II.dcp b/rtdata/dcpprofiles/Canon EOS 5D Mark II.dcp new file mode 100644 index 000000000..d64a216ef Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS 5D Mark II.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 5D Mark IV.dcp b/rtdata/dcpprofiles/Canon EOS 5D Mark IV.dcp new file mode 100644 index 000000000..80407fb21 Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS 5D Mark IV.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 90D.dcp b/rtdata/dcpprofiles/Canon EOS 90D.dcp new file mode 100644 index 000000000..e50e677b1 Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS 90D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS M6 Mark II.dcp b/rtdata/dcpprofiles/Canon EOS M6 Mark II.dcp new file mode 100644 index 000000000..9a877f02f Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS M6 Mark II.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS R.dcp b/rtdata/dcpprofiles/Canon EOS R.dcp new file mode 100644 index 000000000..6ea5302e2 Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS R.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS R5.dcp b/rtdata/dcpprofiles/Canon EOS R5.dcp new file mode 100644 index 000000000..88f94620d Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS R5.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS R6.dcp b/rtdata/dcpprofiles/Canon EOS R6.dcp new file mode 100644 index 000000000..7aaa04ab2 Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS R6.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS RP.dcp b/rtdata/dcpprofiles/Canon EOS RP.dcp new file mode 100644 index 000000000..8379d9703 Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS RP.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS-1D X Mark III.dcp b/rtdata/dcpprofiles/Canon EOS-1D X Mark III.dcp new file mode 100644 index 000000000..39d7adddc Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS-1D X Mark III.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS-1Ds Mark II.dcp b/rtdata/dcpprofiles/Canon EOS-1Ds Mark II.dcp new file mode 100644 index 000000000..073a4837f Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS-1Ds Mark II.dcp differ diff --git a/rtdata/dcpprofiles/Canon PowerShot G1 X Mark II.dcp b/rtdata/dcpprofiles/Canon PowerShot G1 X Mark II.dcp new file mode 100644 index 000000000..656649fd9 Binary files /dev/null and b/rtdata/dcpprofiles/Canon PowerShot G1 X Mark II.dcp differ diff --git a/rtdata/dcpprofiles/Canon PowerShot S120.dcp b/rtdata/dcpprofiles/Canon PowerShot S120.dcp new file mode 100644 index 000000000..8bb089c29 Binary files /dev/null and b/rtdata/dcpprofiles/Canon PowerShot S120.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM DBP for GX680.dcp b/rtdata/dcpprofiles/FUJIFILM DBP for GX680.dcp new file mode 100644 index 000000000..dcfc174c7 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM DBP for GX680.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-A5.dcp b/rtdata/dcpprofiles/FUJIFILM X-A5.dcp new file mode 100644 index 000000000..c6e88d789 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-A5.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-H1.dcp b/rtdata/dcpprofiles/FUJIFILM X-H1.dcp new file mode 100644 index 000000000..e3abc07f1 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-H1.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-Pro3.dcp b/rtdata/dcpprofiles/FUJIFILM X-Pro3.dcp new file mode 100644 index 000000000..bfbaff9e5 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-Pro3.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-T10.dcp b/rtdata/dcpprofiles/FUJIFILM X-T10.dcp new file mode 100644 index 000000000..e77837f3e Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-T10.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-T3.dcp b/rtdata/dcpprofiles/FUJIFILM X-T3.dcp new file mode 100644 index 000000000..5024f38a9 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-T3.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-T30.dcp b/rtdata/dcpprofiles/FUJIFILM X-T30.dcp new file mode 100644 index 000000000..97917b810 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-T30.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-T4.dcp b/rtdata/dcpprofiles/FUJIFILM X-T4.dcp new file mode 100644 index 000000000..d67b45d59 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-T4.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D500.dcp b/rtdata/dcpprofiles/NIKON D500.dcp new file mode 100644 index 000000000..c25294439 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D500.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D5300.dcp b/rtdata/dcpprofiles/NIKON D5300.dcp new file mode 100644 index 000000000..2c7566c8c Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D5300.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D610.dcp b/rtdata/dcpprofiles/NIKON D610.dcp new file mode 100644 index 000000000..a5a05ca34 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D610.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D7100.dcp b/rtdata/dcpprofiles/NIKON D7100.dcp new file mode 100644 index 000000000..332157fc9 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D7100.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D7500.dcp b/rtdata/dcpprofiles/NIKON D7500.dcp new file mode 100644 index 000000000..5e6cb2c64 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D7500.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D800.dcp b/rtdata/dcpprofiles/NIKON D800.dcp new file mode 100644 index 000000000..5f0ebba8c Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D800.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D850.dcp b/rtdata/dcpprofiles/NIKON D850.dcp new file mode 100644 index 000000000..806e1e9bb Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D850.dcp differ diff --git a/rtdata/dcpprofiles/NIKON Z 50.dcp b/rtdata/dcpprofiles/NIKON Z 50.dcp new file mode 100644 index 000000000..beca667a7 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON Z 50.dcp differ diff --git a/rtdata/dcpprofiles/NIKON Z 6.dcp b/rtdata/dcpprofiles/NIKON Z 6.dcp new file mode 100644 index 000000000..eeb45a6b8 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON Z 6.dcp differ diff --git a/rtdata/dcpprofiles/NIKON Z 7.dcp b/rtdata/dcpprofiles/NIKON Z 7.dcp new file mode 100644 index 000000000..19fb7bba6 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON Z 7.dcp differ diff --git a/rtdata/dcpprofiles/OLYMPUS E-M5MarkII.dcp b/rtdata/dcpprofiles/OLYMPUS E-M5MarkII.dcp new file mode 100644 index 000000000..c3f670bfb Binary files /dev/null and b/rtdata/dcpprofiles/OLYMPUS E-M5MarkII.dcp differ diff --git a/rtdata/dcpprofiles/PENTAX K-50.dcp b/rtdata/dcpprofiles/PENTAX K-50.dcp new file mode 100644 index 000000000..3205c7579 Binary files /dev/null and b/rtdata/dcpprofiles/PENTAX K-50.dcp differ diff --git a/rtdata/dcpprofiles/Panasonic DC-S5.dcp b/rtdata/dcpprofiles/Panasonic DC-S5.dcp new file mode 100644 index 000000000..fd01c1225 Binary files /dev/null and b/rtdata/dcpprofiles/Panasonic DC-S5.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-6300.dcp b/rtdata/dcpprofiles/SONY ILCE-6300.dcp new file mode 100644 index 000000000..53194d35d Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-6300.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-6400.dcp b/rtdata/dcpprofiles/SONY ILCE-6400.dcp new file mode 100644 index 000000000..8c5fcfec4 Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-6400.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-6500.dcp b/rtdata/dcpprofiles/SONY ILCE-6500.dcp new file mode 100644 index 000000000..66be8b1de Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-6500.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-6600.dcp b/rtdata/dcpprofiles/SONY ILCE-6600.dcp new file mode 100644 index 000000000..8c802d150 Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-6600.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-7M4.dcp b/rtdata/dcpprofiles/SONY ILCE-7M4.dcp new file mode 100644 index 000000000..693453619 Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-7M4.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-7RM4.dcp b/rtdata/dcpprofiles/SONY ILCE-7RM4.dcp new file mode 100644 index 000000000..e473fa496 Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-7RM4.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-9.dcp b/rtdata/dcpprofiles/SONY ILCE-9.dcp new file mode 100644 index 000000000..c07315812 Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-9.dcp differ diff --git a/rtdata/dcpprofiles/samsung SM-G930V.dcp b/rtdata/dcpprofiles/samsung SM-G930V.dcp new file mode 100644 index 000000000..9ae2c66a9 Binary files /dev/null and b/rtdata/dcpprofiles/samsung SM-G930V.dcp differ diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc index ebaf4d133..930f38a71 100644 Binary files a/rtdata/iccprofiles/output/RTv2_Medium.icc and b/rtdata/iccprofiles/output/RTv2_Medium.icc differ diff --git a/rtdata/images/png/rawtherapee-logo-128.png b/rtdata/images/png/rawtherapee-logo-128.png index d479e15f1..2929a62b6 100644 Binary files a/rtdata/images/png/rawtherapee-logo-128.png and b/rtdata/images/png/rawtherapee-logo-128.png differ diff --git a/rtdata/images/png/rawtherapee-logo-16.png b/rtdata/images/png/rawtherapee-logo-16.png index dc8084ffc..b2d9b197e 100644 Binary files a/rtdata/images/png/rawtherapee-logo-16.png and b/rtdata/images/png/rawtherapee-logo-16.png differ diff --git a/rtdata/images/png/rawtherapee-logo-24.png b/rtdata/images/png/rawtherapee-logo-24.png index 9ba43bc2f..c93bc44d9 100644 Binary files a/rtdata/images/png/rawtherapee-logo-24.png and b/rtdata/images/png/rawtherapee-logo-24.png differ diff --git a/rtdata/images/png/rawtherapee-logo-256.png b/rtdata/images/png/rawtherapee-logo-256.png index a6693fcdd..6b490ad9e 100644 Binary files a/rtdata/images/png/rawtherapee-logo-256.png and b/rtdata/images/png/rawtherapee-logo-256.png differ diff --git a/rtdata/images/png/rawtherapee-logo-32.png b/rtdata/images/png/rawtherapee-logo-32.png index c4e862bb8..f0bfa57a1 100644 Binary files a/rtdata/images/png/rawtherapee-logo-32.png and b/rtdata/images/png/rawtherapee-logo-32.png differ diff --git a/rtdata/images/png/rawtherapee-logo-48.png b/rtdata/images/png/rawtherapee-logo-48.png index ed1841d2a..ef6ba64e1 100644 Binary files a/rtdata/images/png/rawtherapee-logo-48.png and b/rtdata/images/png/rawtherapee-logo-48.png differ diff --git a/rtdata/images/png/rawtherapee-logo-64.png b/rtdata/images/png/rawtherapee-logo-64.png index d876b0e91..93f18a1d2 100644 Binary files a/rtdata/images/png/rawtherapee-logo-64.png and b/rtdata/images/png/rawtherapee-logo-64.png differ diff --git a/rtdata/images/rawtherapee.ico b/rtdata/images/rawtherapee.ico index d5e6425af..bc968503d 100644 Binary files a/rtdata/images/rawtherapee.ico and b/rtdata/images/rawtherapee.ico differ diff --git a/rtdata/images/rawtherapee_ico.xcf b/rtdata/images/rawtherapee_ico.xcf deleted file mode 100644 index c46ec64f7..000000000 Binary files a/rtdata/images/rawtherapee_ico.xcf and /dev/null differ diff --git a/rtdata/images/rt-logo-text-black.svg b/rtdata/images/rt-logo-text-black.svg new file mode 100644 index 000000000..6f7ac22e4 --- /dev/null +++ b/rtdata/images/rt-logo-text-black.svg @@ -0,0 +1,1151 @@ + + + + + RawTherapee Logo with Text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + RawTherapee Logo with Text + + + Maciej Dworak + + + www.rawtherapee.com + 2019-03-11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/rt-logo-text-white.svg b/rtdata/images/rt-logo-text-white.svg new file mode 100644 index 000000000..78458c622 --- /dev/null +++ b/rtdata/images/rt-logo-text-white.svg @@ -0,0 +1,1151 @@ + + + + + RawTherapee Logo with Text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + RawTherapee Logo with Text + + + Maciej Dworak + + + www.rawtherapee.com + 2019-03-11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/rt-logo.svg b/rtdata/images/rt-logo.svg new file mode 100644 index 000000000..dd8ed39ec --- /dev/null +++ b/rtdata/images/rt-logo.svg @@ -0,0 +1,655 @@ + + + + + RawTherapee Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + RawTherapee Logo + + + Maciej Dworak + + + www.rawtherapee.com + 2019-03-11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg new file mode 100644 index 000000000..f2712cee9 --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-horizontal-hicontrast.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg new file mode 100644 index 000000000..6382cc546 --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-horizontal-prelight.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg new file mode 100644 index 000000000..93cb21a43 --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-vertical-hicontrast.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg new file mode 100644 index 000000000..76f4312cb --- /dev/null +++ b/rtdata/images/svg/bidirectional-arrow-vertical-prelight.svg @@ -0,0 +1,127 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/draw.svg b/rtdata/images/svg/draw.svg new file mode 100644 index 000000000..30ea04ea4 --- /dev/null +++ b/rtdata/images/svg/draw.svg @@ -0,0 +1,108 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-ellipsis-small.svg b/rtdata/images/svg/histogram-ellipsis-small.svg new file mode 100644 index 000000000..4fdb17907 --- /dev/null +++ b/rtdata/images/svg/histogram-ellipsis-small.svg @@ -0,0 +1,135 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-bayer-on-small.svg b/rtdata/images/svg/histogram-type-histogram-raw-small.svg similarity index 100% rename from rtdata/images/svg/histogram-bayer-on-small.svg rename to rtdata/images/svg/histogram-type-histogram-raw-small.svg diff --git a/rtdata/images/svg/histogram-bayer-off-small.svg b/rtdata/images/svg/histogram-type-histogram-small.svg similarity index 59% rename from rtdata/images/svg/histogram-bayer-off-small.svg rename to rtdata/images/svg/histogram-type-histogram-small.svg index 5d6c439fb..1d2f6547e 100644 --- a/rtdata/images/svg/histogram-bayer-off-small.svg +++ b/rtdata/images/svg/histogram-type-histogram-small.svg @@ -1,6 +1,4 @@ - - + inkscape:version="1.0 (4035a4fb49, 2020-05-01)" + sodipodi:docname="histogram-type-histogram-small.svg"> + inkscape:snap-bbox-midpoints="false" + inkscape:document-rotation="0"> image/svg+xml - + - Maciej Dworak + Lawrence Lee @@ -100,40 +99,24 @@ inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(0,-8)"> + + y="10" + x="2" + height="12" + width="12" + id="rect1467" + style="opacity:0.3;fill:#2a7fff;stroke-linecap:square;fill-opacity:1" /> - - - + style="opacity:1;fill:none;fill-opacity:0.3;stroke:#000000;stroke-width:0.999999;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect849" + width="13" + height="13.000001" + x="1.5" + y="9.5" /> diff --git a/rtdata/images/svg/histogram-type-parade-small.svg b/rtdata/images/svg/histogram-type-parade-small.svg new file mode 100644 index 000000000..f299f8ab2 --- /dev/null +++ b/rtdata/images/svg/histogram-type-parade-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg new file mode 100644 index 000000000..ef2e8b51f --- /dev/null +++ b/rtdata/images/svg/histogram-type-vectorscope-hc-small.svg @@ -0,0 +1,131 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg b/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg new file mode 100644 index 000000000..62bbf9586 --- /dev/null +++ b/rtdata/images/svg/histogram-type-vectorscope-hs-small.svg @@ -0,0 +1,135 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/histogram-type-waveform-small.svg b/rtdata/images/svg/histogram-type-waveform-small.svg new file mode 100644 index 000000000..5147ab2fc --- /dev/null +++ b/rtdata/images/svg/histogram-type-waveform-small.svg @@ -0,0 +1,122 @@ + + + + + + + + + + image/svg+xml + + + + + Lawrence Lee + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/perspective-horizontal-vertical.svg b/rtdata/images/svg/perspective-horizontal-vertical.svg new file mode 100644 index 000000000..0c5046879 --- /dev/null +++ b/rtdata/images/svg/perspective-horizontal-vertical.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/svg/power-off-small.svg b/rtdata/images/svg/power-off-small.svg index d04115bb9..a45e63dc5 100644 --- a/rtdata/images/svg/power-off-small.svg +++ b/rtdata/images/svg/power-off-small.svg @@ -1,6 +1,4 @@ - - + inkscape:snap-bbox-midpoints="false" + inkscape:document-rotation="0"> image/svg+xml - + Maciej Dworak @@ -100,11 +99,15 @@ inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(0,-8)"> - + + diff --git a/rtdata/images/svg/power-on-small.svg b/rtdata/images/svg/power-on-small.svg index caaf7992d..271c8e53e 100644 --- a/rtdata/images/svg/power-on-small.svg +++ b/rtdata/images/svg/power-on-small.svg @@ -1,6 +1,4 @@ - - + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + sodipodi:docname="power-on-small.svg"> + inkscape:snap-bbox-midpoints="false" + inkscape:document-rotation="0" + inkscape:snap-global="false"> + dotted="false" + visible="true" + enabled="true" /> @@ -63,7 +65,7 @@ image/svg+xml - + Maciej Dworak @@ -97,18 +99,36 @@ + transform="translate(0,-8)" + inkscape:groupmode="layer"> + style="display:none;opacity:0.75;fill:none;fill-opacity:0.752941;fill-rule:nonzero;stroke:#2a7fff;stroke-width:2.9;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + d="M 11.503774,13.128228 A 5,5 0 0 1 13,16.695239 v 0 a 5,5 0 0 1 -5,5 5,5 0 0 1 -5,-5 5,5 0 0 1 1.499601,-3.570323" + id="path5608-3" + inkscape:connector-curvature="0" + inkscape:label="bottom round glow" /> + id="path2553-6" + inkscape:connector-curvature="0" + inkscape:label="bottom straight glow" /> + + + diff --git a/rtdata/images/svg/rt-logo.svg b/rtdata/images/svg/rt-logo.svg deleted file mode 100644 index a8417d4db..000000000 --- a/rtdata/images/svg/rt-logo.svg +++ /dev/null @@ -1,609 +0,0 @@ - - - - - RawTherapee logo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - RawTherapee logo - - - Maciej Dworak - - - www.rawtherapee.com - 2019-03-11 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtdata/images/svg/splash.svg b/rtdata/images/svg/splash.svg index 0989bfdb6..a840aac4d 100644 --- a/rtdata/images/svg/splash.svg +++ b/rtdata/images/svg/splash.svg @@ -2,323 +2,222 @@ - RawTherapee splash screen - - - RawTherapee splash screen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - RawTherapee splash screen - - - - Maciej Dworak - - - www.rawtherapee.com - - - - - - - - - - - - - RawTherapee splash screen - - - 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 - . 8 - Therapee - Raw - Therapee - Raw - - - - - - - - - - - - - - - - - - - - - - + id="g220" /> diff --git a/rtdata/images/svg/splash_template.svg b/rtdata/images/svg/splash_template.svg new file mode 100644 index 000000000..f5424e7cc --- /dev/null +++ b/rtdata/images/svg/splash_template.svg @@ -0,0 +1,1350 @@ + + + + + RawTherapee splash screen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RawTherapee splash screen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Therapee + Raw + + + + + 5 + 9 + . + + GNU GPLv3 + + Prerequisites +Obtain and install the font family ITC Eras Std. + +Details +The color wheel is copied from rt-logo.svg and a glow filter is added +to each segment and the wheel as a whole. +"Raw": font ITC Eras Ultra-Bold, 60 pt, -3 px letter spacing +"Therapee": font ITC Eras Medium, 60 pt, +1,5 pt letter spacing +Version (big number): ITC Eras Bold, 58 pt, skewed -3° +Version (period + small number): ITC Eras Bold, 34 pt, skewed -3° +Release-type: ITC Eras Bold, 16 pt, skewed -3° + +Publishing +1. To prepare a splash screen for deployment, select all text and choose Path > Object to Path. +2. Change release type text to whatever is required, or hide the layer "Release type" entirely. +3. Remove this text field. +4. Save as "splash.svg" into "./rtdata/images/svg". + +RawTherapee splash screen design 1.5 (March 2022) +www.rawtherapee.com + + + Development + + diff --git a/rtdata/images/svg/spot-active.svg b/rtdata/images/svg/spot-active.svg new file mode 100644 index 000000000..bc36a7a19 --- /dev/null +++ b/rtdata/images/svg/spot-active.svg @@ -0,0 +1,81 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/rtdata/images/svg/spot-normal.svg b/rtdata/images/svg/spot-normal.svg new file mode 100644 index 000000000..d0320e31f --- /dev/null +++ b/rtdata/images/svg/spot-normal.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/rtdata/images/svg/spot-prelight.svg b/rtdata/images/svg/spot-prelight.svg new file mode 100644 index 000000000..9cfc1acfa --- /dev/null +++ b/rtdata/images/svg/spot-prelight.svg @@ -0,0 +1,74 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 31614c7b3..4485966ff 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -162,13 +162,11 @@ HISTOGRAM_TOOLTIP_BAR;Mostra/amaga la barra indicadora RGB\nClic botó dret a la HISTOGRAM_TOOLTIP_G;Mostra/amaga l'histograma VERD HISTOGRAM_TOOLTIP_L;Mostra/amaga l'histograma de luminància CIELAB HISTOGRAM_TOOLTIP_R;Mostra/amaga l'histograma VERMELL -HISTOGRAM_TOOLTIP_RAW;Mostra/Amaga l'histograma RAW HISTORY_CHANGED;Canviat HISTORY_CUSTOMCURVE;Corba particular HISTORY_FROMCLIPBOARD;Del portapapers HISTORY_LABEL;Història HISTORY_MSG_1;Imatge oberta -HISTORY_MSG_2;PP3 carregat HISTORY_MSG_3;PP3 canviat HISTORY_MSG_4;Repassant la història HISTORY_MSG_5;Brillantor @@ -182,9 +180,6 @@ HISTORY_MSG_12;Exposició automàtica HISTORY_MSG_13;Pèrdua per exposició HISTORY_MSG_14;Luminància: Brillantor HISTORY_MSG_15;Luminància: Contrast -HISTORY_MSG_16;Luminància: Negre -HISTORY_MSG_17;Luminància: Compressió de clars -HISTORY_MSG_18;Luminància: Compressió de foscos HISTORY_MSG_19;Corba 'L' HISTORY_MSG_20;Enfocant HISTORY_MSG_21;Enfocant -Radi @@ -209,10 +204,6 @@ HISTORY_MSG_40;Tint de balanç de blancs HISTORY_MSG_41;Corba de to mode 1 HISTORY_MSG_42;Corba de to 2 HISTORY_MSG_43;Corba de to mode 2 -HISTORY_MSG_44;Lumin. dessoroll Radi -HISTORY_MSG_45;Lumin. dessoroll, tolerància vores -HISTORY_MSG_46;Dessorollant color -HISTORY_MSG_47;Barreja clars intensos ICC amb la matriu HISTORY_MSG_48;Usa corba de to DCP HISTORY_MSG_49;Dessoroll de color, sensib. de vores HISTORY_MSG_50;Foscos/clars intensos @@ -220,7 +211,6 @@ HISTORY_MSG_51;Clars intensos HISTORY_MSG_52;Foscos HISTORY_MSG_53;Amplada de to de clars HISTORY_MSG_54;Amplada de to de foscos -HISTORY_MSG_55;Contrast local HISTORY_MSG_56;Radi foscos/clars intensos HISTORY_MSG_57;Rotació tosca HISTORY_MSG_58;Inversió horitzontal @@ -232,7 +222,6 @@ HISTORY_MSG_63;Instantània seleccionada HISTORY_MSG_64;Cropa foto HISTORY_MSG_65;Correcció A.C. HISTORY_MSG_66;Recuperació de clars intensos -HISTORY_MSG_67;Recup. de clars: quantitat HISTORY_MSG_68;Recup. de clars: mètode HISTORY_MSG_69;Espai de color de treball HISTORY_MSG_70;Espai de color de sortida @@ -243,12 +232,10 @@ HISTORY_MSG_74;Canviar l'escala HISTORY_MSG_75;Mètode de canvi d'escala HISTORY_MSG_76;Metadades Exif HISTORY_MSG_77;Metadades IPTC -HISTORY_MSG_78;Especificacions per a escalar HISTORY_MSG_79;Variar amplada HISTORY_MSG_80;Variar alçada HISTORY_MSG_81;Escalat activat HISTORY_MSG_82;Perfil canviat -HISTORY_MSG_83;Alta qual. ombres/clars intensos HISTORY_MSG_84;Correcció de perspectiva HISTORY_MSG_85;Perfil de correcció de la lent HISTORY_MSG_86;Equalitzador d'ónula @@ -292,12 +279,6 @@ HISTORY_MSG_127;Auto-sel. camp pla HISTORY_MSG_128;Camp pla borrós - radi HISTORY_MSG_129;Camp pla borrós - tipus HISTORY_MSG_130;Auto-distorsió -HISTORY_MSG_131;Dessoroll de luminància -HISTORY_MSG_132;Dessoroll de crominància -HISTORY_MSG_133;Gama -HISTORY_MSG_134;Posició Gama -HISTORY_MSG_135;Gama lliure -HISTORY_MSG_136;Pendent de Gama HISTORY_MSG_137;Negre nivell verd 1 HISTORY_MSG_138;Negre nivell roig HISTORY_MSG_139;Negre nivell blau @@ -663,11 +644,11 @@ TP_EPD_REWEIGHTINGITERATES;Iteracions de ponderació TP_EPD_SCALE;Escala TP_EPD_STRENGTH;Intensitat TP_EXPOSURE_AUTOLEVELS;Nivells automàtics -TP_EXPOSURE_AUTOLEVELS_TIP;Activa auto-nivells per a ajustar automàticament els valors dels paràmetres segons anàlisi de la imatge +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Activa auto-nivells per a ajustar automàticament els valors dels paràmetres segons anàlisi de la imatge TP_EXPOSURE_BLACKLEVEL;Negre TP_EXPOSURE_BRIGHTNESS;Brillantor TP_EXPOSURE_CLIP;Retall -TP_EXPOSURE_CLIP_TIP;Conjunt de píxels que es retallaran en l'anivellament automàtic +TP_EXPOSURE_CLIP_TOOLTIP;Conjunt de píxels que es retallaran en l'anivellament automàtic TP_EXPOSURE_COMPRHIGHLIGHTS;Quantitat recuperació de clars TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Llindar recup. clars intensos TP_EXPOSURE_COMPRSHADOWS;Recuperació de foscos @@ -749,14 +730,14 @@ TP_LABCURVE_CURVEEDITOR_LC;LC TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Cromaticitat segons la luminància TP_LABCURVE_LABEL;Ajustos Lab TP_LABCURVE_LCREDSK;LC limitat als tons vermell i pell -TP_LABCURVE_LCREDSK_TIP;Si habilitat, la corba LC (luminància segons cromaticitat) es limita als tons vermell i de pell\nSi no ho està, s'aplica a tots els tons +TP_LABCURVE_LCREDSK_TOOLTIP;Si habilitat, la corba LC (luminància segons cromaticitat) es limita als tons vermell i de pell\nSi no ho està, s'aplica a tots els tons TP_LABCURVE_RSTPROTECTION;Protecció de tons vermells i de pell TP_LABCURVE_RSTPRO_TOOLTIP;Es maneja amb el control de cromaticitat i la corba CC. TP_LENSGEOM_AUTOCROP;Auto cropa TP_LENSGEOM_FILL;Auto omple TP_LENSGEOM_LABEL;Lent / Geometria TP_LENSPROFILE_LABEL;Perfil de correcció de lent -TP_NEUTRAL_TIP;Torna els controls d'exposició a valors neutrals +TP_NEUTRAL_TOOLTIP;Torna els controls d'exposició a valors neutrals TP_PERSPECTIVE_HORIZONTAL;Horitzontal TP_PERSPECTIVE_LABEL;Perspectiva TP_PERSPECTIVE_VERTICAL;Vertical @@ -913,7 +894,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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 @@ -932,9 +913,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps !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_FAST_PIPELINE_TOOLTIP;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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !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 @@ -948,6 +929,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !FILEBROWSER_POPUPCOLORLABEL3;Label: Green !FILEBROWSER_POPUPCOLORLABEL4;Label: Blue !FILEBROWSER_POPUPCOLORLABEL5;Label: Purple +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPRANK0;Unrank !FILEBROWSER_POPUPRANK1;Rank 1 * !FILEBROWSER_POPUPRANK2;Rank 2 ** @@ -977,6 +959,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_CURRENT;Current +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help !GENERAL_OPEN;Open !GENERAL_RESET;Reset @@ -984,46 +968,55 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_CROSSHAIR;Show/Hide indicator crosshair. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_MSG_36;Lens Correction - CA !HISTORY_MSG_117;Raw CA correction - Red !HISTORY_MSG_118;Raw CA correction - Blue !HISTORY_MSG_121;Raw CA Correction - Auto !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_173;NR - Detail recovery -!HISTORY_MSG_174;CIECAM02 -!HISTORY_MSG_175;CAM02 - CAT02 adaptation -!HISTORY_MSG_176;CAM02 - Viewing surround -!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_174;Color Appearance & Lighting +!HISTORY_MSG_175;CAL - SC - Adaptation +!HISTORY_MSG_176;CAL - VC - Surround +!HISTORY_MSG_177;CAL - SC - Absolute luminance +!HISTORY_MSG_178;CAL - VC - Absolute luminance +!HISTORY_MSG_179;CAL - SC - WP model +!HISTORY_MSG_180;CAL - IA - Lightness (J) +!HISTORY_MSG_181;CAL - IA - Chroma (C) +!HISTORY_MSG_182;CAL - SC - Auto adaptation +!HISTORY_MSG_183;CAL - IA - Contrast (J) +!HISTORY_MSG_184;CAL - SC - Surround +!HISTORY_MSG_185;CAL - Gamut control +!HISTORY_MSG_186;CAL - IA - Algorithm +!HISTORY_MSG_187;CAL - IA - Red/skin protection +!HISTORY_MSG_188;CAL - IA - Brightness (Q) +!HISTORY_MSG_189;CAL - IA - Contrast (Q) +!HISTORY_MSG_190;CAL - IA - Saturation (S) +!HISTORY_MSG_191;CAL - IA - Colorfulness (M) +!HISTORY_MSG_192;CAL - IA - Hue (h) +!HISTORY_MSG_193;CAL - IA - Tone curve 1 +!HISTORY_MSG_194;CAL - IA - Tone curve 2 +!HISTORY_MSG_195;CAL - IA - Tone curve 1 mode +!HISTORY_MSG_196;CAL - IA - Tone curve 2 mode +!HISTORY_MSG_197;CAL - IA - Color curve +!HISTORY_MSG_198;CAL - IA - Color curve mode +!HISTORY_MSG_199;CAL - IA - Use CAM output for histograms +!HISTORY_MSG_200;CAL - IA - Use CAM for 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_205;CAL - Hot/bad pixel filter +!HISTORY_MSG_206;CAL - SC - Auto absolute luminance !HISTORY_MSG_207;Defringe - Hue curve !HISTORY_MSG_208;WB - B/R equalizer !HISTORY_MSG_210;GF - Angle @@ -1066,7 +1059,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 @@ -1090,8 +1082,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance !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 @@ -1116,7 +1106,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 @@ -1134,10 +1123,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_318;W - Contrast - Finer levels +!HISTORY_MSG_319;W - Contrast - Finer range +!HISTORY_MSG_320;W - Contrast - Coarser range +!HISTORY_MSG_321;W - Contrast - Coarser levels !HISTORY_MSG_322;W - Gamut - Avoid color shift !HISTORY_MSG_323;W - ES - Local contrast !HISTORY_MSG_324;W - Chroma - Pastel @@ -1201,14 +1190,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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 - Color Balance +!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 @@ -1225,7 +1214,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 @@ -1241,7 +1229,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -1261,30 +1249,45 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens @@ -1295,6 +1298,654 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1310,22 +1961,42 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !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_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1340,23 +2011,84 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !ICCPROFCREATOR_COPYRIGHT;Copyright: -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!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 @@ -1368,11 +2100,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !ICCPROFCREATOR_ILL_50;D50 !ICCPROFCREATOR_ILL_55;D55 !ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -1382,6 +2115,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -1389,13 +2123,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !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 @@ -1407,7 +2142,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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. @@ -1431,12 +2166,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !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 @@ -1450,25 +2187,28 @@ 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. +!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_COLORAPP;Color Appearance & Lighting !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_GRADIENT;Graduated filter !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !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_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue @@ -1478,6 +2218,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_APPEARANCE;Appearance !PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font @@ -1502,10 +2243,16 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP;Crop Editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1522,10 +2269,17 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !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_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_INSPECTORWINDOW;Open inspector in own window or fullscreen !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. @@ -1554,12 +2308,13 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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 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_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview @@ -1567,8 +2322,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering !PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !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_MODE_TOOLTIP;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_PDYNAMIC;Dynamic !PROFILEPANEL_PINTERNAL;Neutral @@ -1599,7 +2355,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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;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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects @@ -1634,7 +2397,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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. @@ -1663,6 +2426,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1672,51 +2436,76 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_BRIGHT_TOOLTIP;Brightness in CIECAM is the amount of perceived light emanating from a stimulus. It differs from L*a*b* and RGB brightness. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed !TP_COLORAPP_CHROMA;Chroma (C) !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_M_TOOLTIP;Colorfulness in CIECAM is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less colored. !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_CHROMA_S_TOOLTIP;Saturation in CIECAM corresponds to the color of a stimulus in relation to its own brightness. It differs from L*a*b* and RGB saturation. +!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM corresponds to the color of a stimulus relative to the clarity of a stimulus that appears white under identical conditions. It differs from L*a*b* and RGB chroma. +!TP_COLORAPP_CIECAT_DEGREE;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_CONTRAST_Q_TOOLTIP;Contrast (Q) in CIECAM is based on brightness. It differs from L*a*b* and RGB contrast. +!TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) in CIECAM is based on lightness. It 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_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of J after CIECAM.\n\nJ is 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_CURVEEDITOR2_TOOLTIP;Same usage as with the first J(J) 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_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_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of C, S or M after CIECAM.\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;Show CIECAM output histograms in CAL curves +!TP_COLORAPP_DATACIE_TOOLTIP;Affects histograms shown in Color Appearance & Lightning curves. Does not affect RawTherapee's main histogram.\n\nEnabled: show approximate values for J and C, S or M after the CIECAM adjustments.\nDisabled: show L*a*b* values before CIECAM adjustments. +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GAMUT;Use gamut control in L*a*b* mode +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. !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_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a color described as red, green, blue and yellow. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_LABEL;Color Appearance & Lighting !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_LIGHT_TOOLTIP;Lightness in CIECAM is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions. It 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 by the user, the output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODEL;WP model +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02/16] + [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 + tint + CAT02/16 + [output]: temp and tint 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_NEUTRAL_TOOLTIP;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_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. !TP_COLORAPP_SURROUND;Surround +!TP_COLORAPP_SURROUNDSRC;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 slightly 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_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device. The darker the viewing conditions, the darker the image will become. Image brightness will not be changed when the viewing conditions are set to average. +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness @@ -1725,19 +2514,23 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TONECIE;Use CIECAM for tone mapping !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_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. !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_WBCAM;WB [RT+CAT02/16] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_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 @@ -1767,11 +2560,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_NEUTRAL_TOOLTIP;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 @@ -1788,6 +2581,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_GTCENTEREDSQUARE;Centered square !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1796,7 +2590,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1808,7 +2602,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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. @@ -1829,14 +2623,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_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. @@ -1856,7 +2650,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_DISTORTION_AUTO_TOOLTIP;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 @@ -1866,11 +2660,21 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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 @@ -1891,6 +2695,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_GRADIENT_STRENGTH;Strength !TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. !TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +!TP_HLREC_HLBLUR;Blur !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 @@ -1900,26 +2705,75 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !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) +!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_HH_TOOLTIP;Hue according to hue H=f(H). !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_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H). +!TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L). +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -1934,6 +2788,788 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_METADATA_EDIT;Apply modifications !TP_METADATA_MODE;Metadata copy mode !TP_METADATA_STRIP;Strip all metadata @@ -1947,6 +3583,27 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !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 @@ -1959,10 +3616,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows !TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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_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_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1978,9 +3639,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBBILINEAR;DCB+Bilinear !TP_RAW_DCBVNG4;DCB+VNG4 !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... @@ -2003,6 +3666,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -2013,7 +3678,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -2028,16 +3693,21 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_RCD;RCD +!TP_RAW_RCDBILINEAR;RCD+Bilinear !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.\n+fast gives less artifacts in flat areas +!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_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_RETINEX_CONTEDIT_HSL;HSL histogram !TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram !TP_RETINEX_CONTEDIT_LH;Hue @@ -2045,7 +3715,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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 @@ -2053,7 +3723,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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -2068,7 +3738,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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) @@ -2087,11 +3757,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +!TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -2101,9 +3771,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2112,14 +3782,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_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_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter +!TP_SAVEDIALOG_OK_TOOLTIP;Shortcut: Ctrl-Enter !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_ITERCHECK;Auto limit iterations @@ -2127,6 +3797,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression @@ -2140,22 +3815,28 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_WAVELET_7;Level 7 !TP_WAVELET_8;Level 8 !TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To +!TP_WAVELET_APPLYTO;Apply to !TP_WAVELET_AVOID;Avoid color shift !TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey +!TP_WAVELET_B1;Gray !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_BALCHROM;Equalizer Color !TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +!TP_WAVELET_BALLUM;Denoise equalizer White-Black !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_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CCURVE;Local contrast !TP_WAVELET_CH1;Whole chroma range !TP_WAVELET_CH2;Saturated/pastel @@ -2163,29 +3844,42 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_WAVELET_CHCU;Curve !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!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_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green !TP_WAVELET_COMPCONT;Contrast +!TP_WAVELET_COMPEXPERT;Advanced !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_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !TP_WAVELET_COMPTM;Tone mapping !TP_WAVELET_CONTEDIT;'After' contrast curve +!TP_WAVELET_CONTFRAME;Contrast - Compression !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_CONTRA_TOOLTIP;Changes the residual image contrast. !TP_WAVELET_CTYPE;Chrominance control +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !TP_WAVELET_DALL;All directions !TP_WAVELET_DAUB;Edge performance !TP_WAVELET_DAUB2;D2 - low @@ -2193,62 +3887,101 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast !TP_WAVELET_DONE;Vertical !TP_WAVELET_DTHR;Diagonal !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 +!TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast !TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights +!TP_WAVELET_HS2;Selective luminance range !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;Hue range !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. !TP_WAVELET_LEVF;Contrast +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength !TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !TP_WAVELET_NEUTRAL;Neutral !TP_WAVELET_NOIS;Denoise !TP_WAVELET_NOISE;Denoise and Refine @@ -2257,48 +3990,81 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % !TP_WAVELET_RE1;Reinforced !TP_WAVELET_RE2;Unchanged !TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_RESCHRO;Strength !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_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREN;Refine +!TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles +!TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale !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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic !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_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_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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 diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 5be2958e8..e4e89fed2 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -4,25 +4,35 @@ #03 2013-10-20 Jiero #04 2014-10-24 Jie Luo #05 2017-09-18 Chongnuo Ji +#06 2020-08-11 十一元人民币 +#07 2021-09-24 十一元人民币 +#08 2022-07-26 十一元人民币 ABOUT_TAB_BUILD;版本 -ABOUT_TAB_CREDITS;感谢 +ABOUT_TAB_CREDITS;致谢名单 ABOUT_TAB_LICENSE;授权协议 ABOUT_TAB_RELEASENOTES;发布说明 ABOUT_TAB_SPLASH;启动页 +ADJUSTER_RESET_TO_DEFAULT;单击-恢复默认值\nCtrl+单击-恢复初始值 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;自定义 CURVEEDITOR_DARKS;暗 -CURVEEDITOR_HIGHLIGHTS;高亮 +CURVEEDITOR_EDITPOINT_HINT;启用对于节点进/出值的编辑\n\n右击选中节点\n右击空白处取消选中节点 +CURVEEDITOR_HIGHLIGHTS;高光 CURVEEDITOR_LIGHTS;光 CURVEEDITOR_LINEAR;线性 -CURVEEDITOR_LOADDLGLABEL;正读取曲线... +CURVEEDITOR_LOADDLGLABEL;加载曲线... CURVEEDITOR_MINMAXCPOINTS;均衡器 CURVEEDITOR_NURBS;控制点 CURVEEDITOR_PARAMETRIC;参数 -CURVEEDITOR_SAVEDLGLABEL;正保存曲线... +CURVEEDITOR_SAVEDLGLABEL;保存曲线... CURVEEDITOR_SHADOWS;阴影 CURVEEDITOR_TOOLTIPCOPY;复制当前曲线到剪贴板 CURVEEDITOR_TOOLTIPLINEAR;重置曲线 @@ -35,18 +45,25 @@ DONT_SHOW_AGAIN;不再显示该信息 DYNPROFILEEDITOR_DELETE;删除 DYNPROFILEEDITOR_EDIT;编辑 DYNPROFILEEDITOR_EDIT_RULE;编辑动态配置规则 -DYNPROFILEEDITOR_ENTRY_TOOLTIP;该项匹配不区分大小写 \n使用 "re:" 前缀来输入 \na 正则式 +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(除非你希望精调)同时按住鼠标左键,将鼠标向上/下移动以上下调整曲线中的点 EXIFFILTER_APERTURE;光圈 EXIFFILTER_CAMERA;相机 EXIFFILTER_EXPOSURECOMPENSATION;曝光补偿值 (EV) EXIFFILTER_FILETYPE;文件类型 EXIFFILTER_FOCALLEN;焦距 +EXIFFILTER_IMAGETYPE;图像类型 EXIFFILTER_ISO;感光度 EXIFFILTER_LENS;镜头 EXIFFILTER_METADATAFILTER;启用元数据过滤器 @@ -64,121 +81,160 @@ EXIFPANEL_RESET;重置 EXIFPANEL_RESETALL;全部重置 EXIFPANEL_RESETALLHINT;重置所有标签内容 EXIFPANEL_RESETHINT;重置所选标签内容 +EXIFPANEL_SHOWALL;显示所有 EXIFPANEL_SUBDIRECTORY;子文件夹 -EXPORT_BYPASS_ALL;(取消)选择全部 -EXPORT_BYPASS_DEFRINGE;不应用去边处理 -EXPORT_BYPASS_DIRPYRDENOISE;不应用降噪处理 -EXPORT_BYPASS_DIRPYREQUALIZER;不应用分频反差调整 -EXPORT_BYPASS_EQUALIZER;不应用小波变换级别处理 -EXPORT_BYPASS_RAW_CA;不应用 [raw] 色差矫正 -EXPORT_BYPASS_RAW_CCSTEPS;不应用 [raw] 摩尔纹控制 -EXPORT_BYPASS_RAW_DF;不应用 [raw] 暗场处理 -EXPORT_BYPASS_RAW_FF;不应用 [raw] 平场 -EXPORT_BYPASS_RAW_GREENTHRESH;不应用 [raw] 绿色偏纠正 -EXPORT_BYPASS_RAW_LINENOISE;不应用 [raw] 线噪过滤 -EXPORT_BYPASS_SHARPENEDGE;不应用边缘锐化 -EXPORT_BYPASS_SHARPENING;不应用锐化 -EXPORT_BYPASS_SHARPENMICRO;不应用微反差调节 +EXPORT_BYPASS;要跳过的处理步骤 +EXPORT_BYPASS_ALL;选择/取消选择全部选项 +EXPORT_BYPASS_DEFRINGE;跳过去除色边处理 +EXPORT_BYPASS_DIRPYRDENOISE;跳过降噪处理 +EXPORT_BYPASS_DIRPYREQUALIZER;跳过分频反差调整 +EXPORT_BYPASS_EQUALIZER;跳过小波层级处理 +EXPORT_BYPASS_RAW_CA;跳过 [raw] 色差矫正 +EXPORT_BYPASS_RAW_CCSTEPS;跳过 [raw] 伪色抑制 +EXPORT_BYPASS_RAW_DCB_ENHANCE;跳过 [raw] DCB优化步长 +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_LINENOISE;跳过 [raw] 线状噪点过滤 +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;跳过 [raw] LMMSE优化步长 +EXPORT_BYPASS_SHARPENEDGE;跳过边缘锐化 +EXPORT_BYPASS_SHARPENING;跳过锐化 +EXPORT_BYPASS_SHARPENMICRO;跳过微反差调节 EXPORT_FASTEXPORTOPTIONS;快速导出选项 -EXPORT_MAXHEIGHT;最大高度 -EXPORT_MAXWIDTH;最大宽度 -EXPORT_PUTTOQUEUEFAST; 放入快速导出序列 -EXPORT_RAW_DMETHOD;反拜尔算法 +EXPORT_INSTRUCTIONS;快速导出选项提供跳过占用资源和时间的处理步骤的选项,并使用快速导出设定来进行队列处理。\n此方法推荐在优先追求速度,生成低分辨率图片时使用;或是调整尺寸的图片大小适合你想得到的图片,并且又不想修改这些照片的后期处理参数时使用。 +EXPORT_MAXHEIGHT;最大高度: +EXPORT_MAXWIDTH;最大宽度: +EXPORT_PIPELINE;输出流水线 +EXPORT_PUTTOQUEUEFAST;放入快速导出队列 +EXPORT_RAW_DMETHOD;去马赛克算法 +EXPORT_USE_FAST_PIPELINE;专门(对缩放大小的图片应用全部处理) +EXPORT_USE_FAST_PIPELINE_TOOLTIP;使用专门的处理流水线来对图片进行处理,通过牺牲质量来换取速度。图片的缩小操作会提前,而非在正常流水线中那样在最后进行。这能够大幅提升速度,但是输出的图片中可能会杂点较多,画质较低。 +EXPORT_USE_NORMAL_PIPELINE;标准(跳过某些步骤,并在最后缩放图片) EXTPROGTARGET_1;raw EXTPROGTARGET_2;队列已处理 FILEBROWSER_APPLYPROFILE;应用配置 -FILEBROWSER_APPLYPROFILE_PARTIAL;应用 - 局部 +FILEBROWSER_APPLYPROFILE_PARTIAL;部分应用配置 FILEBROWSER_AUTODARKFRAME;自动暗场 FILEBROWSER_AUTOFLATFIELD;自动平场 +FILEBROWSER_BROWSEPATHBUTTONHINT;点击以打开路径,刷新文件夹并搜索“查找”框中的关键词 +FILEBROWSER_BROWSEPATHHINT;输入你希望前往的路径。\n\n快捷键:\nCtrl-o 让文本框获得焦点\nEnter / Ctrl-Enter 前往输入的目录\nEsc 清除改动\nShift-Esc 让文本框失去焦点\n\n路径快捷键:\n~ - 用户的home/文档路径\n! - 用户的图片路径 FILEBROWSER_CACHE;缓存 -FILEBROWSER_CLEARPROFILE;清空配置 -FILEBROWSER_COPYPROFILE;复制配置 +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;复制 FILEBROWSER_CURRENT_NAME;当前名称: FILEBROWSER_DARKFRAME;暗场 -FILEBROWSER_DELETEDIALOG_HEADER;确认删除 +FILEBROWSER_DELETEDIALOG_ALL;你确定要永久删除%1个垃圾桶中的文件吗? +FILEBROWSER_DELETEDIALOG_HEADER;删除确认 +FILEBROWSER_DELETEDIALOG_SELECTED;你希望永久删除%1个被选中的文件吗? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;你希望永久删除%1个被选中的文件,包括已进行过队列处理的版本吗? FILEBROWSER_EMPTYTRASH;清空垃圾箱 -FILEBROWSER_EXTPROGMENU;调用程序... +FILEBROWSER_EMPTYTRASHHINT;永久删除垃圾桶的所有文件 +FILEBROWSER_EXTPROGMENU;打开方式 FILEBROWSER_FLATFIELD;平场 FILEBROWSER_MOVETODARKFDIR;移动到暗场路径 FILEBROWSER_MOVETOFLATFIELDDIR;移动到平场路径 FILEBROWSER_NEW_NAME;新名称: -FILEBROWSER_OPENDEFAULTVIEWER;Windows 默认阅览工具 (序列) +FILEBROWSER_OPENDEFAULTVIEWER;Windows默认阅览工具(队列) FILEBROWSER_PARTIALPASTEPROFILE;选择性粘贴 -FILEBROWSER_PASTEPROFILE;粘贴配置 +FILEBROWSER_PASTEPROFILE;粘贴 FILEBROWSER_POPUPCANCELJOB;取消任务 -FILEBROWSER_POPUPCOLORLABEL;彩色标帖 -FILEBROWSER_POPUPCOLORLABEL0;Label: 无 -FILEBROWSER_POPUPCOLORLABEL1;Label: 红 -FILEBROWSER_POPUPCOLORLABEL2;Label: 黄 -FILEBROWSER_POPUPCOLORLABEL3;Label: 绿 -FILEBROWSER_POPUPCOLORLABEL4;Label: 蓝 -FILEBROWSER_POPUPCOLORLABEL5;Label: 紫 +FILEBROWSER_POPUPCOLORLABEL;色彩标签 +FILEBROWSER_POPUPCOLORLABEL0;标签:无 +FILEBROWSER_POPUPCOLORLABEL1;标签:红 +FILEBROWSER_POPUPCOLORLABEL2;标签:黄 +FILEBROWSER_POPUPCOLORLABEL3;标签:绿 +FILEBROWSER_POPUPCOLORLABEL4;标签:蓝 +FILEBROWSER_POPUPCOLORLABEL5;标签:紫 FILEBROWSER_POPUPCOPYTO;复制至... FILEBROWSER_POPUPFILEOPERATIONS;文件操作 +FILEBROWSER_POPUPINSPECT;检视 FILEBROWSER_POPUPMOVEEND;移动到队列尾部 FILEBROWSER_POPUPMOVEHEAD;移动到队列头部 FILEBROWSER_POPUPMOVETO;移动至... FILEBROWSER_POPUPOPEN;打开 -FILEBROWSER_POPUPOPENINEDITOR;打开在编辑器 +FILEBROWSER_POPUPOPENINEDITOR;在编辑器中打开 FILEBROWSER_POPUPPROCESS;放入队列 -FILEBROWSER_POPUPPROCESSFAST;放入序列(快速导出) -FILEBROWSER_POPUPPROFILEOPERATIONS;处理色彩档案 -FILEBROWSER_POPUPRANK;评分 -FILEBROWSER_POPUPRANK0;去评分 -FILEBROWSER_POPUPRANK1;评 1 星 -FILEBROWSER_POPUPRANK2;评 2 星 -FILEBROWSER_POPUPRANK3;评 3 星 -FILEBROWSER_POPUPRANK4;评 4 星 -FILEBROWSER_POPUPRANK5;评 5 星 +FILEBROWSER_POPUPPROCESSFAST;放入队列(快速导出) +FILEBROWSER_POPUPPROFILEOPERATIONS;后期档案操作 +FILEBROWSER_POPUPRANK;评级 +FILEBROWSER_POPUPRANK0;取消评级 +FILEBROWSER_POPUPRANK1;评1星 +FILEBROWSER_POPUPRANK2;评2星 +FILEBROWSER_POPUPRANK3;评3星 +FILEBROWSER_POPUPRANK4;评4星 +FILEBROWSER_POPUPRANK5;评5星 +FILEBROWSER_POPUPREMOVE;永久删除 +FILEBROWSER_POPUPREMOVEINCLPROC;永久删除,包括队列处理的版本 FILEBROWSER_POPUPRENAME;重命名 FILEBROWSER_POPUPSELECTALL;全部选中 FILEBROWSER_POPUPTRASH;移动到垃圾箱 FILEBROWSER_POPUPUNRANK;取消星级 FILEBROWSER_POPUPUNTRASH;从垃圾箱中移除 -FILEBROWSER_QUERYBUTTONHINT;清除搜索序列 +FILEBROWSER_QUERYBUTTONHINT;清除搜索队列 +FILEBROWSER_QUERYHINT;输入文件名进行搜索。支持不完整文件名。使用英文逗号分割关键词,例:\n1001,1004,1199\n\n在关键词前面加入!=以排除此关键词,例:\n!=1001,1004,1199\n\n快捷键:\nCtrl-f-让搜索框获得焦点,\nEnter-搜索,\nEsc-清空搜索框,\nShift-Esc-让搜索框失去焦点 FILEBROWSER_QUERYLABEL; 查找: -FILEBROWSER_RANK1_TOOLTIP;评分 1 *\n快捷键:Shift-1 -FILEBROWSER_RANK2_TOOLTIP;评分 2 *\n快捷键:Shift-2 -FILEBROWSER_RANK3_TOOLTIP;评分 3 *\n快捷键:Shift-3 -FILEBROWSER_RANK4_TOOLTIP;评分 4 *\n快捷键:Shift-4 -FILEBROWSER_RANK5_TOOLTIP;评分 5 *\n快捷键:Shift-5 +FILEBROWSER_RANK1_TOOLTIP;评1星\n快捷键:Shift-1 +FILEBROWSER_RANK2_TOOLTIP;评2星\n快捷键:Shift-2 +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_SELECTDARKFRAME;选择暗场… +FILEBROWSER_SELECTFLATFIELD;选择平场… +FILEBROWSER_SHOWCOLORLABEL1HINT;显示被标记为红色的照片\n快捷键:Alt-1 +FILEBROWSER_SHOWCOLORLABEL2HINT;显示被标记为黄色的照片\n快捷键:Alt-2 +FILEBROWSER_SHOWCOLORLABEL3HINT;显示被标记为绿色的照片\n快捷键:Alt-3 +FILEBROWSER_SHOWCOLORLABEL4HINT;显示被标记为蓝色的照片\n快捷键:Alt-4 +FILEBROWSER_SHOWCOLORLABEL5HINT;显示被标记为紫色的照片\n快捷键:Alt-5 FILEBROWSER_SHOWDIRHINT;显示文件夹中所有图片 -FILEBROWSER_SHOWEXIFINFO;显示Exif 信息\n\n快捷:\ni - 多编辑标签页模式, \nAlt-i - 单编辑标签模式 +FILEBROWSER_SHOWEDITEDHINT;显示已编辑的照片\n快捷键:7 +FILEBROWSER_SHOWEDITEDNOTHINT;显示未编辑的照片\n快捷键:6 +FILEBROWSER_SHOWEXIFINFO;显示Exif信息\n\n快捷键:\ni - 多编辑标签页模式, \nAlt-i - 单编辑标签模式 +FILEBROWSER_SHOWNOTTRASHHINT;仅显示未进入垃圾箱的照片 +FILEBROWSER_SHOWORIGINALHINT;仅显示原图\n\n当多张文件名相同,但扩展名不同的图片存在时,在参数设置-文件浏览器-已知扩展名列表中,扩展名排得更靠上的图片会被当作这些图片的原图。 FILEBROWSER_SHOWRANK1HINT;显示1星图片 FILEBROWSER_SHOWRANK2HINT;显示2星图片 FILEBROWSER_SHOWRANK3HINT;显示3星图片 FILEBROWSER_SHOWRANK4HINT;显示4星图片 FILEBROWSER_SHOWRANK5HINT;显示5星图片 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;显示保存的图片\n快捷: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;显示保存的图片\n快捷键:Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;显示未保存的图片\n快捷键:Alt-6 FILEBROWSER_SHOWTRASHHINT;显示垃圾箱内容 +FILEBROWSER_SHOWUNCOLORHINT;显示没有颜色标记的照片\n快捷键:Alt-0 FILEBROWSER_SHOWUNRANKHINT;显示未评星图片 FILEBROWSER_THUMBSIZE;缩略图大小 +FILEBROWSER_UNRANK_TOOLTIP;未评级\n快捷键:Shift-0 FILEBROWSER_ZOOMINHINT;增大缩略图 -FILEBROWSER_ZOOMOUTHINT;减小缩略图 +FILEBROWSER_ZOOMOUTHINT;缩小缩略图 FILECHOOSER_FILTER_ANY;所有文件 FILECHOOSER_FILTER_COLPROF;色彩配置文件 FILECHOOSER_FILTER_CURVE;曲线文件 FILECHOOSER_FILTER_LCP;镜头矫正配置文件 FILECHOOSER_FILTER_PP;处理预设文件 FILECHOOSER_FILTER_SAME;与当前照片格式相同 -FILECHOOSER_FILTER_TIFF;TIFF 文件 +FILECHOOSER_FILTER_TIFF;TIFF文件 GENERAL_ABOUT;关于 -GENERAL_AFTER;之后 +GENERAL_AFTER;处理后 GENERAL_APPLY;应用 GENERAL_ASIMAGE;跟随图像 GENERAL_AUTO;自动 -GENERAL_BEFORE;之前 +GENERAL_BEFORE;处理前 GENERAL_CANCEL;取消 GENERAL_CLOSE;关闭 +GENERAL_CURRENT;当前 +GENERAL_DELETE_ALL;删除全部 GENERAL_DISABLE;禁用 GENERAL_DISABLED;禁用 +GENERAL_EDIT;编辑 GENERAL_ENABLE;启用 GENERAL_ENABLED;开启 GENERAL_FILE;文件 +GENERAL_HELP;帮助 GENERAL_LANDSCAPE;横向 GENERAL_NA;不适用 GENERAL_NO;否 @@ -186,137 +242,606 @@ GENERAL_NONE;无 GENERAL_OK;确定 GENERAL_OPEN;打开 GENERAL_PORTRAIT;纵向 +GENERAL_RESET;重置 GENERAL_SAVE;保存 -GENERAL_UNCHANGED;(未改变) +GENERAL_SAVE_AS;保存为... +GENERAL_SLIDER;滑条 +GENERAL_UNCHANGED;(无改变) GENERAL_WARNING;警告 +GIMP_PLUGIN_INFO;欢迎使用RawTherapee的GIMP插件!\n完成编辑后,只要关闭RawTherapee主窗口,图片就会被自动导入到GIMP当中 HISTOGRAM_TOOLTIP_B;显示/隐藏 蓝色直方图 -HISTOGRAM_TOOLTIP_G;显示/隐藏 绿色直方图 -HISTOGRAM_TOOLTIP_L;显示/隐藏 CIELAB 亮度直方图 -HISTOGRAM_TOOLTIP_R;显示/隐藏 红色直方图 +HISTOGRAM_TOOLTIP_BAR;显示/隐藏RGB指示条 +HISTOGRAM_TOOLTIP_CHRO;显示/隐藏色度直方图 +HISTOGRAM_TOOLTIP_CROSSHAIR;显示/隐藏指示光标 +HISTOGRAM_TOOLTIP_G;显示/隐藏绿色直方图 +HISTOGRAM_TOOLTIP_L;显示/隐藏CIELAB亮度直方图 +HISTOGRAM_TOOLTIP_MODE;将直方图显示模式切换为线性/对数线性/双对数 +HISTOGRAM_TOOLTIP_R;显示/隐藏红色直方图 +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;显示/隐藏示波器选项 +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;调整示波器亮度 +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;直方图 +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw直方图 +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB示波器 +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;色相-色度矢量示波器 +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;色相-饱和度矢量示波器 +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;波形图 HISTORY_CHANGED;已更改 HISTORY_CUSTOMCURVE;自定义曲线 HISTORY_FROMCLIPBOARD;从剪贴板 HISTORY_LABEL;历史 -HISTORY_MSG_1;图片加载完 -HISTORY_MSG_2;配置加载完 +HISTORY_MSG_1;图片加载完成 HISTORY_MSG_3;配置改变 HISTORY_MSG_4;历史浏览 -HISTORY_MSG_5;亮度 -HISTORY_MSG_6;对比度 -HISTORY_MSG_7;黑点 -HISTORY_MSG_8;曝光补偿 -HISTORY_MSG_9;高光压缩 -HISTORY_MSG_10;阴影压缩 -HISTORY_MSG_11;影调曲线 -HISTORY_MSG_12;自动曝光 -HISTORY_MSG_13;曝光溢出 -HISTORY_MSG_14;亮度亮度 -HISTORY_MSG_15;亮度对比度 -HISTORY_MSG_16;亮度黑 -HISTORY_MSG_17;亮度高光压缩 -HISTORY_MSG_18;亮度阴影压缩 -HISTORY_MSG_19;亮度曲线 +HISTORY_MSG_5;曝光-亮度 +HISTORY_MSG_6;曝光-对比度 +HISTORY_MSG_7;曝光-黑点 +HISTORY_MSG_8;曝光-曝光补偿 +HISTORY_MSG_9;曝光-高光压缩 +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_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_28;光晕控制量 -HISTORY_MSG_29;锐化方式 -HISTORY_MSG_30;重叠半径 -HISTORY_MSG_31;重叠程度 -HISTORY_MSG_32;重叠衰减 -HISTORY_MSG_33;重叠次数 -HISTORY_MSG_34;避免色彩溢出 -HISTORY_MSG_35;饱和度限制器 -HISTORY_MSG_36;饱和度限制 -HISTORY_MSG_37;色彩增强 -HISTORY_MSG_38;拍平衡方式 -HISTORY_MSG_39;色温 -HISTORY_MSG_40;白平衡微调 -HISTORY_MSG_41;色彩偏移 "A" -HISTORY_MSG_42;色彩偏移 "B" -HISTORY_MSG_43;亮度降噪 -HISTORY_MSG_44;亮度降噪半径 -HISTORY_MSG_45;亮度降噪边缘容差 -HISTORY_MSG_46;色彩降噪 -HISTORY_MSG_47;色彩降噪半径 -HISTORY_MSG_48;色彩降噪边缘容差 -HISTORY_MSG_49;色彩降噪边缘敏感度 +HISTORY_MSG_21;USM锐化-半径 +HISTORY_MSG_22;USM锐化-数量 +HISTORY_MSG_23;USM锐化-阈值 +HISTORY_MSG_24;USM锐化-仅锐化边缘 +HISTORY_MSG_25;USM锐化-边缘检测半径 +HISTORY_MSG_26;USM锐化-边缘容差 +HISTORY_MSG_27;USM锐化-光晕控制 +HISTORY_MSG_28;USM锐化-光晕控制数量 +HISTORY_MSG_29;锐化-方法 +HISTORY_MSG_30;RLD-半径 +HISTORY_MSG_31;RLD-数量 +HISTORY_MSG_32;RLD-衰减 +HISTORY_MSG_33;RLD-迭代 +HISTORY_MSG_34;镜头矫正-畸变 +HISTORY_MSG_35;镜头矫正-暗角 +HISTORY_MSG_36;镜头矫正-色差 +HISTORY_MSG_37;曝光-自动曝光 +HISTORY_MSG_38;白平衡-方法 +HISTORY_MSG_39;白平衡-色温 +HISTORY_MSG_40;白平衡-色调 +HISTORY_MSG_41;曝光-色调曲线1模式 +HISTORY_MSG_42;曝光-色调曲线2 +HISTORY_MSG_43;曝光-色调曲线2模式 +HISTORY_MSG_48;色度降噪-边缘容差 +HISTORY_MSG_49;色度降噪-边缘敏感度 HISTORY_MSG_50;阴影/高光工具 -HISTORY_MSG_51;高光增强 -HISTORY_MSG_52;阴影增强 -HISTORY_MSG_53;高光色度范围 -HISTORY_MSG_54;阴影色度范围 -HISTORY_MSG_55;局部对比度 -HISTORY_MSG_56;阴影/高光半径 +HISTORY_MSG_51;阴影/高光-高光 +HISTORY_MSG_52;阴影/高光-阴影 +HISTORY_MSG_53;阴影/高光-高光色调范围 +HISTORY_MSG_54;阴影/高光-阴影色调范围 +HISTORY_MSG_56;阴影/高光-半径 HISTORY_MSG_57;粗略旋转 HISTORY_MSG_58;水平翻转 -HISTORY_MSG_59;竖直翻转 +HISTORY_MSG_59;垂直翻转 HISTORY_MSG_60;旋转 -HISTORY_MSG_61;旋转 -HISTORY_MSG_62;镜头失真矫正 -HISTORY_MSG_63;设置书签 -HISTORY_MSG_64;剪切图片 -HISTORY_MSG_65;色散矫正 -HISTORY_MSG_66;高光还原 -HISTORY_MSG_67;高光还原程度 -HISTORY_MSG_68;高光还原方式 +HISTORY_MSG_61;自动填充 +HISTORY_MSG_62;镜头畸变矫正 +HISTORY_MSG_63;选择快照 +HISTORY_MSG_64;裁剪 +HISTORY_MSG_65;色差矫正 +HISTORY_MSG_66;曝光-高光还原 +HISTORY_MSG_68;曝光-高光还原方法 HISTORY_MSG_69;工作色彩空间 HISTORY_MSG_70;输出色彩空间 HISTORY_MSG_71;输入色彩空间 -HISTORY_MSG_72;暗角矫正 +HISTORY_MSG_72;暗角矫正-数量 HISTORY_MSG_73;通道混合器 -HISTORY_MSG_74;调整大小比例 -HISTORY_MSG_75;调整大小方式 +HISTORY_MSG_74;调整大小-比例 +HISTORY_MSG_75;调整大小-方法 HISTORY_MSG_76;Exif元数据 HISTORY_MSG_77;IPTC元数据 -HISTORY_MSG_78;调整大小数据 -HISTORY_MSG_79;调整宽度 -HISTORY_MSG_80;调整高度 -HISTORY_MSG_81;调整尺寸开启 -HISTORY_MSG_83;S/H - 锐度蒙板 +HISTORY_MSG_79;调整大小-宽度 +HISTORY_MSG_80;调整大小-高度 +HISTORY_MSG_81;调整大小 +HISTORY_MSG_82;档案修改 HISTORY_MSG_84;视角矫正 -HISTORY_MSG_85;LCP +HISTORY_MSG_85;镜头矫正-LCP档案 +HISTORY_MSG_86;RGB曲线-色度模式 +HISTORY_MSG_87;脉冲噪声降低 +HISTORY_MSG_88;脉冲降噪阈值 HISTORY_MSG_89;降噪 -HISTORY_MSG_90;降噪 - 亮度 -HISTORY_MSG_92;降噪 - 伽马 -HISTORY_MSG_103;HSV - 数值 -HISTORY_MSG_111;Lab - 避免色彩偏移 -HISTORY_MSG_113;Lab - 保护 +HISTORY_MSG_90;降噪-亮度 +HISTORY_MSG_91;降噪-色度主控 +HISTORY_MSG_92;降噪-伽马 +HISTORY_MSG_93;CbDL-数值 +HISTORY_MSG_94;分频反差调整(CbDL) +HISTORY_MSG_95;L*a*b*-色度 +HISTORY_MSG_96;L*a*b*-a* 曲线 +HISTORY_MSG_97;L*a*b*-b* 曲线 +HISTORY_MSG_98;去马赛克方法 +HISTORY_MSG_99;热像素过滤器 +HISTORY_MSG_100;曝光-饱和度 +HISTORY_MSG_101;HSV-色相 +HISTORY_MSG_102;HSV-饱和度 +HISTORY_MSG_103;HSV-亮度 +HISTORY_MSG_104;HSV均衡器 +HISTORY_MSG_105;去除色边 +HISTORY_MSG_106;去除色边-半径 +HISTORY_MSG_107;去除色边-阈值 +HISTORY_MSG_108;曝光-高光压缩阈值 +HISTORY_MSG_109;调整大小-边界限制网格 +HISTORY_MSG_110;调整大小-应用到 +HISTORY_MSG_111;Lab-避免色彩偏移 +HISTORY_MSG_113;Lab-保护 HISTORY_MSG_114;DCB 迭代 -HISTORY_MSG_119;线性消噪 -HISTORY_MSG_122;自动暗幅 -HISTORY_MSG_123;暗幅文件 -HISTORY_MSG_124;线性曝光修正 +HISTORY_MSG_115;伪色抑制 +HISTORY_MSG_116;DCB增强 +HISTORY_MSG_117;Raw色差矫正-红 +HISTORY_MSG_118;Raw色差矫正-蓝 +HISTORY_MSG_119;线状噪点过滤器 +HISTORY_MSG_120;绿平衡 +HISTORY_MSG_121;Raw色差矫正-自动 +HISTORY_MSG_122;自动暗场 +HISTORY_MSG_123;暗场文件 +HISTORY_MSG_124;白点矫正 HISTORY_MSG_126;平场文件 -HISTORY_MSG_127;平场自动选择 -HISTORY_MSG_128;平场模糊半径 -HISTORY_MSG_129;平场模糊类型 -HISTORY_MSG_130;自动扭曲纠正 +HISTORY_MSG_127;平场-自动选择 +HISTORY_MSG_128;平场-模糊半径 +HISTORY_MSG_129;平场-模糊类型 +HISTORY_MSG_130;自动畸变矫正 +HISTORY_MSG_142;边缘锐化-迭代 +HISTORY_MSG_143;边缘锐化-数量 +HISTORY_MSG_144;微反差-数量 +HISTORY_MSG_145;微反差-均匀度 HISTORY_MSG_146;边缘锐化 -HISTORY_MSG_147;边缘锐化 - 单纯亮度 -HISTORY_MSG_155;Vib - 避免色彩偏移 -HISTORY_MSG_158;力度 -HISTORY_MSG_159;边缘停止 -HISTORY_MSG_160;拉伸 +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;Vib-避免色彩偏移 +HISTORY_MSG_156;鲜明-饱和/欠饱和挂钩 +HISTORY_MSG_157;鲜明-饱/欠阈值 +HISTORY_MSG_158;色调映射-力度 +HISTORY_MSG_159;色调映射-边缘 +HISTORY_MSG_160;色调映射-规模度 +HISTORY_MSG_161;色调映射-再加权迭代 HISTORY_MSG_162;色调映射 -HISTORY_MSG_174;CIECAM02 -HISTORY_MSG_183;CAM02 - 对比度 (J) -HISTORY_MSG_210;渐变 - 角度 +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;鲜明度-HH曲线 +HISTORY_MSG_171;L*a*b*-LC曲线 +HISTORY_MSG_172;L*a*b*-限制LC +HISTORY_MSG_173;降噪-细节恢复 +HISTORY_MSG_174;CIECAM02/16 +HISTORY_MSG_175;CAM02/16-CAT02/16色适应 +HISTORY_MSG_176;CAM02/16-观察条件 +HISTORY_MSG_177;CAM02/16-场景亮度 +HISTORY_MSG_178;CAM02/16-观察亮度 +HISTORY_MSG_179;CAM02/16-白点模型 +HISTORY_MSG_180;CAM02/16-明度 (J) +HISTORY_MSG_181;CAM02/16-彩度 (C) +HISTORY_MSG_182;CAM02/16-自动CAT02/16 +HISTORY_MSG_183;CAM02/16-对比度 (J) +HISTORY_MSG_184;CAM02/16-场景条件 +HISTORY_MSG_185;CAM02/16-色域控制 +HISTORY_MSG_186;CAM02/16-算法 +HISTORY_MSG_187;CAM02/16-红色/肤色保护 +HISTORY_MSG_188;CAM02/16-视明度 (Q) +HISTORY_MSG_189;CAM02/16-对比度 (Q) +HISTORY_MSG_190;CAM02/16-饱和度 (S) +HISTORY_MSG_191;CAM02/16-视彩度 (M) +HISTORY_MSG_192;CAM02/16-色相 (h) +HISTORY_MSG_193;CAM02/16-色调曲线1 +HISTORY_MSG_194;CAM02/16-色调曲线2 +HISTORY_MSG_195;CAM02/16-色调曲线1 +HISTORY_MSG_196;CAM02/16-色调曲线2 +HISTORY_MSG_197;CAM02/16-色彩曲线 +HISTORY_MSG_198;CAM02/16-色彩曲线 +HISTORY_MSG_199;CAM02/16-输出直方图 +HISTORY_MSG_200;CAM02/16-色调映射 +HISTORY_MSG_201;降噪-色度-红&绿 +HISTORY_MSG_202;降噪-色度-蓝&黄 +HISTORY_MSG_203;降噪-色彩空间 +HISTORY_MSG_204;LMMSE优化步长 +HISTORY_MSG_205;CAM02/16-热像素/坏点过滤器 +HISTORY_MSG_206;CAT02/16-自动场景亮度 +HISTORY_MSG_207;去除色边-色相曲线 +HISTORY_MSG_208;白平衡-蓝红均衡器 +HISTORY_MSG_210;渐变-角度 HISTORY_MSG_211;渐变滤镜 -HISTORY_MSG_212;暗角 - 力度 +HISTORY_MSG_212;暗角-力度 HISTORY_MSG_213;暗角滤镜 -HISTORY_MSG_239;GF - 力度 -HISTORY_MSG_244;VC - 力度 -HISTORY_MSG_245;VC - 中心 +HISTORY_MSG_214;黑白 +HISTORY_MSG_215;黑白-通道混合-红 +HISTORY_MSG_216;黑白-通道混合-绿 +HISTORY_MSG_217;黑白-通道混合-蓝 +HISTORY_MSG_218;黑白-伽马-红 +HISTORY_MSG_219;黑白-伽马-绿 +HISTORY_MSG_220;黑白-伽马-蓝 +HISTORY_MSG_221;黑白-色彩过滤 +HISTORY_MSG_222;黑白-预设 +HISTORY_MSG_223;黑白-通道混合-橙 +HISTORY_MSG_224;黑白-通道混合-黄 +HISTORY_MSG_225;黑白-通道混合-青 +HISTORY_MSG_226;黑白-通道混合-品红 +HISTORY_MSG_227;黑白-通道混合-紫 +HISTORY_MSG_228;黑白-亮度均衡器 +HISTORY_MSG_229;黑白-亮度均衡器 +HISTORY_MSG_230;黑白-方法 +HISTORY_MSG_231;黑白-‘黑白前’曲线 +HISTORY_MSG_232;黑白-‘黑白前’曲线类型 +HISTORY_MSG_233;黑白-‘黑白后’曲线 +HISTORY_MSG_234;黑白-‘黑白前’曲线类型 +HISTORY_MSG_235;黑白-通道混合-自动 +HISTORY_MSG_237;黑白-通道混合 +HISTORY_MSG_238;渐变-羽化 +HISTORY_MSG_239;渐变-力度 +HISTORY_MSG_240;渐变-中心 +HISTORY_MSG_241;暗角-羽化 +HISTORY_MSG_242;暗角-圆度 +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;CbDL-阈值 +HISTORY_MSG_251;黑白-算法 +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_259;色调分离-不透明度曲线 +HISTORY_MSG_260;色调分离-a*[b*]不透明度 +HISTORY_MSG_261;色调分离-方法 +HISTORY_MSG_262;色调分离-b*不透明度 +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_276;色调分离-不透明度 +HISTORY_MSG_278;色调分离-保持亮度 +HISTORY_MSG_279;色调分离-阴影 +HISTORY_MSG_280;色调分离-高光 +HISTORY_MSG_281;色调分离-饱和度力度 +HISTORY_MSG_282;色调分离-饱和度阈值 +HISTORY_MSG_283;色调分离-力度 +HISTORY_MSG_284;色调分离-自动饱和度保护 +HISTORY_MSG_285;降噪-中值滤波-方法 +HISTORY_MSG_286;降噪-中值滤波-类型 +HISTORY_MSG_287;降噪-中值滤波-迭代 +HISTORY_MSG_288;平场-溢出控制 +HISTORY_MSG_289;平场-溢出控制-自动 +HISTORY_MSG_293;胶片模拟 +HISTORY_MSG_294;胶片模拟-力度 +HISTORY_MSG_295;胶片模拟-胶片 +HISTORY_MSG_296;降噪-亮度曲线 +HISTORY_MSG_297;降噪-模式 +HISTORY_MSG_298;坏点过滤器 +HISTORY_MSG_299;降噪-色度曲线 +HISTORY_MSG_301;降噪-亮度控制 +HISTORY_MSG_302;降噪-色度方法 +HISTORY_MSG_303;降噪-色度方法 +HISTORY_MSG_304;小波-反差等级 +HISTORY_MSG_305;小波层级 +HISTORY_MSG_306;小波-处理 +HISTORY_MSG_307;小波-处理 +HISTORY_MSG_308;小波-处理方向 +HISTORY_MSG_309;小波-边缘锐度-细节 +HISTORY_MSG_310;小波-残差图-肤色保护 +HISTORY_MSG_311;小波-小波层级 +HISTORY_MSG_312;小波-残差图-阴影阈值 +HISTORY_MSG_313;小波-色度-饱和/欠饱和 +HISTORY_MSG_314;小波-色域-减少杂点 +HISTORY_MSG_315;小波-残差图-反差 +HISTORY_MSG_316;小波-色域-肤色针对 +HISTORY_MSG_317;小波-色域-肤色色相 +HISTORY_MSG_318;小波-反差-精细等级 +HISTORY_MSG_319;小波-反差-精细范围 +HISTORY_MSG_320;小波-反差-粗糙范围 +HISTORY_MSG_321;小波-反差-粗糙等级 +HISTORY_MSG_322;小波-色域-避免偏色 +HISTORY_MSG_323;小波-边缘-局部反差 +HISTORY_MSG_324;小波-色度-欠饱和 +HISTORY_MSG_325;小波-色度-饱和 +HISTORY_MSG_326;小波-色度-方法 +HISTORY_MSG_327;小波-反差-应用到 +HISTORY_MSG_328;小波-色度-力度挂钩 +HISTORY_MSG_329;小波-调色-红绿不透明度 +HISTORY_MSG_330;小波-调色-蓝黄不透明度 +HISTORY_MSG_331;小波-反差等级-额外 +HISTORY_MSG_332;小波-切片方法 +HISTORY_MSG_333;小波-残差图-阴影 +HISTORY_MSG_334;小波-残差图-色度 +HISTORY_MSG_335;小波-残差图-高光 +HISTORY_MSG_336;小波-残差图-高光阈值 +HISTORY_MSG_337;小波-残差图-天空色相 +HISTORY_MSG_338;小波-边缘锐度-半径 +HISTORY_MSG_339;小波-边缘锐度-力度 +HISTORY_MSG_340;小波-力度 +HISTORY_MSG_341;小波-边缘表现 +HISTORY_MSG_342;小波-边缘-第一级 +HISTORY_MSG_343;小波-色度等级 +HISTORY_MSG_345;小波-边缘-局部反差 +HISTORY_MSG_346;小波-边缘-局部反差方法 +HISTORY_MSG_347;小波-去噪-第1级 +HISTORY_MSG_348;小波-去噪-第2级 +HISTORY_MSG_349;小波-去噪-第3级 +HISTORY_MSG_350;小波-边缘-边缘检测 +HISTORY_MSG_351;小波-残差图-HH曲线 +HISTORY_MSG_353;小波-边缘-渐变敏感度 +HISTORY_MSG_354;小波-边缘-增强 +HISTORY_MSG_355;小波-边缘-阈值低 +HISTORY_MSG_356;小波-边缘-阈值高 +HISTORY_MSG_357;小波-去噪-边缘锐度挂钩 +HISTORY_MSG_359;热像素/坏点阈值 +HISTORY_MSG_360;色调映射-伽马 +HISTORY_MSG_361;小波-最终-色度平衡 +HISTORY_MSG_362;小波-残差图-压缩方法 +HISTORY_MSG_363;小波-残差图-压缩力度 +HISTORY_MSG_364;小波-最终-反差平衡 +HISTORY_MSG_368;小波-最终-反差平衡 +HISTORY_MSG_369;小波-最终-平衡方法 +HISTORY_MSG_370;小波-最终-局部反差曲线 +HISTORY_MSG_371;调整大小后加锐(PRS) +HISTORY_MSG_372;PRS USM-半径 +HISTORY_MSG_373;PRS USM-数量 +HISTORY_MSG_374;PRS USM-阈值 +HISTORY_MSG_375;PRS USM-仅加锐边缘 +HISTORY_MSG_376;PRS USM-边缘检测半径 +HISTORY_MSG_377;PRS USM-边缘容差 +HISTORY_MSG_378;PRS USM-光晕控制 +HISTORY_MSG_379;PRS USM-光晕控制数量 +HISTORY_MSG_380;PRS-方法 +HISTORY_MSG_381;PRS RLD-半径 +HISTORY_MSG_382;PRS RLD-数量 +HISTORY_MSG_383;PRS RLD-衰减 +HISTORY_MSG_384;PRS RLD-迭代 +HISTORY_MSG_385;小波-残差图-色彩平衡 +HISTORY_MSG_403;小波-边缘-敏感度 +HISTORY_MSG_404;小波-边缘-放大基数 +HISTORY_MSG_405;小波-去噪-第4级 +HISTORY_MSG_406;小波-边缘-边缘像素 +HISTORY_MSG_440;CbDL-方法 +HISTORY_MSG_445;Raw子图像 +HISTORY_MSG_449;像素偏移-ISO适应 +HISTORY_MSG_452;像素偏移-显示动体 +HISTORY_MSG_453;像素偏移-仅显示动体蒙版 +HISTORY_MSG_457;像素偏移-检测红/蓝 +HISTORY_MSG_462;像素偏移-检测绿 +HISTORY_MSG_464;像素偏移-动体蒙版模糊 +HISTORY_MSG_465;像素偏移-模糊半径 +HISTORY_MSG_468;像素偏移-填洞 +HISTORY_MSG_469;像素偏移-中值 +HISTORY_MSG_471;像素偏移-动体补正 +HISTORY_MSG_472;像素偏移-顺滑过渡 +HISTORY_MSG_474;像素偏移-亮度均等 +HISTORY_MSG_475;像素偏移-均等各通道 +HISTORY_MSG_476;CAM02/16-输出色温 +HISTORY_MSG_477;CAM02/16-输出绿色 +HISTORY_MSG_478;CAM02/16-输出平均亮度 +HISTORY_MSG_479;CAM02/16-输出CAT02/16色适应 +HISTORY_MSG_480;CAM02/16-输出自动CAT02/16 +HISTORY_MSG_481;CAM02/16-场景色温 +HISTORY_MSG_482;CAM02/16-场景绿色 +HISTORY_MSG_483;CAM02/16-场景平均亮度 +HISTORY_MSG_484;CAM02/16-场景自动亮度 +HISTORY_MSG_485;镜头矫正 +HISTORY_MSG_486;镜头矫正-相机 +HISTORY_MSG_487;镜头矫正-镜头 +HISTORY_MSG_488;动态范围压缩(DRC) +HISTORY_MSG_489;DRC-细节 +HISTORY_MSG_490;DRC-数量 +HISTORY_MSG_491;白平衡 +HISTORY_MSG_492;RGB曲线 +HISTORY_MSG_493;L*a*b*调整 +HISTORY_MSG_494;捕图加锐 +HISTORY_MSG_496;删除局部调整点 +HISTORY_MSG_497;选中局部调整点 +HISTORY_MSG_498;局部调整点名称 +HISTORY_MSG_499;局部调整点可见性 +HISTORY_MSG_500;局部调整点形状 +HISTORY_MSG_501;局部调整点模式 +HISTORY_MSG_502;局部调整点形状模式 +HISTORY_MSG_512;局部调整点ΔE -衰减 +HISTORY_MSG_515;局部调整 +HISTORY_MSG_516;局部-色彩与亮度 +HISTORY_MSG_518;局部-亮度 +HISTORY_MSG_519;局部-反差 +HISTORY_MSG_520;局部-色度 +HISTORY_MSG_521;局部-范围 +HISTORY_MSG_522;局部-曲线模式 +HISTORY_MSG_523;局部-LL曲线 +HISTORY_MSG_524;局部-CC曲线 +HISTORY_MSG_525;局部-LH曲线 +HISTORY_MSG_526;局部-H曲线 +HISTORY_MSG_528;局部-曝光 +HISTORY_MSG_529;局部-曝光补偿 +HISTORY_MSG_530;局部-曝补 高光补偿 +HISTORY_MSG_531;局部-曝补 高光补偿阈值 +HISTORY_MSG_533;局部-曝补 阴影补偿 +HISTORY_MSG_534;局部-冷暖 +HISTORY_MSG_535;局部-曝补 范围 +HISTORY_MSG_536;局部-曝光对比度曲线 +HISTORY_MSG_537;局部-鲜明度 +HISTORY_MSG_538;局部-鲜明 饱和色 +HISTORY_MSG_539;局部-鲜明 欠饱和色 +HISTORY_MSG_540;局部-鲜明 阈值 +HISTORY_MSG_541;局部-鲜明 肤色保护 +HISTORY_MSG_542;局部-鲜明 避免偏色 +HISTORY_MSG_543;局部-鲜明 挂钩 +HISTORY_MSG_544;局部-鲜明 范围 +HISTORY_MSG_545;局部-鲜明 H曲线 +HISTORY_MSG_546;局部-模糊与噪点 +HISTORY_MSG_547;局部-半径 +HISTORY_MSG_548;局部-噪点 +HISTORY_MSG_550;局部-模糊方法 +HISTORY_MSG_552;局部-色调映射 +HISTORY_MSG_553;局部-色映 压缩力度 +HISTORY_MSG_554;局部-色映 伽马 +HISTORY_MSG_555;局部-色映 边缘力度 +HISTORY_MSG_557;局部-色映 再加权 +HISTORY_MSG_568;局部-锐化 +HISTORY_MSG_569;局部-锐化 半径 +HISTORY_MSG_570;局部-锐化 数量 +HISTORY_MSG_571;局部-锐化 抑制 +HISTORY_MSG_572;局部-锐化 迭代 +HISTORY_MSG_573;局部-锐化 范围 +HISTORY_MSG_574;局部-锐化 反转 +HISTORY_MSG_575;局部-分频反差 +HISTORY_MSG_580;局部-去噪 +HISTORY_MSG_593;局部-局部反差 +HISTORY_MSG_594;局部-局部反差半径 +HISTORY_MSG_595;局部-局部反差数量 +HISTORY_MSG_596;局部-局部反差暗部 +HISTORY_MSG_597;局部-局部反差亮部 +HISTORY_MSG_606;选中局部调整点 +HISTORY_MSG_624;局部-色彩矫正网格 +HISTORY_MSG_625;局部-色彩矫正力度 +HISTORY_MSG_626;局部-色彩矫正方法 +HISTORY_MSG_627;局部-阴影高光 +HISTORY_MSG_628;局部-阴影高光 高光 +HISTORY_MSG_629;局部-阴影高光 高光范围 +HISTORY_MSG_630;局部-阴影高光 阴影 +HISTORY_MSG_631;局部-阴影高光 阴影范围 +HISTORY_MSG_632;局部-阴影高光 半径 +HISTORY_MSG_633;局部-阴影高光 范围 +HISTORY_MSG_645;局部-ΔE ab-L平衡 +HISTORY_MSG_674;局部-工具移除 +HISTORY_MSG_688;局部-工具移除 +HISTORY_MSG_767;局部-颗粒ISO +HISTORY_MSG_768;局部-颗粒力度 +HISTORY_MSG_786;局部-阴影高光 方法 +HISTORY_MSG_793;局部-阴影高光 TRC伽马 +HISTORY_MSG_798;局部-不透明度 +HISTORY_MSG_839;局部-软件复杂度 +HISTORY_MSG_845;局部-Log编码 +HISTORY_MSG_854;局部-Log编码 范围 +HISTORY_MSG_927;局部-阴影 +HISTORY_MSG_954;局部-显示/隐藏工具 +HISTORY_MSG_958;局部-显示/隐藏设置 +HISTORY_MSG_960;局部-Log编码 cat16 +HISTORY_MSG_961;局部-Log编码 Ciecam +HISTORY_MSG_1057;局部-启用CIECAM +HISTORY_MSG_1058;局部-CIECAM 总体力度 +HISTORY_MSG_1063;局部-CIECAM 饱和度 +HISTORY_MSG_1064;局部-CIECAM 彩度 +HISTORY_MSG_1065;局部-CIECAM 明度 J +HISTORY_MSG_1066;局部-CIECAM 视明度 +HISTORY_MSG_1067;局部-CIECAM 对比度J +HISTORY_MSG_1068;局部-CIECAM 阈值 +HISTORY_MSG_1069;局部-CIECAM 对比度Q +HISTORY_MSG_1070;局部-CIECAM 视彩度 +HISTORY_MSG_1071;局部-CIECAM 绝对亮度 +HISTORY_MSG_1072;局部-CIECAM 平均亮度 +HISTORY_MSG_1073;局部-CIECAM Cat16 +HISTORY_MSG_1074;局部-CIECAM 局部反差 +HISTORY_MSG_1076;局部-CIECAM 范围 +HISTORY_MSG_1077;局部-CIECAM 模式 +HISTORY_MSG_1078;局部-红色与肤色保护 +HISTORY_MSG_1085;Local - Jz 明度 +HISTORY_MSG_1093;局部-色貌模型 +HISTORY_MSG_1103;局部-鲜明 伽马 +HISTORY_MSG_1105;局部-CIECAM 色调模式 +HISTORY_MSG_1106;局部-CIECAM 色调曲线 +HISTORY_MSG_1107;局部-CIECAM 色彩模式 +HISTORY_MSG_1108;局部-CIECAM 色彩曲线 +HISTORY_MSG_BLUWAV;衰减响应 +HISTORY_MSG_CATCAT;Cat02/16模式 +HISTORY_MSG_CATCOMPLEX;Ciecam复杂度 +HISTORY_MSG_CATMODEL;CAM模型 +HISTORY_MSG_CLAMPOOG;超色域色彩溢出 +HISTORY_MSG_COLORTONING_LABGRID_VALUE;色调分离-色彩矫正 +HISTORY_MSG_COLORTONING_LABREGION_AB;色调分离-色彩矫正 +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;色调分离-通道 +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;色调分离-C蒙版 +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;色调分离-H蒙版 +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;色调分离-光强度 +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;色调分离-L蒙版 +HISTORY_MSG_COLORTONING_LABREGION_LIST;色调分离-列表项 +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;色调分离-区域蒙版模糊 +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;色调分离-区域偏移量 +HISTORY_MSG_COLORTONING_LABREGION_POWER;色调分离-区域能量 +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;色调分离-饱和度 +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;色调分离-显示蒙版 +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;色调分离-区域斜率 +HISTORY_MSG_COMPLEX;小波复杂度 +HISTORY_MSG_DEHAZE_DEPTH;去雾-纵深 +HISTORY_MSG_DEHAZE_ENABLED;去雾 +HISTORY_MSG_DEHAZE_SATURATION;去雾-饱和度 +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;去雾-显示纵深蒙版 +HISTORY_MSG_DEHAZE_STRENGTH;去雾-力度 +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;双重去马赛克-自动阈值 +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;双重去马赛克-反差阈值 +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;胶片负片色彩空间 +HISTORY_MSG_FILMNEGATIVE_ENABLED;胶片负片 +HISTORY_MSG_FILMNEGATIVE_VALUES;胶片负片值 +HISTORY_MSG_HISTMATCHING;自适应色调曲线 +HISTORY_MSG_ICM_FBW;黑白 +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_PDSHARPEN_AUTO_CONTRAST;捕图加锐-自动阈值 +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;捕图加锐-自动半径 +HISTORY_MSG_PDSHARPEN_CHECKITER;捕图加锐-自动限制迭代 +HISTORY_MSG_PDSHARPEN_CONTRAST;捕图加锐-反差阈值 +HISTORY_MSG_PDSHARPEN_ITERATIONS;捕图加锐-迭代 +HISTORY_MSG_PDSHARPEN_RADIUS;捕图加锐-半径 +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;捕图加锐-边缘半径值提升 +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;像素偏移-动体部分去马赛克算法 +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_RESIZE_LONGEDGE;调整大小-长边 +HISTORY_MSG_RESIZE_SHORTEDGE;调整大小-短边 +HISTORY_MSG_SHARPENING_BLUR;锐化-模糊半径 +HISTORY_MSG_SHARPENING_CONTRAST;锐化-反差阈值 +HISTORY_MSG_SH_COLORSPACE;阴影/高光-色彩空间 +HISTORY_MSG_SOFTLIGHT_ENABLED;柔光 +HISTORY_MSG_SOFTLIGHT_STRENGTH;柔光-力度 +HISTORY_MSG_SPOT;污点移除 +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC-锚点 +HISTORY_MSG_TRANS_Method;几何-方法 +HISTORY_MSG_WAVLEVELSIGM;去噪-半径 +HISTORY_MSG_WAVLEVSIGM;半径 +HISTORY_MSG_WAVOFFSET;偏移 +HISTORY_MSG_WAVQUAMET;去噪模式 +HISTORY_MSG_WAVSIGMA;衰减响应 HISTORY_NEWSNAPSHOT;新建快照 HISTORY_NEWSNAPSHOT_TOOLTIP;快捷键:Alt-s HISTORY_SNAPSHOT;快照 -HISTORY_SNAPSHOTS;系列快照 +HISTORY_SNAPSHOTS;快照 +ICCPROFCREATOR_COPYRIGHT;版权: +ICCPROFCREATOR_CUSTOM;自定义 +ICCPROFCREATOR_DESCRIPTION;描述: +ICCPROFCREATOR_GAMMA;伽马 +ICCPROFCREATOR_ILL_DEF;默认 +ICCPROFCREATOR_SAVEDIALOG_TITLE;将ICC档案保存为... +ICCPROFCREATOR_TRC_PRESET;色调响应曲线 +INSPECTOR_WINDOW_TITLE;检视器 IPTCPANEL_CATEGORY;类别 IPTCPANEL_CITY;城市 IPTCPANEL_COPYHINT;将IPTC设置复制到剪贴板 @@ -334,61 +859,82 @@ IPTCPANEL_RESET;重置 IPTCPANEL_RESETHINT;重置为默认配置 IPTCPANEL_SOURCE;来源 IPTCPANEL_TITLE;标题 -MAIN_BUTTON_FULLSCREEN;全屏幕 +MAIN_BUTTON_FULLSCREEN;全屏 MAIN_BUTTON_PREFERENCES;参数设置 -MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;将当前图片放入处理序列中\n快捷键: Ctrl+b +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;将当前图片放入处理队列中\n快捷键:Ctrl+b MAIN_BUTTON_SAVE;保存图片 -MAIN_BUTTON_SAVE_TOOLTIP;保存当前图像 \n快捷键:Ctrl+S +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_SENDTOEDITOR_TOOLTIP;使用外部工具编辑当前图像\n快捷键:Ctrl+E +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;显示/隐藏全部侧边栏\n快捷键:m MAIN_BUTTON_UNFULLSCREEN;退出全屏 MAIN_FRAME_EDITOR;编辑器 -MAIN_FRAME_EDITOR_TOOLTIP;编辑器.\n快捷键: Ctrl-F4 -MAIN_FRAME_FILEBROWSER;文件浏览 -MAIN_FRAME_FILEBROWSER_TOOLTIP;文件浏览\n快捷键: Ctrl-F2 +MAIN_FRAME_EDITOR_TOOLTIP;编辑器\n快捷键:Ctrl-F4 +MAIN_FRAME_FILEBROWSER;文件浏览器 +MAIN_FRAME_FILEBROWSER_TOOLTIP;文件浏览器\n快捷键:Ctrl-F2 MAIN_FRAME_PLACES;位置 MAIN_FRAME_PLACES_ADD;添加 +MAIN_FRAME_PLACES_DEL;移除 MAIN_FRAME_QUEUE;批处理队列 -MAIN_FRAME_QUEUE_TOOLTIP;处理序列\n快捷键: Ctrl-F3 +MAIN_FRAME_QUEUE_TOOLTIP;处理队列\n快捷键:Ctrl-F3 MAIN_FRAME_RECENT;最近使用的文件夹 MAIN_MSG_ALREADYEXISTS;该文件已存在 MAIN_MSG_CANNOTLOAD;无法加载图片 MAIN_MSG_CANNOTSAVE;文件保存中出错 MAIN_MSG_CANNOTSTARTEDITOR;无法启动编辑器 -MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;请在“首选项“对话框设置正确的路径 +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;请在“参数设置”中设置正确的路径 MAIN_MSG_EMPTYFILENAME;未指定文件名! -MAIN_MSG_NAVIGATOR;浏览器 +MAIN_MSG_NAVIGATOR;导航窗 MAIN_MSG_OPERATIONCANCELLED;取消 +MAIN_MSG_PATHDOESNTEXIST;路径\n\n%1\n\n不存在。请在参数设置中设定正确的路径 MAIN_MSG_QOVERWRITE;是否覆盖? +MAIN_MSG_SETPATHFIRST;你需要先在参数设置中设定目标路径才能使用本功能! +MAIN_MSG_TOOMANYOPENEDITORS;已打开的编辑器过多\n请关闭一个编辑器以继续 +MAIN_MSG_WRITEFAILED;写入\n"%1"失败\n\n确保文件夹存在且你有写入权限 +MAIN_TAB_ADVANCED;高级 +MAIN_TAB_ADVANCED_TOOLTIP;快捷键:Alt-a MAIN_TAB_COLOR;色彩 MAIN_TAB_COLOR_TOOLTIP;快捷键:Alt-c MAIN_TAB_DETAIL;细节 -MAIN_TAB_DETAIL_TOOLTIP;快捷键: Alt-d -MAIN_TAB_DEVELOP;图片调整 +MAIN_TAB_DETAIL_TOOLTIP;快捷键:Alt-d +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; 检阅 +MAIN_TAB_INSPECT;检视 MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;局部 +MAIN_TAB_LOCALLAB_TOOLTIP;快捷键:Alt-o MAIN_TAB_METADATA;元数据 MAIN_TAB_METADATA_TOOLTIP;快捷键:Alt-m MAIN_TAB_RAW;Raw MAIN_TAB_RAW_TOOLTIP;快捷键:Alt-R MAIN_TAB_TRANSFORM;变换 MAIN_TAB_TRANSFORM_TOOLTIP;快捷键:Alt-t -MAIN_TOOLTIP_HIDEHP;显示/隐藏左面板 (包含历史, 快捷键: H) +MAIN_TOOLTIP_BACKCOLOR0;预览图的背景色:基于主题调整\n快捷键:9 +MAIN_TOOLTIP_BACKCOLOR1;预览图的背景色:黑色\n快捷键:9 +MAIN_TOOLTIP_BACKCOLOR2;预览图的背景色:白色\n快捷键:9 +MAIN_TOOLTIP_BACKCOLOR3;预览图的背景色:中灰色\n快捷键:9 +MAIN_TOOLTIP_HIDEHP;显示/隐藏左面板(包含历史,快捷键:H) MAIN_TOOLTIP_INDCLIPPEDH;高光溢出提示 MAIN_TOOLTIP_INDCLIPPEDS;阴影不足提示 -MAIN_TOOLTIP_PREVIEWR;预览 红色通道.\n快捷键: r -MAIN_TOOLTIP_QINFO;图片快捷信息 -MAIN_TOOLTIP_SHOWHIDELP1;显示/隐藏左面板\n快捷键: l -MAIN_TOOLTIP_SHOWHIDERP1;显示/隐藏右面板\n快捷键: Alt-l -MAIN_TOOLTIP_SHOWHIDETP1;显示/隐藏上面板\n快捷键: Shift-L +MAIN_TOOLTIP_PREVIEWB;预览蓝色通道\n快捷键:b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;预览合焦蒙版\n快捷键:Shift-f\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_PREVIEWSHARPMASK;预览锐化反差蒙版\n快捷键:p +MAIN_TOOLTIP_QINFO;图片简略信息 +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 +MAIN_TOOLTIP_TOGGLE;切换处理前/处理后视图\n快捷键:Shift-b +MONITOR_PROFILE_SYSTEM;系统默认 NAVIGATOR_B;B: NAVIGATOR_G;G: NAVIGATOR_H;H: @@ -401,262 +947,356 @@ NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;宽 = %1, 高 = %2 NAVIGATOR_XY_NA;x = n/a, y = n/a +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;色彩矫正 PARTIALPASTE_CHANNELMIXER;通道混合器 PARTIALPASTE_CHANNELMIXERBW;黑白 -PARTIALPASTE_COARSETRANS;90度旋转/翻转 -PARTIALPASTE_COLORAPP;CIECAM02 +PARTIALPASTE_COARSETRANS;90°旋转/翻转 +PARTIALPASTE_COLORAPP;CIECAM02/16 PARTIALPASTE_COLORGROUP;色彩相关设定 PARTIALPASTE_COLORTONING;色调 PARTIALPASTE_COMMONTRANSFORMPARAMS;自动填充 PARTIALPASTE_COMPOSITIONGROUP;构图设置 -PARTIALPASTE_CROP;剪裁 +PARTIALPASTE_CROP;裁剪 PARTIALPASTE_DARKFRAMEAUTOSELECT;暗场自动选择 PARTIALPASTE_DARKFRAMEFILE;暗场文件 -PARTIALPASTE_DEFRINGE;去边 +PARTIALPASTE_DEFRINGE;去除色边 +PARTIALPASTE_DEHAZE;去雾 PARTIALPASTE_DETAILGROUP;细节设置 PARTIALPASTE_DIALOGLABEL;选择性粘贴配置 PARTIALPASTE_DIRPYRDENOISE;降噪 PARTIALPASTE_DIRPYREQUALIZER;分频反差调整 PARTIALPASTE_DISTORTION;畸变矫正 PARTIALPASTE_EPD;色调映射 -PARTIALPASTE_EQUALIZER;小波变换等级 +PARTIALPASTE_EQUALIZER;小波层级 PARTIALPASTE_EVERYTHING;全部 -PARTIALPASTE_EXIFCHANGES;对exif所做的修改 +PARTIALPASTE_EXIFCHANGES;Exif PARTIALPASTE_EXPOSURE;曝光 +PARTIALPASTE_FILMNEGATIVE;胶片负片 PARTIALPASTE_FILMSIMULATION;胶片模拟 PARTIALPASTE_FLATFIELDAUTOSELECT;平场自动选择 PARTIALPASTE_FLATFIELDBLURRADIUS;平场模糊半径 PARTIALPASTE_FLATFIELDBLURTYPE;平场模糊类型 PARTIALPASTE_FLATFIELDCLIPCONTROL;平场剪切控制 PARTIALPASTE_FLATFIELDFILE;平场文件夹 -PARTIALPASTE_GRADIENT;渐变过滤 -PARTIALPASTE_HSVEQUALIZER;HSV均衡 -PARTIALPASTE_ICMSETTINGS;ICM 设置 +PARTIALPASTE_GRADIENT;渐变滤镜 +PARTIALPASTE_HSVEQUALIZER;HSV均衡器 +PARTIALPASTE_ICMSETTINGS;ICM设置 PARTIALPASTE_IMPULSEDENOISE;脉冲噪声降低 PARTIALPASTE_IPTCINFO;IPTC 信息 PARTIALPASTE_LABCURVE;Lab调整 PARTIALPASTE_LENSGROUP;镜头相关设置 PARTIALPASTE_LENSPROFILE;镜片修正档案 +PARTIALPASTE_LOCALCONTRAST;局部反差 +PARTIALPASTE_LOCALLAB;局部调整 +PARTIALPASTE_LOCALLABGROUP;局部调整设置 +PARTIALPASTE_METADATA;元数据模式 PARTIALPASTE_METAGROUP;元数据 PARTIALPASTE_PCVIGNETTE;暗角滤镜 PARTIALPASTE_PERSPECTIVE;视角 PARTIALPASTE_PREPROCESS_DEADPIXFILT;坏点过滤器 PARTIALPASTE_PREPROCESS_GREENEQUIL;绿平衡 PARTIALPASTE_PREPROCESS_HOTPIXFILT;热噪过滤器 -PARTIALPASTE_PREPROCESS_LINEDENOISE;线条噪点过滤 +PARTIALPASTE_PREPROCESS_LINEDENOISE;线状噪点过滤 +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF条纹过滤器 +PARTIALPASTE_PREPROCWB;预处理白平衡 PARTIALPASTE_PRSHARPENING;调整大小后锐化 -PARTIALPASTE_RAWCACORR_AUTO;CA自动更正 -PARTIALPASTE_RAWCACORR_CAREDBLUE;红蓝色散 +PARTIALPASTE_RAWCACORR_AUTO;色差自动矫正 +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA避免偏色 +PARTIALPASTE_RAWCACORR_CAREDBLUE;红蓝色差 PARTIALPASTE_RAWEXPOS_BLACK;黑色等级 PARTIALPASTE_RAWEXPOS_LINEAR;白点纠正 PARTIALPASTE_RAWGROUP;Raw设置 -PARTIALPASTE_RAW_DCBENHANCE;DCB 增强 -PARTIALPASTE_RAW_DCBITERATIONS;DCB 反复 -PARTIALPASTE_RAW_DMETHOD;解马赛克方法 +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;Retinex增强算法 +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE优化步长 +PARTIALPASTE_RAW_PIXELSHIFT;像素偏移 +PARTIALPASTE_RESIZE;调整大小 PARTIALPASTE_RGBCURVES;RGB曲线 PARTIALPASTE_ROTATION;旋转 PARTIALPASTE_SHADOWSHIGHLIGHTS;阴影/高光 -PARTIALPASTE_SHARPENEDGE;边缘 +PARTIALPASTE_SHARPENEDGE;边缘锐化 PARTIALPASTE_SHARPENING;锐化 -PARTIALPASTE_SHARPENMICRO;微处对比 -PARTIALPASTE_VIBRANCE;鲜艳度 -PARTIALPASTE_VIGNETTING;暗角修正 +PARTIALPASTE_SHARPENMICRO;微反差 +PARTIALPASTE_SOFTLIGHT;柔光 +PARTIALPASTE_SPOT;污点移除 +PARTIALPASTE_TM_FATTAL;动态范围压缩 +PARTIALPASTE_VIGNETTING;暗角矫正 PARTIALPASTE_WHITEBALANCE;白平衡 -PREFERENCES_ADD;添加 -PREFERENCES_APPEARANCE_NAVGUIDECOLOR;导航器引导颜色 +PARTIALPASTE_鲜明度;鲜艳度 +PREFERENCES_ADD;相加 +PREFERENCES_APPEARANCE;外观 +PREFERENCES_APPEARANCE_COLORPICKERFONT;拾色器字体 +PREFERENCES_APPEARANCE_CROPMASKCOLOR;裁剪蒙版颜色 +PREFERENCES_APPEARANCE_MAINFONT;主字体 +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;导航窗图框颜色 +PREFERENCES_APPEARANCE_PSEUDOHIDPI;伪-高DPI模式 +PREFERENCES_APPEARANCE_THEME;主题 PREFERENCES_APPLNEXTSTARTUP;下次启动生效 PREFERENCES_AUTOMONPROFILE;使用操作系统主显示器的色彩档案 +PREFERENCES_AUTOSAVE_TP_OPEN;在退出时保存工具的展开/折叠状态 PREFERENCES_BATCH_PROCESSING;批处理 -PREFERENCES_BEHADDALL;全 '添加' +PREFERENCES_BEHADDALL;全“相加” +PREFERENCES_BEHADDALLHINT;将所有选项设为相加模式。\n批量调整栏的处理参数将在图片当前参数的基础上加减 PREFERENCES_BEHAVIOR;行为 -PREFERENCES_BEHSETALL;全 '设定' +PREFERENCES_BEHSETALL;全“设定” +PREFERENCES_BEHSETALLHINT;将所有选项设为设定模式。\n批量调整栏的处理参数将是绝对值,数值会被显示 +PREFERENCES_CACHECLEAR;清空 +PREFERENCES_CACHECLEAR_ALL;清空所有缓存文件: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;清除所有缓存文件,已缓存的后期档案除外: +PREFERENCES_CACHECLEAR_ONLYPROFILES;仅清除已缓存的后期档案: +PREFERENCES_CACHECLEAR_SAFETY;仅缓存中的文件会被清除,与原图片保存在一起的后期档案不会受到影响。 PREFERENCES_CACHEMAXENTRIES;最大缓存数量 PREFERENCES_CACHEOPTS;缓存选项 PREFERENCES_CACHETHUMBHEIGHT;最大缩略图高度 +PREFERENCES_CHUNKSIZES;每个线程的切片数 +PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE去马赛克 +PREFERENCES_CHUNKSIZE_RAW_CA;Raw色差矫正 +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD去马赛克 +PREFERENCES_CHUNKSIZE_RGB;RGB处理 +PREFERENCES_CIEARTIF;避免杂点 PREFERENCES_CLIPPINGIND;高光溢出提示 -PREFERENCES_CLUTSCACHE;HaldCLUT 缓存 -PREFERENCES_CLUTSCACHE_LABEL;CLUTs 最大缓存数 -PREFERENCES_CLUTSDIR;HaldCLUT 路径 +PREFERENCES_CLUTSCACHE;HaldCLUT缓存 +PREFERENCES_CLUTSCACHE_LABEL;CLUT最大缓存数 +PREFERENCES_CLUTSDIR;HaldCLUT路径 PREFERENCES_CMMBPC;黑场补偿 +PREFERENCES_COMPLEXITYLOC;局部调整工具默认复杂程度 +PREFERENCES_COMPLEXITY_EXP;高级 +PREFERENCES_COMPLEXITY_NORM;标准 +PREFERENCES_COMPLEXITY_SIMP;基础 +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;下 PREFERENCES_CURVEBBOXPOS_LEFT;左 PREFERENCES_CURVEBBOXPOS_RIGHT;右 -PREFERENCES_CUSTPROFBUILD;Custom Processing Profile Builder -PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format -PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name -PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;可执行文件路径 PREFERENCES_DARKFRAMEFOUND;找到 PREFERENCES_DARKFRAMESHOTS;张 PREFERENCES_DARKFRAMETEMPLATES;模板 PREFERENCES_DATEFORMAT;日期格式 -PREFERENCES_DATEFORMATHINT;可以使用下列控制符:\n%y : 年\n%m : 月h\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;其他 PREFERENCES_DIRSELECTDLG;启动时选择图片路径... PREFERENCES_DIRSOFTWARE;软件安装路径 +PREFERENCES_EDITORCMDLINE;自定义命令行 PREFERENCES_EDITORLAYOUT;编辑器布局 +PREFERENCES_EXTEDITOR_DIR;输出目录 +PREFERENCES_EXTEDITOR_DIR_CURRENT;与输入图片相同 +PREFERENCES_EXTEDITOR_DIR_CUSTOM;自定义 +PREFERENCES_EXTEDITOR_DIR_TEMP;操作系统临时文件夹 PREFERENCES_EXTERNALEDITOR;外部编辑器 -PREFERENCES_FBROWSEROPTS;文件浏览选项 +PREFERENCES_FBROWSEROPTS;文件浏览器选项 +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;在文件浏览器中显示紧凑的工具栏 PREFERENCES_FLATFIELDFOUND;找到 PREFERENCES_FLATFIELDSDIR;平场图像路径 PREFERENCES_FLATFIELDSHOTS;张 PREFERENCES_FLATFIELDTEMPLATES;模板 PREFERENCES_FORIMAGE;用于图片文件 PREFERENCES_FORRAW;用于Raw文件 -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_FSTRIP_SAME_THUMB_HEIGHT;令文件浏览器和编辑器的缩略图高度相同 +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;若文件浏览器和编辑器的缩略图大小不同,那么在二者间切换时,生成缩略图的用时就会变长 PREFERENCES_GIMPPATH;GIMP安装文件夹 -PREFERENCES_HISTOGRAMPOSITIONLEFT;直方图放置在左面板 -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_HISTOGRAMPOSITIONLEFT;将直方图放置在左面板 +PREFERENCES_HISTOGRAM_TOOLTIP;启用后,当前使用的后期配置档案将被用于渲染主直方图和导航栏,不启用则将使用伽马矫正的输出档案进行渲染 PREFERENCES_HLTHRESHOLD;高光溢出阈值 PREFERENCES_ICCDIR;ICC配置路径 PREFERENCES_IMPROCPARAMS;默认图片处理参数 -PREFERENCES_INSPECT_LABEL;检阅 +PREFERENCES_INSPECTORWINDOW;以单独窗口或全屏打开检视器 +PREFERENCES_INSPECT_LABEL;检视 PREFERENCES_INSPECT_MAXBUFFERS_LABEL;最大缓存图片数 -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_INTENT_ABSOLUTE;绝对比色 PREFERENCES_INTENT_PERCEPTUAL;可感知 PREFERENCES_INTENT_RELATIVE;相对比色 PREFERENCES_INTENT_SATURATION;饱和度 -PREFERENCES_INTERNALTHUMBIFUNTOUCHED;如果RAW文件没有修改, 显示内嵌JPEG缩略图 +PREFERENCES_INTERNALTHUMBIFUNTOUCHED;如果RAW文件没有被修改,显示内嵌JPEG的缩略图 PREFERENCES_LANG;语言 PREFERENCES_LANGAUTODETECT;使用系统语言 PREFERENCES_MAXRECENTFOLDERS;最近访问路径历史记录数 -PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" -PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" -PREFERENCES_MENUGROUPLABEL;Group "Color label" -PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" -PREFERENCES_MENUGROUPRANK;组 "评价" -PREFERENCES_MENUOPTIONS;子菜单选项 +PREFERENCES_MENUGROUPEXTPROGS;合并“打开方式” +PREFERENCES_MENUGROUPFILEOPERATIONS;合并“文件操作” +PREFERENCES_MENUGROUPLABEL;合并“色彩标签” +PREFERENCES_MENUGROUPPROFILEOPERATIONS;合并“后期档案操作” +PREFERENCES_MENUGROUPRANK;合并“评级” +PREFERENCES_MENUOPTIONS;右键子菜单选项 PREFERENCES_MONINTENT;默认渲染意图 PREFERENCES_MONITOR;显示器 PREFERENCES_MONPROFILE;默认色彩配置文件 PREFERENCES_MONPROFILE_WARNOSX;受MacOS限制, 仅支持sRGB PREFERENCES_MULTITAB;多编辑器标签模式 -PREFERENCES_MULTITABDUALMON;多编辑器标签独立模式 -PREFERENCES_NAVIGATIONFRAME;导航器 -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_MULTITABDUALMON;多编辑器标签,标签独立模式 +PREFERENCES_NAVIGATIONFRAME;导航窗 +PREFERENCES_OVERLAY_FILENAMES;在文件浏览器的缩略图上显示文件名 +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;在编辑器的缩略图上显示文件名 +PREFERENCES_OVERWRITEOUTPUTFILE;覆盖已存在的输出文件 +PREFERENCES_PANFACTORLABEL;拖移速率增幅 PREFERENCES_PARSEDEXT;已知扩展名 PREFERENCES_PARSEDEXTADD;添加扩展名 PREFERENCES_PARSEDEXTADDHINT;输入扩展名并按此按钮将其添加至列表 PREFERENCES_PARSEDEXTDELHINT;从列表中删除选中的扩展名 -PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. -PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. -PREFERENCES_PREVDEMO;预览解马赛克方法 +PREFERENCES_PARSEDEXTDOWNHINT;让选中的扩展名在列表中的位置下降 +PREFERENCES_PARSEDEXTUPHINT;让选中的扩展名在列表中的位置上升 +PREFERENCES_PERFORMANCE_MEASURE;测速 +PREFERENCES_PERFORMANCE_MEASURE_HINT;在控制台记录处理时间 +PREFERENCES_PERFORMANCE_THREADS;线程 +PREFERENCES_PERFORMANCE_THREADS_LABEL;用于降噪和小波层级的最大线程数(0=自动) +PREFERENCES_PREVDEMO;预览去马赛克方法 PREFERENCES_PREVDEMO_FAST;快速 -PREFERENCES_PREVDEMO_LABEL;小于100%缩放查看时使用的解马赛克算法: +PREFERENCES_PREVDEMO_LABEL;小于100%缩放查看时使用的去马赛克算法: PREFERENCES_PREVDEMO_SIDECAR;与PP3相同 PREFERENCES_PRINTER;打印机 (软打样) PREFERENCES_PROFILEHANDLING;图片处理配置管理 PREFERENCES_PROFILELOADPR;配置文件读取优先级 PREFERENCES_PROFILEPRCACHE;缓存中的配置文件 -PREFERENCES_PROFILEPRFILE;与图片并列存放的配置文件 -PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file -PREFERENCES_PROFILESAVECACHE;将配置文件写至缓存 +PREFERENCES_PROFILEPRFILE;图片所在目录的配置文件 +PREFERENCES_PROFILESAVEBOTH;将配置文件存放到缓存和输入图片所在位置 +PREFERENCES_PROFILESAVECACHE;将配置文件存放到缓存 PREFERENCES_PROFILESAVEINPUT;将配置文件与图片并列存放 -PREFERENCES_PROFILESAVELOCATION;处理配置文件存储路径 +PREFERENCES_PROFILESAVELOCATION;将配置文件存放到缓存和输入图片所在目录 PREFERENCES_PROFILE_NONE;无 PREFERENCES_PROPERTY;属性 PREFERENCES_PRTINTENT;渲染意图 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_REMEMBERZOOMPAN;记忆图片的缩放和拖动位置 +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;当打开新图片时,记忆上一张图片的放大百分比和拖移位置。\n\n此选项仅在使用“单编辑器模式”且“小于100%缩放查看时使用的去马赛克方法”被设为“与PP3相同”时才有效 +PREFERENCES_SAVE_TP_OPEN_NOW;保存工具的展开/折叠状态 PREFERENCES_SELECTLANG;选择语言 -PREFERENCES_SERIALIZE_TIFF_READ;TIFF 读取设定 -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;连续载入TIFF文件 -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;开启后可以提高在无压缩TIFF图片文件夹中的缩略图生成速度 -PREFERENCES_SET;设置 +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_SHOWEXPOSURECOMPENSATION;附带曝光补偿 +PREFERENCES_SHOWFILMSTRIPTOOLBAR;显示“数码底片夹”栏 +PREFERENCES_SHOWTOOLTIP;显示局部调整工具提示 PREFERENCES_SHTHRESHOLD;阴影过暗阈值 -PREFERENCES_SINGLETAB;单编辑器栏模式 -PREFERENCES_SINGLETABVERTAB;单编辑器栏模式, 标签栏垂直 -PREFERENCES_SND_HELP;输入完整路径来指定声音文件, 或者留空表示无声 \nWindows系统声音可以使用 "SystemDefault", "SystemAsterisk" 等 Linux则可以使用 "complete", "window-attention" 等 +PREFERENCES_SINGLETAB;单编辑器标签模式 +PREFERENCES_SINGLETABVERTAB;单编辑器标签模式, 标签栏垂直 +PREFERENCES_SND_HELP;输入完整路径来指定声音文件, 或者留空表示无声。\nWindows系统声音可以使用"SystemDefault", "SystemAsterisk" 等\nLinux则可以使用 "complete", "windows-attention"等 PREFERENCES_SND_LNGEDITPROCDONE;编辑器处理完成 -PREFERENCES_SND_QUEUEDONE;队列处理完成 -PREFERENCES_SND_THRESHOLDSECS;几秒之后 +PREFERENCES_SND_QUEUEDONE;完成队列 +PREFERENCES_SND_THRESHOLDSECS;等待秒数 PREFERENCES_STARTUPIMDIR;启动时路径 PREFERENCES_TAB_BROWSER;文件浏览器 PREFERENCES_TAB_COLORMGR;色彩管理 PREFERENCES_TAB_DYNAMICPROFILE;动态预设规则 -PREFERENCES_TAB_GENERAL;一般 +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_VSCROLLBAR;隐藏垂直滚动栏 +PREFERENCES_TP_VSCROLLBAR;隐藏垂直滚动条 PREFERENCES_USEBUNDLEDPROFILES;启用内置预设 -PREFERENCES_WORKFLOW;排版 +PREFERENCES_WORKFLOW;软件界面 +PREFERENCES_ZOOMONSCROLL;滚动鼠标滚轮控制图片缩放 +PROFILEPANEL_COPYPPASTE;要复制的参数 +PROFILEPANEL_GLOBALPROFILES;附带档案 PROFILEPANEL_LABEL;处理参数配置 PROFILEPANEL_LOADDLGLABEL;加载处理参数为... +PROFILEPANEL_LOADPPASTE;要加载的参数 +PROFILEPANEL_MODE_TOOLTIP;后期档案应用模式。\n\n按下按钮:部分性档案将被转化为全面性档案;没有被使用的工具将会用预定的参数得到处理。\n\n松开按钮:档案按照其制作时的形式被应用,只有被调整过的工具参数会被应用。 PROFILEPANEL_MYPROFILES;我的档案 +PROFILEPANEL_PASTEPPASTE;要粘贴的参数 PROFILEPANEL_PCUSTOM;自定义 +PROFILEPANEL_PDYNAMIC;动态 PROFILEPANEL_PFILE;由文件 +PROFILEPANEL_PINTERNAL;中性 PROFILEPANEL_PLASTSAVED;上次保存 PROFILEPANEL_SAVEDLGLABEL;保存处理参数为... +PROFILEPANEL_SAVEPPASTE;要保存的参数 PROFILEPANEL_TOOLTIPCOPY;将当前配置复制到剪贴板 PROFILEPANEL_TOOLTIPLOAD;由文件加载配置 PROFILEPANEL_TOOLTIPPASTE;从剪贴板粘贴配置 PROFILEPANEL_TOOLTIPSAVE;保存当前配置 +PROGRESSBAR_DECODING;解码中... +PROGRESSBAR_GREENEQUIL;绿平衡... +PROGRESSBAR_HLREC;高光还原... +PROGRESSBAR_HOTDEADPIXELFILTER;热像素/坏点过滤... +PROGRESSBAR_LINEDENOISE;线状噪点过滤... PROGRESSBAR_LOADING;图片加载中... -PROGRESSBAR_LOADINGTHUMBS;正在读取缩略图…… +PROGRESSBAR_LOADINGTHUMBS;读取缩略图... PROGRESSBAR_LOADJPEG;JPEG文件加载中... PROGRESSBAR_LOADPNG;PNG文件加载中... PROGRESSBAR_LOADTIFF;TIFF文件加载中... -PROGRESSBAR_NOIMAGES;没找到图片 +PROGRESSBAR_NOIMAGES;未找到图片 PROGRESSBAR_PROCESSING;图片处理中... +PROGRESSBAR_PROCESSING_PROFILESAVED;处理配置档案已保存 +PROGRESSBAR_RAWCACORR;Raw色差矫正... PROGRESSBAR_READY;就绪 PROGRESSBAR_SAVEJPEG;JPEG文件保存中... PROGRESSBAR_SAVEPNG;PNG文件保存中... PROGRESSBAR_SAVETIFF;TIFF文件保存中... +PROGRESSBAR_SNAPSHOT_ADDED;快照已添加 +QINFO_FRAMECOUNT;%2帧 +QINFO_HDR;HDR / %2帧 QINFO_ISO;ISO -QINFO_NOEXIF;Exif数据不可用. +QINFO_NOEXIF;Exif数据不可用 +QINFO_PIXELSHIFT;像素偏移/ %2帧 QUEUE_AUTOSTART;自动开始 +QUEUE_AUTOSTART_TOOLTIP;当新工作被发送到队列后,立刻自动开始处理 QUEUE_DESTFILENAME;路径和文件名 QUEUE_FORMAT_TITLE;文件格式 QUEUE_LOCATION_FOLDER;保存至文件夹 QUEUE_LOCATION_TEMPLATE;使用模板 -QUEUE_LOCATION_TEMPLATE_TOOLTIP;可以使用下列控制符:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\n这些控制符指向RAW文件所在文件夹及子文件夹 \n\n例如 假如 /home/tom/image/02-09-2006/dsc0012.nef已经打开, 控制符的意义如下:\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\n如果想将输出文件保存到输入文件所在位置:\n%p1/%f\n\n如果想将输出文件保存至输入文件夹内的'converted'子文件夹:\n%p1/converted/%f\n\n如果想将输出文件保存至 '/home/tom/converted' 并保留按日期所分的子文件夹:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TEMPLATE_TOOLTIP;根据图片的位置,评级,被置于垃圾桶与否,或是在队列中的位次来决定其被保存的位置。\n\n以这个路径为例:\n/home/tom/photos/2010-10-31/photo1.raw\n下列格式化的字符串意义如下:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\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, ..., %s9会变为照片在队列中的排序位次。"%s"后面所跟的数字规定着文件名的长度,比如使用%s3导出队列中的第一张照片,其将被命名为'001'。\n\n如果你想把图片保存到和原图相同的目录,输入:\n%p1/%f\n\n如果你想把图片保存到原图片所在文件夹的'converted'子文件夹下,输入:\n%p1/converted/%f\n\n如果你想把图片保存到\n'/home/tom/photos/converted/2010-10-31',输入:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TITLE;输出位置 +QUEUE_STARTSTOP_TOOLTIP;开始/停止处理队列中的图像\n\n快捷键:Ctrl+s +SAMPLEFORMAT_0;未知数据格式 +SAMPLEFORMAT_16;16-bit浮点数 +SAMPLEFORMAT_32;24-bit浮点数 +SAMPLEFORMAT_64;32-bit浮点数 SAVEDLG_AUTOSUFFIX;自动加后缀到已经存在的文件 SAVEDLG_FILEFORMAT;文件格式 +SAVEDLG_FILEFORMAT_FLOAT;浮点数 SAVEDLG_FORCEFORMATOPTS;强制保存选项 SAVEDLG_JPEGQUAL;JPEG质量 SAVEDLG_PUTTOQUEUE;放入队列 -SAVEDLG_PUTTOQUEUEHEAD;放在处理序列首位 -SAVEDLG_PUTTOQUEUETAIL;放在处理序列末位 +SAVEDLG_PUTTOQUEUEHEAD;放在处理队列首位 +SAVEDLG_PUTTOQUEUETAIL;放在处理队列末位 SAVEDLG_SAVEIMMEDIATELY;立即保存 SAVEDLG_SAVESPP;随图片保存处理参数 SAVEDLG_SUBSAMP;二次抽样 SAVEDLG_SUBSAMP_1;极限压缩 SAVEDLG_SUBSAMP_2;平衡 SAVEDLG_SUBSAMP_3;质量至优 -SAVEDLG_TIFFUNCOMPRESSED;未压缩的TIFF +SAVEDLG_TIFFUNCOMPRESSED;无压缩TIFF SAVEDLG_WARNFILENAME;文件将被命名 -TOOLBAR_TOOLTIP_CROP;剪裁选择 (快捷键: C) -TOOLBAR_TOOLTIP_HAND;手形工具 (快捷键: N) -TOOLBAR_TOOLTIP_STRAIGHTEN;基准线选择 (快捷键: S) -TOOLBAR_TOOLTIP_WB;白平衡采样 (快捷键: W) +TOOLBAR_TOOLTIP_CROP;裁剪选择\n快捷键:c +TOOLBAR_TOOLTIP_HAND;手形工具\n快捷键:n +TOOLBAR_TOOLTIP_STRAIGHTEN;基准线选择\n快捷键:s +TOOLBAR_TOOLTIP_WB;白平衡采样\n快捷键:w TP_BWMIX_ALGO_LI;线性 TP_BWMIX_ALGO_SP;特定效果 TP_BWMIX_AUTOCH;自动 +TP_BWMIX_CHANNEL;亮度均衡器 +TP_BWMIX_CURVEEDITOR1;‘黑白前’曲线 +TP_BWMIX_CURVEEDITOR2;‘黑白后’曲线 +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;黑白转换之后的色调曲线,在处理流程的最后 +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;黑白转换之前的色调曲线,可能会算入彩色部分 +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;根据色相调整亮度,L=f(H)\n注意极端值,因为其可能导致杂点 TP_BWMIX_FILTER;色彩过滤 TP_BWMIX_FILTER_BLUE;蓝 TP_BWMIX_FILTER_BLUEGREEN;蓝-绿 @@ -666,51 +1306,186 @@ TP_BWMIX_FILTER_NONE;无 TP_BWMIX_FILTER_PURPLE;紫 TP_BWMIX_FILTER_RED;红 TP_BWMIX_FILTER_REDYELLOW;红-黄 +TP_BWMIX_FILTER_TOOLTIP;色彩过滤能模拟使用色彩滤片所拍摄出的照片。色彩滤片会减少某个波段的光的传入,因此影响到其亮度,比如:红色滤片会让蓝天变暗。 TP_BWMIX_FILTER_YELLOW;黄 TP_BWMIX_GAMMA;伽马矫正 TP_BWMIX_GAM_TOOLTIP;矫正红绿蓝三色通道(RGB)伽马 TP_BWMIX_LABEL;黑白 -TP_BWMIX_MET;方式 -TP_BWMIX_MET_DESAT;淡化饱和度 -TP_BWMIX_MET_LUMEQUAL;明亮度平衡工具 +TP_BWMIX_MET;方法 +TP_BWMIX_MET_CHANMIX;通道混合器 +TP_BWMIX_MET_DESAT;去饱和 +TP_BWMIX_MET_LUMEQUAL;亮度均衡器 +TP_BWMIX_MIXC;通道混合器 +TP_BWMIX_NEUTRAL;重置 +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% 总计: %4%% TP_BWMIX_SETTING;预设 -TP_BWMIX_SETTING_TOOLTIP;不同预设 (影片、水平排布等)或手动通道混合工具设置 +TP_BWMIX_SETTING_TOOLTIP;不同预设(胶片、风光等)或手动的通道混合工具设置 TP_BWMIX_SET_HIGHCONTAST;高对比度 -TP_BWMIX_SET_HIGHSENSIT;高灵敏度 +TP_BWMIX_SET_HIGHSENSIT;高感光度 +TP_BWMIX_SET_HYPERPANCHRO;高汛色 TP_BWMIX_SET_INFRARED;红外 -TP_BWMIX_SET_LANDSCAPE;水平排布(风景) -TP_BWMIX_SET_LOWSENSIT;低灵敏度 -TP_BWMIX_SET_LUMINANCE;光亮度 -TP_BWMIX_SET_PANCHRO;全色的 -TP_BWMIX_SET_PORTRAIT;垂直排布(肖像) -TP_BWMIX_TCMODE_FILMLIKE;黑白电影样式 -TP_BWMIX_TCMODE_STANDARD;黑白电影标准 +TP_BWMIX_SET_LANDSCAPE;风光 +TP_BWMIX_SET_LOWSENSIT;低感光度 +TP_BWMIX_SET_LUMINANCE;亮度 +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;黑白 标准 +TP_BWMIX_TCMODE_WEIGHTEDSTD;黑白 加权标准 TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;蓝 -TP_CACORRECTION_LABEL;色散矫正 +TP_CACORRECTION_LABEL;色差矫正 TP_CACORRECTION_RED;红 +TP_CBDL_AFT;在黑白工具之后 +TP_CBDL_BEF;在黑白工具之前 +TP_CBDL_METHOD;处理时机 +TP_CBDL_METHOD_TOOLTIP;选择让分频反差调整工具先于黑白工具生效(使分频反差的工作色彩空间为L*a*b*),或后于黑白工具生效(此时的工作色彩空间为RGB) TP_CHMIXER_BLUE;蓝 TP_CHMIXER_GREEN;绿 TP_CHMIXER_LABEL;通道混合 TP_CHMIXER_RED;红 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_ABSOLUTELUMINANCE;绝对亮度 +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_BADPIXSL;热像素/坏点过滤器 +TP_COLORAPP_BADPIXSL_TOOLTIP;对热像素/坏点(非常亮的色彩)的抑制\n0 = 没有效果\n1 = 中值\n2 = 高斯\n也可以调整图像以避免有极暗的阴影。\n\n这些杂点是CIECAM02的局限性而导致的 +TP_COLORAPP_BRIGHT;视明度 (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;CIECAM的视明度指的是人对于刺激物的感知亮度,与Lab和RGB的亮度不同 +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;当手动设置时,推荐使用大于65的值 +TP_COLORAPP_CATCLASSIC;经典 +TP_COLORAPP_CATMOD;Cat02/16模式 +TP_COLORAPP_CATSYMGEN;自动对称 +TP_COLORAPP_CATSYMSPE;混合 +TP_COLORAPP_CHROMA;彩度 (C) +TP_COLORAPP_CHROMA_M;视彩度 (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM的视彩度是相对灰色而言,人所感知到的色彩量,是一个指示某个刺激物在感官上的色彩强弱的参数。 +TP_COLORAPP_CHROMA_S;饱和度 (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;CIECAM的饱和度对应着某个刺激物的视彩度与其自身视明度之比,与Lab和RGB的饱和度不同 +TP_COLORAPP_CHROMA_TOOLTIP;CIECAM的彩度对应着刺激物的视彩度与相同条件下的白色刺激物的亮度之比,与Lab和RGB的彩度(Chroma)不同 +TP_COLORAPP_CIECAT_DEGREE;CAT02/16色适应 +TP_COLORAPP_CONTRAST;对比度 (J) +TP_COLORAPP_CONTRAST_Q;对比度 (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;CIECAM的对比度 (Q)以视明度为基准,与Lab和RGB的对比度不同 +TP_COLORAPP_CONTRAST_TOOLTIP;与CIECAM的对比度 (J)以明度为基准,Lab和RGB的对比度不同 +TP_COLORAPP_CURVEEDITOR1;色调曲线1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;显示在CIECAM02/16应用前的L*(L*a*b*)通道直方图。\n若勾选“在曲线中显示CIECAM02/16输出直方图”,则显示CIECAM02/16应用后的J直方图。\n\n主直方图面板不会显示J的直方图\n\n最终的输出结果请参考主直方图面板 +TP_COLORAPP_CURVEEDITOR2;色调曲线2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;与第一条J(J)色调曲线的使用方法相同 +TP_COLORAPP_CURVEEDITOR3;色彩曲线 +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;调整彩度,饱和度或视彩度。\n\n显示在CIECAM02/16应用前的色度(L*a*b*)通道直方图。\n若勾选“在曲线中显示CIECAM02/16输出直方图”,则显示CIECAM02/16应用后的C,S或M直方图。\n\n主直方图面板不会显示C,s和M的直方图\n最终的输出结果请参考主直方图面板 +TP_COLORAPP_DATACIE;在曲线中显示CIECAM02/16输出直方图 +TP_COLORAPP_DATACIE_TOOLTIP;启用后,CIECAM02/16直方图中会显示CIECAM02/16应用后的J,以及C,S或M的大概值/范围。\n勾选此选项不会影响主直方图\n\n关闭选项后,CIECAM02/16直方图中会显示CIECAM02/16应用前的L*a*b*值 +TP_COLORAPP_FREE;自由色温+色调+CAT02/16+[输出] +TP_COLORAPP_GAMUT;色域控制(L*a*b*) +TP_COLORAPP_GEN;设置 - 预设 +TP_COLORAPP_HUE;色相(h) +TP_COLORAPP_HUE_TOOLTIP;色相(h)是一个刺激物可以被描述为接近于红,绿,蓝,黄色的一个角度 +TP_COLORAPP_LABEL;CIE色貌模型02/16 TP_COLORAPP_LABEL_CAM02;图像调整 -TP_COLORAPP_LIGHT;光度 (J) -TP_COLORAPP_LIGHT_TOOLTIP; CIECAM02、Lab 、RGB中光度意义各不同 -TP_COLORAPP_SURROUND_AVER;平均 -TP_COLORAPP_SURROUND_DARK;暗 -TP_COLORAPP_SURROUND_DIM;暗淡 -TP_COLORAPP_TCMODE_BRIGHTNESS;亮度 -TP_COLORAPP_TCMODE_LIGHTNESS;光度 -TP_COLORAPP_TCMODE_SATUR;色彩饱和度 +TP_COLORAPP_LABEL_SCENE;场景条件 +TP_COLORAPP_LABEL_VIEWING;观察条件 +TP_COLORAPP_LIGHT;明度 (J) +TP_COLORAPP_LIGHT_TOOLTIP; CIECAM02/16中的“明度”指一个刺激物的清晰度与相似观察条件下的白色物体清晰度之相对值,与Lab和RGB的“明度”意义不同 +TP_COLORAPP_MEANLUMINANCE;平均亮度(Yb%) +TP_COLORAPP_MODEL;白点模型 +TP_COLORAPP_MODELCAT;色貌模型 +TP_COLORAPP_MODELCAT_TOOLTIP;允许你在CIECAM02或CIECAM16之间进行选择\nCIECAM02在某些时候会更加准确\nCIECAM16的杂点应该更少 +TP_COLORAPP_MODEL_TOOLTIP;白平衡[RT]+[输出]:RT的白平衡被应用到场景,CIECAM02/16被设为D50,输出设备的白平衡被设置为观察条件\n\n白平衡[RT+CAT02/16]+[输出]:CAT02/16使用RT的白平衡设置,输出设备的白平衡被设置为观察条件\n\n自由色温+色调+CAT02/16+[输出]:用户指定色温和色调,输出设备的白平衡被设置为观察条件 +TP_COLORAPP_NEUTRAL;重置 +TP_COLORAPP_NEUTRAL_TOOLTIP;将所有复选框、滑条和曲线还原到默认状态 +TP_COLORAPP_RSTPRO;红色与肤色保护 +TP_COLORAPP_RSTPRO_TOOLTIP;滑条和曲线均受红色与肤色保护影响 +TP_COLORAPP_SURROUND;周围环境 +TP_COLORAPP_SURROUNDSRC;周围 - 场景亮度 +TP_COLORAPP_SURROUND_AVER;一般 +TP_COLORAPP_SURROUND_DARK;黑暗 +TP_COLORAPP_SURROUND_DIM;昏暗 +TP_COLORAPP_SURROUND_EXDARK;极暗 +TP_COLORAPP_SURROUND_TOOLTIP;改变色调和色彩以考虑到输出设备的观察条件。\n\n一般:一般的光照环境(标准)。图像不会变化。\n\n昏暗:昏暗环境(如电视)。图像会略微变暗。\n\n黑暗:黑暗环境(如投影仪)。图像会变得更暗。\n\n极暗:非常暗的环境(Cutsheet)。图像会变得很暗 +TP_COLORAPP_SURSOURCE_TOOLTIP;改变色调与色彩以计入场景条件\n\n平均:平均的亮度条件(标准)。图像不被改变\n\n昏暗:较暗的场景。图像会被略微提亮\n\n黑暗:黑暗的环境。图像会被提亮\n\n极暗:非常暗的环境。图片会变得非常亮 +TP_COLORAPP_TCMODE_BRIGHTNESS;视明度 +TP_COLORAPP_TCMODE_CHROMA;彩度 +TP_COLORAPP_TCMODE_COLORF;视彩度 +TP_COLORAPP_TCMODE_LABEL1;曲线模式1 +TP_COLORAPP_TCMODE_LABEL2;曲线模式2 +TP_COLORAPP_TCMODE_LABEL3;曲线彩度模式 +TP_COLORAPP_TCMODE_LIGHTNESS;明度 +TP_COLORAPP_TCMODE_SATUR;饱和度 +TP_COLORAPP_TONECIE;使用CIECAM02/16进行色调映射 +TP_COLORAPP_TONECIE_TOOLTIP;禁用此选项,色调映射会在L*a*b*色彩空间中进行。\n启用此选项,色调映射会使用CIECAM进行。\n你需要启用色调映射工具来令此选项生效 +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;观察环境的绝对亮度(一般为16 cd/m²) +TP_COLORAPP_WBCAM;白平衡[RT+CAT02/16]+[输出] +TP_COLORAPP_WBRT;白平衡[RT]+[输出] +TP_COLORTONING_AUTOSAT;自动 +TP_COLORTONING_BALANCE;平衡 +TP_COLORTONING_CHROMAC;不透明度 +TP_COLORTONING_COLOR;色彩 +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;根据亮度调整色彩的不透明度,oC=f(L) +TP_COLORTONING_HIGHLIGHT;高光 +TP_COLORTONING_HUE;色相 +TP_COLORTONING_LAB;L*a*b*混合 +TP_COLORTONING_LABEL;色调分离 +TP_COLORTONING_LABGRID;L*a*b*色彩矫正网格 +TP_COLORTONING_LABREGIONS;色彩矫正区域 +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_LIGHTNESS;光强度 +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;启用后,当你改变(红,绿,蓝等)颜色时,每个像素的亮度不变 +TP_COLORTONING_METHOD;方法 +TP_COLORTONING_METHOD_TOOLTIP;L*a*b*混合,RGB滑条和RGB曲线使用插值色彩混合。\n阴影/中间调/高光色彩平衡和饱和度2种颜色使用直接颜色。\n\n使用任意一种色调分离方法时都可以启用黑白工具,来为黑白照片进行色调分离 +TP_COLORTONING_MIDTONES;中间调 +TP_COLORTONING_NEUTRAL;重置滑条 +TP_COLORTONING_NEUTRAL_TOOLTIP;重置所有数值(阴影,中间调,高光)为默认 +TP_COLORTONING_OPACITY;不透明度 +TP_COLORTONING_RGBCURVES;RGB-曲线 +TP_COLORTONING_RGBSLIDERS;RGB-滑条 +TP_COLORTONING_SA;饱和度保护 +TP_COLORTONING_SATURATEDOPACITY;力度 +TP_COLORTONING_SATURATIONTHRESHOLD;阈值 +TP_COLORTONING_SHADOWS;阴影 +TP_COLORTONING_SPLITCO;阴影/中间调/高光 +TP_COLORTONING_SPLITCOCO;阴影/中间调/高光色彩平衡 +TP_COLORTONING_SPLITLR;饱和度2种颜色 +TP_COLORTONING_STR;力度 +TP_COLORTONING_STRENGTH;力度 +TP_COLORTONING_TWO2;特殊色度‘2种颜色’ +TP_COLORTONING_TWOALL;特殊色度 +TP_COLORTONING_TWOBY;特殊a*和b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;标准色度:\n线性响应,a* = b*\n\n特殊色度:\n线性响应,a* = b*,但是没有限制——可以尝试将曲线拖到对角线以下的效果\n\n特殊a*和b*:\n无限制的线性响应,a*和b*各有一条曲线。为实现特殊效果而设计\n\n特殊色度‘2种颜色’:\n效果更加可预测 +TP_COLORTONING_TWOSTD;标准色度 TP_CROP_FIXRATIO;比例: TP_CROP_GTDIAGONALS;对角线法则 TP_CROP_GTEPASSPORT;生物辨识护照 -TP_CROP_GTFRAME;框架 -TP_CROP_GTGRID;方格 +TP_CROP_GTFRAME;方框 +TP_CROP_GTGRID;网格 TP_CROP_GTHARMMEANS;调和平均律 TP_CROP_GTNONE;无 TP_CROP_GTRULETHIRDS;三等份法则 @@ -718,172 +1493,741 @@ TP_CROP_GTTRIANGLE1;黄金三角 1 TP_CROP_GTTRIANGLE2;黄金三角 2 TP_CROP_GUIDETYPE;辅助方式: TP_CROP_H;高 -TP_CROP_LABEL;剪裁 +TP_CROP_LABEL;裁剪 +TP_CROP_RESETCROP;重置 +TP_CROP_SELECTCROP;选择区域 TP_CROP_W;宽 TP_CROP_X;x TP_CROP_Y;y TP_DARKFRAME_AUTOSELECT;自动选择 -TP_DARKFRAME_LABEL;黑框架 -TP_DEFRINGE_LABEL;去色彩边缘(紫边) +TP_DARKFRAME_LABEL;暗场 +TP_DEFRINGE_LABEL;去除色边 TP_DEFRINGE_RADIUS;半径 -TP_DIRPYRDENOISE_LUMINANCE_DETAIL;明亮度细节 -TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;光亮度/发光度 +TP_DEFRINGE_THRESHOLD;阈值 +TP_DEHAZE_DEPTH;纵深 +TP_DEHAZE_LABEL;去雾 +TP_DEHAZE_SATURATION;饱和度 +TP_DEHAZE_SHOW_DEPTH_MAP;显示纵深蒙版 +TP_DEHAZE_STRENGTH;力度 +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;多分区自动 +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;全局自动 +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;色度—主控 +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;方法 +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;手动\n作用于整张图片\n用户手动控制降噪设置\n\n全局自动\n作用于整张图片\n使用9片区域来计算全局的色度噪点去除设定\n\n预览处\n作用于整张图片\n使用当前预览可见的区域来计算全局的色度噪点去除设定 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;预览处 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;显示在小波层级之后的,当前预览中的噪点水平。\n\n>300 噪点极多\n100-300 噪点多\n50-100 噪点略多\n<50 噪点极少\n\n一定要注意:该数值在RGB模式与在L*a*b*模式下会有不同。RGB模式下的数值相对更不精准,因为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, 中心: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;色度—红-绿 +TP_DIRPYRDENOISE_LABEL;降噪 +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;亮度控制 +TP_DIRPYRDENOISE_LUMINANCE_CURVE;亮度曲线 +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;细节恢复 +TP_DIRPYRDENOISE_LUMINANCE_FRAME;亮度噪点 +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;亮度 +TP_DIRPYRDENOISE_MAIN_COLORSPACE;色彩空间 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;对于Raw文件,RGB和L*a*b*均可用\n\n非Raw文件只可用L*a*b*空间,不论用户选择了哪个 +TP_DIRPYRDENOISE_MAIN_GAMMA;伽马 +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;伽马会令降噪的力度在不同色调之间发生变化。偏小的值会偏向阴影部分,偏大的值会偏向较亮的色调 +TP_DIRPYRDENOISE_MAIN_MODE;模式 +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;激进 +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;保守 +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;“保守”会保留低频的色度纹路,而“激进”会消除它们 +TP_DIRPYRDENOISE_MEDIAN_METHOD;中值法 +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;仅色度 +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;中值滤波器 +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;仅亮度 +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;当使用“仅亮度”和“L*a*b*”法时,在降噪流水线中,\n中值滤波会在小波被应用后进行。\n当使用“RGB”模式时,它会在降噪流水线的最后被进行 +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;权重L* (小) + a*b* (正常) +TP_DIRPYRDENOISE_MEDIAN_PASSES;中值迭代 +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;使用3x3窗口进行三次中值迭代通常比使用7x7窗口进行一次迭代的效果更好 +TP_DIRPYRDENOISE_MEDIAN_TYPE;中值类型 +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;使用你想要的窗口大小的中值滤波器。窗口大小越大,处理用时越长。\n3×3柔和:处理3x3窗口中的5个像素。\n3x3:处理3x3窗口中的9个像素。\n5x5柔和:处理5x5窗口中的13个像素。\n5x5:处理5x5窗口中的25个像素。\n7x7:处理7x7窗口中的49个像素。\n9x9:处理9x9窗口中的81个像素。\n\n有时使用小窗口进行多次迭代的效果会优于使用大窗口进行一次迭代的效果 +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_ARTIF;减少杂色 -TP_DIRPYREQUALIZER_HUESKIN;皮肤色相 +TP_DIRPYREQUALIZER_ARTIF;减轻杂点 +TP_DIRPYREQUALIZER_HUESKIN;肤色和其他色彩 TP_DIRPYREQUALIZER_LABEL;分频反差调整 -TP_DIRPYREQUALIZER_LUMACOARSEST;最粗 +TP_DIRPYREQUALIZER_LUMACOARSEST;最粗糙 TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;反差 - TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;反差 + -TP_DIRPYREQUALIZER_LUMAFINEST;最细 -TP_DIRPYREQUALIZER_LUMANEUTRAL;自然 -TP_DIRPYREQUALIZER_SKIN;皮肤色彩 针对/保护 +TP_DIRPYREQUALIZER_LUMAFINEST;最精细 +TP_DIRPYREQUALIZER_LUMANEUTRAL;还原 +TP_DIRPYREQUALIZER_SKIN;肤色针对/保护 +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;-100:肤色被针对\n0:所有色彩被同等对待\n+100:肤色受到保护,其他颜色将受到影响 TP_DIRPYREQUALIZER_THRESHOLD;阈值 TP_DISTORTION_AMOUNT;数量 +TP_DISTORTION_AUTO_TOOLTIP;如果Raw文件内有矫正畸变的内嵌JPEG,则会将Raw图像与其对比并自动矫正畸变 TP_DISTORTION_LABEL;畸变 +TP_EPD_EDGESTOPPING;边缘敏感度 +TP_EPD_GAMMA;伽马 TP_EPD_LABEL;色调映射 -TP_EPD_SCALE;拉伸 +TP_EPD_REWEIGHTINGITERATES;再加权迭代 +TP_EPD_SCALE;规模度 TP_EPD_STRENGTH;力度 TP_EXPOSURE_AUTOLEVELS;自动色阶 +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;使用自动色阶来让程序分析图像,调整曝光滑条的数值\n如果有需要的话,启用高光还原 TP_EXPOSURE_BLACKLEVEL;黑点 TP_EXPOSURE_BRIGHTNESS;亮度 -TP_EXPOSURE_CLIP;高光溢出 +TP_EXPOSURE_CLAMPOOG;令超出色域的色彩溢出 +TP_EXPOSURE_CLIP;可溢出% +TP_EXPOSURE_CLIP_TOOLTIP;自动色阶功能可以让占总数的多少比例的像素溢出 TP_EXPOSURE_COMPRHIGHLIGHTS;高光压缩 TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;高光压缩阈值 TP_EXPOSURE_COMPRSHADOWS;阴影压缩 TP_EXPOSURE_CONTRAST;对比度 -TP_EXPOSURE_CURVEEDITOR;影调曲线 +TP_EXPOSURE_CURVEEDITOR;色调曲线 TP_EXPOSURE_CURVEEDITOR1;色调曲线 1 TP_EXPOSURE_CURVEEDITOR2;色调曲线 2 -TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;请从 RawPedia 网站中 Exposure > Tone Curve 文章中了解如何使用双色调曲线 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;请在RawPedia的Exposure > Tone Curve文章中了解如何使用双色调曲线 TP_EXPOSURE_EXPCOMP;曝光补偿 +TP_EXPOSURE_HISTMATCHING;自适应色调曲线 +TP_EXPOSURE_HISTMATCHING_TOOLTIP;自动调整滑条和曲线(不包括曝光补偿)以使图片贴近于内嵌于Raw的JPEG预览图 TP_EXPOSURE_LABEL;曝光 -TP_EXPOSURE_SATURATION;色彩饱和度 +TP_EXPOSURE_SATURATION;饱和度 TP_EXPOSURE_TCMODE_FILMLIKE;仿胶片式 TP_EXPOSURE_TCMODE_LABEL1;曲线模式1 TP_EXPOSURE_TCMODE_LABEL2;曲线模式2 -TP_EXPOSURE_TCMODE_SATANDVALBLENDING;饱和度和混合值 +TP_EXPOSURE_TCMODE_LUMINANCE;亮度 +TP_EXPOSURE_TCMODE_PERCEPTUAL;感知性 +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;饱和度-亮度混合 TP_EXPOSURE_TCMODE_STANDARD;标准 -TP_EXPOSURE_TCMODE_WEIGHTEDSTD;倾向于标准 +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;加权标准 +TP_EXPOS_BLACKPOINT_LABEL;Raw黑点 +TP_EXPOS_WHITEPOINT_LABEL;Raw白点 +TP_FILMNEGATIVE_BLUE;蓝色比例 +TP_FILMNEGATIVE_BLUEBALANCE;冷/暖 +TP_FILMNEGATIVE_COLORSPACE;反转色彩空间: +TP_FILMNEGATIVE_COLORSPACE_INPUT;输入色彩空间 +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;选择用于负片反转的色彩空间:\n输入色彩空间: 在输入档案被应用之前进行反转,与之前版本的RT相同\n工作色彩空间: 在输入档案被应用之后进行反转,使用当前所选的工作档案 +TP_FILMNEGATIVE_COLORSPACE_WORKING;工作色彩空间 +TP_FILMNEGATIVE_GREEN;参照指数(反差) +TP_FILMNEGATIVE_GREENBALANCE;品红/绿 +TP_FILMNEGATIVE_GUESS_TOOLTIP;通过选取原图中的两个中性色(没有色彩)色块来自动确定红与蓝色的比例。两个色块的亮度应当有所差别。 +TP_FILMNEGATIVE_LABEL;胶片负片 +TP_FILMNEGATIVE_OUT_LEVEL;输出亮度 +TP_FILMNEGATIVE_PICK;选择(两个)中灰点 +TP_FILMNEGATIVE_RED;红色比例 +TP_FILMNEGATIVE_REF_LABEL;输入RGB: %1 +TP_FILMNEGATIVE_REF_PICK;选择白平衡点 +TP_FILMNEGATIVE_REF_TOOLTIP;为输出的正片选择一块灰色区域进行白平衡 +TP_FILMSIMULATION_LABEL;胶片模拟 +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee被设置寻找用于胶片模拟工具的Hald CLUT图像,图像所在的文件夹加载时间过长。\n前往参数设置-图片处理-Hald CLUT路径\n以寻找被使用的文件夹是哪个。你应该令该文件夹指向一个只有Hald CLUT图像而没有其他图片的文件夹,而如果你不想用胶片模拟功能,就将它指向一个空文件夹。\n\n阅读RawPedia的Film Simulation词条以获取更多信息。\n\n你现在想取消扫描吗? +TP_FILMSIMULATION_STRENGTH;力度 +TP_FILMSIMULATION_ZEROCLUTSFOUND;在参数设置中设定HaldCLUT目录 TP_FLATFIELD_AUTOSELECT;自动选择 TP_FLATFIELD_BLURRADIUS;模糊半径 TP_FLATFIELD_BLURTYPE;模糊种类 TP_FLATFIELD_BT_AREA;区域 TP_FLATFIELD_BT_HORIZONTAL;水平 -TP_FLATFIELD_BT_VERTHORIZ;垂直 + 水平 +TP_FLATFIELD_BT_VERTHORIZ;垂直+水平 TP_FLATFIELD_BT_VERTICAL;垂直 +TP_FLATFIELD_CLIPCONTROL;溢出控制 +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;溢出控制能够避免由于平场的应用而导致的高光溢出。如果在应用平场之前就有溢出的高光,数值就会为0 TP_FLATFIELD_LABEL;平场 +TP_GENERAL_11SCALE_TOOLTIP;此工具的效果仅在以1:1大小预览时才可见/准确 TP_GRADIENT_CENTER;中心 TP_GRADIENT_CENTER_X;中心 X +TP_GRADIENT_CENTER_X_TOOLTIP;将渐变滤镜向左(负值)或向右(正值)移动 TP_GRADIENT_CENTER_Y;中心 Y +TP_GRADIENT_CENTER_Y_TOOLTIP;将渐变滤镜向上(负值)或向下(正值)移动 TP_GRADIENT_DEGREE;角度 -TP_GRADIENT_DEGREE_TOOLTIP;转动角度数 +TP_GRADIENT_DEGREE_TOOLTIP;转动的角度数 TP_GRADIENT_FEATHER;羽化 -TP_GRADIENT_FEATHER_TOOLTIP;图像对角比例表示渐变宽度 -TP_GRADIENT_LABEL;渐变过滤 -TP_GRADIENT_STRENGTH;延展 +TP_GRADIENT_FEATHER_TOOLTIP;以图像对角线的长度为100,设定渐变的宽度 +TP_GRADIENT_LABEL;渐变滤镜 +TP_GRADIENT_STRENGTH;力度 +TP_GRADIENT_STRENGTH_TOOLTIP;滤镜的强度(档数) TP_HLREC_BLEND;混合 -TP_HLREC_CIELAB;CIELab模式混合 +TP_HLREC_CIELAB;CIELab混合 TP_HLREC_COLOR;色彩延伸 +TP_HLREC_ENA_TOOLTIP;可能会被自动色阶功能启用 TP_HLREC_LABEL;高光还原 TP_HLREC_LUMINANCE;亮度还原 TP_HLREC_METHOD;方法: -TP_HSVEQUALIZER_CHANNEL;频道 +TP_HSVEQUALIZER_CHANNEL;通道 TP_HSVEQUALIZER_HUE;H -TP_HSVEQUALIZER_LABEL;HSV 平衡 +TP_HSVEQUALIZER_LABEL;HSV均衡器 TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V TP_ICM_INPUTCAMERA;相机缺省 +TP_ICM_INPUTCAMERAICC;自适应相机档案 TP_ICM_INPUTCUSTOM;自定义 -TP_ICM_INPUTCUSTOM_TOOLTIP;选择你自己的 DCP/ICC 色彩档案 +TP_ICM_INPUTCUSTOM_TOOLTIP;选择你自己的DCP/ICC色彩档案 TP_ICM_INPUTDLGLABEL;选择输入ICC配置... TP_ICM_INPUTEMBEDDED;如可能, 使用内置 -TP_ICM_INPUTEMBEDDED_TOOLTIP;使用色彩档案嵌入非raw文件 +TP_ICM_INPUTEMBEDDED_TOOLTIP;使用非raw文件内嵌的色彩档案 TP_ICM_INPUTNONE;无档案 +TP_ICM_INPUTNONE_TOOLTIP;不使用任何色彩档案。\n仅在特殊情况下使用此选项 TP_ICM_INPUTPROFILE;输入配置 TP_ICM_LABEL;ICM -TP_ICM_NOICM;No ICM: sRGB配置 +TP_ICM_NOICM;无ICM:sRGB配置 TP_ICM_OUTPUTPROFILE;输出配置 -TP_ICM_TONECURVE;使用 DCP 色调曲线 +TP_ICM_PROFILEINTENT;渲染意图 +TP_ICM_SAVEREFERENCE_APPLYWB;应用白平衡 +TP_ICM_TONECURVE;使用DCP色调曲线 +TP_ICM_TRCFRAME;抽象档案 TP_ICM_WORKINGPROFILE;当前配置 -TP_IMPULSEDENOISE_LABEL;降低脉冲噪声 +TP_ICM_WORKING_ILLU_NONE;默认 +TP_ICM_WORKING_PRIM_NONE;默认 +TP_ICM_WORKING_TRC;色调响应曲线: +TP_ICM_WORKING_TRC_CUSTOM;自定义 +TP_IMPULSEDENOISE_LABEL;脉冲噪声降低 TP_IMPULSEDENOISE_THRESH;阈值 TP_LABCURVE_AVOIDCOLORSHIFT;避免色彩偏移 -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;使色彩适应当前色彩空间范围, 并使用Munsell色矫正 -TP_LABCURVE_BRIGHTNESS;光度 -TP_LABCURVE_CHROMATICITY;色度 CIE +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;使色彩适应当前色彩空间范围,并使用Munsell色矫正 +TP_LABCURVE_BRIGHTNESS;明度 +TP_LABCURVE_CHROMATICITY;色度 +TP_LABCURVE_CHROMA_TOOLTIP;若要应用黑白色调,将色度值降低为-100 TP_LABCURVE_CONTRAST;对比度 -TP_LABCURVE_CURVEEDITOR;明亮度曲线 +TP_LABCURVE_CURVEEDITOR;亮度曲线 +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;根据色度(C)调整色度(C),C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;根据色相(H)调整色度(C),C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;根据亮度(L)调整色度(C),C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;根据色相(H)调整色相(H),H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;根据色度(C)调整亮度(L),L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;根据色相(H)调整亮度(L),L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;根据亮度(L)调整亮度(L),L=f(L) TP_LABCURVE_LABEL;Lab调整 +TP_LABCURVE_LCREDSK;将LC曲线的效果限定于红色和肤色 +TP_LABCURVE_LCREDSK_TOOLTIP;勾选该选项框,LC曲线就只会影响红色和肤色。\n取消勾选,它的效果就会应用到所有色彩上 +TP_LABCURVE_RSTPROTECTION;红色与肤色保护 +TP_LABCURVE_RSTPRO_TOOLTIP;作用在色度滑条和CC曲线的调整上 TP_LENSGEOM_AUTOCROP;自动剪切 TP_LENSGEOM_FILL;自动填充 -TP_LENSGEOM_LABEL;镜头 / 几何 +TP_LENSGEOM_LABEL;镜头/几何 +TP_LENSGEOM_LIN;线性 +TP_LENSGEOM_LOG;对数 +TP_LENSPROFILE_CORRECTION_AUTOMATCH;自动选择 +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP文件 +TP_LENSPROFILE_CORRECTION_MANUAL;手动选择 TP_LENSPROFILE_LABEL;镜头矫正档案 +TP_LENSPROFILE_LENS_WARNING;警告:制作镜头档案时相机所用的裁切系数比本图片拍摄时\n所使用的裁剪系数更大。矫正结果可能出现错误 +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_LOCALLAB_ACTIVSPOT;启用点 +TP_LOCALLAB_AMOUNT;数量 +TP_LOCALLAB_ARTIF;形状检测 +TP_LOCALLAB_AUTOGRAY;自动平均亮度(Yb%) +TP_LOCALLAB_AUTOGRAYCIE;自动 +TP_LOCALLAB_AVOID;避免偏色 +TP_LOCALLAB_BALAN;ab-L平衡(ΔE) +TP_LOCALLAB_BALANH;色度(C)-色相(H)平衡(ΔE) +TP_LOCALLAB_BLCO;仅色度 +TP_LOCALLAB_BLINV;反转 +TP_LOCALLAB_BLLC;亮度&色度 +TP_LOCALLAB_BLLO;仅亮度 +TP_LOCALLAB_BLMED;中值 +TP_LOCALLAB_BLNOI_EXP;模糊 & 噪点 +TP_LOCALLAB_BLUFR;模糊/颗粒 & 去噪 +TP_LOCALLAB_BLUR;高斯模糊-噪点-颗粒 +TP_LOCALLAB_BLURCOL;半径 +TP_LOCALLAB_BLURDE;模糊形状检测 +TP_LOCALLAB_BLURLC;仅亮度 +TP_LOCALLAB_BLUR_TOOLNAME;模糊/颗粒 & 去噪 +TP_LOCALLAB_BUTTON_ADD;添加 +TP_LOCALLAB_BUTTON_DEL;删除 +TP_LOCALLAB_BUTTON_DUPL;复制 +TP_LOCALLAB_BUTTON_REN;重命名 +TP_LOCALLAB_BUTTON_VIS;显示/隐藏 +TP_LOCALLAB_CAM16_FRA;Cam16图像调整 +TP_LOCALLAB_CAMMODE;色貌模型 +TP_LOCALLAB_CATAD;色适应/Cat16 +TP_LOCALLAB_CBDL;分频反差调整 +TP_LOCALLAB_CBDLCLARI_TOOLTIP;增强中间调的局部反差 +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;与小波相同。\n第一级(0)作用在2x2像素细节上\n最高级(5)作用在64x64像素细节上 +TP_LOCALLAB_CBDL_THRES_TOOLTIP;避免加锐噪点 +TP_LOCALLAB_CBDL_TOOLNAME;分频反差调整 +TP_LOCALLAB_CENTER_X;中心X +TP_LOCALLAB_CENTER_Y;中心Y +TP_LOCALLAB_CHROMA;彩度 +TP_LOCALLAB_CHROMACBDL;彩度 +TP_LOCALLAB_CHROMASKCOL;彩度 +TP_LOCALLAB_CHROML;彩度 (C) +TP_LOCALLAB_CHRRT;彩度 +TP_LOCALLAB_CIE;色貌(Cam16 & JzCzHz) +TP_LOCALLAB_CIEC;使用Ciecam环境参数 +TP_LOCALLAB_CIECONTFRA;对比度 +TP_LOCALLAB_CIEMODE;改变工具位置 +TP_LOCALLAB_CIEMODE_COM;默认 +TP_LOCALLAB_CIEMODE_DR;动态范围 +TP_LOCALLAB_CIEMODE_TM;色调映射 +TP_LOCALLAB_CIEMODE_WAV;小波 +TP_LOCALLAB_CIETOOLEXP;曲线 +TP_LOCALLAB_CIE_TOOLNAME;色貌(Cam16 & JzCzHz) +TP_LOCALLAB_CIRCRADIUS;调整点大小 +TP_LOCALLAB_COFR;色彩 & 亮度 +TP_LOCALLAB_COLORDE;ΔE预览颜色-密度 +TP_LOCALLAB_COLORSCOPE;范围(色彩工具) +TP_LOCALLAB_COLORSCOPE_TOOLTIP;总控色彩与亮度,阴影/高光,鲜明度工具的范围滑条\n其他工具中有单独进行范围控制的滑条 +TP_LOCALLAB_COLOR_CIE;色彩曲线 +TP_LOCALLAB_COLOR_TOOLNAME;色彩 & 亮度 +TP_LOCALLAB_COL_NAME;名称 +TP_LOCALLAB_COL_VIS;状态 +TP_LOCALLAB_CONTRAST;对比度 +TP_LOCALLAB_CONTTHR;反差阈值 +TP_LOCALLAB_CONTWFRA;局部反差 +TP_LOCALLAB_CSTHRESHOLD;小波层级 +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;色调曲线 +TP_LOCALLAB_CURVES_CIE;色调曲线 +TP_LOCALLAB_DEHAFRA;去雾 +TP_LOCALLAB_DEHAZ;力度 +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;移除环境雾,提升总体饱和度与细节\n可以移除偏色倾向,但也可能导致图片整体偏蓝,此现象可以用其他工具进行修正 +TP_LOCALLAB_DEHAZ_TOOLTIP;负值会增加雾 +TP_LOCALLAB_DENOI_EXP;去噪 +TP_LOCALLAB_DEPTH;纵深 +TP_LOCALLAB_DETAIL;局部反差 +TP_LOCALLAB_DETAILSH;细节 +TP_LOCALLAB_DIVGR;伽马 +TP_LOCALLAB_DUPLSPOTNAME;复制 +TP_LOCALLAB_EDGFRA;边缘锐度 +TP_LOCALLAB_EDGSHOW;显示所有工具 +TP_LOCALLAB_ELI;椭圆 +TP_LOCALLAB_ENABLE_AFTER_MASK;使用色调映射 +TP_LOCALLAB_EPSBL;细节 +TP_LOCALLAB_EV_NVIS;隐藏 +TP_LOCALLAB_EV_NVIS_ALL;隐藏所有 +TP_LOCALLAB_EV_VIS;显示 +TP_LOCALLAB_EV_VIS_ALL;显示所有 +TP_LOCALLAB_EXCLUF;排除 +TP_LOCALLAB_EXCLUF_TOOLTIP;“排除”模式能够避免重叠的点影响到排除点的区域。调整“范围”能够扩大不受影响的色彩\n你还可以向排除点中添加工具,并像普通点一样使用这些工具 +TP_LOCALLAB_EXCLUTYPE;调整点模式 +TP_LOCALLAB_EXECLU;排除点 +TP_LOCALLAB_EXFULL;整张图片 +TP_LOCALLAB_EXNORM;普通点 +TP_LOCALLAB_EXPCHROMA;色度补偿 +TP_LOCALLAB_EXPCOLOR_TOOLTIP;调整色彩,亮度,反差并且矫正细微的图像缺陷,如红眼/传感器灰尘等 +TP_LOCALLAB_EXPCOMP;曝光补偿ƒ +TP_LOCALLAB_EXPCOMPINV;曝光补偿 +TP_LOCALLAB_EXPCURV;曲线 +TP_LOCALLAB_EXPGRAD;渐变滤镜 +TP_LOCALLAB_EXPOSE;动态范围 & 曝光 +TP_LOCALLAB_EXPTOOL;曝光工具 +TP_LOCALLAB_EXP_TOOLNAME;动态范围 & 曝光 +TP_LOCALLAB_FATAMOUNT;数量 +TP_LOCALLAB_FATANCHOR;锚点 +TP_LOCALLAB_FATDETAIL;细节 +TP_LOCALLAB_FATFRA;动态范围压缩ƒ +TP_LOCALLAB_FATSHFRA;动态范围压缩蒙版 ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;使用傅立叶变换以得到更高的质量(处理用时与内存占用会上升) +TP_LOCALLAB_FFTW;ƒ - 使用快速傅立叶变换 +TP_LOCALLAB_FFTWBLUR;ƒ - 永远使用快速傅立叶变换 +TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +TP_LOCALLAB_GAM;伽马 +TP_LOCALLAB_GAMC;伽马 +TP_LOCALLAB_GAMFRA;色调响应曲线(TRC) +TP_LOCALLAB_GAMM;伽马 +TP_LOCALLAB_GAMMASKCOL;伽马 +TP_LOCALLAB_GAMSH;伽马 +TP_LOCALLAB_GRADANG;渐变角度 +TP_LOCALLAB_GRADANG_TOOLTIP;旋转角度(单位为°):-180 0 +180 +TP_LOCALLAB_GRADFRA;渐变滤镜蒙版 +TP_LOCALLAB_GRADLOGFRA;渐变滤镜亮度 +TP_LOCALLAB_GRADSTR;渐变力度 +TP_LOCALLAB_GRADSTRLUM;亮度渐变力度 +TP_LOCALLAB_GRAINFRA;胶片颗粒 1:1 +TP_LOCALLAB_GRAINFRA2;粗糙度 +TP_LOCALLAB_GRAIN_TOOLTIP;向图片中添加胶片式的颗粒 +TP_LOCALLAB_GRIDONE;色调映射 +TP_LOCALLAB_GRIDTWO;直接调整 +TP_LOCALLAB_GUIDFILTER;渐变滤镜半径 +TP_LOCALLAB_HHMASK_TOOLTIP;精确调整肤色等具体色相 +TP_LOCALLAB_HUECIE;色相 +TP_LOCALLAB_INVBL;反转 +TP_LOCALLAB_INVBL_TOOLTIP;若不希望使用“反转”,也有另外一种反选方式:使用两个调整点\n第一个点:整张图像\n\n第二个点:排除点 +TP_LOCALLAB_INVERS;反转 +TP_LOCALLAB_INVERS_TOOLTIP;使用“反转”选项会导致选择变少\n\n另外一种反选方式:使用两个调整点\n第一个点:整张图像\n\n第二个点:排除点 +TP_LOCALLAB_ISOGR;分布(ISO) +TP_LOCALLAB_JZLIGHT;视明度 +TP_LOCALLAB_JZSAT;饱和度 +TP_LOCALLAB_JZSHFRA;阴影/高光 Jz +TP_LOCALLAB_LABBLURM;Blur Mask +TP_LOCALLAB_LABEL;局部调整 +TP_LOCALLAB_LABGRID;色彩矫正网格 +TP_LOCALLAB_LC_TOOLNAME;局部反差 & 小波 +TP_LOCALLAB_LEVELWAV;小波层级 +TP_LOCALLAB_LIGHTNESS;明度 +TP_LOCALLAB_LIGHTRETI;明度 +TP_LOCALLAB_LIST_NAME;向当前调整点添加工具... +TP_LOCALLAB_LOC_CONTRAST;局部反差 & 小波 +TP_LOCALLAB_LOG;Log编码 +TP_LOCALLAB_LOG1FRA;CAM16图像调整 +TP_LOCALLAB_LOG2FRA;观察条件 +TP_LOCALLAB_LOGAUTO;自动 +TP_LOCALLAB_LOGEXP;所有工具 +TP_LOCALLAB_LOGFRA;场景条件 +TP_LOCALLAB_LOGIMAGE_TOOLTIP;将CIECAM的相关参数一同进行考虑,参数包括:对比度(J),饱和度(s),以及对比度(Q),视明度(Q),明度(J),视彩度(M)(在高级模式下) +TP_LOCALLAB_LOGLIGHTL;明度 (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;与L*a*b*的明度相近。会考虑到感知色彩的变化 +TP_LOCALLAB_LOGLIGHTQ;视明度 (Q) +TP_LOCALLAB_LOGREPART;总体力度 +TP_LOCALLAB_LOG_TOOLNAME;Log编码 +TP_LOCALLAB_LUMADARKEST;最暗 +TP_LOCALLAB_LUMAWHITESEST;最亮 +TP_LOCALLAB_LUMFRA;L*a*b*标准 +TP_LOCALLAB_MASK;曲线 +TP_LOCALLAB_MASK2;对比度曲线 +TP_LOCALLAB_MASKDDECAY;衰减力度 +TP_LOCALLAB_MASKRECOTHRES;恢复阈值 +TP_LOCALLAB_MODE_EXPERT;高级 +TP_LOCALLAB_MODE_NORMAL;标准 +TP_LOCALLAB_MODE_SIMPLE;基础 +TP_LOCALLAB_MRONE;无 +TP_LOCALLAB_MRTHR;原图 +TP_LOCALLAB_NEIGH;半径 +TP_LOCALLAB_NLDET;细节恢复 +TP_LOCALLAB_NLGAM;伽马 +TP_LOCALLAB_NLLUM;力度 +TP_LOCALLAB_NOISEGAM;伽马 +TP_LOCALLAB_NOISELUMDETAIL;亮度细节恢复 +TP_LOCALLAB_NOISEMETH;去噪 +TP_LOCALLAB_NOISE_TOOLTIP;增加亮度噪点 +TP_LOCALLAB_NONENOISE;无 +TP_LOCALLAB_OFFS;偏移 +TP_LOCALLAB_OFFSETWAV;偏移 +TP_LOCALLAB_OPACOL;不透明度 +TP_LOCALLAB_PASTELS2;鲜明度 +TP_LOCALLAB_PREVHIDE;隐藏额外设置 +TP_LOCALLAB_PREVIEW;预览ΔE +TP_LOCALLAB_PREVSHOW;显示额外设置 +TP_LOCALLAB_PROXI;ΔE衰减 +TP_LOCALLAB_QUAAGRES;激进 +TP_LOCALLAB_QUACONSER;保守 +TP_LOCALLAB_QUALCURV_METHOD;曲线类型 +TP_LOCALLAB_RADIUS;半径 +TP_LOCALLAB_RECT;矩形 +TP_LOCALLAB_REN_DIALOG_LAB;为控制点输入新的名称 +TP_LOCALLAB_REN_DIALOG_NAME;重命名控制点 +TP_LOCALLAB_RESID;残差图 +TP_LOCALLAB_RESIDHI;高光 +TP_LOCALLAB_RESIDHITHR;高光阈值 +TP_LOCALLAB_RESIDSHA;阴影 +TP_LOCALLAB_RESIDSHATHR;阴影阈值 +TP_LOCALLAB_RETI;去雾 & Retinex +TP_LOCALLAB_RET_TOOLNAME;去雾 & Retinex +TP_LOCALLAB_REWEI;再加权迭代 +TP_LOCALLAB_RGB;RGB色调曲线 +TP_LOCALLAB_RGBCURVE_TOOLTIP;RGB模式下有四个选择:标准,加权标准,亮度,以及仿胶片式 +TP_LOCALLAB_ROW_NVIS;隐藏 +TP_LOCALLAB_ROW_VIS;可见 +TP_LOCALLAB_SATUR;饱和度 +TP_LOCALLAB_SATURV;饱和度 (s) +TP_LOCALLAB_SENSI;范围 +TP_LOCALLAB_SENSIEXCLU;范围 +TP_LOCALLAB_SETTINGS;设置 +TP_LOCALLAB_SH1;阴影与高光 +TP_LOCALLAB_SH2;均衡器 +TP_LOCALLAB_SHADEX;阴影 +TP_LOCALLAB_SHADEXCOMP;阴影压缩 +TP_LOCALLAB_SHADHIGH;阴影/高光 & 色调均衡器 +TP_LOCALLAB_SHAMASKCOL;阴影 +TP_LOCALLAB_SHAPETYPE;RT调整点形状 +TP_LOCALLAB_SHAPE_TOOLTIP;“椭圆”是正常模式\n部分情况下会用到“矩形”,比如需要让一个调整点覆盖整张图片的时候,便可以使用矩形点,并将限位点拖移到图片之外。这种情况需要你将过渡值设为100\n\n未来会开发多边形调整点与贝塞尔曲线 +TP_LOCALLAB_SHARAMOUNT;数量 +TP_LOCALLAB_SHARBLUR;模糊半径 +TP_LOCALLAB_SHARITER;迭代 +TP_LOCALLAB_SHARP;锐化 +TP_LOCALLAB_SHARP_TOOLNAME;锐化 +TP_LOCALLAB_SHARRADIUS;半径 +TP_LOCALLAB_SHOWMASK;显示蒙版 +TP_LOCALLAB_SHOWMASKTYP1;模糊 & 噪点 +TP_LOCALLAB_SHOWMASKTYP2;去噪 +TP_LOCALLAB_SHOWMASKTYP3;模糊 & 噪点 + 去噪 +TP_LOCALLAB_SHOWREF;预览ΔE +TP_LOCALLAB_SHRESFRA;阴影/高光 & 色调响应曲线 +TP_LOCALLAB_SH_TOOLNAME;阴影/高光 & 色调均衡器 +TP_LOCALLAB_SIGMAWAV;衰减响应 +TP_LOCALLAB_SIGMOIDLAMBDA;对比度 +TP_LOCALLAB_SOFTM;柔光 +TP_LOCALLAB_SOFTRETI;减少ΔE杂点 +TP_LOCALLAB_SOURCE_ABS;绝对亮度 +TP_LOCALLAB_SOURCE_GRAY;平均亮度(Yb%) +TP_LOCALLAB_SPOTNAME;建立新调整点 +TP_LOCALLAB_STD;标准 +TP_LOCALLAB_STR;力度 +TP_LOCALLAB_STRBL;力度 +TP_LOCALLAB_STREN;压缩力度 +TP_LOCALLAB_STRENG;力度 +TP_LOCALLAB_STRENGR;力度 +TP_LOCALLAB_STRENGTH;噪点 +TP_LOCALLAB_STRGRID;力度 +TP_LOCALLAB_TARGET_GRAY;平均亮度(Yb%) +TP_LOCALLAB_TM;色调映射 +TP_LOCALLAB_TONE_TOOLNAME;色调映射 +TP_LOCALLAB_TOOLMASK_2;小波 +TP_LOCALLAB_TRANSIT;渐变过渡 +TP_LOCALLAB_TRANSITGRAD;横纵过渡差 +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;允许你对纵向过渡进行调整 +TP_LOCALLAB_TRANSITVALUE;过渡值 +TP_LOCALLAB_TRANSITWEAK;渐变衰减(线性-对数) +TP_LOCALLAB_VIBRANCE;鲜明度 & 冷暖 +TP_LOCALLAB_VIB_TOOLNAME;鲜明度 & 冷暖 +TP_LOCALLAB_WARM;冷暖 & 杂色 +TP_LOCALLAB_WARM_TOOLTIP;此滑条使用CIECAM算法,表现为白平衡控制工具,令选中区域的色温偏冷/暖\n部分情况下此工具可以减少色彩杂点 +TP_LOCALLAB_WAV;局部反差 +TP_LOCALLAB_WAVDEN;亮度去噪 +TP_LOCALLAB_WAVE;小波 +TP_LOCALLAB_WAVEDG;局部反差 +TP_LOCALLAB_WAVMASK;局部反差 +TP_METADATA_EDIT;应用修改 +TP_METADATA_MODE;元数据复制模式 +TP_METADATA_STRIP;移除所有元数据 +TP_METADATA_TUNNEL;原样复制 +TP_NEUTRAL;重置 +TP_NEUTRAL_TOOLTIP;还原各个曝光控制滑条的值\n自动色阶所能调整的滑条都会被此还原,不论你是否使用了自动色阶功能 TP_PCVIGNETTE_FEATHER;羽化 +TP_PCVIGNETTE_FEATHER_TOOLTIP;羽化:\n0 = 仅边角\n50 = 到达一半的位置\n100 = 到达中心 TP_PCVIGNETTE_LABEL;暗角滤镜 TP_PCVIGNETTE_ROUNDNESS;圆度 +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;圆度:\n0 = 矩形\n50 = 适于图像的椭圆\n100 = 圆形 TP_PCVIGNETTE_STRENGTH;力度 -TP_PCVIGNETTE_STRENGTH_TOOLTIP;滤镜的力度刻度 (到达角落) +TP_PCVIGNETTE_STRENGTH_TOOLTIP;滤镜的曝光补偿力度(到达边角) +TP_PDSHARPENING_LABEL;捕图加锐 +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;裁切系数 +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;焦距 +TP_PERSPECTIVE_CAMERA_FRAME;矫正 +TP_PERSPECTIVE_CAMERA_PITCH;垂直 +TP_PERSPECTIVE_CAMERA_ROLL;旋转 +TP_PERSPECTIVE_CAMERA_YAW;水平 +TP_PERSPECTIVE_CONTROL_LINES;控制线 +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+拖移:画一条新线\n右击:删除线 +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;必须有至少两条水平或两条垂直控制线 TP_PERSPECTIVE_HORIZONTAL;水平 TP_PERSPECTIVE_LABEL;视角 +TP_PERSPECTIVE_METHOD;方法 +TP_PERSPECTIVE_METHOD_CAMERA_BASED;基于相机 +TP_PERSPECTIVE_METHOD_SIMPLE;简单 TP_PERSPECTIVE_VERTICAL;垂直 -TP_PREPROCESS_LABEL;处理中 -TP_PREPROCESS_LINEDENOISE;线性噪点过滤 -TP_PREPROCESS_NO_FOUND;没发现 +TP_PFCURVE_CURVEEDITOR_CH;色相 +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;控制去除某个色彩的色边的力度。\n越向上 = 越强\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_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_PREPROCESS_PDAFLINESFILTER;PDAF条纹过滤器 +TP_PREPROCWB_LABEL;预处理白平衡 +TP_PREPROCWB_MODE;模式 +TP_PREPROCWB_MODE_AUTO;自动 +TP_PREPROCWB_MODE_CAMERA;相机 +TP_PRSHARPENING_LABEL;调整大小后加锐 +TP_PRSHARPENING_TOOLTIP;在调整图片大小后加锐图像。仅在选择"Lanczos"算法时可用。\n本工具的效果无法预览。见RawPedia的文章以了解本工具的使用教程 TP_RAWCACORR_AUTO;自动修正 +TP_RAWCACORR_AUTOIT;迭代 +TP_RAWCACORR_AUTOIT_TOOLTIP;若“自动矫正”被勾选,此设置便可用。\n自动矫正是保守的,也就是说它经常不会去除所有色差。\n要移除全部色差,你可以使用至多迭代五次的色差矫正迭代。\n每次迭代会纠正上个迭代未能修正的色差,代价是需要花费额外的处理时间 +TP_RAWCACORR_AVOIDCOLORSHIFT;避免偏色 TP_RAWCACORR_CABLUE;蓝 TP_RAWCACORR_CARED;红 -TP_RESIZE_CROPPEDAREA;切出的部分 -TP_RESIZE_FITBOX;Bounding Box -TP_RESIZE_FULLIMAGE;全图 +TP_RAWCACORR_LABEL;色差矫正 +TP_RAWEXPOS_BLACK_0;绿 1 (lead) +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_RGB;红,绿,蓝 +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图片降噪时不产生迷宫状噪点,色调分离或是褪色所用的。\n像素偏移是为宾得/索尼的像素偏移文件所用的。此算法将使用AMaZE算法来处理非像素偏移文件 +TP_RAW_DUALDEMOSAICAUTOCONTRAST;自动阈值 +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;如果勾选框被打勾(推荐如此做),RawTherapee会根据图片中的平缓区域自动计算一个最优值。\n如果图像中没有平缓的区域,或是图片噪点太多,该数值会被设为0\n若想手动调整此数值,首先要将勾选框取消勾选(合适的值取决于具体图像的情况) +TP_RAW_DUALDEMOSAICCONTRAST;反差阈值 +TP_RAW_EAHD;EAHD +TP_RAW_FALSECOLOR;伪色抑制步长 +TP_RAW_HD;阈值 +TP_RAW_HD_TOOLTIP;更低的数值会使热像素/坏点的检测更加激进,但是“宁错杀,不放过”的激进程度可能会导致杂点的产生。在启用本功能后,如果你发现了新出现的杂点,就逐渐提高阈值,直至杂点消失 +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;子图像 +TP_RAW_IMAGENUM_SN;SN模式 +TP_RAW_IMAGENUM_TOOLTIP;某些Raw文件包含多张子图像(宾得/索尼的像素偏移,宾得的3张合并HDR,佳能的双像素,富士的EXR)。\n\n当使用除像素偏移外的任意一个去马赛克算法时,本栏用来选择哪帧子图像被处理。\n\n当在像素偏移Raw文件上使用像素偏移去马赛克算法时,所有子图像都会被使用,此时本栏用来选择哪帧子图像被用来处理动体 +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_PIXELSHIFTAVERAGE;对动体区域使用平均值 +TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;动体区域的内容将会变为四张图片平均混合的结果\n对于缓慢移动的物体会有运动模糊的效果 +TP_RAW_PIXELSHIFTBLUR;动体蒙版模糊 +TP_RAW_PIXELSHIFTDMETHOD;动体区域的去马赛克算法 +TP_RAW_PIXELSHIFTEPERISO;敏感度 +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;默认值0在原生ISO下应该具有不错的效果。\n更大的数值会增强动体检测的敏感度。\n以微小的步长调整此值,同时观察动体蒙版的变化。\n对于欠曝/高ISO的照片,应提高此值 +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_PIXELSHIFTMEDIAN;对动体区域使用中值 +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;对于运动的部分,使用所有图片的中值,而不是用户选择的某一帧图片。\n移除在所有图片中位置都不同的物体。\n在移动慢(重叠)的物体上会产生动体效果 +TP_RAW_PIXELSHIFTMM_AUTO;自动 +TP_RAW_PIXELSHIFTMM_CUSTOM;自定义 +TP_RAW_PIXELSHIFTMM_OFF;关闭 +TP_RAW_PIXELSHIFTMOTIONMETHOD;动体补正 +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来说足够好。\n对于高ISO照片,提高此值,5.0是不错的起始点。\n在改变此值的同时关注动体蒙版 +TP_RAW_PIXELSHIFTSMOOTH;顺滑过渡 +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;让存在动体的区域与没有动体之间的区域之间顺滑地过渡。\n将此值设置为0以禁用顺滑过渡\n将此值设置为1以使用AMaZE/LMMSE算法(这取决于你是否选择了“使用LMMSE”)所解出的你所选择的那一帧图像,如果你选择了“使用中值”,那么就会根据通过所有图像计算出的中值解出图像 +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;拜耳阵列传感器 +TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;允许升采样 +TP_RESIZE_APPLIESTO;应用到: +TP_RESIZE_CROPPEDAREA;裁剪区域 +TP_RESIZE_FITBOX;矩形区域 +TP_RESIZE_FULLIMAGE;整张图 TP_RESIZE_H;高: TP_RESIZE_HEIGHT;高度 TP_RESIZE_LABEL;调整大小 TP_RESIZE_LANCZOS;Lanczos算法 -TP_RESIZE_METHOD;方式: +TP_RESIZE_METHOD;方法: TP_RESIZE_NEAREST;最近点 -TP_RESIZE_SCALE;比例 -TP_RESIZE_SPECIFY;指定: +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_EQUAL;均衡器 +TP_RETINEX_HIGHLIG;高光 +TP_RETINEX_HIGHLIGHT;高光阈值 +TP_RETINEX_ITERF;色调映射 +TP_RETINEX_NEIGHBOR;半径 +TP_RETINEX_NEUTRAL;重置 +TP_RETINEX_SETTINGS;设置 +TP_RETINEX_STRENGTH;力度 +TP_RETINEX_THRESHOLD;阈值 +TP_RETINEX_VIEW_UNSHARP;USM锐化 TP_RGBCURVES_BLUE;B -TP_RGBCURVES_CHANNEL;频道 +TP_RGBCURVES_CHANNEL;通道 TP_RGBCURVES_GREEN;G TP_RGBCURVES_LABEL;RGB曲线 -TP_RGBCURVES_LUMAMODE;光度模式 -TP_RGBCURVES_LUMAMODE_TOOLTIP;光度模式 允许改变R、G、B三种通道光量但不影响色彩 +TP_RGBCURVES_LUMAMODE;亮度模式 +TP_RGBCURVES_LUMAMODE_TOOLTIP;亮度模式允许改变R、G、B三个通道的亮度分配而不影响色彩 TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;角度 TP_ROTATE_LABEL;旋转 -TP_ROTATE_SELECTLINE; 选择基准线 -TP_SAVEDIALOG_OK_TIP;快捷键: Ctrl-Enter +TP_ROTATE_SELECTLINE;选择基准线 +TP_SAVEDIALOG_OK_TOOLTIP;快捷键:Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;高光 -TP_SHADOWSHLIGHTS_HLTONALW;影调范围 +TP_SHADOWSHLIGHTS_HLTONALW;色调范围 TP_SHADOWSHLIGHTS_LABEL;阴影/高光 TP_SHADOWSHLIGHTS_RADIUS;半径 TP_SHADOWSHLIGHTS_SHADOWS;阴影 -TP_SHADOWSHLIGHTS_SHTONALW;影调范围 +TP_SHADOWSHLIGHTS_SHTONALW;色调范围 TP_SHARPENEDGE_AMOUNT;数量 TP_SHARPENEDGE_LABEL;边缘 -TP_SHARPENEDGE_PASSES;迭代次数 -TP_SHARPENEDGE_THREE;仅光度 +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_ITERCHECK;自动限制迭代 TP_SHARPENING_LABEL;锐化 -TP_SHARPENING_METHOD;方式 +TP_SHARPENING_METHOD;方法 TP_SHARPENING_ONLYEDGES;仅锐化边缘 TP_SHARPENING_RADIUS;半径 -TP_SHARPENING_RLD;理查森-露西反卷积法 +TP_SHARPENING_RADIUS_BOOST;边缘半径值提升 +TP_SHARPENING_RLD;理查森-露西反卷积法(RLD) TP_SHARPENING_RLD_AMOUNT;数量 TP_SHARPENING_RLD_DAMPING;衰减 TP_SHARPENING_RLD_ITERATIONS;迭代 TP_SHARPENING_THRESHOLD;阈值 TP_SHARPENING_USM;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_SPOT_COUNTLABEL;%1个点 +TP_SPOT_DEFAULT_SIZE;默认点大小 +TP_SPOT_HINT;点击此按钮后便可在预览图中进行操作\n\n若要编辑一个点,将光标移动到点上,令编辑圆出现\n\n若要添加一个点,按住Ctrl键并单击鼠标左键,然后松开Ctrl键,单击生成的点,将鼠标拖移到你希望用于复制的区域上,最后松开鼠标\n\n如要拖移复制/被复制点,将光标移到点的中心后进行拖移\n\n将鼠标移动到内圈(最大有效区域)和外“渐变”圈的白线上可以更改它们的大小(线会变为橙色),拖动圈线即可(线会继续变红)\n\n完成调整后,鼠标右键单击图片空白区域或再次点击此按钮便可退出污点编辑模式 +TP_SPOT_LABEL;污点移除 +TP_TM_FATTAL_AMOUNT;数量 +TP_TM_FATTAL_ANCHOR;锚点 +TP_TM_FATTAL_LABEL;动态范围压缩 +TP_TM_FATTAL_THRESHOLD;细节 +TP_VIBRANCE_AVOIDCOLORSHIFT;避免偏色 +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;肤色 +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;红/紫 +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;红 +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;红/黄 +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;黄 +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;根据色相(H)调整色相(H),H=f(H) +TP_VIBRANCE_LABEL;鲜明度 +TP_VIBRANCE_PASTELS;欠饱和色调 +TP_VIBRANCE_PASTSATTOG;将饱和色与欠饱和色挂钩 +TP_VIBRANCE_PROTECTSKINS;保护肤色 +TP_VIBRANCE_PSTHRESHOLD;欠饱和/饱和色阈值 +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;饱和度阈值 +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;纵向底部代表欠饱和色,顶部代表饱和色\n横轴代表整个饱和度范围 +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;欠饱和/饱和色过渡权重 +TP_VIBRANCE_SATURATED;饱和色调 TP_VIGNETTING_AMOUNT;数量 TP_VIGNETTING_CENTER;中心 TP_VIGNETTING_CENTER_X;中心 X @@ -891,371 +2235,231 @@ TP_VIGNETTING_CENTER_Y;中心 Y TP_VIGNETTING_LABEL;暗角矫正 TP_VIGNETTING_RADIUS;半径 TP_VIGNETTING_STRENGTH;力度 +TP_WAVELET_1;第1级 +TP_WAVELET_2;第2级 +TP_WAVELET_3;第3级 +TP_WAVELET_4;第4级 +TP_WAVELET_5;第5级 +TP_WAVELET_6;第6级 +TP_WAVELET_7;第7级 +TP_WAVELET_8;第8级 +TP_WAVELET_9;第9级 +TP_WAVELET_APPLYTO;应用到 +TP_WAVELET_AVOID;避免偏色 +TP_WAVELET_B0;黑色 +TP_WAVELET_B1;灰色 +TP_WAVELET_B2;残差图 +TP_WAVELET_BACKGROUND;背景 +TP_WAVELET_BACUR;曲线 +TP_WAVELET_BALANCE;反差平衡 斜/纵-横 +TP_WAVELET_BALANCE_TOOLTIP;调整小波在各方向:纵向-横向与斜向上的平衡。\n如果启用了反差,色度,或是残差图色调映射,那么该平衡的效果会被放大 +TP_WAVELET_BALCHRO;色度平衡 +TP_WAVELET_BALCHRO_TOOLTIP;启用后,“反差平衡”曲线/滑条也会调整色度平衡 +TP_WAVELET_BANONE;无 +TP_WAVELET_BASLI;滑条 +TP_WAVELET_BATYPE;反差平衡方法 +TP_WAVELET_BLUWAV;衰减响应 +TP_WAVELET_CCURVE;局部反差 +TP_WAVELET_CH1;应用到整个色度范围 +TP_WAVELET_CH2;根据饱和度高低 +TP_WAVELET_CH3;与反差等级挂钩 +TP_WAVELET_CHCU;曲线 +TP_WAVELET_CHR;色度-反差挂钩力度 +TP_WAVELET_CHRO;根据饱和度高低 +TP_WAVELET_CHSL;滑条 +TP_WAVELET_CHTYPE;色度应用方法 +TP_WAVELET_COLORT;红-绿不透明度 +TP_WAVELET_COMPCONT;反差 +TP_WAVELET_COMPEXPERT;高级 +TP_WAVELET_COMPLEXLAB;工具复杂度 +TP_WAVELET_COMPLEX_TOOLTIP;标准:显示适用于大部分后期处理的工具,少部分被隐藏\n高级:显示可以用于高级操作的完整工具列表 +TP_WAVELET_COMPNORMAL;标准 +TP_WAVELET_COMPTM;色调映射 +TP_WAVELET_CONTR;色彩范围 +TP_WAVELET_CONTRA;反差 +TP_WAVELET_CONTRAST_MINUS;反差 - +TP_WAVELET_CONTRAST_PLUS;反差 + +TP_WAVELET_CONTRA_TOOLTIP;改变残差图的反差 +TP_WAVELET_CTYPE;色度控制 +TP_WAVELET_DALL;所有方向 +TP_WAVELET_DAUB;边缘表现 +TP_WAVELET_DAUB2;D2-低 +TP_WAVELET_DAUB4;D4-标准 +TP_WAVELET_DAUB6;D6-标准增强 +TP_WAVELET_DAUB10;D10-中等 +TP_WAVELET_DAUB14;D14-高 +TP_WAVELET_DAUB_TOOLTIP;改变多贝西系数:\nD4 = 标准\nD14 = 一般而言表现最好,但会增加10%的处理耗时\n\n影响边缘检测以及较低层级的质量。但是质量不完全和该系数有关,可能会随具体的图像和处理方式而变化 +TP_WAVELET_DENOISEHUE;去噪色相均衡器 +TP_WAVELET_DENQUA;模式 +TP_WAVELET_DENSLI;滑条 +TP_WAVELET_DENWAVHUE_TOOLTIP;根据色相来增强/减弱降噪力度 +TP_WAVELET_DETEND;细节 +TP_WAVELET_DONE;纵向 +TP_WAVELET_DTHR;斜向 +TP_WAVELET_DTWO;横向 +TP_WAVELET_EDCU;曲线 +TP_WAVELET_EDEFFECT;衰减响应 +TP_WAVELET_EDGCONT;局部反差 +TP_WAVELET_EDGE;边缘锐度 +TP_WAVELET_EDGEAMPLI;放大基数 +TP_WAVELET_EDGEDETECT;渐变敏感度 +TP_WAVELET_EDGESENSI;边缘敏感度 +TP_WAVELET_EDGREINF_TOOLTIP;增强或减弱对于第一级的调整,并对第二级的强弱进行与之相反的调整,其他层级不受影响 +TP_WAVELET_EDGTHRESH;细节 +TP_WAVELET_EDGTHRESH_TOOLTIP;改变力度在第1级和其它层级之间的分配。阈值越高,在第1级上的活动越突出。谨慎使用负值,因为这会让更高层级上的活动更强烈,可能导致杂点的出现。 +TP_WAVELET_EDRAD;半径 +TP_WAVELET_EDSL;阈值滑条 +TP_WAVELET_EDTYPE;局部反差调整方法 +TP_WAVELET_EDVAL;力度 +TP_WAVELET_FINAL;最终润色 +TP_WAVELET_FINCFRAME;最终局部反差 +TP_WAVELET_FINEST;最精细 +TP_WAVELET_HIGHLIGHT;精细层级范围 +TP_WAVELET_HS1;全部亮度范围 +TP_WAVELET_HS2;选择性亮度范围 +TP_WAVELET_HUESKIN;肤色和其它色彩 +TP_WAVELET_HUESKY;色相范围 +TP_WAVELET_LABEL;小波层级 +TP_WAVELET_LARGEST;最粗糙 +TP_WAVELET_LEVCH;色度 +TP_WAVELET_LEVDIR_ALL;所有方向的全部层级 +TP_WAVELET_LEVDIR_INF;更精细的细节层级(包括此层级) +TP_WAVELET_LEVDIR_ONE;一个层级 +TP_WAVELET_LEVDIR_SUP;更粗糙的细节层级(不包括此层级) +TP_WAVELET_LEVELS;小波层级数 +TP_WAVELET_LEVELS_TOOLTIP;选择将图像进行小波分解后生成的层级数量。\n更多的层级需要使用更多的内存和更长的处理时间 +TP_WAVELET_LEVF;反差 +TP_WAVELET_LEVLABEL;当前预览中可见的层级数 = %1 +TP_WAVELET_LEVONE;第2级 +TP_WAVELET_LEVTHRE;第4级 +TP_WAVELET_LEVTWO;第3级 +TP_WAVELET_LEVZERO;第1级 +TP_WAVELET_LINKEDG;与边缘锐度的力度挂钩 +TP_WAVELET_LIPST;算法增强 +TP_WAVELET_LOWLIGHT;粗糙层级亮度范围 +TP_WAVELET_LOWTHR_TOOLTIP;避免放大细节和噪点 +TP_WAVELET_MEDGREINF;第一层级 +TP_WAVELET_MEDI;减少蓝天中的杂点 +TP_WAVELET_MEDILEV;边缘检测 +TP_WAVELET_MIXDENOISE;去噪 +TP_WAVELET_MIXNOISE;噪点 +TP_WAVELET_NEUTRAL;还原 +TP_WAVELET_NOIS;去噪 +TP_WAVELET_NOISE;去噪和精细化 +TP_WAVELET_NPHIGH;高 +TP_WAVELET_NPLOW;低 +TP_WAVELET_NPNONE;无 +TP_WAVELET_NPTYPE;临近像素 +TP_WAVELET_OPACITY;蓝-黄不透明度 +TP_WAVELET_OPACITYW;反差平衡 斜/纵-横曲线 +TP_WAVELET_OPACITYWL;局部反差 +TP_WAVELET_PASTEL;欠饱和色 +TP_WAVELET_PROC;处理 +TP_WAVELET_QUAAGRES;激进 +TP_WAVELET_QUACONSER;保守 +TP_WAVELET_RE1;增强 +TP_WAVELET_RE2;不变 +TP_WAVELET_RE3;减弱 +TP_WAVELET_RESCHRO;色度 +TP_WAVELET_RESCON;阴影 +TP_WAVELET_RESCONH;高光 +TP_WAVELET_RESID;残差图像 +TP_WAVELET_SAT;饱和色 +TP_WAVELET_SETTINGS;小波设定 +TP_WAVELET_SHFRAME;阴影/高光 +TP_WAVELET_SIGM;半径 +TP_WAVELET_SIGMA;衰减响应 +TP_WAVELET_SIGMAFIN;衰减响应 +TP_WAVELET_SKIN;肤色针对/保护 +TP_WAVELET_SKIN_TOOLTIP;值为-100时,肤色受针对\n值为0时,所有色彩被平等针对\n值为+100时,肤色受保护,所有其他颜色会被调整 +TP_WAVELET_SKY;色相针对/保护 +TP_WAVELET_SKY_TOOLTIP;允许你针对或保护某个范围的色相。\n值为-100时,被选中的色相受针对\n值为0时,所有色相会被平等针对\n值为+100时,被选中色相受保护,其他所有色相受到针对 +TP_WAVELET_STREN;力度 +TP_WAVELET_STREND;力度 +TP_WAVELET_STRENGTH;力度 +TP_WAVELET_SUPE;额外级 +TP_WAVELET_THR;阴影阈值 +TP_WAVELET_THREND;局部反差阈值 +TP_WAVELET_THRH;高光阈值 +TP_WAVELET_TILESBIG;大切片 +TP_WAVELET_TILESFULL;整张图片 +TP_WAVELET_TILESIZE;切片缓存方法 +TP_WAVELET_TILES_TOOLTIP;处理整张图片可以让图像质量更好,所以推荐使用该选项,切片缓存是给小内存用户的备用方法。阅读RawPedia的文章以了解具体的内存需求 +TP_WAVELET_TMSTRENGTH;压缩力度 +TP_WAVELET_TMSTRENGTH_TOOLTIP;控制对于残差图的色调映射/对比度压缩力度 +TP_WAVELET_TMTYPE;压缩方法 +TP_WAVELET_TON;调色 +TP_WAVELET_WAVOFFSET;偏移 TP_WBALANCE_AUTO;自动 +TP_WBALANCE_AUTO_HEADER;自动 TP_WBALANCE_CAMERA;相机 TP_WBALANCE_CLOUDY;阴天 TP_WBALANCE_CUSTOM;自定义 TP_WBALANCE_DAYLIGHT;晴天 -TP_WBALANCE_EQBLUERED;蓝红平衡 +TP_WBALANCE_EQBLUERED;蓝红均衡器 TP_WBALANCE_FLASH55;徕卡 +TP_WBALANCE_FLASH60;标准,佳能,宾得,奥林巴斯 +TP_WBALANCE_FLASH65;尼康,松下,索尼,美能达 TP_WBALANCE_FLASH_HEADER;闪光 -TP_WBALANCE_GREEN;色度 +TP_WBALANCE_FLUO1;F1 - 日光 +TP_WBALANCE_FLUO2;F2 - 冷白 +TP_WBALANCE_FLUO3;F3 - 白色 +TP_WBALANCE_FLUO4;F4 - 暖白 +TP_WBALANCE_FLUO5;F5 - 日光 +TP_WBALANCE_FLUO_HEADER;荧光灯 +TP_WBALANCE_GREEN;色调 TP_WBALANCE_LABEL;白平衡 TP_WBALANCE_LED_HEADER;LED -TP_WBALANCE_METHOD;方式 +TP_WBALANCE_METHOD;方法 +TP_WBALANCE_PICKER;选点 TP_WBALANCE_SHADE;阴影 TP_WBALANCE_SIZE;大小: TP_WBALANCE_SOLUX35;Solux 3500K TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SPOTWB;白平衡采样 +TP_WBALANCE_TEMPBIAS;自动白平衡色温偏向 +TP_WBALANCE_TEMPBIAS_TOOLTIP;此功能允许你将色温向冷/暖偏移,\n以调整计算出的“自动白平衡”。这个偏移被表达为已计\n算出的色温的一个百分比,故最终的调整结果为“色温+色温*偏移” TP_WBALANCE_TEMPERATURE;色温 +TP_WBALANCE_TUNGSTEN;白炽灯 TP_WBALANCE_WATER1;水下 1 TP_WBALANCE_WATER2;水下 2 TP_WBALANCE_WATER_HEADER;水下 ZOOMPANEL_100;(100%) -ZOOMPANEL_NEWCROPWINDOW;开启(新)细节窗口 -ZOOMPANEL_ZOOM100;缩放到100%\n快捷键: z -ZOOMPANEL_ZOOMFITCROPSCREEN;适应边缘到屏幕\n快捷键:f -ZOOMPANEL_ZOOMFITSCREEN;适应屏幕\n快捷键: Alt-f -ZOOMPANEL_ZOOMIN;缩放拉近\n快捷键: + -ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - +ZOOMPANEL_NEWCROPWINDOW;开启(新的)细节窗口 +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. !!!!!!!!!!!!!!!!!!!!!!!!! -!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. -!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 -!EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations -!EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps -!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_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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!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_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? -!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? -!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. -!FILEBROWSER_POPUPREMOVE;Delete permanently -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -!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 -!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_SHOWNOTTRASHHINT;Show only images not in trash. -!FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. -!FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 -!FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 -!GENERAL_CURRENT;Current -!GENERAL_HELP;Help -!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. -!HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity 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 -!HISTORY_MSG_87;Impulse Noise Reduction -!HISTORY_MSG_88;Impulse NR threshold -!HISTORY_MSG_91;NR - Chrominance master -!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_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_112;--unused-- -!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_120;Green equilibration -!HISTORY_MSG_121;Raw CA Correction - Auto -!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_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_156;Vib - Link pastel/saturated -!HISTORY_MSG_157;Vib - P/S threshold -!HISTORY_MSG_161;TM - Reweighting iterates -!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_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_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_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 - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - CM -!HISTORY_MSG_238;GF - Feather -!HISTORY_MSG_240;GF - Center -!HISTORY_MSG_241;VF - Feather -!HISTORY_MSG_242;VF - Roundness -!HISTORY_MSG_243;VC - Radius -!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 - 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 -!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 - Color Balance +!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 @@ -1266,13 +2470,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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 @@ -1288,7 +2487,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -1303,122 +2502,650 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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;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_494;Capture Sharpening -!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -!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_LUMINANCE;Dehaze - Luminance only -!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold -!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative -!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values -!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius -!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion -!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction -!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!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: +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to 'RawTherapee, CC0'. !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_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -1428,6 +3155,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -1435,13 +3163,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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 @@ -1453,7 +3179,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_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. @@ -1471,116 +3197,35 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_FRAME_PLACES_DEL;Remove !MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. -!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_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a -!MAIN_TAB_FAVORITES;Favorites -!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u -!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9 -!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.\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_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_FILMNEGATIVE;Film Negative -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!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_PSEUDOHIDPI;Pseudo-HiDPI mode -!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_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_CHUNKSIZES;Tiles per thread -!PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic -!PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction -!PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic +!PARTIALPASTE_RETINEX;Retinex +!PARTIALPASTE_VIBRANCE;Vibrance !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic -!PREFERENCES_CHUNKSIZE_RGB;RGB processing -!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 -!PREFERENCES_CROP_GUIDES_NONE;None -!PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. -!PREFERENCES_DIRECTORIES;Directories -!PREFERENCES_EDITORCMDLINE;Custom command line -!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser -!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_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 -!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_PASTEPPASTE;Parameters to paste -!PROFILEPANEL_PDYNAMIC;Dynamic -!PROFILEPANEL_PINTERNAL;Neutral -!PROFILEPANEL_SAVEPPASTE;Parameters to save -!PROGRESSBAR_DECODING;Decoding... -!PROGRESSBAR_GREENEQUIL;Green equilibration... -!PROGRESSBAR_HLREC;Highlight reconstruction... -!PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -!PROGRESSBAR_LINEDENOISE;Line noise filter... -!PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved -!PROGRESSBAR_RAWCACORR;Raw CA correction... -!PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added +!PREFERENCES_CIE;Ciecam +!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_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!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. !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser -!QINFO_FRAMECOUNT;%2 frames -!QINFO_HDR;HDR / %2 frame(s) -!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) -!QUEUE_AUTOSTART_TOOLTIP;Start processing automatically when a new job arrives. -!QUEUE_LOCATION_TITLE;Output Location -!QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s -!SAMPLEFORMAT_0;Unknown data format !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;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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1589,246 +3234,51 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right !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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !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_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_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_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_SET_HYPERPANCHRO;Hyper Panchromatic -!TP_BWMIX_SET_NORMCONTAST;Normal Contrast -!TP_BWMIX_SET_ORTHOCHRO;Orthochromatic -!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_SATANDVALBLENDING;B&W Saturation and Value Blending -!TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard -!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_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_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. -!TP_COLORAPP_CHROMA;Chroma (C) -!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. -!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_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_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 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_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 slightly 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_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_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_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_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. -!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_GTCENTEREDSQUARE;Centered square !TP_CROP_PPI;PPI -!TP_CROP_RESETCROP;Reset -!TP_CROP_SELECTCROP;Select -!TP_DEFRINGE_THRESHOLD;Threshold -!TP_DEHAZE_DEPTH;Depth -!TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map -!TP_DEHAZE_STRENGTH;Strength -!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones -!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global -!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_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_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control -!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve -!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance -!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space -!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* -!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma -!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_MAIN_MODE;Mode -!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive -!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative -!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. -!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method -!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only -!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* -!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter -!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only -!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB -!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations -!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type -!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_TYPE_3X3;3×3 -!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft -!TP_DIRPYRDENOISE_TYPE_5X5;5×5 -!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft -!TP_DIRPYRDENOISE_TYPE_7X7;7×7 -!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. -!TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. !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_REWEIGHTINGITERATES;Reweighting iterates -!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 -!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points -!TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -!TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick neutral spots -!TP_FILMNEGATIVE_RED;Red ratio -!TP_FILMSIMULATION_LABEL;Film Simulation -!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? -!TP_FILMSIMULATION_STRENGTH;Strength -!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, value 0 is used. -!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). -!TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. -!TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +!TP_HLREC_HLBLUR;Blur !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 @@ -1838,24 +3288,61 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. !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_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. -!TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries !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_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_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !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 !TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel @@ -1869,162 +3356,561 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_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_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected -!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file -!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected -!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. -!TP_LENSPROFILE_MODE_HEADER;Lens Profile -!TP_LENSPROFILE_USE_CA;Chromatic aberration -!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion -!TP_LENSPROFILE_USE_HEADER;Correct -!TP_LENSPROFILE_USE_VIGNETTING;Vignetting -!TP_LOCALCONTRAST_AMOUNT;Amount -!TP_LOCALCONTRAST_DARKNESS;Darkness level -!TP_LOCALCONTRAST_LABEL;Local Contrast -!TP_LOCALCONTRAST_LIGHTNESS;Lightness level -!TP_LOCALCONTRAST_RADIUS;Radius -!TP_METADATA_EDIT;Apply modifications -!TP_METADATA_MODE;Metadata copy mode -!TP_METADATA_STRIP;Strip all metadata -!TP_METADATA_TUNNEL;Copy unchanged -!TP_NEUTRAL;Reset -!TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. -!TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. -!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. -!TP_PDSHARPENING_LABEL;Capture Sharpening -!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_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_LABEL;Chromatic Aberration Correction -!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_RGB;Red, Green, Blue +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !TP_RAWEXPOS_TWOGREEN;Link greens !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_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear !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_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 -!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_PIXELSHIFTBLUR;Blur motion mask -!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 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_PIXELSHIFTMEDIAN;Use median for moving parts -!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_PIXELSHIFTMOTIONMETHOD;Motion Correction -!TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!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 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_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.\n+fast gives less artifacts in flat areas +!TP_RAW_RCDBILINEAR;RCD+Bilinear +!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_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans -!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling -!TP_RESIZE_APPLIESTO;Applies to: -!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_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !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_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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -2037,13 +3923,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_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 @@ -2058,23 +3941,18 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_RETINEX_NEUTRAL_TOOLTIP;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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2083,213 +3961,109 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_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_SHARPENING_BLUR;Blur radius -!TP_SHARPENING_CONTRAST;Contrast threshold -!TP_SHARPENING_ITERCHECK;Auto limit iterations -!TP_SHARPENING_RADIUS_BOOST;Corner radius boost -!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_ANCHOR;Anchor -!TP_TM_FATTAL_LABEL;Dynamic Range Compression -!TP_TM_FATTAL_THRESHOLD;Detail -!TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift +!TP_SPOT_ENTRYCHANGED;Point changed !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_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_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of 'contrast levels' and 'chroma-contrast link strength'. +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity !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_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !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 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 +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!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+std. dev. and maxima. !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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 -!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_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect. +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) !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_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values !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_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_FLASH60;Standard, Canon, Pentax, Olympus -!TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -!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_WAVELET_PROTAB;Protection +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!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_FLUO6;F6 - Lite White !TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator !TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design @@ -2297,16 +4071,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_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 -!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_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 25bcf2820..61e6af4bf 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -40,9 +40,12 @@ #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 -#44 2019-04-17 updated by mkyral +#42 2018-10-24 updated by mkyral +#43 2018-12-04 updated by mkyral +#44 2018-12-13 updated by mkyral +#45 2020-04-20 updated by mkyral +#46 2020-04-21 updated by mkyral +#47 2020-06-02 updated by mkyral ABOUT_TAB_BUILD;Verze ABOUT_TAB_CREDITS;Zásluhy @@ -145,7 +148,7 @@ EXPORT_PIPELINE;Fronta zpracování EXPORT_PUTTOQUEUEFAST; Vložit do fronty pro rychlý export EXPORT_RAW_DMETHOD;Metoda demozajkování EXPORT_USE_FAST_PIPELINE;Vyhrazený (kompletní zpracování zmenšeného obrázku) -EXPORT_USE_FAST_PIPELINE_TIP;Použije vyhrazenou frontu zpracování v režimu rychlého exportu a vymění tak kvalitu za rychlost. Zmenšení obrázku se provede co nejdříve po zahájení zpracování, na rozdíl od standardního zpracování, kde se provádí až na závěr. Zrychlení může být velmi významné, ale připravte se na artefakty a celkové zhoršení kvality výstupu. +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Použije vyhrazenou frontu zpracování v režimu rychlého exportu a vymění tak kvalitu za rychlost. Zmenšení obrázku se provede co nejdříve po zahájení zpracování, na rozdíl od standardního zpracování, kde se provádí až na závěr. Zrychlení může být velmi významné, ale připravte se na artefakty a celkové zhoršení kvality výstupu. EXPORT_USE_NORMAL_PIPELINE;Standardní (přeskočí některé kroky, zmenší až na konci) EXTPROGTARGET_1;raw EXTPROGTARGET_2;Zpracování fronty @@ -153,7 +156,7 @@ FILEBROWSER_APPLYPROFILE;Použít FILEBROWSER_APPLYPROFILE_PARTIAL;Aplikovat - částečně FILEBROWSER_AUTODARKFRAME;Automatický tmavý snímek FILEBROWSER_AUTOFLATFIELD;Auto Flat Field -FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro otevření zadané cesty, obnovte složku a aplikujte klíčové slovo "find". +FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro otevření zadané cesty, obnovte složku a aplikujte klíčová slova z pole "Najít:". 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;Smazat vše včetně profilů zpracování v mezipaměti @@ -163,8 +166,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Barevný štítek.\n\nPoužijte výběr ze seznam FILEBROWSER_COPYPROFILE;Kopírovat FILEBROWSER_CURRENT_NAME;Současné jméno: FILEBROWSER_DARKFRAME;Tmavý snímek -FILEBROWSER_DELETEDIALOG_HEADER;Potvrzení smazání souboru +FILEBROWSER_DELETEDIALOG_ALL;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů? +FILEBROWSER_DELETEDIALOG_HEADER;Potvrzení smazání souboru: +FILEBROWSER_DELETEDIALOG_SELECTED;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů včetně výstupů dávkového zpracování? FILEBROWSER_EMPTYTRASH;Vysypat koš +FILEBROWSER_EMPTYTRASHHINT;Trvale smaže všechny soubory z koše. FILEBROWSER_EXTPROGMENU;Otevřít pomocí FILEBROWSER_FLATFIELD;Flat Field FILEBROWSER_MOVETODARKFDIR;Přesunout do složky tmavých snímků @@ -198,6 +205,8 @@ FILEBROWSER_POPUPRANK2;Hodnocení 2 ** FILEBROWSER_POPUPRANK3;Hodnocení 3 *** FILEBROWSER_POPUPRANK4;Hodnocení 4 **** FILEBROWSER_POPUPRANK5;Hodnocení 5 ***** +FILEBROWSER_POPUPREMOVE;Trvale smazat +FILEBROWSER_POPUPREMOVEINCLPROC;Trvale smazat, včetně dávkově zpracovaných verzí FILEBROWSER_POPUPRENAME;Přejmenovat FILEBROWSER_POPUPSELECTALL;Vybrat vše FILEBROWSER_POPUPTRASH;Přesunout do koše @@ -224,6 +233,7 @@ FILEBROWSER_SHOWDIRHINT;Smazat všechny filtry.\nZkratka: d FILEBROWSER_SHOWEDITEDHINT;Ukázat upravené obrázky.\nZkratka: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Ukázat neupravené obrázky.\nZkratka: 6 FILEBROWSER_SHOWEXIFINFO;Zobrazit Exif informace.\n\nZkratky:\ni - režim více karet editoru,\nAlt-i - režim jedné karty editoru. +FILEBROWSER_SHOWNOTTRASHHINT;Zobrazit pouze snímky které nejsou v koši. FILEBROWSER_SHOWORIGINALHINT;Zobrazí pouze originální obrázky.\n\nPokud existuje několik obrázků se stejným názvem, ale rozdílnými příponami, bude jako originál vybrán ten, jehož přípona je nejvýše v seznamu přípon veVolby > Prohlížeč souborů > Analyzované přípony. FILEBROWSER_SHOWRANK1HINT;Ukázat obrázky hodnocené jednou hvězdičkou.\nZkratka: 1 FILEBROWSER_SHOWRANK2HINT;Ukázat obrázky hodnocené dvěma hvězdičkami.\nZkratka: 2 @@ -260,6 +270,7 @@ GENERAL_DISABLED;Vypnuto GENERAL_ENABLE;Zapnout GENERAL_ENABLED;Zapnuto GENERAL_FILE;Soubor +GENERAL_HELP;Nápověda GENERAL_LANDSCAPE;Na šířku GENERAL_NA;n/a GENERAL_NO;Ne @@ -281,13 +292,11 @@ 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 HISTORY_CUSTOMCURVE;Vlastní křivka HISTORY_FROMCLIPBOARD;Ze schránky HISTORY_LABEL;Historie HISTORY_MSG_1;Fotka načtena -HISTORY_MSG_2;PP3 načten HISTORY_MSG_3;PP3 změněn HISTORY_MSG_4;Prohlížení historie HISTORY_MSG_5;Expozice - Světlost @@ -301,9 +310,6 @@ HISTORY_MSG_12;Expozice - Automatické úrovně HISTORY_MSG_13;Expozice - Oříznutí HISTORY_MSG_14;L*a*b* - Světlost HISTORY_MSG_15;L*a*b* - Kontrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- HISTORY_MSG_19;L*a*b* - L* křivka HISTORY_MSG_20;Doostření HISTORY_MSG_21;Doostření - Poloměr @@ -329,10 +335,6 @@ HISTORY_MSG_40;VB - Odstín HISTORY_MSG_41;Expozice - Tónová křivka - mód 1 HISTORY_MSG_42;Expozice - Tónová křivka 2 HISTORY_MSG_43;Expozice - Tónová křivka - mód 2 -HISTORY_MSG_44;Poloměr redukce šumu v jasech -HISTORY_MSG_45;Okrajová tolerance redukce šumu v jasech -HISTORY_MSG_46;Redukce barevného šumu -HISTORY_MSG_47;Smísení ICC světel s matici HISTORY_MSG_48;DCP - Tónová křivka HISTORY_MSG_49;DCP osvětlení HISTORY_MSG_50;Stíny/Světla @@ -340,7 +342,6 @@ HISTORY_MSG_51;S/S - Světla HISTORY_MSG_52;S/S - Stíny HISTORY_MSG_53;S/S - Tónový rozsah světel HISTORY_MSG_54;S/S - Tónový rozsah stínů -HISTORY_MSG_55;S/S - Místní kontrast HISTORY_MSG_56;S/S - Poloměr HISTORY_MSG_57;Hrubé otáčení HISTORY_MSG_58;Horizontální překlopení @@ -352,7 +353,6 @@ HISTORY_MSG_63;Snímek vybrán HISTORY_MSG_64;Ořez HISTORY_MSG_65;Korekce CA HISTORY_MSG_66;Expozice - Rekonstrukce světel -HISTORY_MSG_67;Expozice - míra HLR HISTORY_MSG_68;Expozice - metoda HLR HISTORY_MSG_69;Pracovní barevný prostor HISTORY_MSG_70;Výstupní barevný prostor @@ -363,12 +363,10 @@ HISTORY_MSG_74;Změna rozměrů - Míra HISTORY_MSG_75;Změna rozměrů - Metoda HISTORY_MSG_76;Exif metadata HISTORY_MSG_77;IPTC metadata -HISTORY_MSG_78;- HISTORY_MSG_79;Změna velikosti - šířka HISTORY_MSG_80;Změna velikosti - délka HISTORY_MSG_81;Změna velikosti HISTORY_MSG_82;Profil změněn -HISTORY_MSG_83;S/S - Maska ostrosti HISTORY_MSG_84;Korekce perspektivy HISTORY_MSG_85;Korekce objektivu - LCP soubor HISTORY_MSG_86;RGB křivky - Režim svítivost @@ -402,11 +400,11 @@ HISTORY_MSG_113;L*a*b* - Ochrana červ. a pleť. tónů HISTORY_MSG_114;Průchody DCB HISTORY_MSG_115;Potlačení chybných barev HISTORY_MSG_116;Vylepšení DCB -HISTORY_MSG_117;Raw korekce CA - červená -HISTORY_MSG_118;Raw korekce CA - modrá +HISTORY_MSG_117;Raw korekce ChA - červená +HISTORY_MSG_118;Raw korekce ChA - modrá HISTORY_MSG_119;Filtrovat linkové rušení HISTORY_MSG_120;Vyrovnání zelené -HISTORY_MSG_121;Raw korekce CA - automatická +HISTORY_MSG_121;Raw korekce ChA - 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 @@ -415,12 +413,6 @@ HISTORY_MSG_127;Flat Field - Automatický výběr HISTORY_MSG_128;Flat Field - Poloměr rozostření HISTORY_MSG_129;Flat Field - Typ rozostření HISTORY_MSG_130;Automatická korekce zkreslení -HISTORY_MSG_131;Redukce šumu - Jas -HISTORY_MSG_132;Redukce šumu - Barevnost -HISTORY_MSG_133;Výstupní gama -HISTORY_MSG_134;Volná gama -HISTORY_MSG_135;Volná gama -HISTORY_MSG_136;Sklon volné gamy HISTORY_MSG_137;Úroveň černé - Zelená 1 HISTORY_MSG_138;Úroveň černé - Červená HISTORY_MSG_139;Úroveň černé - Modrá @@ -533,7 +525,6 @@ HISTORY_MSG_246;L*a*b* - CL křivka HISTORY_MSG_247;L*a*b* - LH Křivka HISTORY_MSG_248;L*a*b* - HH Křivka HISTORY_MSG_249;KdDÚ - Práh -HISTORY_MSG_250;Redukce šumu - Vylepšení HISTORY_MSG_251;ČB - Algoritmus HISTORY_MSG_252;KdDÚ - Ochrana tónů pleti HISTORY_MSG_253;KdDÚ - Omezení vzniku artefaktů @@ -557,8 +548,6 @@ 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í - 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 HISTORY_MSG_277;--nepoužito-- HISTORY_MSG_278;Barevné tónování - Zachování jasu @@ -583,7 +572,6 @@ 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;- HISTORY_MSG_301;Redukce šumu - Nastavení jasu HISTORY_MSG_302;Redukce šumu - Metoda barevnosti HISTORY_MSG_303;Redukce šumu - Metoda barevnosti @@ -601,10 +589,10 @@ HISTORY_MSG_314;Vlnka - Gamut - Omezení artefaktů HISTORY_MSG_315;Vlnka - Zůstatek - Kontrast 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_318;Vlnka - Kontrast - Jemnější úrovně +HISTORY_MSG_319;Vlnka - Kontrast - Jemnější rozsah +HISTORY_MSG_320;Vlnka - Kontrast - Hrubší rozsah +HISTORY_MSG_321;Vlnka - Kontrast - Hrubší úrovně HISTORY_MSG_322;Vlnka - Gamut - Zabránit posunu barev HISTORY_MSG_323;Vlnka - DH - Místní kontrast HISTORY_MSG_324;Vlnka - Barevnost - Pastelové @@ -692,7 +680,6 @@ HISTORY_MSG_405;Vlnka - Odšumění - Úroveň 4 HISTORY_MSG_406;Vlnka - DH - Sousední pixely HISTORY_MSG_407;Retinex - Metoda HISTORY_MSG_408;Retinex - Poloměr -HISTORY_MSG_409;Retinex - Kontrast HISTORY_MSG_410;Retinex - Posun HISTORY_MSG_411;Retinex - Síla HISTORY_MSG_412;Retinex - Gaussův gradient @@ -740,7 +727,6 @@ HISTORY_MSG_468;PS - Vyplnit díry HISTORY_MSG_469;PS - Medián HISTORY_MSG_471;PS - korekce pohybu HISTORY_MSG_472;PS - plynulé přechody -HISTORY_MSG_473;PS - Použít LMMSE HISTORY_MSG_474;PS - korekce HISTORY_MSG_475;PS - korekce kanálu HISTORY_MSG_476;CAM02 - Teplota (výstup) @@ -761,6 +747,11 @@ 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_494;Doostření vstupu +HISTORY_MSG_BLSHAPE;Rozmazat dle úrovně +HISTORY_MSG_BLURCWAV;Rozmazat barevnost +HISTORY_MSG_BLURWAV;Rozmazat jas +HISTORY_MSG_BLUWAV;Útlum 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 @@ -769,7 +760,7 @@ 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_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 @@ -782,6 +773,9 @@ 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_EDGEFFECT;Útlum hrany +HISTORY_MSG_FILMNEGATIVE_ENABLED;Negativní film +HISTORY_MSG_FILMNEGATIVE_VALUES;Film negativní hodnoty 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 @@ -789,6 +783,7 @@ 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_ILLUM;Osvětlení HISTORY_MSG_LOCALCONTRAST_AMOUNT;Místní kontrast - Míra HISTORY_MSG_LOCALCONTRAST_DARKNESS;Místní kontrast - Tmavé HISTORY_MSG_LOCALCONTRAST_ENABLED;Místní kontrast @@ -796,20 +791,56 @@ 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_PDSHARPEN_AUTO_CONTRAST;DV - Automatický práh +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;DV - Automatický poloměr +HISTORY_MSG_PDSHARPEN_CHECKITER;DV- Automatický počet průchodů +HISTORY_MSG_PDSHARPEN_CONTRAST;DV - Práh kontrastu +HISTORY_MSG_PDSHARPEN_ITERATIONS;DV - Průchody +HISTORY_MSG_PDSHARPEN_RADIUS;DV - Poloměr +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;DV - Zvýšení poloměru rohu 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_PREPROCWB_MODE;Režim předzpracování VB +HISTORY_MSG_PROTAB;Ochrana 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_RANGEAB;Rozsah ab +HISTORY_MSG_RAWCACORR_AUTOIT;Raw korekce ChA - Iterace +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw korekce ChA - 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_BLUR;Doostření - Poloměr rozmazání HISTORY_MSG_SHARPENING_CONTRAST;Doostření - Práh kontrastu HISTORY_MSG_SH_COLORSPACE;S/S - Barevný prostor +HISTORY_MSG_SIGMACOL;Útlum barevnosti +HISTORY_MSG_SIGMADIR;Útlum směru +HISTORY_MSG_SIGMAFIN;Finální útlum kontrastu +HISTORY_MSG_SIGMATON;Útlum tónování HISTORY_MSG_SOFTLIGHT_ENABLED;Měkké světlo HISTORY_MSG_SOFTLIGHT_STRENGTH;Měkká světla - Síla +HISTORY_MSG_TEMPOUT;CAM02 - Automatická teplota +HISTORY_MSG_THRESWAV;Práh vyvážení HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Kotva +HISTORY_MSG_TRANS_METHOD;Geometrie - Metoda +HISTORY_MSG_WAVBALCHROM;Vyvážení barevnosti +HISTORY_MSG_WAVBALLUM;Vyvážení jasu +HISTORY_MSG_WAVBL;Úrovně rozmazání +HISTORY_MSG_WAVCHROMCO;Hrubá barevnost +HISTORY_MSG_WAVCHROMFI;Jemné barevnost +HISTORY_MSG_WAVCLARI;Čirost +HISTORY_MSG_WAVEDGS;Zachování hran +HISTORY_MSG_WAVLOWTHR;Práh nízkého kontrastu +HISTORY_MSG_WAVMERGEC;Sloučení barevnosti +HISTORY_MSG_WAVMERGEL;Sloučení jasu +HISTORY_MSG_WAVOFFSET;Posun +HISTORY_MSG_WAVOLDSH;Starý algoritmus +HISTORY_MSG_WAVRADIUS;Poloměr Stíny-Světla +HISTORY_MSG_WAVSCALE;Měřítko +HISTORY_MSG_WAVSHOWMASK;Ukázat masku vlnky +HISTORY_MSG_WAVSIGMA;Útlum +HISTORY_MSG_WAVSOFTRAD;Čirost jemný poloměr +HISTORY_MSG_WAVSOFTRADEND;Konečný jemný poloměr +HISTORY_MSG_WAVUSHAMET;Metoda čirosti HISTORY_NEWSNAPSHOT;Přidat HISTORY_NEWSNAPSHOT_TOOLTIP;Zkratka: Alt-s HISTORY_SNAPSHOT;Snímek @@ -939,15 +970,15 @@ MAIN_TAB_COLOR;Barvy MAIN_TAB_COLOR_TOOLTIP;Zkratka: Alt-c MAIN_TAB_DETAIL;Detaily MAIN_TAB_DETAIL_TOOLTIP;Zkratka: Alt-d -MAIN_TAB_DEVELOP; Dávková editace +MAIN_TAB_DEVELOP; Dávková editace MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Rychlý export +MAIN_TAB_EXPORT; Rychlý export MAIN_TAB_EXPOSURE;Expozice MAIN_TAB_EXPOSURE_TOOLTIP;Zkratka: Alt-e MAIN_TAB_FAVORITES;Oblíbené MAIN_TAB_FAVORITES_TOOLTIP;Zkratka: Alt-u -MAIN_TAB_FILTER; Filtr -MAIN_TAB_INSPECT; Prohlížení +MAIN_TAB_FILTER; Filtr +MAIN_TAB_INSPECT; Prohlížení MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Metadata MAIN_TAB_METADATA_TOOLTIP;Zkratka: Alt-m @@ -961,8 +992,8 @@ 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_INDCLIPPEDH;Zvýraznění oříznutých světel.\nZkratka: > +MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznění oříznutých stínů.\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\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 @@ -1017,6 +1048,7 @@ PARTIALPASTE_EQUALIZER;Úrovně vlnky PARTIALPASTE_EVERYTHING;Vše PARTIALPASTE_EXIFCHANGES;Exif PARTIALPASTE_EXPOSURE;Expozice +PARTIALPASTE_FILMNEGATIVE;Negativní film PARTIALPASTE_FILMSIMULATION;Simulace filmu PARTIALPASTE_FLATFIELDAUTOSELECT;Automatický výběr Flat Field PARTIALPASTE_FLATFIELDBLURRADIUS;Poloměr rozostření Flat Field @@ -1041,6 +1073,7 @@ 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_PREPROCWB;Předzpracování Vyvážení bílé PARTIALPASTE_PRSHARPENING;Doostření po změně velikosti PARTIALPASTE_RAWCACORR_AUTO;Automatická korekce CA PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA zabránit posunu barev @@ -1075,6 +1108,7 @@ 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_PSEUDOHIDPI;Pseudo-HiDPI režim PREFERENCES_APPEARANCE_THEME;Motiv PREFERENCES_APPLNEXTSTARTUP;vyžaduje restart aplikace PREFERENCES_AUTOMONPROFILE;Použít barevný profil hlavního monitoru z operačního systému @@ -1094,11 +1128,11 @@ 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_CHUNKSIZES;Dlaždic na vlákno -PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demozajkování -PREFERENCES_CHUNKSIZE_RAW_CA;Raw korekce CA +PREFERENCES_CHUNKSIZE_RAW_AMAZE;Demozajkování AMaZE +PREFERENCES_CHUNKSIZE_RAW_CA;Raw korekce ChA PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demozajkování -PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demozajkování -PREFERENCES_CHUNKSIZE_RGB;RGB zpracování +PREFERENCES_CHUNKSIZE_RAW_XT;Demozajkování Xtrans +PREFERENCES_CHUNKSIZE_RGB;Zpracování barev PREFERENCES_CLIPPINGIND;Indikace oříznutí PREFERENCES_CLUTSCACHE;Mezipaměť HaldCLUT PREFERENCES_CLUTSCACHE_LABEL;Maximální počet přednačtených CLUTů @@ -1186,8 +1220,8 @@ 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_MEASURE;Měřit -PREFERENCES_PERFORMANCE_MEASURE_HINT;Vypisovat časy zpracování v konzoli +PREFERENCES_PERFORMANCE_MEASURE;Měření +PREFERENCES_PERFORMANCE_MEASURE_HINT;Vypisuje doby zpracování do konzole 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 @@ -1248,7 +1282,7 @@ PROFILEPANEL_GLOBALPROFILES;Přiložené profily PROFILEPANEL_LABEL;Profily zpracování PROFILEPANEL_LOADDLGLABEL;Načíst parametry zpracování... PROFILEPANEL_LOADPPASTE;Parametry nahrávání -PROFILEPANEL_MODE_TIP;Režim uplatnění profilu zpracování.\n\nTlačítko je stisknuto: částečné profily budou aplikovány jako kompletní; chybějící hodnoty budou doplněny přednastavenými hodnotami.\n\nTlačítko není stisknuto: profily budou aplikovány tak jak jsou, změní se pouze v profilu obsažené hodnoty. +PROFILEPANEL_MODE_TOOLTIP;Režim uplatnění profilu zpracování.\n\nTlačítko je stisknuto: částečné profily budou aplikovány jako kompletní; chybějící hodnoty budou doplněny přednastavenými hodnotami.\n\nTlačítko není stisknuto: profily budou aplikovány tak jak jsou, změní se pouze v profilu obsažené hodnoty. PROFILEPANEL_MYPROFILES;Mé profily PROFILEPANEL_PASTEPPASTE;Parametry pro vložení PROFILEPANEL_PCUSTOM;Vlastní @@ -1262,11 +1296,11 @@ PROFILEPANEL_TOOLTIPCOPY;Kopírovat současný profil do schránky.\nCtrl-kli PROFILEPANEL_TOOLTIPLOAD;Nahrát profil ze souboru.\nCtrl-klik umožní vybrat parametry pro nahrání. PROFILEPANEL_TOOLTIPPASTE;Vložit profil ze schránky.\nCtrl-klik umožní vybrat parametry pro vložení. PROFILEPANEL_TOOLTIPSAVE;Uložit současný profil.\nCtrl-klik umožní vybrat parametry pro uložení. -PROGRESSBAR_DECODING;Dekodování... +PROGRESSBAR_DECODING;Dekódování… PROGRESSBAR_GREENEQUIL;Vyrovnání zelené... -PROGRESSBAR_HLREC;Rekonstrukce světel... -PROGRESSBAR_HOTDEADPIXELFILTER;Filtr vypálených/mrtvých pixelů... -PROGRESSBAR_LINEDENOISE;Filtr linkového rušení... +PROGRESSBAR_HLREC;Rekonstrukce světel… +PROGRESSBAR_HOTDEADPIXELFILTER;Filtrování vypálených/mrtvých pixelů… +PROGRESSBAR_LINEDENOISE;Filtr linkového rušení… PROGRESSBAR_LOADING;Načítání obrázku... PROGRESSBAR_LOADINGTHUMBS;Načítání náhledů... PROGRESSBAR_LOADJPEG;Načítání JPEG... @@ -1275,7 +1309,7 @@ PROGRESSBAR_LOADTIFF;Načítání TIFF... PROGRESSBAR_NOIMAGES;Složka neobsahuje obrázky PROGRESSBAR_PROCESSING;Zpracovávaní obrázku... PROGRESSBAR_PROCESSING_PROFILESAVED;Profil zpracování uložen -PROGRESSBAR_RAWCACORR;RAW korekce chromatické aberace... +PROGRESSBAR_RAWCACORR;Korekce ChA… PROGRESSBAR_READY;Připraven PROGRESSBAR_SAVEJPEG;Ukládání JPEG souboru... PROGRESSBAR_SAVEPNG;Ukládání PNG souboru... @@ -1293,8 +1327,8 @@ QUEUE_DESTFILENAME;Cesta a název souboru QUEUE_FORMAT_TITLE;Formát souboru QUEUE_LOCATION_FOLDER;Ulož do souboru QUEUE_LOCATION_TEMPLATE;Použít šablonu -QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specifikujte kam se mají uložit výstupy. Lze použít umístění zdrojových souborů, pořadí, stav koše nebo pozice ve frontě.\n\nNapříklad pokud má zpracovávaná fotografie následující cestu:\n/home/tomas/fotky/2010-10-31/dsc0042.nef,\nmají jednotlivé formátovací řetězce tento význam:\n%d4 = home\n%d3 = tomas\n%d2 = fotky\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tomas/fotky/2010-10-31/\n%p2 = /home/tomas/fotky/\n%p3 = /home/tomas/\n%p4 = /home/\n\n%r bude nahrazeno hodnocením fotografie.Pokud není fotografie ohodnocena, bude %r nahrazeno '0'.Pokud je fotografie v koši, bude %r nahrazeno 'x'.\n\nPokud si přejete uložit výstupní obrázek vedle originálu, napište:\n%p1/%f\n\nPokud si jej ale přejete uložit do adresáře "converted" ve stejném adresáři jako otevřený obrázek, napište:\n%p1/converted/%f\n\nPro uložení výstupního obrázku do adresáře"/home/tom/photos/converted/2010-10-31", napište:\n%p2/converted/%d1/%f -QUEUE_LOCATION_TITLE;Výstupní umístění +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Lze použít následující formátovací řetězce:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r\n\nTyto formátovací řetězce reprezentují různé části cesty k uložené fotografii.\n\nNapříklad pokud má zpracovávaná fotografie následující cestu:\n/home/tomas/fotky/2010-10-31/fotka1.raw,\nmají jednotlivé formátovací řetězce tento význam:\n%d4 = home\n%d3 = tomas\n%d2 = fotky\n%d1 = 2010-10-31\n%f = fotka1\n%p1 = /home/tomas/fotky/2010-10-31/\n%p2 = /home/tomas/fotky/\n%p3 = /home/tomas/\n%p4 = /home/\n\n%r bude nahrazeno hodnocením fotografie.Pokud není fotografie ohodnocena, bude %r nahrazeno '0'.Pokud je fotografie v koši, bude %r nahrazeno 'x'.\n\nPokud si přejete uložit výstupní obrázek vedle originálu, napište:\n%p1/%f\n\nPokud si jej ale přejete uložit do adresáře "converted" ve stejném adresáři jako otevřený obrázek, napište:\n%p1/converted/%f\n\nPro uložení výstupního obrázku do adresáře"/home/tom/photos/converted/2010-10-31", napište:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TITLE;Umístění výstupu QUEUE_STARTSTOP_TOOLTIP;Spustit nebo zastavit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s SAMPLEFORMAT_0;Neznámý datový formát SAMPLEFORMAT_1;8-bitový neznaménkový @@ -1331,7 +1365,7 @@ 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 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: Ctrl+Shift+pravý-klik.\n- Návrat k nástroji posunu: pravý-klik mimo průzkumníky. +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: Ctrl+Shift+pravý-klik.\n- Návrat k nástroji posunu: pravý-klik mimo jakoukoli sondu. 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. @@ -1417,7 +1451,7 @@ TP_COLORAPP_ALGO_JS;Světlost + Nasycení (JS) TP_COLORAPP_ALGO_QM;Jas a pestrobarevnost (QM) TP_COLORAPP_ALGO_TOOLTIP;Umožňuje vybrat mezi podmnožinou nebo všemi parametry. TP_COLORAPP_BADPIXSL;Filtr vypálených/mrtvých pixelů -TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02. +TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02. TP_COLORAPP_BRIGHT;Jas (O) TP_COLORAPP_BRIGHT_TOOLTIP;Jas v CIECAM02 bere v potaz svítivost bílé a rozdíly jasů mezi L*a*b* a RGB. TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;U ručního nastavení jsou doporučeny hodnoty nad 65. @@ -1428,7 +1462,7 @@ TP_COLORAPP_CHROMA_S;Nasycení (S) TP_COLORAPP_CHROMA_S_TOOLTIP;Nasycení se v CIECAM02 liší od nasycení L*a*b* a RGB. TP_COLORAPP_CHROMA_TOOLTIP;Barevnost se v CIECAM02 liší od barevnosti L*a*b* a RGB. TP_COLORAPP_CIECAT_DEGREE;CAT02 přizpůsobení -TP_COLORAPP_CONTRAST;Kontrast (I) +TP_COLORAPP_CONTRAST;Kontrast (J) TP_COLORAPP_CONTRAST_Q;Kontrast (O) TP_COLORAPP_CONTRAST_Q_TOOLTIP;Liší se od kontrastu L*a*b* a RGB. TP_COLORAPP_CONTRAST_TOOLTIP;Liší se od kontrastu L*a*b* a RGB. @@ -1442,20 +1476,29 @@ 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_FREE;Volná teplota + zelená + CAT02 + [výstup] 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_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;Žárovka StdA 2856K +TP_COLORAPP_ILFREE;Volná +TP_COLORAPP_ILLUM;Osvětlení +TP_COLORAPP_ILLUM_TOOLTIP;Vyberte osvětlení nejvíce se blížící podmínkám v době pořízení snímku.\nObecně D50, to se ale může lišit v závislosti na denní době a zeměpisné šířce. TP_COLORAPP_LABEL;CIE model přizpůsobení barev 2002 TP_COLORAPP_LABEL_CAM02;Úpravy obrázku TP_COLORAPP_LABEL_SCENE;Podmínky scény TP_COLORAPP_LABEL_VIEWING;Podmínky zobrazení -TP_COLORAPP_LIGHT;Světlost (I) +TP_COLORAPP_LIGHT;Světlost (J) 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_NEUTRAL_TOOLTIP;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_SURROUND;Okolí @@ -1472,7 +1515,8 @@ TP_COLORAPP_TCMODE_LABEL2;Mód křivky 2 TP_COLORAPP_TCMODE_LABEL3;Mód barevné křivky TP_COLORAPP_TCMODE_LIGHTNESS;Světlost TP_COLORAPP_TCMODE_SATUR;Nasycení -TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Tint=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504 +TP_COLORAPP_TEMP2_TOOLTIP;Buď symetrický režim teploty = Nastavení bílé,\nNebo vyberte osvětlení, vždy nastavte Odstín=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504 +TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Odstín=1.\n\nA barva=2856\nD41 temp=4100\nD50 barva=5003\nD55 barva=5503\nD60 temp=6000\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²). @@ -1499,7 +1543,7 @@ 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_HUEMASK;H TP_COLORTONING_LABREGION_LIGHTNESS;Světlost TP_COLORTONING_LABREGION_LIGHTNESSMASK;L TP_COLORTONING_LABREGION_LIST_TITLE;Oprava @@ -1517,7 +1561,7 @@ TP_COLORTONING_METHOD;Metoda TP_COLORTONING_METHOD_TOOLTIP;"Mísení L*a*b*", "RGB posuvníky" a "RGB křivky" používají interpolované mísení barev.\n"Vyvážení barev (Stíny, střední tóny a světla)" a "Nasycení dvou barev" používají přímé barvy.\n\nNástroj Černobílá může být povolen při použití kterékoli metody barevného tónování. TP_COLORTONING_MIDTONES;Střední tóny TP_COLORTONING_NEUTRAL;Vrátit posuvníky -TP_COLORTONING_NEUTRAL_TIP;Vrátí všechny hodnoty (stíny, střední tóny a světla) na výchozí pozice. +TP_COLORTONING_NEUTRAL_TOOLTIP;Vrátí všechny hodnoty (stíny, střední tóny a světla) na výchozí pozice. TP_COLORTONING_OPACITY;Neprůhlednost TP_COLORTONING_RGBCURVES;RGB - křivky TP_COLORTONING_RGBSLIDERS;RGB - Posuvníky @@ -1632,7 +1676,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Hodnota -100: zaměřeno na pleťové tóny.\nH TP_DIRPYREQUALIZER_THRESHOLD;Práh TP_DIRPYREQUALIZER_TOOLTIP;Počet pokusů pro redukci artefaktů vzniklých přenosem barvy (odstín, barevnost a jas) pleti na zbytek obrázku. TP_DISTORTION_AMOUNT;Míra -TP_DISTORTION_AUTO_TIP;Automaticky opraví zkreslení objektivu v raw souborech podle vložených JPEG obrázků (pokud existují a byly automaticky opraveny fotoaparátem). +TP_DISTORTION_AUTO_TOOLTIP;Automaticky opraví zkreslení objektivu v raw souborech podle vložených JPEG obrázků (pokud existují a byly automaticky opraveny fotoaparátem). TP_DISTORTION_LABEL;Korekce zkreslení TP_EPD_EDGESTOPPING;Zachování hran TP_EPD_GAMMA;Gama @@ -1641,12 +1685,12 @@ TP_EPD_REWEIGHTINGITERATES;Počet průchodů převážení TP_EPD_SCALE;Měřítko TP_EPD_STRENGTH;Síla 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_AUTOLEVELS_TOOLTIP;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_CLIP_TOOLTIP;Podíl klipujících bodů v automatických operacích úrovní. TP_EXPOSURE_COMPRHIGHLIGHTS;Komprese světel TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Práh komprese světel TP_EXPOSURE_COMPRSHADOWS;Komprese stínů @@ -1669,6 +1713,12 @@ TP_EXPOSURE_TCMODE_STANDARD;Běžný TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Běžný vážený TP_EXPOS_BLACKPOINT_LABEL;Raw černé body TP_EXPOS_WHITEPOINT_LABEL;Raw bílé body +TP_FILMNEGATIVE_BLUE;Poměr modré +TP_FILMNEGATIVE_GREEN;Referenční exponent (kontrast) +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automaticky nastaví poměr červené a modré výběrem dvou vzorků s neutrálním odstínem (bez barvy) v původní scéně. Vzorky by se měly lišit jasem. Následně je nastaveno vyvážení bílé. +TP_FILMNEGATIVE_LABEL;Negativní film +TP_FILMNEGATIVE_PICK;Výběr neutrálních míst +TP_FILMNEGATIVE_RED;Poměr červené TP_FILMSIMULATION_LABEL;Simulace filmu TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee je nakonfigurován aby hledal Hald CLUT obrázky pro nástroj Simulace filmu ve složce, jejíž načítání trvá velmi dlouho.\nZkontrolujte prosím nastavení v menu Volby > Zpracování obrázku > Simulace filmu.\nNastavená složka by měla buď obsahovat jen a pouze Hald CLUT obrázky nebo být prázdná, pokud nechcete nástroj Simulace filmu používat.\n\nVíce informací získáte v článku o nástroji Simulace filmu na RawPedii.\n\nChcete zrušit právě probíhající prohledávání složky? TP_FILMSIMULATION_STRENGTH;Síla @@ -1681,7 +1731,7 @@ TP_FLATFIELD_BT_HORIZONTAL;Vodorovně TP_FLATFIELD_BT_VERTHORIZ;Vodorovně a svisle 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_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, použije se hodnota 0. TP_FLATFIELD_LABEL;Flat Field TP_GENERAL_11SCALE_TOOLTIP;Efekt tohoto nástroje je viditelný pouze při přiblížení 1:1. TP_GRADIENT_CENTER;Střed @@ -1783,12 +1833,14 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Jas dle jasu odstínu L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Jas dle jasu L=f(L) TP_LABCURVE_LABEL;L*a*b* úpravy TP_LABCURVE_LCREDSK;Omezit LC na tóny červené a pleti -TP_LABCURVE_LCREDSK_TIP;Pokud je povoleno, je LC křivka omezena pouze na červené a pleťové tóny\nPokud je zakázáno, aplikuje se na všechny tóny +TP_LABCURVE_LCREDSK_TOOLTIP;Pokud je povoleno, je LC křivka omezena pouze na červené a pleťové tóny\nPokud je zakázáno, aplikuje se na všechny tóny TP_LABCURVE_RSTPROTECTION;Ochrana červených a pleťových tónů 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_LENSGEOM_LIN;Lineární +TP_LENSGEOM_LOG;Logaritmická TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automaticky vybráno TP_LENSPROFILE_CORRECTION_LCPFILE;LCP soubor TP_LENSPROFILE_CORRECTION_MANUAL;Ručně vybráno @@ -1809,7 +1861,7 @@ 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_NEUTRAL_TOOLTIP;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 TP_PCVIGNETTE_FEATHER_TOOLTIP;Rozptyl:\n0 = pouze rohy,\n50 = napůl do středu,\n100 = do středu. TP_PCVIGNETTE_LABEL;Viněta @@ -1817,6 +1869,7 @@ TP_PCVIGNETTE_ROUNDNESS;Zaoblení TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Zaoblení:\n0 = čtverec,\n50 = elipsa,\n100 = kruh. TP_PCVIGNETTE_STRENGTH;Síla TP_PCVIGNETTE_STRENGTH_TOOLTIP;Síla filtru v expozičních stupních (v rozích). +TP_PDSHARPENING_LABEL;Doostření vstupu TP_PERSPECTIVE_HORIZONTAL;Vodorovně TP_PERSPECTIVE_LABEL;Perspektiva TP_PERSPECTIVE_VERTICAL;Svisle @@ -1836,6 +1889,10 @@ 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_PREPROCWB_LABEL;Předzpracování Vyvážení bílé +TP_PREPROCWB_MODE;Mód +TP_PREPROCWB_MODE_AUTO;Automaticky +TP_PREPROCWB_MODE_CAMERA;Fotoaparát 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 @@ -1868,7 +1925,7 @@ 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;%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, 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 @@ -1882,7 +1939,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_SN;Režim SN +TP_RAW_IMAGENUM_SN;Režim Signál/Šum 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, Fuji EXR).\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 @@ -1924,7 +1981,7 @@ TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Tří průchodová dává lepší výsledky TP_RAW_SENSOR_XTRANS_LABEL;Senzory s X-Trans maticí TP_RAW_VNG4;VNG4 TP_RAW_XTRANS;X-Trans -TP_RAW_XTRANSFAST;Fast X-Trans +TP_RAW_XTRANSFAST;Rychlý X-Trans TP_RESIZE_ALLOW_UPSCALING;Povolit zvětšení TP_RESIZE_APPLIESTO;Aplikovat na: TP_RESIZE_CROPPEDAREA;Oblast ořezu @@ -1993,7 +2050,7 @@ TP_RETINEX_MLABEL;Obnovený bez závoje Min=%1 Max=%2 TP_RETINEX_MLABEL_TOOLTIP;Mělo by být poblíž min=0 max=32768\nObnovený obraz bez příměsí. TP_RETINEX_NEIGHBOR;Poloměr TP_RETINEX_NEUTRAL;Obnovit -TP_RETINEX_NEUTRAL_TIP;Obnoví původní hodnoty u všech posuvníků a křivek. +TP_RETINEX_NEUTRAL_TOOLTIP;Obnoví původní hodnoty u všech posuvníků a křivek. TP_RETINEX_OFFSET;Posun (jasu) TP_RETINEX_SCALES;Gaussův gradient TP_RETINEX_SCALES_TOOLTIP;Pokud je posuvník na nule jsou všechny průchody stejné,\nPokud je větší než nula, tak jsou Rozsah a Průměr s přibývajícími průběhy omezovány. A obráceně. @@ -2029,7 +2086,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Stupně TP_ROTATE_LABEL;Otočení TP_ROTATE_SELECTLINE;Vyznačit rovinu -TP_SAVEDIALOG_OK_TIP;Zkratka: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Zkratka: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Světla TP_SHADOWSHLIGHTS_HLTONALW;Tónový rozsah světel TP_SHADOWSHLIGHTS_LABEL;Stíny/Světla @@ -2047,10 +2104,12 @@ TP_SHARPENING_EDRADIUS;Poloměr TP_SHARPENING_EDTOLERANCE;Tolerance k hranám TP_SHARPENING_HALOCONTROL;Omezení halo efektu TP_SHARPENING_HCAMOUNT;Míra +TP_SHARPENING_ITERCHECK;Automatické omezení průchodů TP_SHARPENING_LABEL;Doostření TP_SHARPENING_METHOD;Metoda TP_SHARPENING_ONLYEDGES;Doostřit pouze hrany TP_SHARPENING_RADIUS;Poloměr +TP_SHARPENING_RADIUS_BOOST;Zvýšení poloměru rohu TP_SHARPENING_RLD;RL Dekonvoluce TP_SHARPENING_RLD_AMOUNT;Míra TP_SHARPENING_RLD_DAMPING;Útlum @@ -2110,11 +2169,17 @@ TP_WAVELET_BACKGROUND;Pozadí TP_WAVELET_BACUR;Křivka TP_WAVELET_BALANCE;Vyvážení kontrastu d/v-h TP_WAVELET_BALANCE_TOOLTIP;Změní vyvážení mezi směry vlnky: svisle-vodorovně a úhlopříčně.\nPokud je aktivován kontrast, barevnost nebo zbytkové tónové mapování je efekt díky vyvážení zesílen. -TP_WAVELET_BALCHRO;Vyvážení barev +TP_WAVELET_BALCHRO;Vyvážení barevnosti +TP_WAVELET_BALCHROM;Korekce odšumění Modrá-Červená TP_WAVELET_BALCHRO_TOOLTIP;Pokud je povoleno, křivka nebo posuvníky "Vyvážení kontrastu" ovlivňují i vyvážení barev. +TP_WAVELET_BALLUM;Korekce odšumění Bílá-Černá TP_WAVELET_BANONE;Nic TP_WAVELET_BASLI;Posuvník TP_WAVELET_BATYPE;Metoda vyvážení kontrastu +TP_WAVELET_BL;Úrovně rozmazání +TP_WAVELET_BLCURVE;Rozmazání dle úrovní +TP_WAVELET_BLURFRAME;Rozmazání +TP_WAVELET_BLUWAV;Útlum TP_WAVELET_CBENAB;Tónování a vyvážení barev TP_WAVELET_CB_TOOLTIP;Pro silnější hodnoty barevného tónování s kombinováním nebo bez rozkladu na vrstvy tónování\nPro menší hodnoty můžete změnit vyvážení bílé na barvu pozadí (obloha, ...) bez změny předního plánu, obecně více kontrastní. TP_WAVELET_CCURVE;Místní kontrast @@ -2124,22 +2189,31 @@ TP_WAVELET_CH3;Propojit kontrast úrovní TP_WAVELET_CHCU;Křivka TP_WAVELET_CHR;Barevnost - kontrast síla propojení TP_WAVELET_CHRO;Práh nasycené/pastelové +TP_WAVELET_CHROFRAME;Odšumění Barevnosti +TP_WAVELET_CHROMAFRAME;Barevnost +TP_WAVELET_CHROMCO;Hrubá barevnost +TP_WAVELET_CHROMFI;Jemná barevnost TP_WAVELET_CHRO_TOOLTIP;Nastaví úroveň vlnky, která bude prahová pro syté a pastelové barvy.\n1-x: syté\nx-9: pastelové\n\nHodnota bude ignorována pokud přesáhne množství úrovní vlnky. +TP_WAVELET_CHRWAV;Rozmazat barevnost TP_WAVELET_CHR_TOOLTIP;Upraví barevnost jako funkci "Kontrast úrovní" a "Barevnost - kontrast síla propojení" TP_WAVELET_CHSL;Posuvníky TP_WAVELET_CHTYPE;Metoda barevnost +TP_WAVELET_CLA;Čirost +TP_WAVELET_CLARI;Ostrá maska a čirost TP_WAVELET_COLORT;Neprůhlednost červená-zelená TP_WAVELET_COMPCONT;Kontrast 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_CONTFRAME;Kontrast - komprese TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Kontrast TP_WAVELET_CONTRAST_MINUS;Kontrast - TP_WAVELET_CONTRAST_PLUS;Kontrast + TP_WAVELET_CONTRA_TOOLTIP;Změní kontrast zůstatku obrazu. TP_WAVELET_CTYPE;Ovládání barevnosti +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Zakázáno pokud je přiblížení přes 300% 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 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. @@ -2155,10 +2229,13 @@ TP_WAVELET_DAUB6;D6 - standard plus TP_WAVELET_DAUB10;D10 - střední TP_WAVELET_DAUB14;D14 - Vysoká TP_WAVELET_DAUB_TOOLTIP;Změní Daubechiesové koeficienty:\nD4 = Standard,\nD14 = Nejčastěji nejlepší výkon, ale o 10% delší zpracování .\n\nOvlivňuje detekci hran a obecnou kvalitu obrázku na prvních úrovních.Ovšem kvalita není striktně vázána na koeficienty a může se lišit v závislosti na obrázku a použití. +TP_WAVELET_DIRFRAME;Směrový kontrast TP_WAVELET_DONE;Svisle TP_WAVELET_DTHR;Napříč TP_WAVELET_DTWO;Vodorovně TP_WAVELET_EDCU;Křivka +TP_WAVELET_EDEFFECT;Útlum +TP_WAVELET_EDEFFECT_TOOLTIP;Posuvník ovlivňuje rozsah hodnot kontrastu, které získají maximální efekt nástroje.\nMaximální hodnota (2.5) nástroj zakáže. 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 a maximum. TP_WAVELET_EDGE;Doostření hran @@ -2178,10 +2255,11 @@ TP_WAVELET_EDSL;Práh posuvníků TP_WAVELET_EDTYPE;Metoda místního kontrastu TP_WAVELET_EDVAL;Síla TP_WAVELET_FINAL;Finální doladění +TP_WAVELET_FINCFRAME;Finální místní kontrast TP_WAVELET_FINEST;Nejjemnější -TP_WAVELET_HIGHLIGHT;Zvýrazněný rozsah jasů +TP_WAVELET_HIGHLIGHT;Jemnější úrovně rozsahu jasu TP_WAVELET_HS1;Celý rozsah jasů -TP_WAVELET_HS2;Stíny/Světla +TP_WAVELET_HS2;Výběrový rozsah jasu TP_WAVELET_HUESKIN;Odstín pleti TP_WAVELET_HUESKIN_TOOLTIP;Spodní body nastaví začátek zóny přenosu a horní body její konec. Tam bude efekt největší.\n\nPokud potřebujete oblast výrazně změnit nebo se objevily artefakty, je nastavení vyvážení bílé nesprávné. TP_WAVELET_HUESKY;Odstín oblohy @@ -2192,9 +2270,9 @@ TP_WAVELET_LABEL;Úrovně vlnky TP_WAVELET_LARGEST;Nejhrubší TP_WAVELET_LEVCH;Barevnost TP_WAVELET_LEVDIR_ALL;Všechny úrovně ve všech směrech -TP_WAVELET_LEVDIR_INF;Méně nebo shodně s úrovní +TP_WAVELET_LEVDIR_INF;Jemnější úrovně detailů s vybranou úrovní TP_WAVELET_LEVDIR_ONE;Jedna úroveň -TP_WAVELET_LEVDIR_SUP;Nad úrovní +TP_WAVELET_LEVDIR_SUP;Hrubší úrovně detailů s vybranou úrovní TP_WAVELET_LEVELS;Úrovně vlnky TP_WAVELET_LEVELS_TOOLTIP;Vyberte počet úrovní detailu mezi které bude obrázek rozložen. Více úrovní potřebuje více paměti a zpracování trvá déle. TP_WAVELET_LEVF;Kontrast @@ -2205,11 +2283,14 @@ TP_WAVELET_LEVTWO;Úroveň 3 TP_WAVELET_LEVZERO;Úroveň 1 TP_WAVELET_LINKEDG;Spojit se sílou doostření hran TP_WAVELET_LIPST;Vylepšený algoritmus -TP_WAVELET_LOWLIGHT;Rozsah jasu a stínů +TP_WAVELET_LOWLIGHT;Hrubší úrovně rozsahu jasu +TP_WAVELET_LOWTHR_TOOLTIP;Zabraňuje zesílení šumu v jemných texturách TP_WAVELET_MEDGREINF;První úroveň TP_WAVELET_MEDI;Omezení artefaktů na modré obloze TP_WAVELET_MEDILEV;Detekce hran TP_WAVELET_MEDILEV_TOOLTIP;Pro povolení Detekce hran Vám doporučujeme:\n- zakázat úrovně s nízkým kontrastem pro vyhnutí se vzniku artefaktů,\n- použít vysoké hodnoty gradientu citlivosti.\n\nSílu můžete ovlivnit pomocí 'vylepšení' z Odšumění a vylepšení. +TP_WAVELET_MERGEC;Sloučení barevnosti +TP_WAVELET_MERGEL;Sloučení jasu TP_WAVELET_NEUTRAL;Neutrální TP_WAVELET_NOIS;Odšumění TP_WAVELET_NOISE;Odšumění a vylepšení @@ -2218,44 +2299,69 @@ TP_WAVELET_NPLOW;Nízká TP_WAVELET_NPNONE;Nic TP_WAVELET_NPTYPE;Sousední pixely TP_WAVELET_NPTYPE_TOOLTIP;Tento algoritmus zkoumá blízkost pixelu a jeho osmi sousedů. V případě menšího rozdílu je hrana zesílena. +TP_WAVELET_OFFSET_TOOLTIP;Posun změní vyvážení mezi světly a stíny.\nVyšší hodnoty zdůrazní změnu kontrastu světel, kdežto nižší hodnoty zdůrazní změnu kontrastu stínů.\nZároveň s nízkou hodnotou útlumu máte možnost si vybrat, které kontrasty budou zvýrazněny. +TP_WAVELET_OLDSH;Algoritmus používá záporné hodnoty TP_WAVELET_OPACITY;Neprůhlednost modrá-žlutá TP_WAVELET_OPACITYW;Vyrovnání kontrastu d/v-h křivka -TP_WAVELET_OPACITYWL;Finální místní kontrast +TP_WAVELET_OPACITYWL;Místní kontrast TP_WAVELET_OPACITYWL_TOOLTIP;Změní finální lokální kontrast na konci zpracování vlnky.\n\nLevá strana představuje nejmenší lokální kontrast a pravá strana zase největší lokální kontrast. TP_WAVELET_PASTEL;Barevnost pastelů TP_WAVELET_PROC;Zpracování +TP_WAVELET_PROTAB;Ochrana +TP_WAVELET_RADIUS;Poloměr Stíny - Světla +TP_WAVELET_RANGEAB;Rozsah a a b % TP_WAVELET_RE1;Zesílená TP_WAVELET_RE2;Nezměněno TP_WAVELET_RE3;Omezená -TP_WAVELET_RESCHRO;Barevnost +TP_WAVELET_RESBLUR;Jas rozmazání +TP_WAVELET_RESBLURC;Barevnost rozmazání +TP_WAVELET_RESBLUR_TOOLTIP;Zakázáno pokud je přiblížení přes 500% +TP_WAVELET_RESCHRO;Intenzita TP_WAVELET_RESCON;Stíny TP_WAVELET_RESCONH;Světla TP_WAVELET_RESID;Zůstatek obrazu TP_WAVELET_SAT;Nasycená barevnost TP_WAVELET_SETTINGS;Nastavení vlnky +TP_WAVELET_SHA;Ostrá maska +TP_WAVELET_SHFRAME;Stíny/Světla +TP_WAVELET_SHOWMASK;Ukázat vlnkovou 'masku' +TP_WAVELET_SIGMA;Útlum +TP_WAVELET_SIGMAFIN;Útlum +TP_WAVELET_SIGMA_TOOLTIP;Efekt posuvníků kontrastu je silnější u detailů se středními hodnotami kontrastu, a slabší u detailů s vysokými nebo nízkými hodnotami kontrastu.\n Tímto posuvníkem můžete kontrolovat jak rychle je potlačen efekt u extrémních hodnot kontrastu.\n Čím výše je posuvník nastaven, tím širší je rozsah hodnot kontrastů u kterých nastane silnější změna s větší šancí na vytvoření artefaktů.\n Čím je níže, tím přesněji bude účinek aplikován na úzkýrozsah hodnot kontrastu. TP_WAVELET_SKIN;Ochrana: zaměření na pleťové tóny TP_WAVELET_SKIN_TOOLTIP;Hodnota -100: zaměřeno na pleťové tóny.\nHodnota 0: se všemi tóny je zacházeno stejně.\nHodnota +100: pleťové tóny jsou chráněny zatímco všechny ostatní tóny jsou ovlivněny. TP_WAVELET_SKY;Ochrana a zaměření na tóny oblohy TP_WAVELET_SKY_TOOLTIP;Hodnota -100: zaměřeno na pleťové tóny.\nHodnota 0: se všemi tóny je zacházeno stejně.\nHodnota +100: pleťové tóny jsou chráněny zatímco všechny ostatní tóny jsou ovlivněny. +TP_WAVELET_SOFTRAD;Jemný poloměr TP_WAVELET_STREN;Síla TP_WAVELET_STRENGTH;Síla TP_WAVELET_SUPE;Extra TP_WAVELET_THR;Práh stínů -TP_WAVELET_THRESHOLD;Úrovně světel -TP_WAVELET_THRESHOLD2;Úrovně stínů -TP_WAVELET_THRESHOLD2_TOOLTIP;Pouze úrovně 9 a 9 mínus hodnota budou ovlivněny rozsahem stínů a jasů.Ostatní úrovně budou plně zpracovány. Maximální možná úroveň je omezena na nejvyšší hodnotu úrovně (9 - nejvyšší úroveň). -TP_WAVELET_THRESHOLD_TOOLTIP;Pouze úrovně pod vybranou hodnotou budou ovlivněny rozsahem zvýraznění jasů.Ostatní úrovně budou plně zpracovány. Zde vybraná hodnota omezí nejvyšší možnou hodnotu úrovně stínů. +TP_WAVELET_THRESHOLD;Jemnější úrovně +TP_WAVELET_THRESHOLD2;Hrubší úrovně +TP_WAVELET_THRESHOLD2_TOOLTIP;Pouze úrovně mezi 9 a 9 mínus hodnota budou ovlivněny rozsahem jasu stínů. Ostatní úrovně budou upraveny celé. Nejvyšší možná úroveň je omezena hodnotou zvýrazněné úrovně (9 mínus hodnota zvýrazněné úrovně). Pouze úrovně mezi vybranou hodnotou a úrovní 9/Extra budou ovlivněny Hrubým rozsahem úrovní.\nVšechny ostatní úrovně budou ovlivněny v celém rozsahu jasu, pokud nebudou omezeny nastavením Jemnými úrovněmi.\nNejnižší možná úroveň, kterou bude algoritmus zvažovat, je omezená hodnotou Jemných úrovní. +TP_WAVELET_THRESHOLD_TOOLTIP;Pouze úrovně mimo vybranou hodnotu budou ovlivněny rozsahem jasu stínů. Ostatní úrovně budou upraveny celé. Zde vybraná hodnota omezuje nejvyšší možnou hodnotu úrovní stínů. Všechny úrovně od úrovně jedna až po vybranou úroveň ovlivněny Jemným rozsahem úrovní.\nVšechny ostatní úrovně budou ovlivněny v celém rozsahu jasu, pokud nebudou omezeny nastavením Hrubými úrovněmi.\nZde vybraná hodnota, se stane nejnižší možnou úrovní Hrubých úrovní. TP_WAVELET_THRH;Práh světel -TP_WAVELET_TILESBIG;Velké dlaždice +TP_WAVELET_TILESBIG;Dlaždice TP_WAVELET_TILESFULL;Celý obrázek TP_WAVELET_TILESIZE;Metoda dlaždicování -TP_WAVELET_TILESLIT;Malé dlaždice TP_WAVELET_TILES_TOOLTIP;Zpracování celého obrázku vede k lepší kvalitě a je doporučováno. Naproti tomu dlaždice jsou náhradní řešení pro uživatele s nedostatkem paměti. Paměťové nároky najdete na RawPedii. +TP_WAVELET_TMEDGS;Zachování hran +TP_WAVELET_TMSCALE;Měřítko TP_WAVELET_TMSTRENGTH;Síla komprese -TP_WAVELET_TMSTRENGTH_TOOLTIP;Ovládá sílu mapování tónů nebo kontrast komprese zůstatku obrázku. Pokud je hodnota rozdílná od nuly, budou posuvníky Síla a Gama v nástroji Mapování tónů v kartě Expozice neaktivní. +TP_WAVELET_TMSTRENGTH_TOOLTIP;Kontroluje sílu tónového mapování nebo komprese kontrastu zůstatku obrazu. TP_WAVELET_TMTYPE;Metoda komprese TP_WAVELET_TON;Tónování +TP_WAVELET_TONFRAME;Vyloučené barvy +TP_WAVELET_USH;Nic +TP_WAVELET_USHARP;Metoda čirosti +TP_WAVELET_USH_TOOLTIP;Pokud vyberete Ostrou masku, bude nastavení vlnky automaticky změněno na:\nPozadí=černá, zpracování=pod, úroveň=3 — ta může být změněna v rozmezí 1 až 4.\n\nPokud vyberete Čirost, bude nastavení vlnky automaticky změněno na:\nPozadí=zůstatek, zpracování=nad, úroveň=7 — ta může být změněna v rozmezí 5 až 10 úrovní vlnky. +TP_WAVELET_WAVLOWTHR;Práh nízkého kontrastu +TP_WAVELET_WAVOFFSET;Posun TP_WBALANCE_AUTO;Automaticky +TP_WBALANCE_AUTOITCGREEN;Teplotní korelace +TP_WBALANCE_AUTOOLD;RGB šedé +TP_WBALANCE_AUTO_HEADER;Automaticky TP_WBALANCE_CAMERA;Fotoaparát TP_WBALANCE_CLOUDY;Zataženo TP_WBALANCE_CUSTOM;Vlastní @@ -2297,6 +2403,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Použijte pipetu pro nabrání vyvážení bílé z neutrální oblasti v náhledu. +TP_WBALANCE_STUDLABEL;Faktor korelace: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;Zobrazí vypočítanou korelaci metody Student\nNižší hodnoty jsou lepší, přičemž pro <0.005 jsou výborné\n<0.01 jsou dobré a >0.5 jsou špatné.\nNízké hodnoty neznamenají, že je vyvážení bílé dobré: pro nestandardní světelné podmínky jsou výsledky nepředvídatelné.\nHodnota 1000 znamená, že byl použit předchozí výpočet a výsledky jsou pravděpodobně dobré. 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 @@ -2316,34 +2424,1695 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? -!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? -!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. -!FILEBROWSER_POPUPREMOVE;Delete permanently -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. -!GENERAL_HELP;Help -!HISTORY_MSG_494;Capture Sharpening -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only -!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative -!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values -!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius -!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!PARTIALPASTE_FILMNEGATIVE;Film Negative -!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -!TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick neutral spots -!TP_FILMNEGATIVE_RED;Red ratio -!TP_PDSHARPENING_LABEL;Capture Sharpening -!TP_SHARPENING_ITERCHECK;Auto limit iterations -!TP_SHARPENING_RADIUS_BOOST;Corner radius boost +!FILEBROWSER_POPUPINSPECT;Inspect +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_SPOT;Spot removal +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_CROP_GTCENTEREDSQUARE;Centered square +!TP_DEHAZE_SATURATION;Saturation +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_OUT_LEVEL;Output level +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk new file mode 100644 index 000000000..2cfbf4e27 --- /dev/null +++ b/rtdata/languages/Dansk @@ -0,0 +1,4073 @@ +#01 2022-04-21 mogensjaeger (github), initial danish translation + +ABOUT_TAB_BUILD;Version +ABOUT_TAB_CREDITS;Credits +ABOUT_TAB_LICENSE;Licens +ABOUT_TAB_RELEASENOTES;Udgivelses noter +ABOUT_TAB_SPLASH;Splash +ADJUSTER_RESET_TO_DEFAULT;Click - nulstil til standardværdier.\nCtrl+click - nulstil til startværdier. +BATCH_PROCESSING;Batch redigering +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_LEFT_TAN;LT: +CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Fleksibel +CURVEEDITOR_CURVE;Kurve +CURVEEDITOR_CUSTOM;Standard +CURVEEDITOR_DARKS;Mørke +CURVEEDITOR_EDITPOINT_HINT;Aktivér redigering af node ind/ud værdier.\n\nHøjreklik på en node for at vælge den.\nHøjreklik på et tomt område for at fravælge noden. +CURVEEDITOR_HIGHLIGHTS;Højlys +CURVEEDITOR_Kurver;Kurver +CURVEEDITOR_LIGHTS;Lyse partier +CURVEEDITOR_LINEAR;Lineær +CURVEEDITOR_LOADDLGLABEL;Indlæs kurve... +CURVEEDITOR_MINMAXCPOINTS;Equalizer +CURVEEDITOR_NURBS;Control cage +CURVEEDITOR_PARAMETRIC;Parametrisk +CURVEEDITOR_SAVEDLGLABEL;Gem kurve... +CURVEEDITOR_SHADOWS;Mørke partier +CURVEEDITOR_TOOLTIPCOPY;Kopier nuværende kurve til udklipsholderen. +CURVEEDITOR_TOOLTIPLINEAR;Nulstil kurve til lineær. +CURVEEDITOR_TOOLTIPLOAD;Indlæs kurve fra fil. +CURVEEDITOR_TOOLTIPPASTE;Overfør kurve fra udklipsholderen. +CURVEEDITOR_TOOLTIPSAVE;Gem nuværende kurve. +CURVEEDITOR_TYPE;Type: +DIRBROWSER_FOLDERS;Mapper +DONT_SHOW_AGAIN;Vis ikke denne besked igen. +DYNPROFILEEDITOR_DELETE;Slet +DYNPROFILEEDITOR_EDIT;Redigér +DYNPROFILEEDITOR_EDIT_RULE;Redigér Dynamisk Profil Regel +DYNPROFILEEDITOR_ENTRY_TOOLTIP;Matchningen er ufølsom over for store og små bogstaver. \nBrug "re:" præfiks for at indtaste \net almindeligt udtryk. +DYNPROFILEEDITOR_IMGTYPE_ANY;Alle mulige +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard +DYNPROFILEEDITOR_MOVE_DOWN;Flyt ned +DYNPROFILEEDITOR_MOVE_UP;Flyt op +DYNPROFILEEDITOR_NEW;Ny +DYNPROFILEEDITOR_NEW_RULE;Ny Dynamisk Profil Regel +DYNPROFILEEDITOR_PROFILE;Redigeringsprofil +EDITWINDOW_TITLE;Billede Redigér +EDIT_OBJECT_TOOLTIP;Viser en widget i forhåndsvisningsvinduet, som lader dig justere dette værktøj. +EDIT_PIPETTE_TOOLTIP;For at tilføje et justeringspunkt til kurven, skal du holde Ctrl-tasten nede, mens du venstreklikker på det ønskede sted i billedeksemplet. \nFor at justere punktet, hold Ctrl-tasten nede, mens du venstreklikker på det tilsvarende område i forhåndsvisningen, slip derefter Ctrl-tasten (medmindre du ønsker finkontrol), og mens du stadig holder venstre museknap nede, bevæges musen op eller ned for at flytte punktet op eller ned i kurven. +EXIFFILTER_APERTURE;Blænde +EXIFFILTER_CAMERA;Kamera +EXIFFILTER_EXPOSURECOMPENSATION;Eksponerings kompensation (EV) +EXIFFILTER_FILETYPE;Fil type +EXIFFILTER_FOCALLEN;Brændvidde +EXIFFILTER_IMAGETYPE;Billedtype +EXIFFILTER_ISO;ISO +EXIFFILTER_LENS;Objektiv +EXIFFILTER_METADATAFILTER;Aktivér metadatafiltre +EXIFFILTER_SHUTTER;Lukker +EXIFPANEL_ADDEDIT;Tilføj/Rediger +EXIFPANEL_ADDEDITHINT;Tilføj nyt mærkat eller rediger mærkat. +EXIFPANEL_ADDTAGDLG_ENTERVALUE;Indsæt værdi +EXIFPANEL_ADDTAGDLG_SELECTTAG;Vælg mærkat +EXIFPANEL_ADDTAGDLG_TITLE;Tilføj/Rediger Mærkat +EXIFPANEL_KEEP;Behold +EXIFPANEL_KEEPHINT;Behold de valgte mærkater, når du skriver outputfil. +EXIFPANEL_REMOVE;Fjern +EXIFPANEL_REMOVEHINT;Fjern de valgte mærkater, når du skriver outputfil. +EXIFPANEL_RESET;Nulstil +EXIFPANEL_RESETALL;Nulstil Alt +EXIFPANEL_RESETALLHINT;Nulstil alle mærkater til deres oprindelige værdier. +EXIFPANEL_RESETHINT;Nulstil alle valgte mærkater til deres oprindelige værdier. +EXIFPANEL_SHOWALL;Vis alt +EXIFPANEL_SUBDIRECTORY;Undermappe +EXPORT_BYPASS;Redigeringstrin der skal fravælges +EXPORT_BYPASS_ALL;Vælg / fravælg alt +EXPORT_BYPASS_DEFRINGE;Spring over Defringe +EXPORT_BYPASS_DIRPYRDENOISE;Spring over støjreduktion +EXPORT_BYPASS_DIRPYREQUALIZER;Spring over Kontrast ved Detalje Niveauer +EXPORT_BYPASS_EQUALIZER;Spring over Wavelet Niveauer +EXPORT_BYPASS_RAW_CA;Spring over [raw] Korrektion af Kromatisk Afvigelse +EXPORT_BYPASS_RAW_CCSTEPS;Spring over [raw] Undertrykkelse af Falsk Farve +EXPORT_BYPASS_RAW_DCB_ENHANCE;Spring over [raw] DCB Forbedrings Skridt +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Spring over [raw] DCB Iterationer +EXPORT_BYPASS_RAW_DF;Spring over [raw] Mørk-ramme +EXPORT_BYPASS_RAW_FF;Spring over [raw] Fladt-Felt +EXPORT_BYPASS_RAW_GREENTHRESH;Spring over [raw] Grøn ligevægt +EXPORT_BYPASS_RAW_LINENOISE;Spring over [raw] Linie Støj Filter +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Spring over [raw] LMMSE Forbedrings Skridt +EXPORT_BYPASS_SHARPENEDGE;Spring over Kantskærpning +EXPORT_BYPASS_SHARPENING;Spring over Skærpning +EXPORT_BYPASS_SHARPENMICRO;Spring over Mikrokontrast +EXPORT_FASTEXPORTOPTIONS;Hurtige Eksportmuligheder +EXPORT_INSTRUCTIONS;Hurtige eksportmuligheder giver tilsidesættelser for at omgå tids- og ressourcekrævende udviklingsindstillinger og for at køre kø-redigering ved at bruge de hurtige eksportindstillinger i stedet. Denne metode anbefales til hurtigere generering af billeder med lavere opløsning, når hastighed er en prioritet, eller når der ønskes ændret output for et eller mange billeder uden at foretage ændringer af deres gemte fremkaldelsesparametre. +EXPORT_MAXHEIGHT;Maksimal højde: +EXPORT_MAXWIDTH;Maksimal bredde: +EXPORT_PIPELINE;Redigeringspipeline +EXPORT_PUTTOQUEUEFAST; Sæt i kø for hurtig eksport +EXPORT_RAW_DMETHOD;Demosaisk metode +EXPORT_USE_FAST_PIPELINE;Dedikeret (fuld redigering på ændret billedstørrelse) +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Brug en dedikeret redigeringspipeline til billeder i hurtig eksporttilstand, der bruger hastighed frem for kvalitet. Ændring af størrelsen på billedet udføres så tidligt som muligt, i stedet for at gøre det til sidst som i den normale pipeline. Hastighedsforbedringen kan være betydelig, men vær forberedt på at se artefakter, og en generel forringelse af outputkvaliteten. +EXPORT_USE_NORMAL_PIPELINE;Standard (spring over enkelte trin, ændre størrelse til sidst) +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;kø-bearbejdet +FILEBROWSER_APPLYPROFILE;Anvend +FILEBROWSER_APPLYPROFILE_PARTIAL;Anvend - delvist +FILEBROWSER_AUTODARKFRAME;Automatisk mørk ramme +FILEBROWSER_AUTOFLATFIELD;Automatisk fladt-felt +FILEBROWSER_BROWSEPATHBUTTONHINT;Klik for at åbne den angivne sti, genindlæs mappen og anvend "find" nøgleord. +FILEBROWSER_BROWSEPATHHINT;Skriv en sti at navigere til.\n\nTastaturgenveje:\nCtrl-o for at fokusere på stiens tekstboks.\nEnter / Ctrl-Enter at gennemse der;\nEsc for at rydde ændringer.\nShift-Esc for at fjerne fokus.\n\nStigenveje:\n~ - brugers hjemmemappe.\n! - brugers billedmappe +FILEBROWSER_CACHE;Cache +FILEBROWSER_CACHECLEARFROMFULL;Ryd alt inklusive cachelagrede profiler +FILEBROWSER_CACHECLEARFROMPARTIAL;Ryd alt undtagen cachelagrede profiler +FILEBROWSER_CLEARPROFILE;Ryd +FILEBROWSER_COLORLABEL_TOOLTIP;Farvemærkat.\n\nBrug rullemenuen eller genveje:\nShift-Ctrl-0 Ingen farver\nShift-Ctrl-1 Rød\nShift-Ctrl-2 Gul\nShift-Ctrl-3 Grøn\nShift-Ctrl-4 Blå\nShift-Ctrl-5 Lilla +FILEBROWSER_COPYPROFILE;Kopiér +FILEBROWSER_CURRENT_NAME;Nuværende navn: +FILEBROWSER_DARKFRAME;Mørk ramme +FILEBROWSER_DELETEDIALOG_ALL;Er du sikker på, at du permanent vil slette alle %1 filer i papirkurven? +FILEBROWSER_DELETEDIALOG_HEADER;Bekræftelse af filsletning: +FILEBROWSER_DELETEDIALOG_SELECTED;Er du sikker på, at du permanent vil slette de valgte %1 filer? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Er du sikker på, at du permanent vil slette de valgte %1 filer, inklusive en købehandlet version? +FILEBROWSER_EMPTYTRASH;Tøm papirkurven +FILEBROWSER_EMPTYTRASHHINT;Permanent slet alle filer i papirkurven. +FILEBROWSER_EXTPROGMENU;Åben med +FILEBROWSER_FLATFIELD;Fladt-Felt +FILEBROWSER_MOVETODARKFDIR;Flyt til mappen med mørke-rammer +FILEBROWSER_MOVETOFLATFIELDDIR;Flyt til mappen med flade-felter +FILEBROWSER_NEW_NAME;Nyt navn: +FILEBROWSER_OPENDEFAULTVIEWER;Windows standard viser (kø-bearbejdet) +FILEBROWSER_PARTIALPASTEPROFILE;Sæt ind - partiel +FILEBROWSER_PASTEPROFILE;Sæt ind +FILEBROWSER_POPUPCANCELJOB;Annulér job +FILEBROWSER_POPUPCOLORLABEL;Farvemærkat +FILEBROWSER_POPUPCOLORLABEL0;Mærkat: Ingen +FILEBROWSER_POPUPCOLORLABEL1;Mærkat: Rød +FILEBROWSER_POPUPCOLORLABEL2;Mærkat: Gul +FILEBROWSER_POPUPCOLORLABEL3;Mærkat: Grøn +FILEBROWSER_POPUPCOLORLABEL4;Mærkat: Blå +FILEBROWSER_POPUPCOLORLABEL5;Mærkat: Lilla +FILEBROWSER_POPUPCOPYTO;Kopiér til... +FILEBROWSER_POPUPFILEOPERATIONS;Filhandlinger +FILEBROWSER_POPUPMOVEEND;Flyt til slutningen af køen +FILEBROWSER_POPUPMOVEHEAD;Flyt til begyndelsen af køen +FILEBROWSER_POPUPMOVETO;Flyt til... +FILEBROWSER_POPUPOPEN;Åbn +FILEBROWSER_POPUPOPENINEDITOR;Åbn i Redigering +FILEBROWSER_POPUPPROCESS;Sæt i kø +FILEBROWSER_POPUPPROCESSFAST;Sæt i kø (hurtig eksport) +FILEBROWSER_POPUPPROFILEOPERATIONS;Redigering af profiloperationer +FILEBROWSER_POPUPRANK;Rang +FILEBROWSER_POPUPRANK0;Ikke rangeret +FILEBROWSER_POPUPRANK1;Rang 1 * +FILEBROWSER_POPUPRANK2;Rang 2 ** +FILEBROWSER_POPUPRANK3;Rang 3 *** +FILEBROWSER_POPUPRANK4;Rang 4 **** +FILEBROWSER_POPUPRANK5;Rang 5 ***** +FILEBROWSER_POPUPREMOVE;Slet permanent +FILEBROWSER_POPUPREMOVEINCLPROC;Slet permanent, inklusive kø-bearbejdet version +FILEBROWSER_POPUPRENAME;Omdøb +FILEBROWSER_POPUPSELECTALL;Vælg alt +FILEBROWSER_POPUPTRASH;Flyt til papirkurv +FILEBROWSER_POPUPUNRANK;Slet rang +FILEBROWSER_POPUPUNTRASH;Flyt fra papirkurv +FILEBROWSER_QUERYBUTTONHINT;Ryd søgeforespørgslen +FILEBROWSER_QUERYHINT;Indtast filnavne til at søge efter. Understøtter delvise filnavne. Adskil søgetermerne ved hjælp af kommaer, f.eks.\n1001,1004,1199\n\nEkskluder søgetermer ved at sætte !=\nforan, f.eks.\n!=1001,1004,1199\n\nGenveje:\nCtrl-f - fokuser på søgefeltet,\nEnter - søg,\n Esc - ryd søgefeltet,\nShift-Esc - ufokuser søgefeltet. +FILEBROWSER_QUERYLABEL; Søg: +FILEBROWSER_RANK1_TOOLTIP;Rang 1 *\nGenvej: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Rang 2 *\nGenvej: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Rang 3 *\nGenvej: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Rang 4 *\nGenvej: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Rang 5 *\nGenvej: Shift-5 +FILEBROWSER_RENAMEDLGLABEL;Omdøb fil +FILEBROWSER_RESETDEFAULTPROFILE;Nulstil til standard +FILEBROWSER_SELECTDARKFRAME;Vælg mørk-ramme... +FILEBROWSER_SELECTFLATFIELD;Vælg fladt-felt... +FILEBROWSER_SHOWCOLORLABEL1HINT;Vis billeder mærket Rød.\nGenvej: Alt-1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Vis billeder mærket Gul.\nGenvej: Alt-2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Vis billeder mærket Grøn.\nGenvej: Alt-3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Vis billeder mærket Blå.\nGenvej: Alt-4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Vis billeder mærket Lilla.\nGenvej: Alt-5 +FILEBROWSER_SHOWDIRHINT;Ryd alle filtre.\nGenvej: d +FILEBROWSER_SHOWEDITEDHINT;Vis bearbejdede billeder.\nGenvej: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Vis ikke-bearbejdede billeder.\nGenvej: 6 +FILEBROWSER_SHOWEXIFINFO;Vis Exif info.\n\nGenveje:\ni - Tilstand med flere redigerings-faneblade,\nAlt-i - Tilstand med enkelt redigerings-faneblad. +FILEBROWSER_SHOWNOTTRASHHINT;Vis kun billeder, der ikke er i papirkurven. +FILEBROWSER_SHOWORIGINALHINT;Vis kun originale billeder.\n\nNår der findes flere billeder med det samme filnavn, men med forskellige suffikser, er den, der betragtes som original, den, hvis suffiks er nærmest øverst på listen over Fortolkede suffikser i Præferencer > Filbrowser > Fortolkede suffikser. +FILEBROWSER_SHOWRANK1HINT;Vis billeder rangeret som 1-stjernet.\nGenvej: 1 +FILEBROWSER_SHOWRANK2HINT;Vis billeder rangeret som 2-stjernet.\nGenvej: 2 +FILEBROWSER_SHOWRANK3HINT;Vis billeder rangeret som 3-stjernet.\nGenvej: 3 +FILEBROWSER_SHOWRANK4HINT;Vis billeder rangeret som 4-stjernet.\nGenvej: 4 +FILEBROWSER_SHOWRANK5HINT;Vis billeder rangeret som 5-stjernet.\nGenvej: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Vis gemte billeder.\nGenvej: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Vis ikke-gemte billeder.\nGenvej: Alt-6 +FILEBROWSER_SHOWTRASHHINT;Vis indholdet af papirkurven.\nGenvej: Ctrl-t +FILEBROWSER_SHOWUNCOLORHINT;Vis billeder uden farvemærkat.\nGenvej: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;Vis ikke-rangerede billeder.\nGenvej: 0 +FILEBROWSER_THUMBSIZE;Thumbnail størrelse +FILEBROWSER_UNRANK_TOOLTIP;Slet rang.\nGenvej: Shift-0 +FILEBROWSER_ZOOMINHINT;Øg thumbnail størrelse.\n\nGenveje:\n+ - Tilstand med flere redigerings-faneblade,\nAlt-+ - Tilstand med enkelt redigerings-faneblad. +FILEBROWSER_ZOOMOUTHINT;Formindsk thumbnail størrelse.\n\nGenveje:\n- - Tilstand med flere redigerings-faneblade,\nAlt-- - Tilstand med enkelt redigerings-faneblad. +FILECHOOSER_FILTER_ANY;Alle filer +FILECHOOSER_FILTER_COLPROF;Farve profiler (*.icc) +FILECHOOSER_FILTER_CURVE;Kurve filer +FILECHOOSER_FILTER_LCP;Objektivkorrektionsprofiler +FILECHOOSER_FILTER_PP;Redigeringsprofiler +FILECHOOSER_FILTER_SAME;Samme format som nuværende foto +FILECHOOSER_FILTER_TIFF;TIFF filer +GENERAL_ABOUT;Om +GENERAL_AFTER;Efter +GENERAL_APPLY;Tilføj +GENERAL_ASIMAGE;Som billede +GENERAL_AUTO;Automatisk +GENERAL_BEFORE;Før +GENERAL_CANCEL;Annulér +GENERAL_CLOSE;Luk +GENERAL_CURRENT;Nuværende +GENERAL_DISABLE;Deaktivér +GENERAL_DISABLED;Deaktiveret +GENERAL_ENABLE;Aktivér +GENERAL_ENABLED;Aktiveret +GENERAL_FILE;Fil +GENERAL_HELP;Hjælp +GENERAL_LANDSCAPE;Landskab +GENERAL_NA;N/A +GENERAL_NO;Nej +GENERAL_NONE;Ingen +GENERAL_OK;OK +GENERAL_OPEN;Åben +GENERAL_PORTRAIT;Portræt +GENERAL_RESET;Nulstil +GENERAL_SAVE;Gem +GENERAL_SAVE_AS;Gem som... +GENERAL_SLIDER;Skyder +GENERAL_UNCHANGED;(Uændret) +GENERAL_WARNING;Advarsel +GIMP_PLUGIN_INFO;Velkommen til RawTherapee’s GIMP-plugin!\nNår du er færdig med at bearbejde billedet, skal du blot lukke RawTherapees hovedvindue, og billedet importeres automatisk i GIMP. +HISTOGRAM_TOOLTIP_B;Vis/Skjul blåt histogram. +HISTOGRAM_TOOLTIP_BAR;Vis/Skjul RGB indikatorbjælke. +HISTOGRAM_TOOLTIP_CHRO;Vis/Skjul kromaticitet histogram. +HISTOGRAM_TOOLTIP_G;Vis/Skjul grøn histogram. +HISTOGRAM_TOOLTIP_L;Vis/Skjul CIELab luminans histogram. +HISTOGRAM_TOOLTIP_MODE;Skift mellem lineær, log-lineær og log-log-skalering af histogrammet. +HISTOGRAM_TOOLTIP_R;Vis/Skjul rødt histogram. +HISTORY_CHANGED;Ændret +HISTORY_CUSTOMCURVE;Standardkurve +HISTORY_FROMCLIPBOARD;Fra udklipsholder +HISTORY_LABEL;Historik +HISTORY_MSG_1;Foto indlæst +HISTORY_MSG_3;PP3 ændret +HISTORY_MSG_4;Historik browsing +HISTORY_MSG_5;Eksponering - Lyshed +HISTORY_MSG_6;Eksponering - Kontrast +HISTORY_MSG_7;Eksponering - Sort +HISTORY_MSG_8;Eksponering - Kompensation +HISTORY_MSG_9;Eksponering - Højlyskompression +HISTORY_MSG_10;Eksponering - Skyggekompression +HISTORY_MSG_11;Eksponering - Tonekurve 1 +HISTORY_MSG_12;Eksponering - Autoniveauer +HISTORY_MSG_13;Eksponering - Klip +HISTORY_MSG_14;L*a*b* - Lyshed +HISTORY_MSG_15;L*a*b* - Kontrast +HISTORY_MSG_19;L*a*b* - L* kurve +HISTORY_MSG_20;Skærpe +HISTORY_MSG_21;USM - Radius +HISTORY_MSG_22;USM - Mængde +HISTORY_MSG_23;USM - Tærskel +HISTORY_MSG_24;USM – Skærp kun kanter +HISTORY_MSG_25;USM - Kantdetekteringsradius +HISTORY_MSG_26;USM - Kanttolerance +HISTORY_MSG_27;USM - Glorie kontrol +HISTORY_MSG_28;USM - Glorie kontrol mængde +HISTORY_MSG_29;Skærpe - Metode +HISTORY_MSG_30;RLD - Radius +HISTORY_MSG_31;RLD - Mængde +HISTORY_MSG_32;RLD - Dæmpning +HISTORY_MSG_33;RLD - Gentagelser +HISTORY_MSG_34;Objektivkorrektion - Forvrængning +HISTORY_MSG_35;Objektivkorrektion - Vignetering +HISTORY_MSG_36;Objektivkorrektion - CA +HISTORY_MSG_37;Eksponering - Autoniveauer +HISTORY_MSG_38;Hvidbalance - Metode +HISTORY_MSG_39;WB - Temperatur +HISTORY_MSG_40;WB - Farvenuance +HISTORY_MSG_41;Eksponering - Tonekurve 1 mode +HISTORY_MSG_42;Eksponering - Tonekurve 2 +HISTORY_MSG_43;Eksponering - Tonekurve 2 mode +HISTORY_MSG_48;DCP - Tonekurve +HISTORY_MSG_49;DCP lyskilde +HISTORY_MSG_50;Skygger/Højlys +HISTORY_MSG_51;S/H - Højlys +HISTORY_MSG_52;S/H - Skygger +HISTORY_MSG_53;S/H – Højlysenes tonale bredde +HISTORY_MSG_54;S/H – Skyggernes tonale bredde +HISTORY_MSG_56;S/H - Radius +HISTORY_MSG_57;Grov rotation +HISTORY_MSG_58;Vandret vending +HISTORY_MSG_59;Lodret vending +HISTORY_MSG_60;Rotation +HISTORY_MSG_61;Auto-udfyldning +HISTORY_MSG_62;Forvrængningskorrektion +HISTORY_MSG_63;Snapshot valgt +HISTORY_MSG_64;Beskær +HISTORY_MSG_65;CA korrektion +HISTORY_MSG_66;Eksponering – Højlys rekonstruktion +HISTORY_MSG_68;Eksponering - HLR metode +HISTORY_MSG_69;Arbejdsfarverum +HISTORY_MSG_70;Output farverum +HISTORY_MSG_71;Input farverum +HISTORY_MSG_72;VC - Mængde +HISTORY_MSG_73;Kanal Mikser +HISTORY_MSG_74;Ændre størrelse - Skala +HISTORY_MSG_75;Ændre størrelse - Metode +HISTORY_MSG_76;Exif metadata +HISTORY_MSG_77;IPTC metadata +HISTORY_MSG_79;Ændre størrelse - Bredde +HISTORY_MSG_80;Ændre størrelse - Højde +HISTORY_MSG_81;Ændre størrelse +HISTORY_MSG_82;Profil ændret +HISTORY_MSG_84;Perspektivkorrektion +HISTORY_MSG_85;Objektivkorrektion - LCP fil +HISTORY_MSG_86;RGB Kurver - Luminanstilstand +HISTORY_MSG_87;Impuls støjreduktion +HISTORY_MSG_88;Impuls Støjreduktion tærskel +HISTORY_MSG_89;Støjreduktion +HISTORY_MSG_90;Støjreduktion - Luminans +HISTORY_MSG_91;Støjreduktion - Chrominance master +HISTORY_MSG_92;Støjreduktion - Gamma +HISTORY_MSG_93;KeDN - Værdi +HISTORY_MSG_94;Kontrast ved Detaljeniveauer +HISTORY_MSG_95;L*a*b* - Kromaticitet +HISTORY_MSG_96;L*a*b* - a* kurve +HISTORY_MSG_97;L*a*b* - b* kurve +HISTORY_MSG_98;Demosaiking metode +HISTORY_MSG_99;Varm-pixel filter +HISTORY_MSG_100;Eksponering - Mætning +HISTORY_MSG_101;HSV - Farvetone +HISTORY_MSG_102;HSV - Mætning +HISTORY_MSG_103;HSV - Værdi +HISTORY_MSG_104;HSV Equalizer +HISTORY_MSG_105;Defringe +HISTORY_MSG_106;Defringe - Radius +HISTORY_MSG_107;Defringe - Tærskel +HISTORY_MSG_108;Eksponering - HLC tærskel +HISTORY_MSG_109;Ændr størrelse - Afgrænsningsboks +HISTORY_MSG_110;Ændr størrelse - Gælder for +HISTORY_MSG_111;L*a*b* - Undgå farveforskydning +HISTORY_MSG_112;--ubrugt-- +HISTORY_MSG_113;L*a*b* - Rød/hud beskyt. +HISTORY_MSG_114;DCB gentagelser +HISTORY_MSG_115;Undertrykkelse af forkerte farver +HISTORY_MSG_116;DCB forbedring +HISTORY_MSG_117;Raw CA korrektion - Rød +HISTORY_MSG_118;Raw CA korrektion - Blå +HISTORY_MSG_119;Linje støjfilter +HISTORY_MSG_120;Grøn ligevægt +HISTORY_MSG_121;Raw CA Korrektion - Auto +HISTORY_MSG_122;Mørk-Ramme - Auto-udvælgelse +HISTORY_MSG_123;Mørk-Ramme - Fil +HISTORY_MSG_124;Hvidpunkts korrektion +HISTORY_MSG_126;Fladt-Felt - Fil +HISTORY_MSG_127;Fladt-Felt - Automatisk valg +HISTORY_MSG_128;Fladt-Felt - Sløringsradius +HISTORY_MSG_129;Fladt-Felt - Sløringstype +HISTORY_MSG_130;Automatisk forvrængningskorrektion +HISTORY_MSG_137;Sort niveau - Grøn 1 +HISTORY_MSG_138;Sort niveau - Rød +HISTORY_MSG_139;Sort niveau - Blå +HISTORY_MSG_140;Sort niveau - Grøn 2 +HISTORY_MSG_141;Sort niveau – Sammenkæd grønne +HISTORY_MSG_142;Skærpen kanter - Gentagelser +HISTORY_MSG_143;Skærpen kanter - Mængde +HISTORY_MSG_144;Mikrokontrast - Mængde +HISTORY_MSG_145;Mikrokontrast - Ensartethed +HISTORY_MSG_146;Kantskærpning +HISTORY_MSG_147;Skærpen kanter – Kun luminans +HISTORY_MSG_148;Mikrokontrast +HISTORY_MSG_149;Mikrokontrast - 3×3 matrix +HISTORY_MSG_150;Efter-demosaiking artefakt/støjreduktion +HISTORY_MSG_151;Vibrance +HISTORY_MSG_152;Vibrance - Pastel toner +HISTORY_MSG_153;Vibrance - Mættede toner +HISTORY_MSG_154;Vibrance - Beskyt hud-toner +HISTORY_MSG_155;Vibrance - Undgå farveforskydning +HISTORY_MSG_156;Vibrance - Sammenkæd pastel/mættet +HISTORY_MSG_157;Vibrance - P/S tærskel +HISTORY_MSG_158;Tonekortlægning - Styrke +HISTORY_MSG_159;Tonekortlægning - Kantstopper +HISTORY_MSG_160;Tonekortlægning - Vægt +HISTORY_MSG_161;Tonekortlægning - Genvægtning gentages +HISTORY_MSG_162;Tone Mapping +HISTORY_MSG_163;RGB Kurver - Rød +HISTORY_MSG_164;RGB Kurver - Grøn +HISTORY_MSG_165;RGB Kurver - Blå +HISTORY_MSG_166;Eksponering - Nulstil +HISTORY_MSG_167;Demosaikingmetode +HISTORY_MSG_168;L*a*b* - CC kurve +HISTORY_MSG_169;L*a*b* - CH kurve +HISTORY_MSG_170;Vibrance - HH kurve +HISTORY_MSG_171;L*a*b* - LC kurve +HISTORY_MSG_172;L*a*b* - Begræns LC +HISTORY_MSG_173;Støjreduktion - Detaljegendannelse +HISTORY_MSG_174;CIEFM02 +HISTORY_MSG_175;CIEFM02 - CAT02 tilpasning +HISTORY_MSG_176;CIEFM02 - Visning omgivende +HISTORY_MSG_177;CIEFM02 - Scene lysstyrke +HISTORY_MSG_178;CIEFM02 - Visers lysstyrke +HISTORY_MSG_179;CIEFM02 - Hvidpunkts model +HISTORY_MSG_180;CIEFM02 - Lyshed (J) +HISTORY_MSG_181;CIEFM02 - Kroma (C) +HISTORY_MSG_182;CIEFM02 - Automatisk CAT02 +HISTORY_MSG_183;CIEFM02 - Kontrast (J) +HISTORY_MSG_184;CIEFM02 - Scene omgivende +HISTORY_MSG_185;CIEFM02 - Farveskala kontrol +HISTORY_MSG_186;CIEFM02 - Algoritme +HISTORY_MSG_187;CIEFM02 - Rød/hud besk. +HISTORY_MSG_188;CIEFM02 - Lysstyrke (Q) +HISTORY_MSG_189;CIEFM02 - Kontrast (Q) +HISTORY_MSG_190;CIEFM02 - Mætning (S) +HISTORY_MSG_191;CIEFM02 - Farverighed (M) +HISTORY_MSG_192;CIEFM02 - Farvetone (h) +HISTORY_MSG_193;CIEFM02 - Tonekurve 1 +HISTORY_MSG_194;CIEFM02 - Tonekurve 2 +HISTORY_MSG_195;CIEFM02 - Tonekurve 1 +HISTORY_MSG_196;CIEFM02 - Tonekurve 2 +HISTORY_MSG_197;CIEFM02 – Farvekurve +HISTORY_MSG_198;CIEFM02 - Farvekurve +HISTORY_MSG_199;CIEFM02 - Output histogrammer +HISTORY_MSG_200;CIEFM02 - Tonekortlægning +HISTORY_MSG_201;Støjreduktion - Krominans - R&G +HISTORY_MSG_202;Støjreduktion - Krominans - B&Y +HISTORY_MSG_203;Støjreduktion - Farverum +HISTORY_MSG_204;LMMSE forbedringstrin +HISTORY_MSG_205;CIEFM02 - Varmt/dødt pixelfilter +HISTORY_MSG_206;CAT02 - Auto scene lysstyrke +HISTORY_MSG_207;Defringe - Farvetonekurve +HISTORY_MSG_208;WB - B/R equalizer +HISTORY_MSG_210;GF - Vinkel +HISTORY_MSG_211;Gradueret Filter +HISTORY_MSG_212;VF - Styrke +HISTORY_MSG_213;Vignette Filter +HISTORY_MSG_214;Sort-og-Hvid +HISTORY_MSG_215;S/H - CM - Rød +HISTORY_MSG_216;S/H - CM - Grøn +HISTORY_MSG_217;S/H - CM - Blå +HISTORY_MSG_218;S/H - Gamma - Rød +HISTORY_MSG_219;S/H - Gamma - Grøn +HISTORY_MSG_220;S/H - Gamma - Blå +HISTORY_MSG_221;S/H - Farvefilter +HISTORY_MSG_222;S/H - Forudindstillinger +HISTORY_MSG_223;S/H - CM - Orange +HISTORY_MSG_224;S/H - CM - Gul +HISTORY_MSG_225;S/H - CM - Cyan +HISTORY_MSG_226;S/H - CM - Magenta +HISTORY_MSG_227;S/H - CM - Lilla +HISTORY_MSG_228;S/H - Luminans equalizer +HISTORY_MSG_229;S/H - Luminans equalizer +HISTORY_MSG_230;S/H - Tilstand +HISTORY_MSG_231;S/H - 'Før' kurve +HISTORY_MSG_232;S/H - 'Før' kurvetype +HISTORY_MSG_233;S/H - 'Efter' kurve +HISTORY_MSG_234;S/H - 'Efter' kurvetype +HISTORY_MSG_235;S/H - CM - Auto +HISTORY_MSG_236;--unused-- +HISTORY_MSG_237;S/H - CM +HISTORY_MSG_238;GF - Fjer +HISTORY_MSG_239;GF - Styrke +HISTORY_MSG_240;GF - Centrum +HISTORY_MSG_241;VF - Fjer +HISTORY_MSG_242;VF - Rundhed +HISTORY_MSG_243;VC - Radius +HISTORY_MSG_244;VC - Styrke +HISTORY_MSG_245;VC - Centrum +HISTORY_MSG_246;L*a*b* - CL kurve +HISTORY_MSG_247;L*a*b* - LH kurve +HISTORY_MSG_248;L*a*b* - HH kurve +HISTORY_MSG_249;KeDN - Tærskel +HISTORY_MSG_251;S/H - Algoritme +HISTORY_MSG_252;KeDN – Beskyt hudfarvetoner +HISTORY_MSG_253;KeDN - Reducér artefakter +HISTORY_MSG_254;KeDN - Hud farvetone +HISTORY_MSG_255;Støjreduktion - Median filter +HISTORY_MSG_256;Støjreduktion - Median - Type +HISTORY_MSG_257;Farvetoning +HISTORY_MSG_258;Farvetoning - Farvekurve +HISTORY_MSG_259;Farvetoning - Opacitetskurve +HISTORY_MSG_260;Farvetoning - a*[b*] opacitet +HISTORY_MSG_261;Farvetoning - Metode +HISTORY_MSG_262;Farvetoning - b* opacitet +HISTORY_MSG_263;Farvetoning - Skygger - Rød +HISTORY_MSG_264;Farvetoning - Skygger - Grøn +HISTORY_MSG_265;Farvetoning - Skygger - Blå +HISTORY_MSG_266;Farvetoning - Mellem - Rød +HISTORY_MSG_267;Farvetoning - Mellem - Grøn +HISTORY_MSG_268;Farvetoning - Mellem - Blå +HISTORY_MSG_269;Farvetoning - Høj - Rød +HISTORY_MSG_270;Farvetoning - Høj - Grøn +HISTORY_MSG_271;Farvetoning - Høj - Blå +HISTORY_MSG_272;Farvetoning - Balance +HISTORY_MSG_273;Farvetoning - Farvebalance SMH +HISTORY_MSG_276;Farvetoning - Opacitet +HISTORY_MSG_277;--unused-- +HISTORY_MSG_278;Farvetoning - Bevar luminans +HISTORY_MSG_279;Farvetoning - Skygger +HISTORY_MSG_280;Farvetoning - Højlys +HISTORY_MSG_281;Farvetoning - Mættet styrke +HISTORY_MSG_282;Farvetoning - Mættet tærskel +HISTORY_MSG_283;Farvetoning - Styrke +HISTORY_MSG_284;Farvetoning - Auto mætningsbeskyttelse +HISTORY_MSG_285;Støjreduktion - Median - Metode +HISTORY_MSG_286;Støjreduktion - Median - Type +HISTORY_MSG_287;Støjreduktion - Median - Gentagelser +HISTORY_MSG_288;Fladt-Felt - Klipningskontrol +HISTORY_MSG_289;Fladt-Felt - Klipningskontrol - Auto +HISTORY_MSG_290;Sort Niveau - Rød +HISTORY_MSG_291;Sort Niveau - Grøn +HISTORY_MSG_292;Sort Niveau - Blå +HISTORY_MSG_293;Film Simulation +HISTORY_MSG_294;Film Simulation - Styrke +HISTORY_MSG_295;Film Simulation - Film +HISTORY_MSG_296;Støjreduktion – Luminanskurve +HISTORY_MSG_297;Støjreduktion - Tilstand +HISTORY_MSG_298;Død-pixel filter +HISTORY_MSG_299;Støjreduktion - Krominans kurve +HISTORY_MSG_301;Støjreduktion - Luma kontrol +HISTORY_MSG_302;Støjreduktion - Kroma metode +HISTORY_MSG_303;Støjreduktion - Kroma metode +HISTORY_MSG_304;Wavelet - Kontrastniveauer +HISTORY_MSG_305;Wavelet Niveauer +HISTORY_MSG_306;Wavelet - Proces +HISTORY_MSG_307;Wavelet - Proces +HISTORY_MSG_308;Wavelet – Proces retning +HISTORY_MSG_309;Wavelet - ES - Detail +HISTORY_MSG_310;Wavelet - Resterende – Himmelandel beskyttelse +HISTORY_MSG_311;Wavelet - Wavelet niveauer +HISTORY_MSG_312;Wavelet - Resterende - Skyggetærskel +HISTORY_MSG_313;Wavelet - Kroma - Mættet/pastel +HISTORY_MSG_314;Wavelet - Gamut - Reducér artefakter +HISTORY_MSG_315;Wavelet - Resterende - Kontrast +HISTORY_MSG_316;Wavelet - Gamut – Hudandel beskyttelse +HISTORY_MSG_317;Wavelet - Gamut - Hudfarvetone +HISTORY_MSG_318;Wavelet - Kontrast - Højlys niveauer +HISTORY_MSG_319;Wavelet - Kontrast - Højlys rækkevidde +HISTORY_MSG_320;Wavelet - Kontrast - Skygge rækkevidde +HISTORY_MSG_321;Wavelet - Kontrast - Skygge niveauer +HISTORY_MSG_322;Wavelet - Gamut - Undgå farveforskydning +HISTORY_MSG_323;Wavelet - ES - Localkontrast +HISTORY_MSG_324;Wavelet - Kroma - Pastel +HISTORY_MSG_325;Wavelet - Kroma - Mættet +HISTORY_MSG_326;Wavelet - Kroma - Metode +HISTORY_MSG_327;Wavelet - Kontrast - Tilføj til +HISTORY_MSG_328;Wavelet - Kroma - Sammenkædniongsstyrke +HISTORY_MSG_329;Wavelet - Toning - Opacitet RG +HISTORY_MSG_330;Wavelet - Toning - Opacitet BY +HISTORY_MSG_331;Wavelet - Kontrastniveauer - Ekstra +HISTORY_MSG_332;Wavelet - Fliseopdelingsmetode +HISTORY_MSG_333;Wavelet - Resterende - Skygger +HISTORY_MSG_334;Wavelet - Resterende - Kroma +HISTORY_MSG_335;Wavelet - Resterende - Højlys +HISTORY_MSG_336;Wavelet - Resterende - Højlystærskel +HISTORY_MSG_337;Wavelet - Resterende - Himmelfarvetone +HISTORY_MSG_338;Wavelet - ES - Radius +HISTORY_MSG_339;Wavelet - ES - Styrke +HISTORY_MSG_340;Wavelet - Styrke +HISTORY_MSG_341;Wavelet - Kantydelse +HISTORY_MSG_342;Wavelet - ES - Første niveau +HISTORY_MSG_343;Wavelet - Kroma niveauer +HISTORY_MSG_344;Wavelet - Meth kroma sl/cur +HISTORY_MSG_345;Wavelet - ES - Lokal kontrast +HISTORY_MSG_346;Wavelet - ES - Lokal kontrast metode +HISTORY_MSG_347;Wavelet - Støjfjernelse - Niveau 1 +HISTORY_MSG_348;Wavelet - Støjfjernelse - Niveau 2 +HISTORY_MSG_349;Wavelet - Støjfjernelse - Niveau 3 +HISTORY_MSG_350;Wavelet - ES - Kantgenkendelse +HISTORY_MSG_351;Wavelet - Resterende - HH kurve +HISTORY_MSG_352;Wavelet - Baggrund +HISTORY_MSG_353;Wavelet - ES - Gradient følsomhed +HISTORY_MSG_354;Wavelet - ES - Forbedret +HISTORY_MSG_355;Wavelet - ES - Tærskel lav +HISTORY_MSG_356;Wavelet - ES - Tærskel høj +HISTORY_MSG_357;Wavelet - Støjfjernelse - Link med ES +HISTORY_MSG_358;Wavelet - Gamut - CH +HISTORY_MSG_359;Varm/Død - Tærskel +HISTORY_MSG_360;Tonekortlægning - Gamma +HISTORY_MSG_361;Wavelet - Afsluttende - Kroma balance +HISTORY_MSG_362;Wavelet - Resterende - Kompression metode +HISTORY_MSG_363;Wavelet - Resterende - Kompression styrke +HISTORY_MSG_364;Wavelet - Afsluttende - Kontrast balance +HISTORY_MSG_365;Wavelet - Afsluttende - Delta balance +HISTORY_MSG_366;Wavelet - Resterende - Kompression gamma +HISTORY_MSG_367;Wavelet - Afsluttende - 'Efter' kontrast kurve +HISTORY_MSG_368;Wavelet - Afsluttende - Kontrast balance +HISTORY_MSG_369;Wavelet - Afsluttende - Balance metode +HISTORY_MSG_370;Wavelet - Afsluttende - Lokal kontrast kurve +HISTORY_MSG_371;Post-Resize Skærpe +HISTORY_MSG_372;PRS USM - Radius +HISTORY_MSG_373;PRS USM - Mængde +HISTORY_MSG_374;PRS USM - Tærskel +HISTORY_MSG_375;PRS USM - Skærp kun kanter +HISTORY_MSG_376;PRS USM - Kantfinding radius +HISTORY_MSG_377;PRS USM - Kanttolerance +HISTORY_MSG_378;PRS USM - Glorie kontrol +HISTORY_MSG_379;PRS USM - Glorie kontrolmængde +HISTORY_MSG_380;PRS - Metode +HISTORY_MSG_381;PRS RLD - Radius +HISTORY_MSG_382;PRS RLD - Mængde +HISTORY_MSG_383;PRS RLD - Dæmpning +HISTORY_MSG_384;PRS RLD - Gentagelser +HISTORY_MSG_385;Wavelet - Resterende - Farve Balance +HISTORY_MSG_386;Wavelet - Resterende - CB grøn høj +HISTORY_MSG_387;Wavelet - Resterende - CB blå høj +HISTORY_MSG_388;Wavelet - Resterende - CB grøn mellem +HISTORY_MSG_389;Wavelet - Resterende - CB blå mellem +HISTORY_MSG_390;Wavelet - Resterende - CB grøn lav +HISTORY_MSG_391;Wavelet - Resterende - CB blå lav +HISTORY_MSG_392;Wavelet - Resterende - Farve Balance +HISTORY_MSG_393;DCP - Look-tabel +HISTORY_MSG_394;DCP - Basisbelysning +HISTORY_MSG_395;DCP - Basistabel +HISTORY_MSG_396;Wavelet - Kontrast slutredigering +HISTORY_MSG_397;Wavelet - Kroma slutredigering +HISTORY_MSG_398;Wavelet - ES slutredigering +HISTORY_MSG_399;Wavelet - Resterende billede +HISTORY_MSG_400;Wavelet - Afsluttende redigering +HISTORY_MSG_401;Wavelet - Toning slutredigering +HISTORY_MSG_402;Wavelet - Støjfjernelse slutredigering +HISTORY_MSG_403;Wavelet - ES – Kantfølsomhed +HISTORY_MSG_404;Wavelet - ES - Base forstærkning +HISTORY_MSG_405;Wavelet - Støjfjernelse - Niveau 4 +HISTORY_MSG_406;Wavelet - ES - Nabo pixels +HISTORY_MSG_407;Retinex - Metode +HISTORY_MSG_408;Retinex - Radius +HISTORY_MSG_410;Retinex - Offset +HISTORY_MSG_411;Retinex - Styrke +HISTORY_MSG_412;Retinex - Gaussisk gradient +HISTORY_MSG_413;Retinex - Kontrast +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 - Tærskel +HISTORY_MSG_419;Retinex - Farverum +HISTORY_MSG_420;Retinex - Histogram - HSL +HISTORY_MSG_421;Retinex - Gamma +HISTORY_MSG_422;Retinex - Gamma +HISTORY_MSG_423;Retinex - Gamma hældning +HISTORY_MSG_424;Retinex - HL tærskel +HISTORY_MSG_425;Retinex - Log base +HISTORY_MSG_426;Retinex - Farvetone equalizer +HISTORY_MSG_427;Output - Ønsket gengivelse +HISTORY_MSG_428;Skærm - Ønsket gengivelse +HISTORY_MSG_429;Retinex - Gentagelser +HISTORY_MSG_430;Retinex - Transmission gradient +HISTORY_MSG_431;Retinex - Styrke gradient +HISTORY_MSG_432;Retinex - Maske - Højlys +HISTORY_MSG_433;Retinex - Maske - Højlys TB +HISTORY_MSG_434;Retinex - Maske - Skygger +HISTORY_MSG_435;Retinex - Maske - Skygger TB +HISTORY_MSG_436;Retinex - Maske - Radius +HISTORY_MSG_437;Retinex - Maske - Metode +HISTORY_MSG_438;Retinex - Maske - Equalizer +HISTORY_MSG_439;Retinex - Proces +HISTORY_MSG_440;KeDN - Metode +HISTORY_MSG_441;Retinex - Forstærk transmission +HISTORY_MSG_442;Retinex - Vægt +HISTORY_MSG_443;Output sortpunktskompensation +HISTORY_MSG_444;WB - Temp forskydning +HISTORY_MSG_445;Raw sub-image +HISTORY_MSG_449;PS - ISO tilpasning +HISTORY_MSG_452;PS - Vis bevægelse +HISTORY_MSG_453;PS - Vis kun maske +HISTORY_MSG_457;PS - Check rød/blå +HISTORY_MSG_462;PS - Check grøn +HISTORY_MSG_464;PS - Slør bevægelsesmaske +HISTORY_MSG_465;PS - Sløringsradius +HISTORY_MSG_468;PS – Udfyld huller +HISTORY_MSG_469;PS - Median +HISTORY_MSG_471;PS - Bevægelseskorrektion +HISTORY_MSG_472;PS - Bløde overgange +HISTORY_MSG_474;PS - Equalize +HISTORY_MSG_475;PS - Equalize kanal +HISTORY_MSG_476;CIEFM02 - Temp ud +HISTORY_MSG_477;CIEFM02 - Grøn ud +HISTORY_MSG_478;CIEFM02 - Yb ud +HISTORY_MSG_479;CIEFM02 - CAT02 adaptation ud +HISTORY_MSG_480;CIEFM02 - Automatic CAT02 ud +HISTORY_MSG_481;CIEFM02 - Temp scene +HISTORY_MSG_482;CIEFM02 - Grøn scene +HISTORY_MSG_483;CIEFM02 - Yb scene +HISTORY_MSG_484;CIEFM02 - Auto Yb scene +HISTORY_MSG_485;Objektivkorrektion +HISTORY_MSG_486;Objektivkorrektion - Kamera +HISTORY_MSG_487;Objektivkorrektion - Objektiv +HISTORY_MSG_488;Dynamisk Områdekomprimering +HISTORY_MSG_489;DO - Detalje +HISTORY_MSG_490;DO - Mængde +HISTORY_MSG_491;Hvidbalance +HISTORY_MSG_492;RGB Kurver +HISTORY_MSG_493;L*a*b* Justeringer +HISTORY_MSG_494;Input skærpning +HISTORY_MSG_CLAMPOOG;Klip farver uden for Gamut +HISTORY_MSG_COLORTONING_LABGRID_VALUE;Farvetoning - Farvekorrektion +HISTORY_MSG_COLORTONING_LABREGION_AB;Farvetoning - Farvekorrektion +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;Farvetoning - Kanal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;Farvetoning - område C maske +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Farvetoning - H maske +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;Farvetoning - Lyshed +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;Farvetoning - L maske +HISTORY_MSG_COLORTONING_LABREGION_LIST;Farvetoning - Liste +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;Farvetoning - område maske sløring +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;Farvetoning - område offset +HISTORY_MSG_COLORTONING_LABREGION_POWER;Farvetoning - område styrke +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;Farvetoning - Mætning +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;Farvetoning - område vis maske +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;Farvetoning – område hældning +HISTORY_MSG_DEHAZE_DEPTH;Fjern dis - Dybde +HISTORY_MSG_DEHAZE_ENABLED;Fjern dis +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Fjern dis - Vis dybde kort +HISTORY_MSG_DEHAZE_STRENGTH;Fjern dis - Styrke +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dobbelt demosaik - Auto tærskel +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dobbelt demosaik - Kontrasttærskel +HISTORY_MSG_FILMNEGATIVE_ENABLED;Film-negativ +HISTORY_MSG_FILMNEGATIVE_VALUES;Film-negativ værdier +HISTORY_MSG_HISTMATCHING;Auto-matchet tone kurve +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primære +HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 lyskilde D +HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Arbejdsprofil - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Arbejdsprofil - Hældning +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Arbejdsprofil - TRC metode +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Lokal Kontrast - Mængde +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Lokal Kontrast - Mørke +HISTORY_MSG_LOCALCONTRAST_ENABLED;Lokal Kontrast +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Lokal Kontrast - Lyshed +HISTORY_MSG_LOCALCONTRAST_RADIUS;Lokal Kontrast - Radius +HISTORY_MSG_METADATA_MODE;Metadata kopieringstilstand +HISTORY_MSG_MICROCONTRAST_CONTRAST;Mikrokontrast - Kontrasttærskel +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto tærskel +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto begrænsning af iterationer +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Kontrasttærskel +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Gentagelser +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Forstærkning af hjørneradius +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaik metode til bevægelse +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Linje støjfilter retning +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF linjer filter +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Kontrasttærskel +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Korrektion - Gentagelser +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Korrektion - Undgå farveforskydning +HISTORY_MSG_RAW_BORDER;Billed kant +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Tilpas størrelse - Tillad opskalering +HISTORY_MSG_SHARPENING_BLUR;Skærpe - Sløringsradius +HISTORY_MSG_SHARPENING_CONTRAST;Skærpe - Kontrasttærskel +HISTORY_MSG_SH_COLORSPACE;Farverum +HISTORY_MSG_SOFTLIGHT_ENABLED;Blødt lys +HISTORY_MSG_SOFTLIGHT_STRENGTH;Blødt lys - Styrke +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anker +HISTORY_MSG_TRANS_Method;Geometri - Metode +HISTORY_NEWSNAPSHOT;Tilføj +HISTORY_NEWSNAPSHOT_TOOLTIP;Genvej: Alt-s +HISTORY_SNAPSHOT;Snapshot +HISTORY_SNAPSHOTS;Snapshots +ICCPROFCREATOR_COPYRIGHT;Ophavsret: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Nulstil til standardophavsretten, givet til "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Standard +ICCPROFCREATOR_DESCRIPTION;Beskrivelse: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Tilføj gamma- og hældningsværdier til beskrivelsen +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Lad stå tomt for at angive standardbeskrivelsen. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC version: +ICCPROFCREATOR_ILL;Lyskilde: +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;Standard +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Du kan kun indstille lyskilden for ICC v4-profiler. +ICCPROFCREATOR_PRIMARIES;Primære: +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;Blå X +ICCPROFCREATOR_PRIM_BLUY;Blå 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;Rød X +ICCPROFCREATOR_PRIM_REDY;Rød Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;Du kan kun indstille tilpassede primære for ICC v4-profiler. +ICCPROFCREATOR_PRIM_WIDEG;Bred farveskala +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Gem ICC-profil som... +ICCPROFCREATOR_SLOPE;Hældning +ICCPROFCREATOR_TRC_PRESET;Toneresponskurve: +IPTCPANEL_CATEGORY;Kategori +IPTCPANEL_CATEGORYHINT;Identificér billedets motiv efter bidragerens mening. +IPTCPANEL_CITY;By +IPTCPANEL_CITYHINT;Indtast navnet på byen på billedet. +IPTCPANEL_COPYHINT;Kopiér IPTC indstillinger til klippebordet. +IPTCPANEL_COPYRIGHT;Ophavsretsmeddelelse +IPTCPANEL_COPYRIGHTHINT;Indtast en meddelelse om den nuværende ejer af ophavsretten til dette billede, som f.eks. ©2008 Jane Doe. +IPTCPANEL_COUNTRY;Land +IPTCPANEL_COUNTRYHINT;Indtast navnet på landet på billedet. +IPTCPANEL_CREATOR;Skaber +IPTCPANEL_CREATORHINT;Indtast navnet på den person, der skabte dette billede. +IPTCPANEL_CREATORJOBTITLE;Skabers jobtitel +IPTCPANEL_CREATORJOBTITLEHINT;Indtast jobtitlen på den person, der er angivet i feltet ’Skaber’. +IPTCPANEL_CREDIT;Kredditerings linje +IPTCPANEL_CREDITHINT;Indtast, hvem der skal krediteres, når dette billede offentliggøres. +IPTCPANEL_DATECREATED;Dato oprettet +IPTCPANEL_DATECREATEDHINT;Indtast datoen, hvor billedet blev taget. +IPTCPANEL_DESCRIPTION;Beskrivelse +IPTCPANEL_DESCRIPTIONHINT;Indtast en "billedtekst", der beskriver hvem, hvad, hvorfor, og af hvad der sker på dette billede. Dette kan omfatte navne på personer og/eller deres rolle i den handling, der finder sted på billedet. +IPTCPANEL_DESCRIPTIONWRITER;Beskrivelse forfatter +IPTCPANEL_DESCRIPTIONWRITERHINT;Indtast navnet på den person, der er involveret i at skrive, redigere eller rette beskrivelsen af billedet. +IPTCPANEL_EMBEDDED;Indlejret +IPTCPANEL_EMBEDDEDHINT;Nulstil til IPTC-data, der er indlejret i billedfilen. +IPTCPANEL_HEADLINE;Overskrift +IPTCPANEL_HEADLINEHINT;Indtast en kort publicerbar synopsis eller et resumé af indholdet af billedet. +IPTCPANEL_INSTRUCTIONS;Instruktioner +IPTCPANEL_INSTRUCTIONSHINT;Indtast oplysninger om embargoer eller andre restriktioner, der ikke er dækket af Ophavsret-feltet. +IPTCPANEL_KEYWORDS;Nøgleord +IPTCPANEL_KEYWORDSHINT;Indtast et vilkårligt antal søgeord, termer eller sætninger, der bruges til at udtrykke emnet i billedet. +IPTCPANEL_PASTEHINT;Indsæt IPTC-indstillinger fra udklipsholder. +IPTCPANEL_PROVINCE;Provins eller stat +IPTCPANEL_PROVINCEHINT;Indtast navnet på provinsen eller staten afbildet på dette billede. +IPTCPANEL_RESET;Nulstil +IPTCPANEL_RESETHINT;Nulstil til standardprofil. +IPTCPANEL_SOURCE;Kilde +IPTCPANEL_SOURCEHINT;Indtast eller rediger navnet på en person eller enhed, der har en rolle i indholdsforsyningskæden, f.eks. en person eller enhed, som du modtog dette billede fra. +IPTCPANEL_SUPPCATEGORIES;Supplerende kategorier +IPTCPANEL_SUPPCATEGORIESHINT;Forfiner billedets emne yderligere. +IPTCPANEL_TITLE;Titel +IPTCPANEL_TITLEHINT;Indtast et kort verbalt og menneskeligt læsbart navn til billedet, dette kan være filnavnet. +IPTCPANEL_TRANSREFERENCE;Job ID +IPTCPANEL_TRANSREFERENCEHINT;Indtast et nummer eller en identifikator, der er nødvendig for workflowkontrol eller sporing. +MAIN_BUTTON_FULLSCREEN;Fuldskærm +MAIN_BUTTON_ICCPROFCREATOR;ICC-profilskaber +MAIN_BUTTON_NAVNEXT_TOOLTIP;Naviger til det næste billede i forhold til det billede, der er åbnet i editoren.\nGenvej: Shift-F4\n\nFor at navigere til det næste billede i forhold til det aktuelt valgte thumbnail i Filbrowseren eller filmstrimlen:\nGenvej: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Naviger til det forrige billede i forhold til det billede, der er åbnet i editoren.\nGenvej: Shift-F3\n\nFor at navigere til det forrige billede i forhold til det aktuelt valgte thumbnail i Filbrowseren eller filmstrimlen:\nGenvej: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Synkroniser Filbrowseren eller Filmstrimlen med Editoren for at vise thumbnails fra det aktuelt åbnede billede, og ryd ethvert aktivt filter.\nGenvej: x\n\nSom ovenfor, men uden at rydde aktive filtre:\nGenvej: < b>y\n(Bemærk, at thumbnailet af det åbnede billede, ikke vil blive vist, hvis det filtreres fra). +MAIN_BUTTON_PREFERENCES;Præferencer +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Sæt det aktuelle billede i redigeringskøen.\nGenvej: Ctrl+b +MAIN_BUTTON_SAVE_TOOLTIP;Gem det aktuelle billede.\nGenvej: Ctrl+s\nGem den aktuelle profil (.pp3).\nGenvej: Ctrl+Shift+s +MAIN_BUTTON_SENDTOEDITOR;Redigér billede i ekstern editor. +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Redigér det aktuelle billede i ekstern editor.\nGenvej: Ctrl+e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Vis/skjul alle sidepaneler.\nGenvej: m +MAIN_BUTTON_UNFULLSCREEN;Afslut fuldskærm +MAIN_FRAME_EDITOR;Redigering +MAIN_FRAME_EDITOR_TOOLTIP;Redigering.\nGenvej: Ctrl-F4 +MAIN_FRAME_FILEBROWSER;Fil Browser +MAIN_FRAME_FILEBROWSER_TOOLTIP;Fil browser.\nGenvej: Ctrl-F2 +MAIN_FRAME_PLACES;Steder +MAIN_FRAME_PLACES_ADD;Tilføj +MAIN_FRAME_PLACES_DEL;Fjern +MAIN_FRAME_QUEUE;Kø +MAIN_FRAME_QUEUE_TOOLTIP;Redigeringskø.\nGenvej: Ctrl-F3 +MAIN_FRAME_RECENT;Nylige mapper +MAIN_MSG_ALREADYEXISTS;Filen findes allerede. +MAIN_MSG_CANNOTLOAD;Kan ikke indlæse billede. +MAIN_MSG_CANNOTSAVE;Fillagringsfejl +MAIN_MSG_CANNOTSTARTEDITOR;Kan ikke starte editor. +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Indstil den korrekte sti i Præferencer. +MAIN_MSG_EMPTYFILENAME;Filnavn ikke specificeret! +MAIN_MSG_IMAGEUNPROCESSED;Denne kommando kræver, at alle valgte billeder behandles i kø først. +MAIN_MSG_NAVIGATOR;Navigator +MAIN_MSG_OPERATIONCANCELLED;Handling annulleret +MAIN_MSG_PATHDOESNTEXIST;Stien\n\n%1\n\neksisterer ikke. Indsæt en korrekt sti i Præferencer. +MAIN_MSG_QOVERWRITE;Vil du overskrive det? +MAIN_MSG_SETPATHFIRST;Du skal først angive en målsti i Præferencer for at bruge denne funktion! +MAIN_MSG_TOOMANYOPENEDITORS;For mange åbne editors.\nLuk en editor for at fortsætte +MAIN_MSG_WRITEFAILED;Kunne ikke gemme\n"%1"\n\nSørg for, at mappen eksisterer, og at du har skrivetilladelse til den. +MAIN_TAB_ADVANCED;Avanceret +MAIN_TAB_ADVANCED_TOOLTIP;Genvej: Alt-a +MAIN_TAB_COLOR;Farver +MAIN_TAB_COLOR_TOOLTIP;Genvej: Alt-c +MAIN_TAB_DETAIL;Detaljer +MAIN_TAB_DETAIL_TOOLTIP;Genvej: Alt-d +MAIN_TAB_DEVELOP; Batch Edit +MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT; Hurtig eksport +MAIN_TAB_EXPOSURE;Eksponering +MAIN_TAB_EXPOSURE_TOOLTIP;Genvej: Alt-e +MAIN_TAB_FAVORITES;Favoritter +MAIN_TAB_FAVORITES_TOOLTIP;Genvej: Alt-u +MAIN_TAB_FILTER; Filtrér +MAIN_TAB_INSPECT; Inspicér +MAIN_TAB_IPTC;IPTC +MAIN_TAB_METADATA;Metadata +MAIN_TAB_METADATA_TOOLTIP;Genvej: Alt-m +MAIN_TAB_RAW;Raw +MAIN_TAB_RAW_TOOLTIP;Genvej: Alt-r +MAIN_TAB_TRANSFORM;Transformér +MAIN_TAB_TRANSFORM_TOOLTIP;Genvej: Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Forhåndsvisningens baggrundsfarve: temabaseret\nGenvej: 9 +MAIN_TOOLTIP_BACKCOLOR1;Forhåndsvisningens baggrundsfarve: sort\nGenvej: 9 +MAIN_TOOLTIP_BACKCOLOR2;Forhåndsvisningens baggrundsfarve: hvid\nGenvej: 9 +MAIN_TOOLTIP_BACKCOLOR3;Forhåndsvisningens baggrundsfarve: mellemgrå\nGenvej: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Lås / Lås op visningen Før\n\nLås: behold Før visning uændret.\nNyttig til at evaluere den samlede effekt af flere værktøjer.\nDerudover kan sammenligninger foretages med enhver tilstand i historikken.\n\nLås op: Før visningen følger Efter-visningen et skridt bagud, og viser billedet før effekten af det aktuelt brugte værktøj. +MAIN_TOOLTIP_HIDEHP;Vis/Skjul venstre panel (inklusiv historik).\nGenvej: l +MAIN_TOOLTIP_INDCLIPPEDH;Klippet højlys indikation.\nGenvej: > +MAIN_TOOLTIP_INDCLIPPEDS;Klippet skygge indikation.\nGenvej: < +MAIN_TOOLTIP_PREVIEWB;Forhåndsvis den blå kanal.\nGenvej: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Forhåndsvis fokusmasken.\nGenvej: Shift-f\n\nMere nøjagtig på billeder med lav dybdeskarphed, lav støj og ved højere zoomniveauer.\nZoom ud til 10-30 % for at forbedre detektionsnøjagtigheden på støjfyldte billeder. +MAIN_TOOLTIP_PREVIEWG;Forhåndsvis den grønne kanal.\nGenvej: g +MAIN_TOOLTIP_PREVIEWL;Forhåndsvis luminosity.\nGenvej: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Forhåndsvis rød kanal.\nGenvej: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Forhåndsvis den skærpende kontrastmaske.\nGenvej: p\n\nVirker kun når skærpen er aktiveret og zoom >= 100%. +MAIN_TOOLTIP_QINFO;Hurtig info om billedet.\nGenvej: i +MAIN_TOOLTIP_SHOWHIDELP1;Vis/Skjul venstre panel.\nGenvej: l +MAIN_TOOLTIP_SHOWHIDERP1;Vis/Skjul højre panel.\nGenvej: Alt-l +MAIN_TOOLTIP_SHOWHIDETP1;Vis/Skjul top panel.\nGenvej: Shift-l +MAIN_TOOLTIP_THRESHOLD;Tærskel +MAIN_TOOLTIP_TOGGLE;Skift mellem Før/Efter visningen.\nGenvej: Shift-b +MONITOR_PROFILE_SYSTEM;Systemstandard +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;Bredde: %1, Højde: %2 +NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;Den medfølgende profil "%1" blev ikke fundet!\n\nDin installation kan være beskadiget.\n\nInterne standardværdier vil blive brugt i stedet. +OPTIONS_DEFIMG_MISSING;Standardprofilen for ikke-raw billeder kunne ikke findes eller er ikke sat.\n\nTjek dine profilers mappe, den kan mangle eller være beskadiget.\n\n"%1" vil blive brugt i stedet. +OPTIONS_DEFRAW_MISSING; Standardprofilen for raw billeder kunne ikke findes eller er ikke sat.\n\nTjek dine profilers mappe, den kan mangle eller være beskadiget.\n\n"%1" vil blive brugt i stedet. +PARTIALPASTE_ADVANCEDGROUP;Avancerede Indstillinger +PARTIALPASTE_BASICGROUP;Grundlæggende Indstillinger +PARTIALPASTE_CACORRECTION;Kromatisk afvigelse korrektion +PARTIALPASTE_CHANNELMIXER;Kanalmixer +PARTIALPASTE_CHANNELMIXERBW;S/H +PARTIALPASTE_COARSETRANS;Grov rotation/flipping +PARTIALPASTE_COLORAPP;CIEFM02 +PARTIALPASTE_COLORGROUP;Farverelaterede Indstillinger +PARTIALPASTE_COLORTONING;Farvetoning +PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-udfyld +PARTIALPASTE_COMPOSITIONGROUP;Kompositions Indstillinger +PARTIALPASTE_CROP;Beskær +PARTIALPASTE_DARKFRAMEAUTOSELECT;Mørk ramme auto-selektion +PARTIALPASTE_DARKFRAMEFILE;Mørk ramme fil +PARTIALPASTE_DEFRINGE;Defringe +PARTIALPASTE_DEHAZE;Fjern dis +PARTIALPASTE_DETAILGROUP;Detail Indstillinger +PARTIALPASTE_DIALOGLABEL;Bearbejdningsprofil for delvist indsæt +PARTIALPASTE_DIRPYRDENOISE;Støjreduktion +PARTIALPASTE_DIRPYREQUALIZER;Kontrast ved detaljeniveauer +PARTIALPASTE_DISTORTION;Forvrængningskorrektion +PARTIALPASTE_EPD; +PARTIALPASTE_EQUALIZER;Wavelet niveauer +PARTIALPASTE_EVERYTHING;Alt +PARTIALPASTE_EXIFCHANGES;Exif +PARTIALPASTE_EXPOSURE;Eksponering +PARTIALPASTE_FILMNEGATIVE;Negativfilm +PARTIALPASTE_FILMSIMULATION;Film simulation +PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field Automatisk valg +PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field sløringsradius +PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field sløringstype +PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field klip kontrol +PARTIALPASTE_FLATFIELDFILE;Flat-field fil +PARTIALPASTE_GRADIENT;Gradueret filter +PARTIALPASTE_HSVEQUALIZER;HSV equalizer +PARTIALPASTE_ICMSETTINGS;Farvestyring indstillinger +PARTIALPASTE_IMPULSEDENOISE;Impuls støjreduktion +PARTIALPASTE_IPTCINFO;IPTC +PARTIALPASTE_LABCURVE;L*a*b* adjustments +PARTIALPASTE_LENSGROUP;Lens Related Indstillinger +PARTIALPASTE_LENSPROFILE;Profileret objektivkorrektion +PARTIALPASTE_LOCALCONTRAST;Lokal kontrast +PARTIALPASTE_METADATA;Metadata tilstand +PARTIALPASTE_METAGROUP;Metadata indstillinger +PARTIALPASTE_PCVIGNETTE;Vignette filter +PARTIALPASTE_PERSPECTIVE;Perspektiv +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Død-pixel filter +PARTIALPASTE_PREPROCESS_GREENEQUIL;Grøn ligevægt +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Varm-pixel filter +PARTIALPASTE_PREPROCESS_LINEDENOISE;Linje støjfilter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF linjefilter +PARTIALPASTE_PRSHARPENING;Skærpning efter justering af størrelse +PARTIALPASTE_RAWCACORR_AUTO;CA auto-korrektion +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA undgå farveskift +PARTIALPASTE_RAWCACORR_CAREDBLUE;CA rød & blå +PARTIALPASTE_RAWEXPOS_BLACK;Sort niveauer +PARTIALPASTE_RAWEXPOS_LINEAR;Hvidpunkts korrektion +PARTIALPASTE_RAWGROUP;Raw Indstillinger +PARTIALPASTE_RAW_BORDER;Raw kanter +PARTIALPASTE_RAW_DCBENHANCE;DCB forbedring +PARTIALPASTE_RAW_DCBITERATIONS;DCB iterationer +PARTIALPASTE_RAW_DMETHOD;Demosaik metode +PARTIALPASTE_RAW_FALSECOLOR;Undertrykkelse af falske farver +PARTIALPASTE_RAW_IMAGENUM;Underbillede +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE forbedrings skridt +PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift +PARTIALPASTE_RESIZE;Ændr størrelse +PARTIALPASTE_RETINEX;Retinex +PARTIALPASTE_RGBCURVES;RGB kurver +PARTIALPASTE_ROTATION;Rotation +PARTIALPASTE_SHADOWSHIGHLIGHTS;Skygger/højlys +PARTIALPASTE_SHARPENEDGE;Skærpen kanter +PARTIALPASTE_SHARPENING;Skærpe (USM/RL) +PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_SOFTLIGHT;Blødt lys +PARTIALPASTE_TM_FATTAL;Dynamisk områdekompression +PARTIALPASTE_VIBRANCE;Vibrance +PARTIALPASTE_VIGNETTING;Vignetteringskorrektion +PARTIALPASTE_WHITEBALANCE;Hvidbalance +PREFERENCES_ADD;Tilføj +PREFERENCES_APPEARANCE;Udseende +PREFERENCES_APPEARANCE_COLORPICKERFONT;Farvevælgers skrifttype +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Beskæringsmaskens farve +PREFERENCES_APPEARANCE_MAINFONT;Hovedskrifttype +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigeringsguide farve +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI tilstand +PREFERENCES_APPEARANCE_THEME;Tema +PREFERENCES_APPLNEXTSTARTUP;genstart nødvendig +PREFERENCES_AUTOMONPROFILE;Brug operativsystemets hovedskærmfarveprofil +PREFERENCES_AUTOSAVE_TP_OPEN;Gem værktøjets foldet/udfoldet tilstand ved afslutning +PREFERENCES_BATCH_PROCESSING;Batch Redigering +PREFERENCES_BEHADDALL;Alt til 'Tilføj' +PREFERENCES_BEHADDALLHINT;Sæt alle parametre til Tilføj tilstanden.\nJusteringer af parametre i batchværktøjspanelet vil være deltaer til de lagrede værdier. +PREFERENCES_BEHAVIOR;Opførsel +PREFERENCES_BEHSETALL;Alt til 'Indstil' +PREFERENCES_BEHSETALLHINT;Sæt alle parametre til Indstil-tilstand.\nJusteringer af parametre i batchværktøjspanelet vil være absolutte, de faktiske værdier vil blive vist. +PREFERENCES_CACHECLEAR;Ryd +PREFERENCES_CACHECLEAR_ALL;Ryd alle cachelagrede filer: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Ryd alle cachelagrede filer undtagen cachelagrede redigeringsprofiler: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Ryd kun cachelagrede redigeringsprofiler: +PREFERENCES_CACHECLEAR_SAFETY;Kun filer i cachen ryddes. Redigeringsprofiler gemt sammen med kildebillederne berøres ikke. +PREFERENCES_CACHEMAXENTRIES;Maksimalt antal cacheposter +PREFERENCES_CACHEOPTS;Cacheindstillinger +PREFERENCES_CACHETHUMBHEIGHT;Maksimal thumbnail-højde +PREFERENCES_CHUNKSIZES;Fliser pr tråd +PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaik +PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA korrektion +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaik +PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaik +PREFERENCES_CHUNKSIZE_RGB;RGB redigering +PREFERENCES_CLIPPINGIND;Indikation af klipning +PREFERENCES_CLUTSCACHE;HaldCLUT Cache +PREFERENCES_CLUTSCACHE_LABEL;Maksimalt antal cached CLUTs +PREFERENCES_CLUTSDIR;HaldCLUT mappe +PREFERENCES_CMMBPC;Sortpunkts kompensation +PREFERENCES_CROP;Beskæringsredigering +PREFERENCES_CROP_AUTO_FIT;Zoom automatisk for at passe til beskæringen +PREFERENCES_CROP_GUIDES;Hjælpelinjer vises, når beskæringen ikke redigeres +PREFERENCES_CROP_GUIDES_FRAME;Ramme +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;Ingen +PREFERENCES_CURVEBBOXPOS;Placering af kurve kopiér & indsæt knapper +PREFERENCES_CURVEBBOXPOS_ABOVE;Over +PREFERENCES_CURVEBBOXPOS_BELOW;Under +PREFERENCES_CURVEBBOXPOS_LEFT;Venstre +PREFERENCES_CURVEBBOXPOS_RIGHT;Højre +PREFERENCES_CUSTPROFBUILD;Standard Bearbejnings Profilbygger +PREFERENCES_CUSTPROFBUILDHINT;Eksekverbar (eller script) fil der kaldes, når en ny indledende redigeringsprofil skal genereres for et billede.\n\nStien til kommunikationsfilen (*.ini-stil, også kaldet "Keyfile") tilføjes som en kommandolinjeparameter. Den indeholder forskellige parametre, der kræves til scripts og billede Exif for at tillade generering af en regelbaseret redigeringsprofil.\n\nADVARSEL: Du er ansvarlig for at bruge dobbelte anførselstegn, hvor det er nødvendigt, hvis du bruger stier, der indeholder mellemrum. +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Navn +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID +PREFERENCES_CUSTPROFBUILDPATH;Eksekverbar sti +PREFERENCES_DARKFRAMEFOUND;Fundet +PREFERENCES_DARKFRAMESHOTS;skud +PREFERENCES_DARKFRAMETEMPLATES;skabeloner +PREFERENCES_DATEFORMAT;Datoformat +PREFERENCES_DATEFORMATHINT;Du kan bruge følgende formateringsstrenge:\n%y - år\n%m - måned\n%d - dag\n\ nFor eksempel dikterer ISO 8601-standarden datoformatet som følger:\n%y-%m-%d +PREFERENCES_DIRDARKFRAMES;Mørke-rammer mappe +PREFERENCES_DIRECTORIES;Mapper +PREFERENCES_DIRHOME;Hjemmemappe +PREFERENCES_DIRLAST;Sidst brugte mappe +PREFERENCES_DIROTHER;Andre +PREFERENCES_DIRSELECTDLG;Vælg Billedmappe ved start... +PREFERENCES_DIRSOFTWARE;Installationsmappe +PREFERENCES_EDITORCMDLINE;Brugerdefineret kommandolinje +PREFERENCES_EDITORLAYOUT;Editor layout +PREFERENCES_EXTERNALEDITOR;Ekstern Editor +PREFERENCES_FBROWSEROPTS;Filbrowser/Thumbnail Indstillinger +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Kompakte værktøjslinjer i filbrowseren +PREFERENCES_FLATFIELDFOUND;Fundet +PREFERENCES_FLATFIELDSDIR;Flat-fields mappe +PREFERENCES_FLATFIELDSHOTS;shots +PREFERENCES_FLATFIELDTEMPLATES;skabeloner +PREFERENCES_FORIMAGE;Til ikke-raw billeder +PREFERENCES_FORRAW;Til raw billeder +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Samme thumbnail-højde i filmstrimlen og filbrowseren +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;At have forskellig thumbnail-størrelser vil kræve mere redigeringstid, hver gang du skifter mellem den enkelte Editor-fane og filbrowseren. +PREFERENCES_GIMPPATH;GIMP installationsmappe +PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram i venstre panel +PREFERENCES_HISTOGRAM_TOOLTIP;Hvis den er aktiveret, bruges arbejdsprofilen til at gengive hovedhistogrammet og Navigator-panelet, ellers bruges den gammakorrigerede outputprofil. +PREFERENCES_HLTHRESHOLD;Tærskel for klippede højlys +PREFERENCES_ICCDIR;Mappe der indeholder farveprofiler +PREFERENCES_IMPROCPARAMS;Standardredigeringsprofil +PREFERENCES_INSPECT_LABEL;Inspicér +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maksimalt antal cachelagrede billeder +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Sæt det maksimale antal billeder gemt i cachen, når du holder musemarkøren over dem i filbrowseren; systemer med lidt RAM (2GB) bør holde denne værdi indstillet til 1 eller 2. +PREFERENCES_INTENT_ABSOLUTE;Absolut kolorimetrisk +PREFERENCES_INTENT_PERCEPTUAL;Som opfattet +PREFERENCES_INTENT_RELATIVE;Relativ kolorimetrisk +PREFERENCES_INTENT_SATURATION;Mætning +PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Vis indlejret JPEG-thumbnail, hvis raw er uredigeret +PREFERENCES_LANG;Sprog +PREFERENCES_LANGAUTODETECT;Brug systemsprog +PREFERENCES_MAXRECENTFOLDERS;Maksimalt antal seneste mapper +PREFERENCES_MENUGROUPEXTPROGS;Gruppe "Åbn med" +PREFERENCES_MENUGROUPFILEOPERATIONS;Gruppe "Filhandlinger" +PREFERENCES_MENUGROUPLABEL;Gruppe "Farvemærkat" +PREFERENCES_MENUGROUPPROFILEOPERATIONS;Gruppe "Redigerer profilhandlinger" +PREFERENCES_MENUGROUPRANK;Gruppe "Rank" +PREFERENCES_MENUOPTIONS;Indstillinger for kontekstmenu +PREFERENCES_MONINTENT;Standard gengivelseshensigt +PREFERENCES_MONITOR;Skærm +PREFERENCES_MONPROFILE;Standard farveprofil +PREFERENCES_MONPROFILE_WARNOSX;På grund af MacOS-begrænsninger understøttes kun sRGB. +PREFERENCES_MULTITAB;Tilstand med flere redigerings-faneblade +PREFERENCES_MULTITABDUALMON;Tilstand med flere redigerings-faneblade i eget vindue +PREFERENCES_NAVIGATIONFRAME;Navigation +PREFERENCES_OVERLAY_FILENAMES;Overlejr filnavne på thumbnails i filbrowseren +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlejr filnavne på thumbnails i redigeringspanelet +PREFERENCES_OVERWRITEOUTPUTFILE;Overskriv eksisterende outputfiler +PREFERENCES_PANFACTORLABEL;Pan rate forstærkning +PREFERENCES_PARSEDEXT;Fortolkede Suffikser +PREFERENCES_PARSEDEXTADD;Tilføj suffiks +PREFERENCES_PARSEDEXTADDHINT;Tilføj indtastet suffiks til listen. +PREFERENCES_PARSEDEXTDELHINT;Slet valgte suffiks fra listen. +PREFERENCES_PARSEDEXTDOWNHINT;Flyt det valgte suffiks ned på listen. +PREFERENCES_PARSEDEXTUPHINT;Flyt det valgte suffiks op på listen. +PREFERENCES_PERFORMANCE_MEASURE;Mål +PREFERENCES_PERFORMANCE_MEASURE_HINT;Logger redigeringstider i konsollen +PREFERENCES_PERFORMANCE_THREADS;Tråde +PREFERENCES_PERFORMANCE_THREADS_LABEL;Maksimalt antal tråde til Støjreduktion og Wavelet Niveauer (0 = Automatisk) +PREFERENCES_PREVDEMO;Forhåndsvisning Demosaiking Metode +PREFERENCES_PREVDEMO_FAST;Hurtig +PREFERENCES_PREVDEMO_LABEL;Demosaiking metode brugt til forhåndsvisningen ved <100% zoom: +PREFERENCES_PREVDEMO_SIDECAR;Som i PP3 +PREFERENCES_PRINTER;Printer (Soft-Proofing) +PREFERENCES_PROFILEHANDLING;Redigeringsprofil Håndtering +PREFERENCES_PROFILELOADPR;Behandler profilindlæsningsprioritet +PREFERENCES_PROFILEPRCACHE;Profil i cache +PREFERENCES_PROFILEPRFILE;Profil ved siden af inputfilen +PREFERENCES_PROFILESAVEBOTH;Gem redigeringsprofil både i cachen og ved siden af inputfilen +PREFERENCES_PROFILESAVECACHE;Gem redigeringsprofil i cachen +PREFERENCES_PROFILESAVEINPUT;Gem redigeringsprofil ved siden af inputfilen +PREFERENCES_PROFILESAVELOCATION;Redigeringsprofilen gemmes +PREFERENCES_PROFILE_NONE;Ingen +PREFERENCES_PROPERTY;Egenskab +PREFERENCES_PRTINTENT;Hensigt med gengivelse +PREFERENCES_PRTPROFILE;Farveprofil +PREFERENCES_PSPATH;Adobe Photoshop installationsmappe +PREFERENCES_REMEMBERZOOMPAN;Husk zoom % og panoreringsforskydning +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Husk zoom % og panoreringsforskydning af det aktuelle billede, når du åbner et nyt billede.\n\nDenne mulighed virker kun i "Tilstand med enkelt redigerings-faneblad" og når "Demosaiking metode brugt til forhåndsvisningen ved <100% zoom" er indstillet til "Som i PP3". +PREFERENCES_SAVE_TP_OPEN_NOW;Gem værktøjets foldet/udfoldet tilstand nu +PREFERENCES_SELECTLANG;Vælg sprog +PREFERENCES_SERIALIZE_TIFF_READ;TIFF Læs Indstillinger +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialiser læsning af TIFF-filer +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Aktivering af denne indstilling, når du arbejder med mapper, der indeholder ikke-komprimerede TIFF-filer, kan øge ydeevnen af thumbnail-generering. +PREFERENCES_SET;Sæt +PREFERENCES_SHOWBASICEXIF;Vis basis Exif info +PREFERENCES_SHOWDATETIME;Vis dato og tid +PREFERENCES_SHOWEXPOSURECOMPENSATION;Tilføj eksponeringskompensation +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Vis Filmstrip værktøjslinje +PREFERENCES_SHTHRESHOLD;Tærskel for klippede skygger +PREFERENCES_SINGLETAB;Tilstand med enkelt redigerings-faneblad +PREFERENCES_SINGLETABVERTAB;Tilstand med enkelt redigerings-faneblad, Lodret Tabs +PREFERENCES_SND_HELP;Indtast en fuld filsti for at indstille en lyd, eller lad den stå tom for ingen lyd.\nFor systemlyde på Windows, brug "SystemStandard", "SystemAsterisk" osv., og på Linux brug "complete", "window-attention" osv. +PREFERENCES_SND_LNGEDITPROCDONE;Redigering færdig +PREFERENCES_SND_QUEUEDONE;Kø-redigering færdig +PREFERENCES_SND_THRESHOLDSECS;Efter sekunder +PREFERENCES_STARTUPIMDIR;Billedmappe ved start +PREFERENCES_TAB_BROWSER;Filbrowser +PREFERENCES_TAB_COLORMGR;Farvestyring +PREFERENCES_TAB_DYNAMICPROFILE;Dynamiske profilregler +PREFERENCES_TAB_GENERAL;Generel +PREFERENCES_TAB_IMPROC;Billedredigering +PREFERENCES_TAB_PERFORMANCE;Ydeevne +PREFERENCES_TAB_SOUND;Lyde +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Indlejret JPEG forhåndsvisning +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Billede til visning +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw gengivelse +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Indlejret JPEG hvis fuld størrelse, ellers neutral raw +PREFERENCES_TP_LABEL;Værktøjspanel: +PREFERENCES_TP_VSCROLLBAR;Gem lodret rullebjælke +PREFERENCES_USEBUNDLEDPROFILES;Brug medfølgende profiler +PREFERENCES_WORKFLOW;Layout +PROFILEPANEL_COPYPPASTE;Parametre til kopiér +PROFILEPANEL_GLOBALPROFILES;Medfølgende profiler +PROFILEPANEL_LABEL;Redigeringsprofiler +PROFILEPANEL_LOADDLGLABEL;Indlæs redigeringsparametre... +PROFILEPANEL_LOADPPASTE;Parametre til indlæsning +PROFILEPANEL_MODE_TOOLTIP;Behandler profiludfyldningstilstand.\n\nKnap trykket: delvise profiler vil blive konverteret til hele profiler; de manglende værdier vil blive erstattet med hårdtkodede standarder.\n\nKnap frigivet: profiler vil blive anvendt, som de er, og ændrer kun de værdier, som de indeholder. +PROFILEPANEL_MYPROFILES;Mine profiler +PROFILEPANEL_PASTEPPASTE;Parametre der skal indsættes +PROFILEPANEL_PCUSTOM;Standard +PROFILEPANEL_PDYNAMIC;Dynamisk +PROFILEPANEL_PFILE;Fra fil +PROFILEPANEL_PINTERNAL;Neutral +PROFILEPANEL_PLASTSAVED;Sidst gemt +PROFILEPANEL_SAVEDLGLABEL;Gem redigeringsparametre... +PROFILEPANEL_SAVEPPASTE;Parametre der skal gemmes +PROFILEPANEL_TOOLTIPCOPY;Kopiér nuværende redigeringsprofil til udklipsholder.\nCtrl-klik for at vælge parametre til kopiering. +PROFILEPANEL_TOOLTIPLOAD;Indlæs en profil fra fil.\nCtrl-klik for at vælge de parametre, der skal indlæses. +PROFILEPANEL_TOOLTIPPASTE;Indsæt profil fra udklipsholder.\nCtrl-klik for at vælge de parametre, der skal indsættes. +PROFILEPANEL_TOOLTIPSAVE;Gem den aktuelle profil.\nCtrl-klik for at vælge de parametre, der skal gemmes. +PROGRESSBAR_DECODING;Afkodning... +PROGRESSBAR_GREENEQUIL;Grøn ligevægt... +PROGRESSBAR_HLREC;Højlys rekonstruktion... +PROGRESSBAR_HOTDEADPIXELFILTER;Varmt/dødt pixel filter... +PROGRESSBAR_LINEDENOISE;Linje støjfilter... +PROGRESSBAR_LOADING;Indlæser billede... +PROGRESSBAR_LOADINGTHUMBS;Indlæser thumbnails... +PROGRESSBAR_LOADJPEG; Indlæser JPEG fil... +PROGRESSBAR_LOADPNG; Indlæser PNG fil... +PROGRESSBAR_LOADTIFF;Indlæser TIFF fil... +PROGRESSBAR_NOIMAGES;Ingen billeder fundet +PROGRESSBAR_PROCESSING;Bearbejder billede... +PROGRESSBAR_PROCESSING_PROFILESAVED;Redigeringsprofil gemt +PROGRESSBAR_RAWCACORR;Raw CA korrektion... +PROGRESSBAR_READY;Parat +PROGRESSBAR_SAVEJPEG;Gemmer JPEG fil... +PROGRESSBAR_SAVEPNG;Gemmer PNG fil... +PROGRESSBAR_SAVETIFF;Gemmer TIFF fil... +PROGRESSBAR_SNAPSHOT_ADDED;Snapshot tilføjet +PROGRESSDLG_PROFILECHANGEDINBROWSER;Behandlerprofil ændret i browser +QINFO_FRAMECOUNT;%2 rammer +QINFO_HDR;HDR / %2 ramme(r) +QINFO_ISO;ISO +QINFO_NOEXIF;Exif-data ikke tilgængelige. +QINFO_PIXELSHIFT;Pixel Shift / %2 ramme(r) +QUEUE_AUTOSTART;Auto-start +QUEUE_AUTOSTART_TOOLTIP;Begynd redigering automatisk, når et nyt job ankommer. +QUEUE_DESTFILENAME;Sti og filnavn +QUEUE_FORMAT_TITLE;Filformat +QUEUE_LOCATION_FOLDER;Gem til mappe +QUEUE_LOCATION_TEMPLATE;Brug skabelon +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Angiv outputplaceringen baseret på kildebilledets placering, rang, papirkurvsstatus eller position i køen.\n\nBrug følgende stinavn som eksempel:\n/home/tom/photos/2010-10-31/photo1.raw\nbetydningen af formateringsstrengene er:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r vil blive erstattet af billedets rang. Hvis billedet ikke er rangordnet, bruges '0'. Hvis billedet er i skraldespanden, bruges 'x'.\n\n%s1, ..., %s9 erstattes af billedets startposition i køen på det tidspunkt, hvor køen startes. Nummeret angiver polstringen, f.eks. %s3 resulterer i '001'.\n\nHvis du vil gemme outputbilledet sammen med kildebilledet, skriv:\n%p1/%f\n\nHvis du vil gemme outputbilledet i en mappe med navnet 'converted', der er placeret i kildebilledets mappe, skal du skrive:\n%p1/converted/%f\n\nHvis du vil gemme outputbilledet i\n'/home/tom/photos/converted/2010-10-31', skriv:\n%p2/converted/%d1/ %f +QUEUE_LOCATION_TITLE;Output sted +QUEUE_STARTSTOP_TOOLTIP;Start eller stop redigeringen af billederne i køen.\n\nGenvej: Ctrl+s +SAMPLEFORMAT_0;Ukendt dataformat +SAMPLEFORMAT_1;8-bit usigneret +SAMPLEFORMAT_2;16-bit usigneret +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;Tilføj automatisk et suffiks hvis filen allerede findes +SAVEDLG_FILEFORMAT;Filformat +SAVEDLG_FILEFORMAT_FLOAT; floating-point +SAVEDLG_FORCEFORMATOPTS;Gennemtving gemmemuligheder +SAVEDLG_JPEGQUAL;JPEG kvalitet +SAVEDLG_PUTTOQUEUE;Sæt i redigeringskø +SAVEDLG_PUTTOQUEUEHEAD;Sæt i toppen af redigeringskøen +SAVEDLG_PUTTOQUEUETAIL;Sæt til slutningen af redigeringskøen +SAVEDLG_SAVEIMMEDIATELY;Gem straks +SAVEDLG_SAVESPP;Gem redigeringsparametre med billedet +SAVEDLG_SUBSAMP;Delprøvetagning +SAVEDLG_SUBSAMP_1;Kraftigste kompression +SAVEDLG_SUBSAMP_2;Balanceret +SAVEDLG_SUBSAMP_3;Bedste kvalitet +SAVEDLG_SUBSAMP_TOOLTIP;Bedste komprimering:\nJ:a:b 4:2:0\nh/v 2/2\nKroma halveret vandret og lodret.\n\nBalanceret:\nJ:a:b 4:2:2\nh/v 2/ 1\nKroma halveret vandret.\n\nBedste kvalitet:\nJ:a:b 4:4:4\nh/v 1/1\nIngen Kroma-delprøvetagning. +SAVEDLG_TIFFUNCOMPRESSED;Ikke-komprimeret TIFF +SAVEDLG_WARNFILENAME;Filen vil blive navngivet +SHCSELECTOR_TOOLTIP;Klik på højre museknap for at nulstille placeringen af disse 3 skydere. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Højlys-pixels med farver uden for farveskalaen med hensyn til:\n- printerprofilen, hvis en er valgt og soft-proofing er aktiveret,\n- outputprofilen, hvis en printerprofil ikke er indstillet og soft-proofing er aktiveret,\n- skærmprofilen, hvis soft-proofing er deaktiveret. +SOFTPROOF_TOOLTIP;Soft-proofing simulerer billedets udseende:\n- når det udskrives, hvis en printerprofil er indstillet i Præferencer > Farvestyring,\n- når det vises på et display, der bruger den aktuelle outputprofil, hvis der ikke er angivet en printerprofil. +THRESHOLDSELECTOR_B;Bund +THRESHOLDSELECTOR_BL;Bund-venstre +THRESHOLDSELECTOR_BR;Bund-højre +THRESHOLDSELECTOR_HINT;Hold tasten Skift nede for at flytte individuelle kontrolpunkter. +THRESHOLDSELECTOR_T;Top +THRESHOLDSELECTOR_TL;Top-venstre +THRESHOLDSELECTOR_TR;Top-højre +TOOLBAR_TOOLTIP_COLORPICKER;Låsbar farvevælger\n\nNår værktøjet er aktivt:\n- Tilføj en vælger: venstre-klik.\n- Træk en vælger: venstre-klik og træk. \n- Slet en vælger: højreklik.\n- Slet alle vælgere: Ctrl+Shift+højreklik< /b>.\n- Vend tilbage til håndværktøj: højreklik uden for en hvilken som helst vælger. +TOOLBAR_TOOLTIP_CROP;Beskær det valgte.\nGenvej: c\nFlyt beskæringen med Shift+træk med musen. +TOOLBAR_TOOLTIP_HAND;Håndværktøj.\nGenvej: h +TOOLBAR_TOOLTIP_STRAIGHTEN;Ret ud / fin rotation.\nGenvej: s\n\nIndikér lodret eller vandret ved at tegne en hjælpelinje over billedet. Rotationsvinkel vil blive vist ved siden af ledelinjen. Rotationscentrum er billedets geometriske centrum. +TOOLBAR_TOOLTIP_WB;Spot hvidbalance.\nGenvej: w +TP_BWMIX_ALGO;Algoritme OYCPM +TP_BWMIX_ALGO_LI;Lineær +TP_BWMIX_ALGO_SP;Special-effekter +TP_BWMIX_ALGO_TOOLTIP;Lineær:vil producere en normal lineær respons.\nSpecial-effekter: vil producere specielle effekter ved at blande kanaler ikke-lineært. +TP_BWMIX_AUTOCH;Auto +TP_BWMIX_CC_ENABLED;Justér komplementære farver +TP_BWMIX_CC_TOOLTIP;Aktivér for at tillade automatisk justering af komplementære farver i ROYGCBPM-tilstand. +TP_BWMIX_CHANNEL;Luminans equalizer +TP_BWMIX_CURVEEDITOR1;'Før' kurve +TP_BWMIX_CURVEEDITOR2;'Efter' kurve +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone kurve, efter S/H konvertering, ved afslutningen af behandlingen. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone kurve,lige før S/H konvertering.\nKan tage højde for farvekomponenterne. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminans i henhold til farvetone L=f(H).\nVær opmærksom på ekstreme værdier, da de kan forårsage artefakter. +TP_BWMIX_FILTER;Farve Filter +TP_BWMIX_FILTER_BLUE;Blå +TP_BWMIX_FILTER_BLUEGREEN;Blå-Grøn +TP_BWMIX_FILTER_GREEN;Grøn +TP_BWMIX_FILTER_GREENYELLOW;Grøn-Gul +TP_BWMIX_FILTER_NONE;Ingen +TP_BWMIX_FILTER_PURPLE;Lilla +TP_BWMIX_FILTER_RED;Rød +TP_BWMIX_FILTER_REDYELLOW;Rød-Gul +TP_BWMIX_FILTER_TOOLTIP;Farvefilteret simulerer billeder taget med et farvet filter placeret foran objektivet. Farvede filtre reducerer transmissionen af specifikke farveområder og påvirker derfor deres lyshed. F. eks. et rød-filter giver mørkere blå himmel. +TP_BWMIX_FILTER_YELLOW;Gul +TP_BWMIX_GAMMA;Gamma Korrektion +TP_BWMIX_GAM_TOOLTIP;Korrigér gamma for hver RGB-kanal. +TP_BWMIX_LABEL;Sort-og-Hvid +TP_BWMIX_MET;Metode +TP_BWMIX_MET_CHANMIX;Kanalmikser +TP_BWMIX_MET_DESAT;Afmætning +TP_BWMIX_MET_LUMEQUAL;Luminans Equalizer +TP_BWMIX_MIXC;Kanalmikser +TP_BWMIX_NEUTRAL;Nulstil +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% +TP_BWMIX_RGBLABEL_HINT;Sluttelige RGB-faktorer, der tager sig af alle miksermulighederne.\n"Total" viser summen af RGB-værdierne:\n- altid 100 % i relativ tilstand\n- højere (lysere) eller lavere (mørkere) end 100 % i absolut tilstand. +TP_BWMIX_RGB_TOOLTIP;Bland RGB-kanalerne. Brug forudindstillinger som vejledning.\nVær opmærksom på negative værdier, der kan forårsage artefakter eller uberegnelig adfærd. +TP_BWMIX_SETTING;Forudindstillinger +TP_BWMIX_SETTING_TOOLTIP;Forskellige forudindstillinger (film, landskab osv.) eller manuelle kanalmixerindstillinger. +TP_BWMIX_SET_HIGHCONTAST;Høj kontrast +TP_BWMIX_SET_HIGHSENSIT;Høj følsomhed +TP_BWMIX_SET_HYPERPANCHRO;Hyper Pankromatisk +TP_BWMIX_SET_INFRARED;Infrarød +TP_BWMIX_SET_LANDSCAPE;Landskab +TP_BWMIX_SET_LOWSENSIT;Lav følsomhed +TP_BWMIX_SET_LUMINANCE;Luminans +TP_BWMIX_SET_NORMCONTAST;Normal Kontrast +TP_BWMIX_SET_ORTHOCHRO;Ortokromatisk +TP_BWMIX_SET_PANCHRO;Pankromatisk +TP_BWMIX_SET_PORTRAIT;Portræt +TP_BWMIX_SET_RGBABS;Absolut RGB +TP_BWMIX_SET_RGBREL;Relativ RGB +TP_BWMIX_SET_ROYGCBPMABS;Absolut ROYGCBPM +TP_BWMIX_SET_ROYGCBPMREL;Relativ ROYGCBPM +TP_BWMIX_TCMODE_FILMLIKE;S/H Film-agtigt +TP_BWMIX_TCMODE_SATANDVALBLENDING;S/H mætning og værdiblanding +TP_BWMIX_TCMODE_STANDARD;S/H Standard +TP_BWMIX_TCMODE_WEIGHTEDSTD;S/H Vægtet Standard +TP_BWMIX_VAL;L +TP_CACORRECTION_BLUE;Blå +TP_CACORRECTION_LABEL;Kromatisk Afvigelse Korrektion +TP_CACORRECTION_RED;Rød +TP_CBDL_AFT;Efter Sort-og-Hvid +TP_CBDL_BEF;Før Sort-og-Hvid +TP_CBDL_METHOD;Processen er lokaliseret +TP_CBDL_METHOD_TOOLTIP;Vælg, om værktøjet Kontrast ved detaljeniveauer skal placeres efter Sort-og-Hvid-værktøjet, som får det til at fungere i L*a*b*-rummet, eller før det, som får det til at fungere i RGB-rummet. +TP_CHMIXER_BLUE;Blå kanal +TP_CHMIXER_GREEN;Grøn kanal +TP_CHMIXER_LABEL;Kanalmikser +TP_CHMIXER_RED;Rød kanal +TP_COARSETRAF_TOOLTIP_HFLIP;Vend vandret. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotér til venstre.\n\nGenveje:\n[ - Tilstand med flere redigerings-faneblade,\nAlt-[ - Tilstand med enkelt redigerings-faneblad. +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotér til højre.\n\nGenveje:\n] - Tilstand med flere redigerings-faneblade,\nAlt-] - Tilstand med enkelt redigerings-faneblad. +TP_COARSETRAF_TOOLTIP_VFLIP;Vend lodret. +TP_COLORAPP_ABSOLUTELUMINANCE;Absolut luminans +TP_COLORAPP_ALGO;Algoritme +TP_COLORAPP_ALGO_ALL;Alt +TP_COLORAPP_ALGO_JC;Lyshed + Kroma (JC) +TP_COLORAPP_ALGO_JS;Lyshed + Mættet (JS) +TP_COLORAPP_ALGO_QM;Lysstyrke + Farverighed (QM) +TP_COLORAPP_ALGO_TOOLTIP;Giver dig mulighed for at vælge mellem parameter undersæt eller alle parametre. +TP_COLORAPP_BADPIXSL;Varmt/dødt pixelfilter +TP_COLORAPP_BADPIXSL_TOOLTIP;Undertrykkelse af varme/døde (meget lyst farvede) pixels.\n0 = Ingen effekt\n1 = Mellem\n2 = Gaussisk.\nAlternativt, justér billedet for at undgå meget mørke skygger.\n\nDisse artefakter skyldes begrænsninger i CIEFM02. +TP_COLORAPP_BRIGHT;Lysstyrke (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;Lysstyrke i CIEFM02 tager højde for luminansen i hvid, og adskiller sig fra L*a*b* og RGB lysstyrke. +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Ved manuel indstilling anbefales værdier over 65. +TP_COLORAPP_CHROMA;Kroma (C) +TP_COLORAPP_CHROMA_M;Farverighed (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;Farverighed i CIEFM02 adskiller sig fra L*a*b* og RGB farverighed. +TP_COLORAPP_CHROMA_S;Mætning (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;Mætning i CIEFM02 adskiller sig fra L*a*b* og RGB-mætning. +TP_COLORAPP_CHROMA_TOOLTIP;Kroma i CIEFM02 adskiller sig fra L*a*b* og RGB Kroma. +TP_COLORAPP_CIECAT_DEGREE;CAT02 tilpasning +TP_COLORAPP_CONTRAST;Kontrast (J) +TP_COLORAPP_CONTRAST_Q;Kontrast (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Afviger fra L*a*b* og RGB kontrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Afviger fra L*a*b* og RGB kontrast. +TP_COLORAPP_CURVEEDITOR1;Tonekurve 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Viser histogrammet for L* (L*a*b*) før CIEFM02.\nHvis afkrydsningsfeltet "Vis CIEFM02-outputhistogrammer i kurver" er aktiveret, vises histogrammet for J eller Q, efter CIEFM02.\n\nJ og Q er ikke vist i hovedhistogrampanelet.\n\nFor endelig output henvises til hovedhistogrampanelet. +TP_COLORAPP_CURVEEDITOR2;Tonekurve 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Samme brug som med anden eksponeringstonekurve. +TP_COLORAPP_CURVEEDITOR3;Farvekurve +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Justér enten Kroma, mætning eller farverighed.\n\nViser histogrammet for kromaticitet (L*a*b*) før CIEFM02.\nHvis afkrydsningsfeltet "Vis CIEFM02 output histogrammer i kurver" er aktiveret, vises histogrammet for C, s eller M, efter CIEFM02.\n\nC, s og M vises ikke i hovedhistogrampanelet.\nFor sluttelig output henvises til hovedhistogrampanelet. +TP_COLORAPP_DATACIE;CIEFM02 output histogrammer i kurver +TP_COLORAPP_DATACIE_TOOLTIP;Når det er aktiveret, viser histogrammer i CIEFM02-kurver omtrentlige værdier/intervaller for J eller Q, og C, s eller M efter CIEFM02-justeringerne.\nDette valg påvirker ikke hovedhistogrampanelet.\n\nNår de er deaktiveret, viser histogrammer i CIEFM02-kurverne L*a*b*-værdier før CIEFM02-justeringer. +TP_COLORAPP_FREE;Fri temp+grøn + CAT02 + [output] +TP_COLORAPP_GAMUT;Farveskalakontrol (L*a*b*) +TP_COLORAPP_HUE;Farvetone (h) +TP_COLORAPP_HUE_TOOLTIP;Farvetone (h) - vinkel mellem 0° og 360°. +TP_COLORAPP_LABEL;CIE Farveudseende Model 2002 +TP_COLORAPP_LABEL_CAM02;Billedjusteringer +TP_COLORAPP_LABEL_SCENE;Sceneforhold +TP_COLORAPP_LABEL_VIEWING;Visningsforhold +TP_COLORAPP_LIGHT;Lyshed (J) +TP_COLORAPP_LIGHT_TOOLTIP;Lyshed i CIEFM02 adskiller sig fra L*a*b* og RGB lyshed. +TP_COLORAPP_MEANLUMINANCE;Gennemsnitlig luminans (Yb%) +TP_COLORAPP_MODEL;Hvidpunktsmodel +TP_COLORAPP_MODEL_TOOLTIP;Hvidpunktsmodel.\n\nWB [RT] + [output]: RTs hvidbalance bruges til scenen, CIEFM02 er sat til D50, og outputenhedens hvidbalance er indstillet i visningsbetingelser.\n \nWB [RT+CAT02] + [output]: RTs hvidbalance-indstillinger bruges af CAT02, og output-enhedens hvidbalance er indstillet i visningsbetingelser.\n\nFri temp+grøn + CAT02 + [output]: temp og grøn vælges af brugeren, outputenhedens hvidbalance indstilles i Visningsbetingelser. +TP_COLORAPP_NEUTRAL;Nulstil +TP_COLORAPP_NEUTRAL_TOOLTIP;Nulstil alle skydere i afkrydsningsfeltet og kurverne til deres standardværdier +TP_COLORAPP_RSTPRO;Rød- & hud-toner beskyttelse +TP_COLORAPP_RSTPRO_TOOLTIP;Rød- & hud-toner; hudtone beskyttelse påvirker både skydere og kurver. +TP_COLORAPP_SURROUND;Efter omgivelserne +TP_COLORAPP_SURROUND_AVER;Gennemsnitligt +TP_COLORAPP_SURROUND_DARK;Dæmpet +TP_COLORAPP_SURROUND_DIM;Mørkt +TP_COLORAPP_SURROUND_EXDARK;Ekstremt mørkt (mørklægnings-gardin/plade) +TP_COLORAPP_SURROUND_TOOLTIP;Ændrer toner og farver for at tage højde for visningsforholdene for outputenheden.\n\nGennemsnit: Gennemsnitligt lysmiljø (standard). Billedet ændres ikke.\n\nDæmpet: Dæmpet miljø (TV). Billedet bliver lidt mørkt.\n\nMørkt: Mørkt miljø (projektor). Billedet bliver mere mørkt.\n\nEkstremt mørkt: Ekstremt mørke omgivelser (mørklægnings-gardin/plade). Billedet bliver meget mørkt. +TP_COLORAPP_TCMODE_BRIGHTNESS;Lysstyrke +TP_COLORAPP_TCMODE_CHROMA;Kroma +TP_COLORAPP_TCMODE_COLORF;Farverighed +TP_COLORAPP_TCMODE_LABEL1;Kurvetilstand 1 +TP_COLORAPP_TCMODE_LABEL2;Kurvetilstand 2 +TP_COLORAPP_TCMODE_LABEL3;Kurve kroma mode +TP_COLORAPP_TCMODE_LIGHTNESS;Lyshed +TP_COLORAPP_TCMODE_SATUR;Mætning +TP_COLORAPP_TEMP_TOOLTIP;For at vælge en lyskilde skal du altid indstille Farvetone=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TONECIE; bruger CIEFM02 +TP_COLORAPP_TONECIE_TOOLTIP;Hvis denne indstilling er deaktiveret, udføres tonetilknytning i L*a*b* farverum.\nAktiveret, udføres tonetilknytning ved hjælp af CIEFM02.\nTonetilknytnings-værktøjet skal være aktiveret for at denne indstilling kan træde i kraft. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolut luminans af visningsmiljøet\n(normalt 16 cd/m²). +TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] +TP_COLORAPP_WBRT;WB [RT] + [output] +TP_COLORTONING_AB;o C/L +TP_COLORTONING_AUTOSAT;Automatisk +TP_COLORTONING_BALANCE;Balance +TP_COLORTONING_BY;o C/L +TP_COLORTONING_CHROMAC;Opacitet +TP_COLORTONING_COLOR;Farve +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Kroma opacitet som en funktion af luminans oC=f(L) +TP_COLORTONING_HIGHLIGHT;Højlys +TP_COLORTONING_HUE;Farvetone +TP_COLORTONING_LAB;L*a*b* blanding +TP_COLORTONING_LABEL;Farvetoning +TP_COLORTONING_LABGRID;L*a*b* farvekorrektionsgitter +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Farvekorrektionsområder +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Kanal +TP_COLORTONING_LABREGION_CHANNEL_ALL;Alle +TP_COLORTONING_LABREGION_CHANNEL_B;Blå +TP_COLORTONING_LABREGION_CHANNEL_G;Grøn +TP_COLORTONING_LABREGION_CHANNEL_R;Rød +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Lyshed +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Rettelse +TP_COLORTONING_LABREGION_MASK;Maske +TP_COLORTONING_LABREGION_MASKBLUR;Maskesløring +TP_COLORTONING_LABREGION_OFFSET;Offset +TP_COLORTONING_LABREGION_POWER;Power +TP_COLORTONING_LABREGION_SATURATION;Mætning +TP_COLORTONING_LABREGION_SHOWMASK;Vis maske +TP_COLORTONING_LABREGION_SLOPE;Hældning +TP_COLORTONING_LUMA;Luminans +TP_COLORTONING_LUMAMODE;Bevar luminansen +TP_COLORTONING_LUMAMODE_TOOLTIP;Hvis aktiveret, når du skifter farve (rød, grøn, cyan, blå osv.), bevares luminansen af hver pixel. +TP_COLORTONING_METHOD;Metode +TP_COLORTONING_METHOD_TOOLTIP;"L*a*b*-blanding", "RGB-skydere" og "RGB-kurver" bruger interpoleret farveblanding.\n"Farvebalance (Skygger/Mellemtoner/Højlys)" og "Mætning 2 farver" bruger direkte farver.\n\ nSort-og-Hvid-værktøjet kan aktiveres, når du bruger enhver farvetonemetode, som giver mulighed for farvetoning. +TP_COLORTONING_MIDTONES;Mellemtoner +TP_COLORTONING_NEUTRAL;Nulstil skydere +TP_COLORTONING_NEUTRAL_TOOLTIP;Nulstil alle værdier (Skygger, Mellemtoner, Højlys) til standard. +TP_COLORTONING_OPACITY;Opacitet +TP_COLORTONING_RGBCURVES;RGB - Kurver +TP_COLORTONING_RGBSLIDERS;RGB - Skydere +TP_COLORTONING_SA;Mætningsbeskyttelse +TP_COLORTONING_SATURATEDOPACITY;Styrke +TP_COLORTONING_SATURATIONTHRESHOLD;Tærskel +TP_COLORTONING_SHADOWS;Skygger +TP_COLORTONING_SPLITCO;Skygger/Mellemtoner/Højlys +TP_COLORTONING_SPLITCOCO;Farvebalance Skygger/Mellemtoner/Højlys +TP_COLORTONING_SPLITLR;Mætning 2 farver +TP_COLORTONING_STR;Styrke +TP_COLORTONING_STRENGTH;Styrke +TP_COLORTONING_TWO2;Speciel kroma '2 farver' +TP_COLORTONING_TWOALL;Speciel kroma +TP_COLORTONING_TWOBY;Speciel a* og b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard kroma:\nLineær respons, a* = b*.\n\nSpeciel kroma:\nLineær respons, a* = b*, men ikke-bundet - prøv under diagonalen.\n\nSpeciel a* og b*:\nLineær respons ikke-bundet med seperate kurver for a* og b*. Beregnet til specielle effekter.\n\nSpeciel kroma 2 farver:\nMere forudsigelig. +TP_COLORTONING_TWOSTD;Standard kroma +TP_CROP_FIXRATIO;Låseforhold +TP_CROP_GTDIAGONALS;Diagonalernes regel +TP_CROP_GTEPASSPORT;Biometrisk pas +TP_CROP_GTFRAME;Ramme +TP_CROP_GTGRID;Gitter +TP_CROP_GTHARMMEANS;Harmoniske midler +TP_CROP_GTNONE;Ingen +TP_CROP_GTRULETHIRDS;Tredjedelsregelen +TP_CROP_GTTRIANGLE1;Gyldne trekanter 1 +TP_CROP_GTTRIANGLE2;Gyldne trekanter 2 +TP_CROP_GUIDETYPE;Guide type: +TP_CROP_H;Højde +TP_CROP_LABEL;Beskær +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Nulstil +TP_CROP_SELECTCROP;Vælg +TP_CROP_W;Bredde +TP_CROP_X;Venstre +TP_CROP_Y;Top +TP_DARKFRAME_AUTOSELECT;Automatisk valg +TP_DARKFRAME_LABEL;Mørk-Ramme +TP_DEFRINGE_LABEL;Defringe +TP_DEFRINGE_RADIUS;Radius +TP_DEFRINGE_THRESHOLD;Tærskel +TP_DEHAZE_DEPTH;Dybde +TP_DEHAZE_LABEL;Fjernelse af dis +TP_DEHAZE_SHOW_DEPTH_MAP;Vis dybdekort +TP_DEHAZE_STRENGTH;Styrke +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zoner +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisk global +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Krominans - Blå-Gul +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Krominans kurve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Forøg (multiplicer) værdien af alle krominansskydere.\nDenne kurve lader dig justere styrken af kromatisk støjreduktion som funktion af kromaticitet, for eksempel for at øge handlingen i områder med lav mætning og for at mindske den i områder med høj mætning. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Krominans +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuel +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Krominans - Master +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuel\nVirker på det fulde billede.\nDu styrer indstillingerne for støjreduktion manuelt.\n\nAutomatisk global\nVirker på det fulde billede.\n9 zoner bruges til at beregne en global krominans-støjreduktionsindstilling.\n\nForhåndsvisning virker på hele billedet.\nDen del af billedet, der er synlig i forhåndsvisningen, bruges til at beregne globale krominans støjreduktionsindstillinger. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manuel\nVirker på det fulde billede.\nDu styrer indstillingerne for støjreduktion manuelt.\n\nAutomatisk global\nVirker på det fulde billede.\n9 zoner bruges til at beregne en global krominans-støjreduktionsindstilling.\n\nAutomatiske multizoner \nIngen forhåndsvisning - virker kun under lagring, men ved at bruge "Forhånsvisning"-metoden ved at matche flisestørrelsen og midten, til forhåndsvisningsstørrelsen og midten, kan du få en idé om de forventede resultater.\nBilledet er opdelt i fliser (ca. 10 til 70 afhængigt af billedstørrelsen), og hver flise modtager sine egne indstillinger for krominansstøjreduktion.\n\nForhånsvisning\nVirkerer på hele billedet.\nDen del af billedet, der er synlig i forhåndsvisningen, bruges til at beregne globale indstillinger for krominansstøjreduktion. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Forhånsvisning multi-zoner +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Forhånsvisning +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Viser de resterende støjniveauer for den del af billedet, der er synlig i forhåndsvisningen efter wavelet.\n\n>300 Meget støjende\n100-300 Støjende\n50-100 Lidt støjende\n<50 Meget lav støj\n\nPas på, værdierne vil variere mellem RGB- og L*a*b*-tilstandene. RGB-værdierne er mindre nøjagtige, fordi RGB-tilstanden ikke adskiller luminans og krominans fuldstændigt. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Forhånsvisning størrelse=%1, Midte: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Forhånsvisning støj: Middel=%1 Høj=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Forhånsvisning støj: Middel= - Høj= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Flisestørrelse=%1, Midte: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Krominans - Rød-Grøn +TP_DIRPYRDENOISE_LABEL;Støjreduktion +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminans kontrol +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminans kurve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detaljegendannelse +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminans +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminans +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Farverum +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Til raw-billeder kan enten RGB- eller L*a*b*-metoder bruges.\n\nTil ikke-raw-billeder vil L*a*b*-metoden blive brugt, uanset valget. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varierer støjreduktionsstyrken på tværs af toneområdet. Mindre værdier vil målrette skygger, mens større værdier vil strække effekten til de lysere toner. +TP_DIRPYRDENOISE_MAIN_MODE;Mode +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressiv +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Konservativ +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Konservativ" bevarer lavfrekvente kroma-mønstre, mens "aggressiv" udsletter dem. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Median metode +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Kun kroma +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Kun luminans +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Når du bruger metoderne "Kun luminans" og "L*a*b*", vil medianfiltrering blive udført lige efter wavelet-trinnet i støjreduktionspipelinen.\nNår du bruger "RGB"-tilstanden, udføres den ved afslutningen af støjreduktionspipelinen. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Vægtet L* (lille) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterationer +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Anvendelse af tre median filteriterationer med en 3×3 vinduesstørrelse fører ofte til bedre resultater end ved at bruge en median filteriteration med en 7×7 vinduesstørrelse. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Tilføj et medianfilter af den ønskede vinduesstørrelse. Jo større vinduet er, jo længere tid tager det.\n\n3×3 blød: behandler 5 pixels i et 3×3 pixels vindue.\n3×3: behandler 9 pixels i et 3×3 pixels vindue.\n5×5 blød: behandler 13 pixels i et 5×5 pixel vindue.\n5×5: behandler 25 pixels i et 5×5 pixel vindue.\n7×7: behandler 49 pixels i et 7×7 pixel vindue.\n9×9: behandler 81 pixels i et 9×9 pixel vindue.\n\nNogle gange er det muligt at opnå højere kvalitet ved at køre flere iterationer med en mindre vinduesstørrelse end én iteration med et større vindue. +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 blød +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 blød +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYREQUALIZER_ALGO;Hudfarveområde +TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fint: tættere på hudens farver, minimerer virkningen på andre farver\nStor: undgår flere artefakter. +TP_DIRPYREQUALIZER_ARTIF;Reducér artefakter +TP_DIRPYREQUALIZER_HUESKIN;Hudfarve +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;Denne pyramide er for den øverste del, så vidt algoritmen har sin maksimale effektivitet.\nTil den nederste del, overgangszonerne.\nHvis du har brug for at flytte området væsentligt til venstre eller højre - eller hvis der er artefakter: hvidbalancen er forkert\nDu kan reducere zonen lidt for at forhindre, at resten af billedet påvirkes. +TP_DIRPYREQUALIZER_LABEL;Kontrast efter Detalje Niveauer +TP_DIRPYREQUALIZER_LUMACOARSEST;Groveste +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast - +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Kontrast + +TP_DIRPYREQUALIZER_LUMAFINEST;Finest +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +TP_DIRPYREQUALIZER_SKIN;Hudmålretning/beskyttelse +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Ved -100 bliver hudtoner angrebet.\nVed 0 behandles alle toner ens.\nVed +100 bliver hudtoner beskyttet, mens alle andre toner påvirkes. +TP_DIRPYREQUALIZER_THRESHOLD;Tærskel +TP_DIRPYREQUALIZER_TOOLTIP;Forsøger at reducere artefakter i overgangene mellem hudfarver (nuance, kroma, luma) og resten af billedet. +TP_DISTORTION_AMOUNT;Mængde +TP_DISTORTION_AUTO_TOOLTIP;Korrigerer automatisk objektivforvrængning i raw filer ved at matche dem med det indlejrede JPEG-billede, hvis et sådant findes og har fået dets objektivforvrængning automatisk korrigeret af kameraet. +TP_DISTORTION_LABEL;Forvrængningskorrektion +TP_EPD_EDGESTOPPING;Kantstopper +TP_EPD_GAMMA;Gamma +TP_EPD_LABEL;Tonekortlægning +TP_EPD_REWEIGHTINGITERATES;Genvægtning gentages +TP_EPD_SCALE;Vægt +TP_EPD_STRENGTH;Styrke +TP_EXPOSURE_AUTOLEVELS;Auto Niveauer +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Skifter udførelse af Auto Niveauer til automatisk at indstille Eksponeringsskyderværdier baseret på en billedanalyse.\nAktivér Højlys Rekonstruktion om nødvendigt. +TP_EXPOSURE_BLACKLEVEL;Sort +TP_EXPOSURE_BRIGHTNESS;Lyshed +TP_EXPOSURE_CLAMPOOG;Klip udenfor-farveskala farver +TP_EXPOSURE_CLIP;Klip % +TP_EXPOSURE_CLIP_TOOLTIP;Den del af pixels, der skal klippes i Auto Niveauer-indstilling. +TP_EXPOSURE_COMPRHIGHLIGHTS;Højlys kompression +TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Tærskel for højlys kompression +TP_EXPOSURE_COMPRSHADOWS;Skygge kompression +TP_EXPOSURE_CONTRAST;Kontrast +TP_EXPOSURE_CURVEEDITOR1;Tone kurve 1 +TP_EXPOSURE_CURVEEDITOR2;Tone kurve 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Se venligst RawPedia-artiklen "Eksponering > Tonekurver" for at lære, hvordan du opnår de bedste resultater ved at bruge to tonekurver. +TP_EXPOSURE_EXPCOMP;Eksponeringskompensation +TP_EXPOSURE_HISTMATCHING;Auto-matchet tonekurve +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Justér automatisk skydere og kurver (undtagen eksponeringskompensation) for at matche udseendet af den indlejrede JPEG thumbnail. +TP_EXPOSURE_LABEL;Eksponering +TP_EXPOSURE_SATURATION;Mætning +TP_EXPOSURE_TCMODE_FILMLIKE;Film-like +TP_EXPOSURE_TCMODE_LABEL1;Kurvetilstand 1 +TP_EXPOSURE_TCMODE_LABEL2;Kurvetilstand 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Luminans +TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptuel +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Mætning og værdiblanding +TP_EXPOSURE_TCMODE_STANDARD;Standard +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Vægtet Standard +TP_EXPOS_BLACKPOINT_LABEL;Raw Sort-punkter +TP_EXPOS_WHITEPOINT_LABEL;Raw Hvid-punkter +TP_FILMNEGATIVE_BLUE;Blå forhold +TP_FILMNEGATIVE_GREEN;Referenceeksponent (kontrast) +TP_FILMNEGATIVE_GUESS_TOOLTIP;Indstil automatisk rødt- og blåt-forholdet ved at vælge to felter, som havde en neutral farvetone (ingen farve) i den originale scene. Feltrene bør afvige i lysstyrke. Indstil hvidbalancen bagefter. +TP_FILMNEGATIVE_LABEL;Film Negativ +TP_FILMNEGATIVE_PICK;Vælg neutrale felter +TP_FILMNEGATIVE_RED;Rødt-forholdet +TP_FILMSIMULATION_LABEL;Film Simulation +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee er konfigureret til at søge efter Hald CLUT-billeder, som bruges til filmsimuleringsværktøjet, i en mappe, der tager for lang tid at indlæse.\nGå til Præferencer > Billedredigering > Filmsimulering\nfor at se, hvilken mappe der bruges. Du bør enten vise RawTherapee hen til en mappe, der kun indeholder Hald CLUT-billeder og intet andet, eller til en tom mappe, hvis du ikke vil bruge værktøjet Filmsimulering.\n\nLæs artiklen Filmsimulering i RawPedia for mere information. \n\nVil du annullere scanningen nu? +TP_FILMSIMULATION_STRENGTH;Styrke +TP_FILMSIMULATION_ZEROCLUTSFOUND;Sæt HaldCLUT mappe i Præferencer +TP_FLATFIELD_AUTOSELECT;Auto-selektion +TP_FLATFIELD_BLURRADIUS;Sløringsradius +TP_FLATFIELD_BLURTYPE;Sløringstype +TP_FLATFIELD_BT_AREA;Område +TP_FLATFIELD_BT_HORIZONTAL;Vandret +TP_FLATFIELD_BT_VERTHORIZ;Lodret + Vandret +TP_FLATFIELD_BT_VERTICAL;Lodret +TP_FLATFIELD_CLIPCONTROL;Klipkontrol +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Klipkontrol undgår klippede højlys forårsaget af anvendelse af det flade felt. Hvis der allerede er klippede højlys, før det flade felt anvendes, bruges værdien 0. +TP_FLATFIELD_LABEL;Fladt-Felt +TP_GENERAL_11SCALE_TOOLTIP;Effekterne af dette værktøj er kun synlige, eller kun nøjagtige i en forhåndsvisningsskala på 1:1. +TP_GRADIENT_CENTER;Center +TP_GRADIENT_CENTER_X;Center X +TP_GRADIENT_CENTER_X_TOOLTIP;Flyt gradient til venstre (negative værdier) eller højre (positive værdier). +TP_GRADIENT_CENTER_Y;Center Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Flyt gradient op (negative værdier) eller ned (positive værdier). +TP_GRADIENT_DEGREE;Vinkel +TP_GRADIENT_DEGREE_TOOLTIP;Rotationsvinkel i grader. +TP_GRADIENT_FEATHER;Fjer +TP_GRADIENT_FEATHER_TOOLTIP;Gradientbredde i procent af billeddiagonal. +TP_GRADIENT_LABEL;Gradueret Filter +TP_GRADIENT_STRENGTH;Styrke +TP_GRADIENT_STRENGTH_TOOLTIP;Filterstyrke i stop. +TP_HLREC_BLEND;Miks +TP_HLREC_CIELAB;CIELab Miksning +TP_HLREC_COLOR;Farveudbredelse +TP_HLREC_ENA_TOOLTIP;Kunne aktiveres af Auto Niveauer. +TP_HLREC_LABEL;Højlys rekonstruktion +TP_HLREC_LUMINANCE;Luminansgendannelse +TP_HLREC_METHOD;Metode: +TP_HSVEQUALIZER_CHANNEL;Kanal +TP_HSVEQUALIZER_HUE;H +TP_HSVEQUALIZER_LABEL;HSV Equalizer +TP_HSVEQUALIZER_SAT;S +TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline eksponering +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Anvend den indlejrede DCP-baseline eksponeringsoffset. Indstillingen er kun tilgængelig, hvis den valgte DCP har en. +TP_ICM_APPLYHUESATMAP;Basistabel +TP_ICM_APPLYHUESATMAP_TOOLTIP;Anvend den indlejrede DCP-basistabel (FarvetoneSatMap). Indstillingen er kun tilgængelig, hvis den valgte DCP har en. +TP_ICM_APPLYLOOKTABLE;Look tabel +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Brug den indlejrede DCP-looktabel. Indstillingen er kun tilgængelig, hvis den valgte DCP har en. +TP_ICM_BPC;Sortpunkts kompensation +TP_ICM_DCPILLUMINANT;Lyskilde +TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpoleret +TP_ICM_DCPILLUMINANT_TOOLTIP;Vælg hvilken indlejret DCP-lyskilde, der skal bruges. Standard er "interpoleret", hvilket er en blanding mellem de to baseret på hvidbalance. Indstillingen er kun tilgængelig, hvis en dual-illuminant DCP med interpolationsunderstøttelse er valgt. +TP_ICM_INPUTCAMERA;Kamera standard +TP_ICM_INPUTCAMERAICC;Automatisk matchet kameraprofil +TP_ICM_INPUTCAMERAICC_TOOLTIP;Brug RawTherapees kameraspecifikke DCP- eller ICC-inputfarveprofiler. Disse profiler er mere præcise end simplere matrixprofiler. De er ikke tilgængelige for alle kameraer. Disse profiler gemmes i mapperne /iccprofiles/input og /dcpprofiles og hentes automatisk baseret på et filnavn, der matcher kameraets nøjagtige modelnavn. +TP_ICM_INPUTCAMERA_TOOLTIP;Brug en simpel farvematrix fra dcraw, en forbedret RawTherapee-version (afhængig af hvilken der er tilgængelig baseret på kameramodel) eller en integreret i DNG. +TP_ICM_INPUTCUSTOM;Standard +TP_ICM_INPUTCUSTOM_TOOLTIP;Vælg din egen DCP/ICC farveprofil-fil til kameraet. +TP_ICM_INPUTDLGLABEL;Vælg Input DCP/ICC profil... +TP_ICM_INPUTEMBEDDED;Brug indlejret, hvis muligt +TP_ICM_INPUTEMBEDDED_TOOLTIP;Brug farveprofil, der er indlejret i ikke-raw filer. +TP_ICM_INPUTNONE;Ingen profil +TP_ICM_INPUTNONE_TOOLTIP;Brug ingen inputfarveprofil overhovedet.\nBrug kun i særlige tilfælde. +TP_ICM_INPUTPROFILE;Input Profil +TP_ICM_LABEL;Farvestyring +TP_ICM_NOICM;No ICM: sRGB Output +TP_ICM_OUTPUTPROFILE;Output Profil +TP_ICM_PROFILEINTENT;Ønsket gengivelse +TP_ICM_SAVEREFERENCE;Gem referencebillede +TP_ICM_SAVEREFERENCE_APPLYWB;Tilføj hvidbalance +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generelt, tilføj hvidbalance når du gemmer billeder for at oprette ICC-profiler, og undlad at tilføje hvidbalance for at oprette DCP-profiler. +TP_ICM_SAVEREFERENCE_TOOLTIP;Gem det lineære TIFF-billede, før inputprofilen tilføjes. Resultatet kan bruges til kalibreringsformål og generering af en kameraprofil. +TP_ICM_TONECURVE;Tonekurve +TP_ICM_TONECURVE_TOOLTIP;Anvend den indlejrede DCP-tonekurve. Indstillingen er kun tilgængelig, hvis den valgte DCP har en tonekurve. +TP_ICM_WORKINGPROFILE;Arbejdsprofil +TP_ICM_WORKING_TRC;Toneresponskurve: +TP_ICM_WORKING_TRC_CUSTOM;Standard +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;Ingen +TP_ICM_WORKING_TRC_SLOPE;Hældning +TP_ICM_WORKING_TRC_TOOLTIP;Kun til indbyggede profiler. +TP_IMPULSEDENOISE_LABEL;Impuls støjreduktion +TP_IMPULSEDENOISE_THRESH;Tærskel +TP_LABCURVE_AVOIDCOLORSHIFT;Undgå farveforskydning +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Tilpas farver til farveskalaen af arbejdsfarverum og tilføj Munsell korrektion. +TP_LABCURVE_BRIGHTNESS;Lyshed +TP_LABCURVE_CHROMATICITY;Kromaticitet +TP_LABCURVE_CHROMA_TOOLTIP;Indstil kromacitet til -100 for at anvende S/H toning. +TP_LABCURVE_CONTRAST;Kontrast +TP_LABCURVE_CURVEEDITOR;Luminans kurve +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Grøn Mættet +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Grøn Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Rød Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Rød Mættet +TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blå Mættet +TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blå Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE3;Gul Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE4;Gul Mættet +TP_LABCURVE_CURVEEDITOR_CC;CC +TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Kedelig +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Mættet +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Kromaticitet i forhold til kromaticitet C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Kromaticitet i forhold til farvetone C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Kromaticitet i forhold til luminans C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Farvetone i forhold til farvetone H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminans i forhold til kromaticitet L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminans i forhold til farvetone L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminans i forhold til luminans L=f(L) +TP_LABCURVE_LABEL;L*a*b* Justeringer +TP_LABCURVE_LCREDSK;Begræns LC til rød og hudtoner +TP_LABCURVE_LCREDSK_TOOLTIP;Hvis den er aktiveret, påvirker LC-kurven kun rød og hudtoner.\nHvis den er deaktiveret, gælder den for alle toner. +TP_LABCURVE_RSTPROTECTION;Rød og hudtone beskyttelse +TP_LABCURVE_RSTPRO_TOOLTIP;Virker på Kromaticitet-skyderen og CC-kurven. TP_LENSGEOM_AUTOCROP;Auto-beskæring +TP_LENSGEOM_FILL;Auto-udfyld +TP_LENSGEOM_LABEL;Objektiv/Geometri +TP_LENSGEOM_LIN;Lineær +TP_LENSGEOM_LOG;Logaritmisk +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatisk valgt +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP fil +TP_LENSPROFILE_CORRECTION_MANUAL;Manuelt valgt +TP_LENSPROFILE_LABEL;Profileret objektivkorrektion +TP_LENSPROFILE_LENS_WARNING;Advarsel: Beskæringsfaktoren, der bruges til objektivprofilering, er større end beskæringsfaktoren for kameraet, resultaterne kan være forkerte. +TP_LENSPROFILE_MODE_HEADER;Objektiv Profil +TP_LENSPROFILE_USE_CA;Kromatisk afvigelse +TP_LENSPROFILE_USE_GEOMETRIC;Geometrisk forvrængning +TP_LENSPROFILE_USE_HEADER;Korrekt +TP_LENSPROFILE_USE_VIGNETTING;Vignettering +TP_LOCALCONTRAST_AMOUNT;Mængde +TP_LOCALCONTRAST_DARKNESS;Mørk-niveau +TP_LOCALCONTRAST_LABEL;Lokal Kontrast +TP_LOCALCONTRAST_LIGHTNESS;Lys-niveau +TP_LOCALCONTRAST_RADIUS;Radius +TP_METADATA_EDIT;Tilføj modifikationer +TP_METADATA_MODE;Metadata kopiér mode +TP_METADATA_STRIP;Fjern alle metadata +TP_METADATA_TUNNEL;Kopiér uændret +TP_NEUTRAL;Nulstil +TP_NEUTRAL_TOOLTIP;Nulstiller eksponeringsskyderne til neutrale værdier.\nGælder for de samme kontroller, som Auto Niveauer gælder for, uanset om du har brugt Auto Niveauer eller ej. +TP_PCVIGNETTE_FEATHER;Fjer +TP_PCVIGNETTE_FEATHER_TOOLTIP;Fler(blødgøring):\n0 = kun hjørner,\n50 = halvvejs til center,\n100 = til center. +TP_PCVIGNETTE_LABEL;Vignetteringsfilter +TP_PCVIGNETTE_ROUNDNESS;Rundhed +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Rundhed:\n0 = rektangel,\n50 = tilpasset ellipse,\n100 = cirkel. +TP_PCVIGNETTE_STRENGTH;Styrke +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstyrke i stop (nået i hjørner). +TP_PDSHARPENING_LABEL;Input skærpning +TP_PERSPECTIVE_HORIZONTAL;Vandret +TP_PERSPECTIVE_LABEL;Perspektiv +TP_PERSPECTIVE_VERTICAL;Lodret +TP_PFCURVE_CURVEEDITOR_CH;Farvetone +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Styrer defringe styrke efter farve.\nHøjere = mere,\nLavere = mindre. +TP_PREPROCESS_DEADPIXFILT;Døde-pixels filter +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Forsøger at undertrykke døde pixels. +TP_PREPROCESS_GREENEQUIL;Grøn ligevægt +TP_PREPROCESS_HOTPIXFILT;Varme-pixels filter +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Forsøger at undertrykke varme pixels. +TP_PREPROCESS_LABEL;Forbehandling +TP_PREPROCESS_LINEDENOISE;Linje støjfilter +TP_PREPROCESS_LINEDENOISE_DIRECTION;Retning +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Begge +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Vandret +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Vandret kun på PDAF rækker +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Lodret +TP_PREPROCESS_NO_FOUND;Ingen fundet +TP_PREPROCESS_PDAFLINESFILTER;PDAF linjefilter +TP_PRSHARPENING_LABEL;Skærpning efter ændring af størrelse +TP_PRSHARPENING_TOOLTIP;Gør billedet skarpere efter ændring af størrelse. Virker kun, når "Lanczos"-størrelsesændringdsmetoden bruges. Det er umuligt at forhåndsvise virkningerne af dette værktøj. Se RawPedia for brugsinstruktioner. +TP_RAWCACORR_AUTO;Auto-korrektion +TP_RAWCACORR_AUTOIT;Gentagelser +TP_RAWCACORR_AUTOIT_TOOLTIP;Denne indstilling er tilgængelig, når "Autokorrektion" er markeret.\nAutokorrektion er konservativ, hvilket betyder, at den ofte ikke retter alle kromatiske afvigelser.\nFor at rette den resterende kromatisk afvigelse kan du bruge op til fem iterationer af automatisk kromatisk afvigelseskorrektion.\nHver iteration vil reducere den resterende kromatisk afvigelse fra sidste iteration, på bekostning af yderligere behandlingstid. +TP_RAWCACORR_AVOIDCOLORSHIFT;Undgå farveforskydning +TP_RAWCACORR_CABLUE;Blå +TP_RAWCACORR_CARED;Rød +TP_RAWCACORR_LABEL;Kromatisk Afvigelse Korrektion +TP_RAWEXPOS_BLACK_0;Grøn 1 (master) +TP_RAWEXPOS_BLACK_1;Rød +TP_RAWEXPOS_BLACK_2;Blå +TP_RAWEXPOS_BLACK_3;Grøn 2 +TP_RAWEXPOS_BLACK_BLUE;Blå +TP_RAWEXPOS_BLACK_GREEN;Grøn +TP_RAWEXPOS_BLACK_RED;Rød +TP_RAWEXPOS_LINEAR;Hvidpunkts korrektion +TP_RAWEXPOS_RGB;Rød, Grøn, Blå +TP_RAWEXPOS_TWOGREEN;Kæd grønne sammen +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;Billedkant +TP_RAW_DCB;DCB +TP_RAW_DCBENHANCE;DCB forbedring +TP_RAW_DCBITERATIONS;Antal DCB-iterationer +TP_RAW_DCBVNG4;DCB+VNG4 +TP_RAW_DMETHOD;Metode +TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaiking... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaik forfining... +TP_RAW_DMETHOD_TOOLTIP;Bemærk: IGV og LMMSE er dedikeret til billeder med høj ISO for at hjælpe med støjreduktion uden at det fører til labyrintmønstre, posterisering eller et udvasket udseende.\nPixel Shift er til Pentax/Sony Pixel Shift-filer. Det falder tilbage til AMaZE for ikke-Pixel Shift-filer. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto tærskel +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Hvis afkrydsningsfeltet er markeret (anbefales), beregner RawTherapee en optimal værdi baseret på flade områder i billedet.\nHvis der ikke er et fladt område i billedet, eller billedet er for støjfyldt, indstilles værdien til 0.\nFor at indstille værdien manuelt, fjern markeringen i afkrydsningsfeltet først (rimelige værdier afhænger af billedet). +TP_RAW_DUALDEMOSAICCONTRAST;Kontrasttærskel +TP_RAW_EAHD;EAHD +TP_RAW_FALSECOLOR;Trin til undertrykkelse af forkerte farver +TP_RAW_FAST;Hurtig +TP_RAW_HD;Tærskel +TP_RAW_HD_TOOLTIP;Lavere værdier gør detektion af varme/døde pixels mere aggressiv, men falske positiver kan føre til artefakter. Hvis du bemærker, at der opstår artefakter, når du aktiverer Varm/Død Pixel-filtrene, skal du gradvist øge tærskelværdien, indtil de forsvinder. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Under-billede +TP_RAW_IMAGENUM_SN;SN tilstand +TP_RAW_IMAGENUM_TOOLTIP;Nogle raw-filer består af flere underbilleder (Pentax/Sony Pixel Shift, Pentax 3-i-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nNår du bruger en anden demosaiking metode end Pixel Shift, vælger dette hvilket under-billede der bruges.\n\nNår du bruger Pixel Shift demosaiking metoden på et Pixel Shift raw, bruges alle underbilleder, og dette vælger hvilket underbillede der skal bruges til bevægelige dele. +TP_RAW_LABEL;Demosaiking +TP_RAW_LMMSE;LMMSE +TP_RAW_LMMSEITERATIONS;LMMSE forbedringstrin +TP_RAW_LMMSE_TOOLTIP;Tilføjer gamma (trin 1), median (trin 2-4) og forfining (trin 5-6) for at reducere artefakter og forbedre signal-til-støj-forholdet. +TP_RAW_MONO;Mono +TP_RAW_NONE;Ingen (Viser sensor mønster) +TP_RAW_PIXELSHIFT;Pixel Shift +TP_RAW_PIXELSHIFTBLUR;Slør bevægelsesmaske +TP_RAW_PIXELSHIFTDMETHOD;Demosaisk metode til bevægelse +TP_RAW_PIXELSHIFTEPERISO;Følsomhed +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Standardværdien på 0 burde fungere fint for basis ISO.\nHøjere værdier øger følsomheden af bevægelsesregistrering.\nSkift i små trin, og se bevægelsesmasken, mens du skifter.\nForøg følsomheden for undereksponerede eller høj-ISO billeder. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Udligne lysstyrke af rammer +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Udlign pr. kanal +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Aktiveret: Udlign RGB-kanalerne individuelt.\nDeaktiveret: Brug samme udligningsfaktor for alle kanaler. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Udlign lysstyrken af rammerne til lysstyrken for den valgte ramme.\nHvis der er overeksponerede områder i rammerne, skal du vælge den mest lysstærke ramme for at undgå magentafarver i overeksponerede områder, eller aktivere bevægelseskorrektion. +TP_RAW_PIXELSHIFTGREEN;Tjek grøn kanal for bevægelse +TP_RAW_PIXELSHIFTHOLEFILL;Fyld huller i bevægelsesmasken +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fyld huller i bevægelsesmasken +TP_RAW_PIXELSHIFTMEDIAN;Brug median til bevægelige dele +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Brug medianen af alle rammer i stedet for den valgte ramme for områder med bevægelse.\nFjerner objekter, der er på forskellige steder i alle rammer.\nGiver bevægelseseffekt på objekter, der bevæger sig langsomt (overlappende). +TP_RAW_PIXELSHIFTMM_AUTO;Automatisk +TP_RAW_PIXELSHIFTMM_CUSTOM;Standard +TP_RAW_PIXELSHIFTMM_OFF;Fra +TP_RAW_PIXELSHIFTMOTIONMETHOD;Bevægelseskorrektion +TP_RAW_PIXELSHIFTNONGREENCROSS;Tjek rød/blå kanaler for bevægelse +TP_RAW_PIXELSHIFTSHOWMOTION;Vis bevægelsesmaske +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Vis kun bevægelsesmaske +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Viser bevægelsesmasken uden billedet. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlejrer billedet med en grøn maske, der viser områderne med bevægelse. +TP_RAW_PIXELSHIFTSIGMA;Sløringsradius +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Standardradius på 1,0 passer normalt godt til basis ISO.\nForøg værdien for billeder med høj ISO, 5,0 er et godt udgangspunkt.\nSe bevægelsesmasken, mens du ændrer værdien. +TP_RAW_PIXELSHIFTSMOOTH;Glatte overgange +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Glatte overgange mellem områder med bevægelse og områder uden.\nSæt til 0 for at deaktivere overgangsudjævning.\nSæt til 1 for enten at få AmaZE/LMMSE resultatet af den valgte frame (afhængigt af om "Brug LMMSE" er valgt), eller medianen af alle fire rammer, hvis "Brug median" er valgt. +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Sensor med Bayer Matrix +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass giver de bedste resultater (anbefales til billeder med lav ISO).\n1-pass kan næsten ikke skelnes fra 3-pass for billeder med høj ISO og er hurtigere.\n+hurtig giver færre artefakter i flade områder +TP_RAW_SENSOR_XTRANS_LABEL;Sensor med X-Trans Matrix +TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;Hurtig X-Trans +TP_RESIZE_ALLOW_UPSCALING;Tillad opskalering +TP_RESIZE_APPLIESTO;Gælder for: +TP_RESIZE_CROPPEDAREA;Beskåret område +TP_RESIZE_FITBOX;Afgrænsningskasse +TP_RESIZE_FULLIMAGE;Fuldt billede +TP_RESIZE_H;Højde: +TP_RESIZE_HEIGHT;Højde +TP_RESIZE_LABEL;Ændr størrelse +TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_METHOD;Metode: +TP_RESIZE_NEAREST;Nærmeste +TP_RESIZE_SCALE;Vægt +TP_RESIZE_SPECIFY;Specificér: +TP_RESIZE_W;Bredde: +TP_RESIZE_WIDTH;Bredde +TP_RETINEX_CONTEDIT_HSL;HSL histogram +TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +TP_RETINEX_CONTEDIT_LH;Farvetone +TP_RETINEX_CONTEDIT_MAP;Equalizer +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminans i henhold til luminans L=f(L)\nKorrigér raw data for at reducere glorier og artefakter. +TP_RETINEX_CURVEEDITOR_LH;Styrke=f(H) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Styrke i henhold til farvetone Styrke=f(H)\nDenne kurve virker også på kroma ved brug af "Højlys" retinex-metoden. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Denne kurve kan påføres alene eller med en gaussisk maske eller wavelet-maske.\nPas på - artefakter! +TP_RETINEX_EQUAL;Equalizer +TP_RETINEX_FREEGAMMA;Fri gamma +TP_RETINEX_GAIN;Forstærk +TP_RETINEX_GAINOFFS;Forstærk og Offset (lysstyrke) +TP_RETINEX_GAINTRANSMISSION;Forstærk transmission +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Forstærk eller reducér transmissionskortet for at opnå den ønskede luminans.\nX-aksen er transmissionen.\nY-aksen er forstærkningen. +TP_RETINEX_GAMMA;Gamma +TP_RETINEX_GAMMA_FREE;Fri +TP_RETINEX_GAMMA_HIGH;Høj +TP_RETINEX_GAMMA_LOW;Lav +TP_RETINEX_GAMMA_MID;Mellem +TP_RETINEX_GAMMA_NONE;Ingen +TP_RETINEX_GAMMA_TOOLTIP;Gendan toner ved at påføre gamma før og efter Retinex. Forskelligt fra Retinex-kurver eller andre kurver (Lab, Eksponering osv.). +TP_RETINEX_GRAD;Transmissionsgradient +TP_RETINEX_GRADS;Styrke gradient +TP_RETINEX_GRADS_TOOLTIP;Hvis skyderen står på 0, er alle iterationer identiske.\nHvis > 0 Styrken reduceres, når iterationerne øges, og omvendt. +TP_RETINEX_GRAD_TOOLTIP;Hvis skyderen står på 0, er alle iterationer identiske.\nHvis > 0 Varians og Tærskel reduceres, når iterationer øges, og omvendt. +TP_RETINEX_HIGH;Høj +TP_RETINEX_HIGHLIG;Højlys +TP_RETINEX_HIGHLIGHT;Højlys tærskel +TP_RETINEX_HIGHLIGHT_TOOLTIP;Forøg handlingen af Høj-algoritmen.\nKan kræve, at du genjusterer "Nabopixels" og øger "Hvidpunkts korrektion" på fanen Raw -> Raw hvide punkter. +TP_RETINEX_HSLSPACE_LIN;HSL-lineær +TP_RETINEX_HSLSPACE_LOG;HSL-Logaritmisk +TP_RETINEX_ITER;Gentagelser (Tone-mapping) +TP_RETINEX_ITERF; +TP_RETINEX_ITER_TOOLTIP;Simulér en tone-mapping-operator.\nHøje værdier øger behandlingstiden. +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Maske +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Lav +TP_RETINEX_MAP;Metode +TP_RETINEX_MAP_GAUS;Gaussisk maske +TP_RETINEX_MAP_MAPP;Skarp maske (wavelet partiel) +TP_RETINEX_MAP_MAPT;Skarp maske (wavelet total) +TP_RETINEX_MAP_METHOD_TOOLTIP;Brug masken genereret af Gaussisk-funktionen ovenfor (Radius, Metode) til at reducere glorier og artefakter.\n\nKun kurve: tilføj en diagonal kontrastkurve på masken.\nPas på artefakter!\n\nGaussisk maske: generér og brug en Gaussisk sløring af den originale maske.\nHurtig.\n\nSkarp maske: generér og brug en wavelet på den originale maske.\nLangsom. +TP_RETINEX_MAP_NONE;Ingen +TP_RETINEX_MEDIAN;Transmission median filter +TP_RETINEX_METHOD;Metode +TP_RETINEX_METHOD_TOOLTIP;Lav = Forstærk svagt lys.\nEnsartet = Equalize handling.\nHøj = Forstærk højlys.\nHøjlys = Fjern magenta i højlys. +TP_RETINEX_MLABEL;Gendannet dis-fri Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;Bør være tæt på min=0 max=32768\nGendannet billede uden blanding. +TP_RETINEX_NEIGHBOR;Radius +TP_RETINEX_NEUTRAL;Nulstil +TP_RETINEX_NEUTRAL_TOOLTIP;Nulstil alle skydere og kurver til deres standardværdier. +TP_RETINEX_OFFSET;Offset (lysstyrke) +TP_RETINEX_SCALES;Gaussian gradient +TP_RETINEX_SCALES_TOOLTIP;Hvis skyderen står på 0, er alle iterationer identiske.\nHvis > 0 Vægt og radius reduceres, når iterationer øges, og omvendt. +TP_RETINEX_SETTINGS;Indstillinger +TP_RETINEX_SKAL;Vægt +TP_RETINEX_SLOPE;Fri gamma hældning +TP_RETINEX_STRENGTH;Styrke +TP_RETINEX_THRESHOLD;Tærskel +TP_RETINEX_THRESHOLD_TOOLTIP;Begrænser ind/ud.\nInd = billedkilde,\nUd = billede 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;Transmissionskortresultat.\Min og Max bruges af Variance.\Mean og Sigma.\nTm=Min TM=Maks af transmissionskort. +TP_RETINEX_TRANF;Transmission +TP_RETINEX_TRANSMISSION;Transmissionskort +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission i henhold til transmission.\nVandret akse: transmission fra negative værdier (min), middelværdier og positive værdier (maks.).\nLodret akse: forstærkning eller reduktion. +TP_RETINEX_UNIFORM;Ensartet +TP_RETINEX_VARIANCE;Kontrast +TP_RETINEX_VARIANCE_TOOLTIP;Lav varians øger lokal kontrast og mætning, men kan føre til artefakter. +TP_RETINEX_VIEW;Proces +TP_RETINEX_VIEW_MASK;Mask +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal visning.\nMaske - Viser masken.\nUskarp maske - Viser billedet med en uskarp maske med høj radius.\nTransmission - Auto/Fixet - Viser transmissionskortet før enhver handling på kontrast og lysstyrke.\n \nBemærk: masken svarer ikke til virkeligheden, men er forstærket for at gøre den mere synlig. +TP_RETINEX_VIEW_NONE;Standard +TP_RETINEX_VIEW_TRAN;Transmission - Auto +TP_RETINEX_VIEW_TRAN2;Transmission - Fixed +TP_RETINEX_VIEW_UNSHARP;Uskarp maske +TP_RGBCURVES_BLUE;B +TP_RGBCURVES_CHANNEL;Kanal +TP_RGBCURVES_GREEN;G +TP_RGBCURVES_LABEL;RGB Kurver +TP_RGBCURVES_LUMAMODE;Luminanstilstand +TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminanstilstand gør det muligt at variere bidraget fra R-, G- og B-kanaler til billedets luminans uden at ændre billedfarven. +TP_RGBCURVES_RED;R +TP_ROTATE_DEGREE;Grad +TP_ROTATE_LABEL;Rotér +TP_ROTATE_SELECTLINE;Vælg lige linje +TP_SAVEDIALOG_OK_TOOLTIP;Genvej: Ctrl-Enter +TP_SHADOWSHLIGHTS_HIGHLIGHTS;Højlys +TP_SHADOWSHLIGHTS_HLTONALW;Højlys tonal bredde +TP_SHADOWSHLIGHTS_LABEL;Skygger/Højlys +TP_SHADOWSHLIGHTS_RADIUS;Radius +TP_SHADOWSHLIGHTS_SHADOWS;Skygger +TP_SHADOWSHLIGHTS_SHTONALW;Skygger tonal bredde +TP_SHARPENEDGE_AMOUNT;Mængde +TP_SHARPENEDGE_LABEL;Skærpen kanter +TP_SHARPENEDGE_PASSES;Gentagelser +TP_SHARPENEDGE_THREE;Kun luminans +TP_SHARPENING_AMOUNT;Mængde +TP_SHARPENING_BLUR;Sløringsradius +TP_SHARPENING_CONTRAST;Kontrasttærskel +TP_SHARPENING_EDRADIUS;Radius +TP_SHARPENING_EDTOLERANCE;Kanttolerance +TP_SHARPENING_HALOCONTROL;Gloriekontrol +TP_SHARPENING_HCAMOUNT;Mængde +TP_SHARPENING_ITERCHECK;Autobegræns gentagelser +TP_SHARPENING_LABEL;Skærpe +TP_SHARPENING_METHOD;Metode +TP_SHARPENING_ONLYEDGES;Skærp kun kanter +TP_SHARPENING_RADIUS;Radius +TP_SHARPENING_RADIUS_BOOST;Forstærkning af hjørneradius +TP_SHARPENING_RLD;RL Dekonvolution +TP_SHARPENING_RLD_AMOUNT;Mængde +TP_SHARPENING_RLD_DAMPING;Dæmpning +TP_SHARPENING_RLD_ITERATIONS;Gentagelser +TP_SHARPENING_THRESHOLD;Tærskel +TP_SHARPENING_USM;Uskarp maske +TP_SHARPENMICRO_AMOUNT;Mængde +TP_SHARPENMICRO_CONTRAST;Kontrasttærskel +TP_SHARPENMICRO_LABEL;Mikrokontrast +TP_SHARPENMICRO_MATRIX;3×3 matrix i stedet for 5×5 +TP_SHARPENMICRO_UNIFORMITY;Ensartethed +TP_SOFTLIGHT_LABEL;Blødt lys +TP_SOFTLIGHT_STRENGTH;Styrke +TP_TM_FATTAL_AMOUNT;Mængde +TP_TM_FATTAL_ANCHOR;Anker +TP_TM_FATTAL_LABEL;Dynamisk områdekomprimering +TP_TM_FATTAL_THRESHOLD;Detalje +TP_VIBRANCE_AVOIDCOLORSHIFT;Undgå farveforskydning +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Hudtoner +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rød/Lilla +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Rød +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Rød/Gul +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Gul +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Farvetone i henhold til farvetone H=f(H) +TP_VIBRANCE_LABEL;Vibrance +TP_VIBRANCE_PASTELS;Pastel Toner +TP_VIBRANCE_PASTSATTOG;Knyt pastel og mættede toner sammen +TP_VIBRANCE_PROTECTSKINS;Beskyt hudtoner +TP_VIBRANCE_PSTHRESHOLD;Pastel/mættede toners tærskel +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Mætningstærskel +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;Den lodrette akse repræsenterer pastel toner i bunden og mættede toner i toppen.\nDen vandrette akse repræsenterer mætningsområdet. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/mættet overgangsvægtning +TP_VIBRANCE_SATURATED;Mættede Toner +TP_VIGNETTING_AMOUNT;Mængde +TP_VIGNETTING_CENTER;Center +TP_VIGNETTING_CENTER_X;Center X +TP_VIGNETTING_CENTER_Y;Center Y +TP_VIGNETTING_LABEL;Vignettekorrektion +TP_VIGNETTING_RADIUS;Radius +TP_VIGNETTING_STRENGTH;Styrke +TP_WAVELET_1;Niveau 1 +TP_WAVELET_2;Niveau 2 +TP_WAVELET_3;Niveau 3 +TP_WAVELET_4;Niveau 4 +TP_WAVELET_5;Niveau 5 +TP_WAVELET_6;Niveau 6 +TP_WAVELET_7;Niveau 7 +TP_WAVELET_8;Niveau 8 +TP_WAVELET_9;Niveau 9 +TP_WAVELET_APPLYTO;Tilføj Til +TP_WAVELET_AVOID;Undgå farveskift +TP_WAVELET_B0;Sort +TP_WAVELET_B1;Grå +TP_WAVELET_B2;Resterende +TP_WAVELET_BACKGROUND;Baggrund +TP_WAVELET_BACUR;Kurve +TP_WAVELET_BALANCE;Kontrastbalance d/v-h +TP_WAVELET_BALANCE_TOOLTIP;Ændrer balancen mellem wavelet-retningerne: lodret-vandret og diagonal.\nHvis kontrast-, kroma- eller resttonemapping er aktiveret, er effekten på basis af balance forstærket. +TP_WAVELET_BALCHRO;Kroma balance +TP_WAVELET_BALCHRO_TOOLTIP;Hvis aktiveret, ændrer 'Kontrastbalance'-kurven eller -skyderen også kroma-balancen. +TP_WAVELET_BANONE;Ingen +TP_WAVELET_BASLI;Skyder +TP_WAVELET_BATYPE;Kontrastbalance metode +TP_WAVELET_CBENAB;Toning og Farveballance +TP_WAVELET_CB_TOOLTIP;For stærke værdier - produktfarvetoning ved at kombinere det eller ej med niveauer dekomponering 'toning'\nFor lave værdier kan du ændre hvidbalancen af baggrunden (himmel, ...) uden at ændre den for frontplanet, generelt mere kontrasteret +TP_WAVELET_CCURVE;Lokal kontrast +TP_WAVELET_CH1;Hele kroma området +TP_WAVELET_CH2;Mættet/pastel +TP_WAVELET_CH3;Sammenkæd kontrast niveauer +TP_WAVELET_CHCU;Kurve +TP_WAVELET_CHR;Kroma-kontrast sammenkæd styrke +TP_WAVELET_CHRO;Mættet/pastel tærskel +TP_WAVELET_CHRO_TOOLTIP;Sætter det wavelet niveau, som vil være tærskelværdien mellem mættede og pastel farver.\n1-x: mættet\nx-9: pastel\n\nHvis værdien overstiger mængden af wavelet niveauer du bruger, vil det blive ignoreret. +TP_WAVELET_CHR_TOOLTIP;Justerer kroma som en funktion af "contrast niveauer" og "kroma-kontrast sammenkæd styrke" +TP_WAVELET_CHSL;Skydere +TP_WAVELET_CHTYPE;Krominans metode +TP_WAVELET_COLORT;Opacitet Rød-Grøn +TP_WAVELET_COMPCONT;Kontrast +TP_WAVELET_COMPGAMMA;Kompressions gamma +TP_WAVELET_COMPGAMMA_TOOLTIP;Justering af gamma for det resterende billede giver dig mulighed for at afbalancere dataene og histogrammet. +TP_WAVELET_COMPTM; +TP_WAVELET_CONTEDIT;'efter' kontrast Kurve +TP_WAVELET_CONTR;Farveskala +TP_WAVELET_CONTRA;Kontrast +TP_WAVELET_CONTRAST_MINUS;Kontrast - +TP_WAVELET_CONTRAST_PLUS;Kontrast + +TP_WAVELET_CONTRA_TOOLTIP;Ændrer kontrast i det resterende billede. +TP_WAVELET_CTYPE;Krominans kontrol +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modificerer lokal kontrast som en funktion af den oprindelige lokale kontrast (vandret akse).\nLave værdier på vandret akse repræsenterer lille lokal kontrast (reelle værdier omkring 10..20).\n50% på vandret akse repræsenterer gennemsnitlig lokal kontrast (virkelig værdi omkring 100..300).\n66% på vandret akse repræsenterer standard afvigelse af lokal kontrast (virkelig værdi ca. 300..800).\n100% på vandret akse repræsenterer maksimal lokal kontrast (virkelig værdi ca. 3000..8000). +TP_WAVELET_CURVEEDITOR_CH;Kontrastniveauer=f(Farvetone) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Ændrer hvert niveaus kontrast som en funktion af nuance.\nPas på ikke at overskrive ændringer foretaget med Farveskala-underværktøjets farvetonekontroller.\nKurven vil kun have en effekt, når wavelet-kontrastniveau-skydere er ikke-nul. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Påfører en endelig kontrastluminanskurve i slutningen af wavelet-behandlingen. +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Ændrer det resterende billedes farvetone som en funktion af farvetonen. +TP_WAVELET_DALL;Alle retninger +TP_WAVELET_DAUB;Kant ydeevne +TP_WAVELET_DAUB2;D2 - lav +TP_WAVELET_DAUB4;D4 - standard +TP_WAVELET_DAUB6;D6 - standard plus +TP_WAVELET_DAUB10;D10 - medium +TP_WAVELET_DAUB14;D14 - høj +TP_WAVELET_DAUB_TOOLTIP;Ændrer Daubechies-koefficienter:\nD4 = Standard,\nD14 = Ofte bedste ydeevne, 10% mere tidskrævende.\n\nPåvirker kantgenkendelse såvel som den generelle kvalitet af første niveauer. Kvaliteten er dog ikke strengt relateret til denne koefficient og kan variere med billeder og anvendelser. +TP_WAVELET_DONE;Lodret +TP_WAVELET_DTHR;Diagonal +TP_WAVELET_DTWO;Vandret +TP_WAVELET_EDCU;Kurve +TP_WAVELET_EDGCONT;Lokal kontrast +TP_WAVELET_EDGCONT_TOOLTIP;Justering af punkterne til venstre mindsker kontrasten, og til højre øges den.\nNederst til venstre, øverst til venstre, øverst til højre og nederst til højre repræsenterer henholdsvis lokal kontrast for lave værdier, middelværdi, middel+stdev og maksima. +TP_WAVELET_EDGE;Kantskarphed +TP_WAVELET_EDGEAMPLI;Basisforstærkning +TP_WAVELET_EDGEDETECT;Gradient følsomhed +TP_WAVELET_EDGEDETECTTHR;Tærskel lav (støj) +TP_WAVELET_EDGEDETECTTHR2;Tærskel høj (genkendelse) +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Denne skyder lader dig målrette kantgenkendelse for f. eks. at undgå at anvende kantskarphed på fine detaljer, såsom støj i himlen. +TP_WAVELET_EDGEDETECT_TOOLTIP;Flytning af skyderen til højre øger kantfølsomheden. Dette påvirker lokal kontrast, kantindstillinger og støj. +TP_WAVELET_EDGESENSI;Kantfølsomhed +TP_WAVELET_EDGREINF_TOOLTIP;Forstærk eller reducér virkningen af det første niveau, gør det modsatte af det andet niveau, og lad resten være uændret. +TP_WAVELET_EDGTHRESH;Detalje +TP_WAVELET_EDGTHRESH_TOOLTIP;Ændr opdelingen mellem det første niveau og de andre. Jo højere tærskel der er, desto mere er handlingen centreret på det første niveau. Vær forsigtig med negative værdier, de øger virkningen af høje niveauer og kan introducere artefakter. +TP_WAVELET_EDRAD;Radius +TP_WAVELET_EDRAD_TOOLTIP;Denne radiusjustering er meget forskellig fra dem i andre skærpeværktøjer. Dens værdi sammenlignes med hvert niveau gennem en kompleks funktion. I den forstand, at en værdi på nul stadig har effekt. +TP_WAVELET_EDSL;Tærskel Skydere +TP_WAVELET_EDTYPE;Lokalkontrast metode +TP_WAVELET_EDVAL;Styrke +TP_WAVELET_FINAL;Afsluttende Redigering +TP_WAVELET_FINEST;Fineste +TP_WAVELET_HIGHLIGHT;Højlys luminanceområde +TP_WAVELET_HS1;Hele luminansområdet +TP_WAVELET_HS2;Skygge/Højlys +TP_WAVELET_HUESKIN;Hudfarvenuance +TP_WAVELET_HUESKIN_TOOLTIP;De nederste punkter angiver begyndelsen af overgangszonen, og de øverste peger på slutningen af den, hvor effekten er maksimal.\n\nHvis du har brug for at flytte området betydeligt, eller hvis der er artefakter, er hvidbalance forkert. +TP_WAVELET_HUESKY;Himmelfarvenuance +TP_WAVELET_HUESKY_TOOLTIP;De nederste punkter angiver begyndelsen af overgangszonen, og de øverste peger på slutningen af den, hvor effekten er maksimal.\n\nHvis du har brug for at flytte området betydeligt, eller hvis der er artefakter, er hvidbalance forkert. +TP_WAVELET_ITER;Delta balance niveauer +TP_WAVELET_ITER_TOOLTIP;Venstre: øg lavt niveau og sænk højt niveauer,\nHøjre: sænk lavt niveau og øg højt niveau. +TP_WAVELET_LABEL;Wavelet Niveauer +TP_WAVELET_LARGEST;Grovste +TP_WAVELET_LEVCH;Kroma +TP_WAVELET_LEVDIR_ALL;Alle niveauer i alle retninger +TP_WAVELET_LEVDIR_INF;Under eller lig med niveauet +TP_WAVELET_LEVDIR_ONE;Et niveau +TP_WAVELET_LEVDIR_SUP;Over niveauet +TP_WAVELET_LEVELS;Wavelet niveauer +TP_WAVELET_LEVELS_TOOLTIP;Vælg antal detaljniveauer billedet skal dekomponeres til. Flere niveauer kræver mere RAM og kræver længere behandlingstid. +TP_WAVELET_LEVF;Kontrast +TP_WAVELET_LEVLABEL;Forhåndsvis maksimalt mulig niveauer = %1 +TP_WAVELET_LEVONE;Niveau 2 +TP_WAVELET_LEVTHRE;Niveau 4 +TP_WAVELET_LEVTWO;Niveau 3 +TP_WAVELET_LEVZERO;Niveau 1 +TP_WAVELET_LINKEDG;Sammenkæd med Kantskarpheds Styrke +TP_WAVELET_LIPST;Forbedret algoritme +TP_WAVELET_LOWLIGHT;Skyggeluminansområde +TP_WAVELET_MEDGREINF;Første niveau +TP_WAVELET_MEDI;Formindsk artefakter på blå himmel +TP_WAVELET_MEDILEV;Kantgenkendelse +TP_WAVELET_MEDILEV_TOOLTIP;Når du aktiverer Kantgenkendelse, anbefales det:\n- at deaktivere lavkontrastniveauer for at undgå artefakter,\n- at bruge høje værdier af gradientfølsomhed.\n\nDu kan modulere styrken med 'forfining' fra Støjfjernelse og Forfining. +TP_WAVELET_NEUTRAL;Neutral +TP_WAVELET_NOIS;Støjfjernelse +TP_WAVELET_NOISE;Støjfjernelse og raffinér +TP_WAVELET_NPHIGH;Høj +TP_WAVELET_NPLOW;Lav +TP_WAVELET_NPNONE;Ingen +TP_WAVELET_NPTYPE;Nabo pixels +TP_WAVELET_NPTYPE_TOOLTIP;Denne algoritme bruger nærheden af en pixel og otte af dens naboer. Hvis der er mindre forskel, forstærkes kanter. +TP_WAVELET_OPACITY;Opacitet Blå-Gul +TP_WAVELET_OPACITYW;Kontrast balance d/v-h kurve +TP_WAVELET_OPACITYWL;Endelig lokalkontrast +TP_WAVELET_OPACITYWL_TOOLTIP;Forandr den endelige lokalkontrast i slutningen af wavelet-redigeringen.\in\Venstre side repræsenterer den mindste lokalkontrast, gående til den højeste lokalkontrast i højre side. +TP_WAVELET_PASTEL;Pastel kroma +TP_WAVELET_PROC;Proces +TP_WAVELET_RE1;Forstærket +TP_WAVELET_RE2;Uændret +TP_WAVELET_RE3;Reduceret +TP_WAVELET_RESCHRO;Kroma +TP_WAVELET_RESCON;Skygger +TP_WAVELET_RESCONH;Højlys +TP_WAVELET_RESID;Resterende billede +TP_WAVELET_SAT;Mættet kroma +TP_WAVELET_SETTINGS;Wavelet Indstillinger +TP_WAVELET_SKIN;Hud målretning/beskyttelse +TP_WAVELET_SKIN_TOOLTIP;Ved -100 bliver hudtoner angrebet.\nVed 0 behandles alle toner ens.\nVed +100 er hudtoner beskyttet, mens alle andre toner påvirkes. +TP_WAVELET_SKY;Himmel målretning/beskyttelse +TP_WAVELET_SKY_TOOLTIP;Ved -100 angribes himmeltoner.\nVed 0 behandles alle toner ens.\nVed +100 er himmeltoner beskyttet, mens alle andre toner påvirkes. +TP_WAVELET_STREN;Styrke +TP_WAVELET_STRENGTH;Styrke +TP_WAVELET_SUPE;Ekstra +TP_WAVELET_THR;Skygge tærskel +TP_WAVELET_THRESHOLD;Højlys niveauer +TP_WAVELET_THRESHOLD2;Skygge niveauer +TP_WAVELET_THRESHOLD2_TOOLTIP;Kun niveauer mellem 9 og minus-9 værdien vil blive påvirket af skygge luminansområdet. Andre niveauer vil blive behandlet fuldt ud. Det højest mulige niveau er begrænset af højlysniveauværdien (minus-9 højlysniveauværdi). +TP_WAVELET_THRESHOLD_TOOLTIP;Kun niveauer ud over den valgte værdi vil blive påvirket af højlys luminansområdet. Andre niveauer vil blive behandlet fuldt ud. Den valgte værdi her begrænser den højest mulige værdi af skyggeniveauerne. +TP_WAVELET_THRH;Højlys tærskel +TP_WAVELET_TILESBIG;Store fliser +TP_WAVELET_TILESFULL;Fuldt billede +TP_WAVELET_TILESIZE;Fliseopdelingsmetode +TP_WAVELET_TILES_TOOLTIP;Redigering af det fulde billede fører til bedre kvalitet og er den anbefalede metode, mens brug af fliser er en nødløsning for brugere med lidt RAM. Se RawPedia for hukommelseskrav. +TP_WAVELET_TMSTRENGTH;Kompressionsstyrke +TP_WAVELET_TMSTRENGTH_TOOLTIP;Kontrolér styrken af tonemapping eller kontrastkomprimering af det resterende billede. Når værdien er forskellig fra 0, bliver skyderne Styrke og Gamma i Tone Mapping-værktøjet på fanen Eksponering grået-ud. +TP_WAVELET_TMTYPE;Kompressions metode +TP_WAVELET_TON;Toning +TP_WBALANCE_AUTO;Auto +TP_WBALANCE_CAMERA;Kamera +TP_WBALANCE_CLOUDY;Overskyet +TP_WBALANCE_CUSTOM;Bruger +TP_WBALANCE_DAYLIGHT;Dagslys (solrig) +TP_WBALANCE_EQBLUERED;Blå/Rød equalizer +TP_WBALANCE_EQBLUERED_TOOLTIP;Giver mulighed for at afvige fra den normale opførsel af "hvidbalance" ved at modulere blå/rød-balancen.\nDette kan være nyttigt, når optageforholdene:\na: er meget forskellige fra standardlyskilden (f.eks. under vand),\nb: hvor kalibrering blev udført,\nc: hvor matricerne eller ICC-profilerne er uegnede. +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 - Dagslys +TP_WBALANCE_FLUO2;F2 – Kold hvid +TP_WBALANCE_FLUO3;F3 - Hvid +TP_WBALANCE_FLUO4;F4 - Varm hvid +TP_WBALANCE_FLUO5;F5 - Dagslys +TP_WBALANCE_FLUO6;F6 – Let hvid +TP_WBALANCE_FLUO7;F7 - D65 Dagslyssimulering +TP_WBALANCE_FLUO8;F8 - D50/Sylvania F40 Design +TP_WBALANCE_FLUO9;F9 – Kold hvid 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_GREEN;Farvenuance +TP_WBALANCE_GTI;GTI +TP_WBALANCE_HMI;HMI +TP_WBALANCE_JUDGEIII;JudgeIII +TP_WBALANCE_LABEL;Hvidbalance +TP_WBALANCE_LAMP_HEADER;Lampe +TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 +TP_WBALANCE_LED_HEADER;LED +TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +TP_WBALANCE_METHOD;Metode +TP_WBALANCE_PICKER;Pipette +TP_WBALANCE_SHADE;Skygge +TP_WBALANCE_SIZE;Størrelse: +TP_WBALANCE_SOLUX35;Solux 3500K +TP_WBALANCE_SOLUX41;Solux 4100K +TP_WBALANCE_SOLUX47;Solux 4700K (leverandør) +TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Galleri) +TP_WBALANCE_SPOTWB;Brug pipetten til at vælge hvidbalancen fra et egnet område, f.eks. hvidt/gråt/sort område i forhåndsvisningen. +TP_WBALANCE_TEMPBIAS;Automatisk hvidballance temperatur forskydning +TP_WBALANCE_TEMPBIAS_TOOLTIP;Kan kun bruges med "Metode" valgt til: "Auto"\n Ændrer beregningen af "auto hvidbalance" ved at forskyde den mod\nvarmere eller køligere temperaturer.\nForskydningen er udtrykt som en procentdel af den beregnede temperatur,\nså resultatet er givet ved "BeregnetTemp + BeregnetTemp * Forskydning". +TP_WBALANCE_TEMPERATURE;Temperatur +TP_WBALANCE_TUNGSTEN;Tungsten +TP_WBALANCE_WATER1;UnderVands 1 +TP_WBALANCE_WATER2;UnderVands 2 +TP_WBALANCE_WATER_HEADER;UnderVands +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Åbn (nyt) detaljevindue +ZOOMPANEL_ZOOM100;Zoom til 100%\nGenvej: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Tilpas beskæring til skærmen\nGenvej: f +ZOOMPANEL_ZOOMFITSCREEN;Tilpas hele billedet til skærmen\nGenvej: Alt-f +ZOOMPANEL_ZOOMIN;Zoom Ind\nGenvej: + +ZOOMPANEL_ZOOMOUT;Zoom Ud\nGenvej: - + +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!CURVEEDITOR_CURVES;Curves +!FILEBROWSER_POPUPINSPECT;Inspect +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_PREPROCWB;Preprocess White Balance +!PARTIALPASTE_SPOT;Spot removal +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_CROP_GTCENTEREDSQUARE;Centered square +!TP_DEHAZE_SATURATION;Saturation +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_OUT_LEVEL;Output level +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LENSGEOM_AUTOCROP;Auto-Crop +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal +!TP_WAVELET_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. +!TP_WAVELET_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 592801054..3a2c2999c 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -84,6 +84,7 @@ #83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6 #84 06.10.2019 Erweiterung (TooWaBoo) RT 5.7 #84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6 +#85 29.07.2022 Erweiterung (marter, mozzihh) RT 5.9 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -122,7 +123,7 @@ DONT_SHOW_AGAIN;Meldung nicht mehr anzeigen. 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_ENTRY_TOOLTIP;Groß-/Kleinschreibung wird NICHT berücksichtigt.\nFür einen regulären Ausdruck benutzen Sie bitte 're:' als Prefix. DYNPROFILEEDITOR_IMGTYPE_ANY;Alle DYNPROFILEEDITOR_IMGTYPE_HDR;HDR DYNPROFILEEDITOR_IMGTYPE_PS;Pixel-Shift @@ -133,7 +134,7 @@ 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 im 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 @@ -165,11 +166,11 @@ EXPORT_BYPASS_ALL;Alle/Keine auswählen EXPORT_BYPASS_DEFRINGE;Farbsaum entfernen überspringen EXPORT_BYPASS_DIRPYRDENOISE;Rauschreduzierung überspringen EXPORT_BYPASS_DIRPYREQUALIZER;Detailebenenkontrast überspringen -EXPORT_BYPASS_EQUALIZER;Waveletebenen überspringen +EXPORT_BYPASS_EQUALIZER;Wavelet-Ebenen überspringen 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_DCB_ITERATIONS;DCB-Iterationen überspringen EXPORT_BYPASS_RAW_DF;Dunkelbild überspringen EXPORT_BYPASS_RAW_FF;Weißbild überspringen EXPORT_BYPASS_RAW_GREENTHRESH;Grün-Ausgleich überspringen @@ -179,23 +180,23 @@ EXPORT_BYPASS_SHARPENEDGE;Kantenschärfung überspringen EXPORT_BYPASS_SHARPENING;Schärfung überspringen EXPORT_BYPASS_SHARPENMICRO;Mikrokontrast überspringen EXPORT_FASTEXPORTOPTIONS;Schnell-Export - Einstellungen -EXPORT_INSTRUCTIONS;Die Einstellungen zum schnellen Export\nerlauben es, zeit- und ressourcenintensive\nEntwicklungsschritte zu überspringen und dafür\ndie Warteschlangenverarbeitung mit\nschnellen Export-Einstellungen auszuführen.\nDieses Vorgehen wird zur schnelleren\nGenerierung von gering aufgelösten Bildern\nempfohlen, falls es auf die Geschwindigkeit\nankommt oder für ein oder mehrere Bilder\nandere Ausgabegrößen gewünscht werden,\nohne Änderungen an deren gespeicherten\nParameter vornehmen zu müssen. +EXPORT_INSTRUCTIONS;Die Einstellungen zum schnellen Export erlauben es, zeit- und ressourcenintensive Entwicklungsschritte zu überspringen und dafür die Warteschlangenverarbeitung mit schnellen Export-Einstellungen auszuführen.\nDieses Vorgehen wird zur schnelleren Generierung von gering aufgelösten Bildern empfohlen, falls es auf die Geschwindigkeit ankommt oder für ein oder mehrere Bilder andere Ausgabegrößen gewünscht werden, ohne Änderungen an deren gespeicherten Parameter vornehmen zu müssen. EXPORT_MAXHEIGHT;Maximale Höhe: EXPORT_MAXWIDTH;Maximale Breite: EXPORT_PIPELINE;Verarbeitungspipeline -EXPORT_PUTTOQUEUEFAST; Zur Warteschlange “Schneller Export“ hinzufügen +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_NORMAL_PIPELINE;Standard +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Wendet alle Bearbeitungsschritte, im Gegensatz zu 'Standard', auf das bereits skalierte Bild an.\nDadurch steigt die Verarbeitungsgeschwindigkeit auf Kosten der Qualität. +EXPORT_USE_NORMAL_PIPELINE;Standard (überspringt einige Schritte, Skalieren zuletzt) EXTPROGTARGET_1;RAW EXTPROGTARGET_2;Stapelverarbeitung beendet FILEBROWSER_APPLYPROFILE;Profil anwenden FILEBROWSER_APPLYPROFILE_PARTIAL;Profil selektiv anwenden FILEBROWSER_AUTODARKFRAME;Automatisches Dunkelbild FILEBROWSER_AUTOFLATFIELD;Automatisches Weißbild -FILEBROWSER_BROWSEPATHBUTTONHINT;Klicken Sie hier, um den angegebenen Pfad zu öffnen, den Ordner\nneu zu laden und das Suchkriterium anzuwenden. -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_BROWSEPATHBUTTONHINT;Klicken Sie hier, um den angegebenen Pfad zu öffnen, den Ordner neu zu laden und das Suchkriterium anzuwenden. +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;Alle zwischengespeicherte Profile löschen FILEBROWSER_CACHECLEARFROMPARTIAL;Alle NICHT zwischengespeicherte Profile löschen @@ -209,13 +210,13 @@ FILEBROWSER_DELETEDIALOG_HEADER;Dateien löschen FILEBROWSER_DELETEDIALOG_SELECTED;Möchten Sie wirklich %1 Datei(en) unwiderruflich löschen? FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Möchten Sie wirklich %1 Datei(en) unwiderruflich löschen, mit allen aus der Stapelverarbeitung resultierenden zugehörigen Ausgabedateien? FILEBROWSER_EMPTYTRASH;Papierkorb leeren -FILEBROWSER_EMPTYTRASHHINT;Alle Dateien im Papierkorb\nunwiderruflich löschen. +FILEBROWSER_EMPTYTRASHHINT;Alle Dateien im Papierkorb\nunwiderruflich löschen. FILEBROWSER_EXTPROGMENU;Öffnen mit FILEBROWSER_FLATFIELD;Weißbild FILEBROWSER_MOVETODARKFDIR;In Dunkelbild-Verzeichnis verschieben FILEBROWSER_MOVETOFLATFIELDDIR;In Weißbild-Verzeichnis verschieben FILEBROWSER_NEW_NAME;Neuer Name: -FILEBROWSER_OPENDEFAULTVIEWER;Windows Standard-Betracher (stapelverarbeitet) +FILEBROWSER_OPENDEFAULTVIEWER;Windows Standard-Betrachter (stapelverarbeitet) FILEBROWSER_PARTIALPASTEPROFILE;Profil selektiv einfügen FILEBROWSER_PASTEPROFILE;Profil einfügen FILEBROWSER_POPUPCANCELJOB;Job abbrechen @@ -228,6 +229,7 @@ FILEBROWSER_POPUPCOLORLABEL4;Markierung: Blau FILEBROWSER_POPUPCOLORLABEL5;Markierung: Violett FILEBROWSER_POPUPCOPYTO;Kopieren nach... FILEBROWSER_POPUPFILEOPERATIONS;Dateioperationen +FILEBROWSER_POPUPINSPECT;Inspektor FILEBROWSER_POPUPMOVEEND;An das Ende der Warteschlange verschieben FILEBROWSER_POPUPMOVEHEAD;An den Anfang der Warteschlange verschieben FILEBROWSER_POPUPMOVETO;Verschieben nach... @@ -244,7 +246,7 @@ FILEBROWSER_POPUPRANK3;Bewertung 3 *** FILEBROWSER_POPUPRANK4;Bewertung 4 **** FILEBROWSER_POPUPRANK5;Bewertung 5 ***** FILEBROWSER_POPUPREMOVE;Unwiderruflich löschen -FILEBROWSER_POPUPREMOVEINCLPROC;Unwiderruflich löschen\n(einschl. aller Dateien der Stabelverarbeitung) +FILEBROWSER_POPUPREMOVEINCLPROC;Unwiderruflich löschen\n(einschl. aller Dateien der Stapelverarbeitung) FILEBROWSER_POPUPRENAME;Umbenennen FILEBROWSER_POPUPSELECTALL;Alle auswählen FILEBROWSER_POPUPTRASH;In den Papierkorb verschieben @@ -252,7 +254,7 @@ FILEBROWSER_POPUPUNRANK;Bewertung entfernen FILEBROWSER_POPUPUNTRASH;Aus dem Papierkorb wiederherstellen 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_QUERYLABEL;Suche: FILEBROWSER_RANK1_TOOLTIP;Bewertung 1 *\nTaste: Umschalt + 1 FILEBROWSER_RANK2_TOOLTIP;Bewertung 2 **\nTaste: Umschalt + 2 FILEBROWSER_RANK3_TOOLTIP;Bewertung 3 ***\nTaste: Umschalt + 3 @@ -270,9 +272,9 @@ FILEBROWSER_SHOWCOLORLABEL5HINT;Nur violett markierte Bilder anzeigen.\nTaste: < 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_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i FILEBROWSER_SHOWNOTTRASHHINT;Nur Bilder außerhalb des Papierkorbs anzeigen. -FILEBROWSER_SHOWORIGINALHINT;Zeige nur das Originalbild.\n\nWenn mehrere Bilder mit dem gleichen Dateinamen und unterschiedlichen Dateitypen existieren, ist das Originalbild das Bild, welches in der Liste "Dateitypen anzeigen" unter Einstellungen > Dateiverwaltung als erstes gefunden wird. +FILEBROWSER_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 @@ -285,14 +287,14 @@ FILEBROWSER_SHOWUNCOLORHINT;Nur unmarkierte Bilder anzeigen.\nTaste: Alt 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_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 FILECHOOSER_FILTER_LCP;Objektivkorrekturprofile FILECHOOSER_FILTER_PP;Verarbeitungsprofile -FILECHOOSER_FILTER_SAME;Gleiche Format wie aktuelles Bild +FILECHOOSER_FILTER_SAME;Gleiches Format wie aktuelles Bild FILECHOOSER_FILTER_TIFF;TIFF-Dateien GENERAL_ABOUT;Über GENERAL_AFTER;Nachher @@ -303,11 +305,14 @@ GENERAL_BEFORE;Vorher GENERAL_CANCEL;Abbrechen GENERAL_CLOSE;Schließen GENERAL_CURRENT;Aktuell +GENERAL_DELETE_ALL;Alle löschen GENERAL_DISABLE;Deaktivieren GENERAL_DISABLED;Deaktiviert +GENERAL_EDIT;Editieren GENERAL_ENABLE;Aktivieren GENERAL_ENABLED;Aktiviert GENERAL_FILE;Datei: +GENERAL_HELP;Hilfe GENERAL_LANDSCAPE;Landschaft GENERAL_NA;n/a GENERAL_NO;Nein @@ -321,555 +326,1283 @@ 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. +GIMP_PLUGIN_INFO;Willkommen beim 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. HISTOGRAM_TOOLTIP_CHRO;Chromatizität-Histogramm ein/ausblenden. +HISTOGRAM_TOOLTIP_CROSSHAIR;Fadenkreuz ein-/ ausblenden 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_MODE;Schaltet zwischen linearer, logarithmisch-linearer und\nlogarithmisch-logarithmischer Skalierung um. HISTOGRAM_TOOLTIP_R;Rot-Histogramm ein-/ausblenden. -HISTOGRAM_TOOLTIP_RAW;Zwischen normalen Histogrammen und\nRAW-Histogrammen umschalten. +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Histogrammoptionen ein-/ ausschalten +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Helligkeitsbereich anpassen +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogramm +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw-Histogramm +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB-Parade +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Vektorskop Farbton-Chroma +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS; Vektorskop Farbton-Sättigung +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Wellenform HISTORY_CHANGED;Geändert HISTORY_CUSTOMCURVE;Benutzerdefiniert HISTORY_FROMCLIPBOARD;Aus der Zwischenablage HISTORY_LABEL;Historie HISTORY_MSG_1;(Bild geladen) -HISTORY_MSG_2;(Profil geladen) HISTORY_MSG_3;(Profil geändert) HISTORY_MSG_4;(Historie durchsuchen) -HISTORY_MSG_5;(Belichtung) - Helligkeit -HISTORY_MSG_6;(Belichtung) - Kontrast +HISTORY_MSG_5;(Belichtung)\nHelligkeit +HISTORY_MSG_6;(Belichtung)\nKontrast HISTORY_MSG_7;(Belichtung)\nSchwarzwert HISTORY_MSG_8;(Belichtung)\nBelichtungskorrektur HISTORY_MSG_9;(Belichtung)\nLichterkompression HISTORY_MSG_10;(Belichtung)\nSchattenkompression HISTORY_MSG_11;(Belichtung)\nTonwertkurve 1 -HISTORY_MSG_12;(Belichtung) - Auto -HISTORY_MSG_13;(Belichtung) - Clip-Faktor -HISTORY_MSG_14;(L*a*b*) - Helligkeit -HISTORY_MSG_15;(L*a*b*) - Kontrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- -HISTORY_MSG_19;(L*a*b*) - L-Kurve -HISTORY_MSG_20;(Schärfung) -HISTORY_MSG_21;(Schärfung) - USM\nRadius -HISTORY_MSG_22;(Schärfung) - USM\nIntensität -HISTORY_MSG_23;(Schärfung) - USM\nSchwelle -HISTORY_MSG_24;(Schärfung) - USM\nNur Kanten schärfen -HISTORY_MSG_25;(Schärfung) - USM\nKantenschärfung\nRadius -HISTORY_MSG_26;(Schärfung) - USM\nKantenschärfung\nKantentoleranz -HISTORY_MSG_27;(Schärfung) - USM\nHalokontrolle -HISTORY_MSG_28;(Schärfung) - USM\nHalokontrolle - Intensität -HISTORY_MSG_29;(Schärfung) - Methode -HISTORY_MSG_30;(Schärfung) - RLD\nRadius -HISTORY_MSG_31;(Schärfung) - RLD\nIntensität -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 -HISTORY_MSG_37;(Belichtung) - Auto -HISTORY_MSG_38;(Weißabgleich) - Methode -HISTORY_MSG_39;(Weißabgleich)\nFarbtemperatur -HISTORY_MSG_40;(Weißabgleich) - Tönung +HISTORY_MSG_12;(Belichtung)\nAutomatisch +HISTORY_MSG_13;(Belichtung)\nClip-Faktor +HISTORY_MSG_14;(Belichtung - L*a*b*) - Helligkeit +HISTORY_MSG_15;(Belichtung - L*a*b*) - Kontrast +HISTORY_MSG_19;(Belichtung - L*a*b*) - L-Kurve +HISTORY_MSG_20;(Details - Schärfung) +HISTORY_MSG_21;(Details - Schärfung)\nUSM - Radius +HISTORY_MSG_22;(Details - Schärfung)\nUSM - Intensität +HISTORY_MSG_23;(Details - Schärfung)\nUSM - Schwelle +HISTORY_MSG_24;(Details - Schärfung)\nUSM - Nur Kanten schärfen +HISTORY_MSG_25;(Details - Schärfung)\nUSM - Kantenschärfung\nRadius +HISTORY_MSG_26;(Details - Schärfung)\nUSM - Kantenschärfung\nKantentoleranz +HISTORY_MSG_27;(Details - Schärfung)\nUSM - Halokontrolle +HISTORY_MSG_28;(Details - Schärfung)\nUSM - Halokontrolle - Intensität +HISTORY_MSG_29;(Details - Schärfung)\nMethode +HISTORY_MSG_30;(Details - Schärfung)\nRLD - Radius +HISTORY_MSG_31;(Details - Schärfung)\nRLD - Intensität +HISTORY_MSG_32;(Details - Schärfung)\nRLD - Dämpfung +HISTORY_MSG_33;(Details - Schärfung)\nRLD - Iterationen +HISTORY_MSG_34;(Transformieren - Objektivkorrektur)\nProfil - Verzeichnung +HISTORY_MSG_35;(Transformieren - Objektivkorrektur)\nProfil - Vignettierung +HISTORY_MSG_36;(Transformieren - Objektivkorrektur)\nProfil - CA +HISTORY_MSG_37;(Belichtung)\nAutomatisch +HISTORY_MSG_38;(Farbe - Weißabgleich)\nMethode +HISTORY_MSG_39;(Farbe - Weißabgleich)\nFarbtemperatur +HISTORY_MSG_40;(Farbe - Weißabgleich)\nTönung HISTORY_MSG_41;(Belichtung)\nTonwertkurve 1 - Modus HISTORY_MSG_42;(Belichtung)\nTonwertkurve 2 HISTORY_MSG_43;(Belichtung)\nTonwertkurve 2 - Modus -HISTORY_MSG_44;(Luminanz-Rauschfilter)\nRadius -HISTORY_MSG_45;(Luminanz-Rauschfilter)\nKantentoleranz -HISTORY_MSG_46;(Farb-Rauschfilter) -HISTORY_MSG_47;(ICC Lichter aus Matrix\nüberlagern) -HISTORY_MSG_48;(Farbmanagement)\nEingangsfarbprofil\nDCP - Tonwertkurve -HISTORY_MSG_49;(Farbmanagement)\nEingangsfarbprofil\nDCP - Illumination -HISTORY_MSG_50;(Schatten/Lichter) -HISTORY_MSG_51;(Schatten/Lichter)\nLichter -HISTORY_MSG_52;(Schatten/Lichter)\nSchatten -HISTORY_MSG_53;(Schatten/Lichter)\nTonwertbreite Lichter -HISTORY_MSG_54;(Schatten/Lichter)\nTonwertbreite Schatten -HISTORY_MSG_55;(Schatten/Lichter)\nLokaler Kontrast -HISTORY_MSG_56;(Schatten/Lichter)\nRadius +HISTORY_MSG_48;(Farbe - Farbmanagement)\nEingangsfarbprofil\nDCP - Tonwertkurve +HISTORY_MSG_49;(Farbe - Farbmanagement)\nEingangsfarbprofil\nDCP - Illumination +HISTORY_MSG_50;(Belichtung - Schatten/Lichter) +HISTORY_MSG_51;(Belichtung - Schatten/Lichter)\nLichter +HISTORY_MSG_52;(Belichtung - Schatten/Lichter)\nSchatten +HISTORY_MSG_53;(Belichtung - Schatten/Lichter)\nTonwertbreite Lichter +HISTORY_MSG_54;(Belichtung - Schatten/Lichter)\nTonwertbreite Schatten +HISTORY_MSG_56;(Belichtung - Schatten/Lichter)\nRadius HISTORY_MSG_57;(Grobe Drehung) HISTORY_MSG_58;(Horizontal spiegeln) HISTORY_MSG_59;(Vertikal spiegeln) -HISTORY_MSG_60;(Objektivkorrektur)\nDrehen - Winkel -HISTORY_MSG_61;(Objektivkorrektur)\nAuto-Füllen -HISTORY_MSG_62;(Objektivkorrektur)\nVerzeichnung -HISTORY_MSG_63;(Schnappschuss\nausgewählt) -HISTORY_MSG_64;(Ausschnitt) -HISTORY_MSG_65;(Objektivkorrektur)\nFarbsaum entfernen +HISTORY_MSG_60;(Transformieren - Objektivkorrektur)\nDrehen - Winkel +HISTORY_MSG_61;(Transformieren - Objektivkorrektur)\nAuto-Füllen +HISTORY_MSG_62;(Transformieren - Objektivkorrektur)\nVerzeichnung +HISTORY_MSG_63;Schnappschuss ausgewählt +HISTORY_MSG_64;(Transformieren - Ausschnitt) +HISTORY_MSG_65;(Transformieren - Objektivkorrektur)\nFarbsaum entfernen HISTORY_MSG_66;(Belichtung)\nLichter rekonstruieren -HISTORY_MSG_67;(Belichtung)\nLichterkompression\nUmfang HISTORY_MSG_68;(Belichtung)\nLichterkompression\nMethode -HISTORY_MSG_69;(Farbmanagement)\nArbeitsfarbraum -HISTORY_MSG_70;(Farbmanagement)\nAusgabeprofil -HISTORY_MSG_71;(Farbmanagement)\nEingangsfarbprofil -HISTORY_MSG_72;(Objektivkorrektur)\nVignettierung - Intensität -HISTORY_MSG_73;(RGB-Kanalmixer) -HISTORY_MSG_74;(Skalieren) - Maßstab -HISTORY_MSG_75;(Skalieren) - Methode +HISTORY_MSG_69;(Farbe - Farbmanagement)\nArbeitsfarbraum +HISTORY_MSG_70;(Farbe - Farbmanagement)\nAusgabeprofil +HISTORY_MSG_71;(Farbe - Farbmanagement)\nEingangsfarbprofil +HISTORY_MSG_72;(Transformieren - Objektivkorrektur)\nVignettierung - Intensität +HISTORY_MSG_73;(Farbe - RGB-Kanalmixer) +HISTORY_MSG_74;(Transformieren - Skalieren)\nMaßstab +HISTORY_MSG_75;(Transformieren - Skalieren)\nMethode HISTORY_MSG_76;(Exif Metadaten) HISTORY_MSG_77;(IPTC Metadaten) -HISTORY_MSG_78;- -HISTORY_MSG_79;(Skalieren) - Breite -HISTORY_MSG_80;(Skalieren) - Höhe -HISTORY_MSG_81;(Skalieren) +HISTORY_MSG_79;(Transformieren - Skalieren)\nBreite +HISTORY_MSG_80;(Transformieren - Skalieren)\nHöhe +HISTORY_MSG_81;(Transformieren - Skalieren) HISTORY_MSG_82;(Profil geändert) -HISTORY_MSG_83;(Schatten/Lichter)\nSchärfemaske -HISTORY_MSG_84;(Objektivkorrektur)\nPerspektive -HISTORY_MSG_85;(Objektivkorrektur)\nProfil -HISTORY_MSG_86;(RGB-Kurven)\nHelligkeitsmodus -HISTORY_MSG_87;(Impulsrauschred.) -HISTORY_MSG_88;(Impulsrauschred.)\nSchwelle -HISTORY_MSG_89;(Rauschreduzierung) -HISTORY_MSG_90;(Rauschreduzierung)\nLuminanz -HISTORY_MSG_91;(Rauschreduzierung)\nChrominanz (Master) -HISTORY_MSG_92;(Rauschreduzierung)\nChrominanz - Gamma -HISTORY_MSG_93;(Detailebenenkontrast)\nWert -HISTORY_MSG_94;(Detailebenenkontrast) -HISTORY_MSG_95;(L*a*b*) - Chromatizität -HISTORY_MSG_96;(L*a*b*) - a-Kurve -HISTORY_MSG_97;(L*a*b*) - b-Kurve -HISTORY_MSG_98;(Sensor-Matrix)\nFarbinterpolation\nMethode -HISTORY_MSG_99;(Vorverarbeitung)\nHot-Pixel-Filter -HISTORY_MSG_100;(Belichtung) - Sättigung -HISTORY_MSG_101;(HSV) - Farbton (H) -HISTORY_MSG_102;(HSV) - Sättigung (S) -HISTORY_MSG_103;(HSV) - Dynamik (V) -HISTORY_MSG_104;(HSV) -HISTORY_MSG_105;(Farbsaum entfernen) -HISTORY_MSG_106;(Farbsaum entfernen)\nRadius -HISTORY_MSG_107;(Farbsaum entfernen)\nSchwelle +HISTORY_MSG_84;(Transformieren - Objektivkorrektur)\nPerspektive +HISTORY_MSG_85;(Transformieren - Objektivkorrektur)\nProfil +HISTORY_MSG_86;(Farbe - RGB-Kurven)\nHelligkeitsmodus +HISTORY_MSG_87;(Details - Impulsrauschred.) +HISTORY_MSG_88;(Details - Impulsrauschred.)\nSchwelle +HISTORY_MSG_89;(Details - Rauschreduzierung) +HISTORY_MSG_90;(Details - Rauschreduzierung)\nLuminanz +HISTORY_MSG_91;(Details - Rauschreduzierung)\nChrominanz (Master) +HISTORY_MSG_92;(Details - Rauschreduzierung)\nGamma +HISTORY_MSG_93;(Details - Detailebenenkontrast)\nWert +HISTORY_MSG_94;(Details - Detailebenenkontrast) +HISTORY_MSG_95;(Belichtung - L*a*b*)\nChromatizität +HISTORY_MSG_96;(Belichtung - L*a*b*)\na-Kurve +HISTORY_MSG_97;(Belichtung - L*a*b*)\nb-Kurve +HISTORY_MSG_98;(RAW - Sensor-Matrix)\nFarbinterpolation\nMethode +HISTORY_MSG_99;(RAW - Vorverarbeitung)\nHot-Pixel-Filter +HISTORY_MSG_100;(Belichtung)\nSättigung +HISTORY_MSG_101;(Farbe - HSV)\nFarbton (H) +HISTORY_MSG_102;(Farbe - HSV)\nSättigung (S) +HISTORY_MSG_103;(Farbe - HSV)\nDynamik (V) +HISTORY_MSG_104;(Farbe - HSV) +HISTORY_MSG_105;(Details - Farbsaum entfernen) +HISTORY_MSG_106;(Details - Farbsaum entfernen)\nRadius +HISTORY_MSG_107;(Details - Farbsaum entfernen)\nSchwelle HISTORY_MSG_108;(Belichtung)\nLichterkompression\nSchwelle -HISTORY_MSG_109;(Skalieren) - Begrenzungsrahmen -HISTORY_MSG_110;(Skalieren) - Anwenden auf: -HISTORY_MSG_111;(L*a*b*) - Farbverschiebung\nvermeiden -HISTORY_MSG_112;--unused-- -HISTORY_MSG_113;(L*a*b*) - Hautfarbtöne\nschützen -HISTORY_MSG_114;(Sensor-Matrix)\nFarbinterpolation\nDCB-Iterationen -HISTORY_MSG_115;(Sensor-Matrix)\nFarbinterpolation\nFalschfarbenreduzierung -HISTORY_MSG_116;(Sensor-Matrix)\nFarbinterpolation\nDCB-Verbesserung -HISTORY_MSG_117;(Sensor-Matrix)\nChromatische Aberration\nRot -HISTORY_MSG_118;(Sensor-Matrix)\nChromatische Aberration\nBlau -HISTORY_MSG_119;(Sensor-Matrix)\nVorverarbeitung\nZeilenrauschfilter -HISTORY_MSG_120;(Sensor-Matrix)\nVorverarbeitung\nGrün-Ausgleich -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_126;(Weißbild) - Datei -HISTORY_MSG_127;(Weißbild)\nAutomatische Auswahl -HISTORY_MSG_128;(Weißbild)\nUnschärferadius -HISTORY_MSG_129;(Weißbild) - Unschärfetyp +HISTORY_MSG_109;(Transformieren - Skalieren)\nBegrenzungsrahmen +HISTORY_MSG_110;(Transformieren - Skalieren)\nAnwenden auf: +HISTORY_MSG_111;(Belichtung - L*a*b*)\nFarbverschiebung vermeiden +HISTORY_MSG_112;--nicht verwendet-- +HISTORY_MSG_113;(Belichtung - L*a*b*)\nHautfarbtöne schützen +HISTORY_MSG_114;(RAW - Sensor-Matrix)\nFarbinterpolation\nDCB-Iterationen +HISTORY_MSG_115;(RAW - Sensor-Matrix)\nFarbinterpolation\nFalschfarbenreduzierung +HISTORY_MSG_116;(RAW - Sensor-Matrix)\nFarbinterpolation\nDCB-Verbesserung +HISTORY_MSG_117;(RAW - Sensor-Matrix)\nChromatische Aberration\nRot/Grün +HISTORY_MSG_118;(RAW - Sensor-Matrix)\nChromatische Aberration\nBlau/Gelb +HISTORY_MSG_119;(RAW - Sensor-Matrix)\nVorverarbeitung\nZeilenrauschfilter +HISTORY_MSG_120;(RAW - Sensor-Matrix)\nVorverarbeitung\nGrün-Ausgleich +HISTORY_MSG_121;(RAW - Sensor-Matrix)\nChromatische Aberration\nAutomatische Korrektur +HISTORY_MSG_122;(RAW - Dunkelbild)\nAutomatische Auswahl +HISTORY_MSG_123;(RAW - Dunkelbild)\nDatei +HISTORY_MSG_124;(RAW - Weißpunkt)\nKorrekturfaktor +HISTORY_MSG_126;(RAW - Weißbild)\nDatei +HISTORY_MSG_127;(RAW - Weißbild)\nAutomatische Auswahl +HISTORY_MSG_128;(RAW - Weißbild)\nUnschärferadius +HISTORY_MSG_129;(RAW - Weißbild)\nUnschärfetyp HISTORY_MSG_130;(Autom. Verzeichnung) -HISTORY_MSG_131;(Rauschreduzierung)\nLuminanz -HISTORY_MSG_132;(Rauschreduzierung)\nChrominanz -HISTORY_MSG_133;(Farbmanagement)\nAusgabeprofil\nAusgabe-Gamma -HISTORY_MSG_134;(Farbmanagement)\nAusgabeprofil\nGamma -HISTORY_MSG_135;(Farbmanagement)\nAusgabeprofil\nFreies Gamma -HISTORY_MSG_136;(Farbmanagement)\nAusgabeprofil\nGradient (linear) -HISTORY_MSG_137;(Sensor-Matrix)\nSchwarzpunkt - Grün 1 -HISTORY_MSG_138;(Sensor-Matrix)\nSchwarzpunkt - Rot -HISTORY_MSG_139;(Sensor-Matrix)\nSchwarzpunkt - Blau -HISTORY_MSG_140;(Sensor-Matrix)\nSchwarzpunkt - Grün 2 -HISTORY_MSG_141;(Sensor-Matrix)\nSchwarzpunkt\nGrün-Werte angleichen -HISTORY_MSG_142;(Kantenschärfung)\nIterationen -HISTORY_MSG_143;(Kantenschärfung)\nIntensität -HISTORY_MSG_144;(Mikrokontrast)\nIntensität -HISTORY_MSG_145;(Mikrokontrast)\nGleichmäßigkeit -HISTORY_MSG_146;(Kantenschärfung) -HISTORY_MSG_147;(Kantenschärfung)\nNur Luminanz -HISTORY_MSG_148;(Mikrokontrast) -HISTORY_MSG_149;(Mikrokontrast)\n3×3-Matrix -HISTORY_MSG_150;(Artefakt-/Rauschred.\nnach Farbinterpolation) -HISTORY_MSG_151;(Dynamik) -HISTORY_MSG_152;(Dynamik) - Pastelltöne -HISTORY_MSG_153;(Dynamik)\nGesättigte Töne -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;(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 -HISTORY_MSG_166;(Belichtung) - Zurücksetzen -HISTORY_MSG_167;(Sensor-Matrix)\nFarbinterpolation\nMethode -HISTORY_MSG_168;(L*a*b*) - CC-Kurve -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 -HISTORY_MSG_177;(CIECAM02) - Szene\nLuminanz -HISTORY_MSG_178;(CIECAM02)\nBetrachtungsbed.\nLuminanz -HISTORY_MSG_179;(CIECAM02) - Szene\nWeißpunktmodell -HISTORY_MSG_180;(CIECAM02) - Helligkeit (J) -HISTORY_MSG_181;(CIECAM02) - Buntheit (H) -HISTORY_MSG_182;(CIECAM02) - Szene\nCAT02-Automatisch -HISTORY_MSG_183;(CIECAM02) - Kontrast (J) -HISTORY_MSG_184;(CIECAM02) - Szene\nDunkle Umgebung -HISTORY_MSG_185;(CIECAM02)\nBetrachtungsbed.\nGamutkontrolle -HISTORY_MSG_186;(CIECAM02) - Algorithmus -HISTORY_MSG_187;(CIECAM02) - Hautfarbtöne\nschützen -HISTORY_MSG_188;(CIECAM02) - Helligkeit (Q) -HISTORY_MSG_189;(CIECAM02) - Kontrast (Q) -HISTORY_MSG_190;(CIECAM02) - Sättigung (S) -HISTORY_MSG_191;(CIECAM02) - Farbigkeit (M) -HISTORY_MSG_192;(CIECAM02) - Farbton (H) -HISTORY_MSG_193;(CIECAM02)\nTonwertkurve 1 -HISTORY_MSG_194;(CIECAM02)\nTonwertkurve 2 -HISTORY_MSG_195;(CIECAM02)\nTonwertkurve 1 - Modus -HISTORY_MSG_196;(CIECAM02)\nTonwertkurve 2 - Modus -HISTORY_MSG_197;(CIECAM02) - Farbkurve -HISTORY_MSG_198;(CIECAM02) - Farbkurve\nModus -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 -HISTORY_MSG_207;(Farbsaum entfernen)\nFarbtonkurve -HISTORY_MSG_208;(Weißabgleich)\nBlau / Rot-Korrektur -HISTORY_MSG_210;(Grauverlaufsfilter)\nRotationswinkel -HISTORY_MSG_211;(Grauverlaufsfilter) -HISTORY_MSG_212;(Vignettierungsfilter)\nIntensität -HISTORY_MSG_213;(Vignettierungsfilter) -HISTORY_MSG_214;(Schwarz/Weiß) -HISTORY_MSG_215;(Schwarz/Weiß) - Rot -HISTORY_MSG_216;(Schwarz/Weiß) - Grün -HISTORY_MSG_217;(Schwarz/Weiß) - Blau -HISTORY_MSG_218;(Schwarz/Weiß)\nGamma - Rot -HISTORY_MSG_219;(Schwarz/Weiß)\nGamma - Grün -HISTORY_MSG_220;(Schwarz/Weiß)\nGamma - Blau -HISTORY_MSG_221;(Schwarz/Weiß)\nFarbfilter -HISTORY_MSG_222;(Schwarz/Weiß)\nVorgaben -HISTORY_MSG_223;(Schwarz/Weiß) - Orange -HISTORY_MSG_224;(Schwarz/Weiß) - Gelb -HISTORY_MSG_225;(Schwarz/Weiß) - Cyan -HISTORY_MSG_226;(Schwarz/Weiß) - Magenta -HISTORY_MSG_227;(Schwarz/Weiß) - Violett -HISTORY_MSG_228;(Schwarz/Weiß)\nLuminanzequalizer -HISTORY_MSG_229;(Schwarz/Weiß)\nLuminanzequalizer -HISTORY_MSG_230;(Schwarz/Weiß) - Modus -HISTORY_MSG_231;(Schwarz/Weiß)\n“Bevor“-Kurve -HISTORY_MSG_232;(Schwarz/Weiß)\n“Bevor“-Kurventyp -HISTORY_MSG_233;(Schwarz/Weiß)\n“Danach“-Kurve -HISTORY_MSG_234;(Schwarz/Weiß)\n“Danach“-Kurventyp -HISTORY_MSG_235;(Schwarz/Weiß)\nAuto-Kanalmixer -HISTORY_MSG_236;--unused-- -HISTORY_MSG_237;(Schwarz/Weiß) - Mixer -HISTORY_MSG_238;(Grauverlaufsfilter)\nBereich -HISTORY_MSG_239;(Grauverlaufsfilter)\nIntensität -HISTORY_MSG_240;(Grauverlaufsfilter)\nRotationsachsen -HISTORY_MSG_241;(Vignettierungsfilter)\nBereich -HISTORY_MSG_242;(Vignettierungsfilter)\nForm -HISTORY_MSG_243;(Objektivkorrektur)\nVignettierung - Radius -HISTORY_MSG_244;(Objektivkorrektur)\nVignettierung - Faktor -HISTORY_MSG_245;(Objektivkorrektur)\nVignettierung - Zentrum -HISTORY_MSG_246;(L*a*b*) - CL-Kurve -HISTORY_MSG_247;(L*a*b*) - LH-Kurve -HISTORY_MSG_248;(L*a*b*) - HH-Kurve -HISTORY_MSG_249;(Detailebenenkontrast)\nSchwelle -HISTORY_MSG_250;(Rauschreduzierung)\nVerbesserung -HISTORY_MSG_251;(Schwarz/Weiß)\nAlgorithmus -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 -HISTORY_MSG_260;(Farbanpassungen)\na*[b*]-Transparenz -HISTORY_MSG_261;(Farbanpassungen)\nMethode -HISTORY_MSG_262;(Farbanpassungen)\nb*-Transparenz -HISTORY_MSG_263;(Farbanpassungen)\nSchatten - Blau / Rot -HISTORY_MSG_264;(Farbanpassungen)\nSchatten - Cyan / Grün -HISTORY_MSG_265;(Farbanpassungen)\nSchatten - Gelb / Blau -HISTORY_MSG_266;(Farbanpassungen)\nMitten - Blau / Rot -HISTORY_MSG_267;(Farbanpassungen)\nMitten - Cyan / Grün -HISTORY_MSG_268;(Farbanpassungen)\nMitten - Gelb / Blau -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)\nFarbausgleich\nRegler zurücksetzen -HISTORY_MSG_274;(Farbanpassungen)\nSättigung Schatten -HISTORY_MSG_275;(Farbanpassungen)\nSättigung Lichter -HISTORY_MSG_276;(Farbanpassungen)\nDeckkraft -HISTORY_MSG_277;--unused-- -HISTORY_MSG_278;(Farbanpassungen)\nLuminanz schützen -HISTORY_MSG_279;(Farbanpassungen)\nSchatten -HISTORY_MSG_280;(Farbanpassungen)\nLichter -HISTORY_MSG_281;(Farbanpassungen)\nSättigung schützen\nIntensität -HISTORY_MSG_282;(Farbanpassungen)\nSättigung schützen\nSchwelle -HISTORY_MSG_283;(Farbanpassungen)\nIntensität -HISTORY_MSG_284;(Farbanpassungen)\nSättigung schützen\nAutomatisch -HISTORY_MSG_285;(Rauschreduzierung)\nMedianfilter - Methode -HISTORY_MSG_286;(Rauschreduzierung)\nMediantyp -HISTORY_MSG_287;(Rauschreduzierung)\nMedianfilter - Iterationen -HISTORY_MSG_288;(Weißbild)\nKontrolle zu heller Bereiche -HISTORY_MSG_289;(Weißbild)\nAuto-Kontrolle zu\nheller Bereiche -HISTORY_MSG_290;(Sensor-Matrix)\nSchwarzpunkt - Rot -HISTORY_MSG_291;(Sensor-Matrix)\nSchwarzpunkt - Grün -HISTORY_MSG_292;(Sensor-Matrix)\nSchwarzpunkt - Blau -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;- -HISTORY_MSG_301;(Rauschreduzierung)\nLuminanzkontrolle -HISTORY_MSG_302;(Rauschreduzierung)\nChrominanz - Methode -HISTORY_MSG_303;(Rauschreduzierung)\nChrominanz - Methode -HISTORY_MSG_304;(Wavelet)\nKontrastebenen -HISTORY_MSG_305;(Wavelet) -HISTORY_MSG_306;(Wavelet) - Einstellungen\nVerarbeitungsebene -HISTORY_MSG_307;(Wavelet) - Einstellungen\nVerarbeitung -HISTORY_MSG_308;(Wavelet) - Einstellungen\nVerarbeitungsrichtung -HISTORY_MSG_309;(Wavelet)\nKantenschärfung\nDetails -HISTORY_MSG_310;(Wavelet) - Restbild\nHimmelsfarbtöne\nschützen -HISTORY_MSG_311;(Wavelet) - Einstellungen\nAnzahl der Ebenen -HISTORY_MSG_312;(Wavelet) - Restbild\nSchatten Schwelle -HISTORY_MSG_313;(Wavelet) - Farbe\nEbenengrenze -HISTORY_MSG_314;(Wavelet) - Gamut\nArtefakte reduzieren -HISTORY_MSG_315;(Wavelet) - Restbild\nKontrast -HISTORY_MSG_316;(Wavelet) - Gamut\nHautfarbtöne schützen -HISTORY_MSG_317;(Wavelet) - Gamut\nHautfarbton -HISTORY_MSG_318;(Wavelet) - Kontrast\nLichterebenen -HISTORY_MSG_319;(Wavelet) - Kontrast\nLichter-Luminanzbereich -HISTORY_MSG_320;(Wavelet) - Kontrast\nSchatten-Luminanzbereich -HISTORY_MSG_321;(Wavelet) - Kontrast\nSchattenebenen -HISTORY_MSG_322;(Wavelet) - Gamut\nFarbverschiebungen\nvermeiden -HISTORY_MSG_323;(Wavelet)\nKantenschärfung\nLokale Kontrastkurve -HISTORY_MSG_324;(Wavelet) - Farbe\nPastellfarben -HISTORY_MSG_325;(Wavelet) - Farbe\nGesättigte Farben -HISTORY_MSG_326;(Wavelet) - Farbe\nChrominanzethode -HISTORY_MSG_327;(Wavelet) - Kontrast\nAnwenden auf -HISTORY_MSG_328;(Wavelet) - Farbe\nFarb-Kontrast-\nVerknüpfung -HISTORY_MSG_329;(Wavelet) - Tönung\nDeckkraft Rot / Grün -HISTORY_MSG_330;(Wavelet) - Tönung\nDeckkraft Blau / Gelb -HISTORY_MSG_331;(Wavelet)\nKontrastebenen\nExtra -HISTORY_MSG_332;(Wavelet)- -Einstellungen\nKachelgröße -HISTORY_MSG_333;(Wavelet) - Restbild\nSchatten -HISTORY_MSG_334;(Wavelet) - Restbild\nBuntheit -HISTORY_MSG_335;(Wavelet) - Restbild\nLichter -HISTORY_MSG_336;(Wavelet) - Restbild\nLichter Schwelle -HISTORY_MSG_337;(Wavelet) - Restbild\nHimmelsfarbton -HISTORY_MSG_338;(Wavelet)\nKantenschärfung\nRadius -HISTORY_MSG_339;(Wavelet)\nKantenschärfung\nIntensität -HISTORY_MSG_340;(Wavelet) - Einstellungen\nIntensität -HISTORY_MSG_341;(Wavelet) - Einstellungen\nKantenperformance -HISTORY_MSG_342;(Wavelet)\nKantenschärfung\nErste Ebene -HISTORY_MSG_343;(Wavelet) - Farbe\nFarbebenen -HISTORY_MSG_344;(Wavelet)\nFarbmethode\nRegler/Kurve -HISTORY_MSG_345;(Wavelet)\nKantenschärfung\nLokaler Kontrast -HISTORY_MSG_346;(Wavelet)\nKantenschärfung\nLokale Kontrastmethode -HISTORY_MSG_347;(Wavelet)\nRauschreduzierung\nEbene 1 -HISTORY_MSG_348;(Wavelet)\nRauschreduzierung\nEbene 2 -HISTORY_MSG_349;(Wavelet)\nRauschreduzierung\nEbene 3 -HISTORY_MSG_350;(Wavelet)\nKantenschärfung\nKantenerkennung -HISTORY_MSG_351;(Wavelet) - Restbild\nHH-Kurve -HISTORY_MSG_352;(Wavelet) - Einstellungen\nHintergrund -HISTORY_MSG_353;(Wavelet)\nKantenschärfung\nGradientenempfindlichkeit -HISTORY_MSG_354;(Wavelet)\nKantenschärfung\nErweiterter Algorithmus -HISTORY_MSG_355;(Wavelet)\nKantenschärfung\nSchwelle niedrig -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;(Tonwertkorrektur)\nGamma -HISTORY_MSG_361;(Wavelet) - Endretusche\nFarbausgleich -HISTORY_MSG_362;(Wavelet) - Restbild\nKompression -HISTORY_MSG_363;(Wavelet) - Restbild\nKompression - Intensität -HISTORY_MSG_364;(Wavelet) - Endretusche\nKontrastausgleich -HISTORY_MSG_365;(Wavelet) - Endretusche\nDelta-Kontrastausgleich -HISTORY_MSG_366;(Wavelet) - Restbild\nGammakompression -HISTORY_MSG_367;(Wavelet) - Endretusche\n"Danach"-Kontrastkurve -HISTORY_MSG_368;(Wavelet) - Endretusche\nKontrastausgleichskurve -HISTORY_MSG_369;(Wavelet) - Endretusche\nKontrastmethode -HISTORY_MSG_370;(Wavelet) - Endretusche\nLokale Kontrastkurve -HISTORY_MSG_371;(Skalieren) - Schärfen -HISTORY_MSG_372;(Skalieren) - Schärfen\nUSM - Radius -HISTORY_MSG_373;(Skalieren) - Schärfen\nUSM - Intensität -HISTORY_MSG_374;(Skalieren) - Schärfen\nUSM - Schwelle -HISTORY_MSG_375;(Skalieren) - Schärfen\nUSM - Nur Kanten\nschärfen -HISTORY_MSG_376;(Skalieren) - Schärfen\nUSM - Kantenschärfung\nRadius -HISTORY_MSG_377;(Skalieren) - Schärfen\nUSM - Kantentoleranz -HISTORY_MSG_378;(Skalieren) - Schärfen\nUSM - Halokontrolle -HISTORY_MSG_379;(Skalieren) - Schärfen\nUSM - Halokontrolle\nIntensität -HISTORY_MSG_380;(Skalieren) - Schärfen\nMethode -HISTORY_MSG_381;(Skalieren) - Schärfen\nRLD - Radius -HISTORY_MSG_382;(Skalieren) - Schärfen\nRLD - Intensität -HISTORY_MSG_383;(Skalieren) - Schärfen\nRLD - Dämpfung -HISTORY_MSG_384;(Skalieren) - Schärfen\nRLD - Iterationen -HISTORY_MSG_385;(Wavelet) - Restbild\nFarbausgleich -HISTORY_MSG_386;(Wavelet) - Restbild\nFarbausgleich\nLichter Grün / Cyan -HISTORY_MSG_387;(Wavelet) - Restbild\nFarbausgleich\nLichter Blau / Gelb -HISTORY_MSG_388;(Wavelet) - Restbild\nFarbausgleich\nMitten Grün / Cyan -HISTORY_MSG_389;(Wavelet) - Restbild\nFarbausgleich\nMitten Blau / Gelb -HISTORY_MSG_390;(Wavelet) - Restbild\nFarbausgleich\nSchatten Grün / Cyan -HISTORY_MSG_391;(Wavelet) - Restbild\nFarbausgleich\nSchatten Blau / Gelb -HISTORY_MSG_392;(Wavelet) - Restbild\nFarbausgleich -HISTORY_MSG_393;(Farbmanagement)\nEingangsfarbprofil\nDCP - Look-Tabelle -HISTORY_MSG_394;(Farbmanagement)\nEingangsfarbprofil\nDCP - Basisbelichtung -HISTORY_MSG_395;(Farbmanagement)\nEingangsfarbprofil\nDCP - Basistabelle -HISTORY_MSG_396;(Wavelet) - Kontrast -HISTORY_MSG_397;(Wavelet) - Farbe -HISTORY_MSG_398;(Wavelet)\nKantenschärfung -HISTORY_MSG_399;(Wavelet) - Restbild -HISTORY_MSG_400;(Wavelet) - Endretusche -HISTORY_MSG_401;(Wavelet) - Tönung -HISTORY_MSG_402;(Wavelet)\nRauschreduzierung -HISTORY_MSG_403;(Wavelet)\nKantenschärfung\nKantenempfindlichkeit -HISTORY_MSG_404;(Wavelet)\nKantenschärfung\nGrundverstärkung -HISTORY_MSG_405;(Wavelet)\nRauschreduzierung\nEbene 4 -HISTORY_MSG_406;(Wavelet)\nKantenschärfung\nBenachbarte Pixel -HISTORY_MSG_407;(Retinex) - Methode -HISTORY_MSG_408;(Retinex) - Radius -HISTORY_MSG_409;(Retinex) - Einstellungen\nKontrast -HISTORY_MSG_410;(Retinex) - Einstellungen\nVerstärkung und Ausgleich\nAusgleich -HISTORY_MSG_411;(Retinex) - Intensität -HISTORY_MSG_412;(Retinex) - Einstellungen\nDynamikkompression\nGaußscher Gradient -HISTORY_MSG_413;(Retinex) - Kontrast -HISTORY_MSG_414;(Retinex) - Einstellungen\nKorrekturen\nLuminanz(L) - L*a*b* -HISTORY_MSG_415;(Retinex) - Einstellungen\nTransmission\nTransmissionskurve -HISTORY_MSG_416;(Retinex) -HISTORY_MSG_417;(Retinex) - Einstellungen\nTransmission\nMedianfilter -HISTORY_MSG_418;(Retinex) - Einstellungen\nTransmission\nSchwelle -HISTORY_MSG_419;(Retinex) - Farbraum -HISTORY_MSG_420;(Retinex) - Einstellungen\nHSL-Kurve -HISTORY_MSG_421;(Retinex) - Einstellungen\nKorrekturen\nGammakorrektur -HISTORY_MSG_422;(Retinex) - Einstellungen\nGamma -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;(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 -HISTORY_MSG_431;(Retinex) - Einstellungen\nDynamikkompression\nIntensität Gradient -HISTORY_MSG_432;(Retinex) - Maske\nLichter -HISTORY_MSG_433;(Retinex) - Maske\nTonwertbreite Lichter -HISTORY_MSG_434;(Retinex) - Maske\nSchatten -HISTORY_MSG_435;(Retinex) - Maske\nTonwertbreite Schatten -HISTORY_MSG_436;(Retinex) - Maske\nRadius -HISTORY_MSG_437;(Retinex) - Maske\nMethode -HISTORY_MSG_438;(Retinex) - Maske\nKurve -HISTORY_MSG_439;(Retinex) - Vorschau -HISTORY_MSG_440;(Detailebenenkontrast)\nProzessreihenfolge -HISTORY_MSG_441;(Retinex) - Einstellungen\nVerstärkung und Ausgleich\nTransmissionsverstärkung -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 - 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) -HISTORY_MSG_479;(CIECAM02)\nBetrachtungsbed.\nCAT02 Adaptation -HISTORY_MSG_480;(CIECAM02)\nBetrachtungsbed.\nAuto CAT02 Adaptation -HISTORY_MSG_481;(CIECAM02) - Szene\nFarbtemperatur -HISTORY_MSG_482;(CIECAM02) - Szene\nTönung -HISTORY_MSG_483;(CIECAM02) - Szene\nYb% (Ø Luminanz) -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;(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_494;(Eingangsschärfung) -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_LUMINANCE;(Bildschleier entfernen)\nNur Luminanz -HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;(Bildschleier entfernen)\nMaske anzeigen -HISTORY_MSG_DEHAZE_STRENGTH;(Bildschleier entfernen)\nIntensität +HISTORY_MSG_137;(RAW - Sensor-Matrix)\nSchwarzpunkt - Grün 1 +HISTORY_MSG_138;(RAW - Sensor-Matrix)\nSchwarzpunkt - Rot +HISTORY_MSG_139;(RAW - Sensor-Matrix)\nSchwarzpunkt - Blau +HISTORY_MSG_140;(RAW - Sensor-Matrix)\nSchwarzpunkt - Grün 2 +HISTORY_MSG_141;(RAW - Sensor-Matrix)\nSchwarzpunkt\nGrün-Werte angleichen +HISTORY_MSG_142;(Details - Kantenschärfung)\nIterationen +HISTORY_MSG_143;(Details - Kantenschärfung)\nIntensität +HISTORY_MSG_144;(Details - Mikrokontrast)\nIntensität +HISTORY_MSG_145;(Details - Mikrokontrast)\nGleichmäßigkeit +HISTORY_MSG_146;(Details - Kantenschärfung) +HISTORY_MSG_147;(Details - Kantenschärfung)\nNur Luminanz +HISTORY_MSG_148;(Details - Mikrokontrast) +HISTORY_MSG_149;(Details - Mikrokontrast)\n3×3-Matrix +HISTORY_MSG_150;Artefakt-/Rauschred.\nNach Farbinterpolation +HISTORY_MSG_151;(Farbe - Dynamik) +HISTORY_MSG_152;(Farbe - Dynamik)\nPastelltöne +HISTORY_MSG_153;(Farbe - Dynamik)\nGesättigte Töne +HISTORY_MSG_154;(Farbe - Dynamik)\nHautfarbtöne schützen +HISTORY_MSG_155;(Farbe - Dynamik)\nFarbverschiebungen vermeiden +HISTORY_MSG_156;(Farbe - Dynamik)\nPastell- und gesättigte Töne koppeln +HISTORY_MSG_157;(Farbe - Dynamik)\nSchwelle: Pastell- / gesättigte Töne +HISTORY_MSG_158;(Belichtung - Tonwertkorrektur)\nIntensität +HISTORY_MSG_159;(Belichtung - Tonwertkorrektur)\nKantenschutz +HISTORY_MSG_160;(Belichtung - Tonwertkorrektur)\nFaktor +HISTORY_MSG_161;(Belichtung - Tonwertkorrektur)\nIterationen +HISTORY_MSG_162;(Belichtung - Tonwertkorrektur) +HISTORY_MSG_163;(Farbe - RGB-Kurven)\nRot +HISTORY_MSG_164;(Farbe - RGB-Kurven)\nGrün +HISTORY_MSG_165;(Farbe - RGB-Kurven)\nBlau +HISTORY_MSG_166;(Belichtung)\nZurücksetzen +HISTORY_MSG_167;(RAW - Sensor-Matrix)\nFarbinterpolation\nMethode +HISTORY_MSG_168;(Belichtung - L*a*b*)\nCC-Kurve +HISTORY_MSG_169;(Belichtung - L*a*b*)\nCH-Kurve +HISTORY_MSG_170;(Farbe - Dynamik)\nHH-Kurve +HISTORY_MSG_171;(Belichtung - L*a*b*)\nLC-Kurve +HISTORY_MSG_172;(Belichtung - L*a*b*)\nLC-Kurve beschränken +HISTORY_MSG_173;(Details - Rauschreduzierung)\nLuminanzdetails +HISTORY_MSG_174;(Erweitert - Farberscheinung und Beleuchtung) +HISTORY_MSG_175;(Erweitert - FuB)\nSzene\nAdaptation +HISTORY_MSG_176;(Erweitert - FuB)\nBetrachtungsbed.\nUmgebung +HISTORY_MSG_177;(Erweitert - FuB)\nSzene\nabsolute Leuchtdichte +HISTORY_MSG_178;(Erweitert - FuB)\nBetrachtungsbed.\nabsolute Leuchtdichte +HISTORY_MSG_179;(Erweitert - FuB)\nSzene\nWeißpunktmodell +HISTORY_MSG_180;(Erweitert - FuB)\nBildanpassungen\nHelligkeit (J) +HISTORY_MSG_181;(Erweitert - FuB)\nBildanpassungen\nBuntheit (C) +HISTORY_MSG_182;(Erweitert - FuB)\nSzene\nAutomatisch +HISTORY_MSG_183;(Erweitert - FuB)\nBildanpassungen\nKontrast (J) +HISTORY_MSG_184;(Erweitert - FuB)\nSzene\nUmgebung +HISTORY_MSG_185;(Erweitert - FuB)\nBetrachtungsbed.\nGamutkontrolle +HISTORY_MSG_186;(Erweitert - FuB)\nBildanpassungen\nAlgorithmus +HISTORY_MSG_187;(Erweitert - FuB)\nBildanpassungen\nHautfarbtöne schützen +HISTORY_MSG_188;(Erweitert - FuB)\nBildanpassungen\nHelligkeit (Q) +HISTORY_MSG_189;(Erweitert - FuB)\nBildanpassungen\nKontrast (Q) +HISTORY_MSG_190;(Erweitert - FuB)\nBildanpassungen\nSättigung (S) +HISTORY_MSG_191;(Erweitert - FuB)\nBildanpassungen\nFarbigkeit (M) +HISTORY_MSG_192;(Erweitert - FuB)\nBildanpassungen\nFarbton (H) +HISTORY_MSG_193;(Erweitert - FuB)\nBildanpassungen\nTonwertkurve 1 +HISTORY_MSG_194;(Erweitert - FuB)\nBildanpassungen\nTonwertkurve 2 +HISTORY_MSG_195;(Erweitert - FuB)\nBildanpassungen\nTonwertkurve 1 - Modus +HISTORY_MSG_196;(Erweitert - FuB)\nBildanpassungen\nTonwertkurve 2 - Modus +HISTORY_MSG_197;(Erweitert - FuB)\nBildanpassungen\nFarbkurve +HISTORY_MSG_198;(Erweitert - FuB)\nBildanpassungen\nFarbkurve\nModus +HISTORY_MSG_199;(Erweitert - FuB)\nBildanpassungen\nFarberscheinung für Histogramm-Ausgabe verwenden +HISTORY_MSG_200;(Erweitert - FuB)\nBildanpassungen\nFarberscheinung für Tonwertkorrektur anwenden +HISTORY_MSG_201;(Details - Rauschreduzierung)\nDelta-Chrominanz\nRot/Grün +HISTORY_MSG_202;(Details - Rauschreduzierung)\nDelta-Chrominanz\nBlau/Gelb +HISTORY_MSG_203;(Details - Rauschreduzierung)\nFarbraum +HISTORY_MSG_204;(RAW - Sensor-Matrix)\nFarbinterpolation\nLMMSE-Verbesserung +HISTORY_MSG_205;(Erweitert - FuB)\nHot-/Bad-Pixelfilter +HISTORY_MSG_206;(Erweitert - FuB)\nSzene\nAuto absolute Luminanz +HISTORY_MSG_207;(Details - Farbsaum entfernen)\nFarbtonkurve +HISTORY_MSG_208;(Farbe - Weißabgleich)\nBlau/Rot-Korrektur +HISTORY_MSG_210;(Belichtung - Grauverlaufsfilter)\nRotationswinkel +HISTORY_MSG_211;(Belichtung - Grauverlaufsfilter) +HISTORY_MSG_212;(Belichtung - Vignettierungsfilter)\nIntensität +HISTORY_MSG_213;(Belichtung - Vignettierungsfilter) +HISTORY_MSG_214;(Farbe - Schwarz/Weiß) +HISTORY_MSG_215;(Farbe - Schwarz/Weiß)\nKanalmixer -Rot +HISTORY_MSG_216;(Farbe - Schwarz/Weiß)\nKanalmixer - Grün +HISTORY_MSG_217;(Farbe - Schwarz/Weiß)\nKanalmixer - Blau +HISTORY_MSG_218;(Farbe - Schwarz/Weiß)\nGamma - Rot +HISTORY_MSG_219;(Farbe - Schwarz/Weiß)\nGamma - Grün +HISTORY_MSG_220;(Farbe - Schwarz/Weiß)\nGamma - Blau +HISTORY_MSG_221;(Farbe - Schwarz/Weiß)\nFarbfilter +HISTORY_MSG_222;(Farbe - Schwarz/Weiß)\nVoreinstellung +HISTORY_MSG_223;(Farbe - Schwarz/Weiß)\nKanalmixer - Orange +HISTORY_MSG_224;(Farbe - Schwarz/Weiß)\nKanalmixer - Gelb +HISTORY_MSG_225;(Farbe - Schwarz/Weiß)\nKanalmixer - Cyan +HISTORY_MSG_226;(Farbe - Schwarz/Weiß)\nKanalmixer - Magenta +HISTORY_MSG_227;(Farbe - Schwarz/Weiß)\nKanalmixer - Violett +HISTORY_MSG_228;(Farbe - Schwarz/Weiß)\nLuminanz-Equalizer +HISTORY_MSG_229;(Farbe - Schwarz/Weiß)\nLuminanz-Equalizer +HISTORY_MSG_230;(Farbe - Schwarz/Weiß)\nMethode +HISTORY_MSG_231;(Farbe - Schwarz/Weiß)\n'Bevor'-Kurve +HISTORY_MSG_232;(Farbe - Schwarz/Weiß)\n'Bevor'-Kurventyp +HISTORY_MSG_233;(Farbe - Schwarz/Weiß)\n'Danach'-Kurve +HISTORY_MSG_234;(Farbe - Schwarz/Weiß)\n'Danach'-Kurventyp +HISTORY_MSG_235;(Farbe - Schwarz/Weiß)\nKanalmixer Automatisch +HISTORY_MSG_236;--nicht verwendet-- +HISTORY_MSG_237;(Farbe - Schwarz/Weiß)\nKanalmixer +HISTORY_MSG_238;(Belichtung - Grauverlaufsfilter)\nBereich +HISTORY_MSG_239;(Belichtung - Grauverlaufsfilter)\nIntensität +HISTORY_MSG_240;(Belichtung - Grauverlaufsfilter)\nRotationsachsen +HISTORY_MSG_241;(Belichtung - Vignettierungsfilter)\nBereich +HISTORY_MSG_242;(Belichtung - Vignettierungsfilter)\nForm +HISTORY_MSG_243;(Transformieren - Objektivkorrektur)\nVignettierung - Radius +HISTORY_MSG_244;(Transformieren - Objektivkorrektur)\nVignettierung - Faktor +HISTORY_MSG_245;(Transformieren - Objektivkorrektur)\nVignettierung - Zentrum +HISTORY_MSG_246;(Belichtung - L*a*b*)\nCL-Kurve +HISTORY_MSG_247;(Belichtung - L*a*b*)\nLH-Kurve +HISTORY_MSG_248;(Belichtung - L*a*b*)\nHH-Kurve +HISTORY_MSG_249;(Details - Detailebenenkontrast)\nSchwelle +HISTORY_MSG_251;(Farbe - Schwarz/Weiß)\nAlgorithmus +HISTORY_MSG_252;(Details - Detailebenenkontrast)\nHautfarbtöne schützen +HISTORY_MSG_253;(Details - Detailebenenkontrast)\nArtefakte reduzieren +HISTORY_MSG_254;(Details - Detailebenenkontrast)\nHautfarbton +HISTORY_MSG_255;(Details - Rauschreduzierung)\nMedianfilter +HISTORY_MSG_256;(Details - Rauschreduzierung)\nMedianfilter - Mediantyp +HISTORY_MSG_257;(Farbe - Farbanpassungen) +HISTORY_MSG_258;(Farbe - Farbanpassungen)\nFarbkurve +HISTORY_MSG_259;(Farbe - Farbanpassungen)\nDeckkraftkurve +HISTORY_MSG_260;(Farbe - Farbanpassungen)\na*[b*]-Transparenz +HISTORY_MSG_261;(Farbe - Farbanpassungen)\nMethode +HISTORY_MSG_262;(Farbe - Farbanpassungen)\nb*-Transparenz +HISTORY_MSG_263;(Farbe - Farbanpassungen)\nSchatten - Blau/Rot +HISTORY_MSG_264;(Farbe - Farbanpassungen)\nSchatten - Cyan/Grün +HISTORY_MSG_265;(Farbe - Farbanpassungen)\nSchatten - Gelb/Blau +HISTORY_MSG_266;(Farbe - Farbanpassungen)\nMitten - Blau / Rot +HISTORY_MSG_267;(Farbe - Farbanpassungen)\nMitten - Cyan/Grün +HISTORY_MSG_268;(Farbe - Farbanpassungen)\nMitten - Gelb/Blau +HISTORY_MSG_269;(Farbe - Farbanpassungen)\nLichter - Blau/Rot +HISTORY_MSG_270;(Farbe - Farbanpassungen)\nLichter - Cyan/Grün +HISTORY_MSG_271;(Farbe - Farbanpassungen)\nLichter - Gelb/Blau +HISTORY_MSG_272;(Farbe - Farbanpassungen)\nFarbausgleich +HISTORY_MSG_273;(Farbe - Farbanpassungen)\nFarbausgleich\nRegler zurücksetzen +HISTORY_MSG_276;(Farbe - Farbanpassungen)\nDeckkraft +HISTORY_MSG_277;--nicht verwendet-- +HISTORY_MSG_278;(Farbe - Farbanpassungen)\nLuminanz schützen +HISTORY_MSG_279;(Farbe - Farbanpassungen)\nSchatten +HISTORY_MSG_280;(Farbe - Farbanpassungen)\nLichter +HISTORY_MSG_281;(Farbe - Farbanpassungen)\nSättigung schützen\nIntensität +HISTORY_MSG_282;(Farbe - Farbanpassungen)\nSättigung schützen\nSchwelle +HISTORY_MSG_283;(Farbe - Farbanpassungen)\nIntensität +HISTORY_MSG_284;(Farbe - Farbanpassungen)\nSättigung schützen\nAutomatisch +HISTORY_MSG_285;(Details - Rauschreduzierung)\nMedianfilter - Methode +HISTORY_MSG_286;(Details - Rauschreduzierung)\nMediantyp +HISTORY_MSG_287;(Details - Rauschreduzierung)\nMedianfilter - Iterationen +HISTORY_MSG_288;(RAW - Weißbild)\nKontrolle zu heller Bereiche +HISTORY_MSG_289;(RAW - Weißbild)\nAuto-Kontrolle zu heller Bereiche +HISTORY_MSG_290;(RAW - Sensor-Matrix)\nSchwarzpunkt - Rot +HISTORY_MSG_291;(RAW - Sensor-Matrix)\nSchwarzpunkt - Grün +HISTORY_MSG_292;(RAW - Sensor-Matrix)\nSchwarzpunkt - Blau +HISTORY_MSG_293;(Farbe - Filmsimulation) +HISTORY_MSG_294;(Farbe - Filmsimulation)\nIntensität +HISTORY_MSG_295;(Farbe - Filmsimulation) - Film +HISTORY_MSG_296;(Details - Rauschreduzierung)\nLuminanzkurve +HISTORY_MSG_297;(Details - Rauschreduzierung)\nModus +HISTORY_MSG_298;(RAW - Vorverarbeitung)\nDead-Pixel-Filter +HISTORY_MSG_299;(Details - Rauschreduzierung)\nChrominanzkurve +HISTORY_MSG_301;(Details - Rauschreduzierung)\nLuminanzkontrolle +HISTORY_MSG_302;(Details - Rauschreduzierung)\nChrominanz - Methode +HISTORY_MSG_303;(Details - Rauschreduzierung)\nChrominanz - Methode +HISTORY_MSG_304;(Erweitert - Wavelet)\nKontrastebenen +HISTORY_MSG_305;(Erweitert - Wavelet) +HISTORY_MSG_306;(Erweitert - Wavelet)\nEinstellungen\nVerarbeitungsebene +HISTORY_MSG_307;(Erweitert - Wavelet)\nEinstellungen\nVerarbeitung +HISTORY_MSG_308;(Erweitert - Wavelet)\nEinstellungen\nVerarbeitungsrichtung +HISTORY_MSG_309;(Erweitert - Wavelet)\nKantenschärfung\nDetails +HISTORY_MSG_310;(Erweitert - Wavelet)\nRestbild - Chroma\nHimmelsfarbtöne schützen +HISTORY_MSG_311;(Erweitert - Wavelet)\nEinstellungen\nAnzahl der Ebenen +HISTORY_MSG_312;(Erweitert - Wavelet)\nRestbild - Schatten/Lichter\nSchwelle Schatten +HISTORY_MSG_313;(Erweitert - Wavelet)\nFarbe\nEbenengrenze +HISTORY_MSG_314;(Erweitert - Wavelet)\nGamut\nArtefakte reduzieren +HISTORY_MSG_315;(Erweitert - Wavelet)\nRestbild - Kompression\nKontrast +HISTORY_MSG_316;(Erweitert - Wavelet)\nGamut\nHautfarbtöne schützen +HISTORY_MSG_317;(Erweitert - Wavelet)\nGamut\nHautfarbton +HISTORY_MSG_318;(Erweitert - Wavelet)\nKontrast\nLichterebenen +HISTORY_MSG_319;(Erweitert - Wavelet)\nKontrast\nLichter-Luminanzbereich +HISTORY_MSG_320;(Erweitert - Wavelet)\nKontrast\nSchatten-Luminanzbereich +HISTORY_MSG_321;(Erweitert - Wavelet)\nKontrast\nSchattenebenen +HISTORY_MSG_322;(Erweitert - Wavelet)\nGamut\nFarbverschiebungen vermeiden +HISTORY_MSG_323;(Erweitert - Wavelet)\nKantenschärfung\nLokale Kontrastkurve +HISTORY_MSG_324;(Erweitert - Wavelet)\nFarbe\nPastellfarben +HISTORY_MSG_325;(Erweitert - Wavelet)\nFarbe\nGesättigte Farben +HISTORY_MSG_326;(Erweitert - Wavelet)\nFarbe\nChrominanzmethode +HISTORY_MSG_327;(Erweitert - Wavelet)\nKontrast\nAnwenden auf +HISTORY_MSG_328;(Erweitert - Wavelet)\nFarbe\nFarb-Kontrast-\nVerknüpfung +HISTORY_MSG_329;(Erweitert - Wavelet)\nTönung\nDeckkraft Rot/Grün +HISTORY_MSG_330;(Erweitert - Wavelet)\nTönung\nDeckkraft Blau/Gelb +HISTORY_MSG_331;(Erweitert - Wavelet)\nKontrastebenen +HISTORY_MSG_332;(Erweitert - Wavelet)\nEinstellungen\nKachelgröße +HISTORY_MSG_333;(Erweitert - Wavelet)\nRestbild - Schatten/Lichter\nSchatten +HISTORY_MSG_334;(Erweitert - Wavelet)\nRestbild - Chroma\nBuntheit +HISTORY_MSG_335;(Erweitert - Wavelet)\nRestbild - Schatten/Lichter\nLichter +HISTORY_MSG_336;(Erweitert - Wavelet)\nRestbild - Schatten/Lichter\nSchwelle Lichter +HISTORY_MSG_337;(Erweitert - Wavelet)\nRestbild - Chroma\nHimmelsfarbton +HISTORY_MSG_338;(Erweitert - Wavelet)\nKantenschärfung\nRadius +HISTORY_MSG_339;(Erweitert - Wavelet)\nKantenschärfung\nIntensität +HISTORY_MSG_340;(Erweitert - Wavelet)\nEinstellungen\nIntensität +HISTORY_MSG_341;(Erweitert - Wavelet)\nEinstellungen\nKantenperformance +HISTORY_MSG_342;(Erweitert - Wavelet)\nKantenschärfung\nErste Ebene +HISTORY_MSG_343;(Erweitert - Wavelet)\nFarbe\nFarbebenen +HISTORY_MSG_344;(Erweitert - Wavelet)\nFarbmethode\nRegler/Kurve +HISTORY_MSG_345;(Erweitert - Wavelet)\nKantenschärfung\nLokaler Kontrast +HISTORY_MSG_346;(Erweitert - Wavelet)\nKantenschärfung\nLokale Kontrastmethode +HISTORY_MSG_347;(Erweitert - Wavelet)\nRauschreduzierung\nEbene 1 +HISTORY_MSG_348;(Erweitert - Wavelet)\nRauschreduzierung\nEbene 2 +HISTORY_MSG_349;(Erweitert - Wavelet)\nRauschreduzierung\nEbene 3 +HISTORY_MSG_350;(Erweitert - Wavelet)\nKantenschärfung\nKantenerkennung +HISTORY_MSG_351;(Erweitert - Wavelet)\nRestbild\nHH-Kurve +HISTORY_MSG_352;(Erweitert - Wavelet)\nEinstellungen\nHintergrund +HISTORY_MSG_353;(Erweitert - Wavelet)\nKantenschärfung\nVerlaufsempfindlichkeit +HISTORY_MSG_354;(Erweitert - Wavelet)\nKantenschärfung\nErweiterter Algorithmus +HISTORY_MSG_355;(Erweitert - Wavelet)\nKantenschärfung\nSchwelle niedrig +HISTORY_MSG_356;(Erweitert - Wavelet)\nKantenschärfung\nSchwelle hoch +HISTORY_MSG_357;(Erweitert - Wavelet)\nRauschreduzierung\nMit K-Schärfe verbinden +HISTORY_MSG_358;(Erweitert - Wavelet)\nGamut\nKontrastkurve +HISTORY_MSG_359;(RAW - Vorverarbeitung)\nHot-/Dead-Pixel-Filter\nSchwelle +HISTORY_MSG_360;(Belichtung - Tonwertkorrektur)\nGamma +HISTORY_MSG_361;(Erweitert - Wavelet)\nEndretusche - Direktionaler Kontrast\nFarbausgleich +HISTORY_MSG_362;(Erweitert - Wavelet)\nRestbild\nKompression +HISTORY_MSG_363;(Erweitert - Wavelet)\nRestbild - Kompression\nIntensität +HISTORY_MSG_364;(Erweitert - Wavelet)\nEndretusche - Direktionaler Kontrast\nKontrastausgleich +HISTORY_MSG_365;(Erweitert - Wavelet)\nEndretusche - Direktionaler Kontrast\nDelta-Kontrastausgleich +HISTORY_MSG_366;(Erweitert - Wavelet)\nRestbild - Kompression\nGamma +HISTORY_MSG_367;(Erweitert - Wavelet)\nEndretusche - finaler lokaler Kontrast\n'Danach'-Kontrastkurve +HISTORY_MSG_368;(Erweitert - Wavelet)\nEndretusche\nKontrastausgleichskurve +HISTORY_MSG_369;(Erweitert - Wavelet)\nEndretusche\nKontrastmethode +HISTORY_MSG_370;(Erweitert - Wavelet)\nEndretusche\nLokale Kontrastkurve +HISTORY_MSG_371;(Transformieren - Skalieren)\nSchärfen +HISTORY_MSG_372;(Transformieren - Skalieren)\nSchärfen\nUSM - Radius +HISTORY_MSG_373;(Transformieren - Skalieren)\nSchärfen\nUSM - Intensität +HISTORY_MSG_374;(Transformieren - Skalieren)\nSchärfen\nUSM - Schwelle +HISTORY_MSG_375;(Transformieren - Skalieren)\nSchärfen\nUSM - Nur Kanten schärfen +HISTORY_MSG_376;(Transformieren - Skalieren)\nSchärfen\nUSM - Kantenschärfung\nRadius +HISTORY_MSG_377;(Transformieren - Skalieren)\nSchärfen\nUSM - Kantentoleranz +HISTORY_MSG_378;(Transformieren - Skalieren)\nSchärfen\nUSM - Halokontrolle +HISTORY_MSG_379;(Transformieren - Skalieren)\nSchärfen\nUSM - Halokontrolle\nIntensität +HISTORY_MSG_380;(Transformieren - Skalieren)\nSchärfen\nMethode +HISTORY_MSG_381;(Transformieren - Skalieren)\nSchärfen\nRLD - Radius +HISTORY_MSG_382;(Transformieren - Skalieren)\nSchärfen\nRLD - Intensität +HISTORY_MSG_383;(Transformieren - Skalieren)\nSchärfen\nRLD - Dämpfung +HISTORY_MSG_384;(Transformieren - Skalieren)\nSchärfen\nRLD - Iterationen +HISTORY_MSG_385;(Erweitert - Wavelet)\nRestbild - Farbausgleich +HISTORY_MSG_386;(Erweitert - Wavelet)\nRestbild - Farbausgleich\nLichter Grün/Cyan +HISTORY_MSG_387;(Erweitert - Wavelet)\nRestbild - Farbausgleich\nLichter Blau/Gelb +HISTORY_MSG_388;(Erweitert - Wavelet)\nRestbild - Farbausgleich\nMitten Grün/Cyan +HISTORY_MSG_389;(Erweitert - Wavelet)\nRestbild - Farbausgleich\nMitten Blau/Gelb +HISTORY_MSG_390;(Erweitert - Wavelet)\nRestbild - Farbausgleich\nSchatten Grün/Cyan +HISTORY_MSG_391;(Erweitert - Wavelet)\nRestbild - Farbausgleich\nSchatten Blau/Gelb +HISTORY_MSG_392;(Erweitert - Wavelet)\nRestbild - Farbausgleich +HISTORY_MSG_393;(Farbe - Farbmanagement)\nEingangsfarbprofil\nDCP - Look-Tabelle +HISTORY_MSG_394;(Farbe - Farbmanagement)\nEingangsfarbprofil\nDCP - Basisbelichtung +HISTORY_MSG_395;(Farbe - Farbmanagement)\nEingangsfarbprofil\nDCP - Basistabelle +HISTORY_MSG_396;(Erweitert - Wavelet)\nKontrast +HISTORY_MSG_397;(Erweitert - Wavelet)\nFarbe +HISTORY_MSG_398;(Erweitert - Wavelet)\nKantenschärfung +HISTORY_MSG_399;(Erweitert - Wavelet)\nRestbild +HISTORY_MSG_400;(Erweitert - Wavelet)\nEndretusche +HISTORY_MSG_401;(Erweitert - Wavelet)\nTönung +HISTORY_MSG_402;(Erweitert - Wavelet)\nRauschreduzierung +HISTORY_MSG_403;(Erweitert - Wavelet)\nKantenschärfung\nKantenempfindlichkeit +HISTORY_MSG_404;(Erweitert - Wavelet)\nKantenschärfung\nGrundverstärkung +HISTORY_MSG_405;(Erweitert - Wavelet)\nRauschreduzierung\nEbene 4 +HISTORY_MSG_406;(Erweitert - Wavelet)\nKantenschärfung\nBenachbarte Pixel +HISTORY_MSG_407;(Erweitert - Retinex)\nMethode +HISTORY_MSG_408;(Erweitert - Retinex)\nRadius +HISTORY_MSG_410;(Erweitert - Retinex)\nEinstellungen\nVerstärkung und Versatz\nVersatz +HISTORY_MSG_411;(Erweitert - Retinex)\nIntensität +HISTORY_MSG_412;(Erweitert - Retinex)\nEinstellungen\nDynamikkompression\nGauß'scher Gradient +HISTORY_MSG_413;(Erweitert - Retinex)\nKontrast +HISTORY_MSG_414;(Erweitert - Retinex)\nEinstellungen\nKorrekturen\nLuminanz(L) - L*a*b* +HISTORY_MSG_415;(Erweitert - Retinex)\nEinstellungen\nÜbertragung\nÜbertragungskurve +HISTORY_MSG_416;(Erweitert - Retinex) +HISTORY_MSG_417;(Erweitert - Retinex)\nEinstellungen\nÜbertragung\nMedianfilter +HISTORY_MSG_418;(Erweitert - Retinex)\nEinstellungen\nÜbertragung\nSchwelle +HISTORY_MSG_419;(Erweitert - Retinex)\nFarbraum +HISTORY_MSG_420;(Erweitert - Retinex)\nEinstellungen\nHSL-Kurve +HISTORY_MSG_421;(Erweitert - Retinex)\nEinstellungen\nKorrekturen\nGammakorrektur +HISTORY_MSG_422;(Erweitert - Retinex)\nEinstellungen\nGamma +HISTORY_MSG_423;(Erweitert - Retinex)\nEinstellungen\nGammasteigung +HISTORY_MSG_424;(Erweitert - Retinex)\nEinstellungen\nHL-Schwelle +HISTORY_MSG_425;--nicht verwendet-- +HISTORY_MSG_426;(Erweitert - Retinex)\nEinstellungen\nKorrekturen - Farbton (H) +HISTORY_MSG_427;(Farbe - Farbmanagement)\nAusgabeprofil\nArt der Wiedergabe +HISTORY_MSG_428;Monitorbasierte Wiedergabe +HISTORY_MSG_429;(Erweitert - Retinex)\nEinstellungen\nDynamikkompression\nIterationen +HISTORY_MSG_430;(Erweitert - Retinex)\nEinstellungen\nDynamikkompression\nÜbertragungsgradient +HISTORY_MSG_431;(Erweitert - Retinex)\nEinstellungen\nDynamikkompression\nVerlaufsintensität +HISTORY_MSG_432;(Erweitert - Retinex)\nMaske\nLichter +HISTORY_MSG_433;(Erweitert - Retinex)\nMaske\nTonwertbreite Lichter +HISTORY_MSG_434;(Erweitert - Retinex)\nMaske\nSchatten +HISTORY_MSG_435;(Erweitert - Retinex)\nMaske\nTonwertbreite Schatten +HISTORY_MSG_436;(Erweitert - Retinex)\nMaske\nRadius +HISTORY_MSG_437;(Erweitert - Retinex)\nMaske\nMethode +HISTORY_MSG_438;(Erweitert - Retinex)\nMaske\nKurve +HISTORY_MSG_439;(Erweitert - Retinex)\nVorschau +HISTORY_MSG_440;(Details - Detailebenenkontrast)\nProzessreihenfolge +HISTORY_MSG_441;(Erweitert - Retinex)\nEinstellungen\nVerstärkung und Versatz\nÜbertragungsverstärkung +HISTORY_MSG_442;(Erweitert - Retinex)\nEinstellungen\nÜbertragung - Skalierung +HISTORY_MSG_443;(Farbe - Farbmanagement)\nAusgabeprofil\nSchwarzpunkt-Kompensation +HISTORY_MSG_444;(Farbe - Weißabgleich)\nAWB-Temperatur-Korrektur +HISTORY_MSG_445;(RAW - Sensor-Matrix)\nFarbinterpolation\nUnterbild +HISTORY_MSG_446;--nicht verwendet-- +HISTORY_MSG_447;--nicht verwendet-- +HISTORY_MSG_448;--nicht verwendet-- +HISTORY_MSG_449;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nISO-Anpassung +HISTORY_MSG_450;--nicht verwendet-- +HISTORY_MSG_451;--nicht verwendet-- +HISTORY_MSG_452;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nBewegungsmaske anzeigen +HISTORY_MSG_453;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nNur Maske anzeigen +HISTORY_MSG_454;--nicht verwendet-- +HISTORY_MSG_455;--nicht verwendet-- +HISTORY_MSG_456;--nicht verwendet-- +HISTORY_MSG_457;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nBewegung im Rot/Blau-Kanal erkennen +HISTORY_MSG_458;--nicht verwendet-- +HISTORY_MSG_459;--nicht verwendet-- +HISTORY_MSG_460;--nicht verwendet-- +HISTORY_MSG_461;--nicht verwendet-- +HISTORY_MSG_462;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nBewegung im Grün-Kanal erkennen +HISTORY_MSG_463;--nicht verwendet-- +HISTORY_MSG_464;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nUnschärfebewegungsmaske +HISTORY_MSG_465;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nUnschärferadius +HISTORY_MSG_466;--nicht verwendet-- +HISTORY_MSG_467;--nicht verwendet-- +HISTORY_MSG_468;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nLücken in der Bewegungsmaske erkennen +HISTORY_MSG_469;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nMedian +HISTORY_MSG_470;--nicht verwendet-- +HISTORY_MSG_471;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nBewegungskorrektur +HISTORY_MSG_472;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nWeicher Übergang +HISTORY_MSG_474;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nFrame-Helligkeit angleichen +HISTORY_MSG_475;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nAusgleich pro Kanal +HISTORY_MSG_476;(Erweitert - FuB)\nBetrachtungsbed.\nFarbtemperatur +HISTORY_MSG_477;(Erweitert - FuB)\nBetrachtungsbed.\nTönung +HISTORY_MSG_478;(Erweitert - FuB)\nBetrachtungsbed.\nmittlere Leuchtdichte +HISTORY_MSG_479;(Erweitert - FuB)\nBetrachtungsbed.\nAdaptation +HISTORY_MSG_480;(Erweitert - FuB)\nBetrachtungsbed.\nAuto-Adaptation +HISTORY_MSG_481;(Erweitert - FuB)\nSzene\nFarbtemperatur +HISTORY_MSG_482;(Erweitert - FuB)\nSzene\nTönung +HISTORY_MSG_483;(Erweitert - FuB)\nSzene\nmittlere Leuchtdichte +HISTORY_MSG_484;(Erweitert - FuB)\nSzene\nAuto mittlere Leuchtdichte +HISTORY_MSG_485;(Transformieren - Objektivkorrektur)\nProfil +HISTORY_MSG_486;(Transformieren - Objektivkorrektur)\nProfil - Kamera +HISTORY_MSG_487;(Transformieren - Objektivkorrektur)\nProfil - Objektiv +HISTORY_MSG_488;(Belichtung - Dynamikkompression) +HISTORY_MSG_489;(Belichtung - Dynamikkompression)\nDetails +HISTORY_MSG_490;(Belichtung - Dynamikkompression)\nIntensität +HISTORY_MSG_491;(Farbe - Weißabgleich) +HISTORY_MSG_492;(Farbe - RGB-Kurven) +HISTORY_MSG_493;(Belichtung - L*a*b*) +HISTORY_MSG_494;(RAW - Eingangsschärfung) +HISTORY_MSG_496;(Lokal - Spot)\nGelöscht +HISTORY_MSG_497;(Lokal - Spot)\nAusgewählt +HISTORY_MSG_498;(Lokal - Spot)\nName +HISTORY_MSG_499;(Lokal - Spot)\nSichtbarkeit +HISTORY_MSG_500;(Lokal - Spot)\nForm +HISTORY_MSG_501;(Lokal - Spot)\nMethode +HISTORY_MSG_502;(Lokal - Spot)\nForm-Methode +HISTORY_MSG_503;(Lokal - Spot)\nPos X-rechts +HISTORY_MSG_504;(Lokal - Spot)\nPos X-links +HISTORY_MSG_505;(Lokal - Spot)\nPos Y-unten +HISTORY_MSG_506;(Lokal - Spot)\nPos Y-oben +HISTORY_MSG_507;(Lokal - Spot)\nMitte +HISTORY_MSG_508;(Lokal - Spot)\nSpotgröße +HISTORY_MSG_509;(Lokal - Spot)\nQualitäts-Methode +HISTORY_MSG_510;(Lokal - Spot)\nÜbergangsgradient\nIntensität +HISTORY_MSG_511;(Lokal - Spot)\nKantenerkennung\nSchwellenwert +HISTORY_MSG_512;(Lokal - Spot)\nKantenerkennung\nΔE Zerfall +HISTORY_MSG_513;(Lokal - Spot)\nBereich +HISTORY_MSG_514;(Lokal - Spot)\nStruktur +HISTORY_MSG_515;(Lokal - Lokale Anpassungen) +HISTORY_MSG_516;(Lokal - Farbe-Licht) +HISTORY_MSG_517;(Lokal) - Super aktivieren +HISTORY_MSG_518;(Lokal - Farbe-Licht)\nHelligkeit +HISTORY_MSG_519;(Lokal - Farbe-Licht)\nKontrast +HISTORY_MSG_520;(Lokal - Farbe-Licht)\nChrominanz +HISTORY_MSG_521;(Lokal) - Umfang +HISTORY_MSG_522;(Lokal - Farbe-Licht)\nKurventyp +HISTORY_MSG_523;(Lokal - Farbe-Licht)\nLL-Kurve +HISTORY_MSG_524;(Lokal - Farbe-Licht)\nCC-Kurve +HISTORY_MSG_525;(Lokal - Farbe-Licht)\nLH-Kurve +HISTORY_MSG_526;(Lokal - Farbe-Licht)\nHH-Kurve +HISTORY_MSG_527;(Lokal - Farbe-Licht)\nInvertieren +HISTORY_MSG_528;(Lokal - Dynamik u. Belichtung) +HISTORY_MSG_529;(Lokal - Dynamik u. Belichtung)\nKompression +HISTORY_MSG_530;(Lokal - Dynamik u. Belichtung)\nLichterkompression +HISTORY_MSG_531;(Lokal - Dynamik u. Belichtung)\nLichterkompression\nSchwellenwert +HISTORY_MSG_532;(Lokal - Dynamik u. Belichtung)\nSchwarzwert +HISTORY_MSG_533;(Lokal - Dynamik u. Belichtung)\nSchattenkompression +HISTORY_MSG_534;(Lokal - Farbtemperatur)\nTönung +HISTORY_MSG_535;(Lokal - Dynamik u. Belichtung)\nIntensität +HISTORY_MSG_536;(Lokal - Dynamik u. Belichtung)\nKontrastkurve +HISTORY_MSG_537;(Lokal - Farbtemperatur) +HISTORY_MSG_538;(Lokal - Farbtemperatur)\nGesättigte Töne +HISTORY_MSG_539;(Lokal - Farbtemperatur)\nPastelltöne +HISTORY_MSG_540;(Lokal - Farbtemperatur)\nSchwellenwert +HISTORY_MSG_541;(Lokal - Farbtemperatur)\nHauttöne schützen +HISTORY_MSG_542;(Lokal - Farbtemperatur)\nFarbverschiebung vermeiden +HISTORY_MSG_543;(Lokal - Farbtemperatur)\nPastell- und gesättigte Farbtöne koppeln +HISTORY_MSG_544;(Lokal - Farbtemperatur)\nBereich +HISTORY_MSG_545;(Lokal - Farbtemperatur)\nH-Kurve +HISTORY_MSG_546;(Lokal - Unschärfe)\nUnschärfe und Rauschen +HISTORY_MSG_547;(Lokal - Unschärfe)\nRadius +HISTORY_MSG_548;(Lokal - Unschärfe)\nRauschen +HISTORY_MSG_549;(Lokal - Unschärfe)\nIntensität +HISTORY_MSG_550;(Lokal - Unschärfe)\nMethode +HISTORY_MSG_551;(Lokal - Unschärfe)\nNur Luminanz +HISTORY_MSG_552;(Lokal - Tonwert) +HISTORY_MSG_553;(Lokal - Tonwert)\nKompressionsintensität +HISTORY_MSG_554;(Lokal - Tonwert)\nGamma +HISTORY_MSG_555;(Lokal - Tonwert)\nKantenempfindlichkeit +HISTORY_MSG_556;(Lokal - Tonwert)\nSkalieren +HISTORY_MSG_557;(Lokal - Tonwert)\nGewichtung +HISTORY_MSG_558;(Lokal - Tonwert)\nIntensität +HISTORY_MSG_559;(Lokal - Retinex) +HISTORY_MSG_560;(Lokal - Retinex)\nMethode +HISTORY_MSG_561;(Lokal - Retinex)\nIntensität +HISTORY_MSG_562;(Lokal - Retinex)\nChroma +HISTORY_MSG_563;(Lokal - Retinex)\nRadius +HISTORY_MSG_564;(Lokal - Retinex)\nKontrast +HISTORY_MSG_565;(Lokal) - Umfang +HISTORY_MSG_566;(Lokal - Retinex)\nVerstärkungskurve +HISTORY_MSG_567;(Lokal - Retinex)\nInvertieren +HISTORY_MSG_568;(Lokal - Schärfen) +HISTORY_MSG_569;(Lokal - Schärfen)\nRadius +HISTORY_MSG_570;(Lokal - Schärfen)\nIntensität +HISTORY_MSG_571;(Lokal - Schärfen)\nDämpfung +HISTORY_MSG_572;(Lokal - Schärfen)\nIterationen +HISTORY_MSG_573;(Lokal - Schärfen)\nUmfang +HISTORY_MSG_574;(Lokal - Schärfen)\nInvertieren +HISTORY_MSG_575;(Lokal - Detailebenen) +HISTORY_MSG_576;(Lokal - Detailebenen)\nMulti +HISTORY_MSG_577;(Lokal - Detailebenen)\nChroma +HISTORY_MSG_578;(Lokal - Detailebenen)\nSchwelle +HISTORY_MSG_579;(Lokal - Detailebenen)\nUmfang +HISTORY_MSG_580;--nicht verwendet-- +HISTORY_MSG_581;(Lokal - Rauschminderung)\nLuminanz f 1 +HISTORY_MSG_582;(Lokal - Rauschminderung)\nLuminanz c +HISTORY_MSG_583;(Lokal - Rauschminderung)\nLuminanz Detailwiederherstellung +HISTORY_MSG_584;(Lokal - Rauschminderung)\nEqualizer Weiß -Schwarz +HISTORY_MSG_585;(Lokal - Rauschminderung)\nFeine Chrominanz +HISTORY_MSG_586;(Lokal - Rauschminderung)\nGrobe Chrominanz +HISTORY_MSG_587;(Lokal - Rauschminderung)\nFarbintensität Detailwiederherstellung +HISTORY_MSG_588;(Lokal - Rauschminderung)\nEqualizer Blau/Rot +HISTORY_MSG_589;(Lokal - Rauschminderung)\nImpulsrauschen +HISTORY_MSG_590;(Lokal - Rauschminderung)\nIntensität +HISTORY_MSG_591;(Lokal - Spot)\nSpeziell\nFarbverschiebungen vermeiden +HISTORY_MSG_592;(Lokal - Schärfen)\nKontrastschwelle +HISTORY_MSG_593;(Lokal - Lokaler Kontrast) +HISTORY_MSG_594;(Lokal - Lokaler Kontrast)\nRadius +HISTORY_MSG_595;(Lokal - Lokaler Kontrast)\nIntensität +HISTORY_MSG_596;(Lokal - Lokaler Kontrast)\nDunkel +HISTORY_MSG_597;(Lokal - Lokaler Kontrast)\nHell +HISTORY_MSG_598;(Lokal - Lokaler Kontrast)\nUmfang +HISTORY_MSG_599;(Lokal - Dunst entfernen)\nIntensität +HISTORY_MSG_600;(Lokal - weiches Licht)\nAktiviert +HISTORY_MSG_601;(Lokal - weiches Licht)\nIntensität +HISTORY_MSG_602;(Lokal - weiches Licht)\nBereich +HISTORY_MSG_603;(Lokal - Schärfen)\nUnschärferadius +HISTORY_MSG_605;(Lokal) - Auswahl Maskenvorschau +HISTORY_MSG_606;Lokalen Spot ausgewählt +HISTORY_MSG_607;(Lokal - Farbe-Licht)\nMaske\nKurve C +HISTORY_MSG_608;(Lokal - Farbe-Licht)\nMaske\nKurve L +HISTORY_MSG_609;(Lokal - Dynamik u. Belichtung)\nMaske\nKurve C +HISTORY_MSG_610;(Lokal - Dynamik u. Belichtung)\nMaske\nKurve L +HISTORY_MSG_611;(Lokal - Farbe-Licht)\nMaske\nKurve LC(H) +HISTORY_MSG_612;(Lokal - Farbe-Licht)\nSpot-Struktur +HISTORY_MSG_613;(Lokal - Dynamik u. Belichtung)\nSpot-Struktur +HISTORY_MSG_614;(Lokal - Dynamik u. Belichtung)\nMaske\nKurve LC(H) +HISTORY_MSG_615;(Lokal - Farbe-Licht)\nMaske\nÜberlagerung +HISTORY_MSG_616;(Lokal - Dynamik u. Belichtung)\nMaske\nÜberlagerung +HISTORY_MSG_617;(Lokal - Dynamik u. Belichtung)\nUnschärfe Kantenerkennung +HISTORY_MSG_618;(Lokal - Farbe-Licht)\nMaske +HISTORY_MSG_619;(Lokal - Dynamik u. Belichtung)\nMaske +HISTORY_MSG_620;(Lokal - Farbe-Licht)\nUnschärfe Kantenerkennung +HISTORY_MSG_621;(Lokal - Dynamik u. Belichtung)\nInvertieren +HISTORY_MSG_622;(Lokal - Spot)\nAusschließende Spot-Struktur +HISTORY_MSG_623;(Lokal - Dynamik u. Belichtung)\nKompensation Farbsättigung +HISTORY_MSG_624;(Lokal - Farbe-Licht)\nFarbkorrektur +HISTORY_MSG_625;(Lokal - Farbe-Licht)\nIntensität Farbkorrektur +HISTORY_MSG_626;(Lokal - Farbe-Licht)\nMethode +HISTORY_MSG_627;(Lokal - Schatten/Lichter) +HISTORY_MSG_628;(Lokal - Schatten/Lichter)\nLichter +HISTORY_MSG_629;(Lokal - Schatten/Lichter)\nTonwertbreite Lichter +HISTORY_MSG_630;(Lokal - Schatten/Lichter)\nSchatten +HISTORY_MSG_631;(Lokal - Schatten/Lichter)\nTonwertbreite Schatten +HISTORY_MSG_632;(Lokal - Schatten/Lichter)\nRadius +HISTORY_MSG_633;(Lokal - Schatten/Lichter)\nUmfang +HISTORY_MSG_634;(Lokal - Farbe-Licht)\nMaske\nRadius +HISTORY_MSG_635;(Lokal - Dynamik u. Belichtung)\nMaske\nRadius +HISTORY_MSG_636;(Lokal)\nWerkzeug hinzugefügt +HISTORY_MSG_637;(Lokal - Schatten/Lichter)\nMaske\nKurve C +HISTORY_MSG_638;(Lokal - Schatten/Lichter)\nMaske\nKurve L +HISTORY_MSG_639;(Lokal - Schatten/Lichter)\nMaske\nKurve LC(H) +HISTORY_MSG_640;(Lokal - Schatten/Lichter)\nMaske\nÜberlagerung +HISTORY_MSG_641;(Lokal - Schatten/Lichter)\nMaske +HISTORY_MSG_642;(Lokal - Schatten/Lichter)\nMaske\nRadius +HISTORY_MSG_643;(Lokal - Schatten/Lichter)\nUnschärfe Kantenerkennung +HISTORY_MSG_644;(Lokal - Schatten/Lichter)\nInvertieren +HISTORY_MSG_645;(Lokal - Spot)\nKantenerkennung\nBalance ab-L (ΔE) +HISTORY_MSG_646;(Lokal - Dynamik u. Belichtung)\nMaske\nFarbintensität +HISTORY_MSG_647;(Lokal - Dynamik u. Belichtung)\nMaske\nGamma +HISTORY_MSG_648;(Lokal - Dynamik u. Belichtung)\nMaske\nSteigung +HISTORY_MSG_649;(Lokal - Dynamik u. Belichtung)\nVerlaufsfilter\nRadius +HISTORY_MSG_650;(Lokal - Farbe-Licht)\nMaske\nFarbintensität +HISTORY_MSG_651;(Lokal - Farbe-Licht)\nMaske\nGamma +HISTORY_MSG_652;(Lokal - Farbe-Licht)\nMaske\nSteigung +HISTORY_MSG_653;(Lokal - Schatten/Lichter)\nMaske\nFarbintensität +HISTORY_MSG_654;(Lokal - Schatten/Lichter)\nMaske\nGamma +HISTORY_MSG_655;(Lokal - Schatten/Lichter)\nMaske\nSteigung +HISTORY_MSG_656;(Lokal - Farbe-Licht)\nRadius +HISTORY_MSG_657;(Lokal - Retinex)\nArtefakte reduzieren +HISTORY_MSG_658;(Lokal - Detailebenen)\nRadius +HISTORY_MSG_659;(Lokal - Spot)\nÜbergangsgradient\nÜbergangszerfall +HISTORY_MSG_660;(Lokal - Detailebenen)\nKlarheit +HISTORY_MSG_661;(Lokal - Detailebenen)\nVerbleibend +HISTORY_MSG_662;(Lokal - Rauschminderung)\nLuminanz f 0 +HISTORY_MSG_663;(Lokal - Rauschminderung)\nLuminanz f 2 +HISTORY_MSG_664;--nicht verwendet-- +HISTORY_MSG_665;(Lokal - Detailebenen)\nMaske\nÜberlagerung +HISTORY_MSG_666;(Lokal - Detailebenen)\nMaske\nRadius +HISTORY_MSG_667;(Lokal - Detailebenen)\nMaske\nFarbintensität +HISTORY_MSG_668;(Lokal - Detailebenen)\nMaske\nGamma +HISTORY_MSG_669;(Lokal - Detailebenen)\nMaske\nSteigung +HISTORY_MSG_670;(Lokal - Detailebenen)\nMaske C +HISTORY_MSG_671;(Lokal - Detailebenen)\nMaske L +HISTORY_MSG_672;(Lokal - Detailebenen)\nMaske CL +HISTORY_MSG_673;(Lokal - Detailebenen)\nMaske anwenden +HISTORY_MSG_674;(Lokal)\nWerkzeug entfernt +HISTORY_MSG_675;(Lokal - Tonwert)\nRadius +HISTORY_MSG_676;(Lokal - Spot)\nÜbergangsgradient\nUnterschied XY +HISTORY_MSG_677;(Lokal - Tonwert)\nIntensität +HISTORY_MSG_678;(Lokal - Tonwert)\nSättigung +HISTORY_MSG_679;(Lokal - Retinex)\nMaske C +HISTORY_MSG_680;(Lokal - Retinex)\nMaske L +HISTORY_MSG_681;(Lokal - Retinex)\nMaske CL +HISTORY_MSG_682;(Lokal - Retinex) Maske +HISTORY_MSG_683;(Lokal - Retinex)\nMaske\nÜberlagerung +HISTORY_MSG_684;(Lokal - Retinex)\nMaske\nRadius +HISTORY_MSG_685;(Lokal - Retinex)\nMaske\nFarbintensität +HISTORY_MSG_686;(Lokal - Retinex)\nMaske\nGamma +HISTORY_MSG_687;(Lokal - Retinex)\nMaske\nSteigung +HISTORY_MSG_688;(Lokal)\nWerkzeug entfernt +HISTORY_MSG_689;(Lokal - Retinex) Maske\nÜbertragungszuordnung +HISTORY_MSG_690;(Lokal - Retinex)\nSkalieren +HISTORY_MSG_691;(Lokal - Retinex)\nDunkel +HISTORY_MSG_692;(Lokal - Retinex)\nHell +HISTORY_MSG_693;(Lokal - Retinex)\nSchwelle +HISTORY_MSG_694;(Lokal - Retinex)\nSchwelle Laplace +HISTORY_MSG_695;(Lokal - weiches Licht)\nMethode +HISTORY_MSG_696;(Lokal - Retinex)\nLuminanz normalisieren +HISTORY_MSG_697;(Lokal - Tonwert)\nLuminanz normalisieren +HISTORY_MSG_698;(Lokal - Lokaler Kontrast)\nSchnelle Fouriertransformation +HISTORY_MSG_699;(Lokal - Retinex)\nSchnelle Fouriertransformation +HISTORY_MSG_701;(Lokal - Dynamik u. Belichtung)\nSchatten +HISTORY_MSG_702;(Lokal - Dynamik u. Belichtung)\nMethode +HISTORY_MSG_703;(Lokal - Dynamik u. Belichtung)\nSchwellenwert Laplace +HISTORY_MSG_704;(Lokal - Dynamik u. Belichtung)\nLaplace Balance +HISTORY_MSG_705;(Lokal - Dynamik u. Belichtung)\nLinearität +HISTORY_MSG_706;(Lokal - Tonwert)\nMaske\nKurve C +HISTORY_MSG_707;(Lokal - Tonwert)\nMaske\nKurve L +HISTORY_MSG_708;(Lokal - Tonwert)\nMaske\nKurve LC(h) +HISTORY_MSG_709;(Lokal - Tonwert)\nMaske +HISTORY_MSG_710;(Lokal - Tonwert)\nMaske überlagern +HISTORY_MSG_711;(Lokal - Tonwert)\nMaske Radius +HISTORY_MSG_712;(Lokal - Tonwert)\nMaske Farbintensität +HISTORY_MSG_713;(Lokal - Tonwert)\nMaske Gamma +HISTORY_MSG_714;(Lokal - Tonwert)\nMaske Steigung +HISTORY_MSG_716;(Lokal) - lokale Methode +HISTORY_MSG_717;(Lokal - Wavelet)\nKontrastkurve +HISTORY_MSG_718;(Lokal) - lokale Kontrastebenen +HISTORY_MSG_719;(Lokal - Wavelet)\nVerbleibende L +HISTORY_MSG_720;(Lokal - Unschärfe)\nLuminanzmaske\nKurve C +HISTORY_MSG_721;(Lokal - Unschärfe)\nLuminanzmaske\nKurve L +HISTORY_MSG_722;(Lokal - Unschärfe)\nLuminanzmaske\nKurve LC(h) +HISTORY_MSG_723;(Lokal - Unschärfe)\nMaske +HISTORY_MSG_725;(Lokal - Unschärfe)\nMaske\nÜberlagerung +HISTORY_MSG_726;(Lokal - Unschärfe)\nMaske\nRadius +HISTORY_MSG_727;(Lokal - Unschärfe)\nMaske\nFarbintensität +HISTORY_MSG_728;(Lokal - Unschärfe)\nMaske\nGamma +HISTORY_MSG_729;(Lokal - Unschärfe)\nMaske\nSteigung +HISTORY_MSG_730;(Lokal - Unschärfe)\nMethode +HISTORY_MSG_731;(Lokal - Unschärfe)\nMethode Median\nMedianwert +HISTORY_MSG_732;(Lokal - Unschärfe)\nMethode Median\nIterationen +HISTORY_MSG_733;(Lokal - Unschärfe)\nAnpassbarer Filter\nRadius +HISTORY_MSG_734;(Lokal - Unschärfe)\nAnpassbarer Filter\nDetail +HISTORY_MSG_738;(Lokal - Wavelet)\nRestbild\nLuma zusammenführen +HISTORY_MSG_739;(Lokal - Wavelet)\nRestbild\nRadius +HISTORY_MSG_740;(Lokal - Wavelet)\nRestbild\nChroma zusammenführen +HISTORY_MSG_741;(Lokal - Wavelet)\nVerbleibende C +HISTORY_MSG_742;(Lokal - Dynamik u. Belichtung)\nKontrastdämpfung\nGamma +HISTORY_MSG_743;(Lokal - Dynamik u. Belichtung)\nDynamikkompression\nIntensität +HISTORY_MSG_744;(Lokal - Dynamik u. Belichtung)\nDynamikkompression\nDetail +HISTORY_MSG_745;(Lokal - Dynamik u. Belichtung)\nDynamikkompression\nVersatz +HISTORY_MSG_746;(Lokal - Dynamik u. Belichtung)\nDynamikkompression\nSigma +HISTORY_MSG_747;(Lokal - Einstellungen)\nSpot erstellt +HISTORY_MSG_748;(Lokal - Dynamik u. Belichtung)\nMethode Rauschreduzierung +HISTORY_MSG_749;(Lokal - Dunst entfernen)\nTiefe +HISTORY_MSG_750;(Lokal - Retinex)\nModus logarithmisch +HISTORY_MSG_751;(Lokal - Dunst entfernen)\nSättigung +HISTORY_MSG_752;(Lokal - Retinex)\nVersatz +HISTORY_MSG_753;(Lokal - Retinex)\nÜbertragungszuordnung +HISTORY_MSG_754;(Lokal - Retinex)\nBeschneiden +HISTORY_MSG_755;(Lokal - Tonwert)\nTonwertkorrektur maskieren +HISTORY_MSG_756;(Lokal - Dynamik u. Belichtung)\nVerwende Algo-Belichtungsmaske +HISTORY_MSG_757;(Lokal - Dynamik u. Belichtung)\nMaske\nSchwelle Laplace +HISTORY_MSG_758;(Lokal - Retinex)\nMaske\nSchwelle Laplace +HISTORY_MSG_759;(Lokal - Dynamik u. Belichtung)\nMaske\nSchwelle Laplace +HISTORY_MSG_760;(Lokal - Farbe-Licht)\nMaske\nSchwelle Laplace +HISTORY_MSG_761;(Lokal - Schatten/Lichter)\nMaske\nSchwelle Laplace +HISTORY_MSG_762;(Lokal - Kontrastebenen)\nMaske\nSchwelle Laplace +HISTORY_MSG_763;(Lokal - Unschärfe)\nMaske\nSchwelle Laplace +HISTORY_MSG_764;(Lokal) - Auflösung PDE Laplace-Maske +HISTORY_MSG_765;(Lokal - Rauschminderung)\nLuminanzmaske\nSchwellenwert +HISTORY_MSG_766;(Lokal - Unschärfe)\nSchnelle Fouriertransformation +HISTORY_MSG_767;(Lokal - Unschärfe)\nISO Körnung Verteilung +HISTORY_MSG_768;(Lokal - Unschärfe)\nISO Körnung Intensität +HISTORY_MSG_769;(Lokal - Unschärfe)\nISO Korngröße +HISTORY_MSG_770;(Lokal - Farbe-Licht)\nMaske\nKontrastkurve +HISTORY_MSG_771;(Lokal - Dynamik u. Belichtung)\nMaske\nKontrastkurve +HISTORY_MSG_772;(Lokal - Schärfen)\nMaske\nKontrastkurve +HISTORY_MSG_773;(Lokal - Tonwert)\nMaske\nKontrastkurve +HISTORY_MSG_774;(Lokal - Retinex)\nMaske\nKontrastkurve +HISTORY_MSG_775;(Lokal - Detailebenen)\nMaske\nKontrastkurve +HISTORY_MSG_776;(Lokal - Unschärfe)\nMaske\nKontrastkurve +HISTORY_MSG_777;(Lokal - Unschärfe)\nMaske\nWavelet\nKontrastkurve +HISTORY_MSG_778;(Lokal - Unschärfe)\nMaske\nLichter +HISTORY_MSG_779;(Lokal - Farbe-Licht)\nMaske\nLokale Kontrastkurve +HISTORY_MSG_780;(Lokal - Farbe-Licht)\nMaske\nSchatten +HISTORY_MSG_781;(Lokal - Wavelet)\nWavelet Ebenen +HISTORY_MSG_782;(Lokal - Unschärfe)\nMaske\nWavelet Ebenen +HISTORY_MSG_783;(Lokal - Farbe-Licht)\nWavelet Ebenenauswahl +HISTORY_MSG_784;(Lokal - Spot)\nMaskieren\nΔE Bildmaske +HISTORY_MSG_785;(Lokal - Spot)\nMaskieren\nBereich ΔE-Bildmaske +HISTORY_MSG_786;(Lokal - Schatten/Lichter)\nMethode +HISTORY_MSG_787;(Lokal - Schatten/Lichter)\nEqualizer Regler +HISTORY_MSG_788;(Lokal - Schatten/Lichter)\nEqualizer Details +HISTORY_MSG_789;(Lokal - Schatten/Lichter)\nMaske\nIntensität +HISTORY_MSG_790;(Lokal - Schatten/Lichter)\nMaske Ankerpunkt +HISTORY_MSG_791;(Lokal - Maske)\nShort L-Kurve +HISTORY_MSG_792;(Lokal - Spot)\nMaskieren\nHintergrundfarbe Luminanzmaske +HISTORY_MSG_793;(Lokal - Schatten/Lichter)\nGamma Farbtonkennlinie +HISTORY_MSG_794;(Lokal - Schatten/Lichter)\nSteigung Farbtonkennlinie +HISTORY_MSG_795;(Lokal - Maske)\nSichern wiederhergestelltes Bild +HISTORY_MSG_796;(Lokal - Spot)\nSpeziell\nReferenzen rekursiv +HISTORY_MSG_797;(Lokal - Farbe-Licht)\nZusammenführen\nMethode +HISTORY_MSG_798;(Lokal - Farbe-Licht)\nZusammenführen\nDeckkraft +HISTORY_MSG_799;(Lokal - Farbe-Licht)\nRGB-Kurve +HISTORY_MSG_800;(Lokal - Farbe-Licht)\nMethode RGB-Kurven +HISTORY_MSG_801;(Lokal - Farbe-Licht)\nSpezielle Verwendung RGB-Kurven +HISTORY_MSG_802;(Lokal - Farbe-Licht)\nZusammenführen\nSchwellenwert Kontrast +HISTORY_MSG_803;(Lokal - Farbe-Licht)\nZusammenführen +HISTORY_MSG_804;(Lokal - Farbe-Licht)\nIntensität Strukturmaske +HISTORY_MSG_805;(Lokal - Unschärfe)\nIntensität Strukturmaske +HISTORY_MSG_806;(Lokal - Farbe-Licht)\nStrukturmaske als Werkzeug +HISTORY_MSG_807;(Lokal - Unschärfe)\nStrukturmaske als Werkzeug +HISTORY_MSG_808;(Lokal - Farbe-Licht)\nMaske\nKurve H(H) +HISTORY_MSG_809;(Lokal - Farbtemperatur)\nMaske\nKurve C +HISTORY_MSG_810;(Lokal - Farbtemperatur)\nMaske\nKurve L +HISTORY_MSG_811;(Lokal - Farbtemperatur)\nMaske\nKurve LC(h) +HISTORY_MSG_813;(Lokal - Farbtemperatur)\nMaske +HISTORY_MSG_814;(Lokal - Farbtemperatur)\nMaske\nÜberlagerung +HISTORY_MSG_815;(Lokal - Farbtemperatur)\nMaske\nRadius +HISTORY_MSG_816;(Lokal - Farbtemperatur)\nMaske\nFarbintensität +HISTORY_MSG_817;(Lokal - Farbtemperatur)\nMaske\nGamma +HISTORY_MSG_818;(Lokal - Farbtemperatur)\nMaske\nSteigung +HISTORY_MSG_819;(Lokal - Farbtemperatur)\nMaske\nSchwellenwert Laplace +HISTORY_MSG_820;(Lokal - Farbtemperatur)\nMaske\nKontrastkurve +HISTORY_MSG_821;(Lokal - Farbe-Licht)\nHintergrundgitter +HISTORY_MSG_822;(Lokal - Farbe-Licht)\nHintergrund zusammenführen +HISTORY_MSG_823;(Lokal - Farbe-Licht)\nLuminanz Hintergrund +HISTORY_MSG_824;(Lokal - Dynamik u. Belichtung)\nVerlaufsfilter\nVerlaufsintensität +HISTORY_MSG_825;(Lokal - Dynamik u. Belichtung)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_826;(Lokal - Dynamik u. Belichtung)\nVerlaufsfilter\nIntensität +HISTORY_MSG_827;(Lokal - Dynamik u. Belichtung)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_828;(Lokal - Schatten/Lichter)\nVerlaufsfilter\nVerlaufsintensität +HISTORY_MSG_829;(Lokal - Schatten/Lichter)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_830;(Lokal - Farbe-Licht)\nVerlaufsfilter\nIntensität Luminanz +HISTORY_MSG_831;(Lokal - Farbe-Licht)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_832;(Lokal - Farbe-Licht)\nVerlaufsfilter\nIntensität Chrominanz +HISTORY_MSG_833;(Lokal - Spot)\nÜbergangsgradient\nVerlaufsbreite +HISTORY_MSG_834;(Lokal - Farbe-Licht)\nVerlaufsfilter\nIntensität Farbton +HISTORY_MSG_835;(Lokal - Farbtemperatur)\nVerlaufsfilter\nIntensität Luminanz +HISTORY_MSG_836;(Lokal - Farbtemperatur)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_837;(Lokal - Farbtemperatur)\nVerlaufsfilter\nIntensität Chrominanz +HISTORY_MSG_838;(Lokal - Farbtemperatur)\nVerlaufsfilter\nIntensität Farbton +HISTORY_MSG_839;(Lokal) - Softwarekomplexität +HISTORY_MSG_840;(Lokal - Farbe-Licht)\nCL-Kurve +HISTORY_MSG_841;(Lokal - Farbe-Licht)\nLC-Kurve +HISTORY_MSG_842;(Lokal - Farbe-Licht)\nUnschärfemaske\nRadius +HISTORY_MSG_843;(Lokal - Farbe-Licht)\nUnschärfemaske\nSchwellenwert Kontrast +HISTORY_MSG_844;(Lokal - Farbe-Licht)\nUnschärfemaske\nSchnelle Fouriertransformation +HISTORY_MSG_845;(Lokal - LOG-Kodierung) +HISTORY_MSG_846;(Lokal - LOG-Kodierung)\nAutomatisch +HISTORY_MSG_847;(Lokal - LOG-Kodierung)\nQuelle +HISTORY_MSG_849;(Lokal - LOG-Kodierung)\nQuelle Automatisch +HISTORY_MSG_850;(Lokal - LOG-Kodierung)\nSchwarz-Ev +HISTORY_MSG_851;(Lokal - LOG-Kodierung)\nWeiß-Ev +HISTORY_MSG_852;(Lokal - LOG-Kodierung)\nZiel +HISTORY_MSG_853;(Lokal - LOG-Kodierung)\nLokaler Kontrast +HISTORY_MSG_854;(Lokal - LOG-Kodierung)\nBereich +HISTORY_MSG_855;(Lokal - LOG-Kodierung)\nGesamtes Bild +HISTORY_MSG_856;(Lokal - LOG-Kodierung)\nBereich Schatten +HISTORY_MSG_857;(Lokal - Wavelet)\nUnschärfeebenen\nVerbleibende Unschärfe +HISTORY_MSG_858;(Lokal - Wavelet)\nUnschärfeebenen\nNur Luminanz +HISTORY_MSG_859;(Lokal - Wavelet)\nUnschärfeebenen\nMaximum +HISTORY_MSG_860;(Lokal - Wavelet)\nUnschärfeebenen +HISTORY_MSG_861;(Lokal - Wavelet)\nKontrastebenen +HISTORY_MSG_862;(Lokal - Wavelet)\nKontrastebenen\nDämpfungsreaktion +HISTORY_MSG_863;(Lokal - Wavelet)\nOriginal zusammenführen +HISTORY_MSG_864;(Lokal - Wavelet)\nDirektionaler Kontrast\nDämpfungsreaktion +HISTORY_MSG_865;(Lokal - Wavelet)\nDirektionaler Kontrast\nEbenenbalance +HISTORY_MSG_866;(Lokal - Wavelet)\nDirektionaler Kontrast\nKompression +HISTORY_MSG_868;(Lokal - Spot)\nKantenerkennung\nC-H Balance (ΔE) +HISTORY_MSG_869;(Lokal - Rauschminderung)\nLuminanzkurve +HISTORY_MSG_870;(Lokal - Lokaler Kontrast)\nMaske\nKurve H +HISTORY_MSG_871;(Lokal - Lokaler Kontrast)\nMaske\nKurve C +HISTORY_MSG_872;(Lokal - Lokaler Kontrast)\nMaske\nKurve L +HISTORY_MSG_873;(Lokal - Lokaler Kontrast)\nMaske +HISTORY_MSG_875;(Lokal - Lokaler Kontrast)\nMaske überlagern +HISTORY_MSG_876;(Lokal - Lokaler Kontrast)\nMaske glätten +HISTORY_MSG_877;(Lokal - Lokaler Kontrast)\nMaske Farbintensität +HISTORY_MSG_878;(Lokal - Lokaler Kontrast)\nMaske Kontrastkurve +HISTORY_MSG_879;(Lokal - Wavelet)\nKontrastebene\nFarbintensität +HISTORY_MSG_880;(Lokal - Wavelet)\nUnschärfeebenen\nChrominanz Ebenen +HISTORY_MSG_881;(Lokal - Wavelet)\nKontrastebene\nVersatz +HISTORY_MSG_882;(Lokal - Wavelet)\nUnschärfeebenen +HISTORY_MSG_883;(Lokal - Wavelet)\nKontrast nach Ebenen +HISTORY_MSG_884;(Lokal - Wavelet)\nDirektionaler Kontrast +HISTORY_MSG_885;(Lokal - Wavelet)\nTonwertkorrektur +HISTORY_MSG_886;(Lokal - Wavelet)\nTonwertkorrektur Kompression +HISTORY_MSG_887;(Lokal - Wavelet)\nTonwertkorrektur\nKompression Restbild +HISTORY_MSG_888;(Lokal - Wavelet)\nTonwertkorrektur\nSchwellenwert Balance +HISTORY_MSG_889;(Lokal - Wavelet)\nVerlaufsfilter\nIntensität +HISTORY_MSG_890;(Lokal - Wavelet)\nVerlaufsfilter\nRotationswinkel +HISTORY_MSG_891;(Lokal - Wavelet)\nVerlaufsfilter +HISTORY_MSG_892;(Lokal - LOG-Kodierung)\nVerlaufsintensität +HISTORY_MSG_893;(Lokal - LOG-Kodierung)\nVerlaufswinkel +HISTORY_MSG_894;(Lokal - Spot)\nKantenerkennung\nVorschau Farbe Intensität (ΔE) +HISTORY_MSG_897;(Lokal - Wavelet)\nKantenschärfe\nIntensität +HISTORY_MSG_898;(Lokal - Wavelet)\nKantenschärfe\nRadius +HISTORY_MSG_899;(Lokal - Wavelet(\nKantenschärfe\nDetails +HISTORY_MSG_900;(Lokal - Wavelet)\nKantenschärfe\nVerlaufsempfindlichkeit +HISTORY_MSG_901;(Lokal - Wavelet)\nKantenschärfe\nUnterer Schwellenwert +HISTORY_MSG_902;(Lokal - Wavelet)\nKantenschärfe\nOberer Schwellenwert +HISTORY_MSG_903;(Lokal - Wavelet)\nKantenschärfe\nKontrastkurve +HISTORY_MSG_904;(Lokal - Wavelet)\nKantenschärfe\nErste Ebene +HISTORY_MSG_905;(Lokal - Wavelet)\nKantenschärfe +HISTORY_MSG_906;(Lokal - Wavelet)\nKantenschärfe\nKantenempfindlichkeit +HISTORY_MSG_907;(Lokal - Wavelet)\nKantenschärfe\nGrundverstärkung +HISTORY_MSG_908;(Lokal - Wavelet)\nKantenschärfe\nBenachbarte Pixel +HISTORY_MSG_909;(Lokal - Wavelet\nKantenschärfe\nAlle Werkzeuge anzeigen +HISTORY_MSG_910;(Lokal - Wavelet)\nKantenperformance +HISTORY_MSG_911;(Lokal - Unschärfe)\nChrominanz Luminanz +HISTORY_MSG_912;(Lokal - Unschärfe)\nAnpassbarer Filter Intensität +HISTORY_MSG_913;(Lokal - Wavelet)\nTonwertkorrektur\nDämpfungsreaktion +HISTORY_MSG_914;(Lokal - Wavelet)\nUnschärfeebenen\nDämpfungsreaktion +HISTORY_MSG_915;(Lokal - Wavelet)\nKantenschärfe\nDämpfungsreaktion +HISTORY_MSG_916;(Lokal - Wavelet)\nRestbild Schatten +HISTORY_MSG_917;(Lokal - Wavelet)\nRestbild\nSchwellenwert Schatten +HISTORY_MSG_918;(Lokal - Wavelet)\nRestbild Lichter +HISTORY_MSG_919;(Lokal - Wavelet)\nRestbild\nSchwellenwert Lichter +HISTORY_MSG_920;(Lokal - Wavelet)\nKontrast\nDämpfungsreaktion +HISTORY_MSG_921;(Lokal - Wavelet)\nVerlaufsfilter\nDämpfungsreaktion +HISTORY_MSG_922;(Lokal - Spot)\nSpeziell\nÄnderungen in Schwarz-Weiß erzwingen +HISTORY_MSG_923;(Lokal - Werkzeug)\nKomplexität +HISTORY_MSG_924;--nicht verwendet-- +HISTORY_MSG_925;(Lokal - Spot)\nAnwendungsbereich\nFarbwerkzeuge +HISTORY_MSG_926;(Lokal - Unschärfe) Rauschreduzierung\nMaskenauswahl +HISTORY_MSG_927;(Lokal - Unschärfe)\nMaske\nSchatten +HISTORY_MSG_928;(Lokal - Normale Farbmaske) +HISTORY_MSG_929;(Lokal - Normale Farbmaske)\nIntensität +HISTORY_MSG_930;(Lokal - Normale Farbmaske)\nÜberlagerung Luminanzmaske +HISTORY_MSG_931;(Lokal - Normale Farbmaske)\nMaske +HISTORY_MSG_932;(Lokal - Normale Farbmaske)\nRadius +HISTORY_MSG_933;(Lokal - Normale Farbmaske)\nSchwellenwert Laplace +HISTORY_MSG_934;(Lokal - Normale Farbmaske)\nFarbintensität +HISTORY_MSG_935;(Lokal - Normale Farbmaske)\nGamma +HISTORY_MSG_936;(Lokal - Normale Farbmaske)\nSteigung +HISTORY_MSG_937;(Lokal - Normale Farbmaske)\nKurve C(C) +HISTORY_MSG_938;(Lokal - Normale Farbmaske)\nKurve L(L) +HISTORY_MSG_939;(Lokal - Normale Farbmaske)\nKurve LC(H) +HISTORY_MSG_940;(Lokal - Normale Farbmaske)\nStrukturmaske als Werkzeug +HISTORY_MSG_941;(Lokal - Normale Farbmaske)\nIntensität Strukturmaske +HISTORY_MSG_942;(Lokal - Normale Farbmaske)\nKurve H(H) +HISTORY_MSG_943;(Lokal - Normale Farbmaske)\nSchnelle Fouriertransformation +HISTORY_MSG_944;(Lokal - Normale Farbmaske)\nUnschärfemaske\nUnschärferadius +HISTORY_MSG_945;(Lokal - Normale Farbmaske)\nUnschärfemaske\nSchwellenwert Kontrast +HISTORY_MSG_946;(Lokal - Normale Farbmaske)\nSchatten +HISTORY_MSG_947;(Lokal - Normale Farbmaske)\nKontrastkurve +HISTORY_MSG_948;(Lokal - Normale Farbmaske)\nWavelet-Kurve +HISTORY_MSG_949;(Lokal - Normale Farbmaske)\nWavelet-Ebenen +HISTORY_MSG_950;(Lokal - Normale Farbmaske)\nVerlaufsfiltermaske\nIntensität +HISTORY_MSG_951;(Lokal - Normale Farbmaske)\nVerlaufsfiltermaske\nRotationswinkel +HISTORY_MSG_952;(Lokal - Normale Farbmaske)\nRadius +HISTORY_MSG_953;(Lokal - Normale Farbmaske)\nÜberlagerung Chrominanzmaske +HISTORY_MSG_954;(Lokal)\nWerkzeuge einblenden/ausblenden +HISTORY_MSG_955;(Lokal) - Spot aktivieren +HISTORY_MSG_956;(Lokal - Farbe-Licht)\nCH-Kurve +HISTORY_MSG_957;(Lokal - Rauschminderung)\nModus +HISTORY_MSG_958;(Lokal) - Zus. Einstellungen +HISTORY_MSG_959;(Lokal - Unschärfe)\nInvertieren +HISTORY_MSG_960;(Lokal - LOG-Kodierung)\nCAT16 +HISTORY_MSG_961;(Lokal - LOG-Kodierung)\nCIECAM +HISTORY_MSG_962;(Lokal - LOG-Kodierung)\nAbsolute Luminanzquelle +HISTORY_MSG_963;(Lokal - LOG-Kodierung)\nAbsolutes Luminanzziel +HISTORY_MSG_964;(Lokal - LOG-Kodierung)\nUmgebung +HISTORY_MSG_965;(Lokal - LOG-Kodierung)\nSättigung s +HISTORY_MSG_966;(Lokal - LOG-Kodierung)\nKontrast J +HISTORY_MSG_967;(Lokal - LOG-Kodierung)\nMaske Kurve C +HISTORY_MSG_968;(Lokal - LOG-Kodierung)\nMaske Kurve L +HISTORY_MSG_969;(Lokal - LOG-Kodierung)\nMaske Kurve H +HISTORY_MSG_970;(Lokal - LOG-Kodierung)\nMaske +HISTORY_MSG_971;(Lokal - LOG-Kodierung)\nMaske überlagern +HISTORY_MSG_972;(Lokal - LOG-Kodierung)\nMaske Radius +HISTORY_MSG_973;(Lokal - LOG-Kodierung)\nMaske Chroma +HISTORY_MSG_974;(Lokal - LOG-Kodierung)\nMaske Kontrast +HISTORY_MSG_975;(Lokal - LOG-Kodierung)\nHelligkeit J +HISTORY_MSG_977;(Lokal - LOG-Kodierung)\nKontrast Q +HISTORY_MSG_978;(Lokal - LOG-Kodierung)\nSichere Quelle +HISTORY_MSG_979;(Lokal - LOG-Kodierung)\nHelligkeit Q +HISTORY_MSG_980;(Lokal - LOG-Kodierung)\nFarbigkeit M +HISTORY_MSG_981;(Lokal - LOG-Kodierung)\nIntensität +HISTORY_MSG_982;(Lokal - Rauschminderung)\nEqualizer Farbton +HISTORY_MSG_983;(Lokal - Rauschminderung)\nWiederherstellung\nSchwellenwert Maske hell +HISTORY_MSG_984;(Lokal - Rauschminderung)\nWiederherstellung\nSchwellenwert Maske dunkel +HISTORY_MSG_985;(Lokal - Rauschminderung)\nLuminanzmaske\nLaplace +HISTORY_MSG_986;(Lokal - Rauschminderung)\nDunkle und helle Bereiche verstärken +HISTORY_MSG_987;(Lokal - Verlaufsfilter)\nSchwellenwert Wiederherstellung +HISTORY_MSG_988;(Lokal - Verlaufsfilter)\nSchwellenwert Maske dunkel +HISTORY_MSG_989;(Lokal - Verlaufsfilter)\nSchwellenwert Maske hell +HISTORY_MSG_990;(Lokal - Rauschminderung)\nWiederherstellung\nSchwelle +HISTORY_MSG_991;(Lokal - Rauschminderung)\nSchwellenwert Maske dunkel +HISTORY_MSG_992;(Lokal - Rauschminderung)\nSchwellenwert Maske hell +HISTORY_MSG_993;(Lokal - Rauschminderung)\nInvertieren +HISTORY_MSG_994;(Lokal - Verlaufsfilter)\nInvertieren +HISTORY_MSG_995;(Lokal - Rauschminderung)\nZerfallrate +HISTORY_MSG_996;(Lokal - Farbe-Licht)\nWiederherstellung\nSchwelle +HISTORY_MSG_997;(Lokal - Farbe-Licht)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_998;(Lokal - Farbe-Licht)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_999;(Lokal - Farbe-Licht)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1000;(Lokal - Rauschminderung)\nLuminanz Graubereiche +HISTORY_MSG_1001;(Lokal - LOG-Kodierung)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1002;(Lokal - LOG-Kodierung)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1003;(Lokal - LOG-Kodierung)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1004;(Lokal - LOG-Kodierung)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1005;(Lokal - Dynamik u. Belichtung)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1006;(Lokal - Dynamik u. Belichtung)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1007;(Lokal - Dynamik u. Belichtung)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1008;(Lokal - Dynamik u. Belichtung)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1009;(Lokal - Schatten/Lichter)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1010;(Lokal - Schatten/Lichter)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1011;(Lokal - Schatten/Lichter)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1012;(Lokal - Schatten/Lichter)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1013;(Lokal - Farbtemperatur)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1014;(Lokal - Farbtemperatur)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1015;(Lokal - Farbtemperatur)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1016;(Lokal - Farbtemperatur)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1017;(Lokal - Lokaler Kontrast)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1018;(Lokal - Lokaler Kontrast)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1019;(Lokal - Lokaler Kontrast)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1020;(Lokal - Lokaler Kontrast)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1021;(Lokal - Rauschminderung)\nChrominanz Graubereiche +HISTORY_MSG_1022;(Lokal - Tonwert)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1023;(Lokal - Tonwert)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1024;(Lokal - Tonwert)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1025;(Lokal - Tonwert)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1026;(Lokal - Detailebenen-Kontrast)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1027;(Lokal - Detailebenen-Kontrast)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1028;(Lokal - Detailebenen-Kontrast)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1029;(Lokal - Detailebenen-Kontrast)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1030;(Lokal - Retinex)\nWiederherstellung\nSchwellenwert +HISTORY_MSG_1031;(Lokal - Retinex)\nWiederherstellung\nSchwellenwert dunkel +HISTORY_MSG_1032;(Lokal - Retinex)\nWiederherstellung\nSchwellenwert hell +HISTORY_MSG_1033;(Lokal - Retinex)\nWiederherstellung\nZerfallrate +HISTORY_MSG_1034;(Lokal - Rauschminderung)\nNicht-lokales Mittel\nIntensität +HISTORY_MSG_1035;(Lokal - Rauschminderung)\nNicht-lokales Mittel\nDetailwiederherstellung +HISTORY_MSG_1036;(Lokal - Rauschminderung)\nNicht-lokales Mittel\nObjektgröße +HISTORY_MSG_1037;(Lokal - Rauschminderung)\nNicht-lokales Mittel\nRadius +HISTORY_MSG_1038;(Lokal - Rauschminderung)\nNicht-lokales Mittel\nGamma +HISTORY_MSG_1039;(Lokal - Unschärfe)\nKörnung Gamma +HISTORY_MSG_1040;(Lokal - Spot)\nSpeziell\nRadius +HISTORY_MSG_1041;(Lokal - Spot)\nSpeziell\nNur Munsell +HISTORY_MSG_1042;(Lokal - LOG-Kodierung)\nSchwellenwert +HISTORY_MSG_1043;(Lokal - Dynamik u. Belichtung)\nNormalisieren +HISTORY_MSG_1044;(Lokal - Lokaler Kontrast)\nGesamtintensität +HISTORY_MSG_1045;(Lokal - Farbe-Licht)\nGesamtintensität +HISTORY_MSG_1046;(Lokal - Rauschminderung)\nGesamtintensität +HISTORY_MSG_1047;(Lokal - Schatten/Lichter)\nGesamtintensität +HISTORY_MSG_1048;(Lokal - Dynamik u. Belichtung)\nGesamtintensität +HISTORY_MSG_1049;(Lokal - Tonwert)\nGesamtintensität +HISTORY_MSG_1050;(Lokal - LOG-Kodierung)\nChroma +HISTORY_MSG_1051;(Lokal - Lokaler Kontrast)\nRestbild\nGamma +HISTORY_MSG_1052;(Lokal - Lokaler Kontrast\nRestbild\nSteigung +HISTORY_MSG_1053;(Lokal - Rauschminderung)\nRauschreduzierung\nGamma +HISTORY_MSG_1054;(Lokal - Lokaler Kontrast)\nWavelet\nGamma +HISTORY_MSG_1055;(Lokal - Farbe u. Licht)\nGamma +HISTORY_MSG_1056;(Lokal - Dynamik u. Belichtung)\nDynamikkompression\nGamma +HISTORY_MSG_1057;(Lokal - CIECAM) +HISTORY_MSG_1058;(Lokal - CIECAM)\nGesamtintensität +HISTORY_MSG_1059;(Lokal - CIECAM)\nSzenebasierte Bedingungen\nAutomatisch +HISTORY_MSG_1060;(Lokal - CIECAM)\nSzenebasierte Bedingungen\nMittlere Luminanz +HISTORY_MSG_1061;(Lokal - CIECAM)\nSzenebasierte Bedingungen\nAbsolute Luminanz +HISTORY_MSG_1062;(Lokal - CIECAM)\nSzenebasierte Bedingungen\nUmgebung +HISTORY_MSG_1063;(Lokal - CIECAM)\nCAM16 - Farbe\nSättigung +HISTORY_MSG_1064;(Lokal - CIECAM)\nCAM16 - Farbe\nChroma +HISTORY_MSG_1065;(Lokal - CIECAM)\nHelligkeit J +HISTORY_MSG_1066;(Lokal - CIECAM)\nHelligkeit +HISTORY_MSG_1067;(Lokal - CIECAM)\nKontrast J +HISTORY_MSG_1068;(Lokal - CIECAM)\nCAM16 - Kontrast\nSchwellenwert Kontrast +HISTORY_MSG_1069;(Lokal - CIECAM)\nCAM16 - Kontrast\nKontrast (Q) +HISTORY_MSG_1070;(Lokal - CIECAM)\nCAM16 - Farbe\nBuntheit +HISTORY_MSG_1071;(Lokal - CIECAM)\nBetrachtungsbedingungen\nAbsolute Luminanz +HISTORY_MSG_1072;(Lokal - CIECAM)\nBetrachtungsbedingungen\nMittlere Luminanz +HISTORY_MSG_1073;(Lokal - CIECAM)\nBetrachtungsbedingungen\nChromatische Adaption/Cat16 +HISTORY_MSG_1074;(Lokal - CIECAM)\nCAM16 - Kontrast\nLokaler Kontrast +HISTORY_MSG_1075;(Lokal - CIECAM)\nBetrachtungsbedingungen\nUmgebung +HISTORY_MSG_1076;(Lokal - CIECAM)\nBereich +HISTORY_MSG_1077;(Lokal - CIECAM)\nWerkzeugmodus +HISTORY_MSG_1078;(Lokal - CIECAM)\nCAM16 - Farbe\nHautfarbtöne schützen +HISTORY_MSG_1079;(Lokal - CIECAM)\nSigmoid\nKontraststärke +HISTORY_MSG_1080;(Lokal - CIECAM)\nSigmoid\nSchwellenwert +HISTORY_MSG_1081;(Lokal - CIECAM)\nSigmoid\nÜberlagern +HISTORY_MSG_1082;(Lokal - CIECAM)\nSigmoid\nSchwarz-Ev Weiß-Ev verwenden +HISTORY_MSG_1083;(Lokal - CIECAM)\nCAM16 - Farbe\nFarbtonverschiebung +HISTORY_MSG_1084;(Lokal - CIECAM)\nSchwarz-Ev Weiß-Ev verwenden +HISTORY_MSG_1085;(Lokal - CIECAM)\nJz Cz Hz\nHelligkeit +HISTORY_MSG_1086;(Lokal - CIECAM)\nJz Cz Hz\nKontrast +HISTORY_MSG_1087;(Lokal - CIECAM)\nJz Cz Hz\nChroma +HISTORY_MSG_1088;(Lokal - CIECAM)\nJz Cz Hz\nFarbton +HISTORY_MSG_1089;(Lokal - CIECAM)\nSigmoid Jz\nKontraststärke +HISTORY_MSG_1090;(Lokal - CIECAM)\nSigmoid Jz\nSchwellenwert +HISTORY_MSG_1091;(Lokal - CIECAM)\nSigmoid Jz\nÜberlagern +HISTORY_MSG_1092;(Lokal - CIECAM)\nJz Zuordnung\nAnpassung +HISTORY_MSG_1093;(Lokal - CIECAM)\nCAM Modell +HISTORY_MSG_1094;(Lokal - CIECAM)\nJz Lichter +HISTORY_MSG_1095;(Lokal - CIECAM)\nTonwertbreite Jz Lichter +HISTORY_MSG_1096;(Lokal - CIECAM)\nJz Schatten +HISTORY_MSG_1097;(Lokal - CIECAM)\nTonwertbreite Jz Schatten +HISTORY_MSG_1098;(Lokal - CIECAM)\nJz Radius +HISTORY_MSG_1099;(Lokal - CIECAM)\nJz Cz Hz\nKurve Cz(Hz) +HISTORY_MSG_1100;(Lokal - CIECAM)\nJz Zuordnung\nReferenz 100 +HISTORY_MSG_1101;(Lokal - CIECAM)\nJz Zuordnung\nPQ Peak Luminanz +HISTORY_MSG_1102;(Lokal - CIECAM)\nKurve Jz(Hz) +HISTORY_MSG_1103;(Lokal - CIECAM)\nGamma Lebendigkeit +HISTORY_MSG_1104;(Lokal - CIECAM)\nGamma Schärfe +HISTORY_MSG_1105;(Lokal - CIECAM)\nTonmethode +HISTORY_MSG_1106;(Lokal - CIECAM)\nTonkurve +HISTORY_MSG_1107;(Lokal - CIECAM)\nFarbmethode +HISTORY_MSG_1108;(Lokal - CIECAM)\nFarbkurve +HISTORY_MSG_1109;(Lokal - CIECAM)\nKurve Jz(Jz) +HISTORY_MSG_1110;(Lokal - CIECAM)\nKurve Cz(Cz) +HISTORY_MSG_1111;(Lokal - CIECAM)\nKurve Cz(Jz) +HISTORY_MSG_1112;(Lokal - CIECAM)\nErzwinge jz +HISTORY_MSG_1113;(Lokal - CIECAM)\nCAM16\nHDR PQ +HISTORY_MSG_1114;(Lokal - CIECAM)\nMaske aktivieren +HISTORY_MSG_1115;(Lokal - CIECAM)\nMaske\nKurve C +HISTORY_MSG_1116;(Lokal - CIECAM)\nMaske\nKurve L +HISTORY_MSG_1117;(Lokal - CIECAM)\nMaske\nKurve LC(h) +HISTORY_MSG_1118;(Lokal - CIECAM)\nMaske\nÜberlagerung +HISTORY_MSG_1119;(Lokal - CIECAM)\nMaske\nGlättradius +HISTORY_MSG_1120;(Lokal - CIECAM)\nMaske\nFarbintensität +HISTORY_MSG_1121;(Lokal - CIECAM)\nMaske\nKontrastkurve +HISTORY_MSG_1122;(Lokal - CIECAM)\nMaske\nSchwelle Wiederherstellung +HISTORY_MSG_1123;(Lokal - CIECAM)\nMaske\nSchwelle dunkel +HISTORY_MSG_1124;(Lokal - CIECAM)\nMaske\nSchwelle hell +HISTORY_MSG_1125;(Lokal - CIECAM)\nMaske\nZerfallrate +HISTORY_MSG_1126;(Lokal - CIECAM)\nMaske\nSchwelle Laplace +HISTORY_MSG_1127;(Lokal - CIECAM)\nMaske\nGamma +HISTORY_MSG_1128;(Lokal - CIECAM)\nMaske\nSteigung +HISTORY_MSG_1129;(Lokal - CIECAM)\nJz Cz Hz\nRelative Helligkeit +HISTORY_MSG_1130;(Lokal - CIECAM)\nJz Cz Hz\nSättigung +HISTORY_MSG_1131;(Lokal - Maske)\nRauschminderung Chroma +HISTORY_MSG_1132;(Lokal - CIECAM)\nWavelet Jz\nDämpfungsreaktion +HISTORY_MSG_1133;(Lokal - CIECAM)\nWavelet Jz\nEbenen +HISTORY_MSG_1134;(Lokal - CIECAM)\nWavelet Jz\nLokaler Kontrast +HISTORY_MSG_1135;(Lokal - CIECAM)\nWavelet Jz\nLuma zusammenführen +HISTORY_MSG_1136;(Lokal - CIECAM)\nWavelet Jz\nChroma zusammenführen +HISTORY_MSG_1137;(Lokal - CIECAM)\nWavelet Jz\nGlättradius +HISTORY_MSG_1138;(Lokal - CIECAM)\nJz Cz Hz\nKurve Hz(Hz) +HISTORY_MSG_1139;(Lokal - CIECAM)\nJz Cz Hz\nKurven H\nGlättradius +HISTORY_MSG_1140;(Lokal - CIECAM)\nJz Cz Hz\nKurve Jz(Hz)\nSchwelle Chroma +HISTORY_MSG_1141;(Lokal - CIECAM)\nChroma-Kurve Jz(Hz) +HISTORY_MSG_1142;(Lokal) - Stärke Glätten +HISTORY_MSG_1143;(Lokal - CIECAM)\nSchwarz-Ev +HISTORY_MSG_1144;(Lokal - CIECAM)\nWeiß-Ev +HISTORY_MSG_1145;(Lokal - CIECAM)\nLOG-Kodierung Jz +HISTORY_MSG_1146;(Lokal - CIECAM)\nLOG-Kodierung Jz\nMittlere Helligkeit +HISTORY_MSG_1147;(Lokal - CIECAM)\nSigmoid Jz\nVerwendet Schwarz-Ev Weiß-Ev +HISTORY_MSG_1148;(Lokal - CIECAM)\nSigmoid Jz +HISTORY_MSG_1149;(Lokal - CIECAM)\nSigmoid Q +HISTORY_MSG_1150;(Lokal - CIECAM)\nSigmoid\nLOG-Kodierung anstatt Sigmoid +HISTORY_MSG_BLSHAPE;(Erweitert - Wavelet)\nUnschärfeebenen\nUnschärfe nach Ebenen +HISTORY_MSG_BLURCWAV;(Erweitert - Wavelet)\nRestbild - Unschärfe\nUnschärfe Buntheit +HISTORY_MSG_BLURWAV;(Erweitert - Wavelet)\nRestbild - Unschärfe\nUnschärfe Helligkeit +HISTORY_MSG_BLUWAV;(Erweitert - Wavelet)\nUnschärfeebenen\nDämpfungsreaktion +HISTORY_MSG_CATCAT;(Erweitert - FuB)\Einstellungen Modus +HISTORY_MSG_CATCOMPLEX;(Erweitert - FuB)\nEinstellungen Komplexität +HISTORY_MSG_CATMODEL;(Erweitert - FuB)\nEinstellungen Modell +HISTORY_MSG_CLAMPOOG;(Belichtung) - Farben\nAuf Farbraum beschränken +HISTORY_MSG_COLORTONING_LABGRID_VALUE;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur +HISTORY_MSG_COLORTONING_LABREGION_AB;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Kanal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - C-Maske +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - H-Maske +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Helligkeit +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - L-Maske +HISTORY_MSG_COLORTONING_LABREGION_LIST;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Liste +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Maskenunschärfe +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Versatz +HISTORY_MSG_COLORTONING_LABREGION_POWER;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Verstärkung +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Sättigung +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Maske anzeigen +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;(Farbe - Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Steigung +HISTORY_MSG_COMPLEX;(Erweitert - Wavelet)\nKomplexität +HISTORY_MSG_COMPLEXRETI;(Erweitert - Retinex)\nKomplexität +HISTORY_MSG_DEHAZE_DEPTH;(Details - Bildschleier entfernen)\nTiefe +HISTORY_MSG_DEHAZE_ENABLED;(Details - Bildschleier entfernen) +HISTORY_MSG_DEHAZE_SATURATION;(Details - Bildschleier entfernen)\nSättigung +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;(Details - Bildschleier entfernen)\nMaske anzeigen +HISTORY_MSG_DEHAZE_STRENGTH;(Details - Bildschleier entfernen)\nIntensität HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(Sensor—Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle -HISTORY_MSG_DUALDEMOSAIC_CONTRAST;(Sensor-Matrix)\nFarbinterpolation\nKontrastschwelle -HISTORY_MSG_FILMNEGATIVE_ENABLED;(Filmnegativ) -HISTORY_MSG_FILMNEGATIVE_VALUES;(Filmnegativ) - Werte +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;(RAW - Sensor-Matrix)\nFarbinterpolation\nKontrastschwelle +HISTORY_MSG_EDGEFFECT;(Erweitert - Wavelet)\nKantenschärfung\nDämpfungsreaktion +HISTORY_MSG_FILMNEGATIVE_BALANCE;(Farbe - Negativfilm)\nAusgabestärke +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;(Farbe - Negativfilm)\nFarbraum +HISTORY_MSG_FILMNEGATIVE_ENABLED;(Farbe - Negativfilm) +HISTORY_MSG_FILMNEGATIVE_REF_SPOT;(Farbe - Negativfilm)\nReferenz Eingabe +HISTORY_MSG_FILMNEGATIVE_VALUES;(Farbe - Negativfilm)\nWerte 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_HLBL;Farbübertragung - Unschärfe +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy-Diagramm +HISTORY_MSG_ICM_AINTENT;Absicht Abstraktes Profil +HISTORY_MSG_ICM_BLUX;(Farbe - Farbmanagement)\nAbstraktes Profil\nVorgabe Blau X +HISTORY_MSG_ICM_BLUY;(Farbe - Farbmanagement)\nAbstraktes Profil\nVorgabe Blau Y +HISTORY_MSG_ICM_FBW;(Farbe - Farbmanagement)\nAbstraktes Profil\nSchwarz-Weiß +HISTORY_MSG_ICM_GREX;(Farbe - Farbmanagement)\nAbstraktes Profil\nVorgabe Grün X +HISTORY_MSG_ICM_GREY;(Farbe - Farbmanagement)\nAbstraktes Profil\nVorgabe Grün Y +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;(Farbe - Farbmanagement)\nAbstraktes Profil\nAusgabeprofil Vorgaben +HISTORY_MSG_ICM_OUTPUT_TEMP;(Farbe - Farbmanagement)\nAusgabeprofil\nIccV4-Illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;(Farbe - Farbmanagement)\nAusgabeprofil\nTyp +HISTORY_MSG_ICM_PRESER;(Farbe - Farbmanagement)\nAbstraktes Profil\nPastelltöne erhalten +HISTORY_MSG_ICM_REDX;(Farbe - Farbmanagement)\nAbstraktes Profil\nVorgabe Rot X +HISTORY_MSG_ICM_REDY;(Farbe - Farbmanagement)\nAbstraktes Profil\nVorgabe Rot Y +HISTORY_MSG_ICM_WORKING_GAMMA;(Farbe - Farbmanagement)\nAbstraktes Profil\nGamma Farbtonkennlinie +HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;(Farbe - Farbmanagement)\nAbstraktes Profil\nBelechtungsmethode +HISTORY_MSG_ICM_WORKING_PRIM_METHOD;(Farbe - Farbmanagement)\nAbstraktes Profil\nZielvorwahl +HISTORY_MSG_ICM_WORKING_SLOPE;(Farbe - Farbmanagement)\nAbstraktes Profil\nSteigung Farbtonkennlinie +HISTORY_MSG_ICM_WORKING_TRC_METHOD;(Farbe - Farbmanagement)\nAbstraktes Profil\nFarbtonkennlinie +HISTORY_MSG_ILLUM;(Farbe - Farbmanagement)\nSzene\nBeleuchtung +HISTORY_MSG_LOCALCONTRAST_AMOUNT;(Details - Lokaler Kontrast)\nIntensität +HISTORY_MSG_LOCALCONTRAST_DARKNESS;(Details - Lokaler Kontrast)\nDunkle Bereiche +HISTORY_MSG_LOCALCONTRAST_ENABLED;(Details - Lokaler Kontrast) +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;(Details - Lokaler Kontrast)\nHelle Bereiche +HISTORY_MSG_LOCALCONTRAST_RADIUS;(Details - Lokaler Kontrast)\nRadius HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus -HISTORY_MSG_MICROCONTRAST_CONTRAST;(Mikrokontrast)\nKontrastschwelle -HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;(Eingangsschärfung)\nAuto-Schwelle -HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;(Eingangsschärfung)\nAuto-Radius -HISTORY_MSG_PDSHARPEN_CONTRAST;(Eingangsschärfung)\nKontrastschwelle -HISTORY_MSG_PDSHARPEN_GAMMA;(Eingangsschärfung)\nGamma -HISTORY_MSG_PDSHARPEN_ITERATIONS;(Eingangsschärfung)\nIterationen -HISTORY_MSG_PDSHARPEN_RADIUS;(Eingangsschärfung)\nRadius -HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;(Eingangsschärfung)\nRandschärfe erhöhen -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_SHARPENING_GAMMA;(Schärfung) - Gamma -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_MSG_MICROCONTRAST_CONTRAST;(Details - Mikrokontrast)\nKontrastschwelle +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;(RAW - Eingangsschärfung)\nAuto-Schwelle +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;(RAW - Eingangsschärfung)\nAuto-Radius +HISTORY_MSG_PDSHARPEN_CHECKITER;(RAW - Eingangsschärfung)\nIterationen automatisch limitieren +HISTORY_MSG_PDSHARPEN_CONTRAST;(RAW - Eingangsschärfung)\nKontrastschwelle +HISTORY_MSG_PDSHARPEN_ITERATIONS;(RAW - Eingangsschärfung)\nIterationen +HISTORY_MSG_PDSHARPEN_RADIUS;(RAW - Eingangsschärfung)\nRadius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;(RAW - Eingangsschärfung)\nRandschärfe erhöhen +HISTORY_MSG_PERSP_CAM_ANGLE;(Transformieren - Perspektive)\nKamerawinkel +HISTORY_MSG_PERSP_CAM_FL;(Transformieren - Perspektive)\nKamera +HISTORY_MSG_PERSP_CAM_SHIFT;(Transformieren - Perspektive)\nKamera +HISTORY_MSG_PERSP_CTRL_LINE;(Transformieren - Perspektive)\nKontrolllinien +HISTORY_MSG_PERSP_METHOD;(Transformieren - Perspektive)\nMethode +HISTORY_MSG_PERSP_PROJ_ANGLE;(Transformieren - Perspektive)\nWiederherstellen +HISTORY_MSG_PERSP_PROJ_ROTATE;(Transformieren - Perspektive)\nPCA-Rotation +HISTORY_MSG_PERSP_PROJ_SHIFT;(Transformieren - Perspektive)\nPCA +HISTORY_MSG_PIXELSHIFT_AVERAGE;(RAW - Sensor-MatrixPixelShift)\nFarbinterpolation - PS\nBewegungsdurchschnitt +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;(RAW - Sensor-Matrix)\nFarbinterpolation - PS\nBewegungsmethode +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;(RAW - Sensor-Matrix)\nVorverarbeitung\nRichtung +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;(RAW - Sensor-Matrix)\nVorverarbeitung\nPDAF-Zeilenfilter +HISTORY_MSG_PREPROCWB_MODE;(RAW - Vorverarbeitung WB)\nModus +HISTORY_MSG_PROTAB;(Erweitert - Wavelet)\nTönung\nSchutz +HISTORY_MSG_PRSHARPEN_CONTRAST;(Transformieren - Skalieren)\nSchärfen\nKontrastschwelle +HISTORY_MSG_RANGEAB;(Erweitert - Wavelet)\nTönung\nBereich ab +HISTORY_MSG_RAWCACORR_AUTOIT;(RAW - Sensor-Matrix)\nChromatische Aberration\nIterationen +HISTORY_MSG_RAWCACORR_COLORSHIFT;(RAW - Sensor-Matrix)\nChromatische Aberration\nFarbverschiebungen vermeiden +HISTORY_MSG_RAW_BORDER;(RAW - Sensor-Matrix)\nFarbinterpolation\nBildrand +HISTORY_MSG_RESIZE_ALLOWUPSCALING;(Transformieren - Skalieren)\nHochskalieren zulassen +HISTORY_MSG_RESIZE_LONGEDGE;(Transformieren - Skalieren)\nLange Kante +HISTORY_MSG_RESIZE_SHORTEDGE;(Transformieren - Skalieren)\nKurze Kante +HISTORY_MSG_SHARPENING_BLUR;(Details - Schärfung)\nWeichzeichnerradius +HISTORY_MSG_SHARPENING_CONTRAST;(Details - Schärfung)\nKontrastschwelle +HISTORY_MSG_SH_COLORSPACE;(Belichtung - Schatten/Lichter)\nFarbraum +HISTORY_MSG_SIGMACOL;(Erweitert - Wavelet)\nFarbe\nDämpfungsreaktion +HISTORY_MSG_SIGMADIR;(Erweitert - Wavelet)\nEndretusche - direktionaler Kontrast\nDämpfungsreaktion +HISTORY_MSG_SIGMAFIN;(Erweitert - Wavelet)\nEndretusche - finaler Lokaler Kontrast\nDämpfungsreaktion +HISTORY_MSG_SIGMATON;(Erweitert - Wavelet)\nTönung\nDämpfungsreaktion +HISTORY_MSG_SOFTLIGHT_ENABLED;(Farbe - Weiches Licht) +HISTORY_MSG_SOFTLIGHT_STRENGTH;(Farbe - Weiches Licht)\nIntensität +HISTORY_MSG_SPOT;(Details - Flecken entfernen) +HISTORY_MSG_SPOT_ENTRY;(Details -Flecken entfernen)\nPunkt modifiziert +HISTORY_MSG_TEMPOUT;CAM02 Temperatur Automatik +HISTORY_MSG_THRESWAV;(Balance) Schwellenwert +HISTORY_MSG_TM_FATTAL_ANCHOR;(Belichtung - Dynamikkompression)\nHelligkeitsverschiebung +HISTORY_MSG_TRANS_METHOD;(Transformieren - Objektivkorrektur)\nMethode +HISTORY_MSG_WAVBALCHROM;(Erweitert - Wavelet)\nRauschreduzierung\nFarb-Equalizer +HISTORY_MSG_WAVBALLUM;(Erweitert - Wavelet)\nRauschreduzierung\nEqualizer Luminanz +HISTORY_MSG_WAVBL;(Erweitert - Wavelet)\nUnschärfeebenen +HISTORY_MSG_WAVCHR;(Erweitert - Wavelet)\nUnschärfeebenen\nChroma-Unschärfe +HISTORY_MSG_WAVCHROMCO;(Erweitert - Wavelet)\nRauschreduzierung\nChrominanz grob +HISTORY_MSG_WAVCHROMFI;(Erweitert - Wavelet)\nRauschreduzierung\nChrominanz fein +HISTORY_MSG_WAVCLARI;(Erweitert - Wavelet)\nSchärfemaske und Klarheit +HISTORY_MSG_WAVDENLH;(Erweitert - Wavelet)\nRauschreduzierung\nEbenen 5-6 +HISTORY_MSG_WAVDENOISE;(Erweitert - Wavelet)\nRauschreduzierung\nKurve Lokaler Kontrast +HISTORY_MSG_WAVDENOISEH;(Erweitert - Wavelet)\nLokaler Kontrast der oberen Ebenen +HISTORY_MSG_WAVDETEND;(Erweitert - Wavelet)\nEndretusche - finales Glätten\nDetails +HISTORY_MSG_WAVEDGS;(Erweitert - Wavelet)\nRestbild - Kompression\nKantenschutz +HISTORY_MSG_WAVGUIDH;(Erweitert - Wavelet)\nEndretusche - finales Glätten\nEqualizer Farbton +HISTORY_MSG_WAVHUE;(Erweitert - Wavelet)\nEqualizer Farbton +HISTORY_MSG_WAVLABGRID_VALUE;(Erweitert - Wavelet)\nTönung\nausgeschlossene Farben +HISTORY_MSG_WAVLEVDEN;(Erweitert - Wavelet)\nKontrast\nSchwellenwert hoher Kontrast +HISTORY_MSG_WAVLEVELSIGM;(Erweitert - Wavelet)\nRauschreduzierung\nRadius +HISTORY_MSG_WAVLEVSIGM;(Erweitert - Wavelet)\nRauschreduzierung\nRadius +HISTORY_MSG_WAVLIMDEN;(Erweitert - Wavelet)\nRauschreduzierung\nInteraktion der Ebenen 5-6 mit 1-4 +HISTORY_MSG_WAVLOWTHR;(Erweitert - Wavelet)\nKontrast\nSchwellenwert niedriger Kontrast +HISTORY_MSG_WAVMERGEC;(Erweitert - Wavelet)\nSchärfemaske und Klarheit\nChroma zusammenführen +HISTORY_MSG_WAVMERGEL;(Erweitert - Wavelet)\nSchärfemaske und Klarheit\nLuma zusammenführen +HISTORY_MSG_WAVMIXMET;(Erweitert - Wavelet)\nRauschreduzierung\nReferenz +HISTORY_MSG_WAVOFFSET;(Erweitert - Wavelet)\nKontrast\nVersatz +HISTORY_MSG_WAVOLDSH;(Erweitert - Wavelet)\nAlter Algorithmus +HISTORY_MSG_WAVQUAMET;(Erweitert - Wavelet)\nRauschreduzierung\nModus +HISTORY_MSG_WAVRADIUS;(Erweitert - Wavelet)\nRestbild - Schatten/Lichter\nRadius +HISTORY_MSG_WAVSCALE;(Erweitert - Wavelet)\nRestbild - Kompression\nSkalieren +HISTORY_MSG_WAVSHOWMASK;(Erweitert - Wavelet)\nSchärfemaske und Klarheit\nWaveletmaske anzeigen +HISTORY_MSG_WAVSIGM;(Erweitert - Wavelet)\nKontrast\nSigma +HISTORY_MSG_WAVSIGMA;(Erweitert - Wavelet)\nKontrast\nDämpfungsreaktion +HISTORY_MSG_WAVSLIMET;(Erweitert - Wavelet)\nRauschreduzierung\nMethode +HISTORY_MSG_WAVSOFTRAD;(Erweitert - Wavelet)\nSchärfemaske und Klarheit\nRadius +HISTORY_MSG_WAVSOFTRADEND;(Erweitert - Wavelet)\nEndretusche - finales Glätten\nRadius +HISTORY_MSG_WAVSTREND;(Erweitert - Wavelet)\nEndretusche - finales Glätten\nIntensität +HISTORY_MSG_WAVTHRDEN;(Erweitert - Wavelet)\nRauschreduzierung\nSchwellenwert +HISTORY_MSG_WAVTHREND;(Erweitert - Wavelet)\nEndretusche - finales Glätten\nSchwellenwert Lokaler Kontrast +HISTORY_MSG_WAVUSHAMET;(Erweitert - Wavelet)\nSchärfemaske und Klarheit\nMethode HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss @@ -882,16 +1615,17 @@ ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Füge Gamma- und Steigungswerte der Beschrei ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Wenn leer, wird die Standardbeschreibung verwendet. ICCPROFCREATOR_GAMMA;Gamma ICCPROFCREATOR_ICCVERSION;ICC-Version: -ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ILL;Beleuchtung: ICCPROFCREATOR_ILL_41;D41 ICCPROFCREATOR_ILL_50;D50 ICCPROFCREATOR_ILL_55;D55 ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater 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_ILL_TOOLTIP;Illuminant kann nur bei ICC-v4-Profilen verwendet werden. ICCPROFCREATOR_PRIMARIES;Vorlage: ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -901,6 +1635,7 @@ ICCPROFCREATOR_PRIM_BETA;BetaRGB ICCPROFCREATOR_PRIM_BLUX;Blau X ICCPROFCREATOR_PRIM_BLUY;Blau Y ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 ICCPROFCREATOR_PRIM_GREX;Grün X ICCPROFCREATOR_PRIM_GREY;Grün Y ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -908,60 +1643,60 @@ 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_TOOLTIP;Benutzerdefinierte Vorlagen können nur bei 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: +INSPECTOR_WINDOW_TITLE;Inspektor IPTCPANEL_CATEGORY;Kategorie -IPTCPANEL_CATEGORYHINT;Beschreibt das Thema des Bildes nach\nMeinung des Anbieters. +IPTCPANEL_CATEGORYHINT;Beschreibt das Thema des Bildes nach Meinung des Anbieters. IPTCPANEL_CITY;Stadt -IPTCPANEL_CITYHINT;Tragen Sie den Namen der Stadt ein, in dem\ndieses Bild aufgenommen wurde. +IPTCPANEL_CITYHINT;Tragen Sie den Namen der Stadt ein, in dem dieses Bild aufgenommen wurde. IPTCPANEL_COPYHINT;IPTC-Werte in die Zwischenablage kopieren. IPTCPANEL_COPYRIGHT;Urheberrechtsvermerk -IPTCPANEL_COPYRIGHTHINT;Enthält jeglichen notwendigen Urheberrechtsvermerk wie\nz.B. © Copyright 2014 Erika Mustermann, all rights reserved. +IPTCPANEL_COPYRIGHTHINT;Enthält jeglichen notwendigen Urheberrechtsvermerk wie z.B. © Copyright 2014 Erika Mustermann, alle Rechte vorbehalten. IPTCPANEL_COUNTRY;Land -IPTCPANEL_COUNTRYHINT;Tragen Sie den Namen des Landes ein, in dem\ndieses Bild aufgenommen wurde. +IPTCPANEL_COUNTRYHINT;Tragen Sie den Namen des Landes ein, in dem dieses Bild aufgenommen wurde. IPTCPANEL_CREATOR;Ersteller -IPTCPANEL_CREATORHINT;Tragen Sie den Namen der Person ein,\ndie dieses Bild erstellt hat. +IPTCPANEL_CREATORHINT;Tragen Sie den Namen der Person ein, die dieses Bild erstellt hat. IPTCPANEL_CREATORJOBTITLE;Berufsbezeichnung des Erstellers -IPTCPANEL_CREATORJOBTITLEHINT;Geben Sie die Berufsbezeichnung der Person ein,\ndie im Feld Ersteller aufgeführt ist. +IPTCPANEL_CREATORJOBTITLEHINT;Geben Sie die Berufsbezeichnung der Person ein, die im Feld Ersteller aufgeführt ist. IPTCPANEL_CREDIT;Danksagung -IPTCPANEL_CREDITHINT;Geben Sie ein, wer aufgeführt werden muss,\nwenn das Bild veröffentlicht wird. +IPTCPANEL_CREDITHINT;Geben Sie ein, wer aufgeführt werden muss, wenn das Bild veröffentlicht wird. IPTCPANEL_DATECREATED;Erstellungsdatum -IPTCPANEL_DATECREATEDHINT;Geben Sie das Erstellungdatum des Bildes ein. +IPTCPANEL_DATECREATEDHINT;Geben Sie das Erstellungsdatum des Bildes ein. IPTCPANEL_DESCRIPTION;Beschreibung -IPTCPANEL_DESCRIPTIONHINT;Beschreiben Sie kurz "Wer", "Was" und "Warum",\nwas passiert in dem Bild und welche Rolle\nspielen die dargestellten Personen. +IPTCPANEL_DESCRIPTIONHINT;Beschreiben Sie kurz 'Wer', 'Was' und 'Warum', was passiert in dem Bild und welche Rolle spielen die dargestellten Personen. IPTCPANEL_DESCRIPTIONWRITER;Verfasser der Beschreibung -IPTCPANEL_DESCRIPTIONWRITERHINT;Tragen Sie den Namen der Person ein, die beim\nSchreiben, Ändern oder Korrigieren der Bildbe-\nschreibung involviert war. +IPTCPANEL_DESCRIPTIONWRITERHINT;Tragen Sie den Namen der Person ein, die beim Schreiben, Ändern oder Korrigieren der Bildbeschreibung involviert war. IPTCPANEL_EMBEDDED;Eingebettet IPTCPANEL_EMBEDDEDHINT;Setzt auf die im Bild eingebetteten IPTC-Daten zurück. IPTCPANEL_HEADLINE;Überschrift -IPTCPANEL_HEADLINEHINT;Tragen Sie eine kurze veröffentlichbare\nSynopsis, oder eine Zusammenfassung\ndes Bildinhalts ein. +IPTCPANEL_HEADLINEHINT;Tragen Sie eine kurze veröffentlichbare Synopsis, oder eine Zusammenfassung des Bildinhalts ein. IPTCPANEL_INSTRUCTIONS;Anweisungen -IPTCPANEL_INSTRUCTIONSHINT;Geben Sie weitere redaktionelle Anweisungen bezüglich\ndes Gebrauchs des Bildes ein, wie z. B. Sperrfristen,\nNutzungsbeschränkungen oder Warnungen, die nicht\nschon im Urheberrechtsvermerk aufgeführt sind. +IPTCPANEL_INSTRUCTIONSHINT;Geben Sie weitere redaktionelle Anweisungen bezüglich des Gebrauchs des Bildes ein, wie z.B. Sperrfristen, Nutzungsbeschränkungen oder Warnungen, die nicht schon im Urheberrechtsvermerk aufgeführt sind. IPTCPANEL_KEYWORDS;Stichwörter -IPTCPANEL_KEYWORDSHINT;Geben Sie beliebig viele Schlüsselwörter\nvon Ausdrücken oder Phrasen ein, um das\nThema des Bildes zu beschreiben. +IPTCPANEL_KEYWORDSHINT;Geben Sie beliebig viele Schlüsselwörter von Ausdrücken oder Phrasen ein, um das Thema des Bildes zu beschreiben. IPTCPANEL_PASTEHINT;IPTC-Werte aus der Zwischenablage einfügen -IPTCPANEL_PROVINCE;Bundesland / Kanton -IPTCPANEL_PROVINCEHINT;Tragen Sie den Namen des Bundeslandes / Kanton\nein, in dem dieses Bild aufgenommen wurde. +IPTCPANEL_PROVINCE;Bundesland/Kanton +IPTCPANEL_PROVINCEHINT;Tragen Sie den Namen des Bundeslandes/Kanton ein, in dem dieses Bild aufgenommen wurde. IPTCPANEL_RESET;Zurücksetzen IPTCPANEL_RESETHINT;Auf die im Profil gespeicherten Werte zurücksetzen IPTCPANEL_SOURCE;Quelle -IPTCPANEL_SOURCEHINT;Tragen Sie den Namen einer Person oder einer\nFirma ein, von der Sie das Bild erhalten haben\nund die eine wesentliche Rolle in der Lieferkette\nspielt. +IPTCPANEL_SOURCEHINT;Tragen Sie den Namen einer Person oder einer Firma ein, von der Sie das Bild erhalten haben und die eine wesentliche Rolle in der Lieferkette spielt. IPTCPANEL_SUPPCATEGORIES;Weitere Kategorien -IPTCPANEL_SUPPCATEGORIESHINT;Weitere Kategorien um das Thema\ndes Bildes genauer zu spezifizieren. +IPTCPANEL_SUPPCATEGORIESHINT;Weitere Kategorien um das Thema des Bildes genauer zu spezifizieren. IPTCPANEL_TITLE;Titel -IPTCPANEL_TITLEHINT;Geben Sie einen kurzen lesbaren Namen\nfür das Bild ein, z.B. den Dateinamen. +IPTCPANEL_TITLEHINT;Geben Sie einen kurzen lesbaren Namen fü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_LENS_WARNING;Warnung: Der Cropfaktor des Profils entspricht nicht dem des Objektivs.\nDies kann zu einem fehlerhaften Ergebnis führen. +IPTCPANEL_TRANSREFERENCEHINT;Geben Sie eine Kennung zur Kontrolle oder Verfolgung des Arbeitsablaufes ein. 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_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 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 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 @@ -993,23 +1728,25 @@ MAIN_MSG_PATHDOESNTEXIST;Der Pfad\n\n%1\n\nexistiert nicht. Bitte setzen 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_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 + a MAIN_TAB_COLOR;Farbe MAIN_TAB_COLOR_TOOLTIP;Taste: Alt + c MAIN_TAB_DETAIL;Details MAIN_TAB_DETAIL_TOOLTIP;Taste: Alt + d -MAIN_TAB_DEVELOP; Batchbearbeitung +MAIN_TAB_DEVELOP;Batchbearbeitung MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Schnell-Export +MAIN_TAB_EXPORT;Schnell-Export 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_FILTER;Filter +MAIN_TAB_INSPECT;Inspektor MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Lokal +MAIN_TAB_LOCALLAB_TOOLTIP;Taste: Alt-o MAIN_TAB_METADATA;Metadaten MAIN_TAB_METADATA_TOOLTIP;Taste: Alt + m MAIN_TAB_RAW;RAW @@ -1020,7 +1757,7 @@ MAIN_TOOLTIP_BACKCOLOR0;Hintergrundfarbe der Vorschau basierend auf dem Oberf 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_BEFOREAFTERLOCK;Vorher-Ansicht: Sperren / Entsperren\n\nGesperrt: Friert die Vorher-Ansicht ein,\nsodass 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: < @@ -1034,7 +1771,7 @@ 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_THRESHOLD;Schwellenwert MAIN_TOOLTIP_TOGGLE;Vorher/Nachher-Ansicht ein-/ausschalten.\nTaste: Umschalt + b MONITOR_PROFILE_SYSTEM;Systemvorgabe NAVIGATOR_B;B: @@ -1049,7 +1786,7 @@ NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Breite = %1, Höhe = %2 NAVIGATOR_XY_NA;x: --, y: -- -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_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 @@ -1057,8 +1794,8 @@ PARTIALPASTE_BASICGROUP;Basisparameter PARTIALPASTE_CACORRECTION;Farbsaum entfernen PARTIALPASTE_CHANNELMIXER;RGB-Kanalmixer PARTIALPASTE_CHANNELMIXERBW;Schwarz/Weiß -PARTIALPASTE_COARSETRANS;Drehen / Spiegeln -PARTIALPASTE_COLORAPP;CIE Color Appearance Model 2002 +PARTIALPASTE_COARSETRANS;Drehen/Spiegeln +PARTIALPASTE_COLORAPP;Farberscheinung und Beleuchtung PARTIALPASTE_COLORGROUP;Farbparameter PARTIALPASTE_COLORTONING;Farbanpassungen PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-Füllen @@ -1075,10 +1812,10 @@ PARTIALPASTE_DIRPYREQUALIZER;Detailebenenkontrast PARTIALPASTE_DISTORTION;Verzeichnungskorrektur PARTIALPASTE_EPD;Tonwertkorrektur PARTIALPASTE_EQUALIZER;Wavelet -PARTIALPASTE_EVERYTHING;Alle Parameter aktivieren / deaktivieren +PARTIALPASTE_EVERYTHING;Alle Parameter aktivieren/deaktivieren PARTIALPASTE_EXIFCHANGES;Änderungen an Exif-Daten PARTIALPASTE_EXPOSURE;Belichtung -PARTIALPASTE_FILMNEGATIVE;Filmnegativ +PARTIALPASTE_FILMNEGATIVE;Negativfilm PARTIALPASTE_FILMSIMULATION;Filmsimulation PARTIALPASTE_FLATFIELDAUTOSELECT;Weißbild: Automatische Auswahl PARTIALPASTE_FLATFIELDBLURRADIUS;Weißbild: Unschärferadius @@ -1086,7 +1823,7 @@ PARTIALPASTE_FLATFIELDBLURTYPE;Weißbild: Unschärfetyp PARTIALPASTE_FLATFIELDCLIPCONTROL;Weißbild: Kontrolle zu heller Bereiche PARTIALPASTE_FLATFIELDFILE;Weißbild: Datei PARTIALPASTE_GRADIENT;Grauverlaufsfilter -PARTIALPASTE_HSVEQUALIZER;Farbton (H) / Sättigung (S) / Dynamik (V) +PARTIALPASTE_HSVEQUALIZER;Farbton (H)/Sättigung (S)/Dynamik (V) PARTIALPASTE_ICMSETTINGS;ICM-Einstellungen PARTIALPASTE_IMPULSEDENOISE;Impulsrauschreduzierung PARTIALPASTE_IPTCINFO;IPTC-Informationen @@ -1094,6 +1831,8 @@ PARTIALPASTE_LABCURVE;L*a*b* - Einstellungen PARTIALPASTE_LENSGROUP;Objektivkorrekturen PARTIALPASTE_LENSPROFILE;Objektivkorrekturprofil PARTIALPASTE_LOCALCONTRAST;Lokaler Kontrast +PARTIALPASTE_LOCALLAB;Lokale Anpassungen +PARTIALPASTE_LOCALLABGROUP;Lokale Anpassungen PARTIALPASTE_METADATA;Kopiermodus PARTIALPASTE_METAGROUP;Metadaten PARTIALPASTE_PCVIGNETTE;Vignettierungsfilter @@ -1103,10 +1842,11 @@ 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_PREPROCWB;Vorverarbeitung Weißabgleich 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_RAWCACORR_CAREDBLUE;Chromatische Aberration: Rot/Blau PARTIALPASTE_RAWEXPOS_BLACK;Weißpunkt: Schwarzpegel PARTIALPASTE_RAWEXPOS_LINEAR;Weißpunkt: Korrekturfaktor PARTIALPASTE_RAWGROUP;RAW @@ -1127,6 +1867,7 @@ PARTIALPASTE_SHARPENEDGE;Kantenschärfung PARTIALPASTE_SHARPENING;Schärfung PARTIALPASTE_SHARPENMICRO;Mikrokontrast PARTIALPASTE_SOFTLIGHT;Weiches Licht +PARTIALPASTE_SPOT;Flecken entfernen PARTIALPASTE_TM_FATTAL;Dynamikkompression PARTIALPASTE_VIBRANCE;Dynamik PARTIALPASTE_VIGNETTING;Vignettierungskorrektur @@ -1162,11 +1903,17 @@ PREFERENCES_CHUNKSIZE_RAW_CA;RAW-CA-Korrektur PREFERENCES_CHUNKSIZE_RAW_RCD;RCD-Farbinterpolation PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans-Farbinterpolation PREFERENCES_CHUNKSIZE_RGB;RGB-Verarbeitung +PREFERENCES_CIE;CIECAM +PREFERENCES_CIEARTIF;Artefakte vermeiden 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_COMPLEXITYLOC;Vorgabe Komplexität für Lokale Anpassungen +PREFERENCES_COMPLEXITY_EXP;Erweitert +PREFERENCES_COMPLEXITY_NORM;Standard +PREFERENCES_COMPLEXITY_SIMP;Basis PREFERENCES_CROP;Einstellung des Ausschnittswerkzeuges PREFERENCES_CROP_AUTO_FIT;Automatischer Zoom des Ausschnitts PREFERENCES_CROP_GUIDES;Hilfslinien anzeigen wenn Ausschnitt nicht verändert wird @@ -1198,6 +1945,12 @@ PREFERENCES_DIRSELECTDLG;Wähle das Bild-Verzeichnis beim Programmstart... PREFERENCES_DIRSOFTWARE;Installationsverzeichnis PREFERENCES_EDITORCMDLINE;Benutzerdefinierte Befehlszeile PREFERENCES_EDITORLAYOUT;Editor-Layout +PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass Ausgabeprofil +PREFERENCES_EXTEDITOR_DIR;Ausgabeverzeichnis +PREFERENCES_EXTEDITOR_DIR_CURRENT;Derselbe Ordner wie Bild +PREFERENCES_EXTEDITOR_DIR_CUSTOM;Benutzerdefiniert +PREFERENCES_EXTEDITOR_DIR_TEMP;Temp-Ordner Betriebssystem +PREFERENCES_EXTEDITOR_FLOAT32;Ausgabe in 32-bit (float) TIFF PREFERENCES_EXTERNALEDITOR;Externer Editor PREFERENCES_FBROWSEROPTS;Bildinformationen und Miniaturbilder PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Einzeilige Toolbar @@ -1215,9 +1968,10 @@ PREFERENCES_HISTOGRAM_TOOLTIP;Wenn aktiviert, wird das Arbeitsprofil für die Da PREFERENCES_HLTHRESHOLD;Lichter - Schwelle PREFERENCES_ICCDIR;ICC-Profile-Verzeichnis PREFERENCES_IMPROCPARAMS;Standard-Bearbeitungsprofile +PREFERENCES_INSPECTORWINDOW;Inspektor in eigenem Fullscreen-Fenster öffnen 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. +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. PREFERENCES_INTENT_ABSOLUTE;Absolut farbmetrisch PREFERENCES_INTENT_PERCEPTUAL;Wahrnehmungsabhängig PREFERENCES_INTENT_RELATIVE;Relativ farbmetrisch @@ -1226,13 +1980,13 @@ PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Zeige das eingebettete JPEG als Miniaturbil PREFERENCES_LANG;Sprache PREFERENCES_LANGAUTODETECT;Systemsprache verwenden PREFERENCES_MAXRECENTFOLDERS;Maximale Anzahl der letzten Dateien -PREFERENCES_MENUGROUPEXTPROGS;Untermenü "Öffnen mit" +PREFERENCES_MENUGROUPEXTPROGS;Untermenü 'Öffnen mit' PREFERENCES_MENUGROUPFILEOPERATIONS;Untermenü Dateioperationen PREFERENCES_MENUGROUPLABEL;Untermenü Farbmarkierung PREFERENCES_MENUGROUPPROFILEOPERATIONS;Untermenü Profiloperationen PREFERENCES_MENUGROUPRANK;Untermenü Bewertung PREFERENCES_MENUOPTIONS;Menüoptionen -PREFERENCES_MONINTENT;Standard-Rendering-Intent +PREFERENCES_MONINTENT;Standard Monitor-Wiedergabe PREFERENCES_MONITOR;Monitor PREFERENCES_MONPROFILE;Standardfarbprofil PREFERENCES_MONPROFILE_WARNOSX;Aufgrund einer macOS-Limitierung wird nur sRGB unterstützt. @@ -1268,11 +2022,11 @@ PREFERENCES_PROFILESAVEINPUT;Bearbeitungsprofile zusammen mit dem Bild speichern PREFERENCES_PROFILESAVELOCATION;Speicherort der Profile PREFERENCES_PROFILE_NONE;Kein Farbprofil PREFERENCES_PROPERTY;Eigenschaft -PREFERENCES_PRTINTENT;Rendering-Intent +PREFERENCES_PRTINTENT;Wiedergabe 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_REMEMBERZOOMPAN_TOOLTIP;Öffnen eines neuen Bildes mit den Zoom- und Positionswerten des vorangegangenen Bildes.\n\nFunktioniert nur unter folgenden Bedingungen:\nEin-Reitermodus aktiv\n'Demosaikmethode für 100%-Ansicht' muss auf 'Wie im Bildverarbeitungsprofil vorgegeben' eingestellt sein. PREFERENCES_SAVE_TP_OPEN_NOW;Werkzeugstatus jetzt speichern PREFERENCES_SELECTLANG;Sprache PREFERENCES_SERIALIZE_TIFF_READ;TIFF-Bilder @@ -1283,10 +2037,11 @@ PREFERENCES_SHOWBASICEXIF;Exif-Daten anzeigen PREFERENCES_SHOWDATETIME;Datum und Uhrzeit anzeigen PREFERENCES_SHOWEXPOSURECOMPENSATION;Belichtungskorrektur anfügen PREFERENCES_SHOWFILMSTRIPTOOLBAR;Toolbar oberhalb des Filmstreifens anzeigen +PREFERENCES_SHOWTOOLTIP;Anzeigen der Tooltips für Lokale Anpassungen PREFERENCES_SHTHRESHOLD;Schatten - Schwelle PREFERENCES_SINGLETAB;Ein-Reitermodus PREFERENCES_SINGLETABVERTAB;Ein-Reitermodus (vertikale Reiter) -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_HELP;Geben Sie einen Pfad zu einer Sound-Datei ein, oder geben Sie nichts ein für keinen Sound. Für Systemklänge: \nWindows: SystemDefault, SystemAsterisk ...\nLinux: complete, window-attention … PREFERENCES_SND_LNGEDITPROCDONE;Bearbeitung abgeschlossen PREFERENCES_SND_QUEUEDONE;Warteschlange abgearbeitet PREFERENCES_SND_THRESHOLDSECS;Verzögerung in Sekunden @@ -1306,12 +2061,13 @@ PREFERENCES_TP_LABEL;Werkzeugbereich: PREFERENCES_TP_VSCROLLBAR;Keine vertikale Scrollbar PREFERENCES_USEBUNDLEDPROFILES;Standardprofile verwenden PREFERENCES_WORKFLOW;Layout +PREFERENCES_ZOOMONSCROLL;Bilder zoomen per scrollen PROFILEPANEL_COPYPPASTE;Zu kopierende Parameter PROFILEPANEL_GLOBALPROFILES;Standardprofile PROFILEPANEL_LABEL;Bearbeitungsprofile PROFILEPANEL_LOADDLGLABEL;Bearbeitungsparameter laden... PROFILEPANEL_LOADPPASTE;Zu ladende Parameter -PROFILEPANEL_MODE_TIP;Ist der Button aktiviert, werden Teilprofile\nals vollständige Profile geladen.\nFehlende Parameter werden durch\nStandardwerte aufgefüllt. +PROFILEPANEL_MODE_TOOLTIP;Ist der Button aktiviert, werden Teilprofile\nals vollständige Profile geladen.\nFehlende Parameter werden durch\nStandardwerte aufgefüllt. PROFILEPANEL_MYPROFILES;Meine Profile PROFILEPANEL_PASTEPPASTE;Einzufügende Parameter PROFILEPANEL_PCUSTOM;Benutzerdefiniert @@ -1326,9 +2082,9 @@ PROFILEPANEL_TOOLTIPLOAD;Profil aus Datei laden.\n\nStrg-Taste beim Klicken fest 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_DECODING;Dekodiere... -PROGRESSBAR_GREENEQUIL;Grünbalance... +PROGRESSBAR_GREENEQUIL;Grün-Balance... PROGRESSBAR_HLREC;Lichterrekonstruktion... -PROGRESSBAR_HOTDEADPIXELFILTER;Hot/Dead-Pixel-Filter... +PROGRESSBAR_HOTDEADPIXELFILTER;Hot-/Dead-Pixel-Filter... PROGRESSBAR_LINEDENOISE;Linienrauschfilter... PROGRESSBAR_LOADING;Lade Bild... PROGRESSBAR_LOADINGTHUMBS;Lade Miniaturbilder... @@ -1356,9 +2112,9 @@ QUEUE_DESTFILENAME;Pfad und Dateiname QUEUE_FORMAT_TITLE;Dateiformat QUEUE_LOCATION_FOLDER;In dieses Verzeichnis speichern QUEUE_LOCATION_TEMPLATE;Dynamisches Verzeichnis verwenden -QUEUE_LOCATION_TEMPLATE_TOOLTIP;Die folgenden Variablen können verwendet werden:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nDiese Variablen beinhalten bestimmte Teile des Verzeichnispfades, in welchem sich das Bild befindet, oder Attribute des Bildes.\n\nWenn zum Beispiel /home/tom/photos/2010-10-31/dsc0042.nef geöffnet wurde, dann haben die Variablen den folgenden Inhalt:\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\nWenn Sie die Ausgabedatei in dasselbe Verzeichnis wie das Originalbild speichern wollen, dann wählen Sie:\n%p1/%f\n\nWenn Sie die Ausgabedatei in ein Unterverzeichnis mit dem Namen "converted" schreiben wollen, dann wählen Sie:\n%p1/converted/%f\n\nWenn Sie die Ausgabedatei im Verzeichnispfad "/home/tom/photos/converted" speichern wollen, dort jedoch in einem mit dem Namen des Ursprungsverzeichnisses betitelten Unterverzeichnis, dann wählen Sie:\n%p2/converted/%d1/%f\n\nDie Variable %r enthält die Bewertung des Bildes. +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Die folgenden Variablen können verwendet werden:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nDiese Variablen beinhalten bestimmte Teile des Verzeichnispfades, in welchem sich das Bild befindet, oder Attribute des Bildes.\n\nWenn zum Beispiel /home/tom/photos/2010-10-31/dsc0042.nef geöffnet wurde, dann haben die Variablen den folgenden Inhalt:\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\nWenn Sie die Ausgabedatei in dasselbe Verzeichnis wie das Originalbild speichern wollen, dann wählen Sie:\n%p1/%f\n\nWenn Sie die Ausgabedatei in ein Unterverzeichnis mit dem Namen 'converted' schreiben wollen, dann wählen Sie:\n%p1/converted/%f\n\nWenn Sie die Ausgabedatei im Verzeichnispfad '/home/tom/photos/converted' speichern wollen, dort jedoch in einem mit dem Namen des Ursprungsverzeichnisses betitelten Unterverzeichnis, dann wählen Sie:\n%p2/converted/%d1/%f\n\nDie Variable %r enthält die Bewertung des Bildes. QUEUE_LOCATION_TITLE;Ausgabeverzeichnis -QUEUE_STARTSTOP_TOOLTIP;Startet / Stoppt die Verarbeitung\nder Warteschlange.\n\nTaste: Strg + s +QUEUE_STARTSTOP_TOOLTIP;Startet/Stoppt die Verarbeitung\nder Warteschlange.\n\nTaste: Strg + s SAMPLEFORMAT_0;Unbekanntes Datenformat SAMPLEFORMAT_1;8 Bit ohne Vorzeichen SAMPLEFORMAT_2;16 Bit ohne Vorzeichen @@ -1369,7 +2125,7 @@ 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_FILEFORMAT_FLOAT;Fließkomma SAVEDLG_FORCEFORMATOPTS;Erzwinge Speicheroptionen SAVEDLG_JPEGQUAL;JPEG-Qualität SAVEDLG_PUTTOQUEUE;Zur Warteschlange hinzufügen @@ -1385,8 +2141,14 @@ 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;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_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. +TC_PRIM_BLUX;Bx +TC_PRIM_BLUY;By +TC_PRIM_GREX;Gx +TC_PRIM_GREY;Gy +TC_PRIM_REDX;Rx +TC_PRIM_REDY;Ry THRESHOLDSELECTOR_B;Unten THRESHOLDSELECTOR_BL;Unten-Links THRESHOLDSELECTOR_BR;Unten-Rechts @@ -1397,35 +2159,36 @@ 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- 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_PERSPECTIVE;Perspektivkorrektur\n\nMit dem Editieren der Kontrolllinien können perspektivische Verzerrungen korrigiert werden. Ein erneuter Klick auf diesen Button wendet die Korrektur an. +TOOLBAR_TOOLTIP_STRAIGHTEN;Ausrichten/Drehen\nTaste: s\n\nRichtet das Bild entlang einer Leitlinie aus. 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_AUTOCH;Auto -TP_BWMIX_CC_ENABLED;Komplemantärfarbe anpassen +TP_BWMIX_CC_ENABLED;Komplementärfarbe anpassen. 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 +TP_BWMIX_CURVEEDITOR1;'Bevor'-Kurve +TP_BWMIX_CURVEEDITOR2;'Danach'-Kurve TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Die Tonwertkurve wird NACH der Schwarz/Weiß-\nKonvertierung angewendet. TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Die Tonwertkurve wird VOR der Schwarz/Weiß-\nKonvertierung angewendet. -TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminanz als Funktion des Farbtons L = f(H).\nZu hohe Werte können zu Artefakten führen. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminanz als Funktion des Farbtons L=f(H).\nZu hohe Werte können zu Artefakten führen. TP_BWMIX_FILTER;Farbfilter TP_BWMIX_FILTER_BLUE;Blau -TP_BWMIX_FILTER_BLUEGREEN;Blau-Grün +TP_BWMIX_FILTER_BLUEGREEN;Blau/Grün TP_BWMIX_FILTER_GREEN;Grün -TP_BWMIX_FILTER_GREENYELLOW;Grün-Gelb +TP_BWMIX_FILTER_GREENYELLOW;Grün/Gelb TP_BWMIX_FILTER_NONE;Keiner TP_BWMIX_FILTER_PURPLE;Violett TP_BWMIX_FILTER_RED;Rot -TP_BWMIX_FILTER_REDYELLOW;Rot-Gelb +TP_BWMIX_FILTER_REDYELLOW;Rot/Gelb TP_BWMIX_FILTER_TOOLTIP;Der Farbfilter simuliert Aufnahmen wie mit einem auf dem Objektiv montierten farbigen Filter. Farbfilter reduzieren die Durchlässigkeit für einen speziellen Farbbereich und verändern dementsprechend die Helligkeit.\n\nz.B. verdunkelt ein Rotfilter blauen Himmel. TP_BWMIX_FILTER_YELLOW;Gelb TP_BWMIX_GAMMA;Gammakorrektur TP_BWMIX_GAM_TOOLTIP;Korrigiert Gamma für einzelne RGB-Kanäle. -TP_BWMIX_LABEL;Schwarz / Weiß +TP_BWMIX_LABEL;Schwarz/Weiß TP_BWMIX_MET;Methode TP_BWMIX_MET_CHANMIX;Kanalmixer TP_BWMIX_MET_DESAT;Entsättigung @@ -1460,10 +2223,10 @@ TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;Blau TP_CACORRECTION_LABEL;Farbsaum entfernen TP_CACORRECTION_RED;Rot -TP_CBDL_AFT;Nach Schwarz / Weiß -TP_CBDL_BEF;Vor Schwarz / Weiß +TP_CBDL_AFT;Nach Schwarz/Weiß +TP_CBDL_BEF;Vor Schwarz/Weiß TP_CBDL_METHOD;Prozessreihenfolge -TP_CBDL_METHOD_TOOLTIP;Wählen Sie, ob der Detailebenenkontrast nach\ndem Schwarz/Weiß-Werkzeug abgearbeitet wird\n(ermöglicht das Arbeiten im L*a*b*-Farbraum),\noder vor ihm (ermöglicht das Arbeiten im RGB-\nFarbraum). +TP_CBDL_METHOD_TOOLTIP;Wählen Sie, ob der Detailebenenkontrast nach\ndem Schwarz/Weiß-Werkzeug abgearbeitet wird\n(ermöglicht das Arbeiten im L*a*b*-Farbraum)\noder vor ihm (ermöglicht das Arbeiten im RGB-\nFarbraum). TP_CHMIXER_BLUE;Blau-Kanal TP_CHMIXER_GREEN;Grün-Kanal TP_CHMIXER_LABEL;RGB-Kanalmixer @@ -1472,61 +2235,87 @@ 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_ABSOLUTELUMINANCE;Leuchtdichte +TP_COLORAPP_ADAPSCEN_TOOLTIP;Entspricht der Leuchtdichte in Candela pro m2 zum Zeitpunkt der Aufnahme, automatisch berechnet aus den Exif-Daten. TP_COLORAPP_ALGO;Algorithmus TP_COLORAPP_ALGO_ALL;Alle -TP_COLORAPP_ALGO_JC;Helligkeit + Buntheit (JH) +TP_COLORAPP_ALGO_JC;Helligkeit + Buntheit (JC) 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_BADPIXSL;Hot / Bad-Pixelfilter -TP_COLORAPP_BADPIXSL_TOOLTIP;Unterdrückt “Hot / Bad“-Pixel\n\n0 = keine Auswirkung\n1 = Mittel\n2 = Gaussian +TP_COLORAPP_BADPIXSL;Hot-/Bad-Pixelfilter +TP_COLORAPP_BADPIXSL_TOOLTIP;Unterdrückt Hot-/Dead-Pixel (hell gefärbt).\n0 = Kein Effekt\n1 = Median\n2 = Gaussian\nAlternativ kann das Bild angepasst werden, um sehr dunkle Schatten zu vermeiden.\n\nDiese Artefakte sind auf Einschränkungen von CIECAM02 zurückzuführen. 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 CIECAM berücksichtigt die Weißintensität. Sie 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_CATCLASSIC;Klassisch +TP_COLORAPP_CATMET_TOOLTIP;Klassisch - traditionelle CIECAM-Berechnung. Die Transformationen der chromatischen Adaption werden separat auf 'Szenenbedingungen' und 'Grundlichtart' einerseits und auf 'Grundlichtart' und 'Betrachtungsbedingungen' andererseits angewendet.\n\nSymmetrisch - Die chromatische Anpassung basiert auf dem Weißabgleich. Die Einstellungen 'Szenenbedingungen', 'Bildeinstellungen' und 'Betrachtungsbedingungen' werden neutralisiert.\n\nGemischt - Wie die Option 'Klassisch', aber in diesem Fall basiert die chromatische Anpassung auf dem Weißabgleich. +TP_COLORAPP_CATMOD;Modus +TP_COLORAPP_CATSYMGEN;Automatisch Symmetrisch +TP_COLORAPP_CATSYMSPE;Gemischt +TP_COLORAPP_CHROMA;Buntheit (C) 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 CIECAM unterscheidet sich von 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_CIECAT_DEGREE;CAT02 Adaptation +TP_COLORAPP_CHROMA_S_TOOLTIP;Die Sättigung in CIECAM unterscheidet sich von L*a*b* und RGB-Sättigung. +TP_COLORAPP_CHROMA_TOOLTIP;Die Buntheit in CIECAM unterscheidet sich von L*a*b* und RGB-Buntheit. +TP_COLORAPP_CIECAT_DEGREE;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 CIECAM basiert auf Helligkeit. Er unterscheidet sich vom L*a*b*- und RGB-Kontrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast (J) in CIECAM beruht auf Helligkeit. Er unterscheidet sich vom 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_CURVEEDITOR1_TOOLTIP;Zeigt das Histogramm von L (L*a*b*) vor CIECAM.\nWenn 'CIECAM-Ausgabe-Histogramm in Kurven anzeigen' aktiviert ist, wird das Histogramm von J oder Q nach CIECAM-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 -TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Gleiche Verwendung wie bei der zweiten Belichtungstonwertkurve. +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Gleiche Verwendung wie bei der ersten Belichtungstonwertkurve. 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_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_CURVEEDITOR3_TOOLTIP;Korrigiert Buntheit, Sättigung oder Farbigkeit.\n\nZeigt das Histogramm der Chromatizität (L*a*b* ) VOR den CIECAM-Änderungen an.\nWenn 'CIECAM-Ausgabe-Histogramm in Kurven anzeigen' aktiviert ist, wird das Histogramm von C, S oder M NACH den CIECAM-Ä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;CIECAM-Ausgabe-Histogramm in CAL-Kurven anzeigen +TP_COLORAPP_DATACIE_TOOLTIP;Beeinflusst die Histogramme in FuB. Beeinflusst nicht das Haupt-Histogramm von RawTherapee.\n\nAktiviert: zeigt ungefähre Werte für J und C, S oder M NACH den CIECAM-Anpassungen.\nDeaktiviert: zeigt L*a*b*-Werte VOR den CIECAM-Anpassungen. +TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 ist eine Methode, die die Werte eines Bildes, dessen Weißpunkt der einer gegebenen Lichtart (z.B. D65) entspricht, in Werte umwandelt, deren Weißpunkt einer anderen Lichtart entspricht (z.B. D50 oder D55). +TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 ist eine Methode, die die Werte eines Bildes, dessen Weißpunkt der einer gegebenen Lichtart (z.B. D50) entspricht, in Werte umwandelt, deren Weißpunkt einer anderen Lichtart entspricht (z.B. D75). +TP_COLORAPP_FREE;Farbtemperatur + Tönung + CAT02/16 + [Ausgabe] +TP_COLORAPP_GAMUT;Gamutkontrolle im L*a*b*-Modus anwenden +TP_COLORAPP_GEN;Voreinstellungen +TP_COLORAPP_GEN_TOOLTIP;Dieses Modul basiert auf dem CIECAM-Farberscheinungsmodell, das entwickelt wurde, um die Farbwahrnehmung des menschlichen Auges unter verschiedenen Lichtverhältnissen besser zu simulieren, z.B. vor unterschiedlichen Hintergründen. Es berücksichtigt die Umgebung jeder Farbe und modifiziert ihr Erscheinungsbild, um sie so nah wie möglich an die menschliche Wahrnehmung wiederzugeben. Die Ausgabe wird auch an die beabsichtigten Betrachtungsbedingungen (Monitor, Fernseher, Projektor, Drucker usw.) angepasst, sodass das chromatische Erscheinungsbild über die Szene und die Anzeigeumgebung hinweg erhalten bleibt. TP_COLORAPP_HUE;Farbton (H) TP_COLORAPP_HUE_TOOLTIP;Farbton (H) - Winkel zwischen 0° und 360°. -TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 +TP_COLORAPP_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;Glühlampe Normlichtart A 2856K +TP_COLORAPP_ILFREE;Frei +TP_COLORAPP_ILLUM;Beleuchtung +TP_COLORAPP_ILLUM_TOOLTIP;Wählen Sie die Lichtquelle, die den Aufnahmebedingungen am nächsten kommt.\nIm Allgemeinen kann D50 gewählt werden, das kann sich jedoch je nach Zeit und Breitengrad ändern. +TP_COLORAPP_LABEL;Farberscheinung und Beleuchtung 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_MEANLUMINANCE;Mittlere Luminanz (Yb%) +TP_COLORAPP_LIGHT_TOOLTIP;Helligkeit in CIECAM unterscheidet sich von L*a*b* und RGB Helligkeit. +TP_COLORAPP_MEANLUMINANCE;Mittlere Leuchtdichte (Yb%) +TP_COLORAPP_MOD02;CAM02 +TP_COLORAPP_MOD16;CAM16 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_MODELCAT;CAM +TP_COLORAPP_MODELCAT_TOOLTIP;Ermöglicht die Auswahl zwischen CAM02 oder CAM16.\nCAM02 ist manchmal genauer.\nCAM16 sollte weniger Artefakte erzeugen. +TP_COLORAPP_MODEL_TOOLTIP;Weißabgleich [RT] + [Ausgabe]:\nRTs Weißabgleich wird für die Szene verwendet,\nCIECAM auf D50 gesetzt und der Weißabgleich\ndes Ausgabegerätes kann unter:\nEinstellungen > Farb-Management\neingestellt werden.\n\nWeißabgleich [RT+CAT02/16] + [Ausgabe]:\nRTs 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_NEUTRAL_TOOLTIP;Setzt alle 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_SOURCEF_TOOLTIP;Entspricht den Aufnahmebedingungen und wie man die Bedingungen und Daten wieder in einen normalen Bereich bringt. 'Normal' bedeutet Durchschnitts- oder Standardbedingungen und Daten, d. h. ohne Berücksichtigung von CIECAM-Korrekturen. TP_COLORAPP_SURROUND;Umgebung +TP_COLORAPP_SURROUNDSRC;Umgebung TP_COLORAPP_SURROUND_AVER;Durchschnitt TP_COLORAPP_SURROUND_DARK;Dunkel TP_COLORAPP_SURROUND_DIM;Gedimmt TP_COLORAPP_SURROUND_EXDARK;Extrem Dunkel (Cutsheet) -TP_COLORAPP_SURROUND_TOOLTIP;Verändert Töne und Farben unter Berücksichtigung der\nBetrachtungsbedingungen des Ausgabegerätes.\n\nDurchschnitt:\nDurchschnittliche Lichtumgebung (Standard).\nDas Bild wird nicht angepasst.\n\nGedimmt:\nGedimmte Umgebung (TV). Das Bild wird leicht dunkel.\n\nDunkel:\nDunkle Umgebung (Projektor). Das Bild wird dunkler.\n\nExtrem dunkel:\nExtrem dunkle Umgebung. Das Bild wird sehr dunkel. +TP_COLORAPP_SURROUND_TOOLTIP;Ändert Töne und Farben, um die Betrachtungsbedingungen des Ausgabegeräts zu berücksichtigen. Je dunkler die Betrachtungsbedingungen sind, desto dunkler wird das Bild. Die Bildhelligkeit wird nicht geändert, wenn die Betrachtungsbedingungen auf durchschnittlich eingestellt sind. +TP_COLORAPP_SURSOURCE_TOOLTIP;Ändert Töne und Farben, um die Umgebungsbedingungen der Szenenbeleuchtung zu berücksichtigen. Je dunkler die Umgebungsbedingungen sind, desto heller wird das Bild. Die Bildhelligkeit wird nicht geändert, wenn der Umgebungs-Wert auf Durchschnitt eingestellt ist. TP_COLORAPP_TCMODE_BRIGHTNESS;Helligkeit (Q) TP_COLORAPP_TCMODE_CHROMA;Buntheit (H) TP_COLORAPP_TCMODE_COLORF;Farbigkeit (M) @@ -1535,19 +2324,23 @@ TP_COLORAPP_TCMODE_LABEL2;Tonwertkurve 2 Modus 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;Tonwertkorrektur mittels\nCIECAM02-Helligkeit (Q) +TP_COLORAPP_TEMP2_TOOLTIP;Symmetrischer Modus Temp = Weißabgleich.\nBei Auswahl einer Beleuchtung setze Tönung=1.\n\nA Temp=2856\nD41 Temp=4100\nD50 Temp=5003\nD55 Temp=5503\nD60 Temp=6000\nD65 Temp=6504\nD75 Temp=7504 +TP_COLORAPP_TEMP_TOOLTIP;Um eine Beleuchtungsart auszuwählen, setzen 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;verwende CIECAM für die Tonwertkorrektur 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_VIEWINGF_TOOLTIP;Berücksichtigt, auf welchem Gerät das endgültige Bild angezeigt wird (Monitor, Fernseher, Projektor, Drucker, etc.) sowie seine Umgebung. Dieser Prozess nimmt die Daten aus dem Prozess 'Image Adjustments' auf und "passt" sie so an das Gerät an, dass die Betrachtungsbedingungen und die Umgebung berücksichtigt werden. TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute Luminanz der Betrachtungsumgebung\n(normalerweise 16cd/m²). -TP_COLORAPP_WBCAM;[RT+CAT02] + [Ausgabe] +TP_COLORAPP_WBCAM;[RT+CAT02/16] + [Ausgabe] TP_COLORAPP_WBRT;[RT] + [Ausgabe] +TP_COLORAPP_YBOUT_TOOLTIP;Yb ist die relative Helligkeit des Hintergrunds, ausgedrückt in % von Grau. Ein Grau bei 18 % entspricht einer Hintergrundluminanz ausgedrückt in CIE L von 50 %.\nDiese Daten müssen die durchschnittliche Luminanz des Bildes berücksichtigen. +TP_COLORAPP_YBSCEN_TOOLTIP;Yb ist die relative Helligkeit des Hintergrunds, ausgedrückt in % von Grau. Ein Grau bei 18 % entspricht einer Hintergrundluminanz ausgedrückt in CIE L von 50 %.\nDiese Daten müssen die durchschnittliche Luminanz des Bildes berücksichtigen. 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 dB=f(L). TP_COLORTONING_HIGHLIGHT;Lichter TP_COLORTONING_HUE;Farbton TP_COLORTONING_LAB;L*a*b*-Überlagerung @@ -1577,10 +2370,10 @@ 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. 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_METHOD_TOOLTIP;L*a*b*-Überlagerung, RGB-Regler und RGB-Kurven verwenden eine interpolierte Farbüberlagerung.\n\nFarbausgleich (Schatten/Mitten/Lichter) und Sättigung (2-Farben) verwenden direkte Farben.\nDas Schwarz-Weiß-Werkzeug kann aktiviert werden, wenn eine beliebige Farbtönungsmethode verwendet wird, die eine Farbtönung ermöglicht. 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_TOOLTIP;Alle Werte auf Standard zurücksetzen.\n(Schatten, Mitten, Lichter) TP_COLORTONING_OPACITY;Deckkraft TP_COLORTONING_RGBCURVES;RGB-Kurven TP_COLORTONING_RGBSLIDERS;RGB-Regler @@ -1599,6 +2392,7 @@ 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_TWOSTD;Standardfarbe TP_CROP_FIXRATIO;Format +TP_CROP_GTCENTEREDSQUARE;Zentriertes Quadrat TP_CROP_GTDIAGONALS;Diagonalregel TP_CROP_GTEPASSPORT;Passfoto (biometrisch) TP_CROP_GTFRAME;Rahmen @@ -1624,28 +2418,28 @@ TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwelle TP_DEHAZE_DEPTH;Tiefe TP_DEHAZE_LABEL;Bildschleier entfernen -TP_DEHAZE_LUMINANCE;Nur Luminanz +TP_DEHAZE_SATURATION;Sättigung 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_BLUEYELLOW;Delta-Chrominanz Blau / Gelb +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;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_CURVE_TOOLTIP;Erhöht/Reduziert die Intensität der\nChrominanz-Rauschreduzierung in\nAbhängigkeit der Farbsättigung. TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominanz TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Benutzerdefiniert TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominanz (Master) TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Methode TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. -TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nAuto-Multizonen:\nKeine Voransicht - wird erst beim Speichern angewendet.\nAbhängig von der Bildgröße, wird das Bild in ca. 10 bis 70\nKacheln aufgeteilt. Für jede Kachel wird die Chrominanz-\nRauschreduzierung individuell berechnet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-Rauschreduzierung verwendet.\n\nAuto-Multizonen:\nKeine Voransicht - wird erst beim Speichern angewendet.\nIn Abhängigkeit von der Bildgröße, wird das Bild in ca. 10 bis 70 Kacheln aufgeteilt. Für jede Kachel wird die Chrominanz-Rauschreduzierung individuell berechnet.\n\nVorschau:\nNur der sichtbare Teil des Bildes wird für die Berechnung der Chrominanz-Rauschreduzierung verwendet. TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Vorschau TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Vorschau TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Zeigt das Restrauschen des sichtbaren Bildbereichs\nin der 100%-Ansicht an.\n\n<50: Sehr wenig Rauschen\n50 - 100: Wenig Rauschen\n100 - 300: Durchschnittliches Rauschen\n>300: Hohes Rauschen\n\nDie Werte unterscheiden sich im L*a*b*- und RGB-Modus.\nDie RGB-Werte sind ungenauer, da der RGB-Modus\nLuminanz und Chrominanz nicht komplett trennt. TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Vorschaugröße = %1, Zentrum: Px = %2 Py = %2 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Rauschen: Mittelwert = %1 Hoch = %2 -TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Rauschen: Mittelwert = --- Hoch = --- +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Rauschen: Mittelwert = --- Hoch = --- TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Kachelgröße = %1 Zentrum: Tx = %2 Ty = %2 -TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Delta-Chrominanz Rot / Grün +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominanz Rot/Grün TP_DIRPYRDENOISE_LABEL;Rauschreduzierung TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminanzkontrolle TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminanzkurve @@ -1661,19 +2455,19 @@ TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Mit Gamma kann die Intensität der\nRauschre 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_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* TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Medianfilter TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Nur Luminanz TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB -TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“,\nwird der Medianfilter nach den Waveletschritten\nverarbeitet.\nBei RGB wird der Medianfilter am Ende der\nRauschreduzierung verarbeitet. +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Bei der Methode 'Nur Luminanz' und 'L*a*b*',\nwird der Medianfilter nach den Wavelet-Schritten verarbeitet.\nBei RGB wird der Medianfilter am Ende der Rauschreduzierung verarbeitet. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Gewichtet L* (wenig) + a*b* (normal) TP_DIRPYRDENOISE_MEDIAN_PASSES;Iterationen TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Manchmal führt ein kleines 3×3-Fenster mit\nmehreren Iterationen zu besseren Ergebnissen\nals ein 7×7-Fenster mit nur einer Iteration. TP_DIRPYRDENOISE_MEDIAN_TYPE;Mediantyp -TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen.\nJe größer das Fenster, umso länger dauert die Verarbeitungszeit.\n\n3×3 weich: Nutzt 5 Pixel in einem 3×3-Pixelfenster.\n3×3: Nutzt 9 Pixel in einem 3×3-Pixelfenster.\n5×5 weich: Nutzt 13 Pixel in einem 5×5-Pixelfenster.\n5×5: Nutzt 25 Pixel in einem 5×5-Pixelfenster.\n7×7: Nutzt 49 Pixel in einem 7×7-Pixelfenster.\n9×9: Nutzt 81 Pixel in einem 9×9-Pixelfenster.\n\nManchmal ist das Ergebnis mit einem kleineren Fenster und mehreren Iterationen besser, als mit einem größeren und nur einer Iteration. +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen.\nJe größer das Fenster, desto länger dauert die Verarbeitungszeit.\n\n3×3 weich: Nutzt 5 Pixel in einem 3×3-Pixelfenster.\n3×3: Nutzt 9 Pixel in einem 3×3-Pixelfenster.\n5×5 weich: Nutzt 13 Pixel in einem 5×5-Pixelfenster.\n5×5: Nutzt 25 Pixel in einem 5×5-Pixelfenster.\n7×7: Nutzt 49 Pixel in einem 7×7-Pixelfenster.\n9×9: Nutzt 81 Pixel in einem 9×9-Pixelfenster.\n\nManchmal ist das Ergebnis mit einem kleineren Fenster und mehreren Iterationen besser, als mit einem größeren und nur einer Iteration. TP_DIRPYRDENOISE_TYPE_3X3;3×3 TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 weich TP_DIRPYRDENOISE_TYPE_5X5;5×5 @@ -1694,9 +2488,9 @@ TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral TP_DIRPYREQUALIZER_SKIN;Hautfarbtöne schützen TP_DIRPYREQUALIZER_SKIN_TOOLTIP;-100: Nur Farben innerhalb des Bereichs werden verändert.\n0: Alle Farben werden gleich behandelt.\n+100: Nur Farben außerhalb des Bereichs werden verändert. TP_DIRPYREQUALIZER_THRESHOLD;Schwelle -TP_DIRPYREQUALIZER_TOOLTIP;Verringert Artefakte an den Übergängen\nzwischen Hautfarbtöne und dem Rest\ndes Bildes. +TP_DIRPYREQUALIZER_TOOLTIP;Verringert Artefakte an den Übergängen\nzwischen Hautfarbtönen und dem Rest des Bildes. TP_DISTORTION_AMOUNT;Intensität -TP_DISTORTION_AUTO_TIP;Korrigiert die Verzeichnung in RAW-Bildern durch Vergleich mit dem eingebetten JPEG, falls dieses existiert und die Verzeichnung durch die Kamera korrigiert wurde. +TP_DISTORTION_AUTO_TOOLTIP;Korrigiert die Verzeichnung in RAW-Bildern durch Vergleich mit dem eingebetteten JPEG, falls dieses existiert und die Verzeichnung durch die Kamera korrigiert wurde. TP_DISTORTION_LABEL;Verzeichnungskorrektur TP_EPD_EDGESTOPPING;Kantenschutz TP_EPD_GAMMA;Gamma @@ -1705,19 +2499,19 @@ TP_EPD_REWEIGHTINGITERATES;Iterationen TP_EPD_SCALE;Faktor TP_EPD_STRENGTH;Intensität TP_EXPOSURE_AUTOLEVELS;Auto -TP_EXPOSURE_AUTOLEVELS_TIP;Automatische Belichtungseinstellung\nbasierend auf Bildanalyse. +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;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_CLIP_TOOLTIP;Anteil der Pixel, die sich bei automatischer\nBelichtungseinstellung im Bereich der\nSpitzlichter und Schatten befinden sollen. TP_EXPOSURE_COMPRHIGHLIGHTS;Lichterkompression TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Lichterkompression Schwelle TP_EXPOSURE_COMPRSHADOWS;Schattenkompression TP_EXPOSURE_CONTRAST;Kontrast 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_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 > Tonwertkurven. 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. @@ -1734,13 +2528,23 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Gewichteter Standard TP_EXPOS_BLACKPOINT_LABEL;Schwarzpunkt TP_EXPOS_WHITEPOINT_LABEL;Weißpunkt TP_FILMNEGATIVE_BLUE;Blauverhältnis -TP_FILMNEGATIVE_GREEN;Bezugsexponent (Kontrast) -TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -TP_FILMNEGATIVE_LABEL;Filmnegativ -TP_FILMNEGATIVE_PICK;Pick neutral spots +TP_FILMNEGATIVE_BLUEBALANCE;Balance Kalt/Warm +TP_FILMNEGATIVE_COLORSPACE;Farbraum +TP_FILMNEGATIVE_COLORSPACE_INPUT;Eingangsfarbraum +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Wählen Sie den Farbraum aus, der verwendet werden soll, um die Negativ-Umkehrung durchzuführen:\nEingangsfarbraum: Führt die Umkehrung durch, bevor das Eingangsprofil angewendet wird, wie in den vorherigen Versionen von RT.\nArbeitsfarbraum< /b>: Führt die Umkehrung nach dem Eingabeprofil durch, wobei das aktuell ausgewählte Arbeitsprofil angewendet wird. +TP_FILMNEGATIVE_COLORSPACE_WORKING;Arbeitsfarbraum +TP_FILMNEGATIVE_GREEN;Bezugsexponent +TP_FILMNEGATIVE_GREENBALANCE;Balance Magenta/Grün +TP_FILMNEGATIVE_GUESS_TOOLTIP;Setzt automatisch die Rot- und Blau-Werte, indem mit der Pipette zwei Punkte ohne Farbinformation im Originalbild genommen werden. Diese Punkte sollten in der Helligkeit unterschiedlich sein. Der Weißabgleich sollte erst danach vorgenommen werden. +TP_FILMNEGATIVE_LABEL;Negativfilm +TP_FILMNEGATIVE_OUT_LEVEL;Ausgabestärke +TP_FILMNEGATIVE_PICK;Neutrale Punkte anwählen TP_FILMNEGATIVE_RED;Rotverhältnis +TP_FILMNEGATIVE_REF_LABEL;Eingang RGB: %1 +TP_FILMNEGATIVE_REF_PICK;Farbwähler +TP_FILMNEGATIVE_REF_TOOLTIP;Auswahl eines Graupunktes, um den Weißabgleich für das Positivbild zu setzen. TP_FILMSIMULATION_LABEL;Filmsimulation -TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der viel Zeit benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet, oder einen leeren Ordner, wenn Sie die Filsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Filmsimulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden? +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der zu viel Zeit zum Laden benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie, welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet oder einen leeren Ordner, wenn Sie die Filmsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Filmsimulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden? TP_FILMSIMULATION_STRENGTH;Intensität TP_FILMSIMULATION_ZEROCLUTSFOUND;HaldCLUT-Verzeichnis in den Einstellungen festlegen TP_FLATFIELD_AUTOSELECT;Automatische Auswahl @@ -1756,9 +2560,9 @@ TP_FLATFIELD_LABEL;Weißbild TP_GENERAL_11SCALE_TOOLTIP;Der Effekt dieses Werkzeugs ist nur in der 100%-Ansicht akkurat oder sichtbar. TP_GRADIENT_CENTER;Rotationsachse TP_GRADIENT_CENTER_X;Rotationsachse X -TP_GRADIENT_CENTER_X_TOOLTIP;Ankerpunkt der Rotationsachse X:\n-100 = linker Bildrand\n0 = Bildmitte\n+100 = rechter Bildrand +TP_GRADIENT_CENTER_X_TOOLTIP;Ankerpunkt der Rotationsachse X:\n-100 = linker Bildrand\n0 = Bildmitte\n+100 = rechter Bildrand. 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_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_FEATHER;Bereich @@ -1770,24 +2574,27 @@ TP_HLREC_BLEND;Überlagerung TP_HLREC_CIELAB;CIELab-Überlagerung TP_HLREC_COLOR;Farbübertragung TP_HLREC_ENA_TOOLTIP;Wird bei Verwendung der automatischen\nBelichtungskorrektur möglicherweise\naktiviert. +TP_HLREC_HLBLUR;Unschärfe TP_HLREC_LABEL;Lichter rekonstruieren TP_HLREC_LUMINANCE;Luminanz wiederherstellen TP_HLREC_METHOD;Methode: TP_HSVEQUALIZER_CHANNEL;Kanal TP_HSVEQUALIZER_HUE;H -TP_HSVEQUALIZER_LABEL;Farbton (H) / Sättigung (S) / Dynamik (V) +TP_HSVEQUALIZER_LABEL;Farbton (H)/Sättigung (S)/Dynamik (V) TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Basisbelichtung TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Die eingebettete DCP-Basisbelichtung verwenden.\nDie Einstellung ist nur verfügbar wenn sie vom\nEingangsfarbprofil unterstützt wird. TP_ICM_APPLYHUESATMAP;Basistabelle TP_ICM_APPLYHUESATMAP_TOOLTIP;Die eingebettete DCP-Basistabelle verwenden.\nDie Einstellung ist nur verfügbar wenn sie vom\nEingangsfarbprofil unterstützt wird. -TP_ICM_APPLYLOOKTABLE;“Look“-Tabelle -TP_ICM_APPLYLOOKTABLE_TOOLTIP;Die eingebettete DCP-“Look“-Tabelle verwenden.\nDie Einstellung ist nur verfügbar wenn sie vom\nEingangsfarbprofil unterstützt wird. +TP_ICM_APPLYLOOKTABLE;'Look'-Tabelle +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Die eingebettete DCP-'Look'-Tabelle verwenden.\nDie Einstellung ist nur verfügbar wenn sie vom\nEingangsfarbprofil unterstützt wird. TP_ICM_BPC;Schwarzpunkt-Kompensation TP_ICM_DCPILLUMINANT;Illumination 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_DCPILLUMINANT_TOOLTIP;DCP-Illumination auswählen. Vorgabe ist 'Interpoliert'. Die Einstellung ist nur verfügbar, wenn sie vom Eingangsfarbprofil unterstützt wird. +TP_ICM_FBW;Schwarz-Weiß +TP_ICM_ILLUMPRIM_TOOLTIP;Wählen Sie die Lichtart, die den Aufnahmebedingungen am nächsten kommt.\nÄnderungen können nur vorgenommen werden, wenn die Auswahl 'Ziel-Primärfarben' auf 'Benutzerdefiniert (Schieberegler)' eingestellt ist. 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. @@ -1801,26 +2608,71 @@ TP_ICM_INPUTNONE;Kein Profil TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden. TP_ICM_INPUTPROFILE;Eingangsfarbprofil TP_ICM_LABEL;Farbmanagement +TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +TP_ICM_NEUTRAL;Zurücksetzen TP_ICM_NOICM;Kein ICM: sRGB-Ausgabe TP_ICM_OUTPUTPROFILE;Ausgabeprofil -TP_ICM_PROFILEINTENT;Rendering-Intent +TP_ICM_OUTPUTPROFILE_TOOLTIP;Standardmäßig sind alle RTv4- oder RTv2-Profile mit TRC - sRGB: g=2.4 s=12.92 voreingestellt.\n\nMit 'ICC Profile Creator' können Sie v4- oder v2-Profile mit den folgenden Auswahlmöglichkeiten erstellen:\n- Primär: Aces AP0, Aces AP1 , AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Benutzerdefiniert\n- TRC: BT709, sRGB, linear, Standard g=2,2, Standard g=1,8, Benutzerdefiniert\n- Lichtart: D41, D50, D55 , D60, D65, D80, stdA 2856K +TP_ICM_PRIMBLU_TOOLTIP;Primäreinstellungen Blau:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +TP_ICM_PRIMGRE_TOOLTIP;Primäreinstellungen Grün:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +TP_ICM_PRIMILLUM_TOOLTIP;Sie können ein Bild von seinem ursprünglichen Modus 'Arbeitsprofil' in einen anderen Modus 'Ziel-Primärdateien' ändern. Wenn Sie für ein Bild einen anderen Farbmodus auswählen, ändern Sie dauerhaft die Farbwerte im Bild.\n\nDas Ändern der 'Primärfarben' ist ziemlich komplex und schwierig zu verwenden. Es erfordert viel Experimentieren.\nEs ist in der Lage, exotische Farbanpassungen als Kanalmixer-Primärfarben vorzunehmen.\nErmöglicht Ihnen, die Kamerakalibrierung mit Benutzerdefiniert (Schieberegler) zu ändern. +TP_ICM_PRIMRED_TOOLTIP;Primäreinstellungen Rot:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +TP_ICM_PROFILEINTENT;Wiedergabe +TP_ICM_REDFRAME;Benutzerdefinierte Einstellungen 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. -TP_ICM_SAVEREFERENCE_TOOLTIP;Speichert das lineare TIFF-Bild bevor das\nEingangsfarbprofil angewendet wird. Das\nErgebnis kann zu Kalibrierungsaufgaben\nund zum Erstellen von Kameraprofilen\nverwendet werden. +TP_ICM_SAVEREFERENCE_TOOLTIP;Speichern Sie das lineare TIFF-Bild bevor das Eingangsfarbprofil angewendet wird. Das Ergebnis kann für Kalibrierungsaufgaben und zum Erstellen von Kameraprofilen verwendet werden. 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_TONECURVE_TOOLTIP;Eingebettete DCP-Tonwertkurve verwenden.\nDie Einstellung ist nur verfügbar, wenn sie vom Eingangsfarbprofil unterstützt wird. +TP_ICM_TRCFRAME;Abstraktes Profil +TP_ICM_TRCFRAME_TOOLTIP;Auch bekannt als 'synthetisches' oder 'virtuelles' Profil, das am Ende der Verarbeitungspipeline (vor CIECAM) angewendet wird, sodass Sie benutzerdefinierte Bildeffekte erstellen können.\nSie können Änderungen vornehmen an:\n'Farbtonkennlinie': Ändert die Farbtöne des Bildes.\n'Beleuchtungsart': Ermöglicht Ihnen, die Profil-Primärfarben zu ändern, um sie an die Aufnahmebedingungen anzupassen.\n'Ziel-Primärfarben': Ermöglicht Ihnen, die Ziel-Primärfarben mit zwei Hauptanwendungen zu ändern - Kanalmischer und -kalibrierung.\nHinweis: Abstrakte Profile berücksichtigen die integrierten Arbeitsprofile, ohne sie zu ändern. Sie funktionieren nicht mit benutzerdefinierten Arbeitsprofilen. +TP_ICM_TRC_TOOLTIP;Ermöglicht Ihnen, die standardmäßige sRGB-'Farbtonkennlinie' in RT (g=2,4 s=12,92) zu ändern.\nDiese Farbtonkennlinie modifiziert die Farbtöne des Bildes. Die RGB- und Lab-Werte, das Histogramm und die Ausgabe (Bildschirm, TIF, JPG) werden geändert:\nGamma wirkt hauptsächlich auf helle Töne, Steigung wirkt hauptsächlich auf dunkle Töne.\nSie können ein beliebiges Paar von 'Gamma' und 'Steigung' (Werte >1) wählen, und der Algorithmus stellt sicher, dass zwischen den linearen und parabolischen Teilen der Kurve Kontinuität besteht.\nEine andere Auswahl als 'Keine' aktiviert die Menüs 'Lichtart' und 'Ziel-Primärfarben'. TP_ICM_WORKINGPROFILE;Arbeitsfarbraum +TP_ICM_WORKING_CIEDIAG;CIE xy-Diagramm +TP_ICM_WORKING_ILLU;Beleuchtung +TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +TP_ICM_WORKING_ILLU_D41;D41 +TP_ICM_WORKING_ILLU_D50;D50 +TP_ICM_WORKING_ILLU_D55;D55 +TP_ICM_WORKING_ILLU_D60;D60 +TP_ICM_WORKING_ILLU_D65;D65 +TP_ICM_WORKING_ILLU_D80;D80 +TP_ICM_WORKING_ILLU_D120;D120 +TP_ICM_WORKING_ILLU_NONE;Standard +TP_ICM_WORKING_ILLU_STDA;Glühbirne Normlicht A 2875K +TP_ICM_WORKING_PRESER;Pastelltöne erhalten +TP_ICM_WORKING_PRIM;Zielvorwahl +TP_ICM_WORKING_PRIMFRAME_TOOLTIP;Wenn 'Benutzerdefiniert CIE xy-Diagramm' in der Combobox 'Zielvorwahl' ausgewählt ist, können die Werte der 3 Primärfarben direkt im Diagramm geändert werden.\nBeachten Sie, dass in diesem Fall die Weißpunktposition im Diagramm nicht aktualisiert wird. +TP_ICM_WORKING_PRIM_AC0;ACESp0 +TP_ICM_WORKING_PRIM_ACE;ACESp1 +TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +TP_ICM_WORKING_PRIM_BET;Beta RGB +TP_ICM_WORKING_PRIM_BRU;BruceRGB +TP_ICM_WORKING_PRIM_BST;BestRGB +TP_ICM_WORKING_PRIM_CUS;Benutzerdefiniert (Regler) +TP_ICM_WORKING_PRIM_CUSGR;Benutzerdefiniert (CIE xy-Diagramm) +TP_ICM_WORKING_PRIM_NONE;Standard +TP_ICM_WORKING_PRIM_PROP;ProPhoto +TP_ICM_WORKING_PRIM_REC;Rec2020 +TP_ICM_WORKING_PRIM_SRGB;sRGB +TP_ICM_WORKING_PRIM_WID;WideGamut TP_ICM_WORKING_TRC;Farbtonkennlinie: +TP_ICM_WORKING_TRC_18;ProPhoto g=1.8 +TP_ICM_WORKING_TRC_22;Adobe g=2.2 +TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 TP_ICM_WORKING_TRC_CUSTOM;Benutzerdefiniert TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_LIN;Linear g=1 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_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +TP_ICM_WORKING_TRC_TOOLTIP;Auswahl der mitgelieferten Profile. TP_IMPULSEDENOISE_LABEL;Impulsrauschreduzierung TP_IMPULSEDENOISE_THRESH;Schwelle TP_LABCURVE_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Anpassung der Farben an den Arbeitsfarbraum\nund Anwendung der Munsellkorrektur. +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Anpassung der Farben an den Arbeitsfarbraum\nund Anwendung der Munsell-Korrektur. TP_LABCURVE_BRIGHTNESS;Helligkeit TP_LABCURVE_CHROMATICITY;Chromatizität TP_LABCURVE_CHROMA_TOOLTIP;Für Schwarz/Weiß setzen Sie die Chromatizität auf -100. @@ -1839,26 +2691,28 @@ TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Matt TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastell TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Gesättigt -TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromatizität als Funktion der Chromatizität C = f(C) +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromatizität als Funktion der Chromatizität C=f(C). TP_LABCURVE_CURVEEDITOR_CH;CH -TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromatizität als Funktion des Farbtons C = f(H) +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromatizität als Funktion des Farbtons C=f(H). TP_LABCURVE_CURVEEDITOR_CL;CL -TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromatizität als Funktion der Luminanz C = f(L) +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromatizität als Funktion der Luminanz C=f(L). TP_LABCURVE_CURVEEDITOR_HH;HH -TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H = f(H) +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H=f(H). TP_LABCURVE_CURVEEDITOR_LC;LC -TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminanz als Funktion der Chromatizität L = f(C) +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminanz als Funktion der Chromatizität L=f(C). TP_LABCURVE_CURVEEDITOR_LH;LH -TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminanz als Funktion des Farbtons L = f(H) -TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminanz als Funktion der Luminanz L = f(L) +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminanz als Funktion des Farbtons L=f(H). +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminanz als Funktion der Luminanz L=f(L). TP_LABCURVE_LABEL;L*a*b* - Anpassungen TP_LABCURVE_LCREDSK;LC-Kurve auf Hautfarbtöne beschränken -TP_LABCURVE_LCREDSK_TIP;Wenn aktiviert, wird die LC-Kurve auf\nHautfarbtöne beschränkt.\nWenn deaktiviert, wird die LC-Kurve auf\nalle Farbtöne angewendet. +TP_LABCURVE_LCREDSK_TOOLTIP;Wenn aktiviert, wird die LC-Kurve auf\nHautfarbtöne beschränkt.\nWenn deaktiviert, wird die LC-Kurve auf\nalle Farbtöne angewendet. TP_LABCURVE_RSTPROTECTION;Hautfarbtöne schützen TP_LABCURVE_RSTPRO_TOOLTIP;Kann mit dem Chromatizitätsregler und\nder CC-Kurve verwendet werden. TP_LENSGEOM_AUTOCROP;Auto-Schneiden TP_LENSGEOM_FILL;Auto-Füllen TP_LENSGEOM_LABEL;Objektivkorrekturen +TP_LENSGEOM_LIN;Linear +TP_LENSGEOM_LOG;Logarithmisch TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatisch (Lensfun) TP_LENSPROFILE_CORRECTION_LCPFILE;LCP-Datei TP_LENSPROFILE_CORRECTION_MANUAL;Benutzerdefiniert (Lensfun) @@ -1874,12 +2728,794 @@ TP_LOCALCONTRAST_DARKNESS;Dunkle Bereiche TP_LOCALCONTRAST_LABEL;Lokaler Kontrast TP_LOCALCONTRAST_LIGHTNESS;Helle Bereiche TP_LOCALCONTRAST_RADIUS;Radius +TP_LOCALLAB_ACTIV;Nur Luminanz +TP_LOCALLAB_ACTIVSPOT;Spot aktivieren +TP_LOCALLAB_ADJ;Equalizer Blau/Gelb-Rot/Grün +TP_LOCALLAB_AMOUNT;Intensität +TP_LOCALLAB_ARTIF;Kantenerkennung +TP_LOCALLAB_ARTIF_TOOLTIP;Schwellenwert Bereich ΔE erhöht den Anwendungsbereich des ΔE. Hohe Werte sind für große Gamutbereiche.\nErhöhung der ΔE-Zerfallrate kann die Kantenerkennung erhöhen, aber auch den Bereich verringern. +TP_LOCALLAB_AUTOGRAY;Automatisch mittlere Luminanz (Yb%) +TP_LOCALLAB_AUTOGRAYCIE;Automatisch +TP_LOCALLAB_AVOID;vermeide Farbverschiebungen +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Passt Farben an den Arbeitsfarbraum an und wendet die Munsell-Korrektur an (Uniform Perceptual Lab).\nMunsell-Korrektur ist deaktiviert wenn Jz oder CAM16 angewendet wird. +TP_LOCALLAB_AVOIDMUN;Nur Munsell-Korrektur +TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell-Korrektur ist deaktiviert, wenn Jz or CAM16 angewendet wird. +TP_LOCALLAB_AVOIDRAD;Radius +TP_LOCALLAB_BALAN;ab-L Balance (ΔE) +TP_LOCALLAB_BALANEXP;Laplace Balance +TP_LOCALLAB_BALANH;C-H Balance (ΔE) +TP_LOCALLAB_BALAN_TOOLTIP;Verändert die ΔE Algorithmus-Parameter.\nBerücksichtigt mehr oder weniger a*b* oder L*, oder mehr oder weniger C oder H.\nNicht zur Rauschreduzierung. +TP_LOCALLAB_BASELOG;Bereich Schatten (logarithmisch) +TP_LOCALLAB_BILATERAL;Impulsrauschen +TP_LOCALLAB_BLACK_EV;Schwarz-Ev +TP_LOCALLAB_BLCO;nur Chrominanz +TP_LOCALLAB_BLENDMASKCOL;Überlagerung +TP_LOCALLAB_BLENDMASKMASK;Addiere/subtrahiere Luminanzmaske +TP_LOCALLAB_BLENDMASKMASKAB;Addiere/subtrahiere Chrominanzmaske +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;Wenn Regler = 0 keine Auswirkung.\nAddiert oder subtrahiert die Maske vom Originalbild. +TP_LOCALLAB_BLENDMASK_TOOLTIP;Wenn Überlagerung = 0 ist, wird nur die Formerkennung verbessert.\nWenn Überlagerung > 0 ist, wird die Maske zum Bild hinzugefügt. Wenn Überlagerung < 0 ist, wird die Maske vom Bild subtrahiert. +TP_LOCALLAB_BLGUID;Anpassbarer Filter +TP_LOCALLAB_BLINV;Invertieren +TP_LOCALLAB_BLLC;Luminanz u. Chrominanz +TP_LOCALLAB_BLLO;Nur Luminanz +TP_LOCALLAB_BLMED;Median +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direkte Unschärfe und Rauschen mit allen Einstellungen.\nInvertiert - Unschärfe und Rauschen mit allen Einstellungen. Vorsicht, kann zu unerwünschten Ergebnissen führen. +TP_LOCALLAB_BLNOI_EXP;Unschärfe und Rauschen +TP_LOCALLAB_BLNORM;Normal +TP_LOCALLAB_BLUFR;Unschärfe und Rauschreduzierung +TP_LOCALLAB_BLUMETHOD_TOOLTIP;So verwischen Sie den Hintergrund und isolieren Sie den Vordergrund:\n- Verwischen Sie den Hintergrund, indem Sie das Bild vollständig mit einem RT-Spot abdecken (hohe Werte für Umfang und Übergang und 'Normal' oder 'Invertieren' im Kontrollkästchen).\n- Isolieren Sie den Vordergrund durch Verwendung eines oder mehrerer 'Ausschließen'-RT-Spots und Vergrößerung des Bereichs.\n\nDieses Modul (einschließlich 'Median' und 'Anpassbarer Filter') kann zusätzlich zur Rauschreduzierung im Hauptmenü verwendet werden. +TP_LOCALLAB_BLUR;Gauß'sche Unschärfe - Rauschen - Körnung +TP_LOCALLAB_BLURCOL;Radius +TP_LOCALLAB_BLURCOLDE_TOOLTIP;Zur Berechnung von ΔE wird ein leicht unscharfes Bild verwendet, um isolierte Pixel zu vermeiden. +TP_LOCALLAB_BLURDE;Unschärfe Kantenerkennung +TP_LOCALLAB_BLURLC;Nur Luminanz +TP_LOCALLAB_BLURLEVELFRA;Unschärfe-Ebenen +TP_LOCALLAB_BLURMASK_TOOLTIP;Verwendet eine große Radius-Unschärfe für eine Maske, die es erlaubt, den Bildkontrast und/oder Teile davon abzudunkeln oder aufzuhellen. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Verändert den Radius der Gauß'schen Unschärfe (0 bis 1000). +TP_LOCALLAB_BLUR_TOOLNAME;Unschärfe und Rauschreduzierung +TP_LOCALLAB_BLWH;Alle Änderungen in Schwarz-Weiß erzwingen +TP_LOCALLAB_BLWH_TOOLTIP;Setzt Farbkomponenten 'a' und 'b' auf Null.\nHilfreich für Schwarz/Weiß-Entwicklung oder Filmsimulation. +TP_LOCALLAB_BUTTON_ADD;Hinzufügen +TP_LOCALLAB_BUTTON_DEL;Löschen +TP_LOCALLAB_BUTTON_DUPL;Duplizieren +TP_LOCALLAB_BUTTON_REN;Umbenennen +TP_LOCALLAB_BUTTON_VIS;Ein-/Ausblenden +TP_LOCALLAB_BWFORCE;Schwarz-Ev & Weiß-Ev verwenden +TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Spitzenleuchtdichte) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) angepasst an CAM16. Ermöglicht die Änderung der internen PQ-Funktion (normalerweise 10000 cd/m2 - Standard 100 cd/m2 - deaktiviert für 100 cd/m2).\nKann zur Anpassung an verschiedene Geräte und Bilder verwendet werden. +TP_LOCALLAB_CAM16_FRA;CAM16 Bildanpassungen +TP_LOCALLAB_CAMMODE;CAM-Modell +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CATAD;Chromatische Adaptation/Cat16 +TP_LOCALLAB_CBDL;Detailebenenkontrast +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Verstärkt den lokalen Kontrast der Mitteltöne. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Das gleiche wie Wavelets.\nDie erste Ebene (0) arbeitet mit 2x2 Pixeldetails.\nDie letzte Ebene (5) arbeitet mit 64x64 Pixeldetails. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Verhindert das Schärfen von Rauschen. +TP_LOCALLAB_CBDL_TOOLNAME;Detailebenen-Kontrast +TP_LOCALLAB_CENTER_X;Mitte X +TP_LOCALLAB_CENTER_Y;Mitte Y +TP_LOCALLAB_CH;Kurven CL - LC +TP_LOCALLAB_CHROMA;Chrominanz +TP_LOCALLAB_CHROMABLU;Chrominanz-Ebenen +TP_LOCALLAB_CHROMABLU_TOOLTIP;Erhöht oder verringert den Effekt abhängig von den Luma-Einstellungen.\nWerte kleiner 1 verringern den Effekt. Werte größer 1 erhöhen den Effekt. +TP_LOCALLAB_CHROMACBDL;Chrominanz +TP_LOCALLAB_CHROMACB_TOOLTIP;Erhöht oder verringert den Effekt abhängig von den Luma-Einstellungen.\nWerte kleiner 1 verringern den Effekt. Werte größer 1 erhöhen den Effekt. +TP_LOCALLAB_CHROMALEV;Chrominanz Ebenen +TP_LOCALLAB_CHROMASKCOL;Chrominanz +TP_LOCALLAB_CHROMASK_TOOLTIP;Ändert die Chrominanz der Maske, wenn eine existiert (d.h. C(C) oder LC(H) ist aktiviert). +TP_LOCALLAB_CHROML;Chroma (C) +TP_LOCALLAB_CHRRT;Chrominanz +TP_LOCALLAB_CIE;CIECAM (CAM16 & JzCzHz) +TP_LOCALLAB_CIEC;CIECAM-Umgebungsparameter +TP_LOCALLAB_CIECAMLOG_TOOLTIP;Dieses Modul basiert auf dem CIECAM-Farberscheinungsmodell, das entwickelt wurde, um das Sehen der menschlichen Farbwahrnehmung unter verschiedenen Lichtbedingungen zu simulieren.\nDer erste CIECAM-Prozess 'Szenebasierte Bedingungen' wird per LOG-Kodierung durchgeführt und verwendet 'Absolute Luminanz' zum Zeitpunkt der Aufnahme.\nDer zweite CIECAM-Prozess 'Bildkorrektur' wurde vereinfacht und nutzt nur 3 Variablen ('Lokaler Kontrast', 'Kontrast J', 'Sättigung s').\nDer dritte CIECAM-Prozess 'Anzeigebedingungen' passt die Ausgabe an das beabsichtigte Anzeigegerät (Monitor, TV, Projektor, Drucker, etc.) an, damit das chromatische und kontrastreiche Erscheinungsbild in der gesamten Anzeigeumgebung erhalten bleibt. +TP_LOCALLAB_CIECOLORFRA;Farbe +TP_LOCALLAB_CIECONTFRA;Kontrast +TP_LOCALLAB_CIELIGHTCONTFRA;Beleuchtung & Kontrast +TP_LOCALLAB_CIELIGHTFRA;Beleuchtung +TP_LOCALLAB_CIEMODE;Werkzeugposition ändern +TP_LOCALLAB_CIEMODE_COM;Standard +TP_LOCALLAB_CIEMODE_DR;Dynamikbereich +TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +TP_LOCALLAB_CIEMODE_TOOLTIP;Im Standardmodus wird CIECAM am Ende des Prozesses hinzugefügt. 'Maske und Anpassungen' und 'Wiederherstellung auf Luminanzmaske' stehen für 'CAM16 und JzCzHz' zur Verfügung.\nAuf Wunsch kann CIECAM in andere Werkzeuge (TM, Wavelet, Dynamik, LOG-Kodierung) integriert werden. Das Ergebnis dieser Werkzeuge wird sich von denen ohne CIECAM unterscheiden. In diesem Modus können auch 'Maske und Anpassungen' und 'Wiederherstellung auf Luminanzmaske' angewendet werden. +TP_LOCALLAB_CIEMODE_WAV;Wavelet +TP_LOCALLAB_CIETOOLEXP;Kurven +TP_LOCALLAB_CIE_TOOLNAME;Farberscheinung (Cam16 & JzCzHz) +TP_LOCALLAB_CIRCRADIUS;Spot-Größe +TP_LOCALLAB_CIRCRAD_TOOLTIP;Die Spot-Größe bestimmt die Referenzen des RT-Spots, die für die Formerkennung nützlich sind (Farbton, Luma, Chroma, Sobel).\nNiedrige Werte können für die Bearbeitung kleiner Flächen und Strukturen nützlich sein.\nHohe Werte können für die Behandlung von größeren Flächen oder auch Haut nützlich sein. +TP_LOCALLAB_CLARICRES;Chroma zusammenführen +TP_LOCALLAB_CLARIFRA;Klarheit u. Schärfemaske - Überlagern u. Abschwächen +TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 bis 4 (einschließlich): ‘Schärfemaske’ ist aktiviert\nLevel 5 und darüber: 'Klarheit' ist aktiviert. +TP_LOCALLAB_CLARILRES;Luma zusammenführen +TP_LOCALLAB_CLARISOFT;Radius +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;Der Regler ‘Radius’ (Algorithmus des anpassbaren Filters) reduziert Lichthöfe und Unregelmäßigkeiten für Klarheit, Schärfemaske und Wavelets Jz des lokalen Kontrastes. +TP_LOCALLAB_CLARISOFT_TOOLTIP;Der Regler 'Radius' (Algorithmus des anpassbaren Filters) reduziert Lichthöfe und Unregelmäßigkeiten für die Klarheit, die Schärfemaske und für alle Pyramiden-Wavelet-Prozesse. Zum Deaktivieren setzen Sie den Schieberegler auf Null. +TP_LOCALLAB_CLARITYML;Klarheit +TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 bis 4 (einschließlich): 'Schärfemaske' ist aktiviert\nLevel 5 und darüber: 'Klarheit' ist aktiviert.\nHilfreich bei 'Wavelet - Tonwertkorrektur' +TP_LOCALLAB_CLIPTM;Wiederhergestellte Daten beschneiden +TP_LOCALLAB_COFR;Farbe und Licht +TP_LOCALLAB_COLORDE;Vorschau Farbe - Intensität (ΔE) +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Die Schaltfläche 'Vorschau ΔE' funktioniert nur, wenn Sie eines (und nur eines) der Werkzeuge im Menü 'Werkzeug zum aktuellen Spot hinzufügen' aktiviert haben.\nUm eine Vorschau von ΔE mit mehreren aktivierten Werkzeugen anzuzeigen, verwenden Sie 'Maske und Anpassungen' - Vorschau ΔE. +TP_LOCALLAB_COLORDE_TOOLTIP;Zeigt eine blaue Farbvorschau für die ΔE-Auswahl an, wenn negativ, und grün, wenn positiv.\n\nMaske und Anpassungen (geänderte Bereiche ohne Maske anzeigen): Zeigt tatsächliche Änderungen an, wenn sie positiv sind, erweiterte Änderungen (nur Luminanz) mit Blau und Gelb, wenn sie negativ sind. +TP_LOCALLAB_COLORSCOPE;Bereich (Farbwerkzeuge) +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Regler für Farbe, Licht, Schatten, Highlights und Dynamik.\nAndere Werkzeuge haben ihre eigenen Kontrollregler für den Anwendungsbereich. +TP_LOCALLAB_COLOR_CIE;Farbkurve +TP_LOCALLAB_COLOR_TOOLNAME;Farbe und Licht +TP_LOCALLAB_COL_NAME;Name +TP_LOCALLAB_COL_VIS;Status +TP_LOCALLAB_COMPFRA;Direktionaler Kontrast +TP_LOCALLAB_COMPREFRA;Tonwertkorrektur +TP_LOCALLAB_CONTCOL;Schwellenwert Kontrast +TP_LOCALLAB_CONTFRA;Ebenenkontrast +TP_LOCALLAB_CONTRAST;Kontrast +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Ermöglicht das freie Ändern des Kontrasts der Maske.\nHat eine ähnliche Funktion wie die Regler 'Gamma' und 'Neigung'.\nMit dieser Funktion können Sie bestimmte Bereiche des Bildes (normalerweise die hellsten Bereiche der Maske) anvisieren, indem mit Hilfe der Kurve dunklere Bereiche ausgeschlossen werden). Kann Artefakte erzeugen. +TP_LOCALLAB_CONTRESID;Kontrast +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Bestimmen Sie die zu verändernden Bildbereiche auf Basis der Textur. +TP_LOCALLAB_CONTTHR;Schwellenwert Kontrast +TP_LOCALLAB_CONTWFRA;Lokaler Kontrast +TP_LOCALLAB_CSTHRESHOLD;Wavelet-Ebenen +TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet-Ebenenauswahl +TP_LOCALLAB_CURV;Luminanz - Kontrast - Chrominanz 'Super' +TP_LOCALLAB_CURVCURR;Normal +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;Wenn sich die Kurven oben befinden, ist die Maske vollständig Schwarz und hat keine Auswirkung auf das Bild.\nMit dem Absenken der Kurve wird die Maske allmählich bunter und brillanter, und das Bild ändert sich immer mehr.\n\nDie graue Übergangslinie repräsentiert die Referenzen (Chroma, Luma, Farbton).\nSie können wählen, ob der obere Rand der Kurven auf diesem Übergang positioniert werden soll oder nicht. +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;Wenn sich die Kurven oben befinden, ist die Maske vollständig Schwarz und hat keine Auswirkung auf das Bild.\nMit dem Absenken der Kurve wird die Maske allmählich bunter und heller und ändert das Bild schrittweise.\n\nEs wird empfohlen, den oberen Rand der Kurven auf der grauen Grenzlinie zu positionieren, die die Referenzwerte von Chroma, Luma, Farbton für den RT-Spot darstellt. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;Um die Kurven zu aktivieren, setzen Sie das Kombinationsfeld 'Kurventyp' auf 'Normal'. +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tonkurve +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), kann mit L(H) in Farbe und Licht verwendet werden. +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal': die Kurve L=f(L) verwendet den selben Algorithmus wie der Helligkeitsregler. +TP_LOCALLAB_CURVES_CIE;Tonkurve +TP_LOCALLAB_CURVNONE;Kurven deaktivieren +TP_LOCALLAB_DARKRETI;Dunkelheit +TP_LOCALLAB_DEHAFRA;Dunst entfernen +TP_LOCALLAB_DEHAZ;Intensität +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Entfernt atmosphärischen Dunst. Erhöht Sättigung und Details.\nKann einen Farbstich entfernen, aber auch einen Blaustich hinzufügen, der wiederum mit anderen Werkzeugen wieder entfernt werden kann. +TP_LOCALLAB_DEHAZ_TOOLTIP;Negative Werte fügen Dunst hinzu. +TP_LOCALLAB_DELTAD;Ebenenbalance +TP_LOCALLAB_DELTAEC;ΔE-Bildmaske +TP_LOCALLAB_DENOI1_EXP;Rauschreduzierung auf Luminanz-Maske +TP_LOCALLAB_DENOI2_EXP;Wiederherstellung auf Luminanz-Maske +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Ermöglicht Impulsrauschen zu reduzieren oder auch 'Salz-& Pfefferrauschen'. +TP_LOCALLAB_DENOICHROC_TOOLTIP;Ermöglicht den Umgang mit Flecken und Rauschen. +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Ermöglicht die Wiederherstellung von Chrominanz-Details durch schrittweise Anwendung einer Fourier-Transformation (DCT). +TP_LOCALLAB_DENOICHROF_TOOLTIP;Ermöglicht die Detailjustierung von Chrominanz-Rauschen +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Ermöglicht das Reduzieren von Chrominanz-Rauschen in Richtung Blau/Gelb oder Rot/Grün. +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Ermöglicht das Reduzieren von Rauschen entweder in den Schatten oder in den Lichtern. +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Ermöglicht die Wiederherstellung von Luminanz-Details durch schrittweise Anwendung einer Fourier-Transformation (DCT). +TP_LOCALLAB_DENOIMASK;Maske Farbrauschen reduzieren +TP_LOCALLAB_DENOIMASK_TOOLTIP;Für alle Werkzeuge, ermöglicht die Kontrolle des chromatischen Rauschens der Maske.\nNützlich für eine bessere Kontrolle der Chrominanz und Vermeidung von Artefakten bei Verwendung der LC(h)-Kurve. +TP_LOCALLAB_DENOIQUA_TOOLTIP;Im konservativen Modus werden Niedrigfrequenz-Details erhalten. Im aggressiven Modus werden diese entfernt.\nBeide Modi verwenden Wavelets und DCT und können in Verbindung mit 'Nicht-lokales Mittel - Luminanz' verwendet werden. +TP_LOCALLAB_DENOITHR_TOOLTIP;Korrigiert die Kantenerkennung, um die Rauschreduktion in Bereichen mit geringen Kontrasten zu unterstützen. +TP_LOCALLAB_DENOI_EXP;Rauschreduzierung +TP_LOCALLAB_DENOI_TOOLTIP;Dieses Modul kann zur Rauschreduktion entweder (am Ende der Prozess-Pipeline) selbständig verwendet werden oder in Verbindung mit der Rauschreduzierung im Menureiter 'Detail' (das am Anfang der Prozess-Pipeline arbeitet) .\nBereich ermöglicht eine differenzierte Einstellung basierend auf Farbe (ΔE).\nMinimale RT-Spotgröße: 128x128 +TP_LOCALLAB_DEPTH;Tiefe +TP_LOCALLAB_DETAIL;Lokaler Kontrast +TP_LOCALLAB_DETAILFRA;Kantenerkennung DCT +TP_LOCALLAB_DETAILSH;Details +TP_LOCALLAB_DETAILTHR;Schwelle Luminanz-Chrominanz-Detail +TP_LOCALLAB_DIVGR;Gamma +TP_LOCALLAB_DUPLSPOTNAME;Kopie +TP_LOCALLAB_EDGFRA;Kantenschärfe +TP_LOCALLAB_EDGSHOW;Alle Werkzeuge anzeigen +TP_LOCALLAB_ELI;Ellipse +TP_LOCALLAB_ENABLE_AFTER_MASK;Tonwertkorrektur anwenden +TP_LOCALLAB_ENABLE_MASK;Maske aktivieren +TP_LOCALLAB_ENABLE_MASKAFT;alle Belichtungs-Algorithmen verwenden +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;Wenn aktiviert, verwendet die Maske 'Wiederhergestellte Daten' nach Übertragungszuordnung anstelle von Originaldaten. +TP_LOCALLAB_ENH;Erweitert +TP_LOCALLAB_ENHDEN;Erweitert + chromatische Rauschreduzierung +TP_LOCALLAB_EPSBL;Detail +TP_LOCALLAB_EQUIL;Luminanz normalisieren +TP_LOCALLAB_EQUILTM_TOOLTIP;Rekonstruiert Lichter so, dass Mittel und Abweichungen der Bildausgabe identisch sind mit denen des Originals. +TP_LOCALLAB_ESTOP;Kantenempfindlichkeit +TP_LOCALLAB_EV_DUPL;Kopie von +TP_LOCALLAB_EV_NVIS;Ausblenden +TP_LOCALLAB_EV_NVIS_ALL;Alle ausblenden +TP_LOCALLAB_EV_VIS;Zeigen +TP_LOCALLAB_EV_VIS_ALL;Alle zeigen +TP_LOCALLAB_EXCLUF;Ausschließend +TP_LOCALLAB_EXCLUF_TOOLTIP;Der 'Ausschlussmodus' verhindert, dass benachbarte Punkte bestimmte Teile des Bildes beeinflussen. Durch Anpassen von 'Bereich' wird der Farbbereich erweitert.\nSie können einem Ausschluss-Spot auch Werkzeuge hinzufügen und diese auf die gleiche Weise wie für einen normalen Punkt verwenden. +TP_LOCALLAB_EXCLUTYPE;Art des Spots +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Der normale Spot verwendet rekursive Daten.\n\nDer ausschließende Spot reinitialisiert alle lokalen Anpassungen.\nEr kann ganz oder partiell angewendet werden, um vorherige lokale Anpassungen zu relativieren oder zurückzusetzen.\n\n'Ganzes Bild' erlaubt lokale Anpassungen auf das gesamte Bild.\nDie RT Spot-Begrenzung wird außerhalb der Vorschau gesetzt.\nDer Übergangswert wird auf 100 gesetzt.\nMöglicherweise muss der RT-Spot neu positioniert oder in der Größe angepasst werden, um das erwünschte Ergebnis zu erzielen.\nAchtung: Die Anwendung von Rauschreduzierung, Wavelet oder schnelle Fouriertransformation im 'Ganzes Bild-Modus' benötigt viel Speicher und Rechenleistung und könnte bei schwachen Systemen zu unerwünschtem Abbruch oder Abstürzen führen. +TP_LOCALLAB_EXECLU;Ausschließender Spot +TP_LOCALLAB_EXFULL;Gesamtes Bild +TP_LOCALLAB_EXNORM;Normaler Spot +TP_LOCALLAB_EXPCBDL_TOOLTIP;Kann zur Entfernung von Sensorflecken oder Objektivfehlern verwendet werden, indem Kontrast auf der entsprechenden Detailebene verringert wird. +TP_LOCALLAB_EXPCHROMA;Kompensation Farbsättigung +TP_LOCALLAB_EXPCHROMA_TOOLTIP;In Verbindung mit 'Belichtungskorrektur' und 'Kontrastdämpfung' kann eine Entsättigung der Farben vermieden werden. +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Passt Farbe, Luminanz, Kontrast an und korrigiert kleinere Defekte, wie rote Augen, Sensorstaub etc. +TP_LOCALLAB_EXPCOMP;Belichtungsausgleich ƒ +TP_LOCALLAB_EXPCOMPINV;Belichtungsausgleich +TP_LOCALLAB_EXPCOMP_TOOLTIP;Für Porträts oder Bilder mit geringem Farbverlauf. Sie können 'Formerkennung' unter 'Einstellungen' ändern:\n\nErhöhen Sie den 'ΔE-Bereichsschwellenwert'\nReduzieren Sie 'ΔE-Zerfallrate'\nErhöhen Sie 'ab-L-Balance (ΔE)'. +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;Siehe Dokumentation für Wavelet Levels.\nEs gibt einige Unterschiede in der Version der lokalen Einstellungen: mehr Werkzeuge und mehr Möglichkeiten an individuellen Detailebenen zu arbeiten.\nz.B. Wavelet-Level-Tonwertkorrektur. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Vermeiden Sie zu kleine Spots (<32 x 32 Pixel).\nVerwenden Sie niedrige 'Übergangswerte' und hohe Werte für 'Übergangszerfallrate' und 'Bereich,' um kleine RT-Spots zu simulieren und Fehler zu beheben.\nVerwenden Sie 'Klarheit & Schärfemaske und Überlagern & Abschwächen' wenn nötig, indem Sie den 'Radius' anpassen, um Artefakte zu reduzieren. +TP_LOCALLAB_EXPCURV;Kurven +TP_LOCALLAB_EXPGRAD;Verlaufsfilter +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;Verlaufsfilter stehen in den folgenden Werkzeugen zur Verfügung: 'Farbe und Licht (Luminanz, Chrominanz, Farbtonverlauf, und Zusammenführen)', 'Belichtung (Luminanz grad.)', 'Belichtungsmaske (Luminanz grad.)', 'Schatten/Lichter (Luminanz grad.)', 'Dynamik (Luminanz, Chrominanz & Farbton)', 'Lokaler Kontrast & Wavelet Pyramide (lokaler Kontrast grad.)'.\nDer Zerfall wird in den Einstellungen definiert. +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Ändert die Mischung von geändertem/ursprünglichem Bild. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Verändert das Verhalten des Bildes mit wenig oder zu wenig Kontrast, indem vorher eine Gammakurve und nachher eine Laplace-Transformation hinzugefügt werden. +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Verändert das Verhalten unterbelichteter Bilder indem eine lineare Komponente vor Anwendung der Laplace-Transformation hinzugefügt wird. +TP_LOCALLAB_EXPLAP_TOOLTIP;Regler nach rechts reduziert schrittweise den Kontrast. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Ermöglicht die Verwendung von GIMP oder Photoshop(c)-Ebenen-Mischmodi wie Differenz, Multiplikation, Weiches Licht, Überlagerung etc., mit Transparenzkontrolle.\nOriginalbild: Führe aktuellen RT-Spot mit Original zusammen.\nVorheriger Spot: Führe aktuellen RT-Spot mit vorherigem zusammen - bei nur einem vorherigen = Original.\nHintergrund: Führe aktuellen RT-Spot mit einem Farb- oder Luminanzhintergrund zusammen (weniger Möglichkeiten). +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Wendet einen Median-Filter vor der Laplace-Transformation an, um (Rausch-)Artefakte zu vermeiden.\nAlternativ kann das Werkzeug zur Rauschreduzierung angewendet werden. +TP_LOCALLAB_EXPOSE;Dynamik und Belichtung +TP_LOCALLAB_EXPOSURE_TOOLTIP;Anpassung der Belichtung im L*a*b-Raum mittels Laplace PDE-Algorithmus um ΔE zu berücksichtigen und Artefakte zu minimieren. +TP_LOCALLAB_EXPRETITOOLS;Erweiterte Retinex Werkzeuge +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot-Minimum 39 * 39.\nVerwenden Sie niedrige Übergangswerte und hohe Werte für 'Zerfallrate' und 'Bereich', um kleinere RT-Spots zu simulieren. +TP_LOCALLAB_EXPTOOL;Belichtungswerkzeuge +TP_LOCALLAB_EXP_TOOLNAME;Dynamik und Belichtung +TP_LOCALLAB_FATAMOUNT;Intensität +TP_LOCALLAB_FATANCHOR;Versatz +TP_LOCALLAB_FATDETAIL;Detail +TP_LOCALLAB_FATFRA;Dynamikkompression +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - es wird der Fattal-Algorithmus zur Tonwertkorrektur angewendet. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATSHFRA;Maske für den Bereich der Dynamikkompression +TP_LOCALLAB_FEATH_TOOLTIP;Verlaufsbreite als Prozentsatz der Spot-Diagonalen.\nWird von allen Verlaufsfiltern in allen Werkzeugen verwendet.\nKeine Aktion, wenn kein Verlaufsfilter aktiviert wurde. +TP_LOCALLAB_FEATVALUE;Verlaufsbreite +TP_LOCALLAB_FFTCOL_MASK;Schnelle Fouriertransformation +TP_LOCALLAB_FFTMASK_TOOLTIP;Nutzt eine Fourier-Transformation für eine bessere Qualität (auf Kosten einer erhöhten Verarbeitungszeit und Speicheranforderungen). +TP_LOCALLAB_FFTW;Schnelle Fouriertransformation +TP_LOCALLAB_FFTWBLUR;Schnelle Fouriertransformation +TP_LOCALLAB_FULLIMAGE;Schwarz-Ev und Weiß-Ev für das gesamte Bild +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Berechnet die Ev-Level für das gesamte Bild. +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMC;Gamma +TP_LOCALLAB_GAMCOL_TOOLTIP;Gamma auf Luminanz L*a*b*-Daten anwenden.\nWenn Gamma = 3 wird Luminanz 'linear' angewendet. +TP_LOCALLAB_GAMC_TOOLTIP;Gamma auf Luminanz L*a*b*-Daten vor und nach der Behandlung von Pyramide 1 und Pyramide 2 anwenden.\nWenn Gamma = 3 wird Luminanz linear angewendet. +TP_LOCALLAB_GAMFRA;Farbtonkennlinie +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;'Gamma' und 'Bereich' erlauben eine weiche und artefaktfreie Transformation der Maske, indem 'L' schrittweise geändert wird, um Diskontinuitäten zu vermeiden. +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GAMW;Gamma (Wavelet Pyramiden) +TP_LOCALLAB_GRADANG;Rotationswinkel +TP_LOCALLAB_GRADANG_TOOLTIP;Rotationswinkel in Grad: -180° 0° +180° +TP_LOCALLAB_GRADFRA;Verlaufsfiltermaske +TP_LOCALLAB_GRADGEN_TOOLTIP;Passt die Intensität des Luminanzverlaufes an. +TP_LOCALLAB_GRADLOGFRA;Verlaufsfilter Luminanz +TP_LOCALLAB_GRADSTR;Verlaufsintensität +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Passt die Intensität des Farbsättigungsverlaufes an. +TP_LOCALLAB_GRADSTRCHRO;Intensität des Chrominanz-Verlaufes +TP_LOCALLAB_GRADSTRHUE;Intensität des Farbton-Verlaufes +TP_LOCALLAB_GRADSTRHUE2;Intensität des Farbton-Verlaufes +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Passt die Intensität des Farbton-Verlaufes an. +TP_LOCALLAB_GRADSTRLUM;Intensität des Luminanz-Verlaufes +TP_LOCALLAB_GRAINFRA;Film-Körnung +TP_LOCALLAB_GRAINFRA2;Rauigkeit +TP_LOCALLAB_GRAIN_TOOLTIP;Fügt Film-ähnliches Korn hinzu. +TP_LOCALLAB_GRALWFRA;Verlaufsfilter (Lokaler Kontrast) +TP_LOCALLAB_GRIDFRAME_TOOLTIP;Dieses Werkzeug kann als Pinsel verwendet werden. Stellen Sie einen kleinen Spot ein und passen Sie 'Übergang' und 'Übergangszerfall' an.\nIm Modus NORMAL werden Farbton, Sättigung, Farbe und Leuchtkraft durch 'Hintergrund zusammenführen (ΔE)' beeinflusst. +TP_LOCALLAB_GRIDMETH_TOOLTIP;Farbtonung: Die Luminanz wird bei der Änderung der Chrominanz berücksichtigt. Entspricht H=f (H), wenn der 'weiße Punkt' im Raster auf Null bleibt und nur der 'schwarze Punkt' verändert wird. Entspricht 'Farbton', wenn beide Punkte verändert werden.\n\nDirekt: Wirkt direkt auf die Chrominanz. +TP_LOCALLAB_GRIDONE;Farbtönung +TP_LOCALLAB_GRIDTWO;Direkt +TP_LOCALLAB_GUIDBL;Radius +TP_LOCALLAB_GUIDBL_TOOLTIP;Wendet einen anpassbaren Filter mit einstellbarem Radius an. Ermöglicht das Reduzieren von Artefakten oder das Verwischen des Bildes. +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Ändert die Verteilungsfunktion des anpassbaren Filters. Negative Werte simulieren eine Gauß'sche Unschärfe. +TP_LOCALLAB_GUIDFILTER;Anpassbarer Filter Radius +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Kann Artefakte reduzieren oder verstärken. +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensität des anpassbaren Filters. +TP_LOCALLAB_HHMASK_TOOLTIP;Feine Farbtonabstimmung z.B. für Hauttöne. +TP_LOCALLAB_HIGHMASKCOL;Lichter +TP_LOCALLAB_HLH;Kurven H +TP_LOCALLAB_HUECIE;Farbton +TP_LOCALLAB_IND;Unabhängig (Maus) +TP_LOCALLAB_INDSL;Unabhängig (Maus + Regler) +TP_LOCALLAB_INVBL;Invertieren +TP_LOCALLAB_INVBL_TOOLTIP;Alternative zum 'Invertieren': Zwei Spots\nErster Spot:\nGanzes Bild - Trennzeichen außerhalb der Vorschau\nRT-Spot-Form: Rechteck. Übergang 100\n\nZweiter Spot: Ausschließender Spot +TP_LOCALLAB_INVERS;Invertieren +TP_LOCALLAB_INVERS_TOOLTIP;Weniger Möglichkeiten, wenn aktiviert (Invertieren).\n\nAlternative: zwei Spots\nErster Spot:\nGanzes Bild -\nTrennzeichen außerhalb der Vorschau\nRT-Spot-Form: Rechteck. Übergang 100\n\nZweiter Spot: Ausschließender Spot\ninvertieren deaktiviert dieses Werkzeug für den Bereich außerhalb des Spots, während der Bereich innerhalb des Spots vom Werkzeug unberührt bleibt. +TP_LOCALLAB_INVMASK;Invertierter Algorithmus +TP_LOCALLAB_ISOGR;Verteilung (ISO) +TP_LOCALLAB_JAB;Schwarz-Ev & Weiß-Ev verwenden +TP_LOCALLAB_JABADAP_TOOLTIP;Vereinheitliche Wahrnehmungsanpassung.\nPasst automatisch das Verhältnis zwischen Jz und Sättigung unter Berücksichtigung der 'absoluten Leuchtdichte' an. +TP_LOCALLAB_JZ100;Jz Referenz 100cd/m2 +TP_LOCALLAB_JZ100_TOOLTIP;Passt automatisch den Referenz-Jz-Pegel von 100 cd/m2 (Bildsignal) an.\nÄndert den Sättigungspegel und die Aktion der 'PU-Anpassung' (Perceptual Uniform Adaption). +TP_LOCALLAB_JZADAP;PU Anpassung +TP_LOCALLAB_JZCH;Chroma +TP_LOCALLAB_JZCHROM;Chroma +TP_LOCALLAB_JZCLARICRES;Chroma zusammenführen Cz +TP_LOCALLAB_JZCLARILRES;Luma zusammenführen Jz +TP_LOCALLAB_JZCONT;Kontrast +TP_LOCALLAB_JZFORCE;Erzwinge max. Jz auf 1 +TP_LOCALLAB_JZFORCE_TOOLTIP;Ermöglicht, den Jz-Wert für eine bessere Regler- und Kurvenreaktion auf 1 anzuheben. +TP_LOCALLAB_JZFRA;Jz Cz Hz Bildanpassungen +TP_LOCALLAB_JZHFRA;Kurven Hz +TP_LOCALLAB_JZHJZFRA;Kurve Jz(Hz) +TP_LOCALLAB_JZHUECIE;Farbton +TP_LOCALLAB_JZLIGHT;Helligkeit +TP_LOCALLAB_JZLOG;LOG-Kodierung Jz +TP_LOCALLAB_JZLOGWBS_TOOLTIP;Die Anpassungen von Schwarz-Ev und Weiß-Ev können unterschiedlich sein, je nachdem, ob LOG-Kodierung oder Sigmoid verwendet wird.\nFür Sigmoid kann eine Änderung (in den meisten Fällen eine Erhöhung) von Weiß-Ev erforderlich sein, um eine bessere Wiedergabe von Glanzlichtern, Kontrast und Sättigung zu erhalten. +TP_LOCALLAB_JZLOGWB_TOOLTIP;Wenn Auto aktiviert ist, werden die Ev-Werte und die 'mittlere Leuchtdichte Yb%' für den Spotbereich berechnet und angepasst. Die resultierenden Werte werden von allen Jz-Vorgängen verwendet, einschließlich 'LOG-Kodierung Jz'.\nBerechnet auch die absolute Leuchtdichte zum Zeitpunkt der Aufnahme. +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb ist die relative Helligkeit des Hintergrunds, ausgedrückt als Prozentsatz von Grau. 18 % Grau entspricht einer Hintergrundhelligkeit von 50 %, ausgedrückt in CIE L.\nDie Daten basieren auf der mittleren Helligkeit des Bildes.\nBei Verwendung mit LOG-Kodierung wird die mittlere Helligkeit verwendet, um die erforderliche Verstärkung zu bestimmen, die dem Signal vor der LOG-Kodierung hinzugefügt werden muss. Niedrigere Werte der mittleren Helligkeit führen zu einer erhöhten Verstärkung. +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (Modus 'Erweitert'). Nur funktionsfähig, wenn das Ausgabegerät (Monitor) HDR ist (Spitzenleuchtdichte höher als 100 cd/m2 - idealerweise zwischen 4000 und 10000 cd/m2. Schwarzpunktleuchtdichte unter 0,005 cd/m2). Dies setzt voraus, dass\na) das ICC-PCS für den Bildschirm Jzazbz (oder XYZ) verwendet,\nb) mit echter Präzision arbeitet,\nc) dass der Monitor kalibriert ist (möglichst mit einem DCI-P3- oder Rec-2020-Farbraum),\nd) dass das übliche Gamma (sRGB oder BT709) durch eine Perceptual Quantiser (PQ)-Funktion ersetzt wird. +TP_LOCALLAB_JZPQFRA;Jz Zuordnung +TP_LOCALLAB_JZPQFRA_TOOLTIP;Ermöglicht, den Jz-Algorithmus wie folgt an eine SDR-Umgebung oder an die Eigenschaften (Leistung) einer HDR-Umgebung anzupassen:\na) Bei Luminanzwerten zwischen 0 und 100 cd/m2 verhält sich das System so, als ob es sich in einer SDR-Umgebung befände .\nb) für Luminanzwerte zwischen 100 und 10000 cd/m2 können Sie den Algorithmus an die HDR-Eigenschaften des Bildes und des Monitors anpassen.\n\nWenn 'PQ - Peak Luminance' auf 10000 eingestellt ist, verhält sich 'Jz Zuordnung' genauso wie der ursprüngliche Jzazbz-Algorithmus. +TP_LOCALLAB_JZPQREMAP;PQ - Peak Luminanz +TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - ermöglicht die Änderung der internen PQ-Funktion (normalerweise 10000 cd/m2 - Standard 120 cd/m2).\nKann zur Anpassung an verschiedene Bilder, Prozesse und Geräte verwendet werden. +TP_LOCALLAB_JZQTOJ;Relative Helligkeit +TP_LOCALLAB_JZQTOJ_TOOLTIP;Ermöglicht die Verwendung von 'Relative Leuchtdichte' anstelle von 'Absolute Leuchtdichte'.\nDie Änderungen wirken sich auf: den Schieberegler 'Helligkeit', den Schieberegler 'Kontrast' und die Jz(Jz)-Kurve aus. +TP_LOCALLAB_JZSAT;Sättigung +TP_LOCALLAB_JZSHFRA;Schatten/Lichter Jz +TP_LOCALLAB_JZSOFTCIE;Radius (anpassbarer Filter) +TP_LOCALLAB_JZSTRSOFTCIE;Intensität anpassbarer Filter +TP_LOCALLAB_JZTARGET_EV;Ansicht mittlere Helligkeit (Yb%) +TP_LOCALLAB_JZTHRHCIE;Schwellenwert Chroma für Jz(Hz) +TP_LOCALLAB_JZWAVEXP;Wavelet Jz +TP_LOCALLAB_LABBLURM;Unschärfemaske +TP_LOCALLAB_LABEL;Lokale Anpassungen +TP_LOCALLAB_LABGRID;Farbkorrektur +TP_LOCALLAB_LABGRIDMERG;Hintergrund +TP_LOCALLAB_LABGRID_VALUES;oben(a)=%1\noben(b)=%2\nunten(a)=%3\nunten(b)=%4 +TP_LOCALLAB_LABSTRUM;Strukturmaske +TP_LOCALLAB_LAPLACC;ΔØ Maske Laplace löst PDE +TP_LOCALLAB_LAPLACE;Schwellenwert Laplace ΔE +TP_LOCALLAB_LAPLACEXP;Schwellenwert Laplace +TP_LOCALLAB_LAPMASKCOL;Schwellenwert Laplace +TP_LOCALLAB_LAPRAD1_TOOLTIP;Erhöht den Kontrast der Maske, indem die Luminanzwerte hellerer Bereiche erhöht werden. Kann in Verbindung mit den L(L) und LC(H) Kurven verwendet werden. +TP_LOCALLAB_LAPRAD2_TOOLTIP;'Radius' nutzt einen anpassbaren Filter, um Artefakte zu reduzieren und den Übergang zu glätten. +TP_LOCALLAB_LAPRAD_TOOLTIP;'Radius' nutzt einen anpassbaren Filter, um Artefakte zu reduzieren und den Übergang zu glätten. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Löst die PDE für alle Laplace-Masken.\nWenn aktiviert, reduziert die Laplace-Schwellenwertmaske Artefakte und glättet das Ergebnis.\nLinear, wenn deaktiviert. +TP_LOCALLAB_LC_FFTW_TOOLTIP;Die schnelle Fouriertransformation verbessert die Qualität und ermöglicht die Verwendung großer Radien, erhöht jedoch die Verarbeitungszeit (abhängig vom zu verarbeitenden Bereich). Vorzugsweise nur für große Radien verwenden. Die Größe des Bereichs kann um einige Pixel reduziert werden, um die schnelle Fouriertransformation zu optimieren. Dies kann die Verarbeitungszeit um den Faktor 1,5 bis 10 reduzieren. +TP_LOCALLAB_LC_TOOLNAME;Lokaler Kontrast u. Wavelets +TP_LOCALLAB_LEVELBLUR;Maximum +TP_LOCALLAB_LEVELWAV;Wavelet Ebenen +TP_LOCALLAB_LEVELWAV_TOOLTIP;Die Ebene wird automatisch an die Größe des Spots und die Vorschau angepasst.\nVon Ebene 9 Größe max=512 bis Ebene 1 Größe max= 4. +TP_LOCALLAB_LEVFRA;Ebenen +TP_LOCALLAB_LIGHTNESS;Helligkeit +TP_LOCALLAB_LIGHTN_TOOLTIP;Im inversen Modus: Auswahl = -100 erzwingt Luminanz = 0 +TP_LOCALLAB_LIGHTRETI;Helligkeit +TP_LOCALLAB_LINEAR;Linearität +TP_LOCALLAB_LIST_NAME;Werkzeug zum aktiven Spot hinzufügen... +TP_LOCALLAB_LIST_TOOLTIP;Es gibt für jedes Werkzeug drei Komplexitätsstufen: Basis, Standard und Erweitert.\nDie Standardeinstellung für alle Werkzeuge ist Basis. Diese Einstellung kann im Fenster 'Einstellungen' geändert werden.\nDie Komplexitätsstufe kann auch für das einzelne Werkzeug während der Bearbeitung geändert werden. +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Ermöglicht, den Effekt auf bestimmte Detailebenen in der Maske zu verringern oder zu erhöhen, indem bestimmte Luminanz-Zonen (im Allgemeinen die hellsten) angesprochen werden. +TP_LOCALLAB_LMASK_LL_TOOLTIP;Ermöglicht das freie Ändern des Kontrasts der Maske.\nHat eine ähnliche Funktion wie die Regler 'Gamma' und 'Neigung'.\nMit dieser Funktion können Sie bestimmte Bereiche des Bildes (normalerweise die hellsten Bereiche der Maske) anvisieren, indem mit Hilfe der Kurve dunklere Bereiche ausgeschlossen werden). Kann Artefakte erzeugen. +TP_LOCALLAB_LOCCONT;Unschärfemaske +TP_LOCALLAB_LOC_CONTRAST;Lokaler Kontrast u. Wavelets +TP_LOCALLAB_LOC_CONTRASTPYR;Pyramide 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramide 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB;Ebenenkontrast - Tonwertkorrektur - Direktionaler Kontrast +TP_LOCALLAB_LOC_CONTRASTPYRLAB;Verlaufsfilter - Kantenschärfung - Unschärfe +TP_LOCALLAB_LOC_RESIDPYR;Restbild +TP_LOCALLAB_LOG;LOG-Kodierung +TP_LOCALLAB_LOG1FRA;CAM16 Bildkorrekturen +TP_LOCALLAB_LOG2FRA;Betrachtungsbedingungen +TP_LOCALLAB_LOGAUTO;Automatisch +TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Berechnet automatisch die 'Mittlere Luminanz' für die Szenenbedingungen. +TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Berechnet automatisch die 'Mittlere Luminanz' für die Szenenbedingungen, wenn die Schaltfläche 'Automatisch' in 'Relative Belichtungsebenen' gedrückt wird. +TP_LOCALLAB_LOGAUTO_TOOLTIP;Mit Drücken dieser Taste werden der 'Dynamikbereich' und die 'Mittlere Luminanz' für die Szenenbedingungen berechnet, wenn die Option 'Automatische mittlere Luminanz (Yb%)' aktiviert ist.\nBerechnet auch die absolute Luminanz zum Zeitpunkt der Aufnahme.\nDrücken Sie die Taste erneut, um die automatisch berechneten Werte anzupassen. +TP_LOCALLAB_LOGBASE_TOOLTIP;Standard = 2.\nWerte unter 2 reduzieren die Wirkung des Algorithmus, wodurch die Schatten dunkler und die Glanzlichter heller werden.\nMit Werten über 2 sind die Schatten grauer und die Glanzlichter werden verwaschener. +TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatische Anpassung ermöglicht, eine Farbe entsprechend ihrer räumlich-zeitlichen Umgebung zu interpretieren.\nNützlich, wenn der Weißabgleich weit von Referenz D50 entfernt ist.\nPasst Farben an das Leuchtmittel des Ausgabegeräts an. +TP_LOCALLAB_LOGCIE;LOG-Kodierung statt Sigmoid +TP_LOCALLAB_LOGCIE_TOOLTIP;Ermöglicht die Verwendung von 'Schwarz-Ev', 'Weiß-Ev', 'Szenen-Mittlere-Leuchtdichte (Yb%)' und 'sichtbare mittlere Leuchtdichte (Yb%)' für die Tonzuordnung mit 'LOG-Kodierung Q'. +TP_LOCALLAB_LOGCOLORFL;Buntheit (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Wahrgenommene Intensität des Farbtones im Vergleich zu Grau.\nAnzeige, dass ein Reiz mehr oder weniger farbig erscheint. +TP_LOCALLAB_LOGCONQL;Kontrast (Q) +TP_LOCALLAB_LOGCONTHRES;Schwellenwert Kontrast (J & Q) +TP_LOCALLAB_LOGCONTL;Kontrast (J) +TP_LOCALLAB_LOGCONTL_TOOLTIP;Der Kontrast (J) in CIECAM16 berücksichtigt die Zunahme der wahrgenommenen Färbung mit der Luminanz. +TP_LOCALLAB_LOGCONTQ_TOOLTIP;Der Kontrast (Q) in CIECAM16 berücksichtigt die Zunahme der wahrgenommenen Färbung mit der Helligkeit. +TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Passt den Kontrastbereich (J & Q) der Mitteltöne an.\nPositive Werte verringern den Effekt der Kontrastregler (J & Q) schrittweise. Negative Werte erhöhen den Effekt der Kontrastregler zunehmend. +TP_LOCALLAB_LOGDETAIL_TOOLTIP;Wirkt hauptsächlich auf hohe Frequenzen. +TP_LOCALLAB_LOGENCOD_TOOLTIP;Tonwertkorrektur mit logarithmischer Kodierung (ACES).\nNützlich für unterbelichtete Bilder oder Bilder mit hohem Dynamikbereich.\n\nZweistufiger Prozess:\n1) Dynamikbereichsberechnung\n2) Manuelle Anpassung. +TP_LOCALLAB_LOGEXP;Alle Werkzeuge +TP_LOCALLAB_LOGFRA;Szenebasierte Bedingungen +TP_LOCALLAB_LOGFRAME_TOOLTIP;Ermöglicht die Berechnung und Anpassung der Ev-Pegel und der 'Mittleren Luminanz Yb%' (Quellgraupunkt) für den Spot-Bereich. Die resultierenden Werte werden von allen Lab-Vorgängen und den meisten RGB-Vorgängen in der Pipeline verwendet.\nBerechnet auch die absolute Luminanz zum Zeitpunkt der Aufnahme. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Berücksichtigt entsprechende CIECAM-Variablen wie Kontrast (J) und Sättigung (s) aber auch Kontrast (Q) , Helligkeit (Q), Helligkeit (J), Farbigkeit (M) im Modus 'Erweitert'. +TP_LOCALLAB_LOGLIGHTL;Helligkeit (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Ähnlich Helligkeit (L*a*b*), berücksichtigt die Zunahme der wahrgenommenen Färbung. +TP_LOCALLAB_LOGLIGHTQ;Helligkeit (Q) +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Wahrgenommene Lichtmenge, die von einer Quelle ausgeht.\nIndikator dafür, dass eine Quelle mehr oder weniger hell und klar zu sein scheint. +TP_LOCALLAB_LOGLIN;Logarithmischer Modus +TP_LOCALLAB_LOGPFRA;Relative Belichtungsebenen +TP_LOCALLAB_LOGREPART;Gesamtintensität +TP_LOCALLAB_LOGREPART_TOOLTIP;Ermöglicht das Anpassen der relativen Intensität des LOG-kodierten Bildes in Bezug auf das Originalbild.\nKein Effekt auf die CIECAM-Komponente. +TP_LOCALLAB_LOGSATURL_TOOLTIP;Die Sättigung(en) in CIECAM16 entsprechen der Farbe einer Quelle in Bezug auf ihre eigene Helligkeit.\nWirkt hauptsächlich auf mittlere Töne und Lichter. +TP_LOCALLAB_LOGSCENE_TOOLTIP;Entspricht den Aufnahmebedingungen. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Ändert Töne und Farben, um die Szenenbedingungen zu berücksichtigen.\n\n Durchschnitt : Durchschnittliche Lichtbedingungen (Standard). Das Bild ändert sich nicht.\n\n Dim: Gedimmte Bedingungen. Das Bild wird leicht aufgehellt. \n\nDunkel: Dunkle Bedingungen. Das Bild wird aufgehellt. +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Passend zum Medium, auf dem das fertige Bild betrachtet wird (Monitor, TV, Projektor, Drucker, etc.), wie auch die Umgebungsbedingungen. +TP_LOCALLAB_LOG_TOOLNAME;LOG-Kodierung +TP_LOCALLAB_LUM;Kurven LL - CC +TP_LOCALLAB_LUMADARKEST;Dunkelste +TP_LOCALLAB_LUMASK;Hintergrundfarbe für Luminanzmaske +TP_LOCALLAB_LUMASK_TOOLTIP;Passt den Grauton oder die Farbe des Maskenhintergrundes an (Maske und Anpassungen - Maske anzeigen). +TP_LOCALLAB_LUMAWHITESEST;Hellste +TP_LOCALLAB_LUMFRA;L*a*b* Standard +TP_LOCALLAB_MASFRAME;Maskieren und Zusammenführen +TP_LOCALLAB_MASFRAME_TOOLTIP;Für alle Masken.\nBerücksichtigt das ΔE-Bild, um zu vermeiden, dass der Auswahlbereich geändert wird, wenn die folgenden Maskenwerkzeuge verwendet werden: 'Gamma', 'Steigung', 'Chroma', 'Kontrastkurve', 'Lokaler Kontrast' (nach Wavelet-Ebene), 'Unschärfemaske' und 'Strukturmaske' (falls aktiviert).\nDeaktiviert, wenn der Inverse-Modus verwendet wird. +TP_LOCALLAB_MASK;Kontrast +TP_LOCALLAB_MASK2;Kontrastkurve +TP_LOCALLAB_MASKCOM;Normale Farbmaske +TP_LOCALLAB_MASKCOM_TOOLNAME;Normale Farbmaske +TP_LOCALLAB_MASKCOM_TOOLTIP;Ein eigenständiges Werkzeug.\nKann verwendet werden, um das Erscheinungsbild (Chrominanz, Luminanz, Kontrast) und die Textur in Abhängigkeit des Bereiches anzupassen. +TP_LOCALLAB_MASKCURVE_TOOLTIP;Die 3 Kurven sind standardmäßig auf 1 (maximal) eingestellt:\nC=f(C) Die Farbintensität variiert je nach Chrominanz. Sie können die Chrominanz verringern, um die Auswahl zu verbessern. Wenn Sie diese Kurve nahe Null setzen (mit einem niedrigen Wert von C, um die Kurve zu aktivieren), können Sie den Hintergrund im inversen Modus entsättigen.\nL= f(L) Die Luminanz variiert je nach Luminanz, so dass Sie die Helligkeit verringern können um die Auswahl zu verbessern.\nL und C = f(H) Luminanz und Chrominanz variieren mit dem Farbton, sodass Sie Luminanz und Chrominanz verringern können, um die Auswahl zu verbessern. +TP_LOCALLAB_MASKDDECAY;Zerfallrate +TP_LOCALLAB_MASKDECAY_TOOLTIP;Verwaltet die Zerfallrate für die Graustufen in der Maske.\nZerfallrate = 1 linear\nZerfallrate > 1 schärfere parabolische Übergänge\nZerfallrate < 1 allmählichere Übergänge. +TP_LOCALLAB_MASKDEINV_TOOLTIP;Kehrt die Art und Weise um, wie der Algorithmus die Maske interpretiert.\nWenn aktiviert, werden Schwarz und sehr helle Bereiche verringert. +TP_LOCALLAB_MASKDE_TOOLTIP;Wird verwendet, um die Rauschreduzierung als Funktion der in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen einzustellen.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nWenn die Maske unterhalb des Schwellenwertes 'dunkel' oder oberhalb des Schwellenwertes 'hell' liegt, wird die Rauschreduzierung schrittweise angewendet.\nDazwischen bleiben die Bildeinstellungen ohne Rauschreduzierung erhalten, es sei denn, die Regler 'Luminanz-Rauschreduzierung Graubereiche' oder 'Chrominanz-Rauschreduzierung Graubereiche' werden verändert. +TP_LOCALLAB_MASKGF_TOOLTIP;Wird verwendet, um den anpassbaren Filter als Funktion der in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen auszurichten.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nBefindet sich die Maske unterhalb der 'dunklen' oder oberhalb der 'hellen' Schwelle, wird der anpassbare Filter schrittweise angewendet.\nZwischen diesen beiden Bereichen bleiben die Bildeinstellungen ohne anpassbaren Filter erhalten. +TP_LOCALLAB_MASKH;Farbtonkurve +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter der 'Detailebenenkontraste' (nur Luminanz) nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Einstellungen des Detailebenenkontrastes geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die 'Farbe und Licht'-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Strukturmaske' , 'Unschärfemaske', 'Glättradius', 'Gamma', 'Steigung', 'Kontrastkurve', 'Lokaler Kontrast' (Wavelets).\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;Die Rauschreduzierung wird schrittweise von 100% bei der Schwellenwerteinstellung auf 0% beim maximalen Weißwert (wie von der Maske festgelegt) verringert.\nEs können bestimmte Werkzeuge in 'Maske und Anpassungen' verwendet werden, um die Graustufen zu ändern: 'Strukturmaske' , 'Glättradius', 'Gamma', 'Steigung', 'Kontrastkurve' und 'Lokaler Kontrast (Wavelet)'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Einstellungen für 'Dynamik und Belichtung' geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Einstellungen der 'LOG-Kodierung' geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer Retinex-Parameter (nur Luminanz) nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Retinex-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Einstellungen für 'Schatten/Lichter' geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Tone-Mapping-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma' , 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Farbtemperatur-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius' , 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Hellere Tonwertgrenze, oberhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die 'Lokalen Kontrast-' und 'Wavelet-Einstellungen' geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;Der anpassbare Filter wird schrittweise von 100% bei der Schwellenwerteinstellung auf 0% beim maximalen Weißwert (wie von der Maske festgelegt) verringert.\nEs können bestimmte Werkzeuge in 'Maske und Anpassungen' verwendet werden, um die Graustufen zu ändern: 'Strukturmaske', 'Glättradius', 'Gamma', 'Steigung', 'Kontrastkurve', 'Lokaler Kontrast (Wavelet)'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLCTHR;Schwellenwert helle Bereiche +TP_LOCALLAB_MASKLCTHR2;Schwelle helle Bereiche +TP_LOCALLAB_MASKLCTHRLOW;Schwellenwert dunkle Bereiche +TP_LOCALLAB_MASKLCTHRLOW2;Schwelle dunkle Bereiche +TP_LOCALLAB_MASKLCTHRMID;Luminanz Graubereiche +TP_LOCALLAB_MASKLCTHRMIDCH;Chrominanz Graubereiche +TP_LOCALLAB_MASKLC_TOOLTIP;Auf diese Weise können Sie die Rauschreduzierung anhand der in der L(L)- oder LC(H)-Maske (Maske und Anpassungen) enthaltenen Luminanz-Informationen ausrichten.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\n'Luminanzschwelle Dunkle Bereiche': Wenn 'Rauschreduzierung in dunklen und hellen Bereichen verstärken' > 1, wird die Rauschreduzierung schrittweise von 0% bei den Schwellenwerteinstellungen auf 100% beim maximalen Schwarzwert (bestimmt durch die Maske) erhöht.\n'Luminanzschwelle Helle Bereiche': Die Rauschreduzierung wird schrittweise von 100% bei der Schwellenwerteinstellung auf 0% beim maximalen Weißwert (bestimmt durch die Maske) verringert.\nIn dem Bereich zwischen den beiden Schwellenwerten werden die Einstellungen zur Rauschverminderung von der Maske nicht beeinflusst. +TP_LOCALLAB_MASKLNOISELOW;In dunklen und hellen Bereichen verstärken +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter der Detailebenenkontraste (nur Luminanz) nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Einstellungen des Detailebenenkontrastes geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch 'Farbe- und Licht'-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Strukturmaske' , 'Unschärfemaske', 'Glättradius', 'Gamma', 'Steigung', 'Kontrastkurve', 'Lokaler Kontrast (Wavelets)'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;Die Rauschreduzierung wird bei der Einstellung des Schwellenwertes schrittweise von 0% auf 100% beim maximalen Schwarzwert (wie von der Maske festgelegt) erhöht.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Strukturmaske', 'Glättradius', 'Gamma', 'Steigung', 'Kontrastkurve' und ' Lokaler Kontrast(Wavelet)'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass in den 'Einstellungen' Hintergrundfarbmaske = 0 gesetzt ist. +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte wieder hergestellt werden, bevor sie durch die 'Dynamik und Belichtung'-Einstellungen geändert werden.\nSie können die Grauwerte mit verschiedenen Werkzeugen in 'Maske und Anpassungen' ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Einstellungen der 'LOG-Kodierung' geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer Retinex-Parameter (nur Luminanz) nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Retinex-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte wieder hergestellt werden, bevor sie durch die 'Schatten - Lichter'-Einstellungen geändert werden.\n Sie können die Grauwerte mit verschiedenen Werkzeugen in 'Maske und Anpassungen' ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die 'Tone-Mapping'-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma' , 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die Einstellungen für 'Farbtemperatur' geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dunklere Tonwertgrenze, unterhalb derer die Parameter nach und nach auf ihre ursprünglichen Werte zurückgesetzt werden, bevor sie durch die 'Kontrast- und Wavelet'-Einstellungen geändert werden.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Glättradius', 'Gamma', 'Steigung' und 'Kontrastkurve'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;Der anpassbare Filter wird schrittweise von 0% bei der Schwellenwerteinstellung auf 100% beim maximalen Schwarzwert (wie von der Maske festgelegt) erhöht.\nSie können bestimmte Werkzeuge in 'Maske und Anpassungen' verwenden, um die Graustufen zu ändern: 'Strukturmaske', 'Glättradius', 'Gamma und Steigung', 'Kontrastkurve, ' Lokaler Kontrast (Wavelet)'.\nVerwenden Sie einen 'feststellbaren Farbwähler' auf der Maske, um zu sehen, welche Bereiche betroffen sind. Stellen Sie sicher, dass Sie in den Einstellungen 'Hintergrundfarbmaske' = 0 festlegen. +TP_LOCALLAB_MASKRECOL_TOOLTIP;Wird verwendet, um den Effekt der Farb- und Lichteinstellungen basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H) -Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb und oberhalb der entsprechenden Schwellenwerte werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die Einstellungen für Farbe und Licht geändert werden.\nZwischen diesen beiden Bereichen wird der volle Wert der Einstellungen für Farbe und Licht angewendet. +TP_LOCALLAB_MASKRECOTHRES;Schwellenwert Wiederherstellung +TP_LOCALLAB_MASKREEXP_TOOLTIP;Wird verwendet, um den Effekt der Einstellungen für 'Dynamik und Belichtung' basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb der entsprechenden Schwellenwerte werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die Einstellungen 'Dynamik und Belichtung' geändert werden.\nZwischen diesen beiden Bereichen wird der volle Wert der Einstellungen für 'Dynamik und Belichtung' angewendet. +TP_LOCALLAB_MASKRELOG_TOOLTIP;Wird verwendet, um den Effekt der Einstellungen für die LOG-Kodierung basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb und oberhalb der entsprechenden Schwellenwerte werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die LOG-Kodierungseinstellungen geändert werden - kann zur Rekonstruktion von Glanzlichtern durch Farbübertragung verwendet werden.\nZwischen diesen beiden Bereichen wird der volle Wert der Protokoll-Kodierungseinstellungen angewendet. +TP_LOCALLAB_MASKRESCB_TOOLTIP;Wird verwendet, um den Effekt der CBDL-Einstellungen (nur Luminanz) basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb und oberhalb der entsprechenden Schwellenwerte werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die CBDL-Einstellungen geändert werden.\nZwischen diesen beiden Bereichen wird der volle Wert der CBDL-Einstellungen angewendet. +TP_LOCALLAB_MASKRESH_TOOLTIP;Wird verwendet, um den Effekt der Einstellungen für Schatten/Lichter basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb und oberhalb der entsprechenden Schwellenwerte werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die Einstellungen für Schatten/Lichter geändert werden.\nZwischen diesen beiden Bereichen wird der volle Wert der Einstellungen für Schatten/Lichter angewendet. +TP_LOCALLAB_MASKRESRETI_TOOLTIP;Wird verwendet, um den Effekt der Retinex-Einstellungen (nur Luminanz) basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb und oberhalb der entsprechenden Schwellenwerte werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die Retinex-Einstellungen geändert werden.\nZwischen diesen beiden Bereichen wird der volle Wert der Retinex-Einstellungen angewendet. +TP_LOCALLAB_MASKRESTM_TOOLTIP;Wird verwendet, um den Effekt der Tonwertkorrektur-Einstellungen basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske müssen aktiviert sein, um diese Funktion zu verwenden.\nDie Bereiche 'dunkel' und 'hell' unterhalb des Dunkelschwellenwertes und oberhalb des Helligkeitsschwellenwertes werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die Einstellungen der Tonwertkorrektur geändert werden.\nZwischen diesen beiden Bereichen wird der volle Einstellungswert der Tonwertkorrektur angewendet. +TP_LOCALLAB_MASKRESVIB_TOOLTIP;Wird verwendet, um den Effekt der Einstellungen für Lebhaftigkeit und Warm/Kalt basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb und oberhalb des entsprechenden Schwellenwertes werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die Einstellungen Lebhaftigkeit und Farbtemperatur geändert werden.\nZwischen diesen beiden Bereichen wird der volle Wert der Einstellungen für Lebhaftigkeit und Warm/Kalt angewendet. +TP_LOCALLAB_MASKRESWAV_TOOLTIP;Wird verwendet, um den Effekt der Einstellungen für lokalen Kontrast und Wavelet basierend auf den in den L(L)- oder LC(H)-Masken (Maske und Anpassungen) enthaltenen Luminanz-Informationen zu modulieren.\nDie L(L)-Maske oder die LC(H)-Maske muss aktiviert sein, um diese Funktion verwenden zu können.\nDie Bereiche 'dunkel' und 'hell' unterhalb und oberhalb der entsprechenden Schwellenwerte werden schrittweise auf ihre ursprünglichen Werte zurückgesetzt, bevor sie durch die Einstellungen für lokalen Kontrast und Wavelet geändert werden. Zwischen diesen beiden Bereichen wird der volle Wert der Einstellungen für lokalen Kontrast und Wavelet angewendet. +TP_LOCALLAB_MASKUNUSABLE;Maske deaktiviert (siehe Maske u. Anpassungen) +TP_LOCALLAB_MASKUSABLE;Maske aktiviert (siehe Maske u. Anpassungen) +TP_LOCALLAB_MASK_TOOLTIP;Sie können mehrere Masken für ein Werkzeug aktivieren, indem Sie ein anderes Werkzeug aktivieren und nur die Maske verwenden (setzen Sie die Werkzeugregler auf 0).\n\nSie können den RT-Spot auch duplizieren und nahe am ersten Punkt platzieren. Die kleinen Abweichungen in den Punktreferenzen ermöglichen Feineinstellungen. +TP_LOCALLAB_MEDIAN;Median niedrig +TP_LOCALLAB_MEDIANITER_TOOLTIP;Anzahl der aufeinanderfolgenden Iterationen, die vom Medianfilter ausgeführt werden. +TP_LOCALLAB_MEDIAN_TOOLTIP;Sie können Medianwerte im Bereich von 3 x 3 bis 9 x 9 Pixel auswählen. Höhere Werte erhöhen die Rauschreduzierung und Unschärfe. +TP_LOCALLAB_MEDNONE;Keine +TP_LOCALLAB_MERCOL;Farbe +TP_LOCALLAB_MERDCOL;Hintergrund zusammenführen (ΔE) +TP_LOCALLAB_MERELE;Nur aufhellen +TP_LOCALLAB_MERFIV;Addition +TP_LOCALLAB_MERFOR;Farbe abwedeln (dodge) +TP_LOCALLAB_MERFOU;Multiplikation +TP_LOCALLAB_MERGE1COLFRA;Mit Original/Vorher/Hintergrund zusammenführen +TP_LOCALLAB_MERGECOLFRA;Maske: LCh u. Struktur +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Ermöglicht das Erstellen von Masken basierend auf den 3 LCh-Kurven und/oder einem Strukturerkennungsalgorithmus. +TP_LOCALLAB_MERGEMER_TOOLTIP;Berücksichtigt ΔE beim Zusammenführen (äquivalent zu Anwendungsbereich in diesem Fall). +TP_LOCALLAB_MERGEOPA_TOOLTIP;Deckkraft =% des aktuellen Punkts, der mit dem ursprünglichen oder vorherigen Punkt zusammengeführt werden soll.\nKontrastschwelle: Passt das Ergebnis als Funktion des Kontrasts im Originalbild an. +TP_LOCALLAB_MERHEI;Überlagerung +TP_LOCALLAB_MERHUE;Farbton +TP_LOCALLAB_MERLUCOL;Luminanz +TP_LOCALLAB_MERLUM;Helligkeit +TP_LOCALLAB_MERNIN;Bildschirm +TP_LOCALLAB_MERONE;Normal +TP_LOCALLAB_MERSAT;Sättigung +TP_LOCALLAB_MERSEV;Weiches Licht (legacy) +TP_LOCALLAB_MERSEV0;Weiches Licht Illusion +TP_LOCALLAB_MERSEV1;Weiches Licht W3C +TP_LOCALLAB_MERSEV2;Hartes Licht +TP_LOCALLAB_MERSIX;Division +TP_LOCALLAB_MERTEN;Nur Abdunkeln +TP_LOCALLAB_MERTHI;Farbe nachbelichten (burn) +TP_LOCALLAB_MERTHR;Differenz +TP_LOCALLAB_MERTWE;Ausschluss +TP_LOCALLAB_MERTWO;Subtraktion +TP_LOCALLAB_METHOD_TOOLTIP;'Verbessert + Chroma Rauschreduzierung' verlängern die Verarbeitungszeiten erheblich.\nAber sie reduzieren auch Artefakte. +TP_LOCALLAB_MLABEL;Wiederhergestellte Daten Min=%1 Max=%2 +TP_LOCALLAB_MLABEL_TOOLTIP;Die Werte sollten in der Nähe von Min=0 Max=32768 (Log-Modus) liegen, es sind jedoch auch andere Werte möglich. Sie können 'Wiederhergestellte Daten' beschneiden und 'Versatz' anpassen, um sie zu normalisieren.\nStellt Bilddaten ohne Überlagerung wieder her. +TP_LOCALLAB_MODE_EXPERT;Erweitert +TP_LOCALLAB_MODE_NORMAL;Standard +TP_LOCALLAB_MODE_SIMPLE;Basis +TP_LOCALLAB_MRFIV;Hintergrund +TP_LOCALLAB_MRFOU;Vorheriger Spot +TP_LOCALLAB_MRONE;Keine +TP_LOCALLAB_MRTHR;Original Bild +TP_LOCALLAB_MULTIPL_TOOLTIP;Weitbereichs-Toneinstellung: -18 EV bis + 4 EV. Der erste Regler wirkt auf sehr dunkle Töne zwischen -18 EV und -6 EV. Der letzte Regler wirkt auf helle Töne bis zu 4 EV. +TP_LOCALLAB_NEIGH;Radius +TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Niedrigere Werte bewahren Details und Textur, höhere Werte erhöhen die Rauschunterdrückung.\nIst Gamma = 3, wird Luminanz 'linear' angewendet. +TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Passt die Intensität der Rauschreduzierung an die Größe der zu verarbeitenden Objekte an. +TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Höhere Werte erhöhen die Rauschreduzierung auf Kosten der Verarbeitungszeit. +TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detailwiederherstellung' basiert auf einer Laplace-Transformation, um einheitliche Bereiche und keine Bereiche mit Details zu erfassen. +TP_LOCALLAB_NLDET;Detailwiederherstellung +TP_LOCALLAB_NLFRA;Nicht-lokales Mittel - Luminanz +TP_LOCALLAB_NLFRAME_TOOLTIP;Nicht-lokales Mittel bedeutet, dass bei der Rauschreduzierung ein Mittelwert aller Pixel im Bild verwendet wird, gewichtet danach, wie ähnlich sie dem Zielpixel sind.\nReduziert den Detailverlust im Vergleich zu lokalen Mittelwertalgorithmen.\nBei dieser Methode wird nur das Luminanz-Rauschen berücksichtigt. Chrominanz-Rauschen wird am besten mit Wavelets und Fourier-Transformationen (DCT) verarbeitet.\nKann in Verbindung mit 'Luminanz-Rauschreduzierung nach Ebenen' oder alleine verwendet werden. +TP_LOCALLAB_NLGAM;Gamma +TP_LOCALLAB_NLLUM;Intensität +TP_LOCALLAB_NLPAT;Maximale Objektgröße +TP_LOCALLAB_NLRAD;Maximaler Radius +TP_LOCALLAB_NOISECHROCOARSE;Grobe Chrominanz +TP_LOCALLAB_NOISECHROC_TOOLTIP;Wenn der Wert über Null liegt, ist ein Algorithmus mit hoher Qualität aktiviert.\nGrob ist für Regler > = 0,02 +TP_LOCALLAB_NOISECHRODETAIL;Chrominanz Detailwiederherstellung +TP_LOCALLAB_NOISECHROFINE;Feine Chrominanz +TP_LOCALLAB_NOISEGAM;Gamma +TP_LOCALLAB_NOISEGAM_TOOLTIP;Ist Gamma = 1 wird Luminanz 'Lab' angewendet. Ist Gamma = 3 wird Luminanz 'linear' angewendet.\nNiedrige Werte erhalten Details und Texturen, höhere Werte erhöhen die Rauschminderung. +TP_LOCALLAB_NOISELEQUAL;Equalizer Weiß-Schwarz +TP_LOCALLAB_NOISELUMCOARSE;Grobe Luminanz +TP_LOCALLAB_NOISELUMDETAIL;Luminanz Detailwiederherstellung +TP_LOCALLAB_NOISELUMFINE;Feine Luminanz +TP_LOCALLAB_NOISELUMFINETWO;Feine Luminanz 2 +TP_LOCALLAB_NOISELUMFINEZERO;Feine Luminanz 0 +TP_LOCALLAB_NOISEMETH;Rauschreduzierung +TP_LOCALLAB_NOISE_TOOLTIP;Fügt Luminanz-Rauschen hinzu. +TP_LOCALLAB_NONENOISE;Keine +TP_LOCALLAB_NUL_TOOLTIP;. +TP_LOCALLAB_OFFS;Versatz +TP_LOCALLAB_OFFSETWAV;Versatz +TP_LOCALLAB_OPACOL;Deckkraft +TP_LOCALLAB_ORIGLC;Nur mit dem Ursprungsbild zusammenführen +TP_LOCALLAB_ORRETILAP_TOOLTIP;Ändert ΔE vor Änderungen durch 'Bereich'. Auf diese Weise kann die Aktion für verschiedene Teile des Bildes unterschieden werden (z.B. in Bezug auf den Hintergrund). +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Wirkt basierend auf dem Laplace-Schwellwert. Je höher die Werte, desto stärker werden die Kontrastunterschiede verringert. +TP_LOCALLAB_PASTELS2;Lebhaftigkeit +TP_LOCALLAB_PDE;Kontrastdämpfung - Dynamikbereich Kompression +TP_LOCALLAB_PDEFRA;Kontrastdämpfung +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL Algorithmus an Rawtherapee angepasst: Liefert unterschiedliche Ergebnisse und erfordert andere Einstellungen als das Hauptmenü 'Belichtung'.\nKann nützlich für Bilder mit geringer Belichtung oder hohem Dynamikbereich sein. +TP_LOCALLAB_PREVHIDE;Mehr Einstellungen ausblenden +TP_LOCALLAB_PREVIEW;Vorschau ΔE +TP_LOCALLAB_PREVSHOW;Mehr Einstellungen einblenden +TP_LOCALLAB_PROXI;Zerfallrate (ΔE) +TP_LOCALLAB_QUAAGRES;Aggressiv +TP_LOCALLAB_QUACONSER;Konservativ +TP_LOCALLAB_QUALCURV_METHOD;Kurventyp +TP_LOCALLAB_QUAL_METHOD;Globale Qualität +TP_LOCALLAB_QUANONEALL;Aus +TP_LOCALLAB_QUANONEWAV;Nur nicht-lokales Mittel +TP_LOCALLAB_RADIUS;Radius +TP_LOCALLAB_RADIUS_TOOLTIP;Verwendet eine schnelle Fouriertransformation bei Radius > 30 +TP_LOCALLAB_RADMASKCOL;Glättradius +TP_LOCALLAB_RECOTHRES02_TOOLTIP;Wenn der Wert 'Wiederherstellungsschwelle' > 1 ist, berücksichtigt die Maske in 'Maske und Anpassungen' alle vorherigen Änderungen am Bild aber nicht die mit dem aktuellen Werkzeug (z.B. Farbe und Licht, Wavelet, Cam16 usw.).\nWenn der Wert der 'Wiederherstellungsschwelle' < 1 ist, berücksichtigt die Maske in 'Maske und Anpassungen' keine vorherigen Änderungen am Bild.\n\nIn beiden Fällen wirkt der 'Wiederherstellungsschwellenwert' auf das maskierte Bild modifiziert durch das aktuelle Tool (Farbe und Licht, Wavelet, CAM16 usw.). +TP_LOCALLAB_RECT;Rechteck +TP_LOCALLAB_RECURS;Referenzen rekursiv +TP_LOCALLAB_RECURS_TOOLTIP;Erzwingt, dass der Algorithmus die Referenzen neu berechnet, nachdem jedes Werkzeug angewendet wurde.\nAuch hilfreich bei der Arbeit mit Masken. +TP_LOCALLAB_REN_DIALOG_LAB;Neuer Spot Name +TP_LOCALLAB_REN_DIALOG_NAME;Spot umbenennen +TP_LOCALLAB_REPARCOL_TOOLTIP;Ermöglicht, die relative Stärke von 'Farbe und Licht' in Bezug auf das Originalbild anzupassen. +TP_LOCALLAB_REPARDEN_TOOLTIP;Ermöglicht, die relative Stärke der 'Rauschreduzierung' in Bezug auf das Originalbild anzupassen. +TP_LOCALLAB_REPAREXP_TOOLTIP;Ermöglicht, die relative Stärke von 'Dynamik und und Belichtung' in Bezug auf das Originalbild anzupassen. +TP_LOCALLAB_REPARSH_TOOLTIP;Ermöglicht, die relative Stärke von 'Schatten/Lichter' und 'Tonwert' in Bezug auf das Originalbild anzupassen. +TP_LOCALLAB_REPARTM_TOOLTIP;Ermöglicht, die relative Stärke des 'Tone-Mappings' in Bezug auf das Originalbild anzupassen. +TP_LOCALLAB_REPARW_TOOLTIP;Ermöglicht, die relative Stärke des'Lokalen Kontrasts' und der 'Wavelets' in Bezug auf das Originalbild anzupassen. +TP_LOCALLAB_RESID;Restbild +TP_LOCALLAB_RESIDBLUR;Unschärfe Restbild +TP_LOCALLAB_RESIDCHRO;Chroma Restbild +TP_LOCALLAB_RESIDCOMP;Kompression Restbild +TP_LOCALLAB_RESIDCONT;Kontrast Restbild +TP_LOCALLAB_RESIDHI;Lichter +TP_LOCALLAB_RESIDHITHR;Schwellenwert Lichter +TP_LOCALLAB_RESIDSHA;Schatten +TP_LOCALLAB_RESIDSHATHR;Schwellenwert Schatten +TP_LOCALLAB_RETI;Dunst entfernen u. Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex kann für die Verarbeitung von Bildern folgender Art nützlich sein:\nDie unscharf, neblig oder trüb sind (zusätzlich zu 'Dunst entfernen').\nDie große Unterschiede in der Luminanz enthalten.\nEs kann auch für Spezialeffekte (Tonzuordnung) verwendet werden. +TP_LOCALLAB_RETIM;Original Retinex +TP_LOCALLAB_RETITOOLFRA;Retinex Werkzeuge +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Hat keine Auswirkung, wenn der Wert 'Helligkeit' = 1 oder 'Dunkelheit' = 2 angegeben wird.\nFür andere Werte wird der letzte Schritt eines 'Multiple Scale Retinex'-Algorithmus (ähnlich wie 'Lokaler Kontrast') angewendet. Mit diesen beiden Einstellungen, die mit 'Stärke' verknüpft sind, können Sie Anpassungen vor dem lokalen Kontrast vornehmen. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Passt die internen Parameter an, um die Reaktion zu optimieren.\nDie Werte für 'Wiederhergestellte Daten' sollten vorzugsweise nahe bei Min = 0 und Max = 32768 (Log-Modus) gehalten werden, andere Werte sind jedoch möglich. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Der Logarithmus-Modus führt zu mehr Kontrast, erzeugt aber auch mehr Lichthöfe. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Mit den Reglern für 'Radius' und 'Varianz(Kontrast)' können Sie die Trübung anpassen und entweder den Vordergrund oder den Hintergrund anvisieren. +TP_LOCALLAB_RETI_SCALE_TOOLTIP;Wenn 'Skalieren' = 1 ist, verhält sich Retinex wie ein lokaler Kontrast mit zusätzlichen Möglichkeiten.\nDurch Erhöhen des Skalieren-Werts wird die Intensität der rekursiven Aktion auf Kosten der Verarbeitungszeit erhöht. +TP_LOCALLAB_RET_TOOLNAME;Dunst entfernen u. Retinex +TP_LOCALLAB_REWEI;Iterationen neu gewichten +TP_LOCALLAB_RGB;RGB-Tonkurve +TP_LOCALLAB_RGBCURVE_TOOLTIP;Im RGB-Modus gibt es 4 Möglichkeiten: 'Standard', 'gewichteter Standard', 'Luminanz' und 'Filmähnlich'. +TP_LOCALLAB_ROW_NVIS;Nicht sichtbar +TP_LOCALLAB_ROW_VIS;Sichtbar +TP_LOCALLAB_RSTPROTECT_TOOLTIP;'Rot- und Hauttöne schützen' beeinflusst die Schieberegler von Sättigung , Chromatizität und Buntheit. +TP_LOCALLAB_SATUR;Sättigung +TP_LOCALLAB_SATURV;Sättigung (s) +TP_LOCALLAB_SCALEGR;Korngröße +TP_LOCALLAB_SCALERETI;Skalieren +TP_LOCALLAB_SCALTM;Skalieren +TP_LOCALLAB_SCOPEMASK;Bereich (ΔE Bildmaske) +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Aktiviert, wenn die ΔE-Bildmaske aktiviert ist.\nNiedrige Werte vermeiden das Retuschieren des ausgewählten Bereichs. +TP_LOCALLAB_SENSI;Bereich +TP_LOCALLAB_SENSIEXCLU;Intensität +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Anpassung der auszuschließenden Farben. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Bereichsanpassung speziell für das gängige Maskenwerkzeug.\nBezieht sich auf den Unterschied zwischen dem Originalbild und der Maske.\nVerwendet die Luma-, Chroma- und Farbtonreferenzen aus der Mitte des RT-Spots.\n\nAuch das ΔE der Maske selbst kann angepasst werden durch Verwendung von 'Scope (ΔE-Bildmaske)' unter 'Einstellungen' > 'Maskieren und Zusammenführen'. +TP_LOCALLAB_SENSI_TOOLTIP;Passt den Anwendungsbereich an:\nKleine Werte beschränken die Anwendung auf Farben ähnlich derer im Spot.\nHohe Werte erweitern den Bereich auf eine größere Bandbreite an Farben +TP_LOCALLAB_SETTINGS;Einstellungen +TP_LOCALLAB_SH1;Schatten/Lichter +TP_LOCALLAB_SH2;Equalizer +TP_LOCALLAB_SHADEX;Schatten +TP_LOCALLAB_SHADEXCOMP;Schattenkompression u. Tonwertweite +TP_LOCALLAB_SHADHIGH;Schatten/Lichter +TP_LOCALLAB_SHADHMASK_TOOLTIP;Reduziert die Lichter der Maske genau so wie der Schatten/Lichter-Algorithmus. +TP_LOCALLAB_SHADMASK_TOOLTIP;Hebt die Lichter der Maske genau so wie der Schatten/Lichter-Algorithmus. +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Schatten und Lichter können entweder mit den Reglern für Schatten und Lichter oder mit einem Equalizer angepasst werden.\nKann anstelle oder in Verbindung mit dem Belichtungsmodul und auch als Verlaufsfilter verwendet werden. +TP_LOCALLAB_SHAMASKCOL;Schatten +TP_LOCALLAB_SHAPETYPE;RT-Spot Form +TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' ist der normale Modus.\n'Rechteck' kann in einigen Fällen hilfreich sein, z.B. um die Trennzeichen im Vollbild-Modus außerhalb des Voransichtsbereiches zu setzen. In diesem Falle ist Transition = 100 zu setzen.\n\nZukünftige Versionen werden auch Polygone und Bezierkurven unterstützen. +TP_LOCALLAB_SHARAMOUNT;Intensität +TP_LOCALLAB_SHARBLUR;Unschärferadius +TP_LOCALLAB_SHARDAMPING;Dämpfung +TP_LOCALLAB_SHARFRAME;Veränderungen +TP_LOCALLAB_SHARITER;Iterationen +TP_LOCALLAB_SHARP;Schärfen +TP_LOCALLAB_SHARP_TOOLNAME;Schärfen +TP_LOCALLAB_SHARRADIUS;Radius +TP_LOCALLAB_SHORTC; Maske Short L-Kurven +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Schließt die beiden Kurven L(L) und L(H) kurz.\nErmöglicht das Mischen des aktuellen Bildes mit dem durch die Masken geänderten Originalbild.\nVerwendbar mit den Masken 2, 3, 4, 6, 7. +TP_LOCALLAB_SHOWC;Maske und Anpassungen +TP_LOCALLAB_SHOWC1;Datei zusammenführen +TP_LOCALLAB_SHOWCB;Maske und Anpassungen +TP_LOCALLAB_SHOWDCT;Prozessansicht +TP_LOCALLAB_SHOWE;Maske und Anpassungen +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplace (zuerst) +TP_LOCALLAB_SHOWLC;Maske und Anpassungen +TP_LOCALLAB_SHOWMASK;Maske anzeigen +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Zeigt Masken und Anpassungen an.\nBeachten Sie: es kann jeweils nur eine Werkzeugmaske angezeigt werden.\nGeändertes Bild anzeigen: Zeigt das geänderte Bild einschließlich der Auswirkungen von Anpassungen und Masken an.\nGeänderte Bereiche ohne Maske anzeigen: Zeigt die Änderungen vor der Anwendung von Masken an.\nGeänderte Bereiche mit Maske anzeigen: Zeigt die Änderungen nach der Anwendung von Masken an.\nMaske anzeigen: Zeigt das Aussehen der Maske einschließlich des Effekts von Kurven und Filtern an.\nAnzeigen der Spot-Struktur: Ermöglicht das Anzeigen der Struktur-Erkennungsmaske, wenn 'Spot-Struktur' aktiviert ist (sofern verfügbar).\nHinweis: Die Maske wird vor dem Formerkennungsalgorithmus angewendet. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Ermöglicht die Visualisierung der verschiedenen Phasen des Fourier-Prozesses. \nLaplace - berechnet die zweite Ableitung der Laplace-Transformation als Funktion des Schwellenwerts.\nFourier - zeigt die Laplace-Transformation mit DCT.\nPoisson - zeigt die Lösung des Poisson-DCE .\nKeine Luminanznormalisierung - Zeigt das Ergebnis ohne jegliche Luminanznormalisierung. +TP_LOCALLAB_SHOWMASKTYP1;Unschärfe-Rauschen +TP_LOCALLAB_SHOWMASKTYP2;Rauschreduzierung +TP_LOCALLAB_SHOWMASKTYP3;Unschärfe-Rauschen + Rauschreduzierung +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Kann mit 'Maske und Anpassungen' verwendet werden.\nWenn 'Unschärfe und Rauschen' gewählt wurde, kann die Maske nicht für 'Rauschreduzierung' angewendet werden.\nWenn 'Rauschreduzierung' gewählt wurde, kann die Maske nicht für 'Unschärfe und Rauschen' angewendet werden.\nWenn 'Unschärfe und Rauschen + Rauschreduzierung' gewählt wurde, wird die Maske geteilt. Beachten Sie, dass in diesem Falle die Regler sowohl für 'Unschärfe und Rauschen' und 'Rauschreduzierung' aktiv sind, so dass sich empfiehlt, bei Anpassungen die Option 'Zeige Modifikationen mit Maske' zu verwenden. +TP_LOCALLAB_SHOWMNONE;Anzeige des modifizierten Bildes +TP_LOCALLAB_SHOWMODIF;Anzeige der modifizierten Bereiche ohne Maske +TP_LOCALLAB_SHOWMODIF2;Anzeige der modifizierten Bereiche +TP_LOCALLAB_SHOWMODIFMASK;Anzeige der modifizierten Bereiche mit Maske +TP_LOCALLAB_SHOWNORMAL;Keine Luminanz-Normalisierung +TP_LOCALLAB_SHOWPLUS;Maske und Anpassungen +TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +TP_LOCALLAB_SHOWR;Maske und Anpassungen +TP_LOCALLAB_SHOWREF;Voransicht ΔE +TP_LOCALLAB_SHOWS;Maske und Anpassungen +TP_LOCALLAB_SHOWSTRUC;Zeige Spot-Struktur (erweitert) +TP_LOCALLAB_SHOWSTRUCEX;Zeige Spot-Struktur (erweitert) +TP_LOCALLAB_SHOWT;Maske und Anpassungen +TP_LOCALLAB_SHOWVI;Maske und Anpassungen +TP_LOCALLAB_SHRESFRA;Schatten/Lichter & TRC +TP_LOCALLAB_SHTRC_TOOLTIP;Basierend auf den (bereitgestellten) 'Arbeitsprofil'(en) werden die Farbtöne des Bildes geändert, indem das Arbeitsprofil auf eine Farbtonkennlinie einwirkt. \n'Gamma' wirkt hauptsächlich auf helle Töne.\n'Steigung' wirkt hauptsächlich auf dunkle Töne.\nEs wird empfohlen, die Farbtonkennlinie beider Geräte (Monitor- und Ausgabeprofil) auf sRGB (Standard) zu setzen. +TP_LOCALLAB_SH_TOOLNAME;Schatten/Lichter - Equalizer +TP_LOCALLAB_SIGFRA;Sigmoid Q & LOG-Kodierung Q +TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +TP_LOCALLAB_SIGMAWAV;Dämpfungsreaktion +TP_LOCALLAB_SIGMOIDBL;Überlagern +TP_LOCALLAB_SIGMOIDLAMBDA;Kontrast +TP_LOCALLAB_SIGMOIDQJ;Schwarz-Ev und Weiß-Ev verwenden +TP_LOCALLAB_SIGMOIDTH;Schwellenwert (Graupunkt) +TP_LOCALLAB_SIGMOID_TOOLTIP;Ermöglicht, ein Tone-Mapping-Erscheinungsbild zu simulieren, indem sowohl die 'CIECAM' (oder 'Jz') als auch die 'Sigmoid'-Funktion verwendet werden. Drei Schieberegler:\na) 'Kontrast' wirkt sich auf die Form der Sigmoidkurve und folglich auf die Stärke aus;\nb) 'Schwellenwert' (Graupunkt) verteilt die Aktion entsprechend der Leuchtdichte;\nc) 'Überlagern' wirkt sich auf den endgültigen Aspekt des Bildes, Kontrast und Leuchtdichte aus. +TP_LOCALLAB_SLOMASKCOL;Steigung +TP_LOCALLAB_SLOMASK_TOOLTIP;Gamma und Steigung ermöglichen eine weiche und artefaktfreie Transformation der Maske, indem 'L' schrittweise geändert wird, um Diskontinuitäten zu vermeiden. +TP_LOCALLAB_SLOSH;Steigung +TP_LOCALLAB_SOFT;Weiches Licht u. Original Retinex +TP_LOCALLAB_SOFTM;Weiches Licht +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Weiches-Licht-Mischung (identisch mit der globalen Anpassung). Führen Sie Abwedeln und Aufhellen (Dodge & Burn) mit dem ursprünglichen Retinex-Algorithmus durch. +TP_LOCALLAB_SOFTRADIUSCOL;Radius +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Wendet einen anpassbaren Filter auf das Ausgabebild an, um mögliche Artefakte zu reduzieren. +TP_LOCALLAB_SOFTRETI;ΔE Artefakte reduzieren +TP_LOCALLAB_SOFT_TOOLNAME;Weiches Licht u. Original Retinex +TP_LOCALLAB_SOURCE_ABS;Absolute Luminanz +TP_LOCALLAB_SOURCE_GRAY;Mittlere Luminanz (Yb%) +TP_LOCALLAB_SPECCASE;Spezielle Fälle +TP_LOCALLAB_SPECIAL;Spezielle Verwendung von RGB-Kurven +TP_LOCALLAB_SPECIAL_TOOLTIP;Mit dem Kontrollkästchen können alle anderen Aktionen entfernt werden, d. H. 'Bereich', Masken, Regler usw. (mit Ausnahme von Übergängen) um nur den Effekt der RGB-Tonkurve anzuwenden. +TP_LOCALLAB_SPOTNAME;Neuer Spot +TP_LOCALLAB_STD;Standard +TP_LOCALLAB_STR;Intensität +TP_LOCALLAB_STRBL;Intensität +TP_LOCALLAB_STREN;Kompressionsintensität +TP_LOCALLAB_STRENG;Intensität +TP_LOCALLAB_STRENGR;Intensität +TP_LOCALLAB_STRENGRID_TOOLTIP;Der gewünschte Effekt kann mit 'Intensität' eingestellt werden, aber es kann auch die Funktion 'Bereich' verwendet werden, um die Aktion zu begrenzen (z.B. um eine bestimmte Farbe zu isolieren). +TP_LOCALLAB_STRENGTH;Rauschen +TP_LOCALLAB_STRGRID;Intensität +TP_LOCALLAB_STRUC;Struktur +TP_LOCALLAB_STRUCCOL;Spot-Struktur +TP_LOCALLAB_STRUCCOL1;Spot-Struktur +TP_LOCALLAB_STRUCT_TOOLTIP;Verwendet den Sobel-Algorithmus, um die Struktur für die Formerkennung zu berücksichtigen.\nAktivieren Sie 'Maske und Anpassungen' > 'Spot-Struktur anzeigen' (erweiterter Modus), um eine Vorschau der Maske anzuzeigen (ohne Änderungen).\n\nKann in Verbindung verwendet werden mit der Strukturmaske, der Unschärfemaske und 'Lokaler Kontrast' (nach Wavelet-Ebene) zur Verbesserung der Kantenerkennung.\n\nEinflüsse von Anpassungen mit Helligkeit, Kontrast, Chrominanz, Belichtung oder anderen nicht maskenbezogenen Werkzeugen, entweder mit 'Modifiziert anzeigen' oder 'Geänderte Bereiche mit Maske anzeigen' überprüfen. +TP_LOCALLAB_STRUMASKCOL;Intensität der Strukturmaske +TP_LOCALLAB_STRUMASK_TOOLTIP;Strukturmaske (Regler) mit deaktiviertem Kontrollkästchen 'Strukturmaske als Werkzeug':\nIn diesem Fall wird eine Maske mit der Struktur generiert, auch wenn keine der 3 Kurven aktiviert ist. Strukturmasken sind für Maske 1 (Unschärfe und Rauschreduzierung') und Maske 11 (Farbe & Licht) möglich. +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Ein moderater Gebrauch dieses Reglers wird wärmstens empfohlen! +TP_LOCALLAB_STYPE;Form +TP_LOCALLAB_STYPE_TOOLTIP;Sie können wählen zwischen:\nSymmetrisch - linkes Handle mit rechts verknüpft, oberes Handle mit unten verbunden.\nUnabhängig - alle Handles sind unabhängig. +TP_LOCALLAB_SYM;Symmetrisch (Maus) +TP_LOCALLAB_SYMSL;Symmetrisch (Maus + Regler) +TP_LOCALLAB_TARGET_GRAY;Mittlere Luminanz (Yb%) +TP_LOCALLAB_THRES;Schwellenwert Struktur +TP_LOCALLAB_THRESDELTAE;Schwellenwert ΔE-Bereich +TP_LOCALLAB_THRESRETI;Schwellenwert +TP_LOCALLAB_THRESWAV;Schwellenwert Balance +TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mittel=%3 Sig=%4 +TP_LOCALLAB_TLABEL_TOOLTIP;Ergebnis der Übertragungszuordnung.\nMin and Max werden von 'Varianz' beeinflusst.\nTm=Min TM=Max der Übertragungszuordnung.\nDie Ergebnisse können mit den Schwellenwertreglern angepasst werden. +TP_LOCALLAB_TM;Tonwertkorrektur +TP_LOCALLAB_TM_MASK;Übertragungszuordnung verwenden +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;Dieser Regler wirkt sich auf die Kantenempfindlichkeit aus.\nJe größer der Wert, desto wahrscheinlicher wird eine Änderung des Kontrasts als 'Kante' interpretiert.\nWenn auf Null gesetzt, hat die Tonzuordnung einen ähnlichen Effekt wie die unscharfe Maskierung. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Der Gamma-Regler verschiebt den Effekt der Tonwertkorrektur entweder in Richtung der Schatten oder der Lichter. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In einigen Fällen kann die Tonwertkorrektur zu einem Comicartigen Erscheinungsbild führen, und in einigen seltenen Fällen können weiche aber breite Lichthöfe auftreten.\nDie Erhöhung der Anzahl der Iterationen zur Neugewichtung hilft bei der Bekämpfung einiger dieser Probleme. +TP_LOCALLAB_TONEMAP_TOOLTIP;Entspricht der Tonwertkorrektur im Hauptmenü.\nDas Werkzeug im Hauptmenü muss deaktiviert sein, wenn dieses Werkzeug verwendet wird. +TP_LOCALLAB_TONEMASCALE_TOOLTIP;Mit diesem Regler kann der Übergang zwischen 'lokalem' und 'globalem' Kontrast angepasst werden.\nJe größer der Wert, desto größer muss ein Detail sein, damit es verstärkt wird. +TP_LOCALLAB_TONE_TOOLNAME;Tonwertkorrektur +TP_LOCALLAB_TOOLCOL;Strukturmaske als Werkzeug +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Erlaubt das Verändern der Maske, wenn eine existiert. +TP_LOCALLAB_TOOLMASK;Maskierungswerkzeuge +TP_LOCALLAB_TOOLMASK_2;Wavelets +TP_LOCALLAB_TOOLMASK_TOOLTIP;Strukturmaske (Regler) mit aktiviertem Kontrollkästchen 'Strukturmaske als Werkzeug': In diesem Fall wird eine Maske mit der Struktur generiert, nachdem eine oder mehrere der beiden Kurven L(L) oder LC(H) geändert wurden.\nDie 'Strukturmaske' verhält sich in diesem Falle wie die anderen Maskenwerkzeuge: Gamma, Steigung usw.\nErmöglicht, die Wirkung der Maske entsprechend der Struktur des Bildes zu variieren. +TP_LOCALLAB_TRANSIT;Übergangsgradient +TP_LOCALLAB_TRANSITGRAD;Übergangsunterschied XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Verändert den Übergang der x-Achse +TP_LOCALLAB_TRANSITVALUE;Übergangsintensität +TP_LOCALLAB_TRANSITWEAK;Zerfall des Überganges (linear-log) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Anpassen der Zerfallrate: 1 linear, 2 parabolisch, 3 kubisch bis zu ^ 25.\nKann in Verbindung mit sehr niedrigen Übergangswerten verwendet werden, um Defekte (CBDL, Wavelets, Farbe & Licht) zu reduzieren +TP_LOCALLAB_TRANSIT_TOOLTIP;Passen Sie die Übergangshärte zwischen betroffenen und nicht betroffenen Bereichen als Prozentsatz des 'Radius' an. +TP_LOCALLAB_TRANSMISSIONGAIN;Übertragungsverstärkung +TP_LOCALLAB_TRANSMISSIONMAP;Übertragungszuordnung +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Übertragung gemäß Übertragung.\nAbszisse: Übertragung von negativen Werten (min), Mittelwert und positiven Werten (max).\nOrdinate: Verstärkung oder Reduzierung.\nSie können diese Kurve anpassen, um die Übertragung zu ändern und Artefakte zu reduzieren. +TP_LOCALLAB_USEMASK;Laplace +TP_LOCALLAB_VART;Varianz (Kontrast) +TP_LOCALLAB_VIBRANCE;Farbtemperatur +TP_LOCALLAB_VIBRA_TOOLTIP;Passt die Farbtemperatur an (im Wesentlichen ähnlich wie die globale Anpassung).\nFührt das Äquivalent einer Weißabgleichanpassung mithilfe eines CIECAM-Algorithmus aus. +TP_LOCALLAB_VIB_TOOLNAME;Farbtemperatur +TP_LOCALLAB_VIS_TOOLTIP;Klick um den ausgewählten Spot aus- oder einzublenden.\nStrg+Klick um alle Spots aus- oder einzublenden. +TP_LOCALLAB_WARM;Farbtemperatur-Tönung +TP_LOCALLAB_WARM_TOOLTIP;Dieser Regler verwendet den CIECAM-Algorithmus und fungiert als Weißabgleichsteuerung, um die Farbtemperatur des ausgewählten Bereichs wärmer oder kühler zu machen.\nEin Teil der Farbartefakte kann in einigen Fällen auch reduziert werden. +TP_LOCALLAB_WASDEN_TOOLTIP;Reduzierung des Luminanz-Rauschens: Die linke Seite der Kurve einschließlich der dunkelgrauen/hellgrauen Grenze entspricht den ersten 3 Stufen 0, 1, 2 (feines Detail). Die rechte Seite der Kurve entspricht den gröberen Details (Ebene 3, 4, 5, 6). +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Gleicht die Aktion innerhalb jeder Ebene an. +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;Die Standardeinstellung für Unschärfe wirkt sich auf alle 3 L*a*b* -Komponenten (Luminanz und Farbe) aus.\nWenn diese Option aktiviert ist, wird nur die Luminanz unscharf. +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;Mit 'Chroma zusammenführen' wird die Intensität des gewünschten Effekts auf die Chrominanz ausgewählt. +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;Mit 'Luma zusammenführen' wird die Intensität des gewünschten Effekts auf die Luminanz ausgewählt. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma Ebenen': Passt die 'a'- und 'b'- Komponenten von L*a*b* als Anteil des Luminanzwertes an. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Durch den Versatz wird die Balance zwischen kontrastarmen und kontrastreichen Details geändert.\nHohe Werte verstärken die Kontraständerungen zu den kontrastreicheren Details, während niedrige Werte die Kontraständerungen zu kontrastarmen Details verstärken.\nMit Verwendung eines geringeren Wertes der 'Dämpfungsreaktion' kann bestimmt werden, welche Kontrastwerte verbessert werden sollen. +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;Durch Bewegen des Reglers nach links werden die unteren Ebenen akzentuiert. Nach Rechts werden die niedrigeren Ebenen reduziert und die höheren Ebenen akzentuiert. +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;Das Restbild reagiert beim Anpassen von Kontrast, Chrominanz usw. genauso wie das Hauptbild. +TP_LOCALLAB_WAT_GRADW_TOOLTIP;Je mehr Sie den Regler nach rechts bewegen, desto effektiver ist der Erkennungsalgorithmus und desto weniger spürbar sind die Auswirkungen des lokalen Kontrasts. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Niedriger bis hoher lokaler Kontrast von links nach rechts auf der x-Achse.\nErhöht oder verringert den lokalen Kontrast auf der y-Achse. +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;Sie können die Verteilung des lokalen Kontrasts nach Wavelet-Ebenen basierend auf der Anfangsintensität des Kontrasts anpassen. Dadurch werden die Effekte von Perspektive und Relief im Bild geändert und /oder die Kontrastwerte für sehr niedrige anfängliche Kontrastebenen verringert. +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Nur mit Originalbild zusammenführen' verhindert, dass die Einstellungen für 'Wavelet Pyramide' die von 'Klarheit und Schärfemaske' beeinträchtigen. +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Wendet eine Unschärfe auf das Restbild an, unabhängig von den Ebenen. +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Komprimiert das Restbild, um den Kontrast zu erhöhen oder zu verringern. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;Der Effekt der lokalen Kontrastanpassung ist bei Details mit mittlerem Kontrast stärker und bei Details mit hohem und niedrigem Kontrast schwächer.\nDieser Schieberegler steuert, wie schnell der Effekt zu extremen Kontrasten gedämpft wird.\nJe höher der Wert des Schiebereglers, desto breiter der Kontrastbereich, der den vollen Effekt der lokalen Kontrastanpassung erhält, und desto höher ist das Risiko der Erzeugung von Artefakten.\nJe niedriger der Wert, desto stärker wird der Effekt auf einen engen Bereich von Kontrastwerten ausgerichtet. +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensität der Kanteneffekt-Erkennung. +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Ermöglicht die Anpassung des lokalen Kontrasts entsprechend einem gewählten Gradienten und Winkel. Dabei wird die Änderung des Luminanzsignals berücksichtigt und nicht die Luminanz. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Bereich der Wavelet-Ebenen, die im gesamten Wavelets-Modul verwendet werden. +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Ermöglicht es, Unschärfe auf jeden Zersetzungsgrad anzuwenden.\nDie feinsten bis gröbsten Zersetzungsstufen sind von links nach rechts. +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Ähnlich wie bei Kontrast nach Detailebenen. Feine bis grobe Detailebenen von links nach rechts auf der x-Achse. +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Wirkt auf das Gleichgewicht der drei Richtungen (horizontal, vertikal und diagonal) basierend auf der Luminanz des Bildes.\nStandardmäßig werden die Schatten oder Lichter reduziert, um Artefakte zu vermeiden. +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Zeigt alle Werkzeuge zum 'Kantenschärfen' an. Es wird empfohlen, die Dokumentation zu Wavelet Levels zu lesen. +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Ermöglicht den maximalen Effekt der Unschärfe auf den Ebenen einzustellen. +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Niedriger bis hoher lokaler Kontrast von links nach rechts auf der x-Achse.\nErhöhen oder verringern Sie den lokalen Kontrast auf der y-Achse. +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;Der untere (negative) Teil komprimiert jede Ebene und erzeugt einen Tonwert-Effekt.\nDer obere (positive) Teil dämpft den Kontrast nach Ebene.\nFeine bis grobe Detailebenen von links nach rechts auf der x-Achse. +TP_LOCALLAB_WAV;Lokaler Kontrast +TP_LOCALLAB_WAVBLUR_TOOLTIP;Ermöglicht Unschärfe auf jeder Ebene oder dem Restbild. +TP_LOCALLAB_WAVCOMP;Kompression nach Ebene +TP_LOCALLAB_WAVCOMPRE;Kompression nach Ebene +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Ermöglicht Tonwertkorrektur oder das Reduzieren des lokalen Kontrasts auf einzelnen Ebenen.\nFein bis grobe Detailebenen von links nach rechts auf der x-Achse. +TP_LOCALLAB_WAVCOMP_TOOLTIP;Ermöglicht das Anwenden eines lokalen Kontrasts basierend auf der Richtung der Wavelet-Zerlegung: horizontal, vertikal, diagonal. +TP_LOCALLAB_WAVCON;Kontrast nach Ebene +TP_LOCALLAB_WAVCONTF_TOOLTIP;Ähnlich wie bei Kontrast nach Detailebenen. Feine bis grobe Detailebenen von links nach rechts auf der x-Achse. +TP_LOCALLAB_WAVDEN;Luminanzkurve +TP_LOCALLAB_WAVE;Wavelets +TP_LOCALLAB_WAVEDG;Lokaler Kontrast +TP_LOCALLAB_WAVEEDG_TOOLTIP;Verbessert die Schärfe durch gezielte lokale Kontrastwirkung an den Kanten. Es hat die gleichen Funktionen wie das entsprechende Modul in Wavelet Levels und verwendet die gleichen Einstellungen. +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Bereich der Wavelet-Ebenen, die in 'Lokaler Kontrast' (nach Wavelet-Ebene) verwendet werden. +TP_LOCALLAB_WAVGRAD_TOOLTIP;Anpassen des lokalen Kontrasts entsprechend einem gewählten Gradienten und Winkel. Die Änderung des Luminanz-Signals wird berücksichtigt und nicht die Luminanz. +TP_LOCALLAB_WAVHUE_TOOLTIP;Ermöglicht das Verringern oder Erhöhen der Rauschreduzierung basierend auf dem Farbton. +TP_LOCALLAB_WAVLEV;Unschärfe nach Ebene +TP_LOCALLAB_WAVMASK;Wavelets +TP_LOCALLAB_WAVMASK_TOOLTIP;Verwendet Wavelets, um den lokalen Kontrast der Maske zu ändern und die Struktur (Haut, Gebäude, etc.) zu verstärken oder zu reduzieren. +TP_LOCALLAB_WEDIANHI;Median hoch +TP_LOCALLAB_WHITE_EV;Weiß-Ev +TP_LOCALLAB_ZCAMFRA;ZCAM-Bildanpassungen +TP_LOCALLAB_ZCAMTHRES;Hohe Daten abfragen +TP_LOCAL_HEIGHT;Unten +TP_LOCAL_HEIGHT_T;Oben +TP_LOCAL_WIDTH;Rechts +TP_LOCAL_WIDTH_L;Links +TP_LOCRETI_METHOD_TOOLTIP;Niedrig = Schwaches Licht verstärken.\nGleichmäßig = Gleichmäßig verteilt.\nHoch = Starkes Licht verstärken. 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_TOOLTIP;Belichtungseinstellungen auf neutrale 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 @@ -1888,13 +3524,34 @@ 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_PDSHARPENING_LABEL;Eingangsschärfung +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop-Faktor +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Fokale Länge +TP_PERSPECTIVE_CAMERA_FRAME;Korrektur +TP_PERSPECTIVE_CAMERA_PITCH;Vertikal +TP_PERSPECTIVE_CAMERA_ROLL;Rotation +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontale Verschiebung +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertikale Verschiebung +TP_PERSPECTIVE_CAMERA_YAW;Horizontal +TP_PERSPECTIVE_CONTROL_LINES;Kontroll-Linien +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Strg+ziehen: Zeichne neue Linien (mind. 2)\nRechts-Klick: Lösche Linie +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;Es werden mindestens zwei horizontale oder zwei vertikale Kontroll-Linien benötigt. TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspektive +TP_PERSPECTIVE_METHOD;Methode +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Kamera-basiert +TP_PERSPECTIVE_METHOD_SIMPLE;Einfach +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Anpassungen nach der Korrektur +TP_PERSPECTIVE_PROJECTION_PITCH;Vertikal +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontale Verschiebung +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertikale Verschiebung +TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +TP_PERSPECTIVE_RECOVERY_FRAME;Wiederherstellung 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_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Regelt die Intensität der Farbsaumentfernung nach Farben. Je höher die Kurve desto stärker ist der Effekt. TP_PREPROCESS_DEADPIXFILT;Dead-Pixel-Filter -TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt tote Pixel. +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt Dead Pixel. TP_PREPROCESS_GREENEQUIL;Grün-Ausgleich TP_PREPROCESS_HOTPIXFILT;Hot-Pixel-Filter TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Entfernt Hot-Pixel. @@ -1907,11 +3564,15 @@ 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_PREPROCWB_LABEL;Vorverarbeitung Weißabgleich +TP_PREPROCWB_MODE;Modus +TP_PREPROCWB_MODE_AUTO;Auto +TP_PREPROCWB_MODE_CAMERA;Kamera 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_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;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_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 @@ -1932,16 +3593,18 @@ TP_RAW_3PASSBEST;3-Pass (Markesteijn) TP_RAW_4PASS;3-Pass + schnell TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE + Bilinear TP_RAW_AMAZEVNG4;AMaZE + VNG4 TP_RAW_BORDER;Bildrand TP_RAW_DCB;DCB +TP_RAW_DCBBILINEAR;DCB+Bilinear 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_PROGRESSBAR_REFINE;Demosaik-Optimierung +TP_RAW_DMETHOD_TOOLTIP;IGV und LMMSE sind speziell 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 @@ -1949,7 +3612,7 @@ TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Falschfarbenreduzierung TP_RAW_FAST;Schnell TP_RAW_HD;Schwelle -TP_RAW_HD_TOOLTIP;Je niedriger der Wert, umso empfindlicher reagiert\ndie “Hot / Dead-Pixel-Erkennung“.\nIst die Empfindlichkeit zu hoch, können Artefakte\nentstehen. Erhöhen Sie in diesem Fall die Schwelle,\nbis die Artefakte verschwinden. +TP_RAW_HD_TOOLTIP;Je niedriger der Wert, umso empfindlicher reagiert\ndie 'Hot-/Dead-Pixel-Erkennung'.\nIst die Empfindlichkeit zu hoch, können Artefakte\nentstehen. Erhöhen Sie in diesem Fall die Schwelle,\nbis die Artefakte verschwinden. TP_RAW_HPHD;HPHD TP_RAW_IGV;IGV TP_RAW_IMAGENUM;Unterbild @@ -1962,6 +3625,8 @@ TP_RAW_LMMSE_TOOLTIP;Fügt Gamma (Stufe 1), Median (Stufe 2-4)\nund Optimierung TP_RAW_MONO;Mono TP_RAW_NONE;Keine TP_RAW_PIXELSHIFT;Pixel-Shift +TP_RAW_PIXELSHIFTAVERAGE;Durchschnitt für Bewegungen +TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Verwenden Sie den Durchschnitt aller Frames anstelle des ausgewählten Frames für Regionen mit Bewegung.\nGibt einen Bewegungseffekt auf sich langsam bewegende (überlappende) Objekte. TP_RAW_PIXELSHIFTBLUR;Unschärfebewegungsmaske TP_RAW_PIXELSHIFTDMETHOD;Bewegungsmethode TP_RAW_PIXELSHIFTEPERISO;Empfindlichkeit @@ -1969,7 +3634,7 @@ TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Der Standardwert 0 wird für die Basis-ISO empf 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. -TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Gleicht die Helligkeit der Frames an den aktuellen Frame an.\n\nSind überbelichtete Bereiche vorhanden wählen Sie den hellsten Frame aus um\nMagenta-Farbstiche zu vermeiden oder aktivieren Sie die Bewegungskorrektur. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Gleicht die Helligkeit der Frames an den aktuellen Frame an.\n\nSind überbelichtete Bereiche vorhanden wählen Sie den hellsten Frame aus, um\nMagenta-Farbstiche zu vermeiden oder aktivieren Sie die Bewegungskorrektur. 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. @@ -1978,7 +3643,6 @@ TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Verwenden Sie den Median aller Frames anstelle d TP_RAW_PIXELSHIFTMM_AUTO;Automatisch TP_RAW_PIXELSHIFTMM_CUSTOM;Benutzerdefiniert TP_RAW_PIXELSHIFTMM_OFF;Aus -TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) TP_RAW_PIXELSHIFTMOTIONMETHOD;Bewegungskorrektur TP_RAW_PIXELSHIFTNONGREENCROSS;Bewegung im Rot/Blau-Kanal erkennen TP_RAW_PIXELSHIFTSHOWMOTION;Bewegungsmaske anzeigen @@ -1988,11 +3652,12 @@ TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Überlagert das Bild mit einer grünen Maske 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 -TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Weicher Übergang zwischen Bereichen mit und ohne Bewegung.\n0 = Aus\n1 = AMaZE/LMMSE oder Median +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Weicher Übergang zwischen Bereichen mit und ohne Bewegung.\n0 = Aus\n1 = AMaZE/LMMSE oder Median. TP_RAW_RCD;RCD +TP_RAW_RCDBILINEAR;RCD+Bilinear 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.\n\n"+ schnell" erzeugt weniger Artefakte in kontrast-\narmen Bereichen. +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 kontrastarmen Bereichen. TP_RAW_SENSOR_XTRANS_LABEL;Sensor mit X-Trans-Matrix TP_RAW_VNG4;VNG4 TP_RAW_XTRANS;X-Trans @@ -2006,9 +3671,13 @@ TP_RESIZE_H;Höhe: TP_RESIZE_HEIGHT;Höhe TP_RESIZE_LABEL;Skalieren TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_LE;Lange Kante: +TP_RESIZE_LONG;Lange Kante TP_RESIZE_METHOD;Methode: TP_RESIZE_NEAREST;Nächster Nachbar TP_RESIZE_SCALE;Maßstab +TP_RESIZE_SE;Kurze Kante: +TP_RESIZE_SHORT;Kurze Kante TP_RESIZE_SPECIFY;Basierend auf: TP_RESIZE_W;Breite: TP_RESIZE_WIDTH;Breite @@ -2016,80 +3685,80 @@ TP_RETINEX_CONTEDIT_HSL;HSL-Kurve TP_RETINEX_CONTEDIT_LAB;Luminanz (L) L*a*b* TP_RETINEX_CONTEDIT_LH;Farbton (H) TP_RETINEX_CONTEDIT_MAP;Maskenkurve -TP_RETINEX_CURVEEDITOR_CD;L = f(L) -TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminanz in Abhängigkeit der Luminanz.\nKorrigiert direkt die RAW-Daten, um Halos\nund Artefakte zu verringern. +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminanz in Abhängigkeit der Luminanz.\nKorrigiert direkt die RAW-Daten, um Halos und Artefakte zu verringern. TP_RETINEX_CURVEEDITOR_LH;Intensität = f(H) -TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Intensität in Abhängigkeit des Farbtons (H)\nBei der Retinex-Methode "Spitzlichter" wirken sich die\nÄnderungen auch auf die Chromakorrektur aus. -TP_RETINEX_CURVEEDITOR_MAP;L = f(L) -TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Die Kurve kann entweder alleine, mit der\nGaußschen- oder Waveletmaske angewendet\nwerden. Artefakte beachten! +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Intensität in Abhängigkeit des Farbtons (H)\nBei der Retinex-Methode 'Spitzlichter' wirken sich die Änderungen auch auf die Chromakorrektur aus. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Die Kurve kann entweder alleine, mit der Gauß'schen- oder Waveletmaske angewendet werden. Artefakte beachten! TP_RETINEX_EQUAL;Korrekturen TP_RETINEX_FREEGAMMA;Gamma -TP_RETINEX_GAIN;Kontrast -TP_RETINEX_GAINOFFS;Verstärkung und Ausgleich (Helligkeit) -TP_RETINEX_GAINTRANSMISSION;Transmissionsverstärkung -TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Ändert die Helligkeit durch Verstärkung oder\nAbschwächung der Transmissionskarte. +TP_RETINEX_GAIN;Verstärkung +TP_RETINEX_GAINOFFS;Verstärkung und Versatz +TP_RETINEX_GAINTRANSMISSION;Übertragungsverstärkung +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Ändert die Helligkeit durch Verstärkung oder Abschwächung der Übertragungszuordnung. TP_RETINEX_GAMMA;Gammakorrektur TP_RETINEX_GAMMA_FREE;Benutzerdefiniert TP_RETINEX_GAMMA_HIGH;Hoch TP_RETINEX_GAMMA_LOW;Niedrig TP_RETINEX_GAMMA_MID;Mittel TP_RETINEX_GAMMA_NONE;Keine -TP_RETINEX_GAMMA_TOOLTIP;Stellt Farbtöne vor und nach der Retinexverarbeitung\ndurch eine Gammakorrektur wieder her. -TP_RETINEX_GRAD;Transmission Gradient -TP_RETINEX_GRADS;Intensität Gradient +TP_RETINEX_GAMMA_TOOLTIP;Stellt Farbtöne vor und nach der Retinexverarbeitung durch eine Gammakorrektur wieder her. +TP_RETINEX_GRAD;Übertragungsgradient +TP_RETINEX_GRADS;Intensitätsgradient TP_RETINEX_GRADS_TOOLTIP;Steht der Regler auf 0 sind alle Iterationen identisch.\nBei > 0 wird die Intensität reduziert, bei < 0 erhöht. TP_RETINEX_GRAD_TOOLTIP;Steht der Regler auf 0 sind alle Iterationen identisch.\nBei > 0 werden Skalierung und Schwelle reduziert,\nbei < 0 erhöht. TP_RETINEX_HIGH;Lichter TP_RETINEX_HIGHLIG;Spitzlichter TP_RETINEX_HIGHLIGHT;Spitzlichter Schwelle -TP_RETINEX_HIGHLIGHT_TOOLTIP;Benötigt unter Umständen Korrekturen der Einstellungen "Benachbarte Pixel" und "Weißpunkt" unter dem Reiter "RAW". +TP_RETINEX_HIGHLIGHT_TOOLTIP;Benötigt unter Umständen Korrekturen der Einstellungen 'Benachbarte Pixel' und 'Weißpunkt' unter dem Reiter 'RAW'. TP_RETINEX_HSLSPACE_LIN;HSL-Linear TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmisch TP_RETINEX_ITER;Iterationen TP_RETINEX_ITERF;Dynamikkompression -TP_RETINEX_ITER_TOOLTIP;Simuliert eine Dynamikkompression.\nHöhere Werte erhöhen die Verarbei-\ntungszeit. +TP_RETINEX_ITER_TOOLTIP;Simuliert eine Dynamikkompression.\nHöhere Werte erhöhen die Verarbeitungszeit. TP_RETINEX_LABEL;Retinex (Bildschleier entfernen) TP_RETINEX_LABEL_MASK;Maske TP_RETINEX_LABSPACE;L*a*b* TP_RETINEX_LOW;Schatten TP_RETINEX_MAP;Methode -TP_RETINEX_MAP_GAUS;Gaußschenmaske +TP_RETINEX_MAP_GAUS;Gauß'sche Maske TP_RETINEX_MAP_MAPP;Schärfemaske (Teil-Wavelet) -TP_RETINEX_MAP_MAPT;Schärfemaske (Wavelet) -TP_RETINEX_MAP_METHOD_TOOLTIP;Keine: Wendet die Maske, die mit der gaußschen\nFunktion (Radius, Methode) erstellt wurde an,\num Halos und Artefakte zu reduzieren.\n\nNur Kurve: Wendet eine diagonale Kontrastkurve\nauf die Maske an. (Artefakte beachten)\n\nGaußschenmaske: Wendet eine gaußsche Unschärfe\nauf die originale Maske an. (Schnell)\n\nSchärfemaske: Wendet ein Wavelet auf die originale\nMaske an. (Langsam) +TP_RETINEX_MAP_MAPT;Schärfemaske (Erweitert - Wavelet) +TP_RETINEX_MAP_METHOD_TOOLTIP;Keine: Wendet die Maske, die mit der Gauß'schen Funktion (Radius, Methode) erstellt wurde an, um Halos und Artefakte zu reduzieren.\n\nNur Kurve: Wendet eine diagonale Kontrastkurve auf die Maske an. (Artefakte beachten)\n\nGauß'sche Maske: Wendet eine Gauß'sche Unschärfe auf die originale Maske an. (Schnell)\n\nSchärfemaske: Wendet ein Wavelet auf die originale Maske an. (Langsam) TP_RETINEX_MAP_NONE;Keine 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_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 aber auch andere Werte sind möglich. TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Zurücksetzen -TP_RETINEX_NEUTRAL_TIP;Setzt alle Regler und Kurven\nauf ihre Standardwerte zurück. -TP_RETINEX_OFFSET;Ausgleich (Helligkeit) -TP_RETINEX_SCALES;Gaußscher Gradient +TP_RETINEX_NEUTRAL_TOOLTIP;Setzt alle Regler und Kurven\nauf ihre Standardwerte zurück. +TP_RETINEX_OFFSET;Versatz (Helligkeit) +TP_RETINEX_SCALES;Gauß'scher Gradient TP_RETINEX_SCALES_TOOLTIP;Steht der Regler auf 0 sind alle Iterationen identisch.\nBei > 0 werden Skalierung und Radius reduziert,\nbei < 0 erhöht. TP_RETINEX_SETTINGS;Einstellungen TP_RETINEX_SKAL;Skalierung TP_RETINEX_SLOPE;Gammasteigung TP_RETINEX_STRENGTH;Intensität TP_RETINEX_THRESHOLD;Schwelle -TP_RETINEX_THRESHOLD_TOOLTIP;Limitiert den Bereich der Transmissionskurve. +TP_RETINEX_THRESHOLD_TOOLTIP;Limitiert den Bereich der Übertragungszuordnung. TP_RETINEX_TLABEL;T: Min = %1, Max = %2\nT: Mittel = %3, Sigma = %4 TP_RETINEX_TLABEL2;T: Tmin = %1, Tmax = %2 -TP_RETINEX_TLABEL_TOOLTIP;Ergebnis der Transmissionskurve: Min, Max, Mittel und Sigma\nMin und Max hat Einfluss auf die Abweichung.\n\nTmin = Kleinster Wert der Transmissionskurve\nTmax = Größter Wert der Transmissionskurve -TP_RETINEX_TRANF;Transmission -TP_RETINEX_TRANSMISSION;Transmissionskurve -TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission in Abhängigkeit der Transmission.\n\nx-Achse: Transmission negativer Werte (Min),\nMittel und positiver Werte (Max).\n\ny-Achse: Verstärkung oder Abschwächung. -TP_RETINEX_UNIFORM;Schatten / Lichter +TP_RETINEX_TLABEL_TOOLTIP;Ergebnis der Übertragungszuordnung: Min, Max, Mittel und Sigma\nMin und Max hat Einfluss auf die Abweichung.\n\nTmin = Kleinster Wert der Übertragungszuordnung\nTmax = Größter Wert der Übertragungszuordnung. +TP_RETINEX_TRANF;Übertragung +TP_RETINEX_TRANSMISSION;Übertragungzuordnung +TP_RETINEX_TRANSMISSION_TOOLTIP;Übertragung in Abhängigkeit der Übertragung.\n\nx-Achse: Übertragung negativer Werte (Min),\nMittel und positiver Werte (Max).\n\ny-Achse: Verstärkung oder Abschwächung. +TP_RETINEX_UNIFORM;Schatten/Lichter TP_RETINEX_VARIANCE;Kontrast TP_RETINEX_VARIANCE_TOOLTIP;Niedrige Werte erhöhen den lokalen\nKontrast und die Sättigung, können\naber zu Artefakten führen. TP_RETINEX_VIEW;Vorschau TP_RETINEX_VIEW_MASK;Maske -TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard: Normale Anzeige\n\nMaske: Zeigt die Maske an\n\nUnschärfemaske: Zeigt das Bild mit einem großen\nUnschärfemaskenradius an.\n\nTransmission-Auto / Fest: Zeigt die Transmissionskarte\nvor der Anwendung von Kontrast und Helligkeit an.\n\nACHTUNG: Die Maske zeigt nicht das Endergebnis, sondern\nverstärkt den Effekt um ihn besser beurteilen zu können. +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard: Normale Anzeige\n\nMaske: Zeigt die Maske an\n\nUnschärfemaske: Zeigt das Bild mit einem großen\nUnschärfemaskenradius an.\n\nÜbertragung-Auto / Fest: Zeigt die Übertragungszuordnung\nvor der Anwendung von Kontrast und Helligkeit an.\n\nACHTUNG: Die Maske zeigt nicht das Endergebnis, sondern\nverstärkt den Effekt um ihn besser beurteilen zu können. TP_RETINEX_VIEW_NONE;Standard -TP_RETINEX_VIEW_TRAN;Transmission - Auto -TP_RETINEX_VIEW_TRAN2;Transmission - Fest +TP_RETINEX_VIEW_TRAN;Übertragung - Auto +TP_RETINEX_VIEW_TRAN2;Übertragung - Fest TP_RETINEX_VIEW_UNSHARP;Unschärfemaske TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Kanal @@ -2101,10 +3770,10 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Winkel TP_ROTATE_LABEL;Drehen TP_ROTATE_SELECTLINE;Leitlinie wählen -TP_SAVEDIALOG_OK_TIP;Taste: Strg + Enter +TP_SAVEDIALOG_OK_TOOLTIP;Taste: Strg + Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Lichter TP_SHADOWSHLIGHTS_HLTONALW;Tonwertbreite Lichter -TP_SHADOWSHLIGHTS_LABEL;Schatten / Lichter +TP_SHADOWSHLIGHTS_LABEL;Schatten/Lichter TP_SHADOWSHLIGHTS_RADIUS;Radius TP_SHADOWSHLIGHTS_SHADOWS;Schatten TP_SHADOWSHLIGHTS_SHTONALW;Tonwertbreite Schatten @@ -2117,9 +3786,9 @@ TP_SHARPENING_BLUR;Weichzeichnerradius TP_SHARPENING_CONTRAST;Kontrastschwelle TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Kantentoleranz -TP_SHARPENING_GAMMA;Gamma TP_SHARPENING_HALOCONTROL;Halokontrolle TP_SHARPENING_HCAMOUNT;Intensität +TP_SHARPENING_ITERCHECK;Iterationen automatisch limitieren TP_SHARPENING_LABEL;Schärfung TP_SHARPENING_METHOD;Methode TP_SHARPENING_ONLYEDGES;Nur Kanten schärfen @@ -2138,6 +3807,11 @@ 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_SPOT_COUNTLABEL;%1 Punkt(e) +TP_SPOT_DEFAULT_SIZE;Standard Punkt-Größe +TP_SPOT_ENTRYCHANGED;Punkt geändert +TP_SPOT_HINT;Klicken Sie auf diesen Button, um auf der Voransicht zu arbeiten.\n\nUm einen Punkt zu editieren, setzen Sie die weiße Markierung über einen zu bearbeitenden Bereich, die Geometrie des Punktes erscheint.\n\nUm einen Punkt hinzuzufügen, drücken Sie Strg und linke Maustaste, bewegen Sie den Kreis (Strg-Taste kann losgelassen werden) zu einem Quellbereich und lassen Sie die Maustaste los.\n\nUm Quell- oder Zielbereich zu verschieben, klicken Sie in den Kreis und verschieben ihn.\n\nDer innere Kreis (maximaler Anwendungsbereich) und der 'Feder'-Kreis können in der Größe verändert werden, indem die Maus darüber bewegt (der Kreis wird orange) und verschoben wird (der Kreis wird rot).\n\nWenn die Änderungen fertig sind, klicken Sie mit der rechten Maustaste außerhalb der Punkte, um den Editiermodus zu beenden oder erneut auf diesen Button. +TP_SPOT_LABEL;Flecken entfernen TP_TM_FATTAL_AMOUNT;Intensität TP_TM_FATTAL_ANCHOR;Helligkeitsverschiebung TP_TM_FATTAL_LABEL;Dynamikkompression @@ -2145,18 +3819,18 @@ TP_TM_FATTAL_THRESHOLD;Details TP_VIBRANCE_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Hautfarbtöne -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rot / Violett +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rot/Violett TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Rot -TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Rot / Gelb +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 +TP_VIBRANCE_PASTSATTOG;Pastell- und gesättigte Töne koppeln TP_VIBRANCE_PROTECTSKINS;Hautfarbtöne schützen -TP_VIBRANCE_PSTHRESHOLD;Schwelle - Pastell / gesättigte Töne +TP_VIBRANCE_PSTHRESHOLD;Schwelle - Pastell-/ gesättigte Töne TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Sättigung Schwelle -TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;Die vertikale Achse steht für die Pastell (unten) und gesättigte Töne (oben).\nDie horizontale Achse entspricht dem Sättigungsbereich. +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;Die vertikale Achse steht für die Pastell- (unten) und gesättigte Töne (oben).\nDie horizontale Achse entspricht dem Sättigungsbereich. TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Gewichtung des Übergangs pastell/gesättigt TP_VIBRANCE_SATURATED;Gesättigte Töne TP_VIGNETTING_AMOUNT;Intensität @@ -2183,14 +3857,20 @@ TP_WAVELET_B2;Restbild TP_WAVELET_BACKGROUND;Hintergrund TP_WAVELET_BACUR;Kurve TP_WAVELET_BALANCE;Kontrastausgleich d/v-h -TP_WAVELET_BALANCE_TOOLTIP;Verändert die Gewichtung zwischen den Wavelet-Richtungen vertikal, horizontal und diagonal.\n\nSind Kontrast-, Farb- oder Restbild-Dynamikkompression aktiviert, wird die Wirkung aufgrund des Ausgleichs verstärkt. +TP_WAVELET_BALANCE_TOOLTIP;Verändert die Gewichtung zwischen den Wavelet-Richtungen vertikal-horizontal und diagonal.\n\nSind Kontrast-, Farb- oder Restbild-Dynamikkompression aktiviert, wird die Wirkung aufgrund des Ausgleichs verstärkt. TP_WAVELET_BALCHRO;Farbausgleich -TP_WAVELET_BALCHRO_TOOLTIP;Wenn aktiviert, beeinflusst der Kontrastausgleich\nauch den Farbausgleich. +TP_WAVELET_BALCHROM;Farb-Equalizer +TP_WAVELET_BALCHRO_TOOLTIP;Wenn aktiviert, beeinflusst der Kontrastausgleich auch den Farbausgleich. +TP_WAVELET_BALLUM;Equalizer Rauschreduzierung SW TP_WAVELET_BANONE;Keine TP_WAVELET_BASLI;Regler TP_WAVELET_BATYPE;Kontrastmethode +TP_WAVELET_BL;Unschärfeebenen +TP_WAVELET_BLCURVE;Unschärfe nach Ebenen +TP_WAVELET_BLURFRAME;Unschärfe +TP_WAVELET_BLUWAV;Dämpfungsreaktion TP_WAVELET_CBENAB;Farbausgleich -TP_WAVELET_CB_TOOLTIP;Farbausgleich mit getrennten Reglern für\nSchatten, Mitten und Lichter aktivieren. +TP_WAVELET_CB_TOOLTIP;Farbausgleich mit getrennten Reglern für Schatten, Mitten und Lichter aktivieren. TP_WAVELET_CCURVE;Lokale Kontrastkurve TP_WAVELET_CH1;Gesamter Farbbereich TP_WAVELET_CH2;Gesättigte/Pastellfarben @@ -2198,46 +3878,80 @@ TP_WAVELET_CH3;Kontrastebenen verknüpfen 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_CHROFRAME;Rauschreduzierung Chrominanz +TP_WAVELET_CHROMAFRAME;Chroma +TP_WAVELET_CHROMCO;Chrominanz grob +TP_WAVELET_CHROMFI;Chrominanz fein +TP_WAVELET_CHRO_TOOLTIP;Wavelet-Ebene(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 Wavelet-Ebenen werden diese ignoriert. +TP_WAVELET_CHRWAV;Chroma-Unschärfe 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 +TP_WAVELET_CHTYPE;Chrominanz-Methode +TP_WAVELET_CLA;Klarheit +TP_WAVELET_CLARI;Schärfemaske und Klarheit +TP_WAVELET_COLORT;Deckkraft Rot/Grün TP_WAVELET_COMPCONT;Kontrast -TP_WAVELET_COMPGAMMA;Gammakompression +TP_WAVELET_COMPEXPERT;Erweitert +TP_WAVELET_COMPGAMMA;Gamma-Kompression TP_WAVELET_COMPGAMMA_TOOLTIP;Das Anpassen des Gammawerts des\nRestbildes ermöglicht das Angleichen\nder Daten und des Histogramms. +TP_WAVELET_COMPLEXLAB;Komplexität +TP_WAVELET_COMPLEX_TOOLTIP;Standard: zeigt eine verringerte Anzahl an Werkzeugen, ausreichend für die meisten Fälle.\nErweitert: zeigt alle Werkzeuge für komplexe Fälle. +TP_WAVELET_COMPNORMAL;Standard TP_WAVELET_COMPTM;Dynamik -TP_WAVELET_CONTEDIT;“Danach“-Kontrastkurve +TP_WAVELET_CONTEDIT;'Danach'-Kontrastkurve +TP_WAVELET_CONTFRAME;Kompression 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_CTYPE;Chrominanzkontrolle +TP_WAVELET_CTYPE;Chrominanz-Kontrolle +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Deaktiviert wenn Zoom ungefähr > 300% 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_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. +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Wendet eine Kontrasthelligkeitskurve\nam Ende der Wavelet-Verarbeitung 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 +TP_WAVELET_DAUB2;D2 - Niedrig TP_WAVELET_DAUB4;D4 - Standard TP_WAVELET_DAUB6;D6 - Standard Plus -TP_WAVELET_DAUB10;D10 - mittel -TP_WAVELET_DAUB14;D14 - hoch +TP_WAVELET_DAUB10;D10 - Mittel +TP_WAVELET_DAUB14;D14 - Hoch +TP_WAVELET_DAUBLOCAL;Wavelet Kantenperformance TP_WAVELET_DAUB_TOOLTIP;Ändert den Daubechies-Koeffizienten:\nD4 = Standard\nD14 = Häufig bestes Ergebnis auf Kosten\nvon ca. 10% längerer Verarbeitungszeit.\n\nVerbessert die Kantenerkennung sowie die Qualität\nder ersten Waveletebene. Jedoch hängt die Qualität\nnicht ausschließlich mit diesem Koeffizienten zusammen\nund kann je nach Bild und Einsatz variieren. +TP_WAVELET_DEN5THR;Schwellenwert +TP_WAVELET_DENCURV;Kurve +TP_WAVELET_DENL;Korrektur Struktur +TP_WAVELET_DENLH;Schwellenwert Ebenen 1-4 +TP_WAVELET_DENLOCAL_TOOLTIP;Verwenden Sie eine Kurve, um die Rauschreduzierung entsprechend dem lokalen Kontrast anzupassen.\nFlächen werden entrauscht, die Strukturen bleiben erhalten. +TP_WAVELET_DENMIX_TOOLTIP;Der vom anpassbaren Filter genutzte Referenzwert für den lokalen Kontrast.\nJe nach Bild können die Ergebnisse variieren, je nachdem, ob das Rauschen vor oder nach der Rauschunterdrückung gemessen wird. Mit diesen vier Auswahlmöglichkeiten können verschiedene Kombinationen von Original- und modifizierten (entrauschten) Bildern berücksichtigt werden, um den besten Kompromiss zu finden. +TP_WAVELET_DENOISE;Kurve auf lokalem Kontrast basierend +TP_WAVELET_DENOISEGUID;Schwellenwert nach Farbton +TP_WAVELET_DENOISEH;Lokaler Kontrast Hochpegel-Kurve +TP_WAVELET_DENOISEHUE;Equalizer Farbton +TP_WAVELET_DENQUA;Modus +TP_WAVELET_DENSIGMA_TOOLTIP;Passt die Form an +TP_WAVELET_DENSLI;Regler +TP_WAVELET_DENSLILAB;Methode +TP_WAVELET_DENWAVGUID_TOOLTIP;Nutzt den Farbton um die Aktion des Filters zu erhöhen oder abzuschwächen. +TP_WAVELET_DENWAVHUE_TOOLTIP;Rauschreduzierung in Abhängigkeit der Farbe. +TP_WAVELET_DETEND;Details +TP_WAVELET_DIRFRAME;Direktionaler Kontrast TP_WAVELET_DONE;Vertikal TP_WAVELET_DTHR;Diagonal TP_WAVELET_DTWO;Horizontal TP_WAVELET_EDCU;Kurve +TP_WAVELET_EDEFFECT;Dämpfungsreaktion +TP_WAVELET_EDEFFECT_TOOLTIP;Dieser Regler wählt den Bereich an Kontrastwerten, auf die sich der volle Effekt aller Anpassungen bezieht. TP_WAVELET_EDGCONT;Lokaler Kontrast TP_WAVELET_EDGCONT_TOOLTIP;Verschieben der Punkte nach links, verringert den Kontrast. Nach rechts wird der Kontrast verstärkt. TP_WAVELET_EDGE;Kantenschärfung TP_WAVELET_EDGEAMPLI;Grundverstärkung -TP_WAVELET_EDGEDETECT;Gradientenempfindlichkeit +TP_WAVELET_EDGEDETECT;Verlaufsempfindlichkeit TP_WAVELET_EDGEDETECTTHR;Schwelle niedrig (Rauschen) TP_WAVELET_EDGEDETECTTHR2;Schwelle hoch (Erkennung) TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Schwelle der Kantenerkennung für feine Details.\nVerhindert die Schärfung von Rauschen. @@ -2247,43 +3961,61 @@ TP_WAVELET_EDGREINF_TOOLTIP;Reduziert oder verstärkt die Kantenschärfung der\n TP_WAVELET_EDGTHRESH;Details TP_WAVELET_EDGTHRESH_TOOLTIP;Verschieben des Reglers nach rechts verstärkt\ndie Kantenschärfung der ersten Waveletebene\nund reduziert sie für die anderen Ebenen.\n\nNegative Werte können zu Artefakten führen. TP_WAVELET_EDRAD;Radius -TP_WAVELET_EDRAD_TOOLTIP;Der Radius unterscheidet sich von dem in\nden üblichen Schärfungswerkzeugen. Der\nWert wird mit jeder Ebene über eine komplexe\nFunktion verglichen. Ein Wert von “0“ zeigt\ndeshalb immer noch eine Auswirkung. +TP_WAVELET_EDRAD_TOOLTIP;Der Radius unterscheidet sich von dem in\nden üblichen Schärfungswerkzeugen. Der\nWert wird mit jeder Ebene über eine komplexe\nFunktion verglichen. Ein Wert von '0' zeigt\ndeshalb immer noch eine Auswirkung. TP_WAVELET_EDSL;Regler TP_WAVELET_EDTYPE;Lokale Kontrastmethode TP_WAVELET_EDVAL;Intensität TP_WAVELET_FINAL;Endretusche +TP_WAVELET_FINCFRAME;Endgültiger Lokaler Kontrast TP_WAVELET_FINEST;Fein -TP_WAVELET_HIGHLIGHT;Lichter-Luminanzbereich -TP_WAVELET_HS1;Gesamter Luminanzbereich +TP_WAVELET_FINTHR_TOOLTIP;Nutzt den lokalen Kontrast um die Wirkung des anpassbaren Filters zu erhöhen oder zu reduzieren. +TP_WAVELET_GUIDFRAME;Finales Glätten (anpassbarer Filter) +TP_WAVELET_HIGHLIGHT;Lichter-Luminanz-Bereich +TP_WAVELET_HS1;Gesamter Luminanz-Bereich TP_WAVELET_HS2;Schatten/Lichter TP_WAVELET_HUESKIN;Hautfarbton TP_WAVELET_HUESKIN_TOOLTIP;Wenn Sie den Bereich signifikant nach Links\noder Rechts verschieben müssen, ist der\nWeißabgleich nicht richtig gewählt.\nWählen Sie den eingeschlossenen Bereich so\neng wie möglich, um den Einfluss auf benachbarte\nFarben zu verhindern. TP_WAVELET_HUESKY;Himmelsfarbton -TP_WAVELET_HUESKY_TOOLTIP;Wenn Sie den Bereich signifikant nach Links\noder Rechts verschieben müssen, ist der\nWeißabgleich nicht richtig gewählt.\nWählen Sie den eingeschlossenen Bereich so\neng wie möglich, um den Einfluss auf benachbarte\nFarben zu verhindern. +TP_WAVELET_HUESKY_TOOLTIP;Wenn Sie den Bereich signifikant nach Links oder Rechts verschieben müssen, oder Artefakte entstehen, ist der Weißabgleich nicht richtig gewählt.\nWählen Sie den eingeschlossenen Bereich so\neng wie möglich, um den Einfluss auf benachbarte\nFarben zu verhindern. TP_WAVELET_ITER;Delta-Kontrastausgleich TP_WAVELET_ITER_TOOLTIP;Links: Erhöht die niedrigen und reduziert die hohen Ebenen.\nRechts: Reduziert die niedrigen und erhöht die hohen Ebenen. TP_WAVELET_LABEL;Wavelet +TP_WAVELET_LABGRID_VALUES;oben(a)=%1\noben(b)=%2\nunten(a)=%3\nunten(b)=%4 TP_WAVELET_LARGEST;Grob TP_WAVELET_LEVCH;Farbe +TP_WAVELET_LEVDEN;Rauschreduzierung Ebenen 5-6 TP_WAVELET_LEVDIR_ALL;Alle Ebenen und Richtungen TP_WAVELET_LEVDIR_INF;Kleiner oder gleich der Ebene TP_WAVELET_LEVDIR_ONE;Diese Ebene TP_WAVELET_LEVDIR_SUP;Über der Ebene +TP_WAVELET_LEVELHIGH;Radius 5-6 +TP_WAVELET_LEVELLOW;Radius 1-4 TP_WAVELET_LEVELS;Anzahl der Ebenen -TP_WAVELET_LEVELS_TOOLTIP;Wählen Sie die Anzahl der Ebenen in die das Bild zerlegt werden soll. Mehr Ebenen benötigen mehr RAM und eine längere Verarbeitungszeit. +TP_WAVELET_LEVELSIGM;Radius +TP_WAVELET_LEVELS_TOOLTIP;Wählen Sie die Anzahl der Ebenen, in die das Bild zerlegt werden soll. Mehr Ebenen benötigen mehr RAM und eine längere Verarbeitungszeit. TP_WAVELET_LEVF;Kontrast -TP_WAVELET_LEVLABEL;Vorschau max. möglicher Ebenen +TP_WAVELET_LEVFOUR;Schwellenwert Rauschminderung Ebenen 5-6 +TP_WAVELET_LEVLABEL;Vorschau max. möglicher Ebenen = %1 TP_WAVELET_LEVONE;Ebene 2 TP_WAVELET_LEVTHRE;Ebene 4 TP_WAVELET_LEVTWO;Ebene 3 TP_WAVELET_LEVZERO;Ebene 1 +TP_WAVELET_LIMDEN;Interaktion Ebenen 5-6 mit Ebenen 1-4 TP_WAVELET_LINKEDG;Mit der Kantenschärfung verbinden TP_WAVELET_LIPST;Erweiterter Algorithmus -TP_WAVELET_LOWLIGHT;Schatten-Luminanzbereich +TP_WAVELET_LOWLIGHT;Schatten-Luminanz-Bereich +TP_WAVELET_LOWTHR_TOOLTIP;Verhindert die Verstärkung feiner Texturen und Rauschen TP_WAVELET_MEDGREINF;Erste Ebene TP_WAVELET_MEDI;Artefakte in blauem Himmel reduzieren TP_WAVELET_MEDILEV;Kantenerkennung -TP_WAVELET_MEDILEV_TOOLTIP;Wenn Sie die Kantenerkennung aktivieren, sollten Sie folgende\nEinstellungen anpassen:\n\n1. Niedrige Kontrastebenen deaktivieren um Artefakte zu vermeiden.\n2. Hohe Werte bei der Gradientenempfindlichkeit einstellen.\n\nSie können die Intensität mit der Wavelet-Rauschreduzierung anpassen. +TP_WAVELET_MEDILEV_TOOLTIP;Wenn Sie die Kantenerkennung aktivieren, sollten Sie folgende\nEinstellungen anpassen:\n\n1. Niedrige Kontrastebenen deaktivieren, um Artefakte zu vermeiden.\n2. Hohe Werte bei der Verlaufsempfindlichkeit einstellen.\n\nSie können die Intensität mit der Wavelet-Rauschreduzierung anpassen. +TP_WAVELET_MERGEC;Chroma zusammenführen +TP_WAVELET_MERGEL;Luma zusammenführen +TP_WAVELET_MIXCONTRAST;Referenz +TP_WAVELET_MIXDENOISE;Rauschreduzierung +TP_WAVELET_MIXMIX;Mix 50% Rauschen - 50% Rauschreduzierung +TP_WAVELET_MIXMIX70;Mix 30% Rauschen - 70% Rauschreduzierung +TP_WAVELET_MIXNOISE;Rauschen TP_WAVELET_NEUTRAL;Neutral TP_WAVELET_NOIS;Rauschreduzierung TP_WAVELET_NOISE;Rauschreduzierung @@ -2292,50 +4024,81 @@ TP_WAVELET_NPLOW;Niedrig TP_WAVELET_NPNONE;Keine TP_WAVELET_NPTYPE;Benachbarte Pixel TP_WAVELET_NPTYPE_TOOLTIP;Dieser Algorithmus verwendet ein Pixel und acht\nseiner Nachbarn. Sind die Unterschiede gering,\nwerden die Kanten geschärft. -TP_WAVELET_OPACITY;Deckkraft Blau / Gelb +TP_WAVELET_OFFSET_TOOLTIP;Offset ändert das Gleichgewicht zwischen niedrigen und hohen Kontrastdetails.\nHohe Werte verstärken Kontraständerungen zu Details mit höherem Kontrast, während niedrige Werte Kontraständerungen zu Details mit niedrigem Kontrast verstärken.\nDurch Verwendung eines niedrigen Dämpfungsreaktionswerts können Sie auswählen, welche Kontrastwerte aufgewertet werden. +TP_WAVELET_OLDSH;Algorithmus verwendet negative Werte +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. TP_WAVELET_PASTEL;Pastellfarben TP_WAVELET_PROC;Verarbeitung +TP_WAVELET_PROTAB;Schutz +TP_WAVELET_QUAAGRES;Aggressiv +TP_WAVELET_QUACONSER;Konservativ +TP_WAVELET_RADIUS;Radius +TP_WAVELET_RANGEAB;Bereich a und b % TP_WAVELET_RE1;Schärfung verstärken TP_WAVELET_RE2;Schärfung normal TP_WAVELET_RE3;Schärfung reduzieren +TP_WAVELET_RESBLUR;Unschärfe Helligkeit +TP_WAVELET_RESBLURC;Unschärfe Buntheit +TP_WAVELET_RESBLUR_TOOLTIP;Deaktiviert, wenn Zoom > 500% TP_WAVELET_RESCHRO;Buntheit TP_WAVELET_RESCON;Schatten TP_WAVELET_RESCONH;Lichter TP_WAVELET_RESID;Restbild TP_WAVELET_SAT;Gesättigte Farben TP_WAVELET_SETTINGS;Einstellungen +TP_WAVELET_SHA;Schärfemaske +TP_WAVELET_SHFRAME;Schatten/Lichter +TP_WAVELET_SHOWMASK;Wavelet 'Maske' anzeigen +TP_WAVELET_SIGM;Radius +TP_WAVELET_SIGMA;Dämpfungsreaktion +TP_WAVELET_SIGMAFIN;Dämpfungsreaktion +TP_WAVELET_SIGMA_TOOLTIP;Der Effekt der Kontrastschieberegler ist bei mittlerem Kontrastdetails stärker und bei hohen und niedrigen Kontrastdetails schwächer.\nMit diesem Schieberegler können Sie steuern, wie schnell der Effekt zu extremen Kontrasten gedämpft wird.\nJe höher der Schieberegler eingestellt ist, desto breiter der Kontrastbereich, der zu einer starken Änderung führt, und desto höher ist das Risiko, Artefakte zu erzeugen.\nJe niedriger er ist, desto mehr wird der Effekt auf einen engen Bereich von Kontrastwerten ausgerichtet. TP_WAVELET_SKIN;Hautfarbtöne schützen TP_WAVELET_SKIN_TOOLTIP;-100: Nur Farben innerhalb des Bereichs werden verändert.\n0: Alle Farben werden gleich behandelt.\n+100: Nur Farben außerhalb des Bereichs werden verändert. TP_WAVELET_SKY;Himmelsfarbtöne schützen TP_WAVELET_SKY_TOOLTIP;-100: Nur Farben innerhalb des Bereichs werden verändert.\n0: Alle Farben werden gleich behandelt.\n+100: Nur Farben außerhalb des Bereichs werden verändert. +TP_WAVELET_SOFTRAD;Radius TP_WAVELET_STREN;Intensität +TP_WAVELET_STREND;Intensität TP_WAVELET_STRENGTH;Intensität TP_WAVELET_SUPE;Extra -TP_WAVELET_THR;Schatten Schwelle +TP_WAVELET_THR;Schwelle Schatten +TP_WAVELET_THRDEN_TOOLTIP;Erzeugt eine abgestufte Kurve, die verwendet wird, um die Rauschreduzierung als Funktion des lokalen Kontrasts zu führen. Die Rauschreduzierung wird gleichmäßig auf Bereiche mit geringem lokalem Kontrast angewendet. Bereiche mit Details (höherer lokaler Kontrast) bleiben erhalten. +TP_WAVELET_THREND;Schwellenwert Lokaler Kontrast TP_WAVELET_THRESHOLD;Lichterebenen TP_WAVELET_THRESHOLD2;Schattenebenen -TP_WAVELET_THRESHOLD2_TOOLTIP;Legt die Ebene der Untergrenze (9 minus Wert)\nfür den Schatten-Luminanzbereich fest. Der\nmaximal mögliche Wert wird vom Wert der Lichter-\nebenen begrenzt.\n\nBeeinflussbare Ebenen: Untergrenze bis Ebene 9 -TP_WAVELET_THRESHOLD_TOOLTIP;Legt die Ebene der Obergrenze für den Lichter\n-Luminanzbereich fest. Der Wert begrenzt die\nmaximal möglichen Schattenebenen.\n\nBeeinflussbare Ebenen: Ebene 1 bis Obergrenze -TP_WAVELET_THRH;Lichter Schwelle +TP_WAVELET_THRESHOLD2_TOOLTIP;Legt die Ebene der Untergrenze (9 minus Wert)\nfür den Schatten-Luminanz-Bereich fest. Der\nmaximal mögliche Wert wird vom Wert der Lichter-\nebenen begrenzt.\n\nBeeinflussbare Ebenen: Untergrenze bis Ebene 9 +TP_WAVELET_THRESHOLD_TOOLTIP;Legt die Ebene der Obergrenze für den\nLichter-Luminanz-Bereich fest. Der Wert begrenzt die\nmaximal möglichen Schattenebenen.\n\nBeeinflussbare Ebenen: Ebene 1 bis Obergrenze +TP_WAVELET_THRH;Schwelle Lichter TP_WAVELET_TILESBIG;Große Kacheln TP_WAVELET_TILESFULL;Ganzes Bild 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_TILES_TOOLTIP;'Ganzes Bild' (empfohlen) liefert eine bessere Qualität.\n'Kacheln' benötigen weniger Speicher und ist nur für Computer mit wenig RAM zu empfehlen. +TP_WAVELET_TMEDGS;Kantenschutz +TP_WAVELET_TMSCALE;Skalieren 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 Tonwertkorrektur-\nWerkzeugs im Belichtungsreiter deaktiviert. TP_WAVELET_TMTYPE;Kompression TP_WAVELET_TON;Tönung +TP_WAVELET_TONFRAME;Ausgeschlossene Farben +TP_WAVELET_USH;Keine +TP_WAVELET_USHARP;Methode +TP_WAVELET_USH_TOOLTIP;Wenn Sie 'Schärfe-Maske' auswählen, können Sie (in den Einstellungen) eine beliebige Stufe von 1 bis 4 für die Verarbeitung auswählen.\nWenn Sie 'Klarheit' wählen, können Sie (in den Einstellungen) eine Stufe zwischen 5 und Extra wählen. +TP_WAVELET_WAVLOWTHR;Schwellenwert niedriger Kontrast +TP_WAVELET_WAVOFFSET;Versatz TP_WBALANCE_AUTO;Automatisch +TP_WBALANCE_AUTOITCGREEN;Temperaturbezogen +TP_WBALANCE_AUTOOLD;RGB grau +TP_WBALANCE_AUTO_HEADER;Automatisch TP_WBALANCE_CAMERA;Kamera TP_WBALANCE_CLOUDY;Bewölkt TP_WBALANCE_CUSTOM;Benutzerdefiniert TP_WBALANCE_DAYLIGHT;Tageslicht (sonnig) -TP_WBALANCE_EQBLUERED;Blau / Rot-Korrektur -TP_WBALANCE_EQBLUERED_TOOLTIP;Ändert das normale Verhalten des Weißabgleichs durch Änderung\nder Blau / Rot-Korrektur.\n\nDas kann hilfreich sein, wenn die Aufnahmebedingen:\na) weit weg von der Standardbeleuchtung sind (z.B. unter Wasser)\nb) abweichend zu einer Kalibrierung sind.\nc) nicht zum ICC-Profil passen. +TP_WBALANCE_EQBLUERED;Blau/Rot-Korrektur +TP_WBALANCE_EQBLUERED_TOOLTIP;Ändert das normale Verhalten des Weißabgleichs durch Änderung\nder Blau/Rot-Korrektur.\n\nDas kann hilfreich sein, wenn die Aufnahmebedingen:\na) weit weg von der Standardbeleuchtung sind (z.B. unter Wasser)\nb) abweichend zu einer Kalibrierung sind.\nc) nicht zum ICC-Profil passen. TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta @@ -2347,7 +4110,7 @@ TP_WBALANCE_FLUO4;F4 - Warmweiß TP_WBALANCE_FLUO5;F5 - Tageslicht TP_WBALANCE_FLUO6;F6 - Weiß reduziert TP_WBALANCE_FLUO7;F7 - D65 Tageslichtsimulation -TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design +TP_WBALANCE_FLUO8;F8 - D50 Sylvania F40 Design TP_WBALANCE_FLUO9;F9 - Kaltweiß Deluxe TP_WBALANCE_FLUO10;F10 - Philips TL85 TP_WBALANCE_FLUO11;F11 - Philips TL84 @@ -2371,6 +4134,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (Vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Manuell setzen +TP_WBALANCE_STUDLABEL;Bezugsfaktor: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;Anzeige des berechneten Bezugsfaktors.\nNiedrigere Werte sind besser, wobei <0,005 ausgezeichnet,\n<0,01 gut und> 0,5 schlecht ist.\nNiedrige Werte bedeuten jedoch nicht automatisch, dass der Weißabgleich gut ist:\nwenn die Lichtquelle nicht eindeutig ist können die Ergebnisse fehlerhaft sein.\nEin Wert von 1000 bedeutet, dass frühere Berechnungen verwendet werden und\ndie Ergebnisse wahrscheinlich gut sind. TP_WBALANCE_TEMPBIAS;AWB-Temperatur-Korrektur TP_WBALANCE_TEMPBIAS_TOOLTIP;Prozentuale Korrektur der Farbtemperatur des automatischen\nWeißabgleichs in Richtung wärmer oder kälter.\nDer Korrekturwert berechnet sich aus:\nAWB-Temperatur + AWB-Temperatur * AWB-Temperatur-Korrektur TP_WBALANCE_TEMPERATURE;Farbtemperatur @@ -2385,11 +4150,3 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen.\nTaste: f ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!GENERAL_HELP;Help -!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -!TP_SHARPENING_ITERCHECK;Auto limit iterations diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index e30425b68..7de3a54cc 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -3,16 +3,16 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Colour label.\n\nUse dropdown menu or shortcuts:\ FILEBROWSER_POPUPCOLORLABEL;Colour label FILEBROWSER_SHOWUNCOLORHINT;Show images without a colour label.\nShortcut: Alt-0 FILECHOOSER_FILTER_COLPROF;Colour profiles (*.icc) -HISTORY_MSG_46;Colour denoising HISTORY_MSG_69;Working colour space HISTORY_MSG_70;Output colour space HISTORY_MSG_71;Input colour space HISTORY_MSG_111;L*a*b* - Avoid colour shift HISTORY_MSG_115;False colour suppression HISTORY_MSG_155;Vib - Avoid colour shift -HISTORY_MSG_191;CAM02 - Colourfulness (M) -HISTORY_MSG_197;CAM02 - Colour curve -HISTORY_MSG_198;CAM02 - Colour curve +HISTORY_MSG_174;Colour Appearance & Lighting +HISTORY_MSG_191;CAL - IA - Colourfulness (M) +HISTORY_MSG_197;CAL - IA - Colour curve +HISTORY_MSG_198;CAL - IA - Colour curve mode HISTORY_MSG_203;NR - Colour space HISTORY_MSG_221;B&W - Colour filter HISTORY_MSG_240;GF - Centre @@ -21,19 +21,74 @@ 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_385;W - Residual - Colour balance +HISTORY_MSG_392;W - Residual - Colour balance HISTORY_MSG_419;Retinex - Colour space +HISTORY_MSG_507;Local Spot centre +HISTORY_MSG_516;Local - Colour and light +HISTORY_MSG_527;Local - Colour Inverse +HISTORY_MSG_542;Local - Vib avoid colourshift +HISTORY_MSG_591;Local - Avoid colour shift +HISTORY_MSG_607;Local - Colour Mask C +HISTORY_MSG_608;Local - Colour Mask L +HISTORY_MSG_611;Local - Colour Mask H +HISTORY_MSG_612;Local - Colour Structure +HISTORY_MSG_615;Local - Blend colour +HISTORY_MSG_618;Local - Use Colour Mask +HISTORY_MSG_624;Local - Colour correction grid +HISTORY_MSG_625;Local - Colour correction strength +HISTORY_MSG_626;Local - Colour correction Method +HISTORY_MSG_634;Local - radius colour +HISTORY_MSG_650;Local - Colour mask chroma +HISTORY_MSG_651;Local - Colour mask gamma +HISTORY_MSG_652;Local - Colour mask slope +HISTORY_MSG_656;Local - Colour soft radius +HISTORY_MSG_760;Local - Colour Laplacian mask +HISTORY_MSG_770;Local - Colour Mask contrast curve +HISTORY_MSG_779;Local - Colour Mask local contrast curve +HISTORY_MSG_780;Local - Colour Mask shadows +HISTORY_MSG_783;Local - Colour Wavelet levels +HISTORY_MSG_799;Local - Colour RGB ToneCurve +HISTORY_MSG_800;Local - Colour ToneCurve Method +HISTORY_MSG_801;Local - Colour ToneCurve Special +HISTORY_MSG_803;Local - Colour Merge +HISTORY_MSG_804;Local - Colour mask Structure +HISTORY_MSG_806;Local - Colour mask Structure as tool +HISTORY_MSG_808;Local - Colour mask curve H(H) +HISTORY_MSG_821;Local - colour grid background +HISTORY_MSG_822;Local - colour background merge +HISTORY_MSG_823;Local - colour background luminance +HISTORY_MSG_830;Local - Colour gradient strength L +HISTORY_MSG_831;Local - Colour gradient angle +HISTORY_MSG_832;Local - Colour gradient strength C +HISTORY_MSG_834;Local - Colour gradient strength H +HISTORY_MSG_894;Local - Colour Preview dE +HISTORY_MSG_925;Local - Scope colour tools +HISTORY_MSG_928;Local - Common colour mask +HISTORY_MSG_980;Local - Log encoding Colourfulness M +HISTORY_MSG_996;Local - Colour recovery threshold +HISTORY_MSG_997;Local - Colour threshold mask low +HISTORY_MSG_998;Local - Colour threshold mask high +HISTORY_MSG_999;Local - Colour decay +HISTORY_MSG_1045;Local - Colour and Light strength +HISTORY_MSG_1055;Local - Colour and Light gamma +HISTORY_MSG_1070;Local - CIECAM colourfullness +HISTORY_MSG_1107;Local - CIECAM Colour method +HISTORY_MSG_1108;Local - CIECAM Colour curve 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_FILMNEGATIVE_COLORSPACE;Film negative colour space +HISTORY_MSG_HLBL;Colour propagation - blur HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid colour shift HISTORY_MSG_SH_COLORSPACE;S/H - Colourspace +HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colours 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 +PARTIALPASTE_COLORAPP;Colour Appearance & Lighting PARTIALPASTE_COLORGROUP;Colour Related Settings PARTIALPASTE_COLORTONING;Colour toning PARTIALPASTE_ICMSETTINGS;Colour management settings @@ -47,14 +102,14 @@ PREFERENCES_BEHAVIOR;Behaviour PREFERENCES_ICCDIR;Directory containing colour profiles PREFERENCES_INTENT_ABSOLUTE;Absolute Colourimetric PREFERENCES_INTENT_RELATIVE;Relative Colourimetric -PREFERENCES_MENUGROUPLABEL;Group "Colour label" +PREFERENCES_MENUGROUPLABEL;Group 'Colour label' PREFERENCES_MONPROFILE;Default colour profile PREFERENCES_PRTPROFILE;Colour profile PREFERENCES_TAB_COLORMGR;Colour Management 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. +TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image. 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. @@ -64,23 +119,30 @@ TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attent 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;Colourfulness (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Colourfulness in CIECAM02 differs from L*a*b* and RGB colourfulness. +TP_COLORAPP_CHROMA_M_TOOLTIP;Colourfulness in CIECAM is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less coloured. +TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM corresponds to the colour of a stimulus in relation to its own brightness. It differs from L*a*b* and RGB saturation. +TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM corresponds to the colour of a stimulus relative to the clarity of a stimulus that appears white under identical conditions. It differs from L*a*b* and RGB chroma. 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. -TP_COLORAPP_LABEL;CIE Colour Appearance Model 2002 -TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colours 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 slightly 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_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colourfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of C, S or M after CIECAM.\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_TOOLTIP;Affects histograms shown in Colour Appearance & Lightning curves. Does not affect RawTherapee's main histogram.\n\nEnabled: show approximate values for J and C, S or M after the CIECAM adjustments.\nDisabled: show L*a*b* values before CIECAM adjustments. +TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM colour appearance models, which were designed to better simulate how human vision perceives colours under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each colour and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +TP_COLORAPP_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a colour described as red, green, blue and yellow. +TP_COLORAPP_LABEL;Colour Appearance & Lighting +TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colours to take into account the viewing conditions of the output device. The darker the viewing conditions, the darker the image will become. Image brightness will not be changed when the viewing conditions are set to average. +TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colours to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. TP_COLORAPP_TCMODE_COLORF;Colourfulness -TP_COLORTONING_COLOR;Colour +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_METHOD_TOOLTIP;'L*a*b* blending', 'RGB sliders' and 'RGB curves' use interpolated colour blending.\n'Colour balance (Shadows/Midtones/Highlights)' and 'Saturation 2 colours' use direct colours.\n\nThe Black-and-White tool can be enabled when using any colour toning method, which allows for colour toning. TP_COLORTONING_SPLITCOCO;Colour Balance Shadows/Midtones/Highlights TP_COLORTONING_SPLITLR;Saturation 2 colours TP_COLORTONING_TWO2;Special chroma '2 colours' TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colours:\nMore predictable. -TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and centre to the preview size and centre you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_CROP_GTCENTEREDSQUARE;Centreed square +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the 'Preview' method by matching the tile size and centre to the preview size and centre you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Centre: Px=%2 Py=%3 TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Centre: Tx=%2 Ty=%3 TP_DIRPYRDENOISE_MAIN_COLORSPACE;Colour space @@ -88,7 +150,11 @@ 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_EXPOSURE_CLAMPOOG;Clip out-of-gamut colours -TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no colour) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +TP_FILMNEGATIVE_COLORSPACE;Inversion colour space: +TP_FILMNEGATIVE_COLORSPACE_INPUT;Input colour space +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the colour space used to perform the negative inversion:\nInput colour space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking colour space : perform inversion after input profile, using the currently selected working profile. +TP_FILMNEGATIVE_COLORSPACE_WORKING;Working colour space +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no colour) in the original scene. The patches should differ in brightness. TP_GRADIENT_CENTER;Centre TP_GRADIENT_CENTER_X;Centre X TP_GRADIENT_CENTER_Y;Centre Y @@ -99,24 +165,112 @@ TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC colour profile file for the c TP_ICM_INPUTEMBEDDED_TOOLTIP;Use colour profile embedded in non-raw files. TP_ICM_INPUTNONE_TOOLTIP;Use no input colour profile at all.\nUse only in special cases. TP_ICM_LABEL;Colour Management +TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different colour mode for an image, you permanently change the colour values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic colour adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). TP_LABCURVE_AVOIDCOLORSHIFT;Avoid colour shift -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colours into gamut of the working colour space and apply Munsell correction. +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colours into gamut of the working colour space and apply Munsell correction (Uniform Perceptual Lab). +TP_LOCALLAB_ADJ;Equalizer Colour +TP_LOCALLAB_AVOID;Avoid colour shift +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colours into gamut of the working colour space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +TP_LOCALLAB_BLWH_TOOLTIP;Force colour components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +TP_LOCALLAB_CENTER_X;Centre X +TP_LOCALLAB_CENTER_Y;Centre Y +TP_LOCALLAB_CIE;Colour appearance (Cam16 & JzCzHz) +TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM colour appearance model which was designed to better simulate how human vision perceives colours under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +TP_LOCALLAB_CIECOLORFRA;Colour +TP_LOCALLAB_CIE_TOOLNAME;Colour appearance (Cam16 & JzCzHz) +TP_LOCALLAB_COFR;Colour & Light +TP_LOCALLAB_COLORDE;ΔE preview colour - intensity +TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue colour preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +TP_LOCALLAB_COLORSCOPE;Scope (colour tools) +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Colour and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +TP_LOCALLAB_COLOR_CIE;Colour curve +TP_LOCALLAB_COLOR_TOOLNAME;Colour & Light +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colourful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colourful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Colour and Light. +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove colour casts, but may also introduce a blue cast which can be corrected with other tools. +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colours. +TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on colour (ΔE).\nMinimum RT-spot size: 128x128. +TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colours.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colours. +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust colour, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low colour gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Colour and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a colour and luminance background (fewer possibilties). +TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Colour, Luminosity are concerned by Merge background (ΔE). +TP_LOCALLAB_GRIDMETH_TOOLTIP;Colour toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Colour toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +TP_LOCALLAB_GRIDONE;Colour Toning +TP_LOCALLAB_LABGRID;Colour correction grid +TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a colour according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colours to the illuminant of the output device. +TP_LOCALLAB_LOGCOLORFL;Colourfulness (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less coloured. +TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived colouration with luminance. +TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived colouration with brightness. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colourfulness (M) (in Advanced mode). +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived colouration. +TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the colour of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colours to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +TP_LOCALLAB_LUMASK;Background colour/luma mask +TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or colour of the mask background in Show Mask (Mask and modifications). +TP_LOCALLAB_MASKCOM;Common Colour Mask +TP_LOCALLAB_MASKCOM_TOOLNAME;Common Colour Mask +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Colour and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colourpicker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Colour and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable colour picker' on the mask to see which areas will be affected. Make sure you set 'Background colour mask' = 0 in Settings. +TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Colour and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Colour and Light settings \n In between these two areas, the full value of the Colour and Light settings will be applied. +TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Colour propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +TP_LOCALLAB_MERCOL;Colour +TP_LOCALLAB_MERFOR;Colour Dodge +TP_LOCALLAB_MERTHI;Colour Burn +TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Colour and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Colour and Light, Wavelet, Cam16, etc.). +TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Colour and Light image with respect to the original image. +TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colourfulness sliders. +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colours to be excluded. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the centre of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colours similar to those in the centre of the spot.\nHigh values let the tool act on a wider range of colours. +TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular colour). +TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Colour & Light). +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Colour & Light). +TP_LOCALLAB_WARM;Warm/Cool & Colour artifacts +TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the colour temperature of the selected area warmer or cooler.\nIt can also reduce colour artifacts in some cases. 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_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its centre then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid colour shift TP_VIGNETTING_CENTER;Centre TP_VIGNETTING_CENTER_X;Centre X TP_VIGNETTING_CENTER_Y;Centre Y 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_BALCHROM;Equalizer Colour +TP_WAVELET_CBENAB;Toning and Colour balance 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_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the colour. 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. +TP_WAVELET_TONFRAME;Excluded colours +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. !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. @@ -142,7 +296,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !CURVEEDITOR_HIGHLIGHTS;Highlights !CURVEEDITOR_LIGHTS;Lights !CURVEEDITOR_LINEAR;Linear -!CURVEEDITOR_LOADDLGLABEL;Load curve... +!CURVEEDITOR_LOADDLGLABEL;Load curve !CURVEEDITOR_MINMAXCPOINTS;Equalizer !CURVEEDITOR_NURBS;Control cage !CURVEEDITOR_PARAMETRIC;Parametric @@ -159,7 +313,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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 @@ -219,10 +373,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !EXPORT_MAXHEIGHT;Maximum height: !EXPORT_MAXWIDTH;Maximum width: !EXPORT_PIPELINE;Processing pipeline -!EXPORT_PUTTOQUEUEFAST; Put to queue for fast export +!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_FAST_PIPELINE_TOOLTIP;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 @@ -230,7 +384,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial !FILEBROWSER_AUTODARKFRAME;Auto dark-frame !FILEBROWSER_AUTOFLATFIELD;Auto flat-field -!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !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 all including cached profiles @@ -262,6 +416,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_POPUPCOLORLABEL5;Label: Purple !FILEBROWSER_POPUPCOPYTO;Copy to... !FILEBROWSER_POPUPFILEOPERATIONS;File operations +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPMOVEEND;Move to end of queue !FILEBROWSER_POPUPMOVEHEAD;Move to head of queue !FILEBROWSER_POPUPMOVETO;Move to... @@ -335,8 +490,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !GENERAL_CANCEL;Cancel !GENERAL_CLOSE;Close !GENERAL_CURRENT;Current +!GENERAL_DELETE_ALL;Delete all !GENERAL_DISABLE;Disable !GENERAL_DISABLED;Disabled +!GENERAL_EDIT;Edit !GENERAL_ENABLE;Enable !GENERAL_ENABLED;Enabled !GENERAL_FILE;File @@ -358,17 +515,24 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. !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. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_CHANGED;Changed !HISTORY_CUSTOMCURVE;Custom curve !HISTORY_FROMCLIPBOARD;From clipboard !HISTORY_LABEL;History !HISTORY_MSG_1;Photo loaded -!HISTORY_MSG_2;PP3 loaded !HISTORY_MSG_3;PP3 changed !HISTORY_MSG_4;History browsing !HISTORY_MSG_5;Exposure - Lightness @@ -382,9 +546,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_13;Exposure - Clip !HISTORY_MSG_14;L*a*b* - Lightness !HISTORY_MSG_15;L*a*b* - Contrast -!HISTORY_MSG_16;- -!HISTORY_MSG_17;- -!HISTORY_MSG_18;- !HISTORY_MSG_19;L*a*b* - L* curve !HISTORY_MSG_20;Sharpening !HISTORY_MSG_21;USM - Radius @@ -410,9 +571,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_41;Exposure - Tone curve 1 mode !HISTORY_MSG_42;Exposure - Tone curve 2 !HISTORY_MSG_43;Exposure - Tone curve 2 mode -!HISTORY_MSG_44;Lum. denoising radius -!HISTORY_MSG_45;Lum. denoising edge tolerance -!HISTORY_MSG_47;Blend ICC highlights with matrix !HISTORY_MSG_48;DCP - Tone curve !HISTORY_MSG_49;DCP illuminant !HISTORY_MSG_50;Shadows/Highlights @@ -420,7 +578,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_52;S/H - Shadows !HISTORY_MSG_53;S/H - Highlights tonal width !HISTORY_MSG_54;S/H - Shadows tonal width -!HISTORY_MSG_55;S/H - Local contrast !HISTORY_MSG_56;S/H - Radius !HISTORY_MSG_57;Coarse rotation !HISTORY_MSG_58;Horizontal flipping @@ -432,7 +589,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_64;Crop !HISTORY_MSG_65;CA correction !HISTORY_MSG_66;Exposure - Highlight reconstruction -!HISTORY_MSG_67;Exposure - HLR amount !HISTORY_MSG_68;Exposure - HLR method !HISTORY_MSG_72;VC - Amount !HISTORY_MSG_73;Channel Mixer @@ -440,12 +596,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_75;Resize - Method !HISTORY_MSG_76;Exif metadata !HISTORY_MSG_77;IPTC metadata -!HISTORY_MSG_78;- !HISTORY_MSG_79;Resize - Width !HISTORY_MSG_80;Resize - Height !HISTORY_MSG_81;Resize !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 @@ -490,12 +644,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type !HISTORY_MSG_130;Auto distortion 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 @@ -532,35 +680,34 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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_199;CAM02 - Output histograms -!HISTORY_MSG_200;CAM02 - Tone mapping +!HISTORY_MSG_175;CAL - SC - Adaptation +!HISTORY_MSG_176;CAL - VC - Surround +!HISTORY_MSG_177;CAL - SC - Absolute luminance +!HISTORY_MSG_178;CAL - VC - Absolute luminance +!HISTORY_MSG_179;CAL - SC - WP model +!HISTORY_MSG_180;CAL - IA - Lightness (J) +!HISTORY_MSG_181;CAL - IA - Chroma (C) +!HISTORY_MSG_182;CAL - SC - Auto adaptation +!HISTORY_MSG_183;CAL - IA - Contrast (J) +!HISTORY_MSG_184;CAL - SC - Surround +!HISTORY_MSG_185;CAL - Gamut control +!HISTORY_MSG_186;CAL - IA - Algorithm +!HISTORY_MSG_187;CAL - IA - Red/skin protection +!HISTORY_MSG_188;CAL - IA - Brightness (Q) +!HISTORY_MSG_189;CAL - IA - Contrast (Q) +!HISTORY_MSG_190;CAL - IA - Saturation (S) +!HISTORY_MSG_192;CAL - IA - Hue (h) +!HISTORY_MSG_193;CAL - IA - Tone curve 1 +!HISTORY_MSG_194;CAL - IA - Tone curve 2 +!HISTORY_MSG_195;CAL - IA - Tone curve 1 mode +!HISTORY_MSG_196;CAL - IA - Tone curve 2 mode +!HISTORY_MSG_199;CAL - IA - Use CAM output for histograms +!HISTORY_MSG_200;CAL - IA - Use CAM for tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y !HISTORY_MSG_204;LMMSE enhancement steps -!HISTORY_MSG_205;CAM02 - Hot/bad pixel filter -!HISTORY_MSG_206;CAT02 - Auto scene luminosity +!HISTORY_MSG_205;CAL - Hot/bad pixel filter +!HISTORY_MSG_206;CAL - SC - Auto absolute luminance !HISTORY_MSG_207;Defringe - Hue curve !HISTORY_MSG_208;WB - B/R equalizer !HISTORY_MSG_210;GF - Angle @@ -600,7 +747,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 @@ -621,8 +767,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_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 @@ -647,7 +791,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 @@ -665,10 +808,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_318;W - Contrast - Finer levels +!HISTORY_MSG_319;W - Contrast - Finer range +!HISTORY_MSG_320;W - Contrast - Coarser range +!HISTORY_MSG_321;W - Contrast - Coarser levels !HISTORY_MSG_323;W - ES - Local contrast !HISTORY_MSG_324;W - Chroma - Pastel !HISTORY_MSG_325;W - Chroma - Saturated @@ -753,7 +896,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 @@ -768,7 +910,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -788,30 +930,45 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens @@ -822,6 +979,603 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel !HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask !HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask @@ -834,22 +1588,40 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !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_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -864,24 +1636,84 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations !HISTORY_MSG_RAW_BORDER;Raw border !HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !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_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 @@ -893,11 +1725,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !ICCPROFCREATOR_ILL_50;D50 !ICCPROFCREATOR_ILL_55;D55 !ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -907,6 +1740,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -914,13 +1748,14 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !IPTCPANEL_CATEGORY;Category !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITY;City @@ -939,7 +1774,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !IPTCPANEL_DATECREATED;Date created !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_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_EMBEDDED;Embedded @@ -998,7 +1833,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !MAIN_MSG_QOVERWRITE;Do you want to overwrite it? !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_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-a !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c @@ -1014,6 +1849,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !MAIN_TAB_FILTER; Filter !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_IPTC;IPTC +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !MAIN_TAB_METADATA;Metadata !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !MAIN_TAB_RAW;Raw @@ -1049,16 +1886,15 @@ 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_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. +!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 !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COARSETRANS;Coarse rotation/flipping -!PARTIALPASTE_COLORAPP;CIECAM02 !PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill !PARTIALPASTE_COMPOSITIONGROUP;Composition Settings !PARTIALPASTE_CROP;Crop @@ -1076,7 +1912,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_EVERYTHING;Everything !PARTIALPASTE_EXIFCHANGES;Exif !PARTIALPASTE_EXPOSURE;Exposure -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection !PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius @@ -1091,6 +1927,8 @@ 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_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter @@ -1100,6 +1938,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue @@ -1122,6 +1961,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_SHARPENING;Sharpening (USM/RL) !PARTIALPASTE_SHARPENMICRO;Microcontrast !PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_VIGNETTING;Vignetting correction @@ -1152,11 +1992,17 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !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_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP;Crop Editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1169,7 +2015,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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 @@ -1188,6 +2034,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_DIRSOFTWARE;Installation directory !PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor layout +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !PREFERENCES_EXTERNALEDITOR;External Editor !PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser @@ -1204,6 +2056,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_HLTHRESHOLD;Threshold for clipped highlights !PREFERENCES_IMPROCPARAMS;Default Processing Profile +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen !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. @@ -1213,10 +2066,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" -!PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" -!PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" -!PREFERENCES_MENUGROUPRANK;Group "Rank" +!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_MONINTENT;Default rendering intent !PREFERENCES_MONITOR;Monitor @@ -1256,7 +2109,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_PRTINTENT;Rendering intent !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_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 tool collapsed/expanded state now !PREFERENCES_SELECTLANG;Select language !PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings @@ -1267,10 +2120,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation !PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!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_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_QUEUEDONE;Queue processing done !PREFERENCES_SND_THRESHOLDSECS;After seconds @@ -1289,12 +2143,13 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_WORKFLOW;Layout +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles !PROFILEPANEL_LABEL;Processing Profiles !PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... !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_MODE_TOOLTIP;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_PCUSTOM;Custom @@ -1368,6 +2223,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1377,6 +2238,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !THRESHOLDSELECTOR_TR;Top-right !TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. !TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear @@ -1407,7 +2269,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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 !TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. !TP_BWMIX_SET_HIGHCONTAST;High contrast @@ -1446,6 +2308,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1453,41 +2316,60 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. !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_BRIGHT_TOOLTIP;Brightness in CIECAM is the amount of perceived light emanating from a stimulus. It differs from L*a*b* and RGB brightness. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed !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. -!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. -!TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation +!TP_COLORAPP_CIECAT_DEGREE;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_CONTRAST_Q_TOOLTIP;Contrast (Q) in CIECAM is based on brightness. It differs from L*a*b* and RGB contrast. +!TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) in CIECAM is based on lightness. It 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_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of J after CIECAM.\n\nJ is 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_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_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_CURVEEDITOR2_TOOLTIP;Same usage as with the first J(J) tone curve. +!TP_COLORAPP_DATACIE;Show CIECAM output histograms in CAL curves +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GAMUT;Use gamut control in L*a*b* mode +!TP_COLORAPP_GEN;Settings !TP_COLORAPP_HUE;Hue (h) -!TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. !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_LIGHT_TOOLTIP;Lightness in CIECAM is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions. It 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 by the user, the output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODEL;WP model +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02/16] + [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 + tint + CAT02/16 + [output]: temp and tint 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_NEUTRAL_TOOLTIP;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_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. !TP_COLORAPP_SURROUND;Surround +!TP_COLORAPP_SURROUNDSRC;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark !TP_COLORAPP_SURROUND_DIM;Dim @@ -1499,18 +2381,22 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TONECIE;Use CIECAM for tone mapping !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_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. !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_WBCAM;WB [RT+CAT02/16] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) +!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 @@ -1538,8 +2424,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COLORTONING_METHOD;Method !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_NEUTRAL_TOOLTIP;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 @@ -1578,7 +2464,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DEFRINGE_THRESHOLD;Threshold !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1611,14 +2497,14 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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_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. @@ -1643,7 +2529,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_DISTORTION_AMOUNT;Amount -!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_DISTORTION_AUTO_TOOLTIP;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_DISTORTION_LABEL;Distortion Correction !TP_EPD_EDGESTOPPING;Edge stopping !TP_EPD_GAMMA;Gamma @@ -1652,18 +2538,18 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength !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_AUTOLEVELS_TOOLTIP;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_CLIP;Clip % -!TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. +!TP_EXPOSURE_CLIP_TOOLTIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !TP_EXPOSURE_COMPRSHADOWS;Shadow compression !TP_EXPOSURE_CONTRAST;Contrast !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_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. @@ -1680,10 +2566,16 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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 @@ -1711,6 +2603,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_HLREC_BLEND;Blend !TP_HLREC_CIELAB;CIELab Blending !TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +!TP_HLREC_HLBLUR;Blur !TP_HLREC_LABEL;Highlight reconstruction !TP_HLREC_LUMINANCE;Luminance Recovery !TP_HLREC_METHOD;Method: @@ -1728,7 +2621,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. !TP_ICM_INPUTCAMERA;Camera standard !TP_ICM_INPUTCAMERAICC;Auto-matched camera profile !TP_ICM_INPUTCUSTOM;Custom @@ -1736,21 +2631,65 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_ICM_INPUTEMBEDDED;Use embedded, if possible !TP_ICM_INPUTNONE;No profile !TP_ICM_INPUTPROFILE;Input Profile +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset !TP_ICM_NOICM;No ICM: sRGB Output !TP_ICM_OUTPUTPROFILE;Output Profile +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. !TP_ICM_WORKINGPROFILE;Working Profile +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold @@ -1772,26 +2711,28 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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_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_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_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_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_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_LCREDSK_TOOLTIP;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_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -1807,12 +2748,710 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !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_NEUTRAL_TOOLTIP;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_LABEL;Vignette Filter !TP_PCVIGNETTE_ROUNDNESS;Roundness @@ -1820,8 +3459,29 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. !TP_PERSPECTIVE_HORIZONTAL;Horizontal !TP_PERSPECTIVE_LABEL;Perspective +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !TP_PERSPECTIVE_VERTICAL;Vertical !TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1838,11 +3498,15 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found !TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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_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_LABEL;Chromatic Aberration Correction @@ -1862,9 +3526,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBBILINEAR;DCB+Bilinear !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DCBVNG4;DCB+VNG4 @@ -1891,6 +3557,8 @@ 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_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -1900,7 +3568,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -1915,11 +3583,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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_RCD;RCD +!TP_RAW_RCDBILINEAR;RCD+Bilinear !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.\n+fast gives less artifacts in flat areas +!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_RAW_XTRANS;X-Trans @@ -1933,9 +3602,13 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RESIZE_HEIGHT;Height !TP_RESIZE_LABEL;Resize !TP_RESIZE_LANCZOS;Lanczos +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge !TP_RESIZE_METHOD;Method: !TP_RESIZE_NEAREST;Nearest !TP_RESIZE_SCALE;Scale +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_W;Width: !TP_RESIZE_WIDTH;Width @@ -1946,7 +3619,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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 @@ -1954,7 +3627,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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -1969,7 +3642,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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) @@ -1988,11 +3661,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +!TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -2002,9 +3675,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2013,7 +3686,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_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 @@ -2027,7 +3700,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_ROTATE_DEGREE;Degree !TP_ROTATE_LABEL;Rotate !TP_ROTATE_SELECTLINE;Select Straight Line -!TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter +!TP_SAVEDIALOG_OK_TOOLTIP;Shortcut: Ctrl-Enter !TP_SHADOWSHLIGHTS_HIGHLIGHTS;Highlights !TP_SHADOWSHLIGHTS_HLTONALW;Highlights tonal width !TP_SHADOWSHLIGHTS_LABEL;Shadows/Highlights @@ -2064,6 +3737,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_SHARPENMICRO_UNIFORMITY;Uniformity !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_LABEL;Spot Removal !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression @@ -2074,9 +3751,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H). !TP_VIBRANCE_LABEL;Vibrance -!TP_VIBRANCE_PASTELS;Pastel Tones +!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 @@ -2097,9 +3774,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_WAVELET_7;Level 7 !TP_WAVELET_8;Level 8 !TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To +!TP_WAVELET_APPLYTO;Apply to !TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey +!TP_WAVELET_B1;Gray !TP_WAVELET_B2;Residual !TP_WAVELET_BACKGROUND;Background !TP_WAVELET_BACUR;Curve @@ -2107,9 +3784,15 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_BALLUM;Denoise equalizer White-Black !TP_WAVELET_BANONE;None !TP_WAVELET_BASLI;Slider !TP_WAVELET_BATYPE;Contrast balance method +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CCURVE;Local contrast !TP_WAVELET_CH1;Whole chroma range !TP_WAVELET_CH2;Saturated/pastel @@ -2117,28 +3800,41 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_WAVELET_CHCU;Curve !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold -!TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!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_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green !TP_WAVELET_COMPCONT;Contrast +!TP_WAVELET_COMPEXPERT;Advanced !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_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !TP_WAVELET_COMPTM;Tone mapping !TP_WAVELET_CONTEDIT;'After' contrast curve +!TP_WAVELET_CONTFRAME;Contrast - Compression !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_CONTRA_TOOLTIP;Changes the residual image contrast. !TP_WAVELET_CTYPE;Chrominance control +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !TP_WAVELET_DALL;All directions !TP_WAVELET_DAUB;Edge performance !TP_WAVELET_DAUB2;D2 - low @@ -2146,61 +3842,99 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast !TP_WAVELET_DONE;Vertical !TP_WAVELET_DTHR;Diagonal !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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_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_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast !TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights +!TP_WAVELET_HS2;Selective luminance range !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;Hue range !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. !TP_WAVELET_LEVF;Contrast +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength !TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !TP_WAVELET_NEUTRAL;Neutral !TP_WAVELET_NOIS;Denoise !TP_WAVELET_NOISE;Denoise and Refine @@ -2209,44 +3943,74 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % !TP_WAVELET_RE1;Reinforced !TP_WAVELET_RE2;Unchanged !TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_RESCHRO;Strength !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_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREN;Refine +!TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles +!TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale !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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTO;Auto +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic !TP_WBALANCE_CAMERA;Camera !TP_WBALANCE_CLOUDY;Cloudy !TP_WBALANCE_CUSTOM;Custom @@ -2287,8 +4051,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_WBALANCE_SOLUX47;Solux 4700K (vendor) !TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) !TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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 !TP_WBALANCE_TUNGSTEN;Tungsten !TP_WBALANCE_WATER1;UnderWater 1 diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index a1e0050a8..40ad9c57b 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -23,7 +23,7 @@ !CURVEEDITOR_HIGHLIGHTS;Highlights !CURVEEDITOR_LIGHTS;Lights !CURVEEDITOR_LINEAR;Linear -!CURVEEDITOR_LOADDLGLABEL;Load curve... +!CURVEEDITOR_LOADDLGLABEL;Load curve !CURVEEDITOR_MINMAXCPOINTS;Equalizer !CURVEEDITOR_NURBS;Control cage !CURVEEDITOR_PARAMETRIC;Parametric @@ -40,7 +40,7 @@ !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_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 @@ -101,10 +101,10 @@ !EXPORT_MAXHEIGHT;Maximum height: !EXPORT_MAXWIDTH;Maximum width: !EXPORT_PIPELINE;Processing pipeline -!EXPORT_PUTTOQUEUEFAST; Put to queue for fast export +!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_FAST_PIPELINE_TOOLTIP;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 @@ -112,7 +112,7 @@ !FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial !FILEBROWSER_AUTODARKFRAME;Auto dark-frame !FILEBROWSER_AUTOFLATFIELD;Auto flat-field -!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !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 all including cached profiles @@ -146,6 +146,7 @@ !FILEBROWSER_POPUPCOLORLABEL5;Label: Purple !FILEBROWSER_POPUPCOPYTO;Copy to... !FILEBROWSER_POPUPFILEOPERATIONS;File operations +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPMOVEEND;Move to end of queue !FILEBROWSER_POPUPMOVEHEAD;Move to head of queue !FILEBROWSER_POPUPMOVETO;Move to... @@ -221,8 +222,10 @@ !GENERAL_CANCEL;Cancel !GENERAL_CLOSE;Close !GENERAL_CURRENT;Current +!GENERAL_DELETE_ALL;Delete all !GENERAL_DISABLE;Disable !GENERAL_DISABLED;Disabled +!GENERAL_EDIT;Edit !GENERAL_ENABLE;Enable !GENERAL_ENABLED;Enabled !GENERAL_FILE;File @@ -244,17 +247,24 @@ !HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. !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. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_CHANGED;Changed !HISTORY_CUSTOMCURVE;Custom curve !HISTORY_FROMCLIPBOARD;From clipboard !HISTORY_LABEL;History !HISTORY_MSG_1;Photo loaded -!HISTORY_MSG_2;PP3 loaded !HISTORY_MSG_3;PP3 changed !HISTORY_MSG_4;History browsing !HISTORY_MSG_5;Exposure - Lightness @@ -268,9 +278,6 @@ !HISTORY_MSG_13;Exposure - Clip !HISTORY_MSG_14;L*a*b* - Lightness !HISTORY_MSG_15;L*a*b* - Contrast -!HISTORY_MSG_16;- -!HISTORY_MSG_17;- -!HISTORY_MSG_18;- !HISTORY_MSG_19;L*a*b* - L* curve !HISTORY_MSG_20;Sharpening !HISTORY_MSG_21;USM - Radius @@ -296,10 +303,6 @@ !HISTORY_MSG_41;Exposure - Tone curve 1 mode !HISTORY_MSG_42;Exposure - Tone curve 2 !HISTORY_MSG_43;Exposure - Tone curve 2 mode -!HISTORY_MSG_44;Lum. denoising radius -!HISTORY_MSG_45;Lum. denoising edge tolerance -!HISTORY_MSG_46;Color denoising -!HISTORY_MSG_47;Blend ICC highlights with matrix !HISTORY_MSG_48;DCP - Tone curve !HISTORY_MSG_49;DCP illuminant !HISTORY_MSG_50;Shadows/Highlights @@ -307,7 +310,6 @@ !HISTORY_MSG_52;S/H - Shadows !HISTORY_MSG_53;S/H - Highlights tonal width !HISTORY_MSG_54;S/H - Shadows tonal width -!HISTORY_MSG_55;S/H - Local contrast !HISTORY_MSG_56;S/H - Radius !HISTORY_MSG_57;Coarse rotation !HISTORY_MSG_58;Horizontal flipping @@ -319,7 +321,6 @@ !HISTORY_MSG_64;Crop !HISTORY_MSG_65;CA correction !HISTORY_MSG_66;Exposure - Highlight reconstruction -!HISTORY_MSG_67;Exposure - HLR amount !HISTORY_MSG_68;Exposure - HLR method !HISTORY_MSG_69;Working color space !HISTORY_MSG_70;Output color space @@ -330,12 +331,10 @@ !HISTORY_MSG_75;Resize - Method !HISTORY_MSG_76;Exif metadata !HISTORY_MSG_77;IPTC metadata -!HISTORY_MSG_78;- !HISTORY_MSG_79;Resize - Width !HISTORY_MSG_80;Resize - Height !HISTORY_MSG_81;Resize !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 @@ -382,12 +381,6 @@ !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type !HISTORY_MSG_130;Auto distortion 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 @@ -425,39 +418,39 @@ !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_174;Color Appearance & Lighting +!HISTORY_MSG_175;CAL - SC - Adaptation +!HISTORY_MSG_176;CAL - VC - Surround +!HISTORY_MSG_177;CAL - SC - Absolute luminance +!HISTORY_MSG_178;CAL - VC - Absolute luminance +!HISTORY_MSG_179;CAL - SC - WP model +!HISTORY_MSG_180;CAL - IA - Lightness (J) +!HISTORY_MSG_181;CAL - IA - Chroma (C) +!HISTORY_MSG_182;CAL - SC - Auto adaptation +!HISTORY_MSG_183;CAL - IA - Contrast (J) +!HISTORY_MSG_184;CAL - SC - Surround +!HISTORY_MSG_185;CAL - Gamut control +!HISTORY_MSG_186;CAL - IA - Algorithm +!HISTORY_MSG_187;CAL - IA - Red/skin protection +!HISTORY_MSG_188;CAL - IA - Brightness (Q) +!HISTORY_MSG_189;CAL - IA - Contrast (Q) +!HISTORY_MSG_190;CAL - IA - Saturation (S) +!HISTORY_MSG_191;CAL - IA - Colorfulness (M) +!HISTORY_MSG_192;CAL - IA - Hue (h) +!HISTORY_MSG_193;CAL - IA - Tone curve 1 +!HISTORY_MSG_194;CAL - IA - Tone curve 2 +!HISTORY_MSG_195;CAL - IA - Tone curve 1 mode +!HISTORY_MSG_196;CAL - IA - Tone curve 2 mode +!HISTORY_MSG_197;CAL - IA - Color curve +!HISTORY_MSG_198;CAL - IA - Color curve mode +!HISTORY_MSG_199;CAL - IA - Use CAM output for histograms +!HISTORY_MSG_200;CAL - IA - Use CAM for 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_205;CAL - Hot/bad pixel filter +!HISTORY_MSG_206;CAL - SC - Auto absolute luminance !HISTORY_MSG_207;Defringe - Hue curve !HISTORY_MSG_208;WB - B/R equalizer !HISTORY_MSG_210;GF - Angle @@ -500,7 +493,6 @@ !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 @@ -524,8 +516,6 @@ !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance !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 @@ -550,7 +540,6 @@ !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 @@ -568,10 +557,10 @@ !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_318;W - Contrast - Finer levels +!HISTORY_MSG_319;W - Contrast - Finer range +!HISTORY_MSG_320;W - Contrast - Coarser range +!HISTORY_MSG_321;W - Contrast - Coarser levels !HISTORY_MSG_322;W - Gamut - Avoid color shift !HISTORY_MSG_323;W - ES - Local contrast !HISTORY_MSG_324;W - Chroma - Pastel @@ -635,14 +624,14 @@ !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_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 - Color Balance +!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 @@ -659,7 +648,6 @@ !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 @@ -675,7 +663,7 @@ !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -695,30 +683,45 @@ !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens @@ -729,6 +732,654 @@ !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -744,22 +1395,42 @@ !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_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !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_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -774,26 +1445,87 @@ !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !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_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 @@ -805,11 +1537,12 @@ !ICCPROFCREATOR_ILL_50;D50 !ICCPROFCREATOR_ILL_55;D55 !ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -819,6 +1552,7 @@ !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -826,13 +1560,14 @@ !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !IPTCPANEL_CATEGORY;Category !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITY;City @@ -851,7 +1586,7 @@ !IPTCPANEL_DATECREATED;Date created !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_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_EMBEDDED;Embedded @@ -910,7 +1645,7 @@ !MAIN_MSG_QOVERWRITE;Do you want to overwrite it? !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_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-a !MAIN_TAB_COLOR;Color @@ -927,6 +1662,8 @@ !MAIN_TAB_FILTER; Filter !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_IPTC;IPTC +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !MAIN_TAB_METADATA;Metadata !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !MAIN_TAB_RAW;Raw @@ -966,16 +1703,16 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!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. +!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 !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COARSETRANS;Coarse rotation/flipping -!PARTIALPASTE_COLORAPP;CIECAM02 +!PARTIALPASTE_COLORAPP;Color Appearance & Lighting !PARTIALPASTE_COLORGROUP;Color Related Settings !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill @@ -995,7 +1732,7 @@ !PARTIALPASTE_EVERYTHING;Everything !PARTIALPASTE_EXIFCHANGES;Exif !PARTIALPASTE_EXPOSURE;Exposure -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection !PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius @@ -1011,6 +1748,8 @@ !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter @@ -1020,6 +1759,7 @@ !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift @@ -1044,6 +1784,7 @@ !PARTIALPASTE_SHARPENING;Sharpening (USM/RL) !PARTIALPASTE_SHARPENMICRO;Microcontrast !PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_VIGNETTING;Vignetting correction @@ -1079,11 +1820,17 @@ !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !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_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP;Crop Editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1096,7 +1843,7 @@ !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_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 @@ -1115,6 +1862,12 @@ !PREFERENCES_DIRSOFTWARE;Installation directory !PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor layout +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !PREFERENCES_EXTERNALEDITOR;External Editor !PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser @@ -1132,6 +1885,7 @@ !PREFERENCES_HLTHRESHOLD;Threshold for clipped highlights !PREFERENCES_ICCDIR;Directory containing color profiles !PREFERENCES_IMPROCPARAMS;Default Processing Profile +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen !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. @@ -1143,11 +1897,11 @@ !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_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_MONINTENT;Default rendering intent !PREFERENCES_MONITOR;Monitor @@ -1189,7 +1943,7 @@ !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_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 tool collapsed/expanded state now !PREFERENCES_SELECTLANG;Select language !PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings @@ -1200,10 +1954,11 @@ !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation !PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!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_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_QUEUEDONE;Queue processing done !PREFERENCES_SND_THRESHOLDSECS;After seconds @@ -1223,12 +1978,13 @@ !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_WORKFLOW;Layout +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles !PROFILEPANEL_LABEL;Processing Profiles !PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... !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_MODE_TOOLTIP;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_PCUSTOM;Custom @@ -1304,6 +2060,12 @@ !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. !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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1314,7 +2076,8 @@ !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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image. 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 !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear @@ -1350,7 +2113,7 @@ !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_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. @@ -1390,6 +2153,7 @@ !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_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1399,51 +2163,76 @@ !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_BRIGHT_TOOLTIP;Brightness in CIECAM is the amount of perceived light emanating from a stimulus. It differs from L*a*b* and RGB brightness. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed !TP_COLORAPP_CHROMA;Chroma (C) !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_M_TOOLTIP;Colorfulness in CIECAM is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less colored. !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_CHROMA_S_TOOLTIP;Saturation in CIECAM corresponds to the color of a stimulus in relation to its own brightness. It differs from L*a*b* and RGB saturation. +!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM corresponds to the color of a stimulus relative to the clarity of a stimulus that appears white under identical conditions. It differs from L*a*b* and RGB chroma. +!TP_COLORAPP_CIECAT_DEGREE;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_CONTRAST_Q_TOOLTIP;Contrast (Q) in CIECAM is based on brightness. It differs from L*a*b* and RGB contrast. +!TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) in CIECAM is based on lightness. It 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_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of J after CIECAM.\n\nJ is 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_CURVEEDITOR2_TOOLTIP;Same usage as with the first J(J) 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_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_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of C, S or M after CIECAM.\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;Show CIECAM output histograms in CAL curves +!TP_COLORAPP_DATACIE_TOOLTIP;Affects histograms shown in Color Appearance & Lightning curves. Does not affect RawTherapee's main histogram.\n\nEnabled: show approximate values for J and C, S or M after the CIECAM adjustments.\nDisabled: show L*a*b* values before CIECAM adjustments. +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GAMUT;Use gamut control in L*a*b* mode +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. !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_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a color described as red, green, blue and yellow. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_LABEL;Color Appearance & Lighting !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_LIGHT_TOOLTIP;Lightness in CIECAM is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions. It 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 by the user, the output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODEL;WP model +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02/16] + [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 + tint + CAT02/16 + [output]: temp and tint 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_NEUTRAL_TOOLTIP;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_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. !TP_COLORAPP_SURROUND;Surround +!TP_COLORAPP_SURROUNDSRC;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 slightly 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_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device. The darker the viewing conditions, the darker the image will become. Image brightness will not be changed when the viewing conditions are set to average. +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness @@ -1452,19 +2241,23 @@ !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_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TONECIE;Use CIECAM for tone mapping !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_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. !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_WBCAM;WB [RT+CAT02/16] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_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 @@ -1494,11 +2287,11 @@ !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_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_NEUTRAL_TOOLTIP;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 @@ -1516,6 +2309,7 @@ !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_FIXRATIO;Lock ratio +!TP_CROP_GTCENTEREDSQUARE;Centered square !TP_CROP_GTDIAGONALS;Rule of Diagonals !TP_CROP_GTEPASSPORT;Biometric Passport !TP_CROP_GTFRAME;Frame @@ -1541,7 +2335,7 @@ !TP_DEFRINGE_THRESHOLD;Threshold !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1554,7 +2348,7 @@ !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_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. @@ -1578,14 +2372,14 @@ !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_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_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. @@ -1613,7 +2407,7 @@ !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_AMOUNT;Amount -!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_DISTORTION_AUTO_TOOLTIP;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_DISTORTION_LABEL;Distortion Correction !TP_EPD_EDGESTOPPING;Edge stopping !TP_EPD_GAMMA;Gamma @@ -1622,19 +2416,19 @@ !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength !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_AUTOLEVELS_TOOLTIP;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_CLIP_TOOLTIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !TP_EXPOSURE_COMPRSHADOWS;Shadow compression !TP_EXPOSURE_CONTRAST;Contrast !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_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. @@ -1651,11 +2445,21 @@ !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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 @@ -1687,6 +2491,7 @@ !TP_HLREC_CIELAB;CIELab Blending !TP_HLREC_COLOR;Color Propagation !TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +!TP_HLREC_HLBLUR;Blur !TP_HLREC_LABEL;Highlight reconstruction !TP_HLREC_LUMINANCE;Luminance Recovery !TP_HLREC_METHOD;Method: @@ -1704,7 +2509,9 @@ !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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. !TP_ICM_INPUTCAMERA;Camera standard !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. @@ -1718,26 +2525,71 @@ !TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. !TP_ICM_INPUTPROFILE;Input Profile !TP_ICM_LABEL;Color Management +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset !TP_ICM_NOICM;No ICM: sRGB Output !TP_ICM_OUTPUTPROFILE;Output Profile +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. !TP_ICM_WORKINGPROFILE;Working Profile +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !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 -!TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. +!TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). !TP_LABCURVE_BRIGHTNESS;Lightness !TP_LABCURVE_CHROMATICITY;Chromaticity !TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. @@ -1756,26 +2608,28 @@ !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_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_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_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_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_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_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_LCREDSK_TOOLTIP;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_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -1791,12 +2645,794 @@ !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !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_NEUTRAL_TOOLTIP;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 @@ -1805,8 +3441,29 @@ !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. !TP_PERSPECTIVE_HORIZONTAL;Horizontal !TP_PERSPECTIVE_LABEL;Perspective +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !TP_PERSPECTIVE_VERTICAL;Vertical !TP_PFCURVE_CURVEEDITOR_CH;Hue !TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. @@ -1824,11 +3481,15 @@ !TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found !TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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_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 @@ -1849,9 +3510,11 @@ !TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBBILINEAR;DCB+Bilinear !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DCBVNG4;DCB+VNG4 @@ -1879,6 +3542,8 @@ !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -1889,7 +3554,7 @@ !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -1904,11 +3569,12 @@ !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_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_RCD;RCD +!TP_RAW_RCDBILINEAR;RCD+Bilinear !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.\n+fast gives less artifacts in flat areas +!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_RAW_XTRANS;X-Trans @@ -1922,9 +3588,13 @@ !TP_RESIZE_HEIGHT;Height !TP_RESIZE_LABEL;Resize !TP_RESIZE_LANCZOS;Lanczos +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge !TP_RESIZE_METHOD;Method: !TP_RESIZE_NEAREST;Nearest !TP_RESIZE_SCALE;Scale +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_W;Width: !TP_RESIZE_WIDTH;Width @@ -1935,7 +3605,7 @@ !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_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 @@ -1943,7 +3613,7 @@ !TP_RETINEX_GAIN;Gain !TP_RETINEX_GAINOFFS;Gain and Offset (brightness) !TP_RETINEX_GAINTRANSMISSION;Gain transmission -!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_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -1958,7 +3628,7 @@ !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_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) @@ -1977,11 +3647,11 @@ !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +!TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -1991,9 +3661,9 @@ !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2002,7 +3672,7 @@ !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_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 @@ -2017,7 +3687,7 @@ !TP_ROTATE_DEGREE;Degree !TP_ROTATE_LABEL;Rotate !TP_ROTATE_SELECTLINE;Select Straight Line -!TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter +!TP_SAVEDIALOG_OK_TOOLTIP;Shortcut: Ctrl-Enter !TP_SHADOWSHLIGHTS_HIGHLIGHTS;Highlights !TP_SHADOWSHLIGHTS_HLTONALW;Highlights tonal width !TP_SHADOWSHLIGHTS_LABEL;Shadows/Highlights @@ -2054,6 +3724,11 @@ !TP_SHARPENMICRO_UNIFORMITY;Uniformity !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression @@ -2065,9 +3740,9 @@ !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_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H). !TP_VIBRANCE_LABEL;Vibrance -!TP_VIBRANCE_PASTELS;Pastel Tones +!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 @@ -2091,22 +3766,28 @@ !TP_WAVELET_7;Level 7 !TP_WAVELET_8;Level 8 !TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To +!TP_WAVELET_APPLYTO;Apply to !TP_WAVELET_AVOID;Avoid color shift !TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey +!TP_WAVELET_B1;Gray !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_BALCHROM;Equalizer Color !TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +!TP_WAVELET_BALLUM;Denoise equalizer White-Black !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_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CCURVE;Local contrast !TP_WAVELET_CH1;Whole chroma range !TP_WAVELET_CH2;Saturated/pastel @@ -2114,29 +3795,42 @@ !TP_WAVELET_CHCU;Curve !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!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_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green !TP_WAVELET_COMPCONT;Contrast +!TP_WAVELET_COMPEXPERT;Advanced !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_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !TP_WAVELET_COMPTM;Tone mapping !TP_WAVELET_CONTEDIT;'After' contrast curve +!TP_WAVELET_CONTFRAME;Contrast - Compression !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_CONTRA_TOOLTIP;Changes the residual image contrast. !TP_WAVELET_CTYPE;Chrominance control +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !TP_WAVELET_DALL;All directions !TP_WAVELET_DAUB;Edge performance !TP_WAVELET_DAUB2;D2 - low @@ -2144,62 +3838,101 @@ !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_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast !TP_WAVELET_DONE;Vertical !TP_WAVELET_DTHR;Diagonal !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 +!TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast !TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights +!TP_WAVELET_HS2;Selective luminance range !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;Hue range !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. !TP_WAVELET_LEVF;Contrast +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength !TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !TP_WAVELET_NEUTRAL;Neutral !TP_WAVELET_NOIS;Denoise !TP_WAVELET_NOISE;Denoise and Refine @@ -2208,50 +3941,81 @@ !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % !TP_WAVELET_RE1;Reinforced !TP_WAVELET_RE2;Unchanged !TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_RESCHRO;Strength !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_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREN;Refine +!TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles +!TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale !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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset !TP_WBALANCE_AUTO;Auto +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic !TP_WBALANCE_CAMERA;Camera !TP_WBALANCE_CLOUDY;Cloudy !TP_WBALANCE_CUSTOM;Custom !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_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 @@ -2287,8 +4051,10 @@ !TP_WBALANCE_SOLUX47;Solux 4700K (vendor) !TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) !TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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 !TP_WBALANCE_TUNGSTEN;Tungsten !TP_WBALANCE_WATER1;UnderWater 1 diff --git a/rtdata/languages/Espanol (Castellano) b/rtdata/languages/Espanol (Castellano) new file mode 100644 index 000000000..ede64894f --- /dev/null +++ b/rtdata/languages/Espanol (Castellano) @@ -0,0 +1,4068 @@ +#01 Español - Castellano +#02 2022-10-08 Francisco Lorés y Javier Bartol, para la versión 5.9 + +ABOUT_TAB_BUILD;Versión +ABOUT_TAB_CREDITS;Reconocimientos +ABOUT_TAB_LICENSE;Licencia +ABOUT_TAB_RELEASENOTES;Notas sobre la versión +ABOUT_TAB_SPLASH;Pantalla inicial +ADJUSTER_RESET_TO_DEFAULT;Clic - restaurar al valor predeterminado.\nCtrl+clic - restaurar al valor inicial. +BATCH_PROCESSING;Revelado por lotes +CURVEEDITOR_AXIS_IN;E: +CURVEEDITOR_AXIS_LEFT_TAN;TI: +CURVEEDITOR_AXIS_OUT;S: +CURVEEDITOR_AXIS_RIGHT_TAN;TD: +CURVEEDITOR_CATMULLROM;Flexible +CURVEEDITOR_CURVE;Curva +CURVEEDITOR_CURVES;Curvas +CURVEEDITOR_CUSTOM;Personalizada +CURVEEDITOR_DARKS;Medios tonos oscuros +CURVEEDITOR_EDITPOINT_HINT;Activa la edición de los valores de entrada/salida de los nodos.\nPara seleccionar un nodo, se hace clic en él con el botón derecho.\nPara anular la selección del nodo, se hace clic con el botón derecho en alguna zona vacía. +CURVEEDITOR_HIGHLIGHTS;Luces +CURVEEDITOR_LIGHTS;Medios tonos claros +CURVEEDITOR_LINEAR;Lineal +CURVEEDITOR_LOADDLGLABEL;Cargar curva... +CURVEEDITOR_MINMAXCPOINTS;Ecualizador +CURVEEDITOR_NURBS;Jaula de control +CURVEEDITOR_PARAMETRIC;Paramétrica +CURVEEDITOR_SAVEDLGLABEL;Guardar curva... +CURVEEDITOR_SHADOWS;Sombras +CURVEEDITOR_TOOLTIPCOPY;Copia la curva actual al portapapeles. +CURVEEDITOR_TOOLTIPLINEAR;Restablece la curva a línea recta. +CURVEEDITOR_TOOLTIPLOAD;Carga una curva desde un archivo. +CURVEEDITOR_TOOLTIPPASTE;Pega la curva desde el portapapeles. +CURVEEDITOR_TOOLTIPSAVE;Guarda la curva actual. +CURVEEDITOR_TYPE;Tipo: +DIRBROWSER_FOLDERS;Carpetas +DONT_SHOW_AGAIN;No volver a mostrar este mensaje. +DYNPROFILEEDITOR_DELETE;Borrar +DYNPROFILEEDITOR_EDIT;Editar +DYNPROFILEEDITOR_EDIT_RULE;Editar la regla del perfil dinámico +DYNPROFILEEDITOR_ENTRY_TOOLTIP;El filtrado no distingue entre mayúsculas y minúsculas.\nPara introducir una expresión regular se utiliza el prefijo «re:». +DYNPROFILEEDITOR_IMGTYPE_ANY;Cualquiera +DYNPROFILEEDITOR_IMGTYPE_HDR;Alto rango dinámico (HDR) +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +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 revelado +EDITWINDOW_TITLE;Edición de imagen +EDIT_OBJECT_TOOLTIP;Muestra una retícula auxiliar en la vista previa, que permite ajustar los diferentes parámetros de la herramienta. +EDIT_PIPETTE_TOOLTIP;Para agregar un punto de ajuste a la curva, se mantiene presionada la tecla Ctrl mientras se hace clic con el ratón sobre el lugar deseado de la vista previa.\nPara ajustar el punto, se mantiene presionada la tecla Ctrl mientras se hace clic sobre el área correspondiente de la vista previa, y a continuación se suelta la tecla Ctrl (a no ser que se necesite un control preciso) y se mueve el ratón hacia arriba o hacia abajo, con lo que el punto se moverá arriba o abajo en la curva. +EXIFFILTER_APERTURE;Apertura +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;Objetivo +EXIFFILTER_METADATAFILTER;Activar los filtros de metadatos +EXIFFILTER_SHUTTER;Velocidad de obturación +EXIFPANEL_ADDEDIT;Agregar/Editar +EXIFPANEL_ADDEDITHINT;Agrega nuevo atributo o cambia atributo. +EXIFPANEL_ADDTAGDLG_ENTERVALUE;Introducir valor +EXIFPANEL_ADDTAGDLG_SELECTTAG;Seleccionar atributo +EXIFPANEL_ADDTAGDLG_TITLE;Agregar/Editar atributo +EXIFPANEL_KEEP;Conservar +EXIFPANEL_KEEPHINT;Conserva los atributos seleccionados al escribir el archivo. +EXIFPANEL_REMOVE;Borrar +EXIFPANEL_REMOVEHINT;Quita los atributos seleccionados al escribir el archivo. +EXIFPANEL_RESET;Restablecer +EXIFPANEL_RESETALL;Restablecer todo +EXIFPANEL_RESETALLHINT;Restablece todos los atributos a los valores predeterminados. +EXIFPANEL_RESETHINT;Restablece los atributos seleccionados a los valores predeterminados. +EXIFPANEL_SHOWALL;Mostrar todo +EXIFPANEL_SUBDIRECTORY;Subdirectorio +EXPORT_BYPASS;Pasos del revelado que se ignorarán +EXPORT_BYPASS_ALL;Seleccionar / Deseleccionar todo +EXPORT_BYPASS_DEFRINGE;Ignorar «Quitar borde púrpura» +EXPORT_BYPASS_DIRPYRDENOISE;Ignorar «Reducción de ruido» +EXPORT_BYPASS_DIRPYREQUALIZER;Ignorar «Contraste por niveles de detalle» +EXPORT_BYPASS_EQUALIZER;Ignorar «Niveles de ondícula» +EXPORT_BYPASS_RAW_CA;Ignorar «Corrección de aberración cromática [raw]» +EXPORT_BYPASS_RAW_CCSTEPS;Ignorar «Eliminación de colores falsos [raw]» +EXPORT_BYPASS_RAW_DCB_ENHANCE;Ignorar «Pasos de mejora de DCB [raw]» +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Ignorar «Iteraciones de DCB [raw]» +EXPORT_BYPASS_RAW_DF;Ignorar «Foto negra [raw]» +EXPORT_BYPASS_RAW_FF;Ignorar «Imagen de Campo plano [raw]» +EXPORT_BYPASS_RAW_GREENTHRESH;Ignorar «Equilibrado de verdes [raw]» +EXPORT_BYPASS_RAW_LINENOISE;Ignorar «Filtro de ruido de línea [raw]» +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Ignorar «Pasos de mejora de LMMSE [raw]» +EXPORT_BYPASS_SHARPENEDGE;Ignorar «Nitidez de bordes» +EXPORT_BYPASS_SHARPENING;Ignorar «Nitidez» +EXPORT_BYPASS_SHARPENMICRO;Ignorar «Microcontraste» +EXPORT_FASTEXPORTOPTIONS;Selección del tipo de Exportacion rápida +EXPORT_INSTRUCTIONS;La Exportación rápida pretende reducir la cantidad de recursos y tiempo necesarios para revelar las fotos.\n\nSe puede escoger entre reducir la imagen y procesarla con todas las herramientas, o procesar sólo con algunas herramientas y después reducir la imagen.\n\nSe recomienda la Exportación rápida cuando la velocidad es prioritaria, generando más rápidamente imágenes de menor resolución, o si se desea cambiar el tamaño de una o muchas imágenes sin modificar sus parámetros de revelado. +EXPORT_MAXHEIGHT;Altura máxima: +EXPORT_MAXWIDTH;Anchura máxima: +EXPORT_PIPELINE;Circuito de revelado +EXPORT_PUTTOQUEUEFAST;Enviar a la cola para exportación rápida +EXPORT_RAW_DMETHOD;Método de desentramado +EXPORT_USE_FAST_PIPELINE;Circuito rápido (cambia el tamaño al principio) +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Usa un circuito de revelado que favorece la velocidad a costa de la calidad: el cambio de tamaño de la imagen se realiza lo antes posible, en lugar de hacerlo al final como en el circuito normal.\n\nEl incremento de velocidad puede ser importante, pero probablemente aparecerán artefactos de compresión y se producirá una degradación general de la calidad en el archivo de salida. +EXPORT_USE_NORMAL_PIPELINE;Circuito estándar (cambia el tamaño al final) +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;revelado en la cola +FILEBROWSER_APPLYPROFILE;Aplicar perfil +FILEBROWSER_APPLYPROFILE_PARTIAL;Aplicar perfil (parcialmente) +FILEBROWSER_AUTODARKFRAME;Foto negra automática +FILEBROWSER_AUTOFLATFIELD;Campo plano automático +FILEBROWSER_BROWSEPATHBUTTONHINT;Pulsando este botón se examina la carpeta seleccionada, se vuelve a cargar la carpeta y se aplican las palabras clave de búsqueda. +FILEBROWSER_BROWSEPATHHINT;Aquí se escribe la ruta a examinar.\n\nAtajos de teclado:\nCtrl-o para poner el foco en el campo de texto para la ruta.\nIntro / Ctrl-Intro para examinar la ruta indicada;\nEsc para borrar los cambios.\nMayús-Esc para quitar el foco.\n\nAbreviaturas de rutas:\n~ - carpeta personal del usuario.\n! - carpeta de imágenes del usuario. +FILEBROWSER_CACHE;Caché +FILEBROWSER_CACHECLEARFROMFULL;Borrar todo, incluso los perfiles en caché +FILEBROWSER_CACHECLEARFROMPARTIAL;Borrar todo, excepto los perfiles del caché +FILEBROWSER_CLEARPROFILE;Borrar el perfil +FILEBROWSER_COLORLABEL_TOOLTIP;Etiqueta con un color.\n\nSe puede utilizar el menú desplegable o los atajos de teclado:\nMayús-Ctrl-0 Sin color\nMayús-Ctrl-1 Rojo\nMayús-Ctrl-2 Amarillo\nMayús-Ctrl-3 Verde\nMayús-Ctrl-4 Azul\nMayús-Ctrl-5 Morado +FILEBROWSER_COPYPROFILE;Copiar perfil +FILEBROWSER_CURRENT_NAME;Nombre actual: +FILEBROWSER_DARKFRAME;Foto Negra +FILEBROWSER_DELETEDIALOG_ALL;¿Está seguro de que desea borrar permanentemente los %1 archivos que hay en la papelera? +FILEBROWSER_DELETEDIALOG_HEADER;Confirmación para borrar archivo: +FILEBROWSER_DELETEDIALOG_SELECTED;¿Está seguro de que desea borrar permanentemente los %1 archivos seleccionados? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;¿Está seguro de que desea borrar los %1 archivos seleccionados, incluyendo las versiones reveladas en la cola? +FILEBROWSER_EMPTYTRASH;Vaciar la papelera +FILEBROWSER_EMPTYTRASHHINT;Borra definitivamente los archivos de la papelera. +FILEBROWSER_EXTPROGMENU;Abrir con +FILEBROWSER_FLATFIELD;Campo plano +FILEBROWSER_MOVETODARKFDIR;Mover a la carpeta de fotos negras +FILEBROWSER_MOVETOFLATFIELDDIR;Mover a la carpeta de campos planos +FILEBROWSER_NEW_NAME;Nuevo nombre: +FILEBROWSER_OPENDEFAULTVIEWER;Visor de imágenes predeterminado de Windows (revelado en la cola) +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: Roja +FILEBROWSER_POPUPCOLORLABEL2;Etiqueta: Amarilla +FILEBROWSER_POPUPCOLORLABEL3;Etiqueta: Verde +FILEBROWSER_POPUPCOLORLABEL4;Etiqueta: Azul +FILEBROWSER_POPUPCOLORLABEL5;Etiqueta: Morada +FILEBROWSER_POPUPCOPYTO;Copiar a... +FILEBROWSER_POPUPFILEOPERATIONS;Operaciones con archivos +FILEBROWSER_POPUPINSPECT;Inspeccionar +FILEBROWSER_POPUPMOVEEND;Mover al final de la cola +FILEBROWSER_POPUPMOVEHEAD;Mover al inicio de la cola +FILEBROWSER_POPUPMOVETO;Mover a... +FILEBROWSER_POPUPOPEN;Abrir +FILEBROWSER_POPUPOPENINEDITOR;Abrir en el Editor +FILEBROWSER_POPUPPROCESS;Enviar la imagen a la cola +FILEBROWSER_POPUPPROCESSFAST;Enviar a la cola (Exportación rápida) +FILEBROWSER_POPUPPROFILEOPERATIONS;Operaciones con perfiles de revelado +FILEBROWSER_POPUPRANK;Asignar rango +FILEBROWSER_POPUPRANK0;Sin rango +FILEBROWSER_POPUPRANK1;Rango 1 * +FILEBROWSER_POPUPRANK2;Rango 2 ** +FILEBROWSER_POPUPRANK3;Rango 3 *** +FILEBROWSER_POPUPRANK4;Rango 4 **** +FILEBROWSER_POPUPRANK5;Rango 5 ***** +FILEBROWSER_POPUPREMOVE;Borrar permanentemente +FILEBROWSER_POPUPREMOVEINCLPROC;Borrar (incluyendo los ficheros generados por la cola) +FILEBROWSER_POPUPRENAME;Renombrar +FILEBROWSER_POPUPSELECTALL;Seleccionar todo +FILEBROWSER_POPUPTRASH;Mover la imagen a la papelera +FILEBROWSER_POPUPUNRANK;Quitar el rango +FILEBROWSER_POPUPUNTRASH;Sacar de la papelera +FILEBROWSER_QUERYBUTTONHINT;Borrar la búsqueda +FILEBROWSER_QUERYHINT;Aquí se escriben los nombres de archivo que se desea buscar. También se puede indicar sólo una parte del nombre del archivo. Los términos de la búsqueda se separan mediante comas (por ej.1001,1004,1199)\nLos términos de búsqueda no deseados se pueden excluir añadiendo el prefijo !=\npor ej. !=1001,1004,1199\n\nAtajos de teclado:\nCtrl-f - lleva el foco al cuadro de texto Buscar:\nIntro - realiza la búsqueda,\nEsc - borra el cuadro de texto Buscar:\nMayús-Esc - quita el foco del cuadro de texto Buscar:. +FILEBROWSER_QUERYLABEL;Buscar: +FILEBROWSER_RANK1_TOOLTIP;Rango 1 *\nAtajo de teclado: Mayús-1 +FILEBROWSER_RANK2_TOOLTIP;Rango 2 **\nAtajo de teclado: Mayús-2 +FILEBROWSER_RANK3_TOOLTIP;Rango 3 ***\nAtajo de teclado: Mayús-3 +FILEBROWSER_RANK4_TOOLTIP;Rango 4 ****\nAtajo de teclado: Mayús-4 +FILEBROWSER_RANK5_TOOLTIP;Rango 5 *****\nAtajo de teclado: Mayús-5 +FILEBROWSER_RENAMEDLGLABEL;Renombrar el archivo +FILEBROWSER_RESETDEFAULTPROFILE;Restablecer el perfil a los valores predeterminados +FILEBROWSER_SELECTDARKFRAME;Seleccionar Foto Negra... +FILEBROWSER_SELECTFLATFIELD;Seleccionar Campo Plano... +FILEBROWSER_SHOWCOLORLABEL1HINT;Muestra imágenes etiquetadas con color rojo.\nAtajo de teclado: Alt-1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Muestra imágenes etiquetadas con color amarillo.\nAtajo de teclado: Alt-2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Muestra imágenes etiquetadas con color verde.\nAtajo de teclado: Alt-3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Muestra imágenes etiquetadas con color azul.\nAtajo de teclado: Alt-4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Muestra imágenes etiquetadas con color morado.\nAtajo de teclado: Alt-5 +FILEBROWSER_SHOWDIRHINT;Quita todos los filtros.\nAtajo de teclado: d +FILEBROWSER_SHOWEDITEDHINT;Muestra las imágenes editadas.\nAtajo de teclado: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Muestra las imágenes no editadas.\nAtajo de teclado: 6 +FILEBROWSER_SHOWEXIFINFO;Muestra los datos Exif.\n\nAtajos de teclado:\ni - Modo de Editor de pestañas múltiples,\nAlt-i - Modo de Editor de pestaña única. +FILEBROWSER_SHOWNOTTRASHHINT;Muestra sólo las imágenes no borradas. +FILEBROWSER_SHOWORIGINALHINT;Muestra sólo las imágenes originales.\n\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 > Navegador de archivos > Extensiones analizadas. +FILEBROWSER_SHOWRANK1HINT;Muestra las imágenes con 1 estrella.\nAtajo de teclado: 1 +FILEBROWSER_SHOWRANK2HINT;Muestra las imágenes con 2 estrellas.\nAtajo de teclado: 2 +FILEBROWSER_SHOWRANK3HINT;Muestra las imágenes con 3 estrellas.\nAtajo de teclado: 3 +FILEBROWSER_SHOWRANK4HINT;Muestra las imágenes con 4 estrellas.\nAtajo de teclado: 4 +FILEBROWSER_SHOWRANK5HINT;Muestra las imágenes con 5 estrellas.\nAtajo de teclado: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Muestra las imágenes guardadas recientemente.\nAtajo de teclado: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Muestra las imágenes que no se han guardado recientemente.\nAtajo de teclado: Alt-6 +FILEBROWSER_SHOWTRASHHINT;Muestra el contenido de la papelera.\nAtajo de teclado: Ctrl-t +FILEBROWSER_SHOWUNCOLORHINT;Muestra las imágenes sin etiqueta de color.\nAtajo de teclado: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;Muestra las imágenes sin rango.\nAtajo de teclado: 0 +FILEBROWSER_THUMBSIZE;Tamaño de las miniaturas +FILEBROWSER_UNRANK_TOOLTIP;Borra el rango.\nAtajo de teclado:May - 0 +FILEBROWSER_ZOOMINHINT;Aumenta las miniaturas.\nAtajos de teclado:\n+ - Modo de Editor de pestañas múltiples,\nAlt-+ - Modo de Editor de Pestaña Única +FILEBROWSER_ZOOMOUTHINT;Reduce las miniaturas.\nAtajos de teclado:\n- - Modo de Editor de pestañas múltiples,\nAlt-- - Modo de Editor de pestaña única +FILECHOOSER_FILTER_ANY;Todos los archivos +FILECHOOSER_FILTER_COLPROF;Perfiles de color (*.icc) +FILECHOOSER_FILTER_CURVE;Archivos de curva +FILECHOOSER_FILTER_LCP;Perfiles de corrección de objetivos +FILECHOOSER_FILTER_PP;Perfiles de revelado +FILECHOOSER_FILTER_SAME;El mismo formato que la foto actual +FILECHOOSER_FILTER_TIFF;Archivos TIFF +GENERAL_ABOUT;Acerca de +GENERAL_AFTER;Después +GENERAL_APPLY;Aplicar +GENERAL_ASIMAGE;Como la imagen +GENERAL_AUTO;Automático +GENERAL_BEFORE;Antes +GENERAL_CANCEL;Cancelar +GENERAL_CLOSE;Cerrar +GENERAL_CURRENT;Actual +GENERAL_DELETE_ALL;Borrar todo +GENERAL_DISABLE;Desactivar +GENERAL_DISABLED;Desactivado +GENERAL_EDIT;Editar +GENERAL_ENABLE;Activar +GENERAL_ENABLED;Activado +GENERAL_FILE;Archivo +GENERAL_HELP;Ayuda +GENERAL_LANDSCAPE;Apaisado +GENERAL_NA;n/d +GENERAL_NO;No +GENERAL_NONE;Ninguno +GENERAL_OK;Aceptar +GENERAL_OPEN;Abrir +GENERAL_PORTRAIT;Vertical +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 módulo para GIMP de RawTherapee!\nCuando haya terminado de editar, simplemente cierre la aplicación RawTherapee y la imagen se abrirá automáticamente en GIMP. +HISTOGRAM_TOOLTIP_B;Muestra/oculta el canal azul en el histograma. +HISTOGRAM_TOOLTIP_BAR;Muestra/oculta la barra indicadora RGB. +HISTOGRAM_TOOLTIP_CHRO;Muestra/oculta el histograma de cromaticidad. +HISTOGRAM_TOOLTIP_CROSSHAIR;Muestra/oculta el indicador en cruz. +HISTOGRAM_TOOLTIP_G;Muestra/oculta el canal verde en el histograma. +HISTOGRAM_TOOLTIP_L;Muestra/oculta el histograma de luminancia CIELAB. +HISTOGRAM_TOOLTIP_MODE;Cambia entre la escala lineal, la logarítmica-lineal y la escala logarítmica (o doble logarítmica) del histograma. +HISTOGRAM_TOOLTIP_R;Muestra/oculta el canal rojo en el histograma. +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Muestra/oculta opciones adicionales del histograma. +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Ajusta el brillo del vectorscopio. +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histograma +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Histograma raw +HISTOGRAM_TOOLTIP_TYPE_PARADE;Analizador en forma de onda por canales +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Vectorscopio de matiz-cromaticidad +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Vectorscopio de matiz-saturación +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Analizador en forma de onda +HISTORY_CHANGED;Modificado +HISTORY_CUSTOMCURVE;Curva personalizada +HISTORY_FROMCLIPBOARD;Desde el portapapeles +HISTORY_LABEL;Historial +HISTORY_MSG_1;Foto sin modificar +HISTORY_MSG_3;Perfil cambiado +HISTORY_MSG_4;Navegar por el historial +HISTORY_MSG_5;Exposición - Claridad +HISTORY_MSG_6;Exposición - Contraste +HISTORY_MSG_7;Exposición - Negro +HISTORY_MSG_8;Exposición - Compensación de exposición +HISTORY_MSG_9;Exposición - Compresión de luces +HISTORY_MSG_10;Exposición - Compresión de sombras +HISTORY_MSG_11;Exposición - Curva tonal 1 +HISTORY_MSG_12;Exposición - Niveles automáticos +HISTORY_MSG_13;Exposición - Tonos recortados +HISTORY_MSG_14;L*a*b* - Claridad +HISTORY_MSG_15;L*a*b* - Contraste +HISTORY_MSG_19;L*a*b* - Curva L* +HISTORY_MSG_20;Nitidez +HISTORY_MSG_21;Máscara de nitidez - Radio +HISTORY_MSG_22;Máscara de nitidez - Cantidad +HISTORY_MSG_23;Máscara de nitidez - Umbral +HISTORY_MSG_24;Máscara de nitidez - Nitidez sólo en bordes +HISTORY_MSG_25;Máscara de nitidez - Radio de detección de bordes +HISTORY_MSG_26;Máscara de nitidez - Tolerancia de bordes +HISTORY_MSG_27;Máscara de nitidez - Control de halo +HISTORY_MSG_28;Máscara de nitidez - Intensidad del control de halo +HISTORY_MSG_29;Nitidez - Método +HISTORY_MSG_30;Deconvolución RL - Radio +HISTORY_MSG_31;Deconvolución RL - Cantidad +HISTORY_MSG_32;Deconvolución RL - Amortiguación +HISTORY_MSG_33;Deconvolución RL - Iteraciones +HISTORY_MSG_34;Corrección de objetivo - Distorsión +HISTORY_MSG_35;Corrección de objetivo - Viñeteo +HISTORY_MSG_36;Corrección de objetivo - Aberración cromática +HISTORY_MSG_37;Exposición - Niveles automáticos +HISTORY_MSG_38;Balance de blancos - Método +HISTORY_MSG_39;Balance de blancos - Temperatura de color +HISTORY_MSG_40;Balance de blancos - Tinte (dominante de color) +HISTORY_MSG_41;Exposición - Modo de la curva tonal 1 +HISTORY_MSG_42;Exposición - Curva tonal 2 +HISTORY_MSG_43;Exposición - Modo de la curva tonal 2 +HISTORY_MSG_48;DCP - Curva tonal +HISTORY_MSG_49;Iluminante DCP +HISTORY_MSG_50;Sombras/Luces +HISTORY_MSG_51;Sombras/Luces - Luces +HISTORY_MSG_52;Sombras/Luces - Sombras +HISTORY_MSG_53;Sombras/Luces - Amplitud tonal de luces +HISTORY_MSG_54;Sombras/Luces - Amplitud tonal de las sombras +HISTORY_MSG_56;Sombras/Luces - Radio +HISTORY_MSG_57;Rotación imprecisa +HISTORY_MSG_58;Volteo horizontal +HISTORY_MSG_59;Volteo vertical +HISTORY_MSG_60;Rotación +HISTORY_MSG_61;Relleno automático +HISTORY_MSG_62;Corrección de distorsión +HISTORY_MSG_63;Instantánea seleccionada +HISTORY_MSG_64;Recortar +HISTORY_MSG_65;Corrección de aberraciones cromáticas +HISTORY_MSG_66;Exposición - Reconstrucción de luces +HISTORY_MSG_68;Exposición - Método de Reconstrucción de luces +HISTORY_MSG_69;Espacio de color de trabajo +HISTORY_MSG_70;Espacio de color de salida +HISTORY_MSG_71;Espacio de color de entrada +HISTORY_MSG_72;Corrección de viñeteo - Cantidad +HISTORY_MSG_73;Mezclador de canal +HISTORY_MSG_74;Cambio de tamaño - Escala +HISTORY_MSG_75;Cambio de tamaño - Método +HISTORY_MSG_76;Metadatos Exif +HISTORY_MSG_77;Metadatos IPTC +HISTORY_MSG_79;Cambio de tamaño - Anchura +HISTORY_MSG_80;Cambio de tamaño - Altura +HISTORY_MSG_81;Cambio de tamaño +HISTORY_MSG_82;Perfil con cambios +HISTORY_MSG_84;Corrección de perspectiva +HISTORY_MSG_85;Corrección de objetivo - archivo LCP +HISTORY_MSG_86;Curvas RGB - Modo de luminosidad +HISTORY_MSG_87;Reducción de ruido impulsivo +HISTORY_MSG_88;Reducción de ruido impulsivo - Umbral +HISTORY_MSG_89;Reducción de ruido +HISTORY_MSG_90;Reducción de ruido - Luminancia +HISTORY_MSG_91;Reducción de ruido - Maestro de cromaticidad +HISTORY_MSG_92;Reducción de ruido - Gamma +HISTORY_MSG_93;Contraste por niveles de detalle - Valor +HISTORY_MSG_94;Contraste por niveles de detalle +HISTORY_MSG_95;L*a*b* - Cromaticidad +HISTORY_MSG_96;L*a*b* - Curva «a*» +HISTORY_MSG_97;L*a*b* - Curva «b*» +HISTORY_MSG_98;Método de desentramado +HISTORY_MSG_99;Filtro de píxel «caliente» +HISTORY_MSG_100;Exposición - Saturación +HISTORY_MSG_101;Ecualizador HSV - Matiz +HISTORY_MSG_102;Ecualizador HSV - Saturación +HISTORY_MSG_103;Ecualizador HSV - Valor +HISTORY_MSG_104;Ecualizador HSV +HISTORY_MSG_105;Quitar borde púrpura +HISTORY_MSG_106;Quitar borde púrpura - Radio +HISTORY_MSG_107;Quitar borde púrpura - Umbral +HISTORY_MSG_108;Exposición - Umbral de compresión de luces +HISTORY_MSG_109;Cambio de tamaño - Rectángulo límite +HISTORY_MSG_110;Cambio de tamaño - Aplicado a +HISTORY_MSG_111;L*a*b* - Evitar el cambio de color +HISTORY_MSG_112;--Sin Uso-- +HISTORY_MSG_113;L*a*b* - Protección de rojos y color de piel +HISTORY_MSG_114;Iteraciones DCB +HISTORY_MSG_115;Supresión de color falso +HISTORY_MSG_116;Mejora de DCB +HISTORY_MSG_117;Corrección de aberraciones cromáticas en raw - Rojo +HISTORY_MSG_118;Corrección de aberraciones cromáticas en raw - Azul +HISTORY_MSG_119;Filtro de ruido de línea +HISTORY_MSG_120;Equilibrado de verdes +HISTORY_MSG_121;Corrección de aberraciones cromáticas en raw - Automática +HISTORY_MSG_122;Foto Negra - Selección automática +HISTORY_MSG_123;Foto Negra - Archivo +HISTORY_MSG_124;Corrección del punto blanco +HISTORY_MSG_126;Campo plano - Archivo +HISTORY_MSG_127;Campo plano - Selección automática +HISTORY_MSG_128;Campo plano - Radio de difuminado +HISTORY_MSG_129;Campo plano - Tipo de difuminado +HISTORY_MSG_130;Corrección automática de distorsión +HISTORY_MSG_137;Nivel de punto negro - Verde 1 +HISTORY_MSG_138;Nivel de punto negro - Rojo +HISTORY_MSG_139;Nivel de punto negro - Azul +HISTORY_MSG_140;Nivel de punto negro - Verde 2 +HISTORY_MSG_141;Nivel de punto negro - Vincular verdes +HISTORY_MSG_142;Nitidez de bordes - Iteraciones +HISTORY_MSG_143;Nitidez de bordes - Cantidad +HISTORY_MSG_144;Microcontraste - Cantidad +HISTORY_MSG_145;Microcontraste - Uniformidad +HISTORY_MSG_146;Nitidez de bordes +HISTORY_MSG_147;Nitidez de bordes - Sólo luminancia +HISTORY_MSG_148;Microcontraste +HISTORY_MSG_149;Microcontraste - Matriz de 3×3 +HISTORY_MSG_150;Reducción de artefactos/ruido tras el desentramado +HISTORY_MSG_151;Vivacidad +HISTORY_MSG_152;Vivacidad - Tonos pastel +HISTORY_MSG_153;Vivacidad - Tonos saturados +HISTORY_MSG_154;Vivacidad - Protección de tonos de piel +HISTORY_MSG_155;Vivacidad - Evitar cambio de tono +HISTORY_MSG_156;Vivacidad - Vincular tonos pastel/saturados +HISTORY_MSG_157;Vivacidad - Umbral de tonos pastel/saturados +HISTORY_MSG_158;Mapeo tonal - Intensidad +HISTORY_MSG_159;Mapeo tonal - Detección de bordes +HISTORY_MSG_160;Mapeo tonal - Escala +HISTORY_MSG_161;Mapeo tonal - Iteraciones de reponderación +HISTORY_MSG_162;Mapeo tonal +HISTORY_MSG_163;Curvas RGB - Rojo +HISTORY_MSG_164;Curvas RGB - Verde +HISTORY_MSG_165;Curvas RGB - Azul +HISTORY_MSG_166;Exposición - Reiniciar +HISTORY_MSG_167;Método de desentramado +HISTORY_MSG_168;L*a*b* - curva CC +HISTORY_MSG_169;L*a*b* - curva CH +HISTORY_MSG_170;Vivacidad - curva HH +HISTORY_MSG_171;L*a*b* - curva LC +HISTORY_MSG_172;L*a*b* - Restringir curva LC +HISTORY_MSG_173;Reducción de ruido - Reconstrucción de detalle +HISTORY_MSG_174;Apariencia de color e Iluminación (AC & I) +HISTORY_MSG_175;AC & I - Condic. escena - Adaptación +HISTORY_MSG_176;AC & I - Condic. visualiz. - Contexto visual +HISTORY_MSG_177;AC & I - Condic. escena - Luminosidad absoluta +HISTORY_MSG_178;AC & I - Condic. visualiz. - Luminosidad absoluta +HISTORY_MSG_179;AC & I - Condic. escena - Modelo de punto blanco +HISTORY_MSG_180;AC & I - Ajustes imagen - Claridad (J) +HISTORY_MSG_181;AC & I - Ajustes imagen - Cromaticidad (C) +HISTORY_MSG_182;AC & I - Condic. escena - Adapt. automática +HISTORY_MSG_183;AC & I - Ajustes imagen - Contraste (J) +HISTORY_MSG_184;AC & I - Condic. escena - Contexto de la escena +HISTORY_MSG_185;AC & I - Control del rango de colores +HISTORY_MSG_186;AC & I - Ajustes imagen - Algoritmo +HISTORY_MSG_187;AC & I - Ajustes imagen - Protección de rojos/piel +HISTORY_MSG_188;AC & I - Ajustes imagen - Brillo (Q) +HISTORY_MSG_189;AC & I - Ajustes imagen - Contraste (Q) +HISTORY_MSG_190;AC & I - Ajustes imagen - Saturación (S) +HISTORY_MSG_191;AC & I - Ajustes imagen - Colorido (M) +HISTORY_MSG_192;AC & I - Ajustes imagen - Matiz (h) +HISTORY_MSG_193;AC & I - Ajustes imagen - Curva tonal 1 +HISTORY_MSG_194;AC & I - Ajustes imagen - Curva tonal 2 +HISTORY_MSG_195;AC & I - Ajustes imagen - Curva tonal 1 +HISTORY_MSG_196;AC & I - Ajustes imagen - Curva tonal 2 +HISTORY_MSG_197;AC & I - Ajustes imagen - Curva de color +HISTORY_MSG_198;AC & I - Ajustes imagen - Modo curva de color +HISTORY_MSG_199;AC & I - Ajustes imagen - Usar salida CAM para histogramas de salida +HISTORY_MSG_200;AC & I - Ajustes imagen - Usar CAM para mapeo tonal +HISTORY_MSG_201;Reducción de ruido - Cromaticidad R/V +HISTORY_MSG_202;Reducción de ruido - Cromaticidad A/Am +HISTORY_MSG_203;Reducción de ruido - Espacio de color +HISTORY_MSG_204;Pasos de mejora de LMMSE +HISTORY_MSG_205;AC & I - Filtro de píxel caliente/muerto +HISTORY_MSG_206;AC & I - Luminosidad automática de la escena +HISTORY_MSG_207;Quitar borde púrpura - Curva de matiz +HISTORY_MSG_208;Balance de blancos - Compensador azul/rojo +HISTORY_MSG_210;Filtro graduado - Ángulo +HISTORY_MSG_211;Filtro graduado +HISTORY_MSG_212;Filtro de viñeteo - Intensidad +HISTORY_MSG_213;Filtro de viñeteo +HISTORY_MSG_214;Blanco y negro +HISTORY_MSG_215;B/N - Mezclador de canales Rojo +HISTORY_MSG_216;B/N - Mezclador de canales Verde +HISTORY_MSG_217;B/N - Mezclador de canales Azul +HISTORY_MSG_218;B/N - Gamma Rojo +HISTORY_MSG_219;B/N - Gamma Verde +HISTORY_MSG_220;B/N - Gamma Azul +HISTORY_MSG_221;B/N - Filtro de color +HISTORY_MSG_222;B/N - Ajustes preestablecidos +HISTORY_MSG_223;B/N - Mezclador de canales Naranja +HISTORY_MSG_224;B/N - Mezclador de canales Amarillo +HISTORY_MSG_225;B/N - Mezclador de canales Cian +HISTORY_MSG_226;B/N - Mezclador de canales Magenta +HISTORY_MSG_227;B/N - Mezclador de canales Púrpura +HISTORY_MSG_228;B/N - Compensador de luminancia +HISTORY_MSG_229;B/N - Ajustar color complementario +HISTORY_MSG_230;B/N - Modo +HISTORY_MSG_231;B/N - Curva «Antes» +HISTORY_MSG_232;B/N - Tipo de curva «Antes» +HISTORY_MSG_233;B/N - Curva «Después» +HISTORY_MSG_234;B/N - Tipo de curva «Después» +HISTORY_MSG_235;B/N - Mezclador de canales Automático +HISTORY_MSG_236;--Sin uso-- +HISTORY_MSG_237;B/N - Mezclador de canales +HISTORY_MSG_238;Filtro graduado - Ancho gradiente +HISTORY_MSG_239;Filtro graduado - Intensidad +HISTORY_MSG_240;Filtro graduado - Centro +HISTORY_MSG_241;Filtro de viñeteo - Ancho gradiente +HISTORY_MSG_242;Filtro de viñeteo - Redondez +HISTORY_MSG_243;Corrección de Viñeteo - Radio +HISTORY_MSG_244;Corrección de Viñeteo - Intensidad +HISTORY_MSG_245;Corrección de Viñeteo - 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;Contraste por niveles de detalle - Umbral +HISTORY_MSG_251;B/N - Algoritmo +HISTORY_MSG_252;Contraste por niveles de detalle - Selección/protección de piel +HISTORY_MSG_253;Contraste por niveles de detalle - Reducción de artefactos +HISTORY_MSG_254;Contraste por niveles de detalle - Matiz de la piel +HISTORY_MSG_255;Reducción de ruido - Filtro de mediana +HISTORY_MSG_256;Reducción de ruido - Tipo de mediana +HISTORY_MSG_257;Virado de color +HISTORY_MSG_258;Virado de color - Curva de color +HISTORY_MSG_259;Virado de color - Curva de opacidad +HISTORY_MSG_260;Virado de color - Opacidad a*[b*] +HISTORY_MSG_261;Virado de color - Método +HISTORY_MSG_262;Virado de color - Opacidad b* +HISTORY_MSG_263;Virado de color - Sombras Rojo +HISTORY_MSG_264;Virado de color - Sombras Verde +HISTORY_MSG_265;Virado de color - Sombras Azul +HISTORY_MSG_266;Virado de color - Medios Rojo +HISTORY_MSG_267;Virado de color - Medios Verde +HISTORY_MSG_268;Virado de color - Medios Azul +HISTORY_MSG_269;Virado de color - Luces Rojo +HISTORY_MSG_270;Virado de color - Luces Verde +HISTORY_MSG_271;Virado de color - Luces Azul +HISTORY_MSG_272;Virado de color - Balance +HISTORY_MSG_273;Virado de color - Balance de color SMAL +HISTORY_MSG_276;Virado de color - Opacidad +HISTORY_MSG_277;--no usado-- +HISTORY_MSG_278;Virado de color - Conservar luminancia +HISTORY_MSG_279;Virado de color - Sombras +HISTORY_MSG_280;Virado de color - Luces +HISTORY_MSG_281;Virado de color - Intensidad de saturación +HISTORY_MSG_282;Virado de color - Umbral de saturación +HISTORY_MSG_283;Virado de color - Intensidad +HISTORY_MSG_284;Virado de color - Protección automática de saturación +HISTORY_MSG_285;Reducción de ruido - Mediana Método +HISTORY_MSG_286;Reducción de ruido - Mediana Tipo +HISTORY_MSG_287;Reducción de ruido - Mediana Iteraciones +HISTORY_MSG_288;Campo plano - Control de sobreexposición +HISTORY_MSG_289;Campo plano - Control de sobreexposición automático +HISTORY_MSG_290;Nivel de punto negro - Rojo +HISTORY_MSG_291;Nivel de punto negro - Verde +HISTORY_MSG_292;Nivel de punto negro - Azul +HISTORY_MSG_293;Simulación de película fotográfica +HISTORY_MSG_294;Simulación de película fotográfica - Intensidad +HISTORY_MSG_295;Simulación de película fotográfica - Película +HISTORY_MSG_296;Reducción de ruido - Curva de luminancia +HISTORY_MSG_297;Reducción de ruido - Modo +HISTORY_MSG_298;Filtro de píxel muerto +HISTORY_MSG_299;Reducción de ruido - Curva de cromaticidad +HISTORY_MSG_301;Reducción de ruido - Control de luminancia +HISTORY_MSG_302;Reducción de ruido - Método de cromaticidad +HISTORY_MSG_303;Reducción de ruido - Método de cromaticidad +HISTORY_MSG_304;Ondículas - Niveles de contraste +HISTORY_MSG_305;Niveles de ondícula +HISTORY_MSG_306;Ondículas - Proceso +HISTORY_MSG_307;Ondículas - Proceso +HISTORY_MSG_308;Ondículas - Dirección del proceso +HISTORY_MSG_309;Ondículas - Nitidez de bordes Detalle +HISTORY_MSG_310;Ondículas - Residual Selección/protección cielo +HISTORY_MSG_311;Ondículas - Niveles de ondícula +HISTORY_MSG_312;Ondículas - Residual Umbral de sombras +HISTORY_MSG_313;Ondículas - Cromaticidad Saturado/pastel +HISTORY_MSG_314;Ondículas - Rango de colores Reducción de artefactos +HISTORY_MSG_315;Ondículas - Residual Contraste +HISTORY_MSG_316;Ondículas - Rango de colores Selección/protección de piel +HISTORY_MSG_317;Ondículas - Rango de colores Tono de piel +HISTORY_MSG_318;Ondículas - Contraste Niveles más finos +HISTORY_MSG_319;Ondículas - Contraste Rango más fino +HISTORY_MSG_320;Ondículas - Contraste Rango más grueso +HISTORY_MSG_321;Ondículas - Contraste Niveles más gruesos +HISTORY_MSG_322;Ondículas - Rango de colores Evitar cambio de color +HISTORY_MSG_323;Ondículas - Nitidez de bordes Contraste local +HISTORY_MSG_324;Ondículas - Cromaticidad Pastel +HISTORY_MSG_325;Ondículas - Cromaticidad Saturado +HISTORY_MSG_326;Ondículas - Cromaticidad Método +HISTORY_MSG_327;Ondículas - Contraste Aplicar a +HISTORY_MSG_328;Ondículas - Cromaticidad Intensidad del vínculo +HISTORY_MSG_329;Ondículas - Virado Opacidad RV +HISTORY_MSG_330;Ondículas - Virado Opacidad AzAm +HISTORY_MSG_331;Ondículas - Niveles de contraste Extra +HISTORY_MSG_332;Ondículas - Método de teselado +HISTORY_MSG_333;Ondículas - Residual Sombras +HISTORY_MSG_334;Ondículas - Residual Cromaticidad +HISTORY_MSG_335;Ondículas - Residual Luces +HISTORY_MSG_336;Ondículas - Residual Umbral de luces +HISTORY_MSG_337;Ondículas - Residual Matiz del cielo +HISTORY_MSG_338;Ondículas - Nitidez de bordes Radio +HISTORY_MSG_339;Ondículas - Nitidez de bordes Intensidad +HISTORY_MSG_340;Ondículas - Intensidad +HISTORY_MSG_341;Ondículas - Rendimiento en bordes +HISTORY_MSG_342;Ondículas - Nitidez de bordes Primer nivel +HISTORY_MSG_343;Ondículas - Niveles de cromaticidad +HISTORY_MSG_344;Ondículas - Método de cromaticidad deslizador/curva +HISTORY_MSG_345;Ondículas - Nitidez de bordes Contraste local +HISTORY_MSG_346;Ondículas - Nitidez de bordes Método de contraste local +HISTORY_MSG_347;Ondículas - Reducción de ruido Nivel 1 +HISTORY_MSG_348;Ondículas - Reducción de ruido Nivel 2 +HISTORY_MSG_349;Ondículas - Reducción de ruido Nivel 3 +HISTORY_MSG_350;Ondículas - Reducción de ruido Detección de bordes +HISTORY_MSG_351;Ondículas - Residual Curva HH +HISTORY_MSG_352;Ondículas - Fondo +HISTORY_MSG_353;Ondículas - Nitidez de bordes Sensibilidad del gradiente +HISTORY_MSG_354;Ondículas - Nitidez de bordes Reforzada +HISTORY_MSG_355;Ondículas - Nitidez de bordes Umbral bajo +HISTORY_MSG_356;Ondículas - Nitidez de bordes Umbral alto +HISTORY_MSG_357;Ondículas - Reducción de ruido Vincular con nitidez de bordes +HISTORY_MSG_358;Ondículas - Rango de colores CH +HISTORY_MSG_359;Píxel caliente/muerto - Umbral +HISTORY_MSG_360;Mapeo tonal - Gamma +HISTORY_MSG_361;Ondículas - Final Equilibrio de cromaticidad +HISTORY_MSG_362;Ondículas - Residual Método de compresión +HISTORY_MSG_363;Ondículas - Residual Intensidad de compresión +HISTORY_MSG_364;Ondículas - Final Equilibrio de contraste +HISTORY_MSG_365;Ondículas - Final Equilibrio de delta +HISTORY_MSG_366;Ondículas - Residual Gamma de compresión +HISTORY_MSG_367;Ondículas - Final Curva de contraste «Después» +HISTORY_MSG_368;Ondículas - Final Equilibrio de contraste +HISTORY_MSG_369;Ondículas - Final Método de equilibrado +HISTORY_MSG_370;Ondículas - Final Curva de contraste local +HISTORY_MSG_371;Nitidez tras cambio de tamaño +HISTORY_MSG_372;Nitidez camb. tam. - Máscara Radio +HISTORY_MSG_373;Nitidez camb. tam. - Máscara Cantidad +HISTORY_MSG_374;Nitidez camb. tam. - Máscara Umbral +HISTORY_MSG_375;Nitidez camb. tam. - Máscara Enfocar sólo bordes +HISTORY_MSG_376;Nitidez camb. tam. - Máscara Radio detección bordes +HISTORY_MSG_377;Nitidez camb. tam. - Máscara Tolerancia bordes +HISTORY_MSG_378;Nitidez camb. tam. - Máscara Control de halo +HISTORY_MSG_379;Nitidez camb. tam. - Máscara Cantidad control de halo +HISTORY_MSG_380;Nitidez camb. tam. - Método +HISTORY_MSG_381;Nitidez camb. tam. - Deconv. RL Radio +HISTORY_MSG_382;Nitidez camb. tam. - Deconv. RL Cantidad +HISTORY_MSG_383;Nitidez camb. tam. - Deconv. RL Amortiguación +HISTORY_MSG_384;Nitidez camb. tam. - Deconv. RL Iteraciones +HISTORY_MSG_385;Ondículas - Residual Balance de color +HISTORY_MSG_386;Ondículas - Residual Bal. color verde alto +HISTORY_MSG_387;Ondículas - Residual Bal. color azul alto +HISTORY_MSG_388;Ondículas - Residual Bal. color verde medio +HISTORY_MSG_389;Ondículas - Residual Bal. color azul medio +HISTORY_MSG_390;Ondículas - Residual Bal. color verde bajo +HISTORY_MSG_391;Ondículas - Residual Bal. color azul bajo +HISTORY_MSG_392;Ondículas - Residual Balance de color +HISTORY_MSG_393;DCP - Tabla de sustitución +HISTORY_MSG_394;DCP - Exposición base +HISTORY_MSG_395;DCP - Tabla base +HISTORY_MSG_396;Ondículas - Sub-herram. Contraste +HISTORY_MSG_397;Ondículas - Sub-herram. Cromaticidad +HISTORY_MSG_398;Ondículas - Sub-herram. Nitidez bordes +HISTORY_MSG_399;Ondículas - Sub-herram. Residual +HISTORY_MSG_400;Ondículas - Sub-herram. Final +HISTORY_MSG_401;Ondículas - Sub-herram. Virado +HISTORY_MSG_402;Ondículas - Sub-herram. Reducc. ruido +HISTORY_MSG_403;Ondículas - Nitidez de bordes Sensibilidad bordes +HISTORY_MSG_404;Ondículas - Nitidez de bordes Amplificación base +HISTORY_MSG_405;Ondículas - Reducc. ruido Nivel 4 +HISTORY_MSG_406;Ondículas - Nitidez de bordes Píxels vecinos +HISTORY_MSG_407;Retinex - Método +HISTORY_MSG_408;Retinex - Radio +HISTORY_MSG_410;Retinex - Desplazamiento +HISTORY_MSG_411;Retinex - Intensidad +HISTORY_MSG_412;Retinex - Gradiente gaussiano +HISTORY_MSG_413;Retinex - Contraste +HISTORY_MSG_414;Retinex - Histograma - L*a*b* +HISTORY_MSG_415;Retinex - Transmisión +HISTORY_MSG_416;Retinex +HISTORY_MSG_417;Retinex - Mediana de transmisión +HISTORY_MSG_418;Retinex - Umbral +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 - Pendiente de gamma +HISTORY_MSG_424;Retinex - Umbral luces +HISTORY_MSG_425;-- no usado -- +HISTORY_MSG_426;Retinex - Ecualizador de matiz +HISTORY_MSG_427;Tipo de conversión del rango de colores de salida +HISTORY_MSG_428;Tipo de conversión del rango de colores del monitor +HISTORY_MSG_429;Retinex - Iteraciones +HISTORY_MSG_430;Retinex - Gradiente de transmisión +HISTORY_MSG_431;Retinex - Gradiente de intensidad +HISTORY_MSG_432;Retinex - Máscara Luces +HISTORY_MSG_433;Retinex - Máscara Ancho tonal luces +HISTORY_MSG_434;Retinex - Máscara Sombras +HISTORY_MSG_435;Retinex - Máscara Ancho tonal sombras +HISTORY_MSG_436;Retinex - Máscara Radio +HISTORY_MSG_437;Retinex - Máscara Método +HISTORY_MSG_438;Retinex - Máscara Ecualizador +HISTORY_MSG_439;Retinex - Proceso +HISTORY_MSG_440;Contraste por niveles de detalle - Método +HISTORY_MSG_441;Retinex - Ganancia de transmisión +HISTORY_MSG_442;Retinex - Escala +HISTORY_MSG_443;Compensación punto negro de salida +HISTORY_MSG_444;Balance de blancos - Sesgo de temperatura +HISTORY_MSG_445;Sub-imagen raw +HISTORY_MSG_446;-- no usado -- +HISTORY_MSG_447;-- no usado -- +HISTORY_MSG_448;-- no usado -- +HISTORY_MSG_449;PixelShift - Adaptación ISO +HISTORY_MSG_450;-- no usado -- +HISTORY_MSG_451;-- no usado -- +HISTORY_MSG_452;PixelShift - Mostrar movimiento +HISTORY_MSG_453;PixelShift - Mostrar sólo la máscara +HISTORY_MSG_454;-- no usado -- +HISTORY_MSG_455;-- no usado -- +HISTORY_MSG_456;-- no usado -- +HISTORY_MSG_457;PixelShift - Comprobar rojo/azul +HISTORY_MSG_458;-- no usado -- +HISTORY_MSG_459;-- no usado -- +HISTORY_MSG_460;-- no usado -- +HISTORY_MSG_461;-- no usado -- +HISTORY_MSG_462;PixelShift - Comprobar verde +HISTORY_MSG_463;-- no usado -- +HISTORY_MSG_464;PixelShift - Difuminar máscara de movimiento +HISTORY_MSG_465;PixelShift - Radio de difuminado +HISTORY_MSG_466;-- no usado -- +HISTORY_MSG_467;-- no usado -- +HISTORY_MSG_468;PixelShift - Rellenar huecos +HISTORY_MSG_469;PixelShift - Mediana +HISTORY_MSG_470;-- no usado -- +HISTORY_MSG_471;PixelShift - Corrección de movimiento +HISTORY_MSG_472;PixelShift - Suavizar transiciones +HISTORY_MSG_474;PixelShift - Ecualizar +HISTORY_MSG_475;PixelShift - Ecualizar canal +HISTORY_MSG_476;AC & I - Condic. visualiz. - Temperatura +HISTORY_MSG_477;AC & I - Condic. visualiz. - Tinte +HISTORY_MSG_478;AC & I - Condic. visualiz. - Luminancia media +HISTORY_MSG_479;AC & I - Condic. visualiz. - Adaptación +HISTORY_MSG_480;AC & I - Condic. visualiz. - Adaptac. automática +HISTORY_MSG_481;AC & I - Condic. escena - Temperatura +HISTORY_MSG_482;AC & I - Condic. escena - Tinte +HISTORY_MSG_483;AC & I - Condic. escena - Luminancia media +HISTORY_MSG_484;AC & I - Condic. escena -Lumin. media auto +HISTORY_MSG_485;Corrección de objetivo +HISTORY_MSG_486;Corrección de objetivo - Cámara +HISTORY_MSG_487;Corrección de objetivo - Objetivo +HISTORY_MSG_488;Compresión de rango dinámico +HISTORY_MSG_489;Compresión de rango dinámico - Detalle +HISTORY_MSG_490;Compresión de rango dinámico - Cantidad +HISTORY_MSG_491;Balance de blancos +HISTORY_MSG_492;Curvas RGB +HISTORY_MSG_493;Ajustes L*a*b* +HISTORY_MSG_494;Nitidez en captura +HISTORY_MSG_496;Local - Punto borrado +HISTORY_MSG_497;Local - Punto seleccionado +HISTORY_MSG_498;Local - Nombre del punto +HISTORY_MSG_499;Local - Visibilidad del punto +HISTORY_MSG_500;Local - Forma del punto +HISTORY_MSG_501;Local - Método del punto +HISTORY_MSG_502;Local - Método de forma del punto +HISTORY_MSG_503;Local - locX del punto +HISTORY_MSG_504;Local - locXL del punto +HISTORY_MSG_505;Local - locY del punto +HISTORY_MSG_506;Local - locYT del punto +HISTORY_MSG_507;Local - Centro del punto +HISTORY_MSG_508;Local - Radio circular del punto +HISTORY_MSG_509;Local - Método de calidad del punto +HISTORY_MSG_510;Local - Transición del punto +HISTORY_MSG_511;Local - Umbral del punto +HISTORY_MSG_512;Local - Decaimiento de ΔE del punto +HISTORY_MSG_513;Local - Ámbito del punto +HISTORY_MSG_514;Local - Estructura del punto +HISTORY_MSG_515;Ajustes Locales +HISTORY_MSG_516;Local - Color y luz +HISTORY_MSG_517;Local - Activar super +HISTORY_MSG_518;Local - Claridad +HISTORY_MSG_519;Local - Contraste +HISTORY_MSG_520;Local - Cromaticidad +HISTORY_MSG_521;Local - Ámbito +HISTORY_MSG_522;Local - Método de curva +HISTORY_MSG_523;Local - Curva LL +HISTORY_MSG_524;Local - Curva CC +HISTORY_MSG_525;Local - Curva LH +HISTORY_MSG_526;Local - Curva H +HISTORY_MSG_527;Local - Color inverso +HISTORY_MSG_528;Local - Exposición +HISTORY_MSG_529;Local - Compens. expos. +HISTORY_MSG_530;Local - Expos. Compresión luces +HISTORY_MSG_531;Local - Expos. Umbral compr. luces +HISTORY_MSG_532;Local - Expos. Nivel de negro +HISTORY_MSG_533;Local - Expos. Compresión sombras +HISTORY_MSG_534;Local - Cálido/Frío +HISTORY_MSG_535;Local - Expos. Ámbito +HISTORY_MSG_536;Local - Expos. Curva contraste +HISTORY_MSG_537;Local - Vivacidad +HISTORY_MSG_538;Local - Vivac. Saturados +HISTORY_MSG_539;Local - Vivac. Pastel +HISTORY_MSG_540;Local - Vivac. Umbral +HISTORY_MSG_541;Local - Vivac. Proteger tonos piel +HISTORY_MSG_542;Local - Vivac. Evitar la deriva de colores +HISTORY_MSG_543;Local - Vivac. Vincular +HISTORY_MSG_544;Local - Vivac. Ámbito +HISTORY_MSG_545;Local - Vivac. Curva H +HISTORY_MSG_546;Local - Difuminado y ruido +HISTORY_MSG_547;Local - Radio +HISTORY_MSG_548;Local - Ruido +HISTORY_MSG_549;Local - Difumin. Ámbito +HISTORY_MSG_550;Local - Difumin. Método +HISTORY_MSG_551;Local - Difumin. Sólo luminancia +HISTORY_MSG_552;Local - Mapeo tonal +HISTORY_MSG_553;Local - MT Intens. compresión +HISTORY_MSG_554;Local - MT Gamma +HISTORY_MSG_555;Local - MT Parada en bordes +HISTORY_MSG_556;Local - MT Escala +HISTORY_MSG_557;Local - MT Reponderación +HISTORY_MSG_558;Local - MT Ámbito +HISTORY_MSG_559;Local - Retinex +HISTORY_MSG_560;Local - Reti. Método +HISTORY_MSG_561;Local - Reti. Intensidad +HISTORY_MSG_562;Local - Reti. Cromaticidad +HISTORY_MSG_563;Local - Reti. Radio +HISTORY_MSG_564;Local - Reti. Contraste +HISTORY_MSG_565;Local - Ámbito +HISTORY_MSG_566;Local - Reti. Curva de ganancia +HISTORY_MSG_567;Local - Reti. Inverso +HISTORY_MSG_568;Local - Nitidez +HISTORY_MSG_569;Local - Nitidez Radio +HISTORY_MSG_570;Local - Nitidez Cantidad +HISTORY_MSG_571;Local - Nitidez Amortiguación +HISTORY_MSG_572;Local - Nitidez Iteraciones +HISTORY_MSG_573;Local - Nitidez Ámbito +HISTORY_MSG_574;Local - Nitidez Inverso +HISTORY_MSG_575;Local - Contraste niveles detalle +HISTORY_MSG_576;Local - CPND Mult +HISTORY_MSG_577;Local - CPND Cromaticidad +HISTORY_MSG_578;Local - CPND Umbral +HISTORY_MSG_579;Local - CPND Ámbito +HISTORY_MSG_580;-- no usado -- +HISTORY_MSG_581;Local - RD Lumin. fino 1 +HISTORY_MSG_582;Local - RD Lumin. grueso +HISTORY_MSG_583;Local - RD Lumin. detalle +HISTORY_MSG_584;Local - RD Ecualiz. blanco-negro +HISTORY_MSG_585;Local - RD Cromaticidad fino +HISTORY_MSG_586;Local - RD Cromaticidad grueso +HISTORY_MSG_587;Local - RD Cromaticidad detalle +HISTORY_MSG_588;Local - RD Ecualiz. azul-rojo +HISTORY_MSG_589;Local - RD Filtro bilateral +HISTORY_MSG_590;Local - RD Ámbito +HISTORY_MSG_591;Local - Evitar la deriva de colores +HISTORY_MSG_592;Local - Nitidez Contraste +HISTORY_MSG_593;Local - Contraste local +HISTORY_MSG_594;Local - CL Radio +HISTORY_MSG_595;Local - CL Cantidad +HISTORY_MSG_596;Local - CL Oscuridad +HISTORY_MSG_597;Local - CL Claridad +HISTORY_MSG_598;Local - CL Ámbito +HISTORY_MSG_599;Local - Reti. Quitar neblina +HISTORY_MSG_600;Local - Luz suave Activar +HISTORY_MSG_601;Local - Luz suave Intensidad +HISTORY_MSG_602;Local - Luz suave Ámbito +HISTORY_MSG_603;Local - Nitidez Radio difuminado +HISTORY_MSG_605;Local - Elecc. máscara previsualiz. +HISTORY_MSG_606;Local - Punto seleccionado +HISTORY_MSG_607;Local - Color Máscara C +HISTORY_MSG_608;Local - Color Máscara L +HISTORY_MSG_609;Local - Expos. Máscara C +HISTORY_MSG_610;Local - Expos. Máscara L +HISTORY_MSG_611;Local - Color Máscara H +HISTORY_MSG_612;Local - Color Estructura +HISTORY_MSG_613;Local - Expos. Estructura +HISTORY_MSG_614;Local - Expos. Máscara H +HISTORY_MSG_615;Local - Mezcla color +HISTORY_MSG_616;Local - Mezcla exposic. +HISTORY_MSG_617;Local - Difumin. exposic. +HISTORY_MSG_618;Local - Usar máscara color +HISTORY_MSG_619;Local - Usar máscara exposic. +HISTORY_MSG_620;Local - Difumin. color +HISTORY_MSG_621;Local - Expos. Inverso +HISTORY_MSG_622;Local - Excluir estructura +HISTORY_MSG_623;Local - Expos. Compensac. cromaticidad +HISTORY_MSG_624;Local - Cuadrícula correcc. color +HISTORY_MSG_625;Local - Intensidad correcc. color +HISTORY_MSG_626;Local - Método correcc. color +HISTORY_MSG_627;Local - Sombras/Luces +HISTORY_MSG_628;Local - S/AL Luces +HISTORY_MSG_629;Local - S/AL Ancho tonal luces +HISTORY_MSG_630;Local - S/AL Sombras +HISTORY_MSG_631;Local - S/AL Ancho tonal sombras +HISTORY_MSG_632;Local - S/AL Radio +HISTORY_MSG_633;Local - S/AL Ámbito +HISTORY_MSG_634;Local - Radio color +HISTORY_MSG_635;Local - Radio exposición +HISTORY_MSG_636;Local - Herramienta añadida +HISTORY_MSG_637;Local - S/AL Máscara C +HISTORY_MSG_638;Local - S/AL Máscara L +HISTORY_MSG_639;Local - S/AL Máscara H +HISTORY_MSG_640;Local - S/AL Mezcla +HISTORY_MSG_641;Local - S/AL Usar máscara +HISTORY_MSG_642;Local - S/AL Radio +HISTORY_MSG_643;Local - S/AL Difuminar +HISTORY_MSG_644;Local - S/AL Inverso +HISTORY_MSG_645;Local - Balance ΔE ab-L +HISTORY_MSG_646;Local - Expos. Cromaticidad máscara +HISTORY_MSG_647;Local - Expos. Gamma máscara +HISTORY_MSG_648;Local - Expos. Pendiente máscara +HISTORY_MSG_649;Local - Expos. Radio suave +HISTORY_MSG_650;Local - Color Cromaticidad máscara +HISTORY_MSG_651;Local - Color Gamma máscara +HISTORY_MSG_652;Local - Color Pendiente máscara +HISTORY_MSG_653;Local - S/AL Cromaticidad máscara +HISTORY_MSG_654;Local - S/AL Gamma máscara +HISTORY_MSG_655;Local - S/AL Pendiente máscara +HISTORY_MSG_656;Local - Color Radio suave +HISTORY_MSG_657;Local - Reti. Reducir artefactos +HISTORY_MSG_658;Local - CPND Radio suave +HISTORY_MSG_659;Local - Transición-decaim. de punto +HISTORY_MSG_660;Local - CPND Claridad +HISTORY_MSG_661;Local - CPND Contraste residual +HISTORY_MSG_662;Local - Reducc. ruido Lumin. fino 0 +HISTORY_MSG_663;Local - Reducc. ruido Lumin. fino 2 +HISTORY_MSG_664;-- no usado -- +HISTORY_MSG_665;Local - CPND Mezcla máscara +HISTORY_MSG_666;Local - CPND Radio máscara +HISTORY_MSG_667;Local - CPND Cromaticidad máscara +HISTORY_MSG_668;Local - CPND Gamma máscara +HISTORY_MSG_669;Local - CPND Pendiente máscara +HISTORY_MSG_670;Local - CPND Máscara C +HISTORY_MSG_671;Local - CPND Máscara L +HISTORY_MSG_672;Local - CPND Máscara CL +HISTORY_MSG_673;Local - Usar máscara CPND +HISTORY_MSG_674;Local - Herramienta suprimida +HISTORY_MSG_675;Local - Mapeo tonal Radio suave +HISTORY_MSG_676;Local - Transición-diferenciación punto +HISTORY_MSG_677;Local - Mapeo tonal Cantidad +HISTORY_MSG_678;Local - Mapeo tonal Saturación +HISTORY_MSG_679;Local - Retinex Máscara C +HISTORY_MSG_680;Local - Reti. Máscara L +HISTORY_MSG_681;Local - Reti. Máscara CL +HISTORY_MSG_682;Local - Reti. Máscara +HISTORY_MSG_683;Local - Reti. Mezcla máscara +HISTORY_MSG_684;Local - Reti. Radio máscara +HISTORY_MSG_685;Local - Reti. Cromaticidad máscara +HISTORY_MSG_686;Local - Reti. Gamma máscara +HISTORY_MSG_687;Local - Reti. Pendiente máscara +HISTORY_MSG_688;Local - Herramienta suprimida +HISTORY_MSG_689;Local - Reti. Mapa transmisión máscara +HISTORY_MSG_690;Local - Reti. Escala +HISTORY_MSG_691;Local - Reti. Oscuridad +HISTORY_MSG_692;Local - Reti. Claridad +HISTORY_MSG_693;Local - Reti. Umbral +HISTORY_MSG_694;Local - Reti. Umbral laplaciana +HISTORY_MSG_695;Local - Método suave +HISTORY_MSG_696;Local - Reti. Normalizar +HISTORY_MSG_697;Local - MT Normalizar +HISTORY_MSG_698;Local - CL Fast Fourier +HISTORY_MSG_699;Local - Reti. Fast Fourier +HISTORY_MSG_701;Local - Expos. Sombras +HISTORY_MSG_702;Local - Expos. Método +HISTORY_MSG_703;Local - Expos. Umbral laplaciana +HISTORY_MSG_704;Local - Expos. Balance PDE +HISTORY_MSG_705;Local - Expos. Linealidad +HISTORY_MSG_706;Local - MT Máscara C +HISTORY_MSG_707;Local - MT Máscara L +HISTORY_MSG_708;Local - MT Máscara CL +HISTORY_MSG_709;Local - Usar máscara MT +HISTORY_MSG_710;Local - MT Mezcla máscara +HISTORY_MSG_711;Local - MT Radio máscara +HISTORY_MSG_712;Local - MT Cromaticidad máscara +HISTORY_MSG_713;Local - MT Gamma máscara +HISTORY_MSG_714;Local - MT Pendiente máscara +HISTORY_MSG_716;Local - Método local +HISTORY_MSG_717;Local - Contraste local +HISTORY_MSG_718;Local - CL Niveles +HISTORY_MSG_719;Local - CL L residual +HISTORY_MSG_720;Local - Máscara difumin. C +HISTORY_MSG_721;Local - Máscara difumin. L +HISTORY_MSG_722;Local - Máscara difumin. CL +HISTORY_MSG_723;Local - Usar máscara difumin. +HISTORY_MSG_725;Local - Máscara difumin. Mezcla +HISTORY_MSG_726;Local - Máscara difumin. Radio +HISTORY_MSG_727;Local - Máscara difumin. Cromaticidad +HISTORY_MSG_728;Local - Máscara difumin. Gamma +HISTORY_MSG_729;Local - Máscara difumin. Pendiente +HISTORY_MSG_730;Local - Método difumin. +HISTORY_MSG_731;Local - Método mediana +HISTORY_MSG_732;Local - Iteraciones mediana +HISTORY_MSG_733;Local - Radio suave +HISTORY_MSG_734;Local - Detalle +HISTORY_MSG_738;Local - CL Fusionar L +HISTORY_MSG_739;Local - CL Radio suave +HISTORY_MSG_740;Local - CL Fusionar C +HISTORY_MSG_741;Local - CL Residual C +HISTORY_MSG_742;Local - Expos. Gamma laplaciana +HISTORY_MSG_743;Local - Expos. Fattal cantidad +HISTORY_MSG_744;Local - Expos. Fattal detalle +HISTORY_MSG_745;Local - Expos. Fattal desplazamiento +HISTORY_MSG_746;Local - Expos. Fattal sigma +HISTORY_MSG_747;Local - Punto creado +HISTORY_MSG_748;Local - Expos. Reducc. ruido +HISTORY_MSG_749;Local - Reti. Profundidad +HISTORY_MSG_750;Local - Reti. Modo log - lineal +HISTORY_MSG_751;Local - Reti. Saturación elim. neblina +HISTORY_MSG_752;Local - Reti. Desplazamiento +HISTORY_MSG_753;Local - Reti. Mapa transmisión +HISTORY_MSG_754;Local - Reti. Recorte +HISTORY_MSG_755;Local - MT Usar máscara MT +HISTORY_MSG_756;Local - Expos. usar algor. máscara exposic. +HISTORY_MSG_757;Local - Expos. Máscara laplaciana +HISTORY_MSG_758;Local - Reti. Máscara laplaciana +HISTORY_MSG_759;Local - Expos. Máscara laplaciana +HISTORY_MSG_760;Local - Color Máscara laplaciana +HISTORY_MSG_761;Local - S/AL Máscara laplaciana +HISTORY_MSG_762;Local - CPND Máscara laplaciana +HISTORY_MSG_763;Local - Difumin. Máscara laplaciana +HISTORY_MSG_764;Local - Resolver PDE Máscara laplaciana +HISTORY_MSG_765;Local - RR Umbral detalle +HISTORY_MSG_766;Local - Difumin. Fast Fourier +HISTORY_MSG_767;Local - Grano ISO +HISTORY_MSG_768;Local - Grano Intensidad +HISTORY_MSG_769;Local - Grano Escala +HISTORY_MSG_770;Local - Color Curva contraste máscara +HISTORY_MSG_771;Local - Expos. Curva contraste máscara +HISTORY_MSG_772;Local - S/AL Curva contraste máscara +HISTORY_MSG_773;Local - MT Curva contraste máscara +HISTORY_MSG_774;Local - Reti. Curva contraste máscara +HISTORY_MSG_775;Local - CPND Curva contraste máscara +HISTORY_MSG_776;Local - Difumin. Curva contraste máscara RR +HISTORY_MSG_777;Local - Difumin. Curva contraste local máscara +HISTORY_MSG_778;Local - Máscara luces +HISTORY_MSG_779;Local - Color Curva contraste local máscara +HISTORY_MSG_780;Local - Color Máscara sombras +HISTORY_MSG_781;Local - Nivel ondículas máscara contraste +HISTORY_MSG_782;Local - Difumin. Niveles ondículas máscara red. ruido +HISTORY_MSG_783;Local - Color Niveles ondículas +HISTORY_MSG_784;Local - ΔE máscara +HISTORY_MSG_785;Local - Ámbito ΔE máscara +HISTORY_MSG_786;Local - S/AL Método +HISTORY_MSG_787;Local - Multiplicador Ecualizador +HISTORY_MSG_788;Local - Detalle Ecualizador +HISTORY_MSG_789;Local - S/AL Cantidad máscara +HISTORY_MSG_790;Local - S/AL punto ancla máscara +HISTORY_MSG_791;Local - Máscara Curvas L cortas +HISTORY_MSG_792;Local - Máscara Luminancia fondo +HISTORY_MSG_793;Local - S/AL Gamma TRC +HISTORY_MSG_794;Local - S/AL Pendiente TRC +HISTORY_MSG_795;Local - Máscara Guardar/restaurar imagen +HISTORY_MSG_796;Local - Referencias recursivas +HISTORY_MSG_797;Local - Fusión original Método +HISTORY_MSG_798;Local - Opacidad +HISTORY_MSG_799;Local - Color Curva tonal RGB +HISTORY_MSG_800;Local - Color Método curva tonal +HISTORY_MSG_801;Local - Color Curva tonal especial +HISTORY_MSG_802;Local - Umbral de contraste +HISTORY_MSG_803;Local - Color Fusión +HISTORY_MSG_804;Local - Color Máscara de estructura +HISTORY_MSG_805;Local - Difuminado/Ruido Máscara estructura +HISTORY_MSG_806;Local - Color Máscara estructura como herram. +HISTORY_MSG_807;Local - Difumin. Máscara estructura como herram. +HISTORY_MSG_808;Local - Color Máscara Curva H(H) +HISTORY_MSG_809;Local - Vivac. Máscara Curva C(C) +HISTORY_MSG_810;Local - Vivac. Máscara Curva L(L) +HISTORY_MSG_811;Local - Vivac. Máscara Curva LC(H) +HISTORY_MSG_813;Local - Usar máscara Vivac. +HISTORY_MSG_814;Local - Vivac. Máscara Mezcla +HISTORY_MSG_815;Local - Vivac. Máscara Radio +HISTORY_MSG_816;Local - Vivac. Máscara cromaticidad +HISTORY_MSG_817;Local - Vivac. Máscara Gamma +HISTORY_MSG_818;Local - Vivac. Máscara Pendiente +HISTORY_MSG_819;Local - Vivac. Máscara Laplaciana +HISTORY_MSG_820;Local - Vivac. Máscara Curva contraste +HISTORY_MSG_821;Local - Color Rejilla fondo +HISTORY_MSG_822;Local - Color Fusión fondo +HISTORY_MSG_823;Local - Color Luminancia fondo +HISTORY_MSG_824;Local - Exp. Intens. gradiente máscara +HISTORY_MSG_825;Local - Exp. Ángulo gradiente máscara +HISTORY_MSG_826;Local - Exp. Intens. gradiente +HISTORY_MSG_827;Local - Exp. Ángulo gradiente +HISTORY_MSG_828;Local - S/AL Intens. gradiente +HISTORY_MSG_829;Local - S/AL Ángulo gradiente +HISTORY_MSG_830;Local - Color Intens. gradiente L +HISTORY_MSG_831;Local - Color Ángulo gradiente +HISTORY_MSG_832;Local - Color Intens. gradiente C +HISTORY_MSG_833;Local - Gradiente degradado +HISTORY_MSG_834;Local - Color Intens. gradiente H +HISTORY_MSG_835;Local - Vivac. Intens. gradiente L +HISTORY_MSG_836;Local - Vivac. Ángulo gradiente +HISTORY_MSG_837;Local - Vivac. Intens. gradiente C +HISTORY_MSG_838;Local - Vivac. Intens. gradiente H +HISTORY_MSG_839;Local - Complejidad software +HISTORY_MSG_840;Local - Curva CL +HISTORY_MSG_841;Local - Curva LC +HISTORY_MSG_842;Local - Máscara difumin. Radio +HISTORY_MSG_843;Local - Máscara difumin. Umbral contraste +HISTORY_MSG_844;Local - Máscara difumin. FFTW +HISTORY_MSG_845;Local - Codific. Log +HISTORY_MSG_846;Local - Codific. Log Auto +HISTORY_MSG_847;Local - Codific. Log Origen +HISTORY_MSG_849;Local - Codific. Log Origen auto +HISTORY_MSG_850;Local - Codific. Log N_Ev +HISTORY_MSG_851;Local - Codific. Log B_Ev +HISTORY_MSG_852;Local - Codific. Log Destino +HISTORY_MSG_853;Local - Codific. Log contraste loc. +HISTORY_MSG_854;Local - Codific. Log Ámbito +HISTORY_MSG_855;Local - Codific. Log Imagen completa +HISTORY_MSG_856;Local - Codific. Log Rango sombras +HISTORY_MSG_857;Local - Ondíc. Difumin. residual +HISTORY_MSG_858;Local - Ondíc. Difumin. sólo luma +HISTORY_MSG_859;Local - Ondíc. Difumin. máx. +HISTORY_MSG_860;Local - Ondíc. Difum. niveles +HISTORY_MSG_861;Local - Ondíc. Niveles contraste +HISTORY_MSG_862;Local - Ondíc. Atenuac. contraste +HISTORY_MSG_863;Local - Ondíc. Fusionar imagen orig. +HISTORY_MSG_864;Local - Ondíc. dir Atenuac. contraste +HISTORY_MSG_865;Local - Ondíc. dir Delta contraste +HISTORY_MSG_866;Local - Ondíc. dir Compresión +HISTORY_MSG_868;Local - balance ΔE C-H +HISTORY_MSG_869;Local - Ondíc. por nivel +HISTORY_MSG_870;Local - Ondíc. Máscara Curva H +HISTORY_MSG_871;Local - Ondíc. Máscara Curva C +HISTORY_MSG_872;Local - Ondíc. Máscara Curva L +HISTORY_MSG_873;Local - Ondíc. Máscara +HISTORY_MSG_875;Local - Ondíc. Mezcla máscara +HISTORY_MSG_876;Local - Ondíc. Suaviz. máscara +HISTORY_MSG_877;Local - Ondíc. Cromaticidad máscara +HISTORY_MSG_878;Local - Ondíc. Curva contraste máscara +HISTORY_MSG_879;Local - Ondíc. Contraste cromaticidad +HISTORY_MSG_880;Local - Ondíc. Difumin. cromaticidad +HISTORY_MSG_881;Local - Ondíc. Desplazam. contraste +HISTORY_MSG_882;Local - Ondíc. Difuminado +HISTORY_MSG_883;Local - Ondíc. Contraste por nivel +HISTORY_MSG_884;Local - Ondíc. dir Contraste +HISTORY_MSG_885;Local - Ondíc. Mapeo tonal +HISTORY_MSG_886;Local - Ondíc. Mapeo tonal comprimir +HISTORY_MSG_887;Local - Ondíc. Mapeo tonal comprimir residual +HISTORY_MSG_888;Local - Contraste ondíc. Umbr. balance +HISTORY_MSG_889;Local - Contraste ondíc. Intens. Graduado +HISTORY_MSG_890;Local - Contraste ondíc. Ángulo Graduado +HISTORY_MSG_891;Local - Contraste ondíc. Graduado +HISTORY_MSG_892;Local - Codific. Log Intens. Graduado +HISTORY_MSG_893;Local - Codific. Log Ángulo Graduado +HISTORY_MSG_894;Local - Color Vista previa ΔE +HISTORY_MSG_897;Local - RD Contraste ondíc. Intens. +HISTORY_MSG_898;Local - RD Contraste ondíc. Radio +HISTORY_MSG_899;Local - RD Contraste ondíc. Detalle +HISTORY_MSG_900;Local - RD Contraste ondíc. Gradiente +HISTORY_MSG_901;Local - RD Contraste ondíc. Umbr. bajo +HISTORY_MSG_902;Local - RD Contraste ondíc. Umbr. alto +HISTORY_MSG_903;Local - RD Contraste ondíc. Contraste local +HISTORY_MSG_904;Local - RD Contraste ondíc. Primer nivel +HISTORY_MSG_905;Local - RD Contraste ondíc. Nitidez bordes +HISTORY_MSG_906;Local - RD Contraste ondíc. Sensib. +HISTORY_MSG_907;Local - RD Contraste ondíc. Amplif. +HISTORY_MSG_908;Local - RD Contraste ondíc. Vecindad +HISTORY_MSG_909;Local - RD Contraste ondíc. Mostrar +HISTORY_MSG_910;Local - Rendimiento de ondículas en bordes +HISTORY_MSG_911;Local - Difumin. cromaticidad Luma +HISTORY_MSG_912;Local - Difumin. Intens. filtro guiado +HISTORY_MSG_913;Local - Contraste ondíc. Sigma RD +HISTORY_MSG_914;Local - Difumin. Ondíc. Sigma BL +HISTORY_MSG_915;Local - Bordes Ondíc. Sigma ED +HISTORY_MSG_916;Local - Residual Ondíc. sombras +HISTORY_MSG_917;Local - Residual Ondíc. umbr. sombras +HISTORY_MSG_918;Local - Residual Ondíc. luces +HISTORY_MSG_919;Local - Residual Ondíc. umbr. luces +HISTORY_MSG_920;Local - Ondíc. sigma LC +HISTORY_MSG_921;Local - Ondíc. Graduado sigma LC2 +HISTORY_MSG_922;Local - Cambios en B/N +HISTORY_MSG_923;Local - Modo Complejidad herram. +HISTORY_MSG_924;-- no usado -- +HISTORY_MSG_925;Local - Ámbito herram. color +HISTORY_MSG_926;Local - Mostrar tipo máscara +HISTORY_MSG_927;Local - Sombras +HISTORY_MSG_928;Local - Máscara Común color +HISTORY_MSG_929;Local - Máscara Común Ámbito +HISTORY_MSG_930;Local - Máscara Común Mezclar luma +HISTORY_MSG_931;Local - Máscara Común Activar +HISTORY_MSG_932;Local - Máscara Común Radio suave +HISTORY_MSG_933;Local - Máscara Común Laplaciana +HISTORY_MSG_934;Local - Máscara Común Cromaticidad +HISTORY_MSG_935;Local - Máscara Común Gamma +HISTORY_MSG_936;Local - Máscara Común Pendiente +HISTORY_MSG_937;Local - Máscara Común Curva C(C) +HISTORY_MSG_938;Local - Máscara Común Curva L(L) +HISTORY_MSG_939;Local - Máscara Común Curva LC(H) +HISTORY_MSG_940;Local - Máscara Común Estructura como herram. +HISTORY_MSG_941;Local - Máscara Común Intens. estructura +HISTORY_MSG_942;Local - Máscara Común Curva H(H) +HISTORY_MSG_943;Local - Máscara Común FFT +HISTORY_MSG_944;Local - Máscara Común Radio difumin. +HISTORY_MSG_945;Local - Máscara Común Umbr. contraste +HISTORY_MSG_946;Local - Máscara Común Sombras +HISTORY_MSG_947;Local - Máscara Común Curva contraste +HISTORY_MSG_948;Local - Máscara Común Curva ondíc. +HISTORY_MSG_949;Local - Máscara Común Umbral niveles +HISTORY_MSG_950;Local - Máscara Común Intens. FG +HISTORY_MSG_951;Local - Máscara Común Ángulo FG +HISTORY_MSG_952;Local - Máscara Común Radio suave +HISTORY_MSG_953;Local - Máscara Común Mezcla cromaticidad +HISTORY_MSG_954;Local - Mostrar/ocultar herram. +HISTORY_MSG_955;Local - Activar punto +HISTORY_MSG_956;Local - Curva CH +HISTORY_MSG_957;Local - Modo reducc. ruido +HISTORY_MSG_958;Local - Mostrar/ocultar ajustes +HISTORY_MSG_959;Local - Difumin. inverso +HISTORY_MSG_960;Local - Codific. Log - CAT16 +HISTORY_MSG_961;Local - Codific. Log Ciecam +HISTORY_MSG_962;Local - Codific. Log Luma abs. Origen +HISTORY_MSG_963;Local - Codific. Log Luma abs. Destino +HISTORY_MSG_964;Local - Codific. Log Entorno +HISTORY_MSG_965;Local - Codific. Log Saturación s +HISTORY_MSG_966;Local - Codific. Log Contraste J +HISTORY_MSG_967;Local - Codific. Log Máscara Curva C +HISTORY_MSG_968;Local - Codific. Log Máscara Curva L +HISTORY_MSG_969;Local - Codific. Log Máscara Curva H +HISTORY_MSG_970;Local - Codific. Log Máscara Activar +HISTORY_MSG_971;Local - Codific. Log Máscara Mezcla +HISTORY_MSG_972;Local - Codific. Log Máscara Radio +HISTORY_MSG_973;Local - Codific. Log Máscara cromaticidad +HISTORY_MSG_974;Local - Codific. Log Máscara Contraste +HISTORY_MSG_975;Local - Codific. Log Claridad J +HISTORY_MSG_977;Local - Codific. Log Contraste Q +HISTORY_MSG_978;Local - Codific. Log Entorno orig. +HISTORY_MSG_979;Local - Codific. Log Brillo Q +HISTORY_MSG_980;Local - Codific. Log Colorido M +HISTORY_MSG_981;Local - Codific. Log Intensidad +HISTORY_MSG_982;Local - Ecualizador matiz +HISTORY_MSG_983;Local - Reducc. ruido Máscara Umbr. alto +HISTORY_MSG_984;Local - Reducc. ruido Máscara Umbr. bajo +HISTORY_MSG_985;Local - Reducc. ruido Laplaciana +HISTORY_MSG_986;Local - Reducc. ruido Reforzar +HISTORY_MSG_987;Local - Filtro guiado Umbr. recup. +HISTORY_MSG_988;Local - Filtro guiado Máscara Umbr. bajo +HISTORY_MSG_989;Local - Filtro guiado Máscara Umbr. alto +HISTORY_MSG_990;Local - Reducc. ruido Umbr. recup. +HISTORY_MSG_991;Local - Reducc. ruido Máscara Umbr. bajo +HISTORY_MSG_992;Local - Reducc. ruido Máscara Umbr. alto +HISTORY_MSG_993;Local - Reducc. ruido Alg. inverso +HISTORY_MSG_994;Local - Filtro guiado Alg. inverso +HISTORY_MSG_995;Local - Reducc. ruido Decaim. +HISTORY_MSG_996;Local - Color Umbr. recup. +HISTORY_MSG_997;Local - Color Máscara Umbr. bajo +HISTORY_MSG_998;Local - Color Máscara Umbr. alto +HISTORY_MSG_999;Local - Color Decaim. +HISTORY_MSG_1000;Local - Reducc. ruido luma gris +HISTORY_MSG_1001;Local - Log Umbr. recup. +HISTORY_MSG_1002;Local - Log Máscara Umbr. bajo +HISTORY_MSG_1003;Local - Log Máscara Umbr. alto +HISTORY_MSG_1004;Local - Log Decaim. +HISTORY_MSG_1005;Local - Exp Umbr. recup. +HISTORY_MSG_1006;Local - Exp Máscara Umbr. bajo +HISTORY_MSG_1007;Local - Exp Máscara Umbr. alto +HISTORY_MSG_1008;Local - Exp Decaim. +HISTORY_MSG_1009;Local - S/AL Umbr. recup. +HISTORY_MSG_1010;Local - S/AL Máscara Umbr. bajo +HISTORY_MSG_1011;Local - S/AL Máscara Umbr. alto +HISTORY_MSG_1012;Local - S/AL Decaim. +HISTORY_MSG_1013;Local - Vivac. Umbr. recup. +HISTORY_MSG_1014;Local - Vivac. Máscara Umbr. bajo +HISTORY_MSG_1015;Local - Vivac. Máscara Umbr. alto +HISTORY_MSG_1016;Local - Vivac. Decaim. +HISTORY_MSG_1017;Local - LC Umbr. recup. +HISTORY_MSG_1018;Local - LC Máscara Umbr. bajo +HISTORY_MSG_1019;Local - LC Máscara Umbr. alto +HISTORY_MSG_1020;Local - LC Decaim. +HISTORY_MSG_1021;Local - Reducc. ruido cromaticidad gris +HISTORY_MSG_1022;Local - MT Umbr. recup. +HISTORY_MSG_1023;Local - MT Máscara Umbr. bajo +HISTORY_MSG_1024;Local - MT Máscara Umbr. alto +HISTORY_MSG_1025;Local - MT Decaim. +HISTORY_MSG_1026;Local - CPND Umbr. recup. +HISTORY_MSG_1027;Local - CPND Máscara Umbr. bajo +HISTORY_MSG_1028;Local - CPND Máscara Umbr. alto +HISTORY_MSG_1029;Local - CPND Decaim. +HISTORY_MSG_1030;Local - Reti Umbr. recup. +HISTORY_MSG_1031;Local - Reti Máscara Umbr. bajo +HISTORY_MSG_1032;Local - Reti Máscara Umbr. alto +HISTORY_MSG_1033;Local - Reti Decaim. +HISTORY_MSG_1034;Local - Medias NL - Intensidad +HISTORY_MSG_1035;Local - Medias NL - Detalle +HISTORY_MSG_1036;Local - Medias NL - Parcela +HISTORY_MSG_1037;Local - Medias NL - Radio +HISTORY_MSG_1038;Local - Medias NL - gamma +HISTORY_MSG_1039;Local - Grano - gamma +HISTORY_MSG_1040;Local - Punto - Radio suave +HISTORY_MSG_1041;Local - Punto - Munsell +HISTORY_MSG_1042;Local - Codific. log. - Umbral +HISTORY_MSG_1043;Local - Exp - Normalizar +HISTORY_MSG_1044;Local - Contraste local Intens. +HISTORY_MSG_1045;Local - Color y Luz Intens. +HISTORY_MSG_1046;Local - Reducc. ruido Intens. +HISTORY_MSG_1047;Local - S/AL y Ecualiz. tono Intens. +HISTORY_MSG_1048;Local - RD y Expos. Intens. +HISTORY_MSG_1049;Local - MT Intensidad +HISTORY_MSG_1050;Local - Codific. log. Cromaticidad +HISTORY_MSG_1051;Local - gamma ondícula Residual +HISTORY_MSG_1052;Local - pendiente ondícula Residual +HISTORY_MSG_1053;Local - gamma Reducc. ruido +HISTORY_MSG_1054;Local - gamma Ondícula +HISTORY_MSG_1055;Local - gamma Color y luz +HISTORY_MSG_1056;Local - gamma RD y Exposición +HISTORY_MSG_1057;Local - CIECAM activado +HISTORY_MSG_1058;Local - CIECAM Intensidad global +HISTORY_MSG_1059;Local - CIECAM Gris auto +HISTORY_MSG_1060;Local - CIECAM luminancia media fuente +HISTORY_MSG_1061;Local - CIECAM absoluta fuente +HISTORY_MSG_1062;Local - CIECAM entorno fuente +HISTORY_MSG_1063;Local - CIECAM Saturación +HISTORY_MSG_1064;Local - CIECAM Cromaticidad +HISTORY_MSG_1065;Local - CIECAM claridad J +HISTORY_MSG_1066;Local - CIECAM brillo +HISTORY_MSG_1067;Local - CIECAM Contraste J +HISTORY_MSG_1068;Local - CIECAM umbral +HISTORY_MSG_1069;Local - CIECAM contraste Q +HISTORY_MSG_1070;Local - CIECAM colorido +HISTORY_MSG_1071;Local - CIECAM Luminancia absoluta +HISTORY_MSG_1072;Local - CIECAM Luminancia media +HISTORY_MSG_1073;Local - CIECAM Cat16 +HISTORY_MSG_1074;Local - CIECAM Contraste local +HISTORY_MSG_1075;Local - CIECAM Visualiz. entorno +HISTORY_MSG_1076;Local - CIECAM Ámbito +HISTORY_MSG_1077;Local - CIECAM Modo +HISTORY_MSG_1078;Local - Protecc. rojos y piel +HISTORY_MSG_1079;Local - CIECAM Sigmoide intens. J +HISTORY_MSG_1080;Local - CIECAM Sigmoide umbral +HISTORY_MSG_1081;Local - CIECAM Sigmoide mezcla +HISTORY_MSG_1082;Local - CIECAM Sigmoide Q EvBlanco EvNegro +HISTORY_MSG_1083;Local - CIECAM Matiz +HISTORY_MSG_1084;Local - Usa Ev Negro - Ev Blanco +HISTORY_MSG_1085;Local - Jz claridad +HISTORY_MSG_1086;Local - Jz contraste +HISTORY_MSG_1087;Local - Jz cromaticidad +HISTORY_MSG_1088;Local - Jz matiz +HISTORY_MSG_1089;Local - Jz Sigmoide intens. +HISTORY_MSG_1090;Local - Jz Sigmoide umbral +HISTORY_MSG_1091;Local - Jz Sigmoide mezcla +HISTORY_MSG_1092;Local - Jz Adaptación +HISTORY_MSG_1093;Local - Modelo CAM +HISTORY_MSG_1094;Local - Jz luces +HISTORY_MSG_1095;Local - Jz umbral luces +HISTORY_MSG_1096;Local - Jz sombras +HISTORY_MSG_1097;Local - Jz umbral sombras +HISTORY_MSG_1098;Local - Jz radio S/AL +HISTORY_MSG_1099;Local - Curva Cz(Hz) +HISTORY_MSG_1100;Local - Jz Referencia 100 +HISTORY_MSG_1101;Local - Jz Remapeo CP +HISTORY_MSG_1102;Local - Curva Jz(Hz) +HISTORY_MSG_1103;Local - Nitidez gamma +HISTORY_MSG_1104;Local - Vivacidad gamma +HISTORY_MSG_1105;Local - CIECAM Método tono +HISTORY_MSG_1106;Local - CIECAM Curva tonal +HISTORY_MSG_1107;Local - CIECAM Método Color +HISTORY_MSG_1108;Local - CIECAM Curva Color +HISTORY_MSG_1109;Local - Curva Jz(Jz) +HISTORY_MSG_1110;Local - Curva Cz(Cz) +HISTORY_MSG_1111;Local - Curva Cz(Jz) +HISTORY_MSG_1112;Local - Forzar Jz +HISTORY_MSG_1113;Local - HDR CP +HISTORY_MSG_1114;Local - Cie activar máscara +HISTORY_MSG_1115;Local - Cie Máscara curva C +HISTORY_MSG_1116;Local - Cie Máscara curva L +HISTORY_MSG_1117;Local - Cie Máscara curva H +HISTORY_MSG_1118;Local - Cie Máscara mezcla +HISTORY_MSG_1119;Local - Cie Máscara radio +HISTORY_MSG_1120;Local - Cie Máscara cromaticidad +HISTORY_MSG_1121;Local - Cie Máscara curva contraste +HISTORY_MSG_1122;Local - Cie Máscara umbral recuperac. +HISTORY_MSG_1123;Local - Cie Máscara recuperac. oscuro +HISTORY_MSG_1124;Local - Cie Máscara recuperac. claro +HISTORY_MSG_1125;Local - Cie Máscara recuperac. decaim. +HISTORY_MSG_1126;Local - Cie Máscara laplaciana +HISTORY_MSG_1127;Local - Cie Máscara gamma +HISTORY_MSG_1128;Local - Cie Máscara pendiente +HISTORY_MSG_1129;Local - Cie Luminancia relativa +HISTORY_MSG_1130;Local - Cie Saturación Jz +HISTORY_MSG_1131;Local - Reducc. ruido crom. máscara +HISTORY_MSG_1132;Local - Cie Ondíc. sigma Jz +HISTORY_MSG_1133;Local - Cie Ondíc. nivel Jz +HISTORY_MSG_1134;Local - Cie Ondíc. contraste local Jz +HISTORY_MSG_1135;Local - Cie Ondíc. claridad Jz +HISTORY_MSG_1136;Local - Cie Ondíc. claridad Cz +HISTORY_MSG_1137;Local - Cie Ondíc. claridad suave +HISTORY_MSG_1138;Local - Local - Curva Hz(Hz) +HISTORY_MSG_1139;Local - Jz Curvas suaves H +HISTORY_MSG_1140;Local - Jz Umbral cromaticidad +HISTORY_MSG_1141;Local - Curva cromat. Jz(Hz) +HISTORY_MSG_1142;Local - intensidad suave +HISTORY_MSG_1143;Local - Jz Ev Negro +HISTORY_MSG_1144;Local - Jz Ev Blanco +HISTORY_MSG_1145;Local - Jz Codific. Log +HISTORY_MSG_1146;Local - Jz Codific. Log gris objetivo +HISTORY_MSG_1147;Local - Jz Ev Negro Ev Blanco +HISTORY_MSG_1148;Local - Jz Sigmoide +HISTORY_MSG_1149;Local - Sigmoide Q +HISTORY_MSG_1150;Local - Codif. log. Q en vez de Sigmoide Q +HISTORY_MSG_BLSHAPE;Difuminado por niveles +HISTORY_MSG_BLURCWAV;Difuminar cromaticidad +HISTORY_MSG_BLURWAV;Difuminar luminancia +HISTORY_MSG_BLUWAV;Respuesta de atenuación +HISTORY_MSG_CATCAT;AC & I - Ajustes - Modo +HISTORY_MSG_CATCOMPLEX;AC & I - Ajustes - Complejidad +HISTORY_MSG_CATMODEL;AC & I - Ajustes - CAM +HISTORY_MSG_CLAMPOOG;Recortar colores fuera de rango +HISTORY_MSG_COLORTONING_LABGRID_VALUE;Virado - Corrección de color +HISTORY_MSG_COLORTONING_LABREGION_AB;Virado - Corrección de color +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;Virado - Canal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;Virado - Región máscara C +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Virado - Máscara H +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;Virado - Claridad +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;Virado - Máscara L +HISTORY_MSG_COLORTONING_LABREGION_LIST;Virado - Lista +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;Virado - Difuminado máscara región +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;Virado - Desplazamiento región +HISTORY_MSG_COLORTONING_LABREGION_POWER;Virado - Potencia región +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;Virado - Saturación +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;Virado - Mostrar máscara región +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;Virado - Pendiente región +HISTORY_MSG_COMPLEX;Complejidad ondículas +HISTORY_MSG_COMPLEXRETI;Complejidad Retinex +HISTORY_MSG_DEHAZE_DEPTH;Elim. neblina - Profundidad +HISTORY_MSG_DEHAZE_ENABLED;Elim. neblina +HISTORY_MSG_DEHAZE_SATURATION;Elim. neblina - Saturación +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Elim. neblina - Mostrar mapa profundidad +HISTORY_MSG_DEHAZE_STRENGTH;Elim. neblina - Intensidad +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Desentramado doble - Umbral auto +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Desentramado doble - Umbral contraste +HISTORY_MSG_EDGEFFECT;Respuesta de atenuación en bordes +HISTORY_MSG_FILMNEGATIVE_BALANCE;Película negativa - Salida de referencia +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Espacio de color película negativa +HISTORY_MSG_FILMNEGATIVE_ENABLED;Película negativa +HISTORY_MSG_FILMNEGATIVE_REF_SPOT;Película negativa - Entrada de referencia +HISTORY_MSG_FILMNEGATIVE_VALUES;Valores película negativa +HISTORY_MSG_HISTMATCHING;Curva tonal autoajustada +HISTORY_MSG_HLBL;Propagación de color - difuminado +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +HISTORY_MSG_ICM_AINTENT;Convers. rango colores perfil abstracto +HISTORY_MSG_ICM_BLUX;Primarios Azul X +HISTORY_MSG_ICM_BLUY;Primarios Azul Y +HISTORY_MSG_ICM_FBW;Blanco y negro +HISTORY_MSG_ICM_GREX;Primarios Verde X +HISTORY_MSG_ICM_GREY;Primarios Verde Y +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Salida - Primarios +HISTORY_MSG_ICM_OUTPUT_TEMP;Salida - ICC-v4 iluminante D +HISTORY_MSG_ICM_OUTPUT_TYPE;Salida - Tipo +HISTORY_MSG_ICM_PRESER;Preservar tonos pastel +HISTORY_MSG_ICM_REDX;Primarios Rojo X +HISTORY_MSG_ICM_REDY;Primarios Rojo Y +HISTORY_MSG_ICM_WORKING_GAMMA;Espacio trabajo - Gamma +HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Método de iluminante +HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Método de primarios +HISTORY_MSG_ICM_WORKING_SLOPE;Espacio trabajo - Pendiente +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Espacio trabajo - Método TRC +HISTORY_MSG_ILLUM;AC & I - Condic. escena - Iluminante +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contraste local - Cantidad +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contraste local - Oscuridad +HISTORY_MSG_LOCALCONTRAST_ENABLED;Contraste local +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contraste local - Claridad +HISTORY_MSG_LOCALCONTRAST_RADIUS;Contraste local - Radio +HISTORY_MSG_METADATA_MODE;Modo copia metadatos +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontraste - Umbral contraste +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;Nitidez tras captura - Umbral auto +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;Nitidez tras captura - Radio auto +HISTORY_MSG_PDSHARPEN_CHECKITER;Nitidez tras captura - Autolimitar iteraciones +HISTORY_MSG_PDSHARPEN_CONTRAST;Nitidez tras captura - Umbral contraste +HISTORY_MSG_PDSHARPEN_ITERATIONS;Nitidez tras captura - Iteraciones +HISTORY_MSG_PDSHARPEN_RADIUS;Nitidez tras captura - Radio +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;Nitidez tras captura - Aumento radio esquinas +HISTORY_MSG_PERSP_CAM_ANGLE;Perspectiva - Cámara +HISTORY_MSG_PERSP_CAM_FL;Perspectiva - Cámara +HISTORY_MSG_PERSP_CAM_SHIFT;Perspectiva - Cámara +HISTORY_MSG_PERSP_CTRL_LINE;Perspectiva - Líneas de control +HISTORY_MSG_PERSP_METHOD;Perspectiva - Método +HISTORY_MSG_PERSP_PROJ_ANGLE;Perspectiva - Recuperación +HISTORY_MSG_PERSP_PROJ_ROTATE;Perspectiva - Rotación PCA +HISTORY_MSG_PERSP_PROJ_SHIFT;Perspectiva - PCA +HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Promedio +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PixelShift - Método desentramado para movim. +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Dirección filtro ruido de línea +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtro líneas autofoco dif. fase +HISTORY_MSG_PREPROCWB_MODE;Modo preprocesado WB +HISTORY_MSG_PROTAB;Protección +HISTORY_MSG_PRSHARPEN_CONTRAST;Nitidez tras cambio tamaño - Umbral contraste +HISTORY_MSG_RANGEAB;Rango ab +HISTORY_MSG_RAWCACORR_AUTOIT;Corrección aberrac. cromát. raw - Iteraciones +HISTORY_MSG_RAWCACORR_COLORSHIFT;Corrección aberrac. cromát. raw - Evitar la deriva de colores +HISTORY_MSG_RAW_BORDER;Borde raw +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Cambio tamaño - Permitir aumento +HISTORY_MSG_RESIZE_LONGEDGE;Cambio tamaño - Lado largo +HISTORY_MSG_RESIZE_SHORTEDGE;Cambio tamaño - Lado corto +HISTORY_MSG_SHARPENING_BLUR;Nitidez - Radio difuminado +HISTORY_MSG_SHARPENING_CONTRAST;Nitidez - Umbral de contraste +HISTORY_MSG_SH_COLORSPACE;Sombras/Luces - Espacio de color +HISTORY_MSG_SIGMACOL;Respuesta atenuación cromaticidad +HISTORY_MSG_SIGMADIR;Respuesta atenuación dir. +HISTORY_MSG_SIGMAFIN;Respuesta atenuación contraste final +HISTORY_MSG_SIGMATON;Respuesta atenuación virado +HISTORY_MSG_SOFTLIGHT_ENABLED;Luz suave +HISTORY_MSG_SOFTLIGHT_STRENGTH;Luz suave - Intensidad +HISTORY_MSG_SPOT;Elim. manchas +HISTORY_MSG_SPOT_ENTRY;Elim. manchas - Punto modif. +HISTORY_MSG_TEMPOUT;Temperatura automática CAM02 +HISTORY_MSG_THRESWAV;Umbral de balance +HISTORY_MSG_TM_FATTAL_ANCHOR;Compresión rango dinámico - Anclaje +HISTORY_MSG_TRANS_METHOD;Geometría - Método +HISTORY_MSG_WAVBALCHROM;Ecualizador cromaticidad +HISTORY_MSG_WAVBALLUM;Ecualizador luminancia +HISTORY_MSG_WAVBL;Difuminar niveles +HISTORY_MSG_WAVCHR;Difumin. niveles - difumin. cromat. +HISTORY_MSG_WAVCHROMCO;Cromaticidad grueso +HISTORY_MSG_WAVCHROMFI;Cromaticidad fino +HISTORY_MSG_WAVCLARI;Claridad +HISTORY_MSG_WAVDENLH;Nivel 5 +HISTORY_MSG_WAVDENOISE;Contraste local +HISTORY_MSG_WAVDENOISEH;Contraste local niveles altos +HISTORY_MSG_WAVDETEND;Detalles suaves +HISTORY_MSG_WAVEDGS;Parada en bordes +HISTORY_MSG_WAVGUIDH;Contraste local - Ecualizador de matiz +HISTORY_MSG_WAVHUE;Ecualizador de matiz +HISTORY_MSG_WAVLABGRID_VALUE;Virado - excluir colores +HISTORY_MSG_WAVLEVDEN;Contraste local niveles altos +HISTORY_MSG_WAVLEVELSIGM;Reducc. ruido - radio +HISTORY_MSG_WAVLEVSIGM;Radio +HISTORY_MSG_WAVLIMDEN;Interacción 56 14 +HISTORY_MSG_WAVLOWTHR;Umbral bajo contraste +HISTORY_MSG_WAVMERGEC;Combinar C +HISTORY_MSG_WAVMERGEL;Combinar L +HISTORY_MSG_WAVMIXMET;Contraste local de referencia +HISTORY_MSG_WAVOFFSET;Desplazamiento +HISTORY_MSG_WAVOLDSH;Algoritmo antiguo +HISTORY_MSG_WAVQUAMET;Modo reducc. ruido +HISTORY_MSG_WAVRADIUS;Radio sombras-luces +HISTORY_MSG_WAVSCALE;Escala +HISTORY_MSG_WAVSHOWMASK;Mostrar máscara ondículas +HISTORY_MSG_WAVSIGM;Sigma +HISTORY_MSG_WAVSIGMA;Respuesta de atenuación +HISTORY_MSG_WAVSLIMET;Método +HISTORY_MSG_WAVSOFTRAD;Claridad radio suave +HISTORY_MSG_WAVSOFTRADEND;Radio suave final +HISTORY_MSG_WAVSTREND;Intensidad suave +HISTORY_MSG_WAVTHRDEN;Umbral contraste local +HISTORY_MSG_WAVTHREND;Umbral contraste local +HISTORY_MSG_WAVUSHAMET;Método de claridad +HISTORY_NEWSNAPSHOT;Añadir instantánea +HISTORY_NEWSNAPSHOT_TOOLTIP;Atajo de teclado: Alt-s +HISTORY_SNAPSHOT;Instantánea +HISTORY_SNAPSHOTS;Instantáneas +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Restablecer el copyright predeterminado, concedido a «RawTherapee, CC0». +ICCPROFCREATOR_CUSTOM;Personalizado +ICCPROFCREATOR_DESCRIPTION;Descripción: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Adjuntar los valores de gamma y pendiente a la descripción +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Dejar en blanco para establecer la descripción predeterminada. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;Versión de ICC: +ICCPROFCREATOR_ILL;Iluminante: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_63;D63: DCI-P3 Sala de cine +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Predeterminado +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Se puede ajustar el iluminante para perfiles ICC v4 y también para perfiles ICC v2. +ICCPROFCREATOR_PRIMARIES;Primarios: +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;Azul X +ICCPROFCREATOR_PRIM_BLUY;Azul Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +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;Se pueden ajustar primarios personalizados para perfiles ICC v4 y también para perfiles ICC v2. +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Guardar perfil ICC como... +ICCPROFCREATOR_SLOPE;Pendiente +ICCPROFCREATOR_TRC_PRESET;Curva de respuesta de tono: +INSPECTOR_WINDOW_TITLE;Inspeccionar +IPTCPANEL_CATEGORY;Categoría +IPTCPANEL_CATEGORYHINT;Identifica el tema de la imagen en opinión del proveedor. +IPTCPANEL_CITY;Ciudad +IPTCPANEL_CITYHINT;Nombre de la ciudad mostrada en esta imagen. +IPTCPANEL_COPYHINT;Copia los ajustes IPTC al portapapeles. +IPTCPANEL_COPYRIGHT;Información de copyright +IPTCPANEL_COPYRIGHTHINT;Información acerca del propietario actual del copyright para esta imagen, como © 2008 Jane Doe. +IPTCPANEL_COUNTRY;País +IPTCPANEL_COUNTRYHINT;Nombre del país mostrado en esta imagen. +IPTCPANEL_CREATOR;Creador +IPTCPANEL_CREATORHINT;Nombre de la persona que creó esta imagen. +IPTCPANEL_CREATORJOBTITLE;Profesión del creador +IPTCPANEL_CREATORJOBTITLEHINT;Profesión de la persona indicada en el campo Creador. +IPTCPANEL_CREDIT;Reconocimientos +IPTCPANEL_CREDITHINT;Quién debe recibir los reconocimientos cuando esta imagen se publique. +IPTCPANEL_DATECREATED;Fecha de creación +IPTCPANEL_DATECREATEDHINT;Fecha en que se tomó esta imagen. +IPTCPANEL_DESCRIPTION;Descripción +IPTCPANEL_DESCRIPTIONHINT;Descripción de los quién, qué y por qué de lo que está ocurriendo en esta imagen. Esto podría incluir nombres de personas y/o su papel en la acción que está teniendo lugar en la imagen. +IPTCPANEL_DESCRIPTIONWRITER;Escritor de la descripción +IPTCPANEL_DESCRIPTIONWRITERHINT;Nombre de la persona que ha escrito, editado o corregido la descripción de la imagen. +IPTCPANEL_EMBEDDED;Embebido +IPTCPANEL_EMBEDDEDHINT;Restablece los datos IPTC embebidos en el archivo de imagen. +IPTCPANEL_HEADLINE;Titular +IPTCPANEL_HEADLINEHINT;Breve sinopsis o resumen publicable del contenido de la imagen. +IPTCPANEL_INSTRUCTIONS;Instrucciones +IPTCPANEL_INSTRUCTIONSHINT;Información acerca de embargos u otras restricciones no cubiertas por el campo Copyright. +IPTCPANEL_KEYWORDS;Palabras clave +IPTCPANEL_KEYWORDSHINT;Cualquier número de palabras clave, términos o frases usadas para expresar la temática de la imagen. +IPTCPANEL_PASTEHINT;Pega ajustes IPTC desde el portapapeles. +IPTCPANEL_PROVINCE;Provincia o estado +IPTCPANEL_PROVINCEHINT;Nombre de la provincia o estado mostrado en esta imagen. +IPTCPANEL_RESET;Restablecer +IPTCPANEL_RESETHINT;Restablece los valores predeterminados del perfil. +IPTCPANEL_SOURCE;Fuente +IPTCPANEL_SOURCEHINT;Nombre de una persona o parte que tiene un papel en la cadena de suministro del contenido, como la persona o entidad de la que se ha recibido esta imagen. +IPTCPANEL_SUPPCATEGORIES;Categorías adicionales +IPTCPANEL_SUPPCATEGORIESHINT;Refina aún más el tema de la imagen. +IPTCPANEL_TITLE;Título +IPTCPANEL_TITLEHINT;Nombre verbal y legible para la imagen. Puede ser el nombre del archivo de imagen. +IPTCPANEL_TRANSREFERENCE;Identificador del trabajo +IPTCPANEL_TRANSREFERENCEHINT;Número o identificador necesario para el control del flujo de trabajo o el seguimiento. +MAIN_BUTTON_FULLSCREEN;Pantalla completa +MAIN_BUTTON_ICCPROFCREATOR;Creador de perfiles ICC +MAIN_BUTTON_NAVNEXT_TOOLTIP;Navega a la imagen siguiente a la que está abierta en el Editor.\nAtajo de teclado: Mayús-F4\n\nPara navegar a la imagen siguiente a la miniatura actualmente seleccionada en el Navegador de archivos o la Tira de imágenes:\nAtajo de teclado: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Navega a la imagen anterior a la que está abierta en el Editor.\nAtajo de teclado: Mayús-F3\n\nPara navegar a la imagen anterior a la miniatura actualmente seleccionada en el Navegador de archivos o la Tira de imágenes:\nAtajo de teclado: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Sincroniza el Navegador de archivos o la Tira de imágenes con el Editor para mostrar la miniatura de la imagen actualmente abierta, y suprime cualquier filtro activo.\nAtajo de teclado: x\n\nIgual que lo anterior, pero sin suprimir los filtros activos:\nAtajo de teclado: y\n(Obsérvese que la miniatura de la imagen abierta no se mostrará si está filtrada). +MAIN_BUTTON_PREFERENCES;Preferencias +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Envía la imagen actual a la cola de procesamiento.\nAtajo de teclado: Ctrl+b +MAIN_BUTTON_SAVE_TOOLTIP;Guarda la imagen actual.\nAtajo de teclado: Ctrl+s\nGuarda el perfil actual (.pp3).\nAtajo de teclado: Ctrl+Mayús+s +MAIN_BUTTON_SENDTOEDITOR;Editar la imagen en un editor externo +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edita la imagen actual en un editor externo.\nAtajo de teclado: Ctrl+e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Muestra/oculta todos los paneles laterales.\nAtajo de teclado: m +MAIN_BUTTON_UNFULLSCREEN;Salir de pantalla completa +MAIN_FRAME_EDITOR;Editor +MAIN_FRAME_EDITOR_TOOLTIP;Editor.\nAtajo de teclado: Ctrl-F4 +MAIN_FRAME_FILEBROWSER;Navegador de archivos +MAIN_FRAME_FILEBROWSER_TOOLTIP;Navegador de archivos.\nAtajo de teclado: Ctrl-F2 +MAIN_FRAME_PLACES;Ubicaciones +MAIN_FRAME_PLACES_ADD;Añadir +MAIN_FRAME_PLACES_DEL;Borrar +MAIN_FRAME_QUEUE;Cola +MAIN_FRAME_QUEUE_TOOLTIP;Cola de revelado.\nAtajo de teclado: Ctrl-F3 +MAIN_FRAME_RECENT;Carpetas recientes +MAIN_MSG_ALREADYEXISTS;El archivo ya existe. +MAIN_MSG_CANNOTLOAD;No se puede cargar la imagen +MAIN_MSG_CANNOTSAVE;Error al guardar el archivo +MAIN_MSG_CANNOTSTARTEDITOR;No se puede arrancar el editor. +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Por favor, establezca la ruta correcta en Preferencias. +MAIN_MSG_EMPTYFILENAME;¡Nombre de archivo no especificado! +MAIN_MSG_IMAGEUNPROCESSED;Esta orden necesita que todas las imágenes seleccionadas se procesen primero en la cola. +MAIN_MSG_NAVIGATOR;Navegador +MAIN_MSG_OPERATIONCANCELLED;Operación cancelada +MAIN_MSG_PATHDOESNTEXIST;La ruta\n\n%1\n\nno existe. Por favor, establezca una ruta correcta en Preferencias. +MAIN_MSG_QOVERWRITE;¿Desea sobreescribirlo? +MAIN_MSG_SETPATHFIRST;¡Para usar esta función, primero se debe establecer una ruta de destino en Preferencias! +MAIN_MSG_TOOMANYOPENEDITORS;Demasiados editores abiertos.\nPor favor, cierre un editor para continuar. +MAIN_MSG_WRITEFAILED;No se ha podido escribir\n«%1»\n\nAsegúrese de que la carpeta existe, y que tiene permiso de escritura en ella. +MAIN_TAB_ADVANCED;Avanzado +MAIN_TAB_ADVANCED_TOOLTIP;Atajo de teclado: Alt-w +MAIN_TAB_COLOR;Color +MAIN_TAB_COLOR_TOOLTIP;Atajo de teclado: Alt-c +MAIN_TAB_DETAIL;Detalle +MAIN_TAB_DETAIL_TOOLTIP;Atajo de teclado: Alt-d +MAIN_TAB_DEVELOP; Revelado por lotes +MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT;Exportación rápida +MAIN_TAB_EXPOSURE;Exposición +MAIN_TAB_EXPOSURE_TOOLTIP;Atajo de teclado: Alt-e +MAIN_TAB_FAVORITES;Favoritos +MAIN_TAB_FAVORITES_TOOLTIP;Atajo de teclado: Alt-u +MAIN_TAB_FILTER; Filtro +MAIN_TAB_INSPECT; Inspeccionar +MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Local +MAIN_TAB_LOCALLAB_TOOLTIP;Atajo de teclado: Alt-o +MAIN_TAB_METADATA;Metadatos +MAIN_TAB_METADATA_TOOLTIP;Atajo de teclado: Alt-m +MAIN_TAB_RAW;Raw +MAIN_TAB_RAW_TOOLTIP;Atajo de teclado: Alt-r +MAIN_TAB_TRANSFORM;Transformar +MAIN_TAB_TRANSFORM_TOOLTIP;Atajo de teclado: Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Color de fondo de la vista previa: Color del tema\nAtajo de teclado: 9 +MAIN_TOOLTIP_BACKCOLOR1;Color de fondo de la vista previa: Negro\nAtajo de teclado: 9 +MAIN_TOOLTIP_BACKCOLOR2;Color de fondo de la vista previa: Blanco\nAtajo de teclado: 9 +MAIN_TOOLTIP_BACKCOLOR3;Color de fondo de la vista previa: Gris medio\nAtajo de teclado: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Bloquear / Desbloquear la vista Antes\n\nBloquear: la vista Antes permanece sin cambios.\nEs útil para evaluar los efectos acumulados de varias herramientas.\nAdicionalmente, se pueden hacer comparaciones con cualquier estado en la Historia.\n\nDesbloquear: la vista Antes mostrará un paso de edición por detrás de la vista Después, es decir, mostrará la imagen antes de los efectos de la herramienta actualmente usada. +MAIN_TOOLTIP_HIDEHP;Muestra/oculta el panel izquierdo (incluyendo la historia).\nAtajo de teclado: l +MAIN_TOOLTIP_INDCLIPPEDH;Indicación de recorte de luces.\nAtajo de teclado: > +MAIN_TOOLTIP_INDCLIPPEDS;Indicación de recorte de sombras.\nAtajo de teclado: < +MAIN_TOOLTIP_PREVIEWB;Vista previa del canal azul.\nAtajo de teclado: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vista previa de la máscara de foco.\nAtajo de teclado: Mayús-f\n\nEs más precisa en imágenes con poca profundidad de campo, bajo ruido y a niveles altos de ampliación.\nPara mejorar la precisión de la detección en imágenes ruidosas, se debe reducir la ampliación de la vista previa al 10-30%. +MAIN_TOOLTIP_PREVIEWG;Vista previa del canal verde.\nAtajo de teclado: g +MAIN_TOOLTIP_PREVIEWL;Vista previa de la luminancia.\nAtajo de teclado: v\n\nL = 0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Vista previa del canal rojo.\nAtajo de teclado: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Vista previa de la máscara de contraste de nitidez.\nAtajo de teclado: p\n\nSólo funciona cuando la nitidez está activada y el nivel de ampliación es >= 100%. +MAIN_TOOLTIP_QINFO;Información rápida sobre la imagen.\nAtajo de teclado: i +MAIN_TOOLTIP_SHOWHIDELP1;Muestra/oculta el panel izquierdo.\nAtajo de teclado: l +MAIN_TOOLTIP_SHOWHIDERP1;Muestra/oculta el panel derecho.\nAtajo de teclado: Alt-l +MAIN_TOOLTIP_SHOWHIDETP1;Muestra/oculta el panel superior.\nAtajo de teclado: Mayús-l +MAIN_TOOLTIP_THRESHOLD;Umbral +MAIN_TOOLTIP_TOGGLE;Activa/desactiva la vista Antes/Después.\nAtajo de teclado: Mayús-b +MONITOR_PROFILE_SYSTEM;Predeterminado del sistema +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;Anchura: %1, Altura: %2 +NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;El perfil incorporado «%1» no se encuentra.\n\nLa instalación puede estar dañada.\n\nEn su lugar se usarán valores internos predeterminados. +OPTIONS_DEFIMG_MISSING;El perfil predeterminado para fotos no-raw no se encuentra o no se ha establecido.\n\nPor favor, compruebe su carpeta de perfiles, es posible que no exista o esté dañada.\n\nEn su lugar se usará «%1». +OPTIONS_DEFRAW_MISSING;El perfil predeterminado para fotos raw no se encuentra o no se ha establecido.\n\nPor favor, compruebe su carpeta de perfiles, es posible que no exista o esté dañada.\n\nEn su lugar se usará «%1». +PARTIALPASTE_ADVANCEDGROUP;Ajustes avanzados +PARTIALPASTE_BASICGROUP;Ajustes básicos +PARTIALPASTE_CACORRECTION;Corrección de aberración cromática +PARTIALPASTE_CHANNELMIXER;Mezclador de canales +PARTIALPASTE_CHANNELMIXERBW;Blanco y negro +PARTIALPASTE_COARSETRANS;Rotación/Volteo grueso +PARTIALPASTE_COLORAPP;Apariencia de color e Iluminación +PARTIALPASTE_COLORGROUP;Ajustes de color +PARTIALPASTE_COLORTONING;Virado de color +PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-llenado +PARTIALPASTE_COMPOSITIONGROUP;Ajustes de composición +PARTIALPASTE_CROP;Recorte +PARTIALPASTE_DARKFRAMEAUTOSELECT;Auto-selección de foto negra +PARTIALPASTE_DARKFRAMEFILE;Archivo de foto negra +PARTIALPASTE_DEFRINGE;Eliminación de borde púrpura +PARTIALPASTE_DEHAZE;Eliminación de neblina +PARTIALPASTE_DETAILGROUP;Ajustes de detalle +PARTIALPASTE_DIALOGLABEL;Pegado parcial de perfil de revelado +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 de ondículas +PARTIALPASTE_EVERYTHING;Todo +PARTIALPASTE_EXIFCHANGES;Exif +PARTIALPASTE_EXPOSURE;Exposición +PARTIALPASTE_FILMNEGATIVE;Película negativa +PARTIALPASTE_FILMSIMULATION;Simulación de película +PARTIALPASTE_FLATFIELDAUTOSELECT;Auto-selección de campo plano +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;Filtro graduado +PARTIALPASTE_HSVEQUALIZER;Ecualizador HSV +PARTIALPASTE_ICMSETTINGS;Ajustes de gestión de color +PARTIALPASTE_IMPULSEDENOISE;Reducción de ruido impulsivo +PARTIALPASTE_IPTCINFO;IPTC +PARTIALPASTE_LABCURVE;Ajustes L*a*b* +PARTIALPASTE_LENSGROUP;Ajustes del objetivo +PARTIALPASTE_LENSPROFILE;Perfil de corrección de objetivo +PARTIALPASTE_LOCALCONTRAST;Contraste local +PARTIALPASTE_LOCALLAB;Ajustes locales +PARTIALPASTE_LOCALLABGROUP;Config. Ajustes locales +PARTIALPASTE_METADATA;Modo de metadatos +PARTIALPASTE_METAGROUP;Ajustes de metadatos +PARTIALPASTE_PCVIGNETTE;Filtro de viñeteado +PARTIALPASTE_PERSPECTIVE;Perspectiva +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtro de píxels muertos +PARTIALPASTE_PREPROCESS_GREENEQUIL;Equilibrado de verdes +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtro de píxels calientes +PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtro de ruido de línea +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtro de líneas autofoco por dif. fase +PARTIALPASTE_PREPROCWB;Preprocesado balance de blancos +PARTIALPASTE_PRSHARPENING;Nitidez tras cambio de tamaño +PARTIALPASTE_RAWCACORR_AUTO;Autocorrección aberración cromática +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;Evitar la deriva de colores (aberración cromática) +PARTIALPASTE_RAWCACORR_CAREDBLUE;Aberración cromática rojo y azul +PARTIALPASTE_RAWEXPOS_BLACK;Niveles de negro +PARTIALPASTE_RAWEXPOS_LINEAR;Corrección del punto blanco +PARTIALPASTE_RAWGROUP;Ajustes Raw +PARTIALPASTE_RAW_BORDER;Borde Raw +PARTIALPASTE_RAW_DCBENHANCE;Mejora DCB +PARTIALPASTE_RAW_DCBITERATIONS;Iteraciones DCB +PARTIALPASTE_RAW_DMETHOD;Método de desentramado +PARTIALPASTE_RAW_FALSECOLOR;Supresión de falso color +PARTIALPASTE_RAW_IMAGENUM;Sub-imagen +PARTIALPASTE_RAW_LMMSEITERATIONS;Pasos de mejora LMMSE +PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift +PARTIALPASTE_RESIZE;Cambio de tamaño +PARTIALPASTE_RETINEX;Retinex +PARTIALPASTE_RGBCURVES;Curvas RGB +PARTIALPASTE_ROTATION;Rotación +PARTIALPASTE_SHADOWSHIGHLIGHTS;Sombras/Luces +PARTIALPASTE_SHARPENEDGE;Bordes +PARTIALPASTE_SHARPENING;Nitidez (USM/RL) +PARTIALPASTE_SHARPENMICRO;Microcontraste +PARTIALPASTE_SOFTLIGHT;Luz suave +PARTIALPASTE_SPOT;Eliminación de manchas +PARTIALPASTE_TM_FATTAL;Compresión de rango dinámico +PARTIALPASTE_VIBRANCE;Vivacidad +PARTIALPASTE_VIGNETTING;Corrección de viñeteado +PARTIALPASTE_WHITEBALANCE;Balance de blancos +PREFERENCES_ADD;Añadir +PREFERENCES_APPEARANCE;Apariencia +PREFERENCES_APPEARANCE_COLORPICKERFONT;Tipo de letra del muestreador de color +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Color de la máscara de recorte +PREFERENCES_APPEARANCE_MAINFONT;Tipo de letra principal +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Color de la guía del navegador +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Modo pseudo-HiDPI +PREFERENCES_APPEARANCE_THEME;Tema +PREFERENCES_APPLNEXTSTARTUP;Se necesita reiniciar +PREFERENCES_AUTOMONPROFILE;Usar el perfil de color del monitor principal del sistema operativo +PREFERENCES_AUTOSAVE_TP_OPEN;Guardar estado expandido/replegado de las herramientas al salir +PREFERENCES_BATCH_PROCESSING;Procesamiento por lotes +PREFERENCES_BEHADDALL;Todos a «Añadir» +PREFERENCES_BEHADDALLHINT;Pone todos los parámetros en el modo Añadir.\nLos ajustes de los parámetros en el panel de la herramienta de lotes serán incrementos sobre los valores almacenados. +PREFERENCES_BEHAVIOR;Comportamiento +PREFERENCES_BEHSETALL;Todos a «Establecer» +PREFERENCES_BEHSETALLHINT;Pone todos los parámetros en el modo Establecer.\nLos ajustes de los parámetros en el panel de la herramienta de lotes serán absolutos, y se mostrarán los valores reales. +PREFERENCES_CACHECLEAR;Limpiar +PREFERENCES_CACHECLEAR_ALL;Limpiar todos los archivos en caché: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Limpiar todos los archivos en caché excepto los perfiles de procesamiento: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Limpia solamente los perfiles de procesamiento en caché: +PREFERENCES_CACHECLEAR_SAFETY;Sólo se limpian los archivos en caché. Los perfiles de procesamiento almacenados junto con las imágenes originales no se tocan. +PREFERENCES_CACHEMAXENTRIES;Máximo número de entradas en caché +PREFERENCES_CACHEOPTS;Opciones de caché +PREFERENCES_CACHETHUMBHEIGHT;Altura máxima de las miniaturas +PREFERENCES_CHUNKSIZES;Teselas por hilo de ejecución +PREFERENCES_CHUNKSIZE_RAW_AMAZE;Desentramado AMaZE +PREFERENCES_CHUNKSIZE_RAW_CA;Corrección de aberración cromática raw +PREFERENCES_CHUNKSIZE_RAW_RCD;Desentramado RCD +PREFERENCES_CHUNKSIZE_RAW_XT;Desentramado X-Trans +PREFERENCES_CHUNKSIZE_RGB;Procesado RGB +PREFERENCES_CIE;Ciecam +PREFERENCES_CIEARTIF;Evitar los artefactos +PREFERENCES_CLIPPINGIND;Indicación de recorte +PREFERENCES_CLUTSCACHE;Caché de HaldCLUT +PREFERENCES_CLUTSCACHE_LABEL;Número máximo de CLUTs en caché +PREFERENCES_CLUTSDIR;Carpeta de HaldCLUT +PREFERENCES_CMMBPC;Compensación de punto negro +PREFERENCES_COMPLEXITYLOC;Complejidad predeterminada para ajustes locales +PREFERENCES_COMPLEXITY_EXP;Avanzado +PREFERENCES_COMPLEXITY_NORM;Estándar +PREFERENCES_COMPLEXITY_SIMP;Básico +PREFERENCES_CROP;Edición del recorte +PREFERENCES_CROP_AUTO_FIT;Ajustar automáticamente el recorte al tamaño de la vista previa +PREFERENCES_CROP_GUIDES;Se muestran las guías mientras no se edita el recorte +PREFERENCES_CROP_GUIDES_FRAME;Marco +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;Ninguna +PREFERENCES_CURVEBBOXPOS;Posición de los botones de copiar/pegar curva +PREFERENCES_CURVEBBOXPOS_ABOVE;Encima +PREFERENCES_CURVEBBOXPOS_BELOW;Debajo +PREFERENCES_CURVEBBOXPOS_LEFT;Izquierda +PREFERENCES_CURVEBBOXPOS_RIGHT;Derecha +PREFERENCES_CUSTPROFBUILD;Constructor de perfiles de revelado personalizados +PREFERENCES_CUSTPROFBUILDHINT;Archivo ejecutable (o archivo de órdenes) que se invoca cuando ha de generarse un perfil de revelado inicial nuevo para una imagen.\n\nLa ruta del archivo de comunicación (similar a un archivo *.ini, también llamado «Keyfile») se añade como un parámetro de línea de orden. Contiene varios parámetros necesarios para los archivos de órdenes y los datos Exif de la imagen, a fin de facilitar la generación de perfiles de procesamiento en función de reglas.\n\nADVERTENCIA:El usuario es responsable de usar comillas dobles donde sea necesario si se están usando rutas que contienen espacios. +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Formato de claves +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nombre +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID +PREFERENCES_CUSTPROFBUILDPATH;Ruta ejecutable +PREFERENCES_DARKFRAMEFOUND;Encontrada +PREFERENCES_DARKFRAMESHOTS;tomas +PREFERENCES_DARKFRAMETEMPLATES;plantillas +PREFERENCES_DATEFORMAT;Formato de fecha +PREFERENCES_DATEFORMATHINT;Se pueden usar las siguientes cadenas de formateo:\n%y - año\n%m - mes\n%d - día\n\nPor ejemplo, el estándar ISO 8601 dicta un formato de fecha como sigue:\n%y-%m-%d +PREFERENCES_DIRDARKFRAMES;Carpeta de fotos negras +PREFERENCES_DIRECTORIES;Carpetas +PREFERENCES_DIRHOME;Carpeta del usuario +PREFERENCES_DIRLAST;Última carpeta visitada +PREFERENCES_DIROTHER;Otra +PREFERENCES_DIRSELECTDLG;Seleccionar carpeta de imágenes durante el arranque... +PREFERENCES_DIRSOFTWARE;Carpeta de instalación +PREFERENCES_EDITORCMDLINE;Línea de orden personalizada +PREFERENCES_EDITORLAYOUT;Disposición del Editor +PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Ignorar el perfil de salida +PREFERENCES_EXTEDITOR_DIR;Carpeta de salida +PREFERENCES_EXTEDITOR_DIR_CURRENT;La misma que la imagen de entrada +PREFERENCES_EXTEDITOR_DIR_CUSTOM;Personalizada +PREFERENCES_EXTEDITOR_DIR_TEMP;Carpeta temporal del sistema operativo +PREFERENCES_EXTEDITOR_FLOAT32;Salida TIFF 32 bits coma flotante +PREFERENCES_EXTERNALEDITOR;Editor externo +PREFERENCES_FBROWSEROPTS;Opciones de Navegador de archivos/Miniaturas +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Barras de herramientas compactas en Navegador de archivos +PREFERENCES_FLATFIELDFOUND;Encontrado +PREFERENCES_FLATFIELDSDIR;Carpeta de archivos de campo plano +PREFERENCES_FLATFIELDSHOTS;tomas +PREFERENCES_FLATFIELDTEMPLATES;plantillas +PREFERENCES_FORIMAGE;Para fotos no-raw +PREFERENCES_FORRAW;Para fotos raw +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;La misma altura de miniaturas en la Tira de imágenes y en el Navegador de archivos +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;El uso de tamaños de miniatura distintos necesita más tiempo de procesamiento cada vez que se cambia entre el Editor y el Navegador de archivos. +PREFERENCES_GIMPPATH;Carpeta de instalación de GIMP +PREFERENCES_HISTOGRAMPOSITIONLEFT;Histograma en panel izquierdo +PREFERENCES_HISTOGRAM_TOOLTIP;Si se activa, se usará el perfil de trabajo para mostrar el histograma principal y el panel del Navegador. Si se desactiva, se usará el perfil de salida con corrección gamma. +PREFERENCES_HLTHRESHOLD;Umbral de recorte de luces +PREFERENCES_ICCDIR;Carpeta de perfiles de color +PREFERENCES_IMPROCPARAMS;Perfil de revelado predeterminado +PREFERENCES_INSPECTORWINDOW;Abrir inspector en su propia ventana o en pantalla completa +PREFERENCES_INSPECT_LABEL;Inspeccionar +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Número máximo de imágenes en caché +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Establece el número máximo de imágenes almacenadas en caché al pasar el cursor sobre ellas en el Navegador de archivos; en los sistemas con poca memoria RAM (2 GB) este valor debe ajustarse a 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 embebida si el raw no se ha editado +PREFERENCES_LANG;Idioma +PREFERENCES_LANGAUTODETECT;Usar idioma del sistema +PREFERENCES_MAXRECENTFOLDERS;Número máximo de carpetas recientes +PREFERENCES_MENUGROUPEXTPROGS;Grupo «Abrir con» +PREFERENCES_MENUGROUPFILEOPERATIONS;Grupo «Operaciones con archivos» +PREFERENCES_MENUGROUPLABEL;Grupo «Etiquetas de color» +PREFERENCES_MENUGROUPPROFILEOPERATIONS;Grupo «Operaciones con perfiles» +PREFERENCES_MENUGROUPRANK;Grupo «Asignar rango» +PREFERENCES_MENUOPTIONS;Opciones de menú contextual +PREFERENCES_MONINTENT;Método predeterminado de conversión de rango de colores +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Perfil de color predeterminado +PREFERENCES_MONPROFILE_WARNOSX;Debido a las limitaciones de MacOS, sólo está soportado sRGB. +PREFERENCES_MULTITAB;Modo de Editor de varias pestañas +PREFERENCES_MULTITABDUALMON;Modo de Editor de varias pestañas en segundo monitor, si está disponible +PREFERENCES_NAVIGATIONFRAME;Navegación +PREFERENCES_OVERLAY_FILENAMES;Superponer nombres de archivo en las miniaturas del Navegador de archivos +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Superponer nombres de archivo en miniaturas en la Tira de imágenes +PREFERENCES_OVERWRITEOUTPUTFILE;Sobreescribir archivos de salida existentes +PREFERENCES_PANFACTORLABEL;Tasa de amplificación del desplazamiento de vista previa +PREFERENCES_PARSEDEXT;Extensiones de archivo analizadas +PREFERENCES_PARSEDEXTADD;Añadir extensión de archivo +PREFERENCES_PARSEDEXTADDHINT;Añade la extensión introducida a la lista. +PREFERENCES_PARSEDEXTDELHINT;Borra la extensión seleccionada de la lista. +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_MEASURE;Medir +PREFERENCES_PERFORMANCE_MEASURE_HINT;Anota los tiempos de procesamiento en la consola. +PREFERENCES_PERFORMANCE_THREADS;Hilos de ejecución +PREFERENCES_PERFORMANCE_THREADS_LABEL;Número máximo de hilos para Reducción de ruido y Niveles de ondículas (0 = Automático) +PREFERENCES_PREVDEMO;Método de desentramado de la vista previa +PREFERENCES_PREVDEMO_FAST;Rápido +PREFERENCES_PREVDEMO_LABEL;Método de desentramado usado para la vista previa a ampliaciones <100%: +PREFERENCES_PREVDEMO_SIDECAR;Como en PP3 +PREFERENCES_PRINTER;Impresora (Prueba de impresión) +PREFERENCES_PROFILEHANDLING;Manejo de perfiles de procesamiento +PREFERENCES_PROFILELOADPR;Prioridad de carga de perfiles de procesamiento +PREFERENCES_PROFILEPRCACHE;Perfil en caché +PREFERENCES_PROFILEPRFILE;Perfil junto a archivo de entrada +PREFERENCES_PROFILESAVEBOTH;Guardar perfil de revelado tanto en caché como junto al archivo de entrada +PREFERENCES_PROFILESAVECACHE;Guardar perfil de revelado en caché +PREFERENCES_PROFILESAVEINPUT;Guardar perfil de revelado junto al archivo de entrada +PREFERENCES_PROFILESAVELOCATION;Ubicación donde guardar el perfil de revelado +PREFERENCES_PROFILE_NONE;Ninguno +PREFERENCES_PROPERTY;Propiedad +PREFERENCES_PRTINTENT;Método de conversión del rango de colores +PREFERENCES_PRTPROFILE;Perfil de color +PREFERENCES_PSPATH;Carpeta de instalación de Adobe Photoshop +PREFERENCES_REMEMBERZOOMPAN;Recordar el % de ampliación y la posición de desplazamiento +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Recuerda el % de ampliación y la posición de desplazamiento de la imagen actual al abrir una nueva imagen.\n\nEsta opción sólo funciona en el modo «Editor de pestaña única» y cuando el «Método de desentramado usado para la vista previa a ampliaciones <100%» está configurado a «Como en PP3». +PREFERENCES_SAVE_TP_OPEN_NOW;Guardar ahora el estado expandido/replegado de las herramientas +PREFERENCES_SELECTLANG;Seleccionar idioma +PREFERENCES_SERIALIZE_TIFF_READ;Ajustes de lectura de TIFF +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serializar lectura de archivos TIFF +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Al activar esta opción, cuando se trabaje con carpetas que contengan archivos TIFF no comprimidos, el rendimiento de la generación de miniaturas puede aumentar. +PREFERENCES_SET;Establecer +PREFERENCES_SHOWBASICEXIF;Mostrar info Exif básica +PREFERENCES_SHOWDATETIME;Mostrar fecha y hora +PREFERENCES_SHOWEXPOSURECOMPENSATION;Adjuntar compensación de exposición +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Mostrar la barra de herramientas de la Tira de imágenes +PREFERENCES_SHOWTOOLTIP;Mostrar información emergente de herramientas de Ajustes locales +PREFERENCES_SHTHRESHOLD;Umbral de recorte de sombras +PREFERENCES_SINGLETAB;Modo de Editor de pestaña única +PREFERENCES_SINGLETABVERTAB;Modo de Editor de pestaña única, pestañas verticales +PREFERENCES_SND_HELP;Para configurar un sonido, se introduce aquí una ruta completa y nombre de archivo, o bien se deja en blanco si no se desea sonido.\nPara los sonidos de sistema en Windows, se usa «SystemDefault», «SystemAsterisk», etc., y en Linux se usa «complete», «window-attention», etc. +PREFERENCES_SND_LNGEDITPROCDONE;Procesado del Editor terminado +PREFERENCES_SND_QUEUEDONE;Procesado de la cola terminado +PREFERENCES_SND_THRESHOLDSECS;Después de segundos +PREFERENCES_STARTUPIMDIR;Carpeta de imagen al arrancar +PREFERENCES_TAB_BROWSER;Navegador de archivos +PREFERENCES_TAB_COLORMGR;Gestión de color +PREFERENCES_TAB_DYNAMICPROFILE;Reglas de perfiles dinámicos +PREFERENCES_TAB_GENERAL;General +PREFERENCES_TAB_IMPROC;Procesamiento de imágenes +PREFERENCES_TAB_PERFORMANCE;Rendimiento +PREFERENCES_TAB_SOUND;Sonidos +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Vista previa de JPEG embebido +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Imagen a mostrar +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Reproducción neutra del raw +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;JPEG embebido si existe a tamaño máximo, raw neutro si no existe +PREFERENCES_TP_LABEL;Panel de herramientas: +PREFERENCES_TP_VSCROLLBAR;Ocultar barra de desplazamiento vertical +PREFERENCES_USEBUNDLEDPROFILES;Usar perfiles incorporados +PREFERENCES_WORKFLOW;Disposición +PREFERENCES_ZOOMONSCROLL;Ampliar imágenes desplazando +PROFILEPANEL_COPYPPASTE;Parámetros a copiar +PROFILEPANEL_GLOBALPROFILES;Perfiles incorporados +PROFILEPANEL_LABEL;Perfiles de procesamiento +PROFILEPANEL_LOADDLGLABEL;Cargar parámetros de procesamiento... +PROFILEPANEL_LOADPPASTE;Parámetros a cargar +PROFILEPANEL_MODE_TOOLTIP;Modo de rellenado del perfil de revelado.\n\nBotón pulsado: los perfiles parciales se convertirán en completos; los valores no presentes se reemplazarán por los internos predeterminados del programa.\n\nBotón no pulsado: los perfiles se aplicarán tal como están, alterando solamente los valores de los parámetros que contienen. +PROFILEPANEL_MYPROFILES;Mis perfiles +PROFILEPANEL_PASTEPPASTE;Parámetros a pegar +PROFILEPANEL_PCUSTOM;Personalizado +PROFILEPANEL_PDYNAMIC;Dinámico +PROFILEPANEL_PFILE;Desde archivo +PROFILEPANEL_PINTERNAL;Neutro +PROFILEPANEL_PLASTSAVED;Último guardado +PROFILEPANEL_SAVEDLGLABEL;Guardar parámetros de procesamiento... +PROFILEPANEL_SAVEPPASTE;Parámetros a guardar +PROFILEPANEL_TOOLTIPCOPY;Copia el perfil de revelado actual al portapapeles.\nCtrl-clic para seleccionar los parámetros a copiar. +PROFILEPANEL_TOOLTIPLOAD;Carga un perfil desde un archivo.\nCtrl-clic para seleccionar los parámetros a cargar. +PROFILEPANEL_TOOLTIPPASTE;Pega un perfil desde el portapapeles.\nCtrl-clic para seleccionar los parámetros a pegar. +PROFILEPANEL_TOOLTIPSAVE;Guarda el perfil actual.\nCtrl-clic para seleccionar los parámetros a guardar. +PROGRESSBAR_DECODING;Decodificando... +PROGRESSBAR_GREENEQUIL;Equilibrado de verdes... +PROGRESSBAR_HLREC;Reconstrucción de luces... +PROGRESSBAR_HOTDEADPIXELFILTER;Filtro de píxel caliente/muerto... +PROGRESSBAR_LINEDENOISE;Filtro de ruido de línea... +PROGRESSBAR_LOADING;Cargando imagen... +PROGRESSBAR_LOADINGTHUMBS;Cargando miniaturas... +PROGRESSBAR_LOADJPEG;Cargando archivo JPEG... +PROGRESSBAR_LOADPNG;Cargando archivo PNG... +PROGRESSBAR_LOADTIFF;Cargando archivo TIFF... +PROGRESSBAR_NOIMAGES;No se encuentran imágenes +PROGRESSBAR_PROCESSING;Procesando imagen... +PROGRESSBAR_PROCESSING_PROFILESAVED;Perfil de revelado guardado +PROGRESSBAR_RAWCACORR;Corrección AC raw... +PROGRESSBAR_READY;Listo +PROGRESSBAR_SAVEJPEG;Guardando archivo JPEG... +PROGRESSBAR_SAVEPNG;Guardando archivo PNG... +PROGRESSBAR_SAVETIFF;Guardando archivo TIFF... +PROGRESSBAR_SNAPSHOT_ADDED;Instantánea añadida +PROGRESSDLG_PROFILECHANGEDINBROWSER;Perfil de revelado cambiado en Navegador +QINFO_FRAMECOUNT;%2 tomas +QINFO_HDR;HDR / %2 toma(s) +QINFO_ISO;ISO +QINFO_NOEXIF;Datos Exif no disponibles. +QINFO_PIXELSHIFT;Pixel Shift / %2 toma(s) +QUEUE_AUTOSTART;Arranque automático +QUEUE_AUTOSTART_TOOLTIP;Inicia automáticamente el revelado cuando un nuevo trabajo llega a la cola. +QUEUE_DESTFILENAME;Ruta y nombre de archivo +QUEUE_FORMAT_TITLE;Formato de archivo +QUEUE_LOCATION_FOLDER;Guardar en carpeta +QUEUE_LOCATION_TEMPLATE;Usar plantilla +QUEUE_LOCATION_TEMPLATE_TOOLTIP;Especifica la ubicación de la salida en función de la ubicación de la foto origen, de la puntuación o rango, del estado en la papelera o de la posición en la cola.\n\nSi se usa el siguiente nombre de ruta y archivo como ejemplo:\n/home/tom/photos/2010-10-31/photo1.raw\nel significado de las cadenas de formato es como sigue:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = photo1\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r será reemplazado por la puntuación de la foto. Si la foto no tiene puntuación, se usará «0». Si la foto está en la papelera, se usará «x».\n\n%s1, ..., %s9 serán reemplazados por la posición inicial de la foto en la cola en el momento en que ésta arranca. El número especifica cuántos dígitos tendrá la posición, por ejemplo %s3 da como resultado «001».\n\nSi se desea guardar la imagen de salida junto con la imagen origen, se escribirá:\n%p1/%f\n\nSi se desea guardar la imagen de salida en una carpeta llamada «converted» ubicada en la carpeta de la foto origen, se escribirá:\n%p1/converted/%f\n\nSi se desea guardar la imagen de salida en\n«/home/tom/photos/converted/2010-10-31», se escribirá:\n%p2/converted/%d1/%f +QUEUE_LOCATION_TITLE;Ubicación de salida +QUEUE_STARTSTOP_TOOLTIP;Inicia o detiene el revelado de imágenes en la cola.\n\nAtajo de teclado: Ctrl+s +SAMPLEFORMAT_0;Formato de datos desconocido +SAMPLEFORMAT_1;8 bits sin signo +SAMPLEFORMAT_2;16 bits sin signo +SAMPLEFORMAT_4;24 bits LogLuv +SAMPLEFORMAT_8;32 bits LogLuv +SAMPLEFORMAT_16;16 bits coma flotante +SAMPLEFORMAT_32;24 bits coma flotante +SAMPLEFORMAT_64;32 bits coma flotante +SAVEDLG_AUTOSUFFIX;Añadir automáticamente un sufijo si el archivo ya existe +SAVEDLG_FILEFORMAT;Formato de archivo +SAVEDLG_FILEFORMAT_FLOAT; coma flotante +SAVEDLG_FORCEFORMATOPTS;Forzar opciones de guardado +SAVEDLG_JPEGQUAL;Calidad JPEG +SAVEDLG_PUTTOQUEUE;Enviar a la cola de procesamiento +SAVEDLG_PUTTOQUEUEHEAD;Situar en la cabecera de la cola de procesamiento +SAVEDLG_PUTTOQUEUETAIL;Situar al final de la cola de procesamiento +SAVEDLG_SAVEIMMEDIATELY;Guardar inmediatamente +SAVEDLG_SAVESPP;Guardar parámetros de procesamiento junto con la imagen +SAVEDLG_SUBSAMP;Submuestreo +SAVEDLG_SUBSAMP_1;Máxima compresión +SAVEDLG_SUBSAMP_2;Equilibrado +SAVEDLG_SUBSAMP_3;Máxima calidad +SAVEDLG_SUBSAMP_TOOLTIP;Máxima compresión:\nJ:a:b 4:2:0\nh/v 2/2\nColor reducido a la mitad horizontal y verticalmente.\n\nEquilibrado:\nJ:a:b 4:2:2\nh/v 2/1\nColor reducido a la mitad horizontalmente.\n\nMáxima calidad:\nJ:a:b 4:4:4\nh/v 1/1\nSin submuestreo de cromaticidad. +SAVEDLG_TIFFUNCOMPRESSED;TIFF sin compresión +SAVEDLG_WARNFILENAME;El archivo se nombrará +SHCSELECTOR_TOOLTIP;La posición de estos tres deslizadores se reinicia haciendo clic en el botón derecho del ratón. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Destaca los píxels con colores fuera de rango con respecto a:\n\n- el perfil de la impresora, si éste está establecido y la prueba de impresión está activada,\n- el perfil de salida, si no se ha establecido un perfil de impresora y la prueba de impresión está activada,\n- el perfil del monitor, si la prueba de impresión está desactivada. +SOFTPROOF_TOOLTIP;La prueba de impresión simula la apariencia de la imagen:\n\n- cuando se imprima, si se ha establecido un perfil de impresora en Preferencias > Gestión de color,\n- cuando se visualiza en una pantalla que usa el perfil de salida actual, si no se ha establecido un perfil de impresora. +TC_PRIM_BLUX;Azul X +TC_PRIM_BLUY;Azul Y +TC_PRIM_GREX;Verde X +TC_PRIM_GREY;Verde Y +TC_PRIM_REDX;Rojo X +TC_PRIM_REDY;Rojo Y +THRESHOLDSELECTOR_B;Inferior +THRESHOLDSELECTOR_BL;Inferior-izquierda +THRESHOLDSELECTOR_BR;Inferior-derecha +THRESHOLDSELECTOR_HINT;Los puntos de control individuales se mueven manteniendo pulsada la tecla Mayús. +THRESHOLDSELECTOR_T;Superior +THRESHOLDSELECTOR_TL;Superior-izquierda +THRESHOLDSELECTOR_TR;Superior-derecha +TOOLBAR_TOOLTIP_COLORPICKER;Muestreador de color bloqueable.\n\nCuando la herramienta está activa:\n- Añadir un muestreador: clic-izquierdo.\n- Arrastrar un muestreador: clic-izquierdo y arrastrar.\n- Borrar un muestreador: clic-derecho.\n- Borrar todos los muestreadores: Ctrl+Mayús+clic-derecho.\n- Revertir a herramienta Mano: clic-derecho fuera de los muestreadores. +TOOLBAR_TOOLTIP_CROP;Selección de Recorte.\nAtajo de teclado: c\nEl recorte se mueve usando Mayús+arrastrar. +TOOLBAR_TOOLTIP_HAND;Herramienta Mano.\nAtajo de teclado: h +TOOLBAR_TOOLTIP_PERSPECTIVE;Corrección de perspectiva\n\nPermite editar líneas de control para corregir la distorsión de perspectiva. Para aplicar la corrección, se debe pulsar de nuevo este botón. +TOOLBAR_TOOLTIP_STRAIGHTEN;Enderezado / Rotación fina.\nAtajo de teclado: s\n\nLa línea vertical u horizontal se indica dibujando una línea guía sobre la vista previa de la imagen. Se mostrará el ángulo de rotación junto a la línea guía. El centro de rotación es el centro geométrico de la imagen. +TOOLBAR_TOOLTIP_WB;Balance de blancos por muestreo.\nAtajo de teclado: w +TP_BWMIX_ALGO;Algoritmo OYCPM +TP_BWMIX_ALGO_LI;Lineal +TP_BWMIX_ALGO_SP;Efectos especiales +TP_BWMIX_ALGO_TOOLTIP;Lineal: producirá una respuesta lineal normal.\nEfectos especiales: se producirán efectos especiales mediante la mezcla no lineal de canales. +TP_BWMIX_AUTOCH;Automático +TP_BWMIX_CC_ENABLED;Ajustar color complementario +TP_BWMIX_CC_TOOLTIP;Actívese para permitir el ajuste automático de los colores complementarios en modo ROYGCBPM. +TP_BWMIX_CHANNEL;Ecualizador de luminancia +TP_BWMIX_CURVEEDITOR1;Curva «Antes» +TP_BWMIX_CURVEEDITOR2;Curva «Después» +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Curva tonal, después de la conversión a B/N, al final del tratamiento. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Curva tonal, justo antes de la conversión a B/N.\nPuede tener en cuenta los componentes de color. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminancia en función del matiz L=f(H).\nAtención a los valores extremos, ya que pueden causar artefactos. +TP_BWMIX_FILTER;Filtro de color +TP_BWMIX_FILTER_BLUE;Azul +TP_BWMIX_FILTER_BLUEGREEN;Azul-verde +TP_BWMIX_FILTER_GREEN;Verde +TP_BWMIX_FILTER_GREENYELLOW;Verde-amarillo +TP_BWMIX_FILTER_NONE;Ninguno +TP_BWMIX_FILTER_PURPLE;Púrpura +TP_BWMIX_FILTER_RED;Rojo +TP_BWMIX_FILTER_REDYELLOW;Rojo-amarillo +TP_BWMIX_FILTER_TOOLTIP;El filtro de color simula las tomas realizadas con un filtro coloreado situado delante del objetivo. Los filtros coloreados reducen la transmisión de rangos de color específicos, y en consecuencia afectan a su claridad. Por ejemplo, un filtro rojo oscurece el cielo azul. +TP_BWMIX_FILTER_YELLOW;Amarillo +TP_BWMIX_GAMMA;Corrección gamma +TP_BWMIX_GAM_TOOLTIP;Corrige la gamma para cada canal RGB. +TP_BWMIX_LABEL;Blanco y negro +TP_BWMIX_MET;Método +TP_BWMIX_MET_CHANMIX;Mezclador de canales +TP_BWMIX_MET_DESAT;Desaturación +TP_BWMIX_MET_LUMEQUAL;Ecualizador de luminancia +TP_BWMIX_MIXC;Mezclador de canales +TP_BWMIX_NEUTRAL;Reiniciar +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% +TP_BWMIX_RGBLABEL_HINT;Factores RGB finales que se encargan de todas las opciones del mezclador.\n«Total» muestra la suma de los valores RGB:\n- siempre es 100% en modo relativo\n- mayor (más claro) o menor (más oscuro) que el 100% en modo absoluto. +TP_BWMIX_RGB_TOOLTIP;Mezcla los canales RGB. Los ajustes preestablecidos pueden usarse como guía.\nAtención a los valores negativos, pues pueden causar artefactos o un comportamiento errático. +TP_BWMIX_SETTING;Preestablecidos +TP_BWMIX_SETTING_TOOLTIP;Diferentes ajustes preestablecidos (película, paisaje, etc.) o ajustes manuales del Mezclador de canales. +TP_BWMIX_SET_HIGHCONTAST;Alto contraste +TP_BWMIX_SET_HIGHSENSIT;Alta sensibilidad +TP_BWMIX_SET_HYPERPANCHRO;Hiper Pancromático +TP_BWMIX_SET_INFRARED;Infrarrojo +TP_BWMIX_SET_LANDSCAPE;Paisaje +TP_BWMIX_SET_LOWSENSIT;Baja sensibilidad +TP_BWMIX_SET_LUMINANCE;Luminancia +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 absoluto +TP_BWMIX_SET_RGBREL;RGB relativo +TP_BWMIX_SET_ROYGCBPMABS;ROYGCBPM absoluto +TP_BWMIX_SET_ROYGCBPMREL;ROYGCBPM relativo +TP_BWMIX_TCMODE_FILMLIKE;B/N como película +TP_BWMIX_TCMODE_SATANDVALBLENDING;B/N Mezcla de saturación y valor +TP_BWMIX_TCMODE_STANDARD;B/N Estándar +TP_BWMIX_TCMODE_WEIGHTEDSTD;B/N Estándar ponderado +TP_BWMIX_VAL;L +TP_CACORRECTION_BLUE;Azul +TP_CACORRECTION_LABEL;Corrección de aberración cromática +TP_CACORRECTION_RED;Rojo +TP_CBDL_AFT;Después de Blanco y negro +TP_CBDL_BEF;Antes de Blanco y negro +TP_CBDL_METHOD;Posición del proceso +TP_CBDL_METHOD_TOOLTIP;Elige dónde posicionar la herramienta Contraste por niveles de detalle: o bien después de la herramienta Blanco y negro, lo que hace que trabaje en el espacio L*a*b*, o bien antes de ella, lo que hace que trabaje 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_COARSETRAF_TOOLTIP_HFLIP;Voltea horizontalmente. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Gira a la izquierda.\n\nAtajos de teclado:\n[ - Modo de Editor de varias pestañas,\nAlt-[ - Modo de Editor de pestaña única. +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Gira a la derecha.\n\nAtajos de teclado:\n] - Modo de Editor de varias pestañas,\nAlt-] - Modo de Editor de pestaña única. +TP_COARSETRAF_TOOLTIP_VFLIP;Voltea verticalmente. +TP_COLORAPP_ABSOLUTELUMINANCE;Luminancia absoluta +TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponde a la luminancia en cd/m² en el momento de la toma, calculada de forma automática a partir de los datos Exif. +TP_COLORAPP_ALGO;Algoritmo +TP_COLORAPP_ALGO_ALL;Todos +TP_COLORAPP_ALGO_JC;Claridad + Cromaticidad (JC) +TP_COLORAPP_ALGO_JS;Claridad + Saturación (JS) +TP_COLORAPP_ALGO_QM;Claridad + Colorido (QM) +TP_COLORAPP_ALGO_TOOLTIP;Permite escoger entre subconjuntos de parámetros o todos los parámetros. +TP_COLORAPP_BADPIXSL;Filtro de píxels calientes/muertos +TP_COLORAPP_BADPIXSL_TOOLTIP;Supresión de píxels calientes/muertos (de un color brillante).\n0 = Sin efecto\n1 = Mediana\n2 = Gaussiano.\nAlternativamente, ajusta la imagen para evitar sombras muy oscuras.\n\nEstos artefactos se deben a limitaciones de CIECAM02. +TP_COLORAPP_BRIGHT;Brillo (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;El Brillo en CIECAM es la cantidad de luz percibida que emana de un estímulo. Difiere del brillo de L*a*b* y RGB. +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Si se ajusta manualmente, se recomiendan valores por encima de 65. +TP_COLORAPP_CATCLASSIC;Clásico +TP_COLORAPP_CATMET_TOOLTIP;Clásico: funcionamiento tradicional de CIECAM. Las transformaciones de adaptación cromática se aplican separadamente en «Condiciones de la escena» e iluminante básico por un lado, y en el iluminante básico y «Condiciones de entorno» por otro.\n\nSimétrico: La adaptación cromática se basa en el balance de blancos. Los ajustes «Condiciones de la escena», «Ajustes de imagen» y «Condiciones de entorno» se neutralizan.\n\nMezcla: Como la opción «Clásico», pero en este caso, la adaptación cromática se basa en el balance de blancos. +TP_COLORAPP_CATMOD;Modo Cat02/16 +TP_COLORAPP_CATSYMGEN;Automático simétrico +TP_COLORAPP_CATSYMSPE;Mezcla +TP_COLORAPP_CHROMA;Cromaticidad (C) +TP_COLORAPP_CHROMA_M;Colorido (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;El colorido en CIECAM es la cantidad percibida de matiz en relación al gris, un indicador de que un estímulo parece estar más o menos coloreado. +TP_COLORAPP_CHROMA_S;Saturación (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;La Saturación en CIECAM corresponde al color de un estímulo en relación a su propio brillo. Difiere de la saturación L*a*b* y RGB. +TP_COLORAPP_CHROMA_TOOLTIP;La Cromaticidad en CIECAM corresponde al color de un estímulo relativo a la claridad de un estímulo que parece blanco bajo idénticas condiciones. Difiere de la cromaticidad L*a*b* y RGB. +TP_COLORAPP_CIECAT_DEGREE;Adaptación +TP_COLORAPP_CONTRAST;Contraste (J) +TP_COLORAPP_CONTRAST_Q;Contraste (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;El Contraste (Q) en CIECAM se basa en el brillo. Difiere del contraste en L*a*b* y RGB. +TP_COLORAPP_CONTRAST_TOOLTIP;El Contraste (J) en CIECAM se basa en la claridad. Difiere del contraste en L*a*b* y RGB. +TP_COLORAPP_CURVEEDITOR1;Curva tonal 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Muestra el histograma de L* (L*a*b*) antes de CIECAM.\nSi la casilla «Mostrar histogramas de salida de CIECAM en curvas» está activada, muestra el histograma de J después de CIECAM.\n\nJ no se muestra en el panel del histograma principal.\n\nPara la salida final, se puede consultar el panel del histograma principal. +TP_COLORAPP_CURVEEDITOR2;Curva tonal 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;El mismo uso que la primera curva tonal J(J). +TP_COLORAPP_CURVEEDITOR3;Curva de color +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Ajusta la cromaticidad, la saturación o el colorido.\n\nMuestra el histograma de cromaticidad (L*a*b*) antes de CIECAM.\nSi la casilla «Mostrar histogramas de salida de CIECAM en curvas» está activada, muestra el histograma de C, S o M después de CIECAM.\n\nC, S y M no se muestran en el panel del histograma principal.\nPara la salida final, se puede consultar el panel del histograma principal. +TP_COLORAPP_DATACIE;Histogramas de salida CIECAM en las curvas +TP_COLORAPP_DATACIE_TOOLTIP;Si está activado, los histogramas en las curvas CIECAM muestran los valores/rangos aproximados de J, y C, S o M después de los ajustes de CIECAM.\nEsta selección no influye en el histograma principal.\n\nSi está desactivado, los histogramas en las curvas CIECAM muestran los valores L*a*b* antes de los ajustes de CIECAM. +TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 es una adaptación cromática. Convierte los valores de una imagen cuyo punto blanco es el de un iluminante dado (por ejemplo D65) a nuevos valores cuyo punto blanco es el del nuevo iluminante. Consúltese el Modelo de Punto Blanco (por ejemplo, D50 or D55). +TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 es una adaptación cromática. Convierte los valores de una imagen cuyo punto blanco es el de un iluminante dado (por ejemplo D50) a nuevos valores cuyo punto blanco es el del nuevo iluminante. Consúltese el Modelo de Punto Blanco (por ejemplo D75). +TP_COLORAPP_FREE;Temperatura+verde libres + CAT02/16 + [salida] +TP_COLORAPP_GAMUT;Emplear el control de rango de colores en el modo L*a*b* +TP_COLORAPP_GEN;Ajustes +TP_COLORAPP_GEN_TOOLTIP;Este módulo está basado en los modelos de apariencia de color CIECAM, que se diseñaron para simular mejor cómo la visión humana percibe los colores bajo diferentes condiciones de iluminación, por ejemplo, contra fondos diferentes.\n\nTiene en cuenta el entorno de cada color y modifica su apariencia para que sea lo más cercana posible a la percepción humana.\n\nTambién adapta la salida a las condiciones de visualización previstas (monitor, TV, proyector, impresora, etc.) de modo que la apariencia cromática se preserve para todos los entornos de escena y visualización. +TP_COLORAPP_HUE;Matiz (h) +TP_COLORAPP_HUE_TOOLTIP;Matiz (h) es el grado en que un estímulo puede describirse como similar a un color descrito como rojo, verde, azul y amarillo. +TP_COLORAPP_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;Incandescente StdA 2856K +TP_COLORAPP_ILFREE;Libre +TP_COLORAPP_ILLUM;Iluminante +TP_COLORAPP_ILLUM_TOOLTIP;Selecciona el iluminante más cercano a las condiciones de toma.\nEn general será D50, pero puede cambiar en función de la hora y la latitud. +TP_COLORAPP_LABEL;Apariencia de Color e Iluminación +TP_COLORAPP_LABEL_CAM02;Ajustes de imagen +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;La Claridad en CIECAM es la claridad de un estímulo relativa a la claridad de un estímulo que parece blanco bajo condiciones de visualización similares. Difiere de la claridad en L*a*b* y RGB. +TP_COLORAPP_MEANLUMINANCE;Luminancia media (Yb%) +TP_COLORAPP_MOD02;CIECAM02 +TP_COLORAPP_MOD16;CIECAM16 +TP_COLORAPP_MODEL;Modelo de punto blanco +TP_COLORAPP_MODELCAT;Modelo CAM +TP_COLORAPP_MODELCAT_TOOLTIP;Permite elegir entre CIECAM02 o CIECAM16.\nA veces CIECAM02 será más preciso.\nCIECAM16 debería generar menos artefactos. +TP_COLORAPP_MODEL_TOOLTIP;Modelo de punto blanco.\n\nWB [RT] + [salida]: Se usa el balance de blancos de RT para la escena, CIECAM02/16 se ajusta a D50, y el balance de blancos del dispositivo de salida se ajusta en Condiciones de visualización.\n\nWB [RT+CAT02/16] + [salida]: CAT02 usa los ajustes de balance de blancos de RT, y el balance de blancos del dispositivo de salida se ajusta en Condiciones de visualización.\n\nTemperatura+verde libres + CAT02 + [salida]:El usuario elige la temperatura y el nivel de verde, y el balance de blancos del dispositivo de salida se ajusta en Condiciones de visualización. +TP_COLORAPP_NEUTRAL;Restablecer +TP_COLORAPP_NEUTRAL_TOOLTIP;Restablece todos los deslizadores, casillas de verificación y curvas a sus valores predeterminados. +TP_COLORAPP_RSTPRO;Protección de rojo y tonos de piel +TP_COLORAPP_RSTPRO_TOOLTIP;La Protección de rojo y tonos de piel afecta tanto a los deslizadores como a las curvas. +TP_COLORAPP_SOURCEF_TOOLTIP;Corresponde a las condiciones de toma y cómo llevar las condiciones y los datos a una zona «normal». «Normal» significa aquí condiciones y datos promedio o estándar, es decir, sin tener en cuenta las correcciones CIECAM. +TP_COLORAPP_SURROUND;Entorno de visualización +TP_COLORAPP_SURROUNDSRC;Entorno (Iluminación de escena) +TP_COLORAPP_SURROUND_AVER;Promedio +TP_COLORAPP_SURROUND_DARK;Oscuro +TP_COLORAPP_SURROUND_DIM;Luz tenue +TP_COLORAPP_SURROUND_EXDARK;Muy oscuro +TP_COLORAPP_SURROUND_TOOLTIP;Cambia los tonos y colores teniendo en cuenta las condiciones de visualización del dispositivo de salida.\n\nPromedio: Entorno de luz promedio (estándar). La imagen no cambiará.\n\nLuz tenue: Entorno con luz tenue (TV). La imagen se volverá un poco oscura.\n\nOscuro: Entorno oscuro (proyector). La imagen se volverá más oscura.\n\nMuy oscuro: Entorno muy oscuro. La imagen se volverá muy oscura. +TP_COLORAPP_SURSOURCE_TOOLTIP;Cambia tonos y colores para tener en cuenta las condiciones de la escena.\n\nPromedio: Entorno de luz promedio (estándar). La imagen no cambiará.\n\nTenue: Entorno tenue. La imagen se volverá ligeramente brillante.\n\nOscuro: Entorno oscuro. La imagen se volverá más brillante.\n\nMuy oscuro: Entorno muy oscuro. La imagen se volverá muy brillante. +TP_COLORAPP_TCMODE_BRIGHTNESS;Brillo +TP_COLORAPP_TCMODE_CHROMA;Cromaticidad +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 curva de cromaticidad +TP_COLORAPP_TCMODE_LIGHTNESS;Claridad +TP_COLORAPP_TCMODE_SATUR;Saturación +TP_COLORAPP_TEMP2_TOOLTIP;O bien modo simétrico, Temp = balance de blancos.\nO bien, se selecciona el iluminante, poniendo siempre Tinte=1.\n\nA Temp=2856 K\nD41 Temp=4100 K\nD50 Temp=5003 K\nD55 Temp=5503 K\nD60 Temp=6000 K\nD65 Temp=6504 K\nD75 Temp=7504 K +TP_COLORAPP_TEMP_TOOLTIP;Para seleccionar un iluminante, se ajusta siempre Tinte=1.\n\nTemp A=2856 K\nTemp D50=5003 K\nTemp D55=5503 K\nTemp D65=6504 K\nTemp D75=7504 K +TP_COLORAPP_TONECIE;Mapeo tonal mediante CIECAM +TP_COLORAPP_TONECIE_TOOLTIP;Si esta opción está desactivada, el mapeo tonal se realiza en el espacio L*a*b*.\nSi está activada, el mapeo tonal se realiza mediante CIECAM02.\nLa herramienta Mapeo tonal debe estar activada para que este ajuste tenga efectos. +TP_COLORAPP_VIEWINGF_TOOLTIP;Tiene en cuenta el medio en el que se visualizará la imagen final (monitor, TV, proyector, impresora, etc.), así como su entorno. Este proceso tomará los datos procedentes del proceso «Ajustes de imagen» y los «llevará» al medio de visualización, de tal modo que se tendrán en cuenta las condiciones de visualización. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Luminancia absoluta del entorno de visualización\n(normalmente 16 cd/m²). +TP_COLORAPP_WBCAM;WB [RT+CAT02] + [salida] +TP_COLORAPP_WBRT;WB [RT] + [salida] +TP_COLORAPP_YBOUT_TOOLTIP;Yb es la luminancia relativa del fondo, expresada en % de gris. Un gris al 18% corresponde a una luminancia del fondo, expresada en CIE L, del 50%.\nEste dato debe tener en cuenta la luminancia promedio de la imagen. +TP_COLORAPP_YBSCEN_TOOLTIP;Yb es la luminancia relativa del fondo, expresada en % de gris. Un gris al 18% corresponde a una luminancia del fondo, expresada en CIE L, del 50%.\nEste dato se calcula a partir de la luminancia promedio de la imagen. +TP_COLORTONING_AB;o C/L +TP_COLORTONING_AUTOSAT;Automático +TP_COLORTONING_BALANCE;Balance +TP_COLORTONING_BY;o C/L +TP_COLORTONING_CHROMAC;Opacidad +TP_COLORTONING_COLOR;Color +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Opacidad de cromaticidad en función de la luminancia oC=f(L) +TP_COLORTONING_HIGHLIGHT;Luces +TP_COLORTONING_HUE;Matiz +TP_COLORTONING_LAB;Mezcla L*a*b* +TP_COLORTONING_LABEL;Virado de color +TP_COLORTONING_LABGRID;Cuadrícula de corrección de color L*a*b* +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;Claridad +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Corrección +TP_COLORTONING_LABREGION_MASK;Máscara +TP_COLORTONING_LABREGION_MASKBLUR;Difuminado de máscara +TP_COLORTONING_LABREGION_OFFSET;Compensación +TP_COLORTONING_LABREGION_POWER;Potencia +TP_COLORTONING_LABREGION_SATURATION;Saturación +TP_COLORTONING_LABREGION_SHOWMASK;Mostrar máscara +TP_COLORTONING_LABREGION_SLOPE;Pendiente +TP_COLORTONING_LUMA;Luminancia +TP_COLORTONING_LUMAMODE;Preservar luminancia +TP_COLORTONING_LUMAMODE_TOOLTIP;Si está activado, cuando se cambie un color (rojo, verde, cian, azul, etc.), la luminancia de cada píxel se preservará. +TP_COLORTONING_METHOD;Método +TP_COLORTONING_METHOD_TOOLTIP;Los métodos «Mezcla L*a*b*», «Deslizadores RGB» y «Curvas RGB» usan la mezcla interpolada de color.\n\nLos métodos «Balance de color (Sombras/Tonos medios/Luces)» y «Saturación 2 colores» usan colores directos.\n\nLa herramienta Blanco y negro se puede activar mientras se usa cualquier método de virado de color, lo que permite el virado. +TP_COLORTONING_MIDTONES;Tonos medios +TP_COLORTONING_NEUTRAL;Reiniciar deslizadores +TP_COLORTONING_NEUTRAL_TOOLTIP;Reiniciar todos los valores (Sombras, Tonos medios, Luces) a los predeterminados. +TP_COLORTONING_OPACITY;Opacidad +TP_COLORTONING_RGBCURVES;RGB - Curvas +TP_COLORTONING_RGBSLIDERS;RGB - Deslizadores +TP_COLORTONING_SA;Protección de saturación +TP_COLORTONING_SATURATEDOPACITY;Intensidad +TP_COLORTONING_SATURATIONTHRESHOLD;Umbral +TP_COLORTONING_SHADOWS;Sombras +TP_COLORTONING_SPLITCO;Sombras/Tonos medios/Luces +TP_COLORTONING_SPLITCOCO;Balance de color (Sombras/Tonos medios/Luces) +TP_COLORTONING_SPLITLR;Saturación 2 colores +TP_COLORTONING_STR;Intensidad +TP_COLORTONING_STRENGTH;Intensidad +TP_COLORTONING_TWO2;Cromaticidad especial «2 colores» +TP_COLORTONING_TWOALL;Cromaticidad especial +TP_COLORTONING_TWOBY;Especial a* y b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;Cromaticidad estándar:\nRespuesta lineal, a* = b*.\n\nCromaticidad especial:\nRespuesta lineal, a* = b*, pero no limitada: pruébese bajo la diagonal.\n\nEspecial a* y b*:\nRespuesta lineal no limitada con curvas separadas para a* y b*. Pensado para efectos especiales.\n\nCromaticidad especial 2 colores:\nMás predecible. +TP_COLORTONING_TWOSTD;Cromaticidad estándar +TP_CROP_FIXRATIO;Fijar proporciones +TP_CROP_GTCENTEREDSQUARE;Cuadrado centrado +TP_CROP_GTDIAGONALS;Regla de las diagonales +TP_CROP_GTEPASSPORT;Pasaporte biométrico +TP_CROP_GTFRAME;Marco +TP_CROP_GTGRID;Cuadrícula +TP_CROP_GTHARMMEANS;Proporciones armónicas +TP_CROP_GTNONE;Ninguna +TP_CROP_GTRULETHIRDS;Regla de los tercios +TP_CROP_GTTRIANGLE1;Triángulos de oro 1 +TP_CROP_GTTRIANGLE2;Triángulos de oro 2 +TP_CROP_GUIDETYPE;Tipo de guía: +TP_CROP_H;Altura +TP_CROP_LABEL;Recortar +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Reiniciar +TP_CROP_SELECTCROP;Seleccionar recorte +TP_CROP_W;Anchura +TP_CROP_X;Izquierda +TP_CROP_Y;Arriba +TP_DARKFRAME_AUTOSELECT;Auto-selección +TP_DARKFRAME_LABEL;Foto 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_SATURATION;Saturación +TP_DEHAZE_SHOW_DEPTH_MAP;Mostrar mapa de profundidad +TP_DEHAZE_STRENGTH;Intensidad +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zonas +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automático global +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Cromaticidad - Azul-Amarillo +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Curva de cromaticidad +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Incrementa (multiplica) el valor de todos los deslizadores de cromaticidad.\nEsta curva permite ajustar la intensidad de reducción de ruido cromático en función de la cromaticidad; por ejemplo, para incrementar la acción en áreas de baja saturación y reducirla en las de alta saturación. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Cromaticidad +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Cromaticidad - Maestro +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Método +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual:\nActúa en toda la imagen.\nEl usuario controla los ajustes de reducción de ruido manualmente.\n\nAutomático global:\nActúa en toda la imagen.\nSe usan 9 zonas para calcular un ajuste global de reducción de ruido de cromaticidad.\n\nVista previa:\nActúa en toda la imagen.\nLa parte de la imagen visible en la vista previa se usa para calcular los ajustes globales de reducción de ruido de cromaticidad. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActúa en toda la imagen.\nEl usuario controla los ajustes de reducción de ruido manualmente.\n\nAutomático global\nActúa en toda la imagen.\nSe usan 9 zonas para calcular un ajuste global de reducción de ruido de cromaticidad.\n\nAutomático multi-zona\nNo visible en vista previa: sólo funciona al guardar la imagen, pero puedes tener una idea de los resultados esperados usando el método «Vista previa», haciendo coincidir el tamaño y centro de la tesela con el tamaño y centro de la vista previa.\nLa imagen se divide en teselas (entre 10 y 70 según el tamaño de la imagen), y cada tesela recibe sus propios ajustes de reducción de ruido de cromaticidad.\n\nVista previa\nActúa en toda la imagen.\nLa parte de la imagen visible en la vista previa se usa para calcular los ajustes globales de reducción de ruido de cromaticidad. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Vista previa multi-zona +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Vista previa +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Muestra los niveles residuales de ruido de la parte de la imagen visible en la vista previa después de las ondículas.\n\n>300 Muy ruidoso\n100-300 Ruidoso\n50-100 Un poco ruidoso\n<50 Muy bajo ruido\n\nAtención, 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 cromaticidad. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Tamaño de vista previa=%1, Centro: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Ruido en vista previa: Media=%1 Alto=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Ruido en vista previa: Media= - Alto= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tamaño de tesela=%1, Centro: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Cromaticidad - Rojo-Verde +TP_DIRPYRDENOISE_LABEL;Reducción de ruido +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Control de luminancia +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Curva de luminancia +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Recuperación de detalle +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminancia +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminancia +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Espacio de color +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Para imágenes raw se puede usar tanto el método RGB como el L*a*b*.\n\nPara imágenes no raw, se usará el método L*a*b*, independientemente de lo seleccionado. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varía la intensidad de la reducción de ruido en función del rango de tonos. Los valores menores actuarán más en las sombras, mientras que los valores mayores extenderán el efecto a los tonos más brillantes. +TP_DIRPYRDENOISE_MAIN_MODE;Modo +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Agresivo +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservador +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;«Conservador» preserva los patrones de cromaticidad de baja frecuencia, mientras que «Agresivo» los destruye. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Método de mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Sólo cromaticidad +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtro de mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Sólo luminancia +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Si se usan los métodos «Sólo luminancia» y «L*a*b*», el filtrado de mediana se realizará justo después del paso de ondículas en el circuito de reducción de ruido.\nSi se usa el modo «RGB», se realizará al final del circuito de reducción de ruido. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;L* ponderado (pequeño) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Iteraciones de mediana +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;La aplicación de tres iteraciones de filtro de mediana con un tamaño de ventana de 3x3 a menudo proporciona mejores resultados que el uso de una iteración de filtro de mediana con un tamaño de ventana de 7x7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Tipo de mediana +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Aplica un filtro de mediana del tamaño de ventana deseado. Cuanto mayor sea el tamaño de la ventana, más tiempo tardará.\n\n3x3 suave: trata 5 píxels en una ventana de 3x3 píxels.\n3x3: trata 9 píxels en una ventana de 3x3 píxels.\n5x5 suave: trata 13 píxels en una ventana de 5x5 píxels.\n5x5: trata 25 píxels en una ventana de 5x5 píxels.\n7x7: trata 49 píxels en una ventana de 7x7 píxels.\n9x9: trata 81 píxels en una ventana de 9x9 píxels.\n\nA veces es posible conseguir mayor calidad realizando varias iteraciones con un tamaño de ventana más pequeño que con una sola iteración y un tamaño de ventana mayor. +TP_DIRPYRDENOISE_TYPE_3X3;3x3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3x3 suave +TP_DIRPYRDENOISE_TYPE_5X5;5x5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5x5 suave +TP_DIRPYRDENOISE_TYPE_7X7;7x7 +TP_DIRPYRDENOISE_TYPE_9X9;9x9 +TP_DIRPYREQUALIZER_ALGO;Rango de colores de piel +TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fino: más cercano a los colores de la piel, minimizando la acción en otros colores\nGrande: evita más artefactos. +TP_DIRPYREQUALIZER_ARTIF;Reducir artefactos +TP_DIRPYREQUALIZER_HUESKIN;Matiz de piel +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;La parte superior de la pirámide es donde el algoritmo actúa a su máxima intensidad.\nLas rampas hacia la parte inferior son las zonas de transición.\nSi se necesita mover la zona significativamente hacia la izquierda o hacia la derecha, o si hay artefactos, el balance de blancos es incorrecto.\nSe puede reducir ligeramente la zona para evitar que el resto de la imagen se vea afectado. +TP_DIRPYREQUALIZER_LABEL;Contraste por niveles de detalle +TP_DIRPYREQUALIZER_LUMACOARSEST;El más grueso +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contraste - +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contraste + +TP_DIRPYREQUALIZER_LUMAFINEST;El más fino +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutro +TP_DIRPYREQUALIZER_SKIN;Focalización/protección de piel +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Al valor -100, el efecto se focaliza en los tonos de piel.\nAl valor 0, todos los tonos se tratan por igual.\nAl valor +100, los tonos de piel se protegen, mientras que todos los demás se ven afectados. +TP_DIRPYREQUALIZER_THRESHOLD;Umbral +TP_DIRPYREQUALIZER_TOOLTIP;Intenta reducir los artefactos en las transiciones entre colores de piel (matiz, cromaticidad, luminancia) y el resto de la imagen. +TP_DISTORTION_AMOUNT;Cantidad +TP_DISTORTION_AUTO_TOOLTIP;Corrige automáticamente la distorsión del objetivo en archivos raw, contrastándola con la imagen JPEG embebida, si ésta existe y su distorsión de objetivo ha sido corregida automáticamente por la cámara. +TP_DISTORTION_LABEL;Corrección de distorsión +TP_EPD_EDGESTOPPING;Parada en 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_EXPOSURE_AUTOLEVELS;Niveles automáticos +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Activa/desactiva la ejecución de Niveles automáticos, que ajusta automáticamente los valores de los deslizadores de Exposición basándose en un análisis de la imagen.\nSi es necesario, se activa la Reconstrucción de luces. +TP_EXPOSURE_BLACKLEVEL;Negro +TP_EXPOSURE_BRIGHTNESS;Brillo +TP_EXPOSURE_CLAMPOOG;Recortar colores fuera de rango +TP_EXPOSURE_CLIP;% Recorte +TP_EXPOSURE_CLIP_TOOLTIP;La fracción de píxels que quedarán recortados tras la ejecución de Niveles automáticos. +TP_EXPOSURE_COMPRHIGHLIGHTS;Compresión de luces +TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Umbral de compresión de luces +TP_EXPOSURE_COMPRSHADOWS;Compresión de sombras +TP_EXPOSURE_CONTRAST;Contraste +TP_EXPOSURE_CURVEEDITOR1;Curva tonal 1 +TP_EXPOSURE_CURVEEDITOR2;Curva tonal 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Por favor, consúltese el artículo «Exposición > Curvas tonales» de RawPedia para saber cómo obtener los mejores resultados usando dos curvas tonales. +TP_EXPOSURE_EXPCOMP;Compensación de exposición +TP_EXPOSURE_HISTMATCHING;Curva tonal auto-ajustada +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Ajusta automáticamente los deslizadores y curvas (excepto la compensación de exposición) para igualar el aspecto de la miniatura JPEG embebida. +TP_EXPOSURE_LABEL;Exposición +TP_EXPOSURE_SATURATION;Saturación +TP_EXPOSURE_TCMODE_FILMLIKE;Similar a película +TP_EXPOSURE_TCMODE_LABEL1;Modo de Curva 1 +TP_EXPOSURE_TCMODE_LABEL2;Modo de Curva 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;Puntos de negro Raw +TP_EXPOS_WHITEPOINT_LABEL;Puntos de blanco Raw +TP_FILMNEGATIVE_BLUE;Proporción de azul +TP_FILMNEGATIVE_BLUEBALANCE;Frío/Cálido +TP_FILMNEGATIVE_COLORSPACE;Espacio de color de inversión: +TP_FILMNEGATIVE_COLORSPACE_INPUT;Espacio de color de entrada +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Selecciona el momento en que se realizará la inversión del negativo:\n\nEspacio de color de entrada: realiza la inversión antes de que se aplique el perfil de entrada, como en versiones anteriores de RawTherapee.\n\nEspacio de color de trabajo: realiza la inversión después de aplicar el perfil de entrada, usando el perfil de trabajo actualmente seleccionado. +TP_FILMNEGATIVE_COLORSPACE_WORKING;Espacio de color de trabajo +TP_FILMNEGATIVE_GREEN;Exponente de referencia +TP_FILMNEGATIVE_GREENBALANCE;Magenta/Verde +TP_FILMNEGATIVE_GUESS_TOOLTIP;Establece automáticamente las proporciones de rojo y azul tomando dos muestras que tenían un matiz neutro (sin color) en la escena original. Las muestras deben diferir en brillo. +TP_FILMNEGATIVE_LABEL;Película negativa +TP_FILMNEGATIVE_OUT_LEVEL;Nivel de salida +TP_FILMNEGATIVE_PICK;Tomar muestras neutras +TP_FILMNEGATIVE_RED;Proporción de rojo +TP_FILMNEGATIVE_REF_LABEL;RGB de entrada: %1 +TP_FILMNEGATIVE_REF_PICK;Muestreo de balance de blancos +TP_FILMNEGATIVE_REF_TOOLTIP;Toma una muestra de gris para el balance de blancos de la imagen positiva de salida. +TP_FILMSIMULATION_LABEL;Simulación de película +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee está configurado para buscar las imágenes Hald CLUT, que se usan en la herramienta Simulación de película, en una carpeta que está tardando mucho en cargarse.\nCompruébese qué carpeta se está utilizando en Preferencias > Procesamiento de imágenes > Simulación de película.\nSe debe hacer que RawTherapee apunte, o bien a una carpeta que sólo contenga imágenes Hald CLUT y nada más, o a una carpeta vacía si no se desea usar la herramienta Simulación de película.\n\nConsúltese el artículo Simulación de película en RawPedia para más información.\n\n¿Desea cancelar la exploración ahora? +TP_FILMSIMULATION_STRENGTH;Intensidad +TP_FILMSIMULATION_ZEROCLUTSFOUND;Debe configurarse la carpeta HaldCLUT en Preferencias. +TP_FLATFIELD_AUTOSELECT;Auto-selección +TP_FLATFIELD_BLURRADIUS;Radio de difuminado +TP_FLATFIELD_BLURTYPE;Tipo de difuminado +TP_FLATFIELD_BT_AREA;Área +TP_FLATFIELD_BT_HORIZONTAL;Horizontal +TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal +TP_FLATFIELD_BT_VERTICAL;Vertical +TP_FLATFIELD_CLIPCONTROL;Control de recorte +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Control de recorte evita el recorte de luces causado por la aplicación del Campo plano. Si ya hay luces recortadas antes de aplicar el Campo plano, se usa el valor 0. +TP_FLATFIELD_LABEL;Campo plano +TP_GENERAL_11SCALE_TOOLTIP;Los efectos de esta herramienta sólo son visibles o precisos a una escala de vista previa de 1:1. +TP_GRADIENT_CENTER;Centro +TP_GRADIENT_CENTER_X;Centro X +TP_GRADIENT_CENTER_X_TOOLTIP;Desplaza el gradiente a la izquierda (valores negativos) o a la derecha (valores positivos). +TP_GRADIENT_CENTER_Y;Centro Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Desplaza el gradiente hacia arriba (valores negativos) o hacia abajo (valores positivos). +TP_GRADIENT_DEGREE;Ángulo +TP_GRADIENT_DEGREE_TOOLTIP;Ángulo de rotación en grados. +TP_GRADIENT_FEATHER;Anchura del gradiente +TP_GRADIENT_FEATHER_TOOLTIP;Anchura del gradiente en porcentaje de la diagonal de la imagen. +TP_GRADIENT_LABEL;Filtro graduado +TP_GRADIENT_STRENGTH;Intensidad +TP_GRADIENT_STRENGTH_TOOLTIP;Intensidad del filtro en pasos. +TP_HLREC_BLEND;Mezcla +TP_HLREC_CIELAB;Mezcla CIELab +TP_HLREC_COLOR;Propagación de color +TP_HLREC_ENA_TOOLTIP;La Recuperación de luces puede ser activada por los Niveles automáticos. +TP_HLREC_HLBLUR;Difuminar +TP_HLREC_LABEL;Recuperación de luces +TP_HLREC_LUMINANCE;Recuperación de luminancia +TP_HLREC_METHOD;Método: +TP_HSVEQUALIZER_CHANNEL;Canal +TP_HSVEQUALIZER_HUE;H +TP_HSVEQUALIZER_LABEL;Ecualizador HSV +TP_HSVEQUALIZER_SAT;S +TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Compensación de exposición de referencia +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Cuando el DCP seleccionado incluye una compensación de exposición, RawTherapee la aplica a la exposición de referencia. +TP_ICM_APPLYHUESATMAP;Tabla base +TP_ICM_APPLYHUESATMAP_TOOLTIP;Cuando el DCP seleccionado incluye una tabla base (HueSatMap), RawTherapee la aplica a la imagen. +TP_ICM_APPLYLOOKTABLE;Tabla de sustitución (LUT) +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Cuando el DCP seleccionado incluye una tabla de sustitución (LUT), RawTherapee la aplica a los colores de la imagen. +TP_ICM_BPC;Compensación del punto negro +TP_ICM_DCPILLUMINANT;Iluminante +TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolado +TP_ICM_DCPILLUMINANT_TOOLTIP;Si el perfil DCP tiene embebidos dos iluminantes, se podrá escoger cuál se utilizará.\n\nEl valor predeterminado es «Interpolado», que es una mezcla de los dos en función del balance de blancos. +TP_ICM_FBW;Conversión a Blanco y Negro +TP_ICM_ILLUMPRIM_TOOLTIP;En esta lista se selecciona el iluminante más cercano a las condiciones de la toma.\n\nSólo se pueden hacer cambios cuando la selección «Primarios de destino» está puesta a «A medida (deslizadores)». +TP_ICM_INPUTCAMERA;Cámara genérica +TP_ICM_INPUTCAMERAICC;Perfil de cámara seleccionado automáticamente +TP_ICM_INPUTCAMERAICC_TOOLTIP;Usa los perfiles de color de entrada ICC o DCP de RawTherapee, específicos para la cámara.\n\nEstos perfiles son más precisos que los de matriz de color, más simples, aunque no están disponibles para todas las cámaras.\n\nEstos perfiles están almacenados en las carpetas «/iccprofiles/input» y «/dcpprofiles» y se cargan automáticamente en función de la coincidencia del nombre del archivo del perfil con el nombre exacto del modelo de cámara. +TP_ICM_INPUTCAMERA_TOOLTIP;Esta opción escoge entre:\n\n- una matriz de color simple obtenida de dcraw\n- una versión mejorada de RawTherapee (la que esté disponible según el modelo de cámara)\n- la matriz embebida en el archivo DNG +TP_ICM_INPUTCUSTOM;Personalizado +TP_ICM_INPUTCUSTOM_TOOLTIP;Selecciona un perfil de color DCP/ICC personalizado para la cámara. +TP_ICM_INPUTDLGLABEL;Seleccionar perfil de entrada DCP/ICC... +TP_ICM_INPUTEMBEDDED;Usar embebido si es posible +TP_ICM_INPUTEMBEDDED_TOOLTIP;Usar perfil de color embebido en archivos no raw. +TP_ICM_INPUTNONE;Sin perfil de color +TP_ICM_INPUTNONE_TOOLTIP;No usar ningún perfil de color.\nUtilizar sólo en casos especiales. +TP_ICM_INPUTPROFILE;Perfil de entrada +TP_ICM_LABEL;Gestión del color +TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +TP_ICM_NEUTRAL;Reiniciar +TP_ICM_NOICM;Sin ICM: salida sRGB +TP_ICM_OUTPUTPROFILE;Perfil de salida +TP_ICM_OUTPUTPROFILE_TOOLTIP;De forma predeterminada, todos los perfiles «RTv4» o «RTv2» tienen la Curva de Reproducción de Tonos (TRC) del espacio sRGB: g=2.4 s=12.92\n\nCon el «Generador de perfiles ICC» se pueden generar perfiles v4 o v2 escogiendo entre las siguientes opciones:\n\n- Primarios: Personalizado, Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB.\n\n- Curva de reproducción de tono: Personalizado, BT709, sRGB, lineal, estándar g=2.2, estándar g=1.8, alta g=1.3 s=3.35, baja g=2.6 s=6.9, Lab g=3.0 s=9.03296\n\n- Iluminante: Predeterminado, D41, D50, D55, D60, D65, D80, stdA 2856K. +TP_ICM_PRIMBLU_TOOLTIP;Primarios Azul:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +TP_ICM_PRIMGRE_TOOLTIP;Primarios Verde:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +TP_ICM_PRIMILLUM_TOOLTIP;Los colores primarios conforman los límites del espacio de color, y escogerlos adecuadamente es complejo y requiere mucha precisión.\n\nAl establecerlos aquí, se transforma radicalmente la distribución de colores de la imagen, por lo que requiere de gran cantidad de experimentación.\n\nSin embargo, es posible realizar tanto ajustes globales sutiles como ajustes extremos. +TP_ICM_PRIMRED_TOOLTIP;Primarios Rojo:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +TP_ICM_PROFILEINTENT;Método de conversión del rango de colores +TP_ICM_REDFRAME;Primarios a medida +TP_ICM_SAVEREFERENCE;Guardar imagen de referencia +TP_ICM_SAVEREFERENCE_APPLYWB;Aplicar balance de blancos +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;En general, se debe aplicar el balance de blancos cuando se guardan imágenes para crear perfiles ICC, y no aplicarlo para crear perfiles DCP. +TP_ICM_SAVEREFERENCE_TOOLTIP;Guarda una imagen TIFF lineal basada en los datos raw y antes de que se les aplique el perfil de entrada.\n\nEl resultado puede usarse para calibrar y generar un perfil personalizado de la cámara. +TP_ICM_TONECURVE;Curva tonal +TP_ICM_TONECURVE_TOOLTIP;Cuando el DCP seleccionado incluye una curva tonal, RawTherapee la aplica a la imagen. +TP_ICM_TRCFRAME;Perfil abstracto +TP_ICM_TRCFRAME_TOOLTIP;También se conocen como perfiles «sintéticos» o «virtuales» y permiten modificar globalmente los tonos de la imagen.\n\nSe pueden hacer cambios en:\n\n- La «Curva de reproducción tonal», que modifica los tonos de la imagen.\n- El «Iluminante», que permite cambiar los primarios del perfil para adaptarlos a las condiciones de la toma.\n- Los «Primarios de destino», que permite cambiar los primarios de destino, con dos usos principales: mezclador de canales y calibración.\n\nNota: Los perfiles abstractos tienen en cuenta los perfiles de trabajo incorporados sin modificarlos. No funcionan con perfiles de trabajo a medida. +TP_ICM_TRC_TOOLTIP;Permite cambiar la «curva de reproducción tonal» (TRC) predeterminada de RawTherapee (TRC sRGB, con g=2.4 y s=12.92).\n\nEsta TRC modifica los tonos de la imagen. Los valores RGB y L*a*b*, el histograma y la salida (pantalla, TIF, JPG) cambian:\n\n- La «Gamma» actúa principalmente en los tonos claros.\n- La «Pendiente» actúa principalmente en los tonos oscuros.\n\nSe puede elegir cualquier par de valores de gamma y pendiente (valores > 1) y el algoritmo se asegurará de que hay continuidad entre las partes lineal y parabólica de la curva.\n\nCualquier selección distinta de «Ninguna» activa la lista de selección «Primarios de destino», y dependiendo del valor de ésta, la lista desplegable «Iluminante». +TP_ICM_WORKINGPROFILE;Perfil de trabajo +TP_ICM_WORKING_CIEDIAG;Diagrama CIE xy +TP_ICM_WORKING_ILLU;Iluminante +TP_ICM_WORKING_ILLU_1500;Tungsteno 1500K +TP_ICM_WORKING_ILLU_2000;Tungsteno 2000K +TP_ICM_WORKING_ILLU_D41;D41 +TP_ICM_WORKING_ILLU_D50;D50 +TP_ICM_WORKING_ILLU_D55;D55 +TP_ICM_WORKING_ILLU_D60;D60 +TP_ICM_WORKING_ILLU_D65;D65 +TP_ICM_WORKING_ILLU_D80;D80 +TP_ICM_WORKING_ILLU_D120;D120 +TP_ICM_WORKING_ILLU_NONE;Predeterminado +TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_PRESER;Preservar los tonos pastel +TP_ICM_WORKING_PRIM;Primarios de destino +TP_ICM_WORKING_PRIMFRAME_TOOLTIP;Si se selecciona «Diagrama CIE xy personalizado» en la lista desplegable «Primarios de destino», se modificarán directamente en el gráfico los valores de los tres primarios.\n\nHay que tener en cuenta que en este caso la posición del punto blanco en el gráfico no se actualizará. +TP_ICM_WORKING_PRIM_AC0;ACESp0 +TP_ICM_WORKING_PRIM_ACE;ACESp1 +TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +TP_ICM_WORKING_PRIM_BET;Beta RGB +TP_ICM_WORKING_PRIM_BRU;BruceRGB +TP_ICM_WORKING_PRIM_BST;BestRGB +TP_ICM_WORKING_PRIM_CUS;A medida (deslizadores) +TP_ICM_WORKING_PRIM_CUSGR;A medida (Diagrama CIE xy) +TP_ICM_WORKING_PRIM_NONE;Predeterminado +TP_ICM_WORKING_PRIM_PROP;ProPhoto +TP_ICM_WORKING_PRIM_REC;Rec2020 +TP_ICM_WORKING_PRIM_SRGB;sRGB +TP_ICM_WORKING_PRIM_WID;WideGamut +TP_ICM_WORKING_TRC;Curva de respuesta de tono: +TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +TP_ICM_WORKING_TRC_22;Adobe g=2.2 +TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +TP_ICM_WORKING_TRC_CUSTOM;Personalizada +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_LIN;Lineal g=1 +TP_ICM_WORKING_TRC_NONE;Ninguna +TP_ICM_WORKING_TRC_SLOPE;Pendiente +TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +TP_ICM_WORKING_TRC_TOOLTIP;Aquí se selecciona uno de los perfiles incorporados en RawTherapee, que será el que utilizará el motor del programa. +TP_IMPULSEDENOISE_LABEL;Reducción de ruido impulsivo +TP_IMPULSEDENOISE_THRESH;Umbral +TP_LABCURVE_AVOIDCOLORSHIFT;Evitar la deriva de colores +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Encaja los colores en el rango del espacio de color de trabajo y aplica la corrección de Munsell. +TP_LABCURVE_BRIGHTNESS;Luminosidad +TP_LABCURVE_CHROMATICITY;Cromaticidad +TP_LABCURVE_CHROMA_TOOLTIP;Para aplicar virado de color en B/N, se ajusta la cromaticidad a -100. +TP_LABCURVE_CONTRAST;Contraste +TP_LABCURVE_CURVEEDITOR;Curva de luminancia +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Verde saturado +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Verde pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Rojo pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Rojo saturado +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;Neutro +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Mate +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturado +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Cromaticidad en función de la cromaticidad C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Cromaticidad en función del matiz C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Cromaticidad en función de la luminancia C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Matiz en función del matiz H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminancia en función de la cromaticidad L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminancia en función del matiz L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminancia en función de la luminancia L=f(L) +TP_LABCURVE_LABEL;Ajustes L*a*b* +TP_LABCURVE_LCREDSK;Restringir LC a rojos y tonos de piel +TP_LABCURVE_LCREDSK_TOOLTIP;Si se activa, la curva LC afecta solamente a los rojos y los tonos de piel.\nSi se desactiva, afecta a todos los tonos. +TP_LABCURVE_RSTPROTECTION;Protección de rojos y tonos de piel +TP_LABCURVE_RSTPRO_TOOLTIP;Opera sobre el deslizador de Cromaticidad y la curva CC. +TP_LENSGEOM_AUTOCROP;Auto-recorte +TP_LENSGEOM_FILL;Auto-relleno +TP_LENSGEOM_LABEL;Objetivo / Geometría +TP_LENSGEOM_LIN;Lineal +TP_LENSGEOM_LOG;Logarítmico +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Selección automática +TP_LENSPROFILE_CORRECTION_LCPFILE;Archivo LCP +TP_LENSPROFILE_CORRECTION_MANUAL;Selección manual +TP_LENSPROFILE_LABEL;Corrección de objetivo con perfil +TP_LENSPROFILE_LENS_WARNING;Advertencia: si el factor de recorte usado para el perfilado de objetivo es mayor que el factor de recorte de la cámara, los resultados podrían ser erróneos. +TP_LENSPROFILE_MODE_HEADER;Perfil del objetivo +TP_LENSPROFILE_USE_CA;Aberración cromática +TP_LENSPROFILE_USE_GEOMETRIC;Distorsión geométrica +TP_LENSPROFILE_USE_HEADER;Selecciona las distorsiones a corregir: +TP_LENSPROFILE_USE_VIGNETTING;Viñeteado +TP_LOCALCONTRAST_AMOUNT;Intensidad +TP_LOCALCONTRAST_DARKNESS;Énfasis en las sombras +TP_LOCALCONTRAST_LABEL;Contraste local +TP_LOCALCONTRAST_LIGHTNESS;Énfasis en las luces +TP_LOCALCONTRAST_RADIUS;Radio +TP_LOCALLAB_ACTIV;Sólo luminancia +TP_LOCALLAB_ACTIVSPOT;Activar punto +TP_LOCALLAB_ADJ;Ecualizador Azul-Amarillo/Rojo-Verde +TP_LOCALLAB_AMOUNT;Cantidad +TP_LOCALLAB_ARTIF;Detección de forma +TP_LOCALLAB_ARTIF_TOOLTIP;El umbral de ámbito de ΔE aumenta el rango de ámbito de ΔE. Los valores altos son para imágenes con una gama de colores muy extensa.\nEl aumento del decaimiento de ΔE puede mejorar la detección de forma, pero también puede reducir el ámbito. +TP_LOCALLAB_AUTOGRAY;Luminancia media Auto (Yb%) +TP_LOCALLAB_AUTOGRAYCIE;Auto +TP_LOCALLAB_AVOID;Evitar la deriva de colores +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Encaja los colores en el rango del espacio de color de trabajo y aplica la corrección de Munsell (L*a*b* Perceptual Uniforme).\nLa corrección de Munsell siempre se desactiva cuando se usa Jz o CAM16. +TP_LOCALLAB_AVOIDMUN;Sólo corrección de Munsell +TP_LOCALLAB_AVOIDMUN_TOOLTIP;La corrección de Munsell siempre se desactiva cuando se usa Jz o CAM16. +TP_LOCALLAB_AVOIDRAD;Radio suave +TP_LOCALLAB_BALAN;Balance ab-L (ΔE) +TP_LOCALLAB_BALANEXP;Balance de Laplaciana +TP_LOCALLAB_BALANH;Balance C-H (ΔE) +TP_LOCALLAB_BALAN_TOOLTIP;Cambia los parámetros del algoritmo de ΔE.\nTiene en cuenta más o menos a*b* o L*, o más o menos C o H.\nNo usar para Reducción de ruido. +TP_LOCALLAB_BASELOG;Rango de sombras (base del logaritmo) +TP_LOCALLAB_BILATERAL;Filtro bilateral +TP_LOCALLAB_BLACK_EV;Ev Negro +TP_LOCALLAB_BLCO;Sólo cromaticidad +TP_LOCALLAB_BLENDMASKCOL;Mezcla +TP_LOCALLAB_BLENDMASKMASK;Sumar/restar máscara de luminancia +TP_LOCALLAB_BLENDMASKMASKAB;Sumar/restar máscara de cromaticidad +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;Si este deslizador = 0, no se realiza ninguna acción.\nSuma o resta la máscara de la imagen original. +TP_LOCALLAB_BLENDMASK_TOOLTIP;Si Mezcla = 0, sólo mejora la detección de forma.\nSi Mezcla > 0, la máscara se añade a la imagen. Si Mezcla < 0, la máscara se substrae de la imagen. +TP_LOCALLAB_BLGUID;Filtro guiado +TP_LOCALLAB_BLINV;Inverso +TP_LOCALLAB_BLLC;Luminancia y cromaticidad +TP_LOCALLAB_BLLO;Sólo luminancia +TP_LOCALLAB_BLMED;Mediana +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - difuminado y ruido directo con todos los ajustes.\nDifuminado y ruido inverso con todos los ajustes. Cuidado, algunos resultados pueden ser curiosos. +TP_LOCALLAB_BLNOI_EXP;Difuminado y ruido +TP_LOCALLAB_BLNORM;Normal +TP_LOCALLAB_BLUFR;Difuminado/Grano y Reducción de ruido +TP_LOCALLAB_BLUMETHOD_TOOLTIP;Para difuminar el fondo y aislar el primer plano:\n\n- Se difumina el fondo, cubriendo completamente la imagen con un punto RT (valores altos para Ámbito y Transición, y «Normal» o «Inverso» en la casilla de verificación).\n- Se aísla el primer plano, usando uno o más puntos RT «Excluyentes», y se aumenta el ámbito.\n\nEste módulo (incluyendo la «Mediana» y el «Filtro guiado») puede usarse además de la reducción de ruido del menú principal. +TP_LOCALLAB_BLUR;Difuminado gaussiano - Ruido - Grano +TP_LOCALLAB_BLURCOL;Radio +TP_LOCALLAB_BLURCOLDE_TOOLTIP;La imagen usada para calcular ΔE se difumina ligeramente para evitar tener en cuenta píxels aislados. +TP_LOCALLAB_BLURDE;Difuminado detección de forma +TP_LOCALLAB_BLURLC;Sólo luminancia +TP_LOCALLAB_BLURLEVELFRA;Niveles de difuminado +TP_LOCALLAB_BLURMASK_TOOLTIP;Usa un difuminado de radio grande para crear una máscara que permite variar el contraste de la imagen y/o oscurecer/aclarar partes de ella. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Permite variar el «radio» del difuminado gaussiano (0 a 1000). +TP_LOCALLAB_BLUR_TOOLNAME;Difuminado/Grano y Reducción de ruido - 1 +TP_LOCALLAB_BLWH;Todos los cambios forzados en Blanco y negro +TP_LOCALLAB_BLWH_TOOLTIP;Fuerza los componentes de color «a» y «b» a cero.\nEs útil para el procesado en blanco y negro, o para la simulación de película. +TP_LOCALLAB_BUTTON_ADD;Añadir +TP_LOCALLAB_BUTTON_DEL;Borrar +TP_LOCALLAB_BUTTON_DUPL;Duplicar +TP_LOCALLAB_BUTTON_REN;Cambiar nombre +TP_LOCALLAB_BUTTON_VIS;Mostrar/ocultar +TP_LOCALLAB_BWFORCE;Usa Ev Negro y Ev Blanco +TP_LOCALLAB_CAM16PQREMAP;LP HDR (Luminancia pico) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;CP (Cuantificador perceptual) adaptado a CAM16. Permite cambiar la función CP interna (normalmente 10000 cd/m² - predeterminado 100 cd/m² - desactivada para 100 cd/m²).\nSe puede usar para adaptar a diferentes dispositivos e imágenes. +TP_LOCALLAB_CAM16_FRA;Ajustes de imagen Cam16 +TP_LOCALLAB_CAMMODE;Modelo CAM +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CATAD;Adaptación cromática - Cat16 +TP_LOCALLAB_CBDL;Contraste por niveles de detalle +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Realza el contraste local de los tonos medios. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Igual que las ondículas.\nEl primer nivel (0) actúa en detalles de 2x2 píxels.\nEl último nivel (5) actúa en detalles de 64x64 píxels. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Evita el aumento de nitidez del ruido. +TP_LOCALLAB_CBDL_TOOLNAME;Contraste por niveles de detalle - 2 +TP_LOCALLAB_CENTER_X;Centro X +TP_LOCALLAB_CENTER_Y;Centro Y +TP_LOCALLAB_CH;Curvas CL - LC +TP_LOCALLAB_CHROMA;Cromaticidad +TP_LOCALLAB_CHROMABLU;Niveles de cromaticidad +TP_LOCALLAB_CHROMABLU_TOOLTIP;Aumenta o reduce el efecto, dependiendo de los ajustes de luminancia.\nLos valores por debajo de 1 reducen el efecto. Los valores mayores que 1 aumentan el efecto. +TP_LOCALLAB_CHROMACBDL;Cromaticidad +TP_LOCALLAB_CHROMACB_TOOLTIP;Aumenta o reduce el efecto, dependiendo de los ajustes de luminancia.\nLos valores por debajo de 1 reducen el efecto. Los valores mayores que 1 aumentan el efecto. +TP_LOCALLAB_CHROMALEV;Niveles de cromaticidad +TP_LOCALLAB_CHROMASKCOL;Cromaticidad +TP_LOCALLAB_CHROMASK_TOOLTIP;Cambia la cromaticidad de la máscara si ésta existe (por ejemplo, C(C) o LC(H) están activadas). +TP_LOCALLAB_CHROML;Cromaticidad (C) +TP_LOCALLAB_CHRRT;Cromaticidad +TP_LOCALLAB_CIE;Apariencia de color (Cam16 y JzCzHz) +TP_LOCALLAB_CIEC;Usar los parámetros de entorno de Ciecam +TP_LOCALLAB_CIECAMLOG_TOOLTIP;Este módulo se basa en el Modelo de Apariencia de Color CIECAM, que se diseñó para simular mejor cómo percibe la visión humana los colores bajo diferentes condiciones de iluminación.\nEl primer proceso de Ciecam, «Condiciones de la escena», se lleva a cabo por la codificación logarítmica. También usa la «Luminancia absoluta» en el momento de la toma.\nEl segundo proceso Ciecam, «Ajustes de imagen», se simplifica, y usa solamente 3 variables (contraste local, contraste J, saturación s).\nEl tercer proceso Ciecam, «Condiciones de visualización», adapta la salida a las condiciones de visualización deseadas (monitor, TV, proyector, impresora, etc.), de modo que se preserve la apariencia cromática y de contraste para cualquier entorno de visualización. +TP_LOCALLAB_CIECOLORFRA;Color +TP_LOCALLAB_CIECONTFRA;Contrasta +TP_LOCALLAB_CIELIGHTCONTFRA;Iluminación y contraste +TP_LOCALLAB_CIELIGHTFRA;Iluminación +TP_LOCALLAB_CIEMODE;Cambiar la posición de la herramienta +TP_LOCALLAB_CIEMODE_COM;Predeterminado +TP_LOCALLAB_CIEMODE_DR;Rango dinámico +TP_LOCALLAB_CIEMODE_TM;Mapeo tonal +TP_LOCALLAB_CIEMODE_TOOLTIP;En modo Predeterminado, se añade Ciecam al final del proceso. «Máscara y modificaciones» y «Recuperación basada en la máscara de luminancia» están disponibles para «Cam16 y JzCzHz».\nTambién se puede integrar Ciecam en otras herramientas si se desea (Mapeo tonal, Ondícula, Rango dinámico, Codificación log). Los resultados para estas herramientas serán diferentes de los obtenidos sin Ciecam. En este modo, también es posible usar «Máscara y modificaciones» y «Recuperación basada en la máscara de luminancia». +TP_LOCALLAB_CIEMODE_WAV;Ondícula +TP_LOCALLAB_CIETOOLEXP;Curvas +TP_LOCALLAB_CIE_TOOLNAME;Apariencia de color (Cam16 y JzCzHz) +TP_LOCALLAB_CIRCRADIUS;Tamaño del punto +TP_LOCALLAB_CIRCRAD_TOOLTIP;Contiene las referencias del punto RT, útil para la detección de forma (matiz, luminancia, cromaticidad, Sobel).\nLos valores bajos pueden ser útiles para el tratamiento del follaje.\nLos valores altos pueden ser útiles para el tratamiento de la piel. +TP_LOCALLAB_CLARICRES;Fusionar cromaticidad +TP_LOCALLAB_CLARIFRA;Claridad y Máscara de nitidez - Mezclar y suavizar imágenes +TP_LOCALLAB_CLARIJZ_TOOLTIP;Niveles 0 a 4 (incluido): Se activa «Máscara de nitidez».\nNiveles 5 y superiores: Se activa «Claridad». +TP_LOCALLAB_CLARILRES;Fusionar luminancia +TP_LOCALLAB_CLARISOFT;Radio suave +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;El deslizador «Radio suave» (algoritmo de filtro guiado) reduce los halos e irregularidades en Claridad, Máscara de nitidez y Ondículas de contraste local Jz. +TP_LOCALLAB_CLARISOFT_TOOLTIP;El deslizador «Radio suave» (algoritmo del filtro guiado) reduce los halos e irregularidades, tanto para Claridad y Máscara de nitidez como para todos los procesos de pirámide de ondículas. Para desactivarlo, se ajusta el deslizador a cero. +TP_LOCALLAB_CLARITYML;Claridad +TP_LOCALLAB_CLARI_TOOLTIP;Niveles 0 a 4 (incluido): Se activa «Máscara de nitidez».\nNiveles 5 y superiores: Se activa «Claridad».\nEs útil si se usa «Mapeo tonal por niveles de ondículas». +TP_LOCALLAB_CLIPTM;Recortar los datos restaurados (ganancia) +TP_LOCALLAB_COFR;Color y Luz +TP_LOCALLAB_COLORDE;Color vista previa ΔE - intensidad +TP_LOCALLAB_COLORDEPREV_TOOLTIP;El botón Vista previa de ΔE sólo funcionará si se ha activado una (y sólo una) de las herramientas del menú «Añadir herramienta al punto actual».\nPara poder ver la Vista previa de ΔE con varias herramientas activadas, se utiliza Máscara y modificaciones - Vista previa de ΔE. +TP_LOCALLAB_COLORDE_TOOLTIP;Muestra una previsualización de color azul para la selección de ΔE si es negativa, y verde si es positiva.\n\nMáscara y modificaciones (mostrar áreas modificadas sin máscara): muestra las modificaciones reales si es positivo, muestra las modificaciones mejoradas (sólo luminancia) en azul, y en amarillo si es negativo. +TP_LOCALLAB_COLORSCOPE;Ámbito (herramientas de color) +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Deslizador común para Color y Luz, Sombras/Luces y Vivacidad.\nOtras herramientas tienen sus propios controles de ámbito. +TP_LOCALLAB_COLOR_CIE;Curva de color +TP_LOCALLAB_COLOR_TOOLNAME;Color y Luz - 11 +TP_LOCALLAB_COL_NAME;Nombre +TP_LOCALLAB_COL_VIS;Estado +TP_LOCALLAB_COMPFRA;Contraste direccional +TP_LOCALLAB_COMPREFRA;Mapeo tonal por niveles de ondículas +TP_LOCALLAB_CONTCOL;Umbral de contraste +TP_LOCALLAB_CONTFRA;Contraste por nivel +TP_LOCALLAB_CONTRAST;Contraste +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Permite cambiar libremente el contraste de la máscara.\n\nSu función es similar a la de los deslizadores Gamma y Pendiente.\n\nPermite actuar sobre ciertas partes de la imagen (normalmente las partes más claras de la máscara, usando la curva para excluir las partes oscuras). Puede crear artefactos. +TP_LOCALLAB_CONTRESID;Contraste +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Permite determinar qué partes de la imagen se verán impactadas en función de la textura. +TP_LOCALLAB_CONTTHR;Umbral de contraste +TP_LOCALLAB_CONTWFRA;Contraste local +TP_LOCALLAB_CSTHRESHOLD;Ψ Niveles de ondícula +TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Selección de nivel de ondícula +TP_LOCALLAB_CURV;Claridad - Contraste - Cromaticidad «Super» +TP_LOCALLAB_CURVCURR;Normal +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;Si las curvas están en la parte superior, la máscara es completamente negra y no realiza transformación en la imagen.\n\nA medida que se hace bajar la curva, la máscara aumenta gradualmente su brillo y colorido, y la imagen cambia más y más.\n\nLa línea gris de transición representa los valores de referencia (cromaticidad, luminancia, matiz).\n\nPuedes elegir posicionar o no la parte superior de las curvas en esta transición. +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;Si las curvas están en la parte superior, la máscara es completamente negra y no se hacen cambios a la imagen.\n\nA medida que se hace bajar la curva, la máscara aumenta gradualmente su colorido y brillo, cambiando progresivamente la imagen.\n\nSe recomienda (aunque no es obligatorio) posicionar la parte superior de las curvas en la línea límite gris que representa los valores de referencia de cromaticidad, luma y matiz para el punto RT. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;Para activar las curvas, la lista desplegable «Tipo de curva» se sitúa a «Normal». +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Curva tonal +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), puede usarse con L(H) en Color y Luz. +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;«Normal»: la curva L=f(L) usa el mismo algoritmo que el deslizador de claridad. +TP_LOCALLAB_CURVES_CIE;Curva tonal +TP_LOCALLAB_CURVNONE;Desactivar curvas +TP_LOCALLAB_DARKRETI;Oscuridad +TP_LOCALLAB_DEHAFRA;Eliminación de neblina +TP_LOCALLAB_DEHAZ;Intensidad +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Elimina la neblina atmosférica. Aumenta la saturación y el detalle globales.\nPuede quitar dominantes de color, pero también puede introducir una dominante azul, que puede corregirse con otras herramientas. +TP_LOCALLAB_DEHAZ_TOOLTIP;Los valores negativos añaden neblina. +TP_LOCALLAB_DELTAD;Balance de Delta +TP_LOCALLAB_DELTAEC;ΔE Máscara de imagen +TP_LOCALLAB_DENOI1_EXP;Reducción de ruido basada en máscara de luminancia +TP_LOCALLAB_DENOI2_EXP;Recuperación basada en máscara de luminancia +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Permite reducir el ruido impulsivo o de «sal y pimienta». +TP_LOCALLAB_DENOICHROC_TOOLTIP;Permite tratar manchas y aglomeraciones de ruido. +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Permite recuperar el detalle de la cromaticidad, aplicando progresivamente una transformada de Fourier (DCT). +TP_LOCALLAB_DENOICHROF_TOOLTIP;Permite ajustar el ruido de cromaticidad de detalle fino. +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Permite dirigir la reducción de ruido de cromaticidad, ya sea hacia el azul-amarillo o hacia el rojo-verde. +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Permite llevar a cabo más o menos reducción de ruido, tanto en las sombras como en las luces. +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Permite recuperar el detalle de la luminancia, aplicando progresivamente una transformada de Fourier (DCT). +TP_LOCALLAB_DENOIMASK;Reducc. ruido cromatic. máscara +TP_LOCALLAB_DENOIMASK_TOOLTIP;Para todas las herramientas, permite controlar el nivel de ruido cromático de la máscara.\nEs útil para un mejor control de la cromaticidad y para evitar artefactos cuando se usa la curva LC(h). +TP_LOCALLAB_DENOIQUA_TOOLTIP;El modo Conservador preserva el detalle de baja frecuencia. El modo Agresivo elimina el detalle de baja frecuencia.\nLos modos Conservador y Agresivo usan ondículas y DCT, y pueden usarse junto con «Medias no locales - Luminancia». +TP_LOCALLAB_DENOITHR_TOOLTIP;Ajusta la detección de bordes para ayudar a reducir el ruido en áreas uniformes y de bajo contraste. +TP_LOCALLAB_DENOI_EXP;Reducción de ruido +TP_LOCALLAB_DENOI_TOOLTIP;Este módulo puede usarse para la reducción de ruido, ya sea por sí mismo (al final del circuito de revelado), o además del módulo Reducción de ruido en la pestaña Detalle (que opera al principio del circuito de revelado).\nEl ámbito permite diferenciar la acción en función del color (ΔE).\nTamaño mínimo del punto RT: 128x128 +TP_LOCALLAB_DEPTH;Profundidad +TP_LOCALLAB_DETAIL;Contraste local +TP_LOCALLAB_DETAILFRA;Detección de bordes +TP_LOCALLAB_DETAILSH;Detalles +TP_LOCALLAB_DETAILTHR;Umbral de detalle de luminancia y cromaticidad (DCT ƒ) +TP_LOCALLAB_DIVGR;Gamma +TP_LOCALLAB_DUPLSPOTNAME;Copiar +TP_LOCALLAB_EDGFRA;Nitidez en bordes +TP_LOCALLAB_EDGSHOW;Mostrar todas las herramientas +TP_LOCALLAB_ELI;Elipse +TP_LOCALLAB_ENABLE_AFTER_MASK;Usar Mapeo tonal +TP_LOCALLAB_ENABLE_MASK;Activar máscara +TP_LOCALLAB_ENABLE_MASKAFT;Usar todos los algoritmos de Exposición +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;Si está activado, la máscara usa los datos restaurados después del Mapa de transmisión, en lugar de los datos originales. +TP_LOCALLAB_ENH;Mejorado +TP_LOCALLAB_ENHDEN;Mejorado + reducc. ruido de cromaticidad +TP_LOCALLAB_EPSBL;Detalle +TP_LOCALLAB_EQUIL;Normalizar luminancia +TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruye la luminancia, de modo que la media y la varianza de la imagen de salida son idénticas a las de la imagen original. +TP_LOCALLAB_ESTOP;Parada en bordes +TP_LOCALLAB_EV_DUPL;Copia de +TP_LOCALLAB_EV_NVIS;Ocultar +TP_LOCALLAB_EV_NVIS_ALL;Ocultar todo +TP_LOCALLAB_EV_VIS;Mostrar +TP_LOCALLAB_EV_VIS_ALL;Mostrar todo +TP_LOCALLAB_EXCLUF;Excluyente +TP_LOCALLAB_EXCLUF_TOOLTIP;El modo «Excluyente» evita que los puntos adyacentes influencien ciertas partes de la imagen. Ajustando «Ámbito», se extenderá el rango de colores.\nTambién se pueden añadir herramientas a un punto Excluyente y usarlas del mismo modo que para un punto normal. +TP_LOCALLAB_EXCLUTYPE;Método de punto +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;El punto normal usa datos recursivos.\n\nEl punto excluyente reinicia todos los datos de ajuste local.\n\nPuede usarse para cancelar total o parcialmente una acción anterior, o para llevar a cabo operaciones en modo Inverso.\n\nImagen completa permite usar las herramientas de ajuste local en la imagen completa.\n\nLos delimitadores del punto RT se establecen más allá de los límites de la vista previa de la imagen.\nLa transición se ajusta a 100.\n\nObsérvese que puede ser necesario reposicionar ligeramente el punto RT y ajustar el tamaño del punto para obtener el efecto deseado.\n\nPor favor, téngase en cuenta que el uso de la Reducción de ruido, las Ondículas o FFTW en modo de imagen completa consume grandes cantidades de memoria, y puede provocar que el programa se estrelle en sistemas con poca capacidad. +TP_LOCALLAB_EXECLU;Punto excluyente +TP_LOCALLAB_EXFULL;Imagen completa +TP_LOCALLAB_EXNORM;Punto normal +TP_LOCALLAB_EXPCBDL_TOOLTIP;Puede usarse para eliminar marcas en el sensor o en el objetivo, reduciendo el contraste en el/los nivel(es) de detalle apropiado(s). +TP_LOCALLAB_EXPCHROMA;Compensación de cromaticidad +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Se debe usar en asociación con «Compensación de exposición f» y «Atenuador de contraste f» para evitar desaturar los colores. +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Ajusta el color, la claridad y el contraste, y corrige pequeños defectos como los ojos rojos, el polvo del sensor, etc. +TP_LOCALLAB_EXPCOMP;Compensación de exposición ƒ +TP_LOCALLAB_EXPCOMPINV;Compensación de exposición +TP_LOCALLAB_EXPCOMP_TOOLTIP;Para retratos o imágenes con un gradiente de color bajo. Se puede cambiar la «Detección de forma» en «Ajustes»:\n\nSe debe aumentar «Umbral de ámbito ΔE»\nSe debe reducir «Decaimiento ΔE»\nSe debe aumentar «Balance ab-L (ΔE)». +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;Consúltese la documentación de Niveles de ondículas.\nHay algunas diferencias en la versión Local: hay más herramientas y más posibilidades de trabajar en niveles de detalle individuales.\nPor ejemplo, el mapeo tonal en un nivel de ondícula. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Se deben evitar puntos demasiado pequeños (< 32x32 pixels).\nDebe usarse un «Valor de transición» bajo y un «Decaimiento de transición» y «Ámbito» altos, para simular puntos RT pequeños y tratar los defectos.\nPuede utilizarse «Claridad y Máscara nítida y Mezcla y Suavizar Imágenes» si es necesario, ajustando «Radio suave» para reducir los artefactos. +TP_LOCALLAB_EXPCURV;Curvas +TP_LOCALLAB_EXPGRAD;Filtro graduado +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;Hay un Filtro graduado disponible en Color y Luz (gradientes de luminancia, cromaticidad y matiz, y «Fusión de archivos»), Exposición (gradiente de luminancia), Máscara de exposición (gradiente de luminancia), Sombras/Luces (gradiente de luminancia), Vivacidad (gradiente de luminancia, cromaticidad y matiz), Contraste local y Pirámide de ondículas (gradiente de contraste local).\nEl difuminado está en Ajustes. +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Cambia la fusión de las imágenes transformada/original. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Cambia el comportamiento en imágenes con demasiado o demasiado poco contraste, añadiendo una curva de gamma antes y después de la transformada de Laplace. +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Cambia el comportamiento en imágenes subexpuestas, añadiendo un componente lineal antes de aplicar la transformada de Laplace. +TP_LOCALLAB_EXPLAP_TOOLTIP;Si se desplaza el deslizador hacia la derecha, el contraste se reducirá progresivamente. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Permite usar los modos de fusión de capas de GIMP o Photoshop (c), como Diferencia, Multiplicar, Luz suave, Superponer, etc., con control de opacidad.\n\nImagen original: fusiona el punto RT actual con la imagen original.\n\nPunto anterior: fusiona el punto RT actual con el anterior (si existe un punto anterior). Si sólo hay un punto RT, anterior = original.\n\nFondo: fusiona el punto RT con la luminancia y el color del fondo (menos posibilidades). +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Aplica un filtro de mediana antes de la transformada de Laplace para evitar artefactos (ruido).\nTambién se puede usar la herramienta «Reducción de ruido». +TP_LOCALLAB_EXPOSE;Rango dinámico y Exposición +TP_LOCALLAB_EXPOSURE_TOOLTIP;Modifica la exposición en el espacio L*a*b, usando algoritmos PDE de Laplaciana para tener en cuenta ΔE y minimizar los artefactos. +TP_LOCALLAB_EXPRETITOOLS;Herramientas Retinex avanzadas +TP_LOCALLAB_EXPSHARP_TOOLTIP;Punto RT mínimo 39*39.\nPara simular puntos RT más pequeños, se debe usar valores bajos de transición y valores altos de «Decaimiento de transición» y «Ámbito». +TP_LOCALLAB_EXPTOOL;Herramientas de exposición +TP_LOCALLAB_EXP_TOOLNAME;Rango dinámico y Exposición - 10 +TP_LOCALLAB_FATAMOUNT;Cantidad +TP_LOCALLAB_FATANCHOR;Anclaje +TP_LOCALLAB_FATDETAIL;Detalle +TP_LOCALLAB_FATFRA;Compresión de rango dinámico ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – usa el algoritmo de mapeo tonal Fattal. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATSHFRA;Máscara de compresión de rango dinámico ƒ +TP_LOCALLAB_FEATH_TOOLTIP;Anchura del gradiente como porcentaje de la diagonal del punto.\nUsado por todos los filtros graduados en todas las herramientas.\nNo realiza ninguna acción si no se ha activado un filtro graduado. +TP_LOCALLAB_FEATVALUE;Gradiente de degradado (Filtros graduados) +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;Utiliza una transformada de Fourier para mejorar la calidad (necesita más memoria y tiempo de procesamiento). +TP_LOCALLAB_FFTW;ƒ - Usar la Transformada Rápida de Fourier +TP_LOCALLAB_FFTWBLUR;ƒ - Usar siempre la Transformada Rápida de Fourier +TP_LOCALLAB_FULLIMAGE;Ev de negro y de blanco para la imagen completa +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calcula los niveles Ev para la imagen completa. +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMC;Gamma +TP_LOCALLAB_GAMCOL_TOOLTIP;Aplica una gamma a los datos de luminosidad L*a*b*.\nSi gamma = 3.0, se usará una luminosidad «lineal». +TP_LOCALLAB_GAMC_TOOLTIP;Aplica una gamma a los datos de luminosidad L*a*b* antes y después del tratamiento con Pirámide 1 y Pirámide 2.\nSi gamma = 3.0, se usará una luminosidad «lineal». +TP_LOCALLAB_GAMFRA;Curva de respuesta de tono (TRC) +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;La Gamma y la Pendiente permiten una transformación suave y libre de artefactos de la máscara, modificando progresivamente «L» para evitar cualquier discontinuidad. +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GAMW;Gamma (pirámides de ondículas) +TP_LOCALLAB_GRADANG;Ángulo del gradiente +TP_LOCALLAB_GRADANG_TOOLTIP;Ángulo de rotación en grados : -180 0 +180. +TP_LOCALLAB_GRADFRA;Máscara del filtro graduado +TP_LOCALLAB_GRADGEN_TOOLTIP;Ajusta la intensidad del gradiente de luminancia. +TP_LOCALLAB_GRADLOGFRA;Luminancia del filtro graduado +TP_LOCALLAB_GRADSTR;Intensidad del gradiente +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Ajusta la intensidad del gradiente de cromaticidad. +TP_LOCALLAB_GRADSTRCHRO;Intensidad de gradiente de cromaticidad +TP_LOCALLAB_GRADSTRHUE;Intensidad de gradiente de matiz +TP_LOCALLAB_GRADSTRHUE2;Intensidad de gradiente de matiz +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Ajusta la intensidad del gradiente de matiz. +TP_LOCALLAB_GRADSTRLUM;Intensidad de gradiente de luminancia +TP_LOCALLAB_GRAINFRA;Grano de película 1:1 +TP_LOCALLAB_GRAINFRA2;Grosor +TP_LOCALLAB_GRAIN_TOOLTIP;Añade grano similar a la película a la imagen. +TP_LOCALLAB_GRALWFRA;Filtro graduado (contraste local) +TP_LOCALLAB_GRIDFRAME_TOOLTIP;Esta herramienta se puede usar como un pincel. Usa un punto pequeño y adapta la transición y su decaimiento.\nSólo el modo NORMAL, y al final el Matiz, la Saturación, el Color y la Luminosidad, tienen que ver con la Fusión del fondo (ΔE). +TP_LOCALLAB_GRIDMETH_TOOLTIP;Virado de color: la luminancia se tiene en cuenta al variar la cromaticidad. Equivalente a H=f(H) si el «punto blanco» en la rejilla permanece en cero y sólo se varía el «punto negro». Equivale a «Virado de color» si se varían los dos puntos.\n\nDirecto: sólo actúa sobre la cromaticidad. +TP_LOCALLAB_GRIDONE;Virado de color +TP_LOCALLAB_GRIDTWO;Directo +TP_LOCALLAB_GUIDBL;Radio suave +TP_LOCALLAB_GUIDBL_TOOLTIP;Aplica un filtro guiado con radio ajustable. Permite reducir los artefactos o difuminar la imagen. +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Cambia la función de distribución del filtro guiado. Los valores negativos simulan un difuminado gaussiano. +TP_LOCALLAB_GUIDFILTER;Radio del filtro guiado +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Puede reducir o aumentar los artefactos. +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensidad del filtro guiado. +TP_LOCALLAB_HHMASK_TOOLTIP;Ajustes finos de matiz, por ejemplo para la piel. +TP_LOCALLAB_HIGHMASKCOL;Luces +TP_LOCALLAB_HLH;Curvas H +TP_LOCALLAB_HUECIE;Matiz +TP_LOCALLAB_IND;Independiente (ratón) +TP_LOCALLAB_INDSL;Independiente (ratón + deslizadores) +TP_LOCALLAB_INVBL;Inverso +TP_LOCALLAB_INVBL_TOOLTIP;La alternativa al modo «Inverso» es el uso de dos puntos RT.\n\nPrimer punto:\nImagen completa - delimitador fuera de la vista previa\nForma del punto RT: rectángulo. Transición 100\n\nSegundo punto: Excluyente. +TP_LOCALLAB_INVERS;Inverso +TP_LOCALLAB_INVERS_TOOLTIP;Si se selecciona, ofrece menos posibilidades (Inverso).\n\nAlternativa: usa dos puntos.\n\nPrimer punto:\nImagen completa - delimitador fuera de la vista previa.\nForma del punto RT: rectángulo. Transición 100\n\nSegundo punto: punto excluyente.\n\n Inverso activará esta herramienta en el área exterior al punto RT, mientras que el área interior al punto permanecerá sin cambios. +TP_LOCALLAB_INVMASK;Algoritmo inverso +TP_LOCALLAB_ISOGR;Distribución (ISO) +TP_LOCALLAB_JAB;Usa Ev Negro y Ev Blanco +TP_LOCALLAB_JABADAP_TOOLTIP;Adaptación perceptual uniforme.\nAjusta automáticamente la relación entre Jz y la saturación, teniendo en cuenta la «Luminancia absoluta». +TP_LOCALLAB_JZ100;Referencia Jz 100 cd/m² +TP_LOCALLAB_JZ100_TOOLTIP;Ajusta automáticamente el nivel de referencia Jz de 100 cd/m² (señal de imagen).\nCambia el nivel de saturación y la acción de “adaptación PU” (Adaptación perceptual uniforme). +TP_LOCALLAB_JZADAP;Adaptación PU +TP_LOCALLAB_JZCH;Cromaticidad +TP_LOCALLAB_JZCHROM;Cromaticidad +TP_LOCALLAB_JZCLARICRES;Fusionar cromaticidad Cz +TP_LOCALLAB_JZCLARILRES;Fusionar Jz +TP_LOCALLAB_JZCONT;Contraste +TP_LOCALLAB_JZFORCE;Forzar máx. Jz a 1 +TP_LOCALLAB_JZFORCE_TOOLTIP;Permite forzar el valor máximo de Jz a 1, a fin de conseguir una mejor respuesta de deslizadores y curvas. +TP_LOCALLAB_JZFRA;Ajustes de imagen Jz Cz Hz +TP_LOCALLAB_JZHFRA;Curvas Hz +TP_LOCALLAB_JZHJZFRA;Curva Jz(Hz) +TP_LOCALLAB_JZHUECIE;Rotación de matiz +TP_LOCALLAB_JZLIGHT;Luminosidad +TP_LOCALLAB_JZLOG;Codificación Log Jz +TP_LOCALLAB_JZLOGWBS_TOOLTIP;Los ajustes Ev de Negro y Ev de Blanco pueden ser diferentes, dependiendo de si se usa Codificación logarítmica o Sigmoide.\nEn el caso de Sigmoide, puede ser necesario un cambio (aumento en la mayoría de los casos) de Ev de Blanco, para obtener una mejor representación de las altas luces, el contraste y la saturación. +TP_LOCALLAB_JZLOGWB_TOOLTIP;Si Auto está activado, calculará y ajustará los niveles Ev y la «luminancia media Yb%» en el área del punto de edición. Los valores resultantes se usarán en todas las operaciones Jz, incluyendo «Codificación Log Jz».\nTambién calcula la luminancia absoluta en el momento de la toma. +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb es la luminosidad relativa del fondo, expresada como un porcentaje de gris. Un 18% de gris corresponde a una luminosidad del fondo del 50%, expresada en CIE L.\nLos datos se basan en la luminosidad media de la imagen.\nSi se usa con la Codificación logarítmica, la luminosidad media se utilizará para determinar la cantidad de ganancia que se necesita aplicar a la señal antes de la codificación logarítimica. Los valores bajos de luminosidad media darán como resultado un aumento de la ganancia. +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (sólo en modo «Avanzado»). Sólo funcionará si el dispositivo de salida (monitor) es HDR (luminancia pico mayor que 100 cd/m², idealmente entre 4000 y 10000 cd/m², y luminancia del punto negro inferior a 0.005 cd/m²). Esto supone que: a) el espacio de conexión de perfiles ICC (ICC-PCS) para la pantalla usa Jzazbz (o XYZ), b) trabaja con precisión de números reales (de coma flotante), c) el monitor está calibrado (si es posible, con un rango de colores DCI-P3 o Rec-2020), d) la gamma usual (sRGB o BT709) se substituye por una función Cuantificadora Perceptual (CP). +TP_LOCALLAB_JZPQFRA;Remapeo de Jz +TP_LOCALLAB_JZPQFRA_TOOLTIP;Permite adaptar el algoritmo Jz a un entorno de bajo rango dinámico (SDR) o a las características (rendimiento) de un entorno HDR, como sigue:\na) para valores de luminancia entre 0 y 100 cd/m², el sistema se comporta como si fuera un entorno SDR.\nb) para valores de luminancia entre 100 y 10000 cd/m², se puede adaptar el algoritmo a las características HDR de la imagen y del monitor.\n\nSi “PQ - Luminancia pico” está puesto a 10000, “Remapeo de Jz” se comporta del mismo modo que el algoritmo original Jzazbz. +TP_LOCALLAB_JZPQREMAP;PQ - Luminancia pico +TP_LOCALLAB_JZPQREMAP_TOOLTIP;CP (Cuantificador Perceptual). Permite cambiar la función CP interna (normalmente 10000 cd/m² - predeterminado 120 cd/m²).\nSe puede usar para adaptar a diferentes imágenes, procesos y dispositivos. +TP_LOCALLAB_JZQTOJ;Luminancia relativa +TP_LOCALLAB_JZQTOJ_TOOLTIP;Permite usar la «Luminancia relativa» en lugar de la «Luminancia absoluta». La luminancia pasa a ser la luminosidad.\nLos cambios afectan al deslizador Luminosidad, al de Contraste, y a la curva Jz(Jz). +TP_LOCALLAB_JZSAT;Saturación +TP_LOCALLAB_JZSHFRA;Sombras/Luces Jz +TP_LOCALLAB_JZSOFTCIE;Radio suave (Filtro guiado) +TP_LOCALLAB_JZSTRSOFTCIE;Intensidad del filtro guiado +TP_LOCALLAB_JZTARGET_EV;Luminancia media de visualización (Yb%) +TP_LOCALLAB_JZTHRHCIE;Umbral de cromaticidad para Jz(Hz) +TP_LOCALLAB_JZWAVEXP;Ondícula Jz +TP_LOCALLAB_LABBLURM;Máscara de difuminado +TP_LOCALLAB_LABEL;Ajustes locales +TP_LOCALLAB_LABGRID;Cuadrícula de corrección de color +TP_LOCALLAB_LABGRIDMERG;Fondo +TP_LOCALLAB_LABGRID_VALUES;Alto(a)=%1 Alto(b)=%2\nBajo(a)=%3 Bajo(b)=%4 +TP_LOCALLAB_LABSTRUM;Máscara de estructura +TP_LOCALLAB_LAPLACC;ΔØ Máscara Laplaciana resolver PDE +TP_LOCALLAB_LAPLACE;Umbral de Laplaciana ΔE +TP_LOCALLAB_LAPLACEXP;Umbral de Laplaciana +TP_LOCALLAB_LAPMASKCOL;Umbral de Laplaciana +TP_LOCALLAB_LAPRAD1_TOOLTIP;Aumenta el contraste de la máscara incrementando los valores de luminancia de las áreas más claras. Puede usarse junto con las curvas L(L) y LC(H). +TP_LOCALLAB_LAPRAD2_TOOLTIP;Radio suave usa un filtro guiado para reducir los artefactos y suavizar la transición. +TP_LOCALLAB_LAPRAD_TOOLTIP;Radio suave usa un filtro guiado para reducir los artefactos y suavizar la transición. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Resuelve la PDE para todas las máscaras Laplacianas.\nSi se activa, la máscara de umbral de Laplaciana reduce los artefactos y suaviza el resultado.\nSi se desactiva, la respuesta será lineal. +TP_LOCALLAB_LC_FFTW_TOOLTIP;La Transformada Rápida de Fourier (FFT) mejora la calidad y permite el uso de radios mayores, pero aumenta el tiempo de procesamiento (esto depende del área a procesar). Es preferible usarla solamente para radios grandes. El tamaño del área puede reducirse en unos pocos píxels para optimizar la FFTW. Esto puede reducir el tiempo de procesamiento en un factor de 1.5 a 10. +TP_LOCALLAB_LC_TOOLNAME;Contraste local y Ondículas - 7 +TP_LOCALLAB_LEVELBLUR;Número máximo de niveles de difuminado +TP_LOCALLAB_LEVELWAV;Ψ Niveles de ondículas +TP_LOCALLAB_LEVELWAV_TOOLTIP;El Nivel se adapta automáticamente al tamaño del punto y a la vista previa.\nTamaño máximo desde 512 en el nivel 9 a 4 en el nivel 1. +TP_LOCALLAB_LEVFRA;Niveles +TP_LOCALLAB_LIGHTNESS;Claridad +TP_LOCALLAB_LIGHTN_TOOLTIP;En modo inverso: selección = -100 fuerza la luminancia a cero. +TP_LOCALLAB_LIGHTRETI;Claridad +TP_LOCALLAB_LINEAR;Linealidad +TP_LOCALLAB_LIST_NAME;Añadir herramienta al punto actual... +TP_LOCALLAB_LIST_TOOLTIP;Se pueden seleccionar 3 niveles de complejidad para cada herramienta: Básico, Estándar y Avanzado.\n\nEl valor predeterminado para todas las herramientas es Básico, pero esto puede cambiarse en el diálogo Preferencias.\n\nTambién es posible cambiar el nivel de complejidad en cada herramienta individual mientras se edita. +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Permite disminuir o aumentar el efecto en niveles de detalle particulares en la máscara, dirigiendo el efecto a ciertas zonas de luminancia (en general las más claras). +TP_LOCALLAB_LMASK_LL_TOOLTIP;Permite cambiar libremente el contraste de la máscara.\n\nSu función es similar a la de los deslizadores Gamma y Pendiente.\n\nPermite actuar sobre ciertas partes de la imagen (normalmente las partes más claras de la máscara, usando la curva para excluir las partes más oscuras). Puede crear artefactos. +TP_LOCALLAB_LOCCONT;Máscara de nitidez +TP_LOCALLAB_LOC_CONTRAST;Contraste local y Ondículas +TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pirámide 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pirámide 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contraste por niveles - TM - Contraste direccional +TP_LOCALLAB_LOC_CONTRASTPYRLAB; Filtro graduado - Nitidez de bordes - Difuminado +TP_LOCALLAB_LOC_RESIDPYR;Imagen residual (Principal) +TP_LOCALLAB_LOG;Codificación logarítmica +TP_LOCALLAB_LOG1FRA;Ajustes de imagen CAM16 +TP_LOCALLAB_LOG2FRA;Condiciones de visualización +TP_LOCALLAB_LOGAUTO;Automático +TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Calcula automáticamente la «luminancia media» para las condiciones de la escena. +TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Calcula automáticamente la «luminancia media» para las condiciones de la escena cuando está pulsado el botón «Automático» en Niveles relativos de exposición. +TP_LOCALLAB_LOGAUTO_TOOLTIP;Al pulsar este botón se calculará el «rango dinámico» y la «luminancia media» para las condiciones de la escena si está activada la casilla «Luminancia media automática (Yb%)».\nTambién se calcula la luminancia absoluta en el momento de la toma.\nPara ajustar los valores calculados automáticamente hay que volver a pulsar el botón. +TP_LOCALLAB_LOGBASE_TOOLTIP;Valor predeterminado = 2.\nLos valores menores que 2 reducen la acción del algoritmo, haciendo las sombras más oscuras y las luces más brillantes.\nCon valores mayores que 2, las sombras son más grises y las luces son más desteñidas. +TP_LOCALLAB_LOGCATAD_TOOLTIP;La adaptación cromática permite interpretar un color en función de su entorno espacio-temporal.\nEs útil cuando el balance de blancos está lejos de la referencia D50.\nAdapta los colores al iluminante del dispositivo de salida. +TP_LOCALLAB_LOGCIE;Codificación logarítmica en lugar de Sigmoide +TP_LOCALLAB_LOGCIE_TOOLTIP;Permite el uso de Ev de Negro, Ev de Blanco, Luminancia media de la escena (Yb%) y Luminancia media de la visualización (Yb%) para el mapeo tonal con Codificación logarítmica Q. +TP_LOCALLAB_LOGCOLORFL;Colorido (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Cantidad de matiz percibida en relación al gris.\nIndicador de que un estímulo parece más o menos coloreado. +TP_LOCALLAB_LOGCONQL;Contraste (Q) +TP_LOCALLAB_LOGCONTHRES;Umbral de contraste (J y Q) +TP_LOCALLAB_LOGCONTL;Contraste (J) +TP_LOCALLAB_LOGCONTL_TOOLTIP;El Contraste (J) en CIECAM16 tiene en cuenta el aumento en la coloración percibida con la luminancia. +TP_LOCALLAB_LOGCONTQ_TOOLTIP;El Contraste (Q) en CIECAM16 tiene en cuenta el aumento en la coloración percibida con el brillo. +TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Ajusta el rango de contraste en los tonos medios (J y Q).\nLos valores positivos reducen progresivamente el efecto de los deslizadores de contraste (J y Q). Los valores negativos aumentan progresivamente el efecto de los deslizadores de contraste. +TP_LOCALLAB_LOGDETAIL_TOOLTIP;Actúa principalmente en frecuencias altas. +TP_LOCALLAB_LOGENCOD_TOOLTIP;Mapeo tonal con codificación logarítmica (ACES).\nÚtil para imágenes subexpuestas o de alto rango dinámico.\n\nProceso en dos pasos: 1) Cálculo del rango dinámico 2) Ajuste manual. +TP_LOCALLAB_LOGEXP;Todas las herramientas +TP_LOCALLAB_LOGFRA;Condiciones de la escena +TP_LOCALLAB_LOGFRAME_TOOLTIP;Permite calcular y ajustar los niveles Ev y la «Luminancia media Yb%» (punto origen gris) para el área del punto RT. Los valores resultantes se usarán en todas las operaciones L*a*b* y en la mayoría de operaciones RGB del circuito de revelado.\n\nTiene en cuenta la compensación de exposición en la pestaña Exposición del menú principal.\n\nTambién calcula la luminancia absoluta en el momento de la toma. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Tiene en cuenta las variables Ciecam correspondientes (principalmente el Contraste «J» y la Saturación «s», y también el Contraste «Q» «avanzado», el Brillo «Q», la Claridad (J), y el Colorido (M)). +TP_LOCALLAB_LOGLIGHTL;Claridad (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Cercano a la claridad (L*a*b*), tiene en cuenta el aumento de la coloración percibida. +TP_LOCALLAB_LOGLIGHTQ;Brillo (Q) +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Cantidad de luz percibida que emana de un estímulo.\nIndicador de que un estímulo parece más o menos brillante. +TP_LOCALLAB_LOGLIN;Modo logarítmico +TP_LOCALLAB_LOGPFRA;Niveles relativos de exposición +TP_LOCALLAB_LOGREPART;Intensidad +TP_LOCALLAB_LOGREPART_TOOLTIP;Permite ajustar la intensidad relativa de la imagen codificada logarítmicamente con respecto a la imagen original.\nNo afecta al componente Ciecam. +TP_LOCALLAB_LOGSATURL_TOOLTIP;La Saturación (s) en CIECAM16 corresponde al color de un estímulo en relación a su propio brillo.\nActúa principalmente en tonos medios y luces. +TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponde a las condiciones de toma. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Cambia los tonos y colores teniendo en cuenta las condiciones de la escena.\n\nPromedio: Condiciones de luz promedio (estándar). La imagen no cambiará.\n\nTenue: Condiciones de luz tenue. La imagen será ligeramente más brillante.\n\nOscuro: Condiciones de oscuridad. La imagen será más brillante. +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponde al medio en el que se visualizará la imagen final (monitor, TV, proyector, impresora,..), así como su entorno. +TP_LOCALLAB_LOG_TOOLNAME;Codificación logarítmica - 0 +TP_LOCALLAB_LUM;Curvas LL - CC +TP_LOCALLAB_LUMADARKEST;El más oscuro +TP_LOCALLAB_LUMASK;Color de fondo para las máscaras de luminancia y color +TP_LOCALLAB_LUMASK_TOOLTIP;Ajusta el matiz de gris o de color del fondo de la máscara en Mostrar máscara (Máscara y modificaciones). +TP_LOCALLAB_LUMAWHITESEST;El más claro +TP_LOCALLAB_LUMFRA;L*a*b* estándar +TP_LOCALLAB_MASFRAME;Enmascarar y Fusionar +TP_LOCALLAB_MASFRAME_TOOLTIP;Para todas las máscaras.\n\nTiene en cuenta la ΔE de la imagen para evitar modificar el área seleccionada cuando se usan las siguientes herramientas de máscara: Gamma, Pendiente, Cromaticidad, Curva de contraste, Contraste local (por niveles de ondículas), Máscara de difuminado y Máscara de Estructura (si está activada) .\n\nDesactivada cuando se usa el modo Inverso. +TP_LOCALLAB_MASK;Contraste +TP_LOCALLAB_MASK2;Curva de contraste +TP_LOCALLAB_MASKCOM;Máscara de color común +TP_LOCALLAB_MASKCOM_TOOLNAME;Máscara de color común - 13 +TP_LOCALLAB_MASKCOM_TOOLTIP;Una herramienta por derecho propio.\nPuede usarse para ajustar la apariencia de la imagen (cromaticidad, luminancia, contraste) y la textura en función del Ámbito. +TP_LOCALLAB_MASKCURVE_TOOLTIP;Las 3 curvas pasan a ser 1 (máximo) de forma predeterminada:\n\nC=f(C): la cromaticidad varía en función de la cromaticidad. Se puede disminuir la cromaticidad para mejorar la selección. Ajustando esta curva cerca de cero (con un valor bajo de C para activar la curva), es posible desaturar el fondo en modo Inverso.\n\nL=f(L): la luminancia varía en función de la luminancia, por lo que se puede disminuir el brillo para mejorar la selección.\n\nL y C = f(H): luminancia y cromaticidad varían en función del matiz, por lo que es posible disminuir la luminancia y la cromaticidad para mejorar la selección. +TP_LOCALLAB_MASKDDECAY;Intensidad de decaimiento +TP_LOCALLAB_MASKDECAY_TOOLTIP;Controla la tasa de decaimiento de los niveles de gris en la máscara.\nDecaimiento = 1 lineal, Decaimiento > 1 transiciones parabólicas más nítidas, Decaimiento < 1 transiciones más graduales. +TP_LOCALLAB_MASKDEINV_TOOLTIP;Invierte la forma en que el algoritmo interpreta la máscara.\nSi está activado, se reducirán las áreas negras y muy claras. +TP_LOCALLAB_MASKDE_TOOLTIP;Usado para dirigir la reducción de ruido en función de la información de luminancia de la imagen contenida en la máscara L(L) o LC(H) (Máscara y Modificaciones).\n\nLa máscara L(L) o la máscara LC(H) debe estar activada para poder usar esta función.\n\nSi la máscara está por debajo del umbral «oscuro», la Reducción de ruido se aplicará progresivamente.\n\nSi la máscara está por encima del umbral «claro», la Reducción de ruido se aplicará progresivamente.\n\nEntre ambos, se mantendrán los ajustes de la imagen sin la Reducción de ruido, salvo si ajustas los deslizadores «Reducción de ruido de luminancia en áreas grises» o «Reducción de ruido de cromaticidad en áreas grises». +TP_LOCALLAB_MASKGF_TOOLTIP;Usado para dirigir el Filtro guiado en función de la información de luminancia de la imagen contenida en la máscara L(L) o LC(H) (Máscara y Modificaciones).\n\nLa máscara L(L) o la máscara LC(H) debe estar activada para poder usar esta función.\n\nSi la máscara está por debajo del umbral «oscuro», el Filtro guiado se aplicará progresivamente.\n\nSi la máscara está por encima del umbral «claro», el Filtro Guiado se aplicará progresivamente.\n\nEntre ambos, se mantendrán los ajustes de imagen sin el Filtro guiado. +TP_LOCALLAB_MASKH;Curva de matiz +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Contraste por niveles de detalle (Sólo luminancia) a sus valores originales anteriores a su modificación por los ajustes de Contraste por niveles de detalle.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Color y Luz a sus valores originales anteriores a su modificación por los ajustes de Color y Luz.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «máscara de estructura», «máscara de difuminado», «Radio suave», «Gamma y Pendiente», «Curva de contraste», «Ondícula de contraste local».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;La reducción de ruido se decrementa progresivamente, desde el 100% en el umbral hasta el 0% en el valor máximo de blanco (determinado por la máscara).\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Máscara de estructura», «Radio suave», «Gamma y Pendiente», «Curva de contraste», «Ondícula de contraste local».\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Límite de tonos claros sobre el cual se restaurará progresivamente «Rango dinámico y Exposición» a sus valores originales anteriores a su modificación por los ajustes de «Rango dinámico y Exposición».\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Codificación logarítmica a sus valores originales anteriores a su modificación por los ajustes de Codificación logarítmica.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Retinex (Sólo luminancia) a sus valores originales anteriores a su modificación por los ajustes de Retinex.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Sombras/Luces a sus valores originales anteriores a su modificación por los ajustes de Sombras/Luces.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Mapeo tonal a sus valores originales anteriores a su modificación por los ajustes de Mapeo tonal.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Vivacidad y Cálido/Frío a sus valores originales anteriores a su modificación por los ajustes de Vivacidad y Cálido/Frío.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Límite de tonos claros sobre el cual se restaurará Contraste local y Ondícula a sus valores originales anteriores a su modificación por los ajustes de Contraste local y Ondícula.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;El Filtro guiado se decrementa progresivamente, desde el 100% en el umbral hasta el 0% en el valor máximo de blanco (determinado por la máscara).\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Máscara de estructura», «Radio suave», «Gamma y Pendiente», «Curva de contraste», «Ondícula de contraste local».\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLCTHR;Umbral de luminancia de zona clara +TP_LOCALLAB_MASKLCTHR2;Umbral de luminancia de zona clara +TP_LOCALLAB_MASKLCTHRLOW;Umbral de luminancia de zona oscura +TP_LOCALLAB_MASKLCTHRLOW2;Umbral de luminancia de zona oscura +TP_LOCALLAB_MASKLCTHRMID;Reducción de ruido de luminancia en áreas grises +TP_LOCALLAB_MASKLCTHRMIDCH;Reducción de ruido de cromaticidad en áreas grises +TP_LOCALLAB_MASKLC_TOOLTIP;Esto permite dirigir la reducción de ruido en función de la información de luminancia de la imagen contenida en la máscara L(L) o LC(H) (Máscara y Modificaciones).\n\nLa máscara L(L) o la máscara LC(H) debe estar activada para poder usar esta función.\n\n«Umbral de luminancia de área oscura». Si «Reforzar reducción de ruido en áreas oscuras y claras» > 1, la reducción de ruido aumenta progresivamente, desde 0% en el umbral hasta 100% en el valor máximo de negro (determinado por la máscara).\n\n«Umbral de luminancia de área clara». La reducción de ruido disminuye progresivamente, desde 100% en el umbral hasta 0% en el valor máximo de blanco (determinado por la máscara).\n\nEn el área entre ambos umbrales, los ajustes de reducción de ruido no se ven afectados por la máscara. +TP_LOCALLAB_MASKLNOISELOW;Reforzar reducción de ruido en áreas oscuras y claras +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Límite de tonos oscuros bajo el cual Contraste por niveles de detalle (Sólo luminancia) se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Contraste por niveles de detalle.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Límite de tonos oscuros bajo el cual Color y Luz se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Color y Luz.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «máscara de estructura», «máscara de difuminado», «Radio suave», «Gamma y Pendiente», «Curva de contraste», «Ondícula de contraste local».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;La Reducción de ruido se incrementa progresivamente desde el 0% en el umbral hasta el 100% en el valor máximo de negro (determinado por la máscara).\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Máscara de estructura», «Radio suave», «Gamma y Pendiente», «Curva de contraste», «Ondícula de contraste local».\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Límite de tonos oscuros bajo el cual Rango dinámico y Exposición se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Rango dinámico y Exposición.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Límite de tonos oscuros bajo el cual Codificación logarítmica se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Codificación logarítmica.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Límite de tonos oscuros bajo el cual Retinex (Sólo luminancia) se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Retinex.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Límite de tonos oscuros bajo el cual Sombras/Luces se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Sombras/Luces.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Límite de tonos oscuros bajo el cual Mapeo tonal se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Mapeo tonal.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Límite de tonos oscuros bajo el cual Vivacidad y Cálido/Frío se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Vivacidad y Cálido/Frío.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Límite de tonos oscuros bajo el cual Contraste local y Ondícula se restaurará progresivamente a sus valores originales anteriores a su modificación por los ajustes de Contraste local y Ondícula.\n\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Radio suave», «Gamma y Pendiente», «Curva de contraste».\n\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;El Filtro guiado se incrementa progresivamente desde el 0% en el umbral hasta el 100% en el valor máximo de negro (determinado por la máscara).\nSe pueden usar ciertas herramientas en «Máscara y modificaciones» para cambiar los niveles de gris: «Máscara de estructura», «Radio suave», «Gamma y Pendiente», «Curva de contraste», «Ondícula de contraste local».\nPara ver qué áreas se verán afectadas, se puede usar un «muestreador de color bloqueable» en la máscara. Hay que tener cuidado de poner Máscara de color de fondo = 0 en «Ajustes». +TP_LOCALLAB_MASKRECOL_TOOLTIP;Usado para modular el efecto de los ajustes de Color y Luz en función de la información de luminancia contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) deben estar activadas para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral de oscuridad y sobre el umbral de claridad se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Color y Luz.\n\nEntre estas dos áreas, se aplicarán los valores íntegros de los ajustes de Color y Luz. +TP_LOCALLAB_MASKRECOTHRES;Umbral de recuperación +TP_LOCALLAB_MASKREEXP_TOOLTIP;Usado para modular el efecto de los ajustes de «Rango dinámico y Exposición» en función de la información de luminancia de la imagen contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) debe estar activada para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral de oscuridad y sobre el umbral de claridad se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de «Rango dinámico y Exposición».\n\nEntre estas dos áreas, se aplicarán los valores íntegros de los ajustes de «Rango dinámico y Exposición». +TP_LOCALLAB_MASKRELOG_TOOLTIP;Usado para modular el efecto de los ajustes de Codificación logarítmica en función de la información de luminancia de la imagen contenida en las máscaras L(L) o LC(H) (Máscaras y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) deben estar activadas para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral de oscuridad y sobre el umbral de claridad se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Codificación logarítmica. Puede usarse para restaurar luces reconstruidas por Propagación de color.\n\nEntre estas dos áreas se aplicará el valor íntegro de los ajustes de Codificación logarítmica. +TP_LOCALLAB_MASKRESCB_TOOLTIP;Usado para modular el efecto de los ajustes de Contraste por niveles de detalle (Sólo luminancia) en función de la información de luminancia contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) deben estar activadas para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral oscuro y sobre el umbral claro se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Contraste por niveles de detalle.\n\nEntre estas dos áreas, se aplicarán los valores íntegros de los ajustes de Contraste por niveles de detalle. +TP_LOCALLAB_MASKRESH_TOOLTIP;Usado para modular el efecto de los ajustes de Sombras/Luces en función de la información de luminancia contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) deben estar activadas para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral oscuro y sobre el umbral claro se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Sombras/Luces.\n\nEntre estas dos áreas, se aplicarán los valores íntegros de los ajustes de Sombras/Luces. +TP_LOCALLAB_MASKRESRETI_TOOLTIP;Usado para modular el efecto de los ajustes de Retinex (Sólo luminancia) en función de la información de luminancia contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) deben estar activadas para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral oscuro y sobre el umbral claro se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Retinex.\n\nEntre estas dos áreas, se aplicarán los valores íntegros de los ajustes de Retinex. +TP_LOCALLAB_MASKRESTM_TOOLTIP;Usado para modular el efecto de los ajustes de Mapeo tonal en función de la información de luminancia contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) deben estar activadas para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral oscuro y sobre el umbral claro se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Mapeo tonal.\n\nEntre estas dos áreas, se aplicarán los valores íntegros de los ajustes de Mapeo tonal. +TP_LOCALLAB_MASKRESVIB_TOOLTIP;Usado para modular el efecto de los ajustes de Vivacidad y Cálido/Frío en función de la información de luminancia de la imagen, contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) debe estar activada para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral de oscuridad y sobre el umbral de claridad se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Vivacidad y Cálido/Frío.\n\nEntre estas dos áreas se aplicará el valor íntegro de los ajustes de Vivacidad y Cálido/Frío. +TP_LOCALLAB_MASKRESWAV_TOOLTIP;Usado para modular el efecto de los ajustes de Contraste local y Ondículas en función de la información de luminancia contenida en las máscaras L(L) o LC(H) (Máscara y modificaciones).\n\nLa máscara L(L) o la máscara LC(H) deben estar activadas para poder usar esta función.\n\nLas áreas «oscuras» y «claras» bajo el umbral oscuro y sobre el umbral claro se restaurarán progresivamente a sus valores originales anteriores a su modificación por los ajustes de Contraste local y Ondículas.\n\nEntre estas dos áreas, se aplicarán los valores íntegros de los ajustes de Contraste local y Ondículas. +TP_LOCALLAB_MASKUNUSABLE;Máscara desactivada (Máscara y modificaciones) +TP_LOCALLAB_MASKUSABLE;Máscara activada (Máscara y modificaciones) +TP_LOCALLAB_MASK_TOOLTIP;Se puede activar varias máscaras para una herramienta, activando otra herramienta y usando solamente la máscara (ajusta los deslizadores de la herramienta a 0 ).\n\nTambién es posible duplicar el punto RT y situarlo cerca del primer punto. Las pequeñas variaciones en las referencias del punto permiten hacer ajustes finos. +TP_LOCALLAB_MEDIAN;Mediana baja +TP_LOCALLAB_MEDIANITER_TOOLTIP;El número de iteraciones sucesivas llevadas a cabo por el filtro de mediana. +TP_LOCALLAB_MEDIAN_TOOLTIP;Se puede elegir un valor de mediana en el rango de 3x3 a 9x9 píxels. Los valores altos aumentan la reducción de ruido y el difuminado. +TP_LOCALLAB_MEDNONE;Ninguno +TP_LOCALLAB_MERCOL;Color +TP_LOCALLAB_MERDCOL;Fusión del fondo (ΔE) +TP_LOCALLAB_MERELE;Sólo aclarar +TP_LOCALLAB_MERFIV;Adición +TP_LOCALLAB_MERFOR;Aclarar color +TP_LOCALLAB_MERFOU;Multiplicar +TP_LOCALLAB_MERGE1COLFRA;Fusionar con Original o Anterior o Fondo +TP_LOCALLAB_MERGECOLFRA;Máscara: LCH y Estructura +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Permite crear máscaras en función de las tres curvas LCH y/o un algoritmo de detección de estructura. +TP_LOCALLAB_MERGEMER_TOOLTIP;Tiene en cuenta ΔE al fusionar archivos (equivale al ámbito en este caso). +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacidad = % del punto actual a fusionar con el punto original o el anterior.\nUmbral de contraste: ajusta el resultado en función del contraste en la imagen original. +TP_LOCALLAB_MERHEI;Superposición +TP_LOCALLAB_MERHUE;Matiz +TP_LOCALLAB_MERLUCOL;Luminancia +TP_LOCALLAB_MERLUM;Luminosidad +TP_LOCALLAB_MERNIN;Pantalla +TP_LOCALLAB_MERONE;Normal +TP_LOCALLAB_MERSAT;Saturación +TP_LOCALLAB_MERSEV;Luz suave (anterior) +TP_LOCALLAB_MERSEV0;Ilusión de Luz suave +TP_LOCALLAB_MERSEV1;Luz suave W3C +TP_LOCALLAB_MERSEV2;Luz dura +TP_LOCALLAB_MERSIX;Dividir +TP_LOCALLAB_MERTEN;Sólo oscurecer +TP_LOCALLAB_MERTHI;Quemar color +TP_LOCALLAB_MERTHR;Diferencia +TP_LOCALLAB_MERTWE;Exclusión +TP_LOCALLAB_MERTWO;Substraer +TP_LOCALLAB_METHOD_TOOLTIP;«Mejorado + reducción de ruido de cromaticidad» aumenta significativamente los tiempos de procesamiento.\nPero reduce los artefactos. +TP_LOCALLAB_MLABEL;Datos restaurados Min=%1 Max=%2 (Recorte - Desplazamiento) +TP_LOCALLAB_MLABEL_TOOLTIP;Los valores deberían estar cerca de Min=0 Max=32768 (modo logarítmico), pero son posibles otros valores. Se puede ajustar «Recortar datos restaurados (ganancia)» y «Desplazamiento» para normalizar.\nRecupera los datos de la imagen sin mezclado. +TP_LOCALLAB_MODE_EXPERT;Avanzado +TP_LOCALLAB_MODE_NORMAL;Estándar +TP_LOCALLAB_MODE_SIMPLE;Básico +TP_LOCALLAB_MRFIV;Fondo +TP_LOCALLAB_MRFOU;Punto anterior +TP_LOCALLAB_MRONE;Ninguno +TP_LOCALLAB_MRTHR;Imagen original +TP_LOCALLAB_MULTIPL_TOOLTIP;Ajuste de tono de rango extenso: de -18EV a +4EV. El primer deslizador actúa sobre tonos muy oscuros, entre -18EV y -6EV. El último deslizador actúa sobre tonos claros, hasta 4EV. +TP_LOCALLAB_NEIGH;Radio +TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Los valores bajos preservan detalles y textura, los altos aumentan la reducción de ruido.\nSi gamma = 3.0, se usa Luminancia "lineal". +TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Este deslizador se usa para adaptar la cantidad de reducción de ruido al tamaño de los objetos a procesar. +TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Los valores altos aumentan la reducción de ruido a cambio de un mayor tiempo de procesamiento. +TP_LOCALLAB_NLDENOISE_TOOLTIP;“Recuperación de detalle” actúa sobre una transformación Laplaciana, a fin de dirigirse a las áreas uniformes en lugar de a áreas con detalle. +TP_LOCALLAB_NLDET;Recuperación de detalle +TP_LOCALLAB_NLFRA;Medias no locales - Luminancia +TP_LOCALLAB_NLFRAME_TOOLTIP;La reducción de ruido por medias no locales toma una media de todos los píxels de la imagen, ponderada por la similitud de los píxels al píxel objetivo.\n\nReduce la pérdida de detalle en comparación con los algoritmos de medias locales.\n\nSólo se tiene en cuenta el ruido de luminancia. El ruido de cromaticidad se procesa mejor usando ondículas y transformadas de Fourier (DCT).\n\nPuede usarse junto con «Reducción de ruido de luminancia por niveles» o solo.\n\nEl tamaño del punto RT debe ser mayor que 150x150 píxels (Salida). +TP_LOCALLAB_NLGAM;Gamma +TP_LOCALLAB_NLLUM;Intensidad +TP_LOCALLAB_NLPAT;Tamaño máximo de parcela +TP_LOCALLAB_NLRAD;Tamaño máximo del radio +TP_LOCALLAB_NOISECHROCOARSE;Cromaticidad gruesa (Ondíc.) +TP_LOCALLAB_NOISECHROC_TOOLTIP;Si es mayor que cero, se activa el algoritmo de alta calidad.\nEl grueso es para un valor del deslizador >=0.02. +TP_LOCALLAB_NOISECHRODETAIL;Recuperación de detalle de cromaticidad (DCT ƒ) +TP_LOCALLAB_NOISECHROFINE;Cromaticidad fina (Ondíc.) +TP_LOCALLAB_NOISEGAM;Gamma +TP_LOCALLAB_NOISEGAM_TOOLTIP;Si gamma = 1, se usa la luminosidad L*a*b*. Si gamma = 3.0, se usa una luminosidad «lineal».\nLos valores bajos preservan los detalles y la textura, mientras que los valores altos aumentan la reducción de ruido. +TP_LOCALLAB_NOISELEQUAL;Ecualizador blanco-negro +TP_LOCALLAB_NOISELUMCOARSE;Luminancia grueso (Ondíc.) +TP_LOCALLAB_NOISELUMDETAIL;Recuperación de detalle de luminancia (DCT ƒ) +TP_LOCALLAB_NOISELUMFINE;Luminancia fino 1 (Ondíc.) +TP_LOCALLAB_NOISELUMFINETWO;Luminancia fino 2 (Ondíc.) +TP_LOCALLAB_NOISELUMFINEZERO;Luminancia fino 0 (Ondíc.) +TP_LOCALLAB_NOISEMETH;Reducción de ruido +TP_LOCALLAB_NOISE_TOOLTIP;Añade ruido de luminancia. +TP_LOCALLAB_NONENOISE;Ninguno +TP_LOCALLAB_NUL_TOOLTIP;. +TP_LOCALLAB_OFFS;Desplazamiento +TP_LOCALLAB_OFFSETWAV;Desplazamiento +TP_LOCALLAB_OPACOL;Opacidad +TP_LOCALLAB_ORIGLC;Fusionar sólo con la imagen original +TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifica ΔE antes de cualquier cambio realizado por «Ámbito». Esto permite diferenciar la acción para diferentes partes de la imagen (por ejemplo, respecto al fondo). +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Actúa sobre el umbral de Laplaciana. Cuanto mayor sea la acción, más se reducirán las diferencias de contraste. +TP_LOCALLAB_PASTELS2;Vivacidad +TP_LOCALLAB_PDE;Atenuador de contraste - Compresión de rango dinámico +TP_LOCALLAB_PDEFRA;Atenuador de contraste ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;Algoritmo PDE IPOL adaptado para Rawtherapee: produce diferentes resultados y necesita ajustes diferentes en comparación con la «Exposición» del menú principal.\nPuede ser útil para imágenes subexpuestas o de alto rango dinámico. +TP_LOCALLAB_PREVHIDE;Ocultar ajustes adicionales +TP_LOCALLAB_PREVIEW;Vista previa ΔE +TP_LOCALLAB_PREVSHOW;Mostrar ajustes adicionales +TP_LOCALLAB_PROXI;Decaimiento ΔE +TP_LOCALLAB_QUAAGRES;Agresivo +TP_LOCALLAB_QUACONSER;Conservador +TP_LOCALLAB_QUALCURV_METHOD;Tipo de curva +TP_LOCALLAB_QUAL_METHOD;Calidad global +TP_LOCALLAB_QUANONEALL;Desactivado +TP_LOCALLAB_QUANONEWAV;Sólo medias no locales +TP_LOCALLAB_RADIUS;Radio +TP_LOCALLAB_RADIUS_TOOLTIP;Usa una Transformada Rápida de Fourier para radio > 30. +TP_LOCALLAB_RADMASKCOL;Radio suave +TP_LOCALLAB_RECOTHRES02_TOOLTIP;Si el valor del «Umbral de recuperación» es mayor que 1, la máscara en Máscara y modificaciones tiene en cuenta cualquier modificación previa realizada a la imagen, pero no las realizadas con la herramienta actual (por ejemplo, Color y luz, Ondícula, CAM16, etc.)\n\nSi el valor del «Umbral de recuperación» es menor que 1, la máscara en Máscara y modificaciones no tiene en cuenta ninguna modificación previa realizada a la imagen.\n\nEn ambos casos, el «Umbral de recuperación» actúa sobre la imagen enmascarada modificada por la herramienta actual (Color y luz, Ondícula, CAM16, etc.). +TP_LOCALLAB_RECT;Rectángulo +TP_LOCALLAB_RECURS;Referencias recursivas +TP_LOCALLAB_RECURS_TOOLTIP;Fuerza al algoritmo a recalcular las referencias después de la aplicación de cada herramienta.\nTambién es útil para trabajar con máscaras. +TP_LOCALLAB_REN_DIALOG_LAB;Introduce el nombre del nuevo Punto de Control +TP_LOCALLAB_REN_DIALOG_NAME;Cambio de nombre de Punto de Control +TP_LOCALLAB_REPARCOL_TOOLTIP;Permite ajustar la intensidad relativa de la imagen de Color y Luz respecto a la imagen original. +TP_LOCALLAB_REPARDEN_TOOLTIP;Permite ajustar la intensidad relativa de la imagen de Reducción de ruido respecto a la imagen original. +TP_LOCALLAB_REPAREXP_TOOLTIP;Permite ajustar la intensidad relativa de la imagen de Rango dinámico y Exposición respecto a la imagen original. +TP_LOCALLAB_REPARSH_TOOLTIP;Permite ajustar la intensidad relativa de la imagen de Sombras/Luces y Ecualizador de tono respecto a la imagen original. +TP_LOCALLAB_REPARTM_TOOLTIP;Permite ajustar la intensidad relativa de la imagen de Mapeo tonal respecto a la imagen original. +TP_LOCALLAB_REPARW_TOOLTIP;Permite ajustar la intensidad relativa de la imagen de Contraste local y Ondículas respecto a la imagen original. +TP_LOCALLAB_RESID;Imagen residual +TP_LOCALLAB_RESIDBLUR;Difuminar imagen residual +TP_LOCALLAB_RESIDCHRO;Cromaticidad Imagen residual +TP_LOCALLAB_RESIDCOMP;Comprimir Imagen residual +TP_LOCALLAB_RESIDCONT;Contraste Imagen residual +TP_LOCALLAB_RESIDHI;Luces +TP_LOCALLAB_RESIDHITHR;Umbral de luces +TP_LOCALLAB_RESIDSHA;Sombras +TP_LOCALLAB_RESIDSHATHR;Umbral de sombras +TP_LOCALLAB_RETI;Eliminación de neblina y Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex puede ser útil para procesar imágenes:\n\n- difuminadas, neblinosas o brumosas (además de la Eliminación de neblina).\n- que contienen grandes diferencias en luminancia.\n\nTambién puede usarse para efectos especiales (mapeo tonal). +TP_LOCALLAB_RETIM;Retinex original +TP_LOCALLAB_RETITOOLFRA;Herramientas Retinex +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;No tiene efectos cuando «Claridad» = 1 u «Oscuridad» = 2.\nPara otros valores, se aplica el último paso del algoritmo «Retinex de escala múltiple» (similar al «contraste local»). Estos 2 cursores, asociados con «Intensidad», permiten hacer ajustes «aguas arriba» del contraste local. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Ajusta los parámetros internos para optimizar la respuesta.\nEs preferible mantener los valores de los «Datos restaurados» cerca de Min=0 y Max=32768 (modo logarítmico), pero es posible usar otros valores. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;El modo Logarítmico introduce más contraste, pero también generará más halos. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Los deslizadores de radio y varianza permiten ajustar la neblina y dirigir los efectos, ya sea al primer plano o al fondo. +TP_LOCALLAB_RETI_SCALE_TOOLTIP;Si Escala=1, Retinex se comporta como el contraste local con posibilidades adicionales.\nEl aumento del valor de Escala aumenta a su vez la intensidad de la acción recursiva, al precio de un mayor tiempo de procesamiento. +TP_LOCALLAB_RET_TOOLNAME;Eliminación de neblina y Retinex - 9 +TP_LOCALLAB_REWEI;Iteraciones de reponderación +TP_LOCALLAB_RGB;Curva tonal RGB +TP_LOCALLAB_RGBCURVE_TOOLTIP;En modo RGB se dispone de 4 valores posibles: Estándar, Estándar ponderado, Luminancia y Similar a película. +TP_LOCALLAB_ROW_NVIS;No visible +TP_LOCALLAB_ROW_VIS;Visible +TP_LOCALLAB_RSTPROTECT_TOOLTIP;La protección de rojo y tonos de piel afecta a los deslizadores de Saturación, Cromaticidad y Colorido. +TP_LOCALLAB_SATUR;Saturación +TP_LOCALLAB_SATURV;Saturación (s) +TP_LOCALLAB_SCALEGR;Escala +TP_LOCALLAB_SCALERETI;Escala +TP_LOCALLAB_SCALTM;Escala +TP_LOCALLAB_SCOPEMASK;Ámbito (ΔE máscara de imagen) +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Activado si ΔE Máscara de imagen está activado.\nLos valores bajos evitan el retoque del área seleccionada. +TP_LOCALLAB_SENSI;Ámbito +TP_LOCALLAB_SENSIEXCLU;Ámbito +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Ajusta los colores a excluir. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Ajuste de ámbito específico de la herramienta de Máscara común.\nActúa sobre la diferencia entre la imagen original y la máscara.\nUsa las referencias de luminancia, cromaticidad y matiz desde el centro del punto RT.\n\nTambién se puede ajustar la ΔE de la propia máscara, usando «Ámbito (ΔE máscara de imagen)» en «Ajustes» > «Máscara y Fusión». +TP_LOCALLAB_SENSI_TOOLTIP;Ajusta el ámbito de la acción:\nLos valores pequeños limitan la acción a colores similares a los del centro del punto.\nLos valores altos permiten a la herramienta actuar sobre un rango más amplio de colores. +TP_LOCALLAB_SETTINGS;Ajustes +TP_LOCALLAB_SH1;Sombras/Luces +TP_LOCALLAB_SH2;Ecualizador +TP_LOCALLAB_SHADEX;Sombras +TP_LOCALLAB_SHADEXCOMP;Compresión de sombras y Ancho tonal +TP_LOCALLAB_SHADHIGH;Sombras/Luces-Ecualizador +TP_LOCALLAB_SHADHMASK_TOOLTIP;Disminuye las luces de la máscara del mismo modo que el algoritmo de sombras/luces. +TP_LOCALLAB_SHADMASK_TOOLTIP;Aumenta las sombras de la máscara del mismo modo que el algoritmo de sombras/luces. +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Ajusta las sombras y luces, ya sea con deslizadores o con un ecualizador de tono.\nSe puede usar junto con el módulo Exposición o en su lugar.\nTambién se puede usar como un filtro graduado. +TP_LOCALLAB_SHAMASKCOL;Sombras +TP_LOCALLAB_SHAPETYPE;Forma del punto RT +TP_LOCALLAB_SHAPE_TOOLTIP;Elipse es el modo normal.\n\nRectángulo puede usarse en ciertos casos, por ejemplo para trabajar en modo de imagen completa, situando los delimitadores fuera del área de vista previa. En este caso, se debe ajustar Transición = 100.\n\nFuturos desarrollos incluirán polígonos y curvas de Bézier. +TP_LOCALLAB_SHARAMOUNT;Cantidad +TP_LOCALLAB_SHARBLUR;Radio de difuminado +TP_LOCALLAB_SHARDAMPING;Amortiguación +TP_LOCALLAB_SHARFRAME;Modificaciones +TP_LOCALLAB_SHARITER;Iteraciones +TP_LOCALLAB_SHARP;Nitidez +TP_LOCALLAB_SHARP_TOOLNAME;Nitidez - 8 +TP_LOCALLAB_SHARRADIUS;Radio +TP_LOCALLAB_SHORTC;Máscara Curvas «L» corto +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Circuito corto de las 2 curvas L(L) y L(H).\nPermite mezclar la imagen actual con la original modificada por la máscara.\nUtilizable con las máscaras 2, 3, 4, 6, 7. +TP_LOCALLAB_SHOWC;Máscara y modificaciones +TP_LOCALLAB_SHOWC1;Fusión de archivos +TP_LOCALLAB_SHOWCB;Máscara y modificaciones +TP_LOCALLAB_SHOWDCT;Mostrar proceso de Fourier (ƒ) +TP_LOCALLAB_SHOWE;Máscara y modificaciones +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplaciana (primero) +TP_LOCALLAB_SHOWLC;Máscara y modificaciones +TP_LOCALLAB_SHOWMASK;Mostrar máscara +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Muestra las máscaras y modificaciones.\nCuidado, sólo se puede ver la máscara de una herramienta a la vez.\n\nMostrar imagen modificada: muestra la imagen modificada incluyendo el efecto de cualesquiera ajustes y máscaras.\n\nMostrar áreas modificadas sin máscara: muestra las modificaciones antes de que se aplique cualquier máscara.\n\nMostrar áreas modificadas con máscara: muestra las modificaciones después de que se ha aplicado una máscara.\n\nMostrar máscara: muestra el aspecto de la máscara incluyendo el efecto de cualquier curva y filtro.\n\nMostrar estructura del punto: permite ver la máscara de detección de estructura cuando el cursor «Estructura del punto» está activo (si está disponible).\n\nNota: La máscara se aplica antes del algoritmo de detección de forma. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Permite visualizar las diferentes etapas del proceso de Fourier:\n\n- Laplace: calcula la segunda derivada de la transformada de Laplace como función del umbral.\n- Fourier: muestra la transformada Laplaciana con DCT.\n- Poisson: muestra la solución de la DCE de Poisson.\n- Sin normalización de luminancia: muestra el resultado sin ninguna normalización de la luminancia. +TP_LOCALLAB_SHOWMASKTYP1;Difuminado y Ruido +TP_LOCALLAB_SHOWMASKTYP2;Reducción de ruido +TP_LOCALLAB_SHOWMASKTYP3;Difuminado y Ruido + Reducción de ruido +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Se puede escoger Máscara y modificaciones.\nDifuminado y ruido: en este caso no se usa para la «Reducción de ruido».\nReducción de ruido: en este caso no se usa para «Difuminado y ruido».\n\nDifuminado y ruido + Reducción de ruido: la máscara se comparte, hay que tener cuidado con «Mostrar modificaciones» y «Ámbito». +TP_LOCALLAB_SHOWMNONE;Mostrar imagen modificada +TP_LOCALLAB_SHOWMODIF;Mostrar áreas modificadas sin máscara +TP_LOCALLAB_SHOWMODIF2;Mostrar áreas modificadas +TP_LOCALLAB_SHOWMODIFMASK;Mostrar áreas modificadas con máscara +TP_LOCALLAB_SHOWNORMAL;Sin normalización de luminancia +TP_LOCALLAB_SHOWPLUS;Máscara y modificaciones (Difuminado y Reducción de ruido) +TP_LOCALLAB_SHOWPOISSON;Poisson (PDE ƒ) +TP_LOCALLAB_SHOWR;Máscara y modificaciones +TP_LOCALLAB_SHOWREF;Vista previa ΔE +TP_LOCALLAB_SHOWS;Máscara y modificaciones +TP_LOCALLAB_SHOWSTRUC;Mostrar estructura del punto (avanzado) +TP_LOCALLAB_SHOWSTRUCEX;Mostrar estructura del punto (avanzado) +TP_LOCALLAB_SHOWT;Máscara y modificaciones +TP_LOCALLAB_SHOWVI;Máscara y modificaciones +TP_LOCALLAB_SHRESFRA;Sombras/Luces y TRC +TP_LOCALLAB_SHTRC_TOOLTIP;Basado en el «perfil de trabajo» (sólo los suministrados), modifica los tonos de la imagen, actuando en una TRC (Curva de respuesta tonal).\n\nLa Gamma actúa principalmente en tonos claros.\n\nLa Pendiente actúa principalmente en tonos oscuros.\n\nSe recomienda que la TRC de los dos dispositivos (monitor y perfil de salida) sea sRGB (predeterminado). +TP_LOCALLAB_SH_TOOLNAME;Sombras/Luces y Ecualizador de tono - 5 +TP_LOCALLAB_SIGFRA;Sigmoide J y Q +TP_LOCALLAB_SIGJZFRA;Sigmoide Jz +TP_LOCALLAB_SIGMAWAV;Respuesta de atenuación +TP_LOCALLAB_SIGMOIDBL;Fusionar +TP_LOCALLAB_SIGMOIDLAMBDA;Contraste +TP_LOCALLAB_SIGMOIDQJ;Usar Q en lugar de J +TP_LOCALLAB_SIGMOIDTH;Umbral (Punto gris) +TP_LOCALLAB_SIGMOID_TOOLTIP;Permite simular una apariencia de mapeo tonal mediante el uso de las dos funciones, «Ciecam» y «Sigmoide».\nSe dispone de tres deslizadores: a) Intensidad acúa en la forma de la curva sigmoide, y en consecuencia en la intensidad; b) Umbral distribute la acción en función de la luminancia; c)Fusionar actúa en el aspecto final de la imagen, el contraste y la luminancia. +TP_LOCALLAB_SLOMASKCOL;Pendiente +TP_LOCALLAB_SLOMASK_TOOLTIP;La Gamma y la Pendiente permiten una transformación de la máscara suave y libre de artefactos, modificando progresivamente «L» para evitar cualquier discontinuidad. +TP_LOCALLAB_SLOSH;Pendiente +TP_LOCALLAB_SOFT;Luz suave y Retinex original +TP_LOCALLAB_SOFTM;Luz suave +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Aplica una mezcla de Luz suave (idéntica al ajuste global). Realiza el «aclarado y quemado» («dodge and burn») usando el algoritmo Retinex original. +TP_LOCALLAB_SOFTRADIUSCOL;Radio suave +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Aplica un filtro guiado a la imagen de salida para reducir posibles artefactos. +TP_LOCALLAB_SOFTRETI;Reducir artefactos ΔE +TP_LOCALLAB_SOFT_TOOLNAME;Luz suave y Retinex original - 6 +TP_LOCALLAB_SOURCE_ABS;Luminancia absoluta +TP_LOCALLAB_SOURCE_GRAY;Luminancia media (Yb%) +TP_LOCALLAB_SPECCASE;Casos específicos +TP_LOCALLAB_SPECIAL;Uso especial de las curvas RGB +TP_LOCALLAB_SPECIAL_TOOLTIP;La casilla de verificación permite quitar todas las demás acciones, como «Ámbito», máscaras, deslizadores, etc. (excepto transiciones), y usar sólo el efecto de la curva tonal RGB. +TP_LOCALLAB_SPOTNAME;Punto nuevo +TP_LOCALLAB_STD;Estándar +TP_LOCALLAB_STR;Intensidad +TP_LOCALLAB_STRBL;Intensidad +TP_LOCALLAB_STREN;Intensidad de compresión +TP_LOCALLAB_STRENG;Intensidad +TP_LOCALLAB_STRENGR;Intensidad +TP_LOCALLAB_STRENGRID_TOOLTIP;Se puede ajustar el efecto deseado con «Intensidad», pero también es posible usar la función de «ámbito», que permite delimitar la acción (por ejemplo, aislar un color particular). +TP_LOCALLAB_STRENGTH;Ruido +TP_LOCALLAB_STRGRID;Intensidad +TP_LOCALLAB_STRUC;Estructura +TP_LOCALLAB_STRUCCOL;Estructura del punto +TP_LOCALLAB_STRUCCOL1;Estructura del punto +TP_LOCALLAB_STRUCT_TOOLTIP;Usa el algoritmo de Sobel para tener en cuenta la estructura en la detección de forma.\n\nPara ver una vista previa de la máscara (sin modificaciones), se debe activar «Máscara y modificaciones» > «Mostrar estructura del punto» (modo avanzado) .\n\nPuede usarse junto con la Máscara de estructura, Máscara de difuminado y «Contraste local (por niveles de ondículas)» para mejorar la detección de bordes.\n\nLos efectos de los ajustes al usar Claridad, Contraste, Cromaticidad, Exposición u otras herramientas no relacionadas con máscaras son visibles usando, ya sea «Mostrar imagen modificada», o «Mostrar áreas modificadas con máscara». +TP_LOCALLAB_STRUMASKCOL;Intensidad de máscara de estructura +TP_LOCALLAB_STRUMASK_TOOLTIP;Máscara de estructura (deslizador) con la casilla «Máscara de estructura como herramienta» desactivada: En este caso se generará una máscara que muestra la estructura, incluso si ninguna de las tres curvas está activada. Las máscaras de estructura están disponibles para la máscara 1 (Difuminado y reducción de ruido) y máscara 7 (Color y Luz). +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;¡Se recomienda el uso moderado de este deslizador! +TP_LOCALLAB_STYPE;Método de forma +TP_LOCALLAB_STYPE_TOOLTIP;Se puede elegir entre:\n\nSimétrico - punto de ajuste izquierdo enlazado con el derecho, punto de ajuste superior enlazado con el inferior.\n\nIndependiente - todos los puntos de ajuste son independientes. +TP_LOCALLAB_SYM;Simétrico (ratón) +TP_LOCALLAB_SYMSL;Simétrico (ratón + deslizadores) +TP_LOCALLAB_TARGET_GRAY;Luminancia media (Yb%) +TP_LOCALLAB_THRES;Umbral de estructura +TP_LOCALLAB_THRESDELTAE;Umbral de ámbito ΔE +TP_LOCALLAB_THRESRETI;Umbral +TP_LOCALLAB_THRESWAV;Umbral de balance +TP_LOCALLAB_TLABEL;Datos TM Min=%1 Max=%2 Media=%3 Sigma=%4 (Umbral) +TP_LOCALLAB_TLABEL_TOOLTIP;Resultado del Mapa de transmisión.\nLa Varianza usa Min y Max.\nTm=Min TM=Max del Mapa de transmisión.\nSe pueden normalizar los resultados con el deslizador de umbral. +TP_LOCALLAB_TM;Mapeo tonal +TP_LOCALLAB_TM_MASK;Usar el mapa de transmisión +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;Este deslizador afecta a la sensibilidad a bordes.\nCuanto mayor sea el valor, con mayor probabilidad se interpretará un cambio en el contraste como un «borde».\nSi se pone a cero, el mapeo tonal tendrá un efecto similar a la Máscara de nitidez. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;El deslizador Gamma desplaza el efecto del mapeo tonal, ya sea hacia las sombras o hacia las luces. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;En algunos casos, el mapeo tonal puede producir una apariencia caricaturesca, y en algunos casos raros, pueden aparecer halos suaves pero amplios.\nEl incremento del número de iteraciones de reponderación ayudará a contrarrestar algunos de estos problemas. +TP_LOCALLAB_TONEMAP_TOOLTIP;Igual que la herramienta Mapeo tonal del menú principal.\nLa herramienta del menú principal debe estar desactivada si se usa esta herramienta. +TP_LOCALLAB_TONEMASCALE_TOOLTIP;Este deslizador permite ajustar la transición entre el contraste «local» y «global».\nCuanto mayor sea el valor, mayor tendrá que ser un detalle para que sea amplificado. +TP_LOCALLAB_TONE_TOOLNAME;Mapeo tonal - 4 +TP_LOCALLAB_TOOLCOL;Máscara de estructura como herramienta +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Permite modificar la máscara, si existe. +TP_LOCALLAB_TOOLMASK;Herramientas con máscara +TP_LOCALLAB_TOOLMASK_2;Ondículas +TP_LOCALLAB_TOOLMASK_TOOLTIP;Máscara de estructura (deslizador) con la casilla «Máscara de estructura como herramienta» marcada: en este caso se generará una máscara que muestra la estructura, después de que se hayan modificado una o ambas curvas L(L) o LC(H).\nAquí, la «Máscara de estructura» se comporta como las demás herramientas con máscara: Gamma, Pendiente, etc.\nPermite variar la acción sobre la máscara en función de la estructura de la imagen. +TP_LOCALLAB_TRANSIT;Gradiente de transición +TP_LOCALLAB_TRANSITGRAD;Diferenciación de la transición XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Permite variar la transición en el eje y. +TP_LOCALLAB_TRANSITVALUE;Valor de transición +TP_LOCALLAB_TRANSITWEAK;Decaimiento de la transición (lineal-log) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Ajusta la función de decaimiento de la transición: 1 lineal , 2 parabólica, 3 cúbica hasta ^25.\nPuede usarse junto con valores muy bajos de transición para reducir defectos (Contraste por niveles de detalles, Ondículas, Color y Luz). +TP_LOCALLAB_TRANSIT_TOOLTIP;Ajusta la suavidad de la transición entre zonas afectadas y no afectadas como un porcentaje del «radio». +TP_LOCALLAB_TRANSMISSIONGAIN;Ganancia de transmisión +TP_LOCALLAB_TRANSMISSIONMAP;Mapa de transmisión +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmisión en función de la transmisión.\nAbscisa: transmisión desde valores negativos (mín.), media, y valores positivos (máx.).\nOrdenada: amplificación o reducción.\nSe puede ajustar esta curva para cambiar la Transmisión y reducir artefactos. +TP_LOCALLAB_USEMASK;Laplaciana +TP_LOCALLAB_VART;Varianza (contraste) +TP_LOCALLAB_VIBRANCE;Vivacidad y Cálido/Frío +TP_LOCALLAB_VIBRA_TOOLTIP;Ajusta la vivacidad (esencialmente igual que el ajuste global).\nRealiza el equivalente a un ajuste de balance de blancos usando un algoritmo CIECAM. +TP_LOCALLAB_VIB_TOOLNAME;Vivacidad y Cálido/Frío - 3 +TP_LOCALLAB_VIS_TOOLTIP;Clic para mostrar/ocultar el punto de control seleccionado.\nCtrl+clic para mostrar/ocultar todos los puntos de control. +TP_LOCALLAB_WARM;Cálido/Frío y Artefactos de color +TP_LOCALLAB_WARM_TOOLTIP;Este deslizador usa el algoritmo CIECAM y actúa como un control de Balance de blancos para hacer que la temperatura de color del área seleccionada sea más cálida o más fría.\nEn algunos casos también puede reducir los artefactos de color. +TP_LOCALLAB_WASDEN_TOOLTIP;Reducción de ruido de luminancia: el lado izquierdo de la curva, incluyendo la frontera gris oscuro/gris claro, corresponde a los tres primeros niveles 0, 1, 2 (detalle fino). El lado derecho de la curva corresponde a los detalles más gruesos (niveles 3, 4, 5, 6). +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Equilibra la acción dentro de cada nivel. +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;El ajuste predeterminado de difuminado afecta a los tres componentes de L*a*b* (luminancia y color).\nSi se activa, sólo se difuminará la luminancia. +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;«Fusionar cromaticidad» se usa para seleccionar la intensidad del efecto deseado sobre la cromaticidad. +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;«Fusionar luminancia» se usa para seleccionar la intensidad del efecto deseado sobre la luminancia. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;«Niveles de cromaticidad»: ajusta los componentes «a» y «b» de L*a*b* como una proporción del valor de la luminancia. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;El desplazamiento modifica el balance entre detalles de bajo y alto contraste.\n\nLos valores altos amplificarán cambios de contraste hacia detalles de mayor contraste, mientras que los valores bajos amplificarán cambios de contraste hacia detalles de bajo contraste.\n\nEl uso de “Respuesta de atenuación” permite seleccionar qué valores de contraste se intensificarán. +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;Moviendo el deslizador hacia la izquierda, se acentúan los valores bajos. Hacia la derecha, los valores bajos se reducen y los altos se acentúan. +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;La imagen residual se comporta de la misma manera que la imagen principal al hacer ajustes de contraste, cromaticidad, etc. +TP_LOCALLAB_WAT_GRADW_TOOLTIP;Cuanto más se mueva el deslizador hacia la derecha, más efectivo será el algoritmo de detección, y menos se notarán los efectos del contraste local. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Contraste local de bajo a alto de izquierda a derecha en el eje «x».\nAumenta o disminuye el contraste local en el eje «y». +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;Se puede ajustar la distribución del Contraste local por niveles de ondícula en función de la intensidad inicial del contraste. Esto modificará los efectos de perspectiva y relieve en la imagen, y/o reducirá los valores de contraste para valores iniciales de contraste muy bajos. +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;«Fusionar sólo con la imagen original» evita que los ajustes de «Pirámide de ondículas» interfieran con «Claridad» y «Máscara de nitidez». +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Difumina la imagen residual, independientemente de los niveles. +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Comprime la imagen residual para aumentar o reducir el contraste. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;El efecto del ajuste de contraste local es más intenso en detalles de contraste medio, y más débil en detalles de alto y bajo contraste.\n\nEste deslizador controla la rapidez de amortiguación del efecto hacia contrastes extremos.\n\nCuanto mayor sea el valor del deslizador, más amplio será el rango de contrastes que recibirán el efecto íntegro del ajuste de contraste local, y mayor será el riesgo de generar artefactos.\n\nCuanto menor sea el valor, más se dirigirá el efecto hacia un rango estrecho de valores de contraste. +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensidad de detección de efecto de bordes. +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Permite variar el contraste local en función de un gradiente y ángulo seleccionados. Se tiene en cuenta la variación de la señal de luminancia, y no la luminancia en sí. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Rango de niveles de ondículas usado en todo el módulo «Ondículas». +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Permite difuminar cada nivel de descomposición.\nLos niveles del más fino al más grueso están dispuestos de izquierda a derecha. +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar a Contraste por niveles de detalle. Niveles de detalle de fino a grueso de izquierda a derecha en el eje «x». +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Actúa sobre el balance de las tres direcciones (horizontal, vertical y diagonal) en función de la luminancia de la imagen.\nDe forma predeterminada, las sombras y las luces se reducen para evitar artefactos. +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Muestra todas las herramientas de «Nitidez en bordes». Es aconsejable leer la documentación de Niveles de ondículas. +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Permite ajustar el efecto máximo de difuminado en los niveles. +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Contraste de bajo a alto de izquierda a derecha en el eje «x».\nAumenta o disminuye el contraste local en el eje «y». +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;La parte baja (negativa) comprime cada nivel de descomposición, creando un efecto de mapeo tonal.\nLa parte superior (positiva) atenúa el contraste por nivel.\nLos niveles de descomposición de más fino a más grueso están dispuestos de izquierda a derecha en el eje «x». +TP_LOCALLAB_WAV;Contraste local +TP_LOCALLAB_WAVBLUR_TOOLTIP;Permite difuminar cada nivel de la descomposición, así como la imagen residual. +TP_LOCALLAB_WAVCOMP;Compresión por nivel +TP_LOCALLAB_WAVCOMPRE;Compresión por nivel +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Permite aplicar mapeo tonal o reducir el contraste local en niveles individuales.\nLos niveles de detalle de más fino a más grueso están dispuestos de izquierda a derecha en el eje «x». +TP_LOCALLAB_WAVCOMP_TOOLTIP;Permite aplicar contraste local en función de la dirección de la descomposición de ondículas: horizontal, vertical, diagonal. +TP_LOCALLAB_WAVCON;Contraste por nivel +TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar a Contraste por niveles de detalle. Niveles de detalle de fino a grueso de izquierda a derecha del eje X. +TP_LOCALLAB_WAVDEN;Reducción de ruido de luminancia por nivel +TP_LOCALLAB_WAVE;Ψ Ondículas +TP_LOCALLAB_WAVEDG;Contraste local +TP_LOCALLAB_WAVEEDG_TOOLTIP;Mejora la nitidez dirigiendo la acción del contraste local a los bordes. Tiene las mismas funciones que el módulo correspondiente en Niveles de ondículas, y usa los mismos ajustes. +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Rango de niveles de ondículas usado en «Contraste local (por niveles de ondículas)». +TP_LOCALLAB_WAVGRAD_TOOLTIP;Permite variar el contraste local en función de un gradiente y ángulo seleccionados. Se tiene en cuenta la variación de la señal de luminancia, y no la luminancia en sí. +TP_LOCALLAB_WAVHUE_TOOLTIP;Permite reducir o aumentar la reducción de ruido en función del matiz. +TP_LOCALLAB_WAVLEV;Difuminado por nivel +TP_LOCALLAB_WAVMASK;Ψ Contraste local (por niveles de ondículas) +TP_LOCALLAB_WAVMASK_TOOLTIP;Utiliza ondículas para modificar el contraste local de la máscara y reforzar o reducir la estructura (piel, edificios...). +TP_LOCALLAB_WEDIANHI;Mediana alta +TP_LOCALLAB_WHITE_EV;Ev Blanco +TP_LOCALLAB_ZCAMFRA;Ajustes de imagen ZCAM +TP_LOCALLAB_ZCAMTHRES;Recuperar datos altos +TP_LOCAL_HEIGHT;Abajo +TP_LOCAL_HEIGHT_T;Arriba +TP_LOCAL_WIDTH;Derecha +TP_LOCAL_WIDTH_L;Izquierda +TP_LOCRETI_METHOD_TOOLTIP;Bajo = Refuerza la luz baja.\nUniforme = Distribuido uniformemente.\nAlto = Refuerza la luz fuerte. +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_TOOLTIP;Reinicia los deslizadores de exposición a valores neutros.\nActúa sobre los mismos controles que Niveles automáticos, independientemente de si se ha usado Niveles automáticos o no. +TP_PCVIGNETTE_FEATHER;Anchura de gradiente +TP_PCVIGNETTE_FEATHER_TOOLTIP;Anchura de gradiente:\n0 = sólo en las esquinas,\n50 = hasta mitad de camino al centro,\n100 = hasta el centro. +TP_PCVIGNETTE_LABEL;Filtro de viñeteado +TP_PCVIGNETTE_ROUNDNESS;Redondez +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Redondez:\n0 = rectángulo,\n50 = elipse encajada,\n100 = círculo. +TP_PCVIGNETTE_STRENGTH;Intensidad +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Intensidad del filtro en pasos (alcanzados en las esquinas). +TP_PDSHARPENING_LABEL;Nitidez en captura +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Factor de recorte de sensor +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Longitud focal +TP_PERSPECTIVE_CAMERA_FRAME;Corrección +TP_PERSPECTIVE_CAMERA_PITCH;Vertical +TP_PERSPECTIVE_CAMERA_ROLL;Rotación +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Desplazamiento horizontal +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Desplazamiento vertical +TP_PERSPECTIVE_CAMERA_YAW;Horizontal +TP_PERSPECTIVE_CONTROL_LINES;Líneas de control +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+arrastrar: Dibuja una nueva línea\nClic derecho: Borra línea +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;Se necesitan al menos dos líneas horizontales o dos verticales. +TP_PERSPECTIVE_HORIZONTAL;Horizontal +TP_PERSPECTIVE_LABEL;Perspectiva +TP_PERSPECTIVE_METHOD;Método +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Basado en cámara +TP_PERSPECTIVE_METHOD_SIMPLE;Simple +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Ajuste post-corrección +TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotación +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Desplazamiento horizontal +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Desplazamiento vertical +TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +TP_PERSPECTIVE_RECOVERY_FRAME;Recuperación +TP_PERSPECTIVE_VERTICAL;Vertical +TP_PFCURVE_CURVEEDITOR_CH;Matiz +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controla la intensidad de eliminación de borde púrpura por colores.\nMás alto = más,\nMás bajo = menos. +TP_PREPROCESS_DEADPIXFILT;Filtro de píxel muerto +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Trata de suprimir los píxels muertos. +TP_PREPROCESS_GREENEQUIL;Equilibrado de verdes +TP_PREPROCESS_HOTPIXFILT;Filtro de píxel caliente +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Trata de suprimir los píxels 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;Ambas +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal sólo en líneas de autofoco por diferencia de fase +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +TP_PREPROCESS_NO_FOUND;No encontrado +TP_PREPROCESS_PDAFLINESFILTER;Filtro de líneas de autofoco por diferencia de fase +TP_PREPROCWB_LABEL;Preprocesado de balance de blancos +TP_PREPROCWB_MODE;Modo +TP_PREPROCWB_MODE_AUTO;Automático +TP_PREPROCWB_MODE_CAMERA;Cámara +TP_PRSHARPENING_LABEL;Nitidez tras cambio de tamaño +TP_PRSHARPENING_TOOLTIP;Aumenta la nitidez de la imagen tras un cambio de tamaño. Sólo funciona cuando se usa el método de cambio de tamaño «Lanczos». No es posible ver los efectos de esta herramienta en la vista previa. Consúltese RawPedia para ver las instrucciones de uso. +TP_RAWCACORR_AUTO;Auto-corrección +TP_RAWCACORR_AUTOIT;Iteraciones +TP_RAWCACORR_AUTOIT_TOOLTIP;Este ajuste está disponible si está marcada la casilla «Auto-corrección».\n\nLa Auto-corrección es conservadora, en el sentido de que a menudo no corrige toda la aberración cromática.\n\nPara corregir la aberración cromática residual, se pueden usar hasta cinco iteraciones de corrección automática de aberración cromática.\n\nCada iteración reducirá la aberración cromática residual de la iteración anterior, al coste de un mayor tiempo de procesamiento. +TP_RAWCACORR_AVOIDCOLORSHIFT;Evitar la deriva de colores +TP_RAWCACORR_CABLUE;Azul +TP_RAWCACORR_CARED;Rojo +TP_RAWCACORR_LABEL;Corrección de aberración cromática +TP_RAWEXPOS_BLACK_0;Verde 1 (principal) +TP_RAWEXPOS_BLACK_1;Rojo +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;Rojo +TP_RAWEXPOS_LINEAR;Corrección de punto blanco +TP_RAWEXPOS_RGB;Rojo, Verde, Azul +TP_RAWEXPOS_TWOGREEN;Vincular verdes +TP_RAW_1PASSMEDIUM;1 paso (Markesteijn) +TP_RAW_2PASS;1 paso + rápido +TP_RAW_3PASSBEST;3 pasos (Markesteijn) +TP_RAW_4PASS;3 pasos + rápido +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+Bilineal +TP_RAW_AMAZEVNG4;AMaZE + VNG4 +TP_RAW_BORDER;Borde +TP_RAW_DCB;DCB +TP_RAW_DCBBILINEAR;DCB+Bilineal +TP_RAW_DCBENHANCE;Mejora de DCB +TP_RAW_DCBITERATIONS;Número de iteraciones de DCB +TP_RAW_DCBVNG4;DCB + VNG4 +TP_RAW_DMETHOD;Método +TP_RAW_DMETHOD_PROGRESSBAR;%1 desentramando... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Refinado de desentramado... +TP_RAW_DMETHOD_TOOLTIP;Nota: IGV y LMMSE están dedicados a imágenes de ISO alta para ayudar a la reducción de ruido sin generar patrones en laberinto, posterización o un aspecto descolorido.\nPixel Shift es para archivos Pixel Shift de cámaras Pentax/Sony. El método de desentramado se cambia a AMaZE para archivos no Pixel Shift. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Umbral automático +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Si la casilla está activada (recomendado), RawTherapee calcula un valor óptimo basándose en regiones planas de la imagen.\nSi no hay regiones planas en la imagen, o ésta es muy ruidosa, el valor se pondrá a cero.\nPara ajustar el valor manualmente, debe desmarcarse primero la casilla (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 falso color +TP_RAW_FAST;Rápido +TP_RAW_HD;Umbral +TP_RAW_HD_TOOLTIP;Los valores bajos hacen más agresiva la detección de píxels muertos/calientes, pero los falsos positivos pueden dar lugar a artefactos. Si se observa la aparición de cualquier artefacto al activar el filtro de píxel muerto/caliente, debe incrementarse gradualmente el umbral hasta que desaparezcan. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Sub-imagen +TP_RAW_IMAGENUM_SN;Modo SN +TP_RAW_IMAGENUM_TOOLTIP;Ciertos archivos raw constan de varias sub-imágenes (Pixel Shift de Pentax/Sony, 3 en 1 HDR de Pentax, Dual Pixel de Canon).\n\nSi se usa cualquier método de desentramado distinto de Pixel Shift, esto selecciona qué sub-imagen se usará.\n\nSi se usa el método de desentramado Pixel Shift en un raw Pixel Shift, se usarán todas las sub-imágenes, y esto selecciona qué sub-imagen deberá usarse para objetos móviles. +TP_RAW_LABEL;Desentramado +TP_RAW_LMMSE;LMMSE +TP_RAW_LMMSEITERATIONS;Pasos de mejora LMMSE +TP_RAW_LMMSE_TOOLTIP;Añade gamma (paso 1), mediana (pasos 2-4) y refinado (pasos 5-6) para reducir los artefactos y mejorar la relación señal-ruido. +TP_RAW_MONO;Mono +TP_RAW_NONE;Ninguno (muestra el patrón del sensor) +TP_RAW_PIXELSHIFT;Pixel Shift +TP_RAW_PIXELSHIFTAVERAGE;Usar promedio para objetos en movimiento +TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Se usa el promedio de todas las tomas en lugar de la toma seleccionada para regiones con movimiento.\nCrea un efecto de movimiento en objetos que se mueven lentamente (se superponen). +TP_RAW_PIXELSHIFTBLUR;Difuminar máscara de movimiento +TP_RAW_PIXELSHIFTDMETHOD;Método de desentramado para el movimiento +TP_RAW_PIXELSHIFTEPERISO;Sensibilidad +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;El valor predeterminado de 0 debería funcionar bien para la ISO base.\nLos valores mayores aumentan la sensibilidad de detección de movimiento.\nEl valor debe cambiarse en pasos pequeños mientras se observan los cambios en la máscara de movimiento.\nPara imágenes subexpuestas o de ISO alta se debe aumentar la sensibilidad. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Ecualizar brillo de las tomas +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Ecualizar por canal +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Activado: Ecualiza los canales RGB individualmente.\nDesactivado: Usa el mismo factor de ecualización para todos los canales. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Ecualiza el brillo de las tomas al brillo de la toma seleccionada.\nSi hay áreas sobreexpuestas en las tomas, se debe seleccionar la toma más brillante para evitar una dominante magenta en las áreas sobreexpuestas, o bien activar la corrección de movimiento. +TP_RAW_PIXELSHIFTGREEN;Comprobar si hay movimiento en el canal verde +TP_RAW_PIXELSHIFTHOLEFILL;Rellenar huecos en la máscara de movimiento +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Rellena huecos en la máscara de movimiento. +TP_RAW_PIXELSHIFTMEDIAN;Usar mediana para zonas con movimiento +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Usa la mediana de todas las tomas en lugar de la toma seleccionada para regiones con movimiento.\nElimina objetos situados en lugares diferentes en las diversas tomas.\nGenera efecto de movimiento en objetos de movimiento lento (superpuestos). +TP_RAW_PIXELSHIFTMM_AUTO;Automático +TP_RAW_PIXELSHIFTMM_CUSTOM;Personalizado +TP_RAW_PIXELSHIFTMM_OFF;Desactivado +TP_RAW_PIXELSHIFTMOTIONMETHOD;Corrección de movimiento +TP_RAW_PIXELSHIFTNONGREENCROSS;Comprobar si hay movimiento en los canales rojo/azul +TP_RAW_PIXELSHIFTSHOWMOTION;Mostrar la máscara de movimiento +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Mostrar sólo la máscara de movimiento +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Muestra la máscara de movimiento sin la imagen. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Superpone una máscara verde a la imagen, que muestra las regiones con movimiento. +TP_RAW_PIXELSHIFTSIGMA;Radio de difuminado +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;El radio predeterminado de 1.0 normalmente se adapta bien a la ISO base.\nPara tomas con ISO alta debe aumentarse el valor. 5.0 es un buen punto de partida.\nDebe observarse la máscara de movimiento mientras se cambia el valor. +TP_RAW_PIXELSHIFTSMOOTH;Suavizar las transiciones +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Suaviza las transiciones entre áreas con y sin movimiento.\nPara desactivar el suavizado de las transiciones, el valor se ajusta a 0.\nPara obtener, o bien el resultado de AMaZE/LMMSE de la toma seleccionada (en función de si «Usar LMMSE» está seleccionado o no), o bien la mediana de las cuatro tomas si está seleccionado «Usar mediana», el valor se ajusta a 1. +TP_RAW_RCD;RCD +TP_RAW_RCDBILINEAR;RCD+Bilineal +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Sensor con matriz Bayer +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;El método de 3 pasos da los mejores resultados (recomendado para imágenes de ISO baja).\nEl método de 1 paso es casi indistinguible del de 3 pasos para imágenes de ISO alta y es más rápido.\n+rápido genera menos artefactos en zonas planas. +TP_RAW_SENSOR_XTRANS_LABEL;Sensor con matriz X-Trans +TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;X-Trans rápido +TP_RESIZE_ALLOW_UPSCALING;Permitir aumento de tamaño +TP_RESIZE_APPLIESTO;Se aplica a: +TP_RESIZE_CROPPEDAREA;Área recortada +TP_RESIZE_FITBOX;Rectángulo límite +TP_RESIZE_FULLIMAGE;Imagen completa +TP_RESIZE_H;Altura: +TP_RESIZE_HEIGHT;Altura +TP_RESIZE_LABEL;Cambio de tamaño +TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_LE;Lado largo: +TP_RESIZE_LONG;Lado largo +TP_RESIZE_METHOD;Método: +TP_RESIZE_NEAREST;El más cercano +TP_RESIZE_SCALE;Escala +TP_RESIZE_SE;Lado corto: +TP_RESIZE_SHORT;Lado corto +TP_RESIZE_SPECIFY;Especificar: +TP_RESIZE_W;Anchura: +TP_RESIZE_WIDTH;Anchura +TP_RETINEX_CONTEDIT_HSL;Histograma HSL +TP_RETINEX_CONTEDIT_LAB;Histograma L*a*b* +TP_RETINEX_CONTEDIT_LH;Matiz +TP_RETINEX_CONTEDIT_MAP;Ecualizador +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminancia en función de la luminancia L=f(L)\nCorrige datos raw para reducir halos y artefactos. +TP_RETINEX_CURVEEDITOR_LH;Intensidad=f(H) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Intensidad en función del matiz Intensidad=f(H)\nEsta curva también actúa en la cromaticidad cuando se usa el método de retinex «Luces». +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 máscara de ondículas.\n¡Cuidado con los artefactos! +TP_RETINEX_EQUAL;Ecualizador +TP_RETINEX_FREEGAMMA;Gamma libre +TP_RETINEX_GAIN;Ganancia +TP_RETINEX_GAINOFFS;Ganancia y desplazamiento (brillo) +TP_RETINEX_GAINTRANSMISSION;Ganancia de transmisión +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplifica o reduce el mapa de transmisión para conseguir la luminancia deseada.\nEl eje x es la transmisión.\nEl eje y es la ganancia. +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 tonos aplicando la gamma antes y después de Retinex. Es diferente de las curvas Retinex u otras (L*a*b*, Exposición, etc.). +TP_RETINEX_GRAD;Gradiente de transmisión +TP_RETINEX_GRADS;Gradiente de intensidad +TP_RETINEX_GRADS_TOOLTIP;Si el deslizador está a 0, todas las iteraciones son idénticas.\nSi es > 0, la Intensidad se reduce al incrementarse las iteraciones, y viceversa. +TP_RETINEX_GRAD_TOOLTIP;Si el deslizador está a 0, todas las iteraciones son idénticas.\nSi es > 0, la Varianza y el Umbral se reducen al incrementarse las iteraciones, y viceversa. +TP_RETINEX_HIGH;Alto +TP_RETINEX_HIGHLIG;Luces +TP_RETINEX_HIGHLIGHT;Umbral de luces +TP_RETINEX_HIGHLIGHT_TOOLTIP;Aumenta la acción del algoritmo Alto.\nPuede ser necesario reajustar «Píxels vecinos» e incrementar la «Corrección de punto blanco» en la pestaña Raw -> herramienta Puntos de blanco Raw. +TP_RETINEX_HSLSPACE_LIN;HSL-Lineal +TP_RETINEX_HSLSPACE_LOG;HSL-Logarítmico +TP_RETINEX_ITER;Iteraciones (Mapeo tonal) +TP_RETINEX_ITERF;Mapeo tonal +TP_RETINEX_ITER_TOOLTIP;Simula un operador de mapeo tonal.\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 +TP_RETINEX_MAP_GAUS;Máscara gaussiana +TP_RETINEX_MAP_MAPP;Máscara de nitidez (ondícula parcial) +TP_RETINEX_MAP_MAPT;Máscara de nitidez (ondícula total) +TP_RETINEX_MAP_METHOD_TOOLTIP;Usa la máscara generada por la función Gaussiana (Radio, Método) para reducir halos y artefactos.\n\nSólo curva: aplica una curva de contraste diagonal a la máscara. ¡Cuidado con los artefactos!\n\nMáscara gaussiana: genera y usa un difuminado Gaussiano sobre la máscara original. Es un método rápido.\n\nMáscara de nitidez: genera y usa una ondícula sobre la máscara original. Es un método lento. +TP_RETINEX_MAP_NONE;Ninguno +TP_RETINEX_MEDIAN;Filtro de mediana de transmisión +TP_RETINEX_METHOD;Método +TP_RETINEX_METHOD_TOOLTIP;Bajo = Refuerza la luz baja.\nUniforme = Ecualiza la acción.\nAlto = Refuerza la luz intensa.\nLuces = Elimina el magenta en las luces. +TP_RETINEX_MLABEL;Datos restaurados Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;Los valores deberían estar cerca de min=0 max=32768 (modo logarítmico), pero son posibles otros valores. Se puede ajustar «Recortar datos restaurados (ganancia)» y «Desplazamiento» para normalizar.\nRecupera los datos de la imagen sin mezclar. +TP_RETINEX_NEIGHBOR;Radio +TP_RETINEX_NEUTRAL;Reiniciar +TP_RETINEX_NEUTRAL_TOOLTIP;Reinicia todos los deslizadores y curvas a sus valores predeterminados. +TP_RETINEX_OFFSET;Desplazamiento (brillo) +TP_RETINEX_SCALES;Gradiente gaussiano +TP_RETINEX_SCALES_TOOLTIP;Si el deslizador está a 0, todas las iteraciones son idénticas.\nSi es > 0, la Escala y el Radio se reducen al incrementarse las iteraciones, y viceversa. +TP_RETINEX_SETTINGS;Ajustes +TP_RETINEX_SKAL;Escala +TP_RETINEX_SLOPE;Pendiente libre de gamma +TP_RETINEX_STRENGTH;Intensidad +TP_RETINEX_THRESHOLD;Umbral +TP_RETINEX_THRESHOLD_TOOLTIP;Limita la entrada/salida.\nEntrada = imagen origen,\nSalida = imagen gaussiana. +TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Media=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Efectiva Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Resultado del mapa de transmisión.\nMin y Max son utilizados por la Varianza.\nTm=Min TM=Max del mapa de transmisión.\nSe pueden normalizar los resultados con el deslizador de umbral. +TP_RETINEX_TRANF;Transmisión +TP_RETINEX_TRANSMISSION;Mapa de transmisión +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmisión en función de la transmisión.\nAbscisas: transmisión desde valores negativos (min), media, y valores positivos (max).\nOrdenadas: amplificación o reducción. +TP_RETINEX_UNIFORM;Uniforme +TP_RETINEX_VARIANCE;Contraste +TP_RETINEX_VARIANCE_TOOLTIP;Una varianza baja aumenta el contraste local y la saturación, pero puede producir artefactos. +TP_RETINEX_VIEW;Proceso +TP_RETINEX_VIEW_MASK;Máscara +TP_RETINEX_VIEW_METHOD_TOOLTIP;Estándar - Vista normal.\nMáscara - Muestra la máscara.\nMáscara de nitidez - Muestra la imagen con una máscara de nitidez de radio alto.\nTransmisión - Auto/Fija - Muestra el archivo de mapa de transmisión, antes de cualquier acción sobre el contraste y el brillo.\n\nAtención: la máscara no corresponde a la realidad, pero se amplifica para hacerla más visible. +TP_RETINEX_VIEW_NONE;Estándar +TP_RETINEX_VIEW_TRAN;Transmisión - Auto +TP_RETINEX_VIEW_TRAN2;Transmisión - Fijo +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 luminosidad +TP_RGBCURVES_LUMAMODE_TOOLTIP;Modo de luminosidad permite variar la contribución de los canales R, G y B a la luminosidad de la imagen, sin alterar el color de la imagen. +TP_RGBCURVES_RED;R +TP_ROTATE_DEGREE;Grados +TP_ROTATE_LABEL;Rotación +TP_ROTATE_SELECTLINE;Seleccionar línea recta +TP_SAVEDIALOG_OK_TOOLTIP;Atajo de teclado: Ctrl-Intro +TP_SHADOWSHLIGHTS_HIGHLIGHTS;Luces +TP_SHADOWSHLIGHTS_HLTONALW;Anchura tonal de las luces +TP_SHADOWSHLIGHTS_LABEL;Sombras/Luces +TP_SHADOWSHLIGHTS_RADIUS;Radio +TP_SHADOWSHLIGHTS_SHADOWS;Sombras +TP_SHADOWSHLIGHTS_SHTONALW;Anchura tonal de las sombras +TP_SHARPENEDGE_AMOUNT;Cantidad +TP_SHARPENEDGE_LABEL;Bordes +TP_SHARPENEDGE_PASSES;Iteraciones +TP_SHARPENEDGE_THREE;Sólo luminancia +TP_SHARPENING_AMOUNT;Cantidad +TP_SHARPENING_BLUR;Radio de difuminado +TP_SHARPENING_CONTRAST;Umbral de contraste +TP_SHARPENING_EDRADIUS;Radio +TP_SHARPENING_EDTOLERANCE;Tolerancia a bordes +TP_SHARPENING_HALOCONTROL;Control de halo +TP_SHARPENING_HCAMOUNT;Cantidad +TP_SHARPENING_ITERCHECK;Auto limitar iteraciones +TP_SHARPENING_LABEL;Nitidez +TP_SHARPENING_METHOD;Método +TP_SHARPENING_ONLYEDGES;Nitidez sólo en bordes +TP_SHARPENING_RADIUS;Radio +TP_SHARPENING_RADIUS_BOOST;Aumento del Radio en las esquinas +TP_SHARPENING_RLD;Deconvolución RL +TP_SHARPENING_RLD_AMOUNT;Cantidad +TP_SHARPENING_RLD_DAMPING;Amortiguación +TP_SHARPENING_RLD_ITERATIONS;Iteraciones +TP_SHARPENING_THRESHOLD;Umbral +TP_SHARPENING_USM;Máscara de nitidez +TP_SHARPENMICRO_AMOUNT;Cantidad +TP_SHARPENMICRO_CONTRAST;Umbral de contraste +TP_SHARPENMICRO_LABEL;Microcontraste +TP_SHARPENMICRO_MATRIX;Matriz 3x3 en lugar de 5x5 +TP_SHARPENMICRO_UNIFORMITY;Uniformidad +TP_SOFTLIGHT_LABEL;Luz suave +TP_SOFTLIGHT_STRENGTH;Intensidad +TP_SPOT_COUNTLABEL;%1 punto(s) +TP_SPOT_DEFAULT_SIZE;Tamaño predeterminado del punto +TP_SPOT_ENTRYCHANGED;Punto cambiado +TP_SPOT_HINT;Púlsese este botón para operar en la vista previa.\n\nPara editar un punto, se acerca el cursor del ratón a la marca blanca que localiza un área editada, lo que hace aparecer la geometría de edición.\n\nPara añadir un punto, se pulsa Ctrl y clic izquierdo, se arrastra el círculo (se puede soltar la tecla Ctrl) a una ubicación de origen, y a continuación se suelta el botón del ratón.\n\nPara mover el punto origen o destino, se acerca el cursor del ratón a su centro y se arrastra.\n\nEl tamaño del círculo interior (área de máximo efecto) y del círculo de «degradado» puede cambiarse acercando el cursor del ratón (el círculo cambia a naranja) y arrastrándolo (el círculo cambia a rojo).\n\nTras finalizar los cambios, el modo de Edición de puntos se termina haciendo clic derecho fuera de cualquier punto, o haciendo clic de nuevo en este botón. +TP_SPOT_LABEL;Eliminación de manchas +TP_TM_FATTAL_AMOUNT;Cantidad +TP_TM_FATTAL_ANCHOR;Anclaje +TP_TM_FATTAL_LABEL;Compresión de rango dinámico +TP_TM_FATTAL_THRESHOLD;Detalle +TP_VIBRANCE_AVOIDCOLORSHIFT;Evitar la deriva de colores +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tonos de piel +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rojo/Púrpura +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Rojo +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Rojo/Amarillo +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Amarillo +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Matiz en función del matiz H=f(H) +TP_VIBRANCE_LABEL;Vivacidad +TP_VIBRANCE_PASTELS;Tonos pastel +TP_VIBRANCE_PASTSATTOG;Vincular tonos pastel y saturados +TP_VIBRANCE_PROTECTSKINS;Proteger tonos de piel +TP_VIBRANCE_PSTHRESHOLD;Umbral entre tonos pastel/saturados +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Umbral de saturación +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;El eje vertical representa los tonos pastel en la parte inferior y los tonos saturados en la superior.\nEl eje horizontal representa el rango de saturación. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Ponderación de la transición entre pastel y saturado +TP_VIBRANCE_SATURATED;Tonos saturados +TP_VIGNETTING_AMOUNT;Cantidad +TP_VIGNETTING_CENTER;Centro +TP_VIGNETTING_CENTER_X;Centro X +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;Se aplica a +TP_WAVELET_AVOID;Evitar la deriva de colores +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 diag./vert.-horiz. +TP_WAVELET_BALANCE_TOOLTIP;Altera el balance entre las direcciones de las ondículas: vertical-horizontal y diagonal.\nSi están activados el contraste, la cromaticidad o el mapeo tonal residual, el efecto del balance se amplifica. +TP_WAVELET_BALCHRO;Balance de cromaticidad +TP_WAVELET_BALCHROM;Ecualizador reducc. ruido Azul-amarillo/Rojo-verde +TP_WAVELET_BALCHRO_TOOLTIP;Si está activado, la curva o el deslizador de «Balance de contraste» también modifica el balance de cromaticidad. +TP_WAVELET_BALLUM;Ecualizador reducc. ruido Blanco-Negro +TP_WAVELET_BANONE;Ninguno +TP_WAVELET_BASLI;Deslizador +TP_WAVELET_BATYPE;Método de balance de contraste +TP_WAVELET_BL;Difuminar niveles +TP_WAVELET_BLCURVE;Difuminar por niveles +TP_WAVELET_BLURFRAME;Difuminado +TP_WAVELET_BLUWAV;Respuesta de atenuación +TP_WAVELET_CBENAB;Virado y balance de color +TP_WAVELET_CB_TOOLTIP;Con valores grandes se pueden crear efectos especiales, similares a los que se consiguen con el módulo de Cromaticidad, pero centrados en la imagen residual.\nCon valores moderados se puede corregir el balance de blancos. +TP_WAVELET_CCURVE;Contraste local +TP_WAVELET_CH1;Todo el rango de cromaticidad +TP_WAVELET_CH2;Saturado/pastel +TP_WAVELET_CH3;Vincular niveles de contraste +TP_WAVELET_CHCU;Curva +TP_WAVELET_CHR;Intensidad del vínculo cromaticidad-contraste +TP_WAVELET_CHRO;Umbral saturado/pastel +TP_WAVELET_CHROFRAME;Reducc. ruido cromaticidad +TP_WAVELET_CHROMAFRAME;Cromaticidad +TP_WAVELET_CHROMCO;Cromaticidad gruesa +TP_WAVELET_CHROMFI;Cromaticidad fina +TP_WAVELET_CHRO_TOOLTIP;Ajusta el nivel de ondículas que será el umbral entre colores saturados y pastel.\n1-x: saturados\nx-9: pastel\n\nSi el valor excede el número de niveles de ondículas en uso, se ignorará. +TP_WAVELET_CHRWAV;Difuminar cromaticidad +TP_WAVELET_CHR_TOOLTIP;Ajusta la cromaticidad como una función de los «niveles de contraste» y la «intensidad del vínculo entre cromaticidad y contraste». +TP_WAVELET_CHSL;Deslizadores +TP_WAVELET_CHTYPE;Método de cromaticidad +TP_WAVELET_CLA;Claridad +TP_WAVELET_CLARI;Máscara de nitidez y Claridad +TP_WAVELET_COLORT;Opacidad rojo-verde +TP_WAVELET_COMPCONT;Contraste +TP_WAVELET_COMPEXPERT;Avanzado +TP_WAVELET_COMPGAMMA;Gamma de compresión +TP_WAVELET_COMPGAMMA_TOOLTIP;El ajuste de gamma de la imagen residual permite equilibrar los datos y el histograma. +TP_WAVELET_COMPLEXLAB;Complejidad +TP_WAVELET_COMPLEX_TOOLTIP;Estándar: muestra un conjunto reducido de herramientas, apropiado para la mayoría de operaciones de procesado.\n\nAvanzado: muestra el conjunto completo de herramientas para operaciones avanzadas de procesado. +TP_WAVELET_COMPNORMAL;Estándar +TP_WAVELET_COMPTM;Mapeo tonal +TP_WAVELET_CONTEDIT;Curva de contraste «Después» +TP_WAVELET_CONTFRAME;Contraste - Compresión +TP_WAVELET_CONTR;Rango de colores +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 cromaticidad +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Desactivado si la ampliación de la vista previa > aprox. 300%. +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Aumenta o disminuye el contraste local original (en el eje horizontal).\n\nLos valores bajos en el eje horizontal representan un contraste local bajo (valores reales alrededor de 10...20).\n\nUn valor en el 50% del eje horizontal representa un contraste local promedio (valor real alrededor de 100...300).\n\nUn valor del 66% representa la desviación estándar del contraste local (valor real alrededor de 300...800).\n\nEl valor del 100% representa el contraste local máximo (valor real alrededor de 3000...8000). +TP_WAVELET_CURVEEDITOR_CH;Niveles de contraste=f(Matiz) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifica el contraste de cada nivel en función del matiz.\n\nHay que tener cuidado de no sobreescribir cambios realizados con los controles de matiz de la sub-herramienta Rango de colores.\n\nLa curva sólo tendrá efectos cuando los valores de los deslizadores de contraste de nivel sean distintos de cero. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Aplica una curva final de contraste de luminancia al final del tratamiento de ondículas. +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;Rendimiento en bordes +TP_WAVELET_DAUB2;D2 - bajo +TP_WAVELET_DAUB4;D4 - estándar +TP_WAVELET_DAUB6;D6 - estándar plus +TP_WAVELET_DAUB10;D10 - medio +TP_WAVELET_DAUB14;D14 - alto +TP_WAVELET_DAUBLOCAL;Rendimiento de ondículas en bordes +TP_WAVELET_DAUB_TOOLTIP;Cambia los coeficientes de Daubechies:\nD4 = Estándar,\nD14 = A menudo ofrece el mejor rendimiento, con un 10% más de tiempo de ejecución.\n\nAfecta a la detección de bordes, así como a la calidad general de los primeros niveles. No obstante, la calidad no está estrictamente relacionada con este coeficiente, y puede variar de unas imágenes y usos a otros/as. +TP_WAVELET_DEN5THR;Umbral guiado +TP_WAVELET_DENCURV;Curva +TP_WAVELET_DENL;Corrección estructura +TP_WAVELET_DENLH;Umbral guiado por niveles de detalle 1-4 +TP_WAVELET_DENLOCAL_TOOLTIP;Usa una curva para guiar la reducción de ruido en función del contraste local.\nSe reduce el ruido de las zonas, manteniendo las estructuras. +TP_WAVELET_DENMIX_TOOLTIP;Equilibra la acción de la guía teniendo en cuenta la imagen original y la imagen con el ruido reducido. +TP_WAVELET_DENOISE;Curva guía basada en contraste local +TP_WAVELET_DENOISEGUID;Umbral guiado basado en el matiz +TP_WAVELET_DENOISEH;Curva de contraste local niveles altos +TP_WAVELET_DENOISEHUE;Ecualizador de reducc. de ruido de matiz +TP_WAVELET_DENQUA;Modo +TP_WAVELET_DENSIGMA_TOOLTIP;Adapta la forma de la guía. +TP_WAVELET_DENSLI;Deslizador +TP_WAVELET_DENSLILAB;Método +TP_WAVELET_DENWAVGUID_TOOLTIP;Usa el matiz para reducir o aumentar la acción del filtro guiado. +TP_WAVELET_DENWAVHUE_TOOLTIP;Amplifica o reduce la reducción de ruido en función del color. +TP_WAVELET_DETEND;Detalles +TP_WAVELET_DIRFRAME;Contraste direccional +TP_WAVELET_DONE;Vertical +TP_WAVELET_DTHR;Diagonal +TP_WAVELET_DTWO;Horizontal +TP_WAVELET_EDCU;Curva +TP_WAVELET_EDEFFECT;Respuesta de atenuación +TP_WAVELET_EDEFFECT_TOOLTIP;Este deslizador selecciona el rango de valores de contraste que recibirán el efecto íntegro de cualquier ajuste. +TP_WAVELET_EDGCONT;Contraste local +TP_WAVELET_EDGCONT_TOOLTIP;El ajuste de los puntos hacia la izquierda disminuye el contraste, y hacia la derecha lo aumenta.\nAbajo-izquierda, arriba-izquierda, arriba-derecha y abajo-derecha representan, respectivamente, el contraste local para valores bajos, la media, la media más la desviación estándar y el máximo. +TP_WAVELET_EDGE;Nitidez de bordes +TP_WAVELET_EDGEAMPLI;Amplificación base +TP_WAVELET_EDGEDETECT;Sensibilidad del gradiente +TP_WAVELET_EDGEDETECTTHR;Umbral bajo (ruido) +TP_WAVELET_EDGEDETECTTHR2;Mejora de bordes +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Este deslizador establece un umbral por debajo del cual los detalles más finos no se considerarán como un borde. +TP_WAVELET_EDGEDETECT_TOOLTIP;Si se mueve el deslizador hacia la derecha, se aumenta la sensibilidad a los bordes. Esto afecta al contraste local, a los ajustes de bordes y al ruido. +TP_WAVELET_EDGESENSI;Sensibilidad a los bordes +TP_WAVELET_EDGREINF_TOOLTIP;Refuerza o reduce la acción del primer nivel, hace lo contrario al segundo nivel, y deja intacto el resto. +TP_WAVELET_EDGTHRESH;Detalle +TP_WAVELET_EDGTHRESH_TOOLTIP;Cambia el reparto entre los primeros niveles y los demás. Cuanto mayor sea el umbral, más se centrará la acción en los primeros niveles. Hay que tener cuidado con los valores negativos, pues aumentan la acción de los niveles altos y pueden introducir artefactos. +TP_WAVELET_EDRAD;Radio +TP_WAVELET_EDRAD_TOOLTIP;Este ajuste controla la mejora local. Un valor de cero todavía tiene efectos. +TP_WAVELET_EDSL;Deslizadores de umbral +TP_WAVELET_EDTYPE;Método de contraste local +TP_WAVELET_EDVAL;Intensidad +TP_WAVELET_FINAL;Retoque final +TP_WAVELET_FINCFRAME;Contraste local final +TP_WAVELET_FINEST;El más fino +TP_WAVELET_FINTHR_TOOLTIP;Usa el contraste local para reducir o aumentar la acción del filtro guiado. +TP_WAVELET_GUIDFRAME;Suavizado final (filtro guiado) +TP_WAVELET_HIGHLIGHT;Rango de luminancia de niveles más finos +TP_WAVELET_HS1;Todo el rango de luminancia +TP_WAVELET_HS2;Rango selectivo de luminancia +TP_WAVELET_HUESKIN;Matiz de piel +TP_WAVELET_HUESKIN_TOOLTIP;Los puntos inferiores establecen el principio de la zona de transición, y los superiores el final, donde el efecto es máximo.\n\nSi se necesita mover el área de forma significativa, o si hay artefactos, significa que el balance de blancos es incorrecto. +TP_WAVELET_HUESKY;Matiz del cielo +TP_WAVELET_HUESKY_TOOLTIP;Los puntos inferiores establecen el principio de la zona de transición, y los superiores el final, donde el efecto es máximo.\n\nSi se necesita mover el área de forma significativa, o si hay artefactos, significa que el balance de blancos es incorrecto. +TP_WAVELET_ITER;Delta en equilibrio de niveles +TP_WAVELET_ITER_TOOLTIP;Izquierda: incrementa los niveles bajos y reduce los niveles altos,\nDerecha: reduce los niveles bajos e incrementa los niveles altos. +TP_WAVELET_LABEL;Niveles de ondículas +TP_WAVELET_LABGRID_VALUES;Alto(a)=%1 Alto(b)=%2\nBajo(a)=%3 Bajo(b)=%4 +TP_WAVELET_LARGEST;El más grueso +TP_WAVELET_LEVCH;Cromaticidad +TP_WAVELET_LEVDEN;Reducc. ruido niveles 5-6 +TP_WAVELET_LEVDIR_ALL;Todos los niveles en todas direcciones +TP_WAVELET_LEVDIR_INF;Niveles de detalle más fino, incluyendo el seleccionado +TP_WAVELET_LEVDIR_ONE;Un nivel +TP_WAVELET_LEVDIR_SUP;Niveles de detalle más grueso, excluyendo el seleccionado +TP_WAVELET_LEVELHIGH;Radio 5-6 +TP_WAVELET_LEVELLOW;Radio 1-4 +TP_WAVELET_LEVELS;Niveles de ondículas +TP_WAVELET_LEVELSIGM;Radio +TP_WAVELET_LEVELS_TOOLTIP;Elige el número de niveles de detalle en que se debe descomponer la imagen.\nEl uso de más niveles necesita más memoria RAM y más tiempo de procesamiento. +TP_WAVELET_LEVF;Contraste +TP_WAVELET_LEVFOUR;Reducc. ruido y umbral guiado niveles 5-6 +TP_WAVELET_LEVLABEL;Máximo de niveles posibles en vista previa = %1 +TP_WAVELET_LEVONE;Nivel 2 +TP_WAVELET_LEVTHRE;Nivel 4 +TP_WAVELET_LEVTWO;Nivel 3 +TP_WAVELET_LEVZERO;Nivel 1 +TP_WAVELET_LIMDEN;Interacción de niveles 5-6 en niveles 1-4 +TP_WAVELET_LINKEDG;Vincular con intensidad de nitidez de bordes +TP_WAVELET_LIPST;Algoritmo mejorado +TP_WAVELET_LOWLIGHT;Rango de luminancia de niveles más gruesos +TP_WAVELET_LOWTHR_TOOLTIP;Evita la amplificación de texturas finas y ruido. +TP_WAVELET_MEDGREINF;Primer nivel +TP_WAVELET_MEDI;Reducir artefactos en el cielo azul +TP_WAVELET_MEDILEV;Detección de bordes +TP_WAVELET_MEDILEV_TOOLTIP;Al activar Detección de bordes, se recomienda:\n- desactivar los niveles de bajo contraste para evitar artefactos,\n- usar valores altos de sensibilidad de gradiente.\n\nSe puede modular la intensidad con «Refinar», en Reducción de ruido y refinado. +TP_WAVELET_MERGEC;Fusionar cromaticidad +TP_WAVELET_MERGEL;Fusionar luminancia +TP_WAVELET_MIXCONTRAST;Contraste local de referencia +TP_WAVELET_MIXDENOISE;Reducción de ruido +TP_WAVELET_MIXMIX;Mezcla 50% ruido - 50% reducc. ruido +TP_WAVELET_MIXMIX70;Mezcla 30% ruido - 70% reducc. ruido +TP_WAVELET_MIXNOISE;Ruido +TP_WAVELET_NEUTRAL;Neutro +TP_WAVELET_NOIS;Reducción de ruido +TP_WAVELET_NOISE;Reducción de ruido y refinado +TP_WAVELET_NPHIGH;Alto +TP_WAVELET_NPLOW;Bajo +TP_WAVELET_NPNONE;Ninguno +TP_WAVELET_NPTYPE;Píxels vecinos +TP_WAVELET_NPTYPE_TOOLTIP;Este algoritmo usa la proximidad de un píxel y ocho de sus vecinos. Si hay menos diferencia, se refuerzan los bordes. +TP_WAVELET_OFFSET_TOOLTIP;El desplazamiento modifica el equilibrio entre detalles de contraste bajo y alto.\n\nLos valores altos amplifican los cambios de contraste hacia detalles de contraste más alto, mientras que los valores bajos amplifican cambios de contraste hacia detalles de contraste bajo.\n\nEl uso de una baja respuesta de atenuación permite seleccionar qué valores de contraste se mejorarán. +TP_WAVELET_OLDSH;Algoritmo que usa valores negativos +TP_WAVELET_OPACITY;Opacidad azul-amarillo +TP_WAVELET_OPACITYW;Curva de equilibrio de contraste diag./vert.-horiz. +TP_WAVELET_OPACITYWL;Contraste local final +TP_WAVELET_OPACITYWL_TOOLTIP;Modifica el contraste local final al final del tratamiento de ondículas.\n\nEl lado izquierdo representa el contraste local más bajo, progresando hacia el contraste local más alto, a la derecha. +TP_WAVELET_PASTEL;Cromaticidad de pastel +TP_WAVELET_PROC;Proceso +TP_WAVELET_PROTAB;Protección +TP_WAVELET_QUAAGRES;Agresivo +TP_WAVELET_QUACONSER;Conservador +TP_WAVELET_RADIUS;Radio sombras - luces +TP_WAVELET_RANGEAB;Rango a y b % +TP_WAVELET_RE1;Reforzado +TP_WAVELET_RE2;Sin cambios +TP_WAVELET_RE3;Reducido +TP_WAVELET_RESBLUR;Difuminar luminancia +TP_WAVELET_RESBLURC;Difuminar cromaticidad +TP_WAVELET_RESBLUR_TOOLTIP;Desactivado si ampliación > alrededor de 500%. +TP_WAVELET_RESCHRO;Intensidad +TP_WAVELET_RESCON;Sombras +TP_WAVELET_RESCONH;Luces +TP_WAVELET_RESID;Imagen residual +TP_WAVELET_SAT;Cromaticidad de saturados +TP_WAVELET_SETTINGS;Ajustes de ondículas +TP_WAVELET_SHA;Máscara de nitidez +TP_WAVELET_SHFRAME;Sombras/Luces +TP_WAVELET_SHOWMASK;Mostrar «máscara» de ondículas +TP_WAVELET_SIGM;Radio +TP_WAVELET_SIGMA;Respuesta de atenuación +TP_WAVELET_SIGMAFIN;Respuesta de atenuación +TP_WAVELET_SIGMA_TOOLTIP;El efecto de los deslizadores de contraste es más fuerte en detalles de contraste medio, y más débil en detalles de alto y bajo contraste.\n\nCon este deslizador se puede controlar la rapidez de amortiguación del efecto hacia los contrastes extremos.\n\nCuanto más alto se ajusta el deslizador, más amplio es el rango de contrastes que recibirán cambios intensos, y también es mayor el riesgo de generar artefactos.\n\nCuanto más bajo, más se dirigirá el efecto a un rango estrecho de valores de contraste. +TP_WAVELET_SKIN;Focalización/protección de piel +TP_WAVELET_SKIN_TOOLTIP;Al valor -100, se focaliza en los tonos de piel.\nAl valor 0, todos los tonos se tratan por igual.\nAl valor +100, los tonos de piel se protegen, mientras que todos los demás se ven afectados. +TP_WAVELET_SKY;Focalización/protección del cielo +TP_WAVELET_SKY_TOOLTIP;Al valor -100, se focaliza en los tonos del cielo.\nAl valor 0, todos los tonos se tratan por igual.\nAl valor +100, los tonos del cielo se protegen, mientras que todos los demás se ven afectados. +TP_WAVELET_SOFTRAD;Radio suave +TP_WAVELET_STREN;Refinar +TP_WAVELET_STREND;Intensidad +TP_WAVELET_STRENGTH;Intensidad +TP_WAVELET_SUPE;Extra +TP_WAVELET_THR;Umbral de sombras +TP_WAVELET_THRDEN_TOOLTIP;Genera una curva escalonada para guiar la reducción de ruido en función del contraste local.\nSe reduce el ruido de las zonas y se mantienen las estructuras. +TP_WAVELET_THREND;Umbral de contraste local +TP_WAVELET_THRESHOLD;Niveles más finos +TP_WAVELET_THRESHOLD2;Niveles más gruesos +TP_WAVELET_THRESHOLD2_TOOLTIP;Sólo se verán afectados por el rango de luminancia de sombras los niveles entre el valor elegido y el número de niveles de ondículas seleccionado. +TP_WAVELET_THRESHOLD_TOOLTIP;Sólo se verán afectados por el rango de luminancia de luces los niveles por debajo o igual al valor elegido. +TP_WAVELET_THRH;Umbral de luces +TP_WAVELET_TILESBIG;Teselas grandes +TP_WAVELET_TILESFULL;Imagen entera +TP_WAVELET_TILESIZE;Método de teselado +TP_WAVELET_TILES_TOOLTIP;El procesado de la imagen entera proporciona mejor calidad y es la opción recomendada, mientras que el uso de teselas es una solución alternativa para usuarios con poca memoria RAM. Consúltese RawPedia para averiguar los requisitos de memoria. +TP_WAVELET_TMEDGS;Parada en bordes +TP_WAVELET_TMSCALE;Escala +TP_WAVELET_TMSTRENGTH;Intensidad de compresión +TP_WAVELET_TMSTRENGTH_TOOLTIP;Controla la intensidad del mapeo tonal o la compresión de contraste de la imagen residual. +TP_WAVELET_TMTYPE;Método de compresión +TP_WAVELET_TON;Virado +TP_WAVELET_TONFRAME;Colores excluidos +TP_WAVELET_USH;Ninguno +TP_WAVELET_USHARP;Método de claridad +TP_WAVELET_USH_TOOLTIP;Si se selecciona Máscara de nitidez, se puede escoger cualquier nivel (en Ajustes) desde 1 hasta 4 para el procesado.\nSi se selecciona Claridad, se puede escoger cualquier nivel (en Ajustes) entre 5 y Extra. +TP_WAVELET_WAVLOWTHR;Umbral de bajo contraste +TP_WAVELET_WAVOFFSET;Desplazamiento +TP_WBALANCE_AUTO;Automático +TP_WBALANCE_AUTOITCGREEN;Correlación de temperatura +TP_WBALANCE_AUTOOLD;RGB gris +TP_WBALANCE_AUTO_HEADER;Automático +TP_WBALANCE_CAMERA;Cámara +TP_WBALANCE_CLOUDY;Nublado +TP_WBALANCE_CUSTOM;Personalizado +TP_WBALANCE_DAYLIGHT;Luz de día (soleado) +TP_WBALANCE_EQBLUERED;Ecualizador Azul/Rojo +TP_WBALANCE_EQBLUERED_TOOLTIP;Permite desviarse del comportamiento normal del balance de blancos, mediante la modulación del balance azul/rojo.\n\nEsto puede ser útil cuando las condiciones de toma son tales que:\n\na) están alejadas del iluminante estándar (por ejemplo, bajo el agua),\nb) están alejadas de las condiciones en las que se hicieron las calibraciones,\nc) las matrices o los perfiles ICC no son adecuados. +TP_WBALANCE_FLASH55;Leica +TP_WBALANCE_FLASH60;Estándar, Canon, Pentax, Olympus +TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta +TP_WBALANCE_FLASH_HEADER;Flash +TP_WBALANCE_FLUO1;F1 - Luz de día +TP_WBALANCE_FLUO2;F2 - Blanco frío +TP_WBALANCE_FLUO3;F3 - Blanco +TP_WBALANCE_FLUO4;F4 - Blanco cálido +TP_WBALANCE_FLUO5;F5 - Luz de día +TP_WBALANCE_FLUO6;F6 - Blanco ligero +TP_WBALANCE_FLUO7;F7 - D65 Emulador de luz de día +TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design +TP_WBALANCE_FLUO9;F9 - Blanco frío Deluxe +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;Tinte +TP_WBALANCE_GTI;GTI +TP_WBALANCE_HMI;HMI +TP_WBALANCE_JUDGEIII;JudgeIII +TP_WBALANCE_LABEL;Balance de blancos +TP_WBALANCE_LAMP_HEADER;Lámpara +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;Muestreo balance de blancos +TP_WBALANCE_SHADE;Sombra +TP_WBALANCE_SIZE;Tamaño: +TP_WBALANCE_SOLUX35;Solux 3500K +TP_WBALANCE_SOLUX41;Solux 4100K +TP_WBALANCE_SOLUX47;Solux 4700K (proveedor) +TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) +TP_WBALANCE_SPOTWB;El cuentagotas se usa para muestrear el balance de blancos a partir de una región neutra en la vista previa. +TP_WBALANCE_STUDLABEL;Factor de correlación: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;Muestra la correlación de Student calculada.\nLos valores bajos son mejores, donde <0.005 es excelente,\n<0.01 es bueno, y >0.5 es malo.\nLos valores bajos no significan que el balance de blancos sea bueno:\nsi el iluminante no es estándar, los resultados pueden ser erráticos.\nUn valor de 1000 significa que se usan cálculos previos y\nprobablemente los resultados son buenos. +TP_WBALANCE_TEMPBIAS;Sesgo de temperatura en 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 frías. El sesgo\nse expresa como porcentaje de la temperatura calculada,\npor lo que el resultado viene dado por «TempCalculada + TempCalculada * Sesgo». +TP_WBALANCE_TEMPERATURE;Temperatura +TP_WBALANCE_TUNGSTEN;Tungsteno +TP_WBALANCE_WATER1;Subacuático 1 +TP_WBALANCE_WATER2;Subacuático 2 +TP_WBALANCE_WATER_HEADER;Subacuático +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Abre (nueva) ventana de detalle +ZOOMPANEL_ZOOM100;Ampliar a 100%\nAtajo de teclado: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Encajar recorte en la vista previa\nAtajo de teclado: f +ZOOMPANEL_ZOOMFITSCREEN;Encajar la imagen entera en la vista previa\nAtajo de teclado: Alt-f +ZOOMPANEL_ZOOMIN;Acercar\nAtajo de teclado: + +ZOOMPANEL_ZOOMOUT;Alejar\nAtajo de teclado: - + diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol (Latin America) similarity index 50% rename from rtdata/languages/Espanol rename to rtdata/languages/Espanol (Latin America) index ee8b0d17d..56a73d30f 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol (Latin America) @@ -162,7 +162,7 @@ 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_FAST_PIPELINE_TOOLTIP;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 @@ -297,13 +297,11 @@ 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 HISTORY_CUSTOMCURVE;Curva a medida HISTORY_FROMCLIPBOARD;Desde el portapapeles HISTORY_LABEL;Historial HISTORY_MSG_1;Foto abierta -HISTORY_MSG_2;Perfil Abierto HISTORY_MSG_3;Perfil cambiado HISTORY_MSG_4;Búsqueda de historial HISTORY_MSG_5;Brillo @@ -317,9 +315,6 @@ HISTORY_MSG_12;Exposición automática HISTORY_MSG_13;Recorte de exposición HISTORY_MSG_14;Lab - Claridad HISTORY_MSG_15;Lab - Contraste -HISTORY_MSG_16;Luminancia - Negro -HISTORY_MSG_17;Luminancia - Compr. de luces altas -HISTORY_MSG_18;Luminancia - Compr. de sombras HISTORY_MSG_19;Curva 'L' HISTORY_MSG_20;Enfoque HISTORY_MSG_21;Enfoque - Radio @@ -345,10 +340,6 @@ HISTORY_MSG_40;Equilibrio de Blancos - Tinte HISTORY_MSG_41;Curva tonal modo 1 HISTORY_MSG_42;Curva tonal 2 HISTORY_MSG_43;Curva tonal modo 2 -HISTORY_MSG_44;Red. ruido de lum. - Radio -HISTORY_MSG_45;Red. ruido de lum. - Tolerancia de Bordes -HISTORY_MSG_46;Red. ruido de color -HISTORY_MSG_47;Mezcla luces altas ICC con matriz HISTORY_MSG_48;Usar curva de tono DCP HISTORY_MSG_49;Iluminante DCP HISTORY_MSG_50;Sombras/Luces altas (S/LA) @@ -356,7 +347,6 @@ HISTORY_MSG_51;S/LA - Luces altas HISTORY_MSG_52;S/LA - Sombras HISTORY_MSG_53;S/LA - Ancho tonal Luces Altas HISTORY_MSG_54;S/LA - Ancho tonal Sombras -HISTORY_MSG_55;S/LA - Contraste local HISTORY_MSG_56;S/LA - Radio HISTORY_MSG_57;Rotación basta HISTORY_MSG_58;Volteo horizontal @@ -368,7 +358,6 @@ HISTORY_MSG_63;Marcador seleccionado HISTORY_MSG_64;Recortar foto HISTORY_MSG_65;Corrección aberraciones cromáticas HISTORY_MSG_66;Recuperación de luces altas -HISTORY_MSG_67;Recuperación de luces altas - Cantidad HISTORY_MSG_68;Recuperación de luces altas - Método HISTORY_MSG_69;Espacio de color de trabajo HISTORY_MSG_70;Espacio de color de salida @@ -379,12 +368,10 @@ HISTORY_MSG_74;Cambiar tamaño - Escala HISTORY_MSG_75;Cambiar tamaño - Método HISTORY_MSG_76;Metadatos de Exif HISTORY_MSG_77;Metadatos de IPTC -HISTORY_MSG_78;Datos especificados para cambio tamaño HISTORY_MSG_79;Cambiar tamaño - Anchura HISTORY_MSG_80;Cambiar tamaño - Altura HISTORY_MSG_81;Cambio tamaño activado HISTORY_MSG_82;Perfil cambiado -HISTORY_MSG_83;Sombras/Luces Altas - Enfoque HISTORY_MSG_84;Corrección de perspectiva HISTORY_MSG_85;Perfil Corrector de Lente HISTORY_MSG_86;Curvas RGB - Modo luminosidad @@ -431,12 +418,6 @@ HISTORY_MSG_127;Auto selección archivo de campo plano HISTORY_MSG_128;Radio de difuminado de campo plano HISTORY_MSG_129;Tipo de difuminado de campo plano HISTORY_MSG_130;Corrección automática de distorsión -HISTORY_MSG_131;Reducción de ruido de luminancia -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 (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 @@ -549,7 +530,6 @@ HISTORY_MSG_246;Curva 'CL' HISTORY_MSG_247;Curva 'LM' HISTORY_MSG_248;Curva 'MM' HISTORY_MSG_249;CpND - Umbral -HISTORY_MSG_250;RR - Mejorado HISTORY_MSG_251;B&N - Algoritmo HISTORY_MSG_252;CbDL - Tono de piel HISTORY_MSG_253;CbDL - Reducir elementos extraños @@ -573,8 +553,6 @@ HISTORY_MSG_270;TC - Altas Luces - Verde HISTORY_MSG_271;TC - Altas Luces - Azul HISTORY_MSG_272;TC - Balance HISTORY_MSG_273;TC - Restablecer -HISTORY_MSG_274;TC - Sat. de Sombras -HISTORY_MSG_275;TC - Sat. de Altas Luces HISTORY_MSG_276;TC - Opacidad HISTORY_MSG_277;--no utilizado-- HISTORY_MSG_278;TC - Preservar luminancia @@ -599,7 +577,6 @@ 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) @@ -708,7 +685,6 @@ 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 @@ -756,7 +732,6 @@ 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 @@ -1259,7 +1234,7 @@ PROFILEPANEL_GLOBALPROFILES;Perfiles empaquetados PROFILEPANEL_LABEL;Perfiles de procesamiento PROFILEPANEL_LOADDLGLABEL;Cargar parámetros de procesamiento... PROFILEPANEL_LOADPPASTE;Parámetros a cargar -PROFILEPANEL_MODE_TIP;Modo de procesamiento de perfiles.\n\nBotón Presionado: los perfiles parciales son completados; Los valores faltantes son llenados usando valores predeterminados de fábrica.\n\nBotón Liberado: Los perfiles son aplicados tal como están, alterando solo los valores que contienen; los parámetros sin valores en el perfil se dejan en la imagen tal como están. +PROFILEPANEL_MODE_TOOLTIP;Modo de procesamiento de perfiles.\n\nBotón Presionado: los perfiles parciales son completados; Los valores faltantes son llenados usando valores predeterminados de fábrica.\n\nBotón Liberado: Los perfiles son aplicados tal como están, alterando solo los valores que contienen; los parámetros sin valores en el perfil se dejan en la imagen tal como están. PROFILEPANEL_MYPROFILES;Mis perfiles PROFILEPANEL_PASTEPPASTE;Parámetros PROFILEPANEL_PCUSTOM;A medida @@ -1446,7 +1421,6 @@ 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_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) TP_COLORAPP_HUE_TOOLTIP;Matiz (h) - ángulo entre 0° y 360° TP_COLORAPP_LABEL;CIE Modelo de Apariencia de Color 2002 @@ -1459,7 +1433,7 @@ 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_NEUTRAL_TOOLTIP;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_SURROUND;Entorno @@ -1521,7 +1495,7 @@ TP_COLORTONING_METHOD;Método TP_COLORTONING_METHOD_TOOLTIP;"Mezcla Lab", "Controles deslizantes RGB" y "Curvas RGB" utilizan mezcla de color interpolada.\n"Balance de Color (Sombras/Tonos Medios/Luces Altas)" y "Saturación 2 colores" utilizan colores directos.\n\nCualquier método de tonificación de color puede ser aplicado aún estando la herramienta Blanco y Negro activada. TP_COLORTONING_MIDTONES;Tonos Medios TP_COLORTONING_NEUTRAL;Restablecer controles deslizantes -TP_COLORTONING_NEUTRAL_TIP;Restablecer todos los valores predeterminados(Sombras, Tonos Medios, Luces Altas). +TP_COLORTONING_NEUTRAL_TOOLTIP;Restablecer todos los valores predeterminados(Sombras, Tonos Medios, Luces Altas). TP_COLORTONING_OPACITY;Opacidad TP_COLORTONING_RGBCURVES;RGB - Curvas TP_COLORTONING_RGBSLIDERS;RGB - Controles deslizantes @@ -1635,7 +1609,7 @@ 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_AUTO_TOOLTIP;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 @@ -1644,12 +1618,12 @@ TP_EPD_REWEIGHTINGITERATES;Iteraciones de reponderación TP_EPD_SCALE;Escala TP_EPD_STRENGTH;Intensidad 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_AUTOLEVELS_TOOLTIP;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_CLIP_TOOLTIP;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 TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Umbral de recuperación de luces altas TP_EXPOSURE_COMPRSHADOWS;Compresión de sombras @@ -1786,7 +1760,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminancia en función del Matiz L=f(M) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminancia en función de la Luminancia L=f(L) TP_LABCURVE_LABEL;Ajustes Lab TP_LABCURVE_LCREDSK;Restringe LC a tonos rojos y piel -TP_LABCURVE_LCREDSK_TIP;Si se activa, la 'Curva LC' afecta solo a los tonos rojos y piel\nSi se desactiva, se aplica a todos los colores +TP_LABCURVE_LCREDSK_TOOLTIP;Si se activa, la 'Curva LC' afecta solo a los tonos rojos y piel\nSi se desactiva, se aplica a todos los colores TP_LABCURVE_RSTPROTECTION;Protección de rojos y tonos piel TP_LABCURVE_RSTPRO_TOOLTIP;Puede usarse con el deslizador Cromaticidad y con la curva CC. TP_LENSGEOM_AUTOCROP;Auto recorte @@ -1807,7 +1781,7 @@ 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_NEUTRAL_TOOLTIP;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 TP_PCVIGNETTE_LABEL;Filtro quitar Viñeteado @@ -1989,7 +1963,7 @@ 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_NEUTRAL_TOOLTIP;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. @@ -2025,7 +1999,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Grados TP_ROTATE_LABEL;Rotar TP_ROTATE_SELECTLINE;Seleccionar línea recta -TP_SAVEDIALOG_OK_TIP;Tecla de Atajo Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Tecla de Atajo Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Luces altas TP_SHADOWSHLIGHTS_HLTONALW;Ancho tonal de Luces Altas TP_SHADOWSHLIGHTS_LABEL;Sombras/Luces altas @@ -2245,7 +2219,6 @@ 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. @@ -2313,19 +2286,715 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !!!!!!!!!!!!!!!!!!!!!!!!! !CURVEEDITOR_CATMULLROM;Flexible -!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? !FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- !HISTORY_MSG_494;Capture Sharpening -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations @@ -2333,11 +3002,81 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector !MAIN_FRAME_PLACES_DEL;Remove !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +!PARTIALPASTE_FILMNEGATIVE;Film negative +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_PREPROCWB;Preprocess White Balance +!PARTIALPASTE_SPOT;Spot removal !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_CHUNKSIZES;Tiles per thread !PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic @@ -2345,8 +3084,23 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen !PREFERENCES_PERFORMANCE_MEASURE;Measure !PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... !PROGRESSBAR_HLREC;Highlight reconstruction... @@ -2354,23 +3108,1035 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !PROGRESSBAR_LINEDENOISE;Line noise filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... !QUEUE_LOCATION_TITLE;Output Location +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_CROP_GTCENTEREDSQUARE;Centered square !TP_CROP_PPI;PPI -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear !TP_RAW_IMAGENUM_SN;SN mode +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal +!TP_WAVELET_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. +!TP_WAVELET_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 9ecf43733..b7b2c7ec7 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -101,7 +101,7 @@ EXPORT_PIPELINE;Pipeline de Traitement EXPORT_PUTTOQUEUEFAST;Mettre dans la file de traitement\npour Export Rapide EXPORT_RAW_DMETHOD;Méthode de dématriçage EXPORT_USE_FAST_PIPELINE;Dédié\n(traitement complet sur une image rédimmentionnée) -EXPORT_USE_FAST_PIPELINE_TIP;Utilise un pipeline de traitement dédié pour les images en Export Rapide, qui privilégie la vitesse sur la qualité. Le redimensionnement des images est fait dès que possible, au lieu d'être fait à la fin comme dans le pipeline normal. L'accélération peut être significative, mais soyez prêt à voir des artéfacts et une dégradation générale de la qualité de sortie. +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Utilise un pipeline de traitement dédié pour les images en Export Rapide, qui privilégie la vitesse sur la qualité. Le redimensionnement des images est fait dès que possible, au lieu d'être fait à la fin comme dans le pipeline normal. L'accélération peut être significative, mais soyez prêt à voir des artéfacts et une dégradation générale de la qualité de sortie. EXPORT_USE_NORMAL_PIPELINE;Standard\n(ignore des étapes, redimentionne à la fin) EXTPROGTARGET_1;raw EXTPROGTARGET_2;file de traitement @@ -236,13 +236,11 @@ 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é HISTORY_CUSTOMCURVE;Courbe personnelle HISTORY_FROMCLIPBOARD;Du presse-papier HISTORY_LABEL;Historique HISTORY_MSG_1;Photo chargée -HISTORY_MSG_2;Profil chargé HISTORY_MSG_3;Profil changé HISTORY_MSG_4;Navigation dans l'historique HISTORY_MSG_5;Luminosité @@ -256,9 +254,6 @@ HISTORY_MSG_12;Niveaux auto HISTORY_MSG_13;Rognage de l'exposition HISTORY_MSG_14;Lab - Luminosité HISTORY_MSG_15;Lab - Contraste -HISTORY_MSG_16;Luminance - Noir -HISTORY_MSG_17;Luminance - Compression hautes lumières -HISTORY_MSG_18;Luminance - Compression des ombres HISTORY_MSG_19;Courbe 'L' HISTORY_MSG_20;Netteté HISTORY_MSG_21;Netteté (USM) - Rayon @@ -284,10 +279,6 @@ HISTORY_MSG_40;BdB - Teinte HISTORY_MSG_41;Mode courbe tonale 1 HISTORY_MSG_42;Courbe tonale2 HISTORY_MSG_43;Mode courbe tonale 2 -HISTORY_MSG_44;Débruitage Lum. - Rayon -HISTORY_MSG_45;Débruitage Lum. - Tolérance des bords -HISTORY_MSG_46;Débruitage Chromatique -HISTORY_MSG_47;Mélange HL du profil ICC et la matrice HISTORY_MSG_48;Courbe tonale du profil DCP HISTORY_MSG_49;Illuminant DCP HISTORY_MSG_50;Ombres/Hautes lumières @@ -295,7 +286,6 @@ HISTORY_MSG_51;O/HL - Hautes lumières HISTORY_MSG_52;O/HL - Ombres HISTORY_MSG_53;O/HL - Amplitude tonale des HL HISTORY_MSG_54;O/HL - Amplitude tonale des ombres -HISTORY_MSG_55;O/HL - Contraste Local HISTORY_MSG_56;O/HL - Rayon HISTORY_MSG_57;Rotation grossière HISTORY_MSG_58;Symétrisation / axe vertical @@ -307,7 +297,6 @@ HISTORY_MSG_63;Signet sélectionné HISTORY_MSG_64;Recadrage HISTORY_MSG_65;Aberration chromatique HISTORY_MSG_66;Reconst. Hautes lumières -HISTORY_MSG_67;Reconst. HL - Quantité HISTORY_MSG_68;Reconst. HL - Méthode HISTORY_MSG_69;Espace de couleur de travail HISTORY_MSG_70;Espace de couleur de sortie @@ -318,12 +307,10 @@ HISTORY_MSG_74;Redim. - Échelle HISTORY_MSG_75;Méthode de redimensionnement HISTORY_MSG_76;Métadonnées EXIF HISTORY_MSG_77;Métadonnées IPTC -HISTORY_MSG_78;Type de redimensionnement HISTORY_MSG_79;Redim. - Largeur HISTORY_MSG_80;Redim. - Hauteur HISTORY_MSG_81;Redimensionnement HISTORY_MSG_82;Changement de profil -HISTORY_MSG_83;O/HL - Masque haute précision HISTORY_MSG_84;Correction de la perspective HISTORY_MSG_85;LCP HISTORY_MSG_86;Courbes RVB - Mode luminosité @@ -370,12 +357,6 @@ HISTORY_MSG_127;Champ Uniforme - Sélection auto HISTORY_MSG_128;Champ Uniforme - Rayon HISTORY_MSG_129;Champ Uniforme - Type de floutage HISTORY_MSG_130;Distorsion Auto -HISTORY_MSG_131;Réd. de bruit - Luminance -HISTORY_MSG_132;Réd. de bruit - Chrominance -HISTORY_MSG_133;Gamma de Sortie -HISTORY_MSG_134;Gamma - Manuel -HISTORY_MSG_135;Gamma - Manuel -HISTORY_MSG_136;Gamma - Pente HISTORY_MSG_137;Niveau de noir - Vert 1 HISTORY_MSG_138;Niveau de noir - Rouge HISTORY_MSG_139;Niveau de noir - Bleu @@ -488,7 +469,6 @@ HISTORY_MSG_246;Courbe 'CL' HISTORY_MSG_247;Courbe 'LT' HISTORY_MSG_248;Courbe 'TT' HISTORY_MSG_249;CpND - Seuil -HISTORY_MSG_250;Réd. de bruit - Amélioré HISTORY_MSG_251;N&B - Algorithme HISTORY_MSG_252;CpND - Tons chair HISTORY_MSG_253;CpND - Réduction des artéfactes @@ -512,8 +492,6 @@ 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;VP - Préserver luminance @@ -538,7 +516,6 @@ HISTORY_MSG_296;Réd. de bruit - Courbe de luminance HISTORY_MSG_297;Réd. de bruit - Mode HISTORY_MSG_298;Filtre de pixel mort HISTORY_MSG_299;Réd. de bruit - Courbe de chrominance -HISTORY_MSG_300;- HISTORY_MSG_301;Réd. de bruit - Contrôle luma HISTORY_MSG_302;Réd. de bruit - Méthode Chroma HISTORY_MSG_303;Réd. de bruit - Méthode Chroma @@ -647,7 +624,6 @@ HISTORY_MSG_405;O - Débruitage - Niveau 4 HISTORY_MSG_406;O - NB - Pixels voisins HISTORY_MSG_407;Retinex - Méthode HISTORY_MSG_408;Retinex - Rayon -HISTORY_MSG_409;Retinex - Contraste HISTORY_MSG_410;Retinex - Décalage HISTORY_MSG_411;Retinex - Force HISTORY_MSG_412;Retinex - Gradient Gaussien @@ -695,7 +671,6 @@ HISTORY_MSG_468;PS - Remplir les trous HISTORY_MSG_469;PS - Médiane HISTORY_MSG_471;PS - Correction de mouvement HISTORY_MSG_472;PS - Adoucir les transitions -HISTORY_MSG_473;PS - Utiliser LMMSE HISTORY_MSG_474;PS - Égaliser HISTORY_MSG_475;PS - Égaliser par canal HISTORY_MSG_476;CAM02 - Temp sortie @@ -737,6 +712,11 @@ 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_FILMNEGATIVE_BALANCE;FN - Réference Sortie +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negativf Espace couleur +HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negatif +HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Référence entrée +HISTORY_MSG_FILMNEGATIVE_VALUES;Film negatif valeurs 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 @@ -764,6 +744,8 @@ 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_SPOT;Retrait de taches +HISTORY_MSG_SPOT_ENTRY;Retrait de taches - Modif. de points HISTORY_MSG_TM_FATTAL_ANCHOR;CPD - Ancre HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s @@ -809,7 +791,7 @@ 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: +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 @@ -904,6 +886,8 @@ MAIN_TAB_FAVORITES_TOOLTIP;Raccourci: Alt-u MAIN_TAB_FILTER; Filtrer MAIN_TAB_INSPECT; Inspecter MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Local +MAIN_TAB_LOCALLAB_TOOLTIP;Raccourci: Alt-o MAIN_TAB_METADATA;Métadonnées MAIN_TAB_METADATA_TOOLTIP;Raccourci:Alt-m MAIN_TAB_RAW;RAW @@ -987,6 +971,8 @@ PARTIALPASTE_LABCURVE;Courbes Lab PARTIALPASTE_LENSGROUP;Réglages de l'objectif PARTIALPASTE_LENSPROFILE;Profil de correction d'Objectif PARTIALPASTE_LOCALCONTRAST;Contraste local +PARTIALPASTE_LOCALLAB;Ajustements locauc +PARTIALPASTE_LOCALLABGROUP;Réglages Ajustements locaux PARTIALPASTE_METADATA;Mode des Metadonnées PARTIALPASTE_METAGROUP;Réglages des Métadonnées PARTIALPASTE_PCVIGNETTE;Filtre Vignettage @@ -1020,6 +1006,7 @@ PARTIALPASTE_SHARPENEDGE;Bords PARTIALPASTE_SHARPENING;Netteté PARTIALPASTE_SHARPENMICRO;Microcontraste PARTIALPASTE_SOFTLIGHT;Lumière douce +PARTIALPASTE_SPOT;Retrait de taches PARTIALPASTE_TM_FATTAL;Compression de plage dynamique PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Correction du vignettage @@ -1204,7 +1191,7 @@ PROFILEPANEL_GLOBALPROFILES;Profils fournis PROFILEPANEL_LABEL;Profils de post-traitement PROFILEPANEL_LOADDLGLABEL;Charger les paramètres de post-traitement... PROFILEPANEL_LOADPPASTE;Paramètres à charger -PROFILEPANEL_MODE_TIP;Mode de complètement des profils de traitement.\n\nBouton pressé: les profils partiels seront convertis en profils complets; les valeurs manquantes seront remplacées par les valeurs internes par défaut\n\nBouton relevé: les profils seront appliqués tel quel, altérant seulement les paramètres qu'ils contiennent. +PROFILEPANEL_MODE_TOOLTIP;Mode de complètement des profils de traitement.\n\nBouton pressé: les profils partiels seront convertis en profils complets; les valeurs manquantes seront remplacées par les valeurs internes par défaut\n\nBouton relevé: les profils seront appliqués tel quel, altérant seulement les paramètres qu'ils contiennent. PROFILEPANEL_MYPROFILES;Mes profils PROFILEPANEL_PASTEPPASTE;Paramètres à coller PROFILEPANEL_PCUSTOM;Personnel @@ -1293,8 +1280,8 @@ TP_BWMIX_AUTOCH;Auto 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 -TP_BWMIX_CURVEEDITOR1;Courbe 'avant' -TP_BWMIX_CURVEEDITOR2;Courbe 'après' +TP_BWMIX_CURVEEDITOR1;Courbe 'avant': +TP_BWMIX_CURVEEDITOR2;Courbe 'après': TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Courbe tonale, après la conversion en N&B, à la fin du traitement TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Courbe tonale, juste avant la conversion en N&B\nPeut prendre en compte les composantes couleur TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Modifie la luminance en fonction de la teinte\nFaites attention aux valeurs extrêmes qui peuvent causer des artefacts @@ -1359,6 +1346,7 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotation vers la gauche\nRaccourci: [\n\nRa 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_ABSOLUTELUMINANCE;Luminance absolue +TP_COLORAPP_ADAPSCEN_TOOLTIP;Correspond à la luminance en candelas par m2 au moment de la prise de vue, calculée automatiquement à partir des données exif. TP_COLORAPP_ALGO;Algorithme TP_COLORAPP_ALGO_ALL;Tout TP_COLORAPP_ALGO_JC;Luminosité + Chroma (JC) @@ -1391,12 +1379,11 @@ 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_FREE;Temp libre+vert + CAT02 + [sortie] TP_COLORAPP_GAMUT;Contrôle du gamut (Lab) -TP_COLORAPP_GAMUT_TOOLTIP;Permet le controle du gamut en mode Lab TP_COLORAPP_HUE;Teinte (h) TP_COLORAPP_HUE_TOOLTIP;Teinte (h) - angle entre 0° et 360° TP_COLORAPP_LABEL;Apparence de la Couleur (CIECAM02) TP_COLORAPP_LABEL_CAM02;Édition de l'image avec CIE-CAM 2002 -TP_COLORAPP_LABEL_SCENE;Conditions de la scène +TP_COLORAPP_LABEL_SCENE;Conditions de visionnage 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 @@ -1404,7 +1391,7 @@ 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_NEUTRAL_TOOLTIP;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_SURROUND;Entourage @@ -1427,12 +1414,14 @@ TP_COLORAPP_TONECIE_TOOLTIP;Si cette option est désactivée, la compression ton 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_YBOUT_TOOLTIP;Yb est la luminance relative de l'arrière plan, exprimée e % de gris. Un gris à 18% correspond à une luminance exprimée en CIE L de 50%.\nCette donnée prend en compte la luminance moyenne de l'image. +TP_COLORAPP_YBSCEN_TOOLTIP;Yb est la luminance relative du fond, exprimée en % de gris. 18 % de gris correspondent à une luminance de fond de 50 % exprimée en CIE L.\nLes données sont basées sur la luminance moyenne de l'image TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automatique TP_COLORTONING_BALANCE;Balance TP_COLORTONING_BY;o C/L TP_COLORTONING_CHROMAC;Opacité -TP_COLORTONING_COLOR;Couleur +TP_COLORTONING_COLOR;Couleur: TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Opacité chroma en fonction de la luminance oC=f(L) TP_COLORTONING_HIGHLIGHT;Hautes lumières TP_COLORTONING_HUE;Teinte @@ -1466,7 +1455,7 @@ TP_COLORTONING_METHOD;Méthode TP_COLORTONING_METHOD_TOOLTIP;Mixage Lab - RVB courbes - RVB curseurs utilise une interpolation\nBalance couleur(ombres / tons moyens / hautes lumières)\nSaturation 2 couleurs utilise couleurs directes\nDans tous les méthodes vous pouvez activer Noir et Blanc TP_COLORTONING_MIDTONES;Tons Moyens TP_COLORTONING_NEUTRAL;Réinit. curseurs -TP_COLORTONING_NEUTRAL_TIP;Réinitialise toutes les valeurs (Ombres, Tons moyens, Hautes lumières) à leur valeur par défaut. +TP_COLORTONING_NEUTRAL_TOOLTIP;Réinitialise toutes les valeurs (Ombres, Tons moyens, Hautes lumières) à leur valeur par défaut. TP_COLORTONING_OPACITY;Opacité TP_COLORTONING_RGBCURVES;RVB - Courbes TP_COLORTONING_RGBSLIDERS;RVB - Curseurs @@ -1514,11 +1503,11 @@ TP_DEHAZE_STRENGTH;Force TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Multi-zones auto TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Global automatique TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Bleu-Jaune -TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Courbe de chrominance +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Courbe de chrominance: TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Augmente (multiplie) la valeur de tous les curseurs de chrominance.\nCette courbe vous permet d'ajuster la force de la réduction de bruit chromatique en fonction de la chromaticité, par exemple pour augmenter l'action dans les zones faiblement saturées et pour la diminuer dans celles très saturées. TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuel -TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Maître +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance-Maître TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Méthode TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAperçu\nAgit sur l'image entière.\nLa partie visible de l'image dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAutomatique multi-zones\nPas d'aperçu - ne fonctionne que lors de l'enregistrement, mais utiliser la méthode "Aperçu" en faisant correspondre la taille et le centre de la tuile à la taille et au centre de l'aperçu, vous permet d'avoir une idée des résultats attendus.\nL'image est divisé en tuiles (entre 10 et 70 en fonction de la taille de l'image) et chaque tuile reçoit son propre réglage de réduction de bruit de chrominance.\n\nAperçu\nAgit sur l'image entière.\nLa partie de l'image visible dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. @@ -1532,7 +1521,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Taille des tuiles =%1, Centre: Tx= TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Rouge-Vert TP_DIRPYRDENOISE_LABEL;Réduction de Bruit TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Contrôle de luminance -TP_DIRPYRDENOISE_LUMINANCE_CURVE;Courbe de luminance +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Courbe de luminance: TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Niveau de détails de Luminance TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance @@ -1580,7 +1569,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;A -100, les tons chairs sont ciblés.\nA 0 tous TP_DIRPYREQUALIZER_THRESHOLD;Seuil TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts due to the transitions between the color (hue, chroma, luma) of the skin and the rest of the image. TP_DISTORTION_AMOUNT;Quantité -TP_DISTORTION_AUTO_TIP;Corrige automatiquement la distortion optique dans les fichiers raw en opérant une mise en correspondance avec le fichier JPEG incorporé, si elle existe, et sur laquelle la correction de la distortion a été appliqué par le boitier. +TP_DISTORTION_AUTO_TOOLTIP;Corrige automatiquement la distortion optique dans les fichiers raw en opérant une mise en correspondance avec le fichier JPEG incorporé, si elle existe, et sur laquelle la correction de la distortion a été appliqué par le boitier. TP_DISTORTION_LABEL;Distorsion TP_EPD_EDGESTOPPING;Arrêt des bords TP_EPD_GAMMA;Gamma @@ -1589,12 +1578,12 @@ TP_EPD_REWEIGHTINGITERATES;Itérations de la pondération TP_EPD_SCALE;Échelle TP_EPD_STRENGTH;Force 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_AUTOLEVELS_TOOLTIP;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_CLIP_TOOLTIP;La fraction de pixels que l'outil Niveaux Auto passera en dehors du domaine TP_EXPOSURE_COMPRHIGHLIGHTS;Compression hautes lumières TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Seuil de compression\ndes hautes lumières TP_EXPOSURE_COMPRSHADOWS;Compression des ombres @@ -1617,6 +1606,22 @@ TP_EXPOSURE_TCMODE_STANDARD;Standard TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Standard Pondéré TP_EXPOS_BLACKPOINT_LABEL;Points Noir Raw TP_EXPOS_WHITEPOINT_LABEL;Points Blanc Raw +TP_FILMNEGATIVE_BLUE;Ratio bleu +TP_FILMNEGATIVE_BLUEBALANCE;Froid/Chaud +TP_FILMNEGATIVE_COLORSPACE;Inversion espace couleur: +TP_FILMNEGATIVE_COLORSPACE_INPUT;Espace couleur -entrée +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Sélectionnez l'espace colorimétrique utilisé pour effectuer l'inversion négative :\nEspace colorimétrique d'entrée : effectuez l'inversion avant l'application du profil d'entrée, comme dans les versions précédentes de RT.\nEspace colorimétrique de travail< /b> : effectue l'inversion après le profil d'entrée, en utilisant le profil de travail actuellement sélectionné. +TP_FILMNEGATIVE_COLORSPACE_WORKING;Espace couleur de travail +TP_FILMNEGATIVE_GREEN;Exposant de référence +TP_FILMNEGATIVE_GREENBALANCE;Magenta/Vert +TP_FILMNEGATIVE_GUESS_TOOLTIP;Définissez automatiquement les ratios rouge et bleu en choisissant deux patchs qui avaient une teinte neutre (pas de couleur) dans la scène d'origine. Les patchs doivent différer en luminosité. +TP_FILMNEGATIVE_LABEL;Film Negatif +TP_FILMNEGATIVE_OUT_LEVEL;Niveau de sortie +TP_FILMNEGATIVE_PICK;Choix des endroits neutres +TP_FILMNEGATIVE_RED;Ratio Rouge +TP_FILMNEGATIVE_REF_LABEL;Entrée RGB: %1 +TP_FILMNEGATIVE_REF_PICK;Choisissez le point de la balance des blancs +TP_FILMNEGATIVE_REF_TOOLTIP;Choisissez un patch gris pour équilibrer les blancs de la sortie, image positive. TP_FILMSIMULATION_LABEL;Simulation de Film TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee est configuré pour rechercher les images Hald CLUT, qui sont utilisées pour l'outil Simulation de Film, dans un dossier qui prends trop de temps à se charger.\nAllez dans Préférences > Traitement de l'image > Simulation de Film\npour voir quel dossier est utilisé. Vous devriez soit pointer RawTherapee vers un dossier qui ne contient que les images Hald CLUT et rien d'autre, ou un dossier vide si vous ne voulez pas utiliser l'outil Simulation de Film.\n\nLisez l'article Simulation de Film dans RawPedia pour plus d'information.\n\nVoulez-vous abandonner la recherche maintenant? TP_FILMSIMULATION_STRENGTH;Force @@ -1651,7 +1656,7 @@ TP_HLREC_ENA_TOOLTIP;Peut être activé par le bouton Niveau Auto TP_HLREC_LABEL;Reconstruction des hautes lumières TP_HLREC_LUMINANCE;Récupération de la luminance TP_HLREC_METHOD;Méthode: -TP_HSVEQUALIZER_CHANNEL;Canal +TP_HSVEQUALIZER_CHANNEL;Canal: TP_HSVEQUALIZER_HUE;T TP_HSVEQUALIZER_LABEL;Égaliseur TSV TP_HSVEQUALIZER_SAT;S @@ -1731,7 +1736,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance en fonction de la Teinte L=f(T) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance en fonction de la Luminance L=f(L) TP_LABCURVE_LABEL;Ajustements Lab TP_LABCURVE_LCREDSK;Restreindre LC aux tons rouge et peau -TP_LABCURVE_LCREDSK_TIP;Si activé, la courbe 'LC' est limitée au tons rouge et peau.\nSi désactivé, elle s'applique à toutes les teintes. +TP_LABCURVE_LCREDSK_TOOLTIP;Si activé, la courbe 'LC' est limitée au tons rouge et peau.\nSi désactivé, elle s'applique à toutes les teintes. TP_LABCURVE_RSTPROTECTION;Protection des tons rouges et chair TP_LABCURVE_RSTPRO_TOOLTIP;Peut être utilisé avec le curseur Chromaticité et la courbe CC. TP_LENSGEOM_AUTOCROP;Recadrage auto @@ -1747,12 +1752,753 @@ TP_LOCALCONTRAST_DARKNESS;Niveau des ombres TP_LOCALCONTRAST_LABEL;Contraste Local TP_LOCALCONTRAST_LIGHTNESS;Niveau des hautes-lumières TP_LOCALCONTRAST_RADIUS;Rayon +TP_LOCALLAB_ACTIV;Luminosité seulement +TP_LOCALLAB_ACTIVSPOT;Activer le Spot +TP_LOCALLAB_ADJ;Egalisateur couleur +TP_LOCALLAB_AMOUNT;Quantité +TP_LOCALLAB_ARTIF;Détection de forme +TP_LOCALLAB_ARTIF_TOOLTIP;Le seuil deltaE étendue accroit la plage of étendue-deltaE - les valeurs élévées sont pour les images à gamut élévé.\nAugmenter l'affaiblissement deltaE améliore la détection de forme, mais peu réduire la capacité de détection. +TP_LOCALLAB_AUTOGRAY;Automatique +TP_LOCALLAB_AVOID;Evite les dérives de couleurs +TP_LOCALLAB_BALAN;Balance ΔE ab-L +TP_LOCALLAB_BALANEXP;Balance Laplacien +TP_LOCALLAB_BALANH;Balance ΔE C-H +TP_LOCALLAB_BALAN_TOOLTIP;Change l'algorithme des paramètres ΔE.\nPlus ou moins ab-L, plus ou moins C-H.\nPas pour le Debruitage +TP_LOCALLAB_BASELOG;Base Logarithme +TP_LOCALLAB_BILATERAL;Filtre Bilateral +TP_LOCALLAB_BLACK_EV;Noir Ev +TP_LOCALLAB_BLCO;Chrominance seulement +TP_LOCALLAB_BLENDMASKCOL;Mélange - fusion +TP_LOCALLAB_BLENDMASKMASK;Ajout/soustrait masque Luminance +TP_LOCALLAB_BLENDMASKMASKAB;Ajout/soustrait masque Chro. +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;Si ce curseur = 0 pas d'action.\nAjoute ou soustrait le masque de l'image originale +TP_LOCALLAB_BLENDMASK_TOOLTIP;Si fusion = 0 seule la détection de forme est améliorée.\nSi fusion > 0 le masque est ajouté à l'image. Si fusion < 0 le masque est soustrait à l'image +TP_LOCALLAB_BLGUID;Filtre guidé +TP_LOCALLAB_BLINV;Inverse +TP_LOCALLAB_BLLC;Luminance & Chrominance +TP_LOCALLAB_BLLO;Luminance seulement +TP_LOCALLAB_BLMED;Median +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct floute et bruite avec tous les réglages.\nInverse floute et bruite avec tous les réglages. Soyez prudents certains resultats peuvent être curieux +TP_LOCALLAB_BLNOI_EXP;Flouter & Bruit +TP_LOCALLAB_BLNORM;Normal +TP_LOCALLAB_BLUFR;Flouter - Grain - Debruiter +TP_LOCALLAB_BLUMETHOD_TOOLTIP;Pour flouter l'arrère plan et isoler le premier plan:\n*Flouter l'arrière plan avec un RT-spot couvrant totalement l'image (valeurs élevées Etendue et transition) - normal ou inverse.\n*Isoler le premier plan avec un ou plusieurs RT-spot Exclusion avec l'outils que vous voulez (accroître Etendue).\n\nCe module peut être utilisé en réduction de bruit additionnelle,incluant un "median" et un "Filtre Guidé" +TP_LOCALLAB_BLUR;Flou Gaussien - Bruit - Grain +TP_LOCALLAB_BLURCOL;Rayon floutage +TP_LOCALLAB_BLURCOLDE_TOOLTIP;L'image pour calculer dE est légèrement floutéeafin d'éviter de prendre en compte des pixels isolés. +TP_LOCALLAB_BLURDE;Flouter la détection de forme +TP_LOCALLAB_BLURLC;Luminance seulement +TP_LOCALLAB_BLURLEVELFRA;Flouter niveaux +TP_LOCALLAB_BLURMASK_TOOLTIP;Génère un masque flou, prend en compte la structure avec le curseur de seuil de contraste du Masque flou. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Vous permet de faire varier "rayon" du flou Gaussien (0 to 1000) +TP_LOCALLAB_BLUR_TOOLNAME;Flouter/Grain & Réduction du Bruit - 1 +TP_LOCALLAB_BLWH;Tous les changements forcés en noir et blanc +TP_LOCALLAB_BLWH_TOOLTIP;Force le changement de la composante "a" et "b" à zéro.\nUtile quand l'utilisateur choisit un processus noir et blanc, ou un film. +TP_LOCALLAB_BUTTON_ADD;Ajouter +TP_LOCALLAB_BUTTON_DEL;Effacer +TP_LOCALLAB_BUTTON_DUPL;Dupliquer +TP_LOCALLAB_BUTTON_REN;Renommer +TP_LOCALLAB_BUTTON_VIS;Montrer/Cacher +TP_LOCALLAB_BWFORCE;Utilise Black Ev & White Ev +TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Pic Luminance) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapté au CAM16. Vous permet de modifier la fonction PQ interne (généralement 10 000 cd/m2 - 100 cd/m2 par défaut - désactivée pour 100 cd/m2).\nPeut être utilisé pour s'adapter à différents appareils et images. +TP_LOCALLAB_CAM16_FRA;Cam16 Adjustements Image +TP_LOCALLAB_CAMMODE;CAM modèle +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CBDL;Contr. par niveaux détail +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Ajuste les tons moyens et les réhausse. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Agit comme un outil ondelettes.\nLe premier niveau (0) agit sur des détails de 2x2.\nLe dernier niveau (5) agit sur des détails de 64x64. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Empêche d'augmenter le bruit +TP_LOCALLAB_CBDL_TOOLNAME;Contraste par niveaux de détail - 2 +TP_LOCALLAB_CENTER_X;Centre X +TP_LOCALLAB_CENTER_Y;Centre Y +TP_LOCALLAB_CH;CL - LC +TP_LOCALLAB_CHROMA;Chrominance +TP_LOCALLAB_CHROMABLU;Niveaux Chroma +TP_LOCALLAB_CHROMABLU_TOOLTIP;Agit comme un amplificateur-reducteur d'action en comparant aux réglages de luma.\nEn dessous de 1 reduit, au dessus de 1 amplifie +TP_LOCALLAB_CHROMACBDL;Chroma +TP_LOCALLAB_CHROMACB_TOOLTIP;Agit comme un amplificateur-reducteur d'action en comparant aux curseurs de luminance.\nEn dessous de 100 reduit, au dessus de 100 amplifie +TP_LOCALLAB_CHROMALEV;Niveaux de Chroma +TP_LOCALLAB_CHROMASKCOL;Chroma +TP_LOCALLAB_CHROMASK_TOOLTIP;Vous pouvez utiliser ce curseur pour désaturer l'arrière plan (inverse masque - courbe proche de 0).\nEgalement pour atténier ou accroître l'action du masque sur la chroma +TP_LOCALLAB_CHRRT;Chroma +TP_LOCALLAB_CIE;Apparance de couleurs(Cam16 & JzCzHz) +TP_LOCALLAB_CIEC;Utilise les paramètres de CIECAM +TP_LOCALLAB_CIECAMLOG_TOOLTIP;Ce module est basé sur le modèle d'apparence des couleurs CIECAM qui a été conçu pour mieux simuler la façon dont la vision humaine perçoit les couleurs dans différentes conditions d'éclairage. le moment de la prise de vue.\nLe deuxième processus Ciecam "Réglages d'image" est simplifié et n'utilise que 3 variables (contraste local, contraste J, saturation s).\nLe troisième processus Ciecam "Conditions de visualisation" adapte la sortie aux conditions de visualisation souhaitées ( moniteur, téléviseur, projecteur, imprimante, etc.) afin que l'aspect chromatique et le contraste soient préservés dans l'environnement d'affichage. +TP_LOCALLAB_CIECOLORFRA;Couleur +TP_LOCALLAB_CIECONTFRA;Contraste +TP_LOCALLAB_CIELIGHTCONTFRA;Eclaircir & Contraste +TP_LOCALLAB_CIELIGHTFRA;Eclaicir +TP_LOCALLAB_CIEMODE;Change position outils +TP_LOCALLAB_CIEMODE_COM;Défaut +TP_LOCALLAB_CIEMODE_DR;Dynamic Range +TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +TP_LOCALLAB_CIEMODE_TOOLTIP;En Mode par défaut, Ciecam est ajouté en fin de processus. "Masque et modifications" et "Recovery based on luminance mask" sont disponibles pour "Cam16 et JzCzHz" à votre disposition.\nVous pouvez également intégrer Ciecam dans d'autres outils si vous le souhaitez (TM, Wavelet, Dynamic Range, Log Encoding). Les résultats pour ces outils seront différents de ceux sans Ciecam. Dans ce mode, vous pouvez également utiliser "Masque et modifications" et "Récupération basée sur le masque de luminance" +TP_LOCALLAB_CIEMODE_WAV;Ondelettes +TP_LOCALLAB_CIETOOLEXP;Courbes +TP_LOCALLAB_CIE_TOOLNAME;Apparance de couleurs (Cam16 & JzCzHz) +TP_LOCALLAB_CIRCRADIUS;Taille Spot +TP_LOCALLAB_CIRCRAD_TOOLTIP;Contient les références du RT-spot, utile pour la détection de forme (couleur, luma, chroma, Sobel).\nLes faibles valeurs peuvent être utiles pour les feuillages.\nLes valeurs élevées peuvent être utile pour la peau +TP_LOCALLAB_CLARICRES;Fusion Chroma +TP_LOCALLAB_CLARIFRA;Clarté & Masque netteté/Fusion & adoucir +TP_LOCALLAB_CLARIJZ_TOOLTIP;En dessous ou égal à 4, 'Masque netteté' est actif.\nAu dessus du niveau ondelettes 5 'Clarté' est actif. +TP_LOCALLAB_CLARILRES;Fusion Luma +TP_LOCALLAB_CLARISOFT;Rayon adoucir +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;Le curseur « Rayon adoucir » (algorithme de filtre guidé) réduit les halos et les irrégularités pour les ondelettes de clarté, de masque net et de contraste local Jz. +TP_LOCALLAB_CLARISOFT_TOOLTIP;Actif pour Clarté et Masque de netteté si différent de zéro.\n\nActif pour toutes les pyramides ondelettes.\nInactif si rayon = 0 +TP_LOCALLAB_CLARITYML;Clarté +TP_LOCALLAB_CLARI_TOOLTIP;En dessous ou égal à 4, 'Masque netteté' est actif.\nAu dessus du niveau ondelettes 5 'Clarté' est actif.\nUtilesu=i vous utilisez 'Compression dynamique des niveaux' +TP_LOCALLAB_CLIPTM;Clip Recupère données (gain) +TP_LOCALLAB_COFR;Couleur & Lumière +TP_LOCALLAB_COLORDE;Couleur prévis. sélection ΔE - Intensité +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Bouton Prévisualisation ΔE a besoin qu'un seul outil soit activé (expander).\nPour pouvoir avoir une Prévisualisation ΔE avec plusieurs outils activés utiliser Masque et modifications - Prévisualisation ΔE +TP_LOCALLAB_COLORDE_TOOLTIP;Affiche la prévisualisation ΔE en bleu si négatif et en vert si positif.\n\nMasque et modifications (montre modifications sans masque): montre les modifications réelles si positf, montre les modifications améliorées (luminance seule) en bleu et jaune si négatif. +TP_LOCALLAB_COLORSCOPE;Etendue Outils Couleur +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Utilise une étendue commune pour Couleur et lumière, Ombres Lumières, Vibrance.\nLes autres outils ont leur étendue spécifique. +TP_LOCALLAB_COLOR_TOOLNAME;Couleur & Lumière - 11 +TP_LOCALLAB_COL_NAME;Nom +TP_LOCALLAB_COL_VIS;Statut +TP_LOCALLAB_COMPFRA;Niveaux Contraste directionnel +TP_LOCALLAB_COMPREFRA;Niveaux de (de)compression dynamique +TP_LOCALLAB_CONTCOL;Seuil de Contraste Masque flou +TP_LOCALLAB_CONTFRA;Contraste par niveau +TP_LOCALLAB_CONTRAST;Contraste +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Contrôle de contraste du masque. +TP_LOCALLAB_CONTRESID;Contraste +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Vous permet de déterminer quelles parties de l'image seront concernées par la texture. +TP_LOCALLAB_CONTTHR;Seuil contraste +TP_LOCALLAB_CONTWFRA;Contrast Local +TP_LOCALLAB_CSTHRESHOLD;Ondelettes niveaux +TP_LOCALLAB_CSTHRESHOLDBLUR;Masque Ondelettes niveau +TP_LOCALLAB_CURV;Luminosité - Contraste - Chrominance "Super" +TP_LOCALLAB_CURVCURR;Normal +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;Si la courbe est au sommet,le masque est compétement noir aucune transformation n'est réalisée par le masque sur l'image.\nQuand vous descendez la courbe, progressivement le masque va se colorer et s'éclaicir, l'image change de plus en plus.\nVous pouvez choisir ou non de positionner le sommet de la courbe sur la transition. +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;Si la courbe est au sommet, le masque est compétement noir aucune transformation n'est réalisée par le masque sur l'image.\nQuand vous descendez la courbe, progressivement le masque va se colorer et s'éclaicir, l'image change de plus en plus.\n\nIl est recommendé (pas obligatoire) de positionner le sommet des courbes curves sur la ligne de transition grise qui représnte les références (chroma, luma, couleur). +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;Pour être actif, vous devez activer la combobox 'Curves type' +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Courbe tonale +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), peut être utilisée avec L(H) dans Couleur et lumière +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', la courbe L=f(L) a le même algorithme que le curseur luminosité.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts. +TP_LOCALLAB_CURVNONE;Désactive courbes +TP_LOCALLAB_DARKRETI;Obscuirité +TP_LOCALLAB_DEHAFRA;Elimination de la brume +TP_LOCALLAB_DEHAZ;Force +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Élimine la brume atmosphérique. Augmente généralement la saturation et les détails. \ N Peut supprimer les dominantes de couleur, mais peut également introduire une dominante bleue qui peut être corrigée à l'aide d'autres outils. +TP_LOCALLAB_DEHAZ_TOOLTIP;Valeurs Négatives ajoute de la brume +TP_LOCALLAB_DELTAD;Delta balance +TP_LOCALLAB_DELTAEC;Masque ΔE Image +TP_LOCALLAB_DENOI1_EXP;De-bruite basé sur masque luminance +TP_LOCALLAB_DENOI2_EXP;Récupération basée sur masque luminance +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Traite le bruit d'impulsion (poivre et sel) +TP_LOCALLAB_DENOICHROC_TOOLTIP;Agit sur les paquets et amas de bruit de chrominance +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Permet de récupérer les détails de chrominance par mise en oeuvre progressive de la transformée de Fourier (DCT) +TP_LOCALLAB_DENOICHROF_TOOLTIP;Agit sur les fins détails du bruit de chrominance +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Equilibre l'action de denoise chrominance entre les bleus-jaunes et les rouges-verts +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Equilibre l'action de denoise luminance entre les ombres et les lumières +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Permet de récupérer les détails de luminance par mise en oeuvre progressive de la transformée de Fourier (DCT) +TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservatif préserve les fréquences basses, alors que agressif tend à les effacer.\nConservatif et agressif utilisent les ondelletes et DCT et peuvent être utilisées en conjonction avec "débruitage par morceaux - luminance" +TP_LOCALLAB_DENOITHR_TOOLTIP;Règle l'effet de bord pour privilégier l'action sur les aplats +TP_LOCALLAB_DENOI_EXP;Réduction du bruit +TP_LOCALLAB_DENOI_TOOLTIP;Ce module peut être utilisé seul (à la fin du processus), ou en complément de Réduction du bruit (au début).\nEtendue(deltaE)permet de différencier l'action.\nVous pouvez compléter avec "median" ou "Filtre guidé" (Adoucir Flou...).\nVous pouvez compléter l'action avec "Flou niveaux" "Ondelette pyramide" +TP_LOCALLAB_DEPTH;Profondeur +TP_LOCALLAB_DETAIL;Contraste local +TP_LOCALLAB_DETAILFRA;Détection bord - DCT +TP_LOCALLAB_DETAILSH;Details +TP_LOCALLAB_DETAILTHR;Seuil Detail Luma-Chroma +TP_LOCALLAB_DUPLSPOTNAME;Copier +TP_LOCALLAB_EDGFRA;Netteté des bords +TP_LOCALLAB_EDGSHOW;Montre tous les outils +TP_LOCALLAB_ELI;Ellipse +TP_LOCALLAB_ENABLE_AFTER_MASK;Utilise Tone Mapping +TP_LOCALLAB_ENABLE_MASK;Active masque +TP_LOCALLAB_ENABLE_MASKAFT;Utilise tous les algorithmes Exposition +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;Si activé, le Masque utilise les données recupérées après 'Transmission Map' au lieu des données originales +TP_LOCALLAB_ENH;Amélioré +TP_LOCALLAB_ENHDEN;Amélioré + chroma réduction bruit +TP_LOCALLAB_EPSBL;Detail +TP_LOCALLAB_EQUIL;Normalise Luminance +TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruit la luminance de telle manière que la moyenne et la variance de l'image traitée soient identiques à celle d'origine +TP_LOCALLAB_ESTOP;Arrêt des bords +TP_LOCALLAB_EV_DUPL;Copier vers +TP_LOCALLAB_EV_NVIS;Cacher +TP_LOCALLAB_EV_NVIS_ALL;Cacher tout +TP_LOCALLAB_EV_VIS;Montrer +TP_LOCALLAB_EV_VIS_ALL;Montrer tout +TP_LOCALLAB_EXCLUF;Exclure +TP_LOCALLAB_EXCLUF_TOOLTIP;Peut être utilsé pour exclure une partie des données - agir sur Etendue pour prendre en compte plus de couleurs.\n Vous pouvez utiliser tous les réglages pour ce type de RT-spot. +TP_LOCALLAB_EXCLUTYPE;Spot méthode +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Spot Normal utilise les données récursives.\n\nSpot exclusion réinitialise les données d'origine.\nPeut être utilsé pour annuler totalement ou partiellement une action précédente ou pour réaliser un mode inverse.\n\nImage entière vous permet d'utiliser 'local adjustments" sur le totalité de l'image.\nLes délimiteurs sont positionnés au delà de la prévisualisation\nTransition est mis à 100.\nVous pouvez avoir à repositionner le Spot ainsi que sa taille pour obtenir les effets désirés.\nNotez que l'utilisation de De-bruite, ondelettes, FFTW en image entière va utiliser de grosses quantités de mémoire, et peut amener l'application à 'planter' sur des systèmes à faible capacité. +TP_LOCALLAB_EXECLU;Spot Exclusion +TP_LOCALLAB_EXFULL;Image entière +TP_LOCALLAB_EXNORM;Spot Normal +TP_LOCALLAB_EXPCBDL_TOOLTIP;Peut être utilisé pour retirer les marques sur le capteur ou la lentille. +TP_LOCALLAB_EXPCHROMA;Chroma compensation +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Seulement en association avec compensation d'exposition et PDE Ipol.\nEvite la desaturation des couleurs +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Ajuste les couleurs, la luminosité, le contrast et corrige les petits défauts tels que teux-rouges, poussières sur le capteur, etc. +TP_LOCALLAB_EXPCOMP;Compensation d'exposition ƒ +TP_LOCALLAB_EXPCOMPINV;Compensation d'exposition +TP_LOCALLAB_EXPCOMP_TOOLTIP;Pour les portraits et les images à faible gradient, vous pouvez changer "Détection de forme" dans "Réglages":\n\nAugmentez 'Seuil ΔE Etendue'\nRéduire 'ΔE affaiblissement'\nAugmenter 'Balance ΔE ab-L' +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;Voir la documentation de ondelettes niveaux.\nCependant il y a des différences: plus d'outils et plus proches des détails .\nEx: Tone mapping pour ondelettes. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Evitez les spots trop petits(< 32x32 pixels).\nUtilisez de faibles valeurs de transition et de hautes valeurs de transition affaiblissement et d'Etendue pour simuler un petit RT-spot et s'adapter aux défauts.\nUtimiser si nécessaire le module 'Clarté & Maqsue netteté' et 'Fusion d'images' en ajustant 'Rayon adoucir' pour réduire les artéfacts. +TP_LOCALLAB_EXPCURV;Courbes +TP_LOCALLAB_EXPGRAD;Filtre gradué +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;Un filtre gardué est disponible dans Couleur et lumière (luminance, chrominance & teinte gradients, et "Fusion fichier") Exposure (luminance grad.), Exposition Masque(luminance grad.), Ombres/lumières (luminance grad.), Vibrance (luminance, chrominance & teinte gradients), Local contrast & ondelettes pyramide (local contrast grad.).\nAdoucissement de gradient est dans "Réglages". +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balance l'action entre l'iamge originale image et la transformée de Laplace. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Applique un gamma avant et après la transformée de Laplace +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Ajoute une exposition linéaire avant l'application de la transformée de Laplace +TP_LOCALLAB_EXPLAP_TOOLTIP;Plus vous agissez sur ce curseur de seuil, plus grande sera l'action de reduire le contraste. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Autorise de nombreuses possibilités de fusionner les images (comme les calques dans Photosshop) : difference, multiply, soft light, overlay...avec opacité...\nOriginale Image : fusionne le RT-spot en cours avec Originale.\nSpot Précédent : fusionne le RT-spot en cours avec le précédent - si il n'y a qu'un spot précédent = original.\nArrière plan : fusionne le RT-spot en cours avec la couleur et la luminance de l'arrière plan (moins de possibilités) +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applique un median avant la transformée de Laplace pour éviter les artéfacts (bruit).\nVous pouvez aussi utiliser l'outil "Réduction du bruit". +TP_LOCALLAB_EXPOSE;Plage dynamique & Exposition +TP_LOCALLAB_EXPOSURE_TOOLTIP;Modifie l'exposition dans l'espace L*a*b* en utilisant un Laplacien et les algorithmes PDE en prenant en compte dE, minimise les artéfacts. +TP_LOCALLAB_EXPRETITOOLS;Outils Retinex avancés +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUtiliser de basses valeurs de transition et de hautes valeurs de transition affaiblissement et Etendue pour simuler un petit RT-spot. +TP_LOCALLAB_EXPTOOL;Outils exposition +TP_LOCALLAB_EXP_TOOLNAME;Plage Dynamique & Exposition- 10 +TP_LOCALLAB_FATAMOUNT;Quantité +TP_LOCALLAB_FATANCHOR;Ancre +TP_LOCALLAB_FATDETAIL;Detail +TP_LOCALLAB_FATFRA;Compression Dynamique ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - utilise Fattal Tone mapping algorithme. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATSHFRA;Compression Dynamique Masque +TP_LOCALLAB_FEATH_TOOLTIP;Largeur du Gradient en porcentage de la diagonale du Spot\nUtilisé par tous les Filtres Gradués dans tous les outils.\nPas d'action si les filtres gradués ne sont pas utilisés. +TP_LOCALLAB_FEATVALUE;Adouc. gradient(Filtres Gradués) +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;Utilise une transformée de Fourier pour une meilleure qualité (accroit le temps de traitement et le besoin en mémoire) +TP_LOCALLAB_FFTW;ƒ - Utilise Fast Fourier Transform +TP_LOCALLAB_FFTWBLUR;ƒ - Utilise toujours Fast Fourier Transform +TP_LOCALLAB_FULLIMAGE;Calcule les valeurs NoirEv-blancEv - image entière +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calcule les valeurs Ev sur l'image entière. +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMFRA;Courbe Réponse Tonale (TRC) +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;Gamma et Pente (Slope) autorise une transformation du masque en douceur et sans artefacts en modifiant progressivement "L" pour éviter les discontinuité. +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GRADANG;Angle du Gradient +TP_LOCALLAB_GRADANG_TOOLTIP;Angle de Rotation en degrés : -180 0 +180 +TP_LOCALLAB_GRADFRA;Filtre gradué Masque +TP_LOCALLAB_GRADGEN_TOOLTIP;Filtre Gradué est fourni avec Couleur et Lumière & Fusion fichier, Exposition & masque, Shadows Highlight, Vibrance, Encoding log.\n\nVibrance, Couleur et Lumière & Fusion fichier, sont fournis avec GF luminance, chrominance, teinte.\nAdoucissement est situé dans "réglages". +TP_LOCALLAB_GRADLOGFRA;Filtre Gradué Luminance +TP_LOCALLAB_GRADSTR;Force du Gradient +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filtre chroma force +TP_LOCALLAB_GRADSTRCHRO;Force Gradient Chrominance +TP_LOCALLAB_GRADSTRHUE;Force Gradient Teinte +TP_LOCALLAB_GRADSTRHUE2;Force Gradient Teinte +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filttre Teinte force +TP_LOCALLAB_GRADSTRLUM;Force Gradient Luminance +TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +TP_LOCALLAB_GRAIN_TOOLTIP;Ajoute du grain pour simuler un film +TP_LOCALLAB_GRALWFRA;Filtre Gradué Local contraste +TP_LOCALLAB_GRIDFRAME_TOOLTIP;Vous pouvez utiliser cet outil comme une brosse. Utiliser un petit Spot et adaptez transition et transition affaiblissement\nSeulement en mode NORMAL et éventuellement Teinte, Saturation, Couleur, Luminosité sont concernés par Fusion arrire plan (ΔE) +TP_LOCALLAB_GRIDMETH_TOOLTIP;Virage partiel: la luminance est prise en compte quand varie la chroma -Equivalent de H=f(H) si le "point blanc" sur la grille the grid est à zéro et vous faites varier le "point noir" -Equivalent de "Virage partiel" si vous faites varier les 2 points.\n\nDirect: agit directement sur la chroma +TP_LOCALLAB_GRIDONE;Virage partiel +TP_LOCALLAB_GRIDTWO;Direct +TP_LOCALLAB_GUIDBL;Rayon adoucir +TP_LOCALLAB_GUIDBL_TOOLTIP;Applique un filtre guidé avec un rayon donné, pour réduire les artefacts ou flouter l'image +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Détail - agit sur la répartition du filtre guidé, les valeurs négatives simulent un flou gaussien +TP_LOCALLAB_GUIDFILTER;Rayon Filtre Guidé +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapter cette valeur en fonction des images - peut réduire ou accroître les artéfacts. +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Force du filtre guidé +TP_LOCALLAB_HHMASK_TOOLTIP;Ajustements fin de la teinte par exemple pour la peau. +TP_LOCALLAB_HIGHMASKCOL;Hautes lumières masque +TP_LOCALLAB_HLH;H +TP_LOCALLAB_IND;Independant (souris) +TP_LOCALLAB_INDSL;Independant (souris + curseurs) +TP_LOCALLAB_INVBL_TOOLTIP;Alternative\nPremier Spot:\n image entière - delimiteurs en dehors de la prévisualisation\n RT-spot forme sélection : rectangle. Transition 100\n\nDeuxième spot : Spot Exclusion +TP_LOCALLAB_INVERS;Inverse +TP_LOCALLAB_INVERS_TOOLTIP;Si sélectionné (inverse) moins de possibilités.\n\nAlternative\nPremier Spot:\n image entière - delimiteurs en dehors de la prévisualisation\n RT-spot forme sélection : rectangle. Transition 100\n\nDeuxième spot : Spot Exclusion +TP_LOCALLAB_INVMASK;Algorithme inverse +TP_LOCALLAB_ISOGR;Plus gros (ISO) +TP_LOCALLAB_JAB;Utilise Black Ev & White Ev +TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAjuste automatiquement la relation entre Jz et la saturation en tenant compte de la "luminance absolue". +TP_LOCALLAB_JZ100;Jz référence 100cd/m2 +TP_LOCALLAB_JZ100_TOOLTIP;Ajuste automatiquement le niveau de référence Jz 100 cd/m2 (signal d'image).\nModifie le niveau de saturation et l'action de "l'adaptation PU" (adaptation uniforme perceptuelle). +TP_LOCALLAB_JZADAP;PU adaptation +TP_LOCALLAB_JZCH;Chroma +TP_LOCALLAB_JZCHROM;Chroma +TP_LOCALLAB_JZCLARICRES;Fusion chroma Cz +TP_LOCALLAB_JZCLARILRES;Fusion luma Jz +TP_LOCALLAB_JZCONT;Contraste +TP_LOCALLAB_JZFORCE;Force max Jz à 1 +TP_LOCALLAB_JZFORCE_TOOLTIP;Vous permet de forcer la valeur Jz maximale à 1 pour une meilleure réponse du curseur et de la courbe +TP_LOCALLAB_JZFRA;Jz Cz Hz Ajustements Image +TP_LOCALLAB_JZHFRA;Courbes Hz +TP_LOCALLAB_JZHJZFRA;Courbe Jz(Hz) +TP_LOCALLAB_JZHUECIE;Rotation de teinte +TP_LOCALLAB_JZLIGHT;Brightness +TP_LOCALLAB_JZLOG;Log encoding Jz +TP_LOCALLAB_JZLOGWBS_TOOLTIP;Les réglages Black Ev et White Ev peuvent être différents selon que l'encodage Log ou Sigmoid est utilisé.\nPour Sigmoid, un changement (augmentation dans la plupart des cas) de White Ev peut être nécessaire pour obtenir un meilleur rendu des hautes lumières, du contraste et de la saturation. +TP_LOCALLAB_JZLOGWB_TOOLTIP;Si Auto est activé, il calculera et ajustera les niveaux Ev et la 'luminance moyenne Yb%' pour la zone du spot. Les valeurs résultantes seront utilisées par toutes les opérations Jz, y compris "Log Encoding Jz".\nCalcule également la luminance absolue au moment de la prise de vue. +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb est la luminance relative du fond, exprimée en pourcentage de gris. 18 % de gris correspond à une luminance d'arrière-plan de 50 % lorsqu'elle est exprimée en CIE L.\nLes données sont basées sur la luminance moyenne de l'image.\nLorsqu'elle est utilisée avec Log Encoding, la luminance moyenne est utilisée pour déterminer la quantité de gain nécessaire à appliquer au signal avant le codage logarithmique. Des valeurs inférieures de luminance moyenne se traduiront par un gain accru. +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (uniquement en mode 'Avancé'). Opérationnel uniquement si le périphérique de sortie (moniteur) est HDR (luminance crête supérieure à 100 cd/m2 - idéalement entre 4000 et 10000 cd/m2. Luminance du point noir inférieure à 0,005 cd/m2). Cela suppose a) que l'ICC-PCS pour l'écran utilise Jzazbz (ou XYZ), b) fonctionne en précision réelle, c) que le moniteur soit calibré (si possible avec un gamut DCI-P3 ou Rec-2020), d) que le gamma habituel (sRGB ou BT709) est remplacé par une fonction Perceptual Quantiser (PQ). +TP_LOCALLAB_JZPQFRA;Jz remappage +TP_LOCALLAB_JZPQFRA_TOOLTIP;Permet d'adapter l'algorithme Jz à un environnement SDR ou aux caractéristiques (performances) d'un environnement HDR comme suit :\n a) pour des valeurs de luminance comprises entre 0 et 100 cd/m2, le système se comporte comme s'il était dans un environnement SDR .\n b) pour des valeurs de luminance comprises entre 100 et 10000 cd/m2, vous pouvez adapter l'algorithme aux caractéristiques HDR de l'image et du moniteur.\n\nSi "PQ - Peak luminance" est réglé sur 10000, "Jz remappping" se comporte de la même manière que l'algorithme original de Jzazbz. +TP_LOCALLAB_JZPQREMAP;PQ - Pic luminance +TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - vous permet de modifier la fonction PQ interne (généralement 10000 cd/m2 - par défaut 120 cd/m2).\nPeut être utilisé pour s'adapter à différentes images, processus et appareils. +TP_LOCALLAB_JZQTOJ;Luminance relative +TP_LOCALLAB_JZQTOJ_TOOLTIP;Vous permet d'utiliser "Luminance relative" au lieu de "Luminance absolue" - Brightness devient Lightness.\nLes changements affectent : le curseur Luminosité, le curseur Contraste et la courbe Jz(Jz). +TP_LOCALLAB_JZSAT;Saturation +TP_LOCALLAB_JZSHFRA;Ombres/Lumières Jz +TP_LOCALLAB_JZSOFTCIE;Rayon adoucir (GuidedFilter) +TP_LOCALLAB_JZSTRSOFTCIE;GuidedFilter Force +TP_LOCALLAB_JZTARGET_EV;Luminance moyenne (Yb%) +TP_LOCALLAB_JZTHRHCIE;Seuik Chroma pour Jz(Hz) +TP_LOCALLAB_JZWAVEXP;Ondelettes Jz +TP_LOCALLAB_LABBLURM;Masque Flouter +TP_LOCALLAB_LABEL;Ajustements Locaux +TP_LOCALLAB_LABGRID;Grille correction couleurs +TP_LOCALLAB_LABGRIDMERG;Arrière plan +TP_LOCALLAB_LABGRID_VALUES;Haut(a)=%1 Haut(b)=%2\nBas(a)=%3 Bas(b)=%4 +TP_LOCALLAB_LABSTRUM;Masque Structure +TP_LOCALLAB_LAPLACC;ΔØ Masque Laplacien résoud PDE +TP_LOCALLAB_LAPLACE;Laplacien seuil ΔE +TP_LOCALLAB_LAPLACEXP;Laplacien seuil +TP_LOCALLAB_LAPMASKCOL;Laplacien seuil +TP_LOCALLAB_LAPRAD1_TOOLTIP;Eviter d'utiliser Radius and Laplace Seuil en même temps.\nTransforme le masque pour éliminer les valeurs inférieures au seuil.\nReduit les artefacts et le bruit, et permet une modification du contraste local. +TP_LOCALLAB_LAPRAD_TOOLTIP;Eviter d'utiliser Radius and Laplace Seuil en même temps.\nLaplacien seuil reduit le contraste, artéfacts, adoucit le résultat. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Résoud PDE (Equation aux dérivées partielles) pour tous les masques Laplacien.\nSi activé Laplacien masque seuil reduit les artéfacts et adoucit les résultats.\nSi désactivé réponse linaire. +TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT améliore la qualité et autorise de grands rayons, mais accroît les temps de traitement.\nCe temps dépends de la surface devant être traitée.\nA utiliser de préférences pour de grands rayons.\n\nLes Dimensions peuvent être réduites de quelques pixels pour optimiser FFTW.\nCette optimisation peut réduire le temps de traitement d'un facteur de 1.5 à 10.\n +TP_LOCALLAB_LC_TOOLNAME;Constraste Local & Ondelettes - 7 +TP_LOCALLAB_LEVELBLUR;Maximum Flouter +TP_LOCALLAB_LEVELWAV;Ondelettes Niveaux +TP_LOCALLAB_LEVELWAV_TOOLTIP;Le niveau est automatiquement adapté à la taille du spot et de la prévisualisation.\nDu niveau 9 taille max 512 jusqu'au niveau 1 taille max = 4 +TP_LOCALLAB_LEVFRA;Niveaux +TP_LOCALLAB_LIGHTNESS;Luminosité +TP_LOCALLAB_LIGHTN_TOOLTIP;En mode inverse: selection = -100 force la luminance à zero +TP_LOCALLAB_LIGHTRETI;Luminosité +TP_LOCALLAB_LINEAR;Linéarité +TP_LOCALLAB_LIST_NAME;Ajoute un outil au spot courant... +TP_LOCALLAB_LIST_TOOLTIP;Vous pouvez choisir 3 niveaux de complexité pour chaque outil: Basic, Normal & Avancé.\nLe réglage par défaut est Basic mais il peut être changé dans Préférences.\nVous pouvez aussi changer ce niveau pour chaque outil en cours. +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Donne priorité à l'action sur les tons moyens et hautes lumières en choisissant les niveaux concernés d'ondelettes +TP_LOCALLAB_LMASK_LL_TOOLTIP;Vous permet de modifier librement le contraste du masque. Peut amener de artefacts. +TP_LOCALLAB_LOCCONT;Masque Flou +TP_LOCALLAB_LOC_CONTRAST;Contr. Local & Ondelettes +TP_LOCALLAB_LOC_CONTRASTPYR;Pyramide 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramide 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contr. par niveaux/TM/Cont.Dir. +TP_LOCALLAB_LOC_CONTRASTPYRLAB; Filtre Gradué/Netteté bords/Flou +TP_LOCALLAB_LOC_RESIDPYR;Image Residuelle +TP_LOCALLAB_LOG;Log Encoding +TP_LOCALLAB_LOG1FRA;CAM16 Adjustment Images +TP_LOCALLAB_LOG2FRA;Conditions de visionnage +TP_LOCALLAB_LOGAUTO;Automatique +TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Calcule automatiquement la « luminance moyenne » pour les conditions de la scène. +TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Calcule automatiquement la « luminance moyenne » pour les conditions de la scène lorsque le bouton « Automatique » dans les niveaux d'exposition relatifs est enfoncé. +TP_LOCALLAB_LOGAUTO_TOOLTIP;Appuyez sur ce bouton pour calculer la plage dynamique et la « Luminance moyenne » pour les conditions de la scène si la « Luminance moyenne automatique (Yb %) » est cochée).\nCalcule également la luminance absolue au moment de la prise de vue.\nAppuyez à nouveau sur le bouton pour ajuster les valeurs calculées automatiquement. +TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +TP_LOCALLAB_LOGCATAD_TOOLTIP;L'adaptation chromatique permet d'interpréter une couleur en fonction de son environnement spatio-temporel.\nUtile lorsque la balance des blancs s'écarte sensiblement de la référence D50.\nAdapte les couleurs à l'illuminant du périphérique de sortie. +TP_LOCALLAB_LOGCIE;Log encoding au lieu de Sigmoid +TP_LOCALLAB_LOGCIE_TOOLTIP;Vous permet d'utiliser Black Ev, White Ev, Scene Mean luminance (Yb%) et Viewing Mean luminance (Yb%) pour le mappage des tons à l'aide de l'encodage Log Q. +TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Quantité de teinte perçue par rapport au gris.\nIndicateur qu'un stimulus apparaît plus ou moins coloré. +TP_LOCALLAB_LOGCONQL;Contraste (Q) +TP_LOCALLAB_LOGCONTHRES;Contrast seuil (J & Q) +TP_LOCALLAB_LOGCONTL;Contraste (J) +TP_LOCALLAB_LOGCONTL_TOOLTIP;Le contraste (J) dans CIECAM16 prend en compte l'augmentation de la coloration perçue avec la luminance +TP_LOCALLAB_LOGCONTQ_TOOLTIP;Le contraste (Q) dans CIECAM16 prend en compte l'augmentation de la coloration perçue avec la luminosité (brightness). +TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Ajuste la plage de contraste des tons moyens (J et Q).\nLes valeurs positives réduisent progressivement l'effet des curseurs Contraste (J et Q). Les valeurs négatives augmentent progressivement l'effet des curseurs Contraste. +TP_LOCALLAB_LOGDETAIL_TOOLTIP;Agit principalement sur les hautes frequences. +TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUtile pour les images sous-exposées ou les images avec une plage dynamique élevée.\n\nProcessus en deux étapes : 1) Calcul de la plage dynamique 2) Réglage manuel +TP_LOCALLAB_LOGEXP;Tous les outils +TP_LOCALLAB_LOGFRA;Scene Conditions +TP_LOCALLAB_LOGFRAME_TOOLTIP;Vous permet de calculer et d'ajuster les niveaux Ev et la 'luminance moyenne Yb%' (point gris source) pour la zone du spot. Les valeurs résultantes seront utilisées par toutes les opérations Lab et la plupart des opérations RVB du pipeline.\nCalcule également la luminance absolue au moment de la prise de vue. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Prend en compte les variables Ciecam correspondantes : c'est-à-dire le contraste (J) et la saturation (s), ainsi que le contraste (Q), la luminosité (Q), la luminosité (J) et la couleur (M) (en mode avancé) +TP_LOCALLAB_LOGLIGHTL;Lightness (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Proche de lightness (L*a*b*). Prend en compte l'augmentation de la coloration perçue +TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Quantité de lumière perçue émanant d'un stimulus.\nIndicateur qu'un stimulus semble être plus ou moins brillant, clair. +TP_LOCALLAB_LOGLIN;Logarithm mode +TP_LOCALLAB_LOGPFRA;Niveaux Exposition relatifs +TP_LOCALLAB_LOGREPART;Force Globale +TP_LOCALLAB_LOGREPART_TOOLTIP;Vous permet d'ajuster la force relative de l'image encodée en journal par rapport à l'image d'origine.\nN'affecte pas le composant Ciecam. +TP_LOCALLAB_LOGSATURL_TOOLTIP;La saturation(s) dans CIECAM16 correspond à la couleur d'un stimulus par rapport à sa propre luminosité.\nAgit principalement sur les tons moyens et sur les hautes lumières. +TP_LOCALLAB_LOGSCENE_TOOLTIP;Correspond aux conditions de prise de vue. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Modifie les tonalités et les couleurs pour prendre en compte les conditions de la scène.\n\nMoyen : conditions d'éclairage moyennes (standard). L'image ne changera pas.\n\nDim : conditions de luminosité. L'image deviendra légèrement plus lumineuse.\n\nSombre : conditions sombres. L'image deviendra plus lumineuse. +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Correspond au support sur lequel sera visualisée l'image finale (moniteur, TV, projecteur, imprimante...), ainsi qu'aux conditions environnantes. +TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +TP_LOCALLAB_LUM;LL - CC +TP_LOCALLAB_LUMADARKEST;Plus Sombre +TP_LOCALLAB_LUMASK;Masque Luminance arrière plan +TP_LOCALLAB_LUMASK_TOOLTIP;Ajuste le gris de l'arrière plan du masque dans Montrer Masque (Masque et modifications) +TP_LOCALLAB_LUMAWHITESEST;Plus clair +TP_LOCALLAB_MASFRAME;Masque et Fusion +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and mask blur, structure(if enabled tool) are used.\nDisabled in Inverse +TP_LOCALLAB_MASK;Masque +TP_LOCALLAB_MASK2;Courbe de Contraste +TP_LOCALLAB_MASKCOM;Masque couleur Commun +TP_LOCALLAB_MASKCOM_TOOLNAME;Masque Commun Couleur - 12 +TP_LOCALLAB_MASKCOM_TOOLTIP;Ces masques travaillent comme les autres outils, ils prennet en compte Etendue.\nIls sont différents des autres masques qui complètent un outil (Couleur et Lumière, Exposition...) +TP_LOCALLAB_MASKCURVE_TOOLTIP;Si la courbe est au sommet, le masque est compétement noir aucune transformation n'est réalisée par le masque sur l'image.\nQuand vous descendez la courbe, progressivement le masque va se colorer et s'éclaicir, l'image change de plus en plus.\n\nIl est recommendé (pas obligatoire) de positionner le sommet des courbes curves sur la ligne de transition grise qui représnte les références (chroma, luma, couleur). +TP_LOCALLAB_MASKDDECAY;Force des transitions +TP_LOCALLAB_MASKDECAY_TOOLTIP;Gère le taux des tranistions des niveaux gris dans le masque.\n Transition = 1 linéaire, Transition > 1 transitions paraboliques rapides, Transitions < 1 transitions progressives +TP_LOCALLAB_MASKDE_TOOLTIP;Utilisé pour diriger l'action de de-bruite basé sur les informations des courbes masques L(L) ou LC(H) (Masque et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Si le masque est en dessous du seuil sombre le De-bruite sera appliqué progressivement.\n Si le masque est au-dessus du seuil 'clair', le De-bruite sera appliqué progressivement.\n Entre les deux, les réglages sans De-bruite seront maintenus, sauf si vous agissez sur les curseurs "Zones grise dé-bruite luminance" or "Zones grise de-bruite chrominance". +TP_LOCALLAB_MASKGF_TOOLTIP;Utilisé pour diriger l'action de Filtre Guidé basé sur les informations des courbes masques L(L) ou LC(H) (Masque et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Si le masque est en dessous du seuil sombre le Filtre Guidé sera appliqué progressivement.\n Si le masque est au-dessus du seuil 'clair', le Filtre Guidé sera appliqué progressivement.\n Entre les deux, les réglages sans Filtre Guidé seront maintenus. +TP_LOCALLAB_MASKH;Courbe teinte +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Limite des tons clairs au-dessus de laquelle CBDL (luminance) sera restauré progressivement à leurs valeurs avant d'être modifiés par CBDL.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Limite des tons clairs au-dessus de laquelle Couleur et Lumière sera restauré progressivement à leurs valeurs avant d'être modifiés par Couleur et Lumières .\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris: ‘masque structure’, 'masque flouter', ‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’, ‘Niveau contraste local ondelettes’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;Limite des tons clairs au-dessus de laquelle de-bruite sera appliquée progressivement.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris: ‘masque structure’,‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’, ‘Niveau contraste local ondelettes’.Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées.\n Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Limite des tons clairs au-dessus de laquelle Compression dynamique et Exposition sera restauré progressivement à leurs valeurs avant d'être modifiés par Compression dynamique et Exposition.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Limite des tons clairs au-dessus de laquelle Codage Log sera restauré progressivement à leurs valeurs avant d'être modifiés par Codage Log.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Limite des tons clairs au-dessus de laquelle Retinex (luminance) sera restauré progressivement à leurs valeurs avant d'être modifiés par Retinex.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Limite des tons clairs au-dessus de laquelle Ombres et Lumière sera restauré progressivement à leurs valeurs avant d'être modifiés par Ombres et Lumières .\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Limite des tons clairs au-dessus de laquelle Compression tonale sera restauré progressivement à leurs valeurs avant d'être modifiés par Compression tonale.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Maqsue luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Limite des tons clairs au-dessus de laquelle Vibrance - Chaud Froid sera restauré progressivement à leurs valeurs avant d'être modifiés par Vibrance - Chaud Froid.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Limite des tons clairs au-dessus de laquelle Contraste local - Ondelettes sera restauré progressivement à leurs valeurs avant d'être modifiés par Contraste local - Ondelettes.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;Limite des tons clairs au-dessus de laquelle Filtre Guidé sera appliquée progressivement.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris: ‘masque structure’,‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’, ‘Niveau contraste local ondelettes’.Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées.\n Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLCTHR;Seuil luminance zones claires +TP_LOCALLAB_MASKLCTHRLOW;Seuil luminance zones sombres +TP_LOCALLAB_MASKLCTHRMID;Zones grises de-bruite lumina +TP_LOCALLAB_MASKLCTHRMIDCH;Zones grises de-bruite chroma +TP_LOCALLAB_MASKLC_TOOLTIP;Vous autorise à cibler le de-bruite en se basant sur les informations du masque dans L(L) ou LC(H) (Masque et Modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n si le masque est très sombre - sous le seuil 'sombre' - de-bruite sera accru si renforce > 1.\n si le masque est clair - au-dessus du seuil 'clair' - de-bruite sera progressivement réduit.\n entre les deux, de-bruite sera maintenu aux réglages sans masques. +TP_LOCALLAB_MASKLNOISELOW;Renf. de-bruite sombres/claires +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Limite des tons sombres au-dessous de laquelle CBDL (luminance) sera restauré progressivement à leurs valeurs avant d'être modifiés par CBDL.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Limite des tons sombres au-dessous de laquelle Couleur et Lumière sera restauré progressivement à leurs valeurs avant d'être modifiés par Couleur et Lumières .\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris: ‘masque structure’, 'masque flouter', ‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’, ‘Niveau contraste local ondelettes’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;Limite des tons sombres au-dessous de laquelle de-bruite sera appliquée progressivement.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris: ‘masque structure’,‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’, ‘Niveau contraste local ondelettes’.Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées.\n Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Limite des tons sombres au-dessous de laquelle Compression dynamique et Exposition sera restauré progressivement à leurs valeurs avant d'être modifiés par Compression dynamique et Exposition.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Limite des tons sombres au-dessous de laquelle Codage Log sera restauré progressivement à leurs valeurs avant d'être modifiés par Codage Log.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Limite des tons sombres au-dessous de laquelle Retinex (luminance) sera restauré progressivement à leurs valeurs avant d'être modifiés par Retinex.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Limite des tons sombres au-dessous de laquelle Ombres et Lumière sera restauré progressivement à leurs valeurs avant d'être modifiés par Ombres et Lumières .\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Limite des tons sombres au-dessous de laquelle Compression tonale sera restauré progressivement à leurs valeurs avant d'être modifiés par Compression tonale.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Limite des tons sombres au-dessous de laquelle Vibrance - Chaud Froid sera restauré progressivement à leurs valeurs avant d'être modifiés par Vibrance - Chaud Froid.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Limite des tons sombres au-dessous de laquelle Contraste local - Ondelettes sera restauré progressivement à leurs valeurs avant d'être modifiés par Contraste local - Ondelettes.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris:‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’.\n Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées. Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;Limite des tons sombres au-dessous de laquelle Filtre Guidé sera appliquée progressivement.\n Vous pouvez utiliser certains des outils de ‘Masques et modifications’ pour changer les niveaux de gris: ‘masque structure’,‘rayon adoucir’, ‘Gamma et pente’, ‘courbe de Contraste’, ‘Niveau contraste local ondelettes’.Utiliser une ‘ancre de vérification couleur’ sur le masque pour voir quelle zones seront affectées.\n Soyez attentifs à ce que dans 'Réglages' Masque luminance arrière plan = 0 +TP_LOCALLAB_MASKRECOL_TOOLTIP;Utilisé pour moduler l'action des réglages de Couleur et Lumières en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Couleurs et Lumières \n Entre ces 2 valeurs, les valeurs de Couleurs et Lumières seront appliquées +TP_LOCALLAB_MASKRECOTHRES;Seuil de Récupération +TP_LOCALLAB_MASKREEXP_TOOLTIP;Utilisé pour moduler l'action des réglages de Compression dynamique et Exposition en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Compression dynamique et Exposition \n Entre ces 2 valeurs, les valeurs de Compression dynamique et Exposition seront appliquées +TP_LOCALLAB_MASKRELOG_TOOLTIP;Utilisé pour moduler l'action des réglages de Codage Log en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Codage Log - peut être utilisé pour récupérer les hautes lumières de 'Couleur propagation' \n Entre ces 2 valeurs, les valeurs de Codage Log seront appliquées +TP_LOCALLAB_MASKRESCB_TOOLTIP;Utilisé pour moduler l'action des réglages de CBDL (Luminance) en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par CBDL \n Entre ces 2 valeurs, les valeurs de CBDL seront appliquées +TP_LOCALLAB_MASKRESH_TOOLTIP;Utilisé pour moduler l'action des réglages de Ombres et Lumières en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Ombres et Lumières \n Entre ces 2 valeurs, les valeurs de Ombres et Lumières seront appliquées +TP_LOCALLAB_MASKRESRETI_TOOLTIP;Utilisé pour moduler l'action des réglages de Retinex (Luminance) en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Retinex \n Entre ces 2 valeurs, les valeurs de Retinex seront appliquées +TP_LOCALLAB_MASKRESTM_TOOLTIP;Utilisé pour moduler l'action des réglages de Compression tonale en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Compression tonale \n Entre ces 2 valeurs, les valeurs de Compression tonale seront appliquées +TP_LOCALLAB_MASKRESVIB_TOOLTIP;Utilisé pour moduler l'action des réglages de Vibrance - Chaud et froid en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Vibrance - Chaud et froid \n Entre ces 2 valeurs, les valeurs de Vibrance - Chaud et froid seront appliquées +TP_LOCALLAB_MASKRESWAV_TOOLTIP;Utilisé pour moduler l'action des réglages de Contraste local et ondelettes en se basant sur les informations contenues dans les courbes des masques L(L) ou LC(H) (Masques et modifications).\n Les masques L(L) ou LC(H) doivent être activés pour utiliser cette fonction.\n Les zones ‘sombres’ et ‘claires’ en dessous du seuil sombre et au dessus du seuil clair seront restaurés progressivement à leurs valeurs originales avant d'avoir été modifiées par Contraste local et ondelettes \n Entre ces 2 valeurs, les valeurs de Contraste local et Ondelettes seront appliquées +TP_LOCALLAB_MASKUNUSABLE;Masque désactivé (Masque & modifications) +TP_LOCALLAB_MASKUSABLE;Masque activé (Masque & modifications) +TP_LOCALLAB_MASK_TOOLTIP;Vous pouvez activer plusieurs masques pour un simple outil, ceci nécessite d'activer un autre outil (mais sans utilser l'outil : curseurs à 0,...)où est le masque que vous souhaitez activer.\n\nVous pouvez aussi dupliquer le RT-spot et le placer juste à côté de l'autre,les variations de références autorisent un travail fin sur les images. +TP_LOCALLAB_MED;Medium +TP_LOCALLAB_MEDIAN;Median Bas +TP_LOCALLAB_MEDIANITER_TOOLTIP;Nombre d'applications successives du median +TP_LOCALLAB_MEDIAN_TOOLTIP;Choisir un median 3x3 à 9x9: plus les valeurs sont élévées, plus la réduction du bruit ou le flou seront marqués +TP_LOCALLAB_MEDNONE;Rien +TP_LOCALLAB_MERCOL;Couleur +TP_LOCALLAB_MERDCOL;Fusion arrière plan (ΔE) +TP_LOCALLAB_MERELE;Eclaicit seulement +TP_LOCALLAB_MERFIV;Addition +TP_LOCALLAB_MERFOR;Couleur esquiver +TP_LOCALLAB_MERFOU;Multiplier +TP_LOCALLAB_MERGE1COLFRA;Fusion avec Original ou Précédent ou arrière plan +TP_LOCALLAB_MERGECOLFRA;Masque: LCH & Structure +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Vous permet de créer des masques basés sur les 3 courbes LCH et/ou un algorithm de détection de structure +TP_LOCALLAB_MERGEMER_TOOLTIP;Prend en compte ΔE pour fusionner les fichiers (équivalent de Etendue pour cet usage) +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacité fusion % Spot courant avec original ou Spot précédent.\nContraste seuil : ajuste le résulat en fonction du contraste original +TP_LOCALLAB_MERHEI;Overlay +TP_LOCALLAB_MERHUE;Teite +TP_LOCALLAB_MERLUCOL;Luminance +TP_LOCALLAB_MERLUM;Luminosité +TP_LOCALLAB_MERNIN;Ecran +TP_LOCALLAB_MERONE;Normal +TP_LOCALLAB_MERSAT;Saturation +TP_LOCALLAB_MERSEV;Soft Light (legacy) +TP_LOCALLAB_MERSEV0;Soft Light Illusion +TP_LOCALLAB_MERSEV1;Soft Light W3C +TP_LOCALLAB_MERSEV2;Lumière dure +TP_LOCALLAB_MERSIX;Divise +TP_LOCALLAB_MERTEN;Assombrit seulement +TP_LOCALLAB_MERTHI;Couleur Brûlé +TP_LOCALLAB_MERTHR;Difference +TP_LOCALLAB_MERTWE;Exclusion +TP_LOCALLAB_MERTWO;Soustrait +TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +TP_LOCALLAB_MLABEL;Réc. données Min=%1 Max=%2 +TP_LOCALLAB_MLABEL_TOOLTIP;'Doit être' près de min=0 max=32768 (log mode) mais d'autres valeurs sont possibles.\nVous pouvez agir sur les données récupérées (CLIP) et décalage pour normaliser.\n\nRécupère les données image sans mélange. +TP_LOCALLAB_MODE_EXPERT;Avancé +TP_LOCALLAB_MODE_NORMAL;Standard +TP_LOCALLAB_MRFIV;Arrière plan +TP_LOCALLAB_MRFOU;Spot précédent +TP_LOCALLAB_MRONE;Rien +TP_LOCALLAB_MRTHR;Image Originale +TP_LOCALLAB_MULTIPL_TOOLTIP;Autorise la retouche des tons sur une large plage : -18EV +4EV. Le remier curseur agit sur -18EV and -6EV. Le dernier curseur agit sur les tons au-dessus de 4EV +TP_LOCALLAB_NEIGH;Rayon +TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Agir sur ce curseur pour adapter le niveau de débruitage à la taille des objets à traiter. +TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Plus la valeur sera importante, plus le débruitage sera intense.\nMais cela a une forte incidence sur les temps de traitement. +TP_LOCALLAB_NLDENOISE_TOOLTIP;"Récupération des détails" agit sur un Laplacien pour privilégier l'action de denoise sur les aplats plutôt que sur les structures. +TP_LOCALLAB_NLDET;Récupération des détails +TP_LOCALLAB_NLFRA;Débruitage par morceaux - Luminance +TP_LOCALLAB_NLFRAME_TOOLTIP;"Débruitage par morceaux" réalise une moyenne de la totalité des valeurs des pixels contenus dans l'image, pondérées en fonction de leur similarité avec le résultat attendu (pixel cible).\nL'algoritme permet d’amoindrir la perte de détails au sein de l'image.\nSeul le bruit de luminance est pris en compte, le bruit de chrominance est traité de manière plus performante par le couple ondelettes / Fourier (DCT).\nPeut être utilisé en conjonction avec 'ondelettes' ou isolé.\nLa taille du RT-Spot doit être supérieure à 150x150 pixels (sortie TIF/JPG). +TP_LOCALLAB_NLLUM;Force +TP_LOCALLAB_NLPAT;Taille maximum du morceau +TP_LOCALLAB_NLRAD;Taille maximum du rayon +TP_LOCALLAB_NOISECHROCOARSE;Chroma gros (Ond) +TP_LOCALLAB_NOISECHROC_TOOLTIP;Si supérieur à zéro, algorithme haute qualité est activé.\nGros est sélectionné si curseur >=0.2 +TP_LOCALLAB_NOISECHRODETAIL;Récup. détails Chroma(DCT) +TP_LOCALLAB_NOISECHROFINE;Chroma fin (Ond) +TP_LOCALLAB_NOISELEQUAL;Egalisateurs blanc-noir +TP_LOCALLAB_NOISELUMCOARSE;Luminance gros (ond) +TP_LOCALLAB_NOISELUMDETAIL;Récup. Luminance détail(DCT) +TP_LOCALLAB_NOISELUMFINE;Luminance fin 1 (ond) +TP_LOCALLAB_NOISELUMFINETWO;Luminance fin 2 (ond) +TP_LOCALLAB_NOISELUMFINEZERO;Luminance fin 0 (ond) +TP_LOCALLAB_NOISEMETH;Réduction du bruit +TP_LOCALLAB_NOISE_TOOLTIP;Ajoute du bruit de luminance +TP_LOCALLAB_NONENOISE;Rien +TP_LOCALLAB_OFFS;Décalage +TP_LOCALLAB_OFFSETWAV;Décalage +TP_LOCALLAB_OPACOL;Opacité +TP_LOCALLAB_ORIGLC;Fusion seulement avec image originale +TP_LOCALLAB_ORRETILAP_TOOLTIP;Agit sur un deuxième seuil Laplacien, pour prendre en compte ΔE pour différencier l'action nottament avec l'arrière plan (différent de Etendue) +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Agit sur un seuil Laplacien, plus grande est l'action, plus les différences de contraste seront réduites +TP_LOCALLAB_PASTELS2;Vibrance +TP_LOCALLAB_PDE;Atténuation de Contraste - Compression dynamique +TP_LOCALLAB_PDEFRA;Contraste atténuation ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - algorithme personnel adapté de IPOL à Rawtherapee: conduit à des résultats très variés et a besoin de différents réglages que Standard (Noir négatif, gamma < 1,...)\nPeut être utils pour des iamges sous-exposées ou avec une étendue dynamique importante.\n +TP_LOCALLAB_PREVHIDE;Cacher tous les réglages +TP_LOCALLAB_PREVIEW;Prévisualisation ΔE +TP_LOCALLAB_PREVSHOW;Montrer tous les réglages +TP_LOCALLAB_PROXI;ΔE Affaiblissement +TP_LOCALLAB_QUAAGRES;Aggressif +TP_LOCALLAB_QUACONSER;Conservatif +TP_LOCALLAB_QUALCURV_METHOD;Types de Courbes +TP_LOCALLAB_QUAL_METHOD;Qualité globale +TP_LOCALLAB_QUANONEALL;Rien +TP_LOCALLAB_QUANONEWAV;Débruit. par morceaux-luminance seulement +TP_LOCALLAB_RADIUS;Rayon +TP_LOCALLAB_RADIUS_TOOLTIP;Au-dessus de Rayon 30 Utilise 'Fast Fourier Transform' +TP_LOCALLAB_RADMASKCOL;Rayon adoucir +TP_LOCALLAB_RECT;Rectangle +TP_LOCALLAB_RECURS;Réferences Récursives +TP_LOCALLAB_RECURS_TOOLTIP;Recalcule les références pour teinte, luma, chroma après chaque module et après chaque RT-spot.\nAussi utile pour le travail avec les masques. +TP_LOCALLAB_REN_DIALOG_LAB;Entrer le nouveau nom de Spot +TP_LOCALLAB_REN_DIALOG_NAME;Renomme le Controle Spot +TP_LOCALLAB_REPARCOL_TOOLTIP;Vous permet d'ajuster le niveau de l'image modifiée par Couleurs et lumiéres par rapport à l'image originale. +TP_LOCALLAB_REPARDEN_TOOLTIP;Vous permet d'ajuster le niveau de l'image modifiée par De-bruite par rapport à l'image originale. +TP_LOCALLAB_REPAREXP_TOOLTIP;Vous permet d'ajuster le niveau de l'image modifiée par Compression dynammique et Exposition par rapport à l'image originale.. +TP_LOCALLAB_REPARSH_TOOLTIP;Vous permet d'ajuster le niveau de l'image modifiée Ombres et Lumières et Egaliseur par rapport à l'image originale.. +TP_LOCALLAB_REPARTM_TOOLTIP;Vous permet d'ajuster le niveau de l'image modifiée par Compression tonale par rapport à l'image originale.. +TP_LOCALLAB_REPARW_TOOLTIP;Vous permet d'ajuster le niveau de l'image modifiée par Contraste local et Ondelettes par rapport à l'image originale. +TP_LOCALLAB_RESID;Image Résiduelle +TP_LOCALLAB_RESIDBLUR;Flouter Image Résiduelle +TP_LOCALLAB_RESIDCHRO;Image Résiduelle Chroma +TP_LOCALLAB_RESIDCOMP;Image Résiduelle Compression +TP_LOCALLAB_RESIDCONT;Image Résiduelle Contraste +TP_LOCALLAB_RESIDHI;Hautes lumières +TP_LOCALLAB_RESIDHITHR;Hautes lumières seuil +TP_LOCALLAB_RESIDSHA;Ombres +TP_LOCALLAB_RESIDSHATHR;Ombres seuil +TP_LOCALLAB_RETI;De-brume - Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIFRAME_TOOLTIP; L'utilisation de Retinex peut être bénéfique pour le traitement des images: \ nqui sont floues, brumeuses ou ayant un voile de brouillard (en complément de Dehaz). \ Navec d'importants écarts de luminance. \ N où l'utilisateur recherche des effets spéciaux (cartographie des tons…) +TP_LOCALLAB_RETIM;Original Retinex +TP_LOCALLAB_RETITOOLFRA;Retinex Outils +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background +TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times +TP_LOCALLAB_RET_TOOLNAME;De-brume & Retinex - 9 +TP_LOCALLAB_REWEI;Repondération iterations +TP_LOCALLAB_RGB;RGB Courbe de tonalité +TP_LOCALLAB_ROW_NVIS;Pas visible +TP_LOCALLAB_ROW_VIS;Visible +TP_LOCALLAB_RSTPROTECT_TOOLTIP;La protection des rouges et des tons chair affecte les curseurs Saturation, Chroma et Colorfulness. +TP_LOCALLAB_SATUR;Saturation +TP_LOCALLAB_SCALEGR;Echelle +TP_LOCALLAB_SCALERETI;Echelle +TP_LOCALLAB_SCALTM;Echelle +TP_LOCALLAB_SCOPEMASK;Etendue Masque ΔE Image +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Actif si Masque DeltaE Image est activé.\nLes faibles valeurs évitent de retoucher l'aire sélectionnée +TP_LOCALLAB_SENSI;Etendue +TP_LOCALLAB_SENSIEXCLU;Etendue +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Ajuste les couleurs pour les inclure dans exclusion! +TP_LOCALLAB_SENSIMASK_TOOLTIP;Ajuste Etendue pour ce masque commun.\nAgit sur l'écart entre l'image originale et le masque.\nLes références (luma, chroma, teinte) sont celles du centre du RT-spot\n\nVous pouvez aussi agir sur le deltaE interne au masque avec 'Etendue Masque deltaE image' dans 'Réglages' +TP_LOCALLAB_SENSI_TOOLTIP;Ajuste Etendue de l'action:\nLes petites valeurs limitent l'action aux couleurs très similaires à celles sous le centre du spot.\nHautes valeurs laissent l'outil agir sur une large plage de couleurs. +TP_LOCALLAB_SETTINGS;Réglages +TP_LOCALLAB_SH1;Ombres Lumières +TP_LOCALLAB_SH2;Egaliseur +TP_LOCALLAB_SHADEX;Ombres +TP_LOCALLAB_SHADEXCOMP;Compression ombres & profondeur tonale +TP_LOCALLAB_SHADHIGH;Ombres/Lumières&Egaliseur +TP_LOCALLAB_SHADHMASK_TOOLTIP;Abaisse les hautes lumières du masque de la même manière que l'algorithme "ombres/lumières" +TP_LOCALLAB_SHADMASK_TOOLTIP;Relève les ombres du masque de la même manière que l'algorithme "ombres/lumières" +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Peut être utilisé - ou en complement - du module Exposition dans les cas difficiles.\nUtiliser réduction du bruit Denoise peut être nécessaire : éclaicir les ombres.\n\nPeut être utilisé comme un filtre gradué (augmenter Etendue) +TP_LOCALLAB_SHAMASKCOL;Ombres +TP_LOCALLAB_SHAPETYPE;Forme aire RT-spot +TP_LOCALLAB_SHAPE_TOOLTIP;Ellipse est le mode normal.\nRectangle peut être utilé dans certains cas, par exemple pour travailler en image complète en conjonction avec les délimiteurs en dehors de la prévisualisation, transition = 100.\n\nPolygone - Beziers sont en attente de GUI... +TP_LOCALLAB_SHARAMOUNT;Quantité +TP_LOCALLAB_SHARBLUR;Rayon flouter +TP_LOCALLAB_SHARDAMPING;Amortissement +TP_LOCALLAB_SHARFRAME;Modifications +TP_LOCALLAB_SHARITER;Iterations +TP_LOCALLAB_SHARP;Netteté +TP_LOCALLAB_SHARP_TOOLNAME;Netteté - 8 +TP_LOCALLAB_SHARRADIUS;Rayon +TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7 +TP_LOCALLAB_SHOWC;Masque et modifications +TP_LOCALLAB_SHOWC1;Fusion fichier +TP_LOCALLAB_SHOWCB;Masque et modifications +TP_LOCALLAB_SHOWDCT;Montrer processus Fourier ƒ +TP_LOCALLAB_SHOWE;Masque et modifications +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplacien (premier) +TP_LOCALLAB_SHOWLC;Masque et modifications +TP_LOCALLAB_SHOWMASK;Montrer masque +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Affiche masque modifications.\nAttention, vous ne pouvez voir qu'un seul masque à la fois.\n\nNote: Utilisation du Masque est avant l'algorihtme de détection de forme. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Montre le processus Fourier:\nMontre les différentes étapes du processus.\nLaplace - construit la dérivée seconde the second dérivée associée au seuil (Premiére étape).\nFourier -montre la transformée de Laplace avec DCT.\nPoisson - montre la solution de Poisson DCE.\nNormalise - montre le résultat sans normalisation de la luminance. +TP_LOCALLAB_SHOWMASKTYP1;Flouter & Bruit +TP_LOCALLAB_SHOWMASKTYP2;Réduction du bruit +TP_LOCALLAB_SHOWMASKTYP3;Flouter & Bruit + De-bruite +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Masque et modifications peuvent être choisis.\nFlouter et bruit: dans ce cas il n'est pas utilisé pour 'Réduction du bruit'.\nRéduction du bruit : dans ce cas il n'est pas utilisé pour 'flouter et bruit'.\n\nFlouter et bruit + Réduction du bruit : le masque est partagé, faire attention à 'montrer modifications' et 'Etendue' +TP_LOCALLAB_SHOWMNONE;Montrer image modifiée +TP_LOCALLAB_SHOWMODIF;Montrer modifications sans masque +TP_LOCALLAB_SHOWMODIF2;Montrer modifications +TP_LOCALLAB_SHOWMODIFMASK;Montrer modifications avec masque +TP_LOCALLAB_SHOWNORMAL;Normalise luminance (non) +TP_LOCALLAB_SHOWPLUS;Masque et modifications +TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +TP_LOCALLAB_SHOWR;Masque et modifications +TP_LOCALLAB_SHOWREF;Prévisualisation ΔE +TP_LOCALLAB_SHOWS;Masque et modifications +TP_LOCALLAB_SHOWSTRUC;Montrer Spot structure (avancé) +TP_LOCALLAB_SHOWSTRUCEX;Montrer Spot structure (avancé) +TP_LOCALLAB_SHOWT;Masque et modifications +TP_LOCALLAB_SHOWVI;Masque et modifications +TP_LOCALLAB_SHRESFRA;Ombres/Lumières +TP_LOCALLAB_SHTRC_TOOLTIP;Modifie les tons de l'image en agissant sur la TRC (Tone Response Curve).\nGamma agit principalement sur les tons lumineux.\nSlope (pente) agit principalement sur les tons sombres. +TP_LOCALLAB_SH_TOOLNAME;Ombres/lumières & Egaliseur tonal - 5 +TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +TP_LOCALLAB_SIGMAWAV;Atténuation Réponse +TP_LOCALLAB_SIGMOIDBL;Mélange +TP_LOCALLAB_SIGMOIDLAMBDA;Contraste +TP_LOCALLAB_SIGMOIDQJ;Utilise Black Ev & White Ev +TP_LOCALLAB_SIGMOIDTH;Seuil (Gray point) +TP_LOCALLAB_SIGMOID_TOOLTIP;Permet de simuler une apparence de Tone-mapping en utilisant à la fois la fonction 'Ciecam' (ou 'Jz') et 'Sigmoïde'.\nTrois curseurs : a) Le contraste agit sur la forme de la courbe sigmoïde et par conséquent sur la force ; b) Seuil (Point gris) distribue l'action en fonction de la luminance ; c)Blend agit sur l'aspect final de l'image, le contraste et la luminance. +TP_LOCALLAB_SLOMASKCOL;Pente (slope) +TP_LOCALLAB_SLOMASK_TOOLTIP;Gamma et Pente (Slope) autorise une transformation du masque en douceur et sans artefacts en modifiant progressivement "L" pour éviter les discontinuité. +TP_LOCALLAB_SLOSH;Pente +TP_LOCALLAB_SOFT;Lumière douce/Orig. Retinex +TP_LOCALLAB_SOFTM;Lumière douce (soft light) +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Applique un mélange Lumière douce. Effectue une émulation de "dodge and burn" en utilisant l'algorithme original de retinex. +TP_LOCALLAB_SOFTRADIUSCOL;Rayon adoucir +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applique un filtre guidé à l'image de sortie pour réduire les éventuels artefacts. +TP_LOCALLAB_SOFTRETI;Reduire artefact ΔE +TP_LOCALLAB_SOFT_TOOLNAME;Lumière douce & Original Retinex - 6 +TP_LOCALLAB_SOURCE_ABS;Luminance absolue +TP_LOCALLAB_SOURCE_GRAY;Valeur +TP_LOCALLAB_SPECCASE; Cas spécifiques +TP_LOCALLAB_SPECIAL;Usage Special des courbes RGB +TP_LOCALLAB_SPECIAL_TOOLTIP;Seulement pour cette courbe RGB, désactive (ou réduit les effecs) de Etendue, masque...par exemple, si vous voulez rendre un effet "négatif". +TP_LOCALLAB_SPOTNAME;Nouveau Spot +TP_LOCALLAB_STD;Standard +TP_LOCALLAB_STR;Force +TP_LOCALLAB_STRBL;Force +TP_LOCALLAB_STREN;Compression Force +TP_LOCALLAB_STRENG;Force +TP_LOCALLAB_STRENGR;Force +TP_LOCALLAB_STRENGRID_TOOLTIP;Vous pouvez ajuster l'effet désiré avec "force", mais vous pouvez aussi utiliser la fonction "Etendue" qui permet de délimiter l'action (par exemple, pour isoler une couleur particulière). +TP_LOCALLAB_STRENGTH;Bruit +TP_LOCALLAB_STRGRID;Force +TP_LOCALLAB_STRUC;Structure +TP_LOCALLAB_STRUCCOL;Structure +TP_LOCALLAB_STRUCCOL1;Spot structure +TP_LOCALLAB_STRUCT_TOOLTIP;Utilise l'algorithme de Sobel pour prendre en compte la structure dans la détection de forme.\nvous pouvez prévisualiser avec "masque et modifications - Montrer structure spot".\n\nPeut être utilisé avec masques (avancé) structure, flouter, ondelettes pour améliorer la détection de bords.\n\nA besoin de réglages sans-masque pour êtrre activé (luminosité, exposition...) +TP_LOCALLAB_STRUMASKCOL;Structure force +TP_LOCALLAB_STRUMASK_TOOLTIP;Génère un masque structure qui va différencier les aplats et reliefs.\nSi structure masque comme outil est activé, ce masque est untilisé en plus des autres outils (gamma, slope, courbe contraste ...) +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Un usage modéré de ce curseur est recommandé! +TP_LOCALLAB_STYPE;Forme méthode +TP_LOCALLAB_STYPE_TOOLTIP;Vous pouvez choisir entre:\nSymétrique - gauche et droite sont liés, haut et bas sont liés.\nIndépendent - toutes les saisies sont indépendantes. +TP_LOCALLAB_SYM;Symétrique (souris) +TP_LOCALLAB_SYMSL;Symétrique (souris + curseurs) +TP_LOCALLAB_TARGET_GRAY;Point Gris Cible +TP_LOCALLAB_THRES;Seuil structure +TP_LOCALLAB_THRESDELTAE;Seuil ΔE-Etendue +TP_LOCALLAB_THRESRETI;Seuil +TP_LOCALLAB_THRESWAV;Balance Seuil +TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mea=%3 Sig=%4 +TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize +TP_LOCALLAB_TM;Compression tonale +TP_LOCALLAB_TM_MASK;Utilise transmission map +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;Ce paramètre affecte la sensibilité aux bords.\n Plus grand il est, plus la luminosité change peut être considéré comme un bord.\n Si réglé à zéro 'compression tonale' va avoir un effet similaire à masque flou. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma déplace l'action de 'compression tonale' des ombres vers les lumières. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;Dans certains 'compression tonal' peut amener des effets de perspective, et dans de rares cas des halos peuvent apparaître.\n Accroître le nombre d'itérations peut aider à résoudre ces problèmes. +TP_LOCALLAB_TONEMAP_TOOLTIP;Compression tonal - menu principal doit être désactivé +TP_LOCALLAB_TONEMASCALE_TOOLTIP;Ce contrôle donne le pouvoir de différencier le contraste "local" et "global".\nPlus il est important, plus un détail sera accentué. +TP_LOCALLAB_TONE_TOOLNAME;Compression tonale - 4 +TP_LOCALLAB_TOOLCOL;Masque Structure comme outil +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Autorise de modifier le masque s'il a été créé +TP_LOCALLAB_TOOLMASK;Outils du masque +TP_LOCALLAB_TOOLMASK_TOOLTIP;Génère un masque structure qui va différencier les aplats et reliefs.\nSi structure masque comme outil est activé, ce masque est untilisé en plus des autres outils (gamma, slope, courbe contraste ...) +TP_LOCALLAB_TRANSIT;Transition - Gradient +TP_LOCALLAB_TRANSITGRAD;Transition différentiation XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Change la transition des abscisses vers les ordonnées +TP_LOCALLAB_TRANSITVALUE;Transition valeur +TP_LOCALLAB_TRANSITWEAK;Transition affaiblissement (lin-log) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Ajuste l'affaiblissement de la transition : change le processus d'affaiblissement - 1 linéaire - 2 parabolique - 3 cubique - ^25.\nPeut être utilisé en conjonction avec de très faibles valeurs de transition pour traiter/réduire les défauts (CBDL, Ondelettes, Couleur et lumière) +TP_LOCALLAB_TRANSIT_TOOLTIP;Ajuste la progressions de la transition enttre les zones affectées ou non affectées, comme un pourcentage du "rayon" +TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission en accord à transmission.\nAbscisse: transmission pour les valeurs négatives (min), mean, et les valeurs positives (max).\nOrdonnée: amplification ou réduction.\nVous pouvez agir sur cette courbe pour chnager la Transmission et réduire les artefacts +TP_LOCALLAB_USEMASK;Utiliser masque +TP_LOCALLAB_VART;Variance (contraste) +TP_LOCALLAB_VIBRANCE;Vibrance - Chaud & Froid +TP_LOCALLAB_VIBRA_TOOLTIP;Ajuste vibrance (Globalement identique à Couleur ajustement).\nAmène l'équivalent d'une balance des blancs en utilisant l'algorithme CIECAM. +TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Chaud & Froid - 3 +TP_LOCALLAB_VIS_TOOLTIP;Click pour montrer/cacher le Spot sélectionné.\nCtrl+click pour montrer/cacher tous les Spot. +TP_LOCALLAB_WARM;Chaud - Froid & Artefacts de couleur +TP_LOCALLAB_WARM_TOOLTIP;Ce curseur utilise l'algorithme Ciecam et agit comme une Balance des blancs, il prut réchauffer ou refroidir cool la zone concernée.\nIl peut aussi dans certains réduire les artefacts colorés. +TP_LOCALLAB_WASDEN_TOOLTIP;De-bruite luminance pour les 3 premiers niveaux (fin).\nLa limite droite de la courbe correspond à gros : niveau 3 et au delà. +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Equilibre l'action à l'intérieur de chaque niveau +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;Par défaut les 3 dimensions de L*a*b* luminance et couleur sont concernées par le floutage.\nCase cochée - luminance seulement +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;"Fusion chroma" est utilisée pour selectionner l'intensité de l'effet désiré sur la chrominance. +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;"Fusion luma" est utilisée pour selectionner l'intensité de l'effet désiré sur la luminance. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;"Niveaux de Chroma": ajuste les valeurs "a" et "b" des composantes L*a*b* comme une proportion de la luminance. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Décalage modifie la balance entre faible contraste et contraste élévé.\nLes hautes valeurs amplifient les changements de contraste pour les détails à contraste élévé, alors que les faibles valeurs vont amplifier les détails à contraste faible .\nEn selectionant des valeurs faibles vous pouvez ainsi sélectionner les zones de contrastes qui seront accentuées. +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;En déplaçant le curseur à gauche, les bas niveaux sont accentués, et vers la droite ce sont les bas niveaux qui sont réduits et les hauts niveaux accentués +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;Image résiduelle, a le même comportement que l'image principale +TP_LOCALLAB_WAT_GRADW_TOOLTIP;Plus vous déplacez le curseur à droite, plus l'algorithme de détection sera efficace, moins les effets du contraste local seront sensibles +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Contraste faible à élevé de gauche à droite en abscisse\nAugmente ou réduit le contraste en ordonnée. +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;Vous pouvez agir sur la répartition du contraste local selon l'intensité initiale du contraste par niveaux d'ondelettes.\nCeci aura comme conséquences de modifier l'effet de perspective et de relief de l'image, et/ou réduire les contrastes pour les très faibles niveaux de contraste initial +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;"Fusion seulement avec image originale", empêche les actions "Wavelet Pyramid" d'interférer avec "Claté" and "Masque netteté" +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Floute l'image résiduelle, indépendamment des niveaux +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Commpresse l'image résiduelle afin d'accentuer ou réduire les contrastes +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;L'effet sur le contraste local est maximum pour les valeurs moyennes, et affaibli pour les valeurs faibles ou élevées.\n Le curseur contrôle comment s'effectue les changements pour ces valeurs extêmse.\n Plus la valeur du curseur est élevée, plus grande sera l'étendue qui recevra le maximum d'ajustements, ainsi que le risque de voir apparaître des artefacts.\n .Plus faible sera cette valeur, plus les différences de contraste seront atténuées +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensité de la détection d'effet de bord +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Permet au contraste local de varier en fonction d'un gradient et d'un angle. La variation du signal de la luminance signal est prise en compte et non pas la luminance. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Etendue des niveaux d’ondelettes utilisée dans l’ensemble du module “wavelets” +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Vous permet de flouter chaque niveau de décomposition.\nEn abscisse de gauche à droite, les niveaux de décomposition du plus fin au plus gros +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similaira à Contraste par niveaux de détail. Des détails fins au gros details de gauche à droite en abscisse. +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Agit sur la balance des trois directions horizontale - verticale - diagonale - en fonction de la luminance de l'image.\nPar défaut les parties sombres ou hautes lumières sont réduites afin d'éviter les artefacts +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Montre l'ensemble des outils "Netteté bords".\nLa lecture de la documentation wavelet est recommandée +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Permet d'ajuster l'effet maximum de floutage des niveaux +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Contraste faible à élevé de gauche à droite en abscisse\nAugmente ou réduit le contraste en ordonnée. +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;La partie inférieure (négative) compresse chaque niveau de décomposition créant un effet tone mapping.\nLa partie supérieure (positive) atténue le contraste par niveau.\nEn abscisse de gauche à droite, les niveaux de décomposition du plus fin au plus gros +TP_LOCALLAB_WAV;Contrast local niveau +TP_LOCALLAB_WAVBLUR_TOOLTIP;Réalise un flou pour chaque niveau de décomposition, également pour l'image résiduelle. +TP_LOCALLAB_WAVCOMP;Compression par niveau +TP_LOCALLAB_WAVCOMPRE;Compression par niveau +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Réalise un 'Tone-mapping' ou une réduction du contraste local par niveau.\nEn abscisse: niveaux +TP_LOCALLAB_WAVCOMP_TOOLTIP;Réalise un contrast local en fonction de la direction de la décomposition en ondelettes : horizontal, vertical, diagonal +TP_LOCALLAB_WAVCON;Contraste par niveau +TP_LOCALLAB_WAVCONTF_TOOLTIP;Similaire à Contrast By Detail Levels : en abscisse niveaux. +TP_LOCALLAB_WAVDEN;de-bruite lum. par niveau +TP_LOCALLAB_WAVE;Ondelette +TP_LOCALLAB_WAVEDG;Contrast Local +TP_LOCALLAB_WAVEEDG_TOOLTIP;Améliore la netteté prenant en compte la notion de "ondelettes bords".\nNécessite au moins que les 4 premiers niveaux sont utilisables +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Amplitude des niveaux d'ondelettes utilisés par “Local contrast” +TP_LOCALLAB_WAVGRAD_TOOLTIP;Filtre gradué pour Contraste local "luminance" +TP_LOCALLAB_WAVLEV;Flou par niveau +TP_LOCALLAB_WAVMASK;Contr. local (par niveau) +TP_LOCALLAB_WAVMASK_TOOLTIP;Autorise un travail fin sur les masques niveaux de contraste (structure) +TP_LOCALLAB_WEDIANHI;Median Haut +TP_LOCALLAB_WHITE_EV;Blanc Ev TP_METADATA_EDIT;Appliquer les modifications TP_METADATA_MODE;Mode de copie des métadonnées TP_METADATA_STRIP;Retirer toutes les métadonnées TP_METADATA_TUNNEL;Copier à l'identique TP_NEUTRAL;Réinit. -TP_NEUTRAL_TIP;Réinitialise les valeurs de l'exposition à des valeurs neutres +TP_NEUTRAL_TOOLTIP;Réinitialise les valeurs de l'exposition à des valeurs neutres TP_PCVIGNETTE_FEATHER;Étendue TP_PCVIGNETTE_FEATHER_TOOLTIP;Étendue: 0=bords uniquement, 50=mi-chemin du centre, 100=jusqu'au centre TP_PCVIGNETTE_LABEL;Filtre Vignettage @@ -1760,8 +2506,29 @@ TP_PCVIGNETTE_ROUNDNESS;Circularité TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Circularité: 0=rectangulaire, 50=elliptique, 100=circulaire TP_PCVIGNETTE_STRENGTH;Force TP_PCVIGNETTE_STRENGTH_TOOLTIP;Force du filtre en EV (maximum dans les coins) +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Facteur de réduction (crop) +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Longueur focale +TP_PERSPECTIVE_CAMERA_FRAME;Correction +TP_PERSPECTIVE_CAMERA_PITCH;Vertical +TP_PERSPECTIVE_CAMERA_ROLL;Rotation +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Décalage Horizontal +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Décalage Vertical +TP_PERSPECTIVE_CAMERA_YAW;Horizontal +TP_PERSPECTIVE_CONTROL_LINES;Lignes de contrôle +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+faire glisser : dessiner une nouvelle ligne\nClic droit : supprimer la ligne +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;Au moins deux lignes de contrôle horizontales ou deux verticales requises. TP_PERSPECTIVE_HORIZONTAL;Horizontale TP_PERSPECTIVE_LABEL;Perspective +TP_PERSPECTIVE_METHOD;Méthode +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Basé sur Camera +TP_PERSPECTIVE_METHOD_SIMPLE;Simple +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Ajustement post-correction +TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Décalage Horizontal +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Décalage Vertical +TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +TP_PERSPECTIVE_RECOVERY_FRAME;Récupération TP_PERSPECTIVE_VERTICAL;Verticale TP_PFCURVE_CURVEEDITOR_CH;Teinte TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Contrôle la force du défrangeage en fonction de la couleur. En haut = action maxi, en bas = pas d'action sur la couleur. @@ -1872,7 +2639,7 @@ TP_RESIZE_APPLIESTO;S'applique à: TP_RESIZE_CROPPEDAREA;La zone recadrée TP_RESIZE_FITBOX;Boîte englobante TP_RESIZE_FULLIMAGE;L'image entière -TP_RESIZE_H;H: +TP_RESIZE_H;H TP_RESIZE_HEIGHT;Hauteur TP_RESIZE_LABEL;Redimensionnement TP_RESIZE_LANCZOS;Lanczos @@ -1884,7 +2651,7 @@ TP_RESIZE_W;L: 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_LH;Égaliseur teinte: 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. @@ -1896,7 +2663,7 @@ TP_RETINEX_EQUAL;Égaliseur TP_RETINEX_FREEGAMMA;Gamma manuel TP_RETINEX_GAIN;Gain TP_RETINEX_GAINOFFS;Gain et Décalage (brillance) -TP_RETINEX_GAINTRANSMISSION;Gain sur Transmission +TP_RETINEX_GAINTRANSMISSION;Gain Transmission: TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplifie ou réduit le canal transmission pour atteindre la luminance souhaitée.\nAbscisses: transmission ; min = 0, max = valeurs.\nOrdonnées: gain. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Manuel @@ -1935,7 +2702,7 @@ TP_RETINEX_MLABEL;Recomposition sans 'brume' Min=%1 Max=%2 TP_RETINEX_MLABEL_TOOLTIP;Devrait être proche de min=0 max=32768\nImage recomposée sans mélange. TP_RETINEX_NEIGHBOR;Rayon TP_RETINEX_NEUTRAL;Réinit. -TP_RETINEX_NEUTRAL_TIP;Réinitialise tous les curseurs et courbes à leur valeur par défaut. +TP_RETINEX_NEUTRAL_TOOLTIP;Réinitialise tous les curseurs et courbes à leur valeur par défaut. TP_RETINEX_OFFSET;Décalage (brillance) TP_RETINEX_SCALES;Gradient gaussien TP_RETINEX_SCALES_TOOLTIP;Si le curseur est à 0, toutes les itérations sont identiques.\nSi > 0, l'Échelle et le Rayon sont réduit à chaque nouvelle itération, et inversement. @@ -1949,7 +2716,7 @@ TP_RETINEX_TLABEL;CT Min=%1 Max=%2 Moyen=%3 Sigma=%4 TP_RETINEX_TLABEL2;CT Tm=%1 TM=%2 TP_RETINEX_TLABEL_TOOLTIP;Résultat du calcul de transmission.\nMin et Max sont utilisés par Variance.\nMoyen et Sigma.\nTm=Min TM=Niveau maximum de transmission. TP_RETINEX_TRANF;Transmission -TP_RETINEX_TRANSMISSION;Modulation du canal 'transmission' +TP_RETINEX_TRANSMISSION;Modulation 'transmission' TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission en fonction de la transmission.\nAbscisses: transmission des valeurs négatives (min), moyennes, et positives (max).\nOrdonnées: amplification ou réduction. TP_RETINEX_UNIFORM;Uniforme TP_RETINEX_VARIANCE;Contraste @@ -1971,7 +2738,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Degré TP_ROTATE_LABEL;Rotation TP_ROTATE_SELECTLINE;Choisir la ligne d'horizon -TP_SAVEDIALOG_OK_TIP;Raccourci: Ctrl-Entrée +TP_SAVEDIALOG_OK_TOOLTIP;Raccourci: Ctrl-Entrée TP_SHADOWSHLIGHTS_HIGHLIGHTS;Hautes lumières TP_SHADOWSHLIGHTS_HLTONALW;Amplitude tonale des\nhautes lumières TP_SHADOWSHLIGHTS_LABEL;Ombres/Hautes lumières @@ -2006,6 +2773,11 @@ 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_DEFAULT_SIZE;Taille par défault des points +TP_SPOT_ENTRYCHANGED;Modification d'un point +TP_SPOT_HINT;Cliquez sur ce bouton pour pouvoir opérer sur la zone de prévisualisation.\n\nPour ajouter un spot, pressez Ctrl et le bouton gauche de la souris, tirez le cercle (la touche Ctrl peut être relâchée) vers la position source, puis relâchez le bouton de la souris.\n\nPour éditer un spot, placez le curseur au-dessus de la marque blanche situant une zone éditée, faisant apparaître la géométrie d'édition.\n\nPour déplacer le spot source ou destination, placez le curseur en son centre et tirez le.\n\nLe cercle intérieur (zone d'effet maximum) et le cercle "d'adoucicement" peuvent être redimmensionné en plaçant le curseur dessus (le cercle devient orange) et en le tirant (le cercle devient rouge).\n\nQuand les changements sont terminés, un clic droit en dehors de tout spot termine le mode d'édition, ou cliquez à nouveau sur ce bouton. +TP_SPOT_LABEL;Retrait de taches TP_TM_FATTAL_AMOUNT;Quantité TP_TM_FATTAL_ANCHOR;Ancre TP_TM_FATTAL_LABEL;Compression de Plage Dynamique @@ -2072,10 +2844,12 @@ TP_WAVELET_CHSL;Curseurs TP_WAVELET_CHTYPE;Méthode de chrominance TP_WAVELET_COLORT;Opacité Rouge-Vert TP_WAVELET_COMPCONT;Contraste +TP_WAVELET_COMPEXPERT;Avancé 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'histogramme. +TP_WAVELET_COMPLEX_TOOLTIP;Standard: l’application dispose du nécessaire pour assurer les opérations courantes, l’interface graphique est simplifiée.\nAvancé: toutes les fonctionnalités sont présentes, certaines nécessitent un apprentissage important TP_WAVELET_COMPTM;Compression tonale -TP_WAVELET_CONTEDIT;Courbe de contraste 'Après' +TP_WAVELET_CONTEDIT;Courbe contraste 'Après' TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Contraste TP_WAVELET_CONTRAST_MINUS;Contraste - @@ -2097,6 +2871,7 @@ TP_WAVELET_DAUB6;D6 - standard plus TP_WAVELET_DAUB10;D10 - moyen TP_WAVELET_DAUB14;D14 - haut TP_WAVELET_DAUB_TOOLTIP;Change les coéf. de Daubechies:\nD4 = Standard,\nD14 = Souvent les meilleurs performances, demande 10% de temps de traitement supplémentaire.\n\nAffecte la détection des bords ainsi que la qualité générale des premiers niveaux. Cependant la qualité n'est pas strcitement à ces coéficients et peut varier en fonction des images et des usages. +TP_WAVELET_DENOISEHUE;Egalisateur teinte TP_WAVELET_DONE;Vertical TP_WAVELET_DTHR;Diagonal TP_WAVELET_DTWO;Horizontal @@ -2162,7 +2937,7 @@ TP_WAVELET_NPTYPE;Pixels voisins TP_WAVELET_NPTYPE_TOOLTIP;Cet algorithme utilise la proximité d'un pixel et huit de ses voisins. Si moins de différence, les bords sont renforcés. TP_WAVELET_OPACITY;Opacité Bleu-Jaune TP_WAVELET_OPACITYW;Courbe de contraste d/v-h -TP_WAVELET_OPACITYWL;Contraste local final +TP_WAVELET_OPACITYWL;Contraste local TP_WAVELET_OPACITYWL_TOOLTIP;Modifie le contraste local final à la fin du traitement par ondelettes.\n\nLe côté gauche représente les plus faibles contrastes locaaux, progressant jusqu'aux plus grands contrastes locaux vers la droite. TP_WAVELET_PASTEL;Chroma des Pastels TP_WAVELET_PROC;Procédé @@ -2191,7 +2966,6 @@ TP_WAVELET_THRH;Seuil des hautes lumières TP_WAVELET_TILESBIG;Grandes tuiles TP_WAVELET_TILESFULL;Image entière TP_WAVELET_TILESIZE;Méthode de découpage -TP_WAVELET_TILESLIT;Petites tuiles TP_WAVELET_TILES_TOOLTIP;Traiter l'image entière donnera les meilleurs résulats et est l'option recommandé, l'usage des tuiles étant une solution alternative recommandé pour les utilisateurs disposant de peu de RAM. Cf. RawPedia pour la configuration mémoire requise. TP_WAVELET_TMSTRENGTH;Force de la compression TP_WAVELET_TMSTRENGTH_TOOLTIP;Contrôle la force de la compression tonale ou de la compression de contraste de l'image résiduelle. Lorsque la valeur est différente de 0, les curseurs Force et Gamma de l'outil Compression Tonale dans l'onglet Exposition seront grisés. @@ -2258,19 +3032,710 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? !FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- !HISTORY_MSG_494;Capture Sharpening -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only -!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative -!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations @@ -2278,8 +3743,86 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector !MAIN_FRAME_PLACES_DEL;Remove -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative +!PARTIALPASTE_PREPROCWB;Preprocess White Balance +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... !PROGRESSBAR_HLREC;Highlight reconstruction... @@ -2287,21 +3830,245 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !PROGRESSBAR_LINEDENOISE;Line noise filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... !QUEUE_LOCATION_TITLE;Output Location +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_CROP_GTCENTEREDSQUARE;Centered square !TP_CROP_PPI;PPI -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -!TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick neutral spots -!TP_FILMNEGATIVE_RED;Red ratio +!TP_DEHAZE_SATURATION;Saturation +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost +!TP_WAVELET_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. +!TP_WAVELET_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 0fd256d7c..e4447f7f6 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -191,13 +191,11 @@ HISTOGRAM_TOOLTIP_CHRO;Mostra/Nascondi l'istogramma di cromaticità. HISTOGRAM_TOOLTIP_G;Mostra/Nascondi l'istogramma del Verde. HISTOGRAM_TOOLTIP_L;Mostra/Nascondi l'istogramma di Luminanza CIELAB. HISTOGRAM_TOOLTIP_R;Mostra/Nascondi l'istogramma del Rosso. -HISTOGRAM_TOOLTIP_RAW;Mostra/Nascondi l'istogramma del raw. HISTORY_CHANGED;Modificato HISTORY_CUSTOMCURVE;Curva personalizzata HISTORY_FROMCLIPBOARD;Dagli appunti HISTORY_LABEL;Cronologia HISTORY_MSG_1;Foto caricata -HISTORY_MSG_2;PP3 caricato HISTORY_MSG_3;PP3 modificato HISTORY_MSG_4;Visualizzazione cronologia HISTORY_MSG_5;Luminosità @@ -211,9 +209,6 @@ HISTORY_MSG_12;Livelli Automatici HISTORY_MSG_13;Tosaggio Esposizione HISTORY_MSG_14;Lab - Luminosità HISTORY_MSG_15;Lab - Contrasto -HISTORY_MSG_16;Luminanza: Livello del nero -HISTORY_MSG_17;Luminanza: Compr. alteluci -HISTORY_MSG_18;Luminanza: Compr. ombre HISTORY_MSG_19;Curva per 'L' HISTORY_MSG_20;Nitidezza HISTORY_MSG_21;USM - Raggio @@ -239,10 +234,6 @@ HISTORY_MSG_40;WB - Tinta HISTORY_MSG_41;Curva Tono Modo 1 HISTORY_MSG_42;Curva Tono 2 HISTORY_MSG_43;Curva Tono Modo 2 -HISTORY_MSG_44;Rid. rumore lum. - Raggio -HISTORY_MSG_45;Rid. rumore lum. - Tolleranza bordi -HISTORY_MSG_46;Riduzione Rumore Crominanza -HISTORY_MSG_47;Fondi alteluci ICC con matrix HISTORY_MSG_48;Usa curva tono del DCP HISTORY_MSG_49;DCP - Illuminazione HISTORY_MSG_50;Ombre/Alteluci @@ -250,7 +241,6 @@ HISTORY_MSG_51;S/H - Alteluci HISTORY_MSG_52;S/H - Ombre HISTORY_MSG_53;S/H - Ampiezza tonale - Alteluci HISTORY_MSG_54;S/H - Ampiezza tonale - Ombre -HISTORY_MSG_55;S/H - Contrasto locale HISTORY_MSG_56;S/H - Ombre/Alteluci - Raggio HISTORY_MSG_57;Rotazione semplice HISTORY_MSG_58;Ribaltamento orizzontale @@ -262,7 +252,6 @@ HISTORY_MSG_63;Istantanea Selezionata HISTORY_MSG_64;Ritaglia HISTORY_MSG_65;Correzione AC HISTORY_MSG_66;Ricostruzione Alteluci -HISTORY_MSG_67;Ricostruzione Alteluci - Quantità HISTORY_MSG_68;Ricostruzione Alteluci - Metodo HISTORY_MSG_69;Spazio Colore di Lavoro HISTORY_MSG_70;Spazio Colore di Uscita @@ -273,12 +262,10 @@ HISTORY_MSG_74;Ridimensiona - Scala HISTORY_MSG_75;Ridimensiona - Metodo HISTORY_MSG_76;Metadati Exif HISTORY_MSG_77;Metadati IPTC -HISTORY_MSG_78;Misure specificate per Ridimensiona HISTORY_MSG_79;Ridimensiona - Larghezza HISTORY_MSG_80;Ridimensiona - Altezza HISTORY_MSG_81;Ridimensiona - Abilitato HISTORY_MSG_82;Profilo modificato -HISTORY_MSG_83;S/H - Maschera di Nitidezza HISTORY_MSG_84;Correzione prospettiva HISTORY_MSG_85;Profilo di Correzione Obiettivo HISTORY_MSG_86;Curve RGB - Modalità Luminosità @@ -325,12 +312,6 @@ HISTORY_MSG_127;Flat Field - Automatico HISTORY_MSG_128;Flat Field - Raggio di Sfocamento HISTORY_MSG_129;Flat Field - Modalità di Sfocamento HISTORY_MSG_130;Autocorr. Distorsione -HISTORY_MSG_131;Riduzione rum. luminanza -HISTORY_MSG_132;Riduzione rum. crominanza -HISTORY_MSG_133;Gamma - Uscita -HISTORY_MSG_134;Gamma - Posizione -HISTORY_MSG_135;Gamma - Libero -HISTORY_MSG_136;Gamma - Pendenza HISTORY_MSG_137;Punto del Nero - Verde 1 HISTORY_MSG_138;Punto del Nero - Rosso HISTORY_MSG_139;Punto del Nero - Blu @@ -438,7 +419,6 @@ HISTORY_MSG_246;Curva 'CL' HISTORY_MSG_247;Curva 'LH' HISTORY_MSG_248;Curva 'HH' HISTORY_MSG_249;CbDL - Soglia -HISTORY_MSG_250;NR - Miglioramento HISTORY_MSG_251;B&W - Algoritmo HISTORY_MSG_252;CbDL Toni della Pelle HISTORY_MSG_253;CbDL Riduzione Artefatti @@ -704,7 +684,7 @@ PROFILEPANEL_GLOBALPROFILES;Profili inclusi PROFILEPANEL_LABEL;Profili di sviluppo PROFILEPANEL_LOADDLGLABEL;Carico i parametri di sviluppo... PROFILEPANEL_LOADPPASTE;Parametri da caricare -PROFILEPANEL_MODE_TIP;Modalità di riempimento del Profilo di Sviluppo.\n\nPulsante premuto: i profili parziali verranno convertiti in profili completi; i valori mancanti verranno sostituiti con i valori predefiniti.\n\nPulsante rilasciato: i Profili saranno applicati così come sono, modificando solo i valori che contengono. +PROFILEPANEL_MODE_TOOLTIP;Modalità di riempimento del Profilo di Sviluppo.\n\nPulsante premuto: i profili parziali verranno convertiti in profili completi; i valori mancanti verranno sostituiti con i valori predefiniti.\n\nPulsante rilasciato: i Profili saranno applicati così come sono, modificando solo i valori che contengono. PROFILEPANEL_MYPROFILES;Miei profili PROFILEPANEL_PASTEPPASTE;Parametri da incollare PROFILEPANEL_PCUSTOM;Personalizzato @@ -864,7 +844,6 @@ TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Regola Croma, Saturazione o Pienezza.\nL'Istogr 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_GAMUT;Controllo Gamut (Lab) -TP_COLORAPP_GAMUT_TOOLTIP;Consenti il controllo gamut nella modalità Lab TP_COLORAPP_HUE;Tinta (h) TP_COLORAPP_HUE_TOOLTIP;Tinta (h) - angolo tra 0° e 360° TP_COLORAPP_LABEL;Modello di Aspetto Colore CIE 2002 @@ -947,11 +926,11 @@ TP_EPD_REWEIGHTINGITERATES;Iterazioni di Ribilanciamento TP_EPD_SCALE;Scala TP_EPD_STRENGTH;Forza 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_AUTOLEVELS_TOOLTIP;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 TP_EXPOSURE_BRIGHTNESS;Luminosità TP_EXPOSURE_CLIP;Tosaggio % -TP_EXPOSURE_CLIP_TIP;La frazione di pixel da tosare nell'operazione di livelli automatici. +TP_EXPOSURE_CLIP_TOOLTIP;La frazione di pixel da tosare nell'operazione di livelli automatici. TP_EXPOSURE_COMPRHIGHLIGHTS;Compressione Alteluci TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Soglia di Compressione Alteluci TP_EXPOSURE_COMPRSHADOWS;Compressione Ombre @@ -1059,14 +1038,14 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminanza secondo Tonalità L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminanza secondo Luminanza L=f(L) TP_LABCURVE_LABEL;Regolazioni Lab TP_LABCURVE_LCREDSK;Limita LC ai toni rossi e all'incarnato -TP_LABCURVE_LCREDSK_TIP;Se abilitato, la Curva LC è applicata solo ai toni rossi e dell'incarnato.\nSe disabilitato, ha effetto su tutti i toni. +TP_LABCURVE_LCREDSK_TOOLTIP;Se abilitato, la Curva LC è applicata solo ai toni rossi e dell'incarnato.\nSe disabilitato, ha effetto su tutti i toni. TP_LABCURVE_RSTPROTECTION;Protezione Toni rossi e dell'incarnato TP_LABCURVE_RSTPRO_TOOLTIP;Può essere utilizzato con il cursore Cromaticità e la curva CC. TP_LENSGEOM_AUTOCROP; Ritaglio automatico TP_LENSGEOM_FILL;Adattamento automatico TP_LENSGEOM_LABEL;Obiettivo/Geometria TP_LENSPROFILE_LABEL;Profilo di Correzione dell'Obiettivo -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_NEUTRAL_TOOLTIP;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. TP_PCVIGNETTE_LABEL;Filtro Vignettatura @@ -1123,7 +1102,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Angolo TP_ROTATE_LABEL;Ruota TP_ROTATE_SELECTLINE; Seleziona una linea dritta -TP_SAVEDIALOG_OK_TIP;Scorciatoia: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Scorciatoia: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Alteluci TP_SHADOWSHLIGHTS_HLTONALW;Ampiezza Tonale delle Alteluci TP_SHADOWSHLIGHTS_LABEL;Ombre/Alteluci @@ -1245,7 +1224,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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 @@ -1261,15 +1240,16 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_FAST_PIPELINE_TOOLTIP;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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? !FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default @@ -1285,13 +1265,24 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_CURRENT;Current +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help !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_CROSSHAIR;Show/Hide indicator crosshair. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space @@ -1315,8 +1306,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance !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 @@ -1341,7 +1330,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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 @@ -1359,10 +1347,10 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_318;W - Contrast - Finer levels +!HISTORY_MSG_319;W - Contrast - Finer range +!HISTORY_MSG_320;W - Contrast - Coarser range +!HISTORY_MSG_321;W - Contrast - Coarser levels !HISTORY_MSG_322;W - Gamut - Avoid color shift !HISTORY_MSG_323;W - ES - Local contrast !HISTORY_MSG_324;W - Chroma - Pastel @@ -1426,14 +1414,14 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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 - Color Balance +!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 @@ -1450,7 +1438,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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 @@ -1466,7 +1453,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -1486,30 +1473,45 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens @@ -1520,6 +1522,654 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1535,22 +2185,42 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !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_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1565,22 +2235,83 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !ICCPROFCREATOR_COPYRIGHT;Copyright: -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!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 @@ -1592,11 +2323,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !ICCPROFCREATOR_ILL_50;D50 !ICCPROFCREATOR_ILL_55;D55 !ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -1606,6 +2338,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -1613,13 +2346,14 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !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 @@ -1631,7 +2365,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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. @@ -1654,24 +2388,29 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !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. +!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_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue @@ -1680,6 +2419,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_APPEARANCE;Appearance !PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font @@ -1699,10 +2439,16 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP;Crop Editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1716,9 +2462,16 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PREFERENCES_CURVEBBOXPOS_RIGHT;Right !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !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_INSPECTORWINDOW;Open inspector in own window or fullscreen !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. @@ -1747,18 +2500,20 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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 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_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !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_ZOOMONSCROLL;Zoom images by scrolling !PROFILEPANEL_PDYNAMIC;Dynamic !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... @@ -1783,7 +2538,14 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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;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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !TP_BWMIX_MIXC;Channel Mixer !TP_BWMIX_NEUTRAL;Reset !TP_CBDL_AFT;After Black-and-White @@ -1791,19 +2553,50 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. !TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. !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_NEUTRAL_TOOLTIP;Reset all sliders checkbox and curves to their default values. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_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 @@ -1833,11 +2626,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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_NEUTRAL_TOOLTIP;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 @@ -1854,6 +2647,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_GTCENTEREDSQUARE;Centered square !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1862,7 +2656,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1873,7 +2667,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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. @@ -1888,14 +2682,14 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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_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. @@ -1908,7 +2702,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_DISTORTION_AUTO_TOOLTIP;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 @@ -1918,17 +2712,28 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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, value 0 is used. +!TP_HLREC_HLBLUR;Blur !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 @@ -1936,16 +2741,65 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -1960,12 +2814,815 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !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_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1976,10 +3633,14 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows !TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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_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_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1995,9 +3656,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBBILINEAR;DCB+Bilinear !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). @@ -2015,6 +3678,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -2025,7 +3690,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -2040,16 +3705,21 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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_RCD;RCD +!TP_RAW_RCDBILINEAR;RCD+Bilinear !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.\n+fast gives less artifacts in flat areas +!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_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_RETINEX_CONTEDIT_HSL;HSL histogram !TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram !TP_RETINEX_CONTEDIT_LH;Hue @@ -2057,7 +3727,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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 @@ -2065,7 +3735,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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -2080,7 +3750,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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) @@ -2099,11 +3769,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +!TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -2113,9 +3783,9 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2124,7 +3794,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_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 @@ -2136,6 +3806,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression @@ -2149,22 +3824,28 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_WAVELET_7;Level 7 !TP_WAVELET_8;Level 8 !TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To +!TP_WAVELET_APPLYTO;Apply to !TP_WAVELET_AVOID;Avoid color shift !TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey +!TP_WAVELET_B1;Gray !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_BALCHROM;Equalizer Color !TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +!TP_WAVELET_BALLUM;Denoise equalizer White-Black !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_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CCURVE;Local contrast !TP_WAVELET_CH1;Whole chroma range !TP_WAVELET_CH2;Saturated/pastel @@ -2172,29 +3853,42 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_WAVELET_CHCU;Curve !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!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_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green !TP_WAVELET_COMPCONT;Contrast +!TP_WAVELET_COMPEXPERT;Advanced !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_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !TP_WAVELET_COMPTM;Tone mapping !TP_WAVELET_CONTEDIT;'After' contrast curve +!TP_WAVELET_CONTFRAME;Contrast - Compression !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_CONTRA_TOOLTIP;Changes the residual image contrast. !TP_WAVELET_CTYPE;Chrominance control +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !TP_WAVELET_DALL;All directions !TP_WAVELET_DAUB;Edge performance !TP_WAVELET_DAUB2;D2 - low @@ -2202,62 +3896,101 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast !TP_WAVELET_DONE;Vertical !TP_WAVELET_DTHR;Diagonal !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 +!TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast !TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights +!TP_WAVELET_HS2;Selective luminance range !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;Hue range !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. !TP_WAVELET_LEVF;Contrast +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength !TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !TP_WAVELET_NEUTRAL;Neutral !TP_WAVELET_NOIS;Denoise !TP_WAVELET_NOISE;Denoise and Refine @@ -2266,44 +3999,77 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % !TP_WAVELET_RE1;Reinforced !TP_WAVELET_RE2;Unchanged !TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_RESCHRO;Strength !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_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREN;Refine +!TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles +!TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale !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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic !TP_WBALANCE_PICKER;Pick +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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: f diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 588a817f2..0f35036db 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1,13 +1,4 @@ -#01 2011-05-15 a3novy -#02 2011-11-13 a3novy -#03 2011-11-20 a3novy -#04 2011-12-03 a3novy -#05 2012-02-11 a3novy -#06 2012-04-04 a3novy -#07 2012-07-12 a3novy -#08 2012-12-22 a3novy -#09 2013-04-01 a3novy -#10 2013-04-19 a3novy +#Last update 10-12-2022 ABOUT_TAB_BUILD;バージョン ABOUT_TAB_CREDITS;クレジット @@ -16,19 +7,19 @@ ABOUT_TAB_RELEASENOTES;リリースノート ABOUT_TAB_SPLASH;スプラッシュ ADJUSTER_RESET_TO_DEFAULT;クリック - デフォルト値にリセット\nCtrl+クリック - 初期値にリセット BATCH_PROCESSING;バッチ処理 -CURVEEDITOR_AXIS_IN;I: -CURVEEDITOR_AXIS_LEFT_TAN;LT: -CURVEEDITOR_AXIS_OUT;O: -CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_AXIS_IN;入力値: +CURVEEDITOR_AXIS_LEFT_TAN;左正接: +CURVEEDITOR_AXIS_OUT;出力値: +CURVEEDITOR_AXIS_RIGHT_TAN;右正接: CURVEEDITOR_CATMULLROM;フレキシブル CURVEEDITOR_CURVE;カーブ CURVEEDITOR_CURVES;カーブ -CURVEEDITOR_CUSTOM;カスタム +CURVEEDITOR_CUSTOM;標準 CURVEEDITOR_DARKS;ダーク -CURVEEDITOR_EDITPOINT_HINT;ボタンを押すと数値で入出力を編集出来ます\n\n編集したいカーブ上のポイントを右クリックします\n編集を無効にする場合はポイント以外の部分で右クリックします +CURVEEDITOR_EDITPOINT_HINT;ボタンを押すと数値で入出力値を変えられるようになります\n\nカーブ上で目標ポイントを右クリックし、カーブ下に表示されるI(入力値)或いはO(出力値)\n編集するポイントを変更する場合はポイント以外の部分で右クリックします CURVEEDITOR_HIGHLIGHTS;ハイライト -CURVEEDITOR_LIGHTS;ライト -CURVEEDITOR_LINEAR;リニア +CURVEEDITOR_LIGHTS;明るさ +CURVEEDITOR_LINEAR;線形 CURVEEDITOR_LOADDLGLABEL;カーブの読み込み... CURVEEDITOR_MINMAXCPOINTS;イコライザ CURVEEDITOR_NURBS;コントロールケージ @@ -36,7 +27,7 @@ CURVEEDITOR_PARAMETRIC;パラメトリック CURVEEDITOR_SAVEDLGLABEL;カーブの保存... CURVEEDITOR_SHADOWS;シャドウ CURVEEDITOR_TOOLTIPCOPY;クリップボードに現在のカーブをコピー -CURVEEDITOR_TOOLTIPLINEAR;リニアにリセット +CURVEEDITOR_TOOLTIPLINEAR;線形にリセット CURVEEDITOR_TOOLTIPLOAD;ファイルからカーブを読み込む CURVEEDITOR_TOOLTIPPASTE;クリップボードからカーブを貼り付け CURVEEDITOR_TOOLTIPSAVE;現在のカーブを保存 @@ -46,15 +37,15 @@ DONT_SHOW_AGAIN;次回からこのメッセージを表示しない DYNPROFILEEDITOR_DELETE;削除 DYNPROFILEEDITOR_EDIT;編集 DYNPROFILEEDITOR_EDIT_RULE;ダイナミックプロファイルの規定を変更 -DYNPROFILEEDITOR_ENTRY_TOOLTIP;既定の符号は鈍いので\n入力する際に"re:"という接頭語を付けます\n通常の表現を使います +DYNPROFILEEDITOR_ENTRY_TOOLTIP;整合性が悪い場合は、入力する際に"re:"という接頭語を付けます\n通常の表現を使います DYNPROFILEEDITOR_IMGTYPE_ANY;任意 DYNPROFILEEDITOR_IMGTYPE_HDR;HDR DYNPROFILEEDITOR_IMGTYPE_PS;ピクセルシフト -DYNPROFILEEDITOR_IMGTYPE_STD;標準え +DYNPROFILEEDITOR_IMGTYPE_STD;標準 DYNPROFILEEDITOR_MOVE_DOWN;下に移動 DYNPROFILEEDITOR_MOVE_UP;上に移動 DYNPROFILEEDITOR_NEW;新規 -DYNPROFILEEDITOR_NEW_RULE;新しいダイナミックプロファイルの規定 +DYNPROFILEEDITOR_NEW_RULE;新しいダイナミックプロファイルのルール DYNPROFILEEDITOR_PROFILE;処理プロファイル EDITWINDOW_TITLE;画像編集 EDIT_OBJECT_TOOLTIP;この機能を使うための目安に、プレビュー画面にガイドを表示する @@ -67,7 +58,7 @@ EXIFFILTER_FOCALLEN;焦点距離 EXIFFILTER_IMAGETYPE;画像の種類 EXIFFILTER_ISO;ISO EXIFFILTER_LENS;レンズ -EXIFFILTER_METADATAFILTER;メタデータ絞り込みの適用 +EXIFFILTER_METADATAFILTER;メタデータ絞り込みを有効にする EXIFFILTER_SHUTTER;シャッター EXIFPANEL_ADDEDIT;追加/編集 EXIFPANEL_ADDEDITHINT;新しいタグを追加、またはタグの編集 @@ -75,13 +66,13 @@ EXIFPANEL_ADDTAGDLG_ENTERVALUE;値の入力 EXIFPANEL_ADDTAGDLG_SELECTTAG;タグ選択 EXIFPANEL_ADDTAGDLG_TITLE;タグの追加/編集 EXIFPANEL_KEEP;そのまま -EXIFPANEL_KEEPHINT;出力ファイルに書き込む際、選択タグをそのままにする +EXIFPANEL_KEEPHINT;出力ファイルに書き込む際、選択されたタグをそのままにする EXIFPANEL_REMOVE;削除 -EXIFPANEL_REMOVEHINT;出力ファイルに書き込む際、選択タグは外す +EXIFPANEL_REMOVEHINT;出力ファイルに書き込む際、選択されたタグは外す EXIFPANEL_RESET;リセット EXIFPANEL_RESETALL;すべてリセット -EXIFPANEL_RESETALLHINT;すべて元の値にリセット -EXIFPANEL_RESETHINT;選択タグを元の値にリセット +EXIFPANEL_RESETALLHINT;すべてのタグを元の値にリセット +EXIFPANEL_RESETHINT;選択されたタグを元の値にリセット EXIFPANEL_SHOWALL;全て表示 EXIFPANEL_SUBDIRECTORY;サブディレクトリ EXPORT_BYPASS;迂回させる機能 @@ -103,14 +94,14 @@ EXPORT_BYPASS_SHARPENEDGE;エッジ・シャープニングを迂回 EXPORT_BYPASS_SHARPENING;シャープニングを迂回 EXPORT_BYPASS_SHARPENMICRO;マイクロコントラストを迂回 EXPORT_FASTEXPORTOPTIONS;高速書き出しオプション -EXPORT_INSTRUCTIONS;現像の設定に要する時間と手間を省くために、高速書き出しを優先させるオプションです。処理速度が優先される場合や、既定の現像パラメータを変えずに何枚ものリサイズ画像が要求される場合に奨められる方法で、低解像度画像を迅速に生成します。 +EXPORT_INSTRUCTIONS;出力設定に要する時間と手間を省くために、高速書き出しを優先させるオプションです。処理速度が優先される場合や、既定の出力パラメータを変えずに何枚ものリサイズ画像が要求される場合に奨められる方法で、低解像度画像を迅速に生成します。 EXPORT_MAXHEIGHT;最大高: EXPORT_MAXWIDTH;最大幅: -EXPORT_PIPELINE;高速書き出しの方法 +EXPORT_PIPELINE;処理の流れ EXPORT_PUTTOQUEUEFAST; 高速書き出しのキューに追加 EXPORT_RAW_DMETHOD;デモザイクの方式 EXPORT_USE_FAST_PIPELINE;処理速度優先(リサイズした画像に調整を全て行う) -EXPORT_USE_FAST_PIPELINE_TIP;処理速度を優先すると、処理は速くなりますが、画像の質は落ちます。通常、画像のリサイズは全現像処理工程の最後で行われますが、ここでは処理工程の初めの方でリサイズが行われます。処理速度は著しく上がりますが、現像処理された画像にアーティファクトが発生したり、全体的な質が低下したりします。 +EXPORT_USE_FAST_PIPELINE_TOOLTIP;処理速度を優先すると、処理は速くなりますが、画像の質は落ちます。通常、画像のリサイズは全処理工程の最後で行われますが、ここでは処理工程の初めの方でリサイズが行われます。処理速度は著しく上がりますが、処理された画像にアーティファクトが発生したり、全体的な質が低下したりします。 EXPORT_USE_NORMAL_PIPELINE;標準(リサイズ処理は最後、幾つかの処理を迂回) EXTPROGTARGET_1;raw EXTPROGTARGET_2;キュー処理 @@ -152,6 +143,7 @@ FILEBROWSER_POPUPCOLORLABEL4;ラベル: ブルー FILEBROWSER_POPUPCOLORLABEL5;ラベル: パープル FILEBROWSER_POPUPCOPYTO;コピーします... FILEBROWSER_POPUPFILEOPERATIONS;ファイルの操作 +FILEBROWSER_POPUPINSPECT;カメラ出しJPEG FILEBROWSER_POPUPMOVEEND;キュー処理の最後に移動 FILEBROWSER_POPUPMOVEHEAD;キュー処理の最初に移動 FILEBROWSER_POPUPMOVETO;移動します... @@ -194,7 +186,7 @@ FILEBROWSER_SHOWCOLORLABEL5HINT;パープル・ラベルの画像を表示\nシ 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_SHOWORIGINALHINT;元画像だけを表示\n\nファイル名は同じだが拡張子が異なる画像がある場合は、環境設定の中のファイルブラウザタブにある拡張子リストの上位に位置する拡張子を持った画像を元画像とする。 FILEBROWSER_SHOWRANK1HINT;1つ星ランクを表示\nショートカット: 1 @@ -209,8 +201,8 @@ FILEBROWSER_SHOWUNCOLORHINT;カラー・ラベルのない画像を表示\nシ FILEBROWSER_SHOWUNRANKHINT;ランクなし画像を表示\nショートカット: 0 FILEBROWSER_THUMBSIZE;サムネイルのサイズ FILEBROWSER_UNRANK_TOOLTIP;ランクなし\nショートカット: Shift-0 -FILEBROWSER_ZOOMINHINT;サムネイルサイズの拡大\nショートカット: +\n\nシングル・エディタ・タブのショートカット: Alt-+ -FILEBROWSER_ZOOMOUTHINT;サムネイルサイズの縮小\nショートカット: -\n\nシングル・エディタ・タブのショートカット: Alt-- +FILEBROWSER_ZOOMINHINT;サムネイルサイズの拡大\nショートカット: +\n\nシングル編集タブのショートカット: Alt-+ +FILEBROWSER_ZOOMOUTHINT;サムネイルサイズの縮小\nショートカット: -\n\nシングル編集タブのショートカット: Alt-- FILECHOOSER_FILTER_ANY;全てのファイル FILECHOOSER_FILTER_COLPROF;カラープロファイル FILECHOOSER_FILTER_CURVE;カーブファイル @@ -227,11 +219,14 @@ GENERAL_BEFORE;補正前 GENERAL_CANCEL;キャンセル GENERAL_CLOSE;閉じる GENERAL_CURRENT;現在 +GENERAL_DELETE_ALL;全て削除 GENERAL_DISABLE;無効 GENERAL_DISABLED;無効 +GENERAL_EDIT;編集 GENERAL_ENABLE;有効 GENERAL_ENABLED;有効 GENERAL_FILE;ファイル +GENERAL_HELP;ヘルプ GENERAL_LANDSCAPE;横 GENERAL_NA;n/a GENERAL_NO;No @@ -249,20 +244,27 @@ GIMP_PLUGIN_INFO;RawTherapee GIMPプラグインにようこそ!\n画像編 HISTOGRAM_TOOLTIP_B;ブルー・ヒストグラム 表示/非表示 HISTOGRAM_TOOLTIP_BAR;RGBインジケーター・バーの表示/非表示\nプレビュー画像上でマウスの右ボタンクリックで 固定/開放 HISTOGRAM_TOOLTIP_CHRO;色度・ヒストグラム 表示/非表示 +HISTOGRAM_TOOLTIP_CROSSHAIR;照準線 表示/非表示 HISTOGRAM_TOOLTIP_G;グリーン・ヒストグラム 表示/非表示 HISTOGRAM_TOOLTIP_L;CIEL*a*b* 輝度・ヒストグラム 表示/非表示 HISTOGRAM_TOOLTIP_MODE;ヒストグラムの尺度を線形、対数-線形、対数-対数でトグルします HISTOGRAM_TOOLTIP_R;レッド・ヒストグラム 表示/非表示 -HISTOGRAM_TOOLTIP_RAW;rawヒストグラム 表示/非表示 +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;スコープオプションボタンの見え方をトグル +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;スコープの明るさを調整 +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;ヒストグラム +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw ヒストグラム +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB パレード +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;色相-色度 ベクトルスコープ +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;色相-彩度 ベクトルスコープ +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;波形グラフ HISTORY_CHANGED;変更されました HISTORY_CUSTOMCURVE;カスタムカーブ HISTORY_FROMCLIPBOARD;クリップボードから HISTORY_LABEL;履歴 HISTORY_MSG_1;写真を読み込みました -HISTORY_MSG_2;PP3を読み込みました HISTORY_MSG_3;PP3を変更しました HISTORY_MSG_4;履歴ブラウジング -HISTORY_MSG_5;明度 +HISTORY_MSG_5;明るさ HISTORY_MSG_6;コントラスト HISTORY_MSG_7;黒 HISTORY_MSG_8;露光量補正 @@ -273,9 +275,6 @@ HISTORY_MSG_12;自動露光補正 HISTORY_MSG_13;露光 クリッピング 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;シャープニング 半径 @@ -301,19 +300,14 @@ HISTORY_MSG_40;色偏差 HISTORY_MSG_41;トーンカーブ1のモード HISTORY_MSG_42;トーンカーブ 2 HISTORY_MSG_43;トーンカーブ2のモード -HISTORY_MSG_44;輝度ノイズ低減 半径 -HISTORY_MSG_45;輝度ノイズ低減 エッジの許容度 -HISTORY_MSG_46;色ノイズ低減 -HISTORY_MSG_47;マトリクスでICCハイライト・ブレンド -HISTORY_MSG_48;DCPトーンカーブ使用 -HISTORY_MSG_49;色ノイズ低減 エッジの感度 +HISTORY_MSG_48;DCP トーンカーブ +HISTORY_MSG_49;DCP 光源 HISTORY_MSG_50;シャドウ/ハイライト -HISTORY_MSG_51;ハイライト -HISTORY_MSG_52;シャドウ -HISTORY_MSG_53;ハイライト トーンの幅 -HISTORY_MSG_54;シャドウ トーンの幅 -HISTORY_MSG_55;ローカルコントラスト -HISTORY_MSG_56;シャドウ/ハイライト 半径 +HISTORY_MSG_51;S/H - ハイライト +HISTORY_MSG_52;S/H - シャドウ +HISTORY_MSG_53;S/H - ハイライト トーンの幅 +HISTORY_MSG_54;S/H - シャドウ トーンの幅 +HISTORY_MSG_56;S/H - シャドウ/ハイライト 半径 HISTORY_MSG_57;90度 回転 HISTORY_MSG_58;左右反転 HISTORY_MSG_59;上下反転 @@ -324,7 +318,6 @@ HISTORY_MSG_63;スナップショット選択 HISTORY_MSG_64;写真切り抜き HISTORY_MSG_65;色収差補正 HISTORY_MSG_66;ハイライト復元 -HISTORY_MSG_67;ハイライト復元 量 HISTORY_MSG_68;ハイライト復元 方式 HISTORY_MSG_69;作業色空間 HISTORY_MSG_70;出力色空間 @@ -335,12 +328,10 @@ HISTORY_MSG_74;リサイズ スケール HISTORY_MSG_75;リサイズ 方式 HISTORY_MSG_76;Exif メタデータ HISTORY_MSG_77;IPTC メタデータ -HISTORY_MSG_78;リサイズ指定のデータ -HISTORY_MSG_79;リサイズ幅 +HISTORY_MSG_79;リサイズ 幅 HISTORY_MSG_80;リサイズ 高さ -HISTORY_MSG_81;リサイズの有効・無効 +HISTORY_MSG_81;リサイズ HISTORY_MSG_82;プロファイル変更 -HISTORY_MSG_83;高画質 シャドウ/ハイライト HISTORY_MSG_84;パースペクティブの補正 HISTORY_MSG_85;レンズ補正 プロファイル HISTORY_MSG_86;RGB カーブ - 輝度モード @@ -387,12 +378,6 @@ HISTORY_MSG_127;フラットフィールド 自動選択 HISTORY_MSG_128;フラットフィールド・ぼかし半径 HISTORY_MSG_129;フラットフィールド・ぼかしタイプ HISTORY_MSG_130;自動歪曲収差補正 -HISTORY_MSG_131;ノイズ低減 輝度 -HISTORY_MSG_132;ノイズ低減 カラー -HISTORY_MSG_133;ガンマ -HISTORY_MSG_134;ガンマポジション -HISTORY_MSG_135;フリー・ガンマ -HISTORY_MSG_136;ガンマ 勾配 HISTORY_MSG_137;黒レベル グリーン 1 HISTORY_MSG_138;黒レベル レッド HISTORY_MSG_139;黒レベル ブルー @@ -430,39 +415,39 @@ 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 - 観視の暗い周囲環境 -HISTORY_MSG_177;CAM02 - 撮影環境の順応輝度 -HISTORY_MSG_178;CAM02 - 観視の順応輝度 -HISTORY_MSG_179;CAM02 - モデル -HISTORY_MSG_180;CAM02 - 明度 (J) -HISTORY_MSG_181;CAM02 - 色度 (C) -HISTORY_MSG_182;CAM02 - 自動 CAT02 -HISTORY_MSG_183;CAM02 - コントラスト (J) -HISTORY_MSG_184;CAM02 - 暗い周囲環境を伴う撮影環境 -HISTORY_MSG_185;CAM02 - 色域制御 -HISTORY_MSG_186;CAM02 - アルゴリズム -HISTORY_MSG_187;CAM02 - レッドと肌色トーンを保護 -HISTORY_MSG_188;CAM02 - 明るさ (Q) -HISTORY_MSG_189;CAM02 - コントラスト (Q) -HISTORY_MSG_190;CAM02 - 彩度 (S) -HISTORY_MSG_191;CAM02 - 彩度 (M) -HISTORY_MSG_192;CAM02 - 色相角 -HISTORY_MSG_193;CAM02 - トーンカーブ 1 -HISTORY_MSG_194;CAM02 - トーンカーブ 2 -HISTORY_MSG_195;CAM02 - トーンカーブ 1 -HISTORY_MSG_196;CAM02 - トーンカーブ 2 -HISTORY_MSG_197;CAM02 - カラー・カーブ -HISTORY_MSG_198;CAM02 - カラー・カーブ -HISTORY_MSG_199;CAM02 - カーブでCIECAM02出力のヒストグラムを表示 -HISTORY_MSG_200;CAM02 - CIECAM02 Q でトーンマッピング +HISTORY_MSG_174;色の見え&明るさ +HISTORY_MSG_175;CAL - 場面 - 色順応 +HISTORY_MSG_176;CAL - 観視 - 周囲 +HISTORY_MSG_177;CAL - 場面 - 絶対輝度 +HISTORY_MSG_178;CAL - 観視 - 絶対輝度 +HISTORY_MSG_179;CAL - 場面 - ホワイトポイントモデル +HISTORY_MSG_180;CAL - 編集 - 明度(J) +HISTORY_MSG_181;CAL - 編集 - 色度(C) +HISTORY_MSG_182;CAL - 場面 - 自動色順応 +HISTORY_MSG_183;CAL - 編集 - コントラスト(J) +HISTORY_MSG_184;CAL - 場面 - 周囲 +HISTORY_MSG_185;CAL - 色域制御 +HISTORY_MSG_186;CAL - 編集 - アルゴリズム +HISTORY_MSG_187;CAL - 編集 - レッドと肌色トーンを保護 +HISTORY_MSG_188;CAL - 編集 - 明るさ(Q) +HISTORY_MSG_189;CAL - 編集 - コントラスト(Q) +HISTORY_MSG_190;CAL - 編集 - 彩度(S) +HISTORY_MSG_191;CAL - 編集 - 鮮やかさ(M) +HISTORY_MSG_192;CAL - 編集 - 色相(h) +HISTORY_MSG_193;CAL - 編集 - トーンカーブ 1 +HISTORY_MSG_194;CAL - 編集 - トーンカーブ 2 +HISTORY_MSG_195;CAL - 編集 - トーンカーブ1のモード +HISTORY_MSG_196;CAL - 編集 - トーンカーブ2のモード +HISTORY_MSG_197;CAL - 編集 - カラーカーブ +HISTORY_MSG_198;CAL - 編集 - カラーカーブのモード +HISTORY_MSG_199;CAL - 編集 - ヒストグラムにCAMの出力を使う +HISTORY_MSG_200;CAL - 編集 - トーンマッピングにCAMを使う HISTORY_MSG_201;色差 レッド/グリーン HISTORY_MSG_202;色差 ブルー/イエロー HISTORY_MSG_203;ノイズ低減 - 方式 HISTORY_MSG_204;LMMSE 拡張処理 -HISTORY_MSG_205;CAM02 ホット/バッドピクセル -HISTORY_MSG_206;CAT02 - 自動で順応 +HISTORY_MSG_205;CAL ホット/バッドピクセル +HISTORY_MSG_206;CAL - 場面 - 自動で絶対輝度 HISTORY_MSG_207;フリンジ低減 - 色相カーブ HISTORY_MSG_208;ブルー/レッド イコライザ HISTORY_MSG_210;減光フィルター - 角度 @@ -491,7 +476,7 @@ HISTORY_MSG_232;白黒 ‘前の‘カーブのタイプ HISTORY_MSG_233;白黒 ‘後の‘カーブ HISTORY_MSG_234;白黒 ‘後の‘カーブのタイプ HISTORY_MSG_235;白黒 チャンネルミキサー 自動 -HISTORY_MSG_236;--未使用-- +HISTORY_MSG_236;--未使用の文字列-- HISTORY_MSG_237;白黒 チャンネルミキサー HISTORY_MSG_238;減光フィルター フェザー HISTORY_MSG_239;減光フィルター 強さ @@ -504,9 +489,8 @@ 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_250;ノイズ低減 - 強化 -HISTORY_MSG_251;白黒 - アルゴリズム +HISTORY_MSG_249;CbDL しきい値 +HISTORY_MSG_251;白黒 アルゴリズム HISTORY_MSG_252;CbDL 肌色の目標/保護 HISTORY_MSG_253;CbDL アーティファクトを軽減 HISTORY_MSG_254;CbDL 肌色の色相 @@ -529,10 +513,8 @@ 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_277;--未使用の文字列-- HISTORY_MSG_278;カラートーン調整 - 明度を維持 HISTORY_MSG_279;カラートーン調整 - シャドウ HISTORY_MSG_280;カラートーン調整 - ハイライト @@ -552,15 +534,14 @@ HISTORY_MSG_293;フィルムシミュレーション HISTORY_MSG_294;フィルムシミュレーション - 強さ HISTORY_MSG_295;フィルムシミュレーション - フィルム HISTORY_MSG_296;輝度ノイズ低減のカーブ -HISTORY_MSG_297;ノイズ低減 - 質 +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_305;W- ウェーブレットのレベル HISTORY_MSG_306;W- プロセス HISTORY_MSG_307;W- プレビュー HISTORY_MSG_308;W- プレビューの方向 @@ -573,26 +554,26 @@ 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_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_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_328;W- 色 リンクを強化 +HISTORY_MSG_329;W- 色 レッド/グリーンの不透明度 +HISTORY_MSG_330;W- 色 ブルー/イエローの不透明度 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_337;W- 残差 色相の目標/保護 HISTORY_MSG_338;W- ES 半径 HISTORY_MSG_339;W- ES 強さ HISTORY_MSG_340;W- 強さ @@ -618,13 +599,13 @@ HISTORY_MSG_359;ホット/デッド しきい値 HISTORY_MSG_360;トーンマッピング ガンマ HISTORY_MSG_361;W- 最終 色度バランス HISTORY_MSG_362;W- 残差 圧縮の方法 -HISTORY_MSG_363;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_369;W- 最終 調整方法 HISTORY_MSG_370;W- 最終 ローカルコントラストカーブ HISTORY_MSG_371;リサイズ後のシャープニング(PRS) HISTORY_MSG_372;PRS アンシャープマスク - 半径 @@ -664,10 +645,9 @@ 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_412;レティネックス - ガウスフィルタの勾配 HISTORY_MSG_413;レティネックス - 差異 HISTORY_MSG_414;レティネックス - ヒストグラム - Lab HISTORY_MSG_415;レティネックス - 透過 @@ -680,13 +660,13 @@ HISTORY_MSG_421;レティネックス - ガンマ HISTORY_MSG_422;レティネックス - ガンマ HISTORY_MSG_423;レティネックス - 勾配 HISTORY_MSG_424;レティネックス - HLしきい値 -HISTORY_MSG_425;レティネックス - 対数の基数 +HISTORY_MSG_425;--未使用の文字列-- HISTORY_MSG_426;レティネックス - 色相イコライザ HISTORY_MSG_427;出力レンダリングの意図 HISTORY_MSG_428;モニターレンダリングの意図 HISTORY_MSG_429;レティネックス - 繰り返し -HISTORY_MSG_430;レティネックス - 透過のグラデーション -HISTORY_MSG_431;レティネックス - 強さのグラデーション +HISTORY_MSG_430;レティネックス - 透過マップの勾配 +HISTORY_MSG_431;レティネックス - 強さの勾配 HISTORY_MSG_432;レティネックス - M - ハイライト HISTORY_MSG_433;レティネックス - M - ハイライト TW HISTORY_MSG_434;レティネックス - M - シャドウ @@ -695,35 +675,50 @@ HISTORY_MSG_436;レティネックス - M - 半径 HISTORY_MSG_437;レティネックス - M - 方式 HISTORY_MSG_438;レティネックス - M - イコライザ HISTORY_MSG_439;レティネックス - プロセス -HISTORY_MSG_440;詳細レベルコントラスト - 適用 +HISTORY_MSG_440;詳細レベルコントラスト - 処理の順番 HISTORY_MSG_441;レティネックス - 透過率の増加 HISTORY_MSG_442;レティネックス - スケール HISTORY_MSG_443;出力のブラックポイント補正 HISTORY_MSG_444;WB - 色温度のバイアス HISTORY_MSG_445;Raw サブイメージ +HISTORY_MSG_446;--未使用の文字列-- +HISTORY_MSG_447;--未使用の文字列-- +HISTORY_MSG_448;--未使用の文字列-- HISTORY_MSG_449;PS - ISOへの適合 -HISTORY_MSG_452;PS - モーションを表示 +HISTORY_MSG_450;--未使用の文字列-- +HISTORY_MSG_451;--未使用の文字列-- +HISTORY_MSG_452;PS - 動体部分を表示 HISTORY_MSG_453;PS - マスクだけを表示 +HISTORY_MSG_454;--未使用の文字列-- +HISTORY_MSG_455;--未使用の文字列-- +HISTORY_MSG_456;--未使用の文字列-- HISTORY_MSG_457;PS - レッド/ブルーを確認 +HISTORY_MSG_458;--未使用の文字列-- +HISTORY_MSG_459;--未使用の文字列-- +HISTORY_MSG_460;--未使用の文字列-- +HISTORY_MSG_461;--未使用の文字列-- HISTORY_MSG_462;PS - グリーンを確認 -HISTORY_MSG_464;PS - モーションマスクをぼかす +HISTORY_MSG_463;--未使用の文字列-- +HISTORY_MSG_464;PS - 動体マスクをぼかす HISTORY_MSG_465;PS - ぼかしの半径 +HISTORY_MSG_466;--未使用の文字列-- +HISTORY_MSG_467;--未使用の文字列-- HISTORY_MSG_468;PS - 穴を埋める HISTORY_MSG_469;PS - メディアン -HISTORY_MSG_471;PS - 振れの補正 +HISTORY_MSG_470;--未使用の文字列-- +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_476;CAL - 観視 - 色温度 +HISTORY_MSG_477;CAL - 観視 - 色偏差 +HISTORY_MSG_478;CAL - 観視 - 平均輝度 +HISTORY_MSG_479;CAL - 観視 - 色順応 +HISTORY_MSG_480;CAL - 観視 - 色順応(自動) +HISTORY_MSG_481;CAL - 場面 - 色温度 +HISTORY_MSG_482;CAL - 場面 - 色偏差 +HISTORY_MSG_483;CAL - 場面 - 平均輝度 +HISTORY_MSG_484;CAL - 場面 - 平均輝度(自動) HISTORY_MSG_485;レンズ補正 HISTORY_MSG_486;レンズ補正 - カメラ HISTORY_MSG_487;レンズ補正 - レンズ @@ -734,8 +729,656 @@ HISTORY_MSG_491;ホワイトバランス HISTORY_MSG_492;RGBカーブ HISTORY_MSG_493;L*a*b*調整 HISTORY_MSG_494;キャプチャーシャープニング +HISTORY_MSG_496;ローカル スポット 削除 +HISTORY_MSG_497;ローカル スポット 選択 +HISTORY_MSG_498;ローカル スポット 名前 +HISTORY_MSG_499;ローカル スポット 表示 +HISTORY_MSG_500;ローカル スポット 形状 +HISTORY_MSG_501;ローカル スポット 方法 +HISTORY_MSG_502;ローカル スポット 形状の方式 +HISTORY_MSG_503;ローカル スポット 右の垂直線 +HISTORY_MSG_504;ローカル スポット 左の垂直線 +HISTORY_MSG_505;ローカル スポット 下の水平線 +HISTORY_MSG_506;ローカル スポット 上の水平線 +HISTORY_MSG_507;ローカル スポット 中心 +HISTORY_MSG_508;ローカル スポット 大きさ +HISTORY_MSG_509;ローカル スポット 質の種類 +HISTORY_MSG_510;ローカル スポット 境界 +HISTORY_MSG_511;ローカル スポット しきい値 +HISTORY_MSG_512;ローカル スポット ΔEの減衰 +HISTORY_MSG_513;ローカル スポット スコープ +HISTORY_MSG_514;ローカル スポット 構造 +HISTORY_MSG_515;ローカル編集 +HISTORY_MSG_516;ローカル - 色と明るさ +HISTORY_MSG_517;ローカル - 強力を有効にする +HISTORY_MSG_518;ローカル - 明度 +HISTORY_MSG_519;ローカル - コントラスト +HISTORY_MSG_520;ローカル - 色度 +HISTORY_MSG_521;ローカル - スコープ +HISTORY_MSG_522;ローカル - カーブの方式 +HISTORY_MSG_523;ローカル - LL カーブ +HISTORY_MSG_524;ローカル - CC カーブ +HISTORY_MSG_525;ローカル - LH カーブ +HISTORY_MSG_526;ローカル - H カーブ +HISTORY_MSG_527;ローカル - 反対色 +HISTORY_MSG_528;ローカル - 露光補正 +HISTORY_MSG_529;ローカル - Exp 露光量補正 +HISTORY_MSG_530;ローカル - Exp ハイライト圧縮 +HISTORY_MSG_531;ローカル - Exp ハイライト圧縮のしきい値 +HISTORY_MSG_532;ローカル - Exp 黒レベル +HISTORY_MSG_533;ローカル - Exp 黒レベルの圧縮 +HISTORY_MSG_534;ローカル - ウォームとクール +HISTORY_MSG_535;ローカル - Exp スコープ +HISTORY_MSG_536;ローカル - Exp コントラストカーブ +HISTORY_MSG_537;ローカル - 自然な彩度 +HISTORY_MSG_538;ローカル - 自然な彩度 純色 +HISTORY_MSG_539;ローカル - 自然な彩度 パステル +HISTORY_MSG_540;ローカル - 自然な彩度 しきい値 +HISTORY_MSG_541;ローカル - 自然な彩度 肌色の保護 +HISTORY_MSG_542;ローカル - 自然な彩度 色ずれの回避 +HISTORY_MSG_543;ローカル - 自然な彩度 リンク +HISTORY_MSG_544;ローカル - 自然な彩度 スコープ +HISTORY_MSG_545;ローカル - 自然な彩度 H カーブ +HISTORY_MSG_546;ローカル - ぼかしとノイズ +HISTORY_MSG_547;ローカル - 半径 +HISTORY_MSG_548;ローカル - ノイズ +HISTORY_MSG_549;ローカル - ぼかしのスコープ +HISTORY_MSG_550;ローカル - ぼかしの方式 +HISTORY_MSG_551;ローカル - ぼかし 輝度だけ +HISTORY_MSG_552;ローカル - トーンマッピング +HISTORY_MSG_553;ローカル - TM 強さ +HISTORY_MSG_554;ローカル - TM ガンマ +HISTORY_MSG_555;ローカル - TM エッジ停止 +HISTORY_MSG_556;ローカル - TM スケール +HISTORY_MSG_557;ローカル - TM 再加重 +HISTORY_MSG_558;ローカル - TM スコープ +HISTORY_MSG_559;ローカル - レティネックス +HISTORY_MSG_560;ローカル - レティネックス 方式 +HISTORY_MSG_561;ローカル - レティネックス 強さ +HISTORY_MSG_562;ローカル - レティネックス 色度 +HISTORY_MSG_563;ローカル - レティネックス 半径 +HISTORY_MSG_564;ローカル - レティネックス コントラスト +HISTORY_MSG_565;ローカル - スコープ +HISTORY_MSG_566;ローカル - レティネックス ゲインのカーブ +HISTORY_MSG_567;ローカル - レティネックス 反対処理 +HISTORY_MSG_568;ローカル - シャープニング +HISTORY_MSG_569;ローカル - シャドウハイライト 半径 +HISTORY_MSG_570;ローカル - シャドウハイライト 量 +HISTORY_MSG_571;ローカル - シャドウハイライト 減衰 +HISTORY_MSG_572;ローカル - シャドウハイライト 繰り返し +HISTORY_MSG_573;ローカル - シャドウハイライト スコープ +HISTORY_MSG_574;ローカル - シャドウハイライト 反対処理 +HISTORY_MSG_575;ローカル - 詳細レベルによるコントラスト調整(CbDL) +HISTORY_MSG_576;ローカル - CbDL 複数のレベル +HISTORY_MSG_577;ローカル - CbDL 色度 +HISTORY_MSG_578;ローカル - CbDL しきい値 +HISTORY_MSG_579;ローカル - CbDL スコープ +HISTORY_MSG_580;--未使用の文字列-- +HISTORY_MSG_581;ローカル - ノイズ除去 輝度 番手の低いレベル +HISTORY_MSG_582;ローカル - ノイズ除去 輝度 番手の高いレベル +HISTORY_MSG_583;ローカル - ノイズ除去 ディテールの回復 +HISTORY_MSG_584;ローカル - ノイズ除去 イコライザ 白黒 +HISTORY_MSG_585;ローカル - ノイズ除去 色度 番手の低いレベル +HISTORY_MSG_586;ローカル - ノイズ除去 色度 番手の高いレベル +HISTORY_MSG_587;ローカル - ノイズ除去 色度の回復 +HISTORY_MSG_588;ローカル - ノイズ除去 イコライザ ブルー-レッド +HISTORY_MSG_589;ローカル - ノイズ除去 平滑化フィルタ +HISTORY_MSG_590;ローカル - ノイズ除去 スコープ +HISTORY_MSG_591;ローカル - 色ずれの回避 +HISTORY_MSG_592;ローカル - シャドウハイライト コントラスト +HISTORY_MSG_593;ローカル - ローカルコントラスト +HISTORY_MSG_594;ローカル - ローカルコントラスト 半径 +HISTORY_MSG_595;ローカル - ローカルコントラスト 量 +HISTORY_MSG_596;ローカル - ローカルコントラスト 暗さ +HISTORY_MSG_597;ローカル - ローカルコントラスト 明度 +HISTORY_MSG_598;ローカル - ローカルコントラスト スコープ +HISTORY_MSG_599;ローカル - レティネックス 霞除去 +HISTORY_MSG_600;ローカル - ソフトライト 有効 +HISTORY_MSG_601;ローカル - ソフトライト 強さ +HISTORY_MSG_602;ローカル - ソフトライト スコープ +HISTORY_MSG_603;ローカル - シャドウハイライト ぼかしの半径 +HISTORY_MSG_605;ローカル - 色と明るさの変更 +HISTORY_MSG_606;ローカル - 露光の変更 +HISTORY_MSG_607;ローカル - 色と明るさ マスク C +HISTORY_MSG_608;ローカル - 色と明るさ マスク L +HISTORY_MSG_609;ローカル - 露光補正 マスク C +HISTORY_MSG_610;ローカル - 露光補正 マスク L +HISTORY_MSG_611;ローカル - 色と明るさ マスク H +HISTORY_MSG_612;ローカル - 色と明るさ 構造 +HISTORY_MSG_613;ローカル - 露光補正 構造 +HISTORY_MSG_614;ローカル - 露光補正 マスク H +HISTORY_MSG_615;ローカル - 色と明るさ ブレンド +HISTORY_MSG_616;ローカル - 露光補正 ブレンド +HISTORY_MSG_617;ローカル - 露光補正 ぼかし +HISTORY_MSG_618;ローカル - 色と明るさ マスクを使う +HISTORY_MSG_619;ローカル - 露光補正 マスクを使う +HISTORY_MSG_620;ローカル - 色と明るさ ぼかし +HISTORY_MSG_621;ローカル - 露光補正 反対処理 +HISTORY_MSG_622;ローカル - 構造の除外 +HISTORY_MSG_623;ローカル - 露光補正 色の補間 +HISTORY_MSG_624;ローカル - カラー補正グリッド +HISTORY_MSG_625;ローカル - 補正グリッドの強さ +HISTORY_MSG_626;ローカル - 補正グリッドの方式 +HISTORY_MSG_627;ローカル - シャドウ/ハイライト +HISTORY_MSG_628;ローカル - シャドウハイライト ハイライト +HISTORY_MSG_629;ローカル - シャドウハイライト ハイライトトーンの幅 +HISTORY_MSG_630;ローカル - シャドウハイライト シャドウ +HISTORY_MSG_631;ローカル - シャドウハイライト シャドウトーンの幅 +HISTORY_MSG_632;ローカル - シャドウハイライト 半径 +HISTORY_MSG_633;ローカル - シャドウハイライト スコープ +HISTORY_MSG_634;ローカル - 色と明るさ 半径 +HISTORY_MSG_635;ローカル - 露光補正 半径 +HISTORY_MSG_636;ローカル - 追加された機能 +HISTORY_MSG_637;ローカル - シャドウハイライト マスク C +HISTORY_MSG_638;ローカル - シャドウハイライト マスク L +HISTORY_MSG_639;ローカル - シャドウハイライト マスク H +HISTORY_MSG_640;ローカル - シャドウハイライト ブレンド +HISTORY_MSG_641;ローカル - シャドウハイライト マスクを使用 +HISTORY_MSG_642;ローカル - シャドウハイライト 半径 +HISTORY_MSG_643;ローカル - シャドウハイライト ぼかし +HISTORY_MSG_644;ローカル - シャドウハイライト 反対処理 +HISTORY_MSG_645;ローカル - 色差のバランス ab-L +HISTORY_MSG_646;ローカル - 露光補正 色度のマスク +HISTORY_MSG_647;ローカル - 露光補正 ガンマのマスク +HISTORY_MSG_648;ローカル - 露光補正 スロープのマスク +HISTORY_MSG_649;ローカル - 露光補正 ソフトな半径 +HISTORY_MSG_650;ローカル - 色と明るさ 色度のマスク +HISTORY_MSG_651;ローカル - 色と明るさ ガンマのマスク +HISTORY_MSG_652;ローカル - 色と明るさ スロープのマスク +HISTORY_MSG_653;ローカル - シャドウハイライト 色度のマスク +HISTORY_MSG_654;ローカル - シャドウハイライト ガンマのマスク +HISTORY_MSG_655;ローカル - シャドウハイライト スロープのマスク +HISTORY_MSG_656;ローカル - 色と明るさ ソフトな半径 +HISTORY_MSG_657;ローカル - レティネックス アーティファクトの軽減 +HISTORY_MSG_658;ローカル - CbDL ソフトな半径 +HISTORY_MSG_659;ローカル スポット 境界値の減衰 +HISTORY_MSG_660;ローカル - CbDL 明瞭 +HISTORY_MSG_661;ローカル - CbDL 残差のコントラスト +HISTORY_MSG_662;ローカル - deNoise 輝度 細かい0 +HISTORY_MSG_663;ローカル - deNoise 輝度 細かい2 +HISTORY_MSG_664;--未使用の文字列-- +HISTORY_MSG_665;ローカル - CbDL ブレンドのマスク +HISTORY_MSG_666;ローカル - CbDL 半径のマスク +HISTORY_MSG_667;ローカル - CbDL 色度のマスク +HISTORY_MSG_668;ローカル - CbDL ガンマのマスク +HISTORY_MSG_669;ローカル - CbDL スロープのマスク +HISTORY_MSG_670;ローカル - CbDL マスク C +HISTORY_MSG_671;ローカル - CbDL マスク L +HISTORY_MSG_672;ローカル - CbDL マスク CL +HISTORY_MSG_673;ローカル - CbDL マスクを使う +HISTORY_MSG_674;ローカル - 削除された機能 +HISTORY_MSG_675;ローカル - TM ソフトな半径 +HISTORY_MSG_676;ローカル スポット 境界の差異 +HISTORY_MSG_677;ローカル - TM 量 +HISTORY_MSG_678;ローカル - TM 彩度 +HISTORY_MSG_679;ローカル - レティネックス マスク C +HISTORY_MSG_680;ローカル - レティネックス マスク L +HISTORY_MSG_681;ローカル - レティネックス マスク CL +HISTORY_MSG_682;ローカル - レティネックス マスク +HISTORY_MSG_683;ローカル - レティネックス ブレンドのマスク +HISTORY_MSG_684;ローカル - レティネックス 半径のマスク +HISTORY_MSG_685;ローカル - レティネックス 色度のマスク +HISTORY_MSG_686;ローカル - レティネックス ガンマのマスク +HISTORY_MSG_687;ローカル - レティネックス スロープのマスク +HISTORY_MSG_688;ローカル - 削除された機能 +HISTORY_MSG_689;ローカル - レティネックス 透過マップのマスク +HISTORY_MSG_690;ローカル - レティネックス スケール +HISTORY_MSG_691;ローカル - レティネックス 暗さ +HISTORY_MSG_692;ローカル - レティネックス 明度 +HISTORY_MSG_693;ローカル - レティネックス しきい値 +HISTORY_MSG_694;ローカル - レティネックス ラプラシアンのしきい値 +HISTORY_MSG_695;ローカル - ソフトの方式 +HISTORY_MSG_696;ローカル - レティネックス 標準化 +HISTORY_MSG_697;ローカル - TM 標準化 +HISTORY_MSG_698;ローカル - ローカルコントラスト 高速フーリエ変換 +HISTORY_MSG_699;ローカル - レティネックス 高速フーリエ変換 +HISTORY_MSG_701;ローカル - Exp シャドウ +HISTORY_MSG_702;ローカル - Exp 方式 +HISTORY_MSG_703;ローカル - Exp ラプラシアンのしきい値 +HISTORY_MSG_704;ローカル - Exp PDEのバランス +HISTORY_MSG_705;ローカル - Exp 線形 +HISTORY_MSG_706;ローカル - TM マスク C +HISTORY_MSG_707;ローカル - TM マスク L +HISTORY_MSG_708;ローカル - TM マスク CL +HISTORY_MSG_709;ローカル - TM マスク マスク +HISTORY_MSG_710;ローカル - TM ブレンドのマスク +HISTORY_MSG_711;ローカル - TM 半径のマスク +HISTORY_MSG_712;ローカル - TM 色度のマスク +HISTORY_MSG_713;ローカル - TM ガンマのマスク +HISTORY_MSG_714;ローカル - TM スロープのマスク +HISTORY_MSG_716;ローカル - ローカル 方式 +HISTORY_MSG_717;ローカル - ローカルコントラスト +HISTORY_MSG_718;ローカル - ローカルコントラストのレベル +HISTORY_MSG_719;ローカル - ローカルコントラスト 残差L +HISTORY_MSG_720;ローカル - ぼかし マスク C +HISTORY_MSG_721;ローカル - ぼかし マスク L +HISTORY_MSG_722;ローカル - ぼかし マスク CL +HISTORY_MSG_723;ローカル - ぼかし マスクを使う +HISTORY_MSG_725;ローカル - ぼかし ブレンドのマスク +HISTORY_MSG_726;ローカル - ぼかし 半径のマスク +HISTORY_MSG_727;ローカル - ぼかし 色度のマスク +HISTORY_MSG_728;ローカル - ぼかし ガンマのマスク +HISTORY_MSG_729;ローカル - ぼかし スロープのマスク +HISTORY_MSG_730;ローカル - ぼかしの方式 +HISTORY_MSG_731;ローカル - メディアンの方式 +HISTORY_MSG_732;ローカル - メディアン 繰り返し +HISTORY_MSG_733;ローカル - ソフトな半径 +HISTORY_MSG_734;ローカル - ディテール +HISTORY_MSG_738;ローカル - ローカルコントラスト Lを統合 +HISTORY_MSG_739;ローカル - ローカルコントラスト ソフトな半径 +HISTORY_MSG_740;ローカル - ローカルコントラスト Cを統合 +HISTORY_MSG_741;ローカル - ローカルコントラスト 残差C +HISTORY_MSG_742;ローカル - Exp ラプラシアンのガンマ +HISTORY_MSG_743;ローカル - Exp Fattal 量 +HISTORY_MSG_744;ローカル - Exp Fattal ディテール +HISTORY_MSG_745;ローカル - Exp Fattal オフセット +HISTORY_MSG_746;ローカル - Exp Fattal シグマ +HISTORY_MSG_747;ローカル 作成されたスポット +HISTORY_MSG_748;ローカル - Exp ノイズ除去 +HISTORY_MSG_749;ローカル - レティネックス 深度 +HISTORY_MSG_750;ローカル - レティネックス モード 対数 - 線形 +HISTORY_MSG_751;ローカル - レティネックス 霞除去 彩度 +HISTORY_MSG_752;ローカル - レティネックス オフセット +HISTORY_MSG_753;ローカル - レティネックス 透過マップ +HISTORY_MSG_754;ローカル - レティネックス クリップ +HISTORY_MSG_755;ローカル - TM マスクを使う +HISTORY_MSG_756;ローカル - Exp 露光補正マスクのアルゴリズムを使う +HISTORY_MSG_757;ローカル - Exp ラプラシアンマスク +HISTORY_MSG_758;ローカル - レティネックス ラプラシアンマスク +HISTORY_MSG_759;ローカル - Exp ラプラシアンマスク +HISTORY_MSG_760;ローカル - Color ラプラシアンマスク +HISTORY_MSG_761;ローカル - シャドウハイライト ラプラシアンマスク +HISTORY_MSG_762;ローカル - cbdl ラプラシアンマスク +HISTORY_MSG_763;ローカル - Blur ラプラシアンマスク +HISTORY_MSG_764;ローカル - Solve PDE ラプラシアンマスク +HISTORY_MSG_765;ローカル - deNoise ディテールのしきい値 +HISTORY_MSG_766;ローカル - Blur 高速フーリエ変換 +HISTORY_MSG_767;ローカル - Grain ISO +HISTORY_MSG_768;ローカル - Grain 強さ +HISTORY_MSG_769;ローカル - Grain スケール +HISTORY_MSG_770;ローカル - Color コントラストカーブのマスク +HISTORY_MSG_771;ローカル - Exp コントラストカーブのマスク +HISTORY_MSG_772;ローカル - シャドウハイライト コントラストカーブのマスク +HISTORY_MSG_773;ローカル - TM コントラストカーブのマスク +HISTORY_MSG_774;ローカル - レティネックス コントラストカーブのマスク +HISTORY_MSG_775;ローカル - CBDL コントラストカーブのマスク +HISTORY_MSG_776;ローカル - Blur Denoise コントラストカーブのマスク +HISTORY_MSG_777;ローカル - Blur ローカルコントラストカーブのマスク +HISTORY_MSG_778;ローカル - ハイライトのマスク +HISTORY_MSG_779;ローカル - 色と明るさ ローカルコントラストカーブのマスク +HISTORY_MSG_780;ローカル - 色と明るさ シャドウのマスク +HISTORY_MSG_781;ローカル - コントラスト ウェーブレットのレベルのマスク +HISTORY_MSG_782;ローカル - Blur Denoise ウェーブレットのレベルのマスク +HISTORY_MSG_783;ローカル - 色と明るさ ウェーブレットのレベル +HISTORY_MSG_784;ローカル - ΔEのマスク +HISTORY_MSG_785;ローカル - ΔEのスコープのマスク +HISTORY_MSG_786;ローカル - シャドウハイライト 方式 +HISTORY_MSG_787;ローカル - イコライザの乗数 +HISTORY_MSG_788;ローカル - イコライザのディテール +HISTORY_MSG_789;ローカル - シャドウハイライト マスクの量 +HISTORY_MSG_790;ローカル - シャドウハイライト マスクのアンカー +HISTORY_MSG_791;ローカル - マスク ショートLカーブ +HISTORY_MSG_792;ローカル - マスク 背景輝度 +HISTORY_MSG_793;ローカル - シャドウハイライト TRCのガンマ +HISTORY_MSG_794;ローカル - シャドウハイライト TRCのスロープ +HISTORY_MSG_795;ローカル - マスク 復元したイメージの保存 +HISTORY_MSG_796;ローカル - 基準値の繰り返し +HISTORY_MSG_797;ローカル - オリジナルとの融合方式 +HISTORY_MSG_798;ローカル - 不透明度 +HISTORY_MSG_799;ローカル - Color RGB トーンカーブ +HISTORY_MSG_800;ローカル - Color トーンカーブの方式 +HISTORY_MSG_801;ローカル - Color 特殊なトーンカーブ +HISTORY_MSG_802;ローカル - コントラストしきい値 +HISTORY_MSG_803;ローカル - 色と明るさ 融合 +HISTORY_MSG_804;ローカル - 色と明るさ マスクの構造 +HISTORY_MSG_805;ローカル - ぼかしとノイズ マスクの構造 +HISTORY_MSG_806;ローカル - 色と明るさ 機能としてのマスクの構造 +HISTORY_MSG_807;ローカル - ぼかしとノイズ 機能としてのマスクの構造 +HISTORY_MSG_808;ローカル - 色と明るさ マスクカーブ H(H) +HISTORY_MSG_809;ローカル - 自然な彩度 カーブのマスク C(C) +HISTORY_MSG_810;ローカル - 自然な彩度 カーブのマスク L(L) +HISTORY_MSG_811;ローカル - 自然な彩度 カーブのマスク LC(H) +HISTORY_MSG_813;ローカル - 自然な彩度 マスクを使う +HISTORY_MSG_814;ローカル - 自然な彩度 ブレンドのマスク +HISTORY_MSG_815;ローカル - 自然な彩度 半径のマスク +HISTORY_MSG_816;ローカル - 自然な彩度 色度のマスク +HISTORY_MSG_817;ローカル - 自然な彩度 ガンマのマスク +HISTORY_MSG_818;ローカル - 自然な彩度 勾配のマスク +HISTORY_MSG_819;ローカル - 自然な彩度 ラプラシアンのマスク +HISTORY_MSG_820;ローカル - 自然な彩度 コントラストカーブのマスク +HISTORY_MSG_821;ローカル - 色と明るさ 背景のグリッド +HISTORY_MSG_822;ローカル - 色と明るさ 背景の融合 +HISTORY_MSG_823;ローカル - 色と明るさ 背景の融合 輝度だけ +HISTORY_MSG_824;ローカル - Exp 減光マスクの強さ +HISTORY_MSG_825;ローカル - Exp 減光マスクの角度 +HISTORY_MSG_826;ローカル - Exp 減光の強さ +HISTORY_MSG_827;ローカル - Exp 減光の角度 +HISTORY_MSG_828;ローカル - シャドウハイライト 階調 強さ +HISTORY_MSG_829;ローカル - シャドウハイライト 階調 角度 +HISTORY_MSG_830;ローカル - 色と明るさ 階調 Lの強さ +HISTORY_MSG_831;ローカル - 色と明るさ 階調 角度 +HISTORY_MSG_832;ローカル - 色と明るさ 階調 Cの強さ +HISTORY_MSG_833;ローカル - 減光のフェザー処理 +HISTORY_MSG_834;ローカル - 色と明るさ 減光の強さ H +HISTORY_MSG_835;ローカル - 自然な彩度 諧調 Lの強さ +HISTORY_MSG_836;ローカル - 自然な彩度 階調 角度 +HISTORY_MSG_837;ローカル - 自然な彩度 階調 Cの強さ +HISTORY_MSG_838;ローカル - 自然な彩度 階調 Hの強さ +HISTORY_MSG_839;ローカル - ソフトウェアの難易度 +HISTORY_MSG_840;ローカル - CL カーブ +HISTORY_MSG_841;ローカル - LC カーブ +HISTORY_MSG_842;ローカル - マスクぼかしの半径 +HISTORY_MSG_843;ローカル - マスクぼかしのコントラストしきい値 +HISTORY_MSG_844;ローカル - マスクぼかしのFFTW +HISTORY_MSG_845;ローカル - 対数符号化 +HISTORY_MSG_846;ローカル - 対数符号化 自動 +HISTORY_MSG_847;ローカル - 対数符号化 情報源 +HISTORY_MSG_849;ローカル - 対数符号化 情報源 自動 +HISTORY_MSG_850;ローカル - 対数符号化 ブラックEv +HISTORY_MSG_851;ローカル - 対数符号化 ホワイトEv +HISTORY_MSG_852;ローカル - 対数符号化 目標とするレンダリング +HISTORY_MSG_853;ローカル - 対数符号化 コントラスト +HISTORY_MSG_854;ローカル - 対数符号化 スコープ +HISTORY_MSG_855;ローカル - 対数符号化 画像全体 +HISTORY_MSG_856;ローカル - 対数符号化 シャドウの範囲 +HISTORY_MSG_857;ローカル - ウェーブレット ぼかし 残差画像 +HISTORY_MSG_858;ローカル - ウェーブレット ぼかし 輝度だけ +HISTORY_MSG_859;ローカル - ウェーブレット ぼかし 最大 +HISTORY_MSG_860;ローカル - ウェーブレット ぼかし レベル +HISTORY_MSG_861;ローカル - ウェーブレット コントラスト 詳細レベル1 +HISTORY_MSG_862;ローカル - ウェーブレット コントラストの減衰 ƒ +HISTORY_MSG_863;ローカル - ウェーブレット 元画像と融合 +HISTORY_MSG_864;ローカル - ウェーブレット 方向別コントラストの減衰 +HISTORY_MSG_865;ローカル - ウェーブレット 方向別コントラスト Δ +HISTORY_MSG_866;ローカル - ウェーブレット 方向別コントラスト 圧縮のガンマ +HISTORY_MSG_868;ローカル - ΔE C-Hのバランス +HISTORY_MSG_869;ローカル - レベルによるノイズ除去 +HISTORY_MSG_870;ローカル - ウェーブレット マスク カーブH +HISTORY_MSG_871;ローカル - ウェーブレット マスク カーブC +HISTORY_MSG_872;ローカル - ウェーブレット マスク カーブL +HISTORY_MSG_873;ローカル - ウェーブレット マスク +HISTORY_MSG_875;ローカル - ウェーブレット マスク ブレンド +HISTORY_MSG_876;ローカル - ウェーブレット マスク スムーズ +HISTORY_MSG_877;ローカル - ウェーブレット マスク 色度 +HISTORY_MSG_878;ローカル - ウェーブレット マスク コントラストのカーブ +HISTORY_MSG_879;ローカル - ウェーブレット コントラスト 色度 +HISTORY_MSG_880;ローカル - ウェーブレット ぼかし 色度 +HISTORY_MSG_881;ローカル - ウェーブレット コントラスト オフセット +HISTORY_MSG_882;ローカル - ウェーブレット ぼかし +HISTORY_MSG_883;ローカル - ウェーブレット レベルによるコントラスト +HISTORY_MSG_884;ローカル - ウェーブレット 方向別コントラスト +HISTORY_MSG_885;ローカル - ウェーブレット トーンマッピング +HISTORY_MSG_886;ローカル - ウェーブレット トーンマッピング 圧縮 +HISTORY_MSG_887;ローカル - ウェーブレット トーンマッピング 残差画像の圧縮 +HISTORY_MSG_888;ローカル - コントラスト ウェーブレット バランスのしきい値 +HISTORY_MSG_889;ローカル - コントラスト ウェーブレット 階調の強さ +HISTORY_MSG_890;ローカル - コントラスト ウェーブレット 階調の角度 +HISTORY_MSG_891;ローカル - コントラスト ウェーブレット 階調フィルタ +HISTORY_MSG_892;ローカル - 対数符号化 階調の強さ +HISTORY_MSG_893;ローカル - 対数符号化 階調の角度 +HISTORY_MSG_894;ローカル - 色と明るさ ΔEのプレビュー +HISTORY_MSG_897;ローカル - コントラスト ウェーブレット ES 強さ +HISTORY_MSG_898;ローカル - コントラスト ウェーブレット ES 半径 +HISTORY_MSG_899;ローカル - コントラスト ウェーブレット ES ディテール +HISTORY_MSG_900;ローカル - コントラスト ウェーブレット ES 勾配 +HISTORY_MSG_901;ローカル - コントラスト ウェーブレット ES しきい値 低 +HISTORY_MSG_902;ローカル - コントラスト ウェーブレット ES しきい値 高 +HISTORY_MSG_903;ローカル - コントラスト ウェーブレット ES ローカルコントラスト +HISTORY_MSG_904;ローカル - コントラスト ウェーブレット ES 最初のレベル +HISTORY_MSG_905;ローカル - コントラスト ウェーブレット エッジシャープネス +HISTORY_MSG_906;ローカル - コントラスト ウェーブレット ES 感度 +HISTORY_MSG_907;ローカル - コントラスト ウェーブレット ES 増幅 +HISTORY_MSG_908;ローカル - コントラスト ウェーブレット ES 隣接 +HISTORY_MSG_909;ローカル - コントラスト ウェーブレット ES 表示 +HISTORY_MSG_910;ローカル - ウェーブレット エッジ検出の効果 +HISTORY_MSG_911;ローカル - ぼかし 色度 輝度 +HISTORY_MSG_912;ローカル - ガイド付きフィルターの強さのぼかし +HISTORY_MSG_913;ローカル - コントラスト ウェーブレット シグマ DR +HISTORY_MSG_914;ローカル - ウェーブレットのぼかし シグマ BL +HISTORY_MSG_915;ローカル - ウェーブレットのエッジ シグマ ED +HISTORY_MSG_916;ローカル - ウェーブレットの残差画像 シャドウ +HISTORY_MSG_917;ローカル - ウェーブレットの残差画像 シャドウのしきい値 +HISTORY_MSG_918;ローカル - ウェーブレットの残差画像 ハイライト +HISTORY_MSG_919;ローカル - ウェーブレットの残差画像 ハイライトのしきい値 +HISTORY_MSG_920;ローカル - ウェーブレット シグマ LC +HISTORY_MSG_921;ローカル - ウェーブレット 階調のシグマ LC2 +HISTORY_MSG_922;ローカル - 白黒での変更 +HISTORY_MSG_923;ローカル - 機能の複雑度モード +HISTORY_MSG_924;--未使用の文字列-- +HISTORY_MSG_925;ローカル - カラー機能のスコープ +HISTORY_MSG_926;ローカル - マスクのタイプを表示 +HISTORY_MSG_927;ローカル - シャドウマスク +HISTORY_MSG_928;ローカル - 共通のカラーマスク +HISTORY_MSG_929;ローカル - 共通のカラーマスク スコープ +HISTORY_MSG_930;ローカル - 共通のカラーマスク 輝度の融合 +HISTORY_MSG_931;ローカル - 共通のカラーマスク 有効 +HISTORY_MSG_932;ローカル - 共通のカラーマスク ソフトな半径 +HISTORY_MSG_933;ローカル - 共通のカラーマスク ラプラシアン +HISTORY_MSG_934;ローカル - 共通のカラーマスク 色度 +HISTORY_MSG_935;ローカル - 共通のカラーマスク ガンマ +HISTORY_MSG_936;ローカル - 共通のカラーマスク スロープ +HISTORY_MSG_937;ローカル - 共通のカラーマスク C(C)カーブ +HISTORY_MSG_938;ローカル - 共通のカラーマスク L(L)カーブ +HISTORY_MSG_939;ローカル - 共通のカラーマスク LC(H)カーブ +HISTORY_MSG_940;ローカル - 共通のカラーマスク 機能としての構造 +HISTORY_MSG_941;ローカル - 共通のカラーマスク 構造の強さ +HISTORY_MSG_942;ローカル - 共通のカラーマスク H(H)カーブ +HISTORY_MSG_943;ローカル - 共通のカラーマスク 高速フーリエ変換 +HISTORY_MSG_944;ローカル - 共通のカラーマスク ぼかしの半径 +HISTORY_MSG_945;ローカル - 共通のカラーマスク コントラストのしきい値 +HISTORY_MSG_946;ローカル - 共通のカラーマスク シャドウ +HISTORY_MSG_947;ローカル - 共通のカラーマスク コントラストカーブ +HISTORY_MSG_948;ローカル - 共通のカラーマスク ウェーブレットのカーブ +HISTORY_MSG_949;ローカル - 共通のカラーマスク レベルのしきい値 +HISTORY_MSG_950;ローカル - 共通のカラーマスク 階調調節の強さ +HISTORY_MSG_951;ローカル - 共通のカラーマスク 階調調節の角度 +HISTORY_MSG_952;ローカル - 共通のカラーマスク ソフトな半径 +HISTORY_MSG_953;ローカル - 共通のカラーマスク 色度の融合 +HISTORY_MSG_954;ローカル - 機能の表示/非表示 +HISTORY_MSG_955;ローカル - RT-スポットを有効にする +HISTORY_MSG_956;ローカル - CHカーブ +HISTORY_MSG_957;ローカル - ノイズ除去モード +HISTORY_MSG_958;ローカル - 全ての設定を表示 +HISTORY_MSG_959;ローカル - インバースぼかし +HISTORY_MSG_960;ローカル - 対数符号化 cat02 +HISTORY_MSG_961;ローカル - 対数符号化 色の見えモデル +HISTORY_MSG_962;ローカル - 対数符号化 絶対輝度の情報源 +HISTORY_MSG_963;ローカル - 対数符号化 絶対輝度の目標 +HISTORY_MSG_964;ローカル - 対数符号化 周囲 +HISTORY_MSG_965;ローカル - 対数符号化 彩度S +HISTORY_MSG_966;ローカル - 対数符号化 コントラスト J +HISTORY_MSG_967;ローカル - 対数符号化 マスクカーブ C +HISTORY_MSG_968;ローカル - 対数符号化 マスクカーブ L +HISTORY_MSG_969;ローカル - 対数符号化 マスクカーブ H +HISTORY_MSG_970;ローカル - 対数符号化 マスクは有効 +HISTORY_MSG_971;ローカル - 対数符号化 マスク ブレンド +HISTORY_MSG_972;ローカル - 対数符号化 マスク 半径 +HISTORY_MSG_973;ローカル - 対数符号化 マスク 色度 +HISTORY_MSG_974;ローカル - 対数符号化 マスク コントラスト +HISTORY_MSG_975;ローカル - 対数符号化 明度J +HISTORY_MSG_977;ローカル - 対数符号化 コントラストQ +HISTORY_MSG_978;ローカル - 対数符号化 周囲の環境 +HISTORY_MSG_979;ローカル - 対数符号化 明るさQ +HISTORY_MSG_980;ローカル - 対数符号化 鮮やかさM +HISTORY_MSG_981;ローカル - 対数符号化 強さ +HISTORY_MSG_982;ローカル - イコライザ 色相 +HISTORY_MSG_983;ローカル - ノイズ除去 しきい値マスク 明るい +HISTORY_MSG_984;ローカル - ノイズ除去 しきい値マスク 暗い +HISTORY_MSG_985;ローカル - ノイズ除去 ラプラス変換 +HISTORY_MSG_986;ローカル - ノイズ除去 強化 +HISTORY_MSG_987;ローカル - 階調フィルタ しきい値マスク +HISTORY_MSG_988;ローカル - 階調フィルタ 暗い領域のしきい値マスク +HISTORY_MSG_989;ローカル - 階調フィルタ 明るい領域のしきい値マスク +HISTORY_MSG_990;ローカル - ノイズ除去 しきい値マスク +HISTORY_MSG_991;ローカル - ノイズ除去 暗い領域のしきい値マスク +HISTORY_MSG_992;ローカル - ノイズ除去 明るい領域のしきい値マスク +HISTORY_MSG_993;ローカル - ノイズ除去 インバースのアルゴリズム +HISTORY_MSG_994;ローカル - 階調フィルタ インバースのアルゴリズム +HISTORY_MSG_995;ローカル - ノイズ除去の減衰 +HISTORY_MSG_996;ローカル - 色の復元のしきい値 +HISTORY_MSG_997;ローカル - 色 暗い領域のしきい値マスク +HISTORY_MSG_998;ローカル - 色 明るい領域のしきい値マスク +HISTORY_MSG_999;ローカル - 色 減衰 +HISTORY_MSG_1000;ローカル - グレー領域のノイズ除去 +HISTORY_MSG_1001;ローカル - 対数符号化 復元のしきい値 +HISTORY_MSG_1002;ローカル - 対数符号化 暗い領域のしきい値マスク +HISTORY_MSG_1003;ローカル - 対数符号化 明るい領域のしきい値マスク +HISTORY_MSG_1004;ローカル - 対数符号化 減衰 +HISTORY_MSG_1005;ローカル - 露光補正 復元のしきい値 +HISTORY_MSG_1006;ローカル - 露光補正 暗い領域のしきい値マスク +HISTORY_MSG_1007;ローカル - 露光補正 明るい領域のしきい値マスク +HISTORY_MSG_1008;ローカル - 露光補正 減衰 +HISTORY_MSG_1009;ローカル - シャドウハイライト 復元のしきい値 +HISTORY_MSG_1010;ローカル - シャドウハイライト 暗い領域のしきい値マスク +HISTORY_MSG_1011;ローカル - シャドウハイライト 明るい領域のしきい値マスク +HISTORY_MSG_1012;ローカル - シャドウハイライト 減衰 +HISTORY_MSG_1013;ローカル - 自然な彩度 復元のしきい値 +HISTORY_MSG_1014;ローカル - 自然な彩度 暗い領域のしきい値マスク +HISTORY_MSG_1015;ローカル - 自然な彩度 明るい領域のしきい値マスク +HISTORY_MSG_1016;ローカル - 自然な彩度 減衰 +HISTORY_MSG_1017;ローカル - ローカルコントラスト 復元のしきい値 +HISTORY_MSG_1018;ローカル - ローカルコントラスト 暗い領域のしきい値マスク +HISTORY_MSG_1019;ローカル - ローカルコントラスト 明るい領域のしきい値マスク +HISTORY_MSG_1020;ローカル - ローカルコントラスト 減衰 +HISTORY_MSG_1021;ローカル - グレー領域の色ノイズ除去 +HISTORY_MSG_1022;ローカル - トーンマッピング 復元のしきい値 +HISTORY_MSG_1023;ローカル - トーンマッピング 暗い領域のしきい値マスク +HISTORY_MSG_1024;ローカル - トーンマッピング 明るい領域のしきい値マスク +HISTORY_MSG_1025;ローカル - トーンマッピング 減衰 +HISTORY_MSG_1026;ローカル - cbdl 復元のしきい値 +HISTORY_MSG_1027;ローカル - cbdl 暗い領域のしきい値マスク +HISTORY_MSG_1028;ローカル - cbdl 明るい領域のしきい値マスク +HISTORY_MSG_1029;ローカル - cbdl 減衰 +HISTORY_MSG_1030;ローカル - レティネックス 復元のしきい値 +HISTORY_MSG_1031;ローカル - レティネックス 暗い領域のしきい値マスク +HISTORY_MSG_1032;ローカル - レティネックス 明るい領域のしきい値マスク +HISTORY_MSG_1033;ローカル - レティネックス 減衰 +HISTORY_MSG_1034;ローカル - ノンローカルミーン - 強さ +HISTORY_MSG_1035;ローカル - ノンローカルミーン - ディテール +HISTORY_MSG_1036;ローカル - ノンローカルミーン - パッチ +HISTORY_MSG_1037;ローカル - ノンローカルミーン - 半径 +HISTORY_MSG_1038;ローカル - ノンローカルミーン - ガンマ +HISTORY_MSG_1039;ローカル - 質感 - ガンマ +HISTORY_MSG_1040;ローカル - スポット - ソフトな半径 +HISTORY_MSG_1041;ローカル - スポット - マンセル補正 +HISTORY_MSG_1042;ローカル - 対数符号化 - しきい値 +HISTORY_MSG_1043;ローカル - Exp - 標準化 +HISTORY_MSG_1044;ローカル - ローカルコントラスト 強さ +HISTORY_MSG_1045;ローカル - 色と明るさ 強さ +HISTORY_MSG_1046;ローカル - ノイズ除去 強さ +HISTORY_MSG_1047;ローカル - シャドウ/ハイライトとトーンイコライザ 強さ +HISTORY_MSG_1048;ローカル - ダイナミックレンジと露光補正 強さ +HISTORY_MSG_1049;ローカル - トーンマッピング 強さ +HISTORY_MSG_1050;ローカル - 対数符号化 色度 +HISTORY_MSG_1051;ローカル - 残差画像 ウェーブレット ガンマ +HISTORY_MSG_1052;ローカル - 残差画像 ウェーブレット スロープ +HISTORY_MSG_1053;ローカル - ノイズ除去 ガンマ +HISTORY_MSG_1054;ローカル - ウェーブレット ガンマ +HISTORY_MSG_1055;ローカル - 色と明るさ ガンマ +HISTORY_MSG_1056;ローカル - ダイナミックレンジ圧縮と露光補正 ガンマ +HISTORY_MSG_1057;ローカル - CIECAM 有効 +HISTORY_MSG_1058;ローカル - CIECAM 全体的な強さ +HISTORY_MSG_1059;ローカル - CIECAM 自動グレー +HISTORY_MSG_1060;ローカル - CIECAM 元画像のの平均輝度 +HISTORY_MSG_1061;ローカル - CIECAM 元画像の絶対輝度 +HISTORY_MSG_1062;ローカル - CIECAM 元画像の周囲環境 +HISTORY_MSG_1063;ローカル - CIECAM 彩度 +HISTORY_MSG_1064;ローカル - CIECAM 色度 +HISTORY_MSG_1065;ローカル - CIECAM 明度 J +HISTORY_MSG_1066;ローカル - CIECAM 明るさ Q +HISTORY_MSG_1067;ローカル - CIECAM コントラスト J +HISTORY_MSG_1068;ローカル - CIECAM しきい値 +HISTORY_MSG_1069;ローカル - CIECAM コントラスト Q +HISTORY_MSG_1070;ローカル - CIECAM 鮮やかさ +HISTORY_MSG_1071;ローカル - CIECAM 絶対輝度 +HISTORY_MSG_1072;ローカル - CIECAM 平均輝度 +HISTORY_MSG_1073;ローカル - CIECAM Cat16 +HISTORY_MSG_1074;ローカル - CIECAM ローカルコントラスト +HISTORY_MSG_1075;ローカル - CIECAM 観視条件 +HISTORY_MSG_1076;ローカル - CIECAM スロープ +HISTORY_MSG_1077;ローカル - CIECAM モード +HISTORY_MSG_1078;ローカル - レッドと肌色トーンを保護 +HISTORY_MSG_1079;ローカル - CIECAM シグモイドの強さ J +HISTORY_MSG_1080;ローカル - CIECAM シグモイドのしきい値 +HISTORY_MSG_1081;ローカル - CIECAM シグモイドのブレンド +HISTORY_MSG_1082;ローカル - CIECAM シグモイド Q ブラックEv ホワイトEv +HISTORY_MSG_1083;ローカル - CIECAM 色相 +HISTORY_MSG_1084;ローカル - ブラックEvとホワイトEvを使う +HISTORY_MSG_1085;ローカル - Jz 明度 +HISTORY_MSG_1086;ローカル - Jz コントラスト +HISTORY_MSG_1087;ローカル - Jz 色度 +HISTORY_MSG_1088;ローカル - Jz 色相 +HISTORY_MSG_1089;ローカル - Jz シグモイドの強さ +HISTORY_MSG_1090;ローカル - Jz シグモイドのしきい値 +HISTORY_MSG_1091;ローカル - Jz シグモイドのブレンド +HISTORY_MSG_1092;ローカル - Jz 順応 +HISTORY_MSG_1093;ローカル - CAMのモデル +HISTORY_MSG_1094;ローカル - Jz ハイライト +HISTORY_MSG_1095;ローカル - Jz ハイライトのしきい値 +HISTORY_MSG_1096;ローカル - Jz シャドウ +HISTORY_MSG_1097;ローカル - Jz シャドウのしきい値 +HISTORY_MSG_1098;ローカル - Jz SHの半径 +HISTORY_MSG_1099;ローカル - Cz(Hz)カーブ +HISTORY_MSG_1100;ローカル - 100カンデラのJzの基準値 +HISTORY_MSG_1101;ローカル - Jz PQ 再配分 +HISTORY_MSG_1102;ローカル - Jz(Hz)カーブ +HISTORY_MSG_1103;ローカル - 自然な彩度 ガンマ +HISTORY_MSG_1104;ローカル - シャープネス ガンマ +HISTORY_MSG_1105;ローカル - CIECAM トーン調整の方法 +HISTORY_MSG_1106;ローカル - CIECAM トーンカーブ +HISTORY_MSG_1107;ローカル - CIECAM 色調整の方法 +HISTORY_MSG_1108;ローカル - CIECAM カラーカーブ +HISTORY_MSG_1109;ローカル - Jz(Jz)カーブ +HISTORY_MSG_1110;ローカル - Cz(Cz)カーブ +HISTORY_MSG_1111;ローカル - Cz(Jz)カーブ +HISTORY_MSG_1112;ローカル - 強制的なJz +HISTORY_MSG_1113;ローカル - HDR PQ +HISTORY_MSG_1114;ローカル - Cie マスク 有効 +HISTORY_MSG_1115;ローカル - Cie マスク Cカーブ +HISTORY_MSG_1116;ローカル - Cie マスク Lカーブ +HISTORY_MSG_1117;ローカル - Cie マスク Hカーブ +HISTORY_MSG_1118;ローカル - Cie マスク ブレンド +HISTORY_MSG_1119;ローカル - Cie マスク 半径 +HISTORY_MSG_1120;ローカル - Cie マスク 色度 +HISTORY_MSG_1121;ローカル - Cie マスク コントラストカーブ +HISTORY_MSG_1122;ローカル - Cie マスク 復元のしきい値 +HISTORY_MSG_1123;ローカル - Cie マスク 復元 暗い部分 +HISTORY_MSG_1124;ローカル - Cie マスク 復元 明るい部分 +HISTORY_MSG_1125;ローカル - Cie マスク 復元の減衰 +HISTORY_MSG_1126;ローカル - Cie マスク ラプラシアン +HISTORY_MSG_1127;ローカル - Cie マスク ガンマ +HISTORY_MSG_1128;ローカル - Cie マスク スロープ +HISTORY_MSG_1129;ローカル - Cie 相対輝度 +HISTORY_MSG_1130;ローカル - Cie 彩度 Jz +HISTORY_MSG_1131;ローカル - マスク 色ノイズ除去  +HISTORY_MSG_1132;ローカル - Cie ウェーブレット シグマ Jz +HISTORY_MSG_1133;ローカル - Cie ウェーブレット レベル Jz +HISTORY_MSG_1134;ローカル - Cie ウェーブレット ローカルコントラスト Jz +HISTORY_MSG_1135;ローカル - Cie ウェーブレット 明瞭 Jz +HISTORY_MSG_1136;ローカル - Cie ウェーブレット 明瞭 Cz +HISTORY_MSG_1137;ローカル - Cie ウェーブレット 明瞭 ソフト +HISTORY_MSG_1138;ローカル - ローカル - Hz(Hz)カーブ +HISTORY_MSG_1139;ローカル - Jz ソフト Hカーブ +HISTORY_MSG_1140;ローカル - Jz 色度のしきい値 +HISTORY_MSG_1141;ローカル - 色度のカーブ Jz(Hz) +HISTORY_MSG_1142;ローカル - 強さ ソフト +HISTORY_MSG_1143;ローカル - Jz ブラックEv +HISTORY_MSG_1144;ローカル - Jz ホワイトEv +HISTORY_MSG_1145;ローカル - Jz 対数符号化 +HISTORY_MSG_1146;ローカル - Jz 対数符号化 目標のグレー +HISTORY_MSG_1147;ローカル - Jz ブラックEv ホワイトEv +HISTORY_MSG_1148;ローカル - Jz シグモイド +HISTORY_MSG_1149;ローカル - Q シグモイド +HISTORY_MSG_1150;ローカル - シグモイドQの代わりに対数符号化Qを使う +HISTORY_MSG_BLSHAPE;レベルによるぼかし +HISTORY_MSG_BLURCWAV;色度のぼかし +HISTORY_MSG_BLURWAV;輝度のぼかし +HISTORY_MSG_BLUWAV;減衰応答 +HISTORY_MSG_CATCAT;CAL - モードの設定 +HISTORY_MSG_CATCOMPLEX;CAL - 機能水準の設定 +HISTORY_MSG_CATMODEL;CAL - 色の見えモデルの設定 HISTORY_MSG_CLAMPOOG;色域外の色を切り取る -HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - カラー補正 +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - 色の補正 HISTORY_MSG_COLORTONING_LABREGION_AB;CT - 色の補正 HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - 色チャンネル HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - 色度のマスク @@ -749,22 +1392,42 @@ 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_COMPLEX;ウェーブレットの機能水準 +HISTORY_MSG_COMPLEXRETI;レティネックスの機能水準 HISTORY_MSG_DEHAZE_DEPTH;霞除去 - 深度 HISTORY_MSG_DEHAZE_ENABLED;霞除去 -HISTORY_MSG_DEHAZE_LUMINANCE;霞除去 - 輝度のみ +HISTORY_MSG_DEHAZE_SATURATION;霞除去 - 彩度 HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示 HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値 HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - コントラストのしきい値 +HISTORY_MSG_EDGEFFECT;エッジの効果調整 +HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - 参考出力 +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;ネガフィルムの色空間 HISTORY_MSG_FILMNEGATIVE_ENABLED;ネガフィルム +HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - 参考入力 HISTORY_MSG_FILMNEGATIVE_VALUES;ネガフィルムの値 HISTORY_MSG_HISTMATCHING;トーンカーブの自動調節 +HISTORY_MSG_HLBL;Color 色の波及 - ぼかし +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +HISTORY_MSG_ICM_AINTENT;アブストラクトプロファイルの意図 +HISTORY_MSG_ICM_BLUX;原色 ブルー X +HISTORY_MSG_ICM_BLUY;原色 ブルー Y +HISTORY_MSG_ICM_FBW;白黒 +HISTORY_MSG_ICM_GREX;原色 グリーン X +HISTORY_MSG_ICM_GREY;原色 グリーン Y HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - プライマリ HISTORY_MSG_ICM_OUTPUT_TEMP;出力 - ICC-v4 光源 D HISTORY_MSG_ICM_OUTPUT_TYPE;出力 - タイプ +HISTORY_MSG_ICM_PRESER;ニュートラルを維持 +HISTORY_MSG_ICM_REDX;原色 レッド X +HISTORY_MSG_ICM_REDY;原色 レッド Y  HISTORY_MSG_ICM_WORKING_GAMMA;作業色空間 - ガンマ +HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;輝度 方式 +HISTORY_MSG_ICM_WORKING_PRIM_METHOD;原色 方式 HISTORY_MSG_ICM_WORKING_SLOPE;作業色空間 - 勾配 -HISTORY_MSG_ICM_WORKING_TRC_METHOD;作業色空間 - TRCの方式 +HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRCの方式 +HISTORY_MSG_ILLUM;輝度 HISTORY_MSG_LOCALCONTRAST_AMOUNT;ローカルコントラスト - 量 HISTORY_MSG_LOCALCONTRAST_DARKNESS;ローカルコントラスト - 暗い部分 HISTORY_MSG_LOCALCONTRAST_ENABLED;ローカルコントラスト @@ -779,20 +1442,81 @@ HISTORY_MSG_PDSHARPEN_CONTRAST;CS - コントラストのしきい値 HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - 繰り返し HISTORY_MSG_PDSHARPEN_RADIUS;CS - シグマ HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - 周辺のシグマを増やす -HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - 振れに対するデモザイクの方式 +HISTORY_MSG_PERSP_CAM_ANGLE;パースペクティブ - カメラ +HISTORY_MSG_PERSP_CAM_FL;パースペクティブ - カメラ +HISTORY_MSG_PERSP_CAM_SHIFT;パースペクティブ - カメラ +HISTORY_MSG_PERSP_CTRL_LINE;パースペクティブ - 制御ライン +HISTORY_MSG_PERSP_METHOD;パースペクティブ - 方法 +HISTORY_MSG_PERSP_PROJ_ANGLE;パースペクティブ - 回復 +HISTORY_MSG_PERSP_PROJ_ROTATE;パースペクティブ - PCA 回転 +HISTORY_MSG_PERSP_PROJ_SHIFT;パースペクティブ - PCA +HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - 平均 +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - 動体に対するデモザイクの方式 HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;ラインノイズフィルタの方向 HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ +HISTORY_MSG_PREPROCWB_MODE;ホワイトバランスモードの前処理 +HISTORY_MSG_PROTAB;保護 HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - コントラストのしきい値 +HISTORY_MSG_RANGEAB;abの範囲 HISTORY_MSG_RAWCACORR_AUTOIT;Rawの色収差補正 - 繰り返し HISTORY_MSG_RAWCACORR_COLORSHIFT;Rawの色収差補正 - 色ずれを回避 HISTORY_MSG_RAW_BORDER;Rawの境界 HISTORY_MSG_RESIZE_ALLOWUPSCALING;リサイズ - アップスケーリングを可能にする +HISTORY_MSG_RESIZE_LONGEDGE;リサイズ - ロングエッジ +HISTORY_MSG_RESIZE_SHORTEDGE;Resize - ショートエッジ HISTORY_MSG_SHARPENING_BLUR;シャープニング - ぼかしの半径 HISTORY_MSG_SHARPENING_CONTRAST;シャープニング - コントラストのしきい値 HISTORY_MSG_SH_COLORSPACE;S/H - 色空間 +HISTORY_MSG_SIGMACOL;色度の効果調整 +HISTORY_MSG_SIGMADIR;方向の効果調整 +HISTORY_MSG_SIGMAFIN;最終的なコントラストの効果調整 +HISTORY_MSG_SIGMATON;トーンの効果調整 HISTORY_MSG_SOFTLIGHT_ENABLED;ソフトライト HISTORY_MSG_SOFTLIGHT_STRENGTH;ソフトライト - 強さ +HISTORY_MSG_SPOT;スポット除去 +HISTORY_MSG_SPOT_ENTRY;スポット除去 - ポイント変更 +HISTORY_MSG_TEMPOUT;CAM02/16 自動色温度設定 +HISTORY_MSG_THRESWAV;バランスのしきい値 HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - アンカー +HISTORY_MSG_TRANS_METHOD;ジオメトリ - 方式 +HISTORY_MSG_WAVBALCHROM;イコライザ 色度 +HISTORY_MSG_WAVBALLUM;イコライザ 輝度 +HISTORY_MSG_WAVBL;レベルのぼかし +HISTORY_MSG_WAVCHR;レベルのぼかし - 色度のぼかし +HISTORY_MSG_WAVCHROMCO;大きいディテールの色度 +HISTORY_MSG_WAVCHROMFI;小さいディテールの色度 +HISTORY_MSG_WAVCLARI;明瞭 +HISTORY_MSG_WAVDENLH;レベル5 +HISTORY_MSG_WAVDENOISE;ローカルコントラスト +HISTORY_MSG_WAVDENOISEH;番手の高いレベルのローカルコントラスト +HISTORY_MSG_WAVDETEND;ディテール ソフト +HISTORY_MSG_WAVEDGS;エッジ停止 +HISTORY_MSG_WAVGUIDH;ローカルコントラスト-色相イコライザ +HISTORY_MSG_WAVHUE;イコライザ 色相 +HISTORY_MSG_WAVLABGRID_VALUE;色調 - 色は除く +HISTORY_MSG_WAVLEVDEN;高いレベルのイコライザ +HISTORY_MSG_WAVLEVELSIGM;ノイズ除去 - 半径 +HISTORY_MSG_WAVLEVSIGM;半径 +HISTORY_MSG_WAVLIMDEN;相互作用 レベル5~6 とレベル1~4 +HISTORY_MSG_WAVLOWTHR;最小コントラストのしきい値 +HISTORY_MSG_WAVMERGEC;色度の融合 +HISTORY_MSG_WAVMERGEL;輝度の融合 +HISTORY_MSG_WAVMIXMET;ローカルコントラストの基準値 +HISTORY_MSG_WAVOFFSET;オフセット +HISTORY_MSG_WAVOLDSH;古いアルゴリズムを使う +HISTORY_MSG_WAVQUAMET;ノイズ除去モード +HISTORY_MSG_WAVRADIUS;シャドウ/ハイライトの半径 +HISTORY_MSG_WAVSCALE;スケール +HISTORY_MSG_WAVSHOWMASK;ウェーブレットのマスクを表示 +HISTORY_MSG_WAVSIGM;シグマ +HISTORY_MSG_WAVSIGMA;減衰応答 +HISTORY_MSG_WAVSLIMET;方式 +HISTORY_MSG_WAVSOFTRAD;明瞭のソフトな半径 +HISTORY_MSG_WAVSOFTRADEND;最終画像のソフトな半径 +HISTORY_MSG_WAVSTREND;ソフトの強さ +HISTORY_MSG_WAVTHRDEN;ローカルコントラストのしきい値 +HISTORY_MSG_WAVTHREND;ローカルコントラストのしきい値 +HISTORY_MSG_WAVUSHAMET;明瞭の方式 HISTORY_NEWSNAPSHOT;追加 HISTORY_NEWSNAPSHOT_TOOLTIP;ショートカット: Alt-s HISTORY_SNAPSHOT;スナップショット @@ -810,11 +1534,12 @@ ICCPROFCREATOR_ILL_41;D41 ICCPROFCREATOR_ILL_50;D50 ICCPROFCREATOR_ILL_55;D55 ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_63;D63 : DCI-P3 映画館 ICCPROFCREATOR_ILL_65;D65 ICCPROFCREATOR_ILL_80;D80 ICCPROFCREATOR_ILL_DEF;デフォルト ICCPROFCREATOR_ILL_INC;StdA 2856K -ICCPROFCREATOR_ILL_TOOLTIP;ICC v4プロファイルに関する光源だけを設定することができます +ICCPROFCREATOR_ILL_TOOLTIP;ICC v4プロファイル、。v2プロファイルの光源が設定ができます。 ICCPROFCREATOR_PRIMARIES;プライマリ: ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -824,6 +1549,7 @@ ICCPROFCREATOR_PRIM_BETA;BetaRGB ICCPROFCREATOR_PRIM_BLUX;ブルー X ICCPROFCREATOR_PRIM_BLUY;ブルー Y ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 ICCPROFCREATOR_PRIM_GREX;グリーン X ICCPROFCREATOR_PRIM_GREY;グリーン Y ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -831,13 +1557,14 @@ ICCPROFCREATOR_PRIM_REC2020;Rec2020 ICCPROFCREATOR_PRIM_REDX;レッド X ICCPROFCREATOR_PRIM_REDY;レッド Y ICCPROFCREATOR_PRIM_SRGB;sRGB -ICCPROFCREATOR_PRIM_TOOLTIP;ICC v4プロファイルに関するカスタムプライマリーを設定することが出来ます +ICCPROFCREATOR_PRIM_TOOLTIP;ICC v4プロファイル、。v2プロファイルのカスタムプライマリーが設定ができます。 ICCPROFCREATOR_PRIM_WIDEG;Widegamut ICCPROFCREATOR_PROF_V2;ICC v2 ICCPROFCREATOR_PROF_V4;ICC v4 ICCPROFCREATOR_SAVEDIALOG_TITLE;...でICCプロファイルを保存 ICCPROFCREATOR_SLOPE;勾配 -ICCPROFCREATOR_TRC_PRESET;トーン再現カーブ: +ICCPROFCREATOR_TRC_PRESET;トーンリプレーススカーブ +INSPECTOR_WINDOW_TITLE;カメラ出し画像 IPTCPANEL_CATEGORY;カテゴリ IPTCPANEL_CATEGORYHINT;画像の意図 IPTCPANEL_CITY;都市 @@ -880,14 +1607,13 @@ 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_PUTTOQUEUE_TOOLTIP;現在の画像を処理キューに追加\nショートカット: Ctrl+b MAIN_BUTTON_SAVE_TOOLTIP;現在の画像を保存\nショートカット: Ctrl+S MAIN_BUTTON_SENDTOEDITOR;外部エディタで画像を編集 MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;現在の画像を外部エディタで編集\nショートカット: Ctrl+e @@ -904,7 +1630,7 @@ MAIN_FRAME_QUEUE;キュー MAIN_FRAME_QUEUE_TOOLTIP;キューで処理します\nショートカット: Ctrl-F3 MAIN_FRAME_RECENT;最近開いたフォルダ MAIN_MSG_ALREADYEXISTS;ファイルはすでに存在します -MAIN_MSG_CANNOTLOAD;画像読み込みできません +MAIN_MSG_CANNOTLOAD;画像の読み込みができません MAIN_MSG_CANNOTSAVE;ファイル保存エラー MAIN_MSG_CANNOTSTARTEDITOR;エディタを開始することができません MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;"環境設定"で正しいパスを設定してください @@ -921,7 +1647,7 @@ MAIN_TAB_ADVANCED;高度な機能 MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: Alt-a MAIN_TAB_COLOR;カラー MAIN_TAB_COLOR_TOOLTIP;ショートカット: Alt-c -MAIN_TAB_DETAIL;CbDL +MAIN_TAB_DETAIL;ディテール MAIN_TAB_DETAIL_TOOLTIP;ショートカット: Alt-d MAIN_TAB_DEVELOP;一括編集 MAIN_TAB_EXIF;Exif @@ -933,6 +1659,8 @@ MAIN_TAB_FAVORITES_TOOLTIP;ショートカット: Alt-u MAIN_TAB_FILTER;絞り込み MAIN_TAB_INSPECT;カメラ出しJPEG MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;ローカル編集 +MAIN_TAB_LOCALLAB_TOOLTIP;ショートカット Alt-o MAIN_TAB_METADATA;メタデータ MAIN_TAB_METADATA_TOOLTIP;ショートカット: Alt-m MAIN_TAB_RAW;raw @@ -945,8 +1673,8 @@ MAIN_TOOLTIP_BACKCOLOR2;プレビューの背景色を指定します: 中間のグレー\nショートカット: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;固定 / 固定解除 - 補正前 の表示設定\n\n固定: 補正前をそのまま表示し変更されません\n複数のツールの累積効果を評価するのに役立ちます\nさらに、比較は履歴上のどこからでも行うことができます\n\n固定解除: 現在使用のツールの効果が 補正後 に表示され、その1段階前が 補正前 に表示されます MAIN_TOOLTIP_HIDEHP;左パネル 表示/非表示 (履歴含む)\nショートカット: l -MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: < -MAIN_TOOLTIP_INDCLIPPEDS;シャドウ・クリッピング領域の表示\nショートカット: > +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_PREVIEWG;グリーン チャンネル表示\nショートカット: g @@ -972,7 +1700,7 @@ 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_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;高度な設定 @@ -1012,20 +1740,23 @@ PARTIALPASTE_GRADIENT;減光フィルター PARTIALPASTE_HSVEQUALIZER;HSV イコライザ PARTIALPASTE_ICMSETTINGS;ICM 設定 PARTIALPASTE_IMPULSEDENOISE;インパルス・ノイズ低減 -PARTIALPASTE_IPTCINFO;IPTC 情報 +PARTIALPASTE_IPTCINFO;IPTC PARTIALPASTE_LABCURVE;L*a*b* 調整 -PARTIALPASTE_LENSGROUP;レンズ設定 -PARTIALPASTE_LENSPROFILE;レンズ補正プロファイル +PARTIALPASTE_LENSGROUP;レンズ関係の設定 +PARTIALPASTE_LENSPROFILE;プロファイルされたレンズ補正 PARTIALPASTE_LOCALCONTRAST;ローカルコントラスト +PARTIALPASTE_LOCALLAB;ローカル編集 +PARTIALPASTE_LOCALLABGROUP;ローカル編集の設定 PARTIALPASTE_METADATA;メタデータモード PARTIALPASTE_METAGROUP;メタデータ PARTIALPASTE_PCVIGNETTE;ビネットフィルター PARTIALPASTE_PERSPECTIVE;パースペクティブの補正 PARTIALPASTE_PREPROCESS_DEADPIXFILT;デッドピクセルフィルターを適用 PARTIALPASTE_PREPROCESS_GREENEQUIL;グリーン 平衡化 -PARTIALPASTE_PREPROCESS_HOTPIXFILT;ホットピクセルフィルターを適用 +PARTIALPASTE_PREPROCESS_HOTPIXFILT;ホットピクセルフィルター PARTIALPASTE_PREPROCESS_LINEDENOISE;ラインノイズ フィルタ PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF ラインフィルタ +PARTIALPASTE_PREPROCWB;ホワイトバランスの前処理 PARTIALPASTE_PRSHARPENING;リサイズ後のシャープニング PARTIALPASTE_RAWCACORR_AUTO;自動色収差補正 PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA 色ずれを回避 @@ -1049,7 +1780,8 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;シャドウ/ハイライト PARTIALPASTE_SHARPENEDGE;エッジ PARTIALPASTE_SHARPENING;シャープニング (USM/RL) PARTIALPASTE_SHARPENMICRO;マイクロコントラスト -PARTIALPASTE_SOFTLIGHT;ソフトな明るさ +PARTIALPASTE_SOFTLIGHT;ソフトライト +PARTIALPASTE_SPOT;スポット除去 PARTIALPASTE_TM_FATTAL;ダイナミックレンジ圧縮 PARTIALPASTE_VIBRANCE;自然な彩度 PARTIALPASTE_VIGNETTING;周辺光量補正 @@ -1085,11 +1817,17 @@ PREFERENCES_CHUNKSIZE_RAW_CA;Raw 色収差補正 PREFERENCES_CHUNKSIZE_RAW_RCD;RCD デモザイク PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans デモザイク PREFERENCES_CHUNKSIZE_RGB;RGB 処理 -PREFERENCES_CLIPPINGIND;クリッピング領域の表示 +PREFERENCES_CIE;色の見えモデル +PREFERENCES_CIEARTIF;アーティファクトを回避 +PREFERENCES_CLIPPINGIND;クリッピング警告の表示 PREFERENCES_CLUTSCACHE;HaldCLUT cache PREFERENCES_CLUTSCACHE_LABEL;cacheに入れるHaldCLUTの最大数 PREFERENCES_CLUTSDIR;HaldCLUTのディレクトリー PREFERENCES_CMMBPC;ブラックポイントの補正 +PREFERENCES_COMPLEXITYLOC;デフォルトで表示するローカル編集の機能水準 +PREFERENCES_COMPLEXITY_EXP;高度 +PREFERENCES_COMPLEXITY_NORM;標準 +PREFERENCES_COMPLEXITY_SIMP;基本 PREFERENCES_CROP;切り抜き画像の編集 PREFERENCES_CROP_AUTO_FIT;切り抜き画像を自動的に拡大します PREFERENCES_CROP_GUIDES;切り抜き画像が編集されていない時はガイドを表示します @@ -1121,11 +1859,17 @@ PREFERENCES_DIRSELECTDLG;起動時の画像ディレクトリ選択... PREFERENCES_DIRSOFTWARE;インストール・ディレクトリ PREFERENCES_EDITORCMDLINE;カスタムコマンドライン PREFERENCES_EDITORLAYOUT;編集 レイアウト +PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;出力プロファイルを迂回 +PREFERENCES_EXTEDITOR_DIR;出力ディレクトリ +PREFERENCES_EXTEDITOR_DIR_CURRENT;入力画像と同じ +PREFERENCES_EXTEDITOR_DIR_CUSTOM;カスタム +PREFERENCES_EXTEDITOR_DIR_TEMP;OS 一時ディレクトリ +PREFERENCES_EXTEDITOR_FLOAT32;32-ビット 浮動小数点TIFF出力 PREFERENCES_EXTERNALEDITOR;外部エディタ PREFERENCES_FBROWSEROPTS;ファイルブラウザ/サムネイルのオプション PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;ファイルブラウザのツールバーを圧縮 PREFERENCES_FLATFIELDFOUND;検出 -PREFERENCES_FLATFIELDSDIR;フラットフィールド・ディレクトリ +PREFERENCES_FLATFIELDSDIR;フラットフィールドのディレクトリ PREFERENCES_FLATFIELDSHOTS;ショット PREFERENCES_FLATFIELDTEMPLATES;テンプレート PREFERENCES_FORIMAGE;rawではない画像 @@ -1135,9 +1879,10 @@ PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;サムネイルのサイズが異な PREFERENCES_GIMPPATH;GIMP インストール ディレクトリ PREFERENCES_HISTOGRAMPOSITIONLEFT;左パネルにヒストグラム PREFERENCES_HISTOGRAM_TOOLTIP;これを有効にすると、ヒストグラムとナビゲーターの表示に、出力プロファイル(ガンマ適用)の代わりに作業プロファイルを使います -PREFERENCES_HLTHRESHOLD;ハイライト・クリッピング領域のしきい値 +PREFERENCES_HLTHRESHOLD;ハイライト・クリッピング警告のしきい値 PREFERENCES_ICCDIR;カラープロファイルを含むディレクトリ PREFERENCES_IMPROCPARAMS;画像処理のデフォルト値 +PREFERENCES_INSPECTORWINDOW;カメラ出し画像を独自のウィンドウ或いはフルスクリーンで開く PREFERENCES_INSPECT_LABEL;カメラ出しJPEG PREFERENCES_INSPECT_MAXBUFFERS_LABEL;cacheに入れる画像の最大数 PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;ファイルブラウザの操作中にcacheに入れられる画像の最大数。RAM容量が小さい場合(2G以下)の場合は、設定値を1或いは2にするべき @@ -1155,12 +1900,12 @@ PREFERENCES_MENUGROUPLABEL;"カラーラベル"のグループ PREFERENCES_MENUGROUPPROFILEOPERATIONS;"処理プロファイル操作"のグループ PREFERENCES_MENUGROUPRANK;"ランキング"のグループ PREFERENCES_MENUOPTIONS;メニューオプションの状況 -PREFERENCES_MONINTENT;デフォルトのモニターインテント +PREFERENCES_MONINTENT;デフォルトのレンダリングインテント PREFERENCES_MONITOR;モニター PREFERENCES_MONPROFILE;デフォルトのモニタープロファイル PREFERENCES_MONPROFILE_WARNOSX;MacのOSの制約により、サポート出来るのはsRGBだけです PREFERENCES_MULTITAB;マルチ編集タブモード -PREFERENCES_MULTITABDUALMON;独自のウィンドウモードによるマルチ編集タブ +PREFERENCES_MULTITABDUALMON;特定のウィンドウでマルチ編集タブを使う PREFERENCES_NAVIGATIONFRAME;ナビゲーション PREFERENCES_OVERLAY_FILENAMES;ファイル名をサムネイル上に透過表示する PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;ファイル名を編集パネルのサムネイル上に透過表示する @@ -1191,9 +1936,9 @@ PREFERENCES_PROFILESAVEINPUT;処理プロファイルのパラメータを入力 PREFERENCES_PROFILESAVELOCATION;処理プロファイルが保存されている場所 PREFERENCES_PROFILE_NONE;なし PREFERENCES_PROPERTY;プロパティ -PREFERENCES_PRTINTENT;目標とするレンダリング +PREFERENCES_PRTINTENT;レンダリングインテント PREFERENCES_PRTPROFILE;カラープロファイル -PREFERENCES_PSPATH;Adobe Photoshop のインストール・ディレクトリ +PREFERENCES_PSPATH;Adobe Photoshop(c)のインストール・ディレクトリ PREFERENCES_REMEMBERZOOMPAN;ズームレベルとパン速度を記憶する PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;現在の画像のズームレベルとパン速度を記憶し、新しく開く画像に適用\n\nこのオプションが使えるのは、編集画面のモードが“シングル編集”で、“プレビューのズームレベルが100%以下の場合に使うデモザイク”が“pp3に従う”と設定されている場合だけです。 PREFERENCES_SAVE_TP_OPEN_NOW;機能パネルの今の開閉状態を保存する @@ -1206,13 +1951,14 @@ PREFERENCES_SHOWBASICEXIF;基本Exif情報を表示 PREFERENCES_SHOWDATETIME;日付表示 PREFERENCES_SHOWEXPOSURECOMPENSATION;露光補正追加 PREFERENCES_SHOWFILMSTRIPTOOLBAR;画像スライドにツールバーを表示する -PREFERENCES_SHTHRESHOLD;シャドウ・クリッピング領域のしきい値 -PREFERENCES_SINGLETAB;シングルタブモードモード +PREFERENCES_SHOWTOOLTIP;ローカル調整の機能のヒントを表示 +PREFERENCES_SHTHRESHOLD;シャドウ・クリッピング警告のしきい値 +PREFERENCES_SINGLETAB;シングルタブ編集モード PREFERENCES_SINGLETABVERTAB;シングル編集タブモード, 垂直タブ PREFERENCES_SND_HELP;ファイルパスを入力 または空欄(無音).\nWindowsはシステムサウンドの "SystemDefault", "SystemAsterisk"など..\nLinuxはシステムサウンドの "complete", "window-attention"などを使用します PREFERENCES_SND_LNGEDITPROCDONE;編集処理 終了 PREFERENCES_SND_QUEUEDONE;キュー処理 終了 -PREFERENCES_SND_THRESHOLDSECS;秒後 +PREFERENCES_SND_THRESHOLDSECS;数秒後 PREFERENCES_STARTUPIMDIR;起動時の画像・ディレクトリ PREFERENCES_TAB_BROWSER;ファイルブラウザ PREFERENCES_TAB_COLORMGR;カラーマネジメント @@ -1229,12 +1975,13 @@ PREFERENCES_TP_LABEL;ツール パネル: PREFERENCES_TP_VSCROLLBAR;ツールパネルの垂直スクロールバーを隠す PREFERENCES_USEBUNDLEDPROFILES;付属のプロファイルを使用 PREFERENCES_WORKFLOW;レイアウト +PREFERENCES_ZOOMONSCROLL;スクロールを使って画像の拡大・縮小 PROFILEPANEL_COPYPPASTE;コピーするパラメータ PROFILEPANEL_GLOBALPROFILES;付属のプロファイル PROFILEPANEL_LABEL;処理プロファイル PROFILEPANEL_LOADDLGLABEL;処理プロファイルを読み込む... PROFILEPANEL_LOADPPASTE;読み込むパラメータ -PROFILEPANEL_MODE_TIP;処理プロファイルの適用モードボタン\n\nボタンが押された状態:処理プロファイルで設定されている値が適用され、且つ、他の値はプログラムにハードコーディングされているデフォルト値に置き換えられます\n\nボタンが離された状態:その処理プロファイルで設定されている値だけが適用されます +PROFILEPANEL_MODE_TOOLTIP;処理プロファイルの適用モードボタン\n\nボタンが押された状態:処理プロファイルで設定されている値が適用され、且つ、他の値はプログラムにハードコーディングされているデフォルト値に置き換えられます\n\nボタンが離された状態:その処理プロファイルで設定されている値だけが適用されます PROFILEPANEL_MYPROFILES;自分のプロファイル PROFILEPANEL_PASTEPPASTE;貼り付けるパラメータ PROFILEPANEL_PCUSTOM;カスタム @@ -1294,7 +2041,7 @@ SAVEDLG_AUTOSUFFIX;ファイルが存在する場合、自動的に末尾に文 SAVEDLG_FILEFORMAT;ファイル形式 SAVEDLG_FILEFORMAT_FLOAT;浮動小数点 SAVEDLG_FORCEFORMATOPTS;強制保存オプション -SAVEDLG_JPEGQUAL;JPEG 品質 +SAVEDLG_JPEGQUAL;JPEGの質 SAVEDLG_PUTTOQUEUE;キュー処理に追加 SAVEDLG_PUTTOQUEUEHEAD;キュー処理の最初に追加 SAVEDLG_PUTTOQUEUETAIL;キュー処理の最後に追加 @@ -1310,6 +2057,12 @@ SAVEDLG_WARNFILENAME;ファイルに名前が付けられます SHCSELECTOR_TOOLTIP;この3つのスライダーの位置をリセットするには\nマウスの右ボタンをクリック SOFTPROOF_GAMUTCHECK_TOOLTIP;有効にすると、出力プロファイルの色域から外れた色のピクセルをグレーで表示します SOFTPROOF_TOOLTIP;ソフトプルーフィング\n有効にすると、ICMツールの出力プロファイルを使った疑似的なレンダリングを行います。印刷した場合などの画像の印象を掴むのに大変便利です。 +TC_PRIM_BLUX;Bx +TC_PRIM_BLUY;By +TC_PRIM_GREX;Gx +TC_PRIM_GREY;Gy +TC_PRIM_REDX;Rx +TC_PRIM_REDY;Ry THRESHOLDSELECTOR_B;下 THRESHOLDSELECTOR_BL;下-左 THRESHOLDSELECTOR_BR;下-右 @@ -1317,10 +2070,11 @@ THRESHOLDSELECTOR_HINT;個々のコントロールポイントを移動するに THRESHOLDSELECTOR_T;上 THRESHOLDSELECTOR_TL;上-左 THRESHOLDSELECTOR_TR;上-右 -TOOLBAR_TOOLTIP_COLORPICKER;ロック式カラーピッカー\n\n有効にすると:\nプレビュー画像上でマウスを左クリックするとカラーピッカーが追加されます。\n左のボタンを押しながらマウスを動かすとカラーピッカーも移動します\nカラーピッカーを削除する時はマウスを右クリックします\nカラーピッカー全てを削除する場合は、Shiftボタンを押しながらマウスを右クリックします\nカラーピッカーのマーク以外の部分でマウスを右クリックすれば、ハンドツールに戻ります +TOOLBAR_TOOLTIP_COLORPICKER;ロック式カラーピッカー\n追加したピッカー上でShiftキーを押しながら左クリックすると、表示される色情報がRGB、Lab、HSVの順に変わります。\n\n有効にすると:\n- ピッカーの追加:左クリック\n- ピッカーの移動:左クリックしたまま移動\n- 1個のピッカーの削除:右クリック\n- 全てのピッカーを削除:ContlキーとShiftキーを押しながら右クリック\n- ハンドツールに戻す:ピッカーのアイコン以外の部分で右クリック TOOLBAR_TOOLTIP_CROP;切り抜き範囲選択\nショートカット: c TOOLBAR_TOOLTIP_HAND;手の平ツール\nショートカット: h -TOOLBAR_TOOLTIP_STRAIGHTEN;直線選択 / 角度補正\nショートカット: s\nプレビュー画像上にガイド線を描画し、垂直または水平方向を指示します。回転角度は、ガイド線の隣に表示されます。回転の中心は、プレビュー画像の中心です +TOOLBAR_TOOLTIP_PERSPECTIVE;遠近感の補正\n\n遠近感の歪みを補正するため制御ラインを調整します。ボタンをもう一度押すと調整が適用されます。 +TOOLBAR_TOOLTIP_STRAIGHTEN;直線選択 / 角度補正\nショートカット: s\n画像上にガイド線を描画し、垂直または水平方向を指示します。回転角度は、ガイド線の隣に表示されます。回転の中心は、プレビュー画像の中心です TOOLBAR_TOOLTIP_WB;スポット・ホワイトバランス\nショートカット: w TP_BWMIX_ALGO;アルゴリズム OYCPM TP_BWMIX_ALGO_LI;リニア @@ -1396,6 +2150,7 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;90度左回転\nショートカット: [\n\ TP_COARSETRAF_TOOLTIP_ROTRIGHT;90度右回転\nショートカット: ]\n\nシングル・エディタ・タブのショートカット: Alt-] TP_COARSETRAF_TOOLTIP_VFLIP;上下反転 TP_COLORAPP_ABSOLUTELUMINANCE;絶対輝度 +TP_COLORAPP_ADAPSCEN_TOOLTIP;カンデラ平方メートルで表せる撮影時の輝度に相当します。Exifデータから自動的に計算されます。 TP_COLORAPP_ALGO;アルゴリズム TP_COLORAPP_ALGO_ALL;すべて TP_COLORAPP_ALGO_JC;明度 + 色度 (JC) @@ -1403,53 +2158,78 @@ TP_COLORAPP_ALGO_JS;明度 + 彩度 (JS) TP_COLORAPP_ALGO_QM;明るさ + 鮮やかさ (QM) TP_COLORAPP_ALGO_TOOLTIP;サブセット、或いは全てのパラメータの中から選択 TP_COLORAPP_BADPIXSL;ホット/バッドピクセルフィルター -TP_COLORAPP_BADPIXSL_TOOLTIP;明るい部分のホット/バッドピクセルを圧縮します\n 0は効果なし 1は中間 2はガウスほかし\n\nこれらアーティファクトはCIECAM02の限界に起因するものです。色域を抑制する代わりに、イメージに暗い影が現れるのを防ぎます +TP_COLORAPP_BADPIXSL_TOOLTIP;明るい部分のホット/バッドピクセルを圧縮します\n 0は効果なし 1は中間 2はガウスほかし\n\nこれらアーティファクトはCIECAM02/16の限界に起因するものです。色域を抑制する代わりに、イメージに暗い影が現れるのを防ぎます TP_COLORAPP_BRIGHT;明るさ (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;CIECAM02の明るさは L*a*b*やRGBとは異なり、白の輝度を計算に入れます +TP_COLORAPP_BRIGHT_TOOLTIP;CIECAM02/16の明るさは 色刺激から発せられた知覚された光の量のことで、L*a*b*やRGBの明るさとは異なります。 TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;設定を手動で行う場合、65以上の設定値を推奨 +TP_COLORAPP_CATCLASSIC;クラシック +TP_COLORAPP_CATMET_TOOLTIP;クラシック - 従来のCIECAMの作用です。色順応変換が、基本的な光源をベースにした'場面条件'と、基本的な光源をベースにした'観視条件'に対し、別々に作用します。\n\nシンメトリック – 色順応がホワイトバランスをベースにして作用します。'場面条件'、'画像の調整'、'観視条件'の設定はニュートラルになります。\n\n混成 – 作用は'クラシック'と同じですが、色順応はホワイトバランスをベースにします。 +TP_COLORAPP_CATMOD;モード +TP_COLORAPP_CATSYMGEN;自動シンメトリック +TP_COLORAPP_CATSYMSPE;混成 TP_COLORAPP_CHROMA;色度 (C) TP_COLORAPP_CHROMA_M;鮮やかさ (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM02の鮮やかさは L*a*b*やRGBの鮮やかさとは異なります +TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM02/16の鮮やかさは、グレーと比較して知覚される色の量のことで、その色刺激の映り方に彩が多いか少ないかを意味します。 TP_COLORAPP_CHROMA_S;彩度 (S) -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_CHROMA_S_TOOLTIP;CIECAM02/16の彩度は、色刺激自体が持つ明るさと比較したその色合いに該当するもので、L*a*b*やRGBの彩度とは異なります。 +TP_COLORAPP_CHROMA_TOOLTIP;CIECAM02/16の色度は、同一の観視環境の下では白に見える色刺激と比較した、その色刺激の'色合い'に相当するもので、L*a*b*やRGBの色度とは異なります。 +TP_COLORAPP_CIECAT_DEGREE;CAT02/16(色順応変換02/16) TP_COLORAPP_CONTRAST;コントラスト (J) TP_COLORAPP_CONTRAST_Q;コントラスト (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;CIECAM02のコントラスト(明るさQ)スライダーは L*a*b*やRGBとは異なります -TP_COLORAPP_CONTRAST_TOOLTIP;CIECAM02のコントラスト(明度J)スライダーは L*a*b*やRGBとは異なります +TP_COLORAPP_CONTRAST_Q_TOOLTIP;CIECAM02/16のコントラスト(Q) は明るさに基づくもので、L*a*b*やRGBのコントラストとは異なります +TP_COLORAPP_CONTRAST_TOOLTIP;CIECAM02/16のコントラスト(J)は明度に基づくもので、L*a*b*やRGBのコントラストとは異なります TP_COLORAPP_CURVEEDITOR1;トーンカーブ1 -TP_COLORAPP_CURVEEDITOR1_TOOLTIP;CIECAM02調整前のL(L*a*b*)のヒストグラムを表示\n CIECAM出力のヒストグラム表示チェックボックスが有効になっている場合は、CIECAM調整後の JまたはQのヒストグラムを表示します\n\n(J、Q)はメイン・ヒストグラムパネルには表示されません\n\n最終出力はメインのヒストグラムパネルを参照してください +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;CIECAM02/16調整前のL(L*a*b*)のヒストグラムを表示\n CIECAMの出力のヒストグラムが有効になっている場合は、CIECAM調整後の JまたはQのヒストグラムを表示します\n\n(J、Q)はメイン・ヒストグラムパネルには表示されません\n\n最終出力はメインのヒストグラムパネルを参照してください TP_COLORAPP_CURVEEDITOR2;トーンカーブ2 -TP_COLORAPP_CURVEEDITOR2_TOOLTIP;2番目の露光トーンカーブも同じ使い方です +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;最初のJ(J)カーブトーンカーブも同じ使い方です 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_FREE;任意の色温度+グリーン + CAT02 + [出力] +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;色度、彩度、鮮やかさのいずれかを調整します\n\nCIECAM02/16調整前の色度(L*a*b*)のヒストグラムを表示します\nチェックボックスの'カーブにCIECAM02/16出力のヒストグラム' が有効の場合、CIECAM02/16調整後のC,sまたはMのヒストグラムを表示します\n\nC, sとMは、メインのヒストグラム・パネルには表示されません\n最終出力は、メインのヒストグラム・パネルを参照してください +TP_COLORAPP_DATACIE;カーブでCIECAM02/16出力のヒストグラムを表示 +TP_COLORAPP_DATACIE_TOOLTIP;有効の場合、CIECAM02/16カーブのヒストグラムは、JかQ、CIECAM02/16調整後のCかs、またはMの値/範囲の近似値を表示します\nこの選択はメイン・ヒストグラムパネルには影響を与えません\n\n無効の場合、CIECAM02/16カーブのヒストグラムは、CIECAM調整前のL*a*b*値を表示します +TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16は色順応変換の一つで、一定の光源(例えばD65)のホワイトポイントの値を、別な光源(例えばD50 やD55)のホワイトポイントの値に変換することです(WPモデルを参照)。 +TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16は色順応変換の一つで、一定の光源(例えばD50)のホワイトポイントの値を、別な光源(例えばD75)のホワイトポイントの値に変換することです(WPモデルを参照)。 +TP_COLORAPP_FREE;任意の色温度と色偏差 + CAT02/16 + [出力] TP_COLORAPP_GAMUT;色域制御 (L*a*b*) -TP_COLORAPP_GAMUT_TOOLTIP;L*a*b*モードの色域制御を許可 +TP_COLORAPP_GEN;設定 - プリセット +TP_COLORAPP_GEN_TOOLTIP;この機能モジュールは、CIECAM02/16(色の見えモデル)をベースにしています。異なる光源の下での、人間の視覚の知覚を、より適切に真似るように設計された色モデルです(例えば、青白い光の中で見る物の色)。\n各色の条件を計算に入れながら、人間の視覚が認識する色に可能な限り近づくように変換します。\nまた、画像の場面や表示デバイスに応じて、その色が維持されるように、予定している出力条件(モニター、TV、プロジェクター、プリンターなど)を考慮します。 TP_COLORAPP_HUE;色相 (h) -TP_COLORAPP_HUE_TOOLTIP;色相 (h) - 0° から 360°の角度 -TP_COLORAPP_LABEL;CIE色の見えモデル2002 -TP_COLORAPP_LABEL_CAM02;画像の調整 -TP_COLORAPP_LABEL_SCENE;撮影環境条件 +TP_COLORAPP_HUE_TOOLTIP;色相(h)は色相環におけるその色刺激の角度で、レッド、グリーン、ブルー、イエローで表現されます。 +TP_COLORAPP_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;白熱灯標準A 2856K +TP_COLORAPP_ILFREE;フリー +TP_COLORAPP_ILLUM;光源 +TP_COLORAPP_ILLUM_TOOLTIP;撮影条件に最も近い条件を選択します\n一般的にはD50 ですが、時間と緯度に応じて変えます +TP_COLORAPP_LABEL;色の見え&明るさ +TP_COLORAPP_LABEL_CAM02;画像編集 +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_LIGHT_TOOLTIP;CIECAM02/16の明度は、同じような環視環境の下で白に見える色刺激の明瞭度と、その色の明瞭度を比較したもので、L*a*b*やRGBの明度とは異なります。 +TP_COLORAPP_MEANLUMINANCE;平均輝度 (Yb%) +TP_COLORAPP_MOD02;CAM02 +TP_COLORAPP_MOD16;CAM16 TP_COLORAPP_MODEL;ホワイトポイント・モデル -TP_COLORAPP_MODEL_TOOLTIP;WB [RT] + [出力]:\nRTのホワイトバランスは、撮影環境に使用されます。CIECAM02はD50の設定, 出力デバイスのホワイトバランスは「環境設定」の「カラーマネジメント」の設定\n\nWB [RT+CAT02] + [出力]:\nRTのホワイトバランス設定は、CAT02で使用され、出力デバイスのホワイトバランスは環境設定の値を使用します +TP_COLORAPP_MODELCAT;色の見えモデル +TP_COLORAPP_MODELCAT_TOOLTIP;色の見えモデルはCAM02或いはCAM16のどちらかを選択出来ます\n CAM02の方がより正確な場合があります\n CAM16の方がアーティファクトの発生が少ないでしょう +TP_COLORAPP_MODEL_TOOLTIP;ホワイトポイントモデル\n\nWB [RT] + [出力]\:周囲環境のホワイトバランスは、カラータブのホワイトバランスが使われます。CIECAM02/16の光源にはD50が使われ, 出力デバイスのホワイトバランスには観視環境のホワイトバランスが使われます\n\nWB [RT+CAT02] + [出力]:カラータブのホワイトバランスがCAT02で使われます。出力デバイスのホワイトバランスには観視環境のホワイトバランスが使われます\n\n任意の色温度と色偏差 + CAT02 + [出力]:色温度と色偏差はユーザーが設定します。出力デバイスのホワイトバランスには観視環境のホワイトバランスが使われます TP_COLORAPP_NEUTRAL;リセット -TP_COLORAPP_NEUTRAL_TIP;全てのスライダーチェックボックスとカーブをデフォルトにリセットします +TP_COLORAPP_NEUTRAL_TOOLTIP;全てのスライダーチェックボックスとカーブをデフォルトにリセットします TP_COLORAPP_RSTPRO;レッドと肌色トーンを保護 TP_COLORAPP_RSTPRO_TOOLTIP;レッドと肌色トーンを保護はスライダーとカーブの両方に影響します -TP_COLORAPP_SURROUND;周囲環境 -TP_COLORAPP_SURROUND_AVER;普通 +TP_COLORAPP_SOURCEF_TOOLTIP;撮影条件に合わせて、その条件とデータを通常の範囲に収めます。ここで言う“通常”とは、平均的或いは標準的な条件とデータのことです。例えば、CIECAM02/16の補正を計算に入れずに収める。 +TP_COLORAPP_SURROUND;観視時の周囲環境 +TP_COLORAPP_SURROUNDSRC;撮影時の周囲環境 +TP_COLORAPP_SURROUND_AVER;平均 TP_COLORAPP_SURROUND_DARK;暗い TP_COLORAPP_SURROUND_DIM;薄暗い -TP_COLORAPP_SURROUND_EXDARK;非常に暗い (Cutsheet) -TP_COLORAPP_SURROUND_TOOLTIP;トーンとカラーの変更は、出力デバイスの観視条件を計算に入れます\n\n普通:\n平均的な明るい環境 (標準)\n画像は変更されません\n\n薄暗い:\n薄暗い環境 (TV)\n画像は若干暗くなります\n\n暗い:\n暗い環境 (プロジェクター)\n画像はかなり暗くなります\n\n非常に暗い:\n非常に暗い環境 (Cutsheet)\n画像はとても暗くなります +TP_COLORAPP_SURROUND_EXDARK;非常に暗い +TP_COLORAPP_SURROUND_TOOLTIP;出力デバイスで観視する時の周囲環境を考慮するため、画像の明暗と色を変えます\n\n平均:\n周囲が平均的な明るさ(標準)\n画像は変わりません\n\n薄暗い:\n薄暗い環境、例、TVを見る環境\n画像は若干暗くなります\n\n暗い:\n暗い環境 例、プロジェクターを見る環境\n画像はかなり暗くなります\n\n非常に暗い:\n非常に暗い環境 (例、カットシートを使っている)\n画像はとても暗くなります +TP_COLORAPP_SURSOURCE_TOOLTIP;撮影時の周囲環境を考慮するため、画像の明暗と色を変えます。\n平均:周囲が平均的な明るさ(標準)。画像は変化しません。\n\n薄暗い:画像が少し明るくなります。\n\n暗い:画像が更に明るくなります。\n\n非常に暗い:画像は非常に明るくなります。 TP_COLORAPP_TCMODE_BRIGHTNESS;明るさ TP_COLORAPP_TCMODE_CHROMA;色度 TP_COLORAPP_TCMODE_COLORF;鮮やかさ @@ -1458,19 +2238,23 @@ TP_COLORAPP_TCMODE_LABEL2;カーブ・モード2 TP_COLORAPP_TCMODE_LABEL3;カーブ・色度モード TP_COLORAPP_TCMODE_LIGHTNESS;明度 TP_COLORAPP_TCMODE_SATUR;彩度 +TP_COLORAPP_TEMP2_TOOLTIP;シンメトリカルモードの場合はホワイトバランスの色温度を使います\n色偏差は常に1.0\n\nA光源 色温度=2856\nD41 色温度=4100\nD50 色温度=5003\nD55 色温度=5503\nD60 色温度=6000\nD65 色温度=6504\nD75 色温度=7504 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_TONECIE;CIECAM02/16を使ったトーンマッピング +TP_COLORAPP_TONECIE_TOOLTIP;このオプションが無効になっている場合、トーンマッピングはL*a*b*空間を使用します\nこのオプションが有効になっている場合、トーンマッピングは、CIECAM02/16を使用します\nトーンマッピング(L*a*b*/CIECAM02)ツールを有効にするには、この設定を有効にする必要があります +TP_COLORAPP_VIEWINGF_TOOLTIP;周囲環境だけでなく、最終的に画像を見る媒体(モニター、TV、プロジェクター、プリンター。。。)を考慮します。この処理は、“画像調整”から持って来たデータを、周囲条件を考慮した観視環境に合わせて調整することです。 +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;観視条件の絶対輝度\n通常 平方メートル当たり16カンデラ +TP_COLORAPP_WBCAM;WB [RT+CAT02/16] + [出力] TP_COLORAPP_WBRT;WB [RT] + [出力] +TP_COLORAPP_YBOUT_TOOLTIP;Ybは背景の相対輝度のことで、グレーの割合%で表現します。グレー18%という数値は、CIEの明度で50%の背景輝度に相当します。\nYbは画像の平均輝度から算出されます。 +TP_COLORAPP_YBSCEN_TOOLTIP;Ybは背景の相対輝度のことで、グレーの割合%で表現します。グレー18%という数値は、CIEの明度で50%の背景輝度に相当します。\nYbは画像の平均輝度から算出されます。 TP_COLORTONING_AB;o C/L -TP_COLORTONING_AUTOSAT;自動彩度 +TP_COLORTONING_AUTOSAT;自動彩度調節 TP_COLORTONING_BALANCE;バランス TP_COLORTONING_BY;o C/L TP_COLORTONING_CHROMAC;不透明度 -TP_COLORTONING_COLOR;カラー -TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;C=f(L)の明度に応じたクロマの不透明度 +TP_COLORTONING_COLOR;カラー: +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;C=f(L)の明度に応じた色の不透明度 TP_COLORTONING_HIGHLIGHT;ハイライト TP_COLORTONING_HUE;色相 TP_COLORTONING_LAB;L*a*b*モデルでブレンド @@ -1503,25 +2287,26 @@ TP_COLORTONING_METHOD;方法 TP_COLORTONING_METHOD_TOOLTIP;L*a*b*モデルのブレンドはカラー補間を使います\nカラーバランスは、シャドウ、ミッドトーン、ハイライトでバランスをとります\nSH+バランスは、ダイレクトカラーを使ってシャドウとハイライトでカラートン調整とバランスを調整します\n全ての方法で白黒変換を有効に出来ます TP_COLORTONING_MIDTONES;中間トーン TP_COLORTONING_NEUTRAL;スライダーをリセット -TP_COLORTONING_NEUTRAL_TIP;スライダーの全ての値(SMH:シャドウ、ミッドトーン、ハイライト)をデフォルトに戻す -TP_COLORTONING_OPACITY;不透明度 +TP_COLORTONING_NEUTRAL_TOOLTIP;スライダーの全ての値(SMH:シャドウ、ミッドトーン、ハイライト)をデフォルトに戻す +TP_COLORTONING_OPACITY;不透明度: TP_COLORTONING_RGBCURVES;RGB - カーブ TP_COLORTONING_RGBSLIDERS;RGB - スライダー TP_COLORTONING_SA;彩度の保護 TP_COLORTONING_SATURATEDOPACITY;強さ TP_COLORTONING_SATURATIONTHRESHOLD;しきい値 TP_COLORTONING_SHADOWS;シャドウ -TP_COLORTONING_SPLITCO;S/M/Hでカラートーン調整 -TP_COLORTONING_SPLITCOCO;S/M/Hでカラーバランス +TP_COLORTONING_SPLITCO;シャドウ/中間トーン/ハイライト +TP_COLORTONING_SPLITCOCO;シャドウ/中間トーン/ハイライトのカラーバランス TP_COLORTONING_SPLITLR;2色の彩度でカラートーン調整 TP_COLORTONING_STR;強さ TP_COLORTONING_STRENGTH;強さ TP_COLORTONING_TWO2;特定のクロマ‘2色’ TP_COLORTONING_TWOALL;特定のクロマ -TP_COLORTONING_TWOBY;特定の'a*'と'b*' +TP_COLORTONING_TWOBY;特定のa*とb* TP_COLORTONING_TWOCOLOR_TOOLTIP;標準的クロマ:\n線形的作用 a*=b*\n特定のクロマ:\n線形的作用 a*=b*、同じ増減率、カーブを対角線より下に下げると不透明度の値はマイナスになる、色相全体が影響を受ける\n特定のa*とb*:\n線形的作用 a*、b*別々に調整、特殊効果が目的\n特定のクロマ2色:\nカラーカーブで特定された2つの色相だけが影響を受ける TP_COLORTONING_TWOSTD;標準的クロマ TP_CROP_FIXRATIO;縦横比固定 +TP_CROP_GTCENTEREDSQUARE;センタリング正方形 TP_CROP_GTDIAGONALS;対角線 TP_CROP_GTEPASSPORT;バイオメトリック・パスポート TP_CROP_GTFRAME;フレーム @@ -1538,8 +2323,8 @@ TP_CROP_PPI;PPI TP_CROP_RESETCROP;リセット TP_CROP_SELECTCROP;セレクト TP_CROP_W;W 幅 -TP_CROP_X;X -TP_CROP_Y;Y +TP_CROP_X;左 +TP_CROP_Y;上部 TP_DARKFRAME_AUTOSELECT;自動選択 TP_DARKFRAME_LABEL;ダークフレーム TP_DEFRINGE_LABEL;フリンジ低減 @@ -1547,14 +2332,14 @@ TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 TP_DEHAZE_DEPTH;深度 TP_DEHAZE_LABEL;霞除去 -TP_DEHAZE_LUMINANCE;輝度のみ +TP_DEHAZE_SATURATION;彩度 TP_DEHAZE_SHOW_DEPTH_MAP;深度マップの表示 TP_DEHAZE_STRENGTH;強さ TP_DIRPYRDENOISE_CHROMINANCE_AMZ;自動(多分割方式) TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;自動(分割方式) -TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;色差 ブルー/イエロー +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;ブルー/イエロー TP_DIRPYRDENOISE_CHROMINANCE_CURVE;色ノイズ低減のカーブ -TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;クロミナンススライダー全ての値を増幅します\n色度をベースにこのカーブで色ノイズ低減の強さを加減します。例えば彩度の低い部分で作用を強める、或いは色度の高い部分で作用を弱めるように使います +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;色ノイズに関するスライダーの全ての値を増幅します\n色度をベースにこのカーブで色ノイズ低減の強さを加減します。例えば彩度の低い部分で作用を強める、或いは色度の高い部分で作用を弱めるように使います TP_DIRPYRDENOISE_CHROMINANCE_FRAME;色ノイズ TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;手動 TP_DIRPYRDENOISE_CHROMINANCE_MASTER;色(マスター) @@ -1568,7 +2353,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;プレビュー画像のサイズ=%1, 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_CHROMINANCE_REDGREEN;レッド/グリーン TP_DIRPYRDENOISE_LABEL;ノイズ低減 TP_DIRPYRDENOISE_LUMINANCE_CONTROL;輝度ノイズの調整法 TP_DIRPYRDENOISE_LUMINANCE_CURVE;輝度カーブ @@ -1585,13 +2370,13 @@ 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;メディアンの方式 TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;色ノイズだけ TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;メディアンフィルター TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;輝度のみ TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB -TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;フィルタリングの方式で、"輝度のみ"と"L*a*b*"を選択した場合、メディアンフィルタリングはノイズ低減行程でウェーブレット変換が行われた直後に適用されます\n"RGB"モードの場合は、ノイズ低減行程の最後で適用されます +TP_DIRPYRDENOISE_MEDIAN_METHOD_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回適用するより結果が良くなることがままあります。 @@ -1609,7 +2394,7 @@ TP_DIRPYREQUALIZER_ARTIF;アーティファクトを軽減 TP_DIRPYREQUALIZER_HUESKIN;肌色の色相 TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;このカーブは上部ほど、アルゴリズムが効率良く働くことを示しています。\n下部ほど、色相の遷移が見られる部分です。\nコントロールポイントを左右に大きく動かす必要が生じたり、アーティファクトが生じたりする場合は、ホワイトバランスが妥当ではない時です。\n他の色への影響を避けるには、調整範囲を少し減らします TP_DIRPYREQUALIZER_LABEL;詳細レベルによるコントラスト調整 -TP_DIRPYREQUALIZER_LUMACOARSEST;粗い +TP_DIRPYREQUALIZER_LUMACOARSEST;大まか TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;コントラスト- TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;コントラスト+ TP_DIRPYREQUALIZER_LUMAFINEST;細かい @@ -1619,7 +2404,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;-100 肌色トーンの調整が目的にな TP_DIRPYREQUALIZER_THRESHOLD;しきい値 TP_DIRPYREQUALIZER_TOOLTIP;肌色(色相、色度、明度)と他の色の間の遷移でアーティファクトが発生するのを軽減します TP_DISTORTION_AMOUNT;適用量 -TP_DISTORTION_AUTO_TIP;rawファイルの歪曲収差を、埋め込まれたJPEG画像とカメラによる自動歪曲収差補正と合わせることで自動的に補正します +TP_DISTORTION_AUTO_TOOLTIP;rawファイルの歪曲収差を、埋め込まれたJPEG画像とカメラによる自動歪曲収差補正と合わせることで自動的に補正します TP_DISTORTION_LABEL;歪曲収差補正 TP_EPD_EDGESTOPPING;エッジ停止 TP_EPD_GAMMA;ガンマ @@ -1628,12 +2413,12 @@ TP_EPD_REWEIGHTINGITERATES;再加重反復 TP_EPD_SCALE;スケール TP_EPD_STRENGTH;強さ TP_EXPOSURE_AUTOLEVELS;自動露光補正 -TP_EXPOSURE_AUTOLEVELS_TIP;画像を解析し露光補正を自動で設定します +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;画像を解析し、露光補正を自動で行います\n必要に応じてハイライト復元を有効にします TP_EXPOSURE_BLACKLEVEL;黒レベル -TP_EXPOSURE_BRIGHTNESS;明度 +TP_EXPOSURE_BRIGHTNESS;明るさ TP_EXPOSURE_CLAMPOOG;色域から外れた色を切り取る TP_EXPOSURE_CLIP;クリップ % -TP_EXPOSURE_CLIP_TIP;自動露光補正によるハイライトとシャドウ部分での飽和ピクセルの割合制限 +TP_EXPOSURE_CLIP_TOOLTIP;自動露光補正で使う飽和ピクセルの割合 TP_EXPOSURE_COMPRHIGHLIGHTS;ハイライト圧縮 TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;ハイライト圧縮 しきい値 TP_EXPOSURE_COMPRSHADOWS;シャドウ圧縮 @@ -1657,11 +2442,21 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;加重平均 TP_EXPOS_BLACKPOINT_LABEL;raw ブラック・ポイント TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント TP_FILMNEGATIVE_BLUE;ブルーの比率 -TP_FILMNEGATIVE_GREEN;参考指数(コントラスト) -TP_FILMNEGATIVE_GUESS_TOOLTIP;原画像の中で色相がニュートラルな部分2か所をピックすることでレッドとブルーの比率を自動で設定します。明るさが異なる2か所をピックします。その後、ホワイトバランスを設定します。 +TP_FILMNEGATIVE_BLUEBALANCE;クール/ウォーム +TP_FILMNEGATIVE_COLORSPACE;反転の色空間: +TP_FILMNEGATIVE_COLORSPACE_INPUT;入力色空間 +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;ネガの反転を実行する色空間を選びます:\n入力色空間 : 以前のRawTherapeeバージョンのように入力プロファイルの適用前に反転を実行します\n作業色空間 : 入力プロファイル適用後に反転を実行します。現在選択されている作業色空間を使います。 +TP_FILMNEGATIVE_COLORSPACE_WORKING;作業色空間 +TP_FILMNEGATIVE_GREEN;参考指数 +TP_FILMNEGATIVE_GREENBALANCE;マゼンタ/グリーン +TP_FILMNEGATIVE_GUESS_TOOLTIP;レッドとブルーの比率を、元画像の中で色相がニュートラルな2つの部分(明るさは異なる)をピックアップして、自動で設定します。 TP_FILMNEGATIVE_LABEL;ネガフィルム +TP_FILMNEGATIVE_OUT_LEVEL;出力のレベル TP_FILMNEGATIVE_PICK;ニュートラルなポイントをピック TP_FILMNEGATIVE_RED;レッドの比率 +TP_FILMNEGATIVE_REF_LABEL;入力RGB: %1 +TP_FILMNEGATIVE_REF_PICK;ホワイトバランスのスポットをピックアップ +TP_FILMNEGATIVE_REF_TOOLTIP;ポジの画像でホワイトバランスの取れているグレーの部分をピックアップします TP_FILMSIMULATION_LABEL;フィルムシミュレーション TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されています(プログラムに組み込むにはフォルダーが大き過ぎるため)。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか? TP_FILMSIMULATION_STRENGTH;強さ @@ -1693,6 +2488,7 @@ TP_HLREC_BLEND;ブレンド TP_HLREC_CIELAB;CIEL*a*b* ブレンディング TP_HLREC_COLOR;色の波及 TP_HLREC_ENA_TOOLTIP;自動露光でも動作可 +TP_HLREC_HLBLUR;ぼかし TP_HLREC_LABEL;ハイライト復元 TP_HLREC_LUMINANCE;輝度復元 TP_HLREC_METHOD;方式: @@ -1701,7 +2497,7 @@ TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;HSV イコライザ TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V -TP_ICM_APPLYBASELINEEXPOSUREOFFSET;基本露出オフセット +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;基本露出 TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;DCPに埋め込まれている基本露出オフセットを用います。但し、適用するDCPにこのタグがある場合に限ります。 TP_ICM_APPLYHUESATMAP;ベーステーブル TP_ICM_APPLYHUESATMAP_TOOLTIP;DCPに埋め込まれているベーステーブル(色相彩度マップ)を用います。但し、適用するDCPにこのタグがある場合に限ります。 @@ -1711,8 +2507,10 @@ TP_ICM_BPC;ブラックポイント補正 TP_ICM_DCPILLUMINANT;光源 TP_ICM_DCPILLUMINANT_INTERPOLATED;補間 TP_ICM_DCPILLUMINANT_TOOLTIP;埋め込まれているDCPの光源のどちらを使うか選択。デフォルトではホワイトバランスに基づいて二つの光源の中間に補間する。この設定は二つのDCPの光源が補間サポートされる、を選択している場合に有効。 +TP_ICM_FBW;白黒 +TP_ICM_ILLUMPRIM_TOOLTIP;撮影条件に最も相応しい光源を選びます\n変更が行われるのは、‘変換先の原色’で‘カスタム (スライダー)’が選択された時だけです。 TP_ICM_INPUTCAMERA;カメラの標準的プロファイル -TP_ICM_INPUTCAMERAICC;カメラ固有のプロファイル +TP_ICM_INPUTCAMERAICC;カメラプロファイルの自動調和 TP_ICM_INPUTCAMERAICC_TOOLTIP;RawTherapeeが持っているカメラ固有のDCP或いはICCプロファイルを使用 シンプルなマトリクスより正確だが一部のカメラだけに利用可能 TP_ICM_INPUTCAMERA_TOOLTIP;dcrawのシンプルなカラー・マトリクス、RawTherapeeの拡張バージョン(カメラの機種によりどちらでも可能)またはDNGの埋め込みを使用 TP_ICM_INPUTCUSTOM;カスタム @@ -1723,27 +2521,72 @@ TP_ICM_INPUTEMBEDDED_TOOLTIP;raw以外のファイルに埋め込まれたカラ TP_ICM_INPUTNONE;プロファイルなし TP_ICM_INPUTNONE_TOOLTIP;すべてにカラープロファイルを使用しない 特殊な場合にのみ使用 TP_ICM_INPUTPROFILE;入力プロファイル -TP_ICM_LABEL;カラー・マネジメント +TP_ICM_LABEL;カラーマネジメント +TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +TP_ICM_NEUTRAL;リセット TP_ICM_NOICM;No ICM: sRGB 出力 TP_ICM_OUTPUTPROFILE;出力プロファイル -TP_ICM_PROFILEINTENT;目標とするレンダリング +TP_ICM_OUTPUTPROFILE_TOOLTIP;デフォルトでは、全てのRTv4或いはRTv2プロファイルでTRC - sRGB: ガンマ=2.4 勾配=12.92が適用されています\n\n'ICCプロファイルクリエーター'でv4或いはv2のプロファイルを以下の条件で作成出来ます;\n 原色: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n TRC: BT709, sRGB, 線形, 標準ガンマ=2.2, 標準ガンマ=1.8, カスタム\n 光源: D41, D50, D55, D60, D65, D80, stdA 2856K +TP_ICM_PRIMBLU_TOOLTIP;原色 ブルー:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +TP_ICM_PRIMGRE_TOOLTIP;原色 グリーン:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +TP_ICM_PRIMILLUM_TOOLTIP;画像を元のモード(“作業プロファイル”)から異なるモード(“変換先の原色”)に変えることが出来ます。画像に対し異なるカラーモードを選択すると、画像の色値を恒久的に変えることになります。\n\n‘原色’の変更は非常に複雑で、その使い方は非常に難しいものです。熟達した経験が必要です。\nチャンネルミキサーの原色のように、エキゾチックな色の調整が可能です。\nカスタム(スライダー)を使ってカメラのキャリブレーションを変えることが出来ます。 +TP_ICM_PRIMRED_TOOLTIP;原色 レッド:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +TP_ICM_PROFILEINTENT;レンダリングの意図 +TP_ICM_REDFRAME;カスタム 原色 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_TONECURVE;トーンカーブ +TP_ICM_TONECURVE_TOOLTIP;DCPに埋め込まれているトーンカーブを適用します。但し、この設定は選択したDCPにトーンカーブが埋め込まれている場合だけです。 +TP_ICM_TRCFRAME;アブストラクトプロファイル +TP_ICM_TRCFRAME_TOOLTIP;このプロファイルは‘シンセティック’または‘バーチャル’プロファイルとしても知られ、処理工程の最後(CIECAMの前))に適用されるもので、独自の画像効果を作ることが出来ます\n以下の要素に変更を加えることが出来ます:\n 画像のトーンを変えられる‘トーンリプロダクションカーブ’\n 撮影条件に適合するようにプロファイルの原色を変更する‘光源’\n 主にチャンネルミキサー、キャリブレーションの2つを使って変換先の原色を変える‘変換先の原色’\n注意: アブストラクトプロファイルは組み込まれている作業プロファイルを考慮するだけで、作業プロファイルの変更は行いません。カスタム作業プロファイルでは動作しません +TP_ICM_TRC_TOOLTIP;RawTherapeeのデフォルトで使われている‘トーンリプロダクションカーブ(TRC)’(g=2.4、s=12.92)を変えることが出来ます。\nTRCは画像のトーンを変えます。RGB、L*a*b*の値、ヒストグラム、出力(スクリーン、TIF、JPEG)が変わります。\nガンマは主に明るいトーンを変え、勾配は暗いトーンを変えます。\nどの様な‘ガンマ’と‘勾配’が選択出来ます(但し、1より大きい値)。このアルゴリズムはカーブの線形部分と放物線部分の連続性を確保します。\n‘なし’以外の選択で、‘光源’と‘変換先の原色’の中の一覧が有効になります。 TP_ICM_WORKINGPROFILE;作業プロファイル -TP_ICM_WORKING_TRC;トーン再現カーブ: +TP_ICM_WORKING_CIEDIAG;CIE xy ダイヤグラム +TP_ICM_WORKING_ILLU;光源 +TP_ICM_WORKING_ILLU_1500;タングステン 1500K +TP_ICM_WORKING_ILLU_2000;タングステン 2000K +TP_ICM_WORKING_ILLU_D41;D41 +TP_ICM_WORKING_ILLU_D50;D50 +TP_ICM_WORKING_ILLU_D55;D55 +TP_ICM_WORKING_ILLU_D60;D60 +TP_ICM_WORKING_ILLU_D65;D65 +TP_ICM_WORKING_ILLU_D80;D80 +TP_ICM_WORKING_ILLU_D120;D120 +TP_ICM_WORKING_ILLU_NONE;デフォルト +TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_PRESER;パステルトーンを維持 +TP_ICM_WORKING_PRIM;変換先の原色 +TP_ICM_WORKING_PRIMFRAME_TOOLTIP;‘変換先の原色’のコンボボックスの中から‘カスタムCIE xyダイヤグラム’を選択すると、3つの原色がダイヤグラム上で変更可能となります。\n注意:この場合、ダイヤグラムのホワイトポイントの位置は更新されません。 +TP_ICM_WORKING_PRIM_AC0;ACESp0 +TP_ICM_WORKING_PRIM_ACE;ACESp1 +TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +TP_ICM_WORKING_PRIM_BET;Beta RGB +TP_ICM_WORKING_PRIM_BRU;BruceRGB +TP_ICM_WORKING_PRIM_BST;BestRGB +TP_ICM_WORKING_PRIM_CUS;カスタム(スライダー) +TP_ICM_WORKING_PRIM_CUSGR;カスタム(CIE xy ダイヤグラム) +TP_ICM_WORKING_PRIM_NONE;デフォルト +TP_ICM_WORKING_PRIM_PROP;ProPhoto +TP_ICM_WORKING_PRIM_REC;Rec2020 +TP_ICM_WORKING_PRIM_SRGB;sRGB +TP_ICM_WORKING_PRIM_WID;WideGamut +TP_ICM_WORKING_TRC;トーンリプロダクションカーブ: +TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +TP_ICM_WORKING_TRC_22;Adobe g=2.2 +TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 TP_ICM_WORKING_TRC_CUSTOM;カスタム TP_ICM_WORKING_TRC_GAMMA;ガンマ +TP_ICM_WORKING_TRC_LIN;リニア g=1 TP_ICM_WORKING_TRC_NONE;なし TP_ICM_WORKING_TRC_SLOPE;勾配 +TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 TP_ICM_WORKING_TRC_TOOLTIP;組み込まれたプロファイルだけ TP_IMPULSEDENOISE_LABEL;インパルスノイズ低減 TP_IMPULSEDENOISE_THRESH;しきい値 TP_LABCURVE_AVOIDCOLORSHIFT;色ずれを回避 -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を合わせ、マンセル補正を適用します +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を合わせ、マンセル補正を適用します(均等知覚色空間) TP_LABCURVE_BRIGHTNESS;明度 TP_LABCURVE_CHROMATICITY;色度 TP_LABCURVE_CHROMA_TOOLTIP;白黒トーンを適用するには、彩度を-100に設定します @@ -1776,16 +2619,18 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;色相に応じた輝度 L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;輝度に応じた輝度 L*a*b* L=f(L) TP_LABCURVE_LABEL;L*a*b* 調整 TP_LABCURVE_LCREDSK;LCの適用をレッドと肌色トーンだけに制限 -TP_LABCURVE_LCREDSK_TIP;有効の場合 LC カーブ(色度に応じた輝度)の適用は、レッドと肌色トーンだけ制限されます\n無効の場合は、すべてのトーンに適用されます +TP_LABCURVE_LCREDSK_TOOLTIP;有効の場合 LC カーブ(色度に応じた輝度)の適用は、レッドと肌色トーンだけ制限されます\n無効の場合は、すべてのトーンに適用されます TP_LABCURVE_RSTPROTECTION;レッドと肌色トーンを保護 TP_LABCURVE_RSTPRO_TOOLTIP;色度スライダーとCCカーブを使用することができます TP_LENSGEOM_AUTOCROP;自動的に切り抜き選択 TP_LENSGEOM_FILL;オートフィル TP_LENSGEOM_LABEL;レンズ / ジオメトリ +TP_LENSGEOM_LIN;線形 +TP_LENSGEOM_LOG;対数 TP_LENSPROFILE_CORRECTION_AUTOMATCH;自動で選択 TP_LENSPROFILE_CORRECTION_LCPFILE;LCPファイル TP_LENSPROFILE_CORRECTION_MANUAL;手動で選択 -TP_LENSPROFILE_LABEL;レンズ補正 プロファイル +TP_LENSPROFILE_LABEL;プロファイルされているレンズ補正 TP_LENSPROFILE_LENS_WARNING;注意:レンズプロファイルに使われるクロップファクターはカメラのクロップファクターより大きいので、誤った結果になる可能性があります。 TP_LENSPROFILE_MODE_HEADER;レンズプロファイル TP_LENSPROFILE_USE_CA;色収差 @@ -1797,6 +2642,788 @@ TP_LOCALCONTRAST_DARKNESS;暗い部分のレベル TP_LOCALCONTRAST_LABEL;ローカルコントラスト TP_LOCALCONTRAST_LIGHTNESS;明るい部分のレベル TP_LOCALCONTRAST_RADIUS;半径 +TP_LOCALLAB_ACTIV;輝度だけ +TP_LOCALLAB_ACTIVSPOT;RT-スポットを有効にする +TP_LOCALLAB_ADJ;イコライザ カラー +TP_LOCALLAB_AMOUNT;量 +TP_LOCALLAB_ARTIF;形状検出 +TP_LOCALLAB_ARTIF_TOOLTIP;ΔE-スコープのしきい値:スコープを適用するΔEの幅が変わります。色域の広い画像には高いしきい値を使います。\nΔEの減衰:値を増やすと形状検出の質は向上しますが、スコープの範囲が狭くなります。 +TP_LOCALLAB_AUTOGRAY;自動平均輝度(Yb%) +TP_LOCALLAB_AUTOGRAYCIE;自動 +TP_LOCALLAB_AVOID;色ずれの回避 +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;作業色空間の色域に色を収め、マンセル補正を行います(均一的な知覚のLab)\nJz或いはCAM16が使われている場合は、マンセル補正が常に無効になります。 +TP_LOCALLAB_AVOIDMUN;マンセル補正だけ +TP_LOCALLAB_AVOIDMUN_TOOLTIP;Jz或いはCAM16が使われている場合は、マンセル補正が常に無効になります。 +TP_LOCALLAB_AVOIDRAD;ソフトな半径 +TP_LOCALLAB_BALAN;ab-Lのバランス(ΔE) +TP_LOCALLAB_BALANEXP;ラプラシアンのバランス +TP_LOCALLAB_BALANH;C-Hのバランス(ΔE) +TP_LOCALLAB_BALAN_TOOLTIP;ΔEのアルゴリズムのパラメータを変えます。\nL*a*b*の構成要素、或いはC、Hをある程度考慮します\nノイズ除去のバランスは変わりません +TP_LOCALLAB_BASELOG;対数の基数 +TP_LOCALLAB_BILATERAL;平滑化フィルタ +TP_LOCALLAB_BLACK_EV;ブラックEv +TP_LOCALLAB_BLCO;色度だけ +TP_LOCALLAB_BLENDMASKCOL;ブレンド +TP_LOCALLAB_BLENDMASKMASK;マスクの輝度の加減 +TP_LOCALLAB_BLENDMASKMASKAB;マスクの色度の加減 +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;スライダーの値が0の場合は作用しません\n元画像にマスクを追加したり、追加したマスクを削除します +TP_LOCALLAB_BLENDMASK_TOOLTIP;ブレンド=0の場合は、形状検出だけが改善します\nブレンドが0より大きい場合は、画像にマスクが追加されます。 ブレンドが0より小さい場合は、画像からマスクが除かれます。 +TP_LOCALLAB_BLGUID;ガイド付きフィルタ +TP_LOCALLAB_BLINV;インバース +TP_LOCALLAB_BLLC;輝度と色度 +TP_LOCALLAB_BLLO;輝度だけ +TP_LOCALLAB_BLMED;メディアン +TP_LOCALLAB_BLMETHOD_TOOLTIP;通常:全ての設定に対し、直接的なぼかしとノイズ処理\nインバース:ぼかしとノイズ処理\n注意:設定によっては予期しない結果になることがあります +TP_LOCALLAB_BLNOI_EXP;ぼかし & ノイズ除去 +TP_LOCALLAB_BLNORM;通常 +TP_LOCALLAB_BLUFR;ぼかし/質感とノイズ除去 +TP_LOCALLAB_BLUMETHOD_TOOLTIP;背景をぼかし、前景を区分けするために:\n画像全体をRT-スポットで完全に囲み(スコープと境界値は高くします)背景をぼかします-'通常’或いは’インバース’モードを選択します\n*一つ以上のRT-スポットで’除外’モードを使い、スコープ値を高くして前景を区分けします\n\nこの機能モジュール('メディアン’及び’ガイド付きフィルタ’を含む)は、メインのノイズ低減と併用できます。 +TP_LOCALLAB_BLUR;ガウスぼかし - ノイズ - 質感 +TP_LOCALLAB_BLURCOL;半径 +TP_LOCALLAB_BLURCOLDE_TOOLTIP;孤立したピクセルが計算に入るの避けるため、ΔEを計算するために使われる画像に少しぼかしをかけます +TP_LOCALLAB_BLURDE;形状検出のぼかし +TP_LOCALLAB_BLURLC;輝度だけ +TP_LOCALLAB_BLURLEVELFRA;レベルのぼかし +TP_LOCALLAB_BLURMASK_TOOLTIP;マスクを生成するために半径の大きなぼかしを使います。これにより画像のコントラストを変えたり、画像の一部を暗く、又は明るくすることが出来ます。 +TP_LOCALLAB_BLURRMASK_TOOLTIP;ガウスぼかしの’半径’を変えることが出来ます(0~1000) +TP_LOCALLAB_BLUR_TOOLNAME;ぼかし/質感 & ノイズ除去 +TP_LOCALLAB_BLWH;全ての変更を白黒画像で行う +TP_LOCALLAB_BLWH_TOOLTIP;色の構成要素、'a'と'b'の値を強制的にゼロにします。\n白黒、或いはフィルムシミュレーションの画像の処理に便利です。 +TP_LOCALLAB_BUTTON_ADD;作成/追加 +TP_LOCALLAB_BUTTON_DEL;削除 +TP_LOCALLAB_BUTTON_DUPL;複製 +TP_LOCALLAB_BUTTON_REN;名前の変更 +TP_LOCALLAB_BUTTON_VIS;表示/非表示 +TP_LOCALLAB_BWFORCE;ブラックEvとホワイトEvを使う +TP_LOCALLAB_CAM16PQREMAP;HDR PQ(最大輝度) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;CAM16に適応したPQ (知覚量子化)。これによりPQの内部関数を変えることが出来ます(通常は10000カンデラ毎平方メートル - デフォルトは100カンデラ毎平方メートルですが無効になります\n異なるデバイスや画像を扱う場合に使えます。 +TP_LOCALLAB_CAM16_FRA;CAM16による画像の調整 +TP_LOCALLAB_CAMMODE;CAMのモデル +TP_LOCALLAB_CAMMODE_CAM16;CAM16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CATAD;色順応 - Cat16 +TP_LOCALLAB_CBDL;詳細レベルによるコントラスト調整 +TP_LOCALLAB_CBDLCLARI_TOOLTIP;中間トーンのローカルコントラストを強化します +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;ウェーブレットと同じです\n最初のレベル(0)は2x2ピクセルのディテールで解析します\n最後のレベル(5)は64x64ピクセルのディテールで解析します +TP_LOCALLAB_CBDL_THRES_TOOLTIP;ノイズが先鋭化するのを避けます +TP_LOCALLAB_CBDL_TOOLNAME;詳細レベルによるコントラスト調整 +TP_LOCALLAB_CENTER_X;センターX +TP_LOCALLAB_CENTER_Y;センターY +TP_LOCALLAB_CH;CL - LC +TP_LOCALLAB_CHROMA;色度 +TP_LOCALLAB_CHROMABLU;色度のレベル +TP_LOCALLAB_CHROMABLU_TOOLTIP;輝度の設定に応じて、効果を増やしたり減らしたりします\n設定値が1以下の場合は効果が減ります。1より大きいと効果が増えます +TP_LOCALLAB_CHROMACBDL;色度 +TP_LOCALLAB_CHROMACB_TOOLTIP;輝度の設定に応じて、効果を増やしたり減らしたりします\n設定値が1以下の場合は効果が減ります。1より大きいと効果が増えます +TP_LOCALLAB_CHROMALEV;色度のレベル +TP_LOCALLAB_CHROMASKCOL;色度 +TP_LOCALLAB_CHROMASK_TOOLTIP;このスライダーを使って背景の彩度を下げることが出来ます(インバースマスクで言う0に近いカーブ).\n色度に対するマスクの作用を強めることも出来ます。 +TP_LOCALLAB_CHROML;色度 (C) +TP_LOCALLAB_CHRRT;色度 +TP_LOCALLAB_CIE;色の見えモデル(CAM16とJzCzHz) +TP_LOCALLAB_CIEC;色の見えモデルの環境変数を使う +TP_LOCALLAB_CIECAMLOG_TOOLTIP;このモジュールはCIE色の見えモデルをベースにしています。このモデルは異なる光源の下で人の目が知覚する色を真似るものです。\n最初の処理は’場面条件’で対数符号化によって実行されます。この際、撮影時の’絶対輝度’が使われます。\n次の処理は単純化した’画像の調整’で3つに絞り込んだ変数(ローカルコントラスト、コントラストJ、彩度S)を使います。\n3つ目の処理は’観視条件’で出力画像を見る条件(モニター、TV、プロジェクター、プリンターなどのこと)を考慮します。この処理により表示媒体に関わらず同じ画像の色やコントラストを維持します。 +TP_LOCALLAB_CIECOLORFRA;色 +TP_LOCALLAB_CIECONTFRA;コントラスト +TP_LOCALLAB_CIELIGHTCONTFRA;明るさとコントラスト +TP_LOCALLAB_CIELIGHTFRA;明度 +TP_LOCALLAB_CIEMODE;処理過程の位置の変更 +TP_LOCALLAB_CIEMODE_COM;デフォルト +TP_LOCALLAB_CIEMODE_DR;ダイナミックレンジ +TP_LOCALLAB_CIEMODE_TM;トーンマッピング +TP_LOCALLAB_CIEMODE_TOOLTIP;デフォルトではCIECAMが処理過程の最後になっています。"マスクと修正領域"と"輝度マスクをベースにした回復"は"CAM16 + JzCzHz"で使えます。\n好みに併せて他の機能(トーンマッピング、ダイナミックレンジ圧縮、対数符号化)にCIECAMを統合することも出来ます。調整結果はCIECAMを統合しなかった場合と異なります。このモードでは"マスクと修正領域"と"輝度マスクをベースにした回復"が使えます。 +TP_LOCALLAB_CIEMODE_WAV;ウェーブレット +TP_LOCALLAB_CIETOOLEXP;カーブ +TP_LOCALLAB_CIE_TOOLNAME;色の見えモデル(CAM16とJzCzHz) +TP_LOCALLAB_CIRCRADIUS;スポットの中心の大きさ +TP_LOCALLAB_CIRCRAD_TOOLTIP;この円内の情報がRT-スポットの編集の基準値となります。色相、輝度、色度、Sobelの形状検出に使います。\n小さい半径は花の色などの補正に。\n大きな半径は肌などの補正に適しています。 +TP_LOCALLAB_CLARICRES;色度を融合 +TP_LOCALLAB_CLARIFRA;明瞭とシャープマスク/ブレンド & ソフトイメージ +TP_LOCALLAB_CLARIJZ_TOOLTIP;レベル0から4まではシャープマスクが働きます\nレベル5以上では明瞭が働きます +TP_LOCALLAB_CLARILRES;輝度の融合 +TP_LOCALLAB_CLARISOFT;ソフトな半径 +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;‘ソフトな半径’のスライダー (ガイド付きフィルタのアルゴリズム) は、明瞭、シャープマスク、Jzのローカルコントラスト(ウェーブレット)に関連するハロやアーティファクトを軽減するために使います。 +TP_LOCALLAB_CLARISOFT_TOOLTIP;'ソフトな半径’のスライダーは(ガイド付きフィルタのアルゴリズム)、明瞭とシャープマスク、及び全てのウェーブレットピラミッドの処理に起因するハロと不規則性を軽減します。作用を無効にするには値を0にします。 +TP_LOCALLAB_CLARITYML;明瞭 +TP_LOCALLAB_CLARI_TOOLTIP;'シャープマスク’はレベル0~4で有効です。\n’明瞭’はレベル5以上で有効です。\n'レベルのダイナミックレンジ圧縮’を利用する場合に役立ちます。 +TP_LOCALLAB_CLIPTM;復元されたデータの切り取り(ゲイン) +TP_LOCALLAB_COFR;色と明るさ +TP_LOCALLAB_COLORDE;ΔEのプレビューカラー - 強さ +TP_LOCALLAB_COLORDEPREV_TOOLTIP;有効になっている機能が1つだけの時は、設定のパネル(拡張する)のΔEのプレビューボタンを使います。\n複数の機能が有効になっている時は、各機能に備わっているマスクと調節の中のΔEのプレビューを使います。 +TP_LOCALLAB_COLORDE_TOOLTIP;設定値がマイナスの場合は色差(ΔE)のプレビューの色をブルーで表示、プラスの場合はグリーンで表示\n\nマスクと調節(マスクなしで変更された領域を表示):プラスであれば、実際の変更を表示、マイナスであれば、強化された変更(輝度のみ)をブルーとイエローで表示 +TP_LOCALLAB_COLORSCOPE;カラー機能のスコープ +TP_LOCALLAB_COLORSCOPE_TOOLTIP;色と明るさ、露光補正(標準)、シャドウ/ハイライト、自然な彩度の機能にはこのスコープを使います。\n他の機能に関しては、それぞれのモジュールに属しているスコープを使います。 +TP_LOCALLAB_COLOR_CIE;カラーカーブ +TP_LOCALLAB_COLOR_TOOLNAME;色と明るさ +TP_LOCALLAB_COL_NAME;名前 +TP_LOCALLAB_COL_VIS;ステータス +TP_LOCALLAB_COMPFRA;詳細レベルの方向によるコントラスト +TP_LOCALLAB_COMPREFRA;ウェーブレットのレベルを使ったトーンマッピング +TP_LOCALLAB_CONTCOL;コントラストしきい値 +TP_LOCALLAB_CONTFRA;レベルによるコントラスト調整 +TP_LOCALLAB_CONTRAST;コントラスト +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;マスクのコントラストを自由に変更できますが、アーティファクトが発生するかもしれません。 +TP_LOCALLAB_CONTRESID;コントラスト +TP_LOCALLAB_CONTTHMASK_TOOLTIP;質感をベースに、画像のどの部分に影響を与えるか決定出来ます +TP_LOCALLAB_CONTTHR;コントラストのしきい値 +TP_LOCALLAB_CONTWFRA;ローカルコントラスト +TP_LOCALLAB_CSTHRESHOLD;ウェーブレットのレベル +TP_LOCALLAB_CSTHRESHOLDBLUR;ウェーブレットのレベルの選択 +TP_LOCALLAB_CURV;明度 - コントラスト - 色度 "強力" +TP_LOCALLAB_CURVCURR;通常 +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;カーブが最上部に位置している時は、マスクは黒一色で、画像は変化しません\nカーブを下げると、徐々にマスクに彩りが現れて明るくなり、 画像が漸進的に変化します\n\n必須ではありませんが、カーブの頂点をRT-スポットの色度、輝度、色相の基準値を示しているグレーの境界線に来るように位置することを奨めます +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;カーブが最上部に位置している時は、マスクは黒一色で、画像は変化しません\nカーブを下げると、徐々にマスクに彩りが現れて明るくなり、 画像が漸進的に変化します\n\n必須ではありませんが、カーブの頂点をRT-スポットの色度、輝度、色相の基準値を示しているグレーの境界線に来るように位置することを奨めます +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;カーブを有効にするには、’カーブのタイプ’のコンボボックスから’標準’を選びます +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;トーンカーブ +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), 色と明るさでL(H)との併用可 +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'通常', L=f(L)カーブは明るさのスライダーと同じアルゴリズムを使っています +TP_LOCALLAB_CURVES_CIE;トーンカーブ +TP_LOCALLAB_CURVNONE;カーブを無効 +TP_LOCALLAB_DARKRETI;暗さ +TP_LOCALLAB_DEHAFRA;霞除去 +TP_LOCALLAB_DEHAZ;強さ +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;大気に起因する霞を除去します。全体の彩度とディテールが向上します\n色被りも除去できますが、青味がかかることがあるので、その場合は別な機能で補正します +TP_LOCALLAB_DEHAZ_TOOLTIP;マイナス値にすると霞が増えます +TP_LOCALLAB_DELTAD;デルタバランス +TP_LOCALLAB_DELTAEC;ΔE画像のマスク +TP_LOCALLAB_DENOI1_EXP;輝度マスクをベースにしたノイズ除去 +TP_LOCALLAB_DENOI2_EXP;輝度マスクをベースにした詳細の復元 +TP_LOCALLAB_DENOIBILAT_TOOLTIP;インパルスノイズ、或いは‘ソルト & ペッパー’ノイズを軽減します +TP_LOCALLAB_DENOICHROC_TOOLTIP;ブロッチノイズとパケットノイズを処理します +TP_LOCALLAB_DENOICHRODET_TOOLTIP;漸進的にフーリエ変換(離散コサイン変換)を適用することで、ディテールの色度を回復します +TP_LOCALLAB_DENOICHROF_TOOLTIP;小さいディテールの色ノイズを調整します +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;ブルー/イエロー、或いはレッド/グリーンの補色次元で色ノイズを軽減します +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;シャドウ、或いはハイライト部分で、ある程度ノイズ低減を実行出来ます +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;漸進的にフーリエ変換(離散コサイン変換)を適用することで、輝度のディテールを回復します +TP_LOCALLAB_DENOIMASK;色ノイズのマスク +TP_LOCALLAB_DENOIMASK_TOOLTIP;全ての機能でマスクの色ノイズの程度を加減することが出来ます。\nLC(h)カーブを使う際、アーティファクトを避けたり、色度をコントロールするのに便利です。 +TP_LOCALLAB_DENOIQUA_TOOLTIP;’控え目’なモードでは、低周波ノイズは除去されません。’積極的’なモードは低周波ノイズも除去します。\n’控え目’も’積極的’も、ウェーブレットとDCTを使いますが、’輝度のノンローカルミーン’を併用することも出来ます。 +TP_LOCALLAB_DENOITHR_TOOLTIP;均一及び低コントラスト部分のノイズを減らす補助としてエッジ検出を調整します +TP_LOCALLAB_DENOI_EXP;ノイズ除去 +TP_LOCALLAB_DENOI_TOOLTIP;このモジュールは単独のノイズ低減機能(処理工程の最後の方に位置)として、或いはメインのディテールタブに付属するノイズ低減(処理工程の最初の方に位置)の追加機能として使うことが出来ます。\n色(ΔE)を基本に、スコープを使って作用に差を付けることが出来ます。\n但し、RT-スポットは最低128x128の大きさの必要です +TP_LOCALLAB_DEPTH;深度 +TP_LOCALLAB_DETAIL;ローカルコントラスト +TP_LOCALLAB_DETAILFRA;エッジ検出 - DCT +TP_LOCALLAB_DETAILSH;ディテール +TP_LOCALLAB_DETAILTHR;輝度と色の詳細のしきい値 +TP_LOCALLAB_DIVGR;ガンマ +TP_LOCALLAB_DUPLSPOTNAME;コピー +TP_LOCALLAB_EDGFRA;エッジシャープネス +TP_LOCALLAB_EDGSHOW;設定機能を全て表示 +TP_LOCALLAB_ELI;楕円 +TP_LOCALLAB_ENABLE_AFTER_MASK;トーンマッピングを使う +TP_LOCALLAB_ENABLE_MASK;マスクを有効にする +TP_LOCALLAB_ENABLE_MASKAFT;露光補正の全てのアルゴリズムを使う +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;元のデータの代わりに透過マップを使った後は、有効にしたマスクは修復されたデータを使います。 +TP_LOCALLAB_ENH;強化 +TP_LOCALLAB_ENHDEN;強化 + 色ノイズの軽減 +TP_LOCALLAB_EPSBL;ディテール +TP_LOCALLAB_EQUIL;輝度の標準化 +TP_LOCALLAB_EQUILTM_TOOLTIP;出力画像の輝度の平均と分散が元画像のそれらと同じになるように輝度を回復するオプションです +TP_LOCALLAB_ESTOP;エッジ停止 +TP_LOCALLAB_EV_DUPL;のコピー +TP_LOCALLAB_EV_NVIS;非表示 +TP_LOCALLAB_EV_NVIS_ALL;全て非表示 +TP_LOCALLAB_EV_VIS;表示 +TP_LOCALLAB_EV_VIS_ALL;全て表示 +TP_LOCALLAB_EXCLUF;除外 +TP_LOCALLAB_EXCLUF_TOOLTIP;’除外’モードはRT-スポットの中に編集の影響を受けたくない部分がある場合、別なRT-スポットで除外モードを選択し、その部分の編集効果を無効にします。’スコープ’を使えば影響を無効にする範囲を調整出来ます\n除外スポットに別な機能を追加することが出来るので、通常スポットの様に使うことも可能です(目標とする効果を無効にして、別な機能の効果を出すような場合) +TP_LOCALLAB_EXCLUTYPE;スポットのタイプ +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;通常スポットが使う情報は再帰的になります。\n\n除外スポットはローカル調整のデータを再初期化します。\nそれまでの作用を一部、或いは全てキャンセルするために使います。或いは、インバースモードで動作を実行するために使います。\n\n’画像全体’はローカル編集の機能を画像全体で使うためのモードです。\nRT-スポットのフレーム(外枠)がプレビュー画像の外側に自動で設定されます。\n’境界の階調調節’の境界値が自動で100に設定されます。\n注意1:目標とする調整に応じて、RT-スポットの中心円の位置や大きさを変えます。\n注意2:このスポットタイプでノイズ除去やウェーブレット、或いは高速フーリエ変換を使う場合はメモリー消費量が非常に大きくなります。PCのスペックが低いとプログラムがクラッシュすることがあります。 +TP_LOCALLAB_EXECLU;除外スポット +TP_LOCALLAB_EXFULL;画像全体 +TP_LOCALLAB_EXNORM;通常スポット +TP_LOCALLAB_EXPCBDL_TOOLTIP;センサーやレンズの汚れ跡を、それに該当する詳細レベルのコントラストを減らすことで除去します。 +TP_LOCALLAB_EXPCHROMA;色度の補間 +TP_LOCALLAB_EXPCHROMA_TOOLTIP;色が褪せるのを避けるため、’露光量補正 ƒ’と’コントラストの減衰 ƒ’と関連付けて使います。 +TP_LOCALLAB_EXPCOLOR_TOOLTIP;色、明度、コントラストの調整に使います。赤目やセンサーの汚れに起因する不良の補正にも使えます。 +TP_LOCALLAB_EXPCOMP;露光量補正 ƒ +TP_LOCALLAB_EXPCOMPINV;露光量補正 +TP_LOCALLAB_EXPCOMP_TOOLTIP;ポートレート或いは色の階調が少ない画像の場合、’設定’の’形状検出’を調整します:\n\n’ΔEスコープのしきい値’を増やします\n’ΔEの減衰’を減らします\n’バランス ab-L(ΔE)'を増やします +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;RawPediaの'ウェーブレットのレベル’を参照して下さい。\nローカル編集のウェーブレットのレベルは異なる部分が幾つかあります:各ディテールのレベルに対する調整機能がより多く、多様性が増します。\n例、ウェーブレットのレベルのトーンマッピングです。 +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;あまりに小さいRT-スポットの設定は避けます(少なくとも32x32ピクセル以上)。\n低い’境界値’と高い’境界の減衰’値、及び’スコープ’値を使い、小さいRT-スポットを真似て欠陥部分を補正します。\nアーティファクトを軽減するために、必要に応じて’ソフトな半径’を調整して ’明瞭とシャープマスク’、’ファイルの融合’を使います。 +TP_LOCALLAB_EXPCURV;カーブ +TP_LOCALLAB_EXPGRAD;階調フィルタ +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;階調フィルタは’色と明るさ’の輝度、色度、色相の階調と、ファイルの融合、'露光補正'の輝度の階調、、'露光補正マスク'の輝度の階調、'シャドウ/ハイライト'の輝度の階調、'自然な彩度'の輝度、色度、色相の階調、’ローカルコントラスト&ウェーブレットピラミッド’のローカルコントラストの階調で使えます。\nフェザー処理は’設定’の中にあります。 +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;変化させた画像と元の画像のブレンドを変えます +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;ラプラス変換前後にガンマカーブを加えて、コントラストが過剰な、或いは不足した画像を修正します +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;ラプラス変換を適用する前に、線形要素を加え、露出不足の画像を修正します +TP_LOCALLAB_EXPLAP_TOOLTIP;スライダーを右に移動すると漸進的にコントラストが減少します +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;不透明度のコントロールで、GIMPやPhotoshop(C)の、Difference, Multiply, Soft Light, Overlayなどのレイヤー融合モードが使えます。\n元画像:現在のRT-スポットと元画像の融合\n前のRT-スポット:現在のRT-スポットと前のRT-スポットを融合(但し、前のスポットがある場合に限る、ない場合は元画像と融合)\n背景:現在のRT-スポットと背景の色と輝度を融合 +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;アーティファクト(ノイズ)の発生を避けるため、ラプラス変換の前にメディアンフィルタを適用します +TP_LOCALLAB_EXPOSE;ダイナミックレンジ & 露光補正 +TP_LOCALLAB_EXPOSURE_TOOLTIP;シャドウ部分が強いような場合は、’シャドウ/ハイライト’のモジュールが使えます +TP_LOCALLAB_EXPRETITOOLS;高度なレティネックス機能 +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-スポットの大きさが最低でも39x39ピクセル必要です\nスポットが小さい場合は、低い境界値、高い減衰値、高いスコープ値を設定します +TP_LOCALLAB_EXPTOOL;露光補正の機能 +TP_LOCALLAB_EXP_TOOLNAME;ダイナミックレンジ & 露光補正 +TP_LOCALLAB_FATAMOUNT;量 +TP_LOCALLAB_FATANCHOR;アンカー +TP_LOCALLAB_FATDETAIL;ディテール +TP_LOCALLAB_FATFRA;ダイナミックレンジ圧縮 ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;ここではFattalのトーンマッピングアルゴリズムを使います\nアンカーで画像の露出不足・過多に応じた選択が出来ます\n現在のスポットに近く、マスクを使用する2番目のスポットの輝度を増やすのに便利です +TP_LOCALLAB_FATLEVEL;シグマ +TP_LOCALLAB_FATSHFRA;マスクのダイナミックレンジ圧縮のマスク ƒ +TP_LOCALLAB_FEATH_TOOLTIP;RT-スポットの対角線の長さに対する諧調幅の割合で作用します\nこれは階調フィルタを備えているモジュール全てに共通です\n但し、フェザー処理が働くのは、階調フィルタの中で一つ以上の調整が行われている場合だけです +TP_LOCALLAB_FEATVALUE;フェザー処理 +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;質を高めるためにフーリエ変換を使います(但し、処理時間とメモリー消費が増えます) +TP_LOCALLAB_FFTW;ƒ 高速フーリエ変換を使う +TP_LOCALLAB_FFTWBLUR;ƒ - 常に高速フーリエ変換を使う +TP_LOCALLAB_FULLIMAGE;画像全体のブラックEvとホワイトEv +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;画像全体のEvレベルを計算します +TP_LOCALLAB_GAM;ガンマ +TP_LOCALLAB_GAMC;ガンマ +TP_LOCALLAB_GAMCOL_TOOLTIP;L*a*b*の輝度値にガンマを適用します\nガンマが3.0の場合は、"線形"の輝度が使われます。 +TP_LOCALLAB_GAMC_TOOLTIP;プラミッド1と2による処理の前後で、L*a*b*の輝度値にガンマを適用します\nガンマが3.0の場合は、"線形"の輝度が使われます。 +TP_LOCALLAB_GAMFRA;トーンリプロダクションカーブ(TRC) +TP_LOCALLAB_GAMM;ガンマ +TP_LOCALLAB_GAMMASKCOL;ガンマ +TP_LOCALLAB_GAMMASK_TOOLTIP;ガンマとスロープを調整すると、不連続になるのを避けるために’L’が徐々に変わるため、アーティファクトを発生させずにマスクの修正が出来ます +TP_LOCALLAB_GAMSH;ガンマ +TP_LOCALLAB_GAMW;ガンマ(ウェーブレットピラミッド) +TP_LOCALLAB_GRADANG;階調フィルタの角度 +TP_LOCALLAB_GRADANG_TOOLTIP;-180度から+180度の間で角度を調整 +TP_LOCALLAB_GRADFRA;階調フィルタのマスク +TP_LOCALLAB_GRADGEN_TOOLTIP;階調フィルタの機能は’色と明るさ’と、’露光’、'シャドウ/ハイライト”、’自然な彩度’に備わっています\n\n自然な彩度、色と明るさには輝度、色調、色相の階調フィルタが使えます\nフェザー処理は設定の中にあります +TP_LOCALLAB_GRADLOGFRA;輝度の階調フィルタ +TP_LOCALLAB_GRADSTR;階調フィルタ 強さ +TP_LOCALLAB_GRADSTRAB_TOOLTIP;色度の階調の強さを調整します +TP_LOCALLAB_GRADSTRCHRO;色度の階調の強さ +TP_LOCALLAB_GRADSTRHUE;色相の階調の強さ +TP_LOCALLAB_GRADSTRHUE2;色相の階調の強さ +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;色相の階調の強さを調整します +TP_LOCALLAB_GRADSTRLUM;輝度の階調の強さ +TP_LOCALLAB_GRAINFRA;フィルムの質感 1:1 +TP_LOCALLAB_GRAINFRA2;粗い +TP_LOCALLAB_GRAIN_TOOLTIP;画像にフィルムのような質感を加えます +TP_LOCALLAB_GRALWFRA;階調フィルタ(ローカルコントラスト) +TP_LOCALLAB_GRIDFRAME_TOOLTIP;このツールはブラシとして使うことが出来ます。小さいRT-スポットと低い‘境界値’、‘境界値の減衰’を設定します。\n‘標準’モードだけで使います。融合する背景(ΔE)に関係するのは色相、彩度、色、輝度です。 +TP_LOCALLAB_GRIDMETH_TOOLTIP;カラートーン調整:色が変わる際に輝度を考慮します。グリッド上の’白い点’は0の位置、’黒い点’だけを移動した場合は、H=f(H)と同じ効果です。両方の点を移動した場合に’カラートーン調整’の効果になります。\n\n直接:色度に直接作用します。 +TP_LOCALLAB_GRIDONE;カラートーン調整 +TP_LOCALLAB_GRIDTWO;直接 +TP_LOCALLAB_GUIDBL;ソフトな半径 +TP_LOCALLAB_GUIDBL_TOOLTIP;半径を変えられるガイド付きフィルタを適用します。アーティファクトを軽減したり、画像にぼかしを掛けたり出来ます。 +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;ガイド付きフィルタの配分機能を変化させます。マイナス値の設定はガウスぼかしに似た効果となります +TP_LOCALLAB_GUIDFILTER;ガイド付きフィルタの半径 +TP_LOCALLAB_GUIDFILTER_TOOLTIP;アーティファクトが減ったり、増えたりします +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;ガイド付きフィルタの強さ +TP_LOCALLAB_HHMASK_TOOLTIP;例えば肌の微妙な色相調整に使います +TP_LOCALLAB_HIGHMASKCOL;ハイライト +TP_LOCALLAB_HLH;H +TP_LOCALLAB_HUECIE;色相 +TP_LOCALLAB_IND;独立 (マウス) +TP_LOCALLAB_INDSL;独立 (マウス + スライダー) +TP_LOCALLAB_INVBL;インバース +TP_LOCALLAB_INVBL_TOOLTIP;‘インバース’モードに代わる方法:2つのスポットを使う\n初めのスポット:\nタイプは画像全体にします。\n\n2番目のRT-スポット:除外スポットを使います。 +TP_LOCALLAB_INVERS;インバース +TP_LOCALLAB_INVERS_TOOLTIP;インバースを選択すると使える機能の数が少なくなります。\n\n代わりの方法:2つのRT-スポットを使います\n初めのスポット:\nタイプは画像全体にします。\n\n2番目のRT-スポット:除外スポットを使います。 +TP_LOCALLAB_INVMASK;インバースアルゴリズム +TP_LOCALLAB_ISOGR;配分(ISO) +TP_LOCALLAB_JAB;ブラックEvとホワイトEvを使う +TP_LOCALLAB_JABADAP_TOOLTIP;PU(均一的知覚)の順応\n"絶対輝度"を考慮したJzと彩度の関係を自動的に調整します +TP_LOCALLAB_JZ100;Jzの基準値 100カンデラ +TP_LOCALLAB_JZ100_TOOLTIP;100カンデラ毎平方メートルでのJzの基準値(画像シグナル)を自動で調整します。\n彩度の値と“PU 順応” (均一的な知覚の順応)が変わります。 +TP_LOCALLAB_JZADAP;PU-順応 +TP_LOCALLAB_JZCH;色度 +TP_LOCALLAB_JZCHROM;色度 +TP_LOCALLAB_JZCLARICRES;色度Czを融合 +TP_LOCALLAB_JZCLARILRES;Jzを融合 +TP_LOCALLAB_JZCONT;コントラスト +TP_LOCALLAB_JZFORCE;強制的にJzを1にする +TP_LOCALLAB_JZFORCE_TOOLTIP;スライダーやカーブの応答を改善するために、Jzの最大値を強制的に1にします。 +TP_LOCALLAB_JZFRA;Jz Cz Hzによる画像調整 +TP_LOCALLAB_JZHFRA;Hzカーブ +TP_LOCALLAB_JZHJZFRA;Jz(Hz)カーブ +TP_LOCALLAB_JZHUECIE;色相の回転 +TP_LOCALLAB_JZLIGHT;明るさ +TP_LOCALLAB_JZLOG;対数符号化 Jz +TP_LOCALLAB_JZLOGWBS_TOOLTIP;対数符号化を使うかシグモイドを使うかでブラックEvとホワイトEvの調整が異なる場合があります\nシグモイドの場合、ハイライト、コントラスト、彩度の良好なレンダリングを得るために、ホワイトEvの調整(多くの場合、増やす方向)が必要になることがあります +TP_LOCALLAB_JZLOGWB_TOOLTIP;自動を有効にすると、スポット内のEvレベルと'平均輝度 Yb%'が計算されて調整されます。計算結果は"対数符号化 Jz"を含む、全てのJzの働きに使われます。\nまた、撮影時の絶対輝度が計算されます。 +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Ybは背景の平均輝度を指し、グレーの割合(%)で表します。グレー18%は背景のCIE Labの輝度値が50%であることと同じです。\nデータは画像の平均輝度に基づいています\n対数符号化が使われている場合は、対数符号化が行われる前に適用するゲインの量を決めるために平均輝度が使われます。平均輝度の値が低い程、ゲインが増えます。 +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jzが使えるのは機能水準が'高度'な場合だけです。Jzが機能するのは出力デバイス(モニター)がHDRの場合だけです(最大出力輝度が100カンデラ毎平方メートル以上、理想的には4000から10000カンデラ毎平方メートル、ブラックポイントが0.005カンデラ毎平方メートル以下のモニターです)。ここで想定されるのは、a)モニターのICCのプロファイル接続色空間でJzazbz (或いはXYZ)が使える、b)実数精度で作業出来る、c)モニターがキャリブレートされている(出来れば、DCI-P3、或いはRec-2020の色域で)、d) 通常のガンマ(sRGB、或いはBT709)が知覚量子化の関数で置き換えられる、ことです。 +TP_LOCALLAB_JZPQFRA;Jz 再マッピング +TP_LOCALLAB_JZPQFRA_TOOLTIP;Jzのアルゴリズムを以下の様にSDR(標準ダイナミックレンジ)の環境、或いはHDR(ハイダイナミックレンジ)の環境の特性に対して適応させることが出来ます:\n a) 輝度値が0から100カンデラ毎平方メートルの間では、システムがSDRであるように作用する\n b) 輝度値が100から10000カンデラ毎平方メートルの間では、画像とモニターのHDR特性にJzのアルゴリズムを適応させる。\n\n“PQ - 最大輝度P”を10000カンデラ毎平方メートルに設定すると、“Jzの再マッピング”がJzazbzのオリジナルアルゴリズムの特性を示します。 +TP_LOCALLAB_JZPQREMAP;PQ - 最大輝度 +TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (知覚量子化) - PQの内部関数を変えることが出来ます。デフォルトでは120カンデラ毎平方メートルが設定されていますが、一般的な10000カンデラ毎平方メートルに変えられます。\n異なる画像、処理、デバイスに適応させるために使います。 +TP_LOCALLAB_JZQTOJ;相対輝度 +TP_LOCALLAB_JZQTOJ_TOOLTIP;"絶対輝度"の代わりに"相対輝度"が使えるようになります - 明るさが明度で表現されるようになります。\n変更により、明るさとコントラストのスライダー、及びJz(Jz)カーブが影響を受けます。 +TP_LOCALLAB_JZSAT;彩度 +TP_LOCALLAB_JZSHFRA;Jz シャドウ/ハイライト +TP_LOCALLAB_JZSOFTCIE;ソフトな半径(ガイド付きフィルタ) +TP_LOCALLAB_JZSTRSOFTCIE;ガイド付きフィルタの強さ +TP_LOCALLAB_JZTARGET_EV;観視の平均輝度(Yb%) +TP_LOCALLAB_JZTHRHCIE;Jz(Hz)の色度のしきい値 +TP_LOCALLAB_JZWAVEXP;Jz ウェーブレット +TP_LOCALLAB_LABBLURM;マスクのぼかし +TP_LOCALLAB_LABEL;ローカル編集 +TP_LOCALLAB_LABGRID;カラー補正グリッド +TP_LOCALLAB_LABGRIDMERG;背景 +TP_LOCALLAB_LABGRID_VALUES;高(a)=%1 高(b)=%2\n低(a)=%3 低(b)=%4 +TP_LOCALLAB_LABSTRUM;構造マスク +TP_LOCALLAB_LAPLACC;ΔØ マスク ラプラス変換 PDEの境界条件あり +TP_LOCALLAB_LAPLACE;ラプラス変換のしきい値 ΔE +TP_LOCALLAB_LAPLACEXP;ラプラス変換のしきい値 +TP_LOCALLAB_LAPMASKCOL;ラプラス変換のしきい値 +TP_LOCALLAB_LAPRAD1_TOOLTIP;明るい領域の輝度値を上げることでマスクのコントラストを増やします。 +TP_LOCALLAB_LAPRAD2_TOOLTIP;スムーズな半径はアーティファクトを軽減し、境界を滑らかにするためにガイド付きフィルタを使います。 +TP_LOCALLAB_LAPRAD_TOOLTIP;スムーズな半径はガイド付きフィルタを使ってアーティファクトを減らし、境界をスムーズにします。 +TP_LOCALLAB_LAP_MASK_TOOLTIP;全てのラプラシアンマスクのポアソン方程式の解を求めます\nラプラシアンのしきい値マスクを有効にするとアーティファクトが軽減され、スムーズな効果が得られます\n無効の場合は線形的な応答となります +TP_LOCALLAB_LC_FFTW_TOOLTIP;高速フーリエ変換を使うと質が向上し、大きな半径も使えますが、処理時間が増えます(処理する領域次第で)。大きい半径を使う時だけに使う方がいいでしょう。FFTWの最適化を図るため、処理する領域が数ピクセルほど小さくなります。これだけで、処理の効率がが1.5倍~10倍良くなります。 +TP_LOCALLAB_LC_TOOLNAME;ローカルコントラスト & ウェーブレット +TP_LOCALLAB_LEVELBLUR;ぼかしを施すレベルの最大値 +TP_LOCALLAB_LEVELWAV;ウェーブレットのレベル +TP_LOCALLAB_LEVELWAV_TOOLTIP;詳細レベルの番手はスポットとプレビューのサイズに応じて自動で決まります\n最大512ピクセルで解析するレベル9から最大4ピクセルで解析するレベル1まで +TP_LOCALLAB_LEVFRA;レベル +TP_LOCALLAB_LIGHTNESS;明度 +TP_LOCALLAB_LIGHTN_TOOLTIP;インバースモードにして、スコープを高く(75以上)、明度を-100にして色度を下げると、境界の外側の輝度が0になります。 +TP_LOCALLAB_LIGHTRETI;明度 +TP_LOCALLAB_LINEAR;線形性 +TP_LOCALLAB_LIST_NAME;現在のスポットに機能を追加 +TP_LOCALLAB_LIST_TOOLTIP;RT-スポットで使う機能をこの中から選択します。\n表示された機能の右側のコンボボックスから、機能の水準(基本、標準、高度)を選びます。デフォルトでは基本を表示するように設定されていますが、環境設定で変更出来ます\n機能の水準は、編集中でも変えることも出来ます +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;選択したウェーブレットのレベルによって、中間トーンとハイライトへの作用を優先します +TP_LOCALLAB_LMASK_LL_TOOLTIP;マスクのコントラストを自由に変えられます。但し、アーティファクトが発生するかもしれません +TP_LOCALLAB_LOCCONT;アンシャープマスク +TP_LOCALLAB_LOC_CONTRAST;ローカルコントラスト & ウェーブレット +TP_LOCALLAB_LOC_CONTRASTPYR;ピラミッド1: +TP_LOCALLAB_LOC_CONTRASTPYR2;ピラミッド2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB;レベルによるコントラスト調整/トーンマッピング/方向によるコントラスト +TP_LOCALLAB_LOC_CONTRASTPYRLAB;階調フィルタ/エッジシャープネス/ぼかし +TP_LOCALLAB_LOC_RESIDPYR;残差画像 メイン +TP_LOCALLAB_LOG;対数符号化 +TP_LOCALLAB_LOG1FRA;CAM16による画像の調整 +TP_LOCALLAB_LOG2FRA;観視条件 +TP_LOCALLAB_LOGAUTO;自動 +TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;場面条件の’平均輝度’を自動で計算します。 +TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;相対的な露光レベルの中の’自動’ボタンを押すと、撮影画像の環境に関する平均輝度が自動的に計算されます。 +TP_LOCALLAB_LOGAUTO_TOOLTIP;'自動平均輝度(Yb%)'のオプションが有効になっている時に、このボタンを押すと撮影画像の環境に関する’ダイナミックレンジ’と’平均輝度’が計算されます。\nまた、撮影時の絶対輝度も計算されます。\n再度ボタンを押すと自動的にこれら値が調整されます。 +TP_LOCALLAB_LOGBASE_TOOLTIP;デフォルト値は2です\n2以下ではアルゴリズムの働きが弱まり、シャドウ部分が暗く、ハイライト部分が明るくなります\n2より大きい場合は、シャドウ部分が濃いグレーに変わり、ハイライト部分は白っぽくなります +TP_LOCALLAB_LOGCATAD_TOOLTIP;色順応とは時空環境に応じて色を認識する能力です。\n光源がD50から大きく外れている場合のホワイトバランス調整に有用です\nこの機能で、出力デバイスの光源の下で同じ色になるように近づけます。 +TP_LOCALLAB_LOGCIE;シグモイドの代わりに対数符号化を使う +TP_LOCALLAB_LOGCIE_TOOLTIP;対数符号化Qを使うトーンマッピングでは、ブラックEvとホワイトEvの調節、場面条件の平均輝度と観視条件の平均輝度(Y%)の調整が出来ます。 +TP_LOCALLAB_LOGCOLORFL;鮮やかさ (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;グレーに対して知覚される色相の量のことです。\n色刺激が多かれ少なかれ色付いて見えることの指標です。 +TP_LOCALLAB_LOGCONQL;コントラスト (Q) +TP_LOCALLAB_LOGCONTHRES;コントラストのしきい値(J & Q) +TP_LOCALLAB_LOGCONTL;コントラスト (J) +TP_LOCALLAB_LOGCONTL_TOOLTIP;CIECAM16のコントラストJは輝度により変わる彩色の増加を計算に入れます。 +TP_LOCALLAB_LOGCONTQ_TOOLTIP;CIECAM16のコントラストQはその明るさで知覚する彩色の増加を計算に入れます。 +TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;明度Jと明るさQの中間トーンのコントラストを調節します。\n正の値ではJとQのコントラストスライダーの効果が徐々に減少し、負の値では効果が徐々に増加します。 +TP_LOCALLAB_LOGDETAIL_TOOLTIP;主に高周波に作用します。 +TP_LOCALLAB_LOGENCOD_TOOLTIP;対数符号化(ACES)を使ったトーンマッピング\n露光不足或いはハイダイナミックレンジ画像の処理に使います\n\n2段階の処理です : 1)ダイナミックレンジの算出、2)手動による調整 +TP_LOCALLAB_LOGEXP;全ての機能 +TP_LOCALLAB_LOGFRA;場面条件 +TP_LOCALLAB_LOGFRAME_TOOLTIP;RT-スポットに関する露出のレベルと’平均輝度 Yb%'(グレーポイントの情報源)を計算し調整します。結果は全てのLab関連処理と殆どのRGB関連処理に使われます。\nまた、場面の絶対輝度も考慮します。 +TP_LOCALLAB_LOGIMAGE_TOOLTIP;対応する色の見えモデルの変数(例えば、コントラストJと彩度S、及び機能水準が高度な場合の、コントラストQ、明るさQ、明度J、鮮やかさM)を考慮します。 +TP_LOCALLAB_LOGLIGHTL;明度 (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;L*a*b*の明度に近いものですが、知覚される彩色の増加を考慮ています。 +TP_LOCALLAB_LOGLIGHTQ;明るさ (Q) +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;その色刺激から発せられる知覚された光の量を意味します。\nその色刺激の明るさの多寡の指標です。 +TP_LOCALLAB_LOGLIN;対数モード +TP_LOCALLAB_LOGPFRA;相対的な露光レベル +TP_LOCALLAB_LOGREPART;全体の強さ +TP_LOCALLAB_LOGREPART_TOOLTIP;元画像と比べた対数符号化した画像の強さを調整します。\n色の見えモデルの構成要素には影響しません。 +TP_LOCALLAB_LOGSATURL_TOOLTIP;色の見えモデル16の彩度Sは、物体自身が持つ明るさに関した色刺激の色に該当します\n主に、中間トーンからハイライトにかけて作用します。 +TP_LOCALLAB_LOGSCENE_TOOLTIP;場面条件に該当します。 +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;場面条件を考慮して明暗と色を調整します。\n\n平均: 平均的な光の環境(標準)。画像は変わりません。\n\n薄暗い: 薄暗い環境。画像が少し明るくなります。\n\n暗い: 暗い環境。画像がより明るくなります。 +TP_LOCALLAB_LOGVIEWING_TOOLTIP;最終画像を見る周囲環境同様、それを見る媒体(モニター、TV、プロジェクター、プリンターなど)に対応します。 +TP_LOCALLAB_LOG_TOOLNAME;対数符号化 +TP_LOCALLAB_LUM;LL - CC +TP_LOCALLAB_LUMADARKEST;最も暗い部分 +TP_LOCALLAB_LUMASK;マスクの背景色と輝度 +TP_LOCALLAB_LUMASK_TOOLTIP;マスクの表示(マスクと修正領域)で、背景のグレーを調節します +TP_LOCALLAB_LUMAWHITESEST;最も明るい部分 +TP_LOCALLAB_LUMFRA;L*a*b* 標準 +TP_LOCALLAB_MASFRAME;マスクと融合に関する設定 +TP_LOCALLAB_MASFRAME_TOOLTIP;これは全てのマスクに共通します\n以下のマスク機能が使われた時に目標とする領域が変化するのを避けるためにΔE画像を考慮します:ガンマ、スロープ、色度、コントラストカーブ(ウェーブレットのレベル)、ぼかしマスク、構造のマスク(有効になっている場合)\nこの機能はインバースモードでは無効になります +TP_LOCALLAB_MASK;カーブ +TP_LOCALLAB_MASK2;コントラストカーブ +TP_LOCALLAB_MASKCOM;共通のカラーマスク +TP_LOCALLAB_MASKCOM_TOOLNAME;共通のカラーマスク +TP_LOCALLAB_MASKCOM_TOOLTIP;このマスクは全ての機能で使えます。カラースコープを考慮します。\nこのマスクは’色と明るさ’や’露光補正’などに備わったその機能を補間するためのマスクとは異なります +TP_LOCALLAB_MASKCURVE_TOOLTIP;デフォルトでは3つのカーブは1(最大値)にセットされています:\n C=f(C)は色度に応じて色度が変わるカーブです。より適切な目標範囲を定めるために色度を減らします。このカーブをゼロ近くに設定すれば(Cの最大値を少し低くするだけでカーブは有効になります)、インバースモードを使って背景色の彩度を下げることが出来ます。\n L=f(L)は輝度を使ってより適切な目標範囲を定めるためのカーブです。\n L and C = f(H)は色相を使ってより適切な目標範囲を定めるためのカーブです。 +TP_LOCALLAB_MASKDDECAY;減衰の強さ +TP_LOCALLAB_MASKDECAY_TOOLTIP;マスクのグレーレベルの減衰の度合いをコントロールします\n 1は線形で減衰、 1より大きい場合はパラボリック、1より小さい場合はより緩やかな減衰になります +TP_LOCALLAB_MASKDEINV_TOOLTIP;マスクを解析するアルゴリズムが反対の作用になります\n ✔を入れると暗い部分と非常に明るい部分が減ります +TP_LOCALLAB_MASKDE_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ノイズ除去を目的として使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n マスクが'暗い'しきい値より暗い場合は、ノイズ除去が漸進的に作用します\n マスクが'明るい'しきい値より明るい場合は、ノイズ除去が漸進的に作用します\n マスクの明るさが2つのしきい値の間になっている場合は、グレー領域の'輝度ノイズ除去'、或いは'色ノイズ除去'を使ってない限り、ノイズ除去を除く画像の設定が維持されます +TP_LOCALLAB_MASKGF_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ガイド付きフィルタを目的として使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n マスクが'暗い'しきい値より暗い場合は、階調調整が漸進的に作用します\n マスクが'明るい'しきい値より明るい場合は、ガイド付きフィルタが漸進的に作用します\n マスクの明るさが2つのしきい値の間になっている場合は、ガイド付きフィルタを除いた画像の設定が維持されます +TP_LOCALLAB_MASKH;色相のカーブ +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;このしきい値より明るい部分では、”CBDL(輝度のみ)”のパラメータが調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ノイズ除去は100%から漸進的に減少します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;このしきい値より明るい部分では、”レティネックス(輝度のみ)”のパラメータが調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;このしきい値より明るい部分では、画像が“トーンマッピング”の調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;このしきい値より明るい部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ガイド付きフィルタは100%から漸進的に減少します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク'、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で'ロック式カラーピッカー'を使い、どの部分が影響を受けているか見極めます。但し、'設定'の'マスクと融合'の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLCTHR;明るい領域の輝度のしきい値 +TP_LOCALLAB_MASKLCTHR2;明るい領域の輝度のしきい値 +TP_LOCALLAB_MASKLCTHRLOW;暗い領域の輝度のしきい値 +TP_LOCALLAB_MASKLCTHRLOW2;暗い領域の輝度のしきい値 +TP_LOCALLAB_MASKLCTHRMID;グレー領域の輝度ノイズ除去 +TP_LOCALLAB_MASKLCTHRMIDCH;グレー領域の色ノイズ除去 +TP_LOCALLAB_MASKLC_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、ノイズ除去を目的として使います。\nこの機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n'暗い部分と明るい部分のノイズ除去強化'のスライダーの値が1より大きい場合、'暗い領域の輝度のしきい値'で設定されたしきい値を0%、最も暗い値(マスクによって定義される)を100%として、ノイズ除去が漸進的に増加します。\n明るい部分では、'明るい領域の輝度のしきい値'で設定されたしきい値を0%、最も明るい値(マスクによって定義される)を100%として、ノイズ除去が漸進的に減衰します。\n2つのしきい値の間の部分では、ノイズ除去の設定はマスクによる影響を受けません。 +TP_LOCALLAB_MASKLNOISELOW;暗い部分と明るい部分のノイズ除去強化 +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;このしきい値より明るい部分では、画像が'CBDL(輝度のみ)'のパラメータ調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ノイズ除去は100%から漸進的に増加します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;このしきい値より明るい部分では、画像が'レティネックス'(輝度のみ)のパラメータ調整を行う前の元の状態に漸進的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;このしきい値より暗い部分では、画像の調整パラメータが調整を行う前の元の状態に斬新的に復元されます。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;しきい値をホワイト値最大(マスクで定義された)で0%に設定すると、ガイド付きフィルタは100%から漸進的に増加します。\n 'マスクと修正領域'の中の機能('構造のマスク'、'ぼかしのマスク、'スムーズな半径'、'ガンマとスロープ'、'コントラストカーブ'、'ウェーブレットを使ったローカルコントラスト')を使ってグレーレベルを変えることが出来ます。\n マスク上で“ロック式カラーピッカー”を使い、どの部分が影響を受けているか見極めます。但し、“設定”の“マスクと融合”の中にある’背景の色/輝度のマスク’の値を0にしておく必要があります。 +TP_LOCALLAB_MASKRECOL_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”色と明るさ”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'色と明るさ'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'色と明るさ'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRECOTHRES;復元のしきい値 +TP_LOCALLAB_MASKREEXP_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている、輝度情報をベースに、“ダイナミックレンジと露光補正”の設定による効果を和らげます。\n この機能を使うためには、L(L)マスクやLC(H)マスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'ダイナミックレンジと露光補正'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'ダイナミックレンジと露光補正'の設定が100%働きます。 +TP_LOCALLAB_MASKRELOG_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている、画像の輝度情報をベースにした“対数符号化”の効果を和らげます。\n この機能を使うためには、L(L)マスクやLC(H)マスクを有効にしておかなくてはなりません。\n 暗い領域のしきい値より暗い部分、と明るい領域のしきい値より明るい部分では、'対数符号化'による調整が働く前の元画像の状態に漸進的に復元されます。色の波及を使ったハイライト復元の効果を維持するために使えます。\n 2つのしきい値の間の部分では、'対数符号化'の設定が100%働きます。 +TP_LOCALLAB_MASKRESCB_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”CBDL”(輝度のみ)の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'CBDL'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'CBDL'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESH_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”シャドウ/ハイライト”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'シャドウ/ハイライト'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'シャドウ/ハイライト'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESRETI_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”レティネックス”(輝度のみ)の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'レティネックス'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'レティネックス'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESTM_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”トーンマッピング”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'トーンマッピング'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'トーンマッピング'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESVIB_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”自然な彩度 ウォームとクール”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'自然な彩度 ウォームとクール'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'自然な彩度 ウォームとクール'の設定値が100%適用されます。 +TP_LOCALLAB_MASKRESWAV_TOOLTIP;'マスクと修正領域'のL(L)やLC(H)マスクに内包されている輝度の情報をベースに、”ローカルコントラスト ウェーブレット”の設定による効果を和らげるために使います。\n この機能を使うためにはL(L)やLC(H)のマスクを有効にする必要があります。\n 暗いしきい値以下と明るいしきい値以上の'暗い'領域と'明るい'領域は、'ローカルコントラスト ウェーブレット'の設定によって変更される前の値(元の値)に漸進的に復元されます。\n 2つのしきい値の間の部分では、'ローカルコントラスト ウェーブレット'の設定値が100%適用されます。 +TP_LOCALLAB_MASKUNUSABLE;'マスクと修正領域'のマスクが無効 +TP_LOCALLAB_MASKUSABLE;'マスクと修正領域'のマスクが有効 +TP_LOCALLAB_MASK_TOOLTIP;一つの機能の中で複数のマスクを活用することが出来ます。他の機能を有効にしてそのマスクだけを使います(機能の中のスライダー値は全て0にする)。\n\nまたは、RT-スポットを複製し、初めのスポットの近くに置き、そのRT-スポットのマスクを使います。この場合、調整のための基準値の違いが小さいため、より精緻な調整が可能です。 +TP_LOCALLAB_MEDIAN;メディアン 低 +TP_LOCALLAB_MEDIANITER_TOOLTIP;メディアンフィルタ適用の繰り返し回数を設定します +TP_LOCALLAB_MEDIAN_TOOLTIP;メディアンの値を3x3~9x9ピクセルの範囲で選べます。値を高くするほどノイズ低減とぼかしが強くなります +TP_LOCALLAB_MEDNONE;なし +TP_LOCALLAB_MERCOL;色 +TP_LOCALLAB_MERDCOL;背景の融合 +TP_LOCALLAB_MERELE;明るくするだけ +TP_LOCALLAB_MERFIV;追加 +TP_LOCALLAB_MERFOR;色の覆い焼き +TP_LOCALLAB_MERFOU;乗算 +TP_LOCALLAB_MERGE1COLFRA;融合するファイルの選択:オリジナル/前のRT-スポット/背景 +TP_LOCALLAB_MERGECOLFRA;マスク:LChと構造 +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;LChの3つのカーブ、或いは構造検出のアルゴリズム、またはその両方をベースにマスクを作ります +TP_LOCALLAB_MERGEMER_TOOLTIP;ファイルを癒合する際にΔEを考慮します(この場合はスコープと同じ働きです) +TP_LOCALLAB_MERGEOPA_TOOLTIP;不透明度とは初めのRT-スポット或いは前のスポットと融合させる現在のスポットの割合です\nコントラストのしきい値:元画像のコントラストに応じで結果を調整するスライダーです +TP_LOCALLAB_MERHEI;重ね合わせ +TP_LOCALLAB_MERHUE;色相 +TP_LOCALLAB_MERLUCOL;輝度 +TP_LOCALLAB_MERLUM;光度 +TP_LOCALLAB_MERNIN;スクリーン +TP_LOCALLAB_MERONE;標準 +TP_LOCALLAB_MERSAT;彩度 +TP_LOCALLAB_MERSEV;ソフトライト(レガシー) +TP_LOCALLAB_MERSEV0;ソフトライト イリュージョン +TP_LOCALLAB_MERSEV1;ソフトライト W3C +TP_LOCALLAB_MERSEV2;ハードライト +TP_LOCALLAB_MERSIX;分割 +TP_LOCALLAB_MERTEN;暗くするだけ +TP_LOCALLAB_MERTHI;色の焼き込み +TP_LOCALLAB_MERTHR;差異 +TP_LOCALLAB_MERTWE;除外 +TP_LOCALLAB_MERTWO;減算 +TP_LOCALLAB_METHOD_TOOLTIP;'強化 + 色ノイズ低減'を選ぶと処理時間が著しく増加します\nしかし、アーティファクトは軽減されます +TP_LOCALLAB_MLABEL;復元されたデータ 最小値=%1 最大値=%2 +TP_LOCALLAB_MLABEL_TOOLTIP;最低値を0、最大値を32768(対数モード)に近づける必要がありますが、必ずしも一致させる必要はありません。標準化のために、'ゲイン'と'オフセット'を調整します\nブレンドせずに画像を回復します +TP_LOCALLAB_MODE_EXPERT;高度 +TP_LOCALLAB_MODE_NORMAL;標準 +TP_LOCALLAB_MODE_SIMPLE;基本 +TP_LOCALLAB_MRFIV;背景 +TP_LOCALLAB_MRFOU;前のRT-スポット +TP_LOCALLAB_MRONE;なし +TP_LOCALLAB_MRTHR;オリジナルRT-スポット +TP_LOCALLAB_MULTIPL_TOOLTIP;トーンの幅が広い画像、-18EV~+4EV、を調整します: 最初のスライダーは-18EV~-6EVの非常に暗い部分に作用します。2つ目のスライダーは-6EV~+4EVの部分に作用します +TP_LOCALLAB_NEIGH;半径 +TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;値を低くすると詳細と質感が保たれます。高くするとノイズ除去が強まります。\nガンマが3.0の場合は輝度ノイズの除去には線形が使われます。 +TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;処理対象の大きさに対して適用するノイズ除去の量を調節するスライダーです。 +TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;値を高くするとノイズ除去が強まりますが、その分処理時間が増えます。 +TP_LOCALLAB_NLDENOISE_TOOLTIP;'ディテールの復元'はラプラス変換に作用します。詳細を含んだ部分より、むしろ均質な部分を目標にします。 +TP_LOCALLAB_NLDET;ディテールの復元 +TP_LOCALLAB_NLFRA;輝度のノンローカルミーンフィルタ +TP_LOCALLAB_NLFRAME_TOOLTIP;ノンローカルミーンフィルタによるノイズ除去は画像の全ピクセルの平均値を使い、その平均値との類似性に応じて、目標ピクセルのノイズ除去に重みを付けます。\nローカルミーンフィルタに比べ、詳細の損失が少なくて済みます。\n輝度ノイズだけを考慮します。色ノイズの除去はウェーブレットとフーリエ変換(DCT)を使う方がベターだからです。\nこのフィルタは単独でも、或いは”詳細レベルによる輝度ノイズの除去”と併用しても使えます。 +TP_LOCALLAB_NLGAM;ガンマ +TP_LOCALLAB_NLLUM;強さ +TP_LOCALLAB_NLPAT;パッチの最大値 +TP_LOCALLAB_NLRAD;半径の最大値 +TP_LOCALLAB_NOISECHROCOARSE;高い番手の色度(ウェーブレット) +TP_LOCALLAB_NOISECHROC_TOOLTIP;0より大きい値で効果の高いアルゴリズムが働き始めます\n大まかなスライダーの場合は2以上からです +TP_LOCALLAB_NOISECHRODETAIL;色度の詳細復元 +TP_LOCALLAB_NOISECHROFINE;低い番手の色度(ウェーブレット) +TP_LOCALLAB_NOISEGAM;ガンマ +TP_LOCALLAB_NOISEGAM_TOOLTIP;ガンマが1の時は、"Lab"の輝度が使われます。ガンマが3.0の時は"線形"の輝度が使われます\n低い値にするとディテールと質感が保たれます。高い値にするとノイズ除去が強まります。 +TP_LOCALLAB_NOISELEQUAL;イコライザ 白黒 +TP_LOCALLAB_NOISELUMCOARSE;高い番手の輝度(ウェーブレット) +TP_LOCALLAB_NOISELUMDETAIL;輝度の詳細復元 +TP_LOCALLAB_NOISELUMFINE;輝度 詳細レベル2(ウェーブレット) +TP_LOCALLAB_NOISELUMFINETWO;輝度 詳細レベル3(ウェーブレット) +TP_LOCALLAB_NOISELUMFINEZERO;輝度 詳細レベル1(ウェーブレット) +TP_LOCALLAB_NOISEMETH;ノイズ低減 +TP_LOCALLAB_NOISE_TOOLTIP;輝度ノイズを追加 +TP_LOCALLAB_NONENOISE;なし +TP_LOCALLAB_NUL_TOOLTIP;. +TP_LOCALLAB_OFFS;オフセット +TP_LOCALLAB_OFFSETWAV;オフセット +TP_LOCALLAB_OPACOL;不透明度 +TP_LOCALLAB_ORIGLC;元画像だけと融合 +TP_LOCALLAB_ORRETILAP_TOOLTIP;'スコープ'による変更の前に、ΔEを変更します。これにより画像の異なる部分(例えば背景)に対する作用に差を付けることが出来ます。 +TP_LOCALLAB_ORRETISTREN_TOOLTIP;1次ラプラシアンのしきい値に作用します。設定値を高くするほど、コントラストの違いが減少します +TP_LOCALLAB_PASTELS2;自然な彩度 +TP_LOCALLAB_PDE;PDE IPOL - ダイナミックレンジ圧縮 +TP_LOCALLAB_PDEFRA;コントラストの減衰 ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;RawtherapeeはPDE IPOLのアルゴリズムを採用しています : 異なる効果が期待できますが、メインの露光補正機能とは異なる設定が必要です。\n露出不足やハイダイナミックレンジの画像の補正に便利でしょう +TP_LOCALLAB_PREVHIDE;基本的な設定項目だけを表示 +TP_LOCALLAB_PREVIEW;ΔEのプレビュー +TP_LOCALLAB_PREVSHOW;全ての設定項目を表示 +TP_LOCALLAB_PROXI;ΔEの減衰 +TP_LOCALLAB_QUAAGRES;積極的 +TP_LOCALLAB_QUACONSER;控え目 +TP_LOCALLAB_QUALCURV_METHOD;カーブのタイプ +TP_LOCALLAB_QUAL_METHOD;全体の質 +TP_LOCALLAB_QUANONEALL;なし +TP_LOCALLAB_QUANONEWAV;ノンローカルミーンだけ +TP_LOCALLAB_RADIUS;半径 +TP_LOCALLAB_RADIUS_TOOLTIP;半径が30より大きい場合は、高速フーリエ変換を使います +TP_LOCALLAB_RADMASKCOL;スムーズな半径 +TP_LOCALLAB_RECOTHRES02_TOOLTIP;“回復のしきい値”が1より大きい場合は、“マスクと修正領域”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しますが、現在のツールで行われた調整(例、色と明るさや、ウェーブレット、CAM16、など)は考慮しません。\n“回復のしきい値”が1より小さい場合は、“マスクと修正領域”に付属するマスクは、その前に画像に対して行われた全ての調整を考慮しません。\n\nどちらの場合も、“回復のしきい値”は現在のツール(例、色と明るさや、ウェーブレット、CAM16、など)で調整されたマスクされた画像に作用します。 +TP_LOCALLAB_RECT;長方形 +TP_LOCALLAB_RECURS;基準値を繰り返し更新 +TP_LOCALLAB_RECURS_TOOLTIP;各機能の適用後に基準値を強制的に再計算させる機能です\nマスクを使った作業にも便利です +TP_LOCALLAB_REN_DIALOG_LAB;新しいコントロールスポットの名前を入力 +TP_LOCALLAB_REN_DIALOG_NAME;コントロールスポットの名前変更 +TP_LOCALLAB_REPARCOL_TOOLTIP;元画像に関する色と明るさの構成の相対的強さを調整出来るようにします。 +TP_LOCALLAB_REPARDEN_TOOLTIP;元画像に関するノイズ除去の構成の相対的強さを調整出来るようにします。 +TP_LOCALLAB_REPAREXP_TOOLTIP;元画像に関するダイナミックレンジと露光補正の構成の相対的強さを調整出来るようにします。 +TP_LOCALLAB_REPARSH_TOOLTIP;元画像に関するシャドウ/ハイライトとトーンイコライザの構成の相対的強さを調整出来るようにします。 +TP_LOCALLAB_REPARTM_TOOLTIP;元画像に関するトーンマッピングの構成の相対的強さを調整出来るようにします。 +TP_LOCALLAB_REPARW_TOOLTIP;元画像に関するローカルコントラストとウェーブレットの構成の相対的強さを調整出来るようにします。 +TP_LOCALLAB_RESID;残差画像 +TP_LOCALLAB_RESIDBLUR;残差画像をぼかす +TP_LOCALLAB_RESIDCHRO;残差画像の色度 +TP_LOCALLAB_RESIDCOMP;残差画像の圧縮 +TP_LOCALLAB_RESIDCONT;残差画像のコントラスト +TP_LOCALLAB_RESIDHI;ハイライト +TP_LOCALLAB_RESIDHITHR;ハイライトのしきい値 +TP_LOCALLAB_RESIDSHA;シャドウ +TP_LOCALLAB_RESIDSHATHR;シャドウのしきい値 +TP_LOCALLAB_RETI;霞除去 & レティネックス +TP_LOCALLAB_RETIFRA;レティネックス +TP_LOCALLAB_RETIFRAME_TOOLTIP;画像処理においてレティネックスは便利な機能です\nぼけた、霧かかった、或いは霞んだ画像を補正出来ます\nこういった画像は輝度に大きな違いがあるのが特徴です\n特殊効果を付けるためにも使えます(トーンマッピング) +TP_LOCALLAB_RETIM;独自のレティネックス +TP_LOCALLAB_RETITOOLFRA;レティネックス機能 +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;'明度=1'或いは'暗さ=2'の場合は効果がありません\n他の値の場合は、最終工程で'マルチスケールレティネックス'('ローカルコントラスト'の調整に似ています)が適用されます。'強さ'に関わる2つのスライダーでローカルコントラストのアップストリーの処理が調整されます +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;効果の最適化を図るため内部の変数を変えます\n'修復されたデータ'は最低値が0、最大値が32768(対数モード)に近いことが望ましいのですが、必ずしも一致させる必要はありません。 +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;対数モードを使うとコントラストが増えますが、ハロが発生することもあります +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;半径と分散(バリアンス)のスライダーは霞を調整します。前景或いは背景を目標にします +TP_LOCALLAB_RETI_SCALE_TOOLTIP;スケールが1の時は、レティネックスはローカルコントラストを調整した様な効果になります\nスケールの値を増やすと回帰作用が強化されますが、その分処理時間も増加します +TP_LOCALLAB_RET_TOOLNAME;霞除去 & レティネックス +TP_LOCALLAB_REWEI;再加重平均の繰り返し +TP_LOCALLAB_RGB;RGB トーンカーブ +TP_LOCALLAB_RGBCURVE_TOOLTIP;RGBモードには4つの選択肢があります:標準、加重平均、輝度とフィルム調 +TP_LOCALLAB_ROW_NVIS;非表示 +TP_LOCALLAB_ROW_VIS;表示 +TP_LOCALLAB_RSTPROTECT_TOOLTIP;レッドと肌色の保護は、彩度や色度、鮮やかさのスライダー調整に影響します。 +TP_LOCALLAB_SATUR;彩度 +TP_LOCALLAB_SATURV;彩度S +TP_LOCALLAB_SCALEGR;スケール +TP_LOCALLAB_SCALERETI;スケール +TP_LOCALLAB_SCALTM;スケール +TP_LOCALLAB_SCOPEMASK;スコープ(ΔE画像のマスク) +TP_LOCALLAB_SCOPEMASK_TOOLTIP;ΔE画像のマスクが有効の場合に使えます\n低い値にするほど、目標とする編集領域が変化してしまうことが避けられます +TP_LOCALLAB_SENSI;スコープ +TP_LOCALLAB_SENSIEXCLU;スコープ +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;除外される色を調整します +TP_LOCALLAB_SENSIMASK_TOOLTIP;共通なマスクに付属するスコープを調整します\n元画像とマスクの違いに対して作用します\nRT-スポットの中心の輝度、色度、色相の基準値を使います\n\nマスク自体のΔEを調整することも出来ます。'設定'の中の”スコープ(ΔE画像のマスク)”を使います。 +TP_LOCALLAB_SENSI_TOOLTIP;スコープの作用を加減します:\n小さい値を設定すると、色に対する作用はRT-スポットの中心部付近に限定されます\n高い値を設定すると、広範囲の色に作用が及びます +TP_LOCALLAB_SETTINGS;設定 +TP_LOCALLAB_SH1;シャドウ/ハイライト +TP_LOCALLAB_SH2;イコライザ +TP_LOCALLAB_SHADEX;シャドウ +TP_LOCALLAB_SHADEXCOMP;シャドウの圧縮 +TP_LOCALLAB_SHADHIGH;シャドウ/ハイライト & トーンイコライザ +TP_LOCALLAB_SHADHMASK_TOOLTIP;シャドウ/ハイライトのアルゴリズムと同じ要領で、マスクのハイライト部分を暗くします +TP_LOCALLAB_SHADMASK_TOOLTIP;シャドウ/ハイライトのアルゴリズムと同じ要領で、マスクのシャドウ部分を明るくします +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;シャドウとハイライトをシャドウ/ハイライトスライダー、或いはトーンイコライザで調整します。\n露光補正モジュールを、代わり、或いは一緒に使うことが出来ます。\n階調フィルタも使えます +TP_LOCALLAB_SHAMASKCOL;シャドウ +TP_LOCALLAB_SHAPETYPE;スポットの形状 +TP_LOCALLAB_SHAPE_TOOLTIP;デフォルト設定は”楕円形”です\n”長方形”は特定のケースに使います。 +TP_LOCALLAB_SHARAMOUNT;量 +TP_LOCALLAB_SHARBLUR;半径のぼかし +TP_LOCALLAB_SHARDAMPING;減衰 +TP_LOCALLAB_SHARFRAME;変更 +TP_LOCALLAB_SHARITER;繰り返し +TP_LOCALLAB_SHARP;シャープニング +TP_LOCALLAB_SHARP_TOOLNAME;シャープニング +TP_LOCALLAB_SHARRADIUS;半径 +TP_LOCALLAB_SHORTC;ショートカーブ'L'マスク +TP_LOCALLAB_SHORTCMASK_TOOLTIP;L(L)とL(H)2つのカーブをスキップします。\nマスクの作用によって調整された現在のイメージと元イメージを融合します\n但し、これが使えるのは2, 3, 4, 6, 7のマスクです +TP_LOCALLAB_SHOWC;マスクと修正領域 +TP_LOCALLAB_SHOWC1;ファイルの融合 +TP_LOCALLAB_SHOWCB;マスクと修正領域 +TP_LOCALLAB_SHOWDCT;フーリエの処理を表示 +TP_LOCALLAB_SHOWE;マスクと修正領域 +TP_LOCALLAB_SHOWFOURIER;フーリエ (DCT) +TP_LOCALLAB_SHOWLAPLACE;Δ ラプラシアン (一次) +TP_LOCALLAB_SHOWLC;マスクと修正領域 +TP_LOCALLAB_SHOWMASK;マスクの表示 +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;マスクと修正箇所の表示:\n注意:一度に一つの機能のマスクしか見ることが出来きません\n調整及び修正した画像:機能による調整とマスクによる修正の両方を含む画像を表示\n修正領域をマスクなしで表示:マスクを適用する前の修正領域を表示\n修正領域をマスクと共に表示:マスクを適用した修正領域を表示\nマスクの表示:カーブやフィルタの効果を含めたマスクの様子を表示します\nスポットの構造を表示:'スポットの構造'スライダー(機能水準が高度の場合)が有効になった時に、構造検出マスクを見ることが出来ます\n注意:形状検出のアルゴリズムが作用する前にマスクが適用されます +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;フーリエ変換による処理を段階的に見ることが出来ます\nラプラス - しきい値の関数としてラプラス変換の2次微分を計算仕します\nフーリエ - 離散コサイン変換(DCT)でラプラス変換を表示します\nポアソン - ポアソン方程式の解を表示します\n輝度の標準化なし - 輝度の標準化なしで結果を表示します +TP_LOCALLAB_SHOWMASKTYP1;ぼかし&ノイズ除去 +TP_LOCALLAB_SHOWMASKTYP2;ノイズ除去 +TP_LOCALLAB_SHOWMASKTYP3;ぼかし&ノイズ除去 + ノイズ除去 +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;‘マスクと修正領域’と併せて使うことが出来ます。\n‘ぼかしとノイズ’を選択した場合、マスクはノイズ除去には使えません。\n‘ノイズ除去を選択した場合、マスクは’ぼかしとノイズ‘には使えません。\n’ぼかしとノイズ + ノイズ除去‘を選択した場合は、マスクを共有することが出来ます。但し、この場合、’ぼかしとノイズ‘とノイズ除去のスコープスライダーが有効となるので、修正を行う際には’マスクと共に修正領域を表示‘のオプションを使うことを奨めます。 +TP_LOCALLAB_SHOWMNONE;調整及び修正した画像 +TP_LOCALLAB_SHOWMODIF;修正領域をマスクなしで表示 +TP_LOCALLAB_SHOWMODIF2;マスクの表示 +TP_LOCALLAB_SHOWMODIFMASK;修正領域をマスクと共に表示 +TP_LOCALLAB_SHOWNORMAL;輝度の標準化をしない +TP_LOCALLAB_SHOWPLUS;マスクと修正領域(ぼかし&ノイズ除去) +TP_LOCALLAB_SHOWPOISSON;ポアソン (pde f) +TP_LOCALLAB_SHOWR;マスクと修正領域 +TP_LOCALLAB_SHOWREF;ΔEのプレビュー +TP_LOCALLAB_SHOWS;マスクと修正領域 +TP_LOCALLAB_SHOWSTRUC;スポットの構造を表示 +TP_LOCALLAB_SHOWSTRUCEX;スポットの構造を表示 +TP_LOCALLAB_SHOWT;マスクと修正領域 +TP_LOCALLAB_SHOWVI;マスクと修正領域 +TP_LOCALLAB_SHRESFRA;シャドウ/ハイライト&TRC +TP_LOCALLAB_SHTRC_TOOLTIP;'作業プロファイル'をベースに(但し、それが提供されている場合のみ)、TRC(トーンレスポンスカーブ)を使って画像のトーンを調節します。\nガンマは主に明るいトーンに作用します\n勾配は主に暗いトーンに作用します +TP_LOCALLAB_SH_TOOLNAME;シャドウ/ハイライト & トーンイコライザ +TP_LOCALLAB_SIGFRA;シグモイドQと対数符号化Q +TP_LOCALLAB_SIGJZFRA;Jz シグモイド +TP_LOCALLAB_SIGMAWAV;減衰応答 +TP_LOCALLAB_SIGMOIDBL;ブレンド +TP_LOCALLAB_SIGMOIDLAMBDA;コントラスト +TP_LOCALLAB_SIGMOIDQJ;ブラックEvとホワイトEvを使う +TP_LOCALLAB_SIGMOIDTH;しきい値(グレーポイント) +TP_LOCALLAB_SIGMOID_TOOLTIP;'CIECAM'(或いは’Jz)と'シグモイド'関数を使って、トーンマッピングの様な効果を作ることが出来ます。\n3つのスライダーを使います: a) コントラストのスライダーはシグモイドの形状を変えることで強さを変えます。 b) しきい値(グレーポイント)のスライダーは、輝度に応じて作用を変えます。 c)ブレンドは画像の最終的なコントラストや輝度を変えます。 +TP_LOCALLAB_SLOMASKCOL;スロープ +TP_LOCALLAB_SLOMASK_TOOLTIP;ガンマとスロープを調整することで、不連続を避けるための“L”の漸進的修正により、アーティファクトの無いマスクの修正が出来ます +TP_LOCALLAB_SLOSH;スロープ +TP_LOCALLAB_SOFT;ソフトライト & 独自のレティネックス +TP_LOCALLAB_SOFTM;ソフトライト +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;独自のレティネックスは他のレティネックス方式とは大きく異なります\nグレーと輝度のバランスに作用します +TP_LOCALLAB_SOFTRADIUSCOL;ソフトな半径 +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;アーティファクトの発生を軽減するために出力画像にガイド付きフィルタを適用します +TP_LOCALLAB_SOFTRETI;ΔEアーティファクトの軽減 +TP_LOCALLAB_SOFT_TOOLNAME;ソフトライト & 独自のレティネックス +TP_LOCALLAB_SOURCE_ABS;絶対輝度 +TP_LOCALLAB_SOURCE_GRAY;平均輝度(Y%) +TP_LOCALLAB_SPECCASE;特有の設定 +TP_LOCALLAB_SPECIAL;RGBカーブの特殊な利用 +TP_LOCALLAB_SPECIAL_TOOLTIP;チェックボックスに✔を入れると、他の全ての作用が取り除かれます。例えば、“スコープ”, マスク, スライダーなどの作用(境界を除きます) が除かれRGBトーンカーブの効果だけが使われます +TP_LOCALLAB_SPOTNAME;新しいスポット +TP_LOCALLAB_STD;標準 +TP_LOCALLAB_STR;強さ +TP_LOCALLAB_STRBL;強さ +TP_LOCALLAB_STREN;圧縮の強さ +TP_LOCALLAB_STRENG;強さ +TP_LOCALLAB_STRENGR;強さ +TP_LOCALLAB_STRENGRID_TOOLTIP;望む効果は'強さ'で調整出来ますが、作用の範囲を制限する'スコープ'を使うことも出来ます。 +TP_LOCALLAB_STRENGTH;ノイズ +TP_LOCALLAB_STRGRID;強さ +TP_LOCALLAB_STRUC;構造 +TP_LOCALLAB_STRUCCOL;スポットの構造 +TP_LOCALLAB_STRUCCOL1;スポットの構造 +TP_LOCALLAB_STRUCT_TOOLTIP;形状検出に関する構造を考慮するSobelアルゴリズムを使います.\n'マスクと修正領域'を有効にして、マスクのプレビュー(変更なし)を見るために'スポットの構造を表示'を有効にします\n\nエッジ検出の精度を上げるため、構造マスク、ぼかしマスク、ローカルコントラスト(ウェーブレットのレベル)と共に使うことが出来ます\n\n明るさ、コントラスト、色度、露光補正、或いはマスクに関係しない機能を使った調整効果は、'調整及び修正した画像'、或いは'修正された領域をマスクと共に表示'で、見ることが出来ます +TP_LOCALLAB_STRUMASKCOL;構造マスクの強さ +TP_LOCALLAB_STRUMASK_TOOLTIP;“機能としての構造のマスク”オプションを無効のままで構造のマスク(スライダー)を使う:この場合、3つのカーブが活用されていなくても、構造を表示するマスクが生成されます。構造のマスクはマスク1(ぼかしとノイズ除去)とマスク7(色と明るさ)で使えます +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;このスライダーの調整は控えめに行うことを奨めます +TP_LOCALLAB_STYPE;スポットの変形方法 +TP_LOCALLAB_STYPE_TOOLTIP;2つのタイプから選びます:\nシンメトリックは左と右の境界線、上部と底部の境界線がリンクしています\n独立は全ての境界線を独立で動かすことが出来ます +TP_LOCALLAB_SYM;シンメトリック(マウス) +TP_LOCALLAB_SYMSL;シンメトリック(マウス + スライダー) +TP_LOCALLAB_TARGET_GRAY;平均輝度(Yb%) +TP_LOCALLAB_THRES;しきい値の構造 +TP_LOCALLAB_THRESDELTAE;ΔE-スコープのしきい値 +TP_LOCALLAB_THRESRETI;しきい値 +TP_LOCALLAB_THRESWAV;バランスのしきい値 +TP_LOCALLAB_TLABEL;TM 最小値=%1 最大値=%2 平均値=%3 標準偏差=%4 +TP_LOCALLAB_TLABEL_TOOLTIP;透過マップの結果\n最低値と最大値が分散(バリアンス)で使われます\n透過マップの最小値はTm=Min、最大値はTM=Maxで表示されます\nしきい値スライダーで結果を標準化します +TP_LOCALLAB_TM;トーンマッピング +TP_LOCALLAB_TM_MASK;透過マップを使う +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;このスライダーはエッジ感度に影響します\n値を大きくするとコントラストの変化が'エッジ'と認識されるようになります\n設定値が0の場合トーンマッピングの効果はアンシャープマスクの様な効果になります +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;ガンマのスライダーの動きで、トーンマッピングの効果が、シャドウ或いはハイライト部分にシフトします +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;時折、画像の印象が漫画風になることや、稀に柔らかい印象ながら幅の広いハロが出ることがあります\nこの場合、再加重の反復回数を増やすことで解決できることがあります +TP_LOCALLAB_TONEMAP_TOOLTIP;メインのトーンマッピング機能と同じです\nローカル編集のトーンマッピングを使用する際は、メインの機能を無効にする必要があります +TP_LOCALLAB_TONEMASCALE_TOOLTIP;このスライダーで'ローカルコントラスト'と'グローバルコントラスト'の境界を調整出来ます。\n値を大きくすると、強化する必要のあるディテールが大きくなります +TP_LOCALLAB_TONE_TOOLNAME;トーンマッピング +TP_LOCALLAB_TOOLCOL;機能としての構造マスク +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;マスクがあれば、それを修正することが出来ます +TP_LOCALLAB_TOOLMASK;マスクツール +TP_LOCALLAB_TOOLMASK_2;ウェーブレット +TP_LOCALLAB_TOOLMASK_TOOLTIP;'機能としての構造のマスク'のオプションを有効にして、構造マスク(スライダー)を使う:この場合、構造を表示するマスクは、1回以上2つのカーブ、L(L)或いはLC(H)が変更された後に生成されます\nここで、'構造マスク'は他のマスクの様な機能を果たします:ガンマ、スロープなど\n画像の構造に応じてマスクの作用を変えられます。このオプションは'ΔE画像のマスク'と付随する'スコープ(Δ”画像のマスク)'に敏感に作用します +TP_LOCALLAB_TRANSIT;境界の階調調整 +TP_LOCALLAB_TRANSITGRAD;XY軸方向の境界の差別 +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Y軸方向の作用の領域を変えることが出来ます +TP_LOCALLAB_TRANSITVALUE;境界値 +TP_LOCALLAB_TRANSITWEAK;境界値の減衰(線形~Log) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;境界値の減衰を調節 : 処理の滑らかさを変える - 1 線形 - 2 パラボリック - 3~25乗\n非常に低い境界値と併せれば、CBDL、ウェーブレット、色と明るさを使った不良部分の補正に使うことが出来ます。 +TP_LOCALLAB_TRANSIT_TOOLTIP;RT-スポットの中心円からフレームの間で作用が働く領域と作用が減衰する領域の境界を、中心円からフレームまでの%で調整します +TP_LOCALLAB_TRANSMISSIONGAIN;透過のゲイン +TP_LOCALLAB_TRANSMISSIONMAP;透過マップ +TP_LOCALLAB_TRANSMISSION_TOOLTIP;透過に応じて透過を決めるカーブです\n横軸はマイナス値(最小)から平均値、プラス値(最大)まであります\n\nこのカーブを使って透過を変え、アーティファクトを軽減できます +TP_LOCALLAB_USEMASK;ラプラス変換 +TP_LOCALLAB_VART;分散(コントラスト) +TP_LOCALLAB_VIBRANCE;自然な彩度 & ウォーム/クール +TP_LOCALLAB_VIBRA_TOOLTIP;自然な彩度を調整する機能です(基本的にはメインの自然な彩度と同じです)\nCIECAMのアルゴリズムを使ったホワイトバランス調整と同等の作用をします +TP_LOCALLAB_VIB_TOOLNAME;自然な彩度 - ウォーム/クール +TP_LOCALLAB_VIS_TOOLTIP;選択したコントロールスポットを表示・非表示するためにはクリックします\n全てのコントロールスポットを表示・非表示するためにはCtrlを押しながらクリックします +TP_LOCALLAB_WARM;ウォーム/クール & 偽色 +TP_LOCALLAB_WARM_TOOLTIP;このスライダーはCIECAMのアルゴリズムを使っていて、目標部分に暖か味を加える、或いは冷たい印象にするようなホワイトバランス調整を行います\n特定のケースでは色ノイズを減らす効果が期待できます +TP_LOCALLAB_WASDEN_TOOLTIP;輝度ノイズの低減:分岐線を含むカーブの左側部分は最初のディテールレベル、1、2、3(細かいディテール)に相当します。右側部分は大まかなディテールのレベル(3より上のレベル)に相当します。 +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;各レベルで作用のバランスをとります。 +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;デフォルトでは、ぼかしがL*a*b*の3つの構成要素全てに影響するように設定されています。\n輝度だけにぼかしを施したい場合は、ボックスに✔を入れます。 +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'色度の融合'は色度に対し目標とする効果を強化する際に使われます。 +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'輝度の融合'は輝度に対し目標とする効果を強化する際に使います。 +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'レベルの色度':輝度値の割合でLabの補色次元'a'と'b'を調整します。 +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;オフセットは低コントラストと高コントラストのディテールの間のバランスを変える機能です。\n高い値はコントラストの高いディテールのコントラスト変化を増幅します。低い値はコントラストの低いディテールのそれを増幅します。 +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;スライダーを左に動かすと、小さなディテールのレベルの効果が強調されます。右に動かすと、大きいレベルの効果が強調されます。 +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;残差画像はコントラストや色度などを調整した場合、元画像と同じ特性を示します。 +TP_LOCALLAB_WAT_GRADW_TOOLTIP;スライダーを右に動かすほど、形状検出のアルゴリズムの効果が強まり、ローカルコントラストの効果は目立たなくなります。 +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;X軸は右側ほどローカルコントラスト値が高いことを意味します。\nY軸はローカルコントラスト値の増減を意味します。 +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;元のコントラストの強さをベースにウェーブレットのレベルでローカルコントラストの配分を調整することが出来ます。画像の遠近感を変えてレリーフの効果を出したり、元々コントラストが非常に低いシャドウ部分などでローカルコントラストを下げてディテールが目立たないようにします。 +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'元画像だけと融合'を選択すると、'ウェーブレットピラミッド'の設定は'明瞭'や'シャープマスク'に影響しません。 +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;残差画像、各詳細レベルにぼかしをかけます。 +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;コントラストを増減するために残差画像を圧縮します。 +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;ローカルコントラストの調整効果は、中間コントラストのディテールに対し強く、低/高コントラストのディテールに対しては弱い働きになります。\nこのスライダーは、低/高、両極のコントラストに向かって調整効果が減衰する範囲を調整します。\nスライダーの値を高くすると、ローカルコントラストの調整効果が100%及ぶコントラスト値の範囲が広がりますが、その分アーティファクトが発生するリスクも高まります。\n値を低くすると、調整効果を受けるコントラストの範囲が狭まり、調整がピンポイントになります。 +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;エッジ検出の効果を強化します +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;設定した階調と角度に応じて、ローカルコントラストが変わるようにします。輝度値ではなく、輝度値の差を考慮します。 +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;”ウェーブレットのレベル”で使われるレベルの範囲を設定します。 +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;分解した各レベルにぼかしをかけることが出来ます。\n X軸は左から右に向って、大きなディテールのレベルを表しています。 +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;'詳細レベルによるコントラスト調整'に似ています。X軸は左から右に向って、大きなディテールのレベルを表しています。 +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;画像の輝度をベースにして、3方向(水平、垂直、斜め)のコントラストバランスに作用します。\nデフォルトでは、アーティファクトの発生を避けるため、シャドウ、或いはハイライト部分への効果は減らしてあります。 +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;’エッジのシャープネス’の機能全てを表示します。RawPediaのウェーブレットのレベルが参考になります。 +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;レベルに対するぼかしの効果を最大にします。 +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;X軸は右側ほどローカルコントラスト値が高いことを意味します。\nY軸はローカルコントラスト値の増減を意味します。 +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;各レベルの圧縮カーブを中央より下げる(マイナス)とトーンマッピングのような効果になります。\n中央より上では(プラス)、レベルのコントラストが減衰します。\nX軸は左から右に向って、大きなディテールのレベルを表しています。 +TP_LOCALLAB_WAV;ローカルコントラスト +TP_LOCALLAB_WAVBLUR_TOOLTIP;分解された各レベル、及び残差画像にぼかしをかけます +TP_LOCALLAB_WAVCOMP;ウェーブレットのレベルによる圧縮 +TP_LOCALLAB_WAVCOMPRE;ウェーブレットのレベルによる圧縮 +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;トーンマッピングを適用する、或いは各レベルのローカルコントラストを減らすことが出来ます。\nX軸は左から右に向って、大きなディテールのレベルを表しています。 +TP_LOCALLAB_WAVCOMP_TOOLTIP;ウェーブレット分解の方向(水平、垂直、斜め)をベースにローカルコントラストを適用します。 +TP_LOCALLAB_WAVCON;ウェーブレットのレベルによるコントラスト調整 +TP_LOCALLAB_WAVCONTF_TOOLTIP;”詳細レベルによるコントラスト調整”に似ています。X軸の右側ほど大きいディテールのレベルを意味します。 +TP_LOCALLAB_WAVDEN;輝度ノイズ除去 +TP_LOCALLAB_WAVE;ウェーブレット +TP_LOCALLAB_WAVEDG;ローカルコントラスト +TP_LOCALLAB_WAVEEDG_TOOLTIP;エッジに対するローカルコントラストの作用に着目してシャープネスを改善します。メインのウェーブレットのレベルに備わっている機能と同じで、同じ設定が使えます。 +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;’ローカルコントラスト’で使うウェーブレットのレベルの範囲 +TP_LOCALLAB_WAVGRAD_TOOLTIP;設定した階調と角度に応じて、ローカルコントラストが変わるようにします。輝度値ではなく、輝度値の差を考慮しています。 +TP_LOCALLAB_WAVHUE_TOOLTIP;色相に基づいてノイズ除去の強弱を加減できます。 +TP_LOCALLAB_WAVLEV;ウェーブレットのレベルによるぼかし +TP_LOCALLAB_WAVMASK;ローカルコントラスト +TP_LOCALLAB_WAVMASK_TOOLTIP;マスクのローカルコントラストを変えるためにウェーブレットを使い、構造(肌、建物など)を強化したり弱めたりします +TP_LOCALLAB_WEDIANHI;メディアン 高 +TP_LOCALLAB_WHITE_EV;ホワイトEv +TP_LOCALLAB_ZCAMFRA;ZCAMによる画像の調整 +TP_LOCALLAB_ZCAMTHRES;高い値の回復 +TP_LOCAL_HEIGHT;ボトム +TP_LOCAL_HEIGHT_T;トップ +TP_LOCAL_WIDTH;右 +TP_LOCAL_WIDTH_L;左 +TP_LOCRETI_METHOD_TOOLTIP;低 = 暗い部分を補強します\n均一 = 暗い部分、明るい部分を均等に処理します\n高 = 非常に明るい部分を補強します TP_METADATA_EDIT;変更を適用 TP_METADATA_MODE;メタデータ コピーモード TP_METADATA_STRIP;メタデータを全て取り除く @@ -1811,8 +3438,29 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;形状: 0=長方形、50=楕円形、100=円 TP_PCVIGNETTE_STRENGTH;強さ TP_PCVIGNETTE_STRENGTH_TOOLTIP;終点位置でのフィルターの強さ(四隅) TP_PDSHARPENING_LABEL;キャプチャーシャープニング +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;クロップ・ファクター +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;焦点距離 +TP_PERSPECTIVE_CAMERA_FRAME;補正 +TP_PERSPECTIVE_CAMERA_PITCH;垂直 +TP_PERSPECTIVE_CAMERA_ROLL;回転 +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;水平移動 +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;垂直移動 +TP_PERSPECTIVE_CAMERA_YAW;水平 +TP_PERSPECTIVE_CONTROL_LINES;制御ライン +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+ドラッグ: 新しいラインを引く\n右クリック: ラインを削除 +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;最低2本の水平な、或いは垂直なコントロールラインが必要です。 TP_PERSPECTIVE_HORIZONTAL;水平 -TP_PERSPECTIVE_LABEL;パースペクティブ +TP_PERSPECTIVE_LABEL;遠近感の歪み +TP_PERSPECTIVE_METHOD;方式 +TP_PERSPECTIVE_METHOD_CAMERA_BASED;カメラベース +TP_PERSPECTIVE_METHOD_SIMPLE;シンプル +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;補正後の調整 +TP_PERSPECTIVE_PROJECTION_PITCH;垂直 +TP_PERSPECTIVE_PROJECTION_ROTATE;回転 +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;水平移動 +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;垂直移動 +TP_PERSPECTIVE_PROJECTION_YAW;水平 +TP_PERSPECTIVE_RECOVERY_FRAME;回復 TP_PERSPECTIVE_VERTICAL;垂直 TP_PFCURVE_CURVEEDITOR_CH;色相 TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;デフリンジの強さをコントロールします。値が高いと効果が強まり、低いと弱まります @@ -1830,11 +3478,15 @@ TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;PDAFの場合は水平方向だ TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;垂直方向 TP_PREPROCESS_NO_FOUND;未検出 TP_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ +TP_PREPROCWB_LABEL;ホワイトバランスの前処理 +TP_PREPROCWB_MODE;モード +TP_PREPROCWB_MODE_AUTO;自動 +TP_PREPROCWB_MODE_CAMERA;カメラ TP_PRSHARPENING_LABEL;リサイズ後のシャープニング TP_PRSHARPENING_TOOLTIP;リサイズ後の画像をシャープニングします。但し、リサイズの方式がランチョスの場合に限ります。プレビュー画面でこの機能の効果を見ることは出来ません。使用法に関してはRawPediaを参照して下さい。 TP_RAWCACORR_AUTO;自動補正 TP_RAWCACORR_AUTOIT;繰り返し -TP_RAWCACORR_AUTOIT_TOOLTIP;”自動補正”が有効になっている場合にこの設定が可能です。\n自動補正の作用は控えめなため、全ての色収差が常に補正されるとは限りません。\n残りの色収差を補正するためには、自動色収差補正の繰り返しを最大5回行います。\n繰り返すたびに、直前の繰り返しで残った色収差を軽減しますが、その分処理時間は増えます。 +TP_RAWCACORR_AUTOIT_TOOLTIP;'自動補正'が有効になっている場合にこの設定が可能です。\n自動補正の作用は控えめなため、全ての色収差が常に補正されるとは限りません。\n残りの色収差を補正するためには、自動色収差補正の繰り返しを最大5回行います。\n繰り返すたびに、直前の繰り返しで残った色収差を軽減しますが、その分処理時間は増えます。 TP_RAWCACORR_AVOIDCOLORSHIFT;色ずれを回避 TP_RAWCACORR_CABLUE;ブルー TP_RAWCACORR_CARED;レッド @@ -1855,9 +3507,11 @@ TP_RAW_3PASSBEST;3-Pass (Markesteijn) TP_RAW_4PASS;3-パス+fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+バイリニア補間 TP_RAW_AMAZEVNG4;AMaZE+VNG4 TP_RAW_BORDER;境界 TP_RAW_DCB;DCB +TP_RAW_DCBBILINEAR;DCB+バイリニア補間 TP_RAW_DCBENHANCE;DCB 拡張処理 TP_RAW_DCBITERATIONS;DCB 反復の数 TP_RAW_DCBVNG4;DCB+VNG4 @@ -1885,33 +3539,36 @@ TP_RAW_LMMSE_TOOLTIP;ガンマ追加 (step 1) - メディアン追加 (step 2,3, TP_RAW_MONO;Mono TP_RAW_NONE;なし (センサーのパターンを表示) TP_RAW_PIXELSHIFT;ピクセルシフト -TP_RAW_PIXELSHIFTBLUR;振れマスクのぼかし -TP_RAW_PIXELSHIFTDMETHOD;振れに対するデモザイクの方式 -TP_RAW_PIXELSHIFTEPERISO;ISOの適合 +TP_RAW_PIXELSHIFTAVERAGE;動体部分に平均を使う +TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;ブレのある部分の特定のフレームを使う代わりに、全てのフレームの平均を使う\nブレの少ない(オーバーラップ)対象にブレの効果を施す +TP_RAW_PIXELSHIFTBLUR;動体マスクのぼかし +TP_RAW_PIXELSHIFTDMETHOD;動体に対するデモザイクの方式 +TP_RAW_PIXELSHIFTEPERISO;感度 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_PIXELSHIFTMEDIAN;振れのある領域にはメディアンを使用 -TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;振れのある領域に関しては、選択した画像ではなく全ての構成画像にメディアンを使います。\n全ての構成画像で異なる位置にある被写体は除きます。\n動きの遅い被写体(オーバーラッピング)には振れの効果が出ます。 +TP_RAW_PIXELSHIFTGREEN;動体のグリーンチャンネルを確認 +TP_RAW_PIXELSHIFTHOLEFILL;動体のマスクのギャップを埋める +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;動体マスクのギャップ埋めて大きい領域全体がデモザイクされるようにします +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_PIXELSHIFTNONGREENCROSS;振れに関するレッド/ブルーのチャンネルを確認 -TP_RAW_PIXELSHIFTSHOWMOTION;振れマスクを含めて表示 -TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;振れマスクだけを表示 -TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;画像全体ではなく振れマスクだけを表示します。 -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;振れのある画像部分をグリーンマスクを被せて表示します。 +TP_RAW_PIXELSHIFTMOTIONMETHOD;動体補正 +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_PIXELSHIFTSMOOTH_TOOLTIP;これは動体部分とそうでない部分の境を滑らかに補正するものです。\n0に設定すると機能の働きはありません。\n1に設定すると、選択された構成画像にAMaZEかLMMSEが使われた結果が得られます("LMMSEを使う"というオプション次第)、或いは"メディアンを使う"が選択されていれば全ての構成画像にメディアンが使われます。 TP_RAW_RCD;RCD +TP_RAW_RCDBILINEAR;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の違いは殆どありません、処理速度は前者の方が速いです。 @@ -1928,14 +3585,18 @@ TP_RESIZE_H;高さ: TP_RESIZE_HEIGHT;高さ TP_RESIZE_LABEL;リサイズ TP_RESIZE_LANCZOS;ランチョス +TP_RESIZE_LE;ロングエッジ: +TP_RESIZE_LONG;ロングエッジ TP_RESIZE_METHOD;方式: TP_RESIZE_NEAREST;ニアレスト TP_RESIZE_SCALE;スケール +TP_RESIZE_SE;ショートエッジ: +TP_RESIZE_SHORT;ショートエッジ TP_RESIZE_SPECIFY;条件指定: TP_RESIZE_W;幅: TP_RESIZE_WIDTH;幅 -TP_RETINEX_CONTEDIT_HSL;ヒストグラムイコライザ HSL -TP_RETINEX_CONTEDIT_LAB;ヒストグラムイコライザ L*a*b* +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(輝度) @@ -1947,8 +3608,8 @@ TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;このカーブは単独で使うことも、 TP_RETINEX_EQUAL;イコライザ TP_RETINEX_FREEGAMMA;フリーガンマ TP_RETINEX_GAIN;ゲイン -TP_RETINEX_GAINOFFS;ゲインとオフセット(明るさ) -TP_RETINEX_GAINTRANSMISSION;ゲインの透過 +TP_RETINEX_GAINOFFS;透過マップのゲインとオフセット +TP_RETINEX_GAINTRANSMISSION;ゲイン TP_RETINEX_GAINTRANSMISSION_TOOLTIP;目標とする輝度を得るために、透過マップ増幅したり減衰させたりします。\n横軸:左から最小、平均、最大となります。\n縦軸:ゲイン TP_RETINEX_GAMMA;ガンマ TP_RETINEX_GAMMA_FREE;フリー @@ -1957,8 +3618,8 @@ 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_GRAD;透過マップの勾配 +TP_RETINEX_GRADS;強さの勾配 TP_RETINEX_GRADS_TOOLTIP;スライダー値が0の場合、全ての繰り返しは同じになります\n0より大きい場合は、繰り返しが増加すると強さが減ります。0より小さい場合はその逆です TP_RETINEX_GRAD_TOOLTIP;スライダー値が0の場合、全ての繰り返しが同じになります\n0より大きい場合は、繰り返しが増加すると差異としきい値が減ります。0より小さい場合はその逆です TP_RETINEX_HIGH;高 @@ -1978,28 +3639,28 @@ 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_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_METHOD_TOOLTIP;高=光度の高い部分のレンダリングを補正します\n均等=光度の高い部分と低い部分を均等に補正します\n低=光度の低い部分を重点的に補正します\nハイライト=ハイライト部分のマゼンタ被りを補正します TP_RETINEX_MLABEL;霞のない画像に修復 最小値=%1 最大値=%2 -TP_RETINEX_MLABEL_TOOLTIP;最小値=0 最大値=32768に近づける\nバランスの良い霞のない画像 +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_NEUTRAL_TOOLTIP;全てのスライダー値とカーブをデフォルトの状態に戻します +TP_RETINEX_OFFSET;オフセット +TP_RETINEX_SCALES;ガウスフィルタの勾配 TP_RETINEX_SCALES_TOOLTIP;スライダー値が0の場合、同一の作業を繰り返します\n0より大きい値を設定すると、繰り返し作業を増やした時に、スケールと隣接するピクセルに対する作用は減ります。0より小さい場合は、その逆です TP_RETINEX_SETTINGS;設定 TP_RETINEX_SKAL;スケール -TP_RETINEX_SLOPE;フリーなガンマの勾配 +TP_RETINEX_SLOPE;フリーガンマの勾配 TP_RETINEX_STRENGTH;強さ TP_RETINEX_THRESHOLD;しきい値 -TP_RETINEX_THRESHOLD_TOOLTIP;インとアウトの制限を意味します\nイン=原画像\nアウト=ガウス暈しを施した原画像 +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_TLABEL_TOOLTIP;透過マップの結果\n最低値と最大値が分散(バリアンス)で使われます\n透過マップの最小値はTm=Min、最大値はTM=Maxで表示されます\nしきい値スライダーで結果を標準化します TP_RETINEX_TRANF;透過 TP_RETINEX_TRANSMISSION;透過マップ TP_RETINEX_TRANSMISSION_TOOLTIP;透過に応じて透過を調整します\n横軸:左からマイナス値(最小を含む)、平均、プラス値(最大を含む)\n縦軸:増幅或いは減衰 @@ -2023,12 +3684,12 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;角度 TP_ROTATE_LABEL;回転 TP_ROTATE_SELECTLINE;直線選択・角度補正ツール -TP_SAVEDIALOG_OK_TIP;ショートカット Ctrl-Enter -TP_SHADOWSHLIGHTS_HIGHLIGHTS;ハイライトを暗く +TP_SAVEDIALOG_OK_TOOLTIP;ショートカット Ctrl-Enter +TP_SHADOWSHLIGHTS_HIGHLIGHTS;ハイライト TP_SHADOWSHLIGHTS_HLTONALW;ハイライトトーンの幅 TP_SHADOWSHLIGHTS_LABEL;シャドウ/ハイライト TP_SHADOWSHLIGHTS_RADIUS;半径 -TP_SHADOWSHLIGHTS_SHADOWS;シャドウを明るく +TP_SHADOWSHLIGHTS_SHADOWS;シャドウ TP_SHADOWSHLIGHTS_SHTONALW;シャドウトーンの幅 TP_SHARPENEDGE_AMOUNT;適用量 TP_SHARPENEDGE_LABEL;エッジ @@ -2060,6 +3721,11 @@ TP_SHARPENMICRO_MATRIX;3×3マトリクスの代わりに 5×5 TP_SHARPENMICRO_UNIFORMITY;均等 TP_SOFTLIGHT_LABEL;ソフトライト TP_SOFTLIGHT_STRENGTH;強さ +TP_SPOT_COUNTLABEL;%1 ポイント +TP_SPOT_DEFAULT_SIZE;初期のスポットサイズ +TP_SPOT_ENTRYCHANGED;変更されたポイント +TP_SPOT_HINT;この機能をプレビュー領域で実行可能にするためにはこのボタンを押します。\n\n スポットを編集するには、白いマークを編集したい領域に持って行くと編集用の図が表示されます。\n\n スポットを追加するには、コントロールキーを押しながらマウスを左クリックし、マスクの元にする画像の部分まで表示されている円をドラッグして(この時点でコントロールキーを離しても構いません)、マウスをリリースします。\n\n元となる画像部分や修正したい画像部分を動かすには、マウスのカーソルを円内に置いてドラッグします。\n\n内側の円(マスクの効果が最大に働く部分)と外側の円(フェザー処理が働く部分)の大きさは変えることが出来ます(カーソルを円の淵に持って行くとオレンジになり、ドラッグするとレッドに変わります)。\n\n 修正が終わったら、円の外側でマウスを右クリックする、或いは編集ボタンを再度押すと編集モードが終了します。 +TP_SPOT_LABEL;スポット除去 TP_TM_FATTAL_AMOUNT;量 TP_TM_FATTAL_ANCHOR;アンカー TP_TM_FATTAL_LABEL;ダイナミックレンジ圧縮 @@ -2104,39 +3770,58 @@ TP_WAVELET_B1;グレー TP_WAVELET_B2;残差 TP_WAVELET_BACKGROUND;背景 TP_WAVELET_BACUR;カーブ -TP_WAVELET_BALANCE;コントラストバランス 斜め/垂直-水平 -TP_WAVELET_BALANCE_TOOLTIP;ウェーブレットの方向で垂直-水平と斜めのバランスを変えます\nコントラスト、色度、或いは残差画像のトーンマッピングが有効の場合、バランスにより効果が増幅されます +TP_WAVELET_BALANCE;方向別コントラストバランス 斜めと垂直・水平 +TP_WAVELET_BALANCE_TOOLTIP;ウェーブレットの解析方向(垂直・水平と斜め)のバランスを変えます\nコントラスト、色度、或いは残差画像のトーンマッピングが有効の場合、バランスにより効果が増幅されます TP_WAVELET_BALCHRO;色度のバランス +TP_WAVELET_BALCHROM;イコライザ 色 TP_WAVELET_BALCHRO_TOOLTIP;有効にすると、’コントラストバランス’のカーブやスライダーも色度のバランスに影響します +TP_WAVELET_BALLUM;輝度ノイズ除去のイコライザ TP_WAVELET_BANONE;なし TP_WAVELET_BASLI;スライダー -TP_WAVELET_BATYPE;バランス方式 -TP_WAVELET_CBENAB;カラートーンとカラーバランス -TP_WAVELET_CB_TOOLTIP;高い値は、’カラートーン’と併用するか、或いはカラートーンは使わないで単独で使います。\n低い値の場合は前景の色合いを変えずに背景(sky, ...) のホワイトバランスを変えるような効果を得られます。一般的にはコントラストが高くなる印象があります。 +TP_WAVELET_BATYPE;調整方法 +TP_WAVELET_BL;レベルのぼかし +TP_WAVELET_BLCURVE;レベルごとのぼかし +TP_WAVELET_BLURFRAME;ぼかし +TP_WAVELET_BLUWAV;減衰応答 +TP_WAVELET_CBENAB;色調とカラーバランス +TP_WAVELET_CB_TOOLTIP;高い値は特殊な効果を生みます。色度のモジュールを使った特殊効果と似ています。但し、作用は残差画像にだけ及ぶものです。\n控え目な調整値は、手動でホワイトバランスを変えるような効果になります。 TP_WAVELET_CCURVE;ローカルコントラスト TP_WAVELET_CH1;全ての色 TP_WAVELET_CH2;明清色 - 純色 TP_WAVELET_CH3;コントラストのレベルとリンク TP_WAVELET_CHCU;カーブ TP_WAVELET_CHR;色度とコントラストのリンクの強さ -TP_WAVELET_CHRO;純色 - 明清色のしきい値 +TP_WAVELET_CHRO;純色/明清色を調整するレベルのしきい値 +TP_WAVELET_CHROFRAME;色ノイズの除去 +TP_WAVELET_CHROMAFRAME;色度 +TP_WAVELET_CHROMCO;番手の高いレベルの色度 +TP_WAVELET_CHROMFI;番手の低いレベルの色度 TP_WAVELET_CHRO_TOOLTIP;どのレベルで明清色と純色を調整するか決めます\n1-x:純色を調整するレベルの範囲\nx-9:明清色を調整するレベルの範囲\n\n但し、値がレベルの総数より多い場合は機能が無効となります -TP_WAVELET_CHR_TOOLTIP;色度を”コントラストレベル”と”色度とコントラストのリンクの強さ”の相関関係で調整します +TP_WAVELET_CHRWAV;色度のぼかし +TP_WAVELET_CHR_TOOLTIP;色度を'コントラストレベル'と'色度とコントラストのリンクの強さ'に応じて調整します TP_WAVELET_CHSL;スライダー TP_WAVELET_CHTYPE;調整の方法 +TP_WAVELET_CLA;明瞭 +TP_WAVELET_CLARI;シャープマスクと明瞭 TP_WAVELET_COLORT;レッド/グリーンの不透明度 TP_WAVELET_COMPCONT;コントラスト +TP_WAVELET_COMPEXPERT;高度 TP_WAVELET_COMPGAMMA;ガンマの圧縮 TP_WAVELET_COMPGAMMA_TOOLTIP;残差画像のガンマを調整することで、画像データとヒストグラムの均衡を図ります。 +TP_WAVELET_COMPLEXLAB;機能水準 +TP_WAVELET_COMPLEX_TOOLTIP;標準: 殆どの処理操作に関する適当な機能のセットを減らして表示します\n高度: 高度な処理操作にに必要な機能を全て表示します +TP_WAVELET_COMPNORMAL;標準 TP_WAVELET_COMPTM;トーンマッピング TP_WAVELET_CONTEDIT;'後の' コントラストカーブ +TP_WAVELET_CONTFRAME;コントラスト - 圧縮 TP_WAVELET_CONTR;色域 TP_WAVELET_CONTRA;コントラスト TP_WAVELET_CONTRAST_MINUS;コントラスト - TP_WAVELET_CONTRAST_PLUS;コントラスト + TP_WAVELET_CONTRA_TOOLTIP;残差画像のコントラストを変えます TP_WAVELET_CTYPE;色の制御 -TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;元画像のローカルコントラストに応じてローカルコントラストを調節します\n横軸の低い部分は細かいローカルコントラストを表しています(実質値10~20)\n50%はローカルコントラストの平均(実質値100~300)を表しています\n66%はローカルコントラストの標準偏差(実質値300~800)を表しています\n100%はローカルコントラストの最大値を表しています(実質値3000~8000) +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;拡大率が概ね300%より大きくなると無効になります +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;元画像のローカルコントラスト(横軸)に応じてローカルコントラストを調節します\n横軸の低い部分は小さいディテールのローカルコントラストを表しています(実質値10~20)\n50%はローカルコントラストの平均(実質値100~300)を表しています\n66%はローカルコントラストの標準偏差(実質値300~800)を表しています\n100%はローカルコントラストの最大値を表しています(実質値3000~8000) TP_WAVELET_CURVEEDITOR_CH;コントラストレベル=f(色相) TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;色相に応じて各レベルのコントラストを調節します\n色域抑制のカーブ調整と重複しないように注意します\nウェーブレットのコントラストレベルスライダー値が0の場合は効果はありません TP_WAVELET_CURVEEDITOR_CL;L @@ -2150,108 +3835,178 @@ TP_WAVELET_DAUB4;D4 - 標準 TP_WAVELET_DAUB6;D6 - 標準プラス TP_WAVELET_DAUB10;D10 - やや高い TP_WAVELET_DAUB14;D14 - 高い -TP_WAVELET_DAUB_TOOLTIP;ドブシー関数の係数を変更します\nD4=標準的なエッジ検出の効果\nD14=通常はエッジ検出の効果が高いが、処理時間が約10%増加\n\n初めのレベルの質だけでなくエッジ検出にも影響します。但し、レベル質は厳格に係数の種類に比例している訳ではありません。画像や使い方にも影響されます。 +TP_WAVELET_DAUBLOCAL;ウェーブレット エッジ検出の効果 +TP_WAVELET_DAUB_TOOLTIP;ドブシー関数の係数を変更します:\nD4=標準\nD4=標準的なエッジ検出の効果\nD14=通常はエッジ検出の効果が最も高くなりますが、処理時間も約10%増加します\n\n番手の低いレベルの質だけでなくエッジ検出にも影響します。但し、レベル質は厳格に係数の種類に比例している訳ではありません。画像や使い方にも影響されます。 +TP_WAVELET_DEN5THR;ガイド付きしきい値 +TP_WAVELET_DENCURV;カーブ +TP_WAVELET_DENL;補正の構造 +TP_WAVELET_DENLH;レベル1~4のガイド付きしきい値 +TP_WAVELET_DENLOCAL_TOOLTIP;ローカルコントラストに応じてノイズ除去を行うためにカーブを使います\nノイズが除去される領域は構造が保たれます。 +TP_WAVELET_DENMIX_TOOLTIP;ローカルコントラストの基準値はガイド付きフィルタで使われます。\n画像次第で、ノイズのレベル計測がノイズ除去処理の前か後になるかで結果が変わります。これら4つの選択の中から、元画像と修正(ノイズ除去)画像の間で最も妥協できるものを選びます。 +TP_WAVELET_DENOISE;ローカルコントラストをベースにしたガイド付きカーブ +TP_WAVELET_DENOISEGUID;色相をベースにしたガイド付きしきい値 +TP_WAVELET_DENOISEH;番手の高いレベルのカーブ ローカルコントラスト +TP_WAVELET_DENOISEHUE;ノイズ除去 色相イコライザ +TP_WAVELET_DENQUA;モード +TP_WAVELET_DENSIGMA_TOOLTIP;ガイドの形状に順応します +TP_WAVELET_DENSLI;スライダー +TP_WAVELET_DENSLILAB;方式 +TP_WAVELET_DENWAVGUID_TOOLTIP;ガイド付きフィルタの作用を加減するのに色相を使います +TP_WAVELET_DENWAVHUE_TOOLTIP;色に応じてノイズ除去を加減します +TP_WAVELET_DETEND;ディテール +TP_WAVELET_DIRFRAME;方向のバランスによるコントラスト調整 TP_WAVELET_DONE;垂直 TP_WAVELET_DTHR;対角線 TP_WAVELET_DTWO;水平 -TP_WAVELET_EDCU;カーブ +TP_WAVELET_EDCU;非対称正規分布 +TP_WAVELET_EDEFFECT;減衰応答 +TP_WAVELET_EDEFFECT_TOOLTIP;このスライダーは機能の最大効果を受けるコントラスト値の範囲を調整するものです。最大値(2.5)を設定すると機能の効果が無効となります。 TP_WAVELET_EDGCONT;ローカルコントラスト -TP_WAVELET_EDGCONT_TOOLTIP;スライダーを左に動かすとコントラストが減り、右に動かすと増えます\n底部の左、天井部の左、底部の右、天井部の右は、それぞれ低いコントラスト、平均的コントラスト、平均+1標準偏差のコントラスト、最も高いコントラストを示しています +TP_WAVELET_EDGCONT_TOOLTIP;スライダーを左に動かすとコントラストが減り、右に動かすと増えます\n底部の左、天井部の左、底部の右、天井部の右は、それぞれ低いコントラスト、平均的コントラスト、平均+1標準偏差のコントラスト、最も高いコントラストを代表しています TP_WAVELET_EDGE;エッジのシャープネス TP_WAVELET_EDGEAMPLI;基底値の増幅 TP_WAVELET_EDGEDETECT;グラデーション感度 TP_WAVELET_EDGEDETECTTHR;しきい値 低(ノイズ) -TP_WAVELET_EDGEDETECTTHR2;しきい値 高(エッジ検出) +TP_WAVELET_EDGEDETECTTHR2;しきい値 高(エッジ検出の強化) TP_WAVELET_EDGEDETECTTHR_TOOLTIP;しきい値を変えることで、エッジ検出の目標を調整します。例えば、青空の中のノイズが先鋭化しないようにします。 -TP_WAVELET_EDGEDETECT_TOOLTIP;スライダーを右に動かすと、エッジ検出の感度が上がります。これはローカルコントラスト、しきい値 高、しきい値 低にも影響します +TP_WAVELET_EDGEDETECT_TOOLTIP;スライダーを右に動かすと、エッジ検出の感度が上がります。これはローカルコントラスト、エッジ検出の設定、ノイズに影響します。 TP_WAVELET_EDGESENSI;エッジ検出の感度 TP_WAVELET_EDGREINF_TOOLTIP;最初のレベルに対する作用を強めたり、弱めたりし、次のレベルに対してはその逆を行います、他のレベルは変わりません TP_WAVELET_EDGTHRESH;ディテール -TP_WAVELET_EDGTHRESH_TOOLTIP;低いレベルと他のレベルの区分を変更します。しきい値を高くするほど、低いレベルに作用の重点が置かれます。注意:マイナス値の設定は高いレベルに重点が置かれ、アーティファクトが発生することがあります。 +TP_WAVELET_EDGTHRESH_TOOLTIP;番手の低いレベルと他のレベルの区分を変更します。しきい値を高くするほど、番手の低いレベルに作用の重点が置かれます。注意:マイナス値の設定は高いレベルに重点が置かれ、アーティファクトが発生することがあります。 TP_WAVELET_EDRAD;半径 -TP_WAVELET_EDRAD_TOOLTIP;この機能の半径は、他のシャープニング機能の半径とは大きく異なります。複雑な関数を使って各レベルの値を比較します。そのため、半径がゼロでも何らかの効果があります -TP_WAVELET_EDSL;しきい値スライダー -TP_WAVELET_EDTYPE;ローカルコントラストの方式 +TP_WAVELET_EDRAD_TOOLTIP;この機能の半径は、他のシャープニング機能の半径とは大きく異なります。複雑な関数を使って各レベルの値を比較します。そのため、半径がゼロでも何らかの効果が出ます +TP_WAVELET_EDSL;しきい値カーブ +TP_WAVELET_EDTYPE;ローカルコントラストの調整方法 TP_WAVELET_EDVAL;強さ TP_WAVELET_FINAL;最終調整 -TP_WAVELET_FINEST;最も細かい -TP_WAVELET_HIGHLIGHT;ハイライトの輝度範囲 +TP_WAVELET_FINCFRAME;最終的なローカルコントラスト +TP_WAVELET_FINEST;最も小さいディテールのレベル +TP_WAVELET_FINTHR_TOOLTIP;ガイド付きフィルタの作用の加減にローカルコントラストを使います +TP_WAVELET_GUIDFRAME;最終的な平滑化(ガイド付きフィルタ) +TP_WAVELET_HIGHLIGHT;小さいディテールのレベルの輝度範囲 TP_WAVELET_HS1;全輝度範囲 -TP_WAVELET_HS2;シャドウ-ハイライト +TP_WAVELET_HS2;指定した輝度範囲 TP_WAVELET_HUESKIN;肌色の色相 TP_WAVELET_HUESKIN_TOOLTIP;底部の2つのポイントは、色相変化が始まる部分に設定されています、天井部の2つのポイントは変化が終わる所で、色相調整の効果が最も高い部分です\n\n設定ポイントを著しく動かす必要がある場合、或いはアーティファクトが発生するようであれば、ホワイトバランスが不適切と考えられます TP_WAVELET_HUESKY;色相の範囲(デフォルト:青空) TP_WAVELET_HUESKY_TOOLTIP;底部の2つのポイントは、色相変化が始まる部分に設定されています、天井部の2つのポイントは変化が終わる所で、色相調整の効果が最も高い部分です\n\n設定ポイントを著しく動かす必要がある場合、或いはアーティファクトが発生するようであれば、ホワイトバランスが不適切と考えられます -TP_WAVELET_ITER;デルタバランスのレベル -TP_WAVELET_ITER_TOOLTIP;スライダーを左に動かすと、低いレベルのデルタが増え、高いレベルのデルタが減ります\n右に動かすとその逆です +TP_WAVELET_ITER;レベルのデルタバランス +TP_WAVELET_ITER_TOOLTIP;スライダーを左に動かすと、番手の低いレベルへの効果が強まり、高いレベルへの効果が弱まります\n右に動かすとその逆です TP_WAVELET_LABEL;ウェーブレット -TP_WAVELET_LARGEST;最も粗い +TP_WAVELET_LABGRID_VALUES;粗いレベルの(a)=%1 粗いレベルの(b)=%2\n細かいレベルの(a)=%3 細かいレベルの(b)=%4 +TP_WAVELET_LARGEST;最も粗いレベル TP_WAVELET_LEVCH;色度 +TP_WAVELET_LEVDEN;レベル5、6のノイズ除去 TP_WAVELET_LEVDIR_ALL;全てのレベルと方向を合わせた画像 TP_WAVELET_LEVDIR_INF;選択したレベル以下を合わせた画像 TP_WAVELET_LEVDIR_ONE;選択したレベルだけの画像 -TP_WAVELET_LEVDIR_SUP;選択したレベルより上を合わせた画像 +TP_WAVELET_LEVDIR_SUP;選択したレベルより上と残差画像を合わせた画像 +TP_WAVELET_LEVELHIGH;レベル5、6の半径 +TP_WAVELET_LEVELLOW;レベル1~4の半径 TP_WAVELET_LEVELS;ウェーブレット レベルの数 -TP_WAVELET_LEVELS_TOOLTIP;画像を幾つの詳細レベルに分割するか選択します。分割数が増えればメモリー使用量が増え、処理時間も長くなります。 +TP_WAVELET_LEVELSIGM;半径 +TP_WAVELET_LEVELS_TOOLTIP;画像を幾つのレベルに分割するか選択します。分割数が増えればメモリー使用量が増え、処理時間も長くなります。 TP_WAVELET_LEVF;コントラスト +TP_WAVELET_LEVFOUR;レベル5、6のノイズ除去とガイド付きしきい値 TP_WAVELET_LEVLABEL;プレビューで表示可能な最大レベル=%1 -TP_WAVELET_LEVONE;レベル2 +TP_WAVELET_LEVONE;レベル 2 TP_WAVELET_LEVTHRE;レベル 4 -TP_WAVELET_LEVTWO;レベル3 -TP_WAVELET_LEVZERO;レベル1 +TP_WAVELET_LEVTWO;レベル 3 +TP_WAVELET_LEVZERO;レベル 1 +TP_WAVELET_LIMDEN;レベル1~4に対するレベル5,6の相互作用 TP_WAVELET_LINKEDG;エッジのシャープネスの強さとリンク TP_WAVELET_LIPST;高度なアルゴリズム -TP_WAVELET_LOWLIGHT;シャドウの輝度範囲 +TP_WAVELET_LOWLIGHT;大きいディテールのレベルの輝度範囲 +TP_WAVELET_LOWTHR_TOOLTIP;ノイズの増幅を避けます TP_WAVELET_MEDGREINF;最初のレベル TP_WAVELET_MEDI;青空のアーティファクトを軽減 TP_WAVELET_MEDILEV;エッジ検出 TP_WAVELET_MEDILEV_TOOLTIP;エッジの検出を有効にした際には、次の操作が奨められます:\n- アーティファクト発生を避けるため低いレベルのコントラストを使わない\n- グラデーション感度では高い値を使う\n\n効果を和らげるには、ノイズ低減とリファインの’リファイン’を下げる +TP_WAVELET_MERGEC;色調の融合 +TP_WAVELET_MERGEL;輝度の融合 +TP_WAVELET_MIXCONTRAST;基準値 +TP_WAVELET_MIXDENOISE;ノイズ除去 +TP_WAVELET_MIXMIX;混成 50%ノイズ - 50%ノイズ除去 +TP_WAVELET_MIXMIX70;混成 30%ノイズ - 70%ノイズ除去 +TP_WAVELET_MIXNOISE;ノイズ TP_WAVELET_NEUTRAL;ニュートラル -TP_WAVELET_NOIS;ノイズ低減 -TP_WAVELET_NOISE;ノイズ低減とリファイン +TP_WAVELET_NOIS;ノイズ除去 +TP_WAVELET_NOISE;ノイズ除去とリファイン TP_WAVELET_NPHIGH;高い TP_WAVELET_NPLOW;低い TP_WAVELET_NPNONE;なし TP_WAVELET_NPTYPE;隣接するピクセルに対する効果 -TP_WAVELET_NPTYPE_TOOLTIP;このアルゴリズムは近傍する8つのピクセルを使って比較します。違いが少ない場合に、エッジを強化します。 +TP_WAVELET_NPTYPE_TOOLTIP;このアルゴリズムは近傍の8つのピクセルを使って比較します。違いが少ない場合に、エッジを強化します。 +TP_WAVELET_OFFSET_TOOLTIP;オフセットは低コントラストと高コントラストのディテールのバランスを変える機能です\n高い値は高コントラストのディテールのコントラスト変化を増幅し、低い値は低コントラストのディテールのコントラスト変化を大きくします\n低い減衰応答を使うことで、どのコントラスト値が増幅されるか加減出来ます +TP_WAVELET_OLDSH;マイナス値が使えるアルゴリズム TP_WAVELET_OPACITY;ブルー/イエローの不透明度 -TP_WAVELET_OPACITYW;コントラストバランス d/v-hカーブ +TP_WAVELET_OPACITYW;斜め/垂直・水平のバランスカーブ TP_WAVELET_OPACITYWL;最終的なローカルコントラスト TP_WAVELET_OPACITYWL_TOOLTIP;ウェーブレット処理の最後で最終的なローカルコントラストを調整します\n\nイコライザは左から右に向かって、最も細かいローカルコントラストから大きいローカルコントラストを表しています -TP_WAVELET_PASTEL;明清色の色度 +TP_WAVELET_PASTEL;明清色の色度の定義 TP_WAVELET_PROC;プロセス +TP_WAVELET_PROTAB;保護 +TP_WAVELET_QUAAGRES;積極的 +TP_WAVELET_QUACONSER;控え目 +TP_WAVELET_RADIUS;シャドウ/ハイライトの半径 +TP_WAVELET_RANGEAB;aとbの範囲 % TP_WAVELET_RE1;強める TP_WAVELET_RE2;変えない TP_WAVELET_RE3;弱める -TP_WAVELET_RESCHRO;色度 +TP_WAVELET_RESBLUR;輝度のぼかし +TP_WAVELET_RESBLURC;色度のぼかし +TP_WAVELET_RESBLUR_TOOLTIP;拡大率が500%以上の場合は作用が無効となります +TP_WAVELET_RESCHRO;強さ TP_WAVELET_RESCON;シャドウ TP_WAVELET_RESCONH;ハイライト TP_WAVELET_RESID;残差画像 -TP_WAVELET_SAT;純色の色度 +TP_WAVELET_SAT;純色の色度の定義 TP_WAVELET_SETTINGS;ウェーブレットの設定 -TP_WAVELET_SKIN;色相-トーン (肌色) の目標/保護 +TP_WAVELET_SHA;シャープマスク +TP_WAVELET_SHFRAME;シャドウ/ハイライト +TP_WAVELET_SHOWMASK;ウェーブレットの'マスク'を表示 +TP_WAVELET_SIGM;半径 +TP_WAVELET_SIGMA;減衰応答 +TP_WAVELET_SIGMAFIN;減衰応答 +TP_WAVELET_SIGMA_TOOLTIP;コントラストスライダーの調整効果は、中間的なマイクロコントラストは強く、低い、或いは高いマイクロコントラストはそうでもありません。\n減衰応答は、この調整作用を極端なコントラスト値に向けて、どれだけ素早く減衰させるかコントロールするスライダーです。\n高い値を設定すると、減衰が強く作用するマイクロコントラストの領域が広がりますが、アーティファクトが発生することがあります。\n低い値を設定すると、減衰が強く作用するマイクロコントラストの領域が狭くなるので、よりピンポイントに効果が表れます。 +TP_WAVELET_SKIN;肌色の目標/保護 TP_WAVELET_SKIN_TOOLTIP;-100にすると肌色のトーンだけが調整の対象になります\n0にすると全てのカラートーンが調整されます\n+100にすると肌色のトーンは保護され、他のカラートーンが調整されます -TP_WAVELET_SKY;色相-トーン(青空)の目標/保護 +TP_WAVELET_SKY;色相の目標/保護 TP_WAVELET_SKY_TOOLTIP;-100にすると青空のトーンだけが調整の対象になります\n0にすると全てのカラートーンが調整されます\n+100にすると青空のトーンは保護され、他のカラートーンが調整されます -TP_WAVELET_STREN;強さ +TP_WAVELET_SOFTRAD;ソフトな半径 +TP_WAVELET_STREN;リファイン +TP_WAVELET_STREND;強さ TP_WAVELET_STRENGTH;強さ TP_WAVELET_SUPE;エキストラ TP_WAVELET_THR;シャドウのしきい値 -TP_WAVELET_THRESHOLD;ハイライトを調整するレベル -TP_WAVELET_THRESHOLD2;シャドウを調整するレベル -TP_WAVELET_THRESHOLD2_TOOLTIP;レベル9と(9-設定値)のレベルの間でシャドウの輝度が調整されます。他のレベルは輝度範囲全体で調整されます。 -TP_WAVELET_THRESHOLD_TOOLTIP;設定値以上のレベルだけが、ハイライトの輝度で調整されます。他のレベルは輝度範囲全体で調整されます。選べる設定値の最大数はシャドウレベルの設定に左右されます。 +TP_WAVELET_THRDEN_TOOLTIP;ローカルコントラストに応じたノイズ除去の目安に使うため、ステップカーブを作成します。ノイズ除去がコントラストの低い均一な画質部分に適用されます。詳細がある部分(コントラストが高い)は保持されます。 +TP_WAVELET_THREND;ローカルコントラストのしきい値 +TP_WAVELET_THRESHOLD;調整レベル(小さいディテール) +TP_WAVELET_THRESHOLD2;調整レベル(大きいディテール) +TP_WAVELET_THRESHOLD2_TOOLTIP;設定値より上のレベルだけが、大きなディテールのレベルの輝度範囲で設定された条件で調整されます。 +TP_WAVELET_THRESHOLD_TOOLTIP;設定値以下のレベルだけが、小さいディテールのレベルの輝度範囲で設定された条件で調整されます。 TP_WAVELET_THRH;ハイライトのしきい値 -TP_WAVELET_TILESBIG;大きいタイル +TP_WAVELET_TILESBIG;タイル TP_WAVELET_TILESFULL;画像全体 -TP_WAVELET_TILESIZE;タイルのサイズ -TP_WAVELET_TILESLIT;小さいタイル +TP_WAVELET_TILESIZE;解析の領域 TP_WAVELET_TILES_TOOLTIP;画像全体を処理する方が良い結果をもたらすので、推奨される選択です。タイルによる処理はRAMの容量が小さいユーザー向けです。必要なメモリー容量に関してはRawPediaを参照して下さい。 -TP_WAVELET_TMSTRENGTH;残差の効力を圧縮 +TP_WAVELET_TMEDGS;エッジ停止 +TP_WAVELET_TMSCALE;スケール +TP_WAVELET_TMSTRENGTH;圧縮の強さ TP_WAVELET_TMSTRENGTH_TOOLTIP;トーンマッピングの強さや残差画像のコントラストの圧縮を加減します。値が0以外の場合、露光補正パネルのトーンマッピングでは、強さとガンマのスライダー無効となります TP_WAVELET_TMTYPE;圧縮の方法 TP_WAVELET_TON;カラートーン +TP_WAVELET_TONFRAME;除外されたカラー +TP_WAVELET_USH;なし +TP_WAVELET_USHARP;明瞭の方式 +TP_WAVELET_USH_TOOLTIP;シャープマスクを選択すると、ウェーブレットの設定が次の様に自動的に行われます:\n背景=ブラック、処理=レベル3以下...レベルは1~4の間で変えられます\n\n明瞭を選択すると、ウェーブレットの設定が次の様に自動的に行われます:\n背景=残差画像、処理=レベル7以上 レベルは5~10の間で変えられます +TP_WAVELET_WAVLOWTHR;最小コントラストのしきい値 +TP_WAVELET_WAVOFFSET;オフセット TP_WBALANCE_AUTO;自動補正 +TP_WBALANCE_AUTOITCGREEN;色温度の相関関係 +TP_WBALANCE_AUTOOLD;RGBグレー +TP_WBALANCE_AUTO_HEADER;自動 TP_WBALANCE_CAMERA;カメラ TP_WBALANCE_CLOUDY;曇天 TP_WBALANCE_CUSTOM;カスタム @@ -2284,7 +4039,7 @@ TP_WBALANCE_LAMP_HEADER;ランプ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 -TP_WBALANCE_METHOD;モード +TP_WBALANCE_METHOD;方式 TP_WBALANCE_PICKER;ピック TP_WBALANCE_SHADE;日陰 TP_WBALANCE_SIZE;サイズ: @@ -2292,15 +4047,16 @@ 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;スポットWB +TP_WBALANCE_SPOTWB;ピペットを使ってプレビュー画像のニュートラルな部分をピックアップ +TP_WBALANCE_STUDLABEL;t検定 Itcwb: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;t検定の結果を表示\n低い値ほど相関関係が良いことになります\n値が0.002以下はエクセレント\n0.005以下は非常に良い\n0.01以下は良い\n0.05以下は十分\n0.5以上は悪い\n光源が標準的ではない場合は、t検定が良好であってもホワイトバラスが良いことにはなりません\nt検定結果が1000と表示された場合は反復解析が行われなかったことを意味します。良い結果と想定される前の計算結果が使われます TP_WBALANCE_TEMPBIAS;自動ホワイトバランス 色温度のバイアス -TP_WBALANCE_TEMPBIAS_TOOLTIP;”自動ホワイトバランスの計算に変更を加えます”\n色温度を変えることで画像の暖かみを増やしたり、冷たさを増やしたりします。\n偏向の度合いは色温度の割合で表示されます\n従って計算値は "算出した色温度 + 算出した色温度 * 偏向"で計算したものです +TP_WBALANCE_TEMPBIAS_TOOLTIP;'自動ホワイトバランスの計算に変更を加えます'\n色温度を変えることで画像の暖かみを増やしたり、冷たさを増やしたりします。\n偏向の度合いは色温度の割合で表示されます\n従って計算値は "算出した色温度 + 算出した色温度 * 偏向"で計算したものです TP_WBALANCE_TEMPERATURE;色温度 TP_WBALANCE_TUNGSTEN;タングステン TP_WBALANCE_WATER1;水中 1 TP_WBALANCE_WATER2;水中 2 TP_WBALANCE_WATER_HEADER;水中 -The last update by firefly 2019-12-21 ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;新規ディテール ウィンドウを開く ZOOMPANEL_ZOOM100;100%にズーム\nショートカット: z @@ -2313,4 +4069,4 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!GENERAL_HELP;Help +!TP_NEUTRAL_TOOLTIP;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. diff --git a/rtdata/languages/LICENSE b/rtdata/languages/LICENSE old mode 100755 new mode 100644 diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 4b6f2811b..6283dbe4b 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -156,13 +156,11 @@ HISTOGRAM_TOOLTIP_BAR;RGB jelzősáv megjelenítése/elrejtése.\nKattints jobb HISTOGRAM_TOOLTIP_G;Zöld csatorna hisztogrammja (mutat/elrejt) HISTOGRAM_TOOLTIP_L;CIELAB Luminancia hisztogramm (mutat/elrejt) HISTOGRAM_TOOLTIP_R;Piros csatorna hisztogrammja (mutat/elrejt) -HISTOGRAM_TOOLTIP_RAW;Raw hisztogram megjelenítése/elrejtése HISTORY_CHANGED;Változott HISTORY_CUSTOMCURVE;Saját görbe HISTORY_FROMCLIPBOARD;Vágólapról HISTORY_LABEL;Előzmények HISTORY_MSG_1;Kép betöltve -HISTORY_MSG_2;Beállítások betöltése HISTORY_MSG_3;Beállítások változtatása HISTORY_MSG_4;Előzményböngészés HISTORY_MSG_5;Fényerő @@ -176,9 +174,6 @@ HISTORY_MSG_12;Auto szint HISTORY_MSG_13;Vágás HISTORY_MSG_14;Luminancia, fényerő HISTORY_MSG_15;Luminancia, kontraszt -HISTORY_MSG_16;Luminancia, fekete szint -HISTORY_MSG_17;Luminancia, világos tónusok tömörítése -HISTORY_MSG_18;Luminancia, sötét tónusok tömörítése HISTORY_MSG_19;Luminancia görbe HISTORY_MSG_20;Élesítés HISTORY_MSG_21;Élesítés sugara @@ -204,10 +199,6 @@ HISTORY_MSG_40;Fehér árnyalat HISTORY_MSG_41;Színeltolás "A" HISTORY_MSG_42;Színeltolás "B" HISTORY_MSG_43;Luminanciazaj-csökkentés -HISTORY_MSG_44;Lum. zajcsökkentés sugara -HISTORY_MSG_45;Lum. zajcsökkentés éltoleranciája -HISTORY_MSG_46;Színzaj-csökkentés -HISTORY_MSG_47;Színzaj-csökkentés sugara HISTORY_MSG_48;Színzaj-csökkentés éltoleranciája HISTORY_MSG_49;Élérzékeny színzaj-csökkentés HISTORY_MSG_50;Árnyékok/Fények korrekció @@ -215,7 +206,6 @@ HISTORY_MSG_51;Fényes részek HISTORY_MSG_52;Sötét részek HISTORY_MSG_53;Világos tónustartomány HISTORY_MSG_54;Sötét tónustartomány -HISTORY_MSG_55;Lokális kontraszt HISTORY_MSG_56;Árnyékok/Fények sugár HISTORY_MSG_57;Durva forgatás HISTORY_MSG_58;Vízszintes tükrözés @@ -227,7 +217,6 @@ HISTORY_MSG_63;Pillanatkép kiválasztása HISTORY_MSG_64;Képkivágás HISTORY_MSG_65;Kromatikus aberráció korrekciója HISTORY_MSG_66;Kiégett részek megmentése -HISTORY_MSG_67;Kiégett részek visszaállítása HISTORY_MSG_68;Kiégett részek algoritmus HISTORY_MSG_69;Feldolgozási (munka-) színprofil HISTORY_MSG_70;Kimeneti színprofil @@ -238,12 +227,10 @@ HISTORY_MSG_74;Átméretezés szorzója HISTORY_MSG_75;Átméretezés algoritmusa HISTORY_MSG_76;EXIF Metaadatok HISTORY_MSG_77;IPTC Metaadatok -HISTORY_MSG_78;Data specified for resize HISTORY_MSG_79;Átméretezés szélesség szerint HISTORY_MSG_80;Átméretezés magasság szerint HISTORY_MSG_81;Átméretezés engedélyezve HISTORY_MSG_82;Megváltozott profil -HISTORY_MSG_83;Árnyékok/csúcsfények - kiváló minőség HISTORY_MSG_84;Perspektívakorrekció HISTORY_MSG_85;Wavelet együtthatók HISTORY_MSG_86;Wavelet equalizer @@ -290,12 +277,6 @@ HISTORY_MSG_127;Flat Field automatikus kivál. HISTORY_MSG_128;Flat Field elmosás sugara HISTORY_MSG_129;Flat Field elmosás típusa HISTORY_MSG_130;Auto torzítás -HISTORY_MSG_131;Zajszűrés - luminencia -HISTORY_MSG_132;Zajszűrés - szín -HISTORY_MSG_133;Gamma -HISTORY_MSG_134;Gamma - Position -HISTORY_MSG_135;Gamma - szabad -HISTORY_MSG_136;Gamma - meredekség HISTORY_MSG_137;Feketeszint - zöld 1 HISTORY_MSG_138;Feketeszint - vörös HISTORY_MSG_139;Feketeszint - kék @@ -635,11 +616,11 @@ TP_EPD_REWEIGHTINGITERATES;Újrasúlyozási ismétlések TP_EPD_SCALE;Skála TP_EPD_STRENGTH;Erősség TP_EXPOSURE_AUTOLEVELS;Auto szint -TP_EXPOSURE_AUTOLEVELS_TIP;Az automatikus szintek ki/bekapcsolása, mely a kép elemzése alapján állítja be a paramétereket +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Az automatikus szintek ki/bekapcsolása, mely a kép elemzése alapján állítja be a paramétereket TP_EXPOSURE_BLACKLEVEL;Feketeszint TP_EXPOSURE_BRIGHTNESS;Fényerő TP_EXPOSURE_CLIP;Vágás -TP_EXPOSURE_CLIP_TIP;Automatikus szintek meghatározásához a kiégett pixelek aránya +TP_EXPOSURE_CLIP_TOOLTIP;Automatikus szintek meghatározásához a kiégett pixelek aránya TP_EXPOSURE_COMPRHIGHLIGHTS;Világos tónusok tömörítése TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Csúcsfények helyreállításának küszöbe TP_EXPOSURE_COMPRSHADOWS;Sötét tónusok tömörítése @@ -692,7 +673,7 @@ TP_LABCURVE_LABEL;Lab görbék TP_LENSGEOM_AUTOCROP;Automatikus vágás TP_LENSGEOM_FILL;Automatikus kitöltés TP_LENSGEOM_LABEL;Objektív / Geometria -TP_NEUTRAL_TIP;Expozíciós paraméterek visszaállítása a semleges értékre +TP_NEUTRAL_TOOLTIP;Expozíciós paraméterek visszaállítása a semleges értékre TP_PERSPECTIVE_HORIZONTAL;Vízszintes TP_PERSPECTIVE_LABEL;Perspektíva TP_PERSPECTIVE_VERTICAL;Függőleges @@ -839,7 +820,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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 @@ -858,11 +839,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps !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_FAST_PIPELINE_TOOLTIP;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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !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 @@ -878,6 +859,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !FILEBROWSER_POPUPCOLORLABEL3;Label: Green !FILEBROWSER_POPUPCOLORLABEL4;Label: Blue !FILEBROWSER_POPUPCOLORLABEL5;Label: Purple +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPRANK;Rank !FILEBROWSER_POPUPRANK0;Unrank !FILEBROWSER_POPUPRANK1;Rank 1 * @@ -908,6 +890,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_CURRENT;Current +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help !GENERAL_OPEN;Open !GENERAL_RESET;Reset @@ -916,7 +900,16 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_CROSSHAIR;Show/Hide indicator crosshair. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_167;Demosaicing method !HISTORY_MSG_168;L*a*b* - CC curve @@ -925,39 +918,39 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_174;Color Appearance & Lighting +!HISTORY_MSG_175;CAL - SC - Adaptation +!HISTORY_MSG_176;CAL - VC - Surround +!HISTORY_MSG_177;CAL - SC - Absolute luminance +!HISTORY_MSG_178;CAL - VC - Absolute luminance +!HISTORY_MSG_179;CAL - SC - WP model +!HISTORY_MSG_180;CAL - IA - Lightness (J) +!HISTORY_MSG_181;CAL - IA - Chroma (C) +!HISTORY_MSG_182;CAL - SC - Auto adaptation +!HISTORY_MSG_183;CAL - IA - Contrast (J) +!HISTORY_MSG_184;CAL - SC - Surround +!HISTORY_MSG_185;CAL - Gamut control +!HISTORY_MSG_186;CAL - IA - Algorithm +!HISTORY_MSG_187;CAL - IA - Red/skin protection +!HISTORY_MSG_188;CAL - IA - Brightness (Q) +!HISTORY_MSG_189;CAL - IA - Contrast (Q) +!HISTORY_MSG_190;CAL - IA - Saturation (S) +!HISTORY_MSG_191;CAL - IA - Colorfulness (M) +!HISTORY_MSG_192;CAL - IA - Hue (h) +!HISTORY_MSG_193;CAL - IA - Tone curve 1 +!HISTORY_MSG_194;CAL - IA - Tone curve 2 +!HISTORY_MSG_195;CAL - IA - Tone curve 1 mode +!HISTORY_MSG_196;CAL - IA - Tone curve 2 mode +!HISTORY_MSG_197;CAL - IA - Color curve +!HISTORY_MSG_198;CAL - IA - Color curve mode +!HISTORY_MSG_199;CAL - IA - Use CAM output for histograms +!HISTORY_MSG_200;CAL - IA - Use CAM for 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_205;CAL - Hot/bad pixel filter +!HISTORY_MSG_206;CAL - SC - Auto absolute luminance !HISTORY_MSG_207;Defringe - Hue curve !HISTORY_MSG_208;WB - B/R equalizer !HISTORY_MSG_210;GF - Angle @@ -1000,7 +993,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 @@ -1024,8 +1016,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance !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 @@ -1050,7 +1040,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 @@ -1068,10 +1057,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_318;W - Contrast - Finer levels +!HISTORY_MSG_319;W - Contrast - Finer range +!HISTORY_MSG_320;W - Contrast - Coarser range +!HISTORY_MSG_321;W - Contrast - Coarser levels !HISTORY_MSG_322;W - Gamut - Avoid color shift !HISTORY_MSG_323;W - ES - Local contrast !HISTORY_MSG_324;W - Chroma - Pastel @@ -1135,14 +1124,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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 - Color Balance +!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 @@ -1159,7 +1148,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 @@ -1175,7 +1163,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -1195,30 +1183,45 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens @@ -1229,6 +1232,654 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1244,22 +1895,42 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !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_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1274,23 +1945,84 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !ICCPROFCREATOR_COPYRIGHT;Copyright: -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!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 @@ -1302,11 +2034,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !ICCPROFCREATOR_ILL_50;D50 !ICCPROFCREATOR_ILL_55;D55 !ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -1316,6 +2049,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -1323,13 +2057,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !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 @@ -1341,7 +2076,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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. @@ -1365,12 +2100,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !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 @@ -1388,26 +2125,29 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !NAVIGATOR_S;S: !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 -!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. +!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_COLORAPP;Color Appearance & Lighting !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_GRADIENT;Graduated filter !PARTIALPASTE_LENSPROFILE;Profiled lens correction !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !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_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue @@ -1417,6 +2157,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_APPEARANCE;Appearance !PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font @@ -1441,10 +2182,16 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP;Crop Editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1461,16 +2208,23 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !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_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_INSPECTORWINDOW;Open inspector in own window or fullscreen !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_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" +!PREFERENCES_MENUGROUPEXTPROGS;Group 'Open with' !PREFERENCES_MONINTENT;Default rendering intent !PREFERENCES_MONITOR;Monitor !PREFERENCES_MONPROFILE;Default color profile @@ -1494,12 +2248,13 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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 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_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview @@ -1507,8 +2262,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering !PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !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_MODE_TOOLTIP;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_PDYNAMIC;Dynamic !PROFILEPANEL_PINTERNAL;Neutral @@ -1546,6 +2302,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. !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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1554,6 +2316,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right !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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects @@ -1588,7 +2351,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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. @@ -1617,6 +2380,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1626,51 +2390,76 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_BRIGHT_TOOLTIP;Brightness in CIECAM is the amount of perceived light emanating from a stimulus. It differs from L*a*b* and RGB brightness. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed !TP_COLORAPP_CHROMA;Chroma (C) !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_M_TOOLTIP;Colorfulness in CIECAM is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less colored. !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_CHROMA_S_TOOLTIP;Saturation in CIECAM corresponds to the color of a stimulus in relation to its own brightness. It differs from L*a*b* and RGB saturation. +!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM corresponds to the color of a stimulus relative to the clarity of a stimulus that appears white under identical conditions. It differs from L*a*b* and RGB chroma. +!TP_COLORAPP_CIECAT_DEGREE;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_CONTRAST_Q_TOOLTIP;Contrast (Q) in CIECAM is based on brightness. It differs from L*a*b* and RGB contrast. +!TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) in CIECAM is based on lightness. It 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_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of J after CIECAM.\n\nJ is 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_CURVEEDITOR2_TOOLTIP;Same usage as with the first J(J) 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_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_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of C, S or M after CIECAM.\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;Show CIECAM output histograms in CAL curves +!TP_COLORAPP_DATACIE_TOOLTIP;Affects histograms shown in Color Appearance & Lightning curves. Does not affect RawTherapee's main histogram.\n\nEnabled: show approximate values for J and C, S or M after the CIECAM adjustments.\nDisabled: show L*a*b* values before CIECAM adjustments. +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GAMUT;Use gamut control in L*a*b* mode +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. !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_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a color described as red, green, blue and yellow. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_LABEL;Color Appearance & Lighting !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_LIGHT_TOOLTIP;Lightness in CIECAM is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions. It 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 by the user, the output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODEL;WP model +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02/16] + [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 + tint + CAT02/16 + [output]: temp and tint 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_NEUTRAL_TOOLTIP;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_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. !TP_COLORAPP_SURROUND;Surround +!TP_COLORAPP_SURROUNDSRC;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 slightly 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_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device. The darker the viewing conditions, the darker the image will become. Image brightness will not be changed when the viewing conditions are set to average. +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness @@ -1679,19 +2468,23 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TONECIE;Use CIECAM for tone mapping !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_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. !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_WBCAM;WB [RT+CAT02/16] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_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 @@ -1721,11 +2514,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_NEUTRAL_TOOLTIP;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 @@ -1742,6 +2535,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_GTCENTEREDSQUARE;Centered square !TP_CROP_GTFRAME;Frame !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 @@ -1751,7 +2545,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1763,7 +2557,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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. @@ -1785,14 +2579,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_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. @@ -1812,12 +2606,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_DISTORTION_AUTO_TOOLTIP;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_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_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 @@ -1831,11 +2625,21 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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 @@ -1856,6 +2660,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_GRADIENT_STRENGTH;Strength !TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. !TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +!TP_HLREC_HLBLUR;Blur !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 @@ -1865,22 +2670,69 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !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_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab). !TP_LABCURVE_CHROMATICITY;Chromaticity !TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. !TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated @@ -1896,22 +2748,24 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_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_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_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_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_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H). +!TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L). !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_LCREDSK_TOOLTIP;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_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -1927,6 +2781,788 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_METADATA_EDIT;Apply modifications !TP_METADATA_MODE;Metadata copy mode !TP_METADATA_STRIP;Strip all metadata @@ -1940,6 +3576,27 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_PCVIGNETTE_STRENGTH;Strength !TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !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 @@ -1952,10 +3609,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows !TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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_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_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1971,9 +3632,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBBILINEAR;DCB+Bilinear !TP_RAW_DCBVNG4;DCB+VNG4 !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... @@ -1996,6 +3659,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -2006,7 +3671,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -2021,16 +3686,21 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_RCD;RCD +!TP_RAW_RCDBILINEAR;RCD+Bilinear !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.\n+fast gives less artifacts in flat areas +!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_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_RETINEX_CONTEDIT_HSL;HSL histogram !TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram !TP_RETINEX_CONTEDIT_LH;Hue @@ -2038,7 +3708,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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 @@ -2046,7 +3716,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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -2061,7 +3731,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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) @@ -2080,11 +3750,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +!TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -2094,9 +3764,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2105,14 +3775,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_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_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter +!TP_SAVEDIALOG_OK_TOOLTIP;Shortcut: Ctrl-Enter !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_ITERCHECK;Auto limit iterations @@ -2120,6 +3790,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression @@ -2130,7 +3805,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H). !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 @@ -2143,22 +3818,28 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_WAVELET_7;Level 7 !TP_WAVELET_8;Level 8 !TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To +!TP_WAVELET_APPLYTO;Apply to !TP_WAVELET_AVOID;Avoid color shift !TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey +!TP_WAVELET_B1;Gray !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_BALCHROM;Equalizer Color !TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +!TP_WAVELET_BALLUM;Denoise equalizer White-Black !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_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CCURVE;Local contrast !TP_WAVELET_CH1;Whole chroma range !TP_WAVELET_CH2;Saturated/pastel @@ -2166,29 +3847,42 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_WAVELET_CHCU;Curve !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!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_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green !TP_WAVELET_COMPCONT;Contrast +!TP_WAVELET_COMPEXPERT;Advanced !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_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !TP_WAVELET_COMPTM;Tone mapping !TP_WAVELET_CONTEDIT;'After' contrast curve +!TP_WAVELET_CONTFRAME;Contrast - Compression !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_CONTRA_TOOLTIP;Changes the residual image contrast. !TP_WAVELET_CTYPE;Chrominance control +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !TP_WAVELET_DALL;All directions !TP_WAVELET_DAUB;Edge performance !TP_WAVELET_DAUB2;D2 - low @@ -2196,62 +3890,101 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast !TP_WAVELET_DONE;Vertical !TP_WAVELET_DTHR;Diagonal !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 +!TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast !TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights +!TP_WAVELET_HS2;Selective luminance range !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;Hue range !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. !TP_WAVELET_LEVF;Contrast +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength !TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !TP_WAVELET_NEUTRAL;Neutral !TP_WAVELET_NOIS;Denoise !TP_WAVELET_NOISE;Denoise and Refine @@ -2260,48 +3993,81 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % !TP_WAVELET_RE1;Reinforced !TP_WAVELET_RE2;Unchanged !TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_RESCHRO;Strength !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_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREN;Refine +!TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles +!TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale !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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic !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_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_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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 diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index c230323f5..63eaeccc6 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -14,17 +14,20 @@ #14 2015-11-23 update by wim ter meer #15 2016-07-21 update by wim ter meer #16 2017-04-21 update by wim ter meer +#17 2020-06-05 update by dheijl ABOUT_TAB_BUILD;Versie ABOUT_TAB_CREDITS;Credits ABOUT_TAB_LICENSE;Licentie ABOUT_TAB_RELEASENOTES;Uitgave-opmerkingen ABOUT_TAB_SPLASH;Splash +ADJUSTER_RESET_TO_DEFAULT;Klik - terug naar standaardwaarde.\nCtrl+klik - terug naar laatst opgeslagen waarde. BATCH_PROCESSING;Batch-verwerking CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_LEFT_TAN;LT: CURVEEDITOR_AXIS_OUT;O: CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Flexibel CURVEEDITOR_CURVE;Curve CURVEEDITOR_CURVES;Curven CURVEEDITOR_CUSTOM;Handmatig @@ -46,10 +49,15 @@ CURVEEDITOR_TOOLTIPPASTE;Plak curve van klembord CURVEEDITOR_TOOLTIPSAVE;Bewaar huidige curve CURVEEDITOR_TYPE;Type: DIRBROWSER_FOLDERS;Mappen +DONT_SHOW_AGAIN;Dit bericht niet meer tonen DYNPROFILEEDITOR_DELETE;Verwijder DYNPROFILEEDITOR_EDIT;Wijzig DYNPROFILEEDITOR_EDIT_RULE;Wijzig Dynamisch Profielregel DYNPROFILEEDITOR_ENTRY_TOOLTIP;Het zoeken is niet hoofdlettergevoelig.\nGebruik het "re:" voorvoegsel om\n een reguliere expressie uit te voeren +DYNPROFILEEDITOR_IMGTYPE_ANY;Alles +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standaard DYNPROFILEEDITOR_MOVE_DOWN;Naar beneden DYNPROFILEEDITOR_MOVE_UP;Naar boven DYNPROFILEEDITOR_NEW;Nieuw @@ -63,6 +71,7 @@ EXIFFILTER_CAMERA;Camera EXIFFILTER_EXPOSURECOMPENSATION;Belichtingscompensatie (EV) EXIFFILTER_FILETYPE;Bestandstype EXIFFILTER_FOCALLEN;Brandpuntsafstand +EXIFFILTER_IMAGETYPE;Type afbeelding EXIFFILTER_ISO;ISO-waarde EXIFFILTER_LENS;Objectief EXIFFILTER_METADATAFILTER;Activeer metadatafilters @@ -80,6 +89,7 @@ EXIFPANEL_RESET;Herstel EXIFPANEL_RESETALL;Herstel alles EXIFPANEL_RESETALLHINT;Zet alle tags terug naar oorspronkelijke waarden EXIFPANEL_RESETHINT;Zet geselecteerde tags terug naar oorspronkelijke waarden +EXIFPANEL_SHOWALL;Toon alles EXIFPANEL_SUBDIRECTORY;Submap EXPORT_BYPASS;Verwerkingsstappen die worden overgeslagen EXPORT_BYPASS_ALL;Alles selecteren/deselecteren @@ -107,7 +117,7 @@ EXPORT_PIPELINE;Verwerken EXPORT_PUTTOQUEUEFAST;Plaats in verwerkingsrij voor Snelle Export EXPORT_RAW_DMETHOD;Demozaïekmethode EXPORT_USE_FAST_PIPELINE;Snel (volledige verwerking op gewijzigd formaat van de afbeelding) -EXPORT_USE_FAST_PIPELINE_TIP;Gebruikt een speciale verwerkingslijn waarbij kwaliteit ten koste gaat van snelheid. Het formaat van de afbeelding wordt zo snel mogelijk gewijzigd, ipv aan het eind van de verwerking. De snelheidswinst is aanzienlijk, maar de kwaliteit van de afbeelding zal minder zijn. +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Gebruikt een speciale verwerkingslijn waarbij kwaliteit ten koste gaat van snelheid. Het formaat van de afbeelding wordt zo snel mogelijk gewijzigd, ipv aan het eind van de verwerking. De snelheidswinst is aanzienlijk, maar de kwaliteit van de afbeelding zal minder zijn. EXPORT_USE_NORMAL_PIPELINE;Standaard (wijzigt formaat aan het eind) EXTPROGTARGET_1;raw EXTPROGTARGET_2;verwerkingsrij @@ -115,15 +125,22 @@ FILEBROWSER_APPLYPROFILE;Pas profiel toe FILEBROWSER_APPLYPROFILE_PARTIAL;Pas profiel toe (gedeeltelijk) FILEBROWSER_AUTODARKFRAME;Automatisch donkerframe FILEBROWSER_AUTOFLATFIELD;Selecteer automatisch vlakveldopname +FILEBROWSER_BROWSEPATHBUTTONHINT;Klik om de opgegeven map te laden, en het zoekfilter opnieuw toe te passen. 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;Wis alles inclusief opgeslagen profielen +FILEBROWSER_CACHECLEARFROMPARTIAL;Wis alles behalve opgeslagen profielen 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 FILEBROWSER_CURRENT_NAME;Huidige naam: FILEBROWSER_DARKFRAME;Donkerframe +FILEBROWSER_DELETEDIALOG_ALL;Alle %1 bestanden in de prullenbak definitief verwijderen? FILEBROWSER_DELETEDIALOG_HEADER;Bevestiging bestand verwijderen +FILEBROWSER_DELETEDIALOG_SELECTED;Geselecteerde %1 bestanden definitief verwijderen? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Geselecteerde %1 bestanden inclusief een versie die door de verwerkingsrij is gemaakt verwijderen? FILEBROWSER_EMPTYTRASH;Leeg prullenbak +FILEBROWSER_EMPTYTRASHHINT;Alle bestanden in de prullenbak permanent verwijderen FILEBROWSER_EXTPROGMENU;Open met FILEBROWSER_FLATFIELD;Vlakveld FILEBROWSER_MOVETODARKFDIR;Verplaats naar map met donkerframes @@ -157,6 +174,8 @@ FILEBROWSER_POPUPRANK2;Waardering 2 ** FILEBROWSER_POPUPRANK3;Waardering 3 *** FILEBROWSER_POPUPRANK4;Waardering 4 **** FILEBROWSER_POPUPRANK5;Waardering 5 ***** +FILEBROWSER_POPUPREMOVE;Permanent verwijderen +FILEBROWSER_POPUPREMOVEINCLPROC;Verwijder definitief, inclusief met uitvoer in de verwerkingsrij FILEBROWSER_POPUPRENAME;Hernoem FILEBROWSER_POPUPSELECTALL;Alles selecteren FILEBROWSER_POPUPTRASH;Verplaats naar prullenbak @@ -183,6 +202,7 @@ FILEBROWSER_SHOWDIRHINT;Verwijder alle filters.\nSneltoets: d FILEBROWSER_SHOWEDITEDHINT;Toon bewerkte foto's\nSneltoets: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Toon niet-bewerkte foto's\nSneltoets: 6 FILEBROWSER_SHOWEXIFINFO;Toon EXIF-info +FILEBROWSER_SHOWNOTTRASHHINT;Toon alleen niet-verwijderde afbeeldingen. FILEBROWSER_SHOWORIGINALHINT;Toon alleen originele afbeelding.\n\nAls er meerdere afbeeldingen zijn met dezelfde naam maar verschillende extensies, dan wordt de afbeelding waarvan de extensie het hoogst staat in de lijst met extensies in Voorkeuren > Bestandsnavigator > Extensies FILEBROWSER_SHOWRANK1HINT;Toon foto's met 1 ster.\nSneltoets: 1 FILEBROWSER_SHOWRANK2HINT;Toon foto's met 2 sterren.\nSneltoets: 2 @@ -213,11 +233,13 @@ GENERAL_AUTO;Automatisch GENERAL_BEFORE;Voor GENERAL_CANCEL;Annuleren GENERAL_CLOSE;Sluiten +GENERAL_CURRENT;Huidig GENERAL_DISABLE;Deactiveren GENERAL_DISABLED;Gedeactiveerd GENERAL_ENABLE;Activeer GENERAL_ENABLED;Geactiveerd GENERAL_FILE;Bestand +GENERAL_HELP;Help GENERAL_LANDSCAPE;Landschap GENERAL_NA;nvt. GENERAL_NO;Nee @@ -225,22 +247,25 @@ GENERAL_NONE;Geen GENERAL_OK;OK GENERAL_OPEN;Open GENERAL_PORTRAIT;Portret +GENERAL_RESET;Terugzetten GENERAL_SAVE;Opslaan +GENERAL_SAVE_AS;Bewaren als... +GENERAL_SLIDER;Schuifregelaar GENERAL_UNCHANGED;(Onveranderd) GENERAL_WARNING;Waarschuwing +GIMP_PLUGIN_INFO;Welkom bij de RawTherapee GIMP plug-in!\nAls uw bewerking gereed is, sluit dan het hoofdvenster van RawTherapee en uw afbeelding wordt automatisch in GIMP geladen. HISTOGRAM_TOOLTIP_B;Toon/verberg blauw histogram HISTOGRAM_TOOLTIP_BAR;Toon/verberg RGB-indicatie\nRechtermuisklik op foto om te starten/stoppen HISTOGRAM_TOOLTIP_CHRO;Toon/Verberg Chromaticiteit histogram HISTOGRAM_TOOLTIP_G;Toon/verberg groen histogram HISTOGRAM_TOOLTIP_L;Toon/verberg CIELAB-luminantiehistogram +HISTOGRAM_TOOLTIP_MODE;Wissel tussen lineair, log-lineair and log-log schalen van het histogram. HISTOGRAM_TOOLTIP_R;Toon/verberg rood histogram -HISTOGRAM_TOOLTIP_RAW;Toon/verberg RAW-histogram HISTORY_CHANGED;Veranderd HISTORY_CUSTOMCURVE;Handmatig HISTORY_FROMCLIPBOARD;Van klembord HISTORY_LABEL;Geschiedenis HISTORY_MSG_1;Foto geladen -HISTORY_MSG_2;Profiel geladen HISTORY_MSG_3;Profiel aangepast HISTORY_MSG_4;Door geschiedenis bladeren HISTORY_MSG_5;Helderheid @@ -254,9 +279,6 @@ HISTORY_MSG_12;Automatische belichting HISTORY_MSG_13;Drempel HISTORY_MSG_14;L*a*b* - Helderheid HISTORY_MSG_15;L*a*b* - Contrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- HISTORY_MSG_19;L*a*b* - L* curve HISTORY_MSG_20;Verscherpen HISTORY_MSG_21;OSM - Straal @@ -282,10 +304,6 @@ HISTORY_MSG_40;Witbalans Groentint HISTORY_MSG_41;Tooncurve Mode 1 HISTORY_MSG_42;Tooncurve 2 HISTORY_MSG_43;Tooncurve Mode 2 -HISTORY_MSG_44;Lum. Straal ruisond. -HISTORY_MSG_45;Lum. Randtolerantie ruisond. -HISTORY_MSG_46;Ruisonderdrukking kleur -HISTORY_MSG_47;Meng hoge lichten met matrix HISTORY_MSG_48;Gebruik DCP's toon curve HISTORY_MSG_49;DCP Illuminant HISTORY_MSG_50;Schaduwen/hoge lichten @@ -293,7 +311,6 @@ HISTORY_MSG_51;S/HL - Hoge lichten HISTORY_MSG_52;S/HL - Schaduwen HISTORY_MSG_53;S/HL - Toonomvang HL. HISTORY_MSG_54;S/HL - Toonomvang S. -HISTORY_MSG_55;S/HL - Lokaal contrast HISTORY_MSG_56;S/HL - Straal HISTORY_MSG_57;Grof roteren HISTORY_MSG_58;Horizontaal spiegelen @@ -305,7 +322,6 @@ HISTORY_MSG_63;Snapshot HISTORY_MSG_64;Bijsnijden HISTORY_MSG_65;CA-correctie HISTORY_MSG_66;Hoge lichten herstellen -HISTORY_MSG_67;HL herstellen hoeveelheid HISTORY_MSG_68;HL herstellen methode HISTORY_MSG_69;Kleurwerkruimte HISTORY_MSG_70;Uitvoerkleurruimte @@ -316,12 +332,10 @@ HISTORY_MSG_74;Schalingsinstelling HISTORY_MSG_75;Schalingsmethode HISTORY_MSG_76;Exif-metadata HISTORY_MSG_77;IPTC-metadata -HISTORY_MSG_78;Schalen HISTORY_MSG_79;Schalen - Breedte HISTORY_MSG_80;Schalen - Hoogte HISTORY_MSG_81;Schalen geactiveerd HISTORY_MSG_82;Profiel veranderd -HISTORY_MSG_83;S/HL - Verscherpingsmasker HISTORY_MSG_84;Perspectiefcorrectie HISTORY_MSG_85;Lenscorrectie Profiel HISTORY_MSG_86;RGB Curven - Luminos. Mode @@ -368,12 +382,6 @@ HISTORY_MSG_127;Vlakveld - Autom. selectie HISTORY_MSG_128;Vlakveld - Verzachten straal HISTORY_MSG_129;Vlakveld - Verzachten type HISTORY_MSG_130;Auto correctie lensvervorming -HISTORY_MSG_131;RO - Luma -HISTORY_MSG_132;RO - Chroma -HISTORY_MSG_133;Gamma -HISTORY_MSG_134;Gamma - Positie -HISTORY_MSG_135;Gamma - Vrij -HISTORY_MSG_136;Gamma - Helling HISTORY_MSG_137;Zwartniveau - Groen 1 HISTORY_MSG_138;Zwartniveau - Rood HISTORY_MSG_139;Zwartniveau - Blauw @@ -410,6 +418,7 @@ HISTORY_MSG_169;L*a*b* - CH curve HISTORY_MSG_170;Levendigheid curve HISTORY_MSG_171;L*a*b* - LC curve HISTORY_MSG_172;L*a*b* - Beperk LC +HISTORY_MSG_173;NR - Detailbehoud HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 toepassing HISTORY_MSG_176;CAM02 - Weergave omgeving @@ -439,6 +448,7 @@ HISTORY_MSG_199;CAM02 - Toont in histogram HISTORY_MSG_200;CAM02 - Tonemapping HISTORY_MSG_201;RO - Chromin. rood-groen HISTORY_MSG_202;RO - Chromin. blauw-geel +HISTORY_MSG_203;NR - Kleurruimte HISTORY_MSG_204;LMMSE Verbetering HISTORY_MSG_205;CAM02 hete/dode pixels HISTORY_MSG_206;CAT02 - Opname Lum. Auto @@ -469,7 +479,9 @@ 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;B&W - CM - Auto HISTORY_MSG_236;- +HISTORY_MSG_237;B&W - CM HISTORY_MSG_238;GF - Straal HISTORY_MSG_239;GF - Sterkte HISTORY_MSG_240;GF - Centrum @@ -482,12 +494,12 @@ 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;DC - Drempel -HISTORY_MSG_250;RO - Verbeteren HISTORY_MSG_251;ZW - Algoritme HISTORY_MSG_252;DC - Huidtonen HISTORY_MSG_253;DC - Verminder artefacten HISTORY_MSG_254;DC - Huidtint HISTORY_MSG_255;DC - Algoritme +HISTORY_MSG_256;NR - Mediaan - Type HISTORY_MSG_257;Kleurtint HISTORY_MSG_258;KT - Kleur curve HISTORY_MSG_259;KT - Dekking @@ -504,8 +516,7 @@ 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_274;KT - Verz. Schaduwen -HISTORY_MSG_275;KT - Verz. Hoge lichten +HISTORY_MSG_273;CT - Kleurbalans SMH HISTORY_MSG_276;KT - Dekking HISTORY_MSG_277;--unused-- HISTORY_MSG_278;KT - Behoud luminantie @@ -527,9 +538,9 @@ HISTORY_MSG_293;Film Simuleren HISTORY_MSG_294;Film - Sterkte HISTORY_MSG_295;Film - Film HISTORY_MSG_296;RO - Luminantie curve +HISTORY_MSG_297;NR - Modus HISTORY_MSG_298;Dode pixels filter HISTORY_MSG_299;RO - Chrominantie curve -HISTORY_MSG_300;- HISTORY_MSG_301;RO - Luma controle HISTORY_MSG_302;RO - Chroma methode HISTORY_MSG_303;RO - Chroma methode @@ -621,6 +632,7 @@ 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 - Overblijvend - Kleurbalans HISTORY_MSG_393;DCP 'Look'tabel HISTORY_MSG_394;DCP Basis belichting HISTORY_MSG_395;DCP Basis tabel @@ -637,7 +649,6 @@ HISTORY_MSG_405;W - RO - Niveau 4 HISTORY_MSG_406;W - RS - Naburige pixels HISTORY_MSG_407;Retinex - Methode HISTORY_MSG_408;Retinex - Naburig -HISTORY_MSG_409;Retinex - Verbeteren HISTORY_MSG_410;Retinex - Beginpunt HISTORY_MSG_411;Retinex - Sterkte HISTORY_MSG_412;Retinex - Gaussiaans Verloop @@ -669,6 +680,7 @@ HISTORY_MSG_437;Retinex - M - Methode HISTORY_MSG_438;Retinex - M - Mixer HISTORY_MSG_439;Retinex - Verwerken HISTORY_MSG_440;DC - Methode +HISTORY_MSG_441;Retinex - Toename transmissie HISTORY_MSG_442;Retinex - Schaal HISTORY_MSG_443;Uivoer Zwartpunt Compensatie HISTORY_MSG_444;WB - Temp afwijking @@ -684,12 +696,131 @@ HISTORY_MSG_468;PV Vul holtes HISTORY_MSG_469;PV Mediaann HISTORY_MSG_471;PV Bewegingscorrectie HISTORY_MSG_472;PV Zachte overgang -HISTORY_MSG_473;PV Gebruik lmmse HISTORY_MSG_474;PV Balans +HISTORY_MSG_475;PS - Kanaalbalans +HISTORY_MSG_476;CAM02 - Temp uit +HISTORY_MSG_477;CAM02 - Groen uit +HISTORY_MSG_478;CAM02 - Yb uit +HISTORY_MSG_479;CAM02 - CAT02 aanpassing uit +HISTORY_MSG_480;CAM02 - Automatische CAT02 uit +HISTORY_MSG_481;CAM02 - Temp scène +HISTORY_MSG_482;CAM02 - Groen scène +HISTORY_MSG_483;CAM02 - Yb scène +HISTORY_MSG_484;CAM02 - Auto Yb scène +HISTORY_MSG_485;Lenscorrectie +HISTORY_MSG_486;Lenscorrectie - Camera +HISTORY_MSG_487;Lenscorrectie - Lens +HISTORY_MSG_488;Compressie Dynamisch Bereik +HISTORY_MSG_489;DRC - Detail +HISTORY_MSG_490;DRC - Hoeveelheid +HISTORY_MSG_491;Witbalans +HISTORY_MSG_492;RGB Curven +HISTORY_MSG_493;L*a*b* Adjustments +HISTORY_MSG_494;verscherpen +HISTORY_MSG_CLAMPOOG;Kleuren afkappen die buiten het gamma vallen +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Kleurcorrectie +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Kleurcorrectie +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Kanaal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - gebied C masker +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H masker +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Licht +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L masker +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - Lijst +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - verzachtingsmasker gebied +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - offset gebied +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - sterkte gebied +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Verzadiging +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - toon gebiedsmasker +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - hellingsgebied +HISTORY_MSG_DEHAZE_DEPTH;Nevelvermindering - Diepte +HISTORY_MSG_DEHAZE_ENABLED;Nevelvermindering +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Nevelvermindering - Toon dieptemap +HISTORY_MSG_DEHAZE_STRENGTH;Nevelvermindering - Sterkte +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual-demozaïek - auto-drempel +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual-demozaïek - Contrastdrempel +HISTORY_MSG_FILMNEGATIVE_ENABLED;Filmnegatief +HISTORY_MSG_FILMNEGATIVE_VALUES;Filmnegatief waarden +HISTORY_MSG_HISTMATCHING;Auto-matched tooncurve +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Uitvoer - Primaries +HISTORY_MSG_ICM_OUTPUT_TEMP;Uitvoer - ICC-v4 illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;Uitvoer - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Working - Helling +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC methode +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Hoeveelheid +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Donker +HISTORY_MSG_LOCALCONTRAST_ENABLED;Lokaal Contrast +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Lokaal Contrast - Licht +HISTORY_MSG_LOCALCONTRAST_RADIUS;Lokaal Contrast - Radius +HISTORY_MSG_METADATA_MODE;Metadata kopieermodus +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrastdrempel +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto drempel +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limiet herhalingen +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrastdrempel +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Herhalingen +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius +HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Toename hoekradius +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demozaïekmethode voor beweging +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;lijnruisfilter richting +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrastdrempel +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correctie - Herhalingen +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correctie - Vermijd kleurverschuiving +HISTORY_MSG_RAW_BORDER;Raw rand +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Schalen - sta vergroting toe +HISTORY_MSG_SHARPENING_BLUR;Verscherpen - Vervagingsradius +HISTORY_MSG_SHARPENING_CONTRAST;Verscherpen - Contrastdrempel +HISTORY_MSG_SH_COLORSPACE;S/H - Kleurruimte +HISTORY_MSG_SOFTLIGHT_ENABLED;Zacht licht +HISTORY_MSG_SOFTLIGHT_STRENGTH;Zacht licht - Sterkte +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anker +HISTORY_MSG_TRANS_METHOD;Geometrie - Methode HISTORY_NEWSNAPSHOT;Nieuw HISTORY_NEWSNAPSHOT_TOOLTIP;Sneltoets: Alt-s HISTORY_SNAPSHOT;Nieuw HISTORY_SNAPSHOTS;Snapshots +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Zet terug naar standaard copyright, verleend aan "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Handmatig +ICCPROFCREATOR_DESCRIPTION;Beschriiving: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Voeg gamma- en hellingwaarden toe aan de beschrijving +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Laat leeg voor de standaard beschrijving. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC versie: +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;Standaard +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;U kunt alleen de illuminant instellen voor ICC v4-profielen. +ICCPROFCREATOR_PRIMARIES;Primaire kleuren: +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;Blauw X +ICCPROFCREATOR_PRIM_BLUY;Blauw Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Groen X +ICCPROFCREATOR_PRIM_GREY;Groen Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Rood X +ICCPROFCREATOR_PRIM_REDY;Rood Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;U kunt alleen aangepaste primaries voor ICC v4-profielen instellen. +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Bewaar ICC profiel als... +ICCPROFCREATOR_SLOPE;Helling +ICCPROFCREATOR_TRC_PRESET;Toonresponscurve: IPTCPANEL_CATEGORY;Categorie IPTCPANEL_CATEGORYHINT;Het onderwerp van de afbeelding. IPTCPANEL_CITY;Plaats @@ -733,6 +864,7 @@ IPTCPANEL_TITLEHINT;De korte naam van de afbeelding. Dit kan de bestandsnaam zij IPTCPANEL_TRANSREFERENCE;Referentienummer IPTCPANEL_TRANSREFERENCEHINT;Het nummer dat wordt gebruikt voor de 'workflow control' of voor de tracking. MAIN_BUTTON_FULLSCREEN;Volledig scherm +MAIN_BUTTON_ICCPROFCREATOR;ICC Profielmaker MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigeer naar de volgende afbeelding relatief ten opzichte van de geopende afbeelding in de Editor\nSneltoets: Shift-F4\n\nNavigeer naar de volgende afbeelding relatief ten opzichte van de miniatuur geselecteerd in de Bestandsnavigator\nSneltoets: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Navigeer naar de vorige afbeelding relatief ten opzichte van de geopende afbeelding in de Editor\nSneltoets: Shift-F3 \n\nNavigeer naar de vorige afbeelding relatief ten opzichte van de miniatuur geselecteerd in de Bestandsnavigator\nSneltoets: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchroniseer de Bestandsnavigator met de Editor om de miniatuur te tonen van de huidig geopende afbeelding, en verwijder de filters in de Bestandsnavigator \nSneltoets: x\n\nAls voorgaand, maar zonder het verwijderen van de filters in de Bestandsnavigator \nSneltoets: y\n(NB de miniatuur van de geopende afbeelding zal niet worden getoond indien gefilterd) @@ -749,6 +881,7 @@ MAIN_FRAME_FILEBROWSER;Bestandsnavigator MAIN_FRAME_FILEBROWSER_TOOLTIP; Bestandsnavigator.\nSneltoets: Ctrl-F2 MAIN_FRAME_PLACES;Locaties MAIN_FRAME_PLACES_ADD;Nieuw +MAIN_FRAME_PLACES_DEL;Verwijderen MAIN_FRAME_QUEUE;Verwerkingsrij MAIN_FRAME_QUEUE_TOOLTIP; Verwerkingsrij.\nSneltoets: Ctrl-F3 MAIN_FRAME_RECENT;Recente mappen @@ -764,7 +897,10 @@ MAIN_MSG_OPERATIONCANCELLED;Opdracht afgebroken MAIN_MSG_PATHDOESNTEXIST;Het pad\n\n%1\n\nbestaat niet. Zet een correct pad bij Voorkeuren. MAIN_MSG_QOVERWRITE;Wilt u het bestand overschrijven? MAIN_MSG_SETPATHFIRST;Specificeer eerst een doelmap in Voorkeuren \nom deze functionaliteit te kunnen gebruiken! +MAIN_MSG_TOOMANYOPENEDITORS;Teveel open fotobewerkers.\nSluit er een om verder te kunnen. MAIN_MSG_WRITEFAILED;Niet opgeslagen\n\n"%1"\n\nControleer of de map bestaat en dat u schrijfrechten heeft. +MAIN_TAB_ADVANCED;Geavanceerd +MAIN_TAB_ADVANCED_TOOLTIP;Sneltoets: Alt-a MAIN_TAB_COLOR;Kleur MAIN_TAB_COLOR_TOOLTIP;Sneltoets: Alt-c MAIN_TAB_DETAIL;Detail @@ -774,6 +910,8 @@ MAIN_TAB_EXIF;Exif MAIN_TAB_EXPORT; Exporteren MAIN_TAB_EXPOSURE;Belichting MAIN_TAB_EXPOSURE_TOOLTIP;Sneltoets: Alt-e +MAIN_TAB_FAVORITES;Favorieten +MAIN_TAB_FAVORITES_TOOLTIP;Sneltoets: Alt-u MAIN_TAB_FILTER;Filter MAIN_TAB_INSPECT; Inspecteren MAIN_TAB_IPTC;IPTC @@ -786,6 +924,7 @@ MAIN_TAB_TRANSFORM_TOOLTIP;Sneltoets: Alt-t MAIN_TOOLTIP_BACKCOLOR0;Achtergrond kleur van het voorbeeld: Thema-based\nSneltoets: 8 MAIN_TOOLTIP_BACKCOLOR1;Achtergrond kleur van het voorbeeld: Zwart\nSneltoets: 9 MAIN_TOOLTIP_BACKCOLOR2;Achtergrond kleur van het voorbeeld: Wit\nSneltoets: 0 +MAIN_TOOLTIP_BACKCOLOR3;Achtergrondkleur van het voorbeeld: middelgrijs\nSneltoets: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vergrendel / Ontgrendel de Voorafbeelding.\n\nVergrendel: hou de Voorafbeelding ongewijzigd.\nDit is handig om het cumulatieve effect van meerdere gereedschappen te beoordelen.\nBovendien kan er worden vergeleken met elke stap in de geschiedenislijst.\n\nOntgrendel: de Voorafbeelding volgt een stap achter de Naafbeelding en laat de afbeelding zien zonder het effect van het huidige gereedschap. MAIN_TOOLTIP_HIDEHP;Toon/verberg linkerpaneel (geschiedenis).\nSneltoets: H MAIN_TOOLTIP_INDCLIPPEDH;Overbelichtingsindicatie.\nSneltoets: > @@ -795,6 +934,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Bekijk het Focus Masker.\nSneltoets: Shi MAIN_TOOLTIP_PREVIEWG;Bekijk het Groene kanaal.\nSneltoets: g MAIN_TOOLTIP_PREVIEWL;Bekijk de Luminositeit.\nSneltoets: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;Bekijk het Rode kanaal.\nSneltoets: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Bekijk het scherptecontrastmasker.\nSneltoets: p\nWerkt alleen als verscherping is geactiveerd en het zoomniveau >= 100%. MAIN_TOOLTIP_QINFO;Beknopte fotogegevens MAIN_TOOLTIP_SHOWHIDELP1;Toon/verberg linkerpaneel.\nSneltoets: l MAIN_TOOLTIP_SHOWHIDERP1;Toon/verberg rechterpaneel.\nSneltoets: Alt-l @@ -814,6 +954,10 @@ NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Breedte: %1, Hoogte: %2 NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;Het gebundelde profiel "%1" werd niet gevonden!\n\nUw installatie kan beschadigd zijn.\n\nDaarom worden interne standaardwaarden gebruikt. +OPTIONS_DEFIMG_MISSING;Het standaardprofiel voor niet-raw- foto's werd niet gevonden of is niet ingesteld.\n\nControleer de profielenmap, het kan ontbreken of beschadigd zijn.\n\n"%1" wordt daarom gebruikt. +OPTIONS_DEFRAW_MISSING;Het standaardprofiel voor raw-foto's werd niet gevonden of is niet ingesteld.\n\nControleer de profielenmap, het kan ontbreken of beschadigd zijn.\n\n"%1" wordt daarom gebruikt. +PARTIALPASTE_ADVANCEDGROUP;Geavanceerd PARTIALPASTE_BASICGROUP;Basisinstellingen PARTIALPASTE_CACORRECTION;C/A-correctie PARTIALPASTE_CHANNELMIXER;Kleurkanaal mixer @@ -828,6 +972,7 @@ PARTIALPASTE_CROP;Bijsnijden PARTIALPASTE_DARKFRAMEAUTOSELECT;Donkerframe autom. selectie PARTIALPASTE_DARKFRAMEFILE;Donkerframe-opname PARTIALPASTE_DEFRINGE;Verzachten +PARTIALPASTE_DEHAZE;Nevel verminderen PARTIALPASTE_DETAILGROUP;Detailinstellingen PARTIALPASTE_DIALOGLABEL;Profiel gedeeltelijk plakken... PARTIALPASTE_DIRPYRDENOISE;Ruisonderdrukking @@ -838,6 +983,7 @@ PARTIALPASTE_EQUALIZER;Wavelet Balans PARTIALPASTE_EVERYTHING;Alles PARTIALPASTE_EXIFCHANGES;Wijzig Exif-gegevens PARTIALPASTE_EXPOSURE;Belichting +PARTIALPASTE_FILMNEGATIVE;Film Negatief PARTIALPASTE_FILMSIMULATION;Film Simuleren PARTIALPASTE_FLATFIELDAUTOSELECT;Vlakveld autoselectie PARTIALPASTE_FLATFIELDBLURRADIUS;Vlakveld verzachting straal @@ -852,6 +998,8 @@ PARTIALPASTE_IPTCINFO;IPTC-informatie PARTIALPASTE_LABCURVE;LAB-curve PARTIALPASTE_LENSGROUP;Lensgerelateerde instellingen PARTIALPASTE_LENSPROFILE;Lens correctie profiel +PARTIALPASTE_LOCALCONTRAST;Lokaal contrast +PARTIALPASTE_METADATA;Metadata modus PARTIALPASTE_METAGROUP;Metadata PARTIALPASTE_PCVIGNETTE;Vignettering Filter PARTIALPASTE_PERSPECTIVE;Perspectief @@ -859,12 +1007,15 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dode pixels filter PARTIALPASTE_PREPROCESS_GREENEQUIL;Groenbalans PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hete pixels filter PARTIALPASTE_PREPROCESS_LINEDENOISE;Lijnruisfilter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter PARTIALPASTE_PRSHARPENING;Verscherp na verkleinen PARTIALPASTE_RAWCACORR_AUTO;Autom. C/A-correctie +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA vermijd kleurverschuiving PARTIALPASTE_RAWCACORR_CAREDBLUE;CA rood & blauw PARTIALPASTE_RAWEXPOS_BLACK;Zwartniveau PARTIALPASTE_RAWEXPOS_LINEAR;Raw witpunt- lineaire corr. factor PARTIALPASTE_RAWGROUP;Raw-instellingen +PARTIALPASTE_RAW_BORDER;Raw rand PARTIALPASTE_RAW_DCBENHANCE;Pas DCB-verbetering toe PARTIALPASTE_RAW_DCBITERATIONS;aantal DCB-herhalingen PARTIALPASTE_RAW_DMETHOD;Demozaïekmethode @@ -880,27 +1031,53 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Schaduwen/hoge lichten PARTIALPASTE_SHARPENEDGE;Randen PARTIALPASTE_SHARPENING;Verscherping PARTIALPASTE_SHARPENMICRO;Microcontrast +PARTIALPASTE_SOFTLIGHT;Zacht licht +PARTIALPASTE_TM_FATTAL;Compressie dynamisch bereik PARTIALPASTE_VIBRANCE;Levendigheid PARTIALPASTE_VIGNETTING;Vignetteringscorrectie PARTIALPASTE_WHITEBALANCE;Witbalans PREFERENCES_ADD;Toevoegen +PREFERENCES_APPEARANCE;Uiterlijk +PREFERENCES_APPEARANCE_COLORPICKERFONT;Lettertype kleurenkiezer +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Kleur bijsnijdmasker +PREFERENCES_APPEARANCE_MAINFONT;Standaard lettertype PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator randkleur +PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI modus +PREFERENCES_APPEARANCE_THEME;Thema PREFERENCES_APPLNEXTSTARTUP;herstart vereist PREFERENCES_AUTOMONPROFILE;Gebruik automatisch het standaard monitorprofiel \nvan het besturingsysteem +PREFERENCES_AUTOSAVE_TP_OPEN;Bewaar positie gereedschappen (open/dicht) bij afsluiten 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. 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_CACHECLEAR;Wissen +PREFERENCES_CACHECLEAR_ALL;Wis alle bestanden in de cache: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Wis alle bestanden in de cache behalve verwerkingsprofielen: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Wis alleen verwerkingsprofielen in de cache: +PREFERENCES_CACHECLEAR_SAFETY;Alleen bestanden in de cache worden gewist. Verwerkingsprofielen van de oorspronkelijke afbeeldingen blijven ongemoeid. PREFERENCES_CACHEMAXENTRIES;Maximaal aantal elementen in cache PREFERENCES_CACHEOPTS;Cache-opties PREFERENCES_CACHETHUMBHEIGHT;Maximale hoogte miniaturen +PREFERENCES_CHUNKSIZES;Tegels per thread +PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaïek +PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correctie +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaïek +PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaïek +PREFERENCES_CHUNKSIZE_RGB;RGB verwerking PREFERENCES_CLIPPINGIND;Indicatie over-/onderbelichting PREFERENCES_CLUTSCACHE;HaldCLUT cache PREFERENCES_CLUTSCACHE_LABEL;Maximum aantal cached Cluts PREFERENCES_CLUTSDIR;HaldCLUT map PREFERENCES_CMMBPC;Zwartpunt Compensatie +PREFERENCES_CROP;Uitsnijden +PREFERENCES_CROP_AUTO_FIT;Automatisch zoomen tot de uitsnede +PREFERENCES_CROP_GUIDES;Getoonde hulplijnen als uitsnede niet bewerkt wordt +PREFERENCES_CROP_GUIDES_FRAME;Frame +PREFERENCES_CROP_GUIDES_FULL;Origineel +PREFERENCES_CROP_GUIDES_NONE;Geen PREFERENCES_CURVEBBOXPOS;Positie copy/paste knoppen bij Curves PREFERENCES_CURVEBBOXPOS_ABOVE;Boven PREFERENCES_CURVEBBOXPOS_BELOW;Beneden @@ -918,14 +1095,17 @@ 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_DIRDARKFRAMES;Map met donkerframes +PREFERENCES_DIRECTORIES;Mappen PREFERENCES_DIRHOME;Standaardmap PREFERENCES_DIRLAST;Laatst bezochte map PREFERENCES_DIROTHER;Anders PREFERENCES_DIRSELECTDLG;Selecteer standaardmap bij opstarten... PREFERENCES_DIRSOFTWARE;Installatiemap +PREFERENCES_EDITORCMDLINE;Aangepaste opdrachtregel PREFERENCES_EDITORLAYOUT;Bewerkingsvenster PREFERENCES_EXTERNALEDITOR;Externe editor PREFERENCES_FBROWSEROPTS;Opties bestandsnavigator +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compacte gereedschapsbalken in bestandsnavigator PREFERENCES_FLATFIELDFOUND;Gevonden PREFERENCES_FLATFIELDSDIR;Vlakveldmap PREFERENCES_FLATFIELDSHOTS;foto's @@ -948,6 +1128,7 @@ PREFERENCES_INTENT_PERCEPTUAL;Waargenomen colorimetrie PREFERENCES_INTENT_RELATIVE;Relatieve colorimetrie PREFERENCES_INTENT_SATURATION;Verzadiging PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Toon interne JPEG-miniatuur indien onbewerkt +PREFERENCES_LANG;Taal PREFERENCES_LANGAUTODETECT;Gebruik taalinstellingen pc PREFERENCES_MAXRECENTFOLDERS;Maximum aantal recente mappen PREFERENCES_MENUGROUPEXTPROGS;Groepeer open met @@ -973,6 +1154,10 @@ PREFERENCES_PARSEDEXTADDHINT;Typ nieuwe extensie en druk op knop om aan lijst to PREFERENCES_PARSEDEXTDELHINT;Verwijder geselecteerde extensie(s) uit lijst PREFERENCES_PARSEDEXTDOWNHINT;Verplaats extensie naar beneden PREFERENCES_PARSEDEXTUPHINT;Verplaats extensie naar boven +PREFERENCES_PERFORMANCE_MEASURE;Meting +PREFERENCES_PERFORMANCE_MEASURE_HINT;Log verwerkingstijden in de console +PREFERENCES_PERFORMANCE_THREADS;Threads +PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximaal aantal threads voor ruisvermindering and Wavelet Niveaus (0 = Automatisch) PREFERENCES_PREVDEMO;Voorbeeld Demozaïekmethode PREFERENCES_PREVDEMO_FAST;Snel PREFERENCES_PREVDEMO_LABEL;Demozaïekmethode van het voorbeeld bij <100% zoom: @@ -982,8 +1167,10 @@ PREFERENCES_PROFILEHANDLING;Verwerking profielen PREFERENCES_PROFILELOADPR;Laadprioriteit profielen PREFERENCES_PROFILEPRCACHE;Profiel in cache PREFERENCES_PROFILEPRFILE;Profiel bij RAW-bestand +PREFERENCES_PROFILESAVEBOTH;Bewaar verwerkingsprofielen zowel in de cache als naast het invoerbestand PREFERENCES_PROFILESAVECACHE;Bewaar profiel in cache PREFERENCES_PROFILESAVEINPUT;Bewaar profiel bij RAW-bestand +PREFERENCES_PROFILESAVELOCATION;Opslaglocatie profielen PREFERENCES_PROFILE_NONE;Geen PREFERENCES_PROPERTY;Eigenschap PREFERENCES_PRTINTENT;Grafische weergave @@ -991,6 +1178,7 @@ 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_SAVE_TP_OPEN_NOW;Bewaar open/dicht-status van de gereedschappen nu PREFERENCES_SELECTLANG;Selecteer taal PREFERENCES_SERIALIZE_TIFF_READ;TIFF Lees Instellingen PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serieel lezen van TIFF bestanden @@ -1013,7 +1201,12 @@ PREFERENCES_TAB_COLORMGR;Kleurbeheer PREFERENCES_TAB_DYNAMICPROFILE;Dynamisch Profielregel PREFERENCES_TAB_GENERAL;Algemeen PREFERENCES_TAB_IMPROC;Beeldverwerking +PREFERENCES_TAB_PERFORMANCE;Performantie PREFERENCES_TAB_SOUND;Geluiden +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Ingesloten JPEG voorbeeld +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Te tonen foto +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrale raw rendering +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Ingesloten JPEG indien vol formaat, anders neutrale raw PREFERENCES_TP_LABEL;Gereedschapspaneel: PREFERENCES_TP_VSCROLLBAR;Verberg de schuifbalk van het gereedschapspaneel PREFERENCES_USEBUNDLEDPROFILES;Gebruik gebundelde profielen @@ -1023,7 +1216,7 @@ PROFILEPANEL_GLOBALPROFILES;Gebundelde profielen PROFILEPANEL_LABEL;Profielen PROFILEPANEL_LOADDLGLABEL;Kies profiel... PROFILEPANEL_LOADPPASTE;Te laden parameters -PROFILEPANEL_MODE_TIP;Profiel aanvullen.\n\nKnop ingedrukt: gedeeltelijke profielen worden omgezet naar volledige profielen. De ontbrekende waarden worden vervangen door hard-coded defaults.\n\nKnop neutraal: profielen worden toegepast zo als ze zijn, alleen de aanwezige waarden worden gewijzigd. +PROFILEPANEL_MODE_TOOLTIP;Profiel aanvullen.\n\nKnop ingedrukt: gedeeltelijke profielen worden omgezet naar volledige profielen. De ontbrekende waarden worden vervangen door hard-coded defaults.\n\nKnop neutraal: profielen worden toegepast zo als ze zijn, alleen de aanwezige waarden worden gewijzigd. PROFILEPANEL_MYPROFILES;Mijn profielen PROFILEPANEL_PASTEPPASTE;Te plakken parameters PROFILEPANEL_PCUSTOM;Handmatig @@ -1037,6 +1230,11 @@ PROFILEPANEL_TOOLTIPCOPY;Kopieer huidig profiel naar klembord PROFILEPANEL_TOOLTIPLOAD;Laad profiel uit bestand PROFILEPANEL_TOOLTIPPASTE; Plak profiel van klembord PROFILEPANEL_TOOLTIPSAVE;Bewaar huidig profiel.\nCtrl-click voor het selecteren van de instellingen voor opslaan. +PROGRESSBAR_DECODING;Decoderen... +PROGRESSBAR_GREENEQUIL;Groen blancering... +PROGRESSBAR_HLREC;Reconstructie hoge lichten... +PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... +PROGRESSBAR_LINEDENOISE;Lijnruis filter... PROGRESSBAR_LOADING;Afbeelding laden... PROGRESSBAR_LOADINGTHUMBS;Miniaturen laden... PROGRESSBAR_LOADJPEG;Laden JPEG-bestand... @@ -1045,14 +1243,18 @@ PROGRESSBAR_LOADTIFF;Laden TIFF-bestand... PROGRESSBAR_NOIMAGES;Geen afbeeldingen PROGRESSBAR_PROCESSING;Foto verwerken... PROGRESSBAR_PROCESSING_PROFILESAVED;Uitvoeren 'Profiel opslaan' +PROGRESSBAR_RAWCACORR;Raw CA correctie... PROGRESSBAR_READY;Gereed PROGRESSBAR_SAVEJPEG;Opslaan JPEG-bestand... PROGRESSBAR_SAVEPNG;Opslaan PNG-bestand... PROGRESSBAR_SAVETIFF;Opslaan TIFF-bestand... PROGRESSBAR_SNAPSHOT_ADDED;Snapshot toegevoegd PROGRESSDLG_PROFILECHANGEDINBROWSER;Profiel veranderd in bestandsnavigator +QINFO_FRAMECOUNT;%2 frames +QINFO_HDR;HDR / %2 frame(s) QINFO_ISO;ISO QINFO_NOEXIF;Exif-gegevens niet beschikbaar. +QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) QUEUE_AUTOSTART;Autostart QUEUE_AUTOSTART_TOOLTIP;Start verwerking automatisch wanneer nieuwe foto arriveert QUEUE_DESTFILENAME;Pad en bestandsnaam @@ -1060,8 +1262,19 @@ QUEUE_FORMAT_TITLE;Bestandstype QUEUE_LOCATION_FOLDER;Sla op in map QUEUE_LOCATION_TEMPLATE;Gebruik sjabloon QUEUE_LOCATION_TEMPLATE_TOOLTIP;U kunt de volgende formaten gebruiken:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r\n\nDeze formaten hebben betrekking op de mappen, submappen en atributen van het RAW-bestand.\n\nAls bijvoorbeeld /home/tom/image/02-09-2006/dsc0012.nef is geopend, hebben deze formaten de volgende betekenis:\n%f=dsc0012, %d1=02-09-2006, %d2=foto, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\n%r wordt vervangen door de rank van de foto. Als de foto geen rank heeft, wordt %r vervangen door '0'. Als de foto in de prullenbak zit zal %r worden vervangen door 'x'.\n\nWanneer de geconverteerde RAW-foto in dezelfde map moet komen als het origineel, schrijf dan:\n%p1/%f\n\nIndien u de geconverteerde RAW-foto in een map genaamd 'geconverteerd' wilt plaatsen die een submap is van de oorspronkelijke locatie, schrijft u:\n%p1/geconverteerd/%f\n\nWilt u het geconverteerde RAW-bestand bewaren in map '/home/tom/geconverteerd' met behoud van dezelfde submap met datums, schrijf dan:\n%p2/geconverteerd/%d1/%f +QUEUE_LOCATION_TITLE;Uitvoerlocatie +QUEUE_STARTSTOP_TOOLTIP;;Start of stop de verwerking van foto's in de rij.\n\nSneltoets: Ctrl+s +SAMPLEFORMAT_0;onbekend data formaat +SAMPLEFORMAT_1;8-bit unsigned +SAMPLEFORMAT_2;16-bit unsigned +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;16-bit drijvendekomma +SAMPLEFORMAT_32;24-bit drijvendekomma +SAMPLEFORMAT_64;32-bit drijvendekomma SAVEDLG_AUTOSUFFIX;Voeg automatisch ophogend nummer (-1, -2..) toe als bestand al bestaat SAVEDLG_FILEFORMAT;Bestandstype +SAVEDLG_FILEFORMAT_FLOAT; drijvendekomma SAVEDLG_FORCEFORMATOPTS;Forceer opties voor opslaan SAVEDLG_JPEGQUAL;JPEG-kwaliteit SAVEDLG_PUTTOQUEUE;Plaats in verwerkingsrij @@ -1077,6 +1290,8 @@ 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;Markeer pixels waarvan de kleuren buiten het kleurgamma vallen, relatief aan:\n- het printerprofiel, indien opgegeven en soft-proofing is ingeschakeld,\n- het uitvoerprofiel, indien geen printerprofiel is gekozen en soft-proofing is ingeschakeld,\n- het beeldschermprofiel, indien soft-proofing is uitgeschakeld. +SOFTPROOF_TOOLTIP;Soft-proofing simuleert hoe een foto wordt getoond:\n- als deze wordt afgedrukt, indien een printerprofiel is opgegeven in Voorkeuren > Kleurbeheer,\n- als de foto getoond wordt op een beeldscherm dat het huidige uitvoerprofiel gebruikt en een printerprofiel niet is opgegeven. THRESHOLDSELECTOR_B;Onderkant THRESHOLDSELECTOR_BL;Onderkant-links THRESHOLDSELECTOR_BR;Onderkant-rechts @@ -1120,6 +1335,8 @@ TP_BWMIX_MET;Methode TP_BWMIX_MET_CHANMIX;Kanaalmixer TP_BWMIX_MET_DESAT;Desatureren TP_BWMIX_MET_LUMEQUAL;Luminantie Balans +TP_BWMIX_MIXC;Kanaal Mixer +TP_BWMIX_NEUTRAL;Terugzetten 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. @@ -1160,6 +1377,7 @@ 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_ABSOLUTELUMINANCE;Absolute luminantie TP_COLORAPP_ALGO;Algoritme TP_COLORAPP_ALGO_ALL;Alle TP_COLORAPP_ALGO_JC;Lichtheid + Chroma (JC) @@ -1170,6 +1388,7 @@ TP_COLORAPP_BADPIXSL;Hete/dode pixel filter TP_COLORAPP_BADPIXSL_TOOLTIP;Onderdruk hete/dode (sterk gekleurde) pixels.\n 0=geen effect 1=mediaan 2=gaussian.\n\nDeze artefacten zijn het gevolg van de beperkingen van CIECAM02. Het alternatief is het aanpassen van de afbeelding om zeer donkere schaduwen te voorkomen. TP_COLORAPP_BRIGHT;Helderheid (Q) TP_COLORAPP_BRIGHT_TOOLTIP;Helderheid in CIECAM02 is verschillend van Lab en RGB, hou rekening met de luminositeit van wit +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Bij manuele aanpassing worden waardon boven 65 aanbevolen. TP_COLORAPP_CHROMA;Chroma (C) TP_COLORAPP_CHROMA_M;Kleurrijkheid (M) TP_COLORAPP_CHROMA_M_TOOLTIP;Kleurrijkheid in CIECAM02 is verschillend van Lab en RGB @@ -1189,8 +1408,8 @@ 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_FREE;Vrije temp+groen + CAT02 + [uitvoer] TP_COLORAPP_GAMUT;Gamut controle (Lab) -TP_COLORAPP_GAMUT_TOOLTIP;Sta gamut controle toe in Lab mode TP_COLORAPP_HUE;Tint (h) TP_COLORAPP_HUE_TOOLTIP;Tint (h) - hoek tussen 0° en 360° TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 @@ -1199,8 +1418,11 @@ TP_COLORAPP_LABEL_SCENE;Opnameomstandigheden TP_COLORAPP_LABEL_VIEWING;Weergaveomstandigheden TP_COLORAPP_LIGHT;Lichtheid (J) TP_COLORAPP_LIGHT_TOOLTIP;Lichtheid in CIECAM02 verschilt van Lab en RGB lichtheid +TP_COLORAPP_MEANLUMINANCE;Gemiddelde luminantie (Yb%) 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_NEUTRAL;Terugzetten +TP_COLORAPP_NEUTRAL_TOOLTIP;Zet alle regelaars, vinkjes en curves terug naar hun standaardwaarde TP_COLORAPP_RSTPRO;Rode en Huidtinten bescherming TP_COLORAPP_RSTPRO_TOOLTIP;Rode en Huidtinten bescherming (schuifbalk en curven) TP_COLORAPP_SURROUND;Omgeving @@ -1217,6 +1439,7 @@ TP_COLORAPP_TCMODE_LABEL2;Curve modus 2 TP_COLORAPP_TCMODE_LABEL3;Curve chroma modus TP_COLORAPP_TCMODE_LIGHTNESS;lichtheid TP_COLORAPP_TCMODE_SATUR;Verzadiging +TP_COLORAPP_TEMP_TOOLTIP;Zet altijd Tint=1 om een lichtbron te selecteren.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 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²) @@ -1233,6 +1456,27 @@ TP_COLORTONING_HIGHLIGHT;Hoge lichten TP_COLORTONING_HUE;Kleurtint TP_COLORTONING_LAB;L*a*b* menging TP_COLORTONING_LABEL;Kleurtinten +TP_COLORTONING_LABGRID;L*a*b* kleurcorrectie raster +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Kleurcorrectie gebieden +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Kanaal +TP_COLORTONING_LABREGION_CHANNEL_ALL;Alle +TP_COLORTONING_LABREGION_CHANNEL_B;Blauw +TP_COLORTONING_LABREGION_CHANNEL_G;Groen +TP_COLORTONING_LABREGION_CHANNEL_R;Rood +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Helderheid(L) +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correctie +TP_COLORTONING_LABREGION_MASK;Masker +TP_COLORTONING_LABREGION_MASKBLUR;Verzachtingsmasker +TP_COLORTONING_LABREGION_OFFSET;Offset +TP_COLORTONING_LABREGION_POWER;Kracht +TP_COLORTONING_LABREGION_SATURATION;Verzadiging +TP_COLORTONING_LABREGION_SHOWMASK;Toon masker +TP_COLORTONING_LABREGION_SLOPE;Helling TP_COLORTONING_LUMA;Luminantie TP_COLORTONING_LUMAMODE;Behoud luminantie TP_COLORTONING_LUMAMODE_TOOLTIP;Wanneer de kleur wijzigt (rood, groen, cyaan, blauw, etc.) blijft de luminatie van elke pixel behouden. @@ -1240,7 +1484,7 @@ TP_COLORTONING_METHOD;Methode TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* menging", "RGB schuifbalk" en "RGB curven" gebruiken interpolatie kleurmenging.\n"Kleurbalans" (Schaduwen/Midden tonen/Hoge lichten) en "Verzadigen 2 kleuren" gebruiken directe kleuren.\nAlle methodes werken ook op Zwart-Wit. TP_COLORTONING_MIDTONES;Midden tonen TP_COLORTONING_NEUTRAL;Terug naar beginstand -TP_COLORTONING_NEUTRAL_TIP;Zet alle waarden (Schaduwen, Midden tonen, Hoge lichten) terug naar default. +TP_COLORTONING_NEUTRAL_TOOLTIP;Zet alle waarden (Schaduwen, Midden tonen, Hoge lichten) terug naar default. TP_COLORTONING_OPACITY;Dekking TP_COLORTONING_RGBCURVES;RGB - Curven TP_COLORTONING_RGBSLIDERS;RGB - Schuifbalken @@ -1271,6 +1515,9 @@ TP_CROP_GTTRIANGLE2;Gouden Driehoek 2 TP_CROP_GUIDETYPE;Hulplijnen: TP_CROP_H;Hoogte TP_CROP_LABEL;Bijsnijden +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Terugzetten +TP_CROP_SELECTCROP;Selecteer TP_CROP_W;Breedte TP_CROP_X;X TP_CROP_Y;Y @@ -1279,10 +1526,15 @@ TP_DARKFRAME_LABEL;Donkerframe TP_DEFRINGE_LABEL;Verzachten (Lab/CIECAM02) TP_DEFRINGE_RADIUS;Straal TP_DEFRINGE_THRESHOLD;Drempel +TP_DEHAZE_DEPTH;Diepte +TP_DEHAZE_LABEL;Nevel vermindering +TP_DEHAZE_SHOW_DEPTH_MAP;Toon de dieptemap +TP_DEHAZE_STRENGTH;Sterkte TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zone TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisch algemeen TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominantie Blauw & Geel TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominantie curve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Verhoog (vermenigvuldig) de waarde van alle chrominantie regelaars.\nDeze curve regelt de sterkte van de chromatische ruisvermindering als een functie van de chromaticiteit, om bijvoorbeeld het effect te vergroten in gebieden met lage verzadiging en te verminderen in deze met lage verzadiging. TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominantie TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Handmatig TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominantie (master) @@ -1297,6 +1549,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Voorbeeld ruis: Gemiddeld=%1 Hoo TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Voorbeeld ruis: Gemiddeld= - Hoog= - TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tegel grootte=%1, Centrum: Tx=%2 Ty=%3 TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominantie Rood & Groen +TP_DIRPYRDENOISE_LABEL;Ruisvermindering TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Type gereedschap TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminantie curve TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminantie Detail @@ -1346,7 +1599,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Bij -100 huidtinten worden gewijzigd.\nBij 0 all TP_DIRPYREQUALIZER_THRESHOLD;Drempel TP_DIRPYREQUALIZER_TOOLTIP;Probeert artefacten te verminderen die het gevolg zijn van kleurverschuiving van de huidtinten(hue, chroma, luma) en de rest van de afbeelding TP_DISTORTION_AMOUNT;Hoeveelheid -TP_DISTORTION_AUTO_TIP;Corrigeert automatisch lens afwijkingen in raw afbeeldingen op basis van de ingebedde JPEG indien deze is gecorrigeerd door de camera. +TP_DISTORTION_AUTO_TOOLTIP;Corrigeert automatisch lens afwijkingen in raw afbeeldingen op basis van de ingebedde JPEG indien deze is gecorrigeerd door de camera. TP_DISTORTION_LABEL;Corrigeer lensvervorming TP_EPD_EDGESTOPPING;Randen TP_EPD_GAMMA;Gamma @@ -1355,11 +1608,12 @@ TP_EPD_REWEIGHTINGITERATES;Herhaling TP_EPD_SCALE;Schaal TP_EPD_STRENGTH;Sterkte TP_EXPOSURE_AUTOLEVELS;Autom. niveaus -TP_EXPOSURE_AUTOLEVELS_TIP;Activeer automatische niveaus\nActiveer Herstel Hoge lichten indien nodig. +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Activeer automatische niveaus\nActiveer Herstel Hoge lichten indien nodig. TP_EXPOSURE_BLACKLEVEL;Schaduwen TP_EXPOSURE_BRIGHTNESS;Helderheid +TP_EXPOSURE_CLAMPOOG;Knip kleuren die buiten het gamma vallen TP_EXPOSURE_CLIP;Clip % -TP_EXPOSURE_CLIP_TIP;Het deel van de pixels dat moet worden hersteld bij gebruik van automatische niveaus. +TP_EXPOSURE_CLIP_TOOLTIP;Het deel van de pixels dat moet worden hersteld bij gebruik van automatische niveaus. TP_EXPOSURE_COMPRHIGHLIGHTS;Hoge lichten Comprimeren TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Drempel Hoge lichten Comprimeren TP_EXPOSURE_COMPRSHADOWS;Schaduwcompressie @@ -1369,6 +1623,8 @@ TP_EXPOSURE_CURVEEDITOR1;Toon curve 1 TP_EXPOSURE_CURVEEDITOR2;Toon curve 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Raadpleeg de volgende paragraaf van de handleiding om te leren hoe U het beste resultaat kunt boeken bij het werken met dubbele curven:\n The Toolbox > Exposure Tab > Exposure Panel > Tone Curve TP_EXPOSURE_EXPCOMP;Belichtingscompensatie +TP_EXPOSURE_HISTMATCHING;Automatische Tooncurve +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Pas automatisch de curves en schuifregelaars aan (behalve belichtingscompensatie) om overeen te komen met de ingesloten JPEG miniatuur. TP_EXPOSURE_LABEL;Belichting TP_EXPOSURE_SATURATION;Verzadiging TP_EXPOSURE_TCMODE_FILMLIKE;Film-achtig @@ -1381,6 +1637,12 @@ TP_EXPOSURE_TCMODE_STANDARD;Standaard TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Gewogen Standaard TP_EXPOS_BLACKPOINT_LABEL;Raw Zwartpunten TP_EXPOS_WHITEPOINT_LABEL;Raw Witpunten +TP_FILMNEGATIVE_BLUE;Blauw verhouding +TP_FILMNEGATIVE_GREEN;Referentie exponent (contrast) +TP_FILMNEGATIVE_GUESS_TOOLTIP;Zet automatisch de rood/groen verhouding door 2 gebieden te kiezen met een neutrale tint (geen kleur) in het origineel. De gebieden moeten verschillen in helderheid. Zet de witbalans nadien. +TP_FILMNEGATIVE_LABEL;Film Negatief +TP_FILMNEGATIVE_PICK;Kies neutrale punten +TP_FILMNEGATIVE_RED;Rood verhouding TP_FILMSIMULATION_LABEL;Film Simuleren TP_FILMSIMULATION_SLOWPARSEDIR;Map met Hald CLUT afbeeldingen. Deze worden gebruikt voor Film Simuleren.\nGa naar Voorkeuren > Beeldverwerking > Film Simuleren\nDe aanbeveling is om een map te gebruiken die alleen Hald CLUT afbeeldingen bevat.\n\nLees het Film Simuleren artikel in RawPedia voor meer informatie.\n\nWilt u de scan afbreken? TP_FILMSIMULATION_STRENGTH;Sterkte @@ -1453,6 +1715,12 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;Sla de lineaire TIFF afbeelding op voordat het invo TP_ICM_TONECURVE;Gebruik DCP's toon curve TP_ICM_TONECURVE_TOOLTIP;Gebruik de ingebedde DCP toon curve. De instelling is alleen actief als de geselecteerd DCP een toon curve heeft. TP_ICM_WORKINGPROFILE;Werkprofiel +TP_ICM_WORKING_TRC;Tooncurve: +TP_ICM_WORKING_TRC_CUSTOM;Gebruiker gedefinieerd +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;Geen +TP_ICM_WORKING_TRC_SLOPE;Helling +TP_ICM_WORKING_TRC_TOOLTIP;Enkel voor ingebouwde profielen. TP_IMPULSEDENOISE_LABEL;Spot-ruisonderdrukking TP_IMPULSEDENOISE_THRESH;Drempel TP_LABCURVE_AVOIDCOLORSHIFT;Vermijd kleurverschuiving @@ -1489,15 +1757,35 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminantie volgens hue L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminantie volgens luminantie L=f(L) TP_LABCURVE_LABEL;Lab TP_LABCURVE_LCREDSK;Beperkt LC tot Rode en Huidtinten -TP_LABCURVE_LCREDSK_TIP;Indien ingeschakeld, beïnvloed de LC Curve alleen rode en huidtinten\nIndien uitgeschakeld, is het van toepassing op all tinten +TP_LABCURVE_LCREDSK_TOOLTIP;Indien ingeschakeld, beïnvloed de LC Curve alleen rode en huidtinten\nIndien uitgeschakeld, is het van toepassing op all tinten TP_LABCURVE_RSTPROTECTION;Rode en huidtinten Bescherming TP_LABCURVE_RSTPRO_TOOLTIP;Kan worden gebruikt met de chromaticiteits schuifbalk en de CC curve. TP_LENSGEOM_AUTOCROP;Automatisch bijsnijden TP_LENSGEOM_FILL;Automatisch uitvullen TP_LENSGEOM_LABEL;Objectief / Geometrie +TP_LENSGEOM_LIN;Lineair +TP_LENSGEOM_LOG;Logarithmisch +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatische selectie +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP bestand +TP_LENSPROFILE_CORRECTION_MANUAL;Manuele selectie TP_LENSPROFILE_LABEL;Lenscorrectie Profielen +TP_LENSPROFILE_LENS_WARNING;Waarschuwing: de gebruikte lens profiel crop factor komt niet overeen met de camera crop factor, de resultaten kunnen verkeerd zijn. +TP_LENSPROFILE_MODE_HEADER;Lens Profiel +TP_LENSPROFILE_USE_CA;Chromatische afwijking +TP_LENSPROFILE_USE_GEOMETRIC;Geometrische vervorming +TP_LENSPROFILE_USE_HEADER;Lenscorrecties +TP_LENSPROFILE_USE_VIGNETTING;Vignettering +TP_LOCALCONTRAST_AMOUNT;Hoeveelheid +TP_LOCALCONTRAST_DARKNESS;Donker niveau +TP_LOCALCONTRAST_LABEL;Lokaal Contrast +TP_LOCALCONTRAST_LIGHTNESS;helderheidsniveau +TP_LOCALCONTRAST_RADIUS;Straal +TP_METADATA_EDIT;Pas wijzigingen toe +TP_METADATA_MODE;Metadata kopieermodus +TP_METADATA_STRIP;Strip alle metadata +TP_METADATA_TUNNEL;Kopieer ongewijzigd TP_NEUTRAL;Terugzetten -TP_NEUTRAL_TIP;Alle belichtingsinstellingen naar 0 +TP_NEUTRAL_TOOLTIP;Alle belichtingsinstellingen naar 0 TP_PCVIGNETTE_FEATHER;Straal TP_PCVIGNETTE_FEATHER_TOOLTIP;Straal: \n0=alleen hoeken \n50=halverwege tot het centrum \n100=tot aan het centrum TP_PCVIGNETTE_LABEL;Vignettering Filter @@ -1505,6 +1793,7 @@ TP_PCVIGNETTE_ROUNDNESS;Vorm TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Vorm: \n0=rechthoek \n50=ellips \n100=circel TP_PCVIGNETTE_STRENGTH;Sterkte TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filtersterkte in stops (volledig in de hoeken). +TP_PDSHARPENING_LABEL;Verscherpen TP_PERSPECTIVE_HORIZONTAL;Horizontaal TP_PERSPECTIVE_LABEL;Perspectief TP_PERSPECTIVE_VERTICAL;Verticaal @@ -1517,10 +1806,19 @@ TP_PREPROCESS_HOTPIXFILT;Hete pixels filter TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Onderdrukt hete pixels. TP_PREPROCESS_LABEL;Voorbewerking TP_PREPROCESS_LINEDENOISE;Lijnruisfilter +TP_PREPROCESS_LINEDENOISE_DIRECTION;Richting +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Beide +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontaal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontaal enkel op PDAF-rijen +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Verticaal TP_PREPROCESS_NO_FOUND;Niet gevonden +TP_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter TP_PRSHARPENING_LABEL;Verscherp na verkleinen TP_PRSHARPENING_TOOLTIP;Verscherp na verkleinen. Werkt alleen als verkleinen actief is en Verkleinen methode 'Lanczos' is. Omdat 'verkleinen' geen effect heeft op het voorbeeld, heeft 'post verkleinen verscherping' ook geen effect op het voorbeeld. TP_RAWCACORR_AUTO;Automatische CA-correctie +TP_RAWCACORR_AUTOIT;Herhalingen +TP_RAWCACORR_AUTOIT_TOOLTIP;Deze schuif is alleen actief als Automatische CA-correctie is aangevinkt.\nAuto-correctie werkt conservatief en corrigeert meestal niet alle chromatische aberratie.\nOm de resterende CA te corrigeren, kunt u dit proces tot vijf keer herhalen.\nElke herhaling vermindert de CA van de vorige herhaling, maar gaat wel ten koste van extra rekentijd. +TP_RAWCACORR_AVOIDCOLORSHIFT;Vermijd kleurverschuiving TP_RAWCACORR_CABLUE;Blauw TP_RAWCACORR_CARED;Rood TP_RAWCACORR_LABEL;Corrigeer chromatische aberratie @@ -1535,16 +1833,24 @@ TP_RAWEXPOS_LINEAR;Witpunt Correctie TP_RAWEXPOS_RGB;Rood, Groen, Blauw TP_RAWEXPOS_TWOGREEN;Koppel Groen 1 en 2 TP_RAW_1PASSMEDIUM;1 keer (Gemiddeld) +TP_RAW_2PASS;1-pass+snel TP_RAW_3PASSBEST;3 keer (Beste) +TP_RAW_4PASS;3-pass+snel TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Rand TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;DCB Verbetering TP_RAW_DCBITERATIONS;Aantal DCB-herhalingen +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Methode TP_RAW_DMETHOD_PROGRESSBAR;%1 Demozaïeken... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demozaïek verfijning... TP_RAW_DMETHOD_TOOLTIP;IGV en LMMSE zijn speciaal bedoeld voor hoge ISO afbeeldingen +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto drempel +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Als checkbox is aangevinkt (aanbevolen), berekent RT een optimale waarde gebaseerd op vlakke gebieden in de foto.\nIndien die niet gevonden worden of de foto bevat veel ruis, wordt de waarde op 0 gezet.\nOm de waarde handmatig in te voeren moet u eerst de checkbox uitvinken (redelijke waarden zijn afhankelijk van het soort foto). +TP_RAW_DUALDEMOSAICCONTRAST;Contrast drempel TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Stapgrootte kleurfoutonderdrukking TP_RAW_FAST;Snel @@ -1553,6 +1859,8 @@ TP_RAW_HD_TOOLTIP;Lagere waarden maken Hete/Dode pixel detectie agressiever, maa TP_RAW_HPHD;HPHD TP_RAW_IGV;IGV TP_RAW_IMAGENUM;Sub-afbeelding +TP_RAW_IMAGENUM_SN;SN modus +TP_RAW_IMAGENUM_TOOLTIP;Sommige raw bestanden bestaan uit verschillende sub-afbeeldingen (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\Als een andere demozaïek methode dan Pixel Shift gebruikt wordt, selecteert dit de gebruikte sub-afbeelding.\n\nBij gebruik van de Pixel Shift demozaïek methode op een Pixel Shift raw, worden alle sub-afbeeldingen gebruikt, and dit selecteert de subafbeeldijg die gebruikt wordt voor bewegende moving gebieden. TP_RAW_LABEL;Demozaïekproces TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;LMMSE Verbetering Stappen @@ -1561,7 +1869,12 @@ TP_RAW_MONO;Mono TP_RAW_NONE;Geen (Toont sensor patroon) TP_RAW_PIXELSHIFT;Pixel Verschuiven TP_RAW_PIXELSHIFTBLUR;Vervaag bewegingsmasker +TP_RAW_PIXELSHIFTDMETHOD;Demozaïek voor beweging +TP_RAW_PIXELSHIFTEPERISO;Gevoeligheid +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;De standaardwaarde 0 werkt goed voor lage ISO-waarden.\nHogere waarden vergroten de gevoeligheid van bewegingsdetectie.\nWijzig in kleine stappen en controleer het bewegingsmasker.\nVerhoog gevoeligheid voor onderbelichte foto's of foto's met hoge ISO-waarden. TP_RAW_PIXELSHIFTEQUALBRIGHT;Balanseer de helderheid van de frames +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Balanceer per kanaal +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Ingeschakeld: Balanceer elk RGB kanaal afzonderlijk.\nUitgeschakeld: Balanceer alle kanalen evenveel. 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_PIXELSHIFTGREEN;Controleer groene kanaal voor beweging TP_RAW_PIXELSHIFTHOLEFILL;Vul holtes in verschuivingsmasker @@ -1577,14 +1890,20 @@ TP_RAW_PIXELSHIFTNONGREENCROSS;Controleer rood/blauw kanaal voor beweging 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;Toont de foto met een groen masker dat de bewegingsgebieden toont. 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 TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Zachte overgang tussen gebieden met en zonder beweging.\nKies 0 om Zachte overgang uit te zetten\nKies 1 voor Amaze/lmmse of Mediaan +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;Sensor met Bayer matrix TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass geeft het beste resultaat (aanbevolen voor lage ISO afbeeldingen)\n1-pass geeft hetzelfde resultaat als 3-pass voor hoge ISO afbeeldingen en is sneller. TP_RAW_SENSOR_XTRANS_LABEL;Sensor met X-Trans matrix TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;Snelle X-Trans +TP_RESIZE_ALLOW_UPSCALING;Sta opschalen toe TP_RESIZE_APPLIESTO;Toepassen op: TP_RESIZE_CROPPEDAREA;Uitsnede TP_RESIZE_FITBOX;Breedte en hoogte @@ -1602,6 +1921,7 @@ 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;Equalizer 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) @@ -1611,6 +1931,9 @@ TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Deze curve kan zowel alleen worden gebruikt o TP_RETINEX_EQUAL;Mixer TP_RETINEX_FREEGAMMA;Vrij gamma TP_RETINEX_GAIN;Verbeteren +TP_RETINEX_GAINOFFS;Versterking en Offset (helderheid) +TP_RETINEX_GAINTRANSMISSION;Transmissie versterking +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Versterk of verzwak de transmssiemap om de gewenste luminantie te bekomen.\nThe x-as is the transmissie.\nThe y-as is the versterking. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Vrij TP_RETINEX_GAMMA_HIGH;Hoog @@ -1635,6 +1958,7 @@ TP_RETINEX_LABEL;Retinex TP_RETINEX_LABEL_MASK;Masker TP_RETINEX_LABSPACE;L*a*b* TP_RETINEX_LOW;Laag +TP_RETINEX_MAP;Methode TP_RETINEX_MAP_GAUS;Gaussiaans masker TP_RETINEX_MAP_MAPP;Verscherp masker (wavelet gedeeltelijk) TP_RETINEX_MAP_MAPT;Verscherp masker (wavelet totaal) @@ -1647,7 +1971,7 @@ TP_RETINEX_MLABEL;Teruggeplaatst sluier-vrij Min=%1 Max=%2 TP_RETINEX_MLABEL_TOOLTIP;Zou min=0 en max=32768 moeten benaderen\nTeruggeplaatste afbeelding zonder mixture. TP_RETINEX_NEIGHBOR;Naburige pixels TP_RETINEX_NEUTRAL;Beginwaarde -TP_RETINEX_NEUTRAL_TIP;Zet alles terug naar de beginwaarde. +TP_RETINEX_NEUTRAL_TOOLTIP;Zet alles terug naar de beginwaarde. TP_RETINEX_OFFSET;Beginpunt TP_RETINEX_SCALES;Gaussiaans verloop TP_RETINEX_SCALES_TOOLTIP;Indien schuifbalk=0: alle herhalingen zijn gelijk.\nIndien > 0 Schaal en straal worden verkleind als herhaling toeneemt, en omgekeerd. @@ -1683,7 +2007,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Graden TP_ROTATE_LABEL;Roteren TP_ROTATE_SELECTLINE;Bepaal rechte lijn -TP_SAVEDIALOG_OK_TIP;Sneltoets: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Sneltoets: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Hoge lichten TP_SHADOWSHLIGHTS_HLTONALW;Toonomvang TP_SHADOWSHLIGHTS_LABEL;Schaduwen/hoge lichten @@ -1695,14 +2019,18 @@ TP_SHARPENEDGE_LABEL;Randen TP_SHARPENEDGE_PASSES;Herhaling TP_SHARPENEDGE_THREE;Alleen luminantie TP_SHARPENING_AMOUNT;Hoeveelheid +TP_SHARPENING_BLUR;Vervagen straal +TP_SHARPENING_CONTRAST;Contrast drempel TP_SHARPENING_EDRADIUS;Straal TP_SHARPENING_EDTOLERANCE;Randtolerantie TP_SHARPENING_HALOCONTROL;Halocontrole TP_SHARPENING_HCAMOUNT;Hoeveelheid +TP_SHARPENING_ITERCHECK;Automatische limiet herhalingen TP_SHARPENING_LABEL;Verscherpen (Lab/CIECAM02) TP_SHARPENING_METHOD;Methode TP_SHARPENING_ONLYEDGES;Alleen randen verscherpen TP_SHARPENING_RADIUS;Straal +TP_SHARPENING_RADIUS_BOOST;Straalvergroting TP_SHARPENING_RLD;RL-verscherping TP_SHARPENING_RLD_AMOUNT;Hoeveelheid TP_SHARPENING_RLD_DAMPING;Demping @@ -1710,9 +2038,16 @@ TP_SHARPENING_RLD_ITERATIONS;Herhaling TP_SHARPENING_THRESHOLD;Drempel TP_SHARPENING_USM;Onscherpmasker TP_SHARPENMICRO_AMOUNT;Hoeveelheid +TP_SHARPENMICRO_CONTRAST;Contrast drempel TP_SHARPENMICRO_LABEL;Microcontrast (Lab/CIECAM02) TP_SHARPENMICRO_MATRIX;3×3-matrix ipv. 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformiteit +TP_SOFTLIGHT_LABEL;Zacht licht +TP_SOFTLIGHT_STRENGTH;Sterkte +TP_TM_FATTAL_AMOUNT;Hoeveelheid +TP_TM_FATTAL_ANCHOR;Anker +TP_TM_FATTAL_LABEL;Dynamisch bereik compressie +TP_TM_FATTAL_THRESHOLD;Detail TP_VIBRANCE_AVOIDCOLORSHIFT;Vermijd kleurverschuiving TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Huidtinten @@ -1761,6 +2096,7 @@ TP_WAVELET_BANONE;Geen TP_WAVELET_BASLI;Schuifbalk TP_WAVELET_BATYPE;Balans methode TP_WAVELET_CBENAB;Kleurtint en kleurbalans +TP_WAVELET_CB_TOOLTIP;Voor hoge waarden: kleurcorrectie door al of niet te combineren met niveau decompositie 'toning'\nVoor lage waarden de witbalans van de achtergrond (hemel, ...) wijzigen zonder die van de voorgrond, meestal meer contrastrijk TP_WAVELET_CCURVE;Lokaal contrast TP_WAVELET_CH1;Alle chroma's TP_WAVELET_CH2;Pastel - Verzadigd @@ -1896,7 +2232,6 @@ TP_WAVELET_TILES;Tegel grootte (* 128) TP_WAVELET_TILESBIG;Grote Tegels TP_WAVELET_TILESFULL;Volldige afbeelding TP_WAVELET_TILESIZE;Tegel grootte -TP_WAVELET_TILESLIT;Kleine Tegels TP_WAVELET_TILES_TOOLTIP;De optie 'Volledige afbeelding' geeft een betere kwaliteit en is de aanbevolen keuze. Selecteer Tegels als er onvoldoende geheugen beschikbaar is. Raadpleeg RawPedia voor geheugen aanbevelingen. TP_WAVELET_TMSTRENGTH;Compressie sterkte TP_WAVELET_TMSTRENGTH_TOOLTIP;Bepaalt de sterkte van tonemapping of contrast compressie. Als de waarde anders is dan 0, dan worden de Sterkte en Gamma schuifbalken van Tonemapping in de Belichtings tab inactief. @@ -1936,6 +2271,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;Kies TP_WBALANCE_SHADE;Schaduw TP_WBALANCE_SIZE;Grootte: TP_WBALANCE_SOLUX35;Solux 3500K @@ -1962,364 +2298,1795 @@ 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. -!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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? -!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? -!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. -!FILEBROWSER_POPUPREMOVE;Delete permanently -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. -!GENERAL_CURRENT;Current -!GENERAL_HELP;Help -!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 -!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;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_494;Capture Sharpening -!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -!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_LUMINANCE;Dehaze - Luminance only -!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength -!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold -!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold -!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative -!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values -!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve -!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries -!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D -!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_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius -!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion -!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction -!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter -!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_FRAME_PLACES_DEL;Remove -!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. -!MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a -!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_FILMNEGATIVE;Film Negative -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!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_PSEUDOHIDPI;Pseudo-HiDPI mode -!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_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_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 -!PREFERENCES_CROP_GUIDES_NONE;None -!PREFERENCES_DIRECTORIES;Directories -!PREFERENCES_EDITORCMDLINE;Custom command line -!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser -!PREFERENCES_LANG;Language -!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_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 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 -!PROGRESSBAR_DECODING;Decoding... -!PROGRESSBAR_GREENEQUIL;Green equilibration... -!PROGRESSBAR_HLREC;Highlight reconstruction... -!PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -!PROGRESSBAR_LINEDENOISE;Line noise filter... -!PROGRESSBAR_RAWCACORR;Raw CA correction... -!QINFO_FRAMECOUNT;%2 frames -!QINFO_HDR;HDR / %2 frame(s) -!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) -!QUEUE_LOCATION_TITLE;Output Location -!QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s -!SAMPLEFORMAT_0;Unknown data format -!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_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_PPI;PPI -!TP_CROP_RESETCROP;Reset -!TP_CROP_SELECTCROP;Select -!TP_DEHAZE_DEPTH;Depth -!TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map -!TP_DEHAZE_STRENGTH;Strength -!TP_DIRPYRDENOISE_CHROMINANCE_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_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -!TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick neutral spots -!TP_FILMNEGATIVE_RED;Red ratio -!TP_ICM_WORKING_TRC;Tone response curve: -!TP_ICM_WORKING_TRC_CUSTOM;Custom -!TP_ICM_WORKING_TRC_GAMMA;Gamma -!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 selected -!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file -!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected -!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. -!TP_LENSPROFILE_MODE_HEADER;Lens Profile -!TP_LENSPROFILE_USE_CA;Chromatic aberration -!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion -!TP_LENSPROFILE_USE_HEADER;Correct -!TP_LENSPROFILE_USE_VIGNETTING;Vignetting -!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_PDSHARPENING_LABEL;Capture Sharpening -!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_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. -!TP_RAW_RCD;RCD -!TP_RAW_RCDVNG4;RCD+VNG4 -!TP_RAW_XTRANS;X-Trans -!TP_RAW_XTRANSFAST;Fast X-Trans -!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 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_SHARPENING_ITERCHECK;Auto limit iterations -!TP_SHARPENING_RADIUS_BOOST;Corner radius boost -!TP_SHARPENMICRO_CONTRAST;Contrast threshold -!TP_SOFTLIGHT_LABEL;Soft Light -!TP_SOFTLIGHT_STRENGTH;Strength -!TP_TM_FATTAL_AMOUNT;Amount -!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 +!FILEBROWSER_POPUPINSPECT;Inspect +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_PREPROCWB;Preprocess White Balance +!PARTIALPASTE_SPOT;Spot removal +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_CROP_GTCENTEREDSQUARE;Centered square +!TP_DEHAZE_SATURATION;Saturation +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_OUT_LEVEL;Output level +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal +!TP_WAVELET_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. +!TP_WAVELET_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 4e5d950fc..06ed63aba 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -7,13 +7,23 @@ #07 2012-04-02 DrSlony #08 2013-05-21 DrSlony #09 2014-10-16 DrSlony +#10 2020-02-02 Bartłomiej Wiśniowski +#11 2020-02-02 Bartłomiej Wiśniowski +#12 2020-02-15 Bartłomiej Wiśniowski +#13 2020-02-17 Bartłomiej Wiśniowski ABOUT_TAB_BUILD;Wersja ABOUT_TAB_CREDITS;Zasługi ABOUT_TAB_LICENSE;Licencja ABOUT_TAB_RELEASENOTES;Notatki eksploatacyjne ABOUT_TAB_SPLASH;Ekran powitalny +ADJUSTER_RESET_TO_DEFAULT;Klik - przywróć wartość domyślną.\nCtrl+klik - przywróć wartość początkową. BATCH_PROCESSING;Przetwarzanie wsadowe +CURVEEDITOR_AXIS_IN;We: +CURVEEDITOR_AXIS_LEFT_TAN;Lw: +CURVEEDITOR_AXIS_OUT;Wy: +CURVEEDITOR_AXIS_RIGHT_TAN;Pw: +CURVEEDITOR_CATMULLROM;Elastyczny CURVEEDITOR_CURVE;Krzywa CURVEEDITOR_CURVES;Krzywe CURVEEDITOR_CUSTOM;Własna @@ -34,6 +44,16 @@ CURVEEDITOR_TOOLTIPPASTE;Wstaw krzywą ze schowka CURVEEDITOR_TOOLTIPSAVE;Zapisz krzywą CURVEEDITOR_TYPE;Typ: DIRBROWSER_FOLDERS;Katalogi +DONT_SHOW_AGAIN;Nie pokazuj tej wiadomości ponownie. +DYNPROFILEEDITOR_DELETE;Usuń +DYNPROFILEEDITOR_EDIT;Edytuj +DYNPROFILEEDITOR_IMGTYPE_ANY;Każdy +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_STD;Standardowy +DYNPROFILEEDITOR_MOVE_DOWN;Przesuń w dół +DYNPROFILEEDITOR_MOVE_UP;Przesuń w górę +DYNPROFILEEDITOR_NEW;Nowy +DYNPROFILEEDITOR_PROFILE;Profil przetwarzania EDITWINDOW_TITLE;Edytor obrazu EDIT_OBJECT_TOOLTIP;Wyświetla widżet na podglądzie który ułatwia ustawienie narzędzia. EDIT_PIPETTE_TOOLTIP;Aby dodać punkt do krzywej należy trzymac wciśnięty klawisz Ctrl podczas kliknięcia lewym guzikiem myszki na danym obszarze głównego podglądu.\nAby zmienic ustawienie już istniejącego punktu, należy trzymać wduszony klawisz Ctrl podczas kliknięcia lewym guzikiem myszki na danym obszarze głównego podglądu, następnie należy puścić klawisz Ctrl (chyba że chodzi nam o bardzo precyzyjne ustawienie dzieki spowolnieniu jakie trzymanie klawisza Ctrl nam daje) i podczas trzymania lewego guzika myszki należy myszką ruszać w pionie aby odpowiednio manipulować punktem w pionie. @@ -42,6 +62,7 @@ EXIFFILTER_CAMERA;Aparat EXIFFILTER_EXPOSURECOMPENSATION;Korekcja ekspozycji (EV) EXIFFILTER_FILETYPE;Typ pliku EXIFFILTER_FOCALLEN;Wartość ogniskowej +EXIFFILTER_IMAGETYPE;Typ obrazu EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Obiektyw EXIFFILTER_METADATAFILTER;Włącz filtry metadanych @@ -59,6 +80,7 @@ EXIFPANEL_RESET;Przywróć EXIFPANEL_RESETALL;Przywróć wszystkie EXIFPANEL_RESETALLHINT;Przywraca orginalne wartości etykiet EXIFPANEL_RESETHINT;Przywraca orginalne wartości wybranych etykiet +EXIFPANEL_SHOWALL;Pokaż wszystkie EXIFPANEL_SUBDIRECTORY;Podkatalog EXPORT_BYPASS_ALL;Zaznacz / Odznacz wszystkie EXPORT_BYPASS_DEFRINGE;Pomiń usuwanie widma @@ -90,6 +112,8 @@ FILEBROWSER_AUTODARKFRAME;Automatyczne użycie czarnej klatki FILEBROWSER_AUTOFLATFIELD;Automatyczne użycie klatki typu puste pole 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;Wyczyść wszystkie profile +FILEBROWSER_CACHECLEARFROMPARTIAL;Wyczyść wszystkie, oprócz znajdujących się w pamięci podręcznej 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 @@ -97,6 +121,7 @@ FILEBROWSER_CURRENT_NAME;Obecna nazwa: FILEBROWSER_DARKFRAME;Czarna klatka FILEBROWSER_DELETEDIALOG_HEADER;Potwierdzenie usunięcia pliku FILEBROWSER_EMPTYTRASH;Wyczyść kosz +FILEBROWSER_EMPTYTRASHHINT;Usuwa na zawsze pliki znajdujące się w koszu. FILEBROWSER_EXTPROGMENU;Otwórz za pomocą FILEBROWSER_FLATFIELD;Puste pole FILEBROWSER_MOVETODARKFDIR;Przenieś do katalogu zawierającego czarne klatki @@ -130,6 +155,7 @@ FILEBROWSER_POPUPRANK2;Ocena 2 ** FILEBROWSER_POPUPRANK3;Ocena 3 *** FILEBROWSER_POPUPRANK4;Ocena 4 **** FILEBROWSER_POPUPRANK5;Ocena 5 ***** +FILEBROWSER_POPUPREMOVE;Usuń na zawsze FILEBROWSER_POPUPRENAME;Zmień nazwę FILEBROWSER_POPUPSELECTALL;Zaznacz wszystkie FILEBROWSER_POPUPTRASH;Przenieś do kosza @@ -144,6 +170,7 @@ FILEBROWSER_RANK3_TOOLTIP;Oceń 3 *\nSkrót: Shift-3 FILEBROWSER_RANK4_TOOLTIP;Oceń 4 *\nSkrót: Shift-4 FILEBROWSER_RANK5_TOOLTIP;Oceń 5 *\nSkrót: Shift-5 FILEBROWSER_RENAMEDLGLABEL;Zmień nazwę pliku +FILEBROWSER_RESETDEFAULTPROFILE;Przywróć domyślne FILEBROWSER_SELECTDARKFRAME;Wybierz czarną klatkę... FILEBROWSER_SELECTFLATFIELD;Wybierz puste pole... FILEBROWSER_SHOWCOLORLABEL1HINT;Pokazuje zdjęcia z czerwoną etykietą.\nSkrót: Alt-1 @@ -155,6 +182,7 @@ FILEBROWSER_SHOWDIRHINT;Wyłącza wyszstkie filtry.\nSkrót: d FILEBROWSER_SHOWEDITEDHINT;Pokazuje edytowane zdjęcia.\nSkrót: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Pokazuje nieedytowane zdjęcia.\nSkrót: 6 FILEBROWSER_SHOWEXIFINFO;Pokaż dane Exif.\n\nSkróty:\ni - Tryb wielu zakładek,\nAlt-i - Tryb jednej zakładki. +FILEBROWSER_SHOWNOTTRASHHINT;Pokazuj tylko obrazy które nie znajdują się w koszu. FILEBROWSER_SHOWRANK1HINT;Pokazuje zdjęcia ocenione na 1 gwiazdkę.\nSkrót: 1 FILEBROWSER_SHOWRANK2HINT;Pokazuje zdjęcia ocenione na 2 gwiazdki.\nSkrót: 2 FILEBROWSER_SHOWRANK3HINT;Pokazuje zdjęcia ocenione na 3 gwiazdki.\nSkrót: 3 @@ -169,24 +197,39 @@ FILEBROWSER_THUMBSIZE;Rozmiar minaturek FILEBROWSER_UNRANK_TOOLTIP;Usuń ocenę.\nSkrót: Shift-0 FILEBROWSER_ZOOMINHINT;Zwiększa rozmiar miniaturek.\n\nSkróty:\n+ - Tryb wielu zakładek,\nAlt-+ - Tryb pojedyńczej zakładki. FILEBROWSER_ZOOMOUTHINT;Zmniejsza rozmiar miniaturek.\n\nSkróty:\n- - Tryb wielu zakładek,\nAlt-- - Tryb pojedyńczej zakładki. +FILECHOOSER_FILTER_ANY;Wszystkie pliki +FILECHOOSER_FILTER_COLPROF;Profile kolorów (*.icc) +FILECHOOSER_FILTER_CURVE;Pliki krzywych +FILECHOOSER_FILTER_LCP;Profile korekcyjne obiektywów +FILECHOOSER_FILTER_PP;Profile przetwarzania +FILECHOOSER_FILTER_SAME;Taki sam format jak aktualnego zdjęcia +FILECHOOSER_FILTER_TIFF;Pliki TIFF GENERAL_ABOUT;O programie GENERAL_AFTER;Po +GENERAL_APPLY;Zastosuj +GENERAL_ASIMAGE;Jako obraz GENERAL_AUTO;Automatyczne GENERAL_BEFORE;Przed GENERAL_CANCEL;Anuluj GENERAL_CLOSE;Zamknij +GENERAL_CURRENT;Obecny GENERAL_DISABLE;Wyłącz GENERAL_DISABLED;Wyłączone GENERAL_ENABLE;Włącz GENERAL_ENABLED;Włączone GENERAL_FILE;Plik +GENERAL_HELP;Pomoc GENERAL_LANDSCAPE;Poziomo GENERAL_NA;nd. GENERAL_NO;Nie GENERAL_NONE;Żaden GENERAL_OK;OK +GENERAL_OPEN;Otwórz GENERAL_PORTRAIT;Pionowo +GENERAL_RESET;Resetuj GENERAL_SAVE;Zapisz +GENERAL_SAVE_AS;Zapisz jako... +GENERAL_SLIDER;Suwak GENERAL_UNCHANGED;(Niezmienione) GENERAL_WARNING;Uwaga HISTOGRAM_TOOLTIP_B;Pokaż/Ukryj histogram błękitów. @@ -195,13 +238,11 @@ HISTOGRAM_TOOLTIP_CHRO;Pokaż/Ukryj histogram chromatyczności. HISTOGRAM_TOOLTIP_G;Pokaż/Ukryj histogram zieleni. HISTOGRAM_TOOLTIP_L;Pokaż/Ukryj histogram luminancji CIELab. HISTOGRAM_TOOLTIP_R;Pokaż/Ukryj histogram czerwieni. -HISTOGRAM_TOOLTIP_RAW;Pokaż/Ukryj histogram raw. HISTORY_CHANGED;Zmieniono HISTORY_CUSTOMCURVE;Krzywa własna HISTORY_FROMCLIPBOARD;Ze schowka HISTORY_LABEL;Historia HISTORY_MSG_1;Zdjęcie załadowane -HISTORY_MSG_2;Profil załadowany HISTORY_MSG_3;Profil zmieniony HISTORY_MSG_4;Przeglądanie historii HISTORY_MSG_5;Światłość @@ -215,9 +256,6 @@ HISTORY_MSG_12;Automatyczna ekspozycja HISTORY_MSG_13;Przycinanie ekspozycji HISTORY_MSG_14;L*a*b* - Światłość HISTORY_MSG_15;L*a*b* - Kontrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- HISTORY_MSG_19;Krzywa L* HISTORY_MSG_20;Wyostrzanie HISTORY_MSG_21;USM - Promień @@ -243,10 +281,6 @@ HISTORY_MSG_40;BB - Odcień HISTORY_MSG_41;Tryb krzywej 1 HISTORY_MSG_42;Krzywa 1 HISTORY_MSG_43;Tryb krzywej 2 -HISTORY_MSG_44;Odszumianie lum. - Promień -HISTORY_MSG_45;Odszumianie lum. - Tolerancja krawędzi -HISTORY_MSG_46;Odszumianie koloru -HISTORY_MSG_47;Mieszanie podświetleń ICC z matrycą HISTORY_MSG_48;Użycie krzywej tonalnej z DCP HISTORY_MSG_49;Illuminant DCP HISTORY_MSG_50;Cienie/Podświetlenia @@ -254,7 +288,6 @@ HISTORY_MSG_51;C/P - Podświetlenia HISTORY_MSG_52;C/P - Cienie HISTORY_MSG_53;C/P - Szerokość tonalna podśw. HISTORY_MSG_54;C/P - Szerokość tonalna cieni -HISTORY_MSG_55;C/P - Kontrast lokalny HISTORY_MSG_56;C/P - Promień HISTORY_MSG_57;Obrót dyskretny HISTORY_MSG_58;Odbicie w poziomie @@ -266,7 +299,6 @@ HISTORY_MSG_63;Migawka wybrana HISTORY_MSG_64;Kadrowanie HISTORY_MSG_65;Korekcja aberracji chromatycznej HISTORY_MSG_66;Rekonstrukcja prześwietleń -HISTORY_MSG_67;Rekonstrukcja prześwietleń - Siła HISTORY_MSG_68;Rekonstrukcja prześwietleń - Metoda HISTORY_MSG_69;Robocza przestrzeń kolorów HISTORY_MSG_70;Wyjściowa przestrzeń kolorów @@ -277,12 +309,10 @@ HISTORY_MSG_74;Zmiany rozmiaru - Skala HISTORY_MSG_75;Zmiany rozmiaru - Metoda HISTORY_MSG_76;Metadane Exif HISTORY_MSG_77;Metadane IPTC -HISTORY_MSG_78;- HISTORY_MSG_79;Zmiany rozmiaru - Szerokość HISTORY_MSG_80;Zmiany rozmiaru - Wysokość HISTORY_MSG_81;Zmiany rozmiaru HISTORY_MSG_82;Profil zmieniony -HISTORY_MSG_83;C/P - Ostra maska HISTORY_MSG_84;Korekcja perspektywy HISTORY_MSG_85;LCP HISTORY_MSG_86;Krzywe RGB - Tryb luminancji @@ -329,12 +359,6 @@ HISTORY_MSG_127;Puste pole - Auto-wybór HISTORY_MSG_128;Puste pole - Promień rozmycia HISTORY_MSG_129;Puste pole - Typ rozmycia HISTORY_MSG_130;Automatyczna korekcja dystorsji -HISTORY_MSG_131;RS - Luma -HISTORY_MSG_132;RS - Chroma -HISTORY_MSG_133;Gamma wyjściowa -HISTORY_MSG_134;Wolna gamma -HISTORY_MSG_135;Wolna gamma -HISTORY_MSG_136;Nachylenie gamma HISTORY_MSG_137;Poziom czerni - Zielony 1 HISTORY_MSG_138;Poziom czerni - Czerwony HISTORY_MSG_139;Poziom czerni - Niebieski @@ -364,12 +388,14 @@ HISTORY_MSG_162;Tone Mapping HISTORY_MSG_163;Krzywe RGB - Czerwona HISTORY_MSG_164;Krzywe RGB - Zielona HISTORY_MSG_165;Krzywe RGB - Niebieska +HISTORY_MSG_166;Ekspozycja - Reset HISTORY_MSG_167;Algorytm demozaikowania HISTORY_MSG_168;L*a*b* - Krzywa CC HISTORY_MSG_169;L*a*b* - Krzywa CH HISTORY_MSG_170;Jaskrawość - Krzywa HH HISTORY_MSG_171;L*a*b* - Krzywa LC HISTORY_MSG_172;L*a*b* - Ogranicz LC +HISTORY_MSG_173;NR - Odzyskiwanie detali HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptacja CAT02 HISTORY_MSG_176;CAM02 - Otoczenie @@ -399,6 +425,7 @@ HISTORY_MSG_199;CAM02 - Histogramy wyjściowe HISTORY_MSG_200;CAMO2 - Tone mapping HISTORY_MSG_201;RS - Chrominancja - R&G HISTORY_MSG_202;RS - Chrominancja - B&Y +HISTORY_MSG_203;NR - Przestrzeń kolorów HISTORY_MSG_204;Kroki poprawy LMMSE HISTORY_MSG_205;CAM02 - Gorące/uszkodzone px HISTORY_MSG_206;CAT02 - Auto luminancja sceny @@ -442,12 +469,12 @@ HISTORY_MSG_246;Krzywa CL HISTORY_MSG_247;Krzywa LH HISTORY_MSG_248;Krzywa HH HISTORY_MSG_249;KwgPS - Próg -HISTORY_MSG_250;RS - Ulepszona HISTORY_MSG_251;B&W - Algorytm HISTORY_MSG_252;KwgPS - Odcienie skóry HISTORY_MSG_253;KwgPS - Redukcja błędów HISTORY_MSG_254;KwgPS - Odcienie skóry HISTORY_MSG_255;RS - Filtr mediana +HISTORY_MSG_256;NR - Mediana - Typ HISTORY_MSG_257;Koloryzacja HISTORY_MSG_258;Koloryzacja - Kolor HISTORY_MSG_259;Koloryzacja - Przezroczystość @@ -464,8 +491,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_274;Koloryzacja - Nasycenie cieni -HISTORY_MSG_275;Koloryzacja - Nasycenie jasnych HISTORY_MSG_276;Koloryzacja - Przezroczystość HISTORY_MSG_277;--unused-- HISTORY_MSG_278;Koloryzacja - Zachowaj luminancję @@ -487,35 +512,208 @@ HISTORY_MSG_293;Symulacja Kliszy HISTORY_MSG_294;Symulacja Kliszy - Siła HISTORY_MSG_295;Symulacja Kliszy - Klisza HISTORY_MSG_296;RS - Modulacja luminancji +HISTORY_MSG_297;NR - Tryb HISTORY_MSG_298;Filtrowanie martwych pikseli +HISTORY_MSG_299;NR - Krzywa chrominancji +HISTORY_MSG_301;NR - Kontrola luminancji +HISTORY_MSG_302;NR - Metoda chrominancji +HISTORY_MSG_303;NR - Metoda chrominancji +HISTORY_MSG_304;W - Poziomy kontrastu +HISTORY_MSG_306;W - Proces +HISTORY_MSG_307;W - Proces +HISTORY_MSG_308;W - Kierunek procesu +HISTORY_MSG_309;W - ES - Detale +HISTORY_MSG_312;W - Residual - Próg cieni +HISTORY_MSG_315;W - Residual - Kontrast +HISTORY_MSG_317;W - Gamut - Odcień skóry +HISTORY_MSG_318;W - Kontrast - Poziom podświetleń +HISTORY_MSG_319;W - Kontrast - Zakres podświetleń +HISTORY_MSG_320;W - Kontrast - Zakres cieni +HISTORY_MSG_321;W - Kontrast - Poziom cieni +HISTORY_MSG_322;W - Gamut - Unikaj przesunięcia kolorów +HISTORY_MSG_323;W - ES - Kontrast lokalny +HISTORY_MSG_324;W - Chroma - Pastelowe +HISTORY_MSG_325;W - Chroma - Nasycone +HISTORY_MSG_326;W - Chroma - Metoda +HISTORY_MSG_333;W - Residual - Cienie +HISTORY_MSG_334;W - Residual - Chrominancja +HISTORY_MSG_335;W - Residual - Podświetlenia +HISTORY_MSG_336;W - Residual - Próg podświetleń +HISTORY_MSG_337;W - Residual - Odcień nieba +HISTORY_MSG_338;W - ES - Promień +HISTORY_MSG_339;W - ES - Siła +HISTORY_MSG_340;W - Siła +HISTORY_MSG_343;W - Poziomy chrominancji +HISTORY_MSG_345;W - ES - Kontrast lokalny +HISTORY_MSG_346;W - ES - Tryb kontrastu lokalnego +HISTORY_MSG_347;W - Odszumianie - Poziom 1 +HISTORY_MSG_348;W - Odszumianie - Poziom 2 +HISTORY_MSG_349;W - Odszumianie - Poziom 3 +HISTORY_MSG_352;W - Tło +HISTORY_MSG_355;W - ES - Niski próg +HISTORY_MSG_356;W - ES - Wysoki próg +HISTORY_MSG_359;Hot/Dead - Próg +HISTORY_MSG_362;W - Residual - Metoda kompresji +HISTORY_MSG_363;W - Residual - Siła kompersji +HISTORY_MSG_364;W - Final - Balans kontrastu +HISTORY_MSG_368;W - Final - Balans kontrastu +HISTORY_MSG_369;W - Final - Metoda balansu +HISTORY_MSG_370;W - Final - Krzywa lokalnego kontrastu +HISTORY_MSG_372;PRS USM - Promień +HISTORY_MSG_373;PRS USM - Ilość +HISTORY_MSG_374;PRS USM - Próg +HISTORY_MSG_376;PRS USM - Promień wykrywania krawędzi +HISTORY_MSG_377;PRS USM - Tolerancja krawędzi +HISTORY_MSG_380;PRS - Metoda +HISTORY_MSG_381;PRS RLD - Promień +HISTORY_MSG_382;PRS RLD - Ilość +HISTORY_MSG_384;PRS RLD - Iteracje +HISTORY_MSG_385;W - Residual - Balans kolorów +HISTORY_MSG_392;W - Residual - Balans kolorów +HISTORY_MSG_405;W - Odszumianie - Poziom 4 +HISTORY_MSG_407;Retinex - Metoda +HISTORY_MSG_408;Retinex - Promień +HISTORY_MSG_410;Retinex - Przesunięcie +HISTORY_MSG_411;Retinex - Siła +HISTORY_MSG_413;Retinex - Kontrast +HISTORY_MSG_418;Retinex - Próg +HISTORY_MSG_419;Retinex - Przestrzeń kolorów +HISTORY_MSG_421;Retinex - Gamma +HISTORY_MSG_422;Retinex - Gamma +HISTORY_MSG_426;Retinex - Wyrównywanie odcieni +HISTORY_MSG_429;Retinex - Iteracje +HISTORY_MSG_432;Retinex - M - Podświetlenia +HISTORY_MSG_434;Retinex - M - Cienie +HISTORY_MSG_436;Retinex - M - Promień +HISTORY_MSG_437;Retinex - M - Metoda +HISTORY_MSG_438;Retinex - M - Wyrównywanie +HISTORY_MSG_439;Retinex - Proces +HISTORY_MSG_440;CbDL - Metoda +HISTORY_MSG_442;Retinex - Skala +HISTORY_MSG_449;PS - Adaptacja ISO +HISTORY_MSG_452;PS - Pokaż ruch +HISTORY_MSG_453;PS - Pokaż tylko maskę +HISTORY_MSG_465;PS - Promień rozmycia +HISTORY_MSG_468;PS - Wypełnij dziury +HISTORY_MSG_471;PS - Korekcja ruchu +HISTORY_MSG_472;PS - Miękkie przejścia +HISTORY_MSG_474;PS - Wyrównaj +HISTORY_MSG_475;PS - Wyrównaj kanał +HISTORY_MSG_485;Korekcja obiektywu +HISTORY_MSG_486;Korekcja obiektywu - Aparat +HISTORY_MSG_487;Korekcja obiektywu - Obiektyw +HISTORY_MSG_489;DRC - Detal +HISTORY_MSG_490;DRC - Ilość +HISTORY_MSG_491;Balans bieli +HISTORY_MSG_492;Krzywe RGB +HISTORY_MSG_CLAMPOOG;Ucinaj kolory spoza zakresu +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Korekcja koloru +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Korekcja koloru +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Kanał +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturacja +HISTORY_MSG_DEHAZE_DEPTH;Usuwanie mgły - Głębia +HISTORY_MSG_DEHAZE_ENABLED;Usuwanie mgły +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Usuwanie mgły - Pokaż mapę głębokości +HISTORY_MSG_DEHAZE_STRENGTH;Usuwanie mgły - Siła +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Kontrast lokalny - Ilość +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Kontrast lokalny - Ciemne miejsca +HISTORY_MSG_LOCALCONTRAST_ENABLED;Kontrast lokalny +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Kontrast lokalny - Jasne miejsca +HISTORY_MSG_LOCALCONTRAST_RADIUS;Kontrast lokalny - Promień +HISTORY_MSG_MICROCONTRAST_CONTRAST;Mikrokontrast - Próg kontrastu +HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Automatyczny próg +HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Automatyczny promień +HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Automatycznie limituj iteracje +HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Próg kontrastu +HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iteracje +HISTORY_MSG_PDSHARPEN_RADIUS;CS - Promień +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Próg kontrastu +HISTORY_MSG_RAWCACORR_AUTOIT;Korekcja aberracji chromatycznej - Iteracje +HISTORY_MSG_RAWCACORR_COLORSHIFT;Korekcja aberracji chromatycznej - Unikaj przesunięcia kolorów +HISTORY_MSG_SHARPENING_BLUR;Wyostrzanie - Promień rozmycia +HISTORY_MSG_SHARPENING_CONTRAST;Wyostrzanie - Próg kontrastu +HISTORY_MSG_SH_COLORSPACE;S/H - Przestrzeń kolorów +HISTORY_MSG_SOFTLIGHT_ENABLED;Miękkie światło +HISTORY_MSG_SOFTLIGHT_STRENGTH;Miękkie światło - Siła +HISTORY_MSG_TRANS_METHOD;Geometria - Metoda HISTORY_NEWSNAPSHOT;Nowa migawka HISTORY_NEWSNAPSHOT_TOOLTIP;Skrót: Alt-s HISTORY_SNAPSHOT;Migawka HISTORY_SNAPSHOTS;Migawki +ICCPROFCREATOR_COPYRIGHT;Prawa autorskie: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Przywróć prawa autorskie do domyślnych, przyznanych dla "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Własny +ICCPROFCREATOR_DESCRIPTION;Opis: +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;Wersja 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;Domyślne +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;Niebieski X +ICCPROFCREATOR_PRIM_BLUY;Niebieski Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Zielony X +ICCPROFCREATOR_PRIM_GREY;Zielony Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Czerwony X +ICCPROFCREATOR_PRIM_REDY;Czerwony Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_WIDEG;Szeroka gama +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Zapisz profil ICC jako... +ICCPROFCREATOR_SLOPE;Nachylenie +ICCPROFCREATOR_TRC_PRESET;Krzywa odpowiedzi tonalnej: IPTCPANEL_CATEGORY;Kategoria IPTCPANEL_CITY;Miasto +IPTCPANEL_CITYHINT;Wprowadź nazwę miasta uwiecznionego na zdjęciu. IPTCPANEL_COPYHINT;Kopiuje ustawienia IPTC do schowka +IPTCPANEL_COPYRIGHT;Informacja o prawach autorskich +IPTCPANEL_COPYRIGHTHINT;Wprowadź informację o aktualnym posiadaczu praw autorskich np. ©2008 Jane Doe. IPTCPANEL_COUNTRY;Kraj +IPTCPANEL_COUNTRYHINT;Wprowadź nazwę kraju uwiecznionego na tym obrazie. +IPTCPANEL_CREATOR;Twórca +IPTCPANEL_CREATORHINT;Wprowadź nazwę twórcy obrazu. IPTCPANEL_CREDIT;Zasługa IPTCPANEL_CREDITHINT;Identyfikuje dostawcę zdjęcia, niekoniecznie właściciela lub autora (Credit). IPTCPANEL_DATECREATED;Data utworzenia +IPTCPANEL_DATECREATEDHINT;Wprowadź datę zrobienia zdjęcia. +IPTCPANEL_DESCRIPTION;Opis +IPTCPANEL_DESCRIPTIONWRITER;Twórca opisu IPTCPANEL_EMBEDDED;Osadzony IPTCPANEL_EMBEDDEDHINT;Resetuje dane IPTC do domyślnych ustawień osadzonych w orginalnym zdjęciu IPTCPANEL_HEADLINE;Nagłówek IPTCPANEL_INSTRUCTIONS;Instrukcje IPTCPANEL_KEYWORDS;Słowa kluczowe IPTCPANEL_PASTEHINT;Wstawia ustawienia IPTC ze schowka +IPTCPANEL_PROVINCE;Województwo lub stan IPTCPANEL_RESET;Reset IPTCPANEL_RESETHINT;Resetuje do domyślnych ustawień profilu IPTCPANEL_SOURCE;Źródło +IPTCPANEL_SUPPCATEGORIES;Dodatkowe kategorie IPTCPANEL_TITLE;Tytuł +IPTCPANEL_TRANSREFERENCE;Numer pracy +IPTCPANEL_TRANSREFERENCEHINT;!IPTCPANEL_TRANSREFERENCEHINT;Wprowadź numer pracy, który umożliwi śledzenie obrazu. MAIN_BUTTON_FULLSCREEN;Pełen ekran +MAIN_BUTTON_ICCPROFCREATOR;Kreator profili ICC MAIN_BUTTON_NAVNEXT_TOOLTIP;Przejdź do następnego zdjęcia względem zdjęcia otwartego w Edytorze.\nSkrót: Shift-F4\n\nAby przejść do następnego zdjęcia względem miniaturki wybranej w Nawigatorze Zdjęć:\nSkrót: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Przejdź do poprzedniego zdjęcia wzgledem zdjęcia otwartego w Edytorze.\nSkrót: Shift-F3 \n\nAby przejść do poprzedniego zdjęcia względem miniaturki wybranej w Nawigatorze Zdjęć:\nSkrót: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronizuj Nawigator Zdjęć z Edytorem aby ukazać miniaturkę obecnie otwartego zdjęcia, oraz usuń filtry w Nawigatorze Zdjęć.\nSkrót: x\n\nJak wyżej, ale bez usuwania filtrów:\nSkrót: y\n(Miniaturka otwartego zdjęcia nie zostanie wyświetlona jesli filtr ją ukrywa). MAIN_BUTTON_PREFERENCES;Ustawienia MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Dodaj bieżące zdjęcie do kolejki przetwarzania Ctrl+B MAIN_BUTTON_SAVE_TOOLTIP;Zapisz bieżące zdjęcieCtrl+S +MAIN_BUTTON_SENDTOEDITOR;Edytuj obraz w zewnętrznym edytorze MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Otwórz bieżące zdjęcie w zewnętrznym edytorze.\nSkrót: Ctrl+e MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Pokaż/Ukryj wszystkie panele boczne.\nSkrót: m MAIN_BUTTON_UNFULLSCREEN;Zwolnij ekran @@ -525,6 +723,7 @@ MAIN_FRAME_FILEBROWSER;Przeglądarka plików MAIN_FRAME_FILEBROWSER_TOOLTIP; Przeglądarka plików.\nSkrót: Ctrl-F2 MAIN_FRAME_PLACES;Miejsca MAIN_FRAME_PLACES_ADD;Dodaj +MAIN_FRAME_PLACES_DEL;Usuń MAIN_FRAME_QUEUE;Kolejka MAIN_FRAME_QUEUE_TOOLTIP;Przetwarzanie wsadowe\nSkrót: Ctrl-F3 MAIN_FRAME_RECENT;Ostatnio używane foldery @@ -540,7 +739,10 @@ MAIN_MSG_OPERATIONCANCELLED;Operację anulowano MAIN_MSG_PATHDOESNTEXIST;Ścieżka\n\n%1\n\nnie istnieje. Wybierz przawidłową ścieżkę w Ustawieniach. MAIN_MSG_QOVERWRITE;Zastąpić? MAIN_MSG_SETPATHFIRST;Aby użyć tej funkcji należy wpierw wybrać odpowiednią ścieżkę docelową w Ustawieniach! +MAIN_MSG_TOOMANYOPENEDITORS;Za duża liczba otwartych edytorów.\nZamknij edytor aby kontynuować. MAIN_MSG_WRITEFAILED;Zapis nie powiódł się:\n\n"%1"\n\nUpewnij się, że folder istnieje oraz że można do niego zapisywać. +MAIN_TAB_ADVANCED;Zaawansowane +MAIN_TAB_ADVANCED_TOOLTIP;Skrót: Alt-a MAIN_TAB_COLOR;Kolor MAIN_TAB_COLOR_TOOLTIP;Skrót: Alt-c MAIN_TAB_DETAIL;Szczegóły @@ -550,7 +752,10 @@ MAIN_TAB_EXIF;Exif MAIN_TAB_EXPORT; Szybki eksport MAIN_TAB_EXPOSURE;Ekspozycja MAIN_TAB_EXPOSURE_TOOLTIP;Skrót: Alt-e +MAIN_TAB_FAVORITES;Ulubione +MAIN_TAB_FAVORITES_TOOLTIP;Skrót: Alt-u MAIN_TAB_FILTER; Filtr +MAIN_TAB_INSPECT; Inspekcja MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Metadane MAIN_TAB_METADATA_TOOLTIP;Skrót: Alt-m @@ -576,6 +781,7 @@ MAIN_TOOLTIP_SHOWHIDERP1;Pokaż/Ukryj prawy panel.\nSkrót: Alt-l MAIN_TOOLTIP_SHOWHIDETP1;Pokaż/Ukryj górny panel.\nSkrót: Shift-l MAIN_TOOLTIP_THRESHOLD;Próg MAIN_TOOLTIP_TOGGLE;Przełącz widok Przed/Po.\nSkrót: Shift-b +MONITOR_PROFILE_SYSTEM;Ustawienia domyślne NAVIGATOR_B;B: NAVIGATOR_G;G: NAVIGATOR_H;H: @@ -588,6 +794,7 @@ NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Szerokość: %1, Wysokość: %2 NAVIGATOR_XY_NA;x: --, y: -- +PARTIALPASTE_ADVANCEDGROUP;Ustawienia zaawansowane PARTIALPASTE_BASICGROUP;Podstawowe ustawienia PARTIALPASTE_CACORRECTION;Korekcja aberacji chr. PARTIALPASTE_CHANNELMIXER;Mieszacz kanałów @@ -602,6 +809,7 @@ PARTIALPASTE_CROP;Kadrowanie PARTIALPASTE_DARKFRAMEAUTOSELECT;Auto-wybór czarnej klatki PARTIALPASTE_DARKFRAMEFILE;Wybór czarnej klatki PARTIALPASTE_DEFRINGE;Usuwanie widma +PARTIALPASTE_DEHAZE;Usuwanie mgły PARTIALPASTE_DETAILGROUP;Ustawienia szczegółowe PARTIALPASTE_DIALOGLABEL;Częściowe wklejenie profilu przetwarzania PARTIALPASTE_DIRPYRDENOISE;Redukcja szumu @@ -625,6 +833,7 @@ PARTIALPASTE_IPTCINFO;IPTC PARTIALPASTE_LABCURVE;Regulacje L*a*b* PARTIALPASTE_LENSGROUP;Ustawienia związane z obiektywem PARTIALPASTE_LENSPROFILE;Profil korekcji obiektywu LCP +PARTIALPASTE_LOCALCONTRAST;Kontrast lokalny PARTIALPASTE_METAGROUP;Metadane PARTIALPASTE_PCVIGNETTE;Winietowanie PARTIALPASTE_PERSPECTIVE;Perspektywa @@ -642,17 +851,26 @@ PARTIALPASTE_RAW_DMETHOD;Algorytm demozaikowania PARTIALPASTE_RAW_FALSECOLOR;Tłumienie fałszowania koloru PARTIALPASTE_RAW_LMMSEITERATIONS;Kroki poprawy LMMSE PARTIALPASTE_RESIZE;Zmiana rozmiaru +PARTIALPASTE_RETINEX;Retinex PARTIALPASTE_RGBCURVES;Krzywe RGB PARTIALPASTE_ROTATION;Obrót PARTIALPASTE_SHADOWSHIGHLIGHTS;Cienie/Podświetlenia PARTIALPASTE_SHARPENEDGE;Krawędzie PARTIALPASTE_SHARPENING;Wyostrzanie PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_SOFTLIGHT;Miękkie światło +PARTIALPASTE_TM_FATTAL;Kompresja zakresu dynamiki PARTIALPASTE_VIBRANCE;Jaskrawość PARTIALPASTE_VIGNETTING;Korekcja winietowania PARTIALPASTE_WHITEBALANCE;Balans bieli PREFERENCES_ADD;Dodaj +PREFERENCES_APPEARANCE;Wygląd +PREFERENCES_APPEARANCE_COLORPICKERFONT;Czcionka narzędzia do wybierania kolorów +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Kolor maski kadrowania +PREFERENCES_APPEARANCE_MAINFONT;Główny font PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Kolor ramki Nawigatora +PREFERENCES_APPEARANCE_PSEUDOHIDPI; Tryb pseudo-HiDPI +PREFERENCES_APPEARANCE_THEME;Motyw graficzny PREFERENCES_APPLNEXTSTARTUP;wymaga ponownego uruchomienia PREFERENCES_AUTOMONPROFILE;Automatycznie użyj systemowego profilu monitora PREFERENCES_BATCH_PROCESSING;Przetwarzanie wsadowe @@ -661,11 +879,33 @@ PREFERENCES_BEHADDALLHINT;Ustaw wszystkie narzędzia w tryb Dodaj.\nZmian 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_CACHECLEAR;Wyczyść +PREFERENCES_CACHECLEAR_ALL;Usuń wszystkie pliki z pamięci podręcznej: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Usuń wszystkie profile przetwarzania z pamięci podręcznej: PREFERENCES_CACHEMAXENTRIES;Maksymalna liczba wpisów w pamięci podręcznej PREFERENCES_CACHEOPTS;Opcje pamięci podręcznej PREFERENCES_CACHETHUMBHEIGHT;Maksymalna wysokość miniatury +PREFERENCES_CHUNKSIZES;Liczba kafelków na wątek +PREFERENCES_CHUNKSIZE_RAW_AMAZE;Demozaikowanie AMaZE +PREFERENCES_CHUNKSIZE_RAW_CA;Korekcja aberracji chromatycznej +PREFERENCES_CHUNKSIZE_RAW_RCD;Demozaikowanie RCD +PREFERENCES_CHUNKSIZE_RAW_XT;Demozaikowanie Xtrans +PREFERENCES_CHUNKSIZE_RGB;Przetwarzanie RGB PREFERENCES_CLIPPINGIND;Pokazywanie obciętych prześwietleń/cieni +PREFERENCES_CLUTSCACHE;Cache HaldCLUT PREFERENCES_CLUTSDIR;Folder obrazów HaldCLUT +PREFERENCES_CMMBPC;Kompensacja punktu czerni +PREFERENCES_CROP;Kadrowanie +PREFERENCES_CROP_AUTO_FIT;Automatycznie przybliż aby dopasować do skadrowanego obrazu +PREFERENCES_CROP_GUIDES;Zawsze pokazuj ramkę kadrowania +PREFERENCES_CROP_GUIDES_FRAME;Ramka +PREFERENCES_CROP_GUIDES_FULL;Oryginał +PREFERENCES_CROP_GUIDES_NONE;Brak +PREFERENCES_CURVEBBOXPOS;Położenie przycisków kopiuj oraz wklej krzywą +PREFERENCES_CURVEBBOXPOS_ABOVE;Powyżej +PREFERENCES_CURVEBBOXPOS_BELOW;Poniżej +PREFERENCES_CURVEBBOXPOS_LEFT;Z lewej +PREFERENCES_CURVEBBOXPOS_RIGHT;Z prawej PREFERENCES_CUSTPROFBUILD;Zewnętrzny kreator profilów przetwarzania PREFERENCES_CUSTPROFBUILDHINT;Plik wykonywalny (lub skrypt) uruchamiany kiedy trzeba wygenerować profil przetwarzania dla zdjęcia.\n\nScieżka pliku nośnego (w stylu *.ini czyli sekcje i klucze/parametry) występuje jako parametr wiersza poleceń. Plik ten zawiera przeróżne parametry oraz dane Exif dzięki którym odpowiedni program bądź skrypt może wygenerować plik PP3 według reguł.\n\nUWAGA: Twoją odpowiedzialnością jest prawidłowe użycie cudzysłowiów w przypadku ścieżek zawierających spacje i znaki specjalne. PREFERENCES_CUSTPROFBUILDKEYFORMAT;Rodzaj kluczy @@ -678,14 +918,17 @@ PREFERENCES_DARKFRAMETEMPLATES;szablonów(ny) PREFERENCES_DATEFORMAT;Format daty PREFERENCES_DATEFORMATHINT;Dozwolone są następujące kody formatujące:\n%y - rok\n%m - miesiąc\n%d - dzień\n\nNa przykład według standardu ISO 8601 format daty wygląda następująco:\n%y-%m-%d PREFERENCES_DIRDARKFRAMES;Katalog z czarnymi klatkami +PREFERENCES_DIRECTORIES;Katalogi PREFERENCES_DIRHOME;Katalog domowy PREFERENCES_DIRLAST;Ostatnio odwiedzony katalog PREFERENCES_DIROTHER;Inny PREFERENCES_DIRSELECTDLG;Wybierz katalog z obrazami po uruchomieniu... PREFERENCES_DIRSOFTWARE;Katalog instalacyjny +PREFERENCES_EDITORCMDLINE;Własny wiersz poleceń PREFERENCES_EDITORLAYOUT;Układ edytora PREFERENCES_EXTERNALEDITOR;Zewnętrzny edytor PREFERENCES_FBROWSEROPTS;Opcje przeglądarki plików +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Zwiń paski w przeglądarce plików PREFERENCES_FLATFIELDFOUND;Znaleziono PREFERENCES_FLATFIELDSDIR;Katalog z pustymi polami PREFERENCES_FLATFIELDSHOTS;kadry @@ -698,36 +941,57 @@ PREFERENCES_HISTOGRAM_TOOLTIP;Jeśli opcja jest włączona profil roboczy jest u PREFERENCES_HLTHRESHOLD;Próg dla prześwietleń PREFERENCES_ICCDIR;Katalog z profilami koloru ICC PREFERENCES_IMPROCPARAMS;Domyślne parametry przetwarzania obrazu +PREFERENCES_INSPECT_LABEL;Inspekcja +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maksymalna liczba obrazów w pamięci podręcznej PREFERENCES_INTENT_ABSOLUTE;Absolutnie kolorymetryczny PREFERENCES_INTENT_PERCEPTUAL;Percepcyjny PREFERENCES_INTENT_RELATIVE;Względnie kolorymetryczny PREFERENCES_INTENT_SATURATION;Nasyceniowy PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Pokaż osadzoną miniaturę JPEG jeśli plik raw jest nieedytowany +PREFERENCES_LANG;Język PREFERENCES_LANGAUTODETECT;Użyj języka systemowego +PREFERENCES_MAXRECENTFOLDERS;Maksymalna liczba ostatnio otwieranych folderów PREFERENCES_MENUGROUPEXTPROGS;Grupuj "Otwórz za pomocą" PREFERENCES_MENUGROUPFILEOPERATIONS;Grupuj operacje plików PREFERENCES_MENUGROUPLABEL;Grupuj operacje etykiet PREFERENCES_MENUGROUPPROFILEOPERATIONS;Grupuj operacje profili przetwarzania PREFERENCES_MENUGROUPRANK;Grupuj operacje oceny PREFERENCES_MENUOPTIONS;Opcje menu +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Domyślny profil kolorów +PREFERENCES_MONPROFILE_WARNOSX;Z powodu ograniczeń MacOS, dostępna jest tylko paleta sRGB. PREFERENCES_MULTITAB;Tryb wielu zakładek PREFERENCES_MULTITABDUALMON;Tryb wielu zakładek (na drugim monitorze jeśli dostępny) +PREFERENCES_NAVIGATIONFRAME;Nawigacja PREFERENCES_OVERLAY_FILENAMES;Nakładaj nazwy pliku na miniatury +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Nakładaj nazwy plików na miniaturki w przeglądarce PREFERENCES_OVERWRITEOUTPUTFILE;Nadpisuj istniejące pliki PREFERENCES_PANFACTORLABEL;Współczynnik PREFERENCES_PARSEDEXT;Przetwarzane rozszerzenia PREFERENCES_PARSEDEXTADD;Dodaj rozszerzenie PREFERENCES_PARSEDEXTADDHINT;Proszę wprowadzić rozszerzenie i zatwierdzić przyciskiem, by dodać do listy PREFERENCES_PARSEDEXTDELHINT;Skasuje wybrane rozszerzenie z listy +PREFERENCES_PARSEDEXTDOWNHINT;Przenieś wybrane rozszerzenie w dół. +PREFERENCES_PARSEDEXTUPHINT;Przenieś wybrane rozszerzenie w górę. +PREFERENCES_PERFORMANCE_MEASURE;Zmierz +PREFERENCES_PERFORMANCE_THREADS;Wątki +PREFERENCES_PREVDEMO;Metoda demozaikowania podglądu +PREFERENCES_PREVDEMO_FAST;Szybka +PREFERENCES_PREVDEMO_LABEL;Metoda demozaikowania podczas podglądu przy powiększeniu mniejszym niż 100%: +PREFERENCES_PREVDEMO_SIDECAR;Tak jak w PP3 PREFERENCES_PROFILEHANDLING;Obsługa profili PREFERENCES_PROFILELOADPR;Priorytet wczytywania profilu PREFERENCES_PROFILEPRCACHE;Profil w pamięci podręcznej PREFERENCES_PROFILEPRFILE;Profil przy pliku wejściowym PREFERENCES_PROFILESAVECACHE;Zapisz parametry przetwarzania w pamięci podręcznej PREFERENCES_PROFILESAVEINPUT;Zapisz parametry przetwarzania obok pliku wejściowego +PREFERENCES_PROFILESAVELOCATION;Miejsce zapisywania profilu przetwarzania +PREFERENCES_PROFILE_NONE;Żaden PREFERENCES_PROPERTY;Własność +PREFERENCES_PRTPROFILE;Profil kolorów PREFERENCES_PSPATH;Katalog w którym zainstalowany jest Adobe Photoshop PREFERENCES_SELECTLANG;Wybierz język +PREFERENCES_SERIALIZE_TIFF_READ;Ustawienia odczytu TIFF PREFERENCES_SET;Ustaw PREFERENCES_SHOWBASICEXIF;Pokaż podstawowe dane Exif PREFERENCES_SHOWDATETIME;Pokaż datę i czas @@ -744,7 +1008,9 @@ 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_THUMBNAIL_INSPECTOR_MODE;Image to show PREFERENCES_TP_LABEL;Panel narzędzi: PREFERENCES_TP_VSCROLLBAR;Ukry pionowy pasek przesuwania PREFERENCES_USEBUNDLEDPROFILES;Użyj załączone profile przetwarzania @@ -754,10 +1020,11 @@ PROFILEPANEL_GLOBALPROFILES;Załączone profile przetwarzania PROFILEPANEL_LABEL;Profil przetwarzania PROFILEPANEL_LOADDLGLABEL;Wczytaj profil przetwarzania końcowego... PROFILEPANEL_LOADPPASTE;Parametry do załadowania -PROFILEPANEL_MODE_TIP;Tryb wypełnienia parametrów przetwarzania.\n\nWduszone: częściowe profile zostaną przetworzone w profile pełne; brakujące wartości zostana wypełnione domyślnymi, zakodowanymi w silniku RawTherapee.\n\nWyłączone: profile zostaną zastosowane takie, jakie są, zmieniając tylko te wartości, które zawierają. +PROFILEPANEL_MODE_TOOLTIP;Tryb wypełnienia parametrów przetwarzania.\n\nWduszone: częściowe profile zostaną przetworzone w profile pełne; brakujące wartości zostana wypełnione domyślnymi, zakodowanymi w silniku RawTherapee.\n\nWyłączone: profile zostaną zastosowane takie, jakie są, zmieniając tylko te wartości, które zawierają. PROFILEPANEL_MYPROFILES;Moje profile przetwarzania PROFILEPANEL_PASTEPPASTE;Parametry do wklejenia PROFILEPANEL_PCUSTOM;Własny +PROFILEPANEL_PDYNAMIC;Dynamika PROFILEPANEL_PFILE;Z pliku PROFILEPANEL_PINTERNAL;Neutralny PROFILEPANEL_PLASTSAVED;Ostatnio zapisany @@ -767,6 +1034,11 @@ PROFILEPANEL_TOOLTIPCOPY;Skopiuj aktualny profil do schowka PROFILEPANEL_TOOLTIPLOAD;Ładuj profil z pliku.\nCtrl+klik aby wybrać parametry do ładowania. PROFILEPANEL_TOOLTIPPASTE;Wklej profil ze schowka.\nCtrl+klik aby wybrać parametry do wklejenia. PROFILEPANEL_TOOLTIPSAVE;Zapisz aktualny profil.\nCtrl+klik aby wybrać parametry do zapisania. +PROGRESSBAR_DECODING;Dekodowanie... +PROGRESSBAR_GREENEQUIL;Równoważenie koloru zielonego... +PROGRESSBAR_HLREC;Rekonstrukcja podświetleń... +PROGRESSBAR_HOTDEADPIXELFILTER;Filtr gorących/martwych pikseli.. +PROGRESSBAR_LINEDENOISE;Liniowy filtr szumu... PROGRESSBAR_LOADING;Wczytywanie obrazu... PROGRESSBAR_LOADINGTHUMBS;Wczytywanie miniatur... PROGRESSBAR_LOADJPEG;Ładowanie pliku JPEG... @@ -775,14 +1047,18 @@ PROGRESSBAR_LOADTIFF;Ładowanie pliku TIFF... PROGRESSBAR_NOIMAGES;Nie znaleziono żadnych obrazów PROGRESSBAR_PROCESSING;Przetwarzanie obrazu... PROGRESSBAR_PROCESSING_PROFILESAVED;Zapisano profil przetwarzania +PROGRESSBAR_RAWCACORR;Korekcja aberracji chromatycznej... PROGRESSBAR_READY;Gotowe PROGRESSBAR_SAVEJPEG;Zapisywanie pliku JPEG... PROGRESSBAR_SAVEPNG;Zapisywanie pliku PNG... PROGRESSBAR_SAVETIFF;Zapisywanie pliku TIFF... PROGRESSBAR_SNAPSHOT_ADDED;Dodano migawkę PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil zmieniony w przeglądarce +QINFO_FRAMECOUNT;%2 klatki +QINFO_HDR;HDR / %2 klatka/i QINFO_ISO;ISO QINFO_NOEXIF;Dane Exif niedostępne. +QINFO_PIXELSHIFT;Pixel Shift / %2 klatka/i QUEUE_AUTOSTART;Autostart QUEUE_AUTOSTART_TOOLTIP;Rozpocznij przetwarzanie automatycznie gdy pojawi się nowe zadanie. QUEUE_DESTFILENAME;Ścieżka i nazwa pliku @@ -790,8 +1066,18 @@ QUEUE_FORMAT_TITLE;Format pliku QUEUE_LOCATION_FOLDER;Zapisz do katalogu QUEUE_LOCATION_TEMPLATE;Użyj schemat QUEUE_LOCATION_TEMPLATE_TOOLTIP;Dozwolone są następujące kody formatujące:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nKody formatujące odnoszą się do różnych elementów ścieżki zdjęcia, atrybutów zdjęcia oraz do arbitralnego ciągu numerycznego operacji wsadowej.\n\nPrzykładowo, jeśli zdjęcie obrabiane ma następującą ścieżkę:\n/home/andrzej/zdjecia/2010-10-31/dsc0042.nef\nznaczenie kodów formatujących jest następujące:\n%d4 = home\n%d3 = andrzej\n%d2 = zdjecia\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/andrzej/zdjecia/\n%p3 = /home/andrzej/\n%p4 = /home/\n\n%r zostanie zastąpione oceną zdjęcia. Jeśli zdjęcie nie posiada oceny, %r zostanie zastąpione liczbą '0'. Jeśli zdjęcie leży w śmietniku, %r zostanie zastąpione znakiem 'x'.\n\n%s1, %s2, etc. zostanie zastąpione ciągniem numerycznym dopełnionym od jednej do dziewięciu cyfr. Ciąg ten zostanie rozpocznięty od "1" za każdym razem gdy kolejka przetwarzania zostanie uruchomiona, i liczba jest zwiększona o "1" dla każdego zapisanego obrazu.\n\nJeśli chcesz zapisać obraz wyjściowy obok obrazu wejściowego, napisz:\n%p1/%f\n\nJeśli chcesz zapisać obraz wyjściowy w folderze o nazwie "wywolane" znajdującego się w katalogu zawierającym otwarty obraz, napisz:\n%p1/wywolane/%f\n\nJeśli chcesz zapisać obraz wyjściowy w folderze o nazwie "/home/andrzej/zdjecia/wywolane/2010-10-31", napisz:\n%p2/wywolane/%d1/%f +QUEUE_LOCATION_TITLE;Lokalizacja wyjściowa +SAMPLEFORMAT_0;Nieznany typ pliku +SAMPLEFORMAT_1;8-bit bez znaku +SAMPLEFORMAT_2;16-bit bez znaku +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;16-bit zmiennoprzecinkowy +SAMPLEFORMAT_32;24-bit zmiennoprzecinkowy +SAMPLEFORMAT_64;32-bit zmiennoprzecinkowy SAVEDLG_AUTOSUFFIX;Automatycznie dodaj przyrostek, jeżeli plik już istnieje SAVEDLG_FILEFORMAT;Format pliku +SAVEDLG_FILEFORMAT_FLOAT; zmiennoprzecinkowy SAVEDLG_FORCEFORMATOPTS;Wymuś opcje zapisu SAVEDLG_JPEGQUAL;Jakość JPEG SAVEDLG_PUTTOQUEUE;Umieść w kolejce przetwarzania @@ -848,6 +1134,8 @@ 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 kanałów +TP_BWMIX_NEUTRAL;Reset 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. @@ -876,6 +1164,9 @@ TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;Niebieski TP_CACORRECTION_LABEL;Korekcja aberracji chromatycznej TP_CACORRECTION_RED;Czerwony +TP_CBDL_AFT;Po zmianie na Cz-B +TP_CBDL_BEF;Przed zmianą na Cz-B +TP_CBDL_METHOD;Gdzie TP_CHMIXER_BLUE;Niebieski TP_CHMIXER_GREEN;Zielony TP_CHMIXER_LABEL;Mieszacz kanałów @@ -884,6 +1175,7 @@ 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_ABSOLUTELUMINANCE;Luminancja absolutna TP_COLORAPP_ALGO;Algorytm TP_COLORAPP_ALGO_ALL;Wszystkie TP_COLORAPP_ALGO_JC;Światłość + Chroma (JC) @@ -914,7 +1206,6 @@ TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Ustawienie chromy, nasycenia bądź barwistośc 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_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) TP_COLORAPP_HUE_TOOLTIP;Odcień (hue, h) - kąt pomiędzy 0° a 360°. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 @@ -925,6 +1216,8 @@ TP_COLORAPP_LIGHT;Światłość (J) TP_COLORAPP_LIGHT_TOOLTIP;Światłość w CIECAM02 różni się od światłości CIELab oraz RGB 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_NEUTRAL;Reset +TP_COLORAPP_NEUTRAL_TOOLTIP;Przywróć wszystkie suwaki oraz krzywe do wartości domyślnych TP_COLORAPP_RSTPRO;Ochrona odcieni skóry i czerwieni TP_COLORAPP_RSTPRO_TOOLTIP;Ochrona odcieni skóry i czerwieni (suwaki i krzywe) TP_COLORAPP_SURROUND;Otoczenie @@ -957,6 +1250,22 @@ TP_COLORTONING_HIGHLIGHT;Podświetlenia TP_COLORTONING_HUE;Odcień (hue) TP_COLORTONING_LAB;Mieszanie L*a*b* TP_COLORTONING_LABEL;Koloryzacja +TP_COLORTONING_LABREGION_CHANNEL;Kanał +TP_COLORTONING_LABREGION_CHANNEL_ALL;Wszystkie +TP_COLORTONING_LABREGION_CHANNEL_B;Niebieski +TP_COLORTONING_LABREGION_CHANNEL_G;Zielony +TP_COLORTONING_LABREGION_CHANNEL_R;Czerwony +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Korekcja +TP_COLORTONING_LABREGION_MASK;Maska +TP_COLORTONING_LABREGION_MASKBLUR;Rozmycie maski +TP_COLORTONING_LABREGION_OFFSET;Przesunięcie +TP_COLORTONING_LABREGION_POWER;Moc +TP_COLORTONING_LABREGION_SATURATION;Saturacja +TP_COLORTONING_LABREGION_SHOWMASK;Pokaż maskę +TP_COLORTONING_LABREGION_SLOPE;Nachylenie TP_COLORTONING_LUMA;Luminancja TP_COLORTONING_LUMAMODE;Zachowaj luminancję TP_COLORTONING_LUMAMODE_TOOLTIP;Luminancja zostanie zachowana przy zmianie kolorów. @@ -964,12 +1273,12 @@ TP_COLORTONING_METHOD;Metoda TP_COLORTONING_METHOD_TOOLTIP;"Mieszanie L*a*b*", "Suwaki RGB" oraz "Krzywe RGB" stosują interpolację do mieszania kolorów.\n"Balansowanie kolorów (cienie, półcienie, podświetlenia)" oraz "Nasycenie - Dwa Kolory" stosują kolory bezpośrednio.\n\nNarzędzie "Czarno-białe" można używac jednocześnie z narzędziem "Koloryzacji", co umożliwi tonowanie zdjęcia. TP_COLORTONING_MIDTONES;Półcienie TP_COLORTONING_NEUTRAL;Zresetuj suwaki -TP_COLORTONING_NEUTRAL_TIP;Zresetuj wszystkie wartości (cienie, półcienie, podświetlenia) na domyślne. +TP_COLORTONING_NEUTRAL_TOOLTIP;Zresetuj wszystkie wartości (cienie, półcienie, podświetlenia) na domyślne. TP_COLORTONING_OPACITY;Przezroczystość TP_COLORTONING_RGBCURVES;RGB - Krzywe TP_COLORTONING_RGBSLIDERS;RGB - Suwaki TP_COLORTONING_SA;Ochrona przed przesyceniem -TP_COLORTONING_SATURATEDOPACITY;Śiła +TP_COLORTONING_SATURATEDOPACITY;Siła TP_COLORTONING_SATURATIONTHRESHOLD;Próg TP_COLORTONING_SHADOWS;Cienie TP_COLORTONING_SPLITCO;Cienie/półcienie/podświetlenia @@ -992,6 +1301,9 @@ TP_CROP_GTRULETHIRDS;Trójpodział TP_CROP_GUIDETYPE;Typ pomocy: TP_CROP_H;Wysokość TP_CROP_LABEL;Kadrowanie +TP_CROP_PPI;PPI +TP_CROP_RESETCROP;Reset +TP_CROP_SELECTCROP;Wybierz TP_CROP_W;Szerokość TP_CROP_X;X TP_CROP_Y;Y @@ -1000,13 +1312,27 @@ TP_DARKFRAME_LABEL;Czarna klatka TP_DEFRINGE_LABEL;Usuwanie widma TP_DEFRINGE_RADIUS;Promień TP_DEFRINGE_THRESHOLD;Próg +TP_DEHAZE_DEPTH;Głębia +TP_DEHAZE_LABEL;Usuwanie mgły +TP_DEHAZE_SHOW_DEPTH_MAP;Pokaż mapę głębokości +TP_DEHAZE_STRENGTH;Siła +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatycznie TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominancja - Błękit-żółć +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Krzywa chrominancji +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominancja +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Ręcznie TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominancja - Główna +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metoda +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Podgląd TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominancja - Czerwień-zieleń +TP_DIRPYRDENOISE_LABEL;Redukcja szumu +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Kontrola luminancji TP_DIRPYRDENOISE_LUMINANCE_CURVE;Krzywa luminancji TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Szczegółowość luminancji +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminancja TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminacja TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metoda +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Dla obrazów raw można używać metody RGB oraz L*a*b*.\n\nDla obrazów nie-raw metoda L*a*b* zostanie użyta niezależnie od wyboru. TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma @@ -1016,6 +1342,7 @@ TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Wysoka TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standardowa TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Jakość może zostać dopasowana do wzoru szumów. Ustawienie "wysoka" ulepsza odszumianie około 20% wzrostu czasu przetwarzania. TP_DIRPYRDENOISE_MEDIAN_METHOD;Metoda mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Tylko Chroma TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtr Mediana TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Tylko luminancja @@ -1023,8 +1350,15 @@ TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Przy użyciu metod "tylko luminancja" oraz "L*a*b*", filtrowanie mediana zostanie wykonane prosto po funkcji falki w procesie odszumiania.\nW trybie "RGB" filtrowanie to zostanie wykonana pod koniec calego procesu. TP_DIRPYRDENOISE_MEDIAN_PASSES;Liczba powtórzeń mediana TP_DIRPYRDENOISE_MEDIAN_TYPE;Rodzaj mediana +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 miękko +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 miękko +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Zakres odcieni skóry TP_DIRPYREQUALIZER_ALGO_TOOLTIP;- +TP_DIRPYREQUALIZER_ARTIF;Usuń artefakty TP_DIRPYREQUALIZER_HUESKIN;Odcień skóry TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;Piramida wyznacza zakres kolorów uważany jako zakres odcieni skóry. Większość odcieni skóry - białej, czarnej, i pomiędzy - ma tę samą odcień. Małe poprawki są dopuszczalne, jednak jeśli potrzebna jest większa zmiana w lewo lub prawo, lub jeśli są widoczne artefakty, to najprawdopobniej balans bieli jest niepoprawny. TP_DIRPYREQUALIZER_LABEL;Kontrast wg. precyzji detali @@ -1040,16 +1374,18 @@ TP_DIRPYREQUALIZER_TOOLTIP;Zapobiega artefaktom w strefach przejścia pomiędzy TP_DISTORTION_AMOUNT;Siła TP_DISTORTION_LABEL;Dystorsja TP_EPD_EDGESTOPPING;Wyszukiwanie krawędzi +TP_EPD_GAMMA;Gamma TP_EPD_LABEL;Tone Mapping TP_EPD_REWEIGHTINGITERATES;Powtarzanie rozważania TP_EPD_SCALE;Skala TP_EPD_STRENGTH;Siła TP_EXPOSURE_AUTOLEVELS;Wyrównaj poziomy -TP_EXPOSURE_AUTOLEVELS_TIP;Dokonaj automatycznego ustawienia parametrów ekspozycji na podstawie analizy obrazu +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Dokonaj automatycznego ustawienia parametrów ekspozycji na podstawie analizy obrazu TP_EXPOSURE_BLACKLEVEL;Czerń TP_EXPOSURE_BRIGHTNESS;Jasność +TP_EXPOSURE_CLAMPOOG;Przytnij kolory spoza gamy kolorów TP_EXPOSURE_CLIP;Przytnij % -TP_EXPOSURE_CLIP_TIP;Ułamek pikseli ktore mają zostać rozjaśnione do punktu prześwietlenia podczas automatycznego wyrównania poziomów. +TP_EXPOSURE_CLIP_TOOLTIP;Ułamek pikseli ktore mają zostać rozjaśnione do punktu prześwietlenia podczas automatycznego wyrównania poziomów. TP_EXPOSURE_COMPRHIGHLIGHTS;Kompresja podświetleń TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Próg kompresji podświetleń TP_EXPOSURE_COMPRSHADOWS;Kompresja cieni @@ -1064,11 +1400,17 @@ TP_EXPOSURE_SATURATION;Nasycenie TP_EXPOSURE_TCMODE_FILMLIKE;Klisza TP_EXPOSURE_TCMODE_LABEL1;Tryb krzywej 1 TP_EXPOSURE_TCMODE_LABEL2;Tryb krzywej 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Luminancja +TP_EXPOSURE_TCMODE_PERCEPTUAL;Percepcyjny TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Mieszanie nasycenia i mocy światła białego TP_EXPOSURE_TCMODE_STANDARD;Standardowa TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Ważona standardowa TP_EXPOS_BLACKPOINT_LABEL;Punkt czerni raw TP_EXPOS_WHITEPOINT_LABEL;Punkt bieli raw +TP_FILMNEGATIVE_BLUE;Proporcja niebieskiego +TP_FILMNEGATIVE_LABEL;Negatyw - klisza +TP_FILMNEGATIVE_PICK;Wybierz miejsce neutralne +TP_FILMNEGATIVE_RED;Proporcja czerwonego TP_FILMSIMULATION_LABEL;Symulacja Kliszy TP_FILMSIMULATION_STRENGTH;Siła TP_FILMSIMULATION_ZEROCLUTSFOUND;Ustaw folder HaldCLUT w Ustawieniach @@ -1107,6 +1449,7 @@ TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;Ekwalizator HSV TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V +TP_ICM_BPC;Kompensacja punktu czerni TP_ICM_DCPILLUMINANT;Iluminant TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolowany TP_ICM_DCPILLUMINANT_TOOLTIP;Wybierz który osadzony iluminant DCP należy użyć. Domyślną opcją jest "interpolowany", czyli wartość jest mieszaniną pomiędzy dwoma osadzonymi wartościami iluminantu zależnie od balansu bieli. Ten wybór jest możliwy jedynie kiedy DCP zawiera dwa iluminanty z możliwościa interpolacji. @@ -1125,10 +1468,17 @@ TP_ICM_INPUTPROFILE;Profil wejściowy TP_ICM_LABEL;ICM TP_ICM_NOICM;Brak ICM: Wyjście sRGB TP_ICM_OUTPUTPROFILE;Profil wyjściowy +TP_ICM_SAVEREFERENCE_APPLYWB;Zastosuj balans bieli TP_ICM_SAVEREFERENCE_TOOLTIP;Zapisz liniowy obraz TIFF zanim profil wejściowy zostanie zastosowany. Obraz ten można użyć do kalibracji oraz do wytworzenia profilu aparatu. TP_ICM_TONECURVE;Użyj krzywą tonalną z DCP TP_ICM_TONECURVE_TOOLTIP;Włącz aby użyć krzywą tonalną znajdującą się w profilu DCP. Opcja ta jest tylko aktywna jeśli profil DCP zawiera krzywą tonalną. TP_ICM_WORKINGPROFILE;Profil roboczy +TP_ICM_WORKING_TRC;Krzywa odpowiedzi tonalnej: +TP_ICM_WORKING_TRC_CUSTOM;Własna +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;Żadna +TP_ICM_WORKING_TRC_SLOPE;Nachylenie +TP_ICM_WORKING_TRC_TOOLTIP;Tylko dla wbudowanych profili. TP_IMPULSEDENOISE_LABEL;Redukcja Szumów Impulsowych TP_IMPULSEDENOISE_THRESH;Próg TP_LABCURVE_AVOIDCOLORSHIFT;Zapobiegaj zmianom koloru @@ -1165,14 +1515,34 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance według odcieni (hue) L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminancja według luminancji L=f(L) TP_LABCURVE_LABEL;Regulacja L*a*b* TP_LABCURVE_LCREDSK;Ogranicz LC do odcieni skóry oraz czerwieni -TP_LABCURVE_LCREDSK_TIP;Kiedy opcja jest włączona, wpływ krzywej LC (Luminancja według chromatyczności) jest ograniczony do odcieni skóry oraz czerwieni.\nKiedy opcja jest wyłączona, krzywa LC wpływa na wszystkie barwy. +TP_LABCURVE_LCREDSK_TOOLTIP;Kiedy opcja jest włączona, wpływ krzywej LC (Luminancja według chromatyczności) jest ograniczony do odcieni skóry oraz czerwieni.\nKiedy opcja jest wyłączona, krzywa LC wpływa na wszystkie barwy. TP_LABCURVE_RSTPROTECTION;Ochrona skóry oraz czerwieni TP_LABCURVE_RSTPRO_TOOLTIP;Ma wpływ na suwak Chromatyczności oraz na krzywą CC. TP_LENSGEOM_AUTOCROP;Auto-kadrowanie TP_LENSGEOM_FILL;Auto-wypełnienie TP_LENSGEOM_LABEL;Obiektyw / Geometria +TP_LENSGEOM_LIN;Liniowo +TP_LENSGEOM_LOG;Logarytmicznie +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Wybierz automatycznie +TP_LENSPROFILE_CORRECTION_LCPFILE;Plik LCP +TP_LENSPROFILE_CORRECTION_MANUAL;Wybierz ręcznie TP_LENSPROFILE_LABEL;Profil korekcji obiektywu LCP -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_LENSPROFILE_MODE_HEADER;Profil obiektywu +TP_LENSPROFILE_USE_CA;Aberracja chromatyczna +TP_LENSPROFILE_USE_GEOMETRIC;Zniekształcenia geometryczne +TP_LENSPROFILE_USE_HEADER;Popraw +TP_LENSPROFILE_USE_VIGNETTING;Winietowanie +TP_LOCALCONTRAST_AMOUNT;Ilość +TP_LOCALCONTRAST_DARKNESS;Ciemne miejsca +TP_LOCALCONTRAST_LABEL;Kontrast lokalny +TP_LOCALCONTRAST_LIGHTNESS;Jasne miejsca +TP_LOCALCONTRAST_RADIUS;Promień +TP_METADATA_EDIT;Zastosuj modyfikacje +TP_METADATA_MODE;Tryb kopiowania metadanych +TP_METADATA_STRIP;Usuń wszystkie metadane +TP_METADATA_TUNNEL;Kopiuj niezmienione +TP_NEUTRAL;Reset +TP_NEUTRAL_TOOLTIP;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. TP_PCVIGNETTE_LABEL;Winietowanie @@ -1192,8 +1562,15 @@ TP_PREPROCESS_HOTPIXFILT;Filtr gorących pikseli TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Łata gorące piksele (pojedyńcze świecące, przesycone piksele). TP_PREPROCESS_LABEL;Przetwarzanie początkowe TP_PREPROCESS_LINEDENOISE;Filtr zakłóceń liniowych +TP_PREPROCESS_LINEDENOISE_DIRECTION;Kierunek +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Oba +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Poziomo +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Pionowo TP_PREPROCESS_NO_FOUND;Nic nie znaleziono +TP_PRSHARPENING_LABEL;Wyostrzanie po zmianie rozmiaru TP_RAWCACORR_AUTO;Autokorekcja +TP_RAWCACORR_AUTOIT;Iteracje +TP_RAWCACORR_AVOIDCOLORSHIFT;Unikaj przesunięcia kolorów TP_RAWCACORR_CABLUE;Niebieski TP_RAWCACORR_CARED;Czerwony TP_RAWCACORR_LABEL;Korekcja aberracji chromatycznej @@ -1207,19 +1584,60 @@ TP_RAWEXPOS_BLACK_RED;Czerwony TP_RAWEXPOS_LINEAR;Liniowy współczynnik korekcji TP_RAWEXPOS_RGB;Czerwony, Zielony, Niebieski TP_RAWEXPOS_TWOGREEN;Połącz obie zielenie +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_DCB;DCB TP_RAW_DCBENHANCE;Zastosuj poprawę DCB TP_RAW_DCBITERATIONS;Liczba powtórzeń DCB +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Metoda TP_RAW_DMETHOD_PROGRESSBAR;Demozaikowanie %1... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Udoskonalanie demozaikowania... TP_RAW_DMETHOD_TOOLTIP;IGV oraz LMMSE są przeznaczone dla zdjęć raw o wysokim poziomie szumów (wysokie ISO) aby zapobiec utworzeniu się wzorków w kształcie małych labiryntów, posteryzacji oraz mydlanego wyglądu. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Próg automatyczny +TP_RAW_DUALDEMOSAICCONTRAST;Próg kontrastu +TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Kroki zapobiegające fałszowaniu kolorów +TP_RAW_FAST;Szybki +TP_RAW_HD;Próg +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV TP_RAW_LABEL;Demozaikowanie +TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;Ilość kroków udoskonalenia LMMSE TP_RAW_LMMSE_TOOLTIP;Aby zmniejszyć ilość artefaktów i poprawić stosunek sygnału do szumów, można wykorzystać następujące ustawienia:\n1: Gamma\n2-4: Średnia mediana\n5-6: Rafinowanie +TP_RAW_MONO;Mono +TP_RAW_PIXELSHIFTBLUR;Maska rozmycia ruchu +TP_RAW_PIXELSHIFTDMETHOD;Metoda demozaikowania ruchu +TP_RAW_PIXELSHIFTEPERISO;Czułość +TP_RAW_PIXELSHIFTEQUALBRIGHT;Wyrównaj jasność klatek +TP_RAW_PIXELSHIFTHOLEFILL;Wypełnij dziury w masce ruchu +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Wypełnia dziury w masce ruchu +TP_RAW_PIXELSHIFTMEDIAN;Użyj mediany dla poruszonych fragmentów +TP_RAW_PIXELSHIFTMM_AUTO;Automatyczny +TP_RAW_PIXELSHIFTMM_CUSTOM;Własny +TP_RAW_PIXELSHIFTMM_OFF;Wyłączony +TP_RAW_PIXELSHIFTMOTIONMETHOD;Korekcja ruchu +TP_RAW_PIXELSHIFTNONGREENCROSS;Szukaj ruchu w kanale niebieskim/czerwonym +TP_RAW_PIXELSHIFTSHOWMOTION;Pokaż maskę ruchu +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Pokaż tylko maskę ruchu +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Pokaż samą maskę ruchu (bez obrazu). +TP_RAW_PIXELSHIFTSIGMA;Promień rozmycia +TP_RAW_PIXELSHIFTSMOOTH;Miękkie przejścia +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;Matryca z filtrem Bayera TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Trzy powtórzenia prowadzą do najlepszych rezultatów (zalecane dla zdjęć o niskim ISO).\nJedno powtórzenie jest prawie nie do odróżnienia od trzech dla zdjęć o wysokim ISO a jest znacznie szybsze. TP_RAW_SENSOR_XTRANS_LABEL;Matryca z filtrem X-Trans +TP_RAW_VNG4;VNG4 +TP_RAW_XTRANS;X-Trans +TP_RAW_XTRANSFAST;Szybki X-Trans +TP_RESIZE_ALLOW_UPSCALING;Zezwól na zwiększenie rozdzielczości TP_RESIZE_APPLIESTO;Dotyczy: TP_RESIZE_CROPPEDAREA;Obszaru kadrowanego TP_RESIZE_FITBOX;Wymiary obwodu @@ -1234,6 +1652,46 @@ TP_RESIZE_SCALE;Skalę TP_RESIZE_SPECIFY;Określ: TP_RESIZE_W;Szerokość TP_RESIZE_WIDTH;Szerokość +TP_RETINEX_CONTEDIT_HSL;Histogram HSL +TP_RETINEX_CONTEDIT_LAB;Histogram L*a*b* +TP_RETINEX_CONTEDIT_LH;Odcień +TP_RETINEX_CONTEDIT_MAP;Wyrównywanie +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_LH;Siła=f(H) +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_EQUAL;Wyrównywanie +TP_RETINEX_GAIN;Wzmocnienie +TP_RETINEX_GAMMA;Gamma +TP_RETINEX_GAMMA_FREE;Wolna +TP_RETINEX_GAMMA_HIGH;Wysoka +TP_RETINEX_GAMMA_LOW;Niska +TP_RETINEX_GAMMA_MID;Średnia +TP_RETINEX_GAMMA_NONE;Żaden +TP_RETINEX_HIGH;Wysoki +TP_RETINEX_HIGHLIGHT;Próg podświetleń +TP_RETINEX_HSLSPACE_LIN;HSL-Liniowa +TP_RETINEX_HSLSPACE_LOG;HSL-Logarytmiczna +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Maska +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Niski +TP_RETINEX_MAP;Metoda +TP_RETINEX_MAP_GAUS;Maska Gaussa +TP_RETINEX_MAP_NONE;Żaden +TP_RETINEX_METHOD;Metoda +TP_RETINEX_NEIGHBOR;Promień +TP_RETINEX_NEUTRAL;Reset +TP_RETINEX_OFFSET;Przesunięcie (jasność) +TP_RETINEX_SETTINGS;Ustawienia +TP_RETINEX_SKAL;Skala +TP_RETINEX_STRENGTH;Siła +TP_RETINEX_THRESHOLD;Próg +TP_RETINEX_UNIFORM;Jednolity +TP_RETINEX_VARIANCE;Kontrast +TP_RETINEX_VIEW;Proces +TP_RETINEX_VIEW_MASK;Maska +TP_RETINEX_VIEW_NONE;Standardowy +TP_RETINEX_VIEW_UNSHARP;Maska wyostrzająca TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Kanał TP_RGBCURVES_GREEN;G @@ -1244,7 +1702,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Stopnie TP_ROTATE_LABEL;Obrót TP_ROTATE_SELECTLINE;Wyprostuj obraz -TP_SAVEDIALOG_OK_TIP;Skrót: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Skrót: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Podświetlenia TP_SHADOWSHLIGHTS_HLTONALW;Szerokość tonalna TP_SHADOWSHLIGHTS_LABEL;Cienie/Podświetlenia @@ -1256,6 +1714,8 @@ TP_SHARPENEDGE_LABEL;Krawędzie TP_SHARPENEDGE_PASSES;Powtórzenia TP_SHARPENEDGE_THREE;Tylko luminancja TP_SHARPENING_AMOUNT;Siła +TP_SHARPENING_BLUR;Promień rozmycia +TP_SHARPENING_CONTRAST;Próg kontrastu TP_SHARPENING_EDRADIUS;Promień TP_SHARPENING_EDTOLERANCE;Tolerancja krawędzi TP_SHARPENING_HALOCONTROL;Kontrola poświaty @@ -1271,9 +1731,14 @@ TP_SHARPENING_RLD_ITERATIONS;Powtórzenia TP_SHARPENING_THRESHOLD;Próg TP_SHARPENING_USM;Maska wyostrzająca TP_SHARPENMICRO_AMOUNT;Siła +TP_SHARPENMICRO_CONTRAST;Próg kontrastu TP_SHARPENMICRO_LABEL;Mikrokontrast TP_SHARPENMICRO_MATRIX;Matryca 3×3 zamiast 5×5 TP_SHARPENMICRO_UNIFORMITY;Jednolitość +TP_SOFTLIGHT_STRENGTH;Siła +TP_TM_FATTAL_AMOUNT;Ilość +TP_TM_FATTAL_LABEL;Kompresja zakresu dynamiki +TP_TM_FATTAL_THRESHOLD;Detale TP_VIBRANCE_AVOIDCOLORSHIFT;Zapobiegaj przesunięcia kolorów TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Odcienie skóry @@ -1298,6 +1763,105 @@ TP_VIGNETTING_CENTER_Y;Środek Y TP_VIGNETTING_LABEL;Korekcja winietowania TP_VIGNETTING_RADIUS;Promień TP_VIGNETTING_STRENGTH;Siła +TP_WAVELET_1;Poziom 1 +TP_WAVELET_2;Poziom 2 +TP_WAVELET_3;Poziom 3 +TP_WAVELET_4;Poziom 4 +TP_WAVELET_5;Poziom 5 +TP_WAVELET_6;Poziom 6 +TP_WAVELET_7;Poziom 7 +TP_WAVELET_8;Poziom 8 +TP_WAVELET_9;Poziom 9 +TP_WAVELET_APPLYTO;Zastosuj do +TP_WAVELET_AVOID;Unikaj przesunięcia kolorów +TP_WAVELET_B0;Czarny +TP_WAVELET_B1;Szary +TP_WAVELET_BACKGROUND;Tło +TP_WAVELET_BACUR;Krzywa +TP_WAVELET_BALCHRO;Balans chrominancji +TP_WAVELET_BANONE;Żaden +TP_WAVELET_BASLI;Suwak +TP_WAVELET_BATYPE;Metoda balansu kontrastu +TP_WAVELET_CBENAB;Tonowanie i balans kolorów +TP_WAVELET_CCURVE;Kontrast lokalny +TP_WAVELET_CH1;Cały zakres chrominancji +TP_WAVELET_CH2;Nasycone/pastelowe +TP_WAVELET_CH3;Połącz poziomy kontrastu +TP_WAVELET_CHCU;Krzywa +TP_WAVELET_CHSL;Suwaki +TP_WAVELET_COMPCONT;Kontrast +TP_WAVELET_COMPGAMMA;Kompresja - Gamma +TP_WAVELET_CONTR;Gamut +TP_WAVELET_CONTRA;Kontrast +TP_WAVELET_CONTRAST_MINUS;Kontrast - +TP_WAVELET_CONTRAST_PLUS;Kontrast + +TP_WAVELET_CTYPE;Kontrola chrominancji +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_DALL;We wszystkich kierunkach +TP_WAVELET_DAUB2;D2 - niski +TP_WAVELET_DAUB4;D4 - standard +TP_WAVELET_DAUB6;D6 - standard plus +TP_WAVELET_DAUB10;D10 - średni +TP_WAVELET_DAUB14;D14 - wysoki +TP_WAVELET_DONE;Pionowo +TP_WAVELET_DTHR;Po przekątnej +TP_WAVELET_DTWO;Poziomo +TP_WAVELET_EDCU;Krzywa +TP_WAVELET_EDGCONT;Kontrast lokalny +TP_WAVELET_EDGE;Ostrość krawędzi +TP_WAVELET_EDGEDETECTTHR;Niski próg (szum) +TP_WAVELET_EDGEDETECTTHR2;Wysoki próg (wykrywanie) +TP_WAVELET_EDGTHRESH;Szczegółowość +TP_WAVELET_EDRAD;Promień +TP_WAVELET_EDSL;Suwaki progów +TP_WAVELET_EDTYPE;Metoda kontrastu lokalnego: +TP_WAVELET_EDVAL;Siła +TP_WAVELET_FINAL;Ostateczny retusz +TP_WAVELET_FINEST;Najdokładniej +TP_WAVELET_HIGHLIGHT;Zakres luminancji podświetleń +TP_WAVELET_HS1;Zakres luminancji +TP_WAVELET_HS2;Cienie/Podświetlenia +TP_WAVELET_HUESKIN;Odcień skóry +TP_WAVELET_HUESKY;Odcień nieba +TP_WAVELET_LEVCH;Chrominancja +TP_WAVELET_LEVF;Kontrast +TP_WAVELET_LEVONE;Poziom 2 +TP_WAVELET_LEVTHRE;Poziom 4 +TP_WAVELET_LEVTWO;Poziom 3 +TP_WAVELET_LEVZERO;Poziom 1 +TP_WAVELET_LINKEDG;Połącz z siłą 'Ostrość krawędzi' +TP_WAVELET_LIPST;Usprawniony algorytm +TP_WAVELET_LOWLIGHT;Zakres luminancji cieni +TP_WAVELET_MEDGREINF;Pierwszy poziom +TP_WAVELET_MEDI;Usuwaj artefakty niebieskiego nieba +TP_WAVELET_MEDILEV;Wykrywanie krawędzi +TP_WAVELET_NEUTRAL;Neutralny +TP_WAVELET_NOIS;Odszumianie +TP_WAVELET_NPHIGH;Wysoki +TP_WAVELET_NPLOW;Niski +TP_WAVELET_NPNONE;Brak +TP_WAVELET_NPTYPE;Piksele sąsiadujące +TP_WAVELET_PASTEL;Chrominancja kolorów pastelowych +TP_WAVELET_PROC;Proces +TP_WAVELET_RE1;Wzmocniony +TP_WAVELET_RE2;Niezmieniony +TP_WAVELET_RE3;Zmniejszony +TP_WAVELET_RESCHRO;Chrominancja +TP_WAVELET_RESCON;Cienie +TP_WAVELET_RESCONH;Podświetlenia +TP_WAVELET_SAT;Chrominancja kolorów nasyconych +TP_WAVELET_SKY;Odcień nieba - wybór/ochrona +TP_WAVELET_STREN;Siła +TP_WAVELET_STRENGTH;Siła +TP_WAVELET_SUPE;Ekstra +TP_WAVELET_THR;Próg cieni +TP_WAVELET_THRESHOLD;Poziom podświetleń +TP_WAVELET_THRESHOLD2;Poziom cieni +TP_WAVELET_THRH;Próg podświetleń +TP_WAVELET_TMSTRENGTH;Siła kompresji +TP_WAVELET_TMTYPE;Metoda kompresji +TP_WAVELET_TON;Tonowanie TP_WBALANCE_AUTO;Auto TP_WBALANCE_CAMERA;Z aparatu TP_WBALANCE_CLOUDY;Pochmurnie @@ -1332,6 +1896,7 @@ 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;Wybierz TP_WBALANCE_SHADE;Ćień TP_WBALANCE_SIZE;Wielkość: TP_WBALANCE_SOLUX35;Solux 3500K @@ -1339,6 +1904,7 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Punktowy +TP_WBALANCE_TEMPBIAS;Kompensacja automatycznego balansu bieli (AWB) TP_WBALANCE_TEMPERATURE;Temperatura TP_WBALANCE_TUNGSTEN;Wolfram TP_WBALANCE_WATER1;Pod wodą 1 @@ -1356,166 +1922,77 @@ 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. -!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_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the 're:' prefix to enter\na regular expression. !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 !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_FAST_PIPELINE_TOOLTIP;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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? !FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. -!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -!FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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 (*.icc) -!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_CURRENT;Current -!GENERAL_HELP;Help -!GENERAL_OPEN;Open -!GENERAL_RESET;Reset -!GENERAL_SAVE_AS;Save as... -!GENERAL_SLIDER;Slider +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !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_CROSSHAIR;Show/Hide indicator crosshair. !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 +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !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;- -!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 - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1528,84 +2005,706 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_425;--unused-- !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !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_494;Capture Sharpening -!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors -!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction -!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask !HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask !HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness @@ -1614,701 +2713,1372 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_LUMINANCE;Dehaze - Luminance only -!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map -!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_METADATA_MODE;Metadata copy mode -!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold -!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold -!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius -!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations -!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold -!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations -!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !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: +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !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_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!ICCPROFCREATOR_PRIM_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 profiles. +!INSPECTOR_WINDOW_TITLE;Inspector !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_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_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. -!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator -!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor -!MAIN_FRAME_PLACES_DEL;Remove -!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. -!MAIN_TAB_ADVANCED;Advanced -!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a -!MAIN_TAB_FAVORITES;Favorites -!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u -!MAIN_TAB_INSPECT; Inspect +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !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 +!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_EQUALIZER;Wavelet levels -!PARTIALPASTE_FILMNEGATIVE;Film Negative -!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_FILMNEGATIVE;Film negative +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_PREPROCWB;Preprocess White Balance !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_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_PSEUDOHIDPI;Pseudo-HiDPI mode -!PREFERENCES_APPEARANCE_THEME;Theme +!PARTIALPASTE_SPOT;Spot removal !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_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_CLUTSCACHE;HaldCLUT Cache +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !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 -!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_DIRECTORIES;Directories -!PREFERENCES_EDITORCMDLINE;Custom command line -!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !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_INSPECT_LABEL;Inspect -!PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum number of cached images +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen !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_MAXRECENTFOLDERS;Maximum number of recent folders !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_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_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: -!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_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 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_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!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 -!PROGRESSBAR_DECODING;Decoding... -!PROGRESSBAR_GREENEQUIL;Green equilibration... -!PROGRESSBAR_HLREC;Highlight reconstruction... -!PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... -!PROGRESSBAR_LINEDENOISE;Line noise filter... -!PROGRESSBAR_RAWCACORR;Raw CA correction... -!QINFO_FRAMECOUNT;%2 frames -!QINFO_HDR;HDR / %2 frame(s) -!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) -!QUEUE_LOCATION_TITLE;Output Location +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s -!SAMPLEFORMAT_0;Unknown data format -!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;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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !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 +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !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_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. !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_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_GTCENTEREDSQUARE;Centered square !TP_CROP_GTHARMMEANS;Harmonic Means !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_DEHAZE_DEPTH;Depth -!TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map -!TP_DEHAZE_STRENGTH;Strength +!TP_DEHAZE_SATURATION;Saturation !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones -!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global -!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_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_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_CLAMPOOG;Clip out-of-gamut colors +!TP_DISTORTION_AUTO_TOOLTIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve !TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. -!TP_EXPOSURE_TCMODE_LUMINANCE;Luminance -!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual -!TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. -!TP_FILMNEGATIVE_LABEL;Film Negative -!TP_FILMNEGATIVE_PICK;Pick neutral spots -!TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. +!TP_FILMNEGATIVE_OUT_LEVEL;Output level +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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_HLREC_HLBLUR;Blur !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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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 selected -!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file -!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !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;Lens Profile -!TP_LENSPROFILE_USE_CA;Chromatic aberration -!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion -!TP_LENSPROFILE_USE_HEADER;Correct -!TP_LENSPROFILE_USE_VIGNETTING;Vignetting -!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_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_PDSHARPENING_LABEL;Capture Sharpening -!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction -!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both -!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !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_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_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!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_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_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_BORDER;Border -!TP_RAW_DCB;DCB -!TP_RAW_DCBVNG4;DCB+VNG4 -!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DCBBILINEAR;DCB+Bilinear !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 !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_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_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion -!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !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 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_PIXELSHIFTMEDIAN;Use median for moving parts !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_PIXELSHIFTMOTIONMETHOD;Motion Correction -!TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!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 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_RCD;RCD -!TP_RAW_RCDVNG4;RCD+VNG4 -!TP_RAW_VNG4;VNG4 -!TP_RAW_XTRANS;X-Trans -!TP_RAW_XTRANSFAST;Fast X-Trans -!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_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_RCDBILINEAR;RCD+Bilinear +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !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_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_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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. -!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_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !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_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_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;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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_RETINEX_NEUTRAL_TOOLTIP;Reset all sliders and curves to their default values. !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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_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_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_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost -!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light -!TP_SOFTLIGHT_STRENGTH;Strength -!TP_TM_FATTAL_AMOUNT;Amount +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !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 -!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_BALCHROM;Equalizer Color !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_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of 'contrast levels' and 'chroma-contrast link strength'. !TP_WAVELET_CHTYPE;Chrominance method -!TP_WAVELET_COLORT;Opacity Red-Green -!TP_WAVELET_COMPCONT;Contrast -!TP_WAVELET_COMPGAMMA;Compression gamma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green +!TP_WAVELET_COMPEXPERT;Advanced !TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !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_CONTFRAME;Contrast - Compression +!TP_WAVELET_CONTRA_TOOLTIP;Changes the residual image contrast. +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!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+std. dev. and maxima. !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_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 -!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_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. !TP_WAVELET_RESID;Residual Image -!TP_WAVELET_SAT;Saturated chroma !TP_WAVELET_SETTINGS;Wavelet Settings +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. +!TP_WAVELET_TILESBIG;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_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_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. +!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 b/rtdata/languages/Portugues index 789d26cd6..09d3aa790 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -102,7 +102,7 @@ EXPORT_PIPELINE;Preparação do processamento EXPORT_PUTTOQUEUEFAST; Colocar na fila para exportação rápida EXPORT_RAW_DMETHOD;Método de desmatrização EXPORT_USE_FAST_PIPELINE;Dedicado (processamento completo na imagem redimensionada) -EXPORT_USE_FAST_PIPELINE_TIP;Usar uma preparação de processamento dedicado para imagens no modo de exportação rápida, que troca velocidade pela qualidade. O redimensionamento da imagem é feito o mais cedo possível, em vez de fazê-lo no fim, como na preparação normal. O aumento de velocidade pode ser significativo, mas esteja preparado para ver artefactos e uma degradação geral da qualidade de saída. +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Usar uma preparação de processamento dedicado para imagens no modo de exportação rápida, que troca velocidade pela qualidade. O redimensionamento da imagem é feito o mais cedo possível, em vez de fazê-lo no fim, como na preparação normal. O aumento de velocidade pode ser significativo, mas esteja preparado para ver artefactos e uma degradação geral da qualidade de saída. EXPORT_USE_NORMAL_PIPELINE;Padrão (ignorar algumas etapas, redimensionar no fim) EXTPROGTARGET_1;raw EXTPROGTARGET_2;processado na fila @@ -237,13 +237,11 @@ HISTOGRAM_TOOLTIP_G;Mostrar histograma verde. HISTOGRAM_TOOLTIP_L;Mostrar histograma de luminância CIELab. HISTOGRAM_TOOLTIP_MODE;Alternar entre redimensionar linear, log-linear e log-log do histograma. HISTOGRAM_TOOLTIP_R;Mostrar histograma vermelho. -HISTOGRAM_TOOLTIP_RAW;Mostrar 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;PP3 carregado HISTORY_MSG_3;PP3 alterado HISTORY_MSG_4;Histórico de navegação HISTORY_MSG_5;Exposição - Claridade @@ -257,9 +255,6 @@ HISTORY_MSG_12;Exposição - Níveis automáticos HISTORY_MSG_13;Exposição - Cortado 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* - Curva L* HISTORY_MSG_20;Nitidez HISTORY_MSG_21;Nitidez - Raio @@ -285,10 +280,6 @@ HISTORY_MSG_40;Balanço de brancos - Tingimento 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 redução de ruídos da luminância -HISTORY_MSG_45;Tolerância de bordas da redução de ruídos da luminância -HISTORY_MSG_46;Redução de ruídos da cor -HISTORY_MSG_47;Misturar as altas luzes ICC com a matriz HISTORY_MSG_48;DCP - Curva de tom HISTORY_MSG_49;DCP iluminante HISTORY_MSG_50;Sombras/altas luzes @@ -296,7 +287,6 @@ HISTORY_MSG_51;Sombras/altas luzes - Altas luzes HISTORY_MSG_52;Sombras/altas luzes - Sombras HISTORY_MSG_53;Sombras/altas luzes - Largura tonal das altas luzes HISTORY_MSG_54;Sombras/altas luzes - Largura tonal das sombras -HISTORY_MSG_55;Sombras/altas luzes - Contraste local HISTORY_MSG_56;Sombras/altas luzes - Raio HISTORY_MSG_57;Rotação em ângulos retos HISTORY_MSG_58;Espelhamento horizontal @@ -308,7 +298,6 @@ HISTORY_MSG_63;Instantâneo selecionado HISTORY_MSG_64;Cortar HISTORY_MSG_65;Correção de aberração cromática HISTORY_MSG_66;Exposição - Reconstrução das altas luzes -HISTORY_MSG_67;Exposição - Quantidade de Reconstrução das altas luzes HISTORY_MSG_68;Exposição - Método de Reconstrução das altas luzes HISTORY_MSG_69;Espaço de cor de trabalho HISTORY_MSG_70;Espaço de cor de saída @@ -319,12 +308,10 @@ 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;Sombras/altas luzes - Máscara de nitidez HISTORY_MSG_84;Correção de perspetiva HISTORY_MSG_85;Correção da lente - Ficheiro LCP HISTORY_MSG_86;Curvas RGB - Modo de luminosidade @@ -371,12 +358,6 @@ HISTORY_MSG_127;Campo plano - Seleção automática HISTORY_MSG_128;Campo plano - Raio de desfocagem HISTORY_MSG_129;Campo plano - Tipo de desfocagem HISTORY_MSG_130;Correção automática de distorção -HISTORY_MSG_131;Redução de ruído - Luminância -HISTORY_MSG_132;Redução de ruído - Crominância -HISTORY_MSG_133;Gama de saída -HISTORY_MSG_134;Gama livre -HISTORY_MSG_135;Gama livre -HISTORY_MSG_136;Declive de gama livre HISTORY_MSG_137;Nível preto - Verde 1 HISTORY_MSG_138;Nível preto - Vermelho HISTORY_MSG_139;Nível preto - Azul @@ -489,7 +470,6 @@ 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;Contraste p/níveis detalhe - Limite -HISTORY_MSG_250;Redução de ruído - Melhorado HISTORY_MSG_251;PeB - Algoritmo HISTORY_MSG_252;Contraste p/níveis detalhe - Afetar/proteger cor da pele HISTORY_MSG_253;Contraste p/níveis detalhe - Reduzir artefactos @@ -513,8 +493,6 @@ HISTORY_MSG_270;Tonificação de cor - Alto - Verde HISTORY_MSG_271;Tonificação de cor - Alto - Azul HISTORY_MSG_272;Tonificação de cor - Balanço HISTORY_MSG_273;Tonificação de cor - Balanço de cor SMH -HISTORY_MSG_274;Tonificação de cor - Saturação das sombras -HISTORY_MSG_275;Tonificação de cor - Saturação das altas luzes HISTORY_MSG_276;Tonificação de cor - Opacidade HISTORY_MSG_277;--não utilizado-- HISTORY_MSG_278;Tonificação de cor - Preservar luminância @@ -539,7 +517,6 @@ HISTORY_MSG_296;Redução de ruído - Curva de luminância HISTORY_MSG_297;Redução de ruído - Modo HISTORY_MSG_298;Filtro de píxeis mortos HISTORY_MSG_299;Redução de ruído - Curva de crominância -HISTORY_MSG_300;- HISTORY_MSG_301;Redução de ruído - Controlo de luminância HISTORY_MSG_302;Redução de ruído - Método de crominância HISTORY_MSG_303;Redução de ruído - Método de crominância @@ -648,7 +625,6 @@ HISTORY_MSG_405;Wavelet - Remover ruído - Nível 4 HISTORY_MSG_406;Wavelet - Nitidez da borda - Píxeis vizinhos HISTORY_MSG_407;Retinex - Método HISTORY_MSG_408;Retinex - Raio -HISTORY_MSG_409;Retinex - Contraste HISTORY_MSG_410;Retinex - Deslocamento HISTORY_MSG_411;Retinex - Intensidade HISTORY_MSG_412;Retinex - Gradiente gaussiano @@ -696,7 +672,6 @@ 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 - Temperatura @@ -1203,7 +1178,7 @@ PROFILEPANEL_GLOBALPROFILES;Perfis incluídos PROFILEPANEL_LABEL;Perfis de processamento PROFILEPANEL_LOADDLGLABEL;Carregar parâmetros de processamento... PROFILEPANEL_LOADPPASTE;Parâmetros a carregar -PROFILEPANEL_MODE_TIP;Modo de preenchimento do perfil de processamento.\n\nBotão pressionado: os perfis parciais serão convertidos em perfis completos; os valores que faltam serão substituídos pelos padrões codificados.\n\nBotão largado: os perfis serão aplicados como estão, alterando apenas os valores que eles contêm. +PROFILEPANEL_MODE_TOOLTIP;Modo de preenchimento do perfil de processamento.\n\nBotão pressionado: os perfis parciais serão convertidos em perfis completos; os valores que faltam serão substituídos pelos padrões codificados.\n\nBotão largado: os perfis serão aplicados como estão, alterando apenas os valores que eles contêm. PROFILEPANEL_MYPROFILES;Meus perfis PROFILEPANEL_PASTEPPASTE;Parâmetros a colar PROFILEPANEL_PCUSTOM;Personalizado @@ -1390,7 +1365,6 @@ TP_COLORAPP_DATACIE;Histogramas de saída CIECAM02 em curvas 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 os valores L*a*b* antes dos ajustes do CIECAM02. TP_COLORAPP_FREE;Temp+verde livre + CAT02 + [saída] TP_COLORAPP_GAMUT;Controlo da gama (L*a*b*) -TP_COLORAPP_GAMUT_TOOLTIP;Permitir controlo da gama 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 @@ -1403,7 +1377,7 @@ TP_COLORAPP_MEANLUMINANCE;Luminância média (Yb%) TP_COLORAPP_MODEL;Modelo de ponto branco TP_COLORAPP_MODEL_TOOLTIP;Modelo de ponto branco.\n\nBalanço brancos [RT] + [saída]: o balanço de brancos do RT é usado para a cena, o CIECAM02 está definido para D50 e o balanço de brancos do dispositivo de saída é definido em condições de visualização.\n\nBalanço brancos [RT+CAT02] + [saída]: as configurações de balanço de brancos do RT são usadas pelo CAT02 e o balanço de brancos 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 utilizador, o balanço de brancos do dispositivo de saída é definido em condições de visualização. TP_COLORAPP_NEUTRAL;Repor -TP_COLORAPP_NEUTRAL_TIP;Repor todas as caixas de seleção dos controlos deslizantes e as curvas para os seus valores padrão +TP_COLORAPP_NEUTRAL_TOOLTIP;Repor todas as caixas de seleção dos controlos deslizantes e as curvas para os seus valores padrão TP_COLORAPP_RSTPRO;Proteção do vermelho e cor da pele TP_COLORAPP_RSTPRO_TOOLTIP;Vermelho e proteção de cor da pele afeta os controlos deslizantes e as curvas. TP_COLORAPP_SURROUND;Ambiente @@ -1465,7 +1439,7 @@ TP_COLORTONING_METHOD;Método TP_COLORTONING_METHOD_TOOLTIP;"Mistura L*a*b*", "Controlos deslizantes RGB" e "Curvas RGB" usam mistura de cores interpoladas.\n"Balanço de cor (sombras/meios tons/altas luzes)" e "Saturação 2 cores" usa cores diretas.\n\nA ferramenta preto e branco pode ser ativada ao usar qualquer método, o que permite a tonificação de cores. TP_COLORTONING_MIDTONES;Meios tons TP_COLORTONING_NEUTRAL;Repor os controlos deslizantes -TP_COLORTONING_NEUTRAL_TIP;Repor todos os valores padrão (sombras, meios tons, altas luzes). +TP_COLORTONING_NEUTRAL_TOOLTIP;Repor todos os valores padrão (sombras, meios tons, altas luzes). TP_COLORTONING_OPACITY;Opacidade TP_COLORTONING_RGBCURVES;RGB - Curvas TP_COLORTONING_RGBSLIDERS;RGB - Controlos deslizantes @@ -1579,7 +1553,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Com -100 afeta as cores da pele.\nCom 0 todos os TP_DIRPYREQUALIZER_THRESHOLD;Limite TP_DIRPYREQUALIZER_TOOLTIP;Tenta reduzir os artefactos nas transições entre as cores da pele (matiz, croma, luminância) e o resto da imagem. TP_DISTORTION_AMOUNT;Quantidade -TP_DISTORTION_AUTO_TIP;Corrige automaticamente a distorção da lente em ficheiros RAW, combinando-a com a imagem JPEG incorporada, caso exista, e tenha sua distorção de lente corrigida automaticamente pela câmara. +TP_DISTORTION_AUTO_TOOLTIP;Corrige automaticamente a distorção da lente em ficheiros RAW, combinando-a com a imagem JPEG incorporada, caso exista, e tenha sua distorção de lente corrigida automaticamente pela câmara. TP_DISTORTION_LABEL;Correção de distorção TP_EPD_EDGESTOPPING;Paragem nas bordas TP_EPD_GAMMA;Gama @@ -1588,12 +1562,12 @@ 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 controlo deslizante da exposição baseado numa análise de imagem.\nAtiva a reconstrução das altas luzes se necessário. +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Alterna a execução dos níveis automáticos para definir automaticamente os valores do controlo deslizante da exposição baseado numa análise de imagem.\nAtiva a reconstrução das altas luzes se necessário. TP_EXPOSURE_BLACKLEVEL;Preto TP_EXPOSURE_BRIGHTNESS;Claridade TP_EXPOSURE_CLAMPOOG;Cortar cores fora da gama TP_EXPOSURE_CLIP;% de corte -TP_EXPOSURE_CLIP_TIP;A fração de píxeis a ser cortada na operação níveis automáticos. +TP_EXPOSURE_CLIP_TOOLTIP;A fração de píxeis a ser cortada na operação níveis automáticos. TP_EXPOSURE_COMPRHIGHLIGHTS;Compressão das altas luzes TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Limite de compressão de altas luzes TP_EXPOSURE_COMPRSHADOWS;Compressão das sombras @@ -1730,7 +1704,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminância de acordo com a matiz L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminância de acordo com a luminância L=f(L) TP_LABCURVE_LABEL;Ajustes L*a*b* TP_LABCURVE_LCREDSK;Restringir o LC aos tons vermelhos e cor da pele -TP_LABCURVE_LCREDSK_TIP;Se ativada, a curva LC afeta apenas os tons vermelhos e tons de pele.\nSe desativado, aplica-se a todos os tons. +TP_LABCURVE_LCREDSK_TOOLTIP;Se ativada, a curva LC afeta apenas os tons vermelhos e tons de pele.\nSe desativado, aplica-se a todos os tons. TP_LABCURVE_RSTPROTECTION;Proteção de tons vermelhos e tons de pele TP_LABCURVE_RSTPRO_TOOLTIP;Funciona no controlo deslizante de cromaticidade e na curva CC. TP_LENSGEOM_AUTOCROP;Recorte automático @@ -1751,7 +1725,7 @@ TP_METADATA_MODE;Modo de cópia de metadados TP_METADATA_STRIP;Remover todos os metadados TP_METADATA_TUNNEL;Copiar inalterado TP_NEUTRAL;Repor -TP_NEUTRAL_TIP;Repor os controlos deslizantes de exposição para valores neutros.\nAplica-se aos mesmos controlos aplicados aos níveis automáticos, independentemente se usa os níveis automáticos ou não. +TP_NEUTRAL_TOOLTIP;Repor os controlos deslizantes de exposição para valores neutros.\nAplica-se aos mesmos controlos aplicados aos níveis automáticos, independentemente se usa os níveis automáticos ou não. TP_PCVIGNETTE_FEATHER;Difusão TP_PCVIGNETTE_FEATHER_TOOLTIP;Difusão:\n0 = apenas cantos,\n50 = a meio caminho do centro,\n100 = para o centro. TP_PCVIGNETTE_LABEL;Filtro de vinhetagem @@ -1933,7 +1907,7 @@ TP_RETINEX_MLABEL;Restaurado sem névoa mín=%1 máx=%2 TP_RETINEX_MLABEL_TOOLTIP;Deve estar perto de mín=0 máx=32768\nImagem restaurada sem mistura. TP_RETINEX_NEIGHBOR;Raio TP_RETINEX_NEUTRAL;Repor -TP_RETINEX_NEUTRAL_TIP;Repõe todos os controlos deslizantes e curvas nos seus valores padrão. +TP_RETINEX_NEUTRAL_TOOLTIP;Repõe todos os controlos deslizantes e curvas nos seus valores padrão. TP_RETINEX_OFFSET;Deslocamento (brilho) TP_RETINEX_SCALES;Gradiente gaussiano TP_RETINEX_SCALES_TOOLTIP;Se o controlo deslizante for 0, todas as iterações serão idênticas.\nSe > 0 a escala e raio são reduzidos quando as iterações aumentam e inversamente. @@ -1969,7 +1943,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Graus TP_ROTATE_LABEL;Rodar TP_ROTATE_SELECTLINE;Desenhar linha vertical -TP_SAVEDIALOG_OK_TIP;Atalho: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Atalho: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Altas luzes TP_SHADOWSHLIGHTS_HLTONALW;Largura tonal das altas luzes TP_SHADOWSHLIGHTS_LABEL;Sombras/altas luzes @@ -2189,7 +2163,6 @@ TP_WAVELET_THRH;Limite de altas luzes TP_WAVELET_TILESBIG;Matrizes grandes TP_WAVELET_TILESFULL;Toda a imagem TP_WAVELET_TILESIZE;Método de matrizes -TP_WAVELET_TILESLIT;Matrizes pequenas TP_WAVELET_TILES_TOOLTIP;O processamento de 'toda a imagem' consegue uma melhor qualidade e é a opção recomendada, enquanto que a utilização de matrizes é uma solução de recurso para utilizadores com pouca RAM. Consulte a RawPedia para saber mais sobre os requisitos de memória RAM. TP_WAVELET_TMSTRENGTH;Intensidade de compressão TP_WAVELET_TMSTRENGTH_TOOLTIP;Controla a intensidade do mapeamento de tom ou a compressão do contraste da imagem residual. Quando o valor for diferente de 0, os controlos deslizantes de intensidade e gama da ferramenta de mapeamento de tom na aba de exposição ficarão a cinzento. @@ -2256,19 +2229,715 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? !FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- !HISTORY_MSG_494;Capture Sharpening -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations @@ -2276,9 +2945,94 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector !MAIN_FRAME_PLACES_DEL;Remove -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +!PARTIALPASTE_FILMNEGATIVE;Film negative +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_PREPROCWB;Preprocess White Balance +!PARTIALPASTE_SPOT;Spot removal !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... !PROGRESSBAR_HLREC;Highlight reconstruction... @@ -2286,21 +3040,1033 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !PROGRESSBAR_LINEDENOISE;Line noise filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... !QUEUE_LOCATION_TITLE;Output Location +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_CROP_GTCENTEREDSQUARE;Centered square !TP_CROP_PPI;PPI -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal +!TP_WAVELET_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. +!TP_WAVELET_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index d619356a9..cf386f5ff 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -102,7 +102,7 @@ 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_FAST_PIPELINE_TOOLTIP;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 @@ -244,13 +244,11 @@ HISTOGRAM_TOOLTIP_G;Mostrar/Ocultar histograma verde. HISTOGRAM_TOOLTIP_L;Mostrar/Ocultar histograma de luminância CIELab. HISTOGRAM_TOOLTIP_MODE;Alternar entre o modo de escala linear, log-linear e log-log para o histograma. 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;PP3 Perfil carregado HISTORY_MSG_3;PP3 Perfil alterado HISTORY_MSG_4;Histórico de navegação HISTORY_MSG_5;Exposição - Claridade @@ -264,9 +262,6 @@ 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 @@ -292,10 +287,6 @@ 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;Misture os realces ICC com a matriz HISTORY_MSG_48;DCP - Curva de tom HISTORY_MSG_49;DCP iluminante HISTORY_MSG_50;Sombras/Realces @@ -303,7 +294,6 @@ 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 @@ -315,7 +305,6 @@ 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 @@ -326,12 +315,10 @@ 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;Curvas RGB - Modo de Luminosidade @@ -378,12 +365,6 @@ 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;Gama de saída -HISTORY_MSG_134;Gama livre -HISTORY_MSG_135;Gama livre -HISTORY_MSG_136;Declive gama livre HISTORY_MSG_137;Nível preto - Verde 1 HISTORY_MSG_138;Nível preto - Vermelho HISTORY_MSG_139;Nível preto - Azul @@ -496,7 +477,6 @@ 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 - Algoritmo HISTORY_MSG_252;CbDL - Pele tar/prot HISTORY_MSG_253;CbDL - Reduzir artefatos @@ -520,8 +500,6 @@ HISTORY_MSG_270;CT - Alto - Verde HISTORY_MSG_271;CT - Alto - Azul HISTORY_MSG_272;CT - Balanço HISTORY_MSG_273;CT - Balanço de cor SMH -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 @@ -546,7 +524,6 @@ 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 @@ -655,7 +632,6 @@ HISTORY_MSG_405;W - Remoção de ruído - Nível 4 HISTORY_MSG_406;W - ES - Píxeis 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 @@ -703,7 +679,6 @@ 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 @@ -1210,7 +1185,7 @@ 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 processamento.\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_MODE_TOOLTIP;Modo de preenchimento do perfil de processamento.\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 @@ -1401,7 +1376,6 @@ 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 os valores L*a*b* antes dos ajustes do CIECAM02. TP_COLORAPP_FREE;Temp+verde livre + CAT02 + [saída] TP_COLORAPP_GAMUT;Controle da gama (L*a*b*) -TP_COLORAPP_GAMUT_TOOLTIP;Permitir controle da gama 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 @@ -1414,7 +1388,7 @@ TP_COLORAPP_MEANLUMINANCE;Luminância média (Yb%) 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_NEUTRAL_TOOLTIP;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;Ambiente @@ -1474,7 +1448,7 @@ 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/Meios 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;Meios tons TP_COLORTONING_NEUTRAL;Restaurar controles deslizantes -TP_COLORTONING_NEUTRAL_TIP;Restaurar todos os valores (Sombras, Meios tons, Realces) para o padrão. +TP_COLORTONING_NEUTRAL_TOOLTIP;Restaurar todos os valores (Sombras, Meios tons, Realces) para o padrão. TP_COLORTONING_OPACITY;Opacidade TP_COLORTONING_RGBCURVES;RGB - Curvas TP_COLORTONING_RGBSLIDERS;RGB - Controles deslizantes @@ -1588,7 +1562,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;São segmentados em -100 tons de pele.\nEm 0 tod 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_AUTO_TOOLTIP;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;Gama @@ -1597,12 +1571,12 @@ 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_AUTOLEVELS_TOOLTIP;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;Claridade TP_EXPOSURE_CLAMPOOG;Recortar cores fora da gama TP_EXPOSURE_CLIP;Recortar % -TP_EXPOSURE_CLIP_TIP;A fração de píxeis a ser recortada na operação Níveis Automáticos. +TP_EXPOSURE_CLIP_TOOLTIP;A fração de píxeis 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 @@ -1742,7 +1716,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminância de acordo com a matiz L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminância de acordo 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_LCREDSK_TOOLTIP;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 vermelho e cor de pele TP_LABCURVE_RSTPRO_TOOLTIP;Funciona no controle deslizante de cromaticidade e na curva CC. TP_LENSGEOM_AUTOCROP;Corte automático @@ -1766,7 +1740,7 @@ 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_NEUTRAL_TOOLTIP;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 @@ -1945,7 +1919,7 @@ 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_NEUTRAL_TOOLTIP;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. @@ -1981,7 +1955,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Graus TP_ROTATE_LABEL;Girar TP_ROTATE_SELECTLINE;Selecione Linha Reta -TP_SAVEDIALOG_OK_TIP;Atalho: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Atalho: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Realces TP_SHADOWSHLIGHTS_HLTONALW;Largura tonal dos realces TP_SHADOWSHLIGHTS_LABEL;Sombras/Realces @@ -2201,7 +2175,6 @@ 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 compressão de contraste da imagem residual. Quando o valor for diferente de 0, os controles deslizantes Intensidade e Gama da ferramenta Mapeamento de Tom na guia Exposição ficarão esmaecidos. @@ -2268,14 +2241,710 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. +!FILEBROWSER_POPUPINSPECT;Inspect +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset !HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations @@ -2283,25 +2952,1122 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +!PARTIALPASTE_FILMNEGATIVE;Film negative +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_PREPROCWB;Preprocess White Balance +!PARTIALPASTE_SPOT;Spot removal !PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter... !PROGRESSBAR_RAWCACORR;Raw CA correction... +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !TP_COLORTONING_LABREGION_OFFSET;Offset !TP_COLORTONING_LABREGION_POWER;Power +!TP_CROP_GTCENTEREDSQUARE;Centered square !TP_CROP_PPI;PPI -!TP_DEHAZE_LUMINANCE;Luminance only -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_DEHAZE_SATURATION;Saturation +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !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_USE_HEADER;Correct +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_PDSHARPENING_LABEL;Capture Sharpening -!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_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!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_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear !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_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans -!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_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal +!TP_WAVELET_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. +!TP_WAVELET_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 4246ecbb6..6b0aa6ca0 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -225,13 +225,11 @@ HISTOGRAM_TOOLTIP_CHRO;Показать/скрыть хроматическую HISTOGRAM_TOOLTIP_G;Показать/скрыть зелёный канал гистограммы HISTOGRAM_TOOLTIP_L;Показать/скрыть CIELAB гистограмму HISTOGRAM_TOOLTIP_R;Показать/скрыть красный канал гистограммы -HISTOGRAM_TOOLTIP_RAW;Показать/скрыть Raw гистограмму HISTORY_CHANGED;Изменено HISTORY_CUSTOMCURVE;Пользовательская кривая HISTORY_FROMCLIPBOARD;Из буфера обмена HISTORY_LABEL;История HISTORY_MSG_1;Фото загружено -HISTORY_MSG_2;Профиль загружен HISTORY_MSG_3;Профиль изменён HISTORY_MSG_4;Просмотр истории HISTORY_MSG_5;Яркость @@ -245,9 +243,6 @@ HISTORY_MSG_12;Автоматические уровни HISTORY_MSG_13;Обрезка экспозиции 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' HISTORY_MSG_20;Резкость HISTORY_MSG_21;Резкость: Радиус @@ -273,10 +268,6 @@ HISTORY_MSG_40;Баланс белого: оттенок HISTORY_MSG_41;Режим тоновой кривой 1 HISTORY_MSG_42;Тоновая кривая 2 HISTORY_MSG_43;Режим тоновой кривой 2 -HISTORY_MSG_44;Удаление шума: радиус -HISTORY_MSG_45;Удаление шума: чувств. к границам -HISTORY_MSG_46;Удаление цв. шума -HISTORY_MSG_47;Смешение ICC светов с матрицей HISTORY_MSG_48;Использование тональной кривой ICC HISTORY_MSG_49;Источник цвета DCP HISTORY_MSG_50;Тени/Света @@ -284,7 +275,6 @@ HISTORY_MSG_51;Т/С: Света HISTORY_MSG_52;Т/С: Тени HISTORY_MSG_53;Т/С: Уровень светов HISTORY_MSG_54;Т/С: Уровень теней -HISTORY_MSG_55;Т/С: Локальный контраст HISTORY_MSG_56;Т/С: Радиус HISTORY_MSG_57;Грубый поворот HISTORY_MSG_58;Горизонтальное отражение @@ -296,7 +286,6 @@ HISTORY_MSG_63;Снимок выбран HISTORY_MSG_64;Кадрирование HISTORY_MSG_65;Коррекция ХА HISTORY_MSG_66;Восстановление пересветов -HISTORY_MSG_67;ВП: Величина восстановления HISTORY_MSG_68;ВП: Способ восстановления HISTORY_MSG_69;Рабочая цветовая модель HISTORY_MSG_70;Выходная цветовая модель @@ -307,12 +296,10 @@ HISTORY_MSG_74;Масштабирование: Величина HISTORY_MSG_75;Масштабирование: Способ HISTORY_MSG_76;Метаданные Exif HISTORY_MSG_77;Метаданные IPTC -HISTORY_MSG_78;- HISTORY_MSG_79;Масштаб: Ширина HISTORY_MSG_80;Масштаб: Высота HISTORY_MSG_81;Масштабирование HISTORY_MSG_82;Изменение профиля -HISTORY_MSG_83;Т/С: Маска резкости HISTORY_MSG_84;Коррекция перспективы HISTORY_MSG_85;Профиль коррекции объектива HISTORY_MSG_86;Кривая RGB: Яркость @@ -359,12 +346,6 @@ HISTORY_MSG_127;Автовыбор плоского поля HISTORY_MSG_128;Радиус размытия плоского поля HISTORY_MSG_129;Тип размытия плоского поля HISTORY_MSG_130;Автоискажения -HISTORY_MSG_131;Подавление яркостного шума -HISTORY_MSG_132;Подавление цветового шума -HISTORY_MSG_133;Гамма -HISTORY_MSG_134;Свободная гамма -HISTORY_MSG_135;Свободная гамма -HISTORY_MSG_136;Крутизна гаммы HISTORY_MSG_137;Ур. черного: Зеленый 1 HISTORY_MSG_138;Ур. черного: Красный HISTORY_MSG_139;Ур. черного: Синий @@ -475,14 +456,12 @@ HISTORY_MSG_246;Кривая 'CL' HISTORY_MSG_247;Кривая 'LH' 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;Коррекция объектива: Камера @@ -846,7 +825,7 @@ PROFILEPANEL_GLOBALPROFILES;Предустановленные профили PROFILEPANEL_LABEL;Профиль обработки PROFILEPANEL_LOADDLGLABEL;Загрузить профиль обработки... PROFILEPANEL_LOADPPASTE;Параметры для загрузки -PROFILEPANEL_MODE_TIP;Режим применения профиля\n\nКнопка зажата: Частичные профили будут сконвертированы в полные профили, отсутствующие значения заменятся на значения по умолчанию.\n\nКнопка отжата: Профили будут применяться как они есть, изменяя только те параметры, которые в них прописаны. +PROFILEPANEL_MODE_TOOLTIP;Режим применения профиля\n\nКнопка зажата: Частичные профили будут сконвертированы в полные профили, отсутствующие значения заменятся на значения по умолчанию.\n\nКнопка отжата: Профили будут применяться как они есть, изменяя только те параметры, которые в них прописаны. PROFILEPANEL_MYPROFILES;Мои профили PROFILEPANEL_PASTEPPASTE;Параметры для вставки PROFILEPANEL_PCUSTOM;Пользовательский @@ -1011,7 +990,6 @@ TP_COLORAPP_CURVEEDITOR3;Цветовая кривая 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;Контроль гаммы (L*a*b*) -TP_COLORAPP_GAMUT_TOOLTIP;Позволяет контролировать гамму в режиме L*a*b*. TP_COLORAPP_HUE;Цвет (h) TP_COLORAPP_MODEL;Модель точки белого TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Абсолютная яркость при просмотре.\n(Обычно 16 кд/м²) @@ -1092,12 +1070,12 @@ TP_EPD_REWEIGHTINGITERATES;Перевзвешивание проходов TP_EPD_SCALE;Масштаб TP_EPD_STRENGTH;Интенсивность TP_EXPOSURE_AUTOLEVELS;Автоуровни -TP_EXPOSURE_AUTOLEVELS_TIP;Переключение выполнения автоуровней для автоматической установки параметров экспозиции на основе анализа изображения +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Переключение выполнения автоуровней для автоматической установки параметров экспозиции на основе анализа изображения TP_EXPOSURE_BLACKLEVEL;Уровень чёрного TP_EXPOSURE_BRIGHTNESS;Яркость TP_EXPOSURE_CLAMPOOG;Обрезать цвета за пределами охвата TP_EXPOSURE_CLIP;Ограничить -TP_EXPOSURE_CLIP_TIP;Часть пикселей, обрезаемая операцией автоматических уровней +TP_EXPOSURE_CLIP_TOOLTIP;Часть пикселей, обрезаемая операцией автоматических уровней TP_EXPOSURE_COMPRHIGHLIGHTS;Сжатие светов TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Порог восстановления светов TP_EXPOSURE_COMPRSHADOWS;Сжатие теней @@ -1212,7 +1190,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Яркость в соответствии с TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Яркость в соответствии с яркостью.\nL=f(L) TP_LABCURVE_LABEL;Кривые L*a*b* TP_LABCURVE_LCREDSK;Ограничить применение кривой ЯЦ -TP_LABCURVE_LCREDSK_TIP;Если включено, то кривая яркости от цвета применится лишь для тонов кожи и красных оттенков.\nИначе применится для всех тонов +TP_LABCURVE_LCREDSK_TOOLTIP;Если включено, то кривая яркости от цвета применится лишь для тонов кожи и красных оттенков.\nИначе применится для всех тонов TP_LABCURVE_RSTPROTECTION;Защита красного и тонов кожи TP_LABCURVE_RSTPRO_TOOLTIP;Защита красных тонов и оттенков кожи\nМожно использовать вместе со слайдером Цветность и кривой ЦЦ. TP_LENSGEOM_AUTOCROP;Автокадрирование @@ -1233,7 +1211,7 @@ TP_METADATA_MODE;Режим копирования метаданных TP_METADATA_STRIP;Удалить всё TP_METADATA_TUNNEL;Скопировать неизменённо TP_NEUTRAL;Сбросить -TP_NEUTRAL_TIP;Сбросить настройки выдержки на средние значения +TP_NEUTRAL_TOOLTIP;Сбросить настройки выдержки на средние значения TP_PCVIGNETTE_FEATHER;Размытие TP_PCVIGNETTE_FEATHER_TOOLTIP;Размытие:\n0=только углы, 50=наполовину к центру, 100=к центру. TP_PCVIGNETTE_LABEL;Фильтр виньетирования @@ -1327,7 +1305,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Угол TP_ROTATE_LABEL;Поворот TP_ROTATE_SELECTLINE;Выбрать прямую линию -TP_SAVEDIALOG_OK_TIP;Горячая клавиша Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Горячая клавиша Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Света TP_SHADOWSHLIGHTS_HLTONALW;Уровень TP_SHADOWSHLIGHTS_LABEL;Тени/света @@ -1460,24 +1438,36 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_FAST_PIPELINE_TOOLTIP;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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? !FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help !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_CROSSHAIR;Show/Hide indicator crosshair. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_237;B&W - CM !HISTORY_MSG_252;CbDL - Skin tar/prot @@ -1502,8 +1492,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance !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_278;CT - Preserve luminance !HISTORY_MSG_279;CT - Shadows @@ -1540,10 +1528,10 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_318;W - Contrast - Finer levels +!HISTORY_MSG_319;W - Contrast - Finer range +!HISTORY_MSG_320;W - Contrast - Coarser range +!HISTORY_MSG_321;W - Contrast - Coarser levels !HISTORY_MSG_322;W - Gamut - Avoid color shift !HISTORY_MSG_323;W - ES - Local contrast !HISTORY_MSG_324;W - Chroma - Pastel @@ -1607,14 +1595,14 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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 - Color Balance +!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 @@ -1631,7 +1619,6 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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 @@ -1647,7 +1634,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -1666,32 +1653,695 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_489;DRC - Detail !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel @@ -1706,17 +2356,37 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold !HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold !HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold !HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius @@ -1725,32 +2395,96 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !ICCPROFCREATOR_COPYRIGHT;Copyright: -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!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_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: -!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!ICCPROFCREATOR_PRIM_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIM_WIDEG;Widegamut !ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... !ICCPROFCREATOR_SLOPE;Slope -!ICCPROFCREATOR_TRC_PRESET;Tone response curve: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !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 @@ -1762,7 +2496,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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. @@ -1781,16 +2515,21 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !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 !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels -!PARTIALPASTE_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue @@ -1798,6 +2537,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex +!PARTIALPASTE_SPOT;Spot removal !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PREFERENCES_CACHECLEAR_ALL;Clear all cached files: !PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: @@ -1809,15 +2549,28 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !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_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_INSPECTORWINDOW;Open inspector in own window or fullscreen !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_MAXRECENTFOLDERS;Maximum number of recent folders !PREFERENCES_MONINTENT;Default rendering intent @@ -1838,6 +2591,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling !PROFILEPANEL_PDYNAMIC;Dynamic !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... @@ -1858,34 +2613,68 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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;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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !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_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !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_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 +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DATACIE_TOOLTIP;Affects histograms shown in Color Appearance & Lightning curves. Does not affect RawTherapee's main histogram.\n\nEnabled: show approximate values for J and C, S or M after the CIECAM adjustments.\nDisabled: show L*a*b* values before CIECAM adjustments. +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a color described as red, green, blue and yellow. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_LABEL;Color Appearance & Lighting !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_LIGHT_TOOLTIP;Lightness in CIECAM is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions. It differs from L*a*b* and RGB lightness. !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_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02/16] + [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 + tint + CAT02/16 + [output]: temp and tint 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_NEUTRAL_TOOLTIP;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_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. !TP_COLORAPP_SURROUND;Surround +!TP_COLORAPP_SURROUNDSRC;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 slightly 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_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device. The darker the viewing conditions, the darker the image will become. Image brightness will not be changed when the viewing conditions are set to average. +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness @@ -1894,18 +2683,22 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TONECIE;Use CIECAM for tone mapping !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_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_WBCAM;WB [RT+CAT02/16] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_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 @@ -1935,11 +2728,11 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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_NEUTRAL_TOOLTIP;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 @@ -1956,12 +2749,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_GTCENTEREDSQUARE;Centered square !TP_CROP_PPI;PPI -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !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_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_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the 'Preview' method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. !TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones !TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 @@ -1972,7 +2766,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only !TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter !TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only -!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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. @@ -1985,56 +2779,925 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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_DISTORTION_AUTO_TOOLTIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, value 0 is used. +!TP_HLREC_HLBLUR;Blur !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_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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected !TP_LENSPROFILE_MODE_HEADER;Lens Profile !TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion !TP_LENSPROFILE_USE_HEADER;Correct +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !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_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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_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_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_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border +!TP_RAW_DCBBILINEAR;DCB+Bilinear !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). @@ -2042,6 +3705,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_RAW_IMAGENUM;Sub-image !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_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -2052,7 +3717,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -2067,22 +3732,27 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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_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_RCDBILINEAR;RCD+Bilinear +!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_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !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_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_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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -2097,7 +3767,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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) @@ -2116,11 +3786,11 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +!TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -2130,9 +3800,9 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2141,7 +3811,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_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 @@ -2149,6 +3819,11 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_SHARPENING_BLUR;Blur radius !TP_SHARPENING_ITERCHECK;Auto limit iterations !TP_SHARPENING_RADIUS_BOOST;Corner radius boost +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2158,22 +3833,28 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_WAVELET_7;Level 7 !TP_WAVELET_8;Level 8 !TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To +!TP_WAVELET_APPLYTO;Apply to !TP_WAVELET_AVOID;Avoid color shift !TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey +!TP_WAVELET_B1;Gray !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_BALCHROM;Equalizer Color !TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +!TP_WAVELET_BALLUM;Denoise equalizer White-Black !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_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CCURVE;Local contrast !TP_WAVELET_CH1;Whole chroma range !TP_WAVELET_CH2;Saturated/pastel @@ -2181,29 +3862,42 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_WAVELET_CHCU;Curve !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!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_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green !TP_WAVELET_COMPCONT;Contrast +!TP_WAVELET_COMPEXPERT;Advanced !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_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !TP_WAVELET_COMPTM;Tone mapping !TP_WAVELET_CONTEDIT;'After' contrast curve +!TP_WAVELET_CONTFRAME;Contrast - Compression !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_CONTRA_TOOLTIP;Changes the residual image contrast. !TP_WAVELET_CTYPE;Chrominance control +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !TP_WAVELET_DALL;All directions !TP_WAVELET_DAUB;Edge performance !TP_WAVELET_DAUB2;D2 - low @@ -2211,62 +3905,101 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast !TP_WAVELET_DONE;Vertical !TP_WAVELET_DTHR;Diagonal !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 +!TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast !TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights +!TP_WAVELET_HS2;Selective luminance range !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;Hue range !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. !TP_WAVELET_LEVF;Contrast +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength !TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !TP_WAVELET_NEUTRAL;Neutral !TP_WAVELET_NOIS;Denoise !TP_WAVELET_NOISE;Denoise and Refine @@ -2275,40 +4008,73 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % !TP_WAVELET_RE1;Reinforced !TP_WAVELET_RE2;Unchanged !TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_RESCHRO;Strength !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_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles +!TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale !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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 7fd0ca378..2c48f771b 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -171,13 +171,11 @@ HISTOGRAM_TOOLTIP_CHRO;Прикажи/сакриј хистограм хроми HISTOGRAM_TOOLTIP_G;Приказује зелени хистограм HISTOGRAM_TOOLTIP_L;Приказује ЦиеЛаб хитограм HISTOGRAM_TOOLTIP_R;Приказује црвени хистограм -HISTOGRAM_TOOLTIP_RAW;Приказује/скрива RAW хистограм HISTORY_CHANGED;Измењено HISTORY_CUSTOMCURVE;Произвољна крива HISTORY_FROMCLIPBOARD;Из оставе HISTORY_LABEL;Историјат HISTORY_MSG_1;Слика је учитана -HISTORY_MSG_2;Профил је учитан HISTORY_MSG_3;Измена профила HISTORY_MSG_4;Разгледање историјата HISTORY_MSG_5;Осветљеност @@ -191,9 +189,6 @@ HISTORY_MSG_12;Ауто експозиција HISTORY_MSG_13;Одсецање експозиције HISTORY_MSG_14;Светлина луминансе HISTORY_MSG_15;Контраст луминансе -HISTORY_MSG_16;Црна луминансе -HISTORY_MSG_17;Сабијање сенки л. -HISTORY_MSG_18;Сабијање светлог л. HISTORY_MSG_19;Крива луминансе HISTORY_MSG_20;Оштрење HISTORY_MSG_21;Полупречник оштрења @@ -219,10 +214,6 @@ HISTORY_MSG_40;Заленило боје HISTORY_MSG_41;Померање боје „А“ HISTORY_MSG_42;Померање боје „Б“ HISTORY_MSG_43;Уклањање светлосног шума -HISTORY_MSG_44;Радијус укл. светлосног шума -HISTORY_MSG_45;Толеранција ивице укл. с. шума -HISTORY_MSG_46;Уклањање колорног шума -HISTORY_MSG_47;Полупречник укл. колорног шума HISTORY_MSG_48;Толеранција ивице укл. к. шума HISTORY_MSG_49;Осетљивост ивице укл. к. шума HISTORY_MSG_50;Алат за сенке/светло @@ -230,7 +221,6 @@ HISTORY_MSG_51;Појачавање светлине HISTORY_MSG_52;Појачавање сенки HISTORY_MSG_53;Ширина тонова за светло HISTORY_MSG_54;Ширина тонова за сенке -HISTORY_MSG_55;Ликални контраст HISTORY_MSG_56;Полупречник сенки/светлог HISTORY_MSG_57;Груба ротација HISTORY_MSG_58;Хоризонтално извртање @@ -242,7 +232,6 @@ HISTORY_MSG_63;Ибор снимка HISTORY_MSG_64;Исеци фотографију HISTORY_MSG_65;Исправљање хр. аберација HISTORY_MSG_66;Чупање светла -HISTORY_MSG_67;Количина чупања светла HISTORY_MSG_68;Начин чупања светла HISTORY_MSG_69;Радни простор боја HISTORY_MSG_70;Излазни простор боја @@ -253,12 +242,10 @@ HISTORY_MSG_74;Промена величине HISTORY_MSG_75;Начин промене величине HISTORY_MSG_76;Exif метаподаци HISTORY_MSG_77;ИПТЦ метаподаци -HISTORY_MSG_78;Подаци за промени величине HISTORY_MSG_79;Ширина при промени величине HISTORY_MSG_80;Висина при промени величине HISTORY_MSG_81;Укључена промена величина HISTORY_MSG_82;Профил је измењен -HISTORY_MSG_83;Квалитетно светлост/сенке HISTORY_MSG_84;Исправљање перспективе HISTORY_MSG_85;Талоасни коефицијенти HISTORY_MSG_86;Таласно уједначење @@ -305,12 +292,6 @@ HISTORY_MSG_127;Сам изабери равно поље HISTORY_MSG_128;Полупречник равног поља HISTORY_MSG_129;Начин замућења равног поља HISTORY_MSG_130;Аутоматска дисторзија -HISTORY_MSG_131;Уклањање шума луминансе -HISTORY_MSG_132;Уклањање шума боје -HISTORY_MSG_133;Гама -HISTORY_MSG_134;Гама позиција -HISTORY_MSG_135;Гама слобода -HISTORY_MSG_136;Гама нагиб HISTORY_MSG_137;Ниво црне зелена 1 HISTORY_MSG_138;Ниво црне црвена HISTORY_MSG_139;Ниво црне плава @@ -419,7 +400,6 @@ HISTORY_MSG_246;CL крива HISTORY_MSG_247;LH крива HISTORY_MSG_248;HH крива HISTORY_MSG_249;CbDL - Праг -HISTORY_MSG_250;УШ - Побољшање HISTORY_MSG_251;ЦБ - Алгоритам HISTORY_NEWSNAPSHOT;Додај HISTORY_NEWSNAPSHOT_TOOLTIP;Пречица: Alt-s @@ -672,7 +652,7 @@ PROFILEPANEL_GLOBALPROFILES;Профили из програма PROFILEPANEL_LABEL;Профили обраде PROFILEPANEL_LOADDLGLABEL;Учитај профил за обраду... PROFILEPANEL_LOADPPASTE;Параметри за учитавање -PROFILEPANEL_MODE_TIP;Начин допуне профила који се користи за обраду.\n\nПритиснута дугмад: делимични профили се преводе у потпуне профиле, а недостајуће вредносоти се мењају подразумеваним вредностим.\n\nПуштена дугмад: профили ће бити примењени какви јесу, уз измени само оних вредности које садржи профил. +PROFILEPANEL_MODE_TOOLTIP;Начин допуне профила који се користи за обраду.\n\nПритиснута дугмад: делимични профили се преводе у потпуне профиле, а недостајуће вредносоти се мењају подразумеваним вредностим.\n\nПуштена дугмад: профили ће бити примењени какви јесу, уз измени само оних вредности које садржи профил. PROFILEPANEL_MYPROFILES;Моји профили PROFILEPANEL_PASTEPPASTE;Параметри за убацивање PROFILEPANEL_PCUSTOM;Произвољно @@ -828,7 +808,6 @@ TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Подешава било хрому, заси TP_COLORAPP_DATACIE;CIECAM02 излазни хистограм у кривуљама TP_COLORAPP_DATACIE_TOOLTIP;Када је омогућено, хистограми у CIECAM02 кривим приказују приближне вредности/опсеге за J или Q, и C, s или M након CIECAM02 подешавања.\nОвај избор не утиче на приказ у главној површи за хистограм.\n\nКада је искључено, хистограми у CIECAM02 кривим приказују Лаб вредности пре CIECAM02 подешавања. TP_COLORAPP_GAMUT;Контрола гамута (Лаб) -TP_COLORAPP_GAMUT_TOOLTIP;Омогућава контролу гамута у Лаб режиму. TP_COLORAPP_HUE;Нијанса (h) TP_COLORAPP_HUE_TOOLTIP;Нијанса (h) - угао између 0° и 360°. TP_COLORAPP_LABEL;CIECAM 2002 модел изгледа боја @@ -903,11 +882,11 @@ TP_EPD_REWEIGHTINGITERATES;Број поновних мерења TP_EPD_SCALE;Размера TP_EPD_STRENGTH;Јачина TP_EXPOSURE_AUTOLEVELS;Ауто-нивои -TP_EXPOSURE_AUTOLEVELS_TIP;Омогућава аутоматско одређивање нивоа, који подешава клизаче експозиције на основу податка о самој слици.\nУкључује чупање светлих делова уколико је неопходно. +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Омогућава аутоматско одређивање нивоа, који подешава клизаче експозиције на основу податка о самој слици.\nУкључује чупање светлих делова уколико је неопходно. TP_EXPOSURE_BLACKLEVEL;Црна TP_EXPOSURE_BRIGHTNESS;Осветљеност TP_EXPOSURE_CLIP;Одсеци -TP_EXPOSURE_CLIP_TIP;Део пиксела које ће бити одсечени применом аутоматских нивоа. +TP_EXPOSURE_CLIP_TOOLTIP;Део пиксела које ће бити одсечени применом аутоматских нивоа. TP_EXPOSURE_COMPRHIGHLIGHTS;Сабијање светлог TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Праг за чупање светлих делова TP_EXPOSURE_COMPRSHADOWS;Сабијање сенки @@ -1014,7 +993,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Светлост као функција ни TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Светлост као функција светлости L=f(L) TP_LABCURVE_LABEL;Лаб крива TP_LABCURVE_LCREDSK;Ограничи LC на црвену и боју коже -TP_LABCURVE_LCREDSK_TIP;Уколико је укључено, LC крива ће утицати само на црвену и боју коже.\nУ супротном се примењује на све тонове. +TP_LABCURVE_LCREDSK_TOOLTIP;Уколико је укључено, LC крива ће утицати само на црвену и боју коже.\nУ супротном се примењује на све тонове. TP_LABCURVE_RSTPROTECTION;Заштита црвене и боје коже TP_LABCURVE_RSTPRO_TOOLTIP;Може се користити са клизачем за Хроминансу и CC кривом. TP_LENSGEOM_AUTOCROP;Сам исеци @@ -1022,7 +1001,7 @@ TP_LENSGEOM_FILL;Сам попуни TP_LENSGEOM_LABEL;Објектив и геометрија TP_LENSPROFILE_LABEL;Профили за исправљање изобличења објектива TP_NEUTRAL;Неутрално -TP_NEUTRAL_TIP;Враћа клизаче експозиције на неутралне вредности.\nПримењује се на исте контроле као у Ауто нивои, без обзира на то да ли сте користили Ауто нивое или не. +TP_NEUTRAL_TOOLTIP;Враћа клизаче експозиције на неутралне вредности.\nПримењује се на исте контроле као у Ауто нивои, без обзира на то да ли сте користили Ауто нивое или не. TP_PCVIGNETTE_FEATHER;Умекшавање TP_PCVIGNETTE_FEATHER_TOOLTIP;Умекшавање:\n0 = само углове,\n50 = на половину од центра,\n100 = центар. TP_PCVIGNETTE_LABEL;Филтер вињетарења @@ -1079,7 +1058,7 @@ TP_RGBCURVES_RED;Ц TP_ROTATE_DEGREE;Степени: TP_ROTATE_LABEL;Ротација TP_ROTATE_SELECTLINE; Постави праву линију -TP_SAVEDIALOG_OK_TIP;Пречица: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Пречица: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Светло TP_SHADOWSHLIGHTS_HLTONALW;Ширина тонова TP_SHADOWSHLIGHTS_LABEL;Сенке/Светло @@ -1202,7 +1181,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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 @@ -1220,9 +1199,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_FAST_PIPELINE_TOOLTIP;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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? @@ -1235,6 +1214,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !FILEBROWSER_POPUPCOLORLABEL3;Label: Green !FILEBROWSER_POPUPCOLORLABEL4;Label: Blue !FILEBROWSER_POPUPCOLORLABEL5;Label: Purple +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPOPENINEDITOR;Open in Editor !FILEBROWSER_POPUPRANK0;Unrank !FILEBROWSER_POPUPRANK1;Rank 1 * @@ -1257,13 +1237,24 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_CURRENT;Current +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help !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_CROSSHAIR;Show/Hide indicator crosshair. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space !HISTORY_MSG_235;B&W - CM - Auto @@ -1290,8 +1281,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance !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 @@ -1316,7 +1305,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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 @@ -1334,10 +1322,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_318;W - Contrast - Finer levels +!HISTORY_MSG_319;W - Contrast - Finer range +!HISTORY_MSG_320;W - Contrast - Coarser range +!HISTORY_MSG_321;W - Contrast - Coarser levels !HISTORY_MSG_322;W - Gamut - Avoid color shift !HISTORY_MSG_323;W - ES - Local contrast !HISTORY_MSG_324;W - Chroma - Pastel @@ -1401,14 +1389,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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 - Color Balance +!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 @@ -1425,7 +1413,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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 @@ -1441,7 +1428,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_425;--unused-- !HISTORY_MSG_426;Retinex - Hue equalizer !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent @@ -1461,30 +1448,45 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens @@ -1495,6 +1497,654 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1510,22 +2160,42 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !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_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1540,22 +2210,83 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !ICCPROFCREATOR_COPYRIGHT;Copyright: -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!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 @@ -1567,11 +2298,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !ICCPROFCREATOR_ILL_50;D50 !ICCPROFCREATOR_ILL_55;D55 !ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -1581,6 +2313,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -1588,13 +2321,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !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 @@ -1606,7 +2340,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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. @@ -1628,6 +2362,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !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 @@ -1641,22 +2377,25 @@ 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. +!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_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !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_PREPROCWB;Preprocess White Balance !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue @@ -1665,6 +2404,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_APPEARANCE;Appearance !PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font @@ -1685,10 +2425,16 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP;Crop Editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1702,10 +2448,17 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_CURVEBBOXPOS_RIGHT;Right !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !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_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_INSPECTORWINDOW;Open inspector in own window or fullscreen !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. @@ -1734,18 +2487,20 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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 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_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !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_ZOOMONSCROLL;Zoom images by scrolling !PROFILEPANEL_PDYNAMIC;Dynamic !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... @@ -1769,8 +2524,15 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry !THRESHOLDSELECTOR_BL;Bottom-left !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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !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 @@ -1782,19 +2544,50 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. !TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. !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_NEUTRAL_TOOLTIP;Reset all sliders checkbox and curves to their default values. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. !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_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 @@ -1824,11 +2617,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_NEUTRAL_TOOLTIP;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 @@ -1845,6 +2638,7 @@ 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_GTCENTEREDSQUARE;Centered square !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1853,7 +2647,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map !TP_DEHAZE_STRENGTH;Strength !TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1864,7 +2658,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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. @@ -1880,14 +2674,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_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. @@ -1907,7 +2701,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_DISTORTION_AUTO_TOOLTIP;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 @@ -1917,17 +2711,28 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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, value 0 is used. +!TP_HLREC_HLBLUR;Blur !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 @@ -1935,18 +2740,67 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. !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_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !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_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -1961,11 +2815,814 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_METADATA_EDIT;Apply modifications !TP_METADATA_MODE;Metadata copy mode !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1976,10 +3633,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows !TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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_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_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1995,9 +3656,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBBILINEAR;DCB+Bilinear !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). @@ -2015,6 +3678,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -2025,7 +3690,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -2040,16 +3705,21 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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_RCD;RCD +!TP_RAW_RCDBILINEAR;RCD+Bilinear !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.\n+fast gives less artifacts in flat areas +!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_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_RETINEX_CONTEDIT_HSL;HSL histogram !TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram !TP_RETINEX_CONTEDIT_LH;Hue @@ -2057,7 +3727,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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 @@ -2065,7 +3735,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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free !TP_RETINEX_GAMMA_HIGH;High @@ -2080,7 +3750,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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) @@ -2099,11 +3769,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +!TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -2113,9 +3783,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +!TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +!TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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. @@ -2124,7 +3794,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_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 @@ -2136,6 +3806,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_ANCHOR;Anchor !TP_TM_FATTAL_LABEL;Dynamic Range Compression @@ -2149,22 +3824,28 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_WAVELET_7;Level 7 !TP_WAVELET_8;Level 8 !TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To +!TP_WAVELET_APPLYTO;Apply to !TP_WAVELET_AVOID;Avoid color shift !TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey +!TP_WAVELET_B1;Gray !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_BALCHROM;Equalizer Color !TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +!TP_WAVELET_BALLUM;Denoise equalizer White-Black !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_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. !TP_WAVELET_CCURVE;Local contrast !TP_WAVELET_CH1;Whole chroma range !TP_WAVELET_CH2;Saturated/pastel @@ -2172,29 +3853,42 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_WAVELET_CHCU;Curve !TP_WAVELET_CHR;Chroma-contrast link strength !TP_WAVELET_CHRO;Saturated/pastel threshold +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!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_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COLORT;Opacity red-green !TP_WAVELET_COMPCONT;Contrast +!TP_WAVELET_COMPEXPERT;Advanced !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_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard !TP_WAVELET_COMPTM;Tone mapping !TP_WAVELET_CONTEDIT;'After' contrast curve +!TP_WAVELET_CONTFRAME;Contrast - Compression !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_CONTRA_TOOLTIP;Changes the residual image contrast. !TP_WAVELET_CTYPE;Chrominance control +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. !TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. !TP_WAVELET_DALL;All directions !TP_WAVELET_DAUB;Edge performance !TP_WAVELET_DAUB2;D2 - low @@ -2202,62 +3896,101 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast !TP_WAVELET_DONE;Vertical !TP_WAVELET_DTHR;Diagonal !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -!TP_WAVELET_EDGE;Edge Sharpness +!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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. !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 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 +!TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast !TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights +!TP_WAVELET_HS2;Selective luminance range !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;Hue range !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_LABEL;Wavelet levels +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 !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_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVDIR_ALL;All levels, in all directions +!TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level !TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level +!TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 !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_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. !TP_WAVELET_LEVF;Contrast +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !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_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength !TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !TP_WAVELET_NEUTRAL;Neutral !TP_WAVELET_NOIS;Denoise !TP_WAVELET_NOISE;Denoise and Refine @@ -2266,44 +3999,77 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast +!TP_WAVELET_OPACITYWL;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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % !TP_WAVELET_RE1;Reinforced !TP_WAVELET_RE2;Unchanged !TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_RESCHRO;Strength !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_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREN;Refine +!TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD;Finer levels +!TP_WAVELET_THRESHOLD2;Coarser levels +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles +!TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale !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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic !TP_WBALANCE_PICKER;Pick +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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: f diff --git a/rtdata/languages/Slovenian b/rtdata/languages/Slovenian index 0afaa83e9..f3d71c543 100644 --- a/rtdata/languages/Slovenian +++ b/rtdata/languages/Slovenian @@ -101,7 +101,7 @@ EXPORT_PIPELINE;Vrstni red obdelav EXPORT_PUTTOQUEUEFAST; Vstavi v čakalno vrsto za hiter izvoz EXPORT_RAW_DMETHOD;Demosaic method EXPORT_USE_FAST_PIPELINE;Namenska (polna obdelava na sliki spremenjene velikosti) -EXPORT_USE_FAST_PIPELINE_TIP;Uporabite namenski tok obdelav za hitri izvoz za primer, kjer je hitrost pomembnejša od kakovosti. Sprememba velikosti slike se izvede čimprej namesto na koncu kot pri običajnem toku obdelav. Delovanje je bistveno hitrejše a bodite pripravljeni na pojav artefaktov in splošno znužanje kakovosti izdelanih slik. +EXPORT_USE_FAST_PIPELINE_TOOLTIP;Uporabite namenski tok obdelav za hitri izvoz za primer, kjer je hitrost pomembnejša od kakovosti. Sprememba velikosti slike se izvede čimprej namesto na koncu kot pri običajnem toku obdelav. Delovanje je bistveno hitrejše a bodite pripravljeni na pojav artefaktov in splošno znužanje kakovosti izdelanih slik. EXPORT_USE_NORMAL_PIPELINE;Standardno (preskoči nekatere korake, spremeni velikost na koncu) EXTPROGTARGET_1;surovo EXTPROGTARGET_2;čakalna vrsta-obdelano @@ -123,9 +123,6 @@ FILEBROWSER_DELETEDIALOG_ALL;Ali ste prepričani, da želite trajno izbri FILEBROWSER_DELETEDIALOG_HEADER;Potrditev izbrisa datoteke: FILEBROWSER_DELETEDIALOG_SELECTED;Ali ste prepričani, da želite trajno izbrisati izbrane datoteke %1? FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Ali ste prepričani, da želite trajno izbrisati izbrane datoteke %1, vključno z obdelano različico iz čakalne vrste? -FILEBROWSER_DELETEDLGLABEL;Potrditev brisanja datoteke -FILEBROWSER_DELETEDLGMSG;Ali ste prepričani, da želite brisati izbrane %1 datoteke? -FILEBROWSER_DELETEDLGMSGINCLPROC;Ali ste prepričani, da želite brisati izbrane %1 datoteke vključno z verzijo v čakalni vrsti za obdelavo? FILEBROWSER_EMPTYTRASH;Izprazni smetnjak FILEBROWSER_EMPTYTRASHHINT;Nepreklicno briši datoteke v smetnjaku. FILEBROWSER_EXTPROGMENU;Odpri z @@ -247,13 +244,11 @@ HISTOGRAM_TOOLTIP_G;Prikaži/Skrij histogram za zeleno. HISTOGRAM_TOOLTIP_L;Prikaži/Skrij histogram CIELab svetlosti. HISTOGRAM_TOOLTIP_MODE;Preklopi med linearno, log-linearno in log-log merilom histograma. HISTOGRAM_TOOLTIP_R;Prikaži/Skrij histogram za rdečo. -HISTOGRAM_TOOLTIP_RAW;Prikaži/Skrij surovi histogram. HISTORY_CHANGED;Spremenjeno HISTORY_CUSTOMCURVE;Prilagojena krivulja HISTORY_FROMCLIPBOARD;Iz odložišča HISTORY_LABEL;Zgodovina HISTORY_MSG_1;Slika naložena -HISTORY_MSG_2;PP3 naložena HISTORY_MSG_3;PP3 spremenjena HISTORY_MSG_4;Brskanje po zgodovini HISTORY_MSG_5;Ekspozicija - Osvetljenost @@ -267,9 +262,6 @@ HISTORY_MSG_12;Ekspozicija - Avtomatski nivoji HISTORY_MSG_13;Ekspozicija - Klip HISTORY_MSG_14;L*a*b* - Osvetljenost HISTORY_MSG_15;L*a*b* - Kontrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- HISTORY_MSG_19;L*a*b* - krivulja L* HISTORY_MSG_20;Ostrenje HISTORY_MSG_21;USM - Radij @@ -295,10 +287,6 @@ HISTORY_MSG_40;WB - Odtenek HISTORY_MSG_41;Ekspozicija - način krivulje odtenkov 1 HISTORY_MSG_42;Ekspozicija - krivulja odtenkov 2 HISTORY_MSG_43;Ekspozicija - način krivulje odtenkov 2 -HISTORY_MSG_44;Lum. radij odstranjevanja šuma -HISTORY_MSG_45;Lum. toleranca roba odstranjevanja šuma -HISTORY_MSG_46;Odstranjevanje barvnega šuma -HISTORY_MSG_47;Zmešaj ICC bleščave z matriko HISTORY_MSG_48;DCP - Krivulja tonov HISTORY_MSG_49;DCP osvetljava HISTORY_MSG_50;Sence/bleščave @@ -306,7 +294,6 @@ HISTORY_MSG_51;S/H - Bleščave HISTORY_MSG_52;S/H - Sence HISTORY_MSG_53;S/H - Tonska širina bleščav HISTORY_MSG_54;S/H - Tonska širina senc -HISTORY_MSG_55;S/H - Lokalni kontrast HISTORY_MSG_56;S/H - Radij HISTORY_MSG_57;Groba rotacija HISTORY_MSG_58;Horizontalni preobrat @@ -318,7 +305,6 @@ HISTORY_MSG_63;Izbran posnetek stanja HISTORY_MSG_64;Izrez HISTORY_MSG_65;CA popravki HISTORY_MSG_66;Ekspozicija - Rekonstrukcija bleščav -HISTORY_MSG_67;Ekspozicija - HLR količina HISTORY_MSG_68;Ekspozicija - HLR metoda HISTORY_MSG_69;Delovni barvni prostor HISTORY_MSG_70;Izhodni barvni prostor @@ -329,12 +315,10 @@ HISTORY_MSG_74;Sprememba velikosti - Merilo HISTORY_MSG_75;Spremeba velikosti - Metoda HISTORY_MSG_76;Exif metapodatki HISTORY_MSG_77;IPTC metapodatki -HISTORY_MSG_78;- HISTORY_MSG_79;Sprememba velikosti - Širina HISTORY_MSG_80;Sprememba velikosti - Višina HISTORY_MSG_81;Spremeni velikost HISTORY_MSG_82;Profil spremenjen -HISTORY_MSG_83;S/H - maska ostrenja HISTORY_MSG_84;Popravek perspektive HISTORY_MSG_85;Popravek objektiva - datoteka LCP HISTORY_MSG_86;RGB krivulje - Način svetilnosti @@ -381,12 +365,6 @@ HISTORY_MSG_127;Flat-field - Avto-selekcija HISTORY_MSG_128;Flat-field - Radij zameglevanja HISTORY_MSG_129;Flat-field - Tip zameglevanja HISTORY_MSG_130;Avtomatski popravek popačenja -HISTORY_MSG_131;Zmanjšanje šuma - Luma -HISTORY_MSG_132;Zmanjšanje šuma - Barvitost -HISTORY_MSG_133;Gama izhoda -HISTORY_MSG_134;Svobodni gama -HISTORY_MSG_135;Svobodni gama -HISTORY_MSG_136;Strmina proste game HISTORY_MSG_137;Nivo črnine - Zelena 1 HISTORY_MSG_138;Nivo črnine - Rdeča HISTORY_MSG_139;Nivo črnine - Modra @@ -499,7 +477,6 @@ HISTORY_MSG_246;L*a*b* - CL krivulja HISTORY_MSG_247;L*a*b* - LH krivulja HISTORY_MSG_248;L*a*b* - HH krivulja HISTORY_MSG_249;CbDL - Prag -HISTORY_MSG_250;NR - Izboljšano HISTORY_MSG_251;B&W - Algoritem HISTORY_MSG_252;CbDL - Skin tar/prot HISTORY_MSG_253;CbDL - Reduciraj artefakte @@ -523,8 +500,6 @@ HISTORY_MSG_270;CT - Svetle - Zelena HISTORY_MSG_271;CT - Svetle - Modra HISTORY_MSG_272;CT - Uravnoteži HISTORY_MSG_273;CT - Uravnoteženost barv SMH -HISTORY_MSG_274;CT - Nasičenost senc -HISTORY_MSG_275;CT - Nasičenost svetlih delov HISTORY_MSG_276;CT - Neprosojnost HISTORY_MSG_277;--neuporabljeno-- HISTORY_MSG_278;CT - Ohrani svetlost @@ -549,7 +524,6 @@ HISTORY_MSG_296;NR - Krivulja svetlosti HISTORY_MSG_297;NR - Način HISTORY_MSG_298;Filter mrtvih pikslov HISTORY_MSG_299;NR - Krivulja svetlosti -HISTORY_MSG_300;- HISTORY_MSG_301;NR - Kontrola lume HISTORY_MSG_302;NR - Metoda barvitosti HISTORY_MSG_303;NR - Metoda barvitosti @@ -658,7 +632,6 @@ HISTORY_MSG_405;W - Odstranjevanje šuma - Nivo 4 HISTORY_MSG_406;W - ES - Sosednji piksli HISTORY_MSG_407;Retinex - Metoda HISTORY_MSG_408;Retinex - Radij -HISTORY_MSG_409;Retinex - Kontrast HISTORY_MSG_410;Retinex - Odmik HISTORY_MSG_411;Retinex - Moč HISTORY_MSG_412;Retinex - Gaussov gradient @@ -706,7 +679,6 @@ HISTORY_MSG_468;PS - Zapolni luknje HISTORY_MSG_469;PS - Mediana HISTORY_MSG_471;PS - Popravek gibanja HISTORY_MSG_472;PS - Gladki prehodi -HISTORY_MSG_473;PS - Uporabi LMMSE HISTORY_MSG_474;PS - Izenači HISTORY_MSG_475;PS - Izenači kanal HISTORY_MSG_476;CAM02 - Začasno ven @@ -745,7 +717,6 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - prikaz maske regije HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - strmina regije HISTORY_MSG_DEHAZE_DEPTH;Odstranjevanje zamegljenosti - Globina HISTORY_MSG_DEHAZE_ENABLED;Odstranjevanje zamegljenosti -HISTORY_MSG_DEHAZE_LUMINANCE;Odstranjevanje zamegljenosti - samo svetlost HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Odstranjevanje zamegljenosti - Prikaži globino mape HISTORY_MSG_DEHAZE_STRENGTH;Odstranjevanje zamegljenosti - Moč HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dualno odstranjevanje mozaičnosti - Avtomatski prag @@ -769,7 +740,6 @@ HISTORY_MSG_MICROCONTRAST_CONTRAST;Mikrokontrast - Prag kontrasta HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Avtomatski prag HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Avtomatski radij HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Prag kontrasta -HISTORY_MSG_PDSHARPEN_GAMMA;CS - Gama HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iteracije HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radij HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Povečanje polmera vogala @@ -783,7 +753,6 @@ HISTORY_MSG_RAW_BORDER;Surova meja HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Dovoli povečevanje HISTORY_MSG_SHARPENING_BLUR;Ostrenje - Zamegli radij HISTORY_MSG_SHARPENING_CONTRAST;Ostrenje - Prag kontrasta -HISTORY_MSG_SHARPENING_GAMMA;Ostrenje - Gama HISTORY_MSG_SH_COLORSPACE;S/H - Barvni prostor HISTORY_MSG_SOFTLIGHT_ENABLED;Mehka svetloba HISTORY_MSG_SOFTLIGHT_STRENGTH;Mehka svetloba - Moč @@ -1228,7 +1197,7 @@ PROFILEPANEL_GLOBALPROFILES;Skupni profili PROFILEPANEL_LABEL;Profili za obdelovanje PROFILEPANEL_LOADDLGLABEL;Naloži parametre obdelovanja... PROFILEPANEL_LOADPPASTE;Parametri za nalaganje -PROFILEPANEL_MODE_TIP;Vnosni način profila za obdelovanje.\n\nPritisnjen gumb: delni profili bodo spremenjeni v polne profile; manjkajoče vrednosti bodo zamenjale fiksne privzete vrednosti.\n\nSproščen gumb: profili bodo uporabljeni kakršni so, zamenjajo se samo vnesene vrednosti. +PROFILEPANEL_MODE_TOOLTIP;Vnosni način profila za obdelovanje.\n\nPritisnjen gumb: delni profili bodo spremenjeni v polne profile; manjkajoče vrednosti bodo zamenjale fiksne privzete vrednosti.\n\nSproščen gumb: profili bodo uporabljeni kakršni so, zamenjajo se samo vnesene vrednosti. PROFILEPANEL_MYPROFILES;Moji profili PROFILEPANEL_PASTEPPASTE;Parameteri za lepljenje PROFILEPANEL_PCUSTOM;Po meri @@ -1422,7 +1391,6 @@ TP_COLORAPP_DATACIE;CIECAM02 izhodni histogrami v krivuljah TP_COLORAPP_DATACIE_TOOLTIP;Kadar je aktivirano so histogrami, CIECAM02 krivulje prikazujejo približne vrednosti oz. intervale z J ali Q, in C, s ali M po prilagoditvah CIECAM02.\nTa izbira ne vpliva na glavni pano histogramov.\n\nKadar je deaktiviran, histogrami v CIECAM02 krivuljah kažejo vrednosti L*a*b* pred prilagoditvami CIECAM02. TP_COLORAPP_FREE;Prosta temp+zelena + CAT02 + [output] TP_COLORAPP_GAMUT;Lontrola barvega obsega (L*a*b*) -TP_COLORAPP_GAMUT_TOOLTIP;Dovoli kontrolo barvnega obsega v L*a*b* načinu. TP_COLORAPP_HUE;Odtenek (h) TP_COLORAPP_HUE_TOOLTIP;Odtenek (h) - kot med 0° in 360°. TP_COLORAPP_LABEL;CIE Prikaz barv Model 2002 @@ -1435,7 +1403,7 @@ TP_COLORAPP_MEANLUMINANCE;Povprečna svetlost (Yb%) TP_COLORAPP_MODEL;WP Model TP_COLORAPP_MODEL_TOOLTIP;Model bele točke.\n\nWB [RT] + [output]: za sceno se uporabi RT-jevo ravnotežje beline, CIECAM02 je nastavljen na D50, nastavitev beline izhodne naprave je nastavljena v Pogojih gledanja.\n\nWB [RT+CAT02] + [output]: RT-jevo ravnotežje beline uporablja CAT02, ravnotežje beline izhodne naprave pa je nastavljeno v Pogojih gledanja.\n\nProsta temp+zelena + CAT02 + [output]: temp in zeleno določi uporabnik, ravnotežje beline izhodne naprave pa je nastavljeno v Pogojih gledanja. TP_COLORAPP_NEUTRAL;Ponastavi -TP_COLORAPP_NEUTRAL_TIP;Ponastavi vse potrditvena polja in krivulje na njihove privzete vrednosti +TP_COLORAPP_NEUTRAL_TOOLTIP;Ponastavi vse potrditvena polja in krivulje na njihove privzete vrednosti TP_COLORAPP_RSTPRO;Varovanje rdečih in kožnih tonov TP_COLORAPP_RSTPRO_TOOLTIP;Varovanje rdečih in kožnih tonov ima vpliv tako na drsnike kot na krivulje. TP_COLORAPP_SURROUND;Obkroži @@ -1497,7 +1465,7 @@ TP_COLORTONING_METHOD;Metoda TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* mešanje", "RGB drsniki" in "RGB krivulje" uporabljajo interpolirno mešanje barv.\n"Uravnoteženje barv (Sence/Srednji toni/Bleščave)" and "Nasičenje 2 barv" uporabljajo neposredne barve.\n\nČrno-belo orodje lahko uporabimo pri katerikoli metodi barvega toniranja. TP_COLORTONING_MIDTONES;Srednji toni TP_COLORTONING_NEUTRAL;Ponastavi drsnike -TP_COLORTONING_NEUTRAL_TIP;Ponastavi vse vrednosti (Sence, Srednji toni, Bleščave) na prizeto vrednost. +TP_COLORTONING_NEUTRAL_TOOLTIP;Ponastavi vse vrednosti (Sence, Srednji toni, Bleščave) na prizeto vrednost. TP_COLORTONING_OPACITY;Neprosojnost TP_COLORTONING_RGBCURVES;RGB - Krivulje TP_COLORTONING_RGBSLIDERS;RGB - Drsniki @@ -1541,7 +1509,6 @@ TP_DEFRINGE_RADIUS;Radij TP_DEFRINGE_THRESHOLD;Prag TP_DEHAZE_DEPTH;Globina TP_DEHAZE_LABEL;Odstranjevanje zamegljenosti -TP_DEHAZE_LUMINANCE;Samo svetlost TP_DEHAZE_SHOW_DEPTH_MAP;Prikaži karto globin TP_DEHAZE_STRENGTH;Moč TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Avto multi-cone @@ -1613,7 +1580,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;Pri -100 so ciljani toni kože.\nPri 0 so vsi to TP_DIRPYREQUALIZER_THRESHOLD;Prag TP_DIRPYREQUALIZER_TOOLTIP;Poskusi zmanjšati artefakte pri spremembi barve kože (odtenek, barvitost, luma) in preostankom slike. TP_DISTORTION_AMOUNT;Količina -TP_DISTORTION_AUTO_TIP;Avtomatsko popravi popačitve objektiva pri surovih slikah s primerjavo z vgrajeno sliko JPEG, če obstaja in so popravki objektiva izvedeni v fotoaparatu. +TP_DISTORTION_AUTO_TOOLTIP;Avtomatsko popravi popačitve objektiva pri surovih slikah s primerjavo z vgrajeno sliko JPEG, če obstaja in so popravki objektiva izvedeni v fotoaparatu. TP_DISTORTION_LABEL;Popravek popačenja TP_EPD_EDGESTOPPING;Zaustavljanje roba TP_EPD_GAMMA;Gama @@ -1622,12 +1589,12 @@ TP_EPD_REWEIGHTINGITERATES;Ponovno tehtanje ponovitev TP_EPD_SCALE;Merilo TP_EPD_STRENGTH;Moč TP_EXPOSURE_AUTOLEVELS;Avto nivoji -TP_EXPOSURE_AUTOLEVELS_TIP;Preklaplja izvajanje avto nivojev z vrednostmi izračunani iz analize slike.\nOmogoča rekonstrukcijo bleščav, če je potrebna. +TP_EXPOSURE_AUTOLEVELS_TOOLTIP;Preklaplja izvajanje avto nivojev z vrednostmi izračunani iz analize slike.\nOmogoča rekonstrukcijo bleščav, če je potrebna. TP_EXPOSURE_BLACKLEVEL;Črna TP_EXPOSURE_BRIGHTNESS;Svetlost TP_EXPOSURE_CLAMPOOG;Posnetek barv izven obsega TP_EXPOSURE_CLIP;Posnetek % -TP_EXPOSURE_CLIP_TIP;Delež pikslov, ki naj bodo posneti v operaciji avto nivoji. +TP_EXPOSURE_CLIP_TOOLTIP;Delež pikslov, ki naj bodo posneti v operaciji avto nivoji. TP_EXPOSURE_COMPRHIGHLIGHTS;Stiskanje bleščav TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Prag stiskanja bleščav TP_EXPOSURE_COMPRSHADOWS;Stiskanje senc @@ -1770,7 +1737,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Svetlost glede na odtenek L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Svetlost glede na svetlost L=f(L) TP_LABCURVE_LABEL;Prilagoditve L*a*b* TP_LABCURVE_LCREDSK;Omeji LC na rdečo in kožne barve -TP_LABCURVE_LCREDSK_TIP;Če je aktivna, krivulja LC vpliva samo na rdečo in kožne barve.\nČe je onemogočen, se nanaša na vse tone. +TP_LABCURVE_LCREDSK_TOOLTIP;Če je aktivna, krivulja LC vpliva samo na rdečo in kožne barve.\nČe je onemogočen, se nanaša na vse tone. TP_LABCURVE_RSTPROTECTION;Zaščita rdeče in kožnih barv TP_LABCURVE_RSTPRO_TOOLTIP;Deluje na drsniku kromatičnost in krivulji CC. TP_LENSGEOM_AUTOCROP;Avtomatska obrezava @@ -1796,7 +1763,7 @@ TP_METADATA_MODE;Način kopiranja metapodatkov TP_METADATA_STRIP;Odstrani vse metapodatke TP_METADATA_TUNNEL;Kopiraj nespremenjeno TP_NEUTRAL;Ponastavi -TP_NEUTRAL_TIP;Ponastavi drsnike ekspozicije v nevtralno stanje.\nUporablja enake parametre kot pri Avtomatskih nivojih, ne glede na to ali so uporabljeni ali ne.. +TP_NEUTRAL_TOOLTIP;Ponastavi drsnike ekspozicije v nevtralno stanje.\nUporablja enake parametre kot pri Avtomatskih nivojih, ne glede na to ali so uporabljeni ali ne.. TP_PCVIGNETTE_FEATHER;Pero TP_PCVIGNETTE_FEATHER_TOOLTIP;Perje:\n0 = samo vogali,\n50 = na polovici do centra,\n100 = v centru. TP_PCVIGNETTE_LABEL;Filter vinjetiranja @@ -1981,7 +1948,7 @@ TP_RETINEX_MLABEL;Obnovi brez meglic Min=%1 Max=%2 TP_RETINEX_MLABEL_TOOLTIP;Mora biti blizu min=0 max=32768\nObnovljena slika brez mešanja. TP_RETINEX_NEIGHBOR;Radij TP_RETINEX_NEUTRAL;Ponastavi -TP_RETINEX_NEUTRAL_TIP;Ponastavi vse drsnike in klrivulje na njihove privzete vrednosti. +TP_RETINEX_NEUTRAL_TOOLTIP;Ponastavi vse drsnike in klrivulje na njihove privzete vrednosti. TP_RETINEX_OFFSET;Odmik (svetlost) TP_RETINEX_SCALES;Gaussov gradient TP_RETINEX_SCALES_TOOLTIP;Če je drsnik na 0, so vse iteracije identične.\nČe je > 0 merilo in radij pojemata pri vsaki iteraciji in obratno. @@ -2017,7 +1984,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Stopnja TP_ROTATE_LABEL;Zavrti TP_ROTATE_SELECTLINE;Izberi ravno črto -TP_SAVEDIALOG_OK_TIP;Bližnjica: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Bližnjica: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Bleščave TP_SHADOWSHLIGHTS_HLTONALW;Tonska širina bleščav TP_SHADOWSHLIGHTS_LABEL;Sence/bleščave @@ -2033,7 +2000,6 @@ TP_SHARPENING_BLUR;Radij zamegljevanja TP_SHARPENING_CONTRAST;Prag kontrasta TP_SHARPENING_EDRADIUS;Radij TP_SHARPENING_EDTOLERANCE;Toleranca robov -TP_SHARPENING_GAMMA;Gama TP_SHARPENING_HALOCONTROL;Kontrola odbojev TP_SHARPENING_HCAMOUNT;Količina TP_SHARPENING_LABEL;Ostrenje @@ -2239,7 +2205,6 @@ TP_WAVELET_THRH;Prag bleščav TP_WAVELET_TILESBIG;Velike krpe TP_WAVELET_TILESFULL;Celotna slika TP_WAVELET_TILESIZE;Metoda pokrivanja -TP_WAVELET_TILESLIT;Majhne krpe TP_WAVELET_TILES_TOOLTIP;Obdelava celotne slike zagotavlja boljšo kakovost in jo priporočamo, medtem ko je uporaba krp rezervna možnost za uporabnike z malo RAMa. Poglejte v RawPedio za potrebe po pomnilniku. TP_WAVELET_TMSTRENGTH;Compression strength TP_WAVELET_TMSTRENGTH_TOOLTIP;Upravlja z močjo tonske preslikave ali stiskanja kontrasta preostanka slike. Kadar je vrednost različna od 0, potem sta drsnika za moč in gamo posivela in onemogočena. @@ -2306,6 +2271,1801 @@ ZOOMPANEL_ZOOMOUT;Zoom Out\nBližnjica: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!FILEBROWSER_POPUPINSPECT;Inspect +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help +!HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM +!HISTORY_MSG_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation +!HISTORY_MSG_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y +!HISTORY_MSG_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average +!HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection +!HISTORY_MSG_RANGEAB;Range ab +!HISTORY_MSG_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 +!INSPECTOR_WINDOW_TITLE;Inspector +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings +!PARTIALPASTE_PREPROCWB;Preprocess White Balance +!PARTIALPASTE_SPOT;Spot removal +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips +!PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_CROP_GTCENTEREDSQUARE;Centered square +!TP_DEHAZE_SATURATION;Saturation +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_OUT_LEVEL;Output level +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. +!TP_HLREC_HLBLUR;Blur +!TP_ICM_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 +!TP_ICM_REDFRAME;Custom Primaries +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 +!TP_ICM_WORKING_TRC_LIN;Linear g=1 +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery +!TP_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear +!TP_RAW_DCBBILINEAR;DCB+Bilinear +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. +!TP_RAW_RCDBILINEAR;RCD+Bilinear +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !TP_SHARPENING_ITERCHECK;Auto limit iterations +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal +!TP_WAVELET_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine +!TP_WAVELET_CHRWAV;Blur chroma +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. +!TP_WAVELET_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise +!TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 6dbea54d8..de612ad73 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -204,13 +204,11 @@ HISTOGRAM_TOOLTIP_CHRO;Visa/Dölj kromananshistogrammet HISTOGRAM_TOOLTIP_G;Visa/dölj grönt histogram HISTOGRAM_TOOLTIP_L;Visa/dölj CIELAB histogram för luminans HISTOGRAM_TOOLTIP_R;Visa/dölj rött histogram -HISTOGRAM_TOOLTIP_RAW;Visa/dölj råbildens histogram HISTORY_CHANGED;Ändrad HISTORY_CUSTOMCURVE;Egen kurva HISTORY_FROMCLIPBOARD;Från klippbordet HISTORY_LABEL;Historia HISTORY_MSG_1;Fotot laddades -HISTORY_MSG_2;Profil laddad HISTORY_MSG_3;Profil ändrad HISTORY_MSG_4;Historia-bläddrande HISTORY_MSG_5;Ljusstyrka @@ -224,9 +222,6 @@ HISTORY_MSG_12;Autonivåer HISTORY_MSG_13;Exponeringsmarkering HISTORY_MSG_14;Lab - Ljushet HISTORY_MSG_15;Lab - Kontrast -HISTORY_MSG_16;Svart luminans -HISTORY_MSG_17;Luminans högdagerkompr. -HISTORY_MSG_18;Luminans skuggkompr. HISTORY_MSG_19;'L'-kurva HISTORY_MSG_20;Skärpning HISTORY_MSG_21;USM - Radie @@ -252,10 +247,6 @@ HISTORY_MSG_40;VB - Färgton HISTORY_MSG_41;Tonkurva läge 1 HISTORY_MSG_42;Tonkurva 2 HISTORY_MSG_43;Tonkurva läge 2 -HISTORY_MSG_44;Brusreduceringsradie -HISTORY_MSG_45;Kanttolerans för lum.brusreducering -HISTORY_MSG_46;Färgbrusreducering -HISTORY_MSG_47;Mixa högdagrar med matris HISTORY_MSG_48;Använd tonkurvan i DCP HISTORY_MSG_49;DCP ljuskälla HISTORY_MSG_50;Skuggor/Högdagrar @@ -263,7 +254,6 @@ HISTORY_MSG_51;S/H - Högdagrar HISTORY_MSG_52;S/H - Skuggor HISTORY_MSG_53;S/H - Högdagertonvidd HISTORY_MSG_54;S/H - Skuggtonvidd -HISTORY_MSG_55;S/H - Lokal kontrast HISTORY_MSG_56;S/H - Radie HISTORY_MSG_57;Enkel rotering HISTORY_MSG_58;Vänd horisontellt @@ -275,7 +265,6 @@ HISTORY_MSG_63;Bokmärke valt HISTORY_MSG_64;Beskär HISTORY_MSG_65;Korrigera kromatiska abberationer HISTORY_MSG_66;Högdageråterställning -HISTORY_MSG_67;Mängd på högdageråterställning HISTORY_MSG_68;Metod för högdageråterställning HISTORY_MSG_69;Färgrymd HISTORY_MSG_70;Utmatningsfärgrymd @@ -286,12 +275,10 @@ HISTORY_MSG_74;Ändra storleksskala HISTORY_MSG_75;Metod för ändring av storlek HISTORY_MSG_76;Exif Metadata HISTORY_MSG_77;IPTC Metadata -HISTORY_MSG_78;Data som ska ändra storlek HISTORY_MSG_79;Storleksändring, bredd HISTORY_MSG_80;Storleksändring, höjd HISTORY_MSG_81;Storleksändring HISTORY_MSG_82;Profilen ändrades -HISTORY_MSG_83;S/H - Skarp mask HISTORY_MSG_84;Korrigering av perspektiv HISTORY_MSG_85;LCP HISTORY_MSG_86;RGB-kurvor - Luminansläge @@ -338,12 +325,6 @@ HISTORY_MSG_127;Automatiskt val av plattfält HISTORY_MSG_128;Oskärperadie för plattfält HISTORY_MSG_129;Oskärpetyp hos plattfältet HISTORY_MSG_130;Autodistorion -HISTORY_MSG_131;Brusreducering, luminans -HISTORY_MSG_132;Brusreducering, kroma -HISTORY_MSG_133;Utmatningsgamma -HISTORY_MSG_134;Obunden gamma -HISTORY_MSG_135;Obunden gamma -HISTORY_MSG_136;Gammalutning HISTORY_MSG_137;Svartpunktsnivå grön 1 HISTORY_MSG_138;Svartpunktsnivå röd HISTORY_MSG_139;Svartpunktsnivå blå @@ -452,7 +433,6 @@ HISTORY_MSG_246;'CL'-kurva HISTORY_MSG_247;'LH'-kurva HISTORY_MSG_248;'HH'-kurva HISTORY_MSG_249;Kontrast genom detaljnivåer -HISTORY_MSG_250;Brusreduceringsförbättring HISTORY_MSG_251;B&W - Algoritm HISTORY_MSG_252;CbDL Hudtoner HISTORY_MSG_253;CbDL Reducera artefakter @@ -473,8 +453,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_274;CT - Mättnad skuggor -HISTORY_MSG_275;CT - Mättnad i högdagrar HISTORY_MSG_276;CT - Opacitet HISTORY_MSG_277;--unused-- HISTORY_MSG_278;CT - Bevara luminans @@ -496,7 +474,6 @@ HISTORY_MSG_295;Filmsimulering - Film HISTORY_MSG_296;NR - Luminanskurva HISTORY_MSG_298;Filter för döda pixlar HISTORY_MSG_299;NR - Krominanskurva -HISTORY_MSG_300;- HISTORY_MSG_301;NR - Luminanskontroll HISTORY_MSG_302;NR - Chroma-metod HISTORY_MSG_303;NR - Chroma-metod @@ -588,7 +565,6 @@ HISTORY_MSG_404;W - ES - Basförstärkning HISTORY_MSG_405;W - Brusred. - Nivå 4 HISTORY_MSG_407;Retinex - Metod HISTORY_MSG_408;Retinex - Radie -HISTORY_MSG_409;Retinex - Kontrast HISTORY_MSG_410;Retinex - Kompensation HISTORY_MSG_411;Retinex - Styrka HISTORY_MSG_413;Retinex - Kontrast @@ -917,7 +893,7 @@ PROFILEPANEL_GLOBALPROFILES;Förinstallerade profiler PROFILEPANEL_LABEL;Efterbehandlingsprofiler PROFILEPANEL_LOADDLGLABEL;Ladda efterbehandlingsparametrar... PROFILEPANEL_LOADPPASTE;Parametrar att ladda -PROFILEPANEL_MODE_TIP;Ifyllnadsläge för profil.\n\nKnappen nedtryckt: partiell profil konverteras till full profil; de saknade värdena kommer att fyllas i mha standardvärden.\n\nKnapp släppt: Profilen kommer att appliceras som den är, och förändrar bara de värden som den själv innehåller. +PROFILEPANEL_MODE_TOOLTIP;Ifyllnadsläge för profil.\n\nKnappen nedtryckt: partiell profil konverteras till full profil; de saknade värdena kommer att fyllas i mha standardvärden.\n\nKnapp släppt: Profilen kommer att appliceras som den är, och förändrar bara de värden som den själv innehåller. PROFILEPANEL_MYPROFILES;Mina profiler PROFILEPANEL_PASTEPPASTE;Parametrar att klistra in PROFILEPANEL_PCUSTOM;Egen @@ -1082,7 +1058,6 @@ TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Justera antingen kroma, mättnad eller colorful 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_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) TP_COLORAPP_HUE_TOOLTIP;Nyans h) - vinkel mellan 0° och 360° TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 @@ -1129,7 +1104,7 @@ TP_COLORTONING_LUMAMODE_TOOLTIP;Om aktiverad så kommer luminansen för varje pi TP_COLORTONING_METHOD;Metod TP_COLORTONING_MIDTONES;Mellantoner TP_COLORTONING_NEUTRAL;Återställ reglage -TP_COLORTONING_NEUTRAL_TIP;Återställ alla värden (skuggor, mellantoner, högdagrar) till standardvärdena. +TP_COLORTONING_NEUTRAL_TOOLTIP;Återställ alla värden (skuggor, mellantoner, högdagrar) till standardvärdena. TP_COLORTONING_OPACITY;Opacitet TP_COLORTONING_RGBCURVES;RGB - Kurvor TP_COLORTONING_RGBSLIDERS;RGB - Reglage @@ -1230,11 +1205,11 @@ TP_EPD_REWEIGHTINGITERATES;Återviktade iterationer TP_EPD_SCALE;Skala TP_EPD_STRENGTH;Styrka 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_AUTOLEVELS_TOOLTIP;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 TP_EXPOSURE_BRIGHTNESS;Ljushet TP_EXPOSURE_CLIP;Klippnivå % -TP_EXPOSURE_CLIP_TIP;Andelen pixlar som ska klippas när autonivåer används. +TP_EXPOSURE_CLIP_TOOLTIP;Andelen pixlar som ska klippas när autonivåer används. TP_EXPOSURE_COMPRHIGHLIGHTS;Högdageråterställning TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Högdageråterställning, tröskelvärde TP_EXPOSURE_COMPRSHADOWS;Skuggåterställning @@ -1356,7 +1331,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminans enligt nyans L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminans enligt luminans L=f(L) TP_LABCURVE_LABEL;Labjusteringar TP_LABCURVE_LCREDSK;Begränsa LC till röda färger och hudtoner -TP_LABCURVE_LCREDSK_TIP;Om aktiverad så påverkar LC-kurvan enbart röda färger och hudtoner.\nOm ej aktiverad så appliceras den till alla färger och toner. +TP_LABCURVE_LCREDSK_TOOLTIP;Om aktiverad så påverkar LC-kurvan enbart röda färger och hudtoner.\nOm ej aktiverad så appliceras den till alla färger och toner. TP_LABCURVE_RSTPROTECTION;Skydda röda färger och hudtoner TP_LABCURVE_RSTPRO_TOOLTIP;Kan användas med kromareglaget och CC-kurvan TP_LENSGEOM_AUTOCROP;Autobeskärning @@ -1364,7 +1339,7 @@ TP_LENSGEOM_FILL;Fyll automatiskt TP_LENSGEOM_LABEL;Geometrisk- och distorsionskorrigering TP_LENSPROFILE_LABEL;Objektivkorrigeringsprofil 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_NEUTRAL_TOOLTIP;Å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 TP_PCVIGNETTE_FEATHER_TOOLTIP;Fjäder: 0=enbart kanter, 50=halvvägs till mitten, 100=i mitten TP_PCVIGNETTE_LABEL;Vinjetteringsfilter @@ -1467,7 +1442,7 @@ TP_RETINEX_MAP_NONE;Ingen TP_RETINEX_METHOD;Metod TP_RETINEX_NEIGHBOR;Radie TP_RETINEX_NEUTRAL;Återställ -TP_RETINEX_NEUTRAL_TIP;Återställer alla reglage och kurvor till sina ursprungliga värden. +TP_RETINEX_NEUTRAL_TOOLTIP;Återställer alla reglage och kurvor till sina ursprungliga värden. TP_RETINEX_OFFSET;Kompensation (ljushet) TP_RETINEX_SCALES;Gaussisk gradient TP_RETINEX_SCALES_TOOLTIP;Om reglaget är på 0 så kommer alla iterationer att vara lika.\nOm > 0 så kommer skalan och radien reduceras när iterationerna ökar och omvänt. @@ -1497,7 +1472,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Grader TP_ROTATE_LABEL;Rotera TP_ROTATE_SELECTLINE;Välj rak linje -TP_SAVEDIALOG_OK_TIP;Kortkommando: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Kortkommando: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Högdager TP_SHADOWSHLIGHTS_HLTONALW;Tonvidd (Högdagrar) TP_SHADOWSHLIGHTS_LABEL;Skugg- och högdageråterställning @@ -1673,7 +1648,6 @@ TP_WAVELET_THRH;Högdagertröskel TP_WAVELET_TILESBIG;Stora tiles TP_WAVELET_TILESFULL;Hela bilden TP_WAVELET_TILESIZE;Metod för tiling -TP_WAVELET_TILESLIT;SMå tiles TP_WAVELET_TMSTRENGTH;Komprimeringsstyrka TP_WAVELET_TMTYPE;Komprimeringsmetod TP_WBALANCE_AUTO;Auto @@ -1743,7 +1717,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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 @@ -1758,26 +1732,38 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_FAST_PIPELINE_TOOLTIP;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_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? !FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPINSPECT;Inspect !FILEBROWSER_POPUPREMOVE;Delete permanently !FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default !FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !GENERAL_CURRENT;Current +!GENERAL_DELETE_ALL;Delete all +!GENERAL_EDIT;Edit !GENERAL_HELP;Help !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_CROSSHAIR;Show/Hide indicator crosshair. !HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +!HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +!HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +!HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +!HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space !HISTORY_MSG_235;B&W - CM - Auto @@ -1795,7 +1781,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_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 @@ -1806,34 +1792,49 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_402;W - Denoise sub-tool !HISTORY_MSG_406;W - ES - Neighboring pixels !HISTORY_MSG_412;Retinex - Gaussian gradient -!HISTORY_MSG_425;Retinex - Log base +!HISTORY_MSG_425;--unused-- !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent !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_445;Raw Sub-Image +!HISTORY_MSG_446;--unused-- +!HISTORY_MSG_447;--unused-- +!HISTORY_MSG_448;--unused-- +!HISTORY_MSG_449;PS ISO adaption +!HISTORY_MSG_450;--unused-- +!HISTORY_MSG_451;--unused-- +!HISTORY_MSG_452;PS Show motion +!HISTORY_MSG_453;PS Show mask only +!HISTORY_MSG_454;--unused-- +!HISTORY_MSG_455;--unused-- +!HISTORY_MSG_456;--unused-- +!HISTORY_MSG_457;PS Check red/blue +!HISTORY_MSG_458;--unused-- +!HISTORY_MSG_459;--unused-- +!HISTORY_MSG_460;--unused-- +!HISTORY_MSG_461;--unused-- +!HISTORY_MSG_462;PS Check green +!HISTORY_MSG_463;--unused-- +!HISTORY_MSG_464;PS Blur motion mask +!HISTORY_MSG_465;PS Blur radius +!HISTORY_MSG_466;--unused-- +!HISTORY_MSG_467;--unused-- +!HISTORY_MSG_468;PS Fill holes +!HISTORY_MSG_469;PS Median +!HISTORY_MSG_470;--unused-- +!HISTORY_MSG_471;PS Motion correction +!HISTORY_MSG_472;PS Smooth transitions +!HISTORY_MSG_474;PS Equalize +!HISTORY_MSG_475;PS Equalize channel +!HISTORY_MSG_476;CAL - VC - Temperature +!HISTORY_MSG_477;CAL - VC - Tint +!HISTORY_MSG_478;CAL - VC - Mean luminance +!HISTORY_MSG_479;CAL - VC - Adaptation +!HISTORY_MSG_480;CAL - VC - Auto adaptation +!HISTORY_MSG_481;CAL - SC - Temperature +!HISTORY_MSG_482;CAL - SC - Tint +!HISTORY_MSG_483;CAL - SC - Mean luminance +!HISTORY_MSG_484;CAL - SC - Auto mean luminance !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens @@ -1844,6 +1845,654 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_494;Capture Sharpening +!HISTORY_MSG_496;Local Spot deleted +!HISTORY_MSG_497;Local Spot selected +!HISTORY_MSG_498;Local Spot name +!HISTORY_MSG_499;Local Spot visibility +!HISTORY_MSG_500;Local Spot shape +!HISTORY_MSG_501;Local Spot method +!HISTORY_MSG_502;Local Spot shape method +!HISTORY_MSG_503;Local Spot locX +!HISTORY_MSG_504;Local Spot locXL +!HISTORY_MSG_505;Local Spot locY +!HISTORY_MSG_506;Local Spot locYT +!HISTORY_MSG_507;Local Spot center +!HISTORY_MSG_508;Local Spot circrad +!HISTORY_MSG_509;Local Spot quality method +!HISTORY_MSG_510;Local Spot transition +!HISTORY_MSG_511;Local Spot thresh +!HISTORY_MSG_512;Local Spot ΔE decay +!HISTORY_MSG_513;Local Spot scope +!HISTORY_MSG_514;Local Spot structure +!HISTORY_MSG_515;Local Adjustments +!HISTORY_MSG_516;Local - Color and light +!HISTORY_MSG_517;Local - Enable super +!HISTORY_MSG_518;Local - Lightness +!HISTORY_MSG_519;Local - Contrast +!HISTORY_MSG_520;Local - Chrominance +!HISTORY_MSG_521;Local - Scope +!HISTORY_MSG_522;Local - curve method +!HISTORY_MSG_523;Local - LL Curve +!HISTORY_MSG_524;Local - CC curve +!HISTORY_MSG_525;Local - LH Curve +!HISTORY_MSG_526;Local - H curve +!HISTORY_MSG_527;Local - Color Inverse +!HISTORY_MSG_528;Local - Exposure +!HISTORY_MSG_529;Local - Exp Compensation +!HISTORY_MSG_530;Local - Exp Hlcompr +!HISTORY_MSG_531;Local - Exp hlcomprthresh +!HISTORY_MSG_532;Local - Exp black +!HISTORY_MSG_533;Local - Exp Shcompr +!HISTORY_MSG_534;Local - Warm Cool +!HISTORY_MSG_535;Local - Exp Scope +!HISTORY_MSG_536;Local - Exp Contrast curve +!HISTORY_MSG_537;Local - Vibrance +!HISTORY_MSG_538;Local - Vib Saturated +!HISTORY_MSG_539;Local - Vib Pastel +!HISTORY_MSG_540;Local - Vib Threshold +!HISTORY_MSG_541;Local - Vib Protect skin tones +!HISTORY_MSG_542;Local - Vib avoid colorshift +!HISTORY_MSG_543;Local - Vib link +!HISTORY_MSG_544;Local - Vib Scope +!HISTORY_MSG_545;Local - Vib H curve +!HISTORY_MSG_546;Local - Blur and noise +!HISTORY_MSG_547;Local - Radius +!HISTORY_MSG_548;Local - Noise +!HISTORY_MSG_549;Local - Blur scope +!HISTORY_MSG_550;Local - Blur method +!HISTORY_MSG_551;Local - Blur Luminance only +!HISTORY_MSG_552;Local - Tone mapping +!HISTORY_MSG_553;Local - TM compression strength +!HISTORY_MSG_554;Local - TM gamma +!HISTORY_MSG_555;Local - TM edge stopping +!HISTORY_MSG_556;Local - TM scale +!HISTORY_MSG_557;Local - TM Reweighting +!HISTORY_MSG_558;Local - TM scope +!HISTORY_MSG_559;Local - Retinex +!HISTORY_MSG_560;Local - Retinex method +!HISTORY_MSG_561;Local - Retinex strength +!HISTORY_MSG_562;Local - Retinex chroma +!HISTORY_MSG_563;Local - Retinex radius +!HISTORY_MSG_564;Local - Retinex contrast +!HISTORY_MSG_565;Local - scope +!HISTORY_MSG_566;Local - Retinex Gain curve +!HISTORY_MSG_567;Local - Retinex Inverse +!HISTORY_MSG_568;Local - Sharpening +!HISTORY_MSG_569;Local - Sh Radius +!HISTORY_MSG_570;Local - Sh Amount +!HISTORY_MSG_571;Local - Sh Damping +!HISTORY_MSG_572;Local - Sh Iterations +!HISTORY_MSG_573;Local - Sh Scope +!HISTORY_MSG_574;Local - Sh Inverse +!HISTORY_MSG_575;Local - CBDL +!HISTORY_MSG_576;Local - cbdl mult +!HISTORY_MSG_577;Local - cbdl chroma +!HISTORY_MSG_578;Local - cbdl threshold +!HISTORY_MSG_579;Local - cbdl scope +!HISTORY_MSG_580;--unused-- +!HISTORY_MSG_581;Local - deNoise lum f 1 +!HISTORY_MSG_582;Local - deNoise lum c +!HISTORY_MSG_583;Local - deNoise lum detail +!HISTORY_MSG_584;Local - deNoise equalizer White-Black +!HISTORY_MSG_585;Local - deNoise chro f +!HISTORY_MSG_586;Local - deNoise chro c +!HISTORY_MSG_587;Local - deNoise chro detail +!HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +!HISTORY_MSG_589;Local - deNoise bilateral +!HISTORY_MSG_590;Local - deNoise Scope +!HISTORY_MSG_591;Local - Avoid color shift +!HISTORY_MSG_592;Local - Sh Contrast +!HISTORY_MSG_593;Local - Local contrast +!HISTORY_MSG_594;Local - Local contrast radius +!HISTORY_MSG_595;Local - Local contrast amount +!HISTORY_MSG_596;Local - Local contrast darkness +!HISTORY_MSG_597;Local - Local contrast lightness +!HISTORY_MSG_598;Local - Local contrast scope +!HISTORY_MSG_599;Local - Retinex dehaze +!HISTORY_MSG_600;Local - Soft Light enable +!HISTORY_MSG_601;Local - Soft Light strength +!HISTORY_MSG_602;Local - Soft Light scope +!HISTORY_MSG_603;Local - Sh Blur radius +!HISTORY_MSG_605;Local - Mask preview choice +!HISTORY_MSG_606;Local Spot selected +!HISTORY_MSG_607;Local - Color Mask C +!HISTORY_MSG_608;Local - Color Mask L +!HISTORY_MSG_609;Local - Exp Mask C +!HISTORY_MSG_610;Local - Exp Mask L +!HISTORY_MSG_611;Local - Color Mask H +!HISTORY_MSG_612;Local - Color Structure +!HISTORY_MSG_613;Local - Exp Structure +!HISTORY_MSG_614;Local - Exp Mask H +!HISTORY_MSG_615;Local - Blend color +!HISTORY_MSG_616;Local - Blend Exp +!HISTORY_MSG_617;Local - Blur Exp +!HISTORY_MSG_618;Local - Use Color Mask +!HISTORY_MSG_619;Local - Use Exp Mask +!HISTORY_MSG_620;Local - Blur col +!HISTORY_MSG_621;Local - Exp inverse +!HISTORY_MSG_622;Local - Exclude structure +!HISTORY_MSG_623;Local - Exp Chroma compensation +!HISTORY_MSG_624;Local - Color correction grid +!HISTORY_MSG_625;Local - Color correction strength +!HISTORY_MSG_626;Local - Color correction Method +!HISTORY_MSG_627;Local - Shadow Highlight +!HISTORY_MSG_628;Local - SH Highlight +!HISTORY_MSG_629;Local - SH H tonalwidth +!HISTORY_MSG_630;Local - SH Shadows +!HISTORY_MSG_631;Local - SH S tonalwidth +!HISTORY_MSG_632;Local - SH radius +!HISTORY_MSG_633;Local - SH Scope +!HISTORY_MSG_634;Local - radius color +!HISTORY_MSG_635;Local - radius Exp +!HISTORY_MSG_636;Local - Tool added +!HISTORY_MSG_637;Local - SH Mask C +!HISTORY_MSG_638;Local - SH Mask L +!HISTORY_MSG_639;Local - SH Mask H +!HISTORY_MSG_640;Local - SH blend +!HISTORY_MSG_641;Local - Use SH mask +!HISTORY_MSG_642;Local - radius SH +!HISTORY_MSG_643;Local - Blur SH +!HISTORY_MSG_644;Local - inverse SH +!HISTORY_MSG_645;Local - balance ΔE ab-L +!HISTORY_MSG_646;Local - Exp mask chroma +!HISTORY_MSG_647;Local - Exp mask gamma +!HISTORY_MSG_648;Local - Exp mask slope +!HISTORY_MSG_649;Local - Exp soft radius +!HISTORY_MSG_650;Local - Color mask chroma +!HISTORY_MSG_651;Local - Color mask gamma +!HISTORY_MSG_652;Local - Color mask slope +!HISTORY_MSG_653;Local - SH mask chroma +!HISTORY_MSG_654;Local - SH mask gamma +!HISTORY_MSG_655;Local - SH mask slope +!HISTORY_MSG_656;Local - Color soft radius +!HISTORY_MSG_657;Local - Retinex Reduce artifacts +!HISTORY_MSG_658;Local - CBDL soft radius +!HISTORY_MSG_659;Local Spot transition-decay +!HISTORY_MSG_660;Local - cbdl clarity +!HISTORY_MSG_661;Local - cbdl contrast residual +!HISTORY_MSG_662;Local - deNoise lum f 0 +!HISTORY_MSG_663;Local - deNoise lum f 2 +!HISTORY_MSG_664;--unused-- +!HISTORY_MSG_665;Local - cbdl mask Blend +!HISTORY_MSG_666;Local - cbdl mask radius +!HISTORY_MSG_667;Local - cbdl mask chroma +!HISTORY_MSG_668;Local - cbdl mask gamma +!HISTORY_MSG_669;Local - cbdl mask slope +!HISTORY_MSG_670;Local - cbdl mask C +!HISTORY_MSG_671;Local - cbdl mask L +!HISTORY_MSG_672;Local - cbdl mask CL +!HISTORY_MSG_673;Local - Use cbdl mask +!HISTORY_MSG_674;Local - Tool removed +!HISTORY_MSG_675;Local - TM soft radius +!HISTORY_MSG_676;Local Spot transition-differentiation +!HISTORY_MSG_677;Local - TM amount +!HISTORY_MSG_678;Local - TM saturation +!HISTORY_MSG_679;Local - Retinex mask C +!HISTORY_MSG_680;Local - Retinex mask L +!HISTORY_MSG_681;Local - Retinex mask CL +!HISTORY_MSG_682;Local - Retinex mask +!HISTORY_MSG_683;Local - Retinex mask Blend +!HISTORY_MSG_684;Local - Retinex mask radius +!HISTORY_MSG_685;Local - Retinex mask chroma +!HISTORY_MSG_686;Local - Retinex mask gamma +!HISTORY_MSG_687;Local - Retinex mask slope +!HISTORY_MSG_688;Local - Tool removed +!HISTORY_MSG_689;Local - Retinex mask transmission map +!HISTORY_MSG_690;Local - Retinex scale +!HISTORY_MSG_691;Local - Retinex darkness +!HISTORY_MSG_692;Local - Retinex lightness +!HISTORY_MSG_693;Local - Retinex threshold +!HISTORY_MSG_694;Local - Retinex Laplacian threshold +!HISTORY_MSG_695;Local - Soft method +!HISTORY_MSG_696;Local - Retinex Normalize +!HISTORY_MSG_697;Local - TM Normalize +!HISTORY_MSG_698;Local - Local contrast Fast Fourier +!HISTORY_MSG_699;Local - Retinex Fast Fourier +!HISTORY_MSG_701;Local - Exp Shadows +!HISTORY_MSG_702;Local - Exp Method +!HISTORY_MSG_703;Local - Exp Laplacian threshold +!HISTORY_MSG_704;Local - Exp PDE balance +!HISTORY_MSG_705;Local - Exp linearity +!HISTORY_MSG_706;Local - TM mask C +!HISTORY_MSG_707;Local - TM mask L +!HISTORY_MSG_708;Local - TM mask CL +!HISTORY_MSG_709;Local - use TM mask +!HISTORY_MSG_710;Local - TM mask Blend +!HISTORY_MSG_711;Local - TM mask radius +!HISTORY_MSG_712;Local - TM mask chroma +!HISTORY_MSG_713;Local - TM mask gamma +!HISTORY_MSG_714;Local - TM mask slope +!HISTORY_MSG_716;Local - Local method +!HISTORY_MSG_717;Local - Local contrast +!HISTORY_MSG_718;Local - Local contrast levels +!HISTORY_MSG_719;Local - Local contrast residual L +!HISTORY_MSG_720;Local - Blur mask C +!HISTORY_MSG_721;Local - Blur mask L +!HISTORY_MSG_722;Local - Blur mask CL +!HISTORY_MSG_723;Local - use Blur mask +!HISTORY_MSG_725;Local - Blur mask Blend +!HISTORY_MSG_726;Local - Blur mask radius +!HISTORY_MSG_727;Local - Blur mask chroma +!HISTORY_MSG_728;Local - Blur mask gamma +!HISTORY_MSG_729;Local - Blur mask slope +!HISTORY_MSG_730;Local - Blur method +!HISTORY_MSG_731;Local - median method +!HISTORY_MSG_732;Local - median iterations +!HISTORY_MSG_733;Local - soft radius +!HISTORY_MSG_734;Local - detail +!HISTORY_MSG_738;Local - Local contrast Merge L +!HISTORY_MSG_739;Local - Local contrast Soft radius +!HISTORY_MSG_740;Local - Local contrast Merge C +!HISTORY_MSG_741;Local - Local contrast Residual C +!HISTORY_MSG_742;Local - Exp Laplacian gamma +!HISTORY_MSG_743;Local - Exp Fattal Amount +!HISTORY_MSG_744;Local - Exp Fattal Detail +!HISTORY_MSG_745;Local - Exp Fattal Offset +!HISTORY_MSG_746;Local - Exp Fattal Sigma +!HISTORY_MSG_747;Local Spot created +!HISTORY_MSG_748;Local - Exp Denoise +!HISTORY_MSG_749;Local - Reti Depth +!HISTORY_MSG_750;Local - Reti Mode log - lin +!HISTORY_MSG_751;Local - Reti Dehaze saturation +!HISTORY_MSG_752;Local - Reti Offset +!HISTORY_MSG_753;Local - Reti Transmission map +!HISTORY_MSG_754;Local - Reti Clip +!HISTORY_MSG_755;Local - TM use tm mask +!HISTORY_MSG_756;Local - Exp use algo exposure mask +!HISTORY_MSG_757;Local - Exp Laplacian mask +!HISTORY_MSG_758;Local - Reti Laplacian mask +!HISTORY_MSG_759;Local - Exp Laplacian mask +!HISTORY_MSG_760;Local - Color Laplacian mask +!HISTORY_MSG_761;Local - SH Laplacian mask +!HISTORY_MSG_762;Local - cbdl Laplacian mask +!HISTORY_MSG_763;Local - Blur Laplacian mask +!HISTORY_MSG_764;Local - Solve PDE Laplacian mask +!HISTORY_MSG_765;Local - deNoise Detail threshold +!HISTORY_MSG_766;Local - Blur Fast Fourier +!HISTORY_MSG_767;Local - Grain Iso +!HISTORY_MSG_768;Local - Grain Strength +!HISTORY_MSG_769;Local - Grain Scale +!HISTORY_MSG_770;Local - Color Mask contrast curve +!HISTORY_MSG_771;Local - Exp Mask contrast curve +!HISTORY_MSG_772;Local - SH Mask contrast curve +!HISTORY_MSG_773;Local - TM Mask contrast curve +!HISTORY_MSG_774;Local - Reti Mask contrast curve +!HISTORY_MSG_775;Local - CBDL Mask contrast curve +!HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +!HISTORY_MSG_777;Local - Blur Mask local contrast curve +!HISTORY_MSG_778;Local - Mask highlights +!HISTORY_MSG_779;Local - Color Mask local contrast curve +!HISTORY_MSG_780;Local - Color Mask shadows +!HISTORY_MSG_781;Local - Contrast Mask Wavelet level +!HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +!HISTORY_MSG_783;Local - Color Wavelet levels +!HISTORY_MSG_784;Local - Mask ΔE +!HISTORY_MSG_785;Local - Mask Scope ΔE +!HISTORY_MSG_786;Local - SH method +!HISTORY_MSG_787;Local - Equalizer multiplier +!HISTORY_MSG_788;Local - Equalizer detail +!HISTORY_MSG_789;Local - SH mask amount +!HISTORY_MSG_790;Local - SH mask anchor +!HISTORY_MSG_791;Local - Mask Short L curves +!HISTORY_MSG_792;Local - Mask Luminance Background +!HISTORY_MSG_793;Local - SH TRC gamma +!HISTORY_MSG_794;Local - SH TRC slope +!HISTORY_MSG_795;Local - Mask save restore image +!HISTORY_MSG_796;Local - Recursive references +!HISTORY_MSG_797;Local - Merge Original method +!HISTORY_MSG_798;Local - Opacity +!HISTORY_MSG_799;Local - Color RGB ToneCurve +!HISTORY_MSG_800;Local - Color ToneCurve Method +!HISTORY_MSG_801;Local - Color ToneCurve Special +!HISTORY_MSG_802;Local - Contrast threshold +!HISTORY_MSG_803;Local - Color Merge +!HISTORY_MSG_804;Local - Color mask Structure +!HISTORY_MSG_805;Local - Blur Noise mask Structure +!HISTORY_MSG_806;Local - Color mask Structure as tool +!HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +!HISTORY_MSG_808;Local - Color mask curve H(H) +!HISTORY_MSG_809;Local - Vib mask curve C(C) +!HISTORY_MSG_810;Local - Vib mask curve L(L) +!HISTORY_MSG_811;Local - Vib mask curve LC(H) +!HISTORY_MSG_813;Local - Use Vib mask +!HISTORY_MSG_814;Local - Vib mask Blend +!HISTORY_MSG_815;Local - Vib mask radius +!HISTORY_MSG_816;Local - Vib mask chroma +!HISTORY_MSG_817;Local - Vib mask gamma +!HISTORY_MSG_818;Local - Vib mask slope +!HISTORY_MSG_819;Local - Vib mask laplacian +!HISTORY_MSG_820;Local - Vib mask contrast curve +!HISTORY_MSG_821;Local - color grid background +!HISTORY_MSG_822;Local - color background merge +!HISTORY_MSG_823;Local - color background luminance +!HISTORY_MSG_824;Local - Exp gradient mask strength +!HISTORY_MSG_825;Local - Exp gradient mask angle +!HISTORY_MSG_826;Local - Exp gradient strength +!HISTORY_MSG_827;Local - Exp gradient angle +!HISTORY_MSG_828;Local - SH gradient strength +!HISTORY_MSG_829;Local - SH gradient angle +!HISTORY_MSG_830;Local - Color gradient strength L +!HISTORY_MSG_831;Local - Color gradient angle +!HISTORY_MSG_832;Local - Color gradient strength C +!HISTORY_MSG_833;Local - Gradient feather +!HISTORY_MSG_834;Local - Color gradient strength H +!HISTORY_MSG_835;Local - Vib gradient strength L +!HISTORY_MSG_836;Local - Vib gradient angle +!HISTORY_MSG_837;Local - Vib gradient strength C +!HISTORY_MSG_838;Local - Vib gradient strength H +!HISTORY_MSG_839;Local - Software complexity +!HISTORY_MSG_840;Local - CL Curve +!HISTORY_MSG_841;Local - LC curve +!HISTORY_MSG_842;Local - Blur mask Radius +!HISTORY_MSG_843;Local - Blur mask Contrast Threshold +!HISTORY_MSG_844;Local - Blur mask FFTW +!HISTORY_MSG_845;Local - Log encoding +!HISTORY_MSG_846;Local - Log encoding auto +!HISTORY_MSG_847;Local - Log encoding Source +!HISTORY_MSG_849;Local - Log encoding Source auto +!HISTORY_MSG_850;Local - Log encoding B_Ev +!HISTORY_MSG_851;Local - Log encoding W_Ev +!HISTORY_MSG_852;Local - Log encoding Target +!HISTORY_MSG_853;Local - Log encodind loc contrast +!HISTORY_MSG_854;Local - Log encodind Scope +!HISTORY_MSG_855;Local - Log encoding Whole image +!HISTORY_MSG_856;Local - Log encoding Shadows range +!HISTORY_MSG_857;Local - Wavelet blur residual +!HISTORY_MSG_858;Local - Wavelet blur luminance only +!HISTORY_MSG_859;Local - Wavelet max blur +!HISTORY_MSG_860;Local - Wavelet blur levels +!HISTORY_MSG_861;Local - Wavelet contrast levels +!HISTORY_MSG_862;Local - Wavelet contrast attenuation +!HISTORY_MSG_863;Local - Wavelet merge original image +!HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +!HISTORY_MSG_865;Local - Wavelet dir contrast delta +!HISTORY_MSG_866;Local - Wavelet dir compression +!HISTORY_MSG_868;Local - Balance ΔE C-H +!HISTORY_MSG_869;Local - Denoise by level +!HISTORY_MSG_870;Local - Wavelet mask curve H +!HISTORY_MSG_871;Local - Wavelet mask curve C +!HISTORY_MSG_872;Local - Wavelet mask curve L +!HISTORY_MSG_873;Local - Wavelet mask +!HISTORY_MSG_875;Local - Wavelet mask blend +!HISTORY_MSG_876;Local - Wavelet mask smooth +!HISTORY_MSG_877;Local - Wavelet mask chroma +!HISTORY_MSG_878;Local - Wavelet mask contrast curve +!HISTORY_MSG_879;Local - Wavelet contrast chroma +!HISTORY_MSG_880;Local - Wavelet blur chroma +!HISTORY_MSG_881;Local - Wavelet contrast offset +!HISTORY_MSG_882;Local - Wavelet blur +!HISTORY_MSG_883;Local - Wavelet contrast by level +!HISTORY_MSG_884;Local - Wavelet dir contrast +!HISTORY_MSG_885;Local - Wavelet tone mapping +!HISTORY_MSG_886;Local - Wavelet tone mapping compress +!HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +!HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +!HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +!HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +!HISTORY_MSG_891;Local - Contrast Wavelet Graduated +!HISTORY_MSG_892;Local - Log Encoding Graduated Strength +!HISTORY_MSG_893;Local - Log Encoding Graduated angle +!HISTORY_MSG_894;Local - Color Preview dE +!HISTORY_MSG_897;Local - Contrast Wavelet ES strength +!HISTORY_MSG_898;Local - Contrast Wavelet ES radius +!HISTORY_MSG_899;Local - Contrast Wavelet ES detail +!HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +!HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +!HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +!HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +!HISTORY_MSG_904;Local - Contrast Wavelet ES first level +!HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +!HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +!HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +!HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +!HISTORY_MSG_909;Local - Contrast Wavelet ES show +!HISTORY_MSG_910;Local - Wavelet Edge performance +!HISTORY_MSG_911;Local - Blur Chroma Luma +!HISTORY_MSG_912;Local - Blur Guide filter strength +!HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +!HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +!HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +!HISTORY_MSG_916;Local - Residual wavelet shadows +!HISTORY_MSG_917;Local - Residual wavelet shadows threshold +!HISTORY_MSG_918;Local - Residual wavelet highlights +!HISTORY_MSG_919;Local - Residual wavelet highlights threshold +!HISTORY_MSG_920;Local - Wavelet sigma LC +!HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +!HISTORY_MSG_922;Local - changes In Black and White +!HISTORY_MSG_923;Local - Tool complexity mode +!HISTORY_MSG_924;--unused-- +!HISTORY_MSG_925;Local - Scope color tools +!HISTORY_MSG_926;Local - Show mask type +!HISTORY_MSG_927;Local - Shadow +!HISTORY_MSG_928;Local - Common color mask +!HISTORY_MSG_929;Local - Mask common scope +!HISTORY_MSG_930;Local - Mask Common blend luma +!HISTORY_MSG_931;Local - Mask Common enable +!HISTORY_MSG_932;Local - Mask Common radius soft +!HISTORY_MSG_933;Local - Mask Common laplacian +!HISTORY_MSG_934;Local - Mask Common chroma +!HISTORY_MSG_935;Local - Mask Common gamma +!HISTORY_MSG_936;Local - Mask Common slope +!HISTORY_MSG_937;Local - Mask Common curve C(C) +!HISTORY_MSG_938;Local - Mask Common curve L(L) +!HISTORY_MSG_939;Local - Mask Common curve LC(H) +!HISTORY_MSG_940;Local - Mask Common structure as tool +!HISTORY_MSG_941;Local - Mask Common structure strength +!HISTORY_MSG_942;Local - Mask Common H(H) curve +!HISTORY_MSG_943;Local - Mask Common FFT +!HISTORY_MSG_944;Local - Mask Common Blur radius +!HISTORY_MSG_945;Local - Mask Common contrast threshold +!HISTORY_MSG_946;Local - Mask Common shadows +!HISTORY_MSG_947;Local - Mask Common Contrast curve +!HISTORY_MSG_948;Local - Mask Common Wavelet curve +!HISTORY_MSG_949;Local - Mask Common Threshold levels +!HISTORY_MSG_950;Local - Mask Common GF strength +!HISTORY_MSG_951;Local - Mask Common GF angle +!HISTORY_MSG_952;Local - Mask Common soft radius +!HISTORY_MSG_953;Local - Mask Common blend chroma +!HISTORY_MSG_954;Local - Show-hide tools +!HISTORY_MSG_955;Local - Enable Spot +!HISTORY_MSG_956;Local - CH Curve +!HISTORY_MSG_957;Local - Denoise mode +!HISTORY_MSG_958;Local - Show/hide settings +!HISTORY_MSG_959;Local - Inverse blur +!HISTORY_MSG_960;Local - Log encoding - cat16 +!HISTORY_MSG_961;Local - Log encoding Ciecam +!HISTORY_MSG_962;Local - Log encoding Absolute luminance source +!HISTORY_MSG_963;Local - Log encoding Absolute luminance target +!HISTORY_MSG_964;Local - Log encoding Surround +!HISTORY_MSG_965;Local - Log encoding Saturation s +!HISTORY_MSG_966;Local - Log encoding Contrast J +!HISTORY_MSG_967;Local - Log encoding Mask curve C +!HISTORY_MSG_968;Local - Log encoding Mask curve L +!HISTORY_MSG_969;Local - Log encoding Mask curve H +!HISTORY_MSG_970;Local - Log encoding Mask enable +!HISTORY_MSG_971;Local - Log encoding Mask blend +!HISTORY_MSG_972;Local - Log encoding Mask radius +!HISTORY_MSG_973;Local - Log encoding Mask chroma +!HISTORY_MSG_974;Local - Log encoding Mask contrast +!HISTORY_MSG_975;Local - Log encoding Lightness J +!HISTORY_MSG_977;Local - Log encoding Contrast Q +!HISTORY_MSG_978;Local - Log encoding Sursource +!HISTORY_MSG_979;Local - Log encoding Brightness Q +!HISTORY_MSG_980;Local - Log encoding Colorfulness M +!HISTORY_MSG_981;Local - Log encoding Strength +!HISTORY_MSG_982;Local - Equalizer hue +!HISTORY_MSG_983;Local - denoise threshold mask high +!HISTORY_MSG_984;Local - denoise threshold mask low +!HISTORY_MSG_985;Local - denoise Laplacian +!HISTORY_MSG_986;Local - denoise reinforce +!HISTORY_MSG_987;Local - GF recovery threshold +!HISTORY_MSG_988;Local - GF threshold mask low +!HISTORY_MSG_989;Local - GF threshold mask high +!HISTORY_MSG_990;Local - Denoise recovery threshold +!HISTORY_MSG_991;Local - Denoise threshold mask low +!HISTORY_MSG_992;Local - Denoise threshold mask high +!HISTORY_MSG_993;Local - Denoise Inverse algo +!HISTORY_MSG_994;Local - GF Inverse algo +!HISTORY_MSG_995;Local - Denoise decay +!HISTORY_MSG_996;Local - Color recovery threshold +!HISTORY_MSG_997;Local - Color threshold mask low +!HISTORY_MSG_998;Local - Color threshold mask high +!HISTORY_MSG_999;Local - Color decay +!HISTORY_MSG_1000;Local - Denoise luminance gray +!HISTORY_MSG_1001;Local - Log recovery threshold +!HISTORY_MSG_1002;Local - Log threshold mask low +!HISTORY_MSG_1003;Local - Log threshold mask high +!HISTORY_MSG_1004;Local - Log decay +!HISTORY_MSG_1005;Local - Exp recovery threshold +!HISTORY_MSG_1006;Local - Exp threshold mask low +!HISTORY_MSG_1007;Local - Exp threshold mask high +!HISTORY_MSG_1008;Local - Exp decay +!HISTORY_MSG_1009;Local - SH recovery threshold +!HISTORY_MSG_1010;Local - SH threshold mask low +!HISTORY_MSG_1011;Local - SH threshold mask high +!HISTORY_MSG_1012;Local - SH decay +!HISTORY_MSG_1013;Local - vib recovery threshold +!HISTORY_MSG_1014;Local - vib threshold mask low +!HISTORY_MSG_1015;Local - vib threshold mask high +!HISTORY_MSG_1016;Local - vib decay +!HISTORY_MSG_1017;Local - lc recovery threshold +!HISTORY_MSG_1018;Local - lc threshold mask low +!HISTORY_MSG_1019;Local - lc threshold mask high +!HISTORY_MSG_1020;Local - lc decay +!HISTORY_MSG_1021;Local - Denoise chrominance gray +!HISTORY_MSG_1022;Local - TM recovery threshold +!HISTORY_MSG_1023;Local - TM threshold mask low +!HISTORY_MSG_1024;Local - TM threshold mask high +!HISTORY_MSG_1025;Local - TM decay +!HISTORY_MSG_1026;Local - cbdl recovery threshold +!HISTORY_MSG_1027;Local - cbdl threshold mask low +!HISTORY_MSG_1028;Local - cbdl threshold mask high +!HISTORY_MSG_1029;Local - cbdl decay +!HISTORY_MSG_1030;Local - reti recovery threshold +!HISTORY_MSG_1031;Local - reti threshold mask low +!HISTORY_MSG_1032;Local - reti threshold mask high +!HISTORY_MSG_1033;Local - reti decay +!HISTORY_MSG_1034;Local - Nlmeans - strength +!HISTORY_MSG_1035;Local - Nlmeans - detail +!HISTORY_MSG_1036;Local - Nlmeans - patch +!HISTORY_MSG_1037;Local - Nlmeans - radius +!HISTORY_MSG_1038;Local - Nlmeans - gamma +!HISTORY_MSG_1039;Local - Grain - gamma +!HISTORY_MSG_1040;Local - Spot - soft radius +!HISTORY_MSG_1041;Local - Spot - Munsell +!HISTORY_MSG_1042;Local - Log encoding - threshold +!HISTORY_MSG_1043;Local - Exp - normalize +!HISTORY_MSG_1044;Local - Local contrast strength +!HISTORY_MSG_1045;Local - Color and Light strength +!HISTORY_MSG_1046;Local - Denoise strength +!HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +!HISTORY_MSG_1048;Local - DR and Exposure strength +!HISTORY_MSG_1049;Local - TM strength +!HISTORY_MSG_1050;Local - Log encoding chroma +!HISTORY_MSG_1051;Local - Residual wavelet gamma +!HISTORY_MSG_1052;Local - Residual wavelet slope +!HISTORY_MSG_1053;Local - Denoise gamma +!HISTORY_MSG_1054;Local - Wavelet gamma +!HISTORY_MSG_1055;Local - Color and Light gamma +!HISTORY_MSG_1056;Local - DR and Exposure gamma +!HISTORY_MSG_1057;Local - CIECAM Enabled +!HISTORY_MSG_1058;Local - CIECAM Overall strength +!HISTORY_MSG_1059;Local - CIECAM Autogray +!HISTORY_MSG_1060;Local - CIECAM Mean luminance source +!HISTORY_MSG_1061;Local - CIECAM Source absolute +!HISTORY_MSG_1062;Local - CIECAM Surround Source +!HISTORY_MSG_1063;Local - CIECAM Saturation +!HISTORY_MSG_1064;Local - CIECAM Chroma +!HISTORY_MSG_1065;Local - CIECAM lightness J +!HISTORY_MSG_1066;Local - CIECAM brightness +!HISTORY_MSG_1067;Local - CIECAM Contrast J +!HISTORY_MSG_1068;Local - CIECAM threshold +!HISTORY_MSG_1069;Local - CIECAM contrast Q +!HISTORY_MSG_1070;Local - CIECAM colorfullness +!HISTORY_MSG_1071;Local - CIECAM Absolute luminance +!HISTORY_MSG_1072;Local - CIECAM Mean luminance +!HISTORY_MSG_1073;Local - CIECAM Cat16 +!HISTORY_MSG_1074;Local - CIECAM Local contrast +!HISTORY_MSG_1075;Local - CIECAM Surround viewing +!HISTORY_MSG_1076;Local - CIECAM Scope +!HISTORY_MSG_1077;Local - CIECAM Mode +!HISTORY_MSG_1078;Local - Red and skin protection +!HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +!HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +!HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +!HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +!HISTORY_MSG_1083;Local - CIECAM Hue +!HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +!HISTORY_MSG_1085;Local - Jz lightness +!HISTORY_MSG_1086;Local - Jz contrast +!HISTORY_MSG_1087;Local - Jz chroma +!HISTORY_MSG_1088;Local - Jz hue +!HISTORY_MSG_1089;Local - Jz Sigmoid strength +!HISTORY_MSG_1090;Local - Jz Sigmoid threshold +!HISTORY_MSG_1091;Local - Jz Sigmoid blend +!HISTORY_MSG_1092;Local - Jz adaptation +!HISTORY_MSG_1093;Local - CAM model +!HISTORY_MSG_1094;Local - Jz highligths +!HISTORY_MSG_1095;Local - Jz highligths thr +!HISTORY_MSG_1096;Local - Jz shadows +!HISTORY_MSG_1097;Local - Jz shadows thr +!HISTORY_MSG_1098;Local - Jz radius SH +!HISTORY_MSG_1099;Local - Cz(Hz) Curve +!HISTORY_MSG_1100;Local - Jz reference 100 +!HISTORY_MSG_1101;Local - Jz PQ remap +!HISTORY_MSG_1102;Local - Jz(Hz) Curve +!HISTORY_MSG_1103;Local - Vibrance gamma +!HISTORY_MSG_1104;Local - Sharp gamma +!HISTORY_MSG_1105;Local - CIECAM Tone method +!HISTORY_MSG_1106;Local - CIECAM Tone curve +!HISTORY_MSG_1107;Local - CIECAM Color method +!HISTORY_MSG_1108;Local - CIECAM Color curve +!HISTORY_MSG_1109;Local - Jz(Jz) curve +!HISTORY_MSG_1110;Local - Cz(Cz) curve +!HISTORY_MSG_1111;Local - Cz(Jz) curve +!HISTORY_MSG_1112;Local - forcejz +!HISTORY_MSG_1113;Local - HDR PQ +!HISTORY_MSG_1114;Local - Cie mask enable +!HISTORY_MSG_1115;Local - Cie mask curve C +!HISTORY_MSG_1116;Local - Cie mask curve L +!HISTORY_MSG_1117;Local - Cie mask curve H +!HISTORY_MSG_1118;Local - Cie mask blend +!HISTORY_MSG_1119;Local - Cie mask radius +!HISTORY_MSG_1120;Local - Cie mask chroma +!HISTORY_MSG_1121;Local - Cie mask contrast curve +!HISTORY_MSG_1122;Local - Cie mask recovery threshold +!HISTORY_MSG_1123;Local - Cie mask recovery dark +!HISTORY_MSG_1124;Local - Cie mask recovery light +!HISTORY_MSG_1125;Local - Cie mask recovery decay +!HISTORY_MSG_1126;Local - Cie mask laplacian +!HISTORY_MSG_1127;Local - Cie mask gamma +!HISTORY_MSG_1128;Local - Cie mask slope +!HISTORY_MSG_1129;Local - Cie Relative luminance +!HISTORY_MSG_1130;Local - Cie Saturation Jz +!HISTORY_MSG_1131;Local - Mask denoise chroma +!HISTORY_MSG_1132;Local - Cie Wav sigma Jz +!HISTORY_MSG_1133;Local - Cie Wav level Jz +!HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +!HISTORY_MSG_1135;Local - Cie Wav clarity Jz +!HISTORY_MSG_1136;Local - Cie Wav clarity Cz +!HISTORY_MSG_1137;Local - Cie Wav clarity Soft +!HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +!HISTORY_MSG_1139;Local - Jz soft Curves H +!HISTORY_MSG_1140;Local - Jz Threshold chroma +!HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +!HISTORY_MSG_1142;Local - strength soft +!HISTORY_MSG_1143;Local - Jz blackev +!HISTORY_MSG_1144;Local - Jz whiteev +!HISTORY_MSG_1145;Local - Jz Log encoding +!HISTORY_MSG_1146;Local - Jz Log encoding target gray +!HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +!HISTORY_MSG_1148;Local - Jz Sigmoid +!HISTORY_MSG_1149;Local - Q Sigmoid +!HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +!HISTORY_MSG_BLSHAPE;Blur by level +!HISTORY_MSG_BLURCWAV;Blur chroma +!HISTORY_MSG_BLURWAV;Blur luminance +!HISTORY_MSG_BLUWAV;Attenuation response +!HISTORY_MSG_CATCAT;CAL - Settings - Mode +!HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +!HISTORY_MSG_CATMODEL;CAL - Settings - CAM !HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors !HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -1859,22 +2508,42 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_COMPLEX;Wavelet complexity +!HISTORY_MSG_COMPLEXRETI;Retinex complexity !HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth !HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +!HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation !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_EDGEFFECT;Edge Attenuation response +!HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +!HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space !HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +!HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input !HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values !HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_HLBL;Color propagation - blur +!HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +!HISTORY_MSG_ICM_AINTENT;Abstract profile intent +!HISTORY_MSG_ICM_BLUX;Primaries Blue X +!HISTORY_MSG_ICM_BLUY;Primaries Blue Y +!HISTORY_MSG_ICM_FBW;Black and White +!HISTORY_MSG_ICM_GREX;Primaries Green X +!HISTORY_MSG_ICM_GREY;Primaries Green Y !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_ICM_PRESER;Preserve neutral +!HISTORY_MSG_ICM_REDX;Primaries Red X +!HISTORY_MSG_ICM_REDY;Primaries Red Y +!HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +!HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +!HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +!HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +!HISTORY_MSG_ILLUM;CAL - SC - Illuminant !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1889,22 +2558,83 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations !HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius !HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +!HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +!HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +!HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +!HISTORY_MSG_PERSP_METHOD;Perspective - Method +!HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +!HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +!HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +!HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average !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_PREPROCWB_MODE;Preprocess WB Mode +!HISTORY_MSG_PROTAB;Protection !HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RANGEAB;Range ab !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_RESIZE_LONGEDGE;Resize - Long Edge +!HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold !HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SIGMACOL;Chroma Attenuation response +!HISTORY_MSG_SIGMADIR;Dir Attenuation response +!HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +!HISTORY_MSG_SIGMATON;Toning Attenuation response !HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light !HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_SPOT;Spot removal +!HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +!HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +!HISTORY_MSG_THRESWAV;Balance threshold !HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!HISTORY_MSG_TRANS_METHOD;Geometry - Method +!HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +!HISTORY_MSG_WAVBALLUM;Equalizer luminance +!HISTORY_MSG_WAVBL;Blur levels +!HISTORY_MSG_WAVCHR;Blur levels - blur chroma +!HISTORY_MSG_WAVCHROMCO;Chroma coarse +!HISTORY_MSG_WAVCHROMFI;Chroma fine +!HISTORY_MSG_WAVCLARI;Clarity +!HISTORY_MSG_WAVDENLH;Level 5 +!HISTORY_MSG_WAVDENOISE;Local contrast +!HISTORY_MSG_WAVDENOISEH;High levels Local contrast +!HISTORY_MSG_WAVDETEND;Details soft +!HISTORY_MSG_WAVEDGS;Edge stopping +!HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +!HISTORY_MSG_WAVHUE;Equalizer hue +!HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +!HISTORY_MSG_WAVLEVDEN;High level local contrast +!HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +!HISTORY_MSG_WAVLEVSIGM;Radius +!HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +!HISTORY_MSG_WAVLOWTHR;Threshold low contrast +!HISTORY_MSG_WAVMERGEC;Merge C +!HISTORY_MSG_WAVMERGEL;Merge L +!HISTORY_MSG_WAVMIXMET;Reference local contrast +!HISTORY_MSG_WAVOFFSET;Offset +!HISTORY_MSG_WAVOLDSH;Old algorithm +!HISTORY_MSG_WAVQUAMET;Denoise mode +!HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +!HISTORY_MSG_WAVSCALE;Scale +!HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +!HISTORY_MSG_WAVSIGM;Sigma +!HISTORY_MSG_WAVSIGMA;Attenuation response +!HISTORY_MSG_WAVSLIMET;Method +!HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +!HISTORY_MSG_WAVSOFTRADEND;Soft radius final +!HISTORY_MSG_WAVSTREND;Strength soft +!HISTORY_MSG_WAVTHRDEN;Threshold local contrast +!HISTORY_MSG_WAVTHREND;Threshold local contrast +!HISTORY_MSG_WAVUSHAMET;Clarity method !ICCPROFCREATOR_COPYRIGHT;Copyright: -!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!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 @@ -1916,11 +2646,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !ICCPROFCREATOR_ILL_50;D50 !ICCPROFCREATOR_ILL_55;D55 !ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater !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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. !ICCPROFCREATOR_PRIMARIES;Primaries: !ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 !ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -1930,6 +2661,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !ICCPROFCREATOR_PRIM_BLUX;Blue X !ICCPROFCREATOR_PRIM_BLUY;Blue Y !ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 !ICCPROFCREATOR_PRIM_GREX;Green X !ICCPROFCREATOR_PRIM_GREY;Green Y !ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -1937,13 +2669,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +!ICCPROFCREATOR_TRC_PRESET;Tone response curve +!INSPECTOR_WINDOW_TITLE;Inspector !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 @@ -1955,7 +2688,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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. @@ -1976,25 +2709,31 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a !MAIN_TAB_FAVORITES;Favorites !MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!MAIN_TAB_LOCALLAB;Local +!MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o !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. +!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_FILMNEGATIVE;Film Negative +!PARTIALPASTE_FILMNEGATIVE;Film negative !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_LOCALLAB;Local Adjustments +!PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings !PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_PREPROCWB;Preprocess White Balance !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_SOFTLIGHT;Soft light +!PARTIALPASTE_SPOT;Spot removal !PARTIALPASTE_TM_FATTAL;Dynamic range compression !PREFERENCES_APPEARANCE;Appearance !PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font @@ -2014,7 +2753,13 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic !PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic !PREFERENCES_CHUNKSIZE_RGB;RGB processing +!PREFERENCES_CIE;Ciecam +!PREFERENCES_CIEARTIF;Avoid artifacts !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments +!PREFERENCES_COMPLEXITY_EXP;Advanced +!PREFERENCES_COMPLEXITY_NORM;Standard +!PREFERENCES_COMPLEXITY_SIMP;Basic !PREFERENCES_CROP;Crop Editing !PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -2023,7 +2768,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +!PREFERENCES_EXTEDITOR_DIR;Output directory +!PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +!PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +!PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +!PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser +!PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen !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_MONINTENT;Default rendering intent @@ -2041,12 +2793,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now !PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !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_ZOOMONSCROLL;Zoom images by scrolling !PROFILEPANEL_PDYNAMIC;Dynamic !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... @@ -2070,17 +2824,55 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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. +!TC_PRIM_BLUX;Bx +!TC_PRIM_BLUY;By +!TC_PRIM_GREX;Gx +!TC_PRIM_GREY;Gy +!TC_PRIM_REDX;Rx +!TC_PRIM_REDY;Ry +!TOOLBAR_TOOLTIP_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. !TP_BWMIX_MIXC;Channel Mixer !TP_BWMIX_NEUTRAL;Reset !TP_CBDL_METHOD;Process located !TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. !TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_CATCLASSIC;Classic +!TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +!TP_COLORAPP_CATMOD;Mode +!TP_COLORAPP_CATSYMGEN;Automatic Symmetric +!TP_COLORAPP_CATSYMSPE;Mixed +!TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +!TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +!TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +!TP_COLORAPP_GEN;Settings +!TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. +!TP_COLORAPP_IL41;D41 +!TP_COLORAPP_IL50;D50 +!TP_COLORAPP_IL55;D55 +!TP_COLORAPP_IL60;D60 +!TP_COLORAPP_IL65;D65 +!TP_COLORAPP_IL75;D75 +!TP_COLORAPP_ILA;Incandescent StdA 2856K +!TP_COLORAPP_ILFREE;Free +!TP_COLORAPP_ILLUM;Illuminant +!TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. !TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) +!TP_COLORAPP_MOD02;CAM02 +!TP_COLORAPP_MOD16;CAM16 +!TP_COLORAPP_MODELCAT;CAM +!TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. !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_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) +!TP_COLORAPP_NEUTRAL_TOOLTIP;Reset all sliders checkbox and curves to their default values. +!TP_COLORAPP_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. +!TP_COLORAPP_SURROUNDSRC;Surround +!TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. +!TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. +!TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +!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 @@ -2103,53 +2895,114 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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_GTCENTEREDSQUARE;Centered square !TP_CROP_PPI;PPI !TP_CROP_RESETCROP;Reset !TP_CROP_SELECTCROP;Select !TP_DEHAZE_DEPTH;Depth !TP_DEHAZE_LABEL;Haze Removal -!TP_DEHAZE_LUMINANCE;Luminance only +!TP_DEHAZE_SATURATION;Saturation !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. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the 'Preview' method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. !TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Conservative preserves low frequency chroma patterns, while aggressive obliterates them. !TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method !TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter -!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the 'Luminance only' and 'L*a*b*' methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the 'RGB' mode, it will be performed at the very end of the noise reduction pipeline. !TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations !TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type !TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. -!TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. +!TP_DISTORTION_AUTO_TOOLTIP;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_FILMNEGATIVE_BLUE;Blue ratio -!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +!TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +!TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +!TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +!TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +!TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +!TP_FILMNEGATIVE_GREEN;Reference exponent +!TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. !TP_FILMNEGATIVE_LABEL;Film Negative +!TP_FILMNEGATIVE_OUT_LEVEL;Output level !TP_FILMNEGATIVE_PICK;Pick neutral spots !TP_FILMNEGATIVE_RED;Red ratio +!TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +!TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +!TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. !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, value 0 is used. +!TP_HLREC_HLBLUR;Blur !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_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_FBW;Black-and-White +!TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. +!TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +!TP_ICM_NEUTRAL;Reset +!TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +!TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +!TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +!TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +!TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 !TP_ICM_PROFILEINTENT;Rendering Intent +!TP_ICM_REDFRAME;Custom Primaries !TP_ICM_SAVEREFERENCE;Save Reference Image +!TP_ICM_TRCFRAME;Abstract Profile +!TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +!TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. +!TP_ICM_WORKING_CIEDIAG;CIE xy diagram +!TP_ICM_WORKING_ILLU;Illuminant +!TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +!TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +!TP_ICM_WORKING_ILLU_D41;D41 +!TP_ICM_WORKING_ILLU_D50;D50 +!TP_ICM_WORKING_ILLU_D55;D55 +!TP_ICM_WORKING_ILLU_D60;D60 +!TP_ICM_WORKING_ILLU_D65;D65 +!TP_ICM_WORKING_ILLU_D80;D80 +!TP_ICM_WORKING_ILLU_D120;D120 +!TP_ICM_WORKING_ILLU_NONE;Default +!TP_ICM_WORKING_ILLU_STDA;stdA 2875K +!TP_ICM_WORKING_PRESER;Preserves Pastel tones +!TP_ICM_WORKING_PRIM;Destination primaries +!TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +!TP_ICM_WORKING_PRIM_AC0;ACESp0 +!TP_ICM_WORKING_PRIM_ACE;ACESp1 +!TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +!TP_ICM_WORKING_PRIM_BET;Beta RGB +!TP_ICM_WORKING_PRIM_BRU;BruceRGB +!TP_ICM_WORKING_PRIM_BST;BestRGB +!TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +!TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +!TP_ICM_WORKING_PRIM_NONE;Default +!TP_ICM_WORKING_PRIM_PROP;ProPhoto +!TP_ICM_WORKING_PRIM_REC;Rec2020 +!TP_ICM_WORKING_PRIM_SRGB;sRGB +!TP_ICM_WORKING_PRIM_WID;WideGamut !TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +!TP_ICM_WORKING_TRC_22;Adobe g=2.2 +!TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 !TP_ICM_WORKING_TRC_CUSTOM;Custom !TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_LIN;Linear g=1 !TP_ICM_WORKING_TRC_NONE;None !TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 !TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSGEOM_LIN;Linear +!TP_LENSGEOM_LOG;Logarithmic !TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected !TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file !TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -2164,19 +3017,826 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_LOCALLAB_ACTIV;Luminance only +!TP_LOCALLAB_ACTIVSPOT;Enable Spot +!TP_LOCALLAB_ADJ;Equalizer Color +!TP_LOCALLAB_AMOUNT;Amount +!TP_LOCALLAB_ARTIF;Shape detection +!TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +!TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +!TP_LOCALLAB_AUTOGRAYCIE;Auto +!TP_LOCALLAB_AVOID;Avoid color shift +!TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDMUN;Munsell correction only +!TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +!TP_LOCALLAB_AVOIDRAD;Soft radius +!TP_LOCALLAB_BALAN;ab-L balance (ΔE) +!TP_LOCALLAB_BALANEXP;Laplacian balance +!TP_LOCALLAB_BALANH;C-H balance (ΔE) +!TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +!TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +!TP_LOCALLAB_BILATERAL;Bilateral filter +!TP_LOCALLAB_BLACK_EV;Black Ev +!TP_LOCALLAB_BLCO;Chrominance only +!TP_LOCALLAB_BLENDMASKCOL;Blend +!TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +!TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +!TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +!TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +!TP_LOCALLAB_BLGUID;Guided Filter +!TP_LOCALLAB_BLINV;Inverse +!TP_LOCALLAB_BLLC;Luminance & Chrominance +!TP_LOCALLAB_BLLO;Luminance only +!TP_LOCALLAB_BLMED;Median +!TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +!TP_LOCALLAB_BLNOI_EXP;Blur & Noise +!TP_LOCALLAB_BLNORM;Normal +!TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +!TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +!TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +!TP_LOCALLAB_BLURCOL;Radius +!TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +!TP_LOCALLAB_BLURDE;Blur shape detection +!TP_LOCALLAB_BLURLC;Luminance only +!TP_LOCALLAB_BLURLEVELFRA;Blur levels +!TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +!TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +!TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +!TP_LOCALLAB_BLWH;All changes forced in Black-and-White +!TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +!TP_LOCALLAB_BUTTON_ADD;Add +!TP_LOCALLAB_BUTTON_DEL;Delete +!TP_LOCALLAB_BUTTON_DUPL;Duplicate +!TP_LOCALLAB_BUTTON_REN;Rename +!TP_LOCALLAB_BUTTON_VIS;Show/Hide +!TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +!TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +!TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +!TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +!TP_LOCALLAB_CAMMODE;CAM model +!TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +!TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +!TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +!TP_LOCALLAB_CBDL;Contrast by Detail Levels +!TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +!TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +!TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +!TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +!TP_LOCALLAB_CENTER_X;Center X +!TP_LOCALLAB_CENTER_Y;Center Y +!TP_LOCALLAB_CH;CL - LC +!TP_LOCALLAB_CHROMA;Chrominance +!TP_LOCALLAB_CHROMABLU;Chroma levels +!TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMACBDL;Chroma +!TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +!TP_LOCALLAB_CHROMALEV;Chroma levels +!TP_LOCALLAB_CHROMASKCOL;Chroma +!TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +!TP_LOCALLAB_CHROML;Chroma (C) +!TP_LOCALLAB_CHRRT;Chroma +!TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIEC;Use Ciecam environment parameters +!TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +!TP_LOCALLAB_CIECOLORFRA;Color +!TP_LOCALLAB_CIECONTFRA;Contrast +!TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +!TP_LOCALLAB_CIELIGHTFRA;Lighting +!TP_LOCALLAB_CIEMODE;Change tool position +!TP_LOCALLAB_CIEMODE_COM;Default +!TP_LOCALLAB_CIEMODE_DR;Dynamic Range +!TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +!TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +!TP_LOCALLAB_CIEMODE_WAV;Wavelet +!TP_LOCALLAB_CIETOOLEXP;Curves +!TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +!TP_LOCALLAB_CIRCRADIUS;Spot size +!TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +!TP_LOCALLAB_CLARICRES;Merge chroma +!TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +!TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +!TP_LOCALLAB_CLARILRES;Merge luma +!TP_LOCALLAB_CLARISOFT;Soft radius +!TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +!TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +!TP_LOCALLAB_CLARITYML;Clarity +!TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +!TP_LOCALLAB_CLIPTM;Clip restored data (gain) +!TP_LOCALLAB_COFR;Color & Light +!TP_LOCALLAB_COLORDE;ΔE preview color - intensity +!TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +!TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +!TP_LOCALLAB_COLORSCOPE;Scope (color tools) +!TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +!TP_LOCALLAB_COLOR_CIE;Color curve +!TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +!TP_LOCALLAB_COL_NAME;Name +!TP_LOCALLAB_COL_VIS;Status +!TP_LOCALLAB_COMPFRA;Directional contrast +!TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +!TP_LOCALLAB_CONTCOL;Contrast threshold +!TP_LOCALLAB_CONTFRA;Contrast by level +!TP_LOCALLAB_CONTRAST;Contrast +!TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +!TP_LOCALLAB_CONTRESID;Contrast +!TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +!TP_LOCALLAB_CONTTHR;Contrast Threshold +!TP_LOCALLAB_CONTWFRA;Local contrast +!TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +!TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +!TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +!TP_LOCALLAB_CURVCURR;Normal +!TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +!TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +!TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +!TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +!TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +!TP_LOCALLAB_CURVES_CIE;Tone curve +!TP_LOCALLAB_CURVNONE;Disable curves +!TP_LOCALLAB_DARKRETI;Darkness +!TP_LOCALLAB_DEHAFRA;Dehaze +!TP_LOCALLAB_DEHAZ;Strength +!TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +!TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +!TP_LOCALLAB_DELTAD;Delta balance +!TP_LOCALLAB_DELTAEC;ΔE Image mask +!TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +!TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +!TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +!TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +!TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +!TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +!TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +!TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +!TP_LOCALLAB_DENOIMASK;Denoise chroma mask +!TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +!TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +!TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +!TP_LOCALLAB_DENOI_EXP;Denoise +!TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +!TP_LOCALLAB_DEPTH;Depth +!TP_LOCALLAB_DETAIL;Local contrast +!TP_LOCALLAB_DETAILFRA;Edge detection - DCT +!TP_LOCALLAB_DETAILSH;Details +!TP_LOCALLAB_DETAILTHR;Luma-chro detail threshold +!TP_LOCALLAB_DIVGR;Gamma +!TP_LOCALLAB_DUPLSPOTNAME;Copy +!TP_LOCALLAB_EDGFRA;Edge sharpness +!TP_LOCALLAB_EDGSHOW;Show all tools +!TP_LOCALLAB_ELI;Ellipse +!TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +!TP_LOCALLAB_ENABLE_MASK;Enable mask +!TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +!TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +!TP_LOCALLAB_ENH;Enhanced +!TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +!TP_LOCALLAB_EPSBL;Detail +!TP_LOCALLAB_EQUIL;Normalize luminance +!TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +!TP_LOCALLAB_ESTOP;Edge stopping +!TP_LOCALLAB_EV_DUPL;Copy of +!TP_LOCALLAB_EV_NVIS;Hide +!TP_LOCALLAB_EV_NVIS_ALL;Hide all +!TP_LOCALLAB_EV_VIS;Show +!TP_LOCALLAB_EV_VIS_ALL;Show all +!TP_LOCALLAB_EXCLUF;Excluding +!TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +!TP_LOCALLAB_EXCLUTYPE;Spot method +!TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +!TP_LOCALLAB_EXECLU;Excluding spot +!TP_LOCALLAB_EXFULL;Full image +!TP_LOCALLAB_EXNORM;Normal spot +!TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +!TP_LOCALLAB_EXPCHROMA;Chroma compensation +!TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +!TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +!TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +!TP_LOCALLAB_EXPCOMPINV;Exposure compensation +!TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +!TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +!TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +!TP_LOCALLAB_EXPCURV;Curves +!TP_LOCALLAB_EXPGRAD;Graduated Filter +!TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +!TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +!TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +!TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +!TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +!TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +!TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +!TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +!TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +!TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +!TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +!TP_LOCALLAB_EXPTOOL;Exposure Tools +!TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +!TP_LOCALLAB_FATAMOUNT;Amount +!TP_LOCALLAB_FATANCHOR;Anchor +!TP_LOCALLAB_FATDETAIL;Detail +!TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +!TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +!TP_LOCALLAB_FATLEVEL;Sigma +!TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +!TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +!TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +!TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +!TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +!TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +!TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +!TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +!TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +!TP_LOCALLAB_GAM;Gamma +!TP_LOCALLAB_GAMC;Gamma +!TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +!TP_LOCALLAB_GAMM;Gamma +!TP_LOCALLAB_GAMMASKCOL;Gamma +!TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_GAMSH;Gamma +!TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +!TP_LOCALLAB_GRADANG;Gradient angle +!TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +!TP_LOCALLAB_GRADFRA;Graduated Filter Mask +!TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +!TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +!TP_LOCALLAB_GRADSTR;Gradient strength +!TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +!TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +!TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +!TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +!TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +!TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +!TP_LOCALLAB_GRAINFRA2;Coarseness +!TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +!TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +!TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +!TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +!TP_LOCALLAB_GRIDONE;Color Toning +!TP_LOCALLAB_GRIDTWO;Direct +!TP_LOCALLAB_GUIDBL;Soft radius +!TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +!TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +!TP_LOCALLAB_GUIDFILTER;Guided filter radius +!TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +!TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +!TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +!TP_LOCALLAB_HIGHMASKCOL;Highlights +!TP_LOCALLAB_HLH;H +!TP_LOCALLAB_HUECIE;Hue +!TP_LOCALLAB_IND;Independent (mouse) +!TP_LOCALLAB_INDSL;Independent (mouse + sliders) +!TP_LOCALLAB_INVBL;Inverse +!TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +!TP_LOCALLAB_INVERS;Inverse +!TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +!TP_LOCALLAB_INVMASK;Inverse algorithm +!TP_LOCALLAB_ISOGR;Distribution (ISO) +!TP_LOCALLAB_JAB;Uses Black Ev & White Ev +!TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +!TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +!TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +!TP_LOCALLAB_JZADAP;PU adaptation +!TP_LOCALLAB_JZCH;Chroma +!TP_LOCALLAB_JZCHROM;Chroma +!TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +!TP_LOCALLAB_JZCLARILRES;Merge Jz +!TP_LOCALLAB_JZCONT;Contrast +!TP_LOCALLAB_JZFORCE;Force max Jz to 1 +!TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +!TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +!TP_LOCALLAB_JZHFRA;Curves Hz +!TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +!TP_LOCALLAB_JZHUECIE;Hue Rotation +!TP_LOCALLAB_JZLIGHT;Brightness +!TP_LOCALLAB_JZLOG;Log encoding Jz +!TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +!TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +!TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +!TP_LOCALLAB_JZPQFRA;Jz remapping +!TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +!TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +!TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +!TP_LOCALLAB_JZQTOJ;Relative luminance +!TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +!TP_LOCALLAB_JZSAT;Saturation +!TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +!TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +!TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +!TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +!TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +!TP_LOCALLAB_JZWAVEXP;Wavelet Jz +!TP_LOCALLAB_LABBLURM;Blur Mask +!TP_LOCALLAB_LABEL;Local Adjustments +!TP_LOCALLAB_LABGRID;Color correction grid +!TP_LOCALLAB_LABGRIDMERG;Background +!TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_LOCALLAB_LABSTRUM;Structure Mask +!TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +!TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +!TP_LOCALLAB_LAPLACEXP;Laplacian threshold +!TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +!TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +!TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +!TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +!TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +!TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +!TP_LOCALLAB_LEVELBLUR;Maximum blur levels +!TP_LOCALLAB_LEVELWAV;Wavelet levels +!TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +!TP_LOCALLAB_LEVFRA;Levels +!TP_LOCALLAB_LIGHTNESS;Lightness +!TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +!TP_LOCALLAB_LIGHTRETI;Lightness +!TP_LOCALLAB_LINEAR;Linearity +!TP_LOCALLAB_LIST_NAME;Add tool to current spot... +!TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +!TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +!TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +!TP_LOCALLAB_LOCCONT;Unsharp Mask +!TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +!TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +!TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +!TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +!TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +!TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +!TP_LOCALLAB_LOG;Log Encoding +!TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +!TP_LOCALLAB_LOG2FRA;Viewing Conditions +!TP_LOCALLAB_LOGAUTO;Automatic +!TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +!TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +!TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +!TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +!TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +!TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +!TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +!TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +!TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +!TP_LOCALLAB_LOGCONQL;Contrast (Q) +!TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +!TP_LOCALLAB_LOGCONTL;Contrast (J) +!TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +!TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +!TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +!TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +!TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +!TP_LOCALLAB_LOGEXP;All tools +!TP_LOCALLAB_LOGFRA;Scene Conditions +!TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +!TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +!TP_LOCALLAB_LOGLIGHTL;Lightness (J) +!TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +!TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +!TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +!TP_LOCALLAB_LOGLIN;Logarithm mode +!TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +!TP_LOCALLAB_LOGREPART;Overall strength +!TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +!TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +!TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +!TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +!TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +!TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +!TP_LOCALLAB_LUM;LL - CC +!TP_LOCALLAB_LUMADARKEST;Darkest +!TP_LOCALLAB_LUMASK;Background color/luma mask +!TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +!TP_LOCALLAB_LUMAWHITESEST;Lightest +!TP_LOCALLAB_LUMFRA;L*a*b* standard +!TP_LOCALLAB_MASFRAME;Mask and Merge +!TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +!TP_LOCALLAB_MASK;Curves +!TP_LOCALLAB_MASK2;Contrast curve +!TP_LOCALLAB_MASKCOM;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +!TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +!TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +!TP_LOCALLAB_MASKDDECAY;Decay strength +!TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +!TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +!TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +!TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +!TP_LOCALLAB_MASKH;Hue curve +!TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +!TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +!TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +!TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +!TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +!TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +!TP_LOCALLAB_MASKLC_TOOLTIP;This allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +!TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +!TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +!TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +!TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +!TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +!TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +!TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +!TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +!TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +!TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +!TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +!TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +!TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +!TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +!TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +!TP_LOCALLAB_MEDIAN;Median Low +!TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +!TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +!TP_LOCALLAB_MEDNONE;None +!TP_LOCALLAB_MERCOL;Color +!TP_LOCALLAB_MERDCOL;Merge background (ΔE) +!TP_LOCALLAB_MERELE;Lighten only +!TP_LOCALLAB_MERFIV;Addition +!TP_LOCALLAB_MERFOR;Color Dodge +!TP_LOCALLAB_MERFOU;Multiply +!TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +!TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +!TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +!TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +!TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +!TP_LOCALLAB_MERHEI;Overlay +!TP_LOCALLAB_MERHUE;Hue +!TP_LOCALLAB_MERLUCOL;Luminance +!TP_LOCALLAB_MERLUM;Luminosity +!TP_LOCALLAB_MERNIN;Screen +!TP_LOCALLAB_MERONE;Normal +!TP_LOCALLAB_MERSAT;Saturation +!TP_LOCALLAB_MERSEV;Soft Light (legacy) +!TP_LOCALLAB_MERSEV0;Soft Light Illusion +!TP_LOCALLAB_MERSEV1;Soft Light W3C +!TP_LOCALLAB_MERSEV2;Hard Light +!TP_LOCALLAB_MERSIX;Divide +!TP_LOCALLAB_MERTEN;Darken only +!TP_LOCALLAB_MERTHI;Color Burn +!TP_LOCALLAB_MERTHR;Difference +!TP_LOCALLAB_MERTWE;Exclusion +!TP_LOCALLAB_MERTWO;Subtract +!TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +!TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +!TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +!TP_LOCALLAB_MODE_EXPERT;Advanced +!TP_LOCALLAB_MODE_NORMAL;Standard +!TP_LOCALLAB_MODE_SIMPLE;Basic +!TP_LOCALLAB_MRFIV;Background +!TP_LOCALLAB_MRFOU;Previous Spot +!TP_LOCALLAB_MRONE;None +!TP_LOCALLAB_MRTHR;Original Image +!TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +!TP_LOCALLAB_NEIGH;Radius +!TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +!TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +!TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +!TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +!TP_LOCALLAB_NLDET;Detail recovery +!TP_LOCALLAB_NLFRA;Non-local Means - Luminance +!TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +!TP_LOCALLAB_NLGAM;Gamma +!TP_LOCALLAB_NLLUM;Strength +!TP_LOCALLAB_NLPAT;Maximum patch size +!TP_LOCALLAB_NLRAD;Maximum radius size +!TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +!TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +!TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +!TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +!TP_LOCALLAB_NOISEGAM;Gamma +!TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +!TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +!TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +!TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +!TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +!TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +!TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +!TP_LOCALLAB_NOISEMETH;Denoise +!TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +!TP_LOCALLAB_NONENOISE;None +!TP_LOCALLAB_NUL_TOOLTIP;. +!TP_LOCALLAB_OFFS;Offset +!TP_LOCALLAB_OFFSETWAV;Offset +!TP_LOCALLAB_OPACOL;Opacity +!TP_LOCALLAB_ORIGLC;Merge only with original image +!TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +!TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +!TP_LOCALLAB_PASTELS2;Vibrance +!TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +!TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +!TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +!TP_LOCALLAB_PREVHIDE;Hide additional settings +!TP_LOCALLAB_PREVIEW;Preview ΔE +!TP_LOCALLAB_PREVSHOW;Show additional settings +!TP_LOCALLAB_PROXI;ΔE decay +!TP_LOCALLAB_QUAAGRES;Aggressive +!TP_LOCALLAB_QUACONSER;Conservative +!TP_LOCALLAB_QUALCURV_METHOD;Curve type +!TP_LOCALLAB_QUAL_METHOD;Global quality +!TP_LOCALLAB_QUANONEALL;Off +!TP_LOCALLAB_QUANONEWAV;Non-local means only +!TP_LOCALLAB_RADIUS;Radius +!TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +!TP_LOCALLAB_RADMASKCOL;Smooth radius +!TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +!TP_LOCALLAB_RECT;Rectangle +!TP_LOCALLAB_RECURS;Recursive references +!TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +!TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +!TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +!TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +!TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +!TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +!TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +!TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +!TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +!TP_LOCALLAB_RESID;Residual Image +!TP_LOCALLAB_RESIDBLUR;Blur residual image +!TP_LOCALLAB_RESIDCHRO;Residual image Chroma +!TP_LOCALLAB_RESIDCOMP;Compress residual image +!TP_LOCALLAB_RESIDCONT;Residual image Contrast +!TP_LOCALLAB_RESIDHI;Highlights +!TP_LOCALLAB_RESIDHITHR;Highlights threshold +!TP_LOCALLAB_RESIDSHA;Shadows +!TP_LOCALLAB_RESIDSHATHR;Shadows threshold +!TP_LOCALLAB_RETI;Dehaze & Retinex +!TP_LOCALLAB_RETIFRA;Retinex +!TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +!TP_LOCALLAB_RETIM;Original Retinex +!TP_LOCALLAB_RETITOOLFRA;Retinex Tools +!TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +!TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +!TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +!TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +!TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +!TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +!TP_LOCALLAB_REWEI;Reweighting iterates +!TP_LOCALLAB_RGB;RGB Tone Curve +!TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +!TP_LOCALLAB_ROW_NVIS;Not visible +!TP_LOCALLAB_ROW_VIS;Visible +!TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +!TP_LOCALLAB_SATUR;Saturation +!TP_LOCALLAB_SATURV;Saturation (s) +!TP_LOCALLAB_SCALEGR;Scale +!TP_LOCALLAB_SCALERETI;Scale +!TP_LOCALLAB_SCALTM;Scale +!TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +!TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +!TP_LOCALLAB_SENSI;Scope +!TP_LOCALLAB_SENSIEXCLU;Scope +!TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +!TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +!TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +!TP_LOCALLAB_SETTINGS;Settings +!TP_LOCALLAB_SH1;Shadows Highlights +!TP_LOCALLAB_SH2;Equalizer +!TP_LOCALLAB_SHADEX;Shadows +!TP_LOCALLAB_SHADEXCOMP;Shadow compression +!TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +!TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +!TP_LOCALLAB_SHAMASKCOL;Shadows +!TP_LOCALLAB_SHAPETYPE;RT-spot shape +!TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +!TP_LOCALLAB_SHARAMOUNT;Amount +!TP_LOCALLAB_SHARBLUR;Blur radius +!TP_LOCALLAB_SHARDAMPING;Damping +!TP_LOCALLAB_SHARFRAME;Modifications +!TP_LOCALLAB_SHARITER;Iterations +!TP_LOCALLAB_SHARP;Sharpening +!TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +!TP_LOCALLAB_SHARRADIUS;Radius +!TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +!TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +!TP_LOCALLAB_SHOWC;Mask and modifications +!TP_LOCALLAB_SHOWC1;Merge file +!TP_LOCALLAB_SHOWCB;Mask and modifications +!TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +!TP_LOCALLAB_SHOWE;Mask and modifications +!TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +!TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +!TP_LOCALLAB_SHOWLC;Mask and modifications +!TP_LOCALLAB_SHOWMASK;Show mask +!TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +!TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +!TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +!TP_LOCALLAB_SHOWMASKTYP2;Denoise +!TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +!TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +!TP_LOCALLAB_SHOWMNONE;Show modified image +!TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +!TP_LOCALLAB_SHOWMODIF2;Show modified areas +!TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +!TP_LOCALLAB_SHOWNORMAL;No luminance normalization +!TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +!TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +!TP_LOCALLAB_SHOWR;Mask and modifications +!TP_LOCALLAB_SHOWREF;Preview ΔE +!TP_LOCALLAB_SHOWS;Mask and modifications +!TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +!TP_LOCALLAB_SHOWT;Mask and modifications +!TP_LOCALLAB_SHOWVI;Mask and modifications +!TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +!TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +!TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +!TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +!TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +!TP_LOCALLAB_SIGMAWAV;Attenuation response +!TP_LOCALLAB_SIGMOIDBL;Blend +!TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +!TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +!TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +!TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +!TP_LOCALLAB_SLOMASKCOL;Slope +!TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +!TP_LOCALLAB_SLOSH;Slope +!TP_LOCALLAB_SOFT;Soft Light & Original Retinex +!TP_LOCALLAB_SOFTM;Soft Light +!TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +!TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +!TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +!TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +!TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +!TP_LOCALLAB_SOURCE_ABS;Absolute luminance +!TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_SPECCASE;Specific cases +!TP_LOCALLAB_SPECIAL;Special use of RGB curves +!TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +!TP_LOCALLAB_SPOTNAME;New Spot +!TP_LOCALLAB_STD;Standard +!TP_LOCALLAB_STR;Strength +!TP_LOCALLAB_STRBL;Strength +!TP_LOCALLAB_STREN;Compression strength +!TP_LOCALLAB_STRENG;Strength +!TP_LOCALLAB_STRENGR;Strength +!TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +!TP_LOCALLAB_STRENGTH;Noise +!TP_LOCALLAB_STRGRID;Strength +!TP_LOCALLAB_STRUC;Structure +!TP_LOCALLAB_STRUCCOL;Spot structure +!TP_LOCALLAB_STRUCCOL1;Spot structure +!TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +!TP_LOCALLAB_STRUMASKCOL;Structure mask strength +!TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +!TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +!TP_LOCALLAB_STYPE;Shape method +!TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +!TP_LOCALLAB_SYM;Symmetrical (mouse) +!TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +!TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +!TP_LOCALLAB_THRES;Threshold structure +!TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +!TP_LOCALLAB_THRESRETI;Threshold +!TP_LOCALLAB_THRESWAV;Balance threshold +!TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +!TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +!TP_LOCALLAB_TM;Tone Mapping +!TP_LOCALLAB_TM_MASK;Use transmission map +!TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +!TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +!TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +!TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +!TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +!TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +!TP_LOCALLAB_TOOLCOL;Structure mask as tool +!TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +!TP_LOCALLAB_TOOLMASK;Mask Tools +!TP_LOCALLAB_TOOLMASK_2;Wavelets +!TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +!TP_LOCALLAB_TRANSIT;Transition Gradient +!TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +!TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +!TP_LOCALLAB_TRANSITVALUE;Transition value +!TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +!TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +!TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +!TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +!TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +!TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +!TP_LOCALLAB_USEMASK;Laplacian +!TP_LOCALLAB_VART;Variance (contrast) +!TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +!TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +!TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +!TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +!TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +!TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +!TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +!TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +!TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +!TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +!TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +!TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +!TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +!TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +!TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +!TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +!TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +!TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +!TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +!TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +!TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +!TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +!TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +!TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +!TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +!TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +!TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +!TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +!TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +!TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +!TP_LOCALLAB_WAV;Local contrast +!TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +!TP_LOCALLAB_WAVCOMP;Compression by level +!TP_LOCALLAB_WAVCOMPRE;Compression by level +!TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +!TP_LOCALLAB_WAVCON;Contrast by level +!TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +!TP_LOCALLAB_WAVDEN;Luminance denoise +!TP_LOCALLAB_WAVE;Wavelets +!TP_LOCALLAB_WAVEDG;Local contrast +!TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +!TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +!TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +!TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +!TP_LOCALLAB_WAVLEV;Blur by level +!TP_LOCALLAB_WAVMASK;Local contrast +!TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +!TP_LOCALLAB_WEDIANHI;Median Hi +!TP_LOCALLAB_WHITE_EV;White Ev +!TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +!TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +!TP_LOCAL_HEIGHT;Bottom +!TP_LOCAL_HEIGHT_T;Top +!TP_LOCAL_WIDTH;Right +!TP_LOCAL_WIDTH_L;Left +!TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. !TP_METADATA_EDIT;Apply modifications !TP_METADATA_MODE;Metadata copy mode !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged !TP_PDSHARPENING_LABEL;Capture Sharpening +!TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +!TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +!TP_PERSPECTIVE_CAMERA_FRAME;Correction +!TP_PERSPECTIVE_CAMERA_PITCH;Vertical +!TP_PERSPECTIVE_CAMERA_ROLL;Rotation +!TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_CAMERA_YAW;Horizontal +!TP_PERSPECTIVE_CONTROL_LINES;Control lines +!TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +!TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. +!TP_PERSPECTIVE_METHOD;Method +!TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +!TP_PERSPECTIVE_METHOD_SIMPLE;Simple +!TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +!TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +!TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +!TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +!TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +!TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +!TP_PERSPECTIVE_RECOVERY_FRAME;Recovery !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_PREPROCWB_LABEL;Preprocess White Balance +!TP_PREPROCWB_MODE;Mode +!TP_PREPROCWB_MODE_AUTO;Auto +!TP_PREPROCWB_MODE_CAMERA;Camera !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_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 @@ -2184,9 +3844,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear !TP_RAW_AMAZEVNG4;AMaZE+VNG4 !TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBBILINEAR;DCB+Bilinear !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). @@ -2202,6 +3864,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift +!TP_RAW_PIXELSHIFTAVERAGE;Use average for moving parts +!TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion !TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -2212,7 +3876,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts !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 @@ -2227,19 +3891,24 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_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_RCD;RCD +!TP_RAW_RCDBILINEAR;RCD+Bilinear !TP_RAW_RCDVNG4;RCD+VNG4 !TP_RAW_VNG4;VNG4 !TP_RAW_XTRANS;X-Trans !TP_RAW_XTRANSFAST;Fast X-Trans !TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RESIZE_LE;Long Edge: +!TP_RESIZE_LONG;Long Edge +!TP_RESIZE_SE;Short Edge: +!TP_RESIZE_SHORT;Short Edge !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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. !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_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;Method !TP_RETINEX_MAP_GAUS;Gaussian mask @@ -2248,14 +3917,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_MEDIAN;Transmission median filter !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_MLABEL;Restored data Min=%1 Max=%2 +!TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. !TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. -!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_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. !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_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_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_SHARPENING_ITERCHECK;Auto limit iterations @@ -2263,48 +3932,145 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SOFTLIGHT_LABEL;Soft Light !TP_SOFTLIGHT_STRENGTH;Strength +!TP_SPOT_COUNTLABEL;%1 point(s) +!TP_SPOT_DEFAULT_SIZE;Default spot size +!TP_SPOT_ENTRYCHANGED;Point changed +!TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +!TP_SPOT_LABEL;Spot Removal !TP_TM_FATTAL_AMOUNT;Amount !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_BALCHROM;Equalizer Color +!TP_WAVELET_BALLUM;Denoise equalizer White-Black +!TP_WAVELET_BL;Blur levels +!TP_WAVELET_BLCURVE;Blur by levels +!TP_WAVELET_BLURFRAME;Blur +!TP_WAVELET_BLUWAV;Attenuation response +!TP_WAVELET_CBENAB;Toning and Color balance +!TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. +!TP_WAVELET_CHROFRAME;Denoise chrominance +!TP_WAVELET_CHROMAFRAME;Chroma +!TP_WAVELET_CHROMCO;Chrominance Coarse +!TP_WAVELET_CHROMFI;Chrominance Fine !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_CHRWAV;Blur chroma +!TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of 'contrast levels' and 'chroma-contrast link strength'. +!TP_WAVELET_CLA;Clarity +!TP_WAVELET_CLARI;Sharp-mask and Clarity +!TP_WAVELET_COMPEXPERT;Advanced +!TP_WAVELET_COMPLEXLAB;Complexity +!TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +!TP_WAVELET_COMPNORMAL;Standard +!TP_WAVELET_CONTFRAME;Contrast - Compression +!TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. !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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. +!TP_WAVELET_DAUBLOCAL;Wavelet Edge performance +!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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +!TP_WAVELET_DEN5THR;Guided threshold +!TP_WAVELET_DENCURV;Curve +!TP_WAVELET_DENL;Correction structure +!TP_WAVELET_DENLH;Guided threshold levels 1-4 +!TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +!TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +!TP_WAVELET_DENOISE;Guide curve based on Local contrast +!TP_WAVELET_DENOISEGUID;Guided threshold based on hue +!TP_WAVELET_DENOISEH;High levels Curve Local contrast +!TP_WAVELET_DENOISEHUE;Denoise hue equalizer +!TP_WAVELET_DENQUA;Mode +!TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +!TP_WAVELET_DENSLI;Slider +!TP_WAVELET_DENSLILAB;Method +!TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +!TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +!TP_WAVELET_DETEND;Details +!TP_WAVELET_DIRFRAME;Directional contrast +!TP_WAVELET_EDEFFECT;Attenuation response +!TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. +!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+std. dev. and maxima. !TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) -!TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection) +!TP_WAVELET_EDGEDETECTTHR2;Edge enhancement !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 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_EDRAD_TOOLTIP;This adjustment controls the local enhancement. A value of zero still has an effect. +!TP_WAVELET_FINCFRAME;Final local contrast +!TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +!TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +!TP_WAVELET_HIGHLIGHT;Finer levels luminance range !TP_WAVELET_HS1;Whole luminance range !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_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_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_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +!TP_WAVELET_LEVDEN;Level 5-6 denoise +!TP_WAVELET_LEVELHIGH;Radius 5-6 +!TP_WAVELET_LEVELLOW;Radius 1-4 +!TP_WAVELET_LEVELSIGM;Radius +!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. +!TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold !TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 -!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength -!TP_WAVELET_LOWLIGHT;Shadow luminance range +!TP_WAVELET_LIMDEN;Interaction levels 5-6 on levels 1-4 +!TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength +!TP_WAVELET_LOWLIGHT;Coarser levels luminance range +!TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. !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_MERGEC;Merge chroma +!TP_WAVELET_MERGEL;Merge luma +!TP_WAVELET_MIXCONTRAST;Reference +!TP_WAVELET_MIXDENOISE;Denoise +!TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +!TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +!TP_WAVELET_MIXNOISE;Noise !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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +!TP_WAVELET_OLDSH;Algorithm using negatives values +!TP_WAVELET_OPACITY;Opacity blue-yellow !TP_WAVELET_OPACITYW;Contrast balance d/v-h curve !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_PROTAB;Protection +!TP_WAVELET_QUAAGRES;Aggressive +!TP_WAVELET_QUACONSER;Conservative +!TP_WAVELET_RADIUS;Radius shadows - highlight +!TP_WAVELET_RANGEAB;Range a and b % +!TP_WAVELET_RESBLUR;Blur luminance +!TP_WAVELET_RESBLURC;Blur chroma +!TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +!TP_WAVELET_SHA;Sharp mask +!TP_WAVELET_SHFRAME;Shadows/Highlights +!TP_WAVELET_SHOWMASK;Show wavelet 'mask' +!TP_WAVELET_SIGM;Radius +!TP_WAVELET_SIGMA;Attenuation response +!TP_WAVELET_SIGMAFIN;Attenuation response +!TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. !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_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_SKY;Hue targetting/protection +!TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +!TP_WAVELET_SOFTRAD;Soft radius +!TP_WAVELET_STREND;Strength +!TP_WAVELET_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +!TP_WAVELET_THREND;Local contrast threshold +!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. !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_TMEDGS;Edge stopping +!TP_WAVELET_TMSCALE;Scale +!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. !TP_WAVELET_TON;Toning +!TP_WAVELET_TONFRAME;Excluded colors +!TP_WAVELET_USH;None +!TP_WAVELET_USHARP;Clarity method +!TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +!TP_WAVELET_WAVLOWTHR;Low contrast threshold +!TP_WAVELET_WAVOFFSET;Offset +!TP_WBALANCE_AUTOITCGREEN;Temperature correlation +!TP_WBALANCE_AUTOOLD;RGB grey +!TP_WBALANCE_AUTO_HEADER;Automatic !TP_WBALANCE_PICKER;Pick +!TP_WBALANCE_STUDLABEL;Correlation factor: %1 +!TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. !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_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/default b/rtdata/languages/default index 5004bf25c..050836d21 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -22,7 +22,7 @@ CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click CURVEEDITOR_HIGHLIGHTS;Highlights CURVEEDITOR_LIGHTS;Lights CURVEEDITOR_LINEAR;Linear -CURVEEDITOR_LOADDLGLABEL;Load curve... +CURVEEDITOR_LOADDLGLABEL;Load curve CURVEEDITOR_MINMAXCPOINTS;Equalizer CURVEEDITOR_NURBS;Control cage CURVEEDITOR_PARAMETRIC;Parametric @@ -39,7 +39,7 @@ 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_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 @@ -61,6 +61,7 @@ EXIFFILTER_IMAGETYPE;Image type EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Lens EXIFFILTER_METADATAFILTER;Enable metadata filters +EXIFFILTER_PATH;File path EXIFFILTER_SHUTTER;Shutter EXIFPANEL_ADDEDIT;Add/Edit EXIFPANEL_ADDEDITHINT;Add new tag or edit tag. @@ -100,10 +101,10 @@ EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and res EXPORT_MAXHEIGHT;Maximum height: EXPORT_MAXWIDTH;Maximum width: EXPORT_PIPELINE;Processing pipeline -EXPORT_PUTTOQUEUEFAST; Put to queue for fast export +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_FAST_PIPELINE_TOOLTIP;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 @@ -111,7 +112,7 @@ FILEBROWSER_APPLYPROFILE;Apply FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial FILEBROWSER_AUTODARKFRAME;Auto dark-frame FILEBROWSER_AUTOFLATFIELD;Auto flat-field -FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. +FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply 'find' keywords. 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 all including cached profiles @@ -145,6 +146,7 @@ FILEBROWSER_POPUPCOLORLABEL4;Label: Blue FILEBROWSER_POPUPCOLORLABEL5;Label: Purple FILEBROWSER_POPUPCOPYTO;Copy to... FILEBROWSER_POPUPFILEOPERATIONS;File operations +FILEBROWSER_POPUPINSPECT;Inspect FILEBROWSER_POPUPMOVEEND;Move to end of queue FILEBROWSER_POPUPMOVEHEAD;Move to head of queue FILEBROWSER_POPUPMOVETO;Move to... @@ -164,6 +166,7 @@ FILEBROWSER_POPUPREMOVE;Delete permanently FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version FILEBROWSER_POPUPRENAME;Rename FILEBROWSER_POPUPSELECTALL;Select all +FILEBROWSER_POPUPSORTBY;Sort Files FILEBROWSER_POPUPTRASH;Move to trash FILEBROWSER_POPUPUNRANK;Unrank FILEBROWSER_POPUPUNTRASH;Remove from trash @@ -207,6 +210,7 @@ FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multi FILECHOOSER_FILTER_ANY;All files FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) FILECHOOSER_FILTER_CURVE;Curve files +FILECHOOSER_FILTER_EXECUTABLE;Executable files FILECHOOSER_FILTER_LCP;Lens correction profiles FILECHOOSER_FILTER_PP;Processing profiles FILECHOOSER_FILTER_SAME;Same format as current photo @@ -220,8 +224,10 @@ GENERAL_BEFORE;Before GENERAL_CANCEL;Cancel GENERAL_CLOSE;Close GENERAL_CURRENT;Current +GENERAL_DELETE_ALL;Delete all GENERAL_DISABLE;Disable GENERAL_DISABLED;Disabled +GENERAL_EDIT;Edit GENERAL_ENABLE;Enable GENERAL_ENABLED;Enabled GENERAL_FILE;File @@ -232,6 +238,7 @@ GENERAL_NO;No GENERAL_NONE;None GENERAL_OK;OK GENERAL_OPEN;Open +GENERAL_OTHER;Other GENERAL_PORTRAIT;Portrait GENERAL_RESET;Reset GENERAL_SAVE;Save @@ -243,17 +250,24 @@ GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done edit HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. +HISTOGRAM_TOOLTIP_CROSSHAIR;Show/Hide indicator crosshair. 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. +HISTOGRAM_TOOLTIP_SHOW_OPTIONS;Toggle visibility of the scope option buttons. +HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS;Adjust scope brightness. +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM;Histogram +HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW;Raw Histogram +HISTOGRAM_TOOLTIP_TYPE_PARADE;RGB Parade +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC;Hue-Chroma Vectorscope +HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS;Hue-Saturation Vectorscope +HISTOGRAM_TOOLTIP_TYPE_WAVEFORM;Waveform HISTORY_CHANGED;Changed HISTORY_CUSTOMCURVE;Custom curve HISTORY_FROMCLIPBOARD;From clipboard HISTORY_LABEL;History HISTORY_MSG_1;Photo loaded -HISTORY_MSG_2;PP3 loaded HISTORY_MSG_3;PP3 changed HISTORY_MSG_4;History browsing HISTORY_MSG_5;Exposure - Lightness @@ -267,9 +281,6 @@ HISTORY_MSG_12;Exposure - Auto levels HISTORY_MSG_13;Exposure - Clip HISTORY_MSG_14;L*a*b* - Lightness HISTORY_MSG_15;L*a*b* - Contrast -HISTORY_MSG_16;- -HISTORY_MSG_17;- -HISTORY_MSG_18;- HISTORY_MSG_19;L*a*b* - L* curve HISTORY_MSG_20;Sharpening HISTORY_MSG_21;USM - Radius @@ -295,10 +306,6 @@ HISTORY_MSG_40;WB - Tint HISTORY_MSG_41;Exposure - Tone curve 1 mode HISTORY_MSG_42;Exposure - Tone curve 2 HISTORY_MSG_43;Exposure - Tone curve 2 mode -HISTORY_MSG_44;Lum. denoising radius -HISTORY_MSG_45;Lum. denoising edge tolerance -HISTORY_MSG_46;Color denoising -HISTORY_MSG_47;Blend ICC highlights with matrix HISTORY_MSG_48;DCP - Tone curve HISTORY_MSG_49;DCP illuminant HISTORY_MSG_50;Shadows/Highlights @@ -306,7 +313,6 @@ HISTORY_MSG_51;S/H - Highlights HISTORY_MSG_52;S/H - Shadows HISTORY_MSG_53;S/H - Highlights tonal width HISTORY_MSG_54;S/H - Shadows tonal width -HISTORY_MSG_55;S/H - Local contrast HISTORY_MSG_56;S/H - Radius HISTORY_MSG_57;Coarse rotation HISTORY_MSG_58;Horizontal flipping @@ -318,7 +324,6 @@ HISTORY_MSG_63;Snapshot selected HISTORY_MSG_64;Crop HISTORY_MSG_65;CA correction HISTORY_MSG_66;Exposure - Highlight reconstruction -HISTORY_MSG_67;Exposure - HLR amount HISTORY_MSG_68;Exposure - HLR method HISTORY_MSG_69;Working color space HISTORY_MSG_70;Output color space @@ -329,12 +334,10 @@ HISTORY_MSG_74;Resize - Scale HISTORY_MSG_75;Resize - Method HISTORY_MSG_76;Exif metadata HISTORY_MSG_77;IPTC metadata -HISTORY_MSG_78;- HISTORY_MSG_79;Resize - Width HISTORY_MSG_80;Resize - Height HISTORY_MSG_81;Resize 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 @@ -381,12 +384,6 @@ 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 distortion 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 @@ -424,39 +421,39 @@ 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_174;Color Appearance & Lighting +HISTORY_MSG_175;CAL - SC - Adaptation +HISTORY_MSG_176;CAL - VC - Surround +HISTORY_MSG_177;CAL - SC - Absolute luminance +HISTORY_MSG_178;CAL - VC - Absolute luminance +HISTORY_MSG_179;CAL - SC - WP model +HISTORY_MSG_180;CAL - IA - Lightness (J) +HISTORY_MSG_181;CAL - IA - Chroma (C) +HISTORY_MSG_182;CAL - SC - Auto adaptation +HISTORY_MSG_183;CAL - IA - Contrast (J) +HISTORY_MSG_184;CAL - SC - Surround +HISTORY_MSG_185;CAL - Gamut control +HISTORY_MSG_186;CAL - IA - Algorithm +HISTORY_MSG_187;CAL - IA - Red/skin protection +HISTORY_MSG_188;CAL - IA - Brightness (Q) +HISTORY_MSG_189;CAL - IA - Contrast (Q) +HISTORY_MSG_190;CAL - IA - Saturation (S) +HISTORY_MSG_191;CAL - IA - Colorfulness (M) +HISTORY_MSG_192;CAL - IA - Hue (h) +HISTORY_MSG_193;CAL - IA - Tone curve 1 +HISTORY_MSG_194;CAL - IA - Tone curve 2 +HISTORY_MSG_195;CAL - IA - Tone curve 1 mode +HISTORY_MSG_196;CAL - IA - Tone curve 2 mode +HISTORY_MSG_197;CAL - IA - Color curve +HISTORY_MSG_198;CAL - IA - Color curve mode +HISTORY_MSG_199;CAL - IA - Use CAM output for histograms +HISTORY_MSG_200;CAL - IA - Use CAM for 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_205;CAL - Hot/bad pixel filter +HISTORY_MSG_206;CAL - SC - Auto absolute luminance HISTORY_MSG_207;Defringe - Hue curve HISTORY_MSG_208;WB - B/R equalizer HISTORY_MSG_210;GF - Angle @@ -499,7 +496,6 @@ 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 @@ -523,8 +519,6 @@ HISTORY_MSG_270;CT - High - Green HISTORY_MSG_271;CT - High - Blue HISTORY_MSG_272;CT - Balance 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 @@ -549,7 +543,6 @@ 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 @@ -567,10 +560,10 @@ 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_318;W - Contrast - Finer levels +HISTORY_MSG_319;W - Contrast - Finer range +HISTORY_MSG_320;W - Contrast - Coarser range +HISTORY_MSG_321;W - Contrast - Coarser levels HISTORY_MSG_322;W - Gamut - Avoid color shift HISTORY_MSG_323;W - ES - Local contrast HISTORY_MSG_324;W - Chroma - Pastel @@ -634,14 +627,14 @@ 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_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 - Color Balance +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 @@ -658,7 +651,6 @@ 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 @@ -674,7 +666,7 @@ 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_425;--unused-- HISTORY_MSG_426;Retinex - Hue equalizer HISTORY_MSG_427;Output rendering intent HISTORY_MSG_428;Monitor rendering intent @@ -694,30 +686,45 @@ 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_445;Raw Sub-Image +HISTORY_MSG_446;--unused-- +HISTORY_MSG_447;--unused-- +HISTORY_MSG_448;--unused-- +HISTORY_MSG_449;PS ISO adaption +HISTORY_MSG_450;--unused-- +HISTORY_MSG_451;--unused-- +HISTORY_MSG_452;PS Show motion +HISTORY_MSG_453;PS Show mask only +HISTORY_MSG_454;--unused-- +HISTORY_MSG_455;--unused-- +HISTORY_MSG_456;--unused-- +HISTORY_MSG_457;PS Check red/blue +HISTORY_MSG_458;--unused-- +HISTORY_MSG_459;--unused-- +HISTORY_MSG_460;--unused-- +HISTORY_MSG_461;--unused-- +HISTORY_MSG_462;PS Check green +HISTORY_MSG_463;--unused-- +HISTORY_MSG_464;PS Blur motion mask +HISTORY_MSG_465;PS Blur radius +HISTORY_MSG_466;--unused-- +HISTORY_MSG_467;--unused-- +HISTORY_MSG_468;PS Fill holes +HISTORY_MSG_469;PS Median +HISTORY_MSG_470;--unused-- +HISTORY_MSG_471;PS Motion correction +HISTORY_MSG_472;PS Smooth transitions +HISTORY_MSG_474;PS Equalize +HISTORY_MSG_475;PS Equalize channel +HISTORY_MSG_476;CAL - VC - Temperature +HISTORY_MSG_477;CAL - VC - Tint +HISTORY_MSG_478;CAL - VC - Mean luminance +HISTORY_MSG_479;CAL - VC - Adaptation +HISTORY_MSG_480;CAL - VC - Auto adaptation +HISTORY_MSG_481;CAL - SC - Temperature +HISTORY_MSG_482;CAL - SC - Tint +HISTORY_MSG_483;CAL - SC - Mean luminance +HISTORY_MSG_484;CAL - SC - Auto mean luminance HISTORY_MSG_485;Lens Correction HISTORY_MSG_486;Lens Correction - Camera HISTORY_MSG_487;Lens Correction - Lens @@ -728,6 +735,654 @@ HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_494;Capture Sharpening +HISTORY_MSG_496;Local Spot deleted +HISTORY_MSG_497;Local Spot selected +HISTORY_MSG_498;Local Spot name +HISTORY_MSG_499;Local Spot visibility +HISTORY_MSG_500;Local Spot shape +HISTORY_MSG_501;Local Spot method +HISTORY_MSG_502;Local Spot shape method +HISTORY_MSG_503;Local Spot locX +HISTORY_MSG_504;Local Spot locXL +HISTORY_MSG_505;Local Spot locY +HISTORY_MSG_506;Local Spot locYT +HISTORY_MSG_507;Local Spot center +HISTORY_MSG_508;Local Spot circrad +HISTORY_MSG_509;Local Spot quality method +HISTORY_MSG_510;Local Spot transition +HISTORY_MSG_511;Local Spot thresh +HISTORY_MSG_512;Local Spot ΔE decay +HISTORY_MSG_513;Local Spot scope +HISTORY_MSG_514;Local Spot structure +HISTORY_MSG_515;Local Adjustments +HISTORY_MSG_516;Local - Color and light +HISTORY_MSG_517;Local - Enable super +HISTORY_MSG_518;Local - Lightness +HISTORY_MSG_519;Local - Contrast +HISTORY_MSG_520;Local - Chrominance +HISTORY_MSG_521;Local - Scope +HISTORY_MSG_522;Local - curve method +HISTORY_MSG_523;Local - LL Curve +HISTORY_MSG_524;Local - CC curve +HISTORY_MSG_525;Local - LH Curve +HISTORY_MSG_526;Local - H curve +HISTORY_MSG_527;Local - Color Inverse +HISTORY_MSG_528;Local - Exposure +HISTORY_MSG_529;Local - Exp Compensation +HISTORY_MSG_530;Local - Exp Hlcompr +HISTORY_MSG_531;Local - Exp hlcomprthresh +HISTORY_MSG_532;Local - Exp black +HISTORY_MSG_533;Local - Exp Shcompr +HISTORY_MSG_534;Local - Warm Cool +HISTORY_MSG_535;Local - Exp Scope +HISTORY_MSG_536;Local - Exp Contrast curve +HISTORY_MSG_537;Local - Vibrance +HISTORY_MSG_538;Local - Vib Saturated +HISTORY_MSG_539;Local - Vib Pastel +HISTORY_MSG_540;Local - Vib Threshold +HISTORY_MSG_541;Local - Vib Protect skin tones +HISTORY_MSG_542;Local - Vib avoid colorshift +HISTORY_MSG_543;Local - Vib link +HISTORY_MSG_544;Local - Vib Scope +HISTORY_MSG_545;Local - Vib H curve +HISTORY_MSG_546;Local - Blur and noise +HISTORY_MSG_547;Local - Radius +HISTORY_MSG_548;Local - Noise +HISTORY_MSG_549;Local - Blur scope +HISTORY_MSG_550;Local - Blur method +HISTORY_MSG_551;Local - Blur Luminance only +HISTORY_MSG_552;Local - Tone mapping +HISTORY_MSG_553;Local - TM compression strength +HISTORY_MSG_554;Local - TM gamma +HISTORY_MSG_555;Local - TM edge stopping +HISTORY_MSG_556;Local - TM scale +HISTORY_MSG_557;Local - TM Reweighting +HISTORY_MSG_558;Local - TM scope +HISTORY_MSG_559;Local - Retinex +HISTORY_MSG_560;Local - Retinex method +HISTORY_MSG_561;Local - Retinex strength +HISTORY_MSG_562;Local - Retinex chroma +HISTORY_MSG_563;Local - Retinex radius +HISTORY_MSG_564;Local - Retinex contrast +HISTORY_MSG_565;Local - scope +HISTORY_MSG_566;Local - Retinex Gain curve +HISTORY_MSG_567;Local - Retinex Inverse +HISTORY_MSG_568;Local - Sharpening +HISTORY_MSG_569;Local - Sh Radius +HISTORY_MSG_570;Local - Sh Amount +HISTORY_MSG_571;Local - Sh Damping +HISTORY_MSG_572;Local - Sh Iterations +HISTORY_MSG_573;Local - Sh Scope +HISTORY_MSG_574;Local - Sh Inverse +HISTORY_MSG_575;Local - CBDL +HISTORY_MSG_576;Local - cbdl mult +HISTORY_MSG_577;Local - cbdl chroma +HISTORY_MSG_578;Local - cbdl threshold +HISTORY_MSG_579;Local - cbdl scope +HISTORY_MSG_580;--unused-- +HISTORY_MSG_581;Local - deNoise lum f 1 +HISTORY_MSG_582;Local - deNoise lum c +HISTORY_MSG_583;Local - deNoise lum detail +HISTORY_MSG_584;Local - deNoise equalizer White-Black +HISTORY_MSG_585;Local - deNoise chro f +HISTORY_MSG_586;Local - deNoise chro c +HISTORY_MSG_587;Local - deNoise chro detail +HISTORY_MSG_588;Local - deNoise equalizer Blue-Red +HISTORY_MSG_589;Local - deNoise bilateral +HISTORY_MSG_590;Local - deNoise Scope +HISTORY_MSG_591;Local - Avoid color shift +HISTORY_MSG_592;Local - Sh Contrast +HISTORY_MSG_593;Local - Local contrast +HISTORY_MSG_594;Local - Local contrast radius +HISTORY_MSG_595;Local - Local contrast amount +HISTORY_MSG_596;Local - Local contrast darkness +HISTORY_MSG_597;Local - Local contrast lightness +HISTORY_MSG_598;Local - Local contrast scope +HISTORY_MSG_599;Local - Retinex dehaze +HISTORY_MSG_600;Local - Soft Light enable +HISTORY_MSG_601;Local - Soft Light strength +HISTORY_MSG_602;Local - Soft Light scope +HISTORY_MSG_603;Local - Sh Blur radius +HISTORY_MSG_605;Local - Mask preview choice +HISTORY_MSG_606;Local Spot selected +HISTORY_MSG_607;Local - Color Mask C +HISTORY_MSG_608;Local - Color Mask L +HISTORY_MSG_609;Local - Exp Mask C +HISTORY_MSG_610;Local - Exp Mask L +HISTORY_MSG_611;Local - Color Mask H +HISTORY_MSG_612;Local - Color Structure +HISTORY_MSG_613;Local - Exp Structure +HISTORY_MSG_614;Local - Exp Mask H +HISTORY_MSG_615;Local - Blend color +HISTORY_MSG_616;Local - Blend Exp +HISTORY_MSG_617;Local - Blur Exp +HISTORY_MSG_618;Local - Use Color Mask +HISTORY_MSG_619;Local - Use Exp Mask +HISTORY_MSG_620;Local - Blur col +HISTORY_MSG_621;Local - Exp inverse +HISTORY_MSG_622;Local - Exclude structure +HISTORY_MSG_623;Local - Exp Chroma compensation +HISTORY_MSG_624;Local - Color correction grid +HISTORY_MSG_625;Local - Color correction strength +HISTORY_MSG_626;Local - Color correction Method +HISTORY_MSG_627;Local - Shadow Highlight +HISTORY_MSG_628;Local - SH Highlight +HISTORY_MSG_629;Local - SH H tonalwidth +HISTORY_MSG_630;Local - SH Shadows +HISTORY_MSG_631;Local - SH S tonalwidth +HISTORY_MSG_632;Local - SH radius +HISTORY_MSG_633;Local - SH Scope +HISTORY_MSG_634;Local - radius color +HISTORY_MSG_635;Local - radius Exp +HISTORY_MSG_636;Local - Tool added +HISTORY_MSG_637;Local - SH Mask C +HISTORY_MSG_638;Local - SH Mask L +HISTORY_MSG_639;Local - SH Mask H +HISTORY_MSG_640;Local - SH blend +HISTORY_MSG_641;Local - Use SH mask +HISTORY_MSG_642;Local - radius SH +HISTORY_MSG_643;Local - Blur SH +HISTORY_MSG_644;Local - inverse SH +HISTORY_MSG_645;Local - balance ΔE ab-L +HISTORY_MSG_646;Local - Exp mask chroma +HISTORY_MSG_647;Local - Exp mask gamma +HISTORY_MSG_648;Local - Exp mask slope +HISTORY_MSG_649;Local - Exp soft radius +HISTORY_MSG_650;Local - Color mask chroma +HISTORY_MSG_651;Local - Color mask gamma +HISTORY_MSG_652;Local - Color mask slope +HISTORY_MSG_653;Local - SH mask chroma +HISTORY_MSG_654;Local - SH mask gamma +HISTORY_MSG_655;Local - SH mask slope +HISTORY_MSG_656;Local - Color soft radius +HISTORY_MSG_657;Local - Retinex Reduce artifacts +HISTORY_MSG_658;Local - CBDL soft radius +HISTORY_MSG_659;Local Spot transition-decay +HISTORY_MSG_660;Local - cbdl clarity +HISTORY_MSG_661;Local - cbdl contrast residual +HISTORY_MSG_662;Local - deNoise lum f 0 +HISTORY_MSG_663;Local - deNoise lum f 2 +HISTORY_MSG_664;--unused-- +HISTORY_MSG_665;Local - cbdl mask Blend +HISTORY_MSG_666;Local - cbdl mask radius +HISTORY_MSG_667;Local - cbdl mask chroma +HISTORY_MSG_668;Local - cbdl mask gamma +HISTORY_MSG_669;Local - cbdl mask slope +HISTORY_MSG_670;Local - cbdl mask C +HISTORY_MSG_671;Local - cbdl mask L +HISTORY_MSG_672;Local - cbdl mask CL +HISTORY_MSG_673;Local - Use cbdl mask +HISTORY_MSG_674;Local - Tool removed +HISTORY_MSG_675;Local - TM soft radius +HISTORY_MSG_676;Local Spot transition-differentiation +HISTORY_MSG_677;Local - TM amount +HISTORY_MSG_678;Local - TM saturation +HISTORY_MSG_679;Local - Retinex mask C +HISTORY_MSG_680;Local - Retinex mask L +HISTORY_MSG_681;Local - Retinex mask CL +HISTORY_MSG_682;Local - Retinex mask +HISTORY_MSG_683;Local - Retinex mask Blend +HISTORY_MSG_684;Local - Retinex mask radius +HISTORY_MSG_685;Local - Retinex mask chroma +HISTORY_MSG_686;Local - Retinex mask gamma +HISTORY_MSG_687;Local - Retinex mask slope +HISTORY_MSG_688;Local - Tool removed +HISTORY_MSG_689;Local - Retinex mask transmission map +HISTORY_MSG_690;Local - Retinex scale +HISTORY_MSG_691;Local - Retinex darkness +HISTORY_MSG_692;Local - Retinex lightness +HISTORY_MSG_693;Local - Retinex threshold +HISTORY_MSG_694;Local - Retinex Laplacian threshold +HISTORY_MSG_695;Local - Soft method +HISTORY_MSG_696;Local - Retinex Normalize +HISTORY_MSG_697;Local - TM Normalize +HISTORY_MSG_698;Local - Local contrast Fast Fourier +HISTORY_MSG_699;Local - Retinex Fast Fourier +HISTORY_MSG_701;Local - Exp Shadows +HISTORY_MSG_702;Local - Exp Method +HISTORY_MSG_703;Local - Exp Laplacian threshold +HISTORY_MSG_704;Local - Exp PDE balance +HISTORY_MSG_705;Local - Exp linearity +HISTORY_MSG_706;Local - TM mask C +HISTORY_MSG_707;Local - TM mask L +HISTORY_MSG_708;Local - TM mask CL +HISTORY_MSG_709;Local - use TM mask +HISTORY_MSG_710;Local - TM mask Blend +HISTORY_MSG_711;Local - TM mask radius +HISTORY_MSG_712;Local - TM mask chroma +HISTORY_MSG_713;Local - TM mask gamma +HISTORY_MSG_714;Local - TM mask slope +HISTORY_MSG_716;Local - Local method +HISTORY_MSG_717;Local - Local contrast +HISTORY_MSG_718;Local - Local contrast levels +HISTORY_MSG_719;Local - Local contrast residual L +HISTORY_MSG_720;Local - Blur mask C +HISTORY_MSG_721;Local - Blur mask L +HISTORY_MSG_722;Local - Blur mask CL +HISTORY_MSG_723;Local - use Blur mask +HISTORY_MSG_725;Local - Blur mask Blend +HISTORY_MSG_726;Local - Blur mask radius +HISTORY_MSG_727;Local - Blur mask chroma +HISTORY_MSG_728;Local - Blur mask gamma +HISTORY_MSG_729;Local - Blur mask slope +HISTORY_MSG_730;Local - Blur method +HISTORY_MSG_731;Local - median method +HISTORY_MSG_732;Local - median iterations +HISTORY_MSG_733;Local - soft radius +HISTORY_MSG_734;Local - detail +HISTORY_MSG_738;Local - Local contrast Merge L +HISTORY_MSG_739;Local - Local contrast Soft radius +HISTORY_MSG_740;Local - Local contrast Merge C +HISTORY_MSG_741;Local - Local contrast Residual C +HISTORY_MSG_742;Local - Exp Laplacian gamma +HISTORY_MSG_743;Local - Exp Fattal Amount +HISTORY_MSG_744;Local - Exp Fattal Detail +HISTORY_MSG_745;Local - Exp Fattal Offset +HISTORY_MSG_746;Local - Exp Fattal Sigma +HISTORY_MSG_747;Local Spot created +HISTORY_MSG_748;Local - Exp Denoise +HISTORY_MSG_749;Local - Reti Depth +HISTORY_MSG_750;Local - Reti Mode log - lin +HISTORY_MSG_751;Local - Reti Dehaze saturation +HISTORY_MSG_752;Local - Reti Offset +HISTORY_MSG_753;Local - Reti Transmission map +HISTORY_MSG_754;Local - Reti Clip +HISTORY_MSG_755;Local - TM use tm mask +HISTORY_MSG_756;Local - Exp use algo exposure mask +HISTORY_MSG_757;Local - Exp Laplacian mask +HISTORY_MSG_758;Local - Reti Laplacian mask +HISTORY_MSG_759;Local - Exp Laplacian mask +HISTORY_MSG_760;Local - Color Laplacian mask +HISTORY_MSG_761;Local - SH Laplacian mask +HISTORY_MSG_762;Local - cbdl Laplacian mask +HISTORY_MSG_763;Local - Blur Laplacian mask +HISTORY_MSG_764;Local - Solve PDE Laplacian mask +HISTORY_MSG_765;Local - deNoise Detail threshold +HISTORY_MSG_766;Local - Blur Fast Fourier +HISTORY_MSG_767;Local - Grain Iso +HISTORY_MSG_768;Local - Grain Strength +HISTORY_MSG_769;Local - Grain Scale +HISTORY_MSG_770;Local - Color Mask contrast curve +HISTORY_MSG_771;Local - Exp Mask contrast curve +HISTORY_MSG_772;Local - SH Mask contrast curve +HISTORY_MSG_773;Local - TM Mask contrast curve +HISTORY_MSG_774;Local - Reti Mask contrast curve +HISTORY_MSG_775;Local - CBDL Mask contrast curve +HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve +HISTORY_MSG_777;Local - Blur Mask local contrast curve +HISTORY_MSG_778;Local - Mask highlights +HISTORY_MSG_779;Local - Color Mask local contrast curve +HISTORY_MSG_780;Local - Color Mask shadows +HISTORY_MSG_781;Local - Contrast Mask Wavelet level +HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels +HISTORY_MSG_783;Local - Color Wavelet levels +HISTORY_MSG_784;Local - Mask ΔE +HISTORY_MSG_785;Local - Mask Scope ΔE +HISTORY_MSG_786;Local - SH method +HISTORY_MSG_787;Local - Equalizer multiplier +HISTORY_MSG_788;Local - Equalizer detail +HISTORY_MSG_789;Local - SH mask amount +HISTORY_MSG_790;Local - SH mask anchor +HISTORY_MSG_791;Local - Mask Short L curves +HISTORY_MSG_792;Local - Mask Luminance Background +HISTORY_MSG_793;Local - SH TRC gamma +HISTORY_MSG_794;Local - SH TRC slope +HISTORY_MSG_795;Local - Mask save restore image +HISTORY_MSG_796;Local - Recursive references +HISTORY_MSG_797;Local - Merge Original method +HISTORY_MSG_798;Local - Opacity +HISTORY_MSG_799;Local - Color RGB ToneCurve +HISTORY_MSG_800;Local - Color ToneCurve Method +HISTORY_MSG_801;Local - Color ToneCurve Special +HISTORY_MSG_802;Local - Contrast threshold +HISTORY_MSG_803;Local - Color Merge +HISTORY_MSG_804;Local - Color mask Structure +HISTORY_MSG_805;Local - Blur Noise mask Structure +HISTORY_MSG_806;Local - Color mask Structure as tool +HISTORY_MSG_807;Local - Blur Noise mask Structure as tool +HISTORY_MSG_808;Local - Color mask curve H(H) +HISTORY_MSG_809;Local - Vib mask curve C(C) +HISTORY_MSG_810;Local - Vib mask curve L(L) +HISTORY_MSG_811;Local - Vib mask curve LC(H) +HISTORY_MSG_813;Local - Use Vib mask +HISTORY_MSG_814;Local - Vib mask Blend +HISTORY_MSG_815;Local - Vib mask radius +HISTORY_MSG_816;Local - Vib mask chroma +HISTORY_MSG_817;Local - Vib mask gamma +HISTORY_MSG_818;Local - Vib mask slope +HISTORY_MSG_819;Local - Vib mask laplacian +HISTORY_MSG_820;Local - Vib mask contrast curve +HISTORY_MSG_821;Local - color grid background +HISTORY_MSG_822;Local - color background merge +HISTORY_MSG_823;Local - color background luminance +HISTORY_MSG_824;Local - Exp gradient mask strength +HISTORY_MSG_825;Local - Exp gradient mask angle +HISTORY_MSG_826;Local - Exp gradient strength +HISTORY_MSG_827;Local - Exp gradient angle +HISTORY_MSG_828;Local - SH gradient strength +HISTORY_MSG_829;Local - SH gradient angle +HISTORY_MSG_830;Local - Color gradient strength L +HISTORY_MSG_831;Local - Color gradient angle +HISTORY_MSG_832;Local - Color gradient strength C +HISTORY_MSG_833;Local - Gradient feather +HISTORY_MSG_834;Local - Color gradient strength H +HISTORY_MSG_835;Local - Vib gradient strength L +HISTORY_MSG_836;Local - Vib gradient angle +HISTORY_MSG_837;Local - Vib gradient strength C +HISTORY_MSG_838;Local - Vib gradient strength H +HISTORY_MSG_839;Local - Software complexity +HISTORY_MSG_840;Local - CL Curve +HISTORY_MSG_841;Local - LC curve +HISTORY_MSG_842;Local - Blur mask Radius +HISTORY_MSG_843;Local - Blur mask Contrast Threshold +HISTORY_MSG_844;Local - Blur mask FFTW +HISTORY_MSG_845;Local - Log encoding +HISTORY_MSG_846;Local - Log encoding auto +HISTORY_MSG_847;Local - Log encoding Source +HISTORY_MSG_849;Local - Log encoding Source auto +HISTORY_MSG_850;Local - Log encoding B_Ev +HISTORY_MSG_851;Local - Log encoding W_Ev +HISTORY_MSG_852;Local - Log encoding Target +HISTORY_MSG_853;Local - Log encodind loc contrast +HISTORY_MSG_854;Local - Log encodind Scope +HISTORY_MSG_855;Local - Log encoding Whole image +HISTORY_MSG_856;Local - Log encoding Shadows range +HISTORY_MSG_857;Local - Wavelet blur residual +HISTORY_MSG_858;Local - Wavelet blur luminance only +HISTORY_MSG_859;Local - Wavelet max blur +HISTORY_MSG_860;Local - Wavelet blur levels +HISTORY_MSG_861;Local - Wavelet contrast levels +HISTORY_MSG_862;Local - Wavelet contrast attenuation +HISTORY_MSG_863;Local - Wavelet merge original image +HISTORY_MSG_864;Local - Wavelet dir contrast attenuation +HISTORY_MSG_865;Local - Wavelet dir contrast delta +HISTORY_MSG_866;Local - Wavelet dir compression +HISTORY_MSG_868;Local - Balance ΔE C-H +HISTORY_MSG_869;Local - Denoise by level +HISTORY_MSG_870;Local - Wavelet mask curve H +HISTORY_MSG_871;Local - Wavelet mask curve C +HISTORY_MSG_872;Local - Wavelet mask curve L +HISTORY_MSG_873;Local - Wavelet mask +HISTORY_MSG_875;Local - Wavelet mask blend +HISTORY_MSG_876;Local - Wavelet mask smooth +HISTORY_MSG_877;Local - Wavelet mask chroma +HISTORY_MSG_878;Local - Wavelet mask contrast curve +HISTORY_MSG_879;Local - Wavelet contrast chroma +HISTORY_MSG_880;Local - Wavelet blur chroma +HISTORY_MSG_881;Local - Wavelet contrast offset +HISTORY_MSG_882;Local - Wavelet blur +HISTORY_MSG_883;Local - Wavelet contrast by level +HISTORY_MSG_884;Local - Wavelet dir contrast +HISTORY_MSG_885;Local - Wavelet tone mapping +HISTORY_MSG_886;Local - Wavelet tone mapping compress +HISTORY_MSG_887;Local - Wavelet tone mapping compress residual +HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold +HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength +HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle +HISTORY_MSG_891;Local - Contrast Wavelet Graduated +HISTORY_MSG_892;Local - Log Encoding Graduated Strength +HISTORY_MSG_893;Local - Log Encoding Graduated angle +HISTORY_MSG_894;Local - Color Preview dE +HISTORY_MSG_897;Local - Contrast Wavelet ES strength +HISTORY_MSG_898;Local - Contrast Wavelet ES radius +HISTORY_MSG_899;Local - Contrast Wavelet ES detail +HISTORY_MSG_900;Local - Contrast Wavelet ES gradient +HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low +HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high +HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast +HISTORY_MSG_904;Local - Contrast Wavelet ES first level +HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness +HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity +HISTORY_MSG_907;Local - Contrast Wavelet ES amplification +HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring +HISTORY_MSG_909;Local - Contrast Wavelet ES show +HISTORY_MSG_910;Local - Wavelet Edge performance +HISTORY_MSG_911;Local - Blur Chroma Luma +HISTORY_MSG_912;Local - Blur Guide filter strength +HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR +HISTORY_MSG_914;Local - Blur Wavelet Sigma BL +HISTORY_MSG_915;Local - Edge Wavelet Sigma ED +HISTORY_MSG_916;Local - Residual wavelet shadows +HISTORY_MSG_917;Local - Residual wavelet shadows threshold +HISTORY_MSG_918;Local - Residual wavelet highlights +HISTORY_MSG_919;Local - Residual wavelet highlights threshold +HISTORY_MSG_920;Local - Wavelet sigma LC +HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2 +HISTORY_MSG_922;Local - changes In Black and White +HISTORY_MSG_923;Local - Tool complexity mode +HISTORY_MSG_924;--unused-- +HISTORY_MSG_925;Local - Scope color tools +HISTORY_MSG_926;Local - Show mask type +HISTORY_MSG_927;Local - Shadow +HISTORY_MSG_928;Local - Common color mask +HISTORY_MSG_929;Local - Mask common scope +HISTORY_MSG_930;Local - Mask Common blend luma +HISTORY_MSG_931;Local - Mask Common enable +HISTORY_MSG_932;Local - Mask Common radius soft +HISTORY_MSG_933;Local - Mask Common laplacian +HISTORY_MSG_934;Local - Mask Common chroma +HISTORY_MSG_935;Local - Mask Common gamma +HISTORY_MSG_936;Local - Mask Common slope +HISTORY_MSG_937;Local - Mask Common curve C(C) +HISTORY_MSG_938;Local - Mask Common curve L(L) +HISTORY_MSG_939;Local - Mask Common curve LC(H) +HISTORY_MSG_940;Local - Mask Common structure as tool +HISTORY_MSG_941;Local - Mask Common structure strength +HISTORY_MSG_942;Local - Mask Common H(H) curve +HISTORY_MSG_943;Local - Mask Common FFT +HISTORY_MSG_944;Local - Mask Common Blur radius +HISTORY_MSG_945;Local - Mask Common contrast threshold +HISTORY_MSG_946;Local - Mask Common shadows +HISTORY_MSG_947;Local - Mask Common Contrast curve +HISTORY_MSG_948;Local - Mask Common Wavelet curve +HISTORY_MSG_949;Local - Mask Common Threshold levels +HISTORY_MSG_950;Local - Mask Common GF strength +HISTORY_MSG_951;Local - Mask Common GF angle +HISTORY_MSG_952;Local - Mask Common soft radius +HISTORY_MSG_953;Local - Mask Common blend chroma +HISTORY_MSG_954;Local - Show-hide tools +HISTORY_MSG_955;Local - Enable Spot +HISTORY_MSG_956;Local - CH Curve +HISTORY_MSG_957;Local - Denoise mode +HISTORY_MSG_958;Local - Show/hide settings +HISTORY_MSG_959;Local - Inverse blur +HISTORY_MSG_960;Local - Log encoding - cat16 +HISTORY_MSG_961;Local - Log encoding Ciecam +HISTORY_MSG_962;Local - Log encoding Absolute luminance source +HISTORY_MSG_963;Local - Log encoding Absolute luminance target +HISTORY_MSG_964;Local - Log encoding Surround +HISTORY_MSG_965;Local - Log encoding Saturation s +HISTORY_MSG_966;Local - Log encoding Contrast J +HISTORY_MSG_967;Local - Log encoding Mask curve C +HISTORY_MSG_968;Local - Log encoding Mask curve L +HISTORY_MSG_969;Local - Log encoding Mask curve H +HISTORY_MSG_970;Local - Log encoding Mask enable +HISTORY_MSG_971;Local - Log encoding Mask blend +HISTORY_MSG_972;Local - Log encoding Mask radius +HISTORY_MSG_973;Local - Log encoding Mask chroma +HISTORY_MSG_974;Local - Log encoding Mask contrast +HISTORY_MSG_975;Local - Log encoding Lightness J +HISTORY_MSG_977;Local - Log encoding Contrast Q +HISTORY_MSG_978;Local - Log encoding Sursource +HISTORY_MSG_979;Local - Log encoding Brightness Q +HISTORY_MSG_980;Local - Log encoding Colorfulness M +HISTORY_MSG_981;Local - Log encoding Strength +HISTORY_MSG_982;Local - Equalizer hue +HISTORY_MSG_983;Local - denoise threshold mask high +HISTORY_MSG_984;Local - denoise threshold mask low +HISTORY_MSG_985;Local - denoise Laplacian +HISTORY_MSG_986;Local - denoise reinforce +HISTORY_MSG_987;Local - GF recovery threshold +HISTORY_MSG_988;Local - GF threshold mask low +HISTORY_MSG_989;Local - GF threshold mask high +HISTORY_MSG_990;Local - Denoise recovery threshold +HISTORY_MSG_991;Local - Denoise threshold mask low +HISTORY_MSG_992;Local - Denoise threshold mask high +HISTORY_MSG_993;Local - Denoise Inverse algo +HISTORY_MSG_994;Local - GF Inverse algo +HISTORY_MSG_995;Local - Denoise decay +HISTORY_MSG_996;Local - Color recovery threshold +HISTORY_MSG_997;Local - Color threshold mask low +HISTORY_MSG_998;Local - Color threshold mask high +HISTORY_MSG_999;Local - Color decay +HISTORY_MSG_1000;Local - Denoise luminance gray +HISTORY_MSG_1001;Local - Log recovery threshold +HISTORY_MSG_1002;Local - Log threshold mask low +HISTORY_MSG_1003;Local - Log threshold mask high +HISTORY_MSG_1004;Local - Log decay +HISTORY_MSG_1005;Local - Exp recovery threshold +HISTORY_MSG_1006;Local - Exp threshold mask low +HISTORY_MSG_1007;Local - Exp threshold mask high +HISTORY_MSG_1008;Local - Exp decay +HISTORY_MSG_1009;Local - SH recovery threshold +HISTORY_MSG_1010;Local - SH threshold mask low +HISTORY_MSG_1011;Local - SH threshold mask high +HISTORY_MSG_1012;Local - SH decay +HISTORY_MSG_1013;Local - vib recovery threshold +HISTORY_MSG_1014;Local - vib threshold mask low +HISTORY_MSG_1015;Local - vib threshold mask high +HISTORY_MSG_1016;Local - vib decay +HISTORY_MSG_1017;Local - lc recovery threshold +HISTORY_MSG_1018;Local - lc threshold mask low +HISTORY_MSG_1019;Local - lc threshold mask high +HISTORY_MSG_1020;Local - lc decay +HISTORY_MSG_1021;Local - Denoise chrominance gray +HISTORY_MSG_1022;Local - TM recovery threshold +HISTORY_MSG_1023;Local - TM threshold mask low +HISTORY_MSG_1024;Local - TM threshold mask high +HISTORY_MSG_1025;Local - TM decay +HISTORY_MSG_1026;Local - cbdl recovery threshold +HISTORY_MSG_1027;Local - cbdl threshold mask low +HISTORY_MSG_1028;Local - cbdl threshold mask high +HISTORY_MSG_1029;Local - cbdl decay +HISTORY_MSG_1030;Local - reti recovery threshold +HISTORY_MSG_1031;Local - reti threshold mask low +HISTORY_MSG_1032;Local - reti threshold mask high +HISTORY_MSG_1033;Local - reti decay +HISTORY_MSG_1034;Local - Nlmeans - strength +HISTORY_MSG_1035;Local - Nlmeans - detail +HISTORY_MSG_1036;Local - Nlmeans - patch +HISTORY_MSG_1037;Local - Nlmeans - radius +HISTORY_MSG_1038;Local - Nlmeans - gamma +HISTORY_MSG_1039;Local - Grain - gamma +HISTORY_MSG_1040;Local - Spot - soft radius +HISTORY_MSG_1041;Local - Spot - Munsell +HISTORY_MSG_1042;Local - Log encoding - threshold +HISTORY_MSG_1043;Local - Exp - normalize +HISTORY_MSG_1044;Local - Local contrast strength +HISTORY_MSG_1045;Local - Color and Light strength +HISTORY_MSG_1046;Local - Denoise strength +HISTORY_MSG_1047;Local - SH and Tone Equalizer strength +HISTORY_MSG_1048;Local - DR and Exposure strength +HISTORY_MSG_1049;Local - TM strength +HISTORY_MSG_1050;Local - Log encoding chroma +HISTORY_MSG_1051;Local - Residual wavelet gamma +HISTORY_MSG_1052;Local - Residual wavelet slope +HISTORY_MSG_1053;Local - Denoise gamma +HISTORY_MSG_1054;Local - Wavelet gamma +HISTORY_MSG_1055;Local - Color and Light gamma +HISTORY_MSG_1056;Local - DR and Exposure gamma +HISTORY_MSG_1057;Local - CIECAM Enabled +HISTORY_MSG_1058;Local - CIECAM Overall strength +HISTORY_MSG_1059;Local - CIECAM Autogray +HISTORY_MSG_1060;Local - CIECAM Mean luminance source +HISTORY_MSG_1061;Local - CIECAM Source absolute +HISTORY_MSG_1062;Local - CIECAM Surround Source +HISTORY_MSG_1063;Local - CIECAM Saturation +HISTORY_MSG_1064;Local - CIECAM Chroma +HISTORY_MSG_1065;Local - CIECAM lightness J +HISTORY_MSG_1066;Local - CIECAM brightness +HISTORY_MSG_1067;Local - CIECAM Contrast J +HISTORY_MSG_1068;Local - CIECAM threshold +HISTORY_MSG_1069;Local - CIECAM contrast Q +HISTORY_MSG_1070;Local - CIECAM colorfullness +HISTORY_MSG_1071;Local - CIECAM Absolute luminance +HISTORY_MSG_1072;Local - CIECAM Mean luminance +HISTORY_MSG_1073;Local - CIECAM Cat16 +HISTORY_MSG_1074;Local - CIECAM Local contrast +HISTORY_MSG_1075;Local - CIECAM Surround viewing +HISTORY_MSG_1076;Local - CIECAM Scope +HISTORY_MSG_1077;Local - CIECAM Mode +HISTORY_MSG_1078;Local - Red and skin protection +HISTORY_MSG_1079;Local - CIECAM Sigmoid strength J +HISTORY_MSG_1080;Local - CIECAM Sigmoid threshold +HISTORY_MSG_1081;Local - CIECAM Sigmoid blend +HISTORY_MSG_1082;Local - CIECAM Sigmoid Q BlackEv WhiteEv +HISTORY_MSG_1083;Local - CIECAM Hue +HISTORY_MSG_1084;Local - Uses Black Ev - White Ev +HISTORY_MSG_1085;Local - Jz lightness +HISTORY_MSG_1086;Local - Jz contrast +HISTORY_MSG_1087;Local - Jz chroma +HISTORY_MSG_1088;Local - Jz hue +HISTORY_MSG_1089;Local - Jz Sigmoid strength +HISTORY_MSG_1090;Local - Jz Sigmoid threshold +HISTORY_MSG_1091;Local - Jz Sigmoid blend +HISTORY_MSG_1092;Local - Jz adaptation +HISTORY_MSG_1093;Local - CAM model +HISTORY_MSG_1094;Local - Jz highligths +HISTORY_MSG_1095;Local - Jz highligths thr +HISTORY_MSG_1096;Local - Jz shadows +HISTORY_MSG_1097;Local - Jz shadows thr +HISTORY_MSG_1098;Local - Jz radius SH +HISTORY_MSG_1099;Local - Cz(Hz) Curve +HISTORY_MSG_1100;Local - Jz reference 100 +HISTORY_MSG_1101;Local - Jz PQ remap +HISTORY_MSG_1102;Local - Jz(Hz) Curve +HISTORY_MSG_1103;Local - Vibrance gamma +HISTORY_MSG_1104;Local - Sharp gamma +HISTORY_MSG_1105;Local - CIECAM Tone method +HISTORY_MSG_1106;Local - CIECAM Tone curve +HISTORY_MSG_1107;Local - CIECAM Color method +HISTORY_MSG_1108;Local - CIECAM Color curve +HISTORY_MSG_1109;Local - Jz(Jz) curve +HISTORY_MSG_1110;Local - Cz(Cz) curve +HISTORY_MSG_1111;Local - Cz(Jz) curve +HISTORY_MSG_1112;Local - forcejz +HISTORY_MSG_1113;Local - HDR PQ +HISTORY_MSG_1114;Local - Cie mask enable +HISTORY_MSG_1115;Local - Cie mask curve C +HISTORY_MSG_1116;Local - Cie mask curve L +HISTORY_MSG_1117;Local - Cie mask curve H +HISTORY_MSG_1118;Local - Cie mask blend +HISTORY_MSG_1119;Local - Cie mask radius +HISTORY_MSG_1120;Local - Cie mask chroma +HISTORY_MSG_1121;Local - Cie mask contrast curve +HISTORY_MSG_1122;Local - Cie mask recovery threshold +HISTORY_MSG_1123;Local - Cie mask recovery dark +HISTORY_MSG_1124;Local - Cie mask recovery light +HISTORY_MSG_1125;Local - Cie mask recovery decay +HISTORY_MSG_1126;Local - Cie mask laplacian +HISTORY_MSG_1127;Local - Cie mask gamma +HISTORY_MSG_1128;Local - Cie mask slope +HISTORY_MSG_1129;Local - Cie Relative luminance +HISTORY_MSG_1130;Local - Cie Saturation Jz +HISTORY_MSG_1131;Local - Mask denoise chroma +HISTORY_MSG_1132;Local - Cie Wav sigma Jz +HISTORY_MSG_1133;Local - Cie Wav level Jz +HISTORY_MSG_1134;Local - Cie Wav local contrast Jz +HISTORY_MSG_1135;Local - Cie Wav clarity Jz +HISTORY_MSG_1136;Local - Cie Wav clarity Cz +HISTORY_MSG_1137;Local - Cie Wav clarity Soft +HISTORY_MSG_1138;Local - Local - Hz(Hz) Curve +HISTORY_MSG_1139;Local - Jz soft Curves H +HISTORY_MSG_1140;Local - Jz Threshold chroma +HISTORY_MSG_1141;Local - chroma curve Jz(Hz) +HISTORY_MSG_1142;Local - strength soft +HISTORY_MSG_1143;Local - Jz blackev +HISTORY_MSG_1144;Local - Jz whiteev +HISTORY_MSG_1145;Local - Jz Log encoding +HISTORY_MSG_1146;Local - Jz Log encoding target gray +HISTORY_MSG_1147;Local - Jz BlackEv WhiteEv +HISTORY_MSG_1148;Local - Jz Sigmoid +HISTORY_MSG_1149;Local - Q Sigmoid +HISTORY_MSG_1150;Local - Log encoding Q instead Sigmoid Q +HISTORY_MSG_BLSHAPE;Blur by level +HISTORY_MSG_BLURCWAV;Blur chroma +HISTORY_MSG_BLURWAV;Blur luminance +HISTORY_MSG_BLUWAV;Attenuation response +HISTORY_MSG_CATCAT;CAL - Settings - Mode +HISTORY_MSG_CATCOMPLEX;CAL - Settings - Complexity +HISTORY_MSG_CATMODEL;CAL - Settings - CAM HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction @@ -743,27 +1398,53 @@ 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_COMPLEX;Wavelet complexity +HISTORY_MSG_COMPLEXRETI;Retinex complexity HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth HISTORY_MSG_DEHAZE_ENABLED;Haze Removal -HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only +HISTORY_MSG_DEHAZE_SATURATION;Dehaze - Saturation 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_EDGEFFECT;Edge Attenuation response +HISTORY_MSG_FF_FROMMETADATA;Flat-Field - From Metadata +HISTORY_MSG_FILMNEGATIVE_BALANCE;FN - Reference output +HISTORY_MSG_FILMNEGATIVE_COLORSPACE;Film negative color space HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative +HISTORY_MSG_FILMNEGATIVE_REF_SPOT;FN - Reference input HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values +HISTORY_MSG_GAMUTMUNSEL;Gamut-Munsell HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +HISTORY_MSG_HLBL;Color propagation - blur +HISTORY_MSG_HLTH;Inpaint opposed - gain threshold +HISTORY_MSG_ICL_LABGRIDCIEXY;Cie xy +HISTORY_MSG_ICM_AINTENT;Abstract profile intent +HISTORY_MSG_ICM_BLUX;Primaries Blue X +HISTORY_MSG_ICM_BLUY;Primaries Blue Y +HISTORY_MSG_ICM_FBW;Black and White +HISTORY_MSG_ICM_GAMUT;Gamut control +HISTORY_MSG_ICM_GREX;Primaries Green X +HISTORY_MSG_ICM_GREY;Primaries Green Y 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_ICM_PRESER;Preserve neutral +HISTORY_MSG_ICM_REDX;Primaries Red X +HISTORY_MSG_ICM_REDY;Primaries Red Y +HISTORY_MSG_ICM_WORKING_GAMMA;TRC - Gamma +HISTORY_MSG_ICM_WORKING_ILLUM_METHOD;Illuminant method +HISTORY_MSG_ICM_WORKING_PRIM_METHOD;Primaries method +HISTORY_MSG_ICM_WORKING_SLOPE;TRC - Slope +HISTORY_MSG_ICM_WORKING_TRC_METHOD;TRC method +HISTORY_MSG_ILLUM;CAL - SC - Illuminant 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_LOCAL_GAMUTMUNSEL;Local - Gamut-Munsell +HISTORY_MSG_LOCALLAB_TE_PIVOT;Local - Equalizer pivot HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold @@ -773,26 +1454,93 @@ HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost +HISTORY_MSG_PERSP_CAM_ANGLE;Perspective - Camera +HISTORY_MSG_PERSP_CAM_FL;Perspective - Camera +HISTORY_MSG_PERSP_CAM_SHIFT;Perspective - Camera +HISTORY_MSG_PERSP_CTRL_LINE;Perspective - Control lines +HISTORY_MSG_PERSP_METHOD;Perspective - Method +HISTORY_MSG_PERSP_PROJ_ANGLE;Perspective - Recovery +HISTORY_MSG_PERSP_PROJ_ROTATE;Perspective - PCA rotation +HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA +HISTORY_MSG_PIXELSHIFT_AVERAGE;PS - Average 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_PREPROCWB_MODE;Preprocess WB Mode +HISTORY_MSG_PROTAB;Protection HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +HISTORY_MSG_RANGEAB;Range ab 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_RESIZE_LONGEDGE;Resize - Long Edge +HISTORY_MSG_RESIZE_SHORTEDGE;Resize - Short Edge HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +HISTORY_MSG_SIGMACOL;Chroma Attenuation response +HISTORY_MSG_SIGMADIR;Dir Attenuation response +HISTORY_MSG_SIGMAFIN;Final contrast Attenuation response +HISTORY_MSG_SIGMATON;Toning Attenuation response HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +HISTORY_MSG_SPOT;Spot removal +HISTORY_MSG_SPOT_ENTRY;Spot removal - Point modif. +HISTORY_MSG_TEMPOUT;CAM02 automatic temperature +HISTORY_MSG_THRESWAV;Balance threshold HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +HISTORY_MSG_TONE_EQUALIZER_BANDS;Tone equalizer - Bands +HISTORY_MSG_TONE_EQUALIZER_ENABLED;Tone equalizer +HISTORY_MSG_TONE_EQUALIZER_PIVOT;Tone equalizer - Pivot +HISTORY_MSG_TONE_EQUALIZER_REGULARIZATION;Tone equalizer - Regularization +HISTORY_MSG_TONE_EQUALIZER_SHOW_COLOR_MAP;Tone equalizer - Tonal map +HISTORY_MSG_TRANS_METHOD;Geometry - Method +HISTORY_MSG_WAVBALCHROM;Equalizer chrominance +HISTORY_MSG_WAVBALLUM;Equalizer luminance +HISTORY_MSG_WAVBL;Blur levels +HISTORY_MSG_WAVCHR;Blur levels - blur chroma +HISTORY_MSG_WAVCHROMCO;Chroma coarse +HISTORY_MSG_WAVCHROMFI;Chroma fine +HISTORY_MSG_WAVCLARI;Clarity +HISTORY_MSG_WAVDENLH;Level 5 +HISTORY_MSG_WAVDENOISE;Local contrast +HISTORY_MSG_WAVDENOISEH;High levels Local contrast +HISTORY_MSG_WAVDETEND;Details soft +HISTORY_MSG_WAVEDGS;Edge stopping +HISTORY_MSG_WAVGUIDH;Local contrast-Hue equalizer +HISTORY_MSG_WAVHUE;Equalizer hue +HISTORY_MSG_WAVLABGRID_VALUE;Toning - exclude colors +HISTORY_MSG_WAVLEVDEN;High level local contrast +HISTORY_MSG_WAVLEVELSIGM;Denoise - radius +HISTORY_MSG_WAVLEVSIGM;Radius +HISTORY_MSG_WAVLIMDEN;Interaction 56 14 +HISTORY_MSG_WAVLOWTHR;Threshold low contrast +HISTORY_MSG_WAVMERGEC;Merge C +HISTORY_MSG_WAVMERGEL;Merge L +HISTORY_MSG_WAVMIXMET;Reference local contrast +HISTORY_MSG_WAVOFFSET;Offset +HISTORY_MSG_WAVOLDSH;Old algorithm +HISTORY_MSG_WAVQUAMET;Denoise mode +HISTORY_MSG_WAVRADIUS;Radius shadows-highlights +HISTORY_MSG_WAVSCALE;Scale +HISTORY_MSG_WAVSHOWMASK;Show wavelet mask +HISTORY_MSG_WAVSIGM;Sigma +HISTORY_MSG_WAVSIGMA;Attenuation response +HISTORY_MSG_WAVSLIMET;Method +HISTORY_MSG_WAVSOFTRAD;Soft radius clarity +HISTORY_MSG_WAVSOFTRADEND;Soft radius final +HISTORY_MSG_WAVSTREND;Strength soft +HISTORY_MSG_WAVTHRDEN;Threshold local contrast +HISTORY_MSG_WAVTHREND;Threshold local contrast +HISTORY_MSG_WAVUSHAMET;Clarity method +HISTORY_MSG_WBALANCE_OBSERVER10;Observer 10° 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_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 @@ -804,11 +1552,12 @@ ICCPROFCREATOR_ILL_41;D41 ICCPROFCREATOR_ILL_50;D50 ICCPROFCREATOR_ILL_55;D55 ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_63;D63 : DCI-P3 Theater 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_ILL_TOOLTIP;You can set the illuminant for ICC v4 profiles and also for ICC v2 profiles. ICCPROFCREATOR_PRIMARIES;Primaries: ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 @@ -818,6 +1567,7 @@ ICCPROFCREATOR_PRIM_BETA;BetaRGB ICCPROFCREATOR_PRIM_BLUX;Blue X ICCPROFCREATOR_PRIM_BLUY;Blue Y ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_DCIP3;DCI-P3 ICCPROFCREATOR_PRIM_GREX;Green X ICCPROFCREATOR_PRIM_GREY;Green Y ICCPROFCREATOR_PRIM_PROPH;Prophoto @@ -825,13 +1575,14 @@ 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_TOOLTIP;You can set custom primaries for ICC v4 profiles and also for ICC v2 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: +ICCPROFCREATOR_TRC_PRESET;Tone response curve +INSPECTOR_WINDOW_TITLE;Inspector IPTCPANEL_CATEGORY;Category IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. IPTCPANEL_CITY;City @@ -850,7 +1601,7 @@ IPTCPANEL_CREDITHINT;Enter who should be credited when this image is published. IPTCPANEL_DATECREATED;Date created 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_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_EMBEDDED;Embedded @@ -883,7 +1634,7 @@ 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\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_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e\nCurrent editor: MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen MAIN_FRAME_EDITOR;Editor @@ -909,7 +1660,7 @@ MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a c MAIN_MSG_QOVERWRITE;Do you want to overwrite it? 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_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-a MAIN_TAB_COLOR;Color @@ -926,6 +1677,8 @@ MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u MAIN_TAB_FILTER; Filter MAIN_TAB_INSPECT; Inspect MAIN_TAB_IPTC;IPTC +MAIN_TAB_LOCALLAB;Local +MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o MAIN_TAB_METADATA;Metadata MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m MAIN_TAB_RAW;Raw @@ -965,16 +1718,16 @@ NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Width: %1, Height: %2 NAVIGATOR_XY_NA;x: --, y: -- -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. +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 PARTIALPASTE_CHANNELMIXERBW;Black-and-white PARTIALPASTE_COARSETRANS;Coarse rotation/flipping -PARTIALPASTE_COLORAPP;CIECAM02 +PARTIALPASTE_COLORAPP;Color Appearance & Lighting PARTIALPASTE_COLORGROUP;Color Related Settings PARTIALPASTE_COLORTONING;Color toning PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill @@ -994,9 +1747,10 @@ PARTIALPASTE_EQUALIZER;Wavelet levels PARTIALPASTE_EVERYTHING;Everything PARTIALPASTE_EXIFCHANGES;Exif PARTIALPASTE_EXPOSURE;Exposure -PARTIALPASTE_FILMNEGATIVE;Film Negative +PARTIALPASTE_FILMNEGATIVE;Film negative PARTIALPASTE_FILMSIMULATION;Film simulation PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection +PARTIALPASTE_FLATFIELDFROMMETADATA;Flat-field from Metadata PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field blur type PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control @@ -1010,6 +1764,8 @@ PARTIALPASTE_LABCURVE;L*a*b* adjustments PARTIALPASTE_LENSGROUP;Lens Related Settings PARTIALPASTE_LENSPROFILE;Profiled lens correction PARTIALPASTE_LOCALCONTRAST;Local contrast +PARTIALPASTE_LOCALLAB;Local Adjustments +PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings PARTIALPASTE_METADATA;Metadata mode PARTIALPASTE_METAGROUP;Metadata settings PARTIALPASTE_PCVIGNETTE;Vignette filter @@ -1019,6 +1775,7 @@ PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +PARTIALPASTE_PREPROCWB;Preprocess White Balance PARTIALPASTE_PRSHARPENING;Post-resize sharpening PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift @@ -1043,7 +1800,9 @@ PARTIALPASTE_SHARPENEDGE;Edges PARTIALPASTE_SHARPENING;Sharpening (USM/RL) PARTIALPASTE_SHARPENMICRO;Microcontrast PARTIALPASTE_SOFTLIGHT;Soft light +PARTIALPASTE_SPOT;Spot removal PARTIALPASTE_TM_FATTAL;Dynamic range compression +PARTIALPASTE_TONE_EQUALIZER;Tone equalizer PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance @@ -1072,17 +1831,25 @@ PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing pr PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height +PREFERENCES_CAMERAPROFILESDIR;Camera profiles directory 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_CIE;Ciecam +PREFERENCES_CIEARTIF;Avoid artifacts +PREFERENCES_WBA;White Balance 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_COMPLEXITYLOC;Default complexity for Local Adjustments +PREFERENCES_COMPLEXITY_EXP;Advanced +PREFERENCES_COMPLEXITY_NORM;Standard +PREFERENCES_COMPLEXITY_SIMP;Basic PREFERENCES_CROP;Crop Editing PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop @@ -1095,7 +1862,7 @@ 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_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 @@ -1114,7 +1881,18 @@ PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... PREFERENCES_DIRSOFTWARE;Installation directory PREFERENCES_EDITORCMDLINE;Custom command line PREFERENCES_EDITORLAYOUT;Editor layout +PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE;Bypass output profile +PREFERENCES_EXTEDITOR_DIR;Output directory +PREFERENCES_EXTEDITOR_DIR_CURRENT;Same as input image +PREFERENCES_EXTEDITOR_DIR_CUSTOM;Custom +PREFERENCES_EXTEDITOR_DIR_TEMP;OS temp dir +PREFERENCES_EXTEDITOR_FLOAT32;32-bit float TIFF output PREFERENCES_EXTERNALEDITOR;External Editor +PREFERENCES_EXTERNALEDITOR_CHANGE;Change Application +PREFERENCES_EXTERNALEDITOR_CHANGE_FILE;Change Executable +PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND;Command +PREFERENCES_EXTERNALEDITOR_COLUMN_NAME;Name +PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND;Native command PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser PREFERENCES_FLATFIELDFOUND;Found @@ -1131,6 +1909,7 @@ PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for render PREFERENCES_HLTHRESHOLD;Threshold for clipped highlights PREFERENCES_ICCDIR;Directory containing color profiles PREFERENCES_IMPROCPARAMS;Default Processing Profile +PREFERENCES_INSPECTORWINDOW;Open inspector in own window or fullscreen 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. @@ -1141,12 +1920,13 @@ PREFERENCES_INTENT_SATURATION;Saturation PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited PREFERENCES_LANG;Language PREFERENCES_LANGAUTODETECT;Use system language +PREFERENCES_LENSPROFILESDIR;Lens profiles directory PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -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_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_MONINTENT;Default rendering intent PREFERENCES_MONITOR;Monitor @@ -1188,7 +1968,7 @@ PREFERENCES_PRTINTENT;Rendering intent 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_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 tool collapsed/expanded state now PREFERENCES_SELECTLANG;Select language PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings @@ -1199,10 +1979,11 @@ PREFERENCES_SHOWBASICEXIF;Show basic Exif info PREFERENCES_SHOWDATETIME;Show date and time PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar +PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows PREFERENCES_SINGLETAB;Single Editor Tab Mode PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -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_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_QUEUEDONE;Queue processing done PREFERENCES_SND_THRESHOLDSECS;After seconds @@ -1210,6 +1991,7 @@ PREFERENCES_STARTUPIMDIR;Image Directory at Startup PREFERENCES_TAB_BROWSER;File Browser PREFERENCES_TAB_COLORMGR;Color Management PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules +PREFERENCES_TAB_FAVORITES;Favorites PREFERENCES_TAB_GENERAL;General PREFERENCES_TAB_IMPROC;Image Processing PREFERENCES_TAB_PERFORMANCE;Performance @@ -1218,16 +2000,23 @@ 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_TOOLPANEL_AVAILABLETOOLS;Available Tools +PREFERENCES_TOOLPANEL_CLONE_FAVORITES;Keep favorite tools in original locations +PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP;If set, favorite tools will appear in both the favorites tab and their original tabs.\n\nNote: Enabling this option may result in a slight delay when switching tabs. +PREFERENCES_TOOLPANEL_FAVORITE;Favorite +PREFERENCES_TOOLPANEL_FAVORITESPANEL;Favorites Panel +PREFERENCES_TOOLPANEL_TOOL;Tool PREFERENCES_TP_LABEL;Tool panel: PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles PREFERENCES_WORKFLOW;Layout +PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling PROFILEPANEL_COPYPPASTE;Parameters to copy PROFILEPANEL_GLOBALPROFILES;Bundled profiles PROFILEPANEL_LABEL;Processing Profiles PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... 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_MODE_TOOLTIP;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_PCUSTOM;Custom @@ -1284,6 +2073,7 @@ 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_BIGTIFF;BigTIFF (no metadata support) SAVEDLG_FILEFORMAT;File format SAVEDLG_FILEFORMAT_FLOAT; floating-point SAVEDLG_FORCEFORMATOPTS;Force saving options @@ -1303,6 +2093,19 @@ SAVEDLG_WARNFILENAME;File will be named SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. 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. +SORT_ASCENDING;Ascending +SORT_BY_NAME;By Name +SORT_BY_DATE;By Date +SORT_BY_EXIF;By EXIF +SORT_BY_RANK;By Rank +SORT_BY_LABEL;By Color Label +SORT_DESCENDING;Descending +TC_PRIM_BLUX;Bx +TC_PRIM_BLUY;By +TC_PRIM_GREX;Gx +TC_PRIM_GREY;Gy +TC_PRIM_REDX;Rx +TC_PRIM_REDY;Ry THRESHOLDSELECTOR_B;Bottom THRESHOLDSELECTOR_BL;Bottom-left THRESHOLDSELECTOR_BR;Bottom-right @@ -1313,7 +2116,8 @@ THRESHOLDSELECTOR_TR;Top-right 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_PERSPECTIVE;Perspective Correction\n\nEdit control lines to correct perspective distortion. Click this button again to apply correction. +TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image. 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 TP_BWMIX_ALGO;Algorithm OYCPM TP_BWMIX_ALGO_LI;Linear @@ -1349,7 +2153,7 @@ TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer 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_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. @@ -1389,6 +2193,7 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Ed 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_ABSOLUTELUMINANCE;Absolute luminance +TP_COLORAPP_ADAPSCEN_TOOLTIP;Corresponds to the luminance in candelas per m2 at the time of shooting, calculated automatically from the exif data. TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1398,51 +2203,77 @@ TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parame 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_BRIGHT_TOOLTIP;Brightness in CIECAM is the amount of perceived light emanating from a stimulus. It differs from L*a*b* and RGB brightness. TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +TP_COLORAPP_CATCLASSIC;Classic +TP_COLORAPP_CATMET_TOOLTIP;Classic - traditional CIECAM operation. The chromatic adaptation transforms are applied separately on 'Scene conditions' and basic illuminant on the one hand, and on basic illuminant and 'Viewing conditions' on the other.\n\nSymmetric – The chromatic adaptation is based on the white balance. The 'Scene conditions', 'Image adjustments' and 'Viewing conditions' settings are neutralized.\n\nMixed – Same as the 'Classic' option but in this case, the chromatic adaptation is based on the white balance. +TP_COLORAPP_CATMOD;Mode +TP_COLORAPP_CATSYMGEN;Automatic Symmetric +TP_COLORAPP_CATSYMSPE;Mixed TP_COLORAPP_CHROMA;Chroma (C) 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_M_TOOLTIP;Colorfulness in CIECAM is the perceived amount of hue in relation to gray, an indicator that a stimulus appears to be more or less colored. 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_CHROMA_S_TOOLTIP;Saturation in CIECAM corresponds to the color of a stimulus in relation to its own brightness. It differs from L*a*b* and RGB saturation. +TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM corresponds to the color of a stimulus relative to the clarity of a stimulus that appears white under identical conditions. It differs from L*a*b* and RGB chroma. +TP_COLORAPP_CIECAT_DEGREE;Chromatic Adaptation Scene +TP_COLORAPP_CIECAT_DEGREEOUT;Chromatic Adaptation Viewing 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_CONTRAST_Q_TOOLTIP;Contrast (Q) in CIECAM is based on brightness. It differs from L*a*b* and RGB contrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Contrast (J) in CIECAM is based on lightness. It 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_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of J after CIECAM.\n\nJ is 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_CURVEEDITOR2_TOOLTIP;Same usage as with the first J(J) 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_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_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM.\nIf the 'Show CIECAM output histograms in CAL curves' checkbox is enabled, shows the histogram of C, S or M after CIECAM.\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;Show CIECAM output histograms in CAL curves +TP_COLORAPP_DATACIE_TOOLTIP;Affects histograms shown in Color Appearance & Lightning curves. Does not affect RawTherapee's main histogram.\n\nEnabled: show approximate values for J and C, S or M after the CIECAM adjustments.\nDisabled: show L*a*b* values before CIECAM adjustments. +TP_COLORAPP_DEGREE_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D65) into new values whose white point is that of the new illuminant - see WP model (for example D50 or D55). +TP_COLORAPP_DEGREOUT_TOOLTIP;CAT02/16 is a chromatic adaptation. It converts the values of an image whose white point is that of a given illuminant (for example D50) into new values whose white point is that of the new illuminant - see WP model (for example D75). +TP_COLORAPP_FREE;Free temp + tint + CAT02/16 +[output] +TP_COLORAPP_GAMUT;Use gamut control in L*a*b* mode +TP_COLORAPP_GEN;Settings +TP_COLORAPP_GEN_TOOLTIP;This module is based on the CIECAM color appearance models, which were designed to better simulate how human vision perceives colors under different lighting conditions, e.g. against different backgrounds. It takes into account the environment of each color and modifies its appearance to get as close as possible to human perception. It also adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic appearance is preserved across the scene and display environments. 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_HUE_TOOLTIP;Hue (h) is the degree to which a stimulus can be described as similar to a color described as red, green, blue and yellow. +TP_COLORAPP_IL41;D41 +TP_COLORAPP_IL50;D50 +TP_COLORAPP_IL55;D55 +TP_COLORAPP_IL60;D60 +TP_COLORAPP_IL65;D65 +TP_COLORAPP_IL75;D75 +TP_COLORAPP_ILA;Incandescent StdA 2856K +TP_COLORAPP_ILFREE;Free +TP_COLORAPP_ILLUM;Illuminant +TP_COLORAPP_ILLUM_TOOLTIP;Select the illuminant closest to the shooting conditions.\nIn general D50, but it can change depending on the time and latitude. +TP_COLORAPP_LABEL;Color Appearance & Lighting 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_LIGHT_TOOLTIP;Lightness in CIECAM is the clarity of a stimulus relative to the clarity of a stimulus that appears white under similar viewing conditions. It 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 by the user, the output device's white balance is set in Viewing Conditions. +TP_COLORAPP_MOD02;CAM02 +TP_COLORAPP_MOD16;CAM16 +TP_COLORAPP_MODEL;WP model +TP_COLORAPP_MODELCAT;CAM +TP_COLORAPP_MODELCAT_TOOLTIP;Allows you to choose between CAM02 or CAM16.\nCAM02 will sometimes be more accurate.\nCAM16 should generate fewer artifacts. +TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02/16] + [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 + tint + CAT02/16 + [output]: temp and tint 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_NEUTRAL_TOOLTIP;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_SOURCEF_TOOLTIP;Corresponds to the shooting conditions and how to bring the conditions and data back to a 'normal' area. Normal means average or standard conditions and data, i.e. without taking into account CIECAM corrections. TP_COLORAPP_SURROUND;Surround +TP_COLORAPP_SURROUNDSRC;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 slightly 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_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device. The darker the viewing conditions, the darker the image will become. Image brightness will not be changed when the viewing conditions are set to average. +TP_COLORAPP_SURSOURCE_TOOLTIP;Changes tones and colors to take into account the surround conditions of the scene lighting. The darker the surround conditions, the brighter the image will become. Image brightness will not be changed when the surround is set to average. TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness TP_COLORAPP_TCMODE_CHROMA;Chroma TP_COLORAPP_TCMODE_COLORF;Colorfulness @@ -1451,19 +2282,24 @@ 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_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMPOUT_TOOLTIP;Temperature and Tint.\nDepending on the choices made previously, the selected temperature is:\nWhite balance\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504\nFree. +TP_COLORAPP_TONECIE;Use CIECAM for tone mapping 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_VIEWINGF_TOOLTIP;Takes into account the support on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as its environment. This process will take the data coming from process 'Image Adjustments' and 'bring' it to the support in such a way that the viewing conditions and its environment are taken into account. 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_WBCAM;WB [RT+CAT02/16] + [output] TP_COLORAPP_WBRT;WB [RT] + [output] +TP_COLORAPP_YBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. +TP_COLORAPP_YBSCEN_TOOLTIP;Yb is the relative luminance of the background, expressed in % of gray. 18% gray corresponds to a background luminance of 50% expressed in CIE L.\nThe data is based on the mean luminance of the image. 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_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 @@ -1493,11 +2329,11 @@ 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_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_NEUTRAL_TOOLTIP;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 @@ -1515,6 +2351,7 @@ 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_FIXRATIO;Lock ratio +TP_CROP_GTCENTEREDSQUARE;Centered square TP_CROP_GTDIAGONALS;Rule of Diagonals TP_CROP_GTEPASSPORT;Biometric Passport TP_CROP_GTFRAME;Frame @@ -1540,7 +2377,7 @@ TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold TP_DEHAZE_DEPTH;Depth TP_DEHAZE_LABEL;Haze Removal -TP_DEHAZE_LUMINANCE;Luminance only +TP_DEHAZE_SATURATION;Saturation TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map TP_DEHAZE_STRENGTH;Strength TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones @@ -1553,7 +2390,7 @@ 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_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. @@ -1577,14 +2414,14 @@ TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across 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_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_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. @@ -1612,7 +2449,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tone 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_AMOUNT;Amount -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_DISTORTION_AUTO_TOOLTIP;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_DISTORTION_LABEL;Distortion Correction TP_EPD_EDGESTOPPING;Edge stopping TP_EPD_GAMMA;Gamma @@ -1621,19 +2458,19 @@ TP_EPD_REWEIGHTINGITERATES;Reweighting iterates TP_EPD_SCALE;Scale TP_EPD_STRENGTH;Strength 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_AUTOLEVELS_TOOLTIP;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_CLIP_TOOLTIP;The fraction of pixels to be clipped in Auto Levels operation. TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold TP_EXPOSURE_COMPRSHADOWS;Shadow compression TP_EXPOSURE_CONTRAST;Contrast 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_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. @@ -1650,11 +2487,21 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points TP_EXPOS_WHITEPOINT_LABEL;Raw White Points TP_FILMNEGATIVE_BLUE;Blue ratio -TP_FILMNEGATIVE_GREEN;Reference exponent (contrast) -TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards. +TP_FILMNEGATIVE_BLUEBALANCE;Cool/Warm +TP_FILMNEGATIVE_COLORSPACE;Inversion color space: +TP_FILMNEGATIVE_COLORSPACE_INPUT;Input color space +TP_FILMNEGATIVE_COLORSPACE_TOOLTIP;Select the color space used to perform the negative inversion:\nInput color space : perform inversion before the input profile is applied, as in the previous versions of RT.\nWorking color space : perform inversion after input profile, using the currently selected working profile. +TP_FILMNEGATIVE_COLORSPACE_WORKING;Working color space +TP_FILMNEGATIVE_GREEN;Reference exponent +TP_FILMNEGATIVE_GREENBALANCE;Magenta/Green +TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. TP_FILMNEGATIVE_LABEL;Film Negative +TP_FILMNEGATIVE_OUT_LEVEL;Output level TP_FILMNEGATIVE_PICK;Pick neutral spots TP_FILMNEGATIVE_RED;Red ratio +TP_FILMNEGATIVE_REF_LABEL;Input RGB: %1 +TP_FILMNEGATIVE_REF_PICK;Pick white balance spot +TP_FILMNEGATIVE_REF_TOOLTIP;Pick a gray patch for white-balancing the output, positive image. 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 @@ -1668,6 +2515,7 @@ 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, value 0 is used. +TP_FLATFIELD_FROMMETADATA;From Metadata TP_FLATFIELD_LABEL;Flat-Field 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 @@ -1685,7 +2533,10 @@ TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. TP_HLREC_BLEND;Blend TP_HLREC_CIELAB;CIELab Blending TP_HLREC_COLOR;Color Propagation +TP_HLREC_COLOROPP;Inpaint Opposed TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. +TP_HLREC_HLBLUR;Blur +TP_HLREC_HLTH;Gain threshold TP_HLREC_LABEL;Highlight reconstruction TP_HLREC_LUMINANCE;Luminance Recovery TP_HLREC_METHOD;Method: @@ -1703,7 +2554,10 @@ TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is 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_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_FBW;Black-and-White +TP_ICM_GAMUT;Gamut control +TP_ICM_ILLUMPRIM_TOOLTIP;Choose the illuminant closest to the shooting conditions.\nChanges can only be made when the 'Destination primaries' selection is set to 'Custom (sliders)'. TP_ICM_INPUTCAMERA;Camera standard 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. @@ -1717,26 +2571,69 @@ TP_ICM_INPUTNONE;No profile TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. TP_ICM_INPUTPROFILE;Input Profile TP_ICM_LABEL;Color Management +TP_ICM_LABGRID_CIEXY;R(x)=%1 R(y)=%2\nG(x)=%3 G(y)=%4\nB(x)=%5 B(y)=%6 +TP_ICM_NEUTRAL;Reset TP_ICM_NOICM;No ICM: sRGB Output TP_ICM_OUTPUTPROFILE;Output Profile +TP_ICM_OUTPUTPROFILE_TOOLTIP;By default all RTv4 or RTv2 profiles are with TRC - sRGB: g=2.4 s=12.92\n\nWith 'ICC Profile Creator' you can generate v4 or v2 profiles with the following choices;\n-Primaries: Aces AP0, Aces AP1, AdobeRGB, Prophoto, Rec2020, sRGB, Widegamut, BestRGB, BetaRGB, BruceRGB, Custom\n-TRC: BT709, sRGB, linear, standard g=2.2, standard g=1.8, Custom\n-Illuminant: D41, D50, D55, D60, D65, D80, stdA 2856K +TP_ICM_PRIMBLU_TOOLTIP;Primaries Blue:\nsRGB x=0.15 y=0.06\nAdobe x=0.15 y=0.06\nWidegamut x=0.157 y=0.018\nRec2020 x=0.131 y=0.046\nACES P1 x=0.128 y= 0.044\nACES P0 x=0.0001 y=-0.077\nProphoto x=0.0366 y=0.0001\nBruceRGB x=0.15 y=0.06\nBeta RGB x=0.1265 y=0.0352\nBestRGB x=0.131 y=0.046 +TP_ICM_PRIMGRE_TOOLTIP;Primaries Green:\nsRGB x=0.3 y=0.6\nAdobe x=0.21 y=0.71\nWidegamut x=0.115 y=0.826\nRec2020 x=0.17 y=0.797\nACES P1 x=0.165 y= 0.83\nACES P0 x=0.0 y=1.0\nProphoto x=0.1596 y=0.8404\nBruceRGB x=0.28 y=0.65\nBeta RGB x=0.1986 y=0.7551\nBest RGB x=0.2150 0.7750 +TP_ICM_PRIMILLUM_TOOLTIP;You can change an image from its original mode ('working profile') to a different mode ('destination primaries'). When you choose a different color mode for an image, you permanently change the color values in the image.\n\nChanging the 'primaries' is quite complex and difficult to use. It requires a lot of experimenting.\n It is capable of making exotic color adjustments as Channel Mixer primaries.\n Allows you to modify the camera calibration with Custom (sliders). +TP_ICM_PRIMRED_TOOLTIP;Primaries Red:\nsRGB x=0.64 y=0.33\nAdobe x=0.64 y=0.33\nWidegamut x=0.735 y=0.265\nRec2020 x=0.708 y=0.292\nACES P1 x=0.713 y= 0.293\nACES P0 x=0.7347 y=0.2653\nProphoto x=0.7347 y=0.2653\nBruceRGB x=0.64 y=0.33\nBeta RGB x=0.688 y=0.3112\nBestRGB x=0.7347 y=0.2653 TP_ICM_PROFILEINTENT;Rendering Intent +TP_ICM_REDFRAME;Custom Primaries 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_ICM_TRCFRAME;Abstract Profile +TP_ICM_TRCFRAME_TOOLTIP;Also known as 'synthetic' or 'virtual' profiles, which are applied at the end of the processing pipeline (prior to ciecam) allowing you to create custom image effects.\nYou can make changes to the:\n 'Tone response curve', which modifies the tones of the image.\n 'Illuminant' : which allows you to change the profile primaries to adapt them to the shooting conditions.\n 'Destination primaries': which allows you to change the destination primaries with two main uses - channel mixer and calibration.\nNote: Abstract profiles take into account the built-in Working profiles without modifying them. They do not work with custom Working profiles. +TP_ICM_TRC_TOOLTIP;Allows you to change the default sRGB 'Tone response curve' in RT (g=2.4 s=12.92).\nThis TRC modifies the tones of the image. The RGB and Lab values, histogram and output (screen, TIF, JPG) are changed:\n-Gamma acts mainly on light tones -Slope acts mainly on dark tones.\nYou can choose any pair of 'gamma and slope' (values >1) and the algorithm will ensure that there is continuity between the linear and parabolic parts of the curve.\nA selection other than 'none' activates the 'Illuminant' and 'Destination primaries' menus. TP_ICM_WORKINGPROFILE;Working Profile +TP_ICM_WORKING_CIEDIAG;CIE xy diagram +TP_ICM_WORKING_ILLU;Illuminant +TP_ICM_WORKING_ILLU_1500;Tungsten 1500K +TP_ICM_WORKING_ILLU_2000;Tungsten 2000K +TP_ICM_WORKING_ILLU_D41;D41 +TP_ICM_WORKING_ILLU_D50;D50 +TP_ICM_WORKING_ILLU_D55;D55 +TP_ICM_WORKING_ILLU_D60;D60 +TP_ICM_WORKING_ILLU_D65;D65 +TP_ICM_WORKING_ILLU_D80;D80 +TP_ICM_WORKING_ILLU_D120;D120 +TP_ICM_WORKING_ILLU_NONE;Default +TP_ICM_WORKING_ILLU_STDA;stdA 2875K +TP_ICM_WORKING_PRESER;Preserves Pastel tones +TP_ICM_WORKING_PRIM;Destination primaries +TP_ICM_WORKING_PRIMFRAME_TOOLTIP;When 'Custom CIE xy diagram' is selected in 'Destination- primaries'' combobox, you can modify the values of the 3 primaries directly on the graph.\nNote that in this case, the white point position on the graph will not be updated. +TP_ICM_WORKING_PRIM_AC0;ACESp0 +TP_ICM_WORKING_PRIM_ACE;ACESp1 +TP_ICM_WORKING_PRIM_ADOB;Adobe RGB +TP_ICM_WORKING_PRIM_BET;Beta RGB +TP_ICM_WORKING_PRIM_BRU;BruceRGB +TP_ICM_WORKING_PRIM_BST;BestRGB +TP_ICM_WORKING_PRIM_CUS;Custom (sliders) +TP_ICM_WORKING_PRIM_CUSGR;Custom (CIE xy Diagram) +TP_ICM_WORKING_PRIM_NONE;Default +TP_ICM_WORKING_PRIM_PROP;ProPhoto +TP_ICM_WORKING_PRIM_REC;Rec2020 +TP_ICM_WORKING_PRIM_SRGB;sRGB +TP_ICM_WORKING_PRIM_WID;WideGamut TP_ICM_WORKING_TRC;Tone response curve: +TP_ICM_WORKING_TRC_18;Prophoto g=1.8 +TP_ICM_WORKING_TRC_22;Adobe g=2.2 +TP_ICM_WORKING_TRC_BT709;BT709 g=2.22 s=4.5 TP_ICM_WORKING_TRC_CUSTOM;Custom TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_LIN;Linear g=1 TP_ICM_WORKING_TRC_NONE;None TP_ICM_WORKING_TRC_SLOPE;Slope +TP_ICM_WORKING_TRC_SRGB;sRGB g=2.4 s=12.92 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 -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. @@ -1755,26 +2652,28 @@ 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_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_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_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_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_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_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_LCREDSK_TOOLTIP;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_LENSGEOM_LIN;Linear +TP_LENSGEOM_LOG;Logarithmic TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected @@ -1790,12 +2689,808 @@ TP_LOCALCONTRAST_DARKNESS;Darkness level TP_LOCALCONTRAST_LABEL;Local Contrast TP_LOCALCONTRAST_LIGHTNESS;Lightness level TP_LOCALCONTRAST_RADIUS;Radius +TP_LOCALLAB_ACTIV;Luminance only +TP_LOCALLAB_ACTIVSPOT;Enable Spot +TP_LOCALLAB_ADJ;Equalizer Color +TP_LOCALLAB_AMOUNT;Amount +TP_LOCALLAB_ARTIF;Shape detection +TP_LOCALLAB_ARTIF_TOOLTIP;ΔE scope threshold increases the range of ΔE scope. High values are for very wide gamut images.\nIncreasing ΔE decay can improve shape detection, but can also reduce the scope. +TP_LOCALLAB_AUTOGRAY;Auto mean luminance (Yb%) +TP_LOCALLAB_AUTOGRAYCIE;Auto +TP_LOCALLAB_AVOID;Avoid color shift +TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction (Uniform Perceptual Lab).\nMunsell correction always disabled when Jz or CAM16 or Color Appearance and Lighting is used.\n\nDefault: Munsell.\nMunsell correction: fixes Lab mode hue drifts due to non-linearity, when chromaticity is changed (Uniform Perceptual Lab).\nLab: applies a gamut control, in relative colorimetric, Munsell is then applied.\nXYZ Absolute, applies gamut control, in absolute colorimetric, Munsell is then applied.\nXYZ Relative, applies gamut control, in relative colorimetric, Munsell is then applied. +TP_LOCALLAB_AVOIDMUN;Munsell correction only +TP_LOCALLAB_AVOIDMUN_TOOLTIP;Munsell correction always disabled when Jz or CAM16 is used. +TP_LOCALLAB_AVOIDRAD;Soft radius +TP_LOCALLAB_BALAN;ab-L balance (ΔE) +TP_LOCALLAB_BALANEXP;Laplacian balance +TP_LOCALLAB_BALANH;C-H balance (ΔE) +TP_LOCALLAB_BALAN_TOOLTIP;Changes the ΔE algorithm parameters.\nTakes into account more or less a*b* or L*, or more or less C or H.\nNot for Denoise. +TP_LOCALLAB_BASELOG;Shadows range (logarithm base) +TP_LOCALLAB_BILATERAL;Bilateral filter +TP_LOCALLAB_BLACK_EV;Black Ev +TP_LOCALLAB_BLCO;Chrominance only +TP_LOCALLAB_BLENDMASKCOL;Blend +TP_LOCALLAB_BLENDMASKMASK;Add/subtract luma mask +TP_LOCALLAB_BLENDMASKMASKAB;Add/subtract chroma mask +TP_LOCALLAB_BLENDMASKMASK_TOOLTIP;If this slider = 0 no action.\nAdd or subtract the mask from the original image. +TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image. +TP_LOCALLAB_BLGUID;Guided Filter +TP_LOCALLAB_BLINV;Inverse +TP_LOCALLAB_BLLC;Luminance & Chrominance +TP_LOCALLAB_BLLO;Luminance only +TP_LOCALLAB_BLMED;Median +TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal: direct blur and noise with all settings.\nInverse: blur and noise with all settings. Warning, some settings may give curious results. +TP_LOCALLAB_BLNOI_EXP;Blur & Noise +TP_LOCALLAB_BLNORM;Normal +TP_LOCALLAB_BLUFR;Blur/Grain & Denoise +TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n-blur the background by completely covering the image with an an RT-spot (high values for scope and transition and 'Normal' or 'Inverse' in checkbox).\n-Isolate the foreground by using one or more 'Excluding' RT-spot(s) and increase the scope.\n\nThis module (including the 'median' and 'Guided filter') can be used in addition to the main-menu noise reduction. +TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain +TP_LOCALLAB_BLURCOL;Radius +TP_LOCALLAB_BLURCOLDE_TOOLTIP;The image used to calculate dE is blurred slightly to avoid taking isolated pixels into account. +TP_LOCALLAB_BLURDE;Blur shape detection +TP_LOCALLAB_BLURLC;Luminance only +TP_LOCALLAB_BLURLEVELFRA;Blur levels +TP_LOCALLAB_BLURMASK_TOOLTIP;Uses a large-radius blur to create a mask that allows you to vary the contrast of the image and/or darken/lighten parts of it. +TP_LOCALLAB_BLURRMASK_TOOLTIP;Allows you to vary the 'radius' of the Gaussian blur (0 to 1000). +TP_LOCALLAB_BLUR_TOOLNAME;Blur/Grain & Denoise +TP_LOCALLAB_BLWH;All changes forced in Black-and-White +TP_LOCALLAB_BLWH_TOOLTIP;Force color components 'a' and 'b' to zero.\nUseful for black and white processing, or film simulation. +TP_LOCALLAB_BUTTON_ADD;Add +TP_LOCALLAB_BUTTON_DEL;Delete +TP_LOCALLAB_BUTTON_DUPL;Duplicate +TP_LOCALLAB_BUTTON_REN;Rename +TP_LOCALLAB_BUTTON_VIS;Show/Hide +TP_LOCALLAB_BWFORCE;Uses Black Ev & White Ev +TP_LOCALLAB_CAM16PQREMAP;HDR PQ (Peak Luminance) +TP_LOCALLAB_CAM16PQREMAP_TOOLTIP;PQ (Perceptual Quantizer) adapted to CAM16. Allows you to change the internal PQ function (usually 10000 cd/m2 - default 100 cd/m2 - disabled for 100 cd/m2).\nCan be used to adapt to different devices and images. +TP_LOCALLAB_CAM16_FRA;Cam16 Image Adjustments +TP_LOCALLAB_CAMMODE;CAM model +TP_LOCALLAB_CAMMODE_CAM16;CAM 16 +TP_LOCALLAB_CAMMODE_JZ;Jz Cz Hz +TP_LOCALLAB_CATAD;Chromatic adaptation/Cat16 +TP_LOCALLAB_CBDL;Contrast by Detail Levels +TP_LOCALLAB_CBDLCLARI_TOOLTIP;Enhances local contrast of the midtones. +TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Same as wavelets.\nThe first level (0) acts on 2x2 pixel details.\nThe last level (5) acts on 64x64 pixel details. +TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevents the sharpening of noise. +TP_LOCALLAB_CBDL_TOOLNAME;Contrast by Detail Levels +TP_LOCALLAB_CENTER_X;Center X +TP_LOCALLAB_CENTER_Y;Center Y +TP_LOCALLAB_CH;CL - LC +TP_LOCALLAB_CHROMA;Chrominance +TP_LOCALLAB_CHROMABLU;Chroma levels +TP_LOCALLAB_CHROMABLU_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +TP_LOCALLAB_CHROMACBDL;Chroma +TP_LOCALLAB_CHROMACB_TOOLTIP;Increases or reduces the effect depending on the luma settings.\nValues under 1 reduce the effect. Values greater than 1 increase the effect. +TP_LOCALLAB_CHROMALEV;Chroma levels +TP_LOCALLAB_CHROMASKCOL;Chroma +TP_LOCALLAB_CHROMASK_TOOLTIP;Changes the chroma of the mask if one exists (i.e. C(C) or LC(H) is activated). +TP_LOCALLAB_CHROML;Chroma (C) +TP_LOCALLAB_CHRRT;Chroma +TP_LOCALLAB_CIE;Color appearance (Cam16 & JzCzHz) +TP_LOCALLAB_CIEC;Use Ciecam environment parameters +TP_LOCALLAB_CIECAMLOG_TOOLTIP;This module is based on the CIECAM color appearance model which was designed to better simulate how human vision perceives colors under different lighting conditions.\nThe first Ciecam process 'Scene conditions' is carried out by Log encoding, it also uses 'Absolute luminance' at the time of shooting.\nThe second Ciecam process 'Image adjustments' is simplified and uses only 3 variables (local contrast, contrast J, saturation s).\nThe third Ciecam process 'Viewing conditions' adapts the output to the intended viewing conditions (monitor, TV, projector, printer, etc.) so that the chromatic and contrast appearance is preserved across the display environment. +TP_LOCALLAB_CIECOLORFRA;Color +TP_LOCALLAB_CIECONTFRA;Contrast +TP_LOCALLAB_CIELIGHTCONTFRA;Lighting & Contrast +TP_LOCALLAB_CIELIGHTFRA;Lighting +TP_LOCALLAB_CIEMODE;Change tool position +TP_LOCALLAB_CIEMODE_COM;Default +TP_LOCALLAB_CIEMODE_DR;Dynamic Range +TP_LOCALLAB_CIEMODE_TM;Tone-Mapping +TP_LOCALLAB_CIEMODE_TOOLTIP;In Default mode, Ciecam is added at the end of the process. 'Mask and modifications' and 'Recovery based on luminance mask' are available for'Cam16 and JzCzHz' at your disposal .\nYou can also integrate Ciecam into other tools if you wish (TM, Wavelet, Dynamic Range, Log Encoding). The results for these tools will be different to those without Ciecam. In this mode, you can also use 'Mask and modifications' and 'Recovery based on luminance mask'. +TP_LOCALLAB_CIEMODE_WAV;Wavelet +TP_LOCALLAB_CIETOOLEXP;Curves +TP_LOCALLAB_CIE_TOOLNAME;Color appearance (Cam16 & JzCzHz) +TP_LOCALLAB_CIRCRADIUS;Spot size +TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of the RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for processing foliage.\nHigh values may be useful for processing skin. +TP_LOCALLAB_CLARICRES;Merge chroma +TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask/Blend & Soften Images +TP_LOCALLAB_CLARIJZ_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled. +TP_LOCALLAB_CLARILRES;Merge luma +TP_LOCALLAB_CLARISOFT;Soft radius +TP_LOCALLAB_CLARISOFTJZ_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and Local contrast wavelets Jz. +TP_LOCALLAB_CLARISOFT_TOOLTIP;The 'Soft radius' slider (guided filter algorithm) reduces halos and irregularities for Clarity, Sharp Mask and all wavelet pyramid processes. To deactivate, set slider to zero. +TP_LOCALLAB_CLARITYML;Clarity +TP_LOCALLAB_CLARI_TOOLTIP;Levels 0 to 4 (included): 'Sharp mask' is enabled\nLevels 5 and above: 'Clarity' is enabled.\nUseful if you use 'Wavelet level tone mapping'. +TP_LOCALLAB_CLIPTM;Clip restored data (gain) +TP_LOCALLAB_COFR;Color & Light +TP_LOCALLAB_COLORDE;ΔE preview color - intensity +TP_LOCALLAB_COLORDEPREV_TOOLTIP;Preview ΔE button will only work if you have activated one (and only one) of the tools in 'Add tool to current spot' menu.\nTo be able to preview ΔE with several tools enabled, use Mask and modifications - Preview ΔE. +TP_LOCALLAB_COLORDE_TOOLTIP;Show a blue color preview for ΔE selection if negative and green if positive.\n\nMask and modifications (show modified areas without mask): show actual modifications if positive, show enhanced modifications (luminance only) with blue and yellow if negative. +TP_LOCALLAB_COLORSCOPE;Scope (color tools) +TP_LOCALLAB_COLORSCOPE_TOOLTIP;Common Scope slider for Color and Light, Shadows/Highlights, Vibrance.\nOther tools have their own scope controls. +TP_LOCALLAB_COLOR_CIE;Color curve +TP_LOCALLAB_COLOR_TOOLNAME;Color & Light +TP_LOCALLAB_COL_NAME;Name +TP_LOCALLAB_COL_VIS;Status +TP_LOCALLAB_COMPFRA;Directional contrast +TP_LOCALLAB_COMPREFRA;Wavelet level tone mapping +TP_LOCALLAB_CONTCOL;Contrast threshold +TP_LOCALLAB_CONTFRA;Contrast by level +TP_LOCALLAB_CONTRAST;Contrast +TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts).May create artifacts. +TP_LOCALLAB_CONTRESID;Contrast +TP_LOCALLAB_CONTTHMASK_TOOLTIP;Allows you to determine which parts of the image will be impacted based on the texture. +TP_LOCALLAB_CONTTHR;Contrast Threshold +TP_LOCALLAB_CONTWFRA;Local contrast +TP_LOCALLAB_CSTHRESHOLD;Wavelet levels +TP_LOCALLAB_CSTHRESHOLDBLUR;Wavelet level selection +TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance 'Super' +TP_LOCALLAB_CURVCURR;Normal +TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP;If the curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves are at the top, the mask is completely black and no changes are made to the image.\nAs you lower the curve, the mask gradually becomes more colorful and bright, progressively changing the image.\n\nIt is recommended (but not mandatory) to position the top of the curves on the gray boundary line which represents the reference values of chroma, luma, hue for the RT-spot. +TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To activate the curves, set the 'Curve type' combobox to 'Normal'. +TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve +TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light. +TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) uses the same algorithm as the lightness slider. +TP_LOCALLAB_CURVES_CIE;Tone curve +TP_LOCALLAB_CURVNONE;Disable curves +TP_LOCALLAB_DARKRETI;Darkness +TP_LOCALLAB_DEHAFRA;Dehaze +TP_LOCALLAB_DEHAZ;Strength +TP_LOCALLAB_DEHAZFRAME_TOOLTIP;Removes atmospheric haze. Increases overall saturation and detail.\nCan remove color casts, but may also introduce a blue cast which can be corrected with other tools. +TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values add haze. +TP_LOCALLAB_DELTAD;Delta balance +TP_LOCALLAB_DELTAEC;ΔE Image mask +TP_LOCALLAB_DENOI1_EXP;Denoise based on luminance mask +TP_LOCALLAB_DENOI2_EXP;Recovery based on luminance mask +TP_LOCALLAB_DENOIBILAT_TOOLTIP;Allows you to reduce impulse or 'salt & pepper' noise. +TP_LOCALLAB_DENOICHROC_TOOLTIP;Allows you to deal with blotches and packets of noise. +TP_LOCALLAB_DENOICHRODET_TOOLTIP;Allows you to recover chrominance detail by progressively applying a Fourier transform (DCT). +TP_LOCALLAB_DENOICHROF_TOOLTIP;Allows you to adjust fine-detail chrominance noise. +TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP;Allows you to direct the chroma noise reduction towards either the blue-yellow or red-green colors. +TP_LOCALLAB_DENOIEQUAL_TOOLTIP;Allows you to carry out more or less noise reduction in either the shadows or the highlights. +TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP;Allows you to recover luminance detail by progressively applying a Fourier transform (DCT). +TP_LOCALLAB_DENOIMASK;Denoise chroma mask +TP_LOCALLAB_DENOIMASK_TOOLTIP;For all tools, allows you to control the chromatic noise level of the mask.\nUseful for better control of chrominance and to avoid artifacts when using the LC(h) curve. +TP_LOCALLAB_DENOIQUA_TOOLTIP;Conservative mode preserves low frequency detail. Aggressive mode removes low frequency detail.\nConservative and Aggressive modes use wavelets and DCT and can be used in conjunction with 'Non-local Means – Luminance'. +TP_LOCALLAB_DENOITHR_TOOLTIP;Adjusts edge detection to help reduce noise in uniform, low-contrast areas. +TP_LOCALLAB_DENOIWAVCH;Wavelets: Chrominance +TP_LOCALLAB_DENOIWAVLUM;Wavelets: Luminance +TP_LOCALLAB_DENOI_EXP;Denoise +TP_LOCALLAB_DENOI_TOOLTIP;This module can be used for noise reduction either on its own (at the end of the processing pipeline) or in addition to the Noise Reduction module in the Detail tab (which works at the beginning of the pipeline).\n Scope allows you to differentiate the action based on color (ΔE).\nMinimum RT-spot size: 128x128. +TP_LOCALLAB_DEPTH;Depth +TP_LOCALLAB_DETAIL;Local contrast +TP_LOCALLAB_DETAILFRA;Edge detection - DCT +TP_LOCALLAB_DETAILSH;Details +TP_LOCALLAB_DETAILTHR;Lum/chrom detail threshold +TP_LOCALLAB_DIVGR;Gamma +TP_LOCALLAB_DUPLSPOTNAME;Copy +TP_LOCALLAB_EDGFRA;Edge sharpness +TP_LOCALLAB_EDGSHOW;Show all tools +TP_LOCALLAB_ELI;Ellipse +TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping +TP_LOCALLAB_ENABLE_MASK;Enable mask +TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure +TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled the Mask uses Restored Data after Transmission Map instead of Original data. +TP_LOCALLAB_ENH;Enhanced +TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise +TP_LOCALLAB_EPSBL;Detail +TP_LOCALLAB_EQUIL;Normalize luminance +TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance so that the mean and variance of the output image are identical to those of the original. +TP_LOCALLAB_ESTOP;Edge stopping +TP_LOCALLAB_EV_DUPL;Copy of +TP_LOCALLAB_EV_NVIS;Hide +TP_LOCALLAB_EV_NVIS_ALL;Hide all +TP_LOCALLAB_EV_VIS;Show +TP_LOCALLAB_EV_VIS_ALL;Show all +TP_LOCALLAB_EXCLUF;Excluding +TP_LOCALLAB_EXCLUF_TOOLTIP;'Excluding' mode prevents adjacent spots from influencing certain parts of the image. Adjusting 'Scope' will extend the range of colors.\n You can also add tools to an Excluding spot and use them in the same way as for a normal spot. +TP_LOCALLAB_EXCLUTYPE;Spot method +TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot uses recursive data.\n\nExcluding spot reinitializes all local adjustment data.\nCan be used to totally or partially cancel a previous action or to carry out operations in Inverse mode.\n\n'Full image' allows you to use the local adjustment tools on the whole image.\n The RT Spot delimiters are set beyond the image preview boundaries.\n The transition is set to 100.\nNote, you may have to reposition the RT Spot slightly and adjust the Spot size to get the desired effect.\nPlease note: using Denoise or Wavelet or FFTW in full-image mode uses large amounts of memory and may cause the application to crash on lower capacity systems. +TP_LOCALLAB_EXECLU;Excluding spot +TP_LOCALLAB_EXFULL;Full image +TP_LOCALLAB_EXNORM;Normal spot +TP_LOCALLAB_EXPCBDL_TOOLTIP;Can be used to remove marks on the sensor or lens by reducing the contrast on the appropriate detail level(s). +TP_LOCALLAB_EXPCHROMA;Chroma compensation +TP_LOCALLAB_EXPCHROMA_TOOLTIP;Use in association with 'Exposure compensation f' and 'Contrast Attenuator f' to avoid desaturating colors. +TP_LOCALLAB_EXPCOLOR_TOOLTIP;Adjust color, lightness, contrast and correct small defects such as red-eye, sensor dust etc. +TP_LOCALLAB_EXPCOMP;Exposure compensation ƒ +TP_LOCALLAB_EXPCOMPINV;Exposure compensation +TP_LOCALLAB_EXPCOMP_TOOLTIP;For portraits or images with a low color gradient. You can change 'Shape detection' in 'Settings':\n\nIncrease 'ΔE scope threshold'\nReduce 'ΔE decay'\nIncrease 'ab-L balance (ΔE)' +TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation for Wavelet Levels.\nThere are some differences in the Local Adjustments version, which has more tools and more possibilities for working on individual detail levels.\nE.g. wavelet-level tone mapping. +TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small ( < 32x32 pixels).\nUse low 'Transition value' and high 'Transition decay' and 'Scope' to simulate small RT-spots and deal with defects.\nUse 'Clarity and Sharp mask and Blend and Soften Images' if necessary by adjusting 'Soft radius' to reduce artifacts. +TP_LOCALLAB_EXPCURV;Curves +TP_LOCALLAB_EXPGRAD;Graduated Filter +TP_LOCALLAB_EXPGRADCOL_TOOLTIP;A graduated filter is available in Color and Light (luminance, chrominance & hue gradients, and 'Merge file'), Exposure (luminance grad.), Exposure Mask (luminance grad.), Shadows/Highlights (luminance grad.), Vibrance (luminance, chrominance & hue gradients), Local contrast & wavelet pyramid (local contrast grad.).\nFeather is located in Settings. +TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Changes the transformed/original image blend. +TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Changes the behaviour for images with too much or too little contrast by adding a gamma curve before and after the Laplace transform. +TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Changes the behaviour for underexposed images by adding a linear component prior to applying the Laplace transform. +TP_LOCALLAB_EXPLAP_TOOLTIP;Moving the slider to the right progressively reduces the contrast. +TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows you to use GIMP or Photoshop (c) layer blend modes i.e. Difference, Multiply, Soft Light, Overlay etc., with opacity control.\nOriginal Image : merge current RT-Spot with Original.\nPrevious spot : merge current Rt-Spot with previous - if there is only one spot, previous = original.\nBackground : merge current RT-Spot with a color and luminance background (fewer possibilties). +TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Applies a median filter before the Laplace transform to prevent artifacts (noise).\nYou can also use the 'Denoise' tool. +TP_LOCALLAB_EXPOSE;Dynamic Range & Exposure +TP_LOCALLAB_EXPOSURE_TOOLTIP;Modify exposure in L*a*b space using Laplacian PDE algorithms to take into account dE and minimize artifacts. +TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools +TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high 'Transition decay' and 'Scope' values to simulate smaller RT-Spots. +TP_LOCALLAB_EXPTOOL;Exposure Tools +TP_LOCALLAB_EXP_TOOLNAME;Dynamic Range & Exposure +TP_LOCALLAB_FATAMOUNT;Amount +TP_LOCALLAB_FATANCHOR;Anchor +TP_LOCALLAB_FATDETAIL;Detail +TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ +TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal – uses the Fattal Tone-mapping algorithm. +TP_LOCALLAB_FATLEVEL;Sigma +TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ +TP_LOCALLAB_FEATH_TOOLTIP;Gradient width as a percentage of the Spot diagonal\nUsed by all graduated filters in all tools.\nNo action if a graduated filter hasn't been activated. +TP_LOCALLAB_FEATVALUE;Feather gradient (Grad. Filters) +TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ +TP_LOCALLAB_FFTMASK_TOOLTIP;Use a Fourier transform for better quality (increased processing time and memory requirements). +TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform +TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform +TP_LOCALLAB_FULLIMAGE;Black-Ev and White-Ev for whole image +TP_LOCALLAB_FULLIMAGELOG_TOOLTIP;Calculates the Ev levels for the whole image. +TP_LOCALLAB_GAM;Gamma +TP_LOCALLAB_GAMC;Gamma +TP_LOCALLAB_GAMCOL_TOOLTIP;Apply a gamma on Luminance L*a*b* datas.\nIf gamma = 3.0 Luminance 'linear' is used. +TP_LOCALLAB_GAMC_TOOLTIP;Apply a gamma on Luminance L*a*b* datas before and after treatment Pyramid 1 and Pyramid 2.\nIf gamma = 3.0 Luminance 'linear' is used. +TP_LOCALLAB_GAMFRA;Tone response curve (TRC) +TP_LOCALLAB_GAMM;Gamma +TP_LOCALLAB_GAMMASKCOL;Gamma +TP_LOCALLAB_GAMMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +TP_LOCALLAB_GAMSH;Gamma +TP_LOCALLAB_GAMUTNON;None +TP_LOCALLAB_GAMUTLABRELA;Lab +TP_LOCALLAB_GAMUTXYZABSO;XYZ Absolute +TP_LOCALLAB_GAMUTXYZRELA;XYZ Relative +TP_LOCALLAB_GAMUTMUNSELL;Munsell only +TP_LOCALLAB_GAMW;Gamma (wavelet pyramids) +TP_LOCALLAB_GRADANG;Gradient angle +TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees: -180 0 +180. +TP_LOCALLAB_GRADFRA;Graduated Filter Mask +TP_LOCALLAB_GRADGEN_TOOLTIP;Adjusts luminance gradient strength. +TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance +TP_LOCALLAB_GRADSTR;Gradient strength +TP_LOCALLAB_GRADSTRAB_TOOLTIP;Adjusts chroma gradient strength. +TP_LOCALLAB_GRADSTRCHRO;Chroma gradient strength +TP_LOCALLAB_GRADSTRHUE;Hue gradient strength +TP_LOCALLAB_GRADSTRHUE2;Hue gradient strength +TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Adjusts hue gradient strength. +TP_LOCALLAB_GRADSTRLUM;Luma gradient strength +TP_LOCALLAB_GRAINFRA;Film Grain 1:1 +TP_LOCALLAB_GRAINFRA2;Coarseness +TP_LOCALLAB_GRAIN_TOOLTIP;Adds film-like grain to the image. +TP_LOCALLAB_GRALWFRA;Graduated filter (local contrast) +TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use a small spot and adapt the 'Transition value' and 'Transition decay'\nOnly 'Normal' mode and possibly Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE). +TP_LOCALLAB_GRIDMETH_TOOLTIP;Color toning: the luminance is taken into account when varying chroma. Equivalent to H=f(H) if the 'white dot' on the grid remains at zero and you only vary the 'black dot'. Equivalent to 'Color toning' if you vary the 2 dots.\n\nDirect: acts directly on the chroma. +TP_LOCALLAB_GRIDONE;Color Toning +TP_LOCALLAB_GRIDTWO;Direct +TP_LOCALLAB_GUIDBL;Soft radius +TP_LOCALLAB_GUIDBL_TOOLTIP;Applies a guided filter with adjustable radius. Allows you to reduce artifacts or blur the image. +TP_LOCALLAB_GUIDEPSBL_TOOLTIP;Changes the distribution function of the guided filter. Negative values simulate a Gaussian blur. +TP_LOCALLAB_GUIDFILTER;Guided filter radius +TP_LOCALLAB_GUIDFILTER_TOOLTIP;Can reduce or increase artifacts. +TP_LOCALLAB_GUIDSTRBL_TOOLTIP;Intensity of the guided filter. +TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin. +TP_LOCALLAB_HIGHMASKCOL;Highlights +TP_LOCALLAB_HLH;H +TP_LOCALLAB_HUECIE;Hue +TP_LOCALLAB_IND;Independent (mouse) +TP_LOCALLAB_INDSL;Independent (mouse + sliders) +TP_LOCALLAB_INVBL;Inverse +TP_LOCALLAB_INVBL_TOOLTIP;Alternative to 'Inverse' mode: use two spots\nFirst Spot:\n Full Image\n\nSecond spot: Excluding spot. +TP_LOCALLAB_INVERS;Inverse +TP_LOCALLAB_INVERS_TOOLTIP;Fewer possibilities if selected (Inverse).\n\nAlternative: use two spots\nFirst Spot:\n Full Image\n \nSecond spot: Excluding spot\n\n Inverse will enable this tool for the area outside the spot, while the area within the spot will remain unaffected by the tool. +TP_LOCALLAB_INVMASK;Inverse algorithm +TP_LOCALLAB_ISOGR;Distribution (ISO) +TP_LOCALLAB_JAB;Uses Black Ev & White Ev +TP_LOCALLAB_JABADAP_TOOLTIP;Perceptual Uniform adaptation.\nAutomatically adjusts the relationship between Jz and saturation taking into account 'Absolute luminance'. +TP_LOCALLAB_JZ100;Jz reference 100cd/m2 +TP_LOCALLAB_JZ100_TOOLTIP;Automatically adjusts the reference Jz 100 cd/m2 level (image signal).\nChanges the saturation level and action of 'PU adaptation' (Perceptual Uniform adaptation). +TP_LOCALLAB_JZADAP;PU adaptation +TP_LOCALLAB_JZCH;Chroma +TP_LOCALLAB_JZCHROM;Chroma +TP_LOCALLAB_JZCLARICRES;Merge chroma Cz +TP_LOCALLAB_JZCLARILRES;Merge Jz +TP_LOCALLAB_JZCONT;Contrast +TP_LOCALLAB_JZFORCE;Force max Jz to 1 +TP_LOCALLAB_JZFORCE_TOOLTIP;Allows you to force the maximum Jz value to 1 for better slider and curve response. +TP_LOCALLAB_JZFRA;Jz Cz Hz Image Adjustments +TP_LOCALLAB_JZHFRA;Curves Hz +TP_LOCALLAB_JZHJZFRA;Curve Jz(Hz) +TP_LOCALLAB_JZHUECIE;Hue Rotation +TP_LOCALLAB_JZLIGHT;Brightness +TP_LOCALLAB_JZLOG;Log encoding Jz +TP_LOCALLAB_JZLOGWBS_TOOLTIP;Black Ev and White Ev adjustments can be different depending on whether Log encoding or Sigmoid is used.\nFor Sigmoid, a change (increase in most cases) of White Ev may be necessary to obtain a better rendering of highlights, contrast and saturation. +TP_LOCALLAB_JZLOGWB_TOOLTIP;If Auto is enabled, it will calculate and adjust the Ev levels and the 'Mean luminance Yb%' for the spot area. The resulting values will be used by all Jz operations including 'Log Encoding Jz'.\nAlso calculates the absolute luminance at the time of shooting. +TP_LOCALLAB_JZLOGYBOUT_TOOLTIP;Yb is the relative luminance of the background, expressed as a percentage of gray. 18% gray corresponds to a background luminance of 50% when expressed in CIE L.\nThe data is based on the mean luminance of the image.\nWhen used with Log Encoding, the mean luminance is used to determine the amount of gain that needs to be applied to the signal prior to the log encoding. Lower values of mean luminance will result in increased gain. +TP_LOCALLAB_JZMODECAM_TOOLTIP;Jz (only in 'Advanced' mode). Only operational if the output device (monitor) is HDR (peak luminance higher than 100 cd/m2 - ideally between 4000 and 10000 cd/m2. Black point luminance inferior to 0.005 cd/m2). This supposes a) the ICC-PCS for the screen uses Jzazbz (or XYZ), b) works in real precision, c) that the monitor is calibrated (if possible with a DCI-P3 or Rec-2020 gamut), d) that the usual gamma (sRGB or BT709) is replaced by a Perceptual Quantiser (PQ) function. +TP_LOCALLAB_JZPQFRA;Jz remapping +TP_LOCALLAB_JZPQFRA_TOOLTIP;Allows you to adapt the Jz algorithm to an SDR environment or to the characteristics (performance) of an HDR environment as follows:\n a) for luminance values between 0 and 100 cd/m2, the system behaves as if it were in an SDR environment.\n b) for luminance values between 100 and 10000 cd/m2, you can adapt the algorithm to the HDR characteristics of the image and the monitor.\n\nIf 'PQ - Peak luminance' is set to 10000, 'Jz remappping' behaves in the same way as the original Jzazbz algorithm. +TP_LOCALLAB_JZPQREMAP;PQ - Peak luminance +TP_LOCALLAB_JZPQREMAP_TOOLTIP;PQ (Perceptual Quantizer) - allows you to change the internal PQ function (usually 10000 cd/m2 - default 120 cd/m2).\nCan be used to adapt to different images, processes and devices. +TP_LOCALLAB_JZQTOJ;Relative luminance +TP_LOCALLAB_JZQTOJ_TOOLTIP;Allows you to use 'Relative luminance' instead of 'Absolute luminance' - Brightness becomes Lightness.\nThe changes affect: the Brightness slider, the Contrast slider and the Jz(Jz) curve. +TP_LOCALLAB_JZSAT;Saturation +TP_LOCALLAB_JZSHFRA;Shadows/Highlights Jz +TP_LOCALLAB_JZSOFTCIE;Soft radius (GuidedFilter) +TP_LOCALLAB_JZSTRSOFTCIE;Strength GuidedFilter +TP_LOCALLAB_JZTARGET_EV;Viewing Mean luminance (Yb%) +TP_LOCALLAB_JZTHRHCIE;Threshold Chroma for Jz(Hz) +TP_LOCALLAB_JZWAVEXP;Wavelet Jz +TP_LOCALLAB_LABBLURM;Blur Mask +TP_LOCALLAB_LABEL;Local Adjustments +TP_LOCALLAB_LABGRID;Color correction grid +TP_LOCALLAB_LABGRIDMERG;Background +TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 +TP_LOCALLAB_LABSTRUM;Structure Mask +TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE +TP_LOCALLAB_LAPLACE;Laplacian threshold ΔE +TP_LOCALLAB_LAPLACEXP;Laplacian threshold +TP_LOCALLAB_LAPMASKCOL;Laplacian threshold +TP_LOCALLAB_LAPRAD1_TOOLTIP;Increases the contrast of the mask by increasing the luminance values of the lighter areas. Can be used in conjunction with the L(L) and LC(H) curves. +TP_LOCALLAB_LAPRAD2_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +TP_LOCALLAB_LAPRAD_TOOLTIP;Smooth radius uses a guided filter to decrease artifacts and smooth out the transition. +TP_LOCALLAB_LAP_MASK_TOOLTIP;Solves PDEs for all Laplacian masks.\nIf enabled the Laplacian threshold mask reduces artifacts and smooths the result.\nIf disabled the response is linear. +TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improves quality and allows the use of large radii, but increases processing time (depends on the area to be processed). Preferable to use only for large radii. The size of the area can be reduced by a few pixels to optimize the FFTW. This can reduce the processing time by a factor of 1.5 to 10. +TP_LOCALLAB_LC_TOOLNAME;Local Contrast & Wavelets +TP_LOCALLAB_LEVELBLUR;Maximum blur levels +TP_LOCALLAB_LEVELWAV;Wavelet levels +TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4. +TP_LOCALLAB_LEVFRA;Levels +TP_LOCALLAB_LIGHTNESS;Lightness +TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 forces luminance to zero. +TP_LOCALLAB_LIGHTRETI;Lightness +TP_LOCALLAB_LINEAR;Linearity +TP_LOCALLAB_LIST_NAME;Add tool to current spot... +TP_LOCALLAB_LIST_TOOLTIP;You can select 3 levels of complexity for each tool: Basic, Standard and Advanced.\nThe default setting for all tools is Basic but this can be changed in the Preferences window.\nYou can also change the level of complexity on a per-tool basis while you are editing. +TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Allows you to decrease or increase the effect on particular levels of detail in the mask by targeting certain luminance zones (in general the lightest). +TP_LOCALLAB_LMASK_LL_TOOLTIP;Allows you to freely change the contrast of the mask.\n Has a similar function to the Gamma and Slope sliders.\n It allows you to target certain parts of the image (usually the lightest parts of the mask by using the curve to exclude the darker parts). May create artifacts. +TP_LOCALLAB_LOCCONT;Unsharp Mask +TP_LOCALLAB_LOC_CONTRAST;Local Contrast & Wavelets +TP_LOCALLAB_LOC_CONTRASTPYR;Pyramid 1: +TP_LOCALLAB_LOC_CONTRASTPYR2;Pyramid 2: +TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by level/TM/Directional contrast +TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter/Edge Sharpness/Blur +TP_LOCALLAB_LOC_RESIDPYR;Residual image (Main) +TP_LOCALLAB_LOG;Log Encoding +TP_LOCALLAB_LOG1FRA;CAM16 Image Adjustments +TP_LOCALLAB_LOG2FRA;Viewing Conditions +TP_LOCALLAB_LOGAUTO;Automatic +TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions. +TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP;Automatically calculates the 'Mean luminance' for the scene conditions when the 'Automatic' button in Relative Exposure Levels is pressed. +TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will calculate the dynamic range and 'Mean luminance' for the scene conditions if the 'Auto mean luminance (Yb%)' is checked).\nAlso calculates the absolute luminance at the time of shooting.\nPress the button again to adjust the automatically calculated values. +TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm making the shadows darker and the highlights brighter.\nWith values greater than 2, the shadows are grayer and the highlights become more washed out. +TP_LOCALLAB_LOGCATAD_TOOLTIP;Chromatic adaptation allows us to interpret a color according to its spatio-temporal environment.\nUseful when the white balance deviates significantly from the D50 reference.\nAdapts colors to the illuminant of the output device. +TP_LOCALLAB_LOGCIE;Log encoding instead of Sigmoid +TP_LOCALLAB_LOGCIE_TOOLTIP;Allows you tu use Black Ev, White Ev, Scene Mean luminance(Yb%) and Viewing Mean luminance(Yb%) for tone-mapping using Log encoding Q. +TP_LOCALLAB_LOGCOLORFL;Colorfulness (M) +TP_LOCALLAB_LOGCOLORF_TOOLTIP;Perceived amount of hue in relation to gray.\nIndicator that a stimulus appears more or less colored. +TP_LOCALLAB_LOGCONQL;Contrast (Q) +TP_LOCALLAB_LOGCONTHRES;Contrast threshold (J & Q) +TP_LOCALLAB_LOGCONTL;Contrast (J) +TP_LOCALLAB_LOGCONTL_TOOLTIP;Contrast (J) in CIECAM16 takes into account the increase in perceived coloration with luminance. +TP_LOCALLAB_LOGCONTQ_TOOLTIP;Contrast (Q) in CIECAM16 takes into account the increase in perceived coloration with brightness. +TP_LOCALLAB_LOGCONTTHRES_TOOLTIP;Adjusts the mid-tone contrast range (J & Q).\nPositive values progressively reduce the effect of the Contrast sliders (J & Q). Negative values progressively increase the effect of the Contrast sliders. +TP_LOCALLAB_LOGDETAIL_TOOLTIP;Acts mainly on high frequencies. +TP_LOCALLAB_LOGENCOD_TOOLTIP;Tone Mapping with Logarithmic encoding (ACES).\nUseful for underexposed images or images with high dynamic range.\n\nTwo-step process: 1) Dynamic Range calculation 2) Manual adjustment. +TP_LOCALLAB_LOGEXP;All tools +TP_LOCALLAB_LOGFRA;Scene Conditions +TP_LOCALLAB_LOGFRAME_TOOLTIP;Allows you to calculate and adjust the Ev levels and the 'Mean luminance Yb%' (source gray point) for the spot area. The resulting values will be used by all Lab operations and most RGB operations in the pipeline.\nAlso calculates the absolute luminance at the time of shooting. +TP_LOCALLAB_LOGIMAGE_TOOLTIP;Takes into account corresponding Ciecam variables: i.e. Contrast (J) and Saturation (s), as well as Contrast (Q), Brightness (Q), Lightness (J) and Colorfulness (M) (in Advanced mode). +TP_LOCALLAB_LOGLIGHTL;Lightness (J) +TP_LOCALLAB_LOGLIGHTL_TOOLTIP;Close to lightness (L*a*b*). Takes into account the increase in perceived coloration. +TP_LOCALLAB_LOGLIGHTQ;Brightness (Q) +TP_LOCALLAB_LOGLIGHTQ_TOOLTIP;Perceived amount of light emanating from a stimulus.\nIndicator that a stimulus appears to be more or less bright, clear. +TP_LOCALLAB_LOGLIN;Logarithm mode +TP_LOCALLAB_LOGPFRA;Relative Exposure Levels +TP_LOCALLAB_LOGREPART;Overall strength +TP_LOCALLAB_LOGREPART_TOOLTIP;Allows you to adjust the relative strength of the log-encoded image with respect to the original image.\nDoes not affect the Ciecam component. +TP_LOCALLAB_LOGSATURL_TOOLTIP;Saturation (s) in CIECAM16 corresponds to the color of a stimulus in relation to its own brightness.\nActs mainly on medium tones and on the highlights. +TP_LOCALLAB_LOGSCENE_TOOLTIP;Corresponds to the shooting conditions. +TP_LOCALLAB_LOGSURSOUR_TOOLTIP;Changes tones and colors to take into account the Scene conditions.\n\nAverage: Average light conditions (standard). The image will not change.\n\nDim: Dim conditions. The image will become slightly brighter.\n\nDark: Dark conditions. The image will become more bright. +TP_LOCALLAB_LOGVIEWING_TOOLTIP;Corresponds to the medium on which the final image will be viewed (monitor, TV, projector, printer, etc.), as well as the surrounding conditions. +TP_LOCALLAB_LOG_TOOLNAME;Log Encoding +TP_LOCALLAB_LUM;LL - CC +TP_LOCALLAB_LUMADARKEST;Darkest +TP_LOCALLAB_LUMASK;Background color/luma mask +TP_LOCALLAB_LUMASK_TOOLTIP;Adjusts the shade of gray or color of the mask background in Show Mask (Mask and modifications). +TP_LOCALLAB_LUMAWHITESEST;Lightest +TP_LOCALLAB_LUMFRA;L*a*b* standard +TP_LOCALLAB_MASFRAME;Mask and Merge +TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTakes into account the ΔE image to avoid modifying the selection area when the following Mask Tools are used: Gamma, Slope, Chroma, Contrast curve, Local contrast (by wavelet level), Blur Mask and Structure Mask (if enabled ).\nDisabled when Inverse mode is used. +TP_LOCALLAB_MASK;Curves +TP_LOCALLAB_MASK2;Contrast curve +TP_LOCALLAB_MASKCOM;Common Color Mask +TP_LOCALLAB_MASKCOM_TOOLNAME;Common Color Mask +TP_LOCALLAB_MASKCOM_TOOLTIP;A tool in its own right.\nCan be used to adjust the image appearance (chrominance, luminance, contrast) and texture as a function of Scope. +TP_LOCALLAB_MASKCURVE_TOOLTIP;The 3 curves are set to 1 (maximum) by default:\nC=f(C) the chroma varies according to the chrominance. You can decrease the chroma to improve the selection. By setting this curve close to zero (with a low value of C to activate the curve) you can desaturate the background in Inverse mode.\nL=f(L) the luminance varies according to the luminance, so you can decrease the brightness to improve the selection.\nL and C = f(H) luminance and chroma vary with hue, so you can decrease luminance and chroma to improve selection. +TP_LOCALLAB_MASKDDECAY;Decay strength +TP_LOCALLAB_MASKDECAY_TOOLTIP;Manages the rate of decay for the gray levels in the mask.\n Decay = 1 linear, Decay > 1 sharper parabolic transitions, Decay < 1 more gradual transitions. +TP_LOCALLAB_MASKDEINV_TOOLTIP;Reverses the way the algorithm interprets the mask.\nIf checked black and very light areas will be decreased. +TP_LOCALLAB_MASKDE_TOOLTIP;Used to target the denoise as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the Denoise will be applied progressively.\n iIf the mask is above the 'light' threshold, then the Denoise will be applied progressively.\n Between the two, the image settings without the Denoise will be maintained, unless you adjust the sliders 'Gray area luminance denoise' or 'Gray area chrominance denoise'. +TP_LOCALLAB_MASKGF_TOOLTIP;Used to target the Guided Filter as a function of the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n If the mask is below the 'dark' threshold, then the GF will be applied progressively.\n If the mask is above the 'light' threshold, then the GF will be applied progressively.\n Between the two, the image settings without the GF will be maintained. +TP_LOCALLAB_MASKH;Hue curve +TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP;Lighter-tone limit above which CBDL (Luminance only) parameters will be restored progressively to their original values prior to being modified by the CBDL settings .\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\nUse a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP; The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable colorpicker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP;Lighter-tone limit above which Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP;Lighter-tone limit above which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKHIGTHRES_TOOLTIP; The Guided Filter is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'structure mask', 'Smooth radius', 'Gamma and slope', 'Contrast curve', 'Local contrast wavelet'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLCTHR;Light area luminance threshold +TP_LOCALLAB_MASKLCTHR2;Light area luma threshold +TP_LOCALLAB_MASKLCTHRLOW;Dark area luminance threshold +TP_LOCALLAB_MASKLCTHRLOW2;Dark area luma threshold +TP_LOCALLAB_MASKLCTHRMID;Gray area luma denoise +TP_LOCALLAB_MASKLCTHRMIDCH;Gray area chroma denoise +TP_LOCALLAB_MASKLC_TOOLTIP;Used by wavelet luminance.\nThis allows you to target the denoise based on the image luminance information contained in the L(L) or LC(H) mask (Mask and Modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n 'Dark area luminance threshold'. If 'Reinforce denoise in dark and light areas' > 1 the denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (determined by mask).\n 'Light area luminance threshold'. The denoise is progressively decreased from 100% at the threshold setting to 0% at the maximum white value (determined by mask).\n In the area between the two thresholds, the denoise settings are not affected by the mask. +TP_LOCALLAB_MASKLNOISELOW;Reinforce dark/light areas +TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP;Dark-tone limit below which the CBDL parameters (Luminance only) will be restored progressively to their original values prior to being modified by the CBDL settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Color and Light settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'blur mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP;The denoise is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Log encoding settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels:'Smooth radius', 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP;Dark-tone limit below which the Retinex (Luminance only) parameters will be restored progressively to their original values prior to being modified by the Retinex settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Shadows Highlights settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Tone Mapping settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP;Dark-tone limit below which the parameters will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings.\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Smooth radius', Gamma and Slope, 'Contrast curve'.\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKLOWTHRES_TOOLTIP;The Guided Filter is progressively increased from 0% at the threshold setting to 100% at the maximum black value (as determined by the mask).\n You can use certain tools in 'Mask and modifications' to change the gray levels: 'Structure mask', 'Smooth radius', Gamma and Slope, 'Contrast curve', 'Local contrast' (wavelets).\n Use a 'lockable color picker' on the mask to see which areas will be affected. Make sure you set 'Background color mask' = 0 in Settings. +TP_LOCALLAB_MASKRECOL_TOOLTIP;Used to modulate the effect of the Color and Light settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Color and Light settings \n In between these two areas, the full value of the Color and Light settings will be applied. +TP_LOCALLAB_MASKRECOTHRES;Recovery threshold +TP_LOCALLAB_MASKREEXP_TOOLTIP;Used to modulate the effect of the 'Dynamic range and Exposure' settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the 'Dynamic range and Exposure' settings \n In between these two areas, the full value of the 'Dynamic range and Exposure' settings will be applied. +TP_LOCALLAB_MASKRELOG_TOOLTIP;Used to modulate the effect of the Log encoding settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Log encoding settings - can be used to restore highlights reconstructed by Color propagation \n In between these two areas, the full value of the Log encoding settings will be applied. +TP_LOCALLAB_MASKRESCB_TOOLTIP;Used to modulate the effect of the CBDL (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the CBDL settings \n In between these two areas, the full value of the CBDL settings will be applied. +TP_LOCALLAB_MASKRESH_TOOLTIP;Used to modulate the effect of the Shadows Highlights settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Shadows Highlights settings \n In between these two areas, the full value of the Shadows Highlights settings will be applied. +TP_LOCALLAB_MASKRESRETI_TOOLTIP;Used to modulate the effect of the Retinex (Luminance only) settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Retinex settings \n In between these two areas, the full value of the Retinex settings will be applied. +TP_LOCALLAB_MASKRESTM_TOOLTIP;Used to modulate the effect of the Tone Mapping settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Tone Mapping settings \n In between these two areas, the full value of the Tone Mapping settings will be applied. +TP_LOCALLAB_MASKRESVIB_TOOLTIP;Used to modulate the effect of the Vibrance and Warm Cool settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Vibrance and Warm Cool settings \n In between these two areas, the full value of the Vibrance and Warm Cool settings will be applied. +TP_LOCALLAB_MASKRESWAV_TOOLTIP;Used to modulate the effect of the Local contrast and Wavelet settings based on the image luminance information contained in the L(L) or LC(H) masks (Mask and modifications).\n The L(L) mask or the LC(H) mask must be enabled to use this function.\n The 'dark' and 'light' areas below the dark threshold and above the light threshold will be restored progressively to their original values prior to being modified by the Local contrast and Wavelet settings \n In between these two areas, the full value of the Local contrast and Wavelet settings will be applied. +TP_LOCALLAB_MASKUNUSABLE;Mask disabled (Mask & modifications) +TP_LOCALLAB_MASKUSABLE;Mask enabled (Mask & modifications) +TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a tool by activating another tool and using only the mask (set the tool sliders to 0 ).\n\nYou can also duplicate the RT-spot and place it close to the first spot. The small variations in the spot references allow you to make fine adjustments. +TP_LOCALLAB_MEDIAN;Median Low +TP_LOCALLAB_MEDIANITER_TOOLTIP;The number of successive iterations carried out by the median filter. +TP_LOCALLAB_MEDIAN_TOOLTIP;You can choose a median value in the range 3x3 to 9x9 pixels. Higher values increase noise reduction and blur. +TP_LOCALLAB_MEDNONE;None +TP_LOCALLAB_MERCOL;Color +TP_LOCALLAB_MERDCOL;Merge background (ΔE) +TP_LOCALLAB_MERELE;Lighten only +TP_LOCALLAB_MERFIV;Addition +TP_LOCALLAB_MERFOR;Color Dodge +TP_LOCALLAB_MERFOU;Multiply +TP_LOCALLAB_MERGE1COLFRA;Merge with Original/Previous/Background +TP_LOCALLAB_MERGECOLFRA;Mask: LCh & Structure +TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP;Allows you to create masks based on the 3 LCh curves and/or a structure-detection algorithm. +TP_LOCALLAB_MERGEMER_TOOLTIP;Takes ΔE into account when merging files (equivalent of scope in this case). +TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity = % of current spot to be merged with original or previous Spot.\nContrast threshold : adjusts result as a function of contrast in original image. +TP_LOCALLAB_MERHEI;Overlay +TP_LOCALLAB_MERHUE;Hue +TP_LOCALLAB_MERLUCOL;Luminance +TP_LOCALLAB_MERLUM;Luminosity +TP_LOCALLAB_MERNIN;Screen +TP_LOCALLAB_MERONE;Normal +TP_LOCALLAB_MERSAT;Saturation +TP_LOCALLAB_MERSEV;Soft Light (legacy) +TP_LOCALLAB_MERSEV0;Soft Light Illusion +TP_LOCALLAB_MERSEV1;Soft Light W3C +TP_LOCALLAB_MERSEV2;Hard Light +TP_LOCALLAB_MERSIX;Divide +TP_LOCALLAB_MERTEN;Darken only +TP_LOCALLAB_MERTHI;Color Burn +TP_LOCALLAB_MERTHR;Difference +TP_LOCALLAB_MERTWE;Exclusion +TP_LOCALLAB_MERTWO;Subtract +TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts. +TP_LOCALLAB_LCLABELS;Residual noise levels +TP_LOCALLAB_LCLABELS_TOOLTIP;Displays the mean and high-end noise values for the area shown in the Preview Panel (at 100% zoom). The noise values are grouped by wavelet levels 0,1,2,3 and 4,5,6.\nThe displayed values are indicative only and are designed to assist with denoise adjustments. They should not be interpreted as absolute noise levels.\n\n 300: Very noisy\n 100-300: Noisy\n 50-100: Moderatly noisy\n < 50: Low noise\n\nThey allow you to see:\n*The impact of Noise Reduction in the main-menu Detail tab.\n*The influence of Non-local Means, Wavelets and DCT on the luminance noise.\n*The influence of Wavelets and DCT on the chroma noise.\n*The influence of Capture Sharpening and Demosaicing. +TP_LOCALLAB_LUMLABEL;Luma levels 0123: Mean=%1 High=%2 +TP_LOCALLAB_LUM46LABEL;Luma levels 456: Mean=%1 High=%2 +TP_LOCALLAB_CHROLABEL;Chroma levels 0123: Mean=%1 High=%2 +TP_LOCALLAB_CHRO46LABEL;Chroma levels 456: Mean=%1 High=%2 +TP_LOCALLAB_MLABEL;Restored data Min=%1 Max=%2 +TP_LOCALLAB_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. +TP_LOCALLAB_MODE_EXPERT;Advanced +TP_LOCALLAB_MODE_NORMAL;Standard +TP_LOCALLAB_MODE_SIMPLE;Basic +TP_LOCALLAB_MRFIV;Background +TP_LOCALLAB_MRFOU;Previous Spot +TP_LOCALLAB_MRONE;None +TP_LOCALLAB_MRTHR;Original Image +TP_LOCALLAB_MULTIPL_TOOLTIP;Wide-range tone adjustment: -18EV to +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts on light tones up to 4EV. +TP_LOCALLAB_NEIGH;Radius +TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP;Lower values preserve details and texture, higher values increase denoise.\nIf gamma = 3.0 Luminance 'linear' is used. +TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP;Use this slider to adapt the amount of denoise to the size of the objects to be processed. +TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP;Higher values increase denoise at the expense of processing time. +TP_LOCALLAB_NLDENOISE_TOOLTIP;'Detail recovery' acts on a Laplacian transform to target uniform areas rather than areas with detail. +TP_LOCALLAB_NLDET;Detail recovery +TP_LOCALLAB_NLFRA;Non-local Means: Luminance +TP_LOCALLAB_NLFRAME_TOOLTIP;Non-local means denoising takes a mean of all pixels in the image, weighted by how similar they are to the target pixel.\nReduces loss of detail compared with local mean algorithms.\nOnly luminance noise is taken into account. Chrominance noise is best processed using wavelets and Fourier transforms (DCT).\nCan be used in conjunction with 'Luminance denoise by level' or on its own. +TP_LOCALLAB_NLGAM;Gamma +TP_LOCALLAB_NLLUM;Strength +TP_LOCALLAB_NLPAT;Maximum patch size +TP_LOCALLAB_NLRAD;Maximum radius size +TP_LOCALLAB_NOISECHROCOARSE;Coarse chroma (Wav) +TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02. +TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery +TP_LOCALLAB_NOISECHROFINE;Fine chroma (Wav) +TP_LOCALLAB_NOISEGAM;Gamma +TP_LOCALLAB_NOISEGAM_TOOLTIP;If gamma = 1 Luminance 'Lab' is used. If gamma = 3.0 Luminance 'linear' is used.\nLower values preserve details and texture, higher values increase denoise. +TP_LOCALLAB_NOISELEQUAL;Equalizer white-black +TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav) +TP_LOCALLAB_NOISELUMDETAIL;Luma detail recovery +TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav) +TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav) +TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav) +TP_LOCALLAB_NOISEMETH;Denoise +TP_LOCALLAB_NOISE_TOOLTIP;Adds luminance noise. +TP_LOCALLAB_NONENOISE;None +TP_LOCALLAB_NUL_TOOLTIP;. +TP_LOCALLAB_OFFS;Offset +TP_LOCALLAB_OFFSETWAV;Offset +TP_LOCALLAB_OPACOL;Opacity +TP_LOCALLAB_ORIGLC;Merge only with original image +TP_LOCALLAB_ORRETILAP_TOOLTIP;Modifies ΔE prior to any changes made by 'Scope'. This allows you to differentiate the action for different parts of the image (with respect to the background for example). +TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced. +TP_LOCALLAB_PASTELS2;Vibrance +TP_LOCALLAB_PDE;Contrast Attenuator - Dynamic Range compression +TP_LOCALLAB_PDEFRA;Contrast Attenuator ƒ +TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL algorithm adapted for Rawtherapee : gives different results and requires different settings compared to main-menu 'Exposure'.\nMay be useful for under-exposed or high dynamic range images. +TP_LOCALLAB_PREVHIDE;Hide additional settings +TP_LOCALLAB_PREVIEW;Preview ΔE +TP_LOCALLAB_PREVSHOW;Show additional settings +TP_LOCALLAB_PROXI;ΔE decay +TP_LOCALLAB_QUAAGRES;Aggressive +TP_LOCALLAB_QUACONSER;Conservative +TP_LOCALLAB_QUALCURV_METHOD;Curve type +TP_LOCALLAB_QUAL_METHOD;Global quality +TP_LOCALLAB_QUANONEALL;Off +TP_LOCALLAB_QUANONEWAV;Non-local means only +TP_LOCALLAB_RADIUS;Radius +TP_LOCALLAB_RADIUS_TOOLTIP;Uses a Fast Fourier Transform for radius > 30. +TP_LOCALLAB_RADMASKCOL;Smooth radius +TP_LOCALLAB_RECOTHRES02_TOOLTIP;If the 'Recovery threshold' value is greater than 1, the mask in Mask and Modifications takes into account any previous modifications made to the image but not those made with the current tool (e.g. Color and Light, Wavelet, Cam16, etc.)\nIf the value of the 'Recovery threshold' is less than 1, the mask in Mask and Modifications does not take into account any previous modifications to the image.\n\nIn both cases, the 'Recovery threshold' acts on the masked image as modified by the current tool (Color and Light, Wavelet, Cam16, etc.). +TP_LOCALLAB_RECT;Rectangle +TP_LOCALLAB_RECURS;Recursive references +TP_LOCALLAB_RECURS_TOOLTIP;Forces the algorithm to recalculate the references after each tool is applied.\nAlso useful for working with masks. +TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name +TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot +TP_LOCALLAB_REPARCOL_TOOLTIP;Allows you to adjust the relative strength of the Color and Light image with respect to the original image. +TP_LOCALLAB_REPARDEN_TOOLTIP;Allows you to adjust the relative strength of the Denoise image with respect to the original image. +TP_LOCALLAB_REPAREXP_TOOLTIP;Allows you to adjust the relative strength of the Dynamic Range and Exposure image with respect to the original image. +TP_LOCALLAB_REPARSH_TOOLTIP;Allows you to adjust the relative strength of the Shadows/Highlights and Tone Equalizer image with respect to the original image. +TP_LOCALLAB_REPARTM_TOOLTIP;Allows you to adjust the relative strength of the Tone mapping image with respect to the original image. +TP_LOCALLAB_REPARW_TOOLTIP;Allows you to adjust the relative strength of the local contrast and wavelet image with respect to the original image. +TP_LOCALLAB_RESID;Residual Image +TP_LOCALLAB_RESIDBLUR;Blur residual image +TP_LOCALLAB_RESIDCHRO;Residual image Chroma +TP_LOCALLAB_RESIDCOMP;Compress residual image +TP_LOCALLAB_RESIDCONT;Residual image Contrast +TP_LOCALLAB_RESIDHI;Highlights +TP_LOCALLAB_RESIDHITHR;Highlights threshold +TP_LOCALLAB_RESIDSHA;Shadows +TP_LOCALLAB_RESIDSHATHR;Shadows threshold +TP_LOCALLAB_RETI;Dehaze & Retinex +TP_LOCALLAB_RETIFRA;Retinex +TP_LOCALLAB_RETIFRAME_TOOLTIP;Retinex can be useful for processing images: \nthat are blurred, foggy or hazy (in addition to Dehaze).\nthat contain large differences in luminance.\nIt can also be used for special effects (tone mapping). +TP_LOCALLAB_RETIM;Original Retinex +TP_LOCALLAB_RETITOOLFRA;Retinex Tools +TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Has no effect when the value of 'Lightness = 1' or 'Darkness =2'.\nFor other values, the last step of a 'Multiple scale Retinex' algorithm (similar to 'local contrast') is applied. These 2 cursors, associated with 'Strength' allow you to make adjustments upstream of local contrast. +TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Adjusts the internal parameters to optimize the response.\nPreferable to keep the 'Restored data' values close to Min=0 and Max=32768 (log mode), but other values are possible. +TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm mode introduces more contrast but will also generate more halos. +TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;The radius and variance sliders allow you adjust haze and target either the foreground or the background. +TP_LOCALLAB_RETI_SCALE_TOOLTIP;If Scale=1, Retinex behaves like local contrast with additional possibilities.\nIncreasing the value of Scale increases the intensity of the recursive action at the expense of processing time. +TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex +TP_LOCALLAB_REWEI;Reweighting iterates +TP_LOCALLAB_RGB;RGB Tone Curve +TP_LOCALLAB_RGBCURVE_TOOLTIP;In RGB mode you have 4 choices : Standard, Weighted standard, Luminance & Film-like. +TP_LOCALLAB_ROW_NVIS;Not visible +TP_LOCALLAB_ROW_VIS;Visible +TP_LOCALLAB_RSTPROTECT_TOOLTIP;Red and skin-tone protection affects the Saturation, Chroma and Colorfulness sliders. +TP_LOCALLAB_SATUR;Saturation +TP_LOCALLAB_SATURV;Saturation (s) +TP_LOCALLAB_SCALEGR;Scale +TP_LOCALLAB_SCALERETI;Scale +TP_LOCALLAB_SCALTM;Scale +TP_LOCALLAB_SCOPEMASK;Scope (ΔE image mask) +TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if ΔE Image Mask is enabled.\nLow values avoid retouching selected area. +TP_LOCALLAB_SENSI;Scope +TP_LOCALLAB_SENSIEXCLU;Scope +TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust the colors to be excluded. +TP_LOCALLAB_SENSIMASK_TOOLTIP;Scope adjustment specific to common mask tool.\nActs on the difference between the original image and the mask.\nUses the luma, chroma and hue references from the center of the RT-spot\n\nYou can also adjust the ΔE of the mask itself by using 'Scope (ΔE image mask)' in 'Settings' > 'Mask and Merge'. +TP_LOCALLAB_SENSI_TOOLTIP;Adjusts the scope of the action:\nSmall values limit the action to colors similar to those in the center of the spot.\nHigh values let the tool act on a wider range of colors. +TP_LOCALLAB_SETTINGS;Settings +TP_LOCALLAB_SH1;Shadows Highlights +TP_LOCALLAB_SH2;Equalizer +TP_LOCALLAB_SHADEX;Shadows +TP_LOCALLAB_SHADEXCOMP;Shadow compression +TP_LOCALLAB_SHADHIGH;Shadows/Highlights & Tone Equalizer +TP_LOCALLAB_SHADHMASK_TOOLTIP;Lowers the highlights of the mask in the same way as the shadows/highlights algorithm. +TP_LOCALLAB_SHADMASK_TOOLTIP;Lifts the shadows of the mask in the same way as the shadows/highlights algorithm. +TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Adjust shadows and highlights either with shadows & highlights sliders or with a tone equalizer.\nCan be used instead of, or in conjunction with the Exposure module.\nCan also be used as a graduated filter. +TP_LOCALLAB_SHAMASKCOL;Shadows +TP_LOCALLAB_SHAPETYPE;RT-spot shape +TP_LOCALLAB_SHAPE_TOOLTIP;'Ellipse' is the normal mode.\n 'Rectangle' can be used in certain cases, for example to work in full-image mode by placing the delimiters outside the preview area. In this case, set transition = 100.\n\nFuture developments will include polygon shapes and Bezier curves. +TP_LOCALLAB_SHARAMOUNT;Amount +TP_LOCALLAB_SHARBLUR;Blur radius +TP_LOCALLAB_SHARDAMPING;Damping +TP_LOCALLAB_SHARFRAME;Modifications +TP_LOCALLAB_SHARITER;Iterations +TP_LOCALLAB_SHARP;Sharpening +TP_LOCALLAB_SHARP_TOOLNAME;Sharpening +TP_LOCALLAB_SHARRADIUS;Radius +TP_LOCALLAB_SHORTC;Short Curves 'L' Mask +TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7. +TP_LOCALLAB_SHOWC;Mask and modifications +TP_LOCALLAB_SHOWC1;Merge file +TP_LOCALLAB_SHOWCB;Mask and modifications +TP_LOCALLAB_SHOWDCT;Show Fourier (ƒ) process +TP_LOCALLAB_SHOWE;Mask and modifications +TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct) +TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first) +TP_LOCALLAB_SHOWLC;Mask and modifications +TP_LOCALLAB_SHOWMASK;Show mask +TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Displays masks and modifications.\nBeware, you can only view one tool mask at a time.\nShow modified image: shows the modified image including the effect of any adjustments and masks.\nShow modified areas without mask: shows the modifications before any masks are applied.\nShow modified areas with mask: shows the modifications after a mask has been applied.\nShow mask: shows the aspect of the mask including the effect of any curves and filters.\nShow spot structure: allows you to see the structure-detection mask when the 'Spot structure' cursor is activated (when available).\nNote: The mask is applied before the shape detection algorithm. +TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Allows you to visualize the different stages of the Fourier process.\n Laplace - calculates the second derivative of the Laplace transform as a function of the threshold.\nFourier - shows the Laplacian transform with DCT.\nPoisson - shows the solution of the Poisson DCE.\nNo luminance normalization - shows result without any luminance normalization. +TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise +TP_LOCALLAB_SHOWMASKTYP2;Denoise +TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise +TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Can be used with 'Mask and modifications'.\nIf 'Blur and noise' is selected, the mask cannot be used for Denoise.\nIf Denoise is selected, the mask cannot be used for 'Blur and noise'.\nIf 'Blur and noise + Denoise' is selected, the mask is shared. Note that in this case, the Scope sliders for both 'Blur and noise' and Denoise will be active so it is advisable to use the option 'Show modifications with mask' when making any adjustments. +TP_LOCALLAB_SHOWMNONE;Show modified image +TP_LOCALLAB_SHOWMODIF;Show modified areas without mask +TP_LOCALLAB_SHOWMODIF2;Show modified areas +TP_LOCALLAB_SHOWMODIFMASK;Show modified areas with mask +TP_LOCALLAB_SHOWNORMAL;No luminance normalization +TP_LOCALLAB_SHOWPLUS;Mask and modifications (Blur & Denoise) +TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ) +TP_LOCALLAB_SHOWR;Mask and modifications +TP_LOCALLAB_SHOWREF;Preview ΔE +TP_LOCALLAB_SHOWS;Mask and modifications +TP_LOCALLAB_SHOWSTRUC;Show spot structure(Advanced) +TP_LOCALLAB_SHOWSTRUCEX;Show spot structure(Advanced) +TP_LOCALLAB_SHOWT;Mask and modifications +TP_LOCALLAB_SHOWVI;Mask and modifications +TP_LOCALLAB_SHRESFRA;Shadows/Highlights & TRC +TP_LOCALLAB_SHTRC_TOOLTIP;Based on 'working profile' (only those provided), modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones.\nIt is recommended that the TRC of both devices (monitor and output profile) be sRGB (default). +TP_LOCALLAB_SH_TOOLNAME;Shadows/Highlights & Tone Equalizer +TP_LOCALLAB_SIGFRA;Sigmoid Q & Log encoding Q +TP_LOCALLAB_SIGJZFRA;Sigmoid Jz +TP_LOCALLAB_SIGMAWAV;Attenuation response +TP_LOCALLAB_SIGMOIDBL;Blend +TP_LOCALLAB_SIGMOIDLAMBDA;Contrast +TP_LOCALLAB_SIGMOIDQJ;Uses Black Ev & White Ev +TP_LOCALLAB_SIGMOIDTH;Threshold (Gray point) +TP_LOCALLAB_SIGMOID_TOOLTIP;Allows you to simulate a Tone-mapping appearance using both the'Ciecam' (or 'Jz') and 'Sigmoid' function.\nThree sliders: a) Contrast acts on the shape of the sigmoid curve and consequently on the strength; b) Threshold (Gray point) distributes the action according to the luminance; c)Blend acts on the final aspect of the image, contrast and luminance. +TP_LOCALLAB_SLOMASKCOL;Slope +TP_LOCALLAB_SLOMASK_TOOLTIP;Adjusting Gamma and Slope can provide a soft and artifact-free transformation of the mask by progressively modifying 'L' to avoid any discontinuities. +TP_LOCALLAB_SLOSH;Slope +TP_LOCALLAB_SOFT;Soft Light & Original Retinex +TP_LOCALLAB_SOFTM;Soft Light +TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Apply a Soft-light blend (identical to the global adjustment). Carry out dodge and burn using the original Retinex algorithm. +TP_LOCALLAB_SOFTRADIUSCOL;Soft radius +TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP;Applies a guided filter to the output image to reduce possible artifacts. +TP_LOCALLAB_SOFTRETI;Reduce ΔE artifacts +TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex +TP_LOCALLAB_SOURCE_ABS;Absolute luminance +TP_LOCALLAB_SOURCE_GRAY;Mean luminance (Yb%) +TP_LOCALLAB_SPECCASE;Specific cases +TP_LOCALLAB_SPECIAL;Special use of RGB curves +TP_LOCALLAB_SPECIAL_TOOLTIP;The checkbox allows you to remove all other actions i.e. 'Scope', masks, sliders etc., (except for transitions) and use just the effect of the RGB tone-curve. +TP_LOCALLAB_SPOTNAME;New Spot +TP_LOCALLAB_STD;Standard +TP_LOCALLAB_STR;Strength +TP_LOCALLAB_STRBL;Strength +TP_LOCALLAB_STREN;Compression strength +TP_LOCALLAB_STRENG;Strength +TP_LOCALLAB_STRENGR;Strength +TP_LOCALLAB_STRENGRID_TOOLTIP;You can adjust the desired effect with 'strength', but you can also use the 'scope' function which allows you to delimit the action (e.g. to isolate a particular color). +TP_LOCALLAB_STRENGTH;Noise +TP_LOCALLAB_STRGRID;Strength +TP_LOCALLAB_STRUC;Structure +TP_LOCALLAB_STRUCCOL;Spot structure +TP_LOCALLAB_STRUCCOL1;Spot structure +TP_LOCALLAB_STRUCT_TOOLTIP;Uses the Sobel algorithm to take into account structure for shape detection.\nActivate 'Mask and modifications' > 'Show spot structure' (Advanced mode) to see a preview of the mask (without modifications).\n\nCan be used in conjunction with the Structure Mask, Blur Mask and 'Local contrast' (by wavelet level) to improve edge detection.\n\nEffects of adjustments using Lightness, Contrast, Chrominance, Exposure or other non-mask-related tools visible using either 'Show modified image' or 'Show modified areas with mask'. +TP_LOCALLAB_STRUMASKCOL;Structure mask strength +TP_LOCALLAB_STRUMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' unchecked: In this case a mask showing the structure will be generated even if none of the 3 curves is activated. Structure masks are available for mask (Blur and denoise') and mask(Color & Light). +TP_LOCALLAB_STRUSTRMASK_TOOLTIP;Moderate use of this slider is recommended! +TP_LOCALLAB_STYPE;Shape method +TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent. +TP_LOCALLAB_SYM;Symmetrical (mouse) +TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders) +TP_LOCALLAB_TARGET_GRAY;Mean luminance (Yb%) +TP_LOCALLAB_TE_PIVOT;Pivot (Ev) +TP_LOCALLAB_THRES;Threshold structure +TP_LOCALLAB_THRESDELTAE;ΔE scope threshold +TP_LOCALLAB_THRESRETI;Threshold +TP_LOCALLAB_THRESWAV;Balance threshold +TP_LOCALLAB_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sig=%4 +TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. +TP_LOCALLAB_TM;Tone Mapping +TP_LOCALLAB_TM_MASK;Use transmission map +TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This slider affects edge sensitivity.\n The greater the value, the more likely a change in contrast will be interpreted as an 'edge'.\n If set to zero the tone mapping will have an effect similar to unsharp masking. +TP_LOCALLAB_TONEMAPGAM_TOOLTIP;The Gamma slider shifts the tone-mapping effect towards either the shadows or the highlights. +TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems. +TP_LOCALLAB_TONEMAP_TOOLTIP;Same as the tone mapping tool in the main menu.\nThe main-menu tool must be deactivated if this tool is used. +TP_LOCALLAB_TONEMASCALE_TOOLTIP;This slider allows you to adjust the transition between 'local' and 'global' contrast.\nThe greater the value, the larger a detail needs to be for it to be boosted. +TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping +TP_LOCALLAB_TOOLCOL;Structure mask as tool +TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP;Allows you to modify the mask, if one exists. +TP_LOCALLAB_TOOLMASK;Mask Tools +TP_LOCALLAB_TOOLMASK_2;Wavelets +TP_LOCALLAB_TOOLMASK_TOOLTIP;Structure mask (slider) with the checkbox 'Structure mask as tool' checked: in this case a mask showing the structure will be generated after one or more of the 2 curves L(L) or LC(H) has been modified.\n Here, the 'Structure mask' behaves like the other Mask tools : Gamma, Slope, etc.\n It allows you to vary the action on the mask according to the structure of the image. +TP_LOCALLAB_TRANSIT;Transition Gradient +TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY +TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Allows you to vary the y-axis transition. +TP_LOCALLAB_TRANSITVALUE;Transition value +TP_LOCALLAB_TRANSITWEAK;Transition decay (linear-log) +TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition decay function: 1 linear , 2 parabolic, 3 cubic up to ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelets, Color & Light). +TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas as a percentage of the 'radius'. +TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain +TP_LOCALLAB_TRANSMISSIONMAP;Transmission map +TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positive values (max).\nOrdinate: amplification or reduction.\nYou can adjust this curve to change the Transmission and reduce artifacts. +TP_LOCALLAB_USEMASK;Laplacian +TP_LOCALLAB_VART;Variance (contrast) +TP_LOCALLAB_VIBRANCE;Vibrance & Warm/Cool +TP_LOCALLAB_VIBRA_TOOLTIP;Adjusts vibrance (essentially the same as the global adjustment).\nCarries out the equivalent of a white-balance adjustment using a CIECAM algorithm. +TP_LOCALLAB_VIB_TOOLNAME;Vibrance & Warm/Cool +TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot. +TP_LOCALLAB_WARM;Warm/Cool & Color artifacts +TP_LOCALLAB_WARM_TOOLTIP;This slider uses the CIECAM algorithm and acts as a White Balance control to make the color temperature of the selected area warmer or cooler.\nIt can also reduce color artifacts in some cases. +TP_LOCALLAB_WASDEN_TOOLTIP;Luminance noise reduction: the left-hand side of the curve including the dark-gray/light-gray boundary corresponds to the first 3 levels 0, 1, 2 (fine detail). The right hand side of the curve corresponds to the coarser details (level 3, 4, 5, 6). +TP_LOCALLAB_WAT_BALTHRES_TOOLTIP;Balances the action within each level. +TP_LOCALLAB_WAT_BLURLC_TOOLTIP;The default blur setting affects all 3 L*a* b* components (luminance and colour).\nWhen checked, only luminance is blurred. +TP_LOCALLAB_WAT_CLARIC_TOOLTIP;'Merge chroma' is used to select the intensity of the desired effect on chrominance. +TP_LOCALLAB_WAT_CLARIL_TOOLTIP;'Merge luma' is used to select the intensity of the desired effect on luminance. +TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP;'Chroma levels': adjusts the 'a' and 'b' components of Lab* as a proportion of the luminance value. +TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP;Offset modifies the balance between low-contrast and high-contrast details.\nHigh values will amplify contrast changes to the higher-contrast details, whereas low values will amplify contrast changes to low-contrast details.\nBy using a low 'Attenuation response' value you can select which contrast values will be enhanced. +TP_LOCALLAB_WAT_DELTABAL_TOOLTIP;By moving the slider to the left, the lower levels are accentuated. To the right, the lower levels are reduced and the higher levels accentuated. +TP_LOCALLAB_WAT_EXPRESID_TOOLTIP;The residual image behaves in the same way as the main image when making adjustments to contrast, chroma etc. +TP_LOCALLAB_WAT_GRADW_TOOLTIP;The more you move the slider to the right, the more effective the detection algorithm will be and the less noticeable the effects of local contrast. +TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP;Low to high local contrast from left to right on the x-axis.\nIncreases or decreases local contrast on the y-axis. +TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP;You can adjust the distribution of local contrast by wavelet level based on the initial intensity of the contrast. This will modify the effects of perspective and relief in the image, and/or reduce the contrast values for very low initial contrast levels. +TP_LOCALLAB_WAT_ORIGLC_TOOLTIP;'Merge only with original image', prevents the 'Wavelet Pyramid' settings from interfering with 'Clarity' and 'Sharp mask'. +TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP;Blurs the residual image, independent of the levels. +TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP;Compresses the residual image to increase or reduce contrast. +TP_LOCALLAB_WAT_SIGMALC_TOOLTIP;The effect of the local contrast adjustment is stronger for medium-contrast details and weaker for high and low-contrast details.\n This slider controls how quickly the effect dampens towards the extreme contrasts.\nThe higher the value of the slider, the wider the range of contrasts that will receive the full effect of the local contrast adjustment and the higher the risk of generating artifacts.\nThe lower the value, the more the effect will be pinpointed towards a narrow range of contrast values. +TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP;Intensity of edge-effect detection. +TP_LOCALLAB_WAT_STRWAV_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP;Range of wavelet levels used throughout the Wavelets module. +TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP;Allows you to blur each level of decomposition.\nThe finest to coarsest levels of decomposition are from left to right. +TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP;Acts on the balance of the three directions (horizontal, vertical and diagonal) based on the luminance of the image.\nBy default the shadows or highlights are reduced to avoid artifacts. +TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP;Shows all of the 'Edge sharpness' tools. It is advisable to read the Wavelet Levels documentation. +TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP;Allows you to adjust the maximum effect of blurring on the levels. +TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP;Low to high local contrast from left to right on the x-axis\nIncrease or decrease local contrast on the y-axis. +TP_LOCALLAB_WAT_WAVTM_TOOLTIP;The lower (negative) part compresses each level of decomposition creating a tone mapping effect.\nThe upper (positive) part attenuates the contrast by level.\nThe finest to coarsest levels of decomposition are from left to right on the x-axis. +TP_LOCALLAB_WAV;Local contrast +TP_LOCALLAB_WAVBLUR_TOOLTIP;Allows you to blur each level of the decomposition, as well as the residual image. +TP_LOCALLAB_WAVCOMP;Compression by level +TP_LOCALLAB_WAVCOMPRE;Compression by level +TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Allows you to apply tone mapping or reduce local contrast on individual levels.\nFine to coarse detail levels from left to right on the x-axis. +TP_LOCALLAB_WAVCOMP_TOOLTIP;Allows you to apply local contrast based on the direction of the wavelet decomposition : horizontal, vertical, diagonal. +TP_LOCALLAB_WAVCON;Contrast by level +TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels. Fine to coarse detail levels from left to right on the x-axis. +TP_LOCALLAB_WAVDEN;Luminance denoise +TP_LOCALLAB_WAVE;Wavelets +TP_LOCALLAB_WAVEDG;Local contrast +TP_LOCALLAB_WAVEEDG_TOOLTIP;Improves sharpness by targeting the action of local contrast on the edges. It has the same functions as the corresponding module in Wavelet Levels and uses the same settings. +TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP;Range of wavelet levels used in 'Local contrast' (by wavelet level). +TP_LOCALLAB_WAVGRAD_TOOLTIP;Allows the local contrast to be varied according to a chosen gradient and angle. The variation of the luminance signal is taken into account and not the luminance. +TP_LOCALLAB_WAVHUE_TOOLTIP;Allows you to reduce or increase the denoise based on hue. +TP_LOCALLAB_WAVLEV;Blur by level +TP_LOCALLAB_WAVMASK;Local contrast +TP_LOCALLAB_WAVMASK_TOOLTIP;Uses wavelets to modify the local contrast of the mask and reinforce or reduce the structure (skin, buildings, etc.). +TP_LOCALLAB_WEDIANHI;Median Hi +TP_LOCALLAB_WHITE_EV;White Ev +TP_LOCALLAB_ZCAMFRA;ZCAM Image Adjustments +TP_LOCALLAB_ZCAMTHRES;Retrieve high datas +TP_LOCAL_HEIGHT;Bottom +TP_LOCAL_HEIGHT_T;Top +TP_LOCAL_WIDTH;Right +TP_LOCAL_WIDTH_L;Left +TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Evenly distributed.\nHigh = Reinforce strong light. 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_NEUTRAL_TOOLTIP;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 @@ -1804,8 +3499,29 @@ TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse, TP_PCVIGNETTE_STRENGTH;Strength TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). TP_PDSHARPENING_LABEL;Capture Sharpening +TP_PERSPECTIVE_CAMERA_CROP_FACTOR;Crop factor +TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH;Focal length +TP_PERSPECTIVE_CAMERA_FRAME;Correction +TP_PERSPECTIVE_CAMERA_PITCH;Vertical +TP_PERSPECTIVE_CAMERA_ROLL;Rotation +TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL;Horizontal shift +TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL;Vertical shift +TP_PERSPECTIVE_CAMERA_YAW;Horizontal +TP_PERSPECTIVE_CONTROL_LINES;Control lines +TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP;Ctrl+drag: Draw new line\nRight-click: Delete line +TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP;At least two horizontal or two vertical control lines required. TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspective +TP_PERSPECTIVE_METHOD;Method +TP_PERSPECTIVE_METHOD_CAMERA_BASED;Camera-based +TP_PERSPECTIVE_METHOD_SIMPLE;Simple +TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME;Post-correction adjustment +TP_PERSPECTIVE_PROJECTION_PITCH;Vertical +TP_PERSPECTIVE_PROJECTION_ROTATE;Rotation +TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL;Horizontal shift +TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL;Vertical shift +TP_PERSPECTIVE_PROJECTION_YAW;Horizontal +TP_PERSPECTIVE_RECOVERY_FRAME;Recovery TP_PERSPECTIVE_VERTICAL;Vertical TP_PFCURVE_CURVEEDITOR_CH;Hue TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. @@ -1823,11 +3539,15 @@ 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_PREPROCWB_LABEL;Preprocess White Balance +TP_PREPROCWB_MODE;Mode +TP_PREPROCWB_MODE_AUTO;Auto +TP_PREPROCWB_MODE_CAMERA;Camera 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_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_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 @@ -1848,9 +3568,11 @@ TP_RAW_3PASSBEST;3-pass (Markesteijn) TP_RAW_4PASS;3-pass+fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEBILINEAR;AMaZE+Bilinear TP_RAW_AMAZEVNG4;AMaZE+VNG4 TP_RAW_BORDER;Border TP_RAW_DCB;DCB +TP_RAW_DCBBILINEAR;DCB+Bilinear TP_RAW_DCBENHANCE;DCB enhancement TP_RAW_DCBITERATIONS;Number of DCB iterations TP_RAW_DCBVNG4;DCB+VNG4 @@ -1878,6 +3600,8 @@ 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_PIXELSHIFTAVERAGE;Use average for moving parts +TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP;Use average of all frames instead of selected frame for regions with motion.\nGives motion effect on slow moving (overlapping) objects. TP_RAW_PIXELSHIFTBLUR;Blur motion mask TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion TP_RAW_PIXELSHIFTEPERISO;Sensitivity @@ -1888,7 +3612,7 @@ TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels i 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_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask. TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts 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 @@ -1903,11 +3627,12 @@ TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing 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_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_RCD;RCD +TP_RAW_RCDBILINEAR;RCD+Bilinear 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.\n+fast gives less artifacts in flat areas +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_RAW_XTRANS;X-Trans @@ -1921,9 +3646,13 @@ TP_RESIZE_H;Height: TP_RESIZE_HEIGHT;Height TP_RESIZE_LABEL;Resize TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_LE;Long Edge: +TP_RESIZE_LONG;Long Edge TP_RESIZE_METHOD;Method: TP_RESIZE_NEAREST;Nearest TP_RESIZE_SCALE;Scale +TP_RESIZE_SE;Short Edge: +TP_RESIZE_SHORT;Short Edge TP_RESIZE_SPECIFY;Specify: TP_RESIZE_W;Width: TP_RESIZE_WIDTH;Width @@ -1934,7 +3663,7 @@ 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) -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_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 @@ -1942,7 +3671,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 the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Increase or reduce the transmission map to achieve the desired luminance. The x-axis is the transmission. The y-axis is the gain. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Free TP_RETINEX_GAMMA_HIGH;High @@ -1957,7 +3686,7 @@ TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Va 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_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) @@ -1976,11 +3705,11 @@ 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_MLABEL;Restored data Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;The values should be close to Min=0 Max=32768 (log mode) but other values are possible.You can adjust 'Clip restored data (gain)' and 'Offset' to normalize.\nRecovers image data without blending. TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Reset -TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. +TP_RETINEX_NEUTRAL_TOOLTIP;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. @@ -1990,9 +3719,9 @@ 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_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;ransmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can normalize the results with the threshold slider. 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. @@ -2001,7 +3730,7 @@ 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_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 @@ -2016,7 +3745,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Degree TP_ROTATE_LABEL;Rotate TP_ROTATE_SELECTLINE;Select Straight Line -TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter +TP_SAVEDIALOG_OK_TOOLTIP;Shortcut: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Highlights TP_SHADOWSHLIGHTS_HLTONALW;Highlights tonal width TP_SHADOWSHLIGHTS_LABEL;Shadows/Highlights @@ -2053,10 +3782,25 @@ 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_DEFAULT_SIZE;Default spot size +TP_SPOT_ENTRYCHANGED;Point changed +TP_SPOT_HINT;Click on this button to be able to operate on the preview area.\n\nTo edit a spot, hover the white mark locating an edited area, making the editing geometry appear.\n\nTo add a spot, press Ctrl and left mouse button, drag the circle (Ctrl key can be released) to a source location, then release the mouse button.\n\nTo move the source or destination spot, hover its center then drag it.\n\nThe inner circle (maximum effect area) and the 'feather' circle can be resized by hovering them (the circle becomes orange) and dragging it (the circle becomes red).\n\nWhen the changes are done, right click outside any spot to end the Spot editing mode, or click on this button again. +TP_SPOT_LABEL;Spot Removal TP_TM_FATTAL_AMOUNT;Amount TP_TM_FATTAL_ANCHOR;Anchor TP_TM_FATTAL_LABEL;Dynamic Range Compression TP_TM_FATTAL_THRESHOLD;Detail +TP_TONE_EQUALIZER_BAND_0;Blacks +TP_TONE_EQUALIZER_BAND_1;Shadows +TP_TONE_EQUALIZER_BAND_2;Midtones +TP_TONE_EQUALIZER_BAND_3;Highlights +TP_TONE_EQUALIZER_BAND_4;Whites +TP_TONE_EQUALIZER_BANDS;Bands +TP_TONE_EQUALIZER_DETAIL;Regularization +TP_TONE_EQUALIZER_LABEL;Tone Equalizer +TP_TONE_EQUALIZER_PIVOT;Pivot (Ev) +TP_TONE_EQUALIZER_SHOW_COLOR_MAP;Show tonal map TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2064,9 +3808,9 @@ 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_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H). TP_VIBRANCE_LABEL;Vibrance -TP_VIBRANCE_PASTELS;Pastel Tones +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 @@ -2090,22 +3834,28 @@ 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_APPLYTO;Apply to TP_WAVELET_AVOID;Avoid color shift TP_WAVELET_B0;Black -TP_WAVELET_B1;Grey +TP_WAVELET_B1;Gray 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_BALCHROM;Equalizer Color TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. +TP_WAVELET_BALLUM;Denoise equalizer White-Black 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_BL;Blur levels +TP_WAVELET_BLCURVE;Blur by levels +TP_WAVELET_BLURFRAME;Blur +TP_WAVELET_BLUWAV;Attenuation response +TP_WAVELET_CBENAB;Toning and Color balance +TP_WAVELET_CB_TOOLTIP;With high values you can create special effects, similar to those achieved with the Chroma Module, but focused on the residual image\nWith moderate values you can manually correct the white balance. TP_WAVELET_CCURVE;Local contrast TP_WAVELET_CH1;Whole chroma range TP_WAVELET_CH2;Saturated/pastel @@ -2113,29 +3863,42 @@ 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_CHROFRAME;Denoise chrominance +TP_WAVELET_CHROMAFRAME;Chroma +TP_WAVELET_CHROMCO;Chrominance Coarse +TP_WAVELET_CHROMFI;Chrominance Fine 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_CHRWAV;Blur chroma +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_CLA;Clarity +TP_WAVELET_CLARI;Sharp-mask and Clarity +TP_WAVELET_COLORT;Opacity red-green TP_WAVELET_COMPCONT;Contrast +TP_WAVELET_COMPEXPERT;Advanced 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_COMPLEXLAB;Complexity +TP_WAVELET_COMPLEX_TOOLTIP;Standard: shows a reduced set of tools suitable for most processing operations.\nAdvanced: shows the complete set of tools for advanced processing operations. +TP_WAVELET_COMPNORMAL;Standard TP_WAVELET_COMPTM;Tone mapping TP_WAVELET_CONTEDIT;'After' contrast curve +TP_WAVELET_CONTFRAME;Contrast - Compression 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_CONTRA_TOOLTIP;Changes the residual image contrast. TP_WAVELET_CTYPE;Chrominance control +TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%. 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_CL_TOOLTIP;Applies a final contrast-luminance curve at the end of the wavelet processing. TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image hue as a function of hue. TP_WAVELET_DALL;All directions TP_WAVELET_DAUB;Edge performance TP_WAVELET_DAUB2;D2 - low @@ -2143,62 +3906,101 @@ 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_DAUBLOCAL;Wavelet Edge performance +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 first levels. However the quality is not strictly related to this coefficient and can vary depending on image and use. +TP_WAVELET_DEN5THR;Guided threshold +TP_WAVELET_DENCURV;Curve +TP_WAVELET_DENL;Correction structure +TP_WAVELET_DENLH;Guided threshold levels 1-4 +TP_WAVELET_DENLOCAL_TOOLTIP;Use a curve in order to guide the denoising according to the local contrast.\nThe areas are denoised, the structures are maintained. +TP_WAVELET_DENMIX_TOOLTIP;The local-contrast reference value used by the guided filter.\nDepending on the image, results can vary depending on whether the noise is measured before or after the noise reduction. These four choices allow you to take into account various combinations of the original and modified (denoised) images to find the best compromise. +TP_WAVELET_DENOISE;Guide curve based on Local contrast +TP_WAVELET_DENOISEGUID;Guided threshold based on hue +TP_WAVELET_DENOISEH;High levels Curve Local contrast +TP_WAVELET_DENOISEHUE;Denoise hue equalizer +TP_WAVELET_DENQUA;Mode +TP_WAVELET_DENSIGMA_TOOLTIP;Adapts the shape of the guide. +TP_WAVELET_DENSLI;Slider +TP_WAVELET_DENSLILAB;Method +TP_WAVELET_DENWAVGUID_TOOLTIP;Uses hue to reduce or increase the action of the guided filter. +TP_WAVELET_DENWAVHUE_TOOLTIP;Amplify or reduce denoising depending on the color. +TP_WAVELET_DETEND;Details +TP_WAVELET_DIRFRAME;Directional contrast TP_WAVELET_DONE;Vertical TP_WAVELET_DTHR;Diagonal TP_WAVELET_DTWO;Horizontal TP_WAVELET_EDCU;Curve +TP_WAVELET_EDEFFECT;Attenuation response +TP_WAVELET_EDEFFECT_TOOLTIP;This slider selects the range of contrast values that will receive the full effect of any adjustment. 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 and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. -TP_WAVELET_EDGE;Edge Sharpness +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+std. dev. and 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_EDGEDETECTTHR2;Edge enhancement +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This slider sets a threshold below which finer details won't be considered as an edge. 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 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 +TP_WAVELET_EDRAD_TOOLTIP;This adjustment controls the local enhancement. 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_FINCFRAME;Final local contrast TP_WAVELET_FINEST;Finest -TP_WAVELET_HIGHLIGHT;Highlight luminance range +TP_WAVELET_FINTHR_TOOLTIP;Uses local contrast to reduce or increase the action of the guided filter. +TP_WAVELET_GUIDFRAME;Final smoothing (guided filter) +TP_WAVELET_HIGHLIGHT;Finer levels luminance range TP_WAVELET_HS1;Whole luminance range -TP_WAVELET_HS2;Shadows/Highlights +TP_WAVELET_HS2;Selective luminance range 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;Hue range 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_LABEL;Wavelet levels +TP_WAVELET_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4 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_LEVDEN;Level 5-6 denoise +TP_WAVELET_LEVDIR_ALL;All levels, in all directions +TP_WAVELET_LEVDIR_INF;Finer detail levels, including selected level TP_WAVELET_LEVDIR_ONE;One level -TP_WAVELET_LEVDIR_SUP;Above the level +TP_WAVELET_LEVDIR_SUP;Coarser detail levels, excluding selected level +TP_WAVELET_LEVELHIGH;Radius 5-6 +TP_WAVELET_LEVELLOW;Radius 1-4 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_LEVELSIGM;Radius +TP_WAVELET_LEVELS_TOOLTIP;Choose the number of wavelet decomposition levels for the image.\nMore levels require more RAM and require a longer processing time. TP_WAVELET_LEVF;Contrast +TP_WAVELET_LEVFOUR;Level 5-6 denoise and guided threshold 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_LIMDEN;Interaction levels 5-6 on levels 1-4 +TP_WAVELET_LINKEDG;Link to Edge Sharpness Strength TP_WAVELET_LIPST;Enhanced algoritm -TP_WAVELET_LOWLIGHT;Shadow luminance range +TP_WAVELET_LOWLIGHT;Coarser levels luminance range +TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise. 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_MERGEC;Merge chroma +TP_WAVELET_MERGEL;Merge luma +TP_WAVELET_MIXCONTRAST;Reference +TP_WAVELET_MIXDENOISE;Denoise +TP_WAVELET_MIXMIX;Mixed 50% noise - 50% denoise +TP_WAVELET_MIXMIX70;Mixed 30% noise - 70% denoise +TP_WAVELET_MIXNOISE;Noise TP_WAVELET_NEUTRAL;Neutral TP_WAVELET_NOIS;Denoise TP_WAVELET_NOISE;Denoise and Refine @@ -2207,50 +4009,81 @@ 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_OFFSET_TOOLTIP;Offset modifies the balance between low contrast and high contrast details.\nHigh values will amplify contrast changes to the higher contrast details, whereas low values will amplify contrast changes to low contrast details.\nBy using a low Attenuation response value you can select which contrast values will be enhanced. +TP_WAVELET_OLDSH;Algorithm using negatives values +TP_WAVELET_OPACITY;Opacity blue-yellow TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -TP_WAVELET_OPACITYWL;Final local contrast +TP_WAVELET_OPACITYWL;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_PROTAB;Protection +TP_WAVELET_QUAAGRES;Aggressive +TP_WAVELET_QUACONSER;Conservative +TP_WAVELET_RADIUS;Radius shadows - highlight +TP_WAVELET_RANGEAB;Range a and b % TP_WAVELET_RE1;Reinforced TP_WAVELET_RE2;Unchanged TP_WAVELET_RE3;Reduced -TP_WAVELET_RESCHRO;Chroma +TP_WAVELET_RESBLUR;Blur luminance +TP_WAVELET_RESBLURC;Blur chroma +TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%. +TP_WAVELET_RESCHRO;Strength 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_SHA;Sharp mask +TP_WAVELET_SHFRAME;Shadows/Highlights +TP_WAVELET_SHOWMASK;Show wavelet 'mask' +TP_WAVELET_SIGM;Radius +TP_WAVELET_SIGMA;Attenuation response +TP_WAVELET_SIGMAFIN;Attenuation response +TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values. 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_SKY;Hue targetting/protection +TP_WAVELET_SKY_TOOLTIP;Allows you to target or protect a range of hues.\nAt -100 selected hues are targetted.\nAt 0 all hues are treated equally.\nAt +100 selected hues are protected while all other hues are targetted. +TP_WAVELET_SOFTRAD;Soft radius +TP_WAVELET_STREN;Refine +TP_WAVELET_STREND;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_THRDEN_TOOLTIP;Generates a stepped curve used to guide the noise reduction as a function of local contrast. The denoise will be applied to uniform low local-contrast areas. Areas with detail (higher local contrast) will be preserved. +TP_WAVELET_THREND;Local contrast threshold +TP_WAVELET_THRESHOLD;Finer levels +TP_WAVELET_THRESHOLD2;Coarser levels +TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of 'wavelet levels' will be affected by the Shadow luminance range. +TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range. TP_WAVELET_THRH;Highlights threshold -TP_WAVELET_TILESBIG;Big tiles +TP_WAVELET_TILESBIG;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_TMEDGS;Edge stopping +TP_WAVELET_TMSCALE;Scale 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_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. TP_WAVELET_TMTYPE;Compression method TP_WAVELET_TON;Toning +TP_WAVELET_TONFRAME;Excluded colors +TP_WAVELET_USH;None +TP_WAVELET_USHARP;Clarity method +TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, you can choose any level (in Settings) from 1 to 4 for processing.\nIf you select Clarity, you can choose any level (in Settings) between 5 and Extra. +TP_WAVELET_WAVLOWTHR;Low contrast threshold +TP_WAVELET_WAVOFFSET;Offset TP_WBALANCE_AUTO;Auto +TP_WBALANCE_AUTOITCGREEN;Temperature correlation +TP_WBALANCE_AUTOOLD;RGB grey +TP_WBALANCE_AUTO_HEADER;Automatic TP_WBALANCE_CAMERA;Camera TP_WBALANCE_CLOUDY;Cloudy TP_WBALANCE_CUSTOM;Custom 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_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 @@ -2278,6 +4111,10 @@ 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_MULLABEL;Multipliers: r=%1 g=%2 b=%3 +TP_WBALANCE_MULLABEL_TOOLTIP;Values given for information purposes. You cannot change them. +TP_WBALANCE_OBSERVER10;Observer 10° instead of Observer 2° +TP_WBALANCE_OBSERVER10_TOOLTIP;The color management in Rawtherapee (White balance, channel multipliers, highlight recovery,...) uses the spectral data of the illuminants and colors. Observer is an important parameter of this management which takes into account the angle of perception of the eye. In 1931 it was fixed at 2° (privileges the use of the cones). In 1964 it was fixed at 10° (privileges the use of the cones, but partially takes into account the rods).\nTo avoid a (rare) drift of the colors due to the choice Observer 10° - probably due to the conversion matrix - Observer 2° must be selected.\nIn a majority of cases Observer 10° (default) will be a more relevant choice. TP_WBALANCE_PICKER;Pick TP_WBALANCE_SHADE;Shade TP_WBALANCE_SIZE;Size: @@ -2286,8 +4123,10 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. +TP_WBALANCE_STUDLABEL;Correlation factor: %1 +TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good. 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_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 TP_WBALANCE_TUNGSTEN;Tungsten TP_WBALANCE_WATER1;UnderWater 1 diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index 580390b28..fbd8bc6cb 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 58e0a5604..cf31210e6 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -9,11 +9,12 @@ # which can be useful if you want to keep the application and all the cache data in a single place, # an external HD for example MultiUser=true +UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f @@ -38,5 +39,6 @@ CustomProfileBuilder= #ImgDefault=Neutral [GUI] -FontFamily=Helvetica Regular -CPFontFamily=Helvetica Regular +# Set the included font as default +FontFamily=Droid Sans Mono Slashed +CPFontFamily=Droid Sans Mono Slashed diff --git a/rtdata/options/options.win b/rtdata/options/options.win index a54e021b1..00b74d07f 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/profiles/Auto-Matched Curve - ISO High.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO High.pp3 index 99f0af8fe..16c9a71f5 100644 --- a/rtdata/profiles/Auto-Matched Curve - ISO High.pp3 +++ b/rtdata/profiles/Auto-Matched Curve - ISO High.pp3 @@ -4,7 +4,7 @@ HistogramMatching=true [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Directional Pyramid Denoising] Enabled=true diff --git a/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 index c94077b21..e6c7fb96c 100644 --- a/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 +++ b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 @@ -4,7 +4,7 @@ HistogramMatching=true [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [LensProfile] LcMode=lfauto diff --git a/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3 index f9196bb30..ffb5587b9 100644 --- a/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3 +++ b/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3 @@ -4,7 +4,7 @@ HistogramMatching=true [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Directional Pyramid Denoising] Enabled=true diff --git a/rtdata/profiles/Film Negative - Black and White.pp3 b/rtdata/profiles/Film Negative - Black and White.pp3 new file mode 100644 index 000000000..3bebe7e3c --- /dev/null +++ b/rtdata/profiles/Film Negative - Black and White.pp3 @@ -0,0 +1,41 @@ +[Exposure] +Auto=false +Compensation=0 +HistogramMatching=false +CurveFromHistogramMatching=false +ClampOOG=false +CurveMode=Standard +CurveMode2=Standard +Curve=1;0;0;0.88544601940051371;1; +Curve2=1;0;0;0.0397505754145333;0.020171771436200074;0.54669745433149319;0.69419974733677647;1;1; + +[HLRecovery] +Enabled=false +Method=Coloropp + +[Black & White] +Enabled=true + +[Crop] +FixedRatio=false + +[Color Management] +InputProfile=(camera) +ToneCurve=false +ApplyLookTable=false +ApplyHueSatMap=false +WorkingProfile=Rec2020 +WorkingTRC=none + +[RAW Bayer] +Method=rcd + +[Film Negative] +Enabled=true +RedRatio=1.0 +GreenExponent=1.5 +BlueRatio=1.0 +ColorSpace=1 +RefInput=0;0;0; +RefOutput=0;0;0; +BackCompat=0 diff --git a/rtdata/profiles/Film Negative.pp3 b/rtdata/profiles/Film Negative.pp3 new file mode 100644 index 000000000..e76c61866 --- /dev/null +++ b/rtdata/profiles/Film Negative.pp3 @@ -0,0 +1,38 @@ +[Exposure] +Auto=false +Compensation=0 +HistogramMatching=false +CurveFromHistogramMatching=false +ClampOOG=false +CurveMode=Standard +CurveMode2=Standard +Curve=1;0;0;0.88544601940051371;1; +Curve2=1;0;0;0.0397505754145333;0.020171771436200074;0.54669745433149319;0.69419974733677647;1;1; + +[HLRecovery] +Enabled=false +Method=Coloropp + +[Crop] +FixedRatio=false + +[Color Management] +InputProfile=(camera) +ToneCurve=false +ApplyLookTable=false +ApplyHueSatMap=false +WorkingProfile=Rec2020 +WorkingTRC=none + +[RAW Bayer] +Method=rcd + +[Film Negative] +Enabled=true +RedRatio=1.360 +GreenExponent=1.5 +BlueRatio=0.86 +ColorSpace=1 +RefInput=0;0;0; +RefOutput=0;0;0; +BackCompat=0 diff --git a/rtdata/profiles/Pop/Pop 1.pp3 b/rtdata/profiles/Pop/Pop 1.pp3 index 2152a268b..cbdf4ab5b 100644 --- a/rtdata/profiles/Pop/Pop 1.pp3 +++ b/rtdata/profiles/Pop/Pop 1.pp3 @@ -19,7 +19,7 @@ Curve2=0; [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Luminance Curve] Enabled=true diff --git a/rtdata/profiles/Pop/Pop 2 Lab.pp3 b/rtdata/profiles/Pop/Pop 2 Lab.pp3 index 796aeb5ba..f4c01fd1b 100644 --- a/rtdata/profiles/Pop/Pop 2 Lab.pp3 +++ b/rtdata/profiles/Pop/Pop 2 Lab.pp3 @@ -19,7 +19,7 @@ Curve2=0; [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Luminance Curve] Enabled=true diff --git a/rtdata/profiles/Pop/Pop 3 Skin.pp3 b/rtdata/profiles/Pop/Pop 3 Skin.pp3 index 650b2e189..ebce37b58 100644 --- a/rtdata/profiles/Pop/Pop 3 Skin.pp3 +++ b/rtdata/profiles/Pop/Pop 3 Skin.pp3 @@ -19,7 +19,7 @@ Curve2=0; [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Luminance Curve] Enabled=true diff --git a/rtdata/profiles/Pop/Pop 4 Black-and-White.pp3 b/rtdata/profiles/Pop/Pop 4 Black-and-White.pp3 index 9faa32a0a..1e3527ceb 100644 --- a/rtdata/profiles/Pop/Pop 4 Black-and-White.pp3 +++ b/rtdata/profiles/Pop/Pop 4 Black-and-White.pp3 @@ -19,7 +19,7 @@ Curve2=0; [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Black & White] Enabled=true diff --git a/rtdata/profiles/Standard Film Curve - ISO High.pp3 b/rtdata/profiles/Standard Film Curve - ISO High.pp3 index 4dd3a9b1d..42bbed6d3 100644 --- a/rtdata/profiles/Standard Film Curve - ISO High.pp3 +++ b/rtdata/profiles/Standard Film Curve - ISO High.pp3 @@ -6,7 +6,7 @@ Curve=1;0;0;0.11;0.089999999999999997;0.32000000000000001;0.42999999999999999;0. [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Directional Pyramid Denoising] Enabled=true diff --git a/rtdata/profiles/Standard Film Curve - ISO Low.pp3 b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 index 45fcca730..342b1c8d3 100644 --- a/rtdata/profiles/Standard Film Curve - ISO Low.pp3 +++ b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 @@ -6,7 +6,7 @@ Curve=1;0;0;0.11;0.089999999999999997;0.32000000000000001;0.42999999999999999;0. [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [LensProfile] LcMode=lfauto diff --git a/rtdata/profiles/Standard Film Curve - ISO Medium.pp3 b/rtdata/profiles/Standard Film Curve - ISO Medium.pp3 index 4aff630f5..f3b292094 100644 --- a/rtdata/profiles/Standard Film Curve - ISO Medium.pp3 +++ b/rtdata/profiles/Standard Film Curve - ISO Medium.pp3 @@ -6,7 +6,7 @@ Curve=1;0;0;0.11;0.089999999999999997;0.32000000000000001;0.42999999999999999;0. [HLRecovery] Enabled=true -Method=Blend +Method=Coloropp [Directional Pyramid Denoising] Enabled=true diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in index 350afc45e..8db182587 100644 --- a/rtdata/rawtherapee.desktop.in +++ b/rtdata/rawtherapee.desktop.in @@ -8,6 +8,7 @@ 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[de]=Programm zur Konvertierung und Verarbeitung digitaler RAW-Fotos 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 diff --git a/rtdata/themes/RawTherapee - Legacy-GTK3-20_.css b/rtdata/themes/RawTherapee - Legacy-GTK3-20_.css new file mode 100644 index 000000000..07a0bd65d --- /dev/null +++ b/rtdata/themes/RawTherapee - Legacy-GTK3-20_.css @@ -0,0 +1,1421 @@ +/* + This file is part of RawTherapee. + + Copyright (c) 2015-2017 DrSlony + Copyright (c) 2016-2019 Hombre + Copyright (c) 2016-2019 TooWaBoo + + 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 "size - Legacy.css"; /**/ +/***************************/ + +/* 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; + opacity: 0.7; +} + +.view:selected:not(check):not(radio) { + color: #262626; + background-color: #AAAAAA +} + +/* The Places and Dir browser panels */ +textview.view, treeview.view { + padding: 0; + margin: 0; +} +.view, .textview, textview, textview.view { + background-color: #262626; +} +/* The headers of these panels */ +.view .button { + background-color: #363636; + /*padding: 0.1666666666666666em;*/ +} + +window > box { + padding: 0.416666666666666666em; +} +window.background { + background-color: #484848; +} + +/*** Window decoration *********************************************************/ +@define-color winHeaderbar rgb(50,50,50); + +.csd:not(.popup):not(tooltip) > decoration { + background-color: #484848; + background-image: none; + box-shadow: 0 0.25em 0.75em 0.083333333333333333em rgba(0, 0, 0, 0.5), 0 0 0 0.083333333333333333em #242424; +} +headerbar { + background-color: shade(@winHeaderbar,1.12); + box-shadow: inset 0 0.083333333333333333em rgba(200,200,200,.13); + background-image: linear-gradient(shade(@winHeaderbar,1.14), shade(@winHeaderbar,.86)); + border-bottom-color: #242424; +} +dialog > box { + padding: 0.666666666666666666em; +} +dialog.csd #PrefNotebook > header, +dialog.csd #AboutNotebook > header, +window.csd:not(.fullscreen) #MainNotebook > header.top { + border-top-color: #484848; +} + +/* Window state */ +.maximized > headerbar { + border-radius: 0; +} +/**/ + +/*** End Window decoration *****************************************************/ + +arrow { + min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; +} +cellview { + margin: -1px 0; +} + +overshoot, +undershoot { + background-image: none; /* removes the dashed scrollbar line */ +} + +dialog.background { + background-color: #484848; +} + +box, grid { + border-width: 0; + border-style: none; + border-radius: 0; + margin: 0.083333333333333333em; + padding: 0; + min-height: 0.4166666666666666em; + min-width: 0.4166666666666666em; +} +label { + padding: 0.083333333333333333em 0; + margin: 0.19em; + min-height: 1.333333333333333333em; +} + +/* Affects all frames except in the toolbox */ +frame { + border-width: 0; + border-color: #303030; + border-radius: 0; + border-style: solid; + /*border-style: none none none solid;*/ + padding: 0; + margin: 0; + background-color: rgba(0,0,0,0.); + min-height: 0; + min-width: 0; +} + +/* Create space between frame contents and frame border */ +frame border { + border-width: 0.083333333333333333em; + padding: 0.3333333333333333em; + border-radius: 0.3333333333333333em; + background-color: #383838; + margin: 0; + min-height: 0; + min-width: 0; +} + +frame > label { + margin: 0 0 0 0.3333333333333333em; + color: #D8D8D8; + padding: 0.416666666666666666em 0; +} + +/* affects selection list*/ +entry > window > frame { + margin: 0; +} + +tooltip { + border-radius: 0.416666666666666666em; + background-color: rgba(0,0,0,0.95); + border-style: none; + box-shadow: none; + padding: 0; + margin: 0; +} + +treeview header button { + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} + +/*** Separator *********************************************************************************/ +separator, +.separator { + border: none; + min-width: 0.083333333333333333em; + min-height: 0.083333333333333333em; +} +grid separator, box separator { + background-color: rgba(0, 0, 0, 0.17); +} +grid separator.horizontal, box separator.horizontal { + margin: 0.5em 0.25em; +} +grid separator.vertical, box separator.vertical { + margin: 0.25em 0.5em; +} + +popover separator:not(:only-child) { + margin: 0 0.5em; +} + +paned.horizontal > separator { + margin: 0 0.16666666666666666em; +} +/* Double line separator */ +paned.vertical > separator { + margin: 0.25em 0; +} + +dialog paned.horizontal > separator { + min-width: 0.333333333333333333em; +} + +menu separator { + margin: 0.25em 0.5em; +} + +#Navigator separator { + margin: 0; +} + +.scrollableToolbar separator.vertical { + margin: 0.19em; +} + +#MyExpander separator.horizontal { + margin: 0.25em 0.19em; +} +#MyFileChooserButton separator { +} + +#PlacesPaned .view.separator { +} + +#MetaPanelNotebook separator { + margin: 0.19em 0; +} +/*** end****************************************************************************************/ + +#FileBrowser { + padding: 0.1666666666666666em; + margin: 0; +} + +#FileCatalog { + background-color: #393939; +} +#FileCatalog:selected { + background-color: #565656; +} + +#BeforeAfterContainer frame { + background-color: #262626; + padding: 0; + margin: 0.0833333333333333em; +} + +#BeforeAfterContainer frame border { + border-radius: 0; + margin: 0; + padding: 0; +} + + +/* Frames in the toolbox. Not MyExpander frames. */ +eventbox.frame { + border-color: #565656; +} + +/*** Load - Save dialog ************************************************************************/ +filechooser { +margin-bottom: 0.25em; +} + +filechooser box > box box > button { +margin-top: 0.5em; +margin-right: 0; +} + +filechooser #pathbarbox { + padding: 0.5em; +} + +/* Right side */ +filechooser > box > paned > box:nth-child(3) { + border-width: 0.083333333333333333em; + padding: 0; + margin: 0; +} +filechooser > box > paned > box:nth-child(3) > box > * > * > * > frame { + padding: 0; + margin: -0.6666666666666666em -0.083333333333333333em; +} +/**/ +filechooser placessidebar viewport.frame { + padding: 0; + margin: -0.3333333333333333em 0 -0.083333333333333333em; + border-width: 0.083333333333333333em; +} +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; +} + +/*** end ***************************************************************************************/ + +/*** Scrollbar ***************************************/ +scrollbar { + border: none; + margin: 0; + padding: 0; + background-color: #303030; +} +scrollbar slider { + padding: 0; + margin: 0; + background-color: #808080; +} +scrollbar slider:hover { + background-color: #999999; +} + +scrollbar:not(.overlay-indicator).horizontal { + border-width: 0 0.083333333333333333em 0.083333333333333333em 0.083333333333333333em; +} +scrollbar:not(.overlay-indicator).vertical { + border-width: 0.083333333333333333em 0.083333333333333333em 0.083333333333333333em 0; +} +scrollbar:not(.overlay-indicator).horizontal slider, +scrollbar.horizontal.hovering slider { + min-height: 0.5em; + min-width: 2em; + border-width: 0.25em; +} +scrollbar:not(.overlay-indicator).horizontal.fine-tune slider, +scrollbar.horizontal.hovering.fine-tune slider { + min-height: calc(0.5em - 2px); + border-width: calc(0.25em + 1px); + margin: 0 -1px; + /* + min-height: 0.3333333333333333em; + border-width: 0.3333333333333333em; + margin: 0 -0.0833333333333333em; + */ +} +scrollbar.horizontal.overlay-indicator:not(.hovering) slider { + min-width: 2em; + min-height: 0.25em; + border-width: 0; + border-radius: 0.25em; + margin: 0.166666666666666666em 0.25em; + /*margin: 0 0.1666666666666666em;*/ +} + +scrollbar:not(.overlay-indicator).vertical slider, +scrollbar.vertical.hovering slider { + min-height: 2em; + min-width: 0.5em; + border-width: 0.25em; +} +scrollbar:not(.overlay-indicator).vertical.fine-tune slider, +scrollbar.vertical.hovering.fine-tune slider { + min-width: calc(0.5em - 2px); + border-width: calc(0.25em + 1px); + margin: -0.0833333333333333em 0; + /* + min-width: 0.3333333333333333em; + border-width: 0.3333333333333333em; + margin: -0.0833333333333333em 0; + */ +} +scrollbar.vertical.overlay-indicator:not(.hovering) slider { + min-width: 0.25em; + min-height: 2em; + border-width: 0; + border-radius: 0.25em; + margin: 0.1666666666666666em 0; + /*margin: 0.25em 0.166666666666666666em;*/ +} + +/* Scrollbar stuck workaround */ +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; +} + +/**************************************************/ + +button { + padding: 0; + box-shadow: none; + min-height: 0.4166666666666666em; + min-width: 0.4166666666666666em; + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); +} + +button:disabled { + opacity: 1; +} + +button.flat { + background-image: none; +} + +button.flat:checked { + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} + +checkbutton > check { + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} + +radiobutton > radio { + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} + +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)); +} + +button.popupbutton-arrow { + min-width: 1.5em; +} + +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: 2em; + margin-top: 0.5em; +} +/**/ + +/*** Scale**************************************************************************************/ +scale { + padding: 0; + min-height: 0.4166666666666666em; + margin: 0 0.5833333333333333em 0 0; +} + +scale slider { + /* Slider size is min-width x min-height ; margin have to be half of those values, but negative */ + min-width: 0; + min-height: 0; + margin: -0.583333333333333333em; + padding: 0.583333333333333333em; + border-radius: 1.166666666666666666em; + border-width: 0.083333333333333333em; + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} +scale slider:hover { + background-image: linear-gradient(#444444, #3E3E3E, #393939); +} +scale:disabled slider { + background-image: none; + background-color: #444; + border-color: #282828; +} +scale trough { + margin: 0.5em 0.5em; /* have to be half of "scale slider / min-width min-height" */ + min-height: 0.2em; + min-width: 0.2em; + padding: 0 0.583333333333333333em; + border-width: 0.083333333333333333em; + border-radius: 0.333333333333333333em; + background-color: #2A2A2A; +} +scale:disabled trough { + background-color: #444; + border-color: #282828; +} +scale.color trough { + border-width: 0.083333333333333333em; + min-height: 0.333333333333333333em; + min-width: 0.333333333333333333em; + border-radius: 0; + padding: 0; +} + +scale trough highlight { + border: none; + margin: 0 -0.583333333333333333em; + border-radius: 0.2em; + min-height: 0; + min-width: 0; + padding: 0.1em 0.1em 0 0; /*height of trough */ +} + +scale.fine-tune trough highlight { + padding: 0.5em 0.5em 0 0; + border-radius: 0.5em; +} +/*** end ***************************************************************************************/ + + +/*.EditorTopPanel .button, .ToolBarPanelFileBrowser .button, .EditorZoomPanel .button {*/ +.button { + padding: 0.0833333333333333em; + margin: 0.0833333333333333em; + padding: 0; + min-height: 0.4166666666666666em; + min-width: 0.4166666666666666em; + border-radius: 0.25em; +} + +/* Adjusters */ +.text-button { + padding: 0; +} + +/* Any text-button which is a real button, unlike Slider label */ +.text-button.button { + padding: 0.3333333333333333em; +} + +/* 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)); +} + +/* */ + +.drawingarea { + border-radius: 0; + background-color: #2A2A2A; + border: 0.0833333333333333em solid #888888; +} +.drawingarea:disabled { + background-color: #444; + border-color: #282828; +} + +.drawingarea:selected { + background-color: #565656; + border-radius: 0.8333333333333333em; +} + +image { + padding: 0.0833333333333333em; +} + +/* Vertical group of buttons in 1 column */ +button.Top { + border-radius: 0.25em 0.25em 0 0; + border-style: solid solid none solid; + margin-bottom: 0; +} +button.MiddleV { + border-radius: 0; + border-style: none solid none solid; + margin-top: 0; + margin-bottom: 0; +} +button.Bottom { + border-radius: 0 0 0.25em 0.25em; + border-style: none solid solid solid; + margin-top: 0; +} +/* end */ + +/* Horizontal group of buttons in 1 row */ +#MetaPanelNotebook scrolledwindow + grid > button.Left, +#MetaPanelNotebook scrolledwindow + grid + grid > button.Left, +#ProfilePanel button.Left, +button.Left { + border-radius: 0.25em 0 0 0.25em; + border-style: solid none solid solid; + margin-right: 0; +} +#MetaPanelNotebook scrolledwindow + grid > button.MiddleH, +#MetaPanelNotebook scrolledwindow + grid + grid > button.MiddleH, +#ProfilePanel button.MiddleH, +button.MiddleH { + border-radius: 0; + border-style: solid none solid none; + margin-left: 0; + margin-right: 0; +} +#MetaPanelNotebook scrolledwindow + grid > button.Right, +#MetaPanelNotebook scrolledwindow + grid + grid > button.Right, +#ProfilePanel button.Right, +button.Right { + border-radius: 0 0.25em 0.25em 0; + border-style: solid solid solid none; + margin-left: 0; +} +/* end */ + +/* [1.23[-][+]] */ +entry, spinbutton { + min-height: 0.8333333333333333em; + background-color: #262626; + border-radius: 0.2em; +} + +spinbutton entry { + padding-right: 0.25em; +} +spinbutton button { + margin: 0; + padding: 0; + border-radius: 0; +} +spinbutton button.up { + border-radius: 0 0.16666666666666666666em 0.16666666666666666666em 0; +} + +entry:disabled, spinbutton:disabled { + background-color: #363636; +} + +entry:hover, spinbutton:hover { + background-color: #565656; +} + +entry:selected { + color: #262626; + background-color: #AAAAAA; +} + +/* Context menus */ +menu { + background-color: #262626; + color: #909090; +} + +/* Context menu item */ +menuitem { + padding: 0.1666666666666666em; + margin: 0; + min-height: 0.8333333333333333em; +} + +/* FlowBoxChild */ +flowboxchild:selected { + background-color: inherit; +} + +/*** Histogram *********************************************************************************/ +#HistogramPanel { + min-height: 0; + margin: 0; + padding: 0; + border: none; +} + +#HistogramPanel > :nth-child(2) { + border: none; + border-left-width: 0.083333333333333333em; +} + +#HistogramPanel > :nth-child(1) { + border: none; +} + +#EditorLeftPaned #HistogramPanel > :nth-child(1) { + border: none; + border-right-width: 0.083333333333333333em; +} + +#EditorLeftPaned #HistogramPanel > :nth-child(2) { + border: none; +} + +#HistogramArea, +#HistogramRGBArea { + border-width: 0.083333333333333333em; +} + +#histButton { + padding: 0.25em 0.25em 0; + margin: 0 0 -1px 0; + min-height: 1.333333333333333333em; + min-width: 1.333333333333333333em; +} +#histButton:last-child { + padding-bottom: 0.25em; + margin: 0; +} + +/* Vertical version of slider. */ +#histScale { + min-height: 4em; + min-width: 0.4166666666666666em; + margin: 0.5833333333333333em 0 0 0; +} +#histScale trough { + padding: 0.583333333333333333em 0; +} +#histScale trough highlight { + margin: -0.583333333333333333em 0; + padding: 0.1em 0 0 0.1em; +} +#histScale.fine-tune trough highlight { + padding: 0.5em 0 0 0.5em; +} + +/* Copied from button.flat style. */ +button.radio#histButton { + background-image: none; +} + +button.radio#histButton:checked { + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} + +button.radio#histButton:hover { + background-image: linear-gradient(shade(#343434,1.3), shade(#2E2E2E,1.3), shade(#292929,1.3)); +} + +/*** end ***************************************************************************************/ + +#MyExpander { + margin: 0; + padding: 0; +} +#MyExpander.withScrollbar { + margin-right: 0.25em; +} + +/* ExpanderContents is just a logical container. Don't add additional spacing. */ +#ExpanderBox > .ExpanderContents > * { + margin: 0; + min-height: 0; + padding: 0; +} + +/* For sub-tools containers that go below another widget, add some margin + * between them if the container has children. */ +#MyExpander .SubToolsContainer:not(:first-child) > :first-child { + margin-top: 0.1666666666666666em; +} + +#MyExpander .SubToolsContainer { + min-height: 0; +} + +/* Tool background */ +#ExpanderBox > box, #ExpanderBox > grid { + background-color: #363636; + border-width: 0.0833333333333333em; + border-style: solid; + border-radius: 0.3333333333333333em; + border-color: #252525; + margin: 0; + padding: 0.25em; +} + +#ExpanderBox drawingarea { + background-color: #363636; +} + +#LocallabToolPanel frame, +#ExpanderBox frame, +#ExpanderBox2 frame, +#ExpanderBox3 frame { + padding: 0.1666666666666666em 0 0 0; + border-style: none; +} +#ExpanderBox frame > border { + background-color: #3B3B3B; + border-style: solid; + border-width: 0.0833333333333333em; + border-radius: 0.3333333333333333em; + border-color: #313131; + margin: 0.25em; + padding: 0.25em; +} + +#LocallabToolPanel frame > label, #LocallabToolPanel frame frame > label, +#ExpanderBox frame > label, #ExpanderBox frame frame > label, +#ExpanderBox2 frame > label, #ExpanderBox2 frame frame > label, +#ExpanderBox3 frame > label, #ExpanderBox3 frame frame > label { + margin-left: 7pt; + margin-top: 0; +} + +#LocallabToolPanel frame > box, #LocallabToolPanel frame frame > box, #LocallabToolPanel frame > grid, #LocallabToolPanel frame frame > grid, +#ExpanderBox frame > box, #ExpanderBox frame frame > box, #ExpanderBox frame > grid, #ExpanderBox frame frame > grid, +#ExpanderBox2 frame > box, #ExpanderBox2 frame frame > box, #ExpanderBox2 frame > grid, #ExpanderBox2 frame frame > grid, +#ExpanderBox3 frame > box, #ExpanderBox3 frame frame > box, #ExpanderBox3 frame > grid, #ExpanderBox3 frame frame > grid { + margin: 0.1666666666666666em; +} + +#LocallabToolPanel > box > checkbutton, #LocallabToolPanel > box > box, #LocallabToolPanel > grid > checkbutton, #LocallabToolPanel > box > grid, #LocallabToolPanel > grid > grid, #LocallabToolPanel frame > box > grid, #LocallabToolPanel frame > grid > grid, #LocallabToolPanel frame > grid > box, +#ExpanderBox > .ExpanderContents > box:not(.SubToolsContainer) > checkbutton, #ExpanderBox > .ExpanderContents > box:not(.SubToolsContainer) > box, #ExpanderBox > .ExpanderContents > grid > checkbutton, #ExpanderBox > .ExpanderContents > box:not(.SubToolsContainer) > grid, #ExpanderBox > .ExpanderContents > grid > grid, #ExpanderBox frame > box > grid, #ExpanderBox frame > grid > grid, #ExpanderBox frame > grid > box, +#ExpanderBox2 > .ExpanderContents > box:not(.SubToolsContainer) > checkbutton, #ExpanderBox2 > .ExpanderContents > box:not(.SubToolsContainer) > box, #ExpanderBox2 > .ExpanderContents > grid > checkbutton, #ExpanderBox2 > .ExpanderContents > box:not(.SubToolsContainer) > grid, #ExpanderBox2 > .ExpanderContents > grid > grid, #ExpanderBox2 frame > box > grid, #ExpanderBox2 frame > grid > grid, #ExpanderBox2 frame > grid > box, +#ExpanderBox2 > box:not(.ExpanderContents) > checkbutton, #ExpanderBox2 > box:not(.ExpanderContents) > box, #ExpanderBox2 > grid > checkbutton, #ExpanderBox2 > box:not(.ExpanderContents) > grid, #ExpanderBox2 > grid > grid, #ExpanderBox2 frame > box > grid, #ExpanderBox2 frame > grid > grid, #ExpanderBox2 frame > grid > box, +#ExpanderBox3 > .ExpanderContents > box:not(.SubToolsContainer) > checkbutton, #ExpanderBox3 > .ExpanderContents > box:not(.SubToolsContainer) > box, #ExpanderBox3 > .ExpanderContents > grid > checkbutton, #ExpanderBox3 > .ExpanderContents > box:not(.SubToolsContainer) > grid, #ExpanderBox3 > .ExpanderContents > grid > grid, #ExpanderBox3 frame > box > grid, #ExpanderBox3 frame > grid > grid, #ExpanderBox3 frame > grid > box, +#ExpanderBox3 > box:not(.ExpanderContents) > checkbutton, #ExpanderBox3 > box:not(.ExpanderContents) > box, #ExpanderBox3 > grid > checkbutton, #ExpanderBox3 > box:not(.ExpanderContents) > grid, #ExpanderBox3 > grid > grid, #ExpanderBox3 frame > box > grid, #ExpanderBox3 frame > grid > grid, #ExpanderBox3 frame > grid > box { + margin-top: 0.1666666666666666em; +} + +#ExpanderBox frame drawingarea { + background-color: #3B3B3B; +} + +#ExpanderBox frame frame > border { + background-color: #414141; + border: 0.0833333333333333em solid #373737; + border-radius: 0.3333333333333333em; + margin: 0.25em; + padding: 0.25em; +} + +#ExpanderBox frame frame drawingarea { + background-color: #414141; +} + +/* Sub-tool (MyExpander) background */ +#LocallabToolPanel > box, #LocallabToolPanel > grid, +#ExpanderBox2 > box, #ExpanderBox2 > grid { + background-color: #3B3B3B; + border: 0.0833333333333333em solid #2A2A2A; + border-radius: 0.3333333333333333em; + margin: 0; + padding: 0.25em; +} + +#LocallabToolPanel drawingarea, +#ExpanderBox2 drawingarea { + background-color: #3B3B3B; +} + +#LocallabToolPanel frame > border, +#ExpanderBox2 frame > border { + background-color: #414141; + border: 0.0833333333333333em solid #373737; + border-radius: 0.3333333333333333em; + margin: 0.25em; + padding: 0.25em; +} + +#LocallabToolPanel frame drawingarea, +#ExpanderBox2 frame drawingarea { + background-color: #414141; +} + +#LocallabToolPanel frame frame > border, +#ExpanderBox2 frame frame > border { + background-color: #474747; + border: 0.0833333333333333em solid #3D3D3D; + border-radius: 0.3333333333333333em; + margin: 0.25em; + padding: 0.25em; +} + +#LocallabToolPanel frame frame drawingarea, +#ExpanderBox2 frame frame drawingarea { + background-color: #474747; +} + +#MyExpanderTitle > box { + margin: 0.1666666666666667em 0; + padding: 0.1666666666666667em 0; +} + +#MyExpanderTitle label { + color: #CCCCCC; + padding: 0; + margin: 0 0.25em 0 0.25em; + font-size: 1.1em; + font-weight: bold; +} +#MyExpanderTitle:hover { + background-color: #202020; +} +#MyExpanderTitle eventbox:hover image { + background-color: #202020; + border-radius: 0.25em; +} +#MyExpanderTitle:hover label { + color: #D8D8D8; +} + +#LocallabToolPanel separator, #ExpanderBox2 separator, #ExpanderBox3 separator { + color: #292929; +} + +/* Editor tab button */ +#MainNotebook grid label, #MainNotebook grid image { + padding: 0.0833333333333333em; +} + +/* File Browser right side tabs - Toolbox, Inspector, Fast Export, Filter */ +notebook { + padding: 0; + margin: 0; + border-style: none; +} + +notebook header { + box-shadow: none; + background-color: #383838; + border-width: 0.0833333333333333em; + border-style: none; + border-color: #262626; + border-radius: 0; + padding: 0.1666666666666666em; + margin: 0; +} + +notebook tabs { + padding: 0.0833333333333333em; + margin: 0; +} + +notebook tab { + padding: 0.0833333333333333em; + margin: 0.1666666666666666em; + min-height: 1.25em; + min-width: 1.25em; +} + +notebook tab:hover { + background-color: #505050; +} + +notebook tab button { + padding: 0 0; + margin: 0 0.25em; +} + +/* Get rid of shitty notebook header shadow */ +notebook header.top { + border-bottom-style: solid; + padding-bottom: 0.25em; +} +notebook header.right { + border-left-style: solid; + padding-left: 0.25em; +} +notebook header.bottom { + border-top-style: solid; + padding-top: 0.25em; +} +notebook header.left { + border-right-style: solid; + padding-right: 0.25em; +} + +notebook.frame { + /* OK */ + border-radius: 0; + border-style: none; +} + +/* Pad notebooks, makes the other borders look nicer */ +notebook stack { + /* OK */ + background-color: #484848; + padding: 0; + margin: 0; +} + +paned box, paned grid { + padding: 0; + margin: 0; + border-style: none; +} + +paned > separator { + border-width: 0.0833333333333333em 0.0833333333333333em 0 0; + border-style: solid; + border-color: #404040; + padding: 0; + margin: 0.3333333333333333em; +} +fontchooser scrolledwindow, +#PlacesPaned scrolledwindow, +#HistoryPanel scrolledwindow, +#Snapshots scrolledwindow { + border-width: 0.083333333333333333em; +} + +#PlacesPaned { + margin: 0; + padding: 0 0.4166666666666666em 0 0; +} +#PlacesPaned > box:nth-child(1) scrolledwindow + grid { + margin: 0; + border-top-width: 0.083333333333333333em; +} +#PlacesPaned > box:nth-child(3) treeview { + padding: 0; +} + +#MainNotebook > header.left tab image { + margin: 0.5em 0 0 0; +} +#MainNotebook > header.top tab image { + margin: 0 0.5em 0 0; +} +#MainNotebook > header.left tab { + margin: 0.5em 0 0.5em 0; +} +#MainNotebook > header.top tab { + margin: 0 0.5em 0 0.5em; +} + +#MainNotebook header { + /* OK */ + background-color: #2A2A2A; + border: 0; + padding: 0; +} +#MainNotebook tabs { + /* OK */ + background-color: #2A2A2A; +} +#MainNotebook tab:hover { + /* OK */ + background-color: #505050; +} +#MainNotebook tab:active { + /* OK */ + border-color: #989898; +} +#MainNotebook tab:checked { + background-color: #505050; +} + +#RightNotebook > stack > :nth-child(1) checkbutton + scrolledwindow { + min-height: calc(6em + 43px); +} +#RightNotebook > stack > scrolledwindow frame, +#BatchQueueButtonsMainContainer frame, +#MyExpander frame, +dialog frame { + margin: 0; + padding: 0.19em 0.583333333333333333em; +} +#RightNotebook > stack > scrolledwindow frame > border, +#BatchQueueButtonsMainContainer > frame > border, +#MyExpander frame > border, +dialog frame > border { + padding: 0 0.333333333333333333em 0.333333333333333333em; + border-width: 0.083333333333333333em; + margin: 0 -0.583333333333333333em; +} +#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; +} +#BatchQueueButtonsMainContainer frame > border { + margin-bottom: 0.833333333333333333em; +} +#BatchQueueButtonsMainContainer frame:nth-child(3) > border { + padding-left: 0.916666666666666666em; +} + +#RightNotebook header { + background-color: #2A2A2A; +} +#RightNotebook tabs { + background-color: #2A2A2A; + padding-bottom: 0.083333333333333333em; +} +#RightNotebook tab:hover { + background-color: #505050; + color: #D6D6D6; +} +#RightNotebook tab:active { + border-color: #A5A5A5; +} + +#LabelRightNotebook { + padding: 0.4166666666666666em; + margin: 0.1666666666666666em; + font-size: 1.25em; +} + +#ToolPanelNotebook { + min-width: 25em; +} + +#ToolPanelNotebook .PanelEnding { + margin-top: 4px; +} + +#ToolPanelNotebook header { + background-color: #383838; + border-color: #262626; + padding: 0; + margin: 0; +} + +#ToolPanelNotebook header tabs { + background-color: #2A2A2A; + margin: 0; +} + +#ToolPanelNotebook header tab { + padding: 0.25em; + margin: 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 > stack > box { + border: 0.0833333333333333em solid #262626; + background-color: #363636; + border-radius: 0 0 0.3333333333333333em 0.3333333333333333em; + border-top-style: none; + padding: 0 0.25em 0.25em 0.25em; + margin: 0 0.4166666666666666em 0.4166666666666666em 0.4166666666666666em; +} + +#MetaPanelNotebook header { + border: 0.0833333333333333em solid #262626; + background-color: #363636; + border-radius: 0.3333333333333333em 0.3333333333333333em 0 0; + border-bottom-style: none; + padding: 0.4166666666666666em; + margin: 0.4166666666666666em 0.4166666666666666em 0 0.4166666666666666em; +} + +#MetaPanelNotebook > header > tabs { + background-color: #363636; +} + +#MetaPanelNotebook > header tab { + margin: 0 0.4166666666666666em; + padding: 0.4166666666666666em; +} + +#MetaPanelNotebook textview { + border-radius: 0.25em; +} + +#MetaPanelNotebook entry, #MetaPanelNotebook scrolledwindow, #MetaPanelNotebook combobox { + margin: 0.1666666666666666em 0 0.1666666666666666em 0; +} + +#MetaPanelNotebook entry { + padding: 0 0.0833333333333333em; +} + +#MetaPanelNotebook label { + padding: 0 0.4166666666666666em; +} + +#MetaPanelNotebook text { + border-color: #202020; + background-color: #262626; + border-style: solid; + border-width: 0.0833333333333333em; + border-radius: 0.25em; +} + +#MetaPanelNotebook stack > box > scrolledwindow > viewport { + margin-left: 1.25em; +} + +#PreviewWindow { + border-style: solid; +} + +/* Decently sized tabs */ +#PrefNotebook tab, #AboutNotebook tab { + padding: 0.8em; +} + +#PrefNotebook, #AboutNotebook { + padding: 0; + margin: 0 0 3pt 0; +} + +#PrefNotebook header, #AboutNotebook header { + padding: 0; + margin: 0; +} + +#PrefNotebook header tabs, #AboutNotebook header tabs { + padding: 0; + margin: 0; +} + +#PrefNotebook stack, #AboutNotebook stack { + padding: 3pt; + margin: 0; +} +#PrefNotebook box > frame > border { + padding-top: 0; + padding-bottom: 0.25em; +} +#PrefNotebook scrolledwindow scrolledwindow { + border-width: 0.083333333333333333em; +} + +/* Add space between bottom panel and window edge */ +#IopsPanel { + padding: 0 0.1666666666666666em 0.1666666666666666em; +} + +#EditorLeftPaned:last-child { + padding: 0.8333333333333333em 0 0 0.8333333333333333em; +} + +#EditorRightPaned:last-child { + padding: 0; +} + +#MainNotebook > header #CloseButton { + padding: 0; + margin: 0 0 0 0.3em; +} +#MainNotebook > header #CloseButton image { + padding: 0; + margin: 0; +} + +#RightNotebook #ToolPanelNotebook stack { + margin: 0; +} + +#RightNotebook #HistoryPanel { + min-width: 17.5em; + margin-top: 0.333333333333333333em; +} + +#RightNotebook scrolledwindow { + padding: 0; +} +#HistoryPanel { + margin-top: 0.25em; +} +#HistoryPanel > border { + margin-top: 1.75em; +} +#HistoryPanel > label { + margin: 0 0 -1.5em 0; + padding: 0 0 0 0.083333333333333333em; +} +#Snapshots { + margin-top: 0.166666666666666666em; +} +#Snapshots > border { + min-height: calc(6em + 36px); +} +#Snapshots > label { + margin-bottom: -4px; +} +#Snapshots scrolledwindow + box { + margin: -8px 0 -4px ; + border-top-width: 0.083333333333333333em; +} +#Navigator { + padding-top: 0.25em; + padding-bottom: 0.25em; +} +#Navigator label { + padding: 0; + margin: 0.083333333333333333em 0; +} + +/*** PartialPaste ******************************************************************************/ +#PartialPaste { + border-width: 0.083333333333333333em; + padding-top: 0.5em; + padding-bottom: 0.5em; +} + +#PartialPaste separator.vertical { + margin: 0 0.333333333333333333em; + padding: 0; +} + +#PartialPaste separator { /* Struggles with #PartialPasteHeaderSep */ + margin: 0.166666666666666666em 0.5em 0.166666666666666666em 1.166666666666666666em; +} +#PartialPasteHeaderSep.horizontal { + margin: 0.166666666666666666em 0.5em; +} + +/* +#PartialPasteHeader label { +} +*/ + +/* make the "partial profile" dialog a little bit more readable */ +#PartialPasteHeader { + margin: 1.5em 0 0 0; + padding: 0; + font-weight: bold; +} + +#PartialPasteHeaderSep { + background-color: #D8D8D8; +} + +/*** end ***************************************************************************************/ + + +/* All MyFileChooserButtons */ +button#MyFileChooserButton { + padding: 0.1666666666666666em; + margin: 0.1666666666666666em; +} + +#ToolPanelNotebook button { + margin: 0; +} + +button.flat { + background: none; + border: none; + outline: none; +} + +button.flat:checked { + background: #262626; +} + +.text-button, .image-button, .independent { + box-shadow: none; + min-height: 2em; + min-width: 2em; + padding: 0; +} + +/* Makes image-comboboxes (e.g. tone curve types) have same size as image buttons */ +combobox, .popupbutton-arrow { + min-height: 2em; +} + +/* Makes image-combobox small icons centered */ +button.toggle > grid > image { + padding: 0.3333333333333333em; +} + +#histButton { + background: none; + min-height: 1.3333333333333333em; + min-width: 1.3333333333333333em; +} + +/* -gtk-icon-shadow looks buggy on the small histogram icons */ +#histButton:hover { + -gtk-icon-shadow: none; +} + +.narrowbutton { + min-width: 0.8333333333333333em; +} + + +.smallbuttonbox button { + min-width: 1.3333333333333333em; + min-height: 1.3333333333333333em; +} + + +/* Adds gap between combobox contents and combobox edges */ +button.combo, .image-combo .toggle, #MyFileChooserButton { + padding-left: 0.3333333333333333em; + padding-right: 0.3333333333333333em; +} + +/*** Progressbar *******************************************************************************/ +progressbar trough { + background-color: #383838; + border: none; +} + +progressbar progress { + border-color: #363636; + /*border-radius: 0.25em;*/ + background-color: #215d9c; +} +/*** end ***************************************************************************************/ + +/* Add padding to grid cells */ + +.grid-spacing > * { + margin: 0.1666666666666666em; +} diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index a5f52a769..2e314510a 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -1,9 +1,8 @@ /* This file is part of RawTherapee. - Copyright (c) 2015-2017 DrSlony - Copyright (c) 2016-2019 Hombre - Copyright (c) 2016-2019 TooWaBoo + Copyright (c) 2015-2020 RawTherapee + Contributions by DrSlony, Hombre, TooWaBoo, Thanatomanic RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,26 +19,24 @@ */ /***************************/ -/**/ @import "size.css"; /**/ +/**/ @import "size.css"; /**/ /* TODO: Remove this weird dependency */ /***************************/ -/* text-shadow causes a serious performance degradation in rendering the UI, - * at least in comboboxes with many entries (i.e. Profiled Lens Correction). -*/ - +/** Set style defaults **/ * { - color: #AAAAAA; - text-shadow: none; + color: #BBBBBB; + text-shadow: none; /* Keep at none, or suffer serious performance issues */ + font-size: 1em; } *:disabled { - color: #666666; - opacity: 0.7; + color: rgba(255,255,255,0.25); + opacity: 0.8; } .view:selected:not(check):not(radio) { color: #262626; - background-color: #AAAAAA + background-color: #AAAAAA; } /* The Places and Dir browser panels */ @@ -53,7 +50,6 @@ textview.view, treeview.view { /* The headers of these panels */ .view .button { background-color: #363636; - /*padding: 0.1666666666666666em;*/ } window > box { @@ -64,17 +60,15 @@ window.background { } /*** Window decoration *********************************************************/ -@define-color winHeaderbar rgb(50,50,50); - .csd:not(.popup):not(tooltip) > decoration { background-color: #484848; background-image: none; box-shadow: 0 0.25em 0.75em 0.083333333333333333em rgba(0, 0, 0, 0.5), 0 0 0 0.083333333333333333em #242424; } headerbar { - background-color: shade(@winHeaderbar,1.12); + background-color: shade(rgb(50,50,50),1.12); box-shadow: inset 0 0.083333333333333333em rgba(200,200,200,.13); - background-image: linear-gradient(shade(@winHeaderbar,1.14), shade(@winHeaderbar,.86)); + background-image: linear-gradient(shade(rgb(50,50,50),1.14), shade(rgb(50,50,50),.86)); border-bottom-color: #242424; } dialog > box { @@ -90,7 +84,6 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { .maximized > headerbar { border-radius: 0; } -/**/ /*** End Window decoration *****************************************************/ @@ -128,33 +121,20 @@ label { /* Affects all frames except in the toolbox */ frame { - border-width: 0; - border-color: #303030; - border-radius: 0; - border-style: solid; - /*border-style: none none none solid;*/ padding: 0; - margin: 0; - background-color: rgba(0,0,0,0.); - min-height: 0; - min-width: 0; + margin-bottom: 0.75em; } /* Create space between frame contents and frame border */ frame border { - border-width: 0.083333333333333333em; - padding: 0.3333333333333333em; + border: 1px solid #262626; border-radius: 0.3333333333333333em; - background-color: #383838; - margin: 0; - min-height: 0; - min-width: 0; + padding: 0.083333333333333333em; } frame > label { - margin: 0 0 0 0.3333333333333333em; color: #D8D8D8; - padding: 0.416666666666666666em 0; + padding: 0.416666666666666666em 0.25em; } /* affects selection list*/ @@ -199,7 +179,7 @@ popover separator:not(:only-child) { paned.horizontal > separator { margin: 0 0.16666666666666666em; } -/* Double line separator */ + paned.vertical > separator { margin: 0.25em 0; } @@ -419,19 +399,19 @@ button.flat { } button.flat:checked { - background-image: linear-gradient(#343434, #2E2E2E, #292929); + background-image: linear-gradient(#545454, #4E4E34, #494949); } checkbutton > check { - background-image: linear-gradient(#343434, #2E2E2E, #292929); + background-image: linear-gradient(#545454, #4E4E4E, #494949); } radiobutton > radio { - background-image: linear-gradient(#343434, #2E2E2E, #292929); + background-image: linear-gradient(#545454, #4E4E4E, #494949); } 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)); + background-image: linear-gradient(shade(#545454,1.3), shade(#4E4E4E,1.3), shade(#494949,1.3)); } button.popupbutton-arrow { @@ -476,10 +456,10 @@ scale slider { padding: 0.583333333333333333em; border-radius: 1.166666666666666666em; border-width: 0.083333333333333333em; - background-image: linear-gradient(#343434, #2E2E2E, #292929); + background-image: linear-gradient(#444444, #3E3E3E, #393939); } scale slider:hover { - background-image: linear-gradient(#444444, #3E3E3E, #393939); + background-image: linear-gradient(#545454, #4E4E4E, #494949); } scale:disabled slider { background-image: none; @@ -493,7 +473,7 @@ scale trough { padding: 0 0.583333333333333333em; border-width: 0.083333333333333333em; border-radius: 0.333333333333333333em; - background-color: #2A2A2A; + background-color: rgba(0,0,0,0.15); } scale:disabled trough { background-color: #444; @@ -565,7 +545,7 @@ button.text-button.toggle:hover:checked { .drawingarea { border-radius: 0; background-color: #2A2A2A; - border: 0.0833333333333333em solid #1D1D1D; + border: 0.0833333333333333em solid #888888; } .drawingarea:disabled { background-color: #444; @@ -574,7 +554,7 @@ button.text-button.toggle:hover:checked { .drawingarea:selected { background-color: #565656; - border-radius: 0.8333333333333333em; + border-radius: 1.8333333333333333em; } image { @@ -631,7 +611,7 @@ button.Right { /* [1.23[-][+]] */ entry, spinbutton { min-height: 0.8333333333333333em; - background-color: #262626; + background-color: rgba(0,0,0,0.075); border-radius: 0.2em; } @@ -720,141 +700,174 @@ flowboxchild:selected { margin: 0; } +/* Vertical version of slider. */ +#histScale { + min-height: 4em; + min-width: 0.4166666666666666em; + margin: 0.5833333333333333em 0 0 0; +} +#histScale trough { + padding: 0.583333333333333333em 0; +} +#histScale trough highlight { + margin: -0.583333333333333333em 0; + padding: 0.1em 0 0 0.1em; +} +#histScale.fine-tune trough highlight { + padding: 0.5em 0 0 0.5em; +} + +/* Copied from button.flat style. */ +button.radio#histButton { + background-image: none; +} + +button.radio#histButton:checked { + background-image: linear-gradient(#343434, #2E2E2E, #292929); +} + +button.radio#histButton:hover { + background-image: linear-gradient(shade(#343434,1.3), shade(#2E2E2E,1.3), shade(#292929,1.3)); +} + /*** end ***************************************************************************************/ +/*** Modules ***********************************************************************************/ +#EditorModules > box { + margin: 0; + padding: 0; +} + #MyExpander { margin: 0; padding: 0; } -#MyExpander.withScrollbar { - margin-right: 0.25em; + +#MyExpander.withScrollbar { /* This margin is always added */ + margin-right: 1em; +} + +#MyExpander.withScrollbar #MyExpander { /* No margin for nested expanders */ + margin-right: 0; +} + +/* Borders around tools and subtools */ +#MyExpander { + border-top: 0.0833333333333333em solid rgba(0,0,0,0.3); +} +#MyExpander:first-child { + border-top: none; +} +#MyExpander:nth-last-child(1), +#MyExpander #MyExpander:nth-last-child(1) { + border-bottom: 0.0833333333333333em solid rgba(0,0,0,0.3); +} +#MyExpander #MyExpander:nth-last-child(2) { + border-bottom: none; +} + +/* ExpanderContents is just a logical container. Don't add additional spacing. */ +#ExpanderBox > .ExpanderContents > * { + margin: 0; + min-height: 0; + padding: 0; +} + +/* For sub-tools containers that go below another widget, add some margin + * between them if the container has children. */ +#MyExpander .SubToolsContainer:not(:first-child) > :first-child { + margin-top: 0.3333333333333333em; +} + +#MyExpander .SubToolsContainer { + min-height: 0; +} + +.SubToolsContainer > #MyExpander, +.ToolParamBlock > #MyExpander, +.ExpanderContents, +#MyExpander .ToolParamBlock { + margin: 0; } /* Tool background */ -#ExpanderBox > box, #ExpanderBox > grid { - background-color: #363636; - border-width: 0.0833333333333333em; - border-style: solid; - border-radius: 0.3333333333333333em; - border-color: #252525; - margin: 0; - padding: 0.25em; +#ExpanderBox > box, +#ExpanderBox > grid { + background-color: rgba(255,255,255,0.075); + padding: 0.3em 0.5em 0.6em 0.5em; + border-top: 0.0833333333333333em solid rgba(255,255,255,0.1); + border-bottom: none; } -#ExpanderBox drawingarea { - background-color: #363636; +/* Not all combinations below are used, but this makes sure + also some of the more exotic box and frame layouts are + treated properly. */ +#ExpanderBox frame > box, +#ExpanderBox frame frame > box, +#ExpanderBox2 frame > box, +#ExpanderBox2 frame frame > box, +#ExpanderBox3 frame > box, +#ExpanderBox3 frame frame > box, +#ExpanderBox frame > grid, +#ExpanderBox frame frame > grid, +#ExpanderBox2 frame > grid, +#ExpanderBox2 frame frame > grid, +#ExpanderBox3 frame > grid, +#ExpanderBox3 frame frame > grid { + padding: 0 0.5em 0.5em 0.5em; } -#ExpanderBox frame, -#ExpanderBox2 frame, -#ExpanderBox3 frame { - padding: 0.1666666666666666em 0 0 0; - border-style: none; -} -#ExpanderBox frame > border { - background-color: #3B3B3B; - border-style: solid; - border-width: 0.0833333333333333em; - border-radius: 0.3333333333333333em; - border-color: #313131; - margin: 0.25em; - padding: 0.25em; -} - -#ExpanderBox frame > label, #ExpanderBox frame frame > label, -#ExpanderBox2 frame > label, #ExpanderBox2 frame frame > label, -#ExpanderBox3 frame > label, #ExpanderBox3 frame frame > label { - margin-left: 7pt; - margin-top: 0; -} -#ExpanderBox frame > box, #ExpanderBox frame frame > box, #ExpanderBox frame > grid, #ExpanderBox frame frame > grid, -#ExpanderBox2 frame > box, #ExpanderBox2 frame frame > box, #ExpanderBox2 frame > grid, #ExpanderBox2 frame frame > grid, -#ExpanderBox3 frame > box, #ExpanderBox3 frame frame > box, #ExpanderBox3 frame > grid, #ExpanderBox3 frame frame > grid { - margin: 0.1666666666666666em; -} - -#ExpanderBox > box > checkbutton, #ExpanderBox > box > box, #ExpanderBox > grid > checkbutton, #ExpanderBox > box > grid, #ExpanderBox > grid > grid, #ExpanderBox frame > box > grid, #ExpanderBox frame > grid > grid, #ExpanderBox frame > grid > box, -#ExpanderBox2 > box > checkbutton, #ExpanderBox2 > box > box, #ExpanderBox2 > grid > checkbutton, #ExpanderBox2 > box > grid, #ExpanderBox2 > grid > grid, #ExpanderBox2 frame > box > grid, #ExpanderBox2 frame > grid > grid, #ExpanderBox2 frame > grid > box, -#ExpanderBox3 > box > checkbutton, #ExpanderBox3 > box > box, #ExpanderBox3 > grid > checkbutton, #ExpanderBox3 > box > grid, #ExpanderBox3 > grid > grid, #ExpanderBox3 frame > box > grid, #ExpanderBox3 frame > grid > grid, #ExpanderBox3 frame > grid > box { - margin-top: 0.1666666666666666em; -} - -#ExpanderBox frame drawingarea { - background-color: #3B3B3B; -} - -#ExpanderBox frame frame > border { - background-color: #414141; - border: 0.0833333333333333em solid #373737; - border-radius: 0.3333333333333333em; - margin: 0.25em; - padding: 0.25em; -} - -#ExpanderBox frame frame drawingarea { - background-color: #414141; +/* Necessary hack for extra margin in Wavelets and some other locations */ +#ExpanderBox box > box, +#ExpanderBox2 box > box { + margin: 0.16666666666666em 0; } /* Sub-tool (MyExpander) background */ -#ExpanderBox2 > box, #ExpanderBox2 > grid { - background-color: #3B3B3B; - border: 0.0833333333333333em solid #2A2A2A; - border-radius: 0.3333333333333333em; +#LocallabToolPanel > box, +#LocallabToolPanel > grid, +#ExpanderBox2 > box, +#ExpanderBox2 > grid { + background-color: rgba(255,255,255,0.075); margin: 0; - padding: 0.25em; -} - -#ExpanderBox2 drawingarea { - background-color: #3B3B3B; -} - -#ExpanderBox2 frame > border { - background-color: #414141; - border: 0.0833333333333333em solid #373737; - border-radius: 0.3333333333333333em; - margin: 0.25em; - padding: 0.25em; -} - -#ExpanderBox2 frame drawingarea { - background-color: #414141; -} - -#ExpanderBox2 frame frame > border { - background-color: #474747; - border: 0.0833333333333333em solid #3D3D3D; - border-radius: 0.3333333333333333em; - margin: 0.25em; - padding: 0.25em; -} - -#ExpanderBox2 frame frame drawingarea { - background-color: #474747; -} - -#MyExpanderTitle > box { - margin: 0.1666666666666666em 0; - padding: 0.1666666666666666em 0; + padding: 0.25em 0.5em 0.5em 0.25em; + border-top: 0.0833333333333333em solid rgba(255,255,255,0.1); + border-bottom: none; } #MyExpanderTitle label { - color: #CCCCCC; + color: #AAAAAA; padding: 0; - margin: 0 0.25em 0 0.25em; - font-size: 1.1em; + margin: 0; + font-size: 1.1em; /* TODO: Does not work? */ + font-weight: bold; } + +#MyExpander.Fold > #MyExpanderTitle label, +#MyExpander.OnOff.enabledTool > #MyExpanderTitle label { + color: #DDDDDD; +} + #MyExpanderTitle:hover { background-color: #202020; } #MyExpanderTitle eventbox:hover image { background-color: #202020; - border-radius: 0.25em; + margin: 0; + padding: 0; } #MyExpanderTitle:hover label { color: #D8D8D8; } -#ExpanderBox2 separator, #ExpanderBox3 separator { +/* Alignment of tool headers is controlled by the image */ +#MyExpander.Fold > #MyExpanderTitle box > image, +#MyExpander.OnOff > #MyExpanderTitle #MyExpanderStatus image { + padding: 0.3em; + margin: 0.25em 0.25em 0.25em 0; +} + +#LocallabToolPanel separator, #ExpanderBox2 separator, #ExpanderBox3 separator { color: #292929; } @@ -862,6 +875,7 @@ flowboxchild:selected { #MainNotebook grid label, #MainNotebook grid image { padding: 0.0833333333333333em; } +/*** end ***************************************************************************************/ /* File Browser right side tabs - Toolbox, Inspector, Fast Export, Filter */ notebook { @@ -877,7 +891,7 @@ notebook header { border-style: none; border-color: #262626; border-radius: 0; - padding: 0.1666666666666666em; + padding: 0; margin: 0; } @@ -921,14 +935,12 @@ notebook header.left { } notebook.frame { - /* OK */ border-radius: 0; border-style: none; } /* Pad notebooks, makes the other borders look nicer */ notebook stack { - /* OK */ background-color: #484848; padding: 0; margin: 0; @@ -941,12 +953,14 @@ paned box, paned grid { } paned > separator { - border-width: 0.0833333333333333em 0.0833333333333333em 0 0; - border-style: solid; - border-color: #404040; + background: rgba(0,0,0,0.075); + border: none; + min-width: 0.25em; + min-height: 0.25em; padding: 0; - margin: 0.3333333333333333em; + margin: 0; } + fontchooser scrolledwindow, #PlacesPaned scrolledwindow, #HistoryPanel scrolledwindow, @@ -980,21 +994,17 @@ fontchooser scrolledwindow, } #MainNotebook header { - /* OK */ background-color: #2A2A2A; border: 0; padding: 0; } #MainNotebook tabs { - /* OK */ background-color: #2A2A2A; } #MainNotebook tab:hover { - /* OK */ background-color: #505050; } #MainNotebook tab:active { - /* OK */ border-color: #989898; } #MainNotebook tab:checked { @@ -1006,18 +1016,16 @@ fontchooser scrolledwindow, } #RightNotebook > stack > scrolledwindow frame, #BatchQueueButtonsMainContainer frame, -#MyExpander frame, dialog frame { margin: 0; - padding: 0.19em 0.583333333333333333em; + padding: 0; } #RightNotebook > stack > scrolledwindow frame > border, #BatchQueueButtonsMainContainer > frame > border, -#MyExpander frame > border, dialog frame > border { - padding: 0 0.333333333333333333em 0.333333333333333333em; + padding: 0; border-width: 0.083333333333333333em; - margin: 0 -0.583333333333333333em; + margin: 0; } #RightNotebook > stack > scrolledwindow frame > label:not(.dummy), #BatchQueueButtonsMainContainer frame > label:not(.dummy), @@ -1057,21 +1065,22 @@ dialog frame > label:not(.dummy) { min-width: 25em; } -#ToolPanelNotebook header { - background-color: #383838; - border-color: #262626; - padding: 0; - margin: 0; +#ToolPanelNotebook viewport { + padding: 0; +} + +#ToolPanelNotebook .PanelEnding { + margin-top: 4px; } #ToolPanelNotebook header tabs { + padding: 0.0833333333333333em; background-color: #2A2A2A; - margin: 0; } #ToolPanelNotebook header tab { - padding: 0.25em; margin: 0; + padding: 0.3333333333333333em; } /* All tool panels have a frame except for Meta which unlike the rest is a notebook itself. @@ -1193,44 +1202,31 @@ dialog frame > label:not(.dummy) { margin: 0; } -#RightNotebook #HistoryPanel { - min-width: 17.5em; - margin-top: 0.333333333333333333em; -} - #RightNotebook scrolledwindow { padding: 0; } -#HistoryPanel { - margin-top: 0.25em; -} -#HistoryPanel > border { - margin-top: 1.75em; -} -#HistoryPanel > label { - margin: 0 0 -1.5em 0; - padding: 0 0 0 0.083333333333333333em; -} -#Snapshots { - margin-top: 0.166666666666666666em; -} -#Snapshots > border { - min-height: calc(6em + 36px); + +#Navigator border, +#HistoryPanel border, +#Snapshots border { + border: none; } + +#Navigator > label, +#HistoryPanel > label, #Snapshots > label { - margin-bottom: -4px; + margin: 0; + padding: 0 0 0.25em 0; } + #Snapshots scrolledwindow + box { - margin: -8px 0 -4px ; + margin: -8px 0 -4px; border-top-width: 0.083333333333333333em; } -#Navigator { - padding-top: 0.25em; - padding-bottom: 0.25em; -} -#Navigator label { + +#Navigator box label { + margin: 0; padding: 0; - margin: 0.083333333333333333em 0; } /*** PartialPaste ******************************************************************************/ diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index ce4bb8d28..ba25e70b7 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -318,12 +318,12 @@ fontchooser scrolledwindow, /*** end ***************************************************************************************/ /*** Navigator *********************************************************************************/ -#Navigator { +#Navigator box { padding-top: 0.75em; padding-bottom: 0.25em; background-color: @bg-dark-grey; } -#Navigator label { +#Navigator box label { padding: 0; margin: 0.083333333333333333em 0 0; } @@ -454,6 +454,47 @@ filechooser placessidebar list row:selected { margin: 0; } +/* Vertical version of slider. */ +#histScale { + min-height: 4em; + min-width: 1.833333333333333333em; + margin: -0.333333333333333333em 0; +} +#histScale trough { + padding: 0.583333333333333333em 0; +} +#histScale highlight { + background-image: linear-gradient(to right, shade (@accent-color2,1.22), shade(@accent-color2,.88)); + margin: -0.583333333333333333em 0; + padding: 0.333333333333333333em 0 0 0.333333333333333333em; +} +#histScale slider { +} +#histScale.fine-tune highlight { + padding: 0.5em 0 0 0.5em; +} + +/* Copied from button.flat style. */ +button.radio#histButton { + border: 0.083333333333333333em solid transparent; + box-shadow: none; + background-image: none; + background-color: transparent; +} +button.radio#histButton:hover { + border-color: @bg-button-border; + 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; +} +button.radio#histButton:active, +button.radio#histButton:checked { + border-color: @bg-button-border; + 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; +} + /*** end ***************************************************************************************/ /*** Separator *********************************************************************************/ @@ -922,6 +963,9 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { #ToolPanelNotebook { background-color: @bg-dark-grey; } +#ToolPanelNotebook .PanelEnding { + margin-top: 4px; +} #ToolPanelNotebook > header { border-bottom: 0.083333333333333333em solid @view-grid-border; margin-left: 0.083333333333333333em; @@ -1182,6 +1226,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { color: @headline-big; padding: 0; margin: 0.083333333333333333em 0.25em 0 0.166666666666666666em; + font-weight: bold; } #MyExpanderTitle:hover label { @@ -1236,6 +1281,11 @@ menuitem:hover > * { color: @text-hl-color; } +menu menuitem > radio + * image:not(.dummy), +#MyExpander menu menuitem > radio + * image:not(.dummy) { + margin-left: 1pt; +} + menu image:not(.dummy), #MyExpander menu image:not(.dummy) { min-height: 2em; diff --git a/rtdata/themes/size - Legacy.css b/rtdata/themes/size - Legacy.css new file mode 100644 index 000000000..089a909ee --- /dev/null +++ b/rtdata/themes/size - Legacy.css @@ -0,0 +1,1037 @@ +* { + min-width: 0; + min-height: 0; + padding: 0; + margin: 0; +} + +progressbar.vertical { + min-width: 0; + min-height: 9em; +} +progressbar trough { + border-width: 0.083333333333333333em; + border-radius: 0.3em; +} + +progressbar trough progress { + border-width: 0.083333333333333333em; + border-radius: 0.3em; +} + +progressbar.vertical trough { + min-width: 0.6em; +} +progressbar.vertical trough progress { + min-width: 0.6em; + margin: 0; +} + +progressbar.horizontal trough { + min-height: 0.6em; + margin-top: 0; +} +#IopsPanel progressbar.horizontal trough { + margin-top: 0; +} + +progressbar.horizontal trough progress { + min-height: 0.6em; + margin: 0; +} + +/* #IopsPanel progressbar trough.empty, */ +progressbar trough.empty progress { +} + +/*** Notebook **********************************************************************************/ +notebook, +notebook header, +notebook tabs, +notebook tab, +notebook stack { + border-radius: 0; + border: none; + padding: 0; + margin: 0; + min-width: 0; + min-height: 0; +} +notebook > header { + padding: 0 0.416666666666666666em; +} +notebook > header.left { + padding: 0.416666666666666666em 0; +} +notebook > header tab { + margin: 0.416666666666666666em 0.25em; + padding: 0 0.333333333333333333em; +} +notebook > header.left tab { + margin: 0.2em; + padding: 0.333333333333333333em; +} +notebook > header.left tabs { + margin: 0; + padding: 0; +} +notebook > header tab > grid > image { + min-height: 2em; + min-width: 2em; + padding: 0.25em; + margin: 0; +} + +notebook > header > tabs > arrow { + border-radius: 0.2em; + padding: 0 0.166666666666666666em; + margin: 0.5em 0; +} +notebook > header.left > tabs > arrow { + padding: 0.166666666666666666em 0; + margin: 0 0.5em; +} + +/*?win*/ +#MainNotebook > stack { + padding: 0.25em; +} + +#MainNotebook > stack > :nth-child(2) > box:nth-child(3) { + margin-top: 0.416666666666666666em; +} + + +/* Adds a line on top of the notebook as a separtor for the titlebar (only on CSD) */ +dialog.csd #PrefNotebook > header, +dialog.csd #AboutNotebook > header, +window.csd:not(.fullscreen) #MainNotebook > header.top { + border-top-width: 0.083333333333333333em; +} +/**/ + + +#RightNotebook > stack > scrolledwindow > viewport > box > box:last-child > image, +#ToolPanelNotebook > stack > scrolledwindow > viewport > box > box:last-child > image { + min-height: 5em; +} + +#ToolPanelNotebook > header { + border-bottom-width: 0.083333333333333333em; + margin-left: 0.083333333333333333em; + margin-right: 0.083333333333333333em; + padding: 0 0.19em; +} +#ToolPanelNotebook > header tabs { + margin: 0; +} +#ToolPanelNotebook > header tab { + padding: 0; +} +#ToolPanelNotebook > header tab image{ + min-height: 2em; + min-width: 2em; + margin: 0.19em 0.25em 0.333333333333333333em; + padding: 0; +} +#ToolPanelNotebook > stack { + padding: 0; +} + +#RightNotebook > header { + margin: 0 0.2em 0 0; +} +#RightNotebook > stack { + padding: 0; +} +#RightNotebook > header tab label { + padding-left: 0.25em; + padding-right: 0.25em; +} + +#RightNotebook > stack > :nth-child(1) > * > box, +#RightNotebook > stack > :nth-child(4) > * > box { + padding: 0.5em; + border-width: 0.083333333333333333em; +} + +#PrefNotebook > header { + margin: -0.666666666666666666em -0.666666666666666666em 0.333333333333333333em; +} +#PrefNotebook > stack { + margin: 0 -0.666666666666666666em; +} +#PrefNotebook > stack > scrolledwindow > viewport { + padding: 0 0.333333333333333333em; +} + +#AboutNotebook > header { + margin: -0.666666666666666666em -0.666666666666666666em 0.666666666666666666em; +} + +#AboutNotebook > stack text, +#AboutNotebook > stack textview { + padding: 0.75em 0; +} +/* Meta panel notebook */ +#MetaPanelNotebook > header { + padding: 0.333333333333333333em; + margin: 0 0.5em 0; +} +#MetaPanelNotebook > header > tabs { + padding-left: 0.333333333333333333em; +} +#MetaPanelNotebook > stack { + padding: 0 0 0.5em 0; +} + +#MetaPanelNotebook > stack > box { + border: none; + border-radius: 0; + border-top-style: none; + padding: 0 0.333333333333333333em 0.25em; + margin:0 0.5em -0.5em; +} +#MetaPanelNotebook > stack > box:nth-child(1) > scrolledwindow { + margin: 0 0 0.333333333333333333em; + padding: 0; +} + +#MetaPanelNotebook > stack > box:nth-child(2) > scrolledwindow > viewport.frame { + padding: 0; +} + +#MetaPanelNotebook entry { + padding: 0 0.333333333333333333em; + border-radius: 0; + margin-left: 0; + margin-right: 0; +} + +#MetaPanelNotebook .view { + border-width: 0.083333333333333333em; + padding: 0.083333333333333333em 0.25em; +} + +#MetaPanelNotebook stack label { + margin-top: 0; + margin-bottom: 0; + padding: 0; +} + +/*** end ***************************************************************************************/ + +/*** File Browser ******************************************************************************/ +#FileCatalog { + border-width: 0.083333333333333333em; +} + +/*?win*/ +#FileBrowser { + padding: 0; + margin: 0; +} + +#ToolBarPanelFileBrowser { + margin: 0 0 0.416666666666666666em 0; + min-height: 0; + min-width: 0; + padding: 0; +} +#FileBrowserQueryToolbar > viewport > box { + margin: 0 0 0.416666666666666666em 0; + min-height: 0; + min-width: 0; + padding: 0; +} + +/*** end ***************************************************************************************/ + +/*** Image Editor ******************************************************************************/ +#EditorRightPaned { + margin: 0; +} + +#BeforeAfterContainer { + border-width: 0.083333333333333333em; + border-radius: 0; + padding: 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.083333333333333333em solid @bg-dark-grey; +} +#BeforeAfterContainer > box:nth-child(2){ + border-left: 0.083333333333333333em solid @bg-dark-grey; +} + +/* !!! Must be same height as "Small Lock Button" */ +#BeforeAfterContainer label { + padding: 0 0.5em; + min-height: 2em; + min-width: 2em; + margin: 0.25em 0; + border-width: 0.083333333333333333em; +} + +#EditorToolbarTop { + margin: 0 -1px 0 -1px; + padding: 0; + min-height: 0; +} + +#IopsPanel { + margin: 0; + padding: 0; + min-height: 0; +} + +#EditorZoomPanel label { + min-width: 4em; + margin: 0; +} +/*** end ***************************************************************************************/ + +/*** Toolbox ***********************************************************************************/ +#MyExpander image { + min-width: 1.333333333333333333em; + min-height: 0; + margin: -0.083333333333333333em 0.125em; +} + +#MyExpander .drawingarea:not(.slider) { + border-width: 0.083333333333333333em; +} +#MyExpander .slider, +#MyExpander #CurveSHCSelector { + border-width: 0.083333333333333333em; +} +#MyExpander .drawingarea:disabled { +} +#ThresholdAdjuster { + margin: 0.083333333333333333em 0 0.166666666666666666em 0; +} + +#ToolPanelNotebook > stack > scrolledwindow > viewport.frame { + padding: 0 0.25em; +} + +#MyExpander { + margin: 0; + padding: 0; +} +#ExpanderBox > box, #ExpanderBox > grid { + border-width: 0.083333333333333333em; + border-radius: 0.416666666666666666em; + margin: 0; + padding: 0.5em 0.333333333333333333em; +} + +/* Sub-tool (MyExpander) */ +#ExpanderBox2 > box, #ExpanderBox2 > grid { + border-width: 0.083333333333333333em; + border-radius: 0.416666666666666666em; + margin: 0 0.19em; + padding: 0.333333333333333333em; +} + +#MyExpanderTitle > box { + margin: 0; + padding: 0.25em 0; +} + +#MyExpanderTitle label { + padding: 0; + margin: 0.083333333333333333em 0.25em 0 0.166666666666666666em; +} +/*** end ***************************************************************************************/ + +/*** Context & popups menus *****************************************************************************/ +.csd.popup > decoration { + border-radius: 0; + border: none; + padding: 0; + margin: 0; +} + +menu { + border-width: 0.083333333333333333em; + padding: 0.083333333333333333em; + margin: 0; + border-radius: 0; +} +menu > arrow.top, +menu > arrow.top:hover, +menu > arrow.bottom, +menu > arrow.bottom:hover { + border: none; + padding: 0.5em; + min-height: 1.5em; +} + +menuitem { + 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; +} + +menu menuitem > radio + * image:not(.dummy), +#MyExpander menu menuitem > radio + * image:not(.dummy) { + margin-left: 1pt; +} + +menu image:not(.dummy), +#MyExpander menu image:not(.dummy) { + min-height: 2em; + min-width: 1.5em; + padding: 0; + margin: 0 0 0 -1.333333333333333333em; +} + +/*** Selection popup list (used in filechooser) ***/ +entry > window > frame:not(.dummy) { + padding: 0; +} +entry > window > frame > border:not(.dummy) { + padding: 0.083333333333333333em; + margin: 0.083333333333333333em; + border-width: 0.083333333333333333em; +} +/* end */ + +/*** end ***************************************************************************************/ + +/*** Popover *** Context menu filechooser ******************************************************/ +popover { + border-width: 0.083333333333333333em; + border-radius: 0; + padding: 0; + margin: 0; +} +popover > box { + padding: 0; + margin: -9px; +} +popover modelbutton { + min-height: 2em; + padding: 0 0.416666666666666666em; + margin: 0; + border-radius: 0; +} + +popover label { + margin-right: 0.5em; +} +/** end ****************************************************************************************/ + +/*** Switch ***********************************************************************************/ +switch { + min-height: 2.333333333333333333em; + min-width: 11em; + margin: 0 0.19em; + padding: 0; + border-radius: 0.2em; + border-width: 0.083333333333333333em; + margin-bottom: 0.5em; +} + +switch slider { + border-width: 0.083333333333333333em; + 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; +} +/** end ****************************************************************************************/ + +/*** Buttons ***********************************************************************************/ +button, +#BeforeAfterContainer button { + min-height: 1.666666666666666666em; + min-width: 1.666666666666666666em;/*x*/ + margin: 0.125em; + border-radius: 0.2em; + border-width: 0.083333333333333333em; +} +button.flat { + border-width: 0.083333333333333333em; +} + +/* Combobox */ +button.combo { + padding: 0 0 0 0.25em; +} +combobox entry.combo + button.combo { + min-width: 1em; + margin-left: 0; + padding: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left: none; +} +#WB-Size-Helper button.combo { + min-width: 0; + margin: 0; +} +#WB-Size-Helper { + min-width: 3.5em; + margin: 0.125em; +} + +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: -0.166666666666666666em; +} + +/* 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; +} +#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 { + margin-bottom: 0.35em; +} +#ProfilePanel > grid { + margin-bottom: 0.2em; +} + +/* 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-width: 3.25em; +} + +button.color colorswatch { + min-height: 0; + min-width: 0; + margin: 1px; + border-radius: 0.2em; +} + +colorchooser colorswatch { + border-width: 1px; +} +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.125em; +} + +/* Save, Cancel, OK ... buttons */ +dialog .dialog-action-area button { + min-height: 2.166666666666666666em; + margin: 0.5em 0 0 0.333333333333333333em; + padding: 0; +} +messagedialog .dialog-action-area button { + min-height: 1.833333333333333333em; + margin: 0 0.5em 0.5em; + padding: 0; +} +messagedialog .dialog-action-area button:not(:only-child):nth-child(1) { + margin-right: 0.25em; +} +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.333333333333333333em; + min-width: 2.333333333333333333em; + margin: 0 0.125em; +} +#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.125em; +} + +#EditorTopPanel button.narrowbutton { + min-width: 0.833333333333333333em; + padding: 0 0.13em; +} + +/* 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.166666666666666666em; + padding: 0; + margin: 0; +} +#ToolBarPanelFileBrowser .smallbuttonbox:nth-child(2) { + margin-top: 0.166666666666666666em; + margin-bottom: -0.166666666666666666em; +} +#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton image { + margin: -1em 0; + padding: 0; + min-width: 0; + min-height: 0; +} +#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton { + min-height: 0; + min-width: 1.166666666666666666em; + padding: 0; + margin: 0 0.166666666666666666em; + border: none; + border-radius: 0; +} + +/* 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.333333333333333333em; + 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; + border-width: 0.083333333333333333em; + 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-width: 0.083333333333333333em; +} +#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; + border-width: 0.083333333333333333em; + border-radius: 0; + min-height: 0.5em;/*x*/ +} +/**/ + + +/* View & Filechooser Buttons */ +.view button { + min-height: 2em; + min-width: 1.333333333333333333em; + padding: 0 0.19em; + margin: 0; +} +#pathbarbox button { + min-width: 2em; + margin: 0; + padding: 0; + } +window treeview > header image { + min-width: 1.333333333333333333em; +} + +window .view button { + border: none; + border-bottom-width: 0.083333333333333333em; +} +dialog .view button { + border-width: 0.083333333333333333em; +} + +.view header button:not(:first-child):not(:only-child), +.path-bar button:not(:first-child):not(:only-child) { + border-left: none; +} +.view header button, +.path-bar button { + border-radius: 0; +} + +.path-bar button:first-child { + border-top-left-radius: 0.2em; + border-bottom-left-radius: 0.2em; + margin: 0; + padding: 0; +} +.path-bar button:last-child { + border-top-right-radius: 0.2em; + border-bottom-right-radius: 0.2em; + margin: 0; + padding: 0; +} +#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; +} +/**/ + +/* Popover Filechooser (Create folder) */ +popover button.text-button { + border-width: 0.083333333333333333em; +} +popover button.text-button label { + padding: 0; + margin: 0; +} +/* Adds padding around sides of text-buttons */ +button.text-button { + padding: 0 0.6666666666666666em; +} +/**/ + +/*** end ***************************************************************************************/ + +/*** Checkbox & Radio **************************************************************************/ +checkbutton, +radiobutton { + padding: 0.083333333333333333em 0; + margin: 0.125em; + min-height: 1.666666666666666666em;/*x*/ +} + +check, +radio { + border-width: 0.105em; + margin: 0; + padding: 0; + min-height: 1.166666666666666666em; + min-width: 1.166666666666666666em; +} +check { + border-radius: 0.166666666666666666em; +} + +radio{ + border-radius: 1.166666666666666666em; +} + +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.125em 0 0 0.583333333333333333em; +} +#PartialPaste checkbutton:not(#PartialPasteHeader) { + margin: 0 0 0 1.166666666666666666em; +} + +/*** end ***************************************************************************************/ + +/*** Entry & Spinbutton ************************************************************************/ +#MyExpander entry, +entry, +spinbutton { + margin: 0.125em; + padding: 0 0.333333333333333333em; + min-height: 1.666666666666666666em;/*x*/ + min-width: 0; + border-width: 0.083333333333333333em; +} +#FileBrowserQueryToolbar entry, +#FileBrowserIconToolbar entry { + min-height: 1.666666666666666666em;/*x*/ + min-width: 0; + margin: 0; + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +#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 { + padding: 0; +} + +#MyExpander spinbutton { + margin: 0.125em; + padding: 0; + min-height: 1.333333333333333333em; + min-width: 0; + border-width: 0.083333333333333333em; +} +/* Needed for Reset & and Auto button height*/ +#MyExpander button + label + spinbutton { + margin-top: 0.333333333333333333em; + margin-bottom: 0.333333333333333333em; +} +#MyExpander checkbutton + label + spinbutton { + margin-top: 0.416666666666666666em; + margin-bottom: 0.416666666666666666em; +} +/**/ + +#MyExpander spinbutton button, +spinbutton button { + padding: 0; + min-height: 1.333333333333333333em; + min-width: 1.666666666666666666em; + border: none; +} + +#MyExpander spinbutton entry, +spinbutton entry { + padding: 0 0.333333333333333333em; + margin: 0; + min-height: 0; + min-width: 0; + border: none; +} +#MyExpander spinbutton entry { + padding: 0 0.333333333333333333em 0 0.833333333333333333em; +} + +#MyExpander spinbutton button:hover, +spinbutton button:hover { + border: none; +} +#MyExpander spinbutton button:active, +spinbutton button:active { + border: none; +} + +/* Text selection */ +.view entry { + margin: 0 -2px; + border-width: 0.083333333333333333em; +} +/* end*/ + +/*** end ***************************************************************************************/ + +/* Curves **************************************************************************************/ +.curve-mainbox { + margin: 0.19em; + border-width: 0.083333333333333333em; +} +.curve-mainbox .curve-curvebox { + margin: 0; + padding: 0.416666666666666666em; +} +.curve-mainbox .curve-spinbuttonbox { + margin: 0; + padding: 0.25em; + border-width: 0.083333333333333333em; +} +.curve-mainbox .curve-sliderbox { + margin: 0; + padding: 0.25em; + border-width: 0.083333333333333333em; +} +.curve-mainbox .curve-buttonbox { + padding: 0.25em; +} +.curve-mainbox.left .curve-buttonbox { + border-width: 0.083333333333333333em; +} +.curve-mainbox.right .curve-buttonbox { + border-width: 0.083333333333333333em; +} +.curve-mainbox.top .curve-buttonbox { + border-width: 0.083333333333333333em; +} +.curve-mainbox.bottom .curve-buttonbox { + border-width: 0.083333333333333333em; +} +.curve-mainbox .curve-buttonbox button.flat { + margin: 0.095em; +} +/*** end ***************************************************************************************/ + +/*** Window Layout *****************************************************************************/ +.csd:not(.popup):not(tooltip) > decoration { + border-radius: 0.416666666666666666em 0.416666666666666666em 0 0; + border: none; + padding: 0; + margin: 0.833333333333333333em; +} +headerbar { + border-bottom-width: 0.083333333333333333em; + border-radius: 0.416666666666666666em 0.416666666666666666em 0 0; + min-height: 2em; + padding: 0.083333333333333333em 0.416666666666666666em 0; + margin: 0; +} + +/* Window state */ +.maximized > headerbar { + border-radius: 0; +} +/**/ + +/* Titlebar buttons*/ + +headerbar button.titlebutton image { + padding: 0; + margin: 0; +} +headerbar button.titlebutton { + margin: 0 0 0 0.333333333333333333em; + border-width: 0.083333333333333333em; + min-width: 1.5em; + min-height: 1.5em; + padding: 0; +} +messagedialog headerbar button.titlebutton { + min-width: 1.25em; + min-height: 1.25em; + margin: 0; +} +/*** end ***************************************************************************************/ diff --git a/rtdata/themes/size.css b/rtdata/themes/size.css index e3a22f337..675ed51c2 100644 --- a/rtdata/themes/size.css +++ b/rtdata/themes/size.css @@ -313,38 +313,6 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { margin: 0.083333333333333333em 0 0.166666666666666666em 0; } -#ToolPanelNotebook > stack > scrolledwindow > viewport.frame { - padding: 0 0.25em; -} - -#MyExpander { - margin: 0; - padding: 0; -} -#ExpanderBox > box, #ExpanderBox > grid { - border-width: 0.083333333333333333em; - border-radius: 0.416666666666666666em; - margin: 0; - padding: 0.5em 0.333333333333333333em; -} - -/* Sub-tool (MyExpander) */ -#ExpanderBox2 > box, #ExpanderBox2 > grid { - border-width: 0.083333333333333333em; - border-radius: 0.416666666666666666em; - margin: 0 0.19em; - padding: 0.333333333333333333em; -} - -#MyExpanderTitle > box { - margin: 0; - padding: 0.25em 0; -} - -#MyExpanderTitle label { - padding: 0; - margin: 0.083333333333333333em 0.25em 0 0.166666666666666666em; -} /*** end ***************************************************************************************/ /*** Context & popups menus *****************************************************************************/ @@ -366,8 +334,8 @@ menu > arrow.top:hover, menu > arrow.bottom, menu > arrow.bottom:hover { border: none; - padding: 0.5em; - min-height: 1.5em; + padding: 0.25em; + min-height: 1em; } menuitem { @@ -383,6 +351,11 @@ menu arrow { margin: 0 -0.25em 0 0; } +menu menuitem > radio + * image:not(.dummy), +#MyExpander menu menuitem > radio + * image:not(.dummy) { + margin-left: 1pt; +} + menu image:not(.dummy), #MyExpander menu image:not(.dummy) { min-height: 2em; diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index f4d082199..c17826623 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -123,7 +123,7 @@ float* RawImageSource::CA_correct_RT( double cared, double cablue, bool avoidColourshift, - const array2D &rawData, + array2D &rawData, double* fitParamsTransfer, bool fitParamsIn, bool fitParamsOut, @@ -790,12 +790,12 @@ float* RawImageSource::CA_correct_RT( 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]; + polymat[c][dir][numpar * (polyord * i + j) + (polyord * m + n)] += powVblock * powHblock * static_cast(blockwt[vblock * hblsz + hblock]); powHblock *= hblock; } powVblock *= vblock; } - shiftmat[c][dir][(polyord * i + j)] += powVblockInit * powHblockInit * bstemp[dir] * blockwt[vblock * hblsz + hblock]; + shiftmat[c][dir][(polyord * i + j)] += powVblockInit * powHblockInit * static_cast(bstemp[dir]) * static_cast(blockwt[vblock * hblsz + hblock]); powHblockInit *= hblock; } powVblockInit *= vblock; @@ -848,7 +848,7 @@ float* RawImageSource::CA_correct_RT( 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]; + double 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); @@ -1036,8 +1036,8 @@ float* RawImageSource::CA_correct_RT( } if (!autoCA) { - float hfrac = -((float)(hblock - 0.5) / (hblsz - 2) - 0.5); - float vfrac = -((float)(vblock - 0.5) / (vblsz - 2) - 0.5) * height / width; + double hfrac = -((hblock - 0.5) / (hblsz - 2) - 0.5); + double vfrac = -((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; @@ -1058,7 +1058,7 @@ float* RawImageSource::CA_correct_RT( } powVblock *= vblock; } - constexpr float bslim = 3.99; //max allowed CA shift + constexpr double bslim = 3.99f; //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); @@ -1070,14 +1070,14 @@ float* RawImageSource::CA_correct_RT( //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) { + if (lblockshifts[c>>1][0] < 0.0) { 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) { + if (lblockshifts[c>>1][1] < 0.0) { std::swap(shifthfloor[c], shifthceil[c]); } shifthfrac[c] = fabs(lblockshifts[c>>1][1] - shifthfloor[c]); @@ -1291,7 +1291,7 @@ float* RawImageSource::CA_correct_RT( for (int i = 0; i < H - 2 * cb; ++i) { const int firstCol = fc(cfa, i, 0) & 1; const int colour = fc(cfa, i, firstCol); - const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; + array2D* nonGreen = colour == 0 ? redFactor : blueFactor; int j = firstCol; #ifdef __SSE2__ for (; j < W - 7 - 2 * cb; j += 8) { @@ -1325,7 +1325,7 @@ float* RawImageSource::CA_correct_RT( const int ngRow = 1 - (fc(cfa, 0, 0) & 1); const int ngCol = fc(cfa, ngRow, 0) & 1; const int colour = fc(cfa, ngRow, ngCol); - const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; + 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]; } diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 6bce68d1a..58c45f39b 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -1,38 +1,74 @@ -include_directories(${EXTRA_INCDIR} - ${EXPAT_INCLUDE_DIRS} - ${FFTW3F_INCLUDE_DIRS} - ${GLIB2_INCLUDE_DIRS} - ${GLIBMM_INCLUDE_DIRS} - ${GOBJECT_INCLUDE_DIRS} - ${GTHREAD_INCLUDE_DIRS} - ${GTKMM_INCLUDE_DIRS} - ${GTK_INCLUDE_DIRS} - ${IPTCDATA_INCLUDE_DIRS} - ${LCMS_INCLUDE_DIRS} - ${LENSFUN_INCLUDE_DIRS} - ${RSVG_INCLUDE_DIRS} -) +if(EXTRA_INCDIR) + include_directories("${EXTRA_INCDIR}") +endif() +if(EXPAT_INCLUDE_DIRS) + include_directories("${EXPAT_INCLUDE_DIRS}") +endif() +if(FFTW3F_INCLUDE_DIRS) + include_directories("${FFTW3F_INCLUDE_DIRS}") +endif() +if(GLIB2_INCLUDE_DIRS) + include_directories("${GLIB2_INCLUDE_DIRS}") +endif() +if(GLIBMM_INCLUDE_DIRS) + include_directories("${GLIBMM_INCLUDE_DIRS}") +endif() +if(GOBJECT_INCLUDE_DIRS) + include_directories("${GOBJECT_INCLUDE_DIRS}") +endif() +if(GTHREAD_INCLUDE_DIRS) + include_directories("${GTHREAD_INCLUDE_DIRS}") +endif() +if(GTKMM_INCLUDE_DIRS) + include_directories("${GTKMM_INCLUDE_DIRS}") +endif() +if(GTK_INCLUDE_DIRS) + include_directories("${GTK_INCLUDE_DIRS}") +endif() +if(IPTCDATA_INCLUDE_DIRS) + include_directories("${IPTCDATA_INCLUDE_DIRS}") +endif() +if(LCMS_INCLUDE_DIRS) + include_directories("${LCMS_INCLUDE_DIRS}") +endif() +if(LENSFUN_INCLUDE_DIRS) + include_directories("${LENSFUN_INCLUDE_DIRS}") +endif() +if(RSVG_INCLUDE_DIRS) + include_directories("${RSVG_INCLUDE_DIRS}") +endif() +if(NOT WITH_SYSTEM_KLT) + include_directories("${CMAKE_SOURCE_DIR}/rtengine/klt") +else() + include_directories("${KLT_INCLUDE_DIRS}") +endif() link_directories("${PROJECT_SOURCE_DIR}/rtexif" - ${EXPAT_LIBRARY_DIRS} - ${EXTRA_LIBDIR} - ${FFTW3F_LIBRARY_DIRS} - ${GLIB2_LIBRARY_DIRS} - ${GLIBMM_LIBRARY_DIRS} - ${GOBJECT_LIBRARY_DIRS} - ${GTHREAD_LIBRARY_DIRS} - ${IPTCDATA_LIBRARY_DIRS} - ${LCMS_LIBRARY_DIRS} - ${LENSFUN_LIBRARY_DIRS} - ${RSVG_LIBRARY_DIRS} + "${EXPAT_LIBRARY_DIRS}" + "${EXTRA_LIBDIR}" + "${FFTW3F_LIBRARY_DIRS}" + "${GLIB2_LIBRARY_DIRS}" + "${GLIBMM_LIBRARY_DIRS}" + "${GOBJECT_LIBRARY_DIRS}" + "${GTHREAD_LIBRARY_DIRS}" + "${IPTCDATA_LIBRARY_DIRS}" + "${LCMS_LIBRARY_DIRS}" + "${LENSFUN_LIBRARY_DIRS}" + "${RSVG_LIBRARY_DIRS}" ) +if(OpenMP_FOUND) + include_directories(${OpenMP_CXX_INCLUDE_DIRS}) +endif() + set(CAMCONSTSFILE "camconst.json") set(RTENGINESOURCEFILES + alpha.cc ahd_demosaic_RT.cc amaze_demosaic_RT.cc badpixels.cc + bayer_bilinear_demosaic.cc boxblur.cc canon_cr3_decoder.cc CA_correct_RT.cc @@ -63,7 +99,6 @@ set(RTENGINESOURCEFILES fast_demo.cc ffmanager.cc filmnegativeproc.cc - filmnegativethumb.cc flatcurves.cc FTblockDN.cc gamutwarning.cc @@ -87,14 +122,18 @@ set(RTENGINESOURCEFILES impulse_denoise.cc init.cc ipdehaze.cc + ipgrain.cc iplab2rgb.cc + iplocallab.cc iplabregions.cc iplocalcontrast.cc ipresize.cc ipretinex.cc ipshadowshighlights.cc ipsharpen.cc + ipsharpenedges.cc ipsoftlight.cc + iptoneequalizer.cc iptransform.cc ipvibrance.cc ipwavelet.cc @@ -102,12 +141,13 @@ set(RTENGINESOURCEFILES jpeg_ijg/jpeg_memsrc.cc labimage.cc lcp.cc - lj92.c lmmse_demosaic.cc loadinitial.cc + munselllch.cc myfile.cc panasonic_decoders.cc pdaflinesfilter.cc + perspectivecorrection.cc PF_correct_RT.cc pipettebuffer.cc pixelshift.cc @@ -125,6 +165,7 @@ set(RTENGINESOURCEFILES rtthumbnail.cc shmap.cc simpleprocess.cc + spot.cc stdimagesource.cc tmo_fattal02.cc utils.cc @@ -136,6 +177,19 @@ if(LENSFUN_HAS_LOAD_DIRECTORY) set_source_files_properties(rtlensfun.cc PROPERTIES COMPILE_DEFINITIONS RT_LENSFUN_HAS_LOAD_DIRECTORY) endif() +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0") + # procparams.cc takes a long time to compile with optimizations starting + # with GCC 12.1 due to PTA (see issue #6548) + get_source_file_property(PROCPARAMS_COMPILE_OPTIONS procparams.cc COMPILE_OPTIONS) + if(PROCPARAMS_COMPILE_OPTIONS STREQUAL "NOTFOUND") + set(PROCPARAMS_COMPILE_OPTIONS "") + else() + set(PROCPARAMS_COMPILE_OPTIONS "${PROCPARAMS_COMPILE_OPTIONS};") + endif() + set(PROCPARAMS_COMPILE_OPTIONS "${PROCPARAMS_COMPILE_OPTIONS}-fno-tree-pta") + set_source_files_properties(procparams.cc PROPERTIES COMPILE_OPTIONS ${PROCPARAMS_COMPILE_OPTIONS}) +endif() + if(WITH_BENCHMARK) add_definitions(-DBENCHMARK) endif() @@ -158,13 +212,13 @@ endif() include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") -add_library(rtengine STATIC ${RTENGINESOURCEFILES}) +add_library(rtengine STATIC "${RTENGINESOURCEFILES}") 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}") @@ -185,6 +239,11 @@ target_link_libraries(rtengine rtexif ${ZLIB_LIBRARIES} ${LENSFUN_LIBRARIES} ${RSVG_LIBRARIES} + ${KLT_LIBRARIES} ) +if(OpenMP_FOUND) + target_link_libraries(rtengine ${OpenMP_CXX_LIBRARIES}) +endif() + install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index 700181e1d..dcb05c29a 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -4,6 +4,7 @@ #ifdef _OPENMP #include #endif +#include "rt_algo.h" #include "sleef.h" #define DIAGONALS 5 @@ -42,21 +43,13 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl //s is preconditionment of r. Without, direct to r. float *s = r; - double rs = 0.0; // use double precision for large summations if(Preconditioner != nullptr) { s = new float[n]; - Preconditioner(s, r, Pass); } -#ifdef _OPENMP - #pragma omp parallel for reduction(+:rs) // removed schedule(dynamic,10) -#endif - - for(int ii = 0; ii < n; ii++) { - rs += r[ii] * s[ii]; - } + double rs = rtengine::accumulateProduct(r, s, n); //Search direction d. float *d = (buffer + n + 32); @@ -77,22 +70,15 @@ 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. - double ab = 0.0; // use double precision for large summations Ax(ax, d, Pass); -#ifdef _OPENMP - #pragma omp parallel for reduction(+:ab) -#endif - for(int ii = 0; ii < n; ii++) { - ab += d[ii] * ax[ii]; - } - - if(ab == 0.0f) { + double ab = rtengine::accumulateProduct(d, ax, n); + if(ab == 0.0) { break; //So unlikely. It means perfectly converged or singular, stop either way. } ab = rs / ab; - + float abf = ab; //Update x and r with this step size. double rms = 0.0; // use double precision for large summations #ifdef _OPENMP @@ -100,15 +86,15 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl #endif for(int ii = 0; ii < n; ii++) { - x[ii] += ab * d[ii]; - r[ii] -= ab * ax[ii]; //"Fast recursive formula", use explicit r = b - Ax occasionally? - rms += r[ii] * r[ii]; + x[ii] += abf * d[ii]; + r[ii] -= abf * ax[ii]; //"Fast recursive formula", use explicit r = b - Ax occasionally? + rms += rtengine::SQR(r[ii]); } rms = sqrtf(rms / n); //Quit? This probably isn't the best stopping condition, but ok. - if(rms < RMSResidual) { + if(rms < static_cast(RMSResidual)) { break; } @@ -118,31 +104,16 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl //Get beta. ab = rs; - rs = 0.0f; - -#ifdef _OPENMP - #pragma omp parallel -#endif - { -#ifdef _OPENMP - #pragma omp for reduction(+:rs) -#endif - - for(int ii = 0; ii < n; ii++) { - rs += r[ii] * s[ii]; - } - - } - + rs = rtengine::accumulateProduct(r, s, n); ab = rs / ab; - + abf = ab; //Update search direction p. #ifdef _OPENMP #pragma omp parallel for #endif for(int ii = 0; ii < n; ii++) { - d[ii] = s[ii] + ab * d[ii]; + d[ii] = s[ii] + abf * d[ii]; } @@ -237,7 +208,7 @@ bool MultiDiagonalSymmetricMatrix::CreateDiagonal(int index, int StartRow) return true; } -inline int MultiDiagonalSymmetricMatrix::FindIndex(int StartRow) +inline int MultiDiagonalSymmetricMatrix::FindIndex(int StartRow) const { //There's GOT to be a better way to do this. "Bidirectional map?" // Issue 1895 : Changed start of loop from zero to one @@ -916,7 +887,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal float temp; if(DetailBoost > 0.f) { - float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) + float betemp = expf(-(2.f - DetailBoost + 0.693147f)) - 1.f; //0.694 = log(2) temp = 1.2f * xlogf( -betemp); } else { temp = CompressionExponent - 1.0f; @@ -939,7 +910,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal cev = xexpf(LVFU(Source[i]) + LVFU(u[i]) * (tempv)) - epsv; uev = xexpf(LVFU(u[i])) - epsv; sourcev = xexpf(LVFU(Source[i])) - epsv; - _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev) ); + _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev)); } } diff --git a/rtengine/EdgePreservingDecomposition.h b/rtengine/EdgePreservingDecomposition.h index c90123ed3..73a7b1732 100644 --- a/rtengine/EdgePreservingDecomposition.h +++ b/rtengine/EdgePreservingDecomposition.h @@ -97,7 +97,7 @@ public: int *StartRows; bool CreateDiagonal(int index, int StartRow); int n, m; //The matrix is n x n, with m diagonals on the lower triangle. Don't change these. They should be private but aren't for convenience. - inline int DiagonalLength(int StartRow) //Gives number of elements in a diagonal. + inline int DiagonalLength(int StartRow) const //Gives number of elements in a diagonal. { return n - StartRow; }; @@ -109,7 +109,7 @@ public: void VectorProduct(float *Product, float *x); //Given the start row, attempts to find the corresponding index, or -1 if the StartRow doesn't exist. - inline int FindIndex(int StartRow) __attribute__((always_inline)); + inline int FindIndex(int StartRow) const __attribute__((always_inline)); //This is the same as above, but designed to take this class as a pass through variable. By this way you can feed //the meat of this class into an independent function, such as SparseConjugateGradient. diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 121c8189d..7477c5d08 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -43,7 +43,6 @@ #include "procparams.h" #include "rt_math.h" #include "sleef.h" - #include "../rtgui/threadutils.h" #include "../rtgui/options.h" @@ -56,7 +55,6 @@ #define TS 64 // Tile size #define offset 25 // shift between tiles -#define fTS ((TS/2+1)) // second dimension of Fourier tiles #define blkrad 1 // radius of block averaging #define epsilon 0.001f/(TS*TS) //tolerance @@ -64,8 +62,8 @@ namespace rtengine { -// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* Structure of the algorithm: @@ -438,6 +436,7 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, float upperBound, } + void ImProcFunctions::Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip) { @@ -484,12 +483,9 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH}; void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi) { BENCHFUN - -//#ifdef _DEBUG MyTime t1e, t2e; t1e.set(); -//#endif if (dnparams.luma == 0 && dnparams.chroma == 0 && !dnparams.median && !noiseLCurve && !noiseCCurve) { //nothing to do; copy src to dst or do nothing in case src == dst if (src != dst) { @@ -548,10 +544,10 @@ BENCHFUN const bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); // init luma noisevarL const float noiseluma = static_cast(dnparams.luma); - const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? static_cast(SQR(((noiseluma + 1.0) / 125.0) * (10. + (noiseluma + 1.0) / 25.0))) : static_cast(SQR((noiseluma / 125.0) * (1.0 + noiseluma / 25.0))); + const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? SQR(((noiseluma + 1.f) / 125.f) * (10.f + (noiseluma + 1.f) / 25.f)) : SQR((noiseluma / 125.f) * (1.f + noiseluma / 25.f)); const bool denoiseLuminance = (noisevarL > 0.00001f); - //printf("NL=%f \n",noisevarL); +// printf("NL=%f \n",noisevarL); if (useNoiseLCurve || useNoiseCCurve) { int hei = calclum->getHeight(); int wid = calclum->getWidth(); @@ -635,20 +631,20 @@ BENCHFUN if (dnparams.luma != 0 || dnparams.chroma != 0 || dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly") { // gamma transform for input data - float gam = dnparams.gamma; - float gamthresh = 0.001f; + double gam = dnparams.gamma; + constexpr double gamthresh = 0.001; if (!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG - if (gam < 1.9f) { - gam = 1.f - (1.9f - gam) / 3.f; //minimum gamma 0.7 - } else if (gam >= 1.9f && gam <= 3.f) { - gam = (1.4f / 1.1f) * gam - 1.41818f; + if (gam < 1.9) { + gam = 1.0 - (1.9 - gam) / 3.0; //minimum gamma 0.7 + } else if (gam >= 1.9 && gam <= 3.0) { + gam = (1.4 / 1.1) * gam - 1.41818; } } LUTf gamcurve(65536, LUT_CLIP_BELOW); - float gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; + const double gamslope = exp(log(gamthresh) / gam) / gamthresh; if (denoiseMethodRgb) { Color::gammaf2lut(gamcurve, gam, gamthresh, gamslope, 65535.f, 32768.f); @@ -657,9 +653,9 @@ BENCHFUN } // inverse gamma transform for output data - float igam = 1.f / gam; - float igamthresh = gamthresh * gamslope; - float igamslope = 1.f / gamslope; + const float igam = 1.0 / gam; + const float igamthresh = gamthresh * gamslope; + const float igamslope = 1.0 / gamslope; LUTf igamcurve(65536, LUT_CLIP_BELOW); @@ -669,9 +665,9 @@ BENCHFUN Color::gammanf2lut(igamcurve, igam, 32768.f, 65535.f); } - const float gain = pow(2.0f, float(expcomp)); - float params_Ldetail = min(float(dnparams.Ldetail), 99.9f); // max out to avoid div by zero when using noisevar_Ldetail as divisor - float noisevar_Ldetail = SQR(static_cast(SQR(100. - params_Ldetail) + 50.*(100. - params_Ldetail)) * TS * 0.5f); + const float gain = std::pow(2.0, expcomp); + const double params_Ldetail = std::min(dnparams.Ldetail, 99.9); // max out to avoid div by zero when using noisevar_Ldetail as divisor + const float noisevar_Ldetail = SQR((SQR(100. - params_Ldetail) + 50.0 * (100.0 - params_Ldetail)) * TS * 0.5); array2D tilemask_in(TS, TS); array2D tilemask_out(TS, TS); @@ -681,13 +677,13 @@ BENCHFUN for (int i = 0; i < TS; ++i) { float i1 = abs((i > TS / 2 ? i - TS + 1 : i)); - float vmask = (i1 < border ? SQR(sin((rtengine::RT_PI * i1) / (2 * border))) : 1.0f); - float vmask2 = (i1 < 2 * border ? SQR(sin((rtengine::RT_PI * i1) / (2 * border))) : 1.0f); + float vmask = (i1 < border ? SQR(sin((rtengine::RT_PI_F * i1) / (2 * border))) : 1.f); + float vmask2 = (i1 < 2 * border ? SQR(sin((rtengine::RT_PI_F * i1) / (2 * border))) : 1.f); for (int j = 0; j < TS; ++j) { float j1 = abs((j > TS / 2 ? j - TS + 1 : j)); - tilemask_in[i][j] = (vmask * (j1 < border ? SQR(sin((rtengine::RT_PI * j1) / (2 * border))) : 1.0f)) + epsilon; - tilemask_out[i][j] = (vmask2 * (j1 < 2 * border ? SQR(sin((rtengine::RT_PI * j1) / (2 * border))) : 1.0f)) + epsilon; + tilemask_in[i][j] = (vmask * (j1 < border ? SQR(sin((rtengine::RT_PI_F * j1) / (2 * border))) : 1.0f)) + epsilon; + tilemask_out[i][j] = (vmask2 * (j1 < 2 * border ? SQR(sin((rtengine::RT_PI_F * j1) / (2 * border))) : 1.0f)) + epsilon; } } @@ -883,19 +879,19 @@ BENCHFUN int height = tilebottom - tiletop; int width2 = (width + 1) / 2; float realred, realblue; - float interm_med = static_cast(dnparams.chroma) / 10.0; + float interm_med = dnparams.chroma / 10.0; float intermred, intermblue; if (dnparams.redchro > 0.) { - intermred = (dnparams.redchro / 10.); + intermred = dnparams.redchro / 10.0; } else { - intermred = static_cast(dnparams.redchro) / 7.0; //increase slower than linear for more sensit + intermred = dnparams.redchro / 7.0; //increase slower than linear for more sensit } if (dnparams.bluechro > 0.) { - intermblue = (dnparams.bluechro / 10.); + intermblue = dnparams.bluechro / 10.0; } else { - intermblue = static_cast(dnparams.bluechro) / 7.0; //increase slower than linear for more sensit + intermblue = dnparams.bluechro / 7.0; //increase slower than linear for more sensit } if (ponder && kall == 2) { @@ -957,13 +953,8 @@ BENCHFUN labdn->b[i1][j1] = B_ < 65535.f ? gamcurve[B_] : Color::gammanf(B_ / 65535.f, gam) * 32768.f; if (((i1 | j1) & 1) == 0) { - if (numTries == 1) { - noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; - noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; - } else { - noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = lumcalc[i >> 1][j >> 1]; - noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = ccalc[i >> 1][j >> 1]; - } + noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; + noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; } //end chroma @@ -995,13 +986,8 @@ BENCHFUN labdn->b[i1][j1] = (Y - Z); if (((i1 | j1) & 1) == 0) { - if (numTries == 1) { - noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; - noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; - } else { - noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = lumcalc[i >> 1][j >> 1]; - noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = ccalc[i >> 1][j >> 1]; - } + noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; + noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; } } } @@ -1096,7 +1082,7 @@ BENCHFUN //binary 1 or 0 for each level, eg subsampling = 0 means no subsampling, 1 means subsample //the first level only, 7 means subsample the first three levels, etc. //actual implementation only works with subsampling set to 1 - float interm_medT = static_cast(dnparams.chroma) / 10.0; + float interm_medT = dnparams.chroma / 10.0; bool execwavelet = true; if (!denoiseLuminance && interm_medT < 0.05f && dnparams.median && (dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly")) { @@ -1113,9 +1099,6 @@ BENCHFUN } if (execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1 - wavelet_decomposition* Ldecomp; - wavelet_decomposition* adecomp; - int levwav = 5; float maxreal = max(realred, realblue); @@ -1156,9 +1139,9 @@ BENCHFUN levwav = min(maxlev2, levwav); // if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b); - Ldecomp = new wavelet_decomposition(labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); + const std::unique_ptr Ldecomp(new wavelet_decomposition(labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels))); - if (Ldecomp->memoryAllocationFailed) { + if (Ldecomp->memory_allocation_failed()) { memoryAllocationFailed = true; } @@ -1177,13 +1160,14 @@ BENCHFUN int Wlvl_L = Ldecomp->level_W(lvl); int Hlvl_L = Ldecomp->level_H(lvl); - float ** WavCoeffs_L = Ldecomp->level_coeffs(lvl); + const float* const* WavCoeffs_L = Ldecomp->level_coeffs(lvl); if (!denoiseMethodRgb) { madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); } else { madL[lvl][dir - 1] = SQR(MadRgb(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); } + } } } @@ -1193,24 +1177,24 @@ BENCHFUN float chmaxresid = 0.f; float chmaxresidtemp = 0.f; - adecomp = new wavelet_decomposition(labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); + std::unique_ptr adecomp(new wavelet_decomposition(labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels))); - if (adecomp->memoryAllocationFailed) { + if (adecomp->memory_allocation_failed()) { memoryAllocationFailed = true; } if (!memoryAllocationFailed) { if (nrQuality == QUALITY_STANDARD) { - if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } } else { /*if (nrQuality==QUALITY_HIGH)*/ - if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } if (!memoryAllocationFailed) { - if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { memoryAllocationFailed = true; } } @@ -1219,7 +1203,7 @@ BENCHFUN if (!memoryAllocationFailed) { if (kall == 0) { - Noise_residualAB(*adecomp, chresid, chmaxresid, denoiseMethodRgb); + Noise_residualAB(*adecomp, chresid, chmaxresid, denoiseMethodRgb, 0, levwav); chresidtemp = chresid; chmaxresidtemp = chmaxresid; } @@ -1227,27 +1211,27 @@ BENCHFUN adecomp->reconstruct(labdn->a[0]); } - delete adecomp; + adecomp.reset(); if (!memoryAllocationFailed) { - wavelet_decomposition* bdecomp = new wavelet_decomposition(labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); + std::unique_ptr bdecomp(new wavelet_decomposition(labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels))); - if (bdecomp->memoryAllocationFailed) { + if (bdecomp->memory_allocation_failed()) { memoryAllocationFailed = true; } if (!memoryAllocationFailed) { if (nrQuality == QUALITY_STANDARD) { - if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } } else { /*if (nrQuality==QUALITY_HIGH)*/ - if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } if (!memoryAllocationFailed) { - if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb, denoiseNestedLevels)) { memoryAllocationFailed = true; } } @@ -1256,34 +1240,35 @@ BENCHFUN if (!memoryAllocationFailed) { if (kall == 0) { - Noise_residualAB(*bdecomp, chresid, chmaxresid, denoiseMethodRgb); + Noise_residualAB(*bdecomp, chresid, chmaxresid, denoiseMethodRgb, 0, levwav); chresid += chresidtemp; chmaxresid += chmaxresidtemp; chresid = sqrt(chresid / (6 * (levwav))); highresi = chresid + 0.66f * (sqrt(chmaxresid) - chresid); //evaluate sigma nresi = chresid; + printf("Nresi=%f Highresi=%f lev=%i\n", (double) nresi, (double) highresi, levwav); } bdecomp->reconstruct(labdn->b[0]); } - delete bdecomp; + bdecomp.reset(); if (!memoryAllocationFailed) { if (denoiseLuminance) { int edge = 0; if (nrQuality == QUALITY_STANDARD) { - if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge)) { //enhance mode + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } } else { /*if (nrQuality==QUALITY_HIGH)*/ - if (!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL)) { //enhance mode + if (!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL, nullptr, edge, denoiseNestedLevels)) { //enhance mode memoryAllocationFailed = true; } if (!memoryAllocationFailed) { - if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge)) { + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge, denoiseNestedLevels)) { memoryAllocationFailed = true; } } @@ -1307,8 +1292,6 @@ BENCHFUN } } } - - delete Ldecomp; } if (!memoryAllocationFailed) { @@ -1355,9 +1338,11 @@ BENCHFUN #else int subThread = 0; #endif +// float blurbuffer[TS * TS] ALIGNED64; float *Lblox = LbloxArray[subThread]; float *fLblox = fLbloxArray[subThread]; float pBuf[width + TS + 2 * blkrad * offset] ALIGNED16; +// float nbrwt[TS * TS] ALIGNED64; #ifdef _OPENMP #pragma omp for #endif @@ -1433,6 +1418,7 @@ BENCHFUN for (int hblk = 0; hblk < numblox_W; ++hblk) { RGBtile_denoise(fLblox, hblk, noisevar_Ldetail); + // RGBtile_denoise(fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); }//end of horizontal block loop //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1449,8 +1435,14 @@ BENCHFUN //add row of blocks to output image tile RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, height, width, topproc); + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + }//end of vertical block loop + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + } + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) @@ -2027,16 +2019,19 @@ BENCHFUN delete[] ccalc; } -//#ifdef _DEBUG if (settings->verbose) { t2e.set(); printf("Denoise performed in %d usec:\n", t2e.etime(t1e)); } - -//#endif - }//end of main RGB_denoise + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +//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) //for DCT { float nbrwt[TS * TS] ALIGNED64; @@ -2063,6 +2058,10 @@ void ImProcFunctions::RGBtile_denoise(float* fLblox, int hblproc, float noisevar } + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + void ImProcFunctions::RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) { const int numblox_W = ceil((static_cast(width)) / (offset)); @@ -2102,26 +2101,26 @@ float ImProcFunctions::Mad(const float * DataList, const int datalen) } //computes Median Absolute Deviation - //DataList values should mostly have abs val < 256 because we are in Lab mode - int histo[256] ALIGNED64 = {0}; + //DataList values should mostly have abs val < 256 because we are in Lab mode (32768) + int histo[32768] ALIGNED64 = {0}; //calculate histogram of absolute values of wavelet coeffs for (int i = 0; i < datalen; ++i) { - histo[static_cast(rtengine::min(255.f, fabsf(DataList[i])))]++; + histo[static_cast(rtengine::min(32768.f, fabsf(DataList[i])))]++; } //find median of histogram - int median = 0, count = 0; + int lmedian = 0, count = 0; while (count < datalen / 2) { - count += histo[median]; - ++median; + count += histo[lmedian]; + ++lmedian; } - int count_ = count - histo[median - 1]; + int count_ = count - histo[lmedian - 1]; // interpolate - return (((median - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745); + return ((lmedian - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745f; } float ImProcFunctions::MadRgb(const float * DataList, const int datalen) @@ -2144,38 +2143,40 @@ float ImProcFunctions::MadRgb(const float * DataList, const int datalen) } //find median of histogram - int median = 0, count = 0; + int lmedian = 0, count = 0; while (count < datalen / 2) { - count += histo[median]; - ++median; + count += histo[lmedian]; + ++lmedian; } - int count_ = count - histo[median - 1]; + int count_ = count - histo[lmedian - 1]; // interpolate delete[] histo; - return (((median - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745); + return ((lmedian - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745f; } -void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb) +void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb, int beg, int end) { float resid = 0.f; float maxresid = 0.f; - +// int maxlev = WaveletCoeffs_ab.maxlevel(); + // end = maxlev; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) collapse(2) reduction(+:resid) reduction(max:maxresid) num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int lvl = 0; lvl < WaveletCoeffs_ab.maxlevel(); ++lvl) { + // for (int lvl = 0; lvl < WaveletCoeffs_ab.maxlevel(); ++lvl) { + for (int lvl = beg; lvl < end; ++lvl) { // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator for (int dir = 1; dir < 4; ++dir) { const int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); const int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); - float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); + const float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); const float madC = SQR(denoiseMethodRgb ? MadRgb(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab) : Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); resid += madC; @@ -2190,11 +2191,23 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff chmaxresid = maxresid; } -bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]) +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels) { int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); const float eps = 0.01f; + if (edge == 1 || edge == 3 || edge == 4 || edge == 5) { + maxlvl = 4; //for refine denoise edge wavelet + } + + if (edge == 6) { + maxlvl = 6; //for wavelet denoise + } + + if (edge == 2) { + maxlvl = 7; //for locallab denoise + } + int maxWL = 0, maxHL = 0; for (int lvl = 0; lvl < maxlvl; ++lvl) { @@ -2205,6 +2218,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } + } bool memoryAllocationFailed = false; @@ -2232,17 +2246,55 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); + float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); if (lvl == maxlvl - 1) { - int edge = 0; - ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], nullptr, edge); - } else { + // int edge = 0; + ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], vari, edge); + } else { //simple wavelet shrinkage float * sfave = buffer[0] + 32; float * sfaved = buffer[2] + 96; float mad_Lr = madL[lvl][dir - 1]; + /* + if ((edge == 1 || edge == 2 || edge == 3) && vari) { + noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + + for (int i = 0; i < Wlvl_L * Hlvl_L; ++i) { + noisevarlum[i] = vari[lvl]; + } + } + */ + float *nvl = nullptr; + nvl = new float[Hlvl_L * Wlvl_L]; + + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = 0.f; + } + if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) { + // nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + if ((edge == 1 || edge == 3)) { + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = vari[lvl]; + } + } + + if (edge == 2 || edge == 4 || edge == 5 || edge == 6) { + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = vari[lvl] * SQR(noisevarlum[i]); + } + } + + } + + else { + for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) { + nvl[i] = noisevarlum[i]; + } + + } + float levelFactor = mad_Lr * 5.f / (lvl + 1); #ifdef __SSE2__ @@ -2254,14 +2306,14 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W int coeffloc_L; for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { - mad_Lv = LVFU(noisevarlum[coeffloc_L]) * levelFactorv; + mad_Lv = LVFU(nvl[coeffloc_L]) * levelFactorv; mag_Lv = SQRV(LVFU(WavCoeffs_L[dir][coeffloc_L])); STVFU(sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv)); } for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); - sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); + sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * nvl[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * nvl[coeffloc_L])) + eps); } #else @@ -2271,12 +2323,13 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W int coeffloc_L = i * Wlvl_L + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); - sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); + sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * nvl[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * nvl[coeffloc_L])) + eps); } } #endif boxblur(sfave, sfaved, lvl + 2, Wlvl_L, Hlvl_L, false); //increase smoothness by locally averaging shrinkage + #ifdef __SSE2__ vfloat sfavev; vfloat sf_Lv; @@ -2307,7 +2360,9 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W } #endif + delete [] nvl; } + } } } @@ -2322,10 +2377,24 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W return (!memoryAllocationFailed); } -bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, - float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb) + +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels) { int maxlvl = WaveletCoeffs_L.maxlevel(); + printf("Ftblockdn ab bishrink\n"); + + if (local == 1) { + maxlvl = 6; //for local denoise + } + + + if (local == 2) { + maxlvl = 7; //for local denoise + } + + if (local == 3) { + maxlvl = 4; //for shape detection + } if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; @@ -2371,7 +2440,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); - float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); + const float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); if (!denoiseMethodRgb) { madab[lvl][dir - 1] = SQR(Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); @@ -2390,18 +2459,41 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); + float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); + float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); if (lvl == maxlvl - 1) { - ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], madab[lvl], true); + //printf("Shrink ab bis\n"); + ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], nullptr, 0, madab[lvl], true); } else { //simple wavelet shrinkage + float noisevarfc; float mad_Lr = madL[lvl][dir - 1]; - float mad_abr = useNoiseCCurve ? noisevar_ab * madab[lvl][dir - 1] : SQR(noisevar_ab) * madab[lvl][dir - 1]; + float *nvc = nullptr; + nvc = new float[Hlvl_ab * Wlvl_ab]; - if (noisevar_ab > 0.001f) { + if ((local == 2 || local == 3) && variC && useNoiseCCurve) { + noisevarfc = variC[lvl]; + + for (int p = 0; p < Hlvl_ab * Wlvl_ab; p++) { + nvc[p] = 10.f * sqrt(variC[lvl]) * SQR(1.f + 4.f * noisevarchrom[p]); + } + + } else { + noisevarfc = noisevar_ab; + + for (int p = 0; p < Hlvl_ab * Wlvl_ab; p++) { + nvc[p] = noisevarchrom[p]; + } + + } + + + // float mad_abr = useNoiseCCurve ? noisevar_ab * madab[lvl][dir - 1] : SQR(noisevar_ab) * madab[lvl][dir - 1]; + float mad_abr = useNoiseCCurve ? noisevarfc * madab[lvl][dir - 1] : SQR(noisevarfc) * madab[lvl][dir - 1]; + + if (noisevarfc > 0.001f) { #ifdef __SSE2__ vfloat onev = F2V(1.f); @@ -2413,7 +2505,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & int coeffloc_ab; for (coeffloc_ab = 0; coeffloc_ab < Hlvl_ab * Wlvl_ab - 3; coeffloc_ab += 4) { - mad_abv = LVFU(noisevarchrom[coeffloc_ab]) * mad_abrv; + mad_abv = LVFU(nvc[coeffloc_ab]) * mad_abrv; tempabv = LVFU(WavCoeffs_ab[dir][coeffloc_ab]); mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); @@ -2426,7 +2518,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & for (; coeffloc_ab < Hlvl_ab * Wlvl_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); + WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); }//now chrominance coefficients are denoised #else @@ -2438,7 +2530,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); + WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); } }//now chrominance coefficients are denoised @@ -2446,9 +2538,12 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & #endif } + delete [] nvc; + } } } + } for (int i = 2; i >= 0; i--) { @@ -2460,16 +2555,24 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition & } -bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge)//mod JD +bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)//mod JD { int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); - if (edge == 1) { + if (edge == 1 || edge == 3 || edge == 5) { maxlvl = 4; //for refine denoise edge wavelet } + if (edge == 6) { + maxlvl = 6; //for wavelet denoise + } + + if (edge == 2) { + maxlvl = 7; //for locallab denoise + } + int maxWL = 0, maxHL = 0; for (int lvl = 0; lvl < maxlvl; ++lvl) { @@ -2481,7 +2584,6 @@ bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoe maxHL = WaveletCoeffs_L.level_H(lvl); } } - bool memoryAllocationFailed = false; #ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) @@ -2517,12 +2619,25 @@ bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoe } -bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, - float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb)//mod JD +bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, + float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)//mod JD { - int maxlvl = WaveletCoeffs_L.maxlevel(); + + if (local == 1) { + maxlvl = 6; //for local denoise + } + + + if (local == 2) { + maxlvl = 7; //for local denoise + } + + if (local == 3) { + maxlvl = 4; //for shape detection + } + int maxWL = 0, maxHL = 0; for (int lvl = 0; lvl < maxlvl; ++lvl) { @@ -2556,7 +2671,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCo for (int lvl = 0; lvl < maxlvl; ++lvl) { for (int dir = 1; dir < 4; ++dir) { - ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl]); + ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], variC, local, nullptr, 0); } } } @@ -2570,11 +2685,9 @@ bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCo return (!memoryAllocationFailed); } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void ImProcFunctions::ShrinkAllL(const 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) { @@ -2583,39 +2696,63 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f float * sfave = buffer[0] + 32; float * sfaved = buffer[1] + 64; - float * blurBuffer = buffer[2] + 96; +// float * blurBuffer = buffer[2] + 96; const int W_L = WaveletCoeffs_L.level_W(level); const int H_L = WaveletCoeffs_L.level_H(level); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level); + float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level); const float mad_L = madL[dir - 1] ; const float levelFactor = mad_L * 5.f / static_cast(level + 1); - if (edge == 1 && vari) { - noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + float *nvl = nullptr; + nvl = new float[ H_L * W_L]; - for (int i = 0; i < W_L * H_L; ++i) { - noisevarlum[i] = vari[level]; - } + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = 0.f; } + if ((edge == 1 || edge == 2 || edge == 3 || edge == 5 || edge == 6) && vari) { + // nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer + if ((edge == 1 || edge == 3)) { + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = vari[level]; //* SQR(1.f + 4.f * noisevarchrom[p]); + } + } + + if (edge == 2 || edge == 4 || edge == 5 || edge == 6) { + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = vari[level] * SQR(noisevarlum[i]); + } + } + + } + + else { + for (int i = 0; i < W_L * H_L; ++i) { + nvl[i] = noisevarlum[i]; + } + + } int i = 0; #ifdef __SSE2__ const vfloat levelFactorv = F2V(levelFactor); const vfloat ninev = F2V(9.f); const vfloat epsv = F2V(eps); - for (; i < W_L * H_L - 3; i += 4) { - const vfloat mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; + + for (i = 0; i < W_L * H_L - 3; i += 4) { + // const vfloat mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; + const vfloat mad_Lv = LVFU(nvl[i]) * levelFactorv; const vfloat magv = SQRV(LVFU(WavCoeffs_L[dir][i])); STVFU(sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); } + #endif // few remaining pixels for (; i < W_L * H_L; ++i) { - const float mag = SQR(WavCoeffs_L[dir][i]); - sfave[i] = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); + float mag = SQR(WavCoeffs_L[dir][i]); + sfave[i] = mag / (mag + levelFactor * nvl[i] * xexpf(-mag / (9 * levelFactor * nvl[i])) + eps); } boxblur(sfave, sfaved, level + 2, W_L, H_L, false); //increase smoothness by locally averaging shrinkage @@ -2635,12 +2772,15 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f //use smoothed shrinkage unless local shrinkage is much less WavCoeffs_L[dir][i] *= (SQR(sfaved[i]) + SQR(sf)) / (sfaved[i] + sf + eps); }//now luminance coefficients are denoised + + delete [] nvl; + } -void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const 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) +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 * variC, int local, float * madaab, bool madCalculated) { //simple wavelet shrinkage @@ -2652,12 +2792,13 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, float * sfaveab = buffer[0] + 32; float * sfaveabd = buffer[1] + 64; + // float * blurBuffer = buffer[2] + 96; int W_ab = WaveletCoeffs_ab.level_W(level); int H_ab = WaveletCoeffs_ab.level_H(level); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level); - float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(level); + float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level); + float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(level); float madab; float mad_L = madL[dir - 1]; @@ -2671,9 +2812,30 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, madab = SQR(MadRgb(WavCoeffs_ab[dir], W_ab * H_ab)); } } + float noisevarfc; - if (noisevar_ab > 0.001f) { - madab = useNoiseCCurve ? madab : madab * noisevar_ab; + float *nvc = nullptr; + nvc = new float[ H_ab * W_ab]; + + if ((local == 2 || local == 3) && variC && useNoiseCCurve) { + noisevarfc = variC[level]; + for (int p = 0; p < H_ab * W_ab; p++) { + nvc[p] = 10.f * sqrt(variC[level]) * SQR(1.f + 4.f * noisevarchrom[p]); + } + + } else { + noisevarfc = noisevar_ab; + + for (int p = 0; p < H_ab * W_ab; p++) { + nvc[p] = noisevarchrom[p]; + } + + } + + // printf("varfc=%f nvc0=%f nvc1=%f nvc2=%f\n", noisevarfc, nvc[10], nvc[H_ab * W_ab /3], nvc[H_ab * W_ab /2]); + if (noisevarfc > 0.001f) {//noisevar_ab + //madab = useNoiseCCurve ? madab : madab * noisevar_ab; + madab = useNoiseCCurve ? madab : madab * noisevarfc; #ifdef __SSE2__ vfloat onev = F2V(1.f); vfloat mad_abrv = F2V(madab); @@ -2681,10 +2843,11 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, vfloat rmadLm9v = onev / F2V(mad_L * 9.f); vfloat mad_abv ; vfloat mag_Lv, mag_abv; + int coeffloc_ab; for (coeffloc_ab = 0; coeffloc_ab < H_ab * W_ab - 3; coeffloc_ab += 4) { - mad_abv = LVFU(noisevarchrom[coeffloc_ab]) * mad_abrv; + mad_abv = LVFU(nvc[coeffloc_ab]) * mad_abrv; mag_Lv = LVFU(WavCoeffs_L[dir][coeffloc_ab]); mag_abv = SQRV(LVFU(WavCoeffs_ab[dir][coeffloc_ab])); @@ -2696,7 +2859,7 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, for (; coeffloc_ab < H_ab * W_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); + sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); }//now chrominance coefficients are denoised #else @@ -2706,13 +2869,14 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, int coeffloc_ab = i * W_ab + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); - sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); + sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (nvc[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); } }//now chrominance coefficients are denoised #endif - boxblur(sfaveab, sfaveabd, level + 2, W_ab, H_ab, false); //increase smoothness by locally averaging shrinkage + +// boxblur(sfaveab, sfaveabd, blurBuffer, level + 2, level + 2, W_ab, H_ab); //increase smoothness by locally averaging shrinkage #ifdef __SSE2__ vfloat epsv = F2V(eps); vfloat sfabv; @@ -2750,12 +2914,13 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, #endif } + delete [] nvc; } -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) +void ImProcFunctions::ShrinkAll_info(const float* const* WavCoeffs_a, const float* const* WavCoeffs_b, + int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float & chaut, int &Nb, float & redaut, float & blueaut, + float & maxredaut, float & maxblueaut, float & minredaut, float & minblueaut, int schoice, int lvl, float & chromina, float & sigma, float & lumema, float & sigma_L, float & redyel, float & skinc, float & nsknc, + float & maxchred, float & maxchblue, float & minchred, float & minchblue, int &nb, float & chau, float & chred, float & chblue, bool denoiseMethodRgb) { //simple wavelet shrinkage @@ -2870,9 +3035,9 @@ void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, } -void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposition &WaveletCoeffs_a, - const 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 ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposition & WaveletCoeffs_a, + const wavelet_decomposition & WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float & chaut, int &Nb, float & redaut, float & blueaut, float & maxredaut, float & maxblueaut, float & minredaut, float & minblueaut, int schoice, + float & chromina, float & sigma, float & lumema, float & sigma_L, float & redyel, float & skinc, float & nsknc, float & maxchred, float & maxchblue, float & minchred, float & minchblue, int &nb, float & chau, float & chred, float & chblue, bool denoiseMethodRgb) { int maxlvl = levwav; @@ -2882,8 +3047,8 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposi int Wlvl_ab = WaveletCoeffs_a.level_W(lvl); int Hlvl_ab = WaveletCoeffs_a.level_H(lvl); - float ** WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl); - float ** WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl); + const float* const* WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl); + const float* const* WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl); ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, Wlvl_ab, Hlvl_ab, noisevarlum, noisevarchrom, noisevarhue, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, @@ -2908,14 +3073,14 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); if (denoiseMethodRgb) { - gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; + gamslope = exp(log(static_cast(gamthresh)) / static_cast(gam)) / static_cast(gamthresh); Color::gammaf2lut(gamcurve, gam, gamthresh, gamslope, 65535.f, 32768.f); } else { Color::gammanf2lut(gamcurve, gam, 65535.f, 32768.f); } } -void ImProcFunctions::calcautodn_info(float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) +void ImProcFunctions::calcautodn_info(float & chaut, float & delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) { float reducdelta = 1.f; @@ -3189,19 +3354,19 @@ void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, } float realred, realblue; - float interm_med = static_cast(dnparams.chroma) / 10.0; + float interm_med = dnparams.chroma / 10.0; float intermred, intermblue; if (dnparams.redchro > 0.) { - intermred = (dnparams.redchro / 10.); + intermred = dnparams.redchro / 10.0; } else { - intermred = static_cast(dnparams.redchro) / 7.0; //increase slower than linear for more sensit + intermred = dnparams.redchro / 7.0; //increase slower than linear for more sensit } if (dnparams.bluechro > 0.) { - intermblue = (dnparams.bluechro / 10.); + intermblue = dnparams.bluechro / 10.0; } else { - intermblue = static_cast(dnparams.bluechro) / 7.0; //increase slower than linear for more sensit + intermblue = dnparams.bluechro / 7.0; //increase slower than linear for more sensit } realred = interm_med + intermred; diff --git a/rtengine/LUT.h b/rtengine/LUT.h index a80e5996d..b1dc4d26c 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -58,9 +58,11 @@ #pragma once +#include #include #include #include +#include #ifndef NDEBUG #include @@ -108,7 +110,7 @@ public: /// The user have to handle it itself, even if some method can (re)initialize it bool dirty; - LUT(int s, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE, bool initZero = false) + explicit LUT(int s, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE, bool initZero = false) { #ifndef NDEBUG @@ -138,6 +140,33 @@ public: clear(); } } + + explicit LUT(const std::vector& input, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE) : + maxs(input.size() - 2), + maxsf(maxs), + data(new T[input.size() + 3]), // Add a few extra elements so [](vfloat) won't access out-of-bounds memory. + clip(flags), + size(input.size()), + upperBound(size - 1), + owner(1), +#ifdef __SSE2__ + maxsv(F2V(maxs)), + sizev(F2V(size - 1)), + sizeiv(_mm_set1_epi32(size - 1)), +#endif + dirty(true) + { +#ifndef NDEBUG + + if (input.empty()) { + printf("s=0!\n"); + } + + assert(!input.empty()); +#endif + std::copy_n(input.begin(), input.size(), data); + } + void operator ()(int s, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE, bool initZero = false) { #ifndef NDEBUG @@ -223,7 +252,7 @@ public: return size > 0 ? upperBound : 0; } - LUT & operator=(const LUT& rhs) + LUT& operator=(const LUT& rhs) { if (this != &rhs) { if (rhs.size > this->size) { @@ -254,8 +283,7 @@ 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+=(const LUT& rhs) + LUT& operator+=(const LUT& rhs) { if (rhs.size == this->size) { #ifdef _OPENMP @@ -272,7 +300,7 @@ public: // multiply all elements of LUT with a constant float value template::value>::type> - LUT & operator*=(float factor) + LUT& operator*=(float factor) { #ifdef _OPENMP #pragma omp simd @@ -287,7 +315,7 @@ public: // divide all elements of LUT by a constant float value template::value>::type> - LUT & operator/=(float divisor) + LUT& operator/=(float divisor) { #ifdef _OPENMP #pragma omp simd @@ -334,11 +362,11 @@ public: // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); - vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); - vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); + vfloat lowerVal = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upperVal = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); vfloat diff = vmaxf(ZEROV, indexv) - _mm_cvtepi32_ps(indexes); - return vintpf(diff, upper, lower); + return vintpf(diff, upperVal, lowerVal); } // NOTE: This version requires LUTs which clip at upper and lower bounds @@ -366,11 +394,11 @@ public: // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); - vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); - vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); + vfloat lowerVal = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upperVal = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); vfloat diff = vclampf(indexv, ZEROV, sizev) - _mm_cvtepi32_ps(indexes); // this automagically uses ZEROV in case indexv is NaN - return vintpf(diff, upper, lower); + return vintpf(diff, upperVal, lowerVal); } // NOTE: This version requires LUTs which do not clip at upper and lower bounds @@ -397,11 +425,11 @@ public: // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); - vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); - vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); + vfloat lowerVal = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upperVal = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); vfloat diff = indexv - _mm_cvtepi32_ps(indexes); - return vintpf(diff, upper, lower); + return vintpf(diff, upperVal, lowerVal); } // vectorized LUT access with integer indices. Clips at lower and upper bounds @@ -457,7 +485,7 @@ public: // Return the value for "index" that is in the [0-1] range. template::value>::type> - T getVal01 (float index) const + T getVal01(float index) const { index *= (float)upperBound; int idx = (int)index; // don't use floor! The difference in negative space is no problems here @@ -482,19 +510,19 @@ public: return (p1 + p2 * diff); } - operator bool (void) const + operator bool() const // FIXME: Should be explicit { return size > 0; } - void clear(void) + void clear() { if (data && size) { memset(data, 0, size * sizeof(T)); } } - void reset(void) + void reset() { if (data) { delete[] data; diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index 9a95b8e2f..15b7b21ee 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -103,7 +103,7 @@ void ImProcFunctions::PF_correct_RT(LabImage * lab, double radius, int thresh) // no precalculated values without SSE => calculate const float HH = xatan2f(lab->b[i][j], lab->a[i][j]); #endif - float chparam = chCurve->getVal((Color::huelab_to_huehsv2(HH))) - 0.5f; // get C=f(H) + float chparam = chCurve->getVal((Color::huelab_to_huehsv2(HH))) - 0.5; // get C=f(H) if (chparam < 0.f) { chparam *= 2.f; // increased action if chparam < 0 @@ -113,25 +113,25 @@ void ImProcFunctions::PF_correct_RT(LabImage * lab, double radius, int thresh) } 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; + chromave += static_cast(chroma); fringe[i * width + j] = chroma; } } } chromave /= height * width; - if (chromave > 0.0) { // now as chromave is calculated, we postprocess fringe to reduce the number of divisions in future + const float chromavef = chromave; #ifdef _OPENMP #pragma omp parallel for simd #endif for (int j = 0; j < width * height; j++) { - fringe[j] = 1.f / (fringe[j] + chromave); + fringe[j] = 1.f / (fringe[j] + chromavef); } - const float threshfactor = 1.f / (SQR(thresh / 33.f) * chromave * 5.0f + chromave); + const float threshfactor = 1.f / (SQR(thresh / 33.f) * chromavef * 5.0f + chromavef); const int halfwin = std::ceil(2 * radius) + 1; // Issue 1674: @@ -297,7 +297,7 @@ void ImProcFunctions::PF_correct_RTcam(CieImage * ncie, double radius, int thres // no precalculated values without SSE => calculate const float HH = xatan2f(srbb[i][j], sraa[i][j]); #endif - float chparam = chCurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f; //get C=f(H) + float chparam = chCurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5; //get C=f(H) if (chparam < 0.f) { chparam *= 2.f; // increase action if chparam < 0 @@ -307,7 +307,7 @@ void ImProcFunctions::PF_correct_RTcam(CieImage * ncie, double radius, int thres } const float chroma = chromaChfactor * (SQR(sraa[i][j] - tmaa[i][j]) + SQR(srbb[i][j] - tmbb[i][j])); //modulate chroma function hue - chromave += chroma; + chromave += static_cast(chroma); fringe[i * width + j] = chroma; } } @@ -317,15 +317,16 @@ void ImProcFunctions::PF_correct_RTcam(CieImage * ncie, double radius, int thres if (chromave > 0.0) { // now as chromave is calculated, we postprocess fringe to reduce the number of divisions in future + const float chromavef = chromave; #ifdef _OPENMP #pragma omp parallel for simd #endif for (int j = 0; j < width * height; j++) { - fringe[j] = 1.f / (fringe[j] + chromave); + fringe[j] = 1.f / (fringe[j] + chromavef); } - const float threshfactor = 1.f / (SQR(thresh / 33.f) * chromave * 5.0f + chromave); + const float threshfactor = 1.f / (SQR(thresh / 33.f) * chromavef * 5.0f + chromavef); const int halfwin = std::ceil(2 * radius) + 1; // Issue 1674: @@ -695,7 +696,7 @@ void ImProcFunctions::Badpixelscam(CieImage * ncie, double radius, int thresh, i 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; + chrommed += static_cast(chroma); badpix[i * width + j] = chroma; } } @@ -703,15 +704,16 @@ void ImProcFunctions::Badpixelscam(CieImage * ncie, double radius, int thresh, i chrommed /= height * width; if (chrommed > 0.0) { + const float chrommedf = chrommed; // 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 float threshfactor = 1.f / ((thresh * chrommedf) / 33.f + chrommedf); const int halfwin = std::ceil(2 * radius) + 1; #ifdef _OPENMP #pragma omp parallel #endif { #ifdef __SSE2__ - const vfloat chrommedv = F2V(chrommed); + const vfloat chrommedv = F2V(chrommedf); const vfloat onev = F2V(1.f); #endif #ifdef _OPENMP @@ -726,7 +728,7 @@ void ImProcFunctions::Badpixelscam(CieImage * ncie, double radius, int thresh, i } #endif for (; j < width; j++) { - badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed); + badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommedf); } } @@ -1040,7 +1042,7 @@ void ImProcFunctions::BadpixelsLab(LabImage * lab, double radius, int thresh, fl 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; + chrommed += static_cast(chroma); badpix[i * width + j] = chroma; } } @@ -1049,13 +1051,13 @@ void ImProcFunctions::BadpixelsLab(LabImage * lab, double radius, int thresh, fl if (chrommed > 0.0) { // now as chrommed is calculated, we postprocess badpix to reduce the number of divisions in future - + const float chrommedf = chrommed; #ifdef _OPENMP #pragma omp parallel #endif { #ifdef __SSE2__ - const vfloat chrommedv = F2V(chrommed); + const vfloat chrommedv = F2V(chrommedf); const vfloat onev = F2V(1.f); #endif #ifdef _OPENMP @@ -1070,12 +1072,12 @@ void ImProcFunctions::BadpixelsLab(LabImage * lab, double radius, int thresh, fl } #endif for (; j < width; j++) { - badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed); + badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommedf); } } } - const float threshfactor = 1.f / ((thresh * chrommed) / 33.f + chrommed); + const float threshfactor = 1.f / ((thresh * chrommedf) / 33.f + chrommedf); chrom *= 327.68f; chrom *= chrom; diff --git a/rtengine/ahd_demosaic_RT.cc b/rtengine/ahd_demosaic_RT.cc index 064dfd6e1..536726925 100644 --- a/rtengine/ahd_demosaic_RT.cc +++ b/rtengine/ahd_demosaic_RT.cc @@ -52,13 +52,13 @@ void RawImageSource::ahd_demosaic() 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 xyz_rgb[3][3] = { /* XYZ from RGB */ + { 0.412453f, 0.357580f, 0.180423f }, + { 0.212671f, 0.715160f, 0.072169f }, + { 0.019334f, 0.119193f, 0.950227f } }; - constexpr float d65_white[3] = { 0.950456, 1, 1.088754 }; + constexpr float d65_white[3] = { 0.950456f, 1.f, 1.088754f }; double progress = 0.0; @@ -76,7 +76,7 @@ void RawImageSource::ahd_demosaic() 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]; + xyz_cam[i][j] += xyz_rgb[i][k] * static_cast(imatrices.rgb_cam[k][j]) / d65_white[i]; } } } diff --git a/rtengine/alpha.cc b/rtengine/alpha.cc new file mode 100644 index 000000000..34132b879 --- /dev/null +++ b/rtengine/alpha.cc @@ -0,0 +1,96 @@ +/* + * 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 "alpha.h" + +namespace rtengine +{ + +Alpha::Alpha () {} + +Alpha::Alpha (int width, int height) +{ + if (width > 0 && height > 0) { + surface = Cairo::ImageSurface::create (Cairo::FORMAT_A8, width, height); + } +} + +/* +Alpha::~Alpha () { + surface->unreference(); +} +*/ + +void Alpha::setSize (int width, int height) +{ + if (width > 0 && height > 0) { + if (surface) { + if (width != getWidth() && height != getHeight()) { + surface.clear(); // does this delete the referenced object? Unreferencing doesn't work, since Cairo expect to have a non null refCount in the destructor! + } else { + return; + } + } + + surface = Cairo::ImageSurface::create (Cairo::FORMAT_A8, width, height); + } else if (surface) { + surface.clear(); + } +} + +int Alpha::getWidth() const +{ + if (surface) { + return surface->get_width(); + } + + return -1; +} + +int Alpha::getHeight() const +{ + if (surface) { + return surface->get_height(); + } + + return -1; +} + + +Cairo::RefPtr Alpha::getSurface () const +{ + return surface; // to be used in bitmap edition +} + +unsigned char Alpha::operator () (unsigned row, unsigned col) const +{ + return * (surface->get_data () + row * surface->get_width () + col); +} + +unsigned char& Alpha::operator () (unsigned row, unsigned col) +{ + return * (surface->get_data () + row * surface->get_width () + col); +} + +unsigned char* Alpha::operator () (unsigned row) const +{ + return surface->get_data () + row * surface->get_width (); +} + +} diff --git a/rtengine/alpha.h b/rtengine/alpha.h new file mode 100644 index 000000000..314dac642 --- /dev/null +++ b/rtengine/alpha.h @@ -0,0 +1,58 @@ +/* + * 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 _ALPHA_H_ +#define _ALPHA_H_ + +#include +#include + +#define CHECK_BOUNDS 0 + +namespace rtengine +{ + +/// Alpha channel class (8 bits) +class Alpha +{ +protected: + Cairo::RefPtr surface; + +public: + Alpha (); + Alpha (int width, int height); + //~Alpha (); + + void setSize (int width, int height); + int getWidth() const; + int getHeight() const; + + Cairo::RefPtr getSurface () const; + + // TODO: to make the editing faster, we should add an iterator class + + // Will send back the start of a row + unsigned char* operator () (unsigned row) const; + // Will send back a value at a given row, col position + unsigned char& operator () (unsigned row, unsigned col); + unsigned char operator () (unsigned row, unsigned col) const; +}; + +} + +#endif diff --git a/rtengine/array2D.h b/rtengine/array2D.h index 208dab1aa..eee6c3210 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -27,7 +27,7 @@ * * creates an array which is valid within the normal C/C++ scope "{ ... }" * - * access to elements is a simple as: + * access to elements is as simple as: * * array2D my_array (10,10); // creates 10x10 array of floats * value = my_array[3][5]; @@ -48,265 +48,244 @@ * array2D my_array ; // empty container. * my_array(10,10) ; // resize to 10x10 array * my_array(10,10,ARRAY2D_CLEAR_DATA) ; // resize to 10x10 and clear data - * my_array(10,10,ARRAY2D_CLEAR_DATA|ARRAY2D_LOCK_DATA) ; same but set a lock on changes * - * !! locked arrays cannot be resized and cannot be unlocked again !! */ #pragma once -#include // for raise() #include - -// flags for use -#define ARRAY2D_LOCK_DATA 1 -#define ARRAY2D_CLEAR_DATA 2 -#define ARRAY2D_BYREFERENCE 4 -#define ARRAY2D_VERBOSE 8 - #include -#include - +#include +#include #include "noncopyable.h" +// flags for use +constexpr unsigned int ARRAY2D_CLEAR_DATA = 1; +constexpr unsigned int ARRAY2D_BYREFERENCE = 2; + + template -class array2D : - public rtengine::NonCopyable +class array2D { private: - int x, y, owner; - unsigned int flags; - T ** ptr; - T * data; - bool lock; // useful lock to ensure data is not changed anymore. - void ar_realloc(int w, int h, int offset = 0) + ssize_t width; + std::vector rows; + std::vector buffer; + + void initRows(ssize_t h, int offset = 0) { - if ((ptr) && ((h > y) || (4 * h < y))) { - delete[] ptr; - ptr = nullptr; + rows.resize(h); + T* start = buffer.data() + offset; + for (ssize_t i = 0; i < h; ++i) { + rows[i] = start + width * i; } + } - if ((data) && (((h * w) > (x * y)) || ((h * w) < ((x * y) / 4)))) { - delete[] data; - data = nullptr; - } - - if (ptr == nullptr) { - ptr = new T*[h]; - } - - if (data == nullptr) { - data = new T[h * w + offset]; - } - - x = w; - y = h; - - for (int i = 0; i < h; i++) { - ptr[i] = data + offset + w * i; - } - - owner = 1; + void ar_realloc(ssize_t w, ssize_t h, int offset = 0) + { + width = w; + buffer.resize(h * width + offset); + initRows(h, offset); } public: // use as empty declaration, resize before use! // very useful as a member object - array2D() : - x(0), y(0), owner(0), flags(0), ptr(nullptr), data(nullptr), lock(false) - { - //printf("got empty array2D init\n"); - } + array2D() : width(0) {} // creator type1 - array2D(int w, int h, unsigned int flgs = 0) + array2D(int w, int h, unsigned int flags = 0) : width(w) { - flags = flgs; - lock = flags & ARRAY2D_LOCK_DATA; - data = new T[h * w]; - owner = 1; - x = w; - y = h; - ptr = new T*[h]; - - for (int i = 0; i < h; i++) { - ptr[i] = data + i * w; - } - if (flags & ARRAY2D_CLEAR_DATA) { - memset(data, 0, w * h * sizeof(T)); + buffer.resize(h * width, 0); + } else { + buffer.resize(h * width); } + initRows(h); } // creator type 2 - array2D(int w, int h, T ** source, unsigned int flgs = 0) + array2D(int w, int h, T ** source, unsigned int flags = 0) : width(w) { - flags = flgs; - //if (lock) { printf("array2D attempt to overwrite data\n");raise(SIGSEGV);} - lock = flags & ARRAY2D_LOCK_DATA; - // when by reference - // TODO: improve this code with ar_realloc() - owner = (flags & ARRAY2D_BYREFERENCE) ? 0 : 1; - - if (owner) { - data = new T[h * w]; - } else { - data = nullptr; - } - - x = w; - y = h; - ptr = new T*[h]; - - for (int i = 0; i < h; i++) { - if (owner) { - ptr[i] = data + i * w; - - for (int j = 0; j < w; j++) { - ptr[i][j] = source[i][j]; + rows.resize(h); + if (!(flags & ARRAY2D_BYREFERENCE)) { + buffer.resize(h * width); + T* start = buffer.data(); + for (ssize_t i = 0; i < h; ++i) { + rows[i] = start + i * width; + for (ssize_t j = 0; j < width; ++j) { + rows[i][j] = source[i][j]; } - } else { - ptr[i] = source[i]; + } + } else { + for (ssize_t i = 0; i < h; ++i) { + rows[i] = source[i]; } } } - // destructor - ~array2D() + // creator type 3 + array2D(int w, int h, int startx, int starty, T ** source, unsigned int flags = 0) : width(w) { + rows.resize(h); + if (!(flags & ARRAY2D_BYREFERENCE)) { + buffer.resize(h * width); + T* start = buffer.data(); + for (ssize_t i = 0; i < h; ++i) { + rows[i] = start + i * width; + for (ssize_t j = 0; j < width; ++j) { + rows[i][j] = source[i + starty][j + startx]; + } + } + } else { + for (ssize_t i = 0; i < h; ++i) { + rows[i] = source[i + starty] + startx; + } + } + } - if (flags & ARRAY2D_VERBOSE) { - printf(" deleting array2D size %dx%d \n", x, y); + array2D(const array2D& other) : + width(other.width), + buffer(other.buffer) + { + initRows(other.rows.size()); + } + + array2D& operator =(const array2D& other) + { + if (this != &other) { + free(); + width = other.width; + buffer = other.buffer; + initRows(other.rows.size()); } - if ((owner) && (data)) { - delete[] data; - } + return *this; + } - if (ptr) { - delete[] ptr; + void fill(const T val, bool multiThread = false) + { + const ssize_t height = rows.size(); +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (ssize_t i = 0; i < width * height; ++i) { + buffer[i] = val; } } void free() { - if ((owner) && (data)) { - delete[] data; - data = nullptr; - } - - if (ptr) { - delete [] ptr; - ptr = nullptr; - } + buffer.clear(); + rows.clear(); + width = 0; } // use with indices - T * operator[](int index) const + T * operator[](int index) { - assert((index >= 0) && (index < y)); - return ptr[index]; + assert((index >= 0) && (std::size_t(index) < rows.size())); + return rows[index]; + } + + const T * operator[](int index) const + { + assert((index >= 0) && (std::size_t(index) < rows.size())); + return rows[index]; } // use as pointer to T** operator T**() { - return ptr; + return rows.data(); } // use as pointer to T** - operator const T* const *() + operator const T* const *() const { - return ptr; + return rows.data(); } - // use as pointer to data + // use as pointer to buffer operator T*() { // only if owner this will return a valid pointer - return data; + return buffer.data(); + } + + operator const T*() const + { + // only if owner this will return a valid pointer + return buffer.data(); } // useful within init of parent object // or use as resize of 2D array - void operator()(int w, int h, unsigned int flgs = 0, int offset = 0) + void operator()(int w, int h, unsigned int flags = 0, int offset = 0) { - flags = flgs; - - if (flags & ARRAY2D_VERBOSE) { - printf("got init request %dx%d flags=%u\n", w, h, flags); - printf("previous was data %p ptr %p \n", data, ptr); - } - - if (lock) { // our object was locked so don't allow a change. - printf("got init request but object was locked!\n"); - raise( SIGSEGV); - } - - lock = flags & ARRAY2D_LOCK_DATA; - ar_realloc(w, h, offset); if (flags & ARRAY2D_CLEAR_DATA) { - memset(data + offset, 0, static_cast(w) * h * sizeof(T)); + fill(0); } } + array2D& operator+=(const array2D& rhs) + { + if (rhs.getWidth() == this->getWidth() && rhs.getHeight() == this->getHeight()) { + for (int i = 0; i < getHeight(); ++i) { +#ifdef _OPENMP + #pragma omp simd +#endif + + for (int j = 0; j < getWidth(); ++j) { + rows[i][j] += rhs[i][j]; + } + } + } + + return *this; + } + // import from flat data - void operator()(int w, int h, T* copy, unsigned int flgs = 0) + void operator()(std::size_t w, std::size_t h, const T* const copy) { - flags = flgs; - - if (flags & ARRAY2D_VERBOSE) { - printf("got init request %dx%d flags=%u\n", w, h, flags); - printf("previous was data %p ptr %p \n", data, ptr); - } - - if (lock) { // our object was locked so don't allow a change. - printf("got init request but object was locked!\n"); - raise( SIGSEGV); - } - - lock = flags & ARRAY2D_LOCK_DATA; - ar_realloc(w, h); - memcpy(data, copy, w * h * sizeof(T)); + for (std::size_t y = 0; y < h; ++y) { + std::copy(copy + y * w, copy + y * w + w, rows.data()[y]); + } } - int width() const + + int getWidth() const { - return x; + return width; } - int height() const + int getHeight() const { - return y; + return rows.size(); } operator bool() { - return (x > 0 && y > 0); + return (width > 0 && !rows.empty()); } }; template -class multi_array2D +class multi_array2D : public rtengine::NonCopyable { private: array2D list[num]; public: - multi_array2D(int x, int y, int flags = 0, int offset = 0) + multi_array2D(int width, int height, int flags = 0, int offset = 0) { - for (size_t i = 0; i < num; i++) { - list[i](x, y, flags, (i + 1) * offset); + for (size_t i = 0; i < num; ++i) { + list[i](width, height, flags, (i + 1) * offset); } } - ~multi_array2D() - { - //printf("trying to delete the list of array2D objects\n"); - } - array2D & operator[](int index) { assert(static_cast(index) < num); diff --git a/rtengine/ashift_dt.c b/rtengine/ashift_dt.c new file mode 100644 index 000000000..6ea96a752 --- /dev/null +++ b/rtengine/ashift_dt.c @@ -0,0 +1,5132 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2019 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 . + */ + +using namespace std; + +// taken from darktable (src/iop/ashift.c) +/* + This file is part of darktable, + copyright (c) 2016 Ulrich Pegelow. + + darktable is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + darktable is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with darktable. If not, see . +*/ + +// Inspiration to this module comes from the program ShiftN (http://www.shiftn.de) by +// Marcus Hebel. + +// Thanks to Marcus for his support when implementing part of the ShiftN functionality +// to darktable. + +#define ROTATION_RANGE 10 // allowed min/max default range for rotation parameter +#define ROTATION_RANGE_SOFT 20 // allowed min/max range for rotation parameter with manual adjustment +#define LENSSHIFT_RANGE 0.5 // allowed min/max default range for lensshift parameters +#define LENSSHIFT_RANGE_SOFT 1 // allowed min/max range for lensshift parameters with manual adjustment +#define SHEAR_RANGE 0.2 // allowed min/max range for shear parameter +#define SHEAR_RANGE_SOFT 0.5 // allowed min/max range for shear parameter with manual adjustment +#define CAMERA_ANGLE_RANGE_SOFT 80 +#define MIN_LINE_LENGTH 5 // the minimum length of a line in pixels to be regarded as relevant +#define MAX_TANGENTIAL_DEVIATION 30 // by how many degrees a line may deviate from the +/-180 and +/-90 to be regarded as relevant +#define LSD_SCALE 0.99 // LSD: scaling factor for line detection +#define LSD_SIGMA_SCALE 0.6 // LSD: sigma for Gaussian filter is computed as sigma = sigma_scale/scale +#define LSD_QUANT 2.0 // LSD: bound to the quantization error on the gradient norm +#define LSD_ANG_TH 22.5 // LSD: gradient angle tolerance in degrees +#define LSD_LOG_EPS 0.0 // LSD: detection threshold: -log10(NFA) > log_eps +#define LSD_DENSITY_TH 0.7 // LSD: minimal density of region points in rectangle +#define LSD_N_BINS 1024 // LSD: number of bins in pseudo-ordering of gradient modulus +#define LSD_GAMMA 0.45 // gamma correction to apply on raw images prior to line detection +#define RANSAC_RUNS 400 // how many iterations to run in ransac +#define RANSAC_EPSILON 2 // starting value for ransac epsilon (in -log10 units) +#define RANSAC_EPSILON_STEP 1 // step size of epsilon optimization (log10 units) +#define RANSAC_ELIMINATION_RATIO 60 // percentage of lines we try to eliminate as outliers +#define RANSAC_OPTIMIZATION_STEPS 5 // home many steps to optimize epsilon +#define RANSAC_OPTIMIZATION_DRY_RUNS 50 // how man runs per optimization steps +#define RANSAC_HURDLE 5 // hurdle rate: the number of lines below which we do a complete permutation instead of random sampling +#define MINIMUM_FITLINES 4 // minimum number of lines needed for automatic parameter fit +#define NMS_EPSILON 1e-3 // break criterion for Nelder-Mead simplex +#define NMS_SCALE 1.0 // scaling factor for Nelder-Mead simplex +#define NMS_ITERATIONS 400 // number of iterations for Nelder-Mead simplex +#define NMS_CROP_EPSILON 100.0 // break criterion for Nelder-Mead simplex on crop fitting +#define NMS_CROP_SCALE 0.5 // scaling factor for Nelder-Mead simplex on crop fitting +#define NMS_CROP_ITERATIONS 100 // number of iterations for Nelder-Mead simplex on crop fitting +#define NMS_ALPHA 1.0 // reflection coefficient for Nelder-Mead simplex +#define NMS_BETA 0.5 // contraction coefficient for Nelder-Mead simplex +#define NMS_GAMMA 2.0 // expansion coefficient for Nelder-Mead simplex +#define DEFAULT_F_LENGTH 28.0 // focal length we assume if no exif data are available + +/* // define to get debugging output */ +/* #undef ASHIFT_DEBUG */ + +#define SQR(a) ((a) * (a)) + +// For line detection we use the LSD algorithm as published by Rafael Grompone: +// +// "LSD: a Line Segment Detector" by Rafael Grompone von Gioi, +// Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, +// Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd +// http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd +#include "ashift_lsd.c" + +// For parameter optimization we are using the Nelder-Mead simplex method +// implemented by Michael F. Hutt. +#include "ashift_nmsimplex.c" + +#include "homogeneouscoordinates.h" + + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +DT_MODULE_INTROSPECTION(4, dt_iop_ashift_params_t) + + +const char *name() +{ + return _("perspective correction"); +} + +int flags() +{ + return IOP_FLAGS_ALLOW_TILING | IOP_FLAGS_TILING_FULL_ROI | IOP_FLAGS_ONE_INSTANCE; +} + +int groups() +{ + return dt_iop_get_group("perspective correction", IOP_GROUP_CORRECT); +} + +int operation_tags() +{ + return IOP_TAG_DISTORT; +} + +int operation_tags_filter() +{ + // switch off clipping and decoration, we want to see the full image. + return IOP_TAG_DECORATION | IOP_TAG_CLIPPING; +} +#endif // if 0 +//----------------------------------------------------------------------------- + +typedef enum dt_iop_ashift_homodir_t +{ + ASHIFT_HOMOGRAPH_FORWARD, + ASHIFT_HOMOGRAPH_INVERTED +} dt_iop_ashift_homodir_t; + +//typedef enum dt_iop_ashift_linetype_t +enum +{ + ASHIFT_LINE_IRRELEVANT = 0, // the line is found to be not interesting + // eg. too short, or not horizontal or vertical + ASHIFT_LINE_RELEVANT = 1 << 0, // the line is relevant for us + ASHIFT_LINE_DIRVERT = 1 << 1, // the line is (mostly) vertical, else (mostly) horizontal + ASHIFT_LINE_SELECTED = 1 << 2, // the line is selected for fitting + ASHIFT_LINE_VERTICAL_NOT_SELECTED = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_DIRVERT, + ASHIFT_LINE_HORIZONTAL_NOT_SELECTED = ASHIFT_LINE_RELEVANT, + ASHIFT_LINE_VERTICAL_SELECTED = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_DIRVERT | ASHIFT_LINE_SELECTED, + ASHIFT_LINE_HORIZONTAL_SELECTED = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED, + ASHIFT_LINE_MASK = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_DIRVERT | ASHIFT_LINE_SELECTED +}; //dt_iop_ashift_linetype_t; +typedef unsigned int dt_iop_ashift_linetype_t; + +typedef enum dt_iop_ashift_linecolor_t +{ + ASHIFT_LINECOLOR_GREY = 0, + ASHIFT_LINECOLOR_GREEN = 1, + ASHIFT_LINECOLOR_RED = 2, + ASHIFT_LINECOLOR_BLUE = 3, + ASHIFT_LINECOLOR_YELLOW = 4 +} dt_iop_ashift_linecolor_t; + +//typedef enum dt_iop_ashift_fitaxis_t +enum +{ + ASHIFT_FIT_NONE = 0, // none + ASHIFT_FIT_ROTATION = 1 << 0, // flag indicates to fit rotation angle + ASHIFT_FIT_LENS_VERT = 1 << 1, // flag indicates to fit vertical lens shift + ASHIFT_FIT_LENS_HOR = 1 << 2, // flag indicates to fit horizontal lens shift + ASHIFT_FIT_SHEAR = 1 << 3, // flag indicates to fit shear parameter + ASHIFT_FIT_LINES_VERT = 1 << 4, // use vertical lines for fitting + ASHIFT_FIT_LINES_HOR = 1 << 5, // use horizontal lines for fitting + ASHIFT_FIT_LENS_BOTH = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR, + ASHIFT_FIT_LINES_BOTH = ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_VERTICALLY = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LINES_VERT, + ASHIFT_FIT_HORIZONTALLY = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_HOR | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_BOTH = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR | + ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_VERTICALLY_NO_ROTATION = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LINES_VERT, + ASHIFT_FIT_HORIZONTALLY_NO_ROTATION = ASHIFT_FIT_LENS_HOR | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_BOTH_NO_ROTATION = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR | + ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_BOTH_SHEAR = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR | + ASHIFT_FIT_SHEAR | ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_ROTATION_VERTICAL_LINES = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LINES_VERT, + ASHIFT_FIT_ROTATION_HORIZONTAL_LINES = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_ROTATION_BOTH_LINES = ASHIFT_FIT_ROTATION | ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR, + ASHIFT_FIT_FLIP = ASHIFT_FIT_LENS_VERT | ASHIFT_FIT_LENS_HOR | ASHIFT_FIT_LINES_VERT | ASHIFT_FIT_LINES_HOR +}; //dt_iop_ashift_fitaxis_t; +typedef unsigned int dt_iop_ashift_fitaxis_t; + +typedef enum dt_iop_ashift_nmsresult_t +{ + NMS_SUCCESS = 0, + NMS_NOT_ENOUGH_LINES = 1, + NMS_DID_NOT_CONVERGE = 2, + NMS_INSANE = 3 +} dt_iop_ashift_nmsresult_t; + +typedef enum dt_iop_ashift_enhance_t +{ + ASHIFT_ENHANCE_NONE = 0, + ASHIFT_ENHANCE_EDGES = 1 << 0, + ASHIFT_ENHANCE_DETAIL = 1 << 1, + ASHIFT_ENHANCE_HORIZONTAL = 0x100, + ASHIFT_ENHANCE_VERTICAL = 0x200 +} dt_iop_ashift_enhance_t; + +typedef enum dt_iop_ashift_mode_t +{ + ASHIFT_MODE_GENERIC = 0, + ASHIFT_MODE_SPECIFIC = 1 +} dt_iop_ashift_mode_t; + +typedef enum dt_iop_ashift_crop_t +{ + ASHIFT_CROP_OFF = 0, + ASHIFT_CROP_LARGEST = 1, + ASHIFT_CROP_ASPECT = 2 +} dt_iop_ashift_crop_t; + +typedef enum dt_iop_ashift_bounding_t +{ + ASHIFT_BOUNDING_OFF = 0, + ASHIFT_BOUNDING_SELECT = 1, + ASHIFT_BOUNDING_DESELECT = 2 +} dt_iop_ashift_bounding_t; + +typedef enum dt_iop_ashift_jobcode_t +{ + ASHIFT_JOBCODE_NONE = 0, + ASHIFT_JOBCODE_GET_STRUCTURE = 1, + ASHIFT_JOBCODE_FIT = 2 +} dt_iop_ashift_jobcode_t; + +typedef struct dt_iop_ashift_params1_t +{ + float rotation; + float lensshift_v; + float lensshift_h; + int toggle; +} dt_iop_ashift_params1_t; + +typedef struct dt_iop_ashift_params2_t +{ + float rotation; + float lensshift_v; + float lensshift_h; + float f_length; + float crop_factor; + float orthocorr; + float aspect; + dt_iop_ashift_mode_t mode; + int toggle; +} dt_iop_ashift_params2_t; + +typedef struct dt_iop_ashift_params3_t +{ + float rotation; + float lensshift_v; + float lensshift_h; + float f_length; + float crop_factor; + float orthocorr; + float aspect; + dt_iop_ashift_mode_t mode; + int toggle; + dt_iop_ashift_crop_t cropmode; + float cl; + float cr; + float ct; + float cb; +} dt_iop_ashift_params3_t; + +typedef struct dt_iop_ashift_params_t +{ + float rotation; + float lensshift_v; + float lensshift_h; + float shear; + float f_length; + float crop_factor; + float orthocorr; + float aspect; + dt_iop_ashift_mode_t mode; + int toggle; + dt_iop_ashift_crop_t cropmode; + float cl; + float cr; + float ct; + float cb; + float camera_pitch; + float camera_yaw; +} dt_iop_ashift_params_t; + +typedef struct dt_iop_ashift_line_t +{ + float p1[3]; + float p2[3]; + float length; + float width; + float weight; + dt_iop_ashift_linetype_t type; + // homogeneous coordinates: + float L[3]; +} dt_iop_ashift_line_t; + +typedef struct dt_iop_ashift_points_idx_t +{ + size_t offset; + int length; + int near; + int bounded; + dt_iop_ashift_linetype_t type; + dt_iop_ashift_linecolor_t color; + // bounding box: + float bbx, bby, bbX, bbY; +} dt_iop_ashift_points_idx_t; + +typedef struct dt_iop_ashift_fit_params_t +{ + int params_count; + dt_iop_ashift_linetype_t linetype; + dt_iop_ashift_linetype_t linemask; + dt_iop_ashift_line_t *lines; + int lines_count; + int width; + int height; + float weight; + float f_length_kb; + float orthocorr; + float aspect; + float rotation; + float lensshift_v; + float lensshift_h; + float shear; + float camera_pitch; + float camera_yaw; + float rotation_range; + float lensshift_v_range; + float lensshift_h_range; + float shear_range; + float camera_pitch_range; + float camera_yaw_range; +} dt_iop_ashift_fit_params_t; + +typedef struct dt_iop_ashift_cropfit_params_t +{ + int width; + int height; + float x; + float y; + float alpha; + float homograph[3][3]; + float edges[4][3]; +} dt_iop_ashift_cropfit_params_t; + +typedef struct dt_iop_ashift_gui_data_t +{ + /* GtkWidget *rotation; */ + /* GtkWidget *lensshift_v; */ + /* GtkWidget *lensshift_h; */ + /* GtkWidget *shear; */ + /* GtkWidget *guide_lines; */ + /* GtkWidget *cropmode; */ + /* GtkWidget *mode; */ + /* GtkWidget *f_length; */ + /* GtkWidget *crop_factor; */ + /* GtkWidget *orthocorr; */ + /* GtkWidget *aspect; */ + /* GtkWidget *fit_v; */ + /* GtkWidget *fit_h; */ + /* GtkWidget *fit_both; */ + /* GtkWidget *structure; */ + /* GtkWidget *clean; */ + /* GtkWidget *eye; */ + int lines_suppressed; + int fitting; + int isflipped; + int show_guides; + int isselecting; + int isdeselecting; + dt_iop_ashift_bounding_t isbounding; + float near_delta; + int selecting_lines_version; + float rotation_range; + float lensshift_v_range; + float lensshift_h_range; + float shear_range; + float camera_pitch_range; + float camera_yaw_range; + dt_iop_ashift_line_t *lines; + int lines_in_width; + int lines_in_height; + int lines_x_off; + int lines_y_off; + int lines_count; + int vertical_count; + int horizontal_count; + int lines_version; + float vertical_weight; + float horizontal_weight; + float *points; + dt_iop_ashift_points_idx_t *points_idx; + int points_lines_count; + int points_version; + float *buf; + int buf_width; + int buf_height; + int buf_x_off; + int buf_y_off; + float buf_scale; + uint64_t lines_hash; + uint64_t grid_hash; + uint64_t buf_hash; + dt_iop_ashift_fitaxis_t lastfit; + float lastx; + float lasty; + float crop_cx; + float crop_cy; + dt_iop_ashift_jobcode_t jobcode; + int jobparams; + /* dt_pthread_mutex_t lock; */ + MyMutex lock; + gboolean adjust_crop; +} dt_iop_ashift_gui_data_t; + +typedef struct dt_iop_ashift_data_t +{ + float rotation; + float lensshift_v; + float lensshift_h; + float shear; + float f_length_kb; + float orthocorr; + float aspect; + float cl; + float cr; + float ct; + float cb; +} dt_iop_ashift_data_t; + +typedef struct dt_iop_ashift_global_data_t +{ + int kernel_ashift_bilinear; + int kernel_ashift_bicubic; + int kernel_ashift_lanczos2; + int kernel_ashift_lanczos3; +} dt_iop_ashift_global_data_t; + +typedef struct dt_iop_module_t +{ + dt_iop_ashift_gui_data_t *gui_data; + int is_raw; +} dt_iop_module_t; + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +int legacy_params(dt_iop_module_t *self, const void *const old_params, const int old_version, + void *new_params, const int new_version) +{ + if(old_version == 1 && new_version == 4) + { + const dt_iop_ashift_params1_t *old = old_params; + dt_iop_ashift_params_t *new = new_params; + new->rotation = old->rotation; + new->lensshift_v = old->lensshift_v; + new->lensshift_h = old->lensshift_h; + new->shear = 0.0f; + new->toggle = old->toggle; + new->f_length = DEFAULT_F_LENGTH; + new->crop_factor = 1.0f; + new->orthocorr = 100.0f; + new->aspect = 1.0f; + new->mode = ASHIFT_MODE_GENERIC; + new->cropmode = ASHIFT_CROP_OFF; + new->cl = 0.0f; + new->cr = 1.0f; + new->ct = 0.0f; + new->cb = 1.0f; + return 0; + } + if(old_version == 2 && new_version == 4) + { + const dt_iop_ashift_params2_t *old = old_params; + dt_iop_ashift_params_t *new = new_params; + new->rotation = old->rotation; + new->lensshift_v = old->lensshift_v; + new->lensshift_h = old->lensshift_h; + new->shear = 0.0f; + new->toggle = old->toggle; + new->f_length = old->f_length; + new->crop_factor = old->crop_factor; + new->orthocorr = old->orthocorr; + new->aspect = old->aspect; + new->mode = old->mode; + new->cropmode = ASHIFT_CROP_OFF; + new->cl = 0.0f; + new->cr = 1.0f; + new->ct = 0.0f; + new->cb = 1.0f; + return 0; + } + if(old_version == 3 && new_version == 4) + { + const dt_iop_ashift_params3_t *old = old_params; + dt_iop_ashift_params_t *new = new_params; + new->rotation = old->rotation; + new->lensshift_v = old->lensshift_v; + new->lensshift_h = old->lensshift_h; + new->shear = 0.0f; + new->toggle = old->toggle; + new->f_length = old->f_length; + new->crop_factor = old->crop_factor; + new->orthocorr = old->orthocorr; + new->aspect = old->aspect; + new->mode = old->mode; + new->cropmode = old->cropmode; + new->cl = old->cl; + new->cr = old->cr; + new->ct = old->ct; + new->cb = old->cb; + return 0; + } + + return 1; +} + +void init_key_accels(dt_iop_module_so_t *self) +{ + dt_accel_register_slider_iop(self, FALSE, NC_("accel", "rotation")); + dt_accel_register_slider_iop(self, FALSE, NC_("accel", "lens shift (v)")); + dt_accel_register_slider_iop(self, FALSE, NC_("accel", "lens shift (h)")); + dt_accel_register_slider_iop(self, FALSE, NC_("accel", "shear")); +} + +void connect_key_accels(dt_iop_module_t *self) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + dt_accel_connect_slider_iop(self, "rotation", GTK_WIDGET(g->rotation)); + dt_accel_connect_slider_iop(self, "lens shift (v)", GTK_WIDGET(g->lensshift_v)); + dt_accel_connect_slider_iop(self, "lens shift (h)", GTK_WIDGET(g->lensshift_h)); + dt_accel_connect_slider_iop(self, "shear", GTK_WIDGET(g->shear)); +} +#endif // if 0 +//----------------------------------------------------------------------------- + +// multiply 3x3 matrix with 3x1 vector +// dst needs to be different from v +static inline void mat3mulv(float *dst, const float *const mat, const float *const v) +{ + for(int k = 0; k < 3; k++) + { + float x = 0.0f; + for(int i = 0; i < 3; i++) x += mat[3 * k + i] * v[i]; + dst[k] = x; + } +} + +// multiply two 3x3 matrices +// dst needs to be different from m1 and m2 +static inline void mat3mul(float *dst, const float *const m1, const float *const m2) +{ + for(int k = 0; k < 3; k++) + { + for(int i = 0; i < 3; i++) + { + float x = 0.0f; + for(int j = 0; j < 3; j++) x += m1[3 * k + j] * m2[3 * j + i]; + dst[3 * k + i] = x; + } + } +} + +// normalized product of two 3x1 vectors +// dst needs to be different from v1 and v2 +static inline void vec3prodn(float *dst, const float *const v1, const float *const v2) +{ + const float l1 = v1[1] * v2[2] - v1[2] * v2[1]; + const float l2 = v1[2] * v2[0] - v1[0] * v2[2]; + const float l3 = v1[0] * v2[1] - v1[1] * v2[0]; + + // normalize so that l1^2 + l2^2 + l3^3 = 1 + const float sq = sqrt(l1 * l1 + l2 * l2 + l3 * l3); + + const float f = sq > 0.0f ? 1.0f / sq : 1.0f; + + dst[0] = l1 * f; + dst[1] = l2 * f; + dst[2] = l3 * f; +} + +// normalize a 3x1 vector so that x^2 + y^2 + z^2 = 1 +// dst and v may be the same +static inline void vec3norm(float *dst, const float *const v) +{ + const float sq = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + + // special handling for an all-zero vector + const float f = sq > 0.0f ? 1.0f / sq : 1.0f; + + dst[0] = v[0] * f; + dst[1] = v[1] * f; + dst[2] = v[2] * f; +} + +// normalize a 3x1 vector so that x^2 + y^2 = 1; a useful normalization for +// lines in homogeneous coordinates +// dst and v may be the same +static inline void vec3lnorm(float *dst, const float *const v) +{ + const float sq = sqrt(v[0] * v[0] + v[1] * v[1]); + + // special handling for a point vector of the image center + const float f = sq > 0.0f ? 1.0f / sq : 1.0f; + + dst[0] = v[0] * f; + dst[1] = v[1] * f; + dst[2] = v[2] * f; +} + + +// scalar product of two 3x1 vectors +static inline float vec3scalar(const float *const v1, const float *const v2) +{ + return (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]); +} + +// check if 3x1 vector is (very close to) null +static inline int vec3isnull(const float *const v) +{ + const float eps = 1e-10f; + return (fabs(v[0]) < eps && fabs(v[1]) < eps && fabs(v[2]) < eps); +} + +#ifdef ASHIFT_DEBUG +static void print_roi(const dt_iop_roi_t *roi, const char *label) +{ + printf("{ %5d %5d %5d %5d %.6f } %s\n", roi->x, roi->y, roi->width, roi->height, roi->scale, label); +} +#endif + +#define MAT3SWAP(a, b) { float (*tmp)[3] = (a); (a) = (b); (b) = tmp; } + +/* +static void homography(float *homograph, const float angle, const float shift_v, const float shift_h, + const float shear, const float f_length_kb, const float orthocorr, const float aspect, + const int width, const int height, dt_iop_ashift_homodir_t dir) +*/ +static void homography(float *homograph, const float angle, const float shift_v, + const float shift_h, const float shear, const float camera_pitch, const + float camera_yaw, const float f_length_kb, const float orthocorr, const + float aspect, const int width, const int height, dt_iop_ashift_homodir_t + dir) +{ + // calculate homograph that combines all translations, rotations + // and warping into one single matrix operation. + // this is heavily leaning on ShiftN where the homographic matrix expects + // input in (y : x : 1) format. in the darktable world we want to keep the + // (x : y : 1) convention. therefore we need to flip coordinates first and + // make sure that output is in correct format after corrections are applied. + + const float u = width; + const float v = height; + const float rot = -M_PI * angle / 180.0f; + const float pitch = M_PI * camera_pitch / 180.0f; + const float yaw = M_PI * camera_yaw / 180.0f; + + /* + const float phi = M_PI * angle / 180.0f; + const float cosi = cos(phi); + const float sini = sin(phi); + const float ascale = sqrt(aspect); + + // most of this comes from ShiftN + const float f_global = f_length_kb; + const float horifac = 1.0f - orthocorr / 100.0f; + const float exppa_v = exp(shift_v); + const float fdb_v = f_global / (14.4f + (v / u - 1) * 7.2f); + const float rad_v = fdb_v * (exppa_v - 1.0f) / (exppa_v + 1.0f); + const float alpha_v = CLAMP(atan(rad_v), -1.5f, 1.5f); + const float rt_v = sin(0.5f * alpha_v); + const float r_v = fmax(0.1f, 2.0f * (horifac - 1.0f) * rt_v * rt_v + 1.0f); + + const float vertifac = 1.0f - orthocorr / 100.0f; + const float exppa_h = exp(shift_h); + const float fdb_h = f_global / (14.4f + (u / v - 1) * 7.2f); + const float rad_h = fdb_h * (exppa_h - 1.0f) / (exppa_h + 1.0f); + const float alpha_h = CLAMP(atan(rad_h), -1.5f, 1.5f); + const float rt_h = sin(0.5f * alpha_h); + const float r_h = fmax(0.1f, 2.0f * (vertifac - 1.0f) * rt_h * rt_h + 1.0f); + */ + + const float f = f_length_kb * (sqrt(u*u + v*v) / sqrt(36.0*36.0 + 24.0*24.0)); + + // three intermediate buffers for matrix calculation ... + float m1[3][3]/*, m2[3][3]*/, m3[3][3]; + + // ... and some pointers to handle them more intuitively + float (*mwork)[3] = m1; + //float (*minput)[3] = m2; + float (*moutput)[3] = m3; + + /* + // Step 1: flip x and y coordinates (see above) + memset(minput, 0, 9 * sizeof(float)); + minput[0][1] = 1.0f; + minput[1][0] = 1.0f; + minput[2][2] = 1.0f; + + + // Step 2: rotation of image around its center + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = cosi; + mwork[0][1] = -sini; + mwork[1][0] = sini; + mwork[1][1] = cosi; + mwork[0][2] = -0.5f * v * cosi + 0.5f * u * sini + 0.5f * v; + mwork[1][2] = -0.5f * v * sini - 0.5f * u * cosi + 0.5f * u; + mwork[2][2] = 1.0f; + + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + + + // Step 3: apply shearing + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = 1.0f; + mwork[0][1] = shear; + mwork[1][1] = 1.0f; + mwork[1][0] = shear; + mwork[2][2] = 1.0f; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + + + // Step 4: apply vertical lens shift effect + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = exppa_v; + mwork[1][0] = 0.5f * ((exppa_v - 1.0f) * u) / v; + mwork[1][1] = 2.0f * exppa_v / (exppa_v + 1.0f); + mwork[1][2] = -0.5f * ((exppa_v - 1.0f) * u) / (exppa_v + 1.0f); + mwork[2][0] = (exppa_v - 1.0f) / v; + mwork[2][2] = 1.0f; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + + + // Step 5: horizontal compression + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = 1.0f; + mwork[1][1] = r_v; + mwork[1][2] = 0.5f * u * (1.0f - r_v); + mwork[2][2] = 1.0f; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + + + // Step 6: flip x and y back again + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][1] = 1.0f; + mwork[1][0] = 1.0f; + mwork[2][2] = 1.0f; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + + + // from here output vectors would be in (x : y : 1) format + + // Step 7: now we can apply horizontal lens shift with the same matrix format as above + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = exppa_h; + mwork[1][0] = 0.5f * ((exppa_h - 1.0f) * v) / u; + mwork[1][1] = 2.0f * exppa_h / (exppa_h + 1.0f); + mwork[1][2] = -0.5f * ((exppa_h - 1.0f) * v) / (exppa_h + 1.0f); + mwork[2][0] = (exppa_h - 1.0f) / u; + mwork[2][2] = 1.0f; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + + + // Step 8: vertical compression + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = 1.0f; + mwork[1][1] = r_h; + mwork[1][2] = 0.5f * v * (1.0f - r_h); + mwork[2][2] = 1.0f; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + + + // Step 9: apply aspect ratio scaling + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = 1.0f * ascale; + mwork[1][1] = 1.0f / ascale; + mwork[2][2] = 1.0f; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + */ + + rtengine::homogeneous::Vector center; + center[0] = 0.0f; + center[1] = 0.0f; + center[2] = f; + center[3] = 1.0f; + + using rtengine::operator*; + + // Location of image center after rotations. + const rtengine::homogeneous::Vector camera_center_yaw_pitch = + rtengine::homogeneous::rotationMatrix(pitch, rtengine::homogeneous::Axis::X) * + rtengine::homogeneous::rotationMatrix(yaw, rtengine::homogeneous::Axis::Y) * + center; + + const rtengine::homogeneous::Matrix matrix = + // Perspective correction. + rtengine::homogeneous::projectionMatrix(camera_center_yaw_pitch[2], rtengine::homogeneous::Axis::Z) * + rtengine::homogeneous::rotationMatrix(yaw, rtengine::homogeneous::Axis::Y) * + rtengine::homogeneous::rotationMatrix(pitch, rtengine::homogeneous::Axis::X) * + // Rotation. + rtengine::homogeneous::rotationMatrix(rot, rtengine::homogeneous::Axis::Z) * + // Lens/sensor shift and move to z == camera_focal_length. + rtengine::homogeneous::translationMatrix((0.01f * shift_h - 0.5f) * u, (-0.01f * shift_v - 0.5f) * v, f); + + m3[0][0] = matrix[0][0]; + m3[0][1] = matrix[0][1]; + m3[0][2] = matrix[0][3]; + m3[1][0] = matrix[1][0]; + m3[1][1] = matrix[1][1]; + m3[1][2] = matrix[1][3]; + m3[2][0] = matrix[3][0]; + m3[2][1] = matrix[3][1]; + m3[2][2] = matrix[3][3]; + + /* + // Step 10: find x/y offsets and apply according correction so that + // no negative coordinates occur in output vector + float umin = FLT_MAX, vmin = FLT_MAX; + // visit all four corners + for(int y = 0; y < height; y += height - 1) + for(int x = 0; x < width; x += width - 1) + { + float pi[3], po[3]; + pi[0] = x; + pi[1] = y; + pi[2] = 1.0f; + // moutput expects input in (x:y:1) format and gives output as (x:y:1) + mat3mulv(po, (float *)moutput, pi); + umin = fmin(umin, po[0] / po[2]); + vmin = fmin(vmin, po[1] / po[2]); + } + + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = 1.0f; + mwork[1][1] = 1.0f; + mwork[2][2] = 1.0f; + mwork[0][2] = -umin; + mwork[1][2] = -vmin; + + // moutput (of last calculation) -> minput + MAT3SWAP(minput, moutput); + // multiply mwork * minput -> moutput + mat3mul((float *)moutput, (float *)mwork, (float *)minput); + */ + + + // on request we either keep the final matrix for forward conversions + // or produce an inverted matrix for backward conversions + if(dir == ASHIFT_HOMOGRAPH_FORWARD) + { + // we have what we need -> copy it to the right place + memcpy(homograph, moutput, 9 * sizeof(float)); + } + else + { + // generate inverted homograph (mat3inv function defined in colorspaces.c) + if(mat3inv((float *)homograph, (float *)moutput)) + { + // in case of error we set to unity matrix + memset(mwork, 0, 9 * sizeof(float)); + mwork[0][0] = 1.0f; + mwork[1][1] = 1.0f; + mwork[2][2] = 1.0f; + memcpy(homograph, mwork, 9 * sizeof(float)); + } + } +} +#undef MAT3SWAP + + +// check if module parameters are set to all neutral values in which case the module's +// output is identical to its input +static inline int isneutral(dt_iop_ashift_data_t *data) +{ + // values lower than this have no visible effect + const float eps = 1.0e-4f; + + return(fabs(data->rotation) < eps && + fabs(data->lensshift_v) < eps && + fabs(data->lensshift_h) < eps && + fabs(data->shear) < eps && + fabs(data->aspect - 1.0f) < eps && + data->cl < eps && + 1.0f - data->cr < eps && + data->ct < eps && + 1.0f - data->cb < eps); +} + + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +int distort_transform(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, float *points, size_t points_count) +{ + dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data; + + // nothing to be done if parameters are set to neutral values + if(isneutral(data)) return 1; + + float homograph[3][3]; + homography((float *)homograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb, + data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_FORWARD); + + // clipping offset + const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl); + const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct); + const float cx = fullwidth * data->cl; + const float cy = fullheight * data->ct; + +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(points, points_count, homograph) +#endif + for(size_t i = 0; i < points_count * 2; i += 2) + { + float pi[3] = { points[i], points[i + 1], 1.0f }; + float po[3]; + mat3mulv(po, (float *)homograph, pi); + points[i] = po[0] / po[2] - cx; + points[i + 1] = po[1] / po[2] - cy; + } + + return 1; +} + + +int distort_backtransform(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, float *points, + size_t points_count) +{ + dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data; + + // nothing to be done if parameters are set to neutral values + if(isneutral(data)) return 1; + + float ihomograph[3][3]; + homography((float *)ihomograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb, + data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED); + + // clipping offset + const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl); + const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct); + const float cx = fullwidth * data->cl; + const float cy = fullheight * data->ct; + +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(points, points_count, ihomograph) +#endif + for(size_t i = 0; i < points_count * 2; i += 2) + { + float pi[3] = { points[i] + cx, points[i + 1] + cy, 1.0f }; + float po[3]; + mat3mulv(po, (float *)ihomograph, pi); + points[i] = po[0] / po[2]; + points[i + 1] = po[1] / po[2]; + } + + return 1; +} + +void modify_roi_out(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *piece, dt_iop_roi_t *roi_out, + const dt_iop_roi_t *roi_in) +{ + dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data; + *roi_out = *roi_in; + + // nothing more to be done if parameters are set to neutral values + if(isneutral(data)) return; + + float homograph[3][3]; + homography((float *)homograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb, + data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_FORWARD); + + float xm = FLT_MAX, xM = -FLT_MAX, ym = FLT_MAX, yM = -FLT_MAX; + + // go through all four vertices of input roi and convert coordinates to output + for(int y = 0; y < roi_in->height; y += roi_in->height - 1) + { + for(int x = 0; x < roi_in->width; x += roi_in->width - 1) + { + float pin[3], pout[3]; + + // convert from input coordinates to original image coordinates + pin[0] = roi_in->x + x; + pin[1] = roi_in->y + y; + pin[0] /= roi_in->scale; + pin[1] /= roi_in->scale; + pin[2] = 1.0f; + + // apply homograph + mat3mulv(pout, (float *)homograph, pin); + + // convert to output image coordinates + pout[0] /= pout[2]; + pout[1] /= pout[2]; + pout[0] *= roi_out->scale; + pout[1] *= roi_out->scale; + xm = MIN(xm, pout[0]); + xM = MAX(xM, pout[0]); + ym = MIN(ym, pout[1]); + yM = MAX(yM, pout[1]); + } + } + float width = xM - xm + 1; + float height = yM - ym + 1; + + // clipping adjustments + width *= data->cr - data->cl; + height *= data->cb - data->ct; + + roi_out->width = floorf(width); + roi_out->height = floorf(height); + +#ifdef ASHIFT_DEBUG + print_roi(roi_in, "roi_in (going into modify_roi_out)"); + print_roi(roi_out, "roi_out (after modify_roi_out)"); +#endif +} + +void modify_roi_in(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *piece, + const dt_iop_roi_t *const roi_out, dt_iop_roi_t *roi_in) +{ + dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data; + *roi_in = *roi_out; + + // nothing more to be done if parameters are set to neutral values + if(isneutral(data)) return; + + float ihomograph[3][3]; + homography((float *)ihomograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb, + data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED); + + const float orig_w = roi_in->scale * piece->buf_in.width; + const float orig_h = roi_in->scale * piece->buf_in.height; + + // clipping offset + const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl); + const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct); + const float cx = roi_out->scale * fullwidth * data->cl; + const float cy = roi_out->scale * fullheight * data->ct; + + float xm = FLT_MAX, xM = -FLT_MAX, ym = FLT_MAX, yM = -FLT_MAX; + + // go through all four vertices of output roi and convert coordinates to input + for(int y = 0; y < roi_out->height; y += roi_out->height - 1) + { + for(int x = 0; x < roi_out->width; x += roi_out->width - 1) + { + float pin[3], pout[3]; + + // convert from output image coordinates to original image coordinates + pout[0] = roi_out->x + x + cx; + pout[1] = roi_out->y + y + cy; + pout[0] /= roi_out->scale; + pout[1] /= roi_out->scale; + pout[2] = 1.0f; + + // apply homograph + mat3mulv(pin, (float *)ihomograph, pout); + + // convert to input image coordinates + pin[0] /= pin[2]; + pin[1] /= pin[2]; + pin[0] *= roi_in->scale; + pin[1] *= roi_in->scale; + xm = MIN(xm, pin[0]); + xM = MAX(xM, pin[0]); + ym = MIN(ym, pin[1]); + yM = MAX(yM, pin[1]); + } + } + + const struct dt_interpolation *interpolation = dt_interpolation_new(DT_INTERPOLATION_USERPREF); + roi_in->x = fmaxf(0.0f, xm - interpolation->width); + roi_in->y = fmaxf(0.0f, ym - interpolation->width); + roi_in->width = fminf(ceilf(orig_w) - roi_in->x, xM - roi_in->x + 1 + interpolation->width); + roi_in->height = fminf(ceilf(orig_h) - roi_in->y, yM - roi_in->y + 1 + interpolation->width); + + // sanity check. + roi_in->x = CLAMP(roi_in->x, 0, (int)floorf(orig_w)); + roi_in->y = CLAMP(roi_in->y, 0, (int)floorf(orig_h)); + roi_in->width = CLAMP(roi_in->width, 1, (int)floorf(orig_w) - roi_in->x); + roi_in->height = CLAMP(roi_in->height, 1, (int)floorf(orig_h) - roi_in->y); +#ifdef ASHIFT_DEBUG + print_roi(roi_out, "roi_out (going into modify_roi_in)"); + print_roi(roi_in, "roi_in (after modify_roi_in)"); +#endif +} +#endif // if 0 +//----------------------------------------------------------------------------- + +// simple conversion of rgb image into greyscale variant suitable for line segment detection +// the lsd routines expect input as *double, roughly in the range [0.0; 256.0] +static void rgb2grey256(const float *in, double *out, const int width, const int height) +{ + const int ch = 4; + +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(in, out) +#endif + for(int j = 0; j < height; j++) + { + const float *inp = in + (size_t)ch * j * width; + double *outp = out + (size_t)j * width; + for(int i = 0; i < width; i++, inp += ch, outp++) + { + *outp = (0.3f * inp[0] + 0.59f * inp[1] + 0.11f * inp[2]) * 256.0; + } + } +} + +// sobel edge enhancement in one direction +static void edge_enhance_1d(const double *in, double *out, const int width, const int height, + dt_iop_ashift_enhance_t dir) +{ + // Sobel kernels for both directions + const double hkernel[3][3] = { { 1.0, 0.0, -1.0 }, { 2.0, 0.0, -2.0 }, { 1.0, 0.0, -1.0 } }; + const double vkernel[3][3] = { { 1.0, 2.0, 1.0 }, { 0.0, 0.0, 0.0 }, { -1.0, -2.0, -1.0 } }; + const int kwidth = 3; + const int khwidth = kwidth / 2; + + // select kernel + const double *kernel = (dir == ASHIFT_ENHANCE_HORIZONTAL) ? (const double *)hkernel : (const double *)vkernel; + +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(in, out, kernel) +#endif + // loop over image pixels and perform sobel convolution + for(int j = khwidth; j < height - khwidth; j++) + { + const double *inp = in + (size_t)j * width + khwidth; + double *outp = out + (size_t)j * width + khwidth; + for(int i = khwidth; i < width - khwidth; i++, inp++, outp++) + { + double sum = 0.0f; + for(int jj = 0; jj < kwidth; jj++) + { + const int k = jj * kwidth; + const int l = (jj - khwidth) * width; + for(int ii = 0; ii < kwidth; ii++) + { + sum += inp[l + ii - khwidth] * kernel[k + ii]; + } + } + *outp = sum; + } + } + +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(out) +#endif + // border fill in output buffer, so we don't get pseudo lines at image frame + for(int j = 0; j < height; j++) + for(int i = 0; i < width; i++) + { + double val = out[j * width + i]; + + if(j < khwidth) + val = out[(khwidth - j) * width + i]; + else if(j >= height - khwidth) + val = out[(j - khwidth) * width + i]; + else if(i < khwidth) + val = out[j * width + (khwidth - i)]; + else if(i >= width - khwidth) + val = out[j * width + (i - khwidth)]; + + out[j * width + i] = val; + + // jump over center of image + if(i == khwidth && j >= khwidth && j < height - khwidth) i = width - khwidth; + } +} + +// edge enhancement in both directions +static int edge_enhance(const double *in, double *out, const int width, const int height) +{ + double *Gx = NULL; + double *Gy = NULL; + + Gx = (double *)malloc((size_t)width * height * sizeof(double)); + if(Gx == NULL) goto error; + + Gy = (double *)malloc((size_t)width * height * sizeof(double)); + if(Gy == NULL) goto error; + + // perform edge enhancement in both directions + edge_enhance_1d(in, Gx, width, height, ASHIFT_ENHANCE_HORIZONTAL); + edge_enhance_1d(in, Gy, width, height, ASHIFT_ENHANCE_VERTICAL); + +// calculate absolute values +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(Gx, Gy, out) +#endif + for(size_t k = 0; k < (size_t)width * height; k++) + { + out[k] = sqrt(Gx[k] * Gx[k] + Gy[k] * Gy[k]); + } + + free(Gx); + free(Gy); + return TRUE; + +error: + if(Gx) free(Gx); + if(Gy) free(Gy); + return FALSE; +} + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +// XYZ -> sRGB matrix +static void XYZ_to_sRGB(const float *XYZ, float *sRGB) +{ + sRGB[0] = 3.1338561f * XYZ[0] - 1.6168667f * XYZ[1] - 0.4906146f * XYZ[2]; + sRGB[1] = -0.9787684f * XYZ[0] + 1.9161415f * XYZ[1] + 0.0334540f * XYZ[2]; + sRGB[2] = 0.0719453f * XYZ[0] - 0.2289914f * XYZ[1] + 1.4052427f * XYZ[2]; +} + +// sRGB -> XYZ matrix +static void sRGB_to_XYZ(const float *sRGB, float *XYZ) +{ + XYZ[0] = 0.4360747f * sRGB[0] + 0.3850649f * sRGB[1] + 0.1430804f * sRGB[2]; + XYZ[1] = 0.2225045f * sRGB[0] + 0.7168786f * sRGB[1] + 0.0606169f * sRGB[2]; + XYZ[2] = 0.0139322f * sRGB[0] + 0.0971045f * sRGB[1] + 0.7141733f * sRGB[2]; +} +#endif // if 0 +//----------------------------------------------------------------------------- + +// detail enhancement via bilateral grid (function arguments in and out may represent identical buffers) +static int detail_enhance(const float *in, float *out, const int width, const int height) +{ + return TRUE; +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 + const float sigma_r = 5.0f; + const float sigma_s = fminf(width, height) * 0.02f; + const float detail = 10.0f; + + int success = TRUE; + + // we need to convert from RGB to Lab first; + // as colors don't matter we are safe to assume data to be sRGB + + // convert RGB input to Lab, use output buffer for intermediate storage +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(in, out) +#endif + for(int j = 0; j < height; j++) + { + const float *inp = in + (size_t)4 * j * width; + float *outp = out + (size_t)4 * j * width; + for(int i = 0; i < width; i++, inp += 4, outp += 4) + { + float XYZ[3]; + sRGB_to_XYZ(inp, XYZ); + dt_XYZ_to_Lab(XYZ, outp); + } + } + + // bilateral grid detail enhancement + dt_bilateral_t *b = dt_bilateral_init(width, height, sigma_s, sigma_r); + + if(b != NULL) + { + dt_bilateral_splat(b, out); + dt_bilateral_blur(b); + dt_bilateral_slice_to_output(b, out, out, detail); + dt_bilateral_free(b); + } + else + success = FALSE; + + // convert resulting Lab to RGB output +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(out) +#endif + for(int j = 0; j < height; j++) + { + float *outp = out + (size_t)4 * j * width; + for(int i = 0; i < width; i++, outp += 4) + { + float XYZ[3]; + dt_Lab_to_XYZ(outp, XYZ); + XYZ_to_sRGB(XYZ, outp); + } + } + + return success; +#endif // if 0 +//----------------------------------------------------------------------------- +} + +// apply gamma correction to RGB buffer (function arguments in and out may represent identical buffers) +static void gamma_correct(const float *in, float *out, const int width, const int height) +{ +#ifdef _OPENMP +#pragma omp parallel for schedule(static) shared(in, out) +#endif + for(int j = 0; j < height; j++) + { + const float *inp = in + (size_t)4 * j * width; + float *outp = out + (size_t)4 * j * width; + for(int i = 0; i < width; i++, inp += 4, outp += 4) + { + for(int c = 0; c < 3; c++) + outp[c] = powf(inp[c], LSD_GAMMA); + } + } +} + +// do actual line_detection based on LSD algorithm and return results according +// to this module's conventions +static int line_detect(float *in, const int width, const int height, const int x_off, const int y_off, + const float scale, dt_iop_ashift_line_t **alines, int *lcount, int *vcount, int *hcount, + float *vweight, float *hweight, dt_iop_ashift_enhance_t enhance, const int is_raw) +{ + double *greyscale = NULL; + double *lsd_lines = NULL; + dt_iop_ashift_line_t *ashift_lines = NULL; + + int vertical_count = 0; + int horizontal_count = 0; + float vertical_weight = 0.0f; + float horizontal_weight = 0.0f; + // + int lines_count; + // we count the lines that we really want to use + int lct = 0; + + // apply gamma correction if image is raw + if(is_raw) + { + gamma_correct(in, in, width, height); + } + + // if requested perform an additional detail enhancement step + if(enhance & ASHIFT_ENHANCE_DETAIL) + { + (void)detail_enhance(in, in, width, height); + } + + // allocate intermediate buffers + greyscale = (double *)malloc((size_t)width * height * sizeof(double)); + if(greyscale == NULL) goto error; + + // convert to greyscale image + rgb2grey256(in, greyscale, width, height); + + // if requested perform an additional edge enhancement step + if(enhance & ASHIFT_ENHANCE_EDGES) + { + (void)edge_enhance(greyscale, greyscale, width, height); + } + + // call the line segment detector LSD; + // LSD stores the number of found lines in lines_count. + // it returns structural details as vector 'double lines[7 * lines_count]' + lsd_lines = LineSegmentDetection(&lines_count, greyscale, width, height, + LSD_SCALE, LSD_SIGMA_SCALE, LSD_QUANT, + LSD_ANG_TH, LSD_LOG_EPS, LSD_DENSITY_TH, + LSD_N_BINS, NULL, NULL, NULL); + + if(lines_count > 0) + { + // aggregate lines data into our own structures + ashift_lines = (dt_iop_ashift_line_t *)malloc((size_t)lines_count * sizeof(dt_iop_ashift_line_t)); + if(ashift_lines == NULL) goto error; + + for(int n = 0; n < lines_count; n++) + { + float x1 = lsd_lines[n * 7 + 0]; + float y1 = lsd_lines[n * 7 + 1]; + float x2 = lsd_lines[n * 7 + 2]; + float y2 = lsd_lines[n * 7 + 3]; + + // check for lines running along image borders and skip them. + // these would likely be false-positives which could result + // from any kind of processing artifacts + if((fabs(x1 - x2) < 1 && fmax(x1, x2) < 2) || + (fabs(x1 - x2) < 1 && fmin(x1, x2) > width - 3) || + (fabs(y1 - y2) < 1 && fmax(y1, y2) < 2) || + (fabs(y1 - y2) < 1 && fmin(y1, y2) > height - 3)) + continue; + + // line position in absolute coordinates + float px1 = x_off + x1; + float py1 = y_off + y1; + float px2 = x_off + x2; + float py2 = y_off + y2; + + // scale back to input buffer + px1 /= scale; + py1 /= scale; + px2 /= scale; + py2 /= scale; + + // store as homogeneous coordinates + ashift_lines[lct].p1[0] = px1; + ashift_lines[lct].p1[1] = py1; + ashift_lines[lct].p1[2] = 1.0f; + ashift_lines[lct].p2[0] = px2; + ashift_lines[lct].p2[1] = py2; + ashift_lines[lct].p2[2] = 1.0f; + + // calculate homogeneous coordinates of connecting line (defined by the two points) + vec3prodn(ashift_lines[lct].L, ashift_lines[lct].p1, ashift_lines[lct].p2); + + // normalaze line coordinates so that x^2 + y^2 = 1 + // (this will always succeed as L is a real line connecting two real points) + vec3lnorm(ashift_lines[lct].L, ashift_lines[lct].L); + + // length and width of rectangle (see LSD) + ashift_lines[lct].length = sqrt((px2 - px1) * (px2 - px1) + (py2 - py1) * (py2 - py1)); + ashift_lines[lct].width = lsd_lines[n * 7 + 4] / scale; + + // ... and weight (= angle precision * length * width) + const float weight = lsd_lines[n * 7 + 5] * ashift_lines[lct].length * ashift_lines[lct].width; + ashift_lines[lct].weight = weight; + + + const float angle = atan2(py2 - py1, px2 - px1) / M_PI * 180.0f; + const int vertical = fabs(fabs(angle) - 90.0f) < MAX_TANGENTIAL_DEVIATION ? 1 : 0; + const int horizontal = fabs(fabs(fabs(angle) - 90.0f) - 90.0f) < MAX_TANGENTIAL_DEVIATION ? 1 : 0; + + const int relevant = ashift_lines[lct].length > MIN_LINE_LENGTH ? 1 : 0; + + // register type of line + dt_iop_ashift_linetype_t type = ASHIFT_LINE_IRRELEVANT; + if(vertical && relevant) + { + type = ASHIFT_LINE_VERTICAL_SELECTED; + vertical_count++; + vertical_weight += weight; + } + else if(horizontal && relevant) + { + type = ASHIFT_LINE_HORIZONTAL_SELECTED; + horizontal_count++; + horizontal_weight += weight; + } + ashift_lines[lct].type = type; + + // the next valid line + lct++; + } + } +#ifdef ASHIFT_DEBUG + printf("%d lines (vertical %d, horizontal %d, not relevant %d)\n", lines_count, vertical_count, + horizontal_count, lct - vertical_count - horizontal_count); + float xmin = FLT_MAX, xmax = FLT_MIN, ymin = FLT_MAX, ymax = FLT_MIN; + for(int n = 0; n < lct; n++) + { + xmin = fmin(xmin, fmin(ashift_lines[n].p1[0], ashift_lines[n].p2[0])); + xmax = fmax(xmax, fmax(ashift_lines[n].p1[0], ashift_lines[n].p2[0])); + ymin = fmin(ymin, fmin(ashift_lines[n].p1[1], ashift_lines[n].p2[1])); + ymax = fmax(ymax, fmax(ashift_lines[n].p1[1], ashift_lines[n].p2[1])); + printf("x1 %.0f, y1 %.0f, x2 %.0f, y2 %.0f, length %.0f, width %f, X %f, Y %f, Z %f, type %d, scalars %f %f\n", + ashift_lines[n].p1[0], ashift_lines[n].p1[1], ashift_lines[n].p2[0], ashift_lines[n].p2[1], + ashift_lines[n].length, ashift_lines[n].width, + ashift_lines[n].L[0], ashift_lines[n].L[1], ashift_lines[n].L[2], ashift_lines[n].type, + vec3scalar(ashift_lines[n].p1, ashift_lines[n].L), + vec3scalar(ashift_lines[n].p2, ashift_lines[n].L)); + } + printf("xmin %.0f, xmax %.0f, ymin %.0f, ymax %.0f\n", xmin, xmax, ymin, ymax); +#endif + + // store results in provided locations + *lcount = lct; + *vcount = vertical_count; + *vweight = vertical_weight; + *hcount = horizontal_count; + *hweight = horizontal_weight; + *alines = ashift_lines; + + // free intermediate buffers + free(lsd_lines); + free(greyscale); + return lct > 0 ? TRUE : FALSE; + +error: + free(lsd_lines); + free(greyscale); + return FALSE; +} + +// get image from buffer, analyze for structure and save results +static int get_structure(dt_iop_module_t *module, dt_iop_ashift_enhance_t enhance) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + float *buffer = NULL; + int width = 0; + int height = 0; + int x_off = 0; + int y_off = 0; + float scale = 0.0f; + + { //dt_pthread_mutex_lock(&g->lock); + MyMutex::MyLock lock(g->lock); + + // read buffer data if they are available + if(g->buf != NULL) + { + width = g->buf_width; + height = g->buf_height; + x_off = g->buf_x_off; + y_off = g->buf_y_off; + scale = g->buf_scale; + + // create a temporary buffer to hold image data + buffer = (float *)malloc((size_t)width * height * 4 * sizeof(float)); + if(buffer != NULL) + memcpy(buffer, g->buf, (size_t)width * height * 4 * sizeof(float)); + } + } /* dt_pthread_mutex_unlock(&g->lock); */ + + if(buffer == NULL) goto error; + + // get rid of old structural data + g->lines_count = 0; + g->vertical_count = 0; + g->horizontal_count = 0; + free(g->lines); + g->lines = NULL; + + dt_iop_ashift_line_t *lines; + int lines_count; + int vertical_count; + int horizontal_count; + float vertical_weight; + float horizontal_weight; + + // get new structural data + if(!line_detect(buffer, width, height, x_off, y_off, scale, &lines, &lines_count, + &vertical_count, &horizontal_count, &vertical_weight, &horizontal_weight, + enhance, module->is_raw))//dt_image_is_raw(&module->dev->image_storage))) + goto error; + + // save new structural data + g->lines_in_width = width; + g->lines_in_height = height; + g->lines_x_off = x_off; + g->lines_y_off = y_off; + g->lines_count = lines_count; + g->vertical_count = vertical_count; + g->horizontal_count = horizontal_count; + g->vertical_weight = vertical_weight; + g->horizontal_weight = horizontal_weight; + g->lines_version++; + g->lines_suppressed = 0; + g->lines = lines; + + free(buffer); + return TRUE; + +error: + free(buffer); + return FALSE; +} + + +// swap two integer values +static inline void swap(int *a, int *b) +{ + int tmp = *a; + *a = *b; + *b = tmp; +} + +// do complete permutations +static int quickperm(int *a, int *p, const int N, int *i) +{ + if(*i >= N) return FALSE; + + p[*i]--; + int j = (*i % 2 == 1) ? p[*i] : 0; + swap(&a[j], &a[*i]); + *i = 1; + while(p[*i] == 0) + { + p[*i] = *i; + (*i)++; + } + return TRUE; +} + +// Fisher-Yates shuffle +static void shuffle(int *a, const int N) +{ + for(int i = 0; i < N; i++) + { + int j = i + rand() % (N - i); + swap(&a[j], &a[i]); + } +} + +// factorial function +static int fact(const int n) +{ + return (n == 1 ? 1 : n * fact(n - 1)); +} + +// We use a pseudo-RANSAC algorithm to elminiate ouliers from our set of lines. The +// original RANSAC works on linear optimization problems. Our model is nonlinear. We +// take advantage of the fact that lines interesting for our model are vantage lines +// that meet in one vantage point for each subset of lines (vertical/horizontal). +// Strategy: we construct a model by (random) sampling within the subset of lines and +// calculate the vantage point. Then we check the "distance" of all other lines to the +// vantage point. The model that gives highest number of lines combined with the highest +// total weight and lowest overall "distance" wins. +// Disadvantage: compared to the original RANSAC we don't get any model parameters that +// we could use for the following NMS fit. +// Self-tuning: we optimize "epsilon", the hurdle rate to reject a line as an outlier, +// by a number of dry runs first. The target average percentage value of lines to eliminate as +// outliers (without judging on the quality of the model) is given by RANSAC_ELIMINATION_RATIO, +// note: the actual percentage of outliers removed in the final run will be lower because we +// will finally look for the best quality model with the optimized epsilon and that quality value also +// encloses the number of good lines +static void ransac(const dt_iop_ashift_line_t *lines, int *index_set, int *inout_set, + const int set_count, const float total_weight, const int xmin, const int xmax, + const int ymin, const int ymax) +{ + if(set_count < 3) return; + + const size_t set_size = set_count * sizeof(int); + int *best_set = (int *)malloc(set_size); + memcpy(best_set, index_set, set_size); + int *best_inout = (int *)calloc(1, set_size); + + float best_quality = 0.0f; + + // hurdle value epsilon for rejecting a line as an outlier will be self-tuning + // in a number of dry runs + float epsilon = pow(10.0f, -RANSAC_EPSILON); + float epsilon_step = RANSAC_EPSILON_STEP; + // some accounting variables for self-tuning + int lines_eliminated = 0; + int valid_runs = 0; + + // number of runs to optimize epsilon + const int optiruns = RANSAC_OPTIMIZATION_STEPS * RANSAC_OPTIMIZATION_DRY_RUNS; + // go for complete permutations on small set sizes, else for random sample consensus + const int riter = (set_count > RANSAC_HURDLE) ? RANSAC_RUNS : fact(set_count); + + // some data needed for quickperm + int *perm = (int *)malloc((set_count + 1) * sizeof(int)); + for(int n = 0; n < set_count + 1; n++) perm[n] = n; + int piter = 1; + + // inout holds good/bad qualification for each line + int *inout = (int *)malloc(set_size); + + for(int r = 0; r < optiruns + riter; r++) + { + // get random or systematic variation of index set + if(set_count > RANSAC_HURDLE || r < optiruns) + shuffle(index_set, set_count); + else + (void)quickperm(index_set, perm, set_count, &piter); + + // summed quality evaluation of this run + float quality = 0.0f; + + // we build a model ouf of the first two lines + const float *L1 = lines[index_set[0]].L; + const float *L2 = lines[index_set[1]].L; + + // get intersection point (ideally a vantage point) + float V[3]; + vec3prodn(V, L1, L2); + + // catch special cases: + // a) L1 and L2 are identical -> V is NULL -> no valid vantage point + // b) vantage point lies inside image frame (no chance to correct for this case) + if(vec3isnull(V) || + (fabs(V[2]) > 0.0f && + V[0]/V[2] >= xmin && + V[1]/V[2] >= ymin && + V[0]/V[2] <= xmax && + V[1]/V[2] <= ymax)) + { + // no valid model + quality = 0.0f; + } + else + { + // valid model + + // normalize V so that x^2 + y^2 + z^2 = 1 + vec3norm(V, V); + + // the two lines constituting the model are part of the set + inout[0] = 1; + inout[1] = 1; + + // go through all remaining lines, check if they are within the model, and + // mark that fact in inout[]. + // summarize a quality parameter for all lines within the model + for(int n = 2; n < set_count; n++) + { + // L is normalized so that x^2 + y^2 = 1 + const float *L3 = lines[index_set[n]].L; + + // we take the absolute value of the dot product of V and L as a measure + // of the "distance" between point and line. Note that this is not the real euclidean + // distance but - with the given normalization - just a pragmatically selected number + // that goes to zero if V lies on L and increases the more V and L are apart + const float d = fabs(vec3scalar(V, L3)); + + // depending on d we either include or exclude the point from the set + inout[n] = (d < epsilon) ? 1 : 0; + + float q; + + if(inout[n] == 1) + { + // a quality parameter that depends 1/3 on the number of lines within the model, + // 1/3 on their weight, and 1/3 on their weighted distance d to the vantage point + q = 0.33f / (float)set_count + + 0.33f * lines[index_set[n]].weight / total_weight + + 0.33f * (1.0f - d / epsilon) * (float)set_count * lines[index_set[n]].weight / total_weight; + } + else + { + q = 0.0f; + lines_eliminated++; + } + + quality += q; + } + valid_runs++; + } + + if(r < optiruns) + { + // on last run of each self-tuning step + if((r % RANSAC_OPTIMIZATION_DRY_RUNS) == (RANSAC_OPTIMIZATION_DRY_RUNS - 1) && (valid_runs > 0)) + { +#ifdef ASHIFT_DEBUG + printf("ransac self-tuning (run %d): epsilon %f", r, epsilon); +#endif + // average ratio of lines that we eliminated with the given epsilon + float ratio = 100.0f * (float)lines_eliminated / ((float)set_count * valid_runs); + // adjust epsilon accordingly + if(ratio < RANSAC_ELIMINATION_RATIO) + epsilon = pow(10.0f, log10(epsilon) - epsilon_step); + else if(ratio > RANSAC_ELIMINATION_RATIO) + epsilon = pow(10.0f, log10(epsilon) + epsilon_step); +#ifdef ASHIFT_DEBUG + printf(" (elimination ratio %f) -> %f\n", ratio, epsilon); +#endif + // reduce step-size for next optimization round + epsilon_step /= 2.0f; + lines_eliminated = 0; + valid_runs = 0; + } + } + else + { + // in the "real" runs check against the best model found so far + if(quality > best_quality) + { + memcpy(best_set, index_set, set_size); + memcpy(best_inout, inout, set_size); + best_quality = quality; + } + } + +#ifdef ASHIFT_DEBUG + // report some statistics + int count = 0, lastcount = 0; + for(int n = 0; n < set_count; n++) count += best_inout[n]; + for(int n = 0; n < set_count; n++) lastcount += inout[n]; + printf("ransac run %d: best qual %.6f, eps %.6f, line count %d of %d (this run: qual %.5f, count %d (%2f%%))\n", r, + best_quality, epsilon, count, set_count, quality, lastcount, 100.0f * lastcount / (float)set_count); +#endif + } + + // store back best set + memcpy(index_set, best_set, set_size); + memcpy(inout_set, best_inout, set_size); + + free(inout); + free(perm); + free(best_inout); + free(best_set); +} + + +// try to clean up structural data by eliminating outliers and thereby increasing +// the chance of a convergent fitting +static int remove_outliers(dt_iop_module_t *module) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + const int width = g->lines_in_width; + const int height = g->lines_in_height; + const int xmin = g->lines_x_off; + const int ymin = g->lines_y_off; + const int xmax = xmin + width; + const int ymax = ymin + height; + + // holds the index set of lines we want to work on + int *lines_set = (int *)malloc(g->lines_count * sizeof(int)); + // holds the result of ransac + int *inout_set = (int *)malloc(g->lines_count * sizeof(int)); + + // some accounting variables + int vnb = 0, vcount = 0; + int hnb = 0, hcount = 0; + + // just to be on the safe side + if(g->lines == NULL) goto error; + + // generate index list for the vertical lines + for(int n = 0; n < g->lines_count; n++) + { + // is this a selected vertical line? + if((g->lines[n].type & ASHIFT_LINE_MASK) != ASHIFT_LINE_VERTICAL_SELECTED) + continue; + + lines_set[vnb] = n; + inout_set[vnb] = 0; + vnb++; + } + + // it only makes sense to call ransac if we have more than two lines + if(vnb > 2) + ransac(g->lines, lines_set, inout_set, vnb, g->vertical_weight, + xmin, xmax, ymin, ymax); + + // adjust line selected flag according to the ransac results + for(int n = 0; n < vnb; n++) + { + const int m = lines_set[n]; + if(inout_set[n] == 1) + { + g->lines[m].type |= ASHIFT_LINE_SELECTED; + vcount++; + } + else + g->lines[m].type &= ~ASHIFT_LINE_SELECTED; + } + // update number of vertical lines + g->vertical_count = vcount; + g->lines_version++; + + // now generate index list for the horizontal lines + for(int n = 0; n < g->lines_count; n++) + { + // is this a selected horizontal line? + if((g->lines[n].type & ASHIFT_LINE_MASK) != ASHIFT_LINE_HORIZONTAL_SELECTED) + continue; + + lines_set[hnb] = n; + inout_set[hnb] = 0; + hnb++; + } + + // it only makes sense to call ransac if we have more than two lines + if(hnb > 2) + ransac(g->lines, lines_set, inout_set, hnb, g->horizontal_weight, + xmin, xmax, ymin, ymax); + + // adjust line selected flag according to the ransac results + for(int n = 0; n < hnb; n++) + { + const int m = lines_set[n]; + if(inout_set[n] == 1) + { + g->lines[m].type |= ASHIFT_LINE_SELECTED; + hcount++; + } + else + g->lines[m].type &= ~ASHIFT_LINE_SELECTED; + } + // update number of horizontal lines + g->horizontal_count = hcount; + g->lines_version++; + + free(inout_set); + free(lines_set); + + return TRUE; + +error: + free(inout_set); + free(lines_set); + return FALSE; +} + +// utility function to map a variable in [min; max] to [-INF; + INF] +static inline double logit(double x, double min, double max) +{ + const double eps = 1.0e-6; + // make sure p does not touch the borders of its definition area, + // not critical for data accuracy as logit() is only used on initial fit parameters + double p = CLAMP((x - min) / (max - min), eps, 1.0 - eps); + + return (2.0 * atanh(2.0 * p - 1.0)); +} + +// inverted function to logit() +static inline double ilogit(double L, double min, double max) +{ + double p = 0.5 * (1.0 + tanh(0.5 * L)); + + return (p * (max - min) + min); +} + +// helper function for simplex() return quality parameter for the given model +// strategy: +// * generate homography matrix out of fixed parameters and fitting parameters +// * apply homography to all end points of affected lines +// * generate new line out of transformed end points +// * calculate scalar product s of line with perpendicular axis +// * sum over weighted s^2 values +static double model_fitness(double *params, void *data) +{ + dt_iop_ashift_fit_params_t *fit = (dt_iop_ashift_fit_params_t *)data; + + // just for convenience: get shorter names + dt_iop_ashift_line_t *lines = fit->lines; + const int lines_count = fit->lines_count; + const int width = fit->width; + const int height = fit->height; + const float f_length_kb = fit->f_length_kb; + const float orthocorr = fit->orthocorr; + const float aspect = fit->aspect; + + float rotation = fit->rotation; + float lensshift_v = fit->lensshift_v; + float lensshift_h = fit->lensshift_h; + float shear = fit->shear; + float camera_pitch = fit->camera_pitch; + float camera_yaw = fit->camera_yaw; + float rotation_range = fit->rotation_range; + /* + float lensshift_v_range = fit->lensshift_v_range; + float lensshift_h_range = fit->lensshift_h_range; + float shear_range = fit->shear_range; + */ + float camera_pitch_range = fit->camera_pitch_range; + float camera_yaw_range = fit->camera_yaw_range; + + int pcount = 0; + + // fill in fit parameters from params[]. Attention: order matters!!! + if(isnan(rotation)) + { + rotation = ilogit(params[pcount], -rotation_range, rotation_range); + pcount++; + } + + /* + if(isnan(lensshift_v)) + { + lensshift_v = ilogit(params[pcount], -lensshift_v_range, lensshift_v_range); + pcount++; + } + + if(isnan(lensshift_h)) + { + lensshift_h = ilogit(params[pcount], -lensshift_h_range, lensshift_h_range); + pcount++; + } + + if(isnan(shear)) + { + shear = ilogit(params[pcount], -shear_range, shear_range); + pcount++; + } + */ + + if(isnan(camera_pitch)) + { + camera_pitch = ilogit(params[pcount], -camera_pitch_range, camera_pitch_range); + pcount++; + } + + if(isnan(camera_yaw)) + { + camera_yaw = ilogit(params[pcount], -camera_yaw_range, camera_yaw_range); + pcount++; + } + + assert(pcount == fit->params_count); + + // the possible reference axes + const float Av[3] = { 1.0f, 0.0f, 0.0f }; + const float Ah[3] = { 0.0f, 1.0f, 0.0f }; + + // generate homograph out of the parameters + float homograph[3][3]; + homography((float *)homograph, rotation, lensshift_v, lensshift_h, shear, camera_pitch, camera_yaw, f_length_kb, + orthocorr, aspect, width, height, ASHIFT_HOMOGRAPH_FORWARD); + + // accounting variables + double sumsq_v = 0.0; + double sumsq_h = 0.0; + double weight_v = 0.0; + double weight_h = 0.0; + int count_v = 0; + int count_h = 0; + int count = 0; + + // iterate over all lines + for(int n = 0; n < lines_count; n++) + { + // check if this is a line which we must skip + if((lines[n].type & fit->linemask) != fit->linetype) + continue; + + // the direction of this line (vertical?) + const int isvertical = lines[n].type & ASHIFT_LINE_DIRVERT; + + // select the perpendicular reference axis + const float *A = isvertical ? Ah : Av; + + // apply homographic transformation to the end points + float P1[3], P2[3]; + mat3mulv(P1, (float *)homograph, lines[n].p1); + mat3mulv(P2, (float *)homograph, lines[n].p2); + + // get line connecting the two points + float L[3]; + vec3prodn(L, P1, P2); + + // normalize L so that x^2 + y^2 = 1; makes sure that + // y^2 = 1 / (1 + m^2) and x^2 = m^2 / (1 + m^2) with m defining the slope of the line + vec3lnorm(L, L); + + // get scalar product of line L with orthogonal axis A -> gives 0 if line is perpendicular + float s = vec3scalar(L, A); + + // sum up weighted s^2 for both directions individually + sumsq_v += isvertical ? (double)s * s * lines[n].weight : 0.0; + weight_v += isvertical ? lines[n].weight : 0.0; + count_v += isvertical ? 1 : 0; + sumsq_h += !isvertical ? (double)s * s * lines[n].weight : 0.0; + weight_h += !isvertical ? lines[n].weight : 0.0; + count_h += !isvertical ? 1 : 0; + count++; + } + + const double v = weight_v > 0.0f && count > 0 ? sumsq_v / weight_v * (float)count_v / count : 0.0; + const double h = weight_h > 0.0f && count > 0 ? sumsq_h / weight_h * (float)count_h / count : 0.0; + + double sum = sqrt(1.0 - (1.0 - v) * (1.0 - h)) * 1.0e6; + //double sum = sqrt(v + h) * 1.0e6; + +#ifdef ASHIFT_DEBUG + /* + printf("fitness with rotation %f, lensshift_v %f, lensshift_h %f, shear %f -> lines %d, quality %10f\n", + rotation, lensshift_v, lensshift_h, shear, count, sum); + */ + printf("fitness with rotation %f, camera_pitch %f, camera_yaw %f -> lines %d, quality %10f\n", + rotation, camera_pitch, camera_yaw, count, sum); +#endif + + return sum; +} + +// setup all data structures for fitting and call NM simplex +static dt_iop_ashift_nmsresult_t nmsfit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir, int min_line_count) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + if(!g->lines) return NMS_NOT_ENOUGH_LINES; + if(dir == ASHIFT_FIT_NONE) return NMS_SUCCESS; + + double params[4]; + int pcount = 0; + int enough_lines = TRUE; + + // initialize fit parameters + dt_iop_ashift_fit_params_t fit; + fit.lines = g->lines; + fit.lines_count = g->lines_count; + fit.width = g->lines_in_width; + fit.height = g->lines_in_height; + fit.f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? (float)DEFAULT_F_LENGTH : p->f_length * p->crop_factor; + fit.orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr; + fit.aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect; + fit.rotation = p->rotation; + fit.lensshift_v = p->lensshift_v; + fit.lensshift_h = p->lensshift_h; + fit.shear = p->shear; + fit.camera_pitch = p->camera_pitch; + fit.camera_yaw = p->camera_yaw; + fit.rotation_range = g->rotation_range; + fit.lensshift_v_range = g->lensshift_v_range; + fit.lensshift_h_range = g->lensshift_h_range; + fit.shear_range = g->shear_range; + fit.camera_pitch_range = g->camera_pitch_range; + fit.camera_yaw_range = g->camera_yaw_range; + fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED; + fit.linemask = ASHIFT_LINE_MASK; + fit.params_count = 0; + fit.weight = 0.0f; + + // if the image is flipped and if we do not want to fit both lens shift + // directions or none at all, then we need to change direction + dt_iop_ashift_fitaxis_t mdir = dir; + if((mdir & ASHIFT_FIT_LENS_BOTH) != ASHIFT_FIT_LENS_BOTH && + (mdir & ASHIFT_FIT_LENS_BOTH) != 0) + { + // flip all directions + mdir ^= g->isflipped ? ASHIFT_FIT_FLIP : 0; + // special case that needs to be corrected + mdir |= (mdir & ASHIFT_FIT_LINES_BOTH) == 0 ? ASHIFT_FIT_LINES_BOTH : 0; + } + + + // prepare fit structure and starting parameters for simplex fit. + // note: the sequence of parameters in params[] needs to match the + // respective order in dt_iop_ashift_fit_params_t. Parameters which are + // to be fittet are marked with NAN in the fit structure. Non-NAN + // parameters are assumed to be constant. + if(mdir & ASHIFT_FIT_ROTATION) + { + // we fit rotation + fit.params_count++; + params[pcount] = logit(0, -fit.rotation_range, fit.rotation_range); + pcount++; + fit.rotation = NAN; + } + + /* + if(mdir & ASHIFT_FIT_LENS_VERT) + { + // we fit vertical lens shift + fit.params_count++; + params[pcount] = logit(fit.lensshift_v, -fit.lensshift_v_range, fit.lensshift_v_range); + pcount++; + fit.lensshift_v = NAN; + } + + if(mdir & ASHIFT_FIT_LENS_HOR) + { + // we fit horizontal lens shift + fit.params_count++; + params[pcount] = logit(fit.lensshift_h, -fit.lensshift_h_range, fit.lensshift_h_range); + pcount++; + fit.lensshift_h = NAN; + } + + if(mdir & ASHIFT_FIT_SHEAR) + { + // we fit the shear parameter + fit.params_count++; + params[pcount] = logit(fit.shear, -fit.shear_range, fit.shear_range); + pcount++; + fit.shear = NAN; + } + */ + + if(mdir & ASHIFT_FIT_LENS_VERT) + { + // we fit pitch + fit.params_count++; + params[pcount] = logit(0, -fit.camera_pitch_range, fit.camera_pitch_range); + pcount++; + fit.camera_pitch = NAN; + } + + if(mdir & ASHIFT_FIT_LENS_HOR) + { + // we fit yaw + fit.params_count++; + params[pcount] = logit(0, -fit.camera_yaw_range, fit.camera_yaw_range); + pcount++; + fit.camera_yaw = NAN; + } + + if(mdir & ASHIFT_FIT_LINES_VERT) + { + // we use vertical lines for fitting + fit.linetype |= ASHIFT_LINE_DIRVERT; + fit.weight += g->vertical_weight; + enough_lines = enough_lines && (g->vertical_count >= min_line_count); + } + + if(mdir & ASHIFT_FIT_LINES_HOR) + { + // we use horizontal lines for fitting + fit.linetype |= 0; + fit.weight += g->horizontal_weight; + enough_lines = enough_lines && (g->horizontal_count >= min_line_count); + } + + // this needs to come after ASHIFT_FIT_LINES_VERT and ASHIFT_FIT_LINES_HOR + if((mdir & ASHIFT_FIT_LINES_BOTH) == ASHIFT_FIT_LINES_BOTH) + { + // if we use fitting in both directions we need to + // adjust fit.linetype and fit.linemask to match all selected lines + fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED; + fit.linemask = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED; + } + + // error case: we do not run simplex if there are not enough lines + if(!enough_lines) + { +#ifdef ASHIFT_DEBUG + printf("optimization not possible: insufficient number of lines\n"); +#endif + return NMS_NOT_ENOUGH_LINES; + } + + // start the simplex fit + int iter = simplex(model_fitness, params, fit.params_count, NMS_EPSILON, NMS_SCALE, NMS_ITERATIONS, NULL, (void*)&fit); + + // error case: the fit did not converge + if(iter >= NMS_ITERATIONS) + { +#ifdef ASHIFT_DEBUG + printf("optimization not successful: maximum number of iterations reached (%d)\n", iter); +#endif + return NMS_DID_NOT_CONVERGE; + } + + // fit was successful: now consolidate the results (order matters!!!) + pcount = 0; + fit.rotation = isnan(fit.rotation) ? ilogit(params[pcount++], -fit.rotation_range, fit.rotation_range) : fit.rotation; + /* + fit.lensshift_v = isnan(fit.lensshift_v) ? ilogit(params[pcount++], -fit.lensshift_v_range, fit.lensshift_v_range) : fit.lensshift_v; + fit.lensshift_h = isnan(fit.lensshift_h) ? ilogit(params[pcount++], -fit.lensshift_h_range, fit.lensshift_h_range) : fit.lensshift_h; + fit.shear = isnan(fit.shear) ? ilogit(params[pcount++], -fit.shear_range, fit.shear_range) : fit.shear; + */ + fit.camera_pitch = isnan(fit.camera_pitch) ? ilogit(params[pcount++], -fit.camera_pitch_range, fit.camera_pitch_range) : fit.camera_pitch; + fit.camera_yaw = isnan(fit.camera_yaw) ? ilogit(params[pcount++], -fit.camera_yaw_range, fit.camera_yaw_range) : fit.camera_yaw; +#ifdef ASHIFT_DEBUG + /* + printf("params after optimization (%d iterations): rotation %f, lensshift_v %f, lensshift_h %f, shear %f\n", + iter, fit.rotation, fit.lensshift_v, fit.lensshift_h, fit.shear); + */ + printf("params after optimization (%d iterations): rotation %f, camera_pitch %f, camera_yaw %f\n", + iter, fit.rotation, fit.camera_pitch, fit.camera_yaw); +#endif + + /* + // sanity check: in case of extreme values the image gets distorted so strongly that it spans an insanely huge area. we check that + // case and assume values that increase the image area by more than a factor of 4 as being insane. + float homograph[3][3]; + homography((float *)homograph, fit.rotation, fit.lensshift_v, fit.lensshift_h, fit.shear, fit.f_length_kb, + fit.orthocorr, fit.aspect, fit.width, fit.height, ASHIFT_HOMOGRAPH_FORWARD); + + // visit all four corners and find maximum span + float xm = FLT_MAX, xM = -FLT_MAX, ym = FLT_MAX, yM = -FLT_MAX; + for(int y = 0; y < fit.height; y += fit.height - 1) + for(int x = 0; x < fit.width; x += fit.width - 1) + { + float pi[3], po[3]; + pi[0] = x; + pi[1] = y; + pi[2] = 1.0f; + mat3mulv(po, (float *)homograph, pi); + po[0] /= po[2]; + po[1] /= po[2]; + xm = fmin(xm, po[0]); + ym = fmin(ym, po[1]); + xM = fmax(xM, po[0]); + yM = fmax(yM, po[1]); + } + + if((xM - xm) * (yM - ym) > 4.0f * fit.width * fit.height) + { +#ifdef ASHIFT_DEBUG + printf("optimization not successful: degenerate case with area growth factor (%f) exceeding limits\n", + (xM - xm) * (yM - ym) / (fit.width * fit.height)); +#endif + return NMS_INSANE; + } + */ + + // now write the results into structure p + p->rotation = fit.rotation; + /* + p->lensshift_v = fit.lensshift_v; + p->lensshift_h = fit.lensshift_h; + p->shear = fit.shear; + */ + p->camera_pitch = fit.camera_pitch; + p->camera_yaw = fit.camera_yaw; + return NMS_SUCCESS; +} + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +#ifdef ASHIFT_DEBUG +// only used in development phase. call model_fitness() with current parameters and +// print some useful information +static void model_probe(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + if(!g->lines) return; + if(dir == ASHIFT_FIT_NONE) return; + + double params[4]; + int enough_lines = TRUE; + + // initialize fit parameters + dt_iop_ashift_fit_params_t fit; + fit.lines = g->lines; + fit.lines_count = g->lines_count; + fit.width = g->lines_in_width; + fit.height = g->lines_in_height; + fit.f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor; + fit.orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr; + fit.aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect; + fit.rotation = p->rotation; + fit.lensshift_v = p->lensshift_v; + fit.lensshift_h = p->lensshift_h; + fit.shear = p->shear; + fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED; + fit.linemask = ASHIFT_LINE_MASK; + fit.params_count = 0; + fit.weight = 0.0f; + + // if the image is flipped and if we do not want to fit both lens shift + // directions or none at all, then we need to change direction + dt_iop_ashift_fitaxis_t mdir = dir; + if((mdir & ASHIFT_FIT_LENS_BOTH) != ASHIFT_FIT_LENS_BOTH && + (mdir & ASHIFT_FIT_LENS_BOTH) != 0) + { + // flip all directions + mdir ^= g->isflipped ? ASHIFT_FIT_FLIP : 0; + // special case that needs to be corrected + mdir |= (mdir & ASHIFT_FIT_LINES_BOTH) == 0 ? ASHIFT_FIT_LINES_BOTH : 0; + } + + if(mdir & ASHIFT_FIT_LINES_VERT) + { + // we use vertical lines for fitting + fit.linetype |= ASHIFT_LINE_DIRVERT; + fit.weight += g->vertical_weight; + enough_lines = enough_lines && (g->vertical_count >= MINIMUM_FITLINES); + } + + if(mdir & ASHIFT_FIT_LINES_HOR) + { + // we use horizontal lines for fitting + fit.linetype |= 0; + fit.weight += g->horizontal_weight; + enough_lines = enough_lines && (g->horizontal_count >= MINIMUM_FITLINES); + } + + // this needs to come after ASHIFT_FIT_LINES_VERT and ASHIFT_FIT_LINES_HOR + if((mdir & ASHIFT_FIT_LINES_BOTH) == ASHIFT_FIT_LINES_BOTH) + { + // if we use fitting in both directions we need to + // adjust fit.linetype and fit.linemask to match all selected lines + fit.linetype = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED; + fit.linemask = ASHIFT_LINE_RELEVANT | ASHIFT_LINE_SELECTED; + } + + double quality = model_fitness(params, (void *)&fit); + + printf("model fitness: %.8f (rotation %f, lensshift_v %f, lensshift_h %f, shear %f)\n", + quality, p->rotation, p->lensshift_v, p->lensshift_h, p->shear); +} +#endif +#endif // if 0 +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT (no crop support yet) +//----------------------------------------------------------------------------- +#if 0 +// function to keep crop fitting parameters within constraints +static void crop_constraint(double *params, int pcount) +{ + if(pcount > 0) params[0] = fabs(params[0]); + if(pcount > 1) params[1] = fabs(params[1]); + if(pcount > 2) params[2] = fabs(params[2]); + + if(pcount > 0 && params[0] > 1.0) params[0] = 1.0 - params[0]; + if(pcount > 1 && params[1] > 1.0) params[1] = 1.0 - params[1]; + if(pcount > 2 && params[2] > 0.5*M_PI) params[2] = 0.5*M_PI - params[2]; +} + +// helper function for getting the best fitting crop area; +// returns the negative area of the largest rectangle that fits within the +// defined image with a given rectangle's center and its aspect angle; +// the trick: the rectangle center coordinates are given in the input +// image coordinates so we know for sure that it also lies within the image after +// conversion to the output coordinates +static double crop_fitness(double *params, void *data) +{ + dt_iop_ashift_cropfit_params_t *cropfit = (dt_iop_ashift_cropfit_params_t *)data; + + const float wd = cropfit->width; + const float ht = cropfit->height; + + // get variable and constant parameters, respectively + const float x = isnan(cropfit->x) ? params[0] : cropfit->x; + const float y = isnan(cropfit->y) ? params[1] : cropfit->y; + const float alpha = isnan(cropfit->alpha) ? params[2] : cropfit->alpha; + + // the center of the rectangle in input image coordinates + const float Pc[3] = { x * wd, y * ht, 1.0f }; + + // convert to the output image coordinates and normalize + float P[3]; + mat3mulv(P, (float *)cropfit->homograph, Pc); + P[0] /= P[2]; + P[1] /= P[2]; + P[2] = 1.0f; + + // two auxiliary points (some arbitrary distance away from P) to construct the diagonals + const float Pa[2][3] = { { P[0] + 10.0f * cos(alpha), P[1] + 10.0f * sin(alpha), 1.0f }, + { P[0] + 10.0f * cos(alpha), P[1] - 10.0f * sin(alpha), 1.0f } }; + + // the two diagonals: D = P x Pa + float D[2][3]; + vec3prodn(D[0], P, Pa[0]); + vec3prodn(D[1], P, Pa[1]); + + // find all intersection points of all four edges with both diagonals (I = E x D); + // the shortest distance d2min of the intersection point I to the crop area center P determines + // the size of the crop area that still fits into the image (for the given center and aspect angle) + float d2min = FLT_MAX; + for(int k = 0; k < 4; k++) + for(int l = 0; l < 2; l++) + { + // the intersection point + float I[3]; + vec3prodn(I, cropfit->edges[k], D[l]); + + // special case: I is all null -> E and D are identical -> P lies on E -> d2min = 0 + if(vec3isnull(I)) + { + d2min = 0.0f; + break; + } + + // special case: I[2] is 0.0f -> E and D are parallel and intersect at infinity -> no relevant point + if(I[2] == 0.0f) + continue; + + // the default case -> normalize I + I[0] /= I[2]; + I[1] /= I[2]; + + // calculate distance from I to P + const float d2 = SQR(P[0] - I[0]) + SQR(P[1] - I[1]); + + // the minimum distance over all intersection points + d2min = MIN(d2min, d2); + } + + // calculate the area of the rectangle + const float A = 2.0f * d2min * sin(2.0f * alpha); + +#ifdef ASHIFT_DEBUG + printf("crop fitness with x %f, y %f, angle %f -> distance %f, area %f\n", + x, y, alpha, d2min, A); +#endif + // and return -A to allow Nelder-Mead simplex to search for the minimum + return -A; +} +#endif // if 0 +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +// strategy: for a given center of the crop area and a specific aspect angle +// we calculate the largest crop area that still lies within the output image; +// now we allow a Nelder-Mead simplex to search for the center coordinates +// (and optionally the aspect angle) that delivers the largest overall crop area. +static void do_crop(dt_iop_module_t *module, dt_iop_ashift_params_t *p) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + // skip if fitting is still running + if(g->fitting) return; + + // reset fit margins if auto-cropping is off + if(p->cropmode == ASHIFT_CROP_OFF) + { + p->cl = 0.0f; + p->cr = 1.0f; + p->ct = 0.0f; + p->cb = 1.0f; + return; + } + + g->fitting = 1; + + double params[3]; + int pcount; + + // get parameters for the homograph + const float f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor; + const float orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr; + const float aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect; + const float rotation = p->rotation; + const float lensshift_v = p->lensshift_v; + const float lensshift_h = p->lensshift_h; + const float shear = p->shear; + + // prepare structure of constant parameters + dt_iop_ashift_cropfit_params_t cropfit; + cropfit.width = g->buf_width; + cropfit.height = g->buf_height; + homography((float *)cropfit.homograph, rotation, lensshift_v, lensshift_h, shear, f_length_kb, + orthocorr, aspect, cropfit.width, cropfit.height, ASHIFT_HOMOGRAPH_FORWARD); + + const float wd = cropfit.width; + const float ht = cropfit.height; + + // the four vertices of the image in input image coordinates + const float Vc[4][3] = { { 0.0f, 0.0f, 1.0f }, + { 0.0f, ht, 1.0f }, + { wd, ht, 1.0f }, + { wd, 0.0f, 1.0f } }; + + // convert the vertices to output image coordinates + float V[4][3]; + for(int n = 0; n < 4; n++) + mat3mulv(V[n], (float *)cropfit.homograph, Vc[n]); + + // get width and height of output image for later use + float xmin = FLT_MAX, ymin = FLT_MAX, xmax = FLT_MIN, ymax = FLT_MIN; + for(int n = 0; n < 4; n++) + { + // normalize V + V[n][0] /= V[n][2]; + V[n][1] /= V[n][2]; + V[n][2] = 1.0f; + xmin = MIN(xmin, V[n][0]); + xmax = MAX(xmax, V[n][0]); + ymin = MIN(ymin, V[n][1]); + ymax = MAX(ymax, V[n][1]); + } + const float owd = xmax - xmin; + const float oht = ymax - ymin; + + // calculate the lines defining the four edges of the image area: E = V[n] x V[n+1] + for(int n = 0; n < 4; n++) + vec3prodn(cropfit.edges[n], V[n], V[(n + 1) % 4]); + + // initial fit parameters: crop area is centered and aspect angle is that of the original image + // number of parameters: fit only crop center coordinates with a fixed aspect ratio, or fit all three variables + if(p->cropmode == ASHIFT_CROP_LARGEST) + { + params[0] = 0.5; + params[1] = 0.5; + params[2] = atan2((float)cropfit.height, (float)cropfit.width); + cropfit.x = NAN; + cropfit.y = NAN; + cropfit.alpha = NAN; + pcount = 3; + } + else //(p->cropmode == ASHIFT_CROP_ASPECT) + { + params[0] = 0.5; + params[1] = 0.5; + cropfit.x = NAN; + cropfit.y = NAN; + cropfit.alpha = atan2((float)cropfit.height, (float)cropfit.width); + pcount = 2; + } + + // start the simplex fit + const int iter = simplex(crop_fitness, params, pcount, NMS_CROP_EPSILON, NMS_CROP_SCALE, NMS_CROP_ITERATIONS, + crop_constraint, (void*)&cropfit); + + float A; // RT + float d; // RT + float Pc[3] = { 0.f, 0.f, 1.f }; // RT + + // in case the fit did not converge -> failed + if(iter >= NMS_CROP_ITERATIONS) goto failed; + + // the fit did converge -> get clipping margins out of params: + cropfit.x = isnan(cropfit.x) ? params[0] : cropfit.x; + cropfit.y = isnan(cropfit.y) ? params[1] : cropfit.y; + cropfit.alpha = isnan(cropfit.alpha) ? params[2] : cropfit.alpha; + + // the area of the best fitting rectangle + /*RT const float*/ A = fabs(crop_fitness(params, (void*)&cropfit)); + + // unlikely to happen but we need to catch this case + if(A == 0.0f) goto failed; + + // we need the half diagonal of that rectangle (this is in output image dimensions); + // no need to check for division by zero here as this case implies A == 0.0f, caught above + /*RT const float*/ d = sqrt(A / (2.0f * sin(2.0f * cropfit.alpha))); + + // the rectangle's center in input image (homogeneous) coordinates + // RT const float Pc[3] = { cropfit.x * wd, cropfit.y * ht, 1.0f }; + Pc[0] = cropfit.x * wd; // RT + Pc[1] = cropfit.y * ht; // RT + + // convert rectangle center to output image coordinates and normalize + float P[3]; + mat3mulv(P, (float *)cropfit.homograph, Pc); + P[0] /= P[2]; + P[1] /= P[2]; + + // calculate clipping margins relative to output image dimensions + p->cl = CLAMP((P[0] - d * cos(cropfit.alpha)) / owd, 0.0f, 1.0f); + p->cr = CLAMP((P[0] + d * cos(cropfit.alpha)) / owd, 0.0f, 1.0f); + p->ct = CLAMP((P[1] - d * sin(cropfit.alpha)) / oht, 0.0f, 1.0f); + p->cb = CLAMP((P[1] + d * sin(cropfit.alpha)) / oht, 0.0f, 1.0f); + + // final sanity check + if(p->cr - p->cl <= 0.0f || p->cb - p->ct <= 0.0f) goto failed; + + g->fitting = 0; + +#ifdef ASHIFT_DEBUG + printf("margins after crop fitting: iter %d, x %f, y %f, angle %f, crop area (%f %f %f %f), width %f, height %f\n", + iter, cropfit.x, cropfit.y, cropfit.alpha, p->cl, p->cr, p->ct, p->cb, wd, ht); +#endif +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 + dt_control_queue_redraw_center(); +#endif // if 0 +//----------------------------------------------------------------------------- + + return; + +failed: + // in case of failure: reset clipping margins, set "automatic cropping" parameter + // to "off" state, and display warning message + p->cl = 0.0f; + p->cr = 1.0f; + p->ct = 0.0f; + p->cb = 1.0f; + p->cropmode = ASHIFT_CROP_OFF; +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 + dt_bauhaus_combobox_set(g->cropmode, p->cropmode); +#endif // if 0 +//----------------------------------------------------------------------------- + g->fitting = 0; + dt_control_log(_("automatic cropping failed")); + return; +} +#endif // if 0 +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT (no crop support yet) +//----------------------------------------------------------------------------- +#if 0 +// manually adjust crop area by shifting its center +static void crop_adjust(dt_iop_module_t *module, dt_iop_ashift_params_t *p, const float newx, const float newy) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + // skip if fitting is still running + if(g->fitting) return; + + // get parameters for the homograph + const float f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor; + const float orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr; + const float aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect; + const float rotation = p->rotation; + const float lensshift_v = p->lensshift_v; + const float lensshift_h = p->lensshift_h; + const float shear = p->shear; + + const float wd = g->buf_width; + const float ht = g->buf_height; + + const float alpha = atan2(ht, wd); + + float homograph[3][3]; + homography((float *)homograph, rotation, lensshift_v, lensshift_h, shear, f_length_kb, + orthocorr, aspect, wd, ht, ASHIFT_HOMOGRAPH_FORWARD); + + // the four vertices of the image in input image coordinates + const float Vc[4][3] = { { 0.0f, 0.0f, 1.0f }, + { 0.0f, ht, 1.0f }, + { wd, ht, 1.0f }, + { wd, 0.0f, 1.0f } }; + + // convert the vertices to output image coordinates + float V[4][3]; + for(int n = 0; n < 4; n++) + mat3mulv(V[n], (float *)homograph, Vc[n]); + + // get width and height of output image + float xmin = FLT_MAX, ymin = FLT_MAX, xmax = FLT_MIN, ymax = FLT_MIN; + for(int n = 0; n < 4; n++) + { + // normalize V + V[n][0] /= V[n][2]; + V[n][1] /= V[n][2]; + V[n][2] = 1.0f; + xmin = MIN(xmin, V[n][0]); + xmax = MAX(xmax, V[n][0]); + ymin = MIN(ymin, V[n][1]); + ymax = MAX(ymax, V[n][1]); + } + const float owd = xmax - xmin; + const float oht = ymax - ymin; + + // calculate the lines defining the four edges of the image area: E = V[n] x V[n+1] + float E[4][3]; + for(int n = 0; n < 4; n++) + vec3prodn(E[n], V[n], V[(n + 1) % 4]); + + // the center of the rectangle in output image coordinates + const float P[3] = { newx * owd, newy * oht, 1.0f }; + + // two auxiliary points (some arbitrary distance away from P) to construct the diagonals + const float Pa[2][3] = { { P[0] + 10.0f * cos(alpha), P[1] + 10.0f * sin(alpha), 1.0f }, + { P[0] + 10.0f * cos(alpha), P[1] - 10.0f * sin(alpha), 1.0f } }; + + // the two diagonals: D = P x Pa + float D[2][3]; + vec3prodn(D[0], P, Pa[0]); + vec3prodn(D[1], P, Pa[1]); + + // find all intersection points of all four edges with both diagonals (I = E x D); + // the shortest distance d2min of the intersection point I to the crop area center P determines + // the size of the crop area that still fits into the image (for the given center and aspect angle) + float d2min = FLT_MAX; + for(int k = 0; k < 4; k++) + for(int l = 0; l < 2; l++) + { + // the intersection point + float I[3]; + vec3prodn(I, E[k], D[l]); + + // special case: I is all null -> E and D are identical -> P lies on E -> d2min = 0 + if(vec3isnull(I)) + { + d2min = 0.0f; + break; + } + + // special case: I[2] is 0.0f -> E and D are parallel and intersect at infinity -> no relevant point + if(I[2] == 0.0f) + continue; + + // the default case -> normalize I + I[0] /= I[2]; + I[1] /= I[2]; + + // calculate distance from I to P + const float d2 = SQR(P[0] - I[0]) + SQR(P[1] - I[1]); + + // the minimum distance over all intersection points + d2min = MIN(d2min, d2); + } + + const float d = sqrt(d2min); + + // do not allow crop area to drop below 1% of input image area + const float A = 2.0f * d * d * sin(2.0f * alpha); + if(A < 0.01f * wd * ht) return; + + // calculate clipping margins relative to output image dimensions + p->cl = CLAMP((P[0] - d * cos(alpha)) / owd, 0.0f, 1.0f); + p->cr = CLAMP((P[0] + d * cos(alpha)) / owd, 0.0f, 1.0f); + p->ct = CLAMP((P[1] - d * sin(alpha)) / oht, 0.0f, 1.0f); + p->cb = CLAMP((P[1] + d * sin(alpha)) / oht, 0.0f, 1.0f); + +#ifdef ASHIFT_DEBUG + printf("margins after crop adjustment: x %f, y %f, angle %f, crop area (%f %f %f %f), width %f, height %f\n", + 0.5f * (p->cl + p->cr), 0.5f * (p->ct + p->cb), alpha, p->cl, p->cr, p->ct, p->cb, wd, ht); +#endif + dt_control_queue_redraw_center(); + return; +} +#endif // if 0 +//----------------------------------------------------------------------------- + +// helper function to start analysis for structural data and report about errors +static int do_get_structure(dt_iop_module_t *module, dt_iop_ashift_params_t *p, + dt_iop_ashift_enhance_t enhance) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + if(g->fitting) return FALSE; + + g->fitting = 1; + + float *b = NULL; + { + MyMutex::MyLock lock(g->lock); + b = g->buf; + } + /* dt_pthread_mutex_lock(&g->lock); */ + /* float *b = g->buf; */ + /* dt_pthread_mutex_unlock(&g->lock); */ + + if(b == NULL) + { + dt_control_log(_("data pending - please repeat")); + goto error; + } + + if(!get_structure(module, enhance)) + { + dt_control_log(_("could not detect structural data in image")); +#ifdef ASHIFT_DEBUG + // find out more + printf("do_get_structure: buf %p, buf_hash %lu, buf_width %d, buf_height %d, lines %p, lines_count %d\n", + g->buf, g->buf_hash, g->buf_width, g->buf_height, g->lines, g->lines_count); +#endif + goto error; + } + + if(!remove_outliers(module)) + { + dt_control_log(_("could not run outlier removal")); +#ifdef ASHIFT_DEBUG + // find out more + printf("remove_outliers: buf %p, buf_hash %lu, buf_width %d, buf_height %d, lines %p, lines_count %d\n", + g->buf, g->buf_hash, g->buf_width, g->buf_height, g->lines, g->lines_count); +#endif + goto error; + } + + g->fitting = 0; + return TRUE; + +error: + g->fitting = 0; + return FALSE; +} + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +// helper function to clean structural data +static int do_clean_structure(dt_iop_module_t *module, dt_iop_ashift_params_t *p) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + if(g->fitting) return FALSE; + + g->fitting = 1; + g->lines_count = 0; + g->vertical_count = 0; + g->horizontal_count = 0; + free(g->lines); + g->lines = NULL; + g->lines_version++; + g->lines_suppressed = 0; + g->fitting = 0; + return TRUE; +} +#endif // if 0 +//----------------------------------------------------------------------------- + +// helper function to start parameter fit and report about errors +static int do_fit(dt_iop_module_t *module, dt_iop_ashift_params_t *p, dt_iop_ashift_fitaxis_t dir, int min_line_count = MINIMUM_FITLINES) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + dt_iop_ashift_nmsresult_t res; + + if(g->fitting) return FALSE; + + // if no structure available get it + if(g->lines == NULL) + if(!do_get_structure(module, p, ASHIFT_ENHANCE_NONE)) goto error; + + g->fitting = 1; + + res = nmsfit(module, p, dir, min_line_count); + + switch(res) + { + case NMS_NOT_ENOUGH_LINES: + dt_control_log(_("not enough structure for automatic correction")); + goto error; + break; + case NMS_DID_NOT_CONVERGE: + case NMS_INSANE: + dt_control_log(_("automatic correction failed, please correct manually")); + goto error; + break; + case NMS_SUCCESS: + default: + break; + } + + g->fitting = 0; + + /* + // finally apply cropping + do_crop(module, p); + */ + + return TRUE; + +error: + g->fitting = 0; + return FALSE; +} + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +//----------------------------------------------------------------------------- +void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, + void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out) +{ + dt_iop_ashift_data_t *data = (dt_iop_ashift_data_t *)piece->data; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + const int ch = piece->colors; + const int ch_width = ch * roi_in->width; + + // only for preview pipe: collect input buffer data and do some other evaluations + if(self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_PREVIEW) + { + // we want to find out if the final output image is flipped in relation to this iop + // so we can adjust the gui labels accordingly + + const int width = roi_in->width; + const int height = roi_in->height; + const int x_off = roi_in->x; + const int y_off = roi_in->y; + const float scale = roi_in->scale; + + // origin of image and opposite corner as reference points + float points[4] = { 0.0f, 0.0f, (float)piece->buf_in.width, (float)piece->buf_in.height }; + float ivec[2] = { points[2] - points[0], points[3] - points[1] }; + float ivecl = sqrt(ivec[0] * ivec[0] + ivec[1] * ivec[1]); + + // where do they go? + dt_dev_distort_backtransform_plus(self->dev, self->dev->preview_pipe, self->priority + 1, 9999999, points, + 2); + + float ovec[2] = { points[2] - points[0], points[3] - points[1] }; + float ovecl = sqrt(ovec[0] * ovec[0] + ovec[1] * ovec[1]); + + // angle between input vector and output vector + float alpha = acos(CLAMP((ivec[0] * ovec[0] + ivec[1] * ovec[1]) / (ivecl * ovecl), -1.0f, 1.0f)); + + // we are interested if |alpha| is in the range of 90° +/- 45° -> we assume the image is flipped + int isflipped = fabs(fmod(alpha + M_PI, M_PI) - M_PI / 2.0f) < M_PI / 4.0f ? 1 : 0; + + // did modules prior to this one in pixelpipe have changed? -> check via hash value + uint64_t hash = dt_dev_hash_plus(self->dev, self->dev->preview_pipe, 0, self->priority - 1); + + dt_pthread_mutex_lock(&g->lock); + g->isflipped = isflipped; + + // save a copy of preview input buffer for parameter fitting + if(g->buf == NULL || (size_t)g->buf_width * g->buf_height < (size_t)width * height) + { + // if needed to allocate buffer + free(g->buf); // a no-op if g->buf is NULL + // only get new buffer if no old buffer available or old buffer does not fit in terms of size + g->buf = malloc((size_t)width * height * 4 * sizeof(float)); + } + + if(g->buf /* && hash != g->buf_hash */) + { + // copy data + memcpy(g->buf, ivoid, (size_t)width * height * ch * sizeof(float)); + + g->buf_width = width; + g->buf_height = height; + g->buf_x_off = x_off; + g->buf_y_off = y_off; + g->buf_scale = scale; + g->buf_hash = hash; + } + + dt_pthread_mutex_unlock(&g->lock); + } + + // if module is set to neutral parameters we just copy input->output and are done + if(isneutral(data)) + { + memcpy(ovoid, ivoid, (size_t)roi_out->width * roi_out->height * ch * sizeof(float)); + return; + } + + const struct dt_interpolation *interpolation = dt_interpolation_new(DT_INTERPOLATION_USERPREF); + + float ihomograph[3][3]; + homography((float *)ihomograph, data->rotation, data->lensshift_v, data->lensshift_h, data->shear, data->f_length_kb, + data->orthocorr, data->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED); + + // clipping offset + const float fullwidth = (float)piece->buf_out.width / (data->cr - data->cl); + const float fullheight = (float)piece->buf_out.height / (data->cb - data->ct); + const float cx = roi_out->scale * fullwidth * data->cl; + const float cy = roi_out->scale * fullheight * data->ct; + + +#ifdef _OPENMP +//#pragma omp parallel for schedule(static) shared(ihomograph, interpolation) +#endif + // go over all pixels of output image + for(int j = 0; j < roi_out->height; j++) + { + float *out = ((float *)ovoid) + (size_t)ch * j * roi_out->width; + for(int i = 0; i < roi_out->width; i++, out += ch) + { + float pin[3], pout[3]; + + /* if (j == roi_out->height - 1) { */ + /* printf("HERE\n"); */ + /* } */ + + // convert output pixel coordinates to original image coordinates + pout[0] = roi_out->x + i + cx; + pout[1] = roi_out->y + j + cy; + pout[0] /= roi_out->scale; + pout[1] /= roi_out->scale; + pout[2] = 1.0f; + + // apply homograph + mat3mulv(pin, (float *)ihomograph, pout); + + // convert to input pixel coordinates + pin[0] /= pin[2]; + pin[1] /= pin[2]; + pin[0] *= roi_in->scale; + pin[1] *= roi_in->scale; + + /* if (pin[0] < 0 || pin[1] < 0) { */ + /* printf("NEGATIVE: %f %f -> %f %f\n", pout[0], pout[1], pin[0], pin[1]); */ + /* fflush(stdout); */ + /* } */ + + + pin[0] -= roi_in->x; + pin[1] -= roi_in->y; + + // get output values by interpolation from input image + dt_interpolation_compute_pixel4c(interpolation, (float *)ivoid, out, pin[0], pin[1], roi_in->width, + roi_in->height, ch_width); + } + } +} + +#ifdef HAVE_OPENCL +int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_mem dev_in, cl_mem dev_out, + const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out) +{ + dt_iop_ashift_data_t *d = (dt_iop_ashift_data_t *)piece->data; + dt_iop_ashift_global_data_t *gd = (dt_iop_ashift_global_data_t *)self->data; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + const int devid = piece->pipe->devid; + const int iwidth = roi_in->width; + const int iheight = roi_in->height; + const int width = roi_out->width; + const int height = roi_out->height; + + cl_int err = -999; + cl_mem dev_homo = NULL; + + // only for preview pipe: collect input buffer data and do some other evaluations + if(self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_PREVIEW) + { + // we want to find out if the final output image is flipped in relation to this iop + // so we can adjust the gui labels accordingly + + const int x_off = roi_in->x; + const int y_off = roi_in->y; + const float scale = roi_in->scale; + + // origin of image and opposite corner as reference points + float points[4] = { 0.0f, 0.0f, (float)piece->buf_in.width, (float)piece->buf_in.height }; + float ivec[2] = { points[2] - points[0], points[3] - points[1] }; + float ivecl = sqrt(ivec[0] * ivec[0] + ivec[1] * ivec[1]); + + // where do they go? + dt_dev_distort_backtransform_plus(self->dev, self->dev->preview_pipe, self->priority + 1, 9999999, points, + 2); + + float ovec[2] = { points[2] - points[0], points[3] - points[1] }; + float ovecl = sqrt(ovec[0] * ovec[0] + ovec[1] * ovec[1]); + + // angle between input vector and output vector + float alpha = acos(CLAMP((ivec[0] * ovec[0] + ivec[1] * ovec[1]) / (ivecl * ovecl), -1.0f, 1.0f)); + + // we are interested if |alpha| is in the range of 90° +/- 45° -> we assume the image is flipped + int isflipped = fabs(fmod(alpha + M_PI, M_PI) - M_PI / 2.0f) < M_PI / 4.0f ? 1 : 0; + + // do modules coming before this one in pixelpipe have changed? -> check via hash value + uint64_t hash = dt_dev_hash_plus(self->dev, self->dev->preview_pipe, 0, self->priority - 1); + + dt_pthread_mutex_lock(&g->lock); + g->isflipped = isflipped; + + // save a copy of preview input buffer for parameter fitting + if(g->buf == NULL || (size_t)g->buf_width * g->buf_height < (size_t)iwidth * iheight) + { + // if needed allocate buffer + free(g->buf); // a no-op if g->buf is NULL + // only get new buffer if no old buffer or old buffer does not fit in terms of size + g->buf = malloc((size_t)iwidth * iheight * 4 * sizeof(float)); + } + + if(g->buf /* && hash != g->buf_hash */) + { + // copy data + err = dt_opencl_copy_device_to_host(devid, g->buf, dev_in, iwidth, iheight, 4 * sizeof(float)); + + g->buf_width = iwidth; + g->buf_height = iheight; + g->buf_x_off = x_off; + g->buf_y_off = y_off; + g->buf_scale = scale; + g->buf_hash = hash; + } + dt_pthread_mutex_unlock(&g->lock); + if(err != CL_SUCCESS) goto error; + } + + // if module is set to neutral parameters we just copy input->output and are done + if(isneutral(d)) + { + size_t origin[] = { 0, 0, 0 }; + size_t region[] = { width, height, 1 }; + err = dt_opencl_enqueue_copy_image(devid, dev_in, dev_out, origin, origin, region); + if(err != CL_SUCCESS) goto error; + return TRUE; + } + + float ihomograph[3][3]; + homography((float *)ihomograph, d->rotation, d->lensshift_v, d->lensshift_h, d->shear, d->f_length_kb, d->camera_pitch, d->camera_yaw, + d->orthocorr, d->aspect, piece->buf_in.width, piece->buf_in.height, ASHIFT_HOMOGRAPH_INVERTED); + + // clipping offset + const float fullwidth = (float)piece->buf_out.width / (d->cr - d->cl); + const float fullheight = (float)piece->buf_out.height / (d->cb - d->ct); + const float cx = roi_out->scale * fullwidth * d->cl; + const float cy = roi_out->scale * fullheight * d->ct; + + dev_homo = dt_opencl_copy_host_to_device_constant(devid, sizeof(float) * 9, ihomograph); + if(dev_homo == NULL) goto error; + + const int iroi[2] = { roi_in->x, roi_in->y }; + const int oroi[2] = { roi_out->x, roi_out->y }; + const float in_scale = roi_in->scale; + const float out_scale = roi_out->scale; + const float clip[2] = { cx, cy }; + + size_t sizes[] = { ROUNDUPWD(width), ROUNDUPHT(height), 1 }; + + const struct dt_interpolation *interpolation = dt_interpolation_new(DT_INTERPOLATION_USERPREF); + + int ldkernel = -1; + + switch(interpolation->id) + { + case DT_INTERPOLATION_BILINEAR: + ldkernel = gd->kernel_ashift_bilinear; + break; + case DT_INTERPOLATION_BICUBIC: + ldkernel = gd->kernel_ashift_bicubic; + break; + case DT_INTERPOLATION_LANCZOS2: + ldkernel = gd->kernel_ashift_lanczos2; + break; + case DT_INTERPOLATION_LANCZOS3: + ldkernel = gd->kernel_ashift_lanczos3; + break; + default: + goto error; + } + + dt_opencl_set_kernel_arg(devid, ldkernel, 0, sizeof(cl_mem), (void *)&dev_in); + dt_opencl_set_kernel_arg(devid, ldkernel, 1, sizeof(cl_mem), (void *)&dev_out); + dt_opencl_set_kernel_arg(devid, ldkernel, 2, sizeof(int), (void *)&width); + dt_opencl_set_kernel_arg(devid, ldkernel, 3, sizeof(int), (void *)&height); + dt_opencl_set_kernel_arg(devid, ldkernel, 4, sizeof(int), (void *)&iwidth); + dt_opencl_set_kernel_arg(devid, ldkernel, 5, sizeof(int), (void *)&iheight); + dt_opencl_set_kernel_arg(devid, ldkernel, 6, 2 * sizeof(int), (void *)iroi); + dt_opencl_set_kernel_arg(devid, ldkernel, 7, 2 * sizeof(int), (void *)oroi); + dt_opencl_set_kernel_arg(devid, ldkernel, 8, sizeof(float), (void *)&in_scale); + dt_opencl_set_kernel_arg(devid, ldkernel, 9, sizeof(float), (void *)&out_scale); + dt_opencl_set_kernel_arg(devid, ldkernel, 10, 2 * sizeof(float), (void *)clip); + dt_opencl_set_kernel_arg(devid, ldkernel, 11, sizeof(cl_mem), (void *)&dev_homo); + err = dt_opencl_enqueue_kernel_2d(devid, ldkernel, sizes); + if(err != CL_SUCCESS) goto error; + + dt_opencl_release_mem_object(dev_homo); + return TRUE; + +error: + dt_opencl_release_mem_object(dev_homo); + dt_print(DT_DEBUG_OPENCL, "[opencl_ashift] couldn't enqueue kernel! %d\n", err); + return FALSE; +} +#endif + +// gather information about "near"-ness in g->points_idx +static void get_near(const float *points, dt_iop_ashift_points_idx_t *points_idx, const int lines_count, + float pzx, float pzy, float delta) +{ + const float delta2 = delta * delta; + + for(int n = 0; n < lines_count; n++) + { + points_idx[n].near = 0; + + // skip irrelevant lines + if(points_idx[n].type == ASHIFT_LINE_IRRELEVANT) + continue; + + // first check if the mouse pointer is outside the bounding box of the line -> skip this line + if(pzx < points_idx[n].bbx - delta && + pzx > points_idx[n].bbX + delta && + pzy < points_idx[n].bby - delta && + pzy > points_idx[n].bbY + delta) + continue; + + // pointer is inside bounding box + size_t offset = points_idx[n].offset; + const int length = points_idx[n].length; + + // sanity check (this should not happen) + if(length < 2) continue; + + // check line point by point + for(int l = 0; l < length; l++, offset++) + { + float dx = pzx - points[offset * 2]; + float dy = pzy - points[offset * 2 + 1]; + + if(dx * dx + dy * dy < delta2) + { + points_idx[n].near = 1; + break; + } + } + } +} + +// mark lines which are inside a rectangular area in isbounding mode +static void get_bounded_inside(const float *points, dt_iop_ashift_points_idx_t *points_idx, + const int points_lines_count, float pzx, float pzy, float pzx2, float pzy2, + dt_iop_ashift_bounding_t mode) +{ + // get bounding box coordinates + float ax = pzx; + float ay = pzy; + float bx = pzx2; + float by = pzy2; + if(pzx > pzx2) + { + ax = pzx2; + bx = pzx; + } + if(pzy > pzy2) + { + ay = pzy2; + by = pzy; + } + + // we either look for the selected or the deselected lines + dt_iop_ashift_linetype_t mask = ASHIFT_LINE_SELECTED; + dt_iop_ashift_linetype_t state = (mode == ASHIFT_BOUNDING_DESELECT) ? ASHIFT_LINE_SELECTED : 0; + + for(int n = 0; n < points_lines_count; n++) + { + // mark line as "not near" and "not bounded" + points_idx[n].near = 0; + points_idx[n].bounded = 0; + + // skip irrelevant lines + if(points_idx[n].type == ASHIFT_LINE_IRRELEVANT) + continue; + + // is the line inside the box ? + if(points_idx[n].bbx >= ax && points_idx[n].bbx <= bx && points_idx[n].bbX >= ax + && points_idx[n].bbX <= bx && points_idx[n].bby >= ay && points_idx[n].bby <= by + && points_idx[n].bbY >= ay && points_idx[n].bbY <= by) + { + points_idx[n].bounded = 1; + // only mark "near"-ness of those lines we are interested in + points_idx[n].near = ((points_idx[n].type & mask) != state) ? 0 : 1; + } + } +} + +// generate hash value for lines taking into account only the end point coordinates +static uint64_t get_lines_hash(const dt_iop_ashift_line_t *lines, const int lines_count) +{ + uint64_t hash = 5381; + for(int n = 0; n < lines_count; n++) + { + float v[4] = { lines[n].p1[0], lines[n].p1[1], lines[n].p2[0], lines[n].p2[1] }; + + for(int i = 0; i < 4; i++) + hash = ((hash << 5) + hash) ^ ((uint32_t *)v)[i]; + } + return hash; +} + +// update color information in points_idx if lines have changed in terms of type (but not in terms +// of number or position) +static int update_colors(struct dt_iop_module_t *self, dt_iop_ashift_points_idx_t *points_idx, + int points_lines_count) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + // is the display flipped relative to the original image? + const int isflipped = g->isflipped; + + // go through all lines + for(int n = 0; n < points_lines_count; n++) + { + const dt_iop_ashift_linetype_t type = points_idx[n].type; + + // set line color according to line type/orientation + // note: if the screen display is flipped versus the original image we need + // to respect that fact in the color selection + if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_SELECTED) + points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_BLUE : ASHIFT_LINECOLOR_GREEN; + else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_NOT_SELECTED) + points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_YELLOW : ASHIFT_LINECOLOR_RED; + else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_SELECTED) + points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_GREEN : ASHIFT_LINECOLOR_BLUE; + else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_NOT_SELECTED) + points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_RED : ASHIFT_LINECOLOR_YELLOW; + else + points_idx[n].color = ASHIFT_LINECOLOR_GREY; + } + + return TRUE; +} + +// get all the points to display lines in the gui +static int get_points(struct dt_iop_module_t *self, const dt_iop_ashift_line_t *lines, const int lines_count, + const int lines_version, float **points, dt_iop_ashift_points_idx_t **points_idx, + int *points_lines_count) +{ + dt_develop_t *dev = self->dev; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + dt_iop_ashift_points_idx_t *my_points_idx = NULL; + float *my_points = NULL; + + // is the display flipped relative to the original image? + const int isflipped = g->isflipped; + + // allocate new index array + my_points_idx = (dt_iop_ashift_points_idx_t *)malloc(lines_count * sizeof(dt_iop_ashift_points_idx_t)); + if(my_points_idx == NULL) goto error; + + // account for total number of points + size_t total_points = 0; + + // first step: basic initialization of my_points_idx and counting of total_points + for(int n = 0; n < lines_count; n++) + { + const int length = lines[n].length; + + total_points += length; + + my_points_idx[n].length = length; + my_points_idx[n].near = 0; + my_points_idx[n].bounded = 0; + + const dt_iop_ashift_linetype_t type = lines[n].type; + my_points_idx[n].type = type; + + // set line color according to line type/orientation + // note: if the screen display is flipped versus the original image we need + // to respect that fact in the color selection + if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_SELECTED) + my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_BLUE : ASHIFT_LINECOLOR_GREEN; + else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_NOT_SELECTED) + my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_YELLOW : ASHIFT_LINECOLOR_RED; + else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_SELECTED) + my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_GREEN : ASHIFT_LINECOLOR_BLUE; + else if((type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_NOT_SELECTED) + my_points_idx[n].color = isflipped ? ASHIFT_LINECOLOR_RED : ASHIFT_LINECOLOR_YELLOW; + else + my_points_idx[n].color = ASHIFT_LINECOLOR_GREY; + } + + // now allocate new points buffer + my_points = (float *)malloc((size_t)2 * total_points * sizeof(float)); + if(my_points == NULL) goto error; + + // second step: generate points for each line + for(int n = 0, offset = 0; n < lines_count; n++) + { + my_points_idx[n].offset = offset; + + float x = lines[n].p1[0]; + float y = lines[n].p1[1]; + const int length = lines[n].length; + + const float dx = (lines[n].p2[0] - x) / (float)(length - 1); + const float dy = (lines[n].p2[1] - y) / (float)(length - 1); + + for(int l = 0; l < length && offset < total_points; l++, offset++) + { + my_points[2 * offset] = x; + my_points[2 * offset + 1] = y; + + x += dx; + y += dy; + } + } + + // third step: transform all points + if(!dt_dev_distort_transform_plus(dev, dev->preview_pipe, self->priority, 9999999, my_points, total_points)) + goto error; + + // fourth step: get bounding box in final coordinates (used later for checking "near"-ness to mouse pointer) + for(int n = 0; n < lines_count; n++) + { + float xmin = FLT_MAX, xmax = FLT_MIN, ymin = FLT_MAX, ymax = FLT_MIN; + + size_t offset = my_points_idx[n].offset; + int length = my_points_idx[n].length; + + for(int l = 0; l < length; l++) + { + xmin = fmin(xmin, my_points[2 * offset]); + xmax = fmax(xmax, my_points[2 * offset]); + ymin = fmin(ymin, my_points[2 * offset + 1]); + ymax = fmax(ymax, my_points[2 * offset + 1]); + } + + my_points_idx[n].bbx = xmin; + my_points_idx[n].bbX = xmax; + my_points_idx[n].bby = ymin; + my_points_idx[n].bbY = ymax; + } + + // check if lines_version has changed in-between -> too bad: we can forget about all we did :( + if(g->lines_version > lines_version) + goto error; + + *points = my_points; + *points_idx = my_points_idx; + *points_lines_count = lines_count; + + return TRUE; + +error: + if(my_points_idx != NULL) free(my_points_idx); + if(my_points != NULL) free(my_points); + return FALSE; +} + +// does this gui have focus? +static int gui_has_focus(struct dt_iop_module_t *self) +{ + return self->dev->gui_module == self; +} + +void gui_post_expose(struct dt_iop_module_t *self, cairo_t *cr, int32_t width, int32_t height, + int32_t pointerx, int32_t pointery) +{ + dt_develop_t *dev = self->dev; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + + // the usual rescaling stuff + const float wd = dev->preview_pipe->backbuf_width; + const float ht = dev->preview_pipe->backbuf_height; + if(wd < 1.0 || ht < 1.0) return; + const float zoom_y = dt_control_get_dev_zoom_y(); + const float zoom_x = dt_control_get_dev_zoom_x(); + const dt_dev_zoom_t zoom = dt_control_get_dev_zoom(); + const int closeup = dt_control_get_dev_closeup(); + const float zoom_scale = dt_dev_get_zoom_scale(dev, zoom, 1<buf has been processed + if(g->buf && (p->cropmode != ASHIFT_CROP_OFF) && self->enabled) + { + // roi data of the preview pipe input buffer + const float iwd = g->buf_width; + const float iht = g->buf_height; + const float ixo = g->buf_x_off; + const float iyo = g->buf_y_off; + + // the four corners of the input buffer of this module + const float V[4][2] = { { ixo, iyo }, + { ixo, iyo + iht }, + { ixo + iwd, iyo + iht }, + { ixo + iwd, iyo } }; + + // convert coordinates of corners to coordinates of this module's output + if(!dt_dev_distort_transform_plus(self->dev, self->dev->preview_pipe, self->priority, self->priority + 1, + (float *)V, 4)) + return; + + // get x/y-offset as well as width and height of output buffer + float xmin = FLT_MAX, ymin = FLT_MAX, xmax = FLT_MIN, ymax = FLT_MIN; + for(int n = 0; n < 4; n++) + { + xmin = MIN(xmin, V[n][0]); + xmax = MAX(xmax, V[n][0]); + ymin = MIN(ymin, V[n][1]); + ymax = MAX(ymax, V[n][1]); + } + const float owd = xmax - xmin; + const float oht = ymax - ymin; + + // the four clipping corners + const float C[4][2] = { { xmin + p->cl * owd, ymin + p->ct * oht }, + { xmin + p->cl * owd, ymin + p->cb * oht }, + { xmin + p->cr * owd, ymin + p->cb * oht }, + { xmin + p->cr * owd, ymin + p->ct * oht } }; + + // convert clipping corners to final output image + if(!dt_dev_distort_transform_plus(self->dev, self->dev->preview_pipe, self->priority + 1, 9999999, + (float *)C, 4)) + return; + + cairo_save(cr); + + double dashes = DT_PIXEL_APPLY_DPI(5.0) / zoom_scale; + cairo_set_dash(cr, &dashes, 0, 0); + + cairo_rectangle(cr, 0, 0, width, height); + cairo_clip(cr); + + // mask parts of image outside of clipping area in dark grey + cairo_set_source_rgba(cr, .2, .2, .2, .8); + cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle(cr, 0, 0, width, height); + cairo_translate(cr, width / 2.0, height / 2.0); + cairo_scale(cr, zoom_scale, zoom_scale); + cairo_translate(cr, -.5f * wd - zoom_x * wd, -.5f * ht - zoom_y * ht); + cairo_move_to(cr, C[0][0], C[0][1]); + cairo_line_to(cr, C[1][0], C[1][1]); + cairo_line_to(cr, C[2][0], C[2][1]); + cairo_line_to(cr, C[3][0], C[3][1]); + cairo_close_path(cr); + cairo_fill(cr); + + // draw white outline around clipping area + cairo_set_source_rgb(cr, .7, .7, .7); + cairo_move_to(cr, C[0][0], C[0][1]); + cairo_line_to(cr, C[1][0], C[1][1]); + cairo_line_to(cr, C[2][0], C[2][1]); + cairo_line_to(cr, C[3][0], C[3][1]); + cairo_close_path(cr); + cairo_stroke(cr); + + // if adjusting crop, draw indicator + if (g->adjust_crop && p->cropmode == ASHIFT_CROP_ASPECT) + { + const double xpos = (C[1][0] + C[2][0]) / 2.0f; + const double ypos = (C[0][1] + C[1][1]) / 2.0f; + const double size_circle = (C[2][0] - C[1][0]) / 30.0f; + const double size_line = (C[2][0] - C[1][0]) / 5.0f; + const double size_arrow = (C[2][0] - C[1][0]) / 25.0f; + + cairo_set_line_width(cr, 2.0 / zoom_scale); + cairo_set_source_rgb(cr, .7, .7, .7); + cairo_arc (cr, xpos, ypos, size_circle, 0, 2.0 * M_PI); + cairo_stroke(cr); + cairo_fill(cr); + + cairo_set_line_width(cr, 2.0 / zoom_scale); + cairo_set_source_rgb(cr, .7, .7, .7); + + // horizontal line + cairo_move_to(cr, xpos - size_line, ypos); + cairo_line_to(cr, xpos + size_line, ypos); + + cairo_move_to(cr, xpos - size_line, ypos); + cairo_rel_line_to(cr, size_arrow, size_arrow); + cairo_move_to(cr, xpos - size_line, ypos); + cairo_rel_line_to(cr, size_arrow, -size_arrow); + + cairo_move_to(cr, xpos + size_line, ypos); + cairo_rel_line_to(cr, -size_arrow, size_arrow); + cairo_move_to(cr, xpos + size_line, ypos); + cairo_rel_line_to(cr, -size_arrow, -size_arrow); + + // vertical line + cairo_move_to(cr, xpos, ypos - size_line); + cairo_line_to(cr, xpos, ypos + size_line); + + cairo_move_to(cr, xpos, ypos - size_line); + cairo_rel_line_to(cr, -size_arrow, size_arrow); + cairo_move_to(cr, xpos, ypos - size_line); + cairo_rel_line_to(cr, size_arrow, size_arrow); + + cairo_move_to(cr, xpos, ypos + size_line); + cairo_rel_line_to(cr, -size_arrow, -size_arrow); + cairo_move_to(cr, xpos, ypos + size_line); + cairo_rel_line_to(cr, size_arrow, -size_arrow); + + cairo_stroke(cr); + } + + cairo_restore(cr); + } + + // show guide lines on request + if(g->show_guides) + { + dt_guides_t *guide = (dt_guides_t *)g_list_nth_data(darktable.guides, 0); + double dashes = DT_PIXEL_APPLY_DPI(5.0); + cairo_save(cr); + cairo_rectangle(cr, 0, 0, width, height); + cairo_clip(cr); + cairo_set_line_width(cr, DT_PIXEL_APPLY_DPI(1.0)); + cairo_set_source_rgb(cr, .8, .8, .8); + cairo_set_dash(cr, &dashes, 1, 0); + guide->draw(cr, 0, 0, width, height, 1.0, guide->user_data); + cairo_stroke_preserve(cr); + cairo_set_dash(cr, &dashes, 0, 0); + cairo_set_source_rgba(cr, 0.3, .3, .3, .8); + cairo_stroke(cr); + cairo_restore(cr); + } + + // structural data are currently being collected or fit procedure is running? -> skip + if(g->fitting) return; + + // no structural data or visibility switched off? -> stop here + if(g->lines == NULL || g->lines_suppressed || !gui_has_focus(self)) return; + + // get hash value that changes if distortions from here to the end of the pixelpipe changed + uint64_t hash = dt_dev_hash_distort(dev); + // get hash value that changes if coordinates of lines have changed + uint64_t lines_hash = get_lines_hash(g->lines, g->lines_count); + + // points data are missing or outdated, or distortion has changed? + if(g->points == NULL || g->points_idx == NULL || hash != g->grid_hash || + (g->lines_version > g->points_version && g->lines_hash != lines_hash)) + { + // we need to reprocess points + free(g->points); + g->points = NULL; + free(g->points_idx); + g->points_idx = NULL; + g->points_lines_count = 0; + + if(!get_points(self, g->lines, g->lines_count, g->lines_version, &g->points, &g->points_idx, + &g->points_lines_count)) + return; + + g->points_version = g->lines_version; + g->grid_hash = hash; + g->lines_hash = lines_hash; + } + else if(g->lines_hash == lines_hash) + { + // update line type information in points_idx + for(int n = 0; n < g->points_lines_count; n++) + g->points_idx[n].type = g->lines[n].type; + + // coordinates of lines are unchanged -> we only need to update colors + if(!update_colors(self, g->points_idx, g->points_lines_count)) + return; + + g->points_version = g->lines_version; + } + + // a final check + if(g->points == NULL || g->points_idx == NULL) return; + + cairo_save(cr); + cairo_rectangle(cr, 0, 0, width, height); + cairo_clip(cr); + cairo_translate(cr, width / 2.0, height / 2.0); + cairo_scale(cr, zoom_scale, zoom_scale); + cairo_translate(cr, -.5f * wd - zoom_x * wd, -.5f * ht - zoom_y * ht); + + // this must match the sequence of enum dt_iop_ashift_linecolor_t! + const float line_colors[5][4] = + { { 0.3f, 0.3f, 0.3f, 0.8f }, // grey (misc. lines) + { 0.0f, 1.0f, 0.0f, 0.8f }, // green (selected vertical lines) + { 0.8f, 0.0f, 0.0f, 0.8f }, // red (de-selected vertical lines) + { 0.0f, 0.0f, 1.0f, 0.8f }, // blue (selected horizontal lines) + { 0.8f, 0.8f, 0.0f, 0.8f } }; // yellow (de-selected horizontal lines) + + cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); + + // now draw all lines + for(int n = 0; n < g->points_lines_count; n++) + { + // is the near flag set? -> draw line a bit thicker + if(g->points_idx[n].near) + cairo_set_line_width(cr, DT_PIXEL_APPLY_DPI(3.0) / zoom_scale); + else + cairo_set_line_width(cr, DT_PIXEL_APPLY_DPI(1.5) / zoom_scale); + + // the color of this line + const float *color = line_colors[g->points_idx[n].color]; + cairo_set_source_rgba(cr, color[0], color[1], color[2], color[3]); + + size_t offset = g->points_idx[n].offset; + const int length = g->points_idx[n].length; + + // sanity check (this should not happen) + if(length < 2) continue; + + // set starting point of multi-segment line + cairo_move_to(cr, g->points[offset * 2], g->points[offset * 2 + 1]); + + offset++; + // draw individual line segments + for(int l = 1; l < length; l++, offset++) + { + cairo_line_to(cr, g->points[offset * 2], g->points[offset * 2 + 1]); + } + + // finally stroke the line + cairo_stroke(cr); + } + + // and we draw the selection box if any + if(g->isbounding != ASHIFT_BOUNDING_OFF) + { + float pzx, pzy; + dt_dev_get_pointer_zoom_pos(dev, pointerx, pointery, &pzx, &pzy); + pzx += 0.5f; + pzy += 0.5f; + + double dashed[] = { 4.0, 4.0 }; + dashed[0] /= zoom_scale; + dashed[1] /= zoom_scale; + int len = sizeof(dashed) / sizeof(dashed[0]); + + cairo_rectangle(cr, g->lastx * wd, g->lasty * ht, (pzx - g->lastx) * wd, (pzy - g->lasty) * ht); + + cairo_set_source_rgba(cr, .3, .3, .3, .8); + cairo_set_line_width(cr, 1.0 / zoom_scale); + cairo_set_dash(cr, dashed, len, 0); + cairo_stroke_preserve(cr); + cairo_set_source_rgba(cr, .8, .8, .8, .8); + cairo_set_dash(cr, dashed, len, 4); + cairo_stroke(cr); + } + + // indicate which area is used for "near"-ness detection when selecting/deselecting lines + if(g->near_delta > 0) + { + float pzx, pzy; + dt_dev_get_pointer_zoom_pos(dev, pointerx, pointery, &pzx, &pzy); + pzx += 0.5f; + pzy += 0.5f; + + double dashed[] = { 4.0, 4.0 }; + dashed[0] /= zoom_scale; + dashed[1] /= zoom_scale; + int len = sizeof(dashed) / sizeof(dashed[0]); + + cairo_arc(cr, pzx * wd, pzy * ht, g->near_delta, 0, 2.0 * M_PI); + + cairo_set_source_rgba(cr, .3, .3, .3, .8); + cairo_set_line_width(cr, 1.0 / zoom_scale); + cairo_set_dash(cr, dashed, len, 0); + cairo_stroke_preserve(cr); + cairo_set_source_rgba(cr, .8, .8, .8, .8); + cairo_set_dash(cr, dashed, len, 4); + cairo_stroke(cr); + } + + cairo_restore(cr); +} +#endif // if 0 +//----------------------------------------------------------------------------- + +// update the number of selected vertical and horizontal lines +static void update_lines_count(const dt_iop_ashift_line_t *lines, const int lines_count, + int *vertical_count, int *horizontal_count) +{ + int vlines = 0; + int hlines = 0; + + for(int n = 0; n < lines_count; n++) + { + if((lines[n].type & ASHIFT_LINE_MASK) == ASHIFT_LINE_VERTICAL_SELECTED) + vlines++; + else if((lines[n].type & ASHIFT_LINE_MASK) == ASHIFT_LINE_HORIZONTAL_SELECTED) + hlines++; + } + + *vertical_count = vlines; + *horizontal_count = hlines; +} + +//----------------------------------------------------------------------------- +// RT: BEGIN COMMENT +#if 0 +int mouse_moved(struct dt_iop_module_t *self, double x, double y, double pressure, int which) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + int handled = 0; + + const float wd = self->dev->preview_pipe->backbuf_width; + const float ht = self->dev->preview_pipe->backbuf_height; + if(wd < 1.0 || ht < 1.0) return 1; + + float pzx, pzy; + dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy); + pzx += 0.5f; + pzy += 0.5f; + + if (g->adjust_crop) + { + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + const float newx = g->crop_cx + pzx - g->lastx; + const float newy = g->crop_cy + pzy - g->lasty; + crop_adjust(self, p, newx, newy); + dt_dev_add_history_item(darktable.develop, self, TRUE); + return TRUE; + } + + // if in rectangle selecting mode adjust "near"-ness of lines according to + // the rectangular selection + if(g->isbounding != ASHIFT_BOUNDING_OFF) + { + if(wd >= 1.0 && ht >= 1.0) + { + // mark lines inside the rectangle + get_bounded_inside(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->lastx * wd, + g->lasty * ht, g->isbounding); + } + + dt_control_queue_redraw_center(); + return FALSE; + } + + // gather information about "near"-ness in g->points_idx + get_near(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->near_delta); + + // if we are in sweeping mode iterate over lines as we move the pointer and change "selected" state. + if(g->isdeselecting || g->isselecting) + { + for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++) + { + if(g->points_idx[n].near == 0) + continue; + + if(g->isdeselecting) + g->lines[n].type &= ~ASHIFT_LINE_SELECTED; + else if(g->isselecting) + g->lines[n].type |= ASHIFT_LINE_SELECTED; + + handled = 1; + } + } + + if(handled) + { + update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count); + g->lines_version++; + g->selecting_lines_version++; + } + + dt_control_queue_redraw_center(); + + // if not in sweeping mode we need to pass the event + return (g->isdeselecting || g->isselecting); +} + +int button_pressed(struct dt_iop_module_t *self, double x, double y, double pressure, int which, int type, + uint32_t state) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + int handled = 0; + + float pzx, pzy; + dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy); + pzx += 0.5f; + pzy += 0.5f; + + const float wd = self->dev->preview_pipe->backbuf_width; + const float ht = self->dev->preview_pipe->backbuf_height; + if(wd < 1.0 || ht < 1.0) return 1; + + + // if visibility of lines is switched off or no lines available -> potentially adjust crop area + if(g->lines_suppressed || g->lines == NULL) + { + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + if (p->cropmode == ASHIFT_CROP_ASPECT) + { + dt_control_change_cursor(GDK_HAND1); + g->adjust_crop = TRUE; + g->lastx = pzx; + g->lasty = pzy; + g->crop_cx = 0.5f * (p->cl + p->cr); + g->crop_cy = 0.5f * (p->ct + p->cb); + return TRUE; + } + else + return FALSE; + } + + // remember lines version at this stage so we can continuously monitor if the + // lines have changed in-between + g->selecting_lines_version = g->lines_version; + + // if shift button is pressed go into bounding mode (selecting or deselecting + // in a rectangle area) + if((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) + { + g->lastx = pzx; + g->lasty = pzy; + + g->isbounding = (which == 3) ? ASHIFT_BOUNDING_DESELECT : ASHIFT_BOUNDING_SELECT; + dt_control_change_cursor(GDK_CROSS); + + return TRUE; + } + + dt_dev_zoom_t zoom = dt_control_get_dev_zoom(); + const int closeup = dt_control_get_dev_closeup(); + const float min_scale = dt_dev_get_zoom_scale(self->dev, DT_ZOOM_FIT, 1<dev, zoom, 1<points_lines_count > 0); + + g->near_delta = dt_conf_get_float("plugins/darkroom/ashift/near_delta"); + + // gather information about "near"-ness in g->points_idx + get_near(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->near_delta); + + // iterate over all lines close to the pointer and change "selected" state. + // left-click selects and right-click deselects the line + for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++) + { + if(g->points_idx[n].near == 0) + continue; + + if(which == 3) + g->lines[n].type &= ~ASHIFT_LINE_SELECTED; + else + g->lines[n].type |= ASHIFT_LINE_SELECTED; + + handled = 1; + } + + // we switch into sweeping mode either if we anyhow take control + // or if cursor was close to a line when button was pressed. in other + // cases we hand over the event (for image panning) + if((take_control || handled) && which == 3) + { + dt_control_change_cursor(GDK_PIRATE); + g->isdeselecting = 1; + } + else if(take_control || handled) + { + dt_control_change_cursor(GDK_PLUS); + g->isselecting = 1; + } + + if(handled) + { + update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count); + g->lines_version++; + g->selecting_lines_version++; + } + + return (take_control || handled); +} + +int button_released(struct dt_iop_module_t *self, double x, double y, int which, uint32_t state) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + // stop adjust crop + g->adjust_crop = FALSE; + dt_control_change_cursor(GDK_LEFT_PTR); + + // finalize the isbounding mode + // if user has released the shift button in-between -> do nothing + if(g->isbounding != ASHIFT_BOUNDING_OFF && (state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) + { + int handled = 0; + + // we compute the rectangle selection + float pzx, pzy; + dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy); + + pzx += 0.5f; + pzy += 0.5f; + + const float wd = self->dev->preview_pipe->backbuf_width; + const float ht = self->dev->preview_pipe->backbuf_height; + + if(wd >= 1.0 && ht >= 1.0) + { + // mark lines inside the rectangle + get_bounded_inside(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->lastx * wd, + g->lasty * ht, g->isbounding); + + // select or deselect lines within the rectangle according to isbounding state + for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++) + { + if(g->points_idx[n].bounded == 0) continue; + + if(g->isbounding == ASHIFT_BOUNDING_DESELECT) + g->lines[n].type &= ~ASHIFT_LINE_SELECTED; + else + g->lines[n].type |= ASHIFT_LINE_SELECTED; + + handled = 1; + } + + if(handled) + { + update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count); + g->lines_version++; + g->selecting_lines_version++; + } + + dt_control_queue_redraw_center(); + } + } + + // end of sweeping/isbounding mode + dt_control_change_cursor(GDK_LEFT_PTR); + g->isselecting = g->isdeselecting = 0; + g->isbounding = ASHIFT_BOUNDING_OFF; + g->near_delta = 0; + g->lastx = g->lasty = -1.0f; + g->crop_cx = g->crop_cy = -1.0f; + + return 0; +} + +int scrolled(struct dt_iop_module_t *self, double x, double y, int up, uint32_t state) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + // do nothing if visibility of lines is switched off or no lines available + if(g->lines_suppressed || g->lines == NULL) + return FALSE; + + if(g->near_delta > 0 && (g->isdeselecting || g->isselecting)) + { + int handled = 0; + + float pzx, pzy; + dt_dev_get_pointer_zoom_pos(self->dev, x, y, &pzx, &pzy); + pzx += 0.5f; + pzy += 0.5f; + + const float wd = self->dev->preview_pipe->backbuf_width; + const float ht = self->dev->preview_pipe->backbuf_height; + + float near_delta = dt_conf_get_float("plugins/darkroom/ashift/near_delta"); + const float amount = up ? 0.8f : 1.25f; + near_delta = MAX(4.0f, MIN(near_delta * amount, 100.0f)); + dt_conf_set_float("plugins/darkroom/ashift/near_delta", near_delta); + g->near_delta = near_delta; + + // gather information about "near"-ness in g->points_idx + get_near(g->points, g->points_idx, g->points_lines_count, pzx * wd, pzy * ht, g->near_delta); + + // iterate over all lines close to the pointer and change "selected" state. + for(int n = 0; g->selecting_lines_version == g->lines_version && n < g->points_lines_count; n++) + { + if(g->points_idx[n].near == 0) + continue; + + if(g->isdeselecting) + g->lines[n].type &= ~ASHIFT_LINE_SELECTED; + else if(g->isselecting) + g->lines[n].type |= ASHIFT_LINE_SELECTED; + + handled = 1; + } + + if(handled) + { + update_lines_count(g->lines, g->lines_count, &g->vertical_count, &g->horizontal_count); + g->lines_version++; + g->selecting_lines_version++; + } + + dt_control_queue_redraw_center(); + return TRUE; + } + + return FALSE; +} + +static void rotation_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->rotation = dt_bauhaus_slider_get(slider); +#ifdef ASHIFT_DEBUG + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + model_probe(self, p, g->lastfit); +#endif + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void lensshift_v_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->lensshift_v = dt_bauhaus_slider_get(slider); +#ifdef ASHIFT_DEBUG + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + model_probe(self, p, g->lastfit); +#endif + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void lensshift_h_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->lensshift_h = dt_bauhaus_slider_get(slider); +#ifdef ASHIFT_DEBUG + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + model_probe(self, p, g->lastfit); +#endif + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void shear_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->shear = dt_bauhaus_slider_get(slider); +#ifdef ASHIFT_DEBUG + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + model_probe(self, p, g->lastfit); +#endif + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void guide_lines_callback(GtkWidget *widget, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + g->show_guides = dt_bauhaus_combobox_get(widget); + dt_iop_request_focus(self); + dt_dev_reprocess_all(self->dev); +} + +static void cropmode_callback(GtkWidget *widget, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + p->cropmode = dt_bauhaus_combobox_get(widget); + if(g->lines != NULL && !g->lines_suppressed) + { + g->lines_suppressed = 1; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->eye), g->lines_suppressed); + } + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void mode_callback(GtkWidget *widget, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + p->mode = dt_bauhaus_combobox_get(widget); + + switch(p->mode) + { + case ASHIFT_MODE_GENERIC: + gtk_widget_hide(g->f_length); + gtk_widget_hide(g->crop_factor); + gtk_widget_hide(g->orthocorr); + gtk_widget_hide(g->aspect); + break; + case ASHIFT_MODE_SPECIFIC: + default: + gtk_widget_show(g->f_length); + gtk_widget_show(g->crop_factor); + gtk_widget_show(g->orthocorr); + gtk_widget_show(g->aspect); + break; + } + + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void f_length_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->f_length = dt_bauhaus_slider_get(slider); + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void crop_factor_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->crop_factor = dt_bauhaus_slider_get(slider); + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void orthocorr_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->orthocorr = dt_bauhaus_slider_get(slider); + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static void aspect_callback(GtkWidget *slider, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(self->dt->gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + p->aspect = dt_bauhaus_slider_get(slider); + do_crop(self, p); + dt_dev_add_history_item(darktable.develop, self, TRUE); +} + +static int fit_v_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(darktable.gui->reset) return FALSE; + + if(event->button == 1) + { + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK; + const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK; + + dt_iop_ashift_fitaxis_t fitaxis = ASHIFT_FIT_NONE; + + if(control) + g->lastfit = fitaxis = ASHIFT_FIT_ROTATION_VERTICAL_LINES; + else if(shift) + g->lastfit = fitaxis = ASHIFT_FIT_VERTICALLY_NO_ROTATION; + else + g->lastfit = fitaxis = ASHIFT_FIT_VERTICALLY; + + dt_iop_request_focus(self); + dt_dev_reprocess_all(self->dev); + + if(self->enabled) + { + // module is enable -> we process directly + if(do_fit(self, p, fitaxis)) + { + darktable.gui->reset = 1; + dt_bauhaus_slider_set_soft(g->rotation, p->rotation); + dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v); + dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h); + dt_bauhaus_slider_set_soft(g->shear, p->shear); + darktable.gui->reset = 0; + } + } + else + { + // module is not enabled -> invoke it and queue the job to be processed once + // the preview image is ready + g->jobcode = ASHIFT_JOBCODE_FIT; + g->jobparams = g->lastfit = fitaxis; + p->toggle ^= 1; + } + + dt_dev_add_history_item(darktable.develop, self, TRUE); + return TRUE; + } + return FALSE; +} + +static int fit_h_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(darktable.gui->reset) return FALSE; + + if(event->button == 1) + { + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK; + const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK; + + dt_iop_ashift_fitaxis_t fitaxis = ASHIFT_FIT_NONE; + + if(control) + g->lastfit = fitaxis = ASHIFT_FIT_ROTATION_HORIZONTAL_LINES; + else if(shift) + g->lastfit = fitaxis = ASHIFT_FIT_HORIZONTALLY_NO_ROTATION; + else + g->lastfit = fitaxis = ASHIFT_FIT_HORIZONTALLY; + + dt_iop_request_focus(self); + dt_dev_reprocess_all(self->dev); + + if(self->enabled) + { + // module is enable -> we process directly + if(do_fit(self, p, fitaxis)) + { + darktable.gui->reset = 1; + dt_bauhaus_slider_set_soft(g->rotation, p->rotation); + dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v); + dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h); + dt_bauhaus_slider_set_soft(g->shear, p->shear); + darktable.gui->reset = 0; + } + } + else + { + // module is not enabled -> invoke it and queue the job to be processed once + // the preview image is ready + g->jobcode = ASHIFT_JOBCODE_FIT; + g->jobparams = g->lastfit = fitaxis; + p->toggle ^= 1; + } + + dt_dev_add_history_item(darktable.develop, self, TRUE); + return TRUE; + } + return FALSE; +} + +static int fit_both_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(darktable.gui->reset) return FALSE; + + if(event->button == 1) + { + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK; + const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK; + + dt_iop_ashift_fitaxis_t fitaxis = ASHIFT_FIT_NONE; + + if(control && shift) + fitaxis = ASHIFT_FIT_BOTH; + else if(control) + fitaxis = ASHIFT_FIT_ROTATION_BOTH_LINES; + else if(shift) + fitaxis = ASHIFT_FIT_BOTH_NO_ROTATION; + else + fitaxis = ASHIFT_FIT_BOTH_SHEAR; + + dt_iop_request_focus(self); + dt_dev_reprocess_all(self->dev); + + if(self->enabled) + { + // module is enable -> we process directly + if(do_fit(self, p, fitaxis)) + { + darktable.gui->reset = 1; + dt_bauhaus_slider_set_soft(g->rotation, p->rotation); + dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v); + dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h); + dt_bauhaus_slider_set_soft(g->shear, p->shear); + darktable.gui->reset = 0; + } + } + else + { + // module is not enabled -> invoke it and queue the job to be processed once + // the preview image is ready + g->jobcode = ASHIFT_JOBCODE_FIT; + g->jobparams = g->lastfit = fitaxis; + p->toggle ^= 1; + } + + dt_dev_add_history_item(darktable.develop, self, TRUE); + return TRUE; + } + return FALSE; +} + +static int structure_button_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(darktable.gui->reset) return FALSE; + + if(event->button == 1) + { + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + const int control = (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK; + const int shift = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK; + + dt_iop_ashift_enhance_t enhance; + + if(control && shift) + enhance = ASHIFT_ENHANCE_EDGES | ASHIFT_ENHANCE_DETAIL; + else if(shift) + enhance = ASHIFT_ENHANCE_DETAIL; + else if(control) + enhance = ASHIFT_ENHANCE_EDGES; + else + enhance = ASHIFT_ENHANCE_NONE; + + dt_iop_request_focus(self); + dt_dev_reprocess_all(self->dev); + + if(self->enabled) + { + // module is enabled -> process directly + (void)do_get_structure(self, p, enhance); + } + else + { + // module is not enabled -> invoke it and queue the job to be processed once + // the preview image is ready + g->jobcode = ASHIFT_JOBCODE_GET_STRUCTURE; + g->jobparams = enhance; + p->toggle ^= 1; + } + + dt_dev_add_history_item(darktable.develop, self, TRUE); + return TRUE; + } + return FALSE; +} + +static void clean_button_clicked(GtkButton *button, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + if(darktable.gui->reset) return; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + (void)do_clean_structure(self, p); + dt_iop_request_focus(self); + dt_control_queue_redraw_center(); +} + +static void eye_button_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + if(darktable.gui->reset) return; + if(g->lines == NULL) + { + g->lines_suppressed = 0; + gtk_toggle_button_set_active(togglebutton, 0); + } + else + { + g->lines_suppressed = gtk_toggle_button_get_active(togglebutton); + } + dt_iop_request_focus(self); + dt_control_queue_redraw_center(); +} + +// routine that is called after preview image has been processed. we use it +// to perform structure collection or fitting in case those have been triggered while +// the module had not yet been enabled +static void process_after_preview_callback(gpointer instance, gpointer user_data) +{ + dt_iop_module_t *self = (dt_iop_module_t *)user_data; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + + dt_iop_ashift_jobcode_t jobcode = g->jobcode; + int jobparams = g->jobparams; + + // purge + g->jobcode = ASHIFT_JOBCODE_NONE; + g->jobparams = 0; + + if(darktable.gui->reset) return; + + switch(jobcode) + { + case ASHIFT_JOBCODE_GET_STRUCTURE: + (void)do_get_structure(self, p, (dt_iop_ashift_enhance_t)jobparams); + break; + + case ASHIFT_JOBCODE_FIT: + if(do_fit(self, p, (dt_iop_ashift_fitaxis_t)jobparams)) + { + darktable.gui->reset = 1; + dt_bauhaus_slider_set_soft(g->rotation, p->rotation); + dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v); + dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h); + dt_bauhaus_slider_set_soft(g->shear, p->shear); + darktable.gui->reset = 0; + } + dt_dev_add_history_item(darktable.develop, self, TRUE); + break; + + case ASHIFT_JOBCODE_NONE: + default: + break; + } + + dt_control_queue_redraw_center(); +} + +void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe, + dt_dev_pixelpipe_iop_t *piece) +{ + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)p1; + dt_iop_ashift_data_t *d = (dt_iop_ashift_data_t *)piece->data; + + d->rotation = p->rotation; + d->lensshift_v = p->lensshift_v; + d->lensshift_h = p->lensshift_h; + d->shear = p->shear; + d->f_length_kb = (p->mode == ASHIFT_MODE_GENERIC) ? DEFAULT_F_LENGTH : p->f_length * p->crop_factor; + d->orthocorr = (p->mode == ASHIFT_MODE_GENERIC) ? 0.0f : p->orthocorr; + d->aspect = (p->mode == ASHIFT_MODE_GENERIC) ? 1.0f : p->aspect; + + if(gui_has_focus(self)) + { + // if gui has focus we want to see the full uncropped image + d->cl = 0.0f; + d->cr = 1.0f; + d->ct = 0.0f; + d->cb = 1.0f; + } + else + { + d->cl = p->cl; + d->cr = p->cr; + d->ct = p->ct; + d->cb = p->cb; + } +} + +void init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece) +{ + dt_iop_ashift_data_t *d = (dt_iop_ashift_data_t *)calloc(1, sizeof(dt_iop_ashift_data_t)); + piece->data = (void *)d; + self->commit_params(self, self->default_params, pipe, piece); +} + +void cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece) +{ + free(piece->data); + piece->data = NULL; +} + +void gui_update(struct dt_iop_module_t *self) +{ + dt_iop_module_t *module = (dt_iop_module_t *)self; + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)module->params; + dt_bauhaus_slider_set_soft(g->rotation, p->rotation); + dt_bauhaus_slider_set_soft(g->lensshift_v, p->lensshift_v); + dt_bauhaus_slider_set_soft(g->lensshift_h, p->lensshift_h); + dt_bauhaus_slider_set_soft(g->shear, p->shear); + dt_bauhaus_slider_set_soft(g->f_length, p->f_length); + dt_bauhaus_slider_set_soft(g->crop_factor, p->crop_factor); + dt_bauhaus_slider_set(g->orthocorr, p->orthocorr); + dt_bauhaus_slider_set(g->aspect, p->aspect); + dt_bauhaus_combobox_set(g->mode, p->mode); + dt_bauhaus_combobox_set(g->guide_lines, g->show_guides); + dt_bauhaus_combobox_set(g->cropmode, p->cropmode); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->eye), 0); + + switch(p->mode) + { + case ASHIFT_MODE_GENERIC: + gtk_widget_hide(g->f_length); + gtk_widget_hide(g->crop_factor); + gtk_widget_hide(g->orthocorr); + gtk_widget_hide(g->aspect); + break; + case ASHIFT_MODE_SPECIFIC: + default: + gtk_widget_show(g->f_length); + gtk_widget_show(g->crop_factor); + gtk_widget_show(g->orthocorr); + gtk_widget_show(g->aspect); + break; + } +} + +void init(dt_iop_module_t *module) +{ + module->params = calloc(1, sizeof(dt_iop_ashift_params_t)); + module->default_params = calloc(1, sizeof(dt_iop_ashift_params_t)); + module->default_enabled = 0; + module->priority = 214; // module order created by iop_dependencies.py, do not edit! + module->params_size = sizeof(dt_iop_ashift_params_t); + module->gui_data = NULL; + dt_iop_ashift_params_t tmp = (dt_iop_ashift_params_t){ 0.0f, 0.0f, 0.0f, 0.0f, DEFAULT_F_LENGTH, 1.0f, 100.0f, 1.0f, ASHIFT_MODE_GENERIC, 0, + ASHIFT_CROP_OFF, 0.0f, 1.0f, 0.0f, 1.0f }; + memcpy(module->params, &tmp, sizeof(dt_iop_ashift_params_t)); + memcpy(module->default_params, &tmp, sizeof(dt_iop_ashift_params_t)); +} + +void reload_defaults(dt_iop_module_t *module) +{ + // our module is disabled by default + module->default_enabled = 0; + + int isflipped = 0; + float f_length = DEFAULT_F_LENGTH; + float crop_factor = 1.0f; + + // try to get information on orientation, focal length and crop factor from image data + if(module->dev) + { + const dt_image_t *img = &module->dev->image_storage; + // orientation only needed as a-priori information to correctly label some sliders + // before pixelpipe has been set up. later we will get a definite result by + // assessing the pixelpipe + isflipped = (img->orientation == ORIENTATION_ROTATE_CCW_90_DEG + || img->orientation == ORIENTATION_ROTATE_CW_90_DEG) + ? 1 + : 0; + + // focal length should be available in exif data if lens is electronically coupled to the camera + f_length = isfinite(img->exif_focal_length) && img->exif_focal_length > 0.0f ? img->exif_focal_length : f_length; + // crop factor of the camera is often not available and user will need to set it manually in the gui + crop_factor = isfinite(img->exif_crop) && img->exif_crop > 0.0f ? img->exif_crop : crop_factor; + } + + // init defaults: + dt_iop_ashift_params_t tmp = (dt_iop_ashift_params_t){ 0.0f, 0.0f, 0.0f, 0.0f, f_length, crop_factor, 100.0f, 1.0f, ASHIFT_MODE_GENERIC, 0, + ASHIFT_CROP_OFF, 0.0f, 1.0f, 0.0f, 1.0f }; + memcpy(module->params, &tmp, sizeof(dt_iop_ashift_params_t)); + memcpy(module->default_params, &tmp, sizeof(dt_iop_ashift_params_t)); + + // reset gui elements + if(module->gui_data) + { + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)module->gui_data; + + char string_v[256]; + char string_h[256]; + + snprintf(string_v, sizeof(string_v), _("lens shift (%s)"), isflipped ? _("horizontal") : _("vertical")); + snprintf(string_h, sizeof(string_h), _("lens shift (%s)"), isflipped ? _("vertical") : _("horizontal")); + + dt_bauhaus_widget_set_label(g->lensshift_v, NULL, string_v); + dt_bauhaus_widget_set_label(g->lensshift_h, NULL, string_h); + + dt_bauhaus_slider_set_default(g->f_length, tmp.f_length); + dt_bauhaus_slider_set_default(g->crop_factor, tmp.crop_factor); + + dt_pthread_mutex_lock(&g->lock); + free(g->buf); + g->buf = NULL; + g->buf_width = 0; + g->buf_height = 0; + g->buf_x_off = 0; + g->buf_y_off = 0; + g->buf_scale = 1.0f; + g->buf_hash = 0; + g->isflipped = -1; + g->lastfit = ASHIFT_FIT_NONE; + dt_pthread_mutex_unlock(&g->lock); + + g->fitting = 0; + free(g->lines); + g->lines = NULL; + g->lines_count =0; + g->horizontal_count = 0; + g->vertical_count = 0; + g->grid_hash = 0; + g->lines_hash = 0; + g->rotation_range = ROTATION_RANGE_SOFT; + g->lensshift_v_range = LENSSHIFT_RANGE_SOFT; + g->lensshift_h_range = LENSSHIFT_RANGE_SOFT; + g->shear_range = SHEAR_RANGE_SOFT; + g->lines_suppressed = 0; + g->lines_version = 0; + g->show_guides = 0; + g->isselecting = 0; + g->isdeselecting = 0; + g->isbounding = ASHIFT_BOUNDING_OFF; + g->near_delta = 0; + g->selecting_lines_version = 0; + + free(g->points); + g->points = NULL; + free(g->points_idx); + g->points_idx = NULL; + g->points_lines_count = 0; + g->points_version = 0; + + g->jobcode = ASHIFT_JOBCODE_NONE; + g->jobparams = 0; + g->adjust_crop = FALSE; + g->lastx = g->lasty = -1.0f; + g->crop_cx = g->crop_cy = 1.0f; + } +} + + +void init_global(dt_iop_module_so_t *module) +{ + dt_iop_ashift_global_data_t *gd + = (dt_iop_ashift_global_data_t *)malloc(sizeof(dt_iop_ashift_global_data_t)); + module->data = gd; + + const int program = 2; // basic.cl, from programs.conf + gd->kernel_ashift_bilinear = dt_opencl_create_kernel(program, "ashift_bilinear"); + gd->kernel_ashift_bicubic = dt_opencl_create_kernel(program, "ashift_bicubic"); + gd->kernel_ashift_lanczos2 = dt_opencl_create_kernel(program, "ashift_lanczos2"); + gd->kernel_ashift_lanczos3 = dt_opencl_create_kernel(program, "ashift_lanczos3"); +} + +void cleanup(dt_iop_module_t *module) +{ + free(module->params); + module->params = NULL; +} + +void cleanup_global(dt_iop_module_so_t *module) +{ + dt_iop_ashift_global_data_t *gd = (dt_iop_ashift_global_data_t *)module->data; + dt_opencl_free_kernel(gd->kernel_ashift_bilinear); + dt_opencl_free_kernel(gd->kernel_ashift_bicubic); + dt_opencl_free_kernel(gd->kernel_ashift_lanczos2); + dt_opencl_free_kernel(gd->kernel_ashift_lanczos3); + free(module->data); + module->data = NULL; +} + +// adjust labels of lens shift parameters according to flip status of image +static gboolean draw(GtkWidget *widget, cairo_t *cr, dt_iop_module_t *self) +{ + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + if(darktable.gui->reset) return FALSE; + + dt_pthread_mutex_lock(&g->lock); + const int isflipped = g->isflipped; + dt_pthread_mutex_unlock(&g->lock); + + if(isflipped == -1) return FALSE; + + char string_v[256]; + char string_h[256]; + + snprintf(string_v, sizeof(string_v), _("lens shift (%s)"), isflipped ? _("horizontal") : _("vertical")); + snprintf(string_h, sizeof(string_h), _("lens shift (%s)"), isflipped ? _("vertical") : _("horizontal")); + + darktable.gui->reset = 1; + dt_bauhaus_widget_set_label(g->lensshift_v, NULL, string_v); + dt_bauhaus_widget_set_label(g->lensshift_h, NULL, string_h); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->eye), g->lines_suppressed); + darktable.gui->reset = 0; + + return FALSE; +} + +void gui_focus(struct dt_iop_module_t *self, gboolean in) +{ + if(self->enabled) + dt_dev_reprocess_all(self->dev); +} + +static float log10_callback(GtkWidget *self, float inval, dt_bauhaus_callback_t dir) +{ + float outval; + switch(dir) + { + case DT_BAUHAUS_SET: + outval = log10(fmax(inval, 1e-15f)); + break; + case DT_BAUHAUS_GET: + outval = exp(M_LN10 * inval); + break; + default: + outval = inval; + } + return outval; +} + +static float log2_callback(GtkWidget *self, float inval, dt_bauhaus_callback_t dir) +{ + float outval; + switch(dir) + { + case DT_BAUHAUS_SET: + outval = log(fmax(inval, 1e-15f)) / M_LN2; + break; + case DT_BAUHAUS_GET: + outval = exp(M_LN2 * inval); + break; + default: + outval = inval; + } + return outval; +} + +void gui_init(struct dt_iop_module_t *self) +{ + self->gui_data = malloc(sizeof(dt_iop_ashift_gui_data_t)); + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + dt_iop_ashift_params_t *p = (dt_iop_ashift_params_t *)self->params; + + dt_pthread_mutex_init(&g->lock, NULL); + dt_pthread_mutex_lock(&g->lock); + g->buf = NULL; + g->buf_width = 0; + g->buf_height = 0; + g->buf_x_off = 0; + g->buf_y_off = 0; + g->buf_scale = 1.0f; + g->buf_hash = 0; + g->isflipped = -1; + g->lastfit = ASHIFT_FIT_NONE; + dt_pthread_mutex_unlock(&g->lock); + + g->fitting = 0; + g->lines = NULL; + g->lines_count = 0; + g->vertical_count = 0; + g->horizontal_count = 0; + g->lines_version = 0; + g->lines_suppressed = 0; + g->points = NULL; + g->points_idx = NULL; + g->points_lines_count = 0; + g->points_version = 0; + g->grid_hash = 0; + g->lines_hash = 0; + g->rotation_range = ROTATION_RANGE_SOFT; + g->lensshift_v_range = LENSSHIFT_RANGE_SOFT; + g->lensshift_h_range = LENSSHIFT_RANGE_SOFT; + g->shear_range = SHEAR_RANGE_SOFT; + g->show_guides = 0; + g->isselecting = 0; + g->isdeselecting = 0; + g->isbounding = ASHIFT_BOUNDING_OFF; + g->near_delta = 0; + g->selecting_lines_version = 0; + + g->jobcode = ASHIFT_JOBCODE_NONE; + g->jobparams = 0; + g->adjust_crop = FALSE; + g->lastx = g->lasty = -1.0f; + g->crop_cx = g->crop_cy = 1.0f; + + self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE); + dt_gui_add_help_link(self->widget, dt_get_help_url(self->op)); + + g->rotation = dt_bauhaus_slider_new_with_range(self, -ROTATION_RANGE, ROTATION_RANGE, 0.01*ROTATION_RANGE, p->rotation, 2); + dt_bauhaus_widget_set_label(g->rotation, NULL, _("rotation")); + dt_bauhaus_slider_set_format(g->rotation, "%.2f°"); + dt_bauhaus_slider_enable_soft_boundaries(g->rotation, -ROTATION_RANGE_SOFT, ROTATION_RANGE_SOFT); + gtk_box_pack_start(GTK_BOX(self->widget), g->rotation, TRUE, TRUE, 0); + + g->lensshift_v = dt_bauhaus_slider_new_with_range(self, -LENSSHIFT_RANGE, LENSSHIFT_RANGE, 0.01*LENSSHIFT_RANGE, p->lensshift_v, 3); + dt_bauhaus_widget_set_label(g->lensshift_v, NULL, _("lens shift (vertical)")); + dt_bauhaus_slider_enable_soft_boundaries(g->lensshift_v, -LENSSHIFT_RANGE_SOFT, LENSSHIFT_RANGE_SOFT); + gtk_box_pack_start(GTK_BOX(self->widget), g->lensshift_v, TRUE, TRUE, 0); + + g->lensshift_h = dt_bauhaus_slider_new_with_range(self, -LENSSHIFT_RANGE, LENSSHIFT_RANGE, 0.01*LENSSHIFT_RANGE, p->lensshift_h, 3); + dt_bauhaus_widget_set_label(g->lensshift_h, NULL, _("lens shift (horizontal)")); + dt_bauhaus_slider_enable_soft_boundaries(g->lensshift_h, -LENSSHIFT_RANGE_SOFT, LENSSHIFT_RANGE_SOFT); + gtk_box_pack_start(GTK_BOX(self->widget), g->lensshift_h, TRUE, TRUE, 0); + + g->shear = dt_bauhaus_slider_new_with_range(self, -SHEAR_RANGE, SHEAR_RANGE, 0.01*SHEAR_RANGE, p->shear, 3); + dt_bauhaus_widget_set_label(g->shear, NULL, _("shear")); + dt_bauhaus_slider_enable_soft_boundaries(g->shear, -SHEAR_RANGE_SOFT, SHEAR_RANGE_SOFT); + gtk_box_pack_start(GTK_BOX(self->widget), g->shear, TRUE, TRUE, 0); + + g->guide_lines = dt_bauhaus_combobox_new(self); + dt_bauhaus_widget_set_label(g->guide_lines, NULL, _("guides")); + dt_bauhaus_combobox_add(g->guide_lines, _("off")); + dt_bauhaus_combobox_add(g->guide_lines, _("on")); + gtk_box_pack_start(GTK_BOX(self->widget), g->guide_lines, TRUE, TRUE, 0); + + g->cropmode = dt_bauhaus_combobox_new(self); + dt_bauhaus_widget_set_label(g->cropmode, NULL, _("automatic cropping")); + dt_bauhaus_combobox_add(g->cropmode, _("off")); + dt_bauhaus_combobox_add(g->cropmode, _("largest area")); + dt_bauhaus_combobox_add(g->cropmode, _("original format")); + gtk_box_pack_start(GTK_BOX(self->widget), g->cropmode, TRUE, TRUE, 0); + + g->mode = dt_bauhaus_combobox_new(self); + dt_bauhaus_widget_set_label(g->mode, NULL, _("lens model")); + dt_bauhaus_combobox_add(g->mode, _("generic")); + dt_bauhaus_combobox_add(g->mode, _("specific")); + gtk_box_pack_start(GTK_BOX(self->widget), g->mode, TRUE, TRUE, 0); + + g->f_length = dt_bauhaus_slider_new_with_range(self, 1.0f, 3.0f, 0.01f, 1.0f, 2); + dt_bauhaus_widget_set_label(g->f_length, NULL, _("focal length")); + dt_bauhaus_slider_set_callback(g->f_length, log10_callback); + dt_bauhaus_slider_set_format(g->f_length, "%.0fmm"); + dt_bauhaus_slider_set_default(g->f_length, DEFAULT_F_LENGTH); + dt_bauhaus_slider_set(g->f_length, DEFAULT_F_LENGTH); + dt_bauhaus_slider_enable_soft_boundaries(g->f_length, 1.0f, 2000.0f); + gtk_box_pack_start(GTK_BOX(self->widget), g->f_length, TRUE, TRUE, 0); + + g->crop_factor = dt_bauhaus_slider_new_with_range(self, 1.0f, 2.0f, 0.01f, p->crop_factor, 2); + dt_bauhaus_widget_set_label(g->crop_factor, NULL, _("crop factor")); + dt_bauhaus_slider_enable_soft_boundaries(g->crop_factor, 0.5f, 10.0f); + gtk_box_pack_start(GTK_BOX(self->widget), g->crop_factor, TRUE, TRUE, 0); + + g->orthocorr = dt_bauhaus_slider_new_with_range(self, 0.0f, 100.0f, 1.0f, p->orthocorr, 2); + dt_bauhaus_widget_set_label(g->orthocorr, NULL, _("lens dependence")); + dt_bauhaus_slider_set_format(g->orthocorr, "%.0f%%"); +#if 0 + // this parameter could serve to finetune between generic model (0%) and specific model (100%). + // however, users can more easily get the same effect with the aspect adjust parameter so we keep + // this one hidden. + gtk_box_pack_start(GTK_BOX(self->widget), g->orthocorr, TRUE, TRUE, 0); +#endif + + g->aspect = dt_bauhaus_slider_new_with_range(self, -1.0f, 1.0f, 0.01f, 0.0f, 2); + dt_bauhaus_widget_set_label(g->aspect, NULL, _("aspect adjust")); + dt_bauhaus_slider_set_callback(g->aspect, log2_callback); + dt_bauhaus_slider_set_default(g->aspect, 1.0f); + dt_bauhaus_slider_set(g->aspect, 1.0f); + gtk_box_pack_start(GTK_BOX(self->widget), g->aspect, TRUE, TRUE, 0); + + GtkWidget *grid = gtk_grid_new(); + gtk_grid_set_row_spacing(GTK_GRID(grid), 2 * DT_BAUHAUS_SPACE); + gtk_grid_set_column_spacing(GTK_GRID(grid), DT_PIXEL_APPLY_DPI(10)); + + GtkWidget *label1 = gtk_label_new(_("automatic fit")); + gtk_widget_set_halign(label1, GTK_ALIGN_START); + gtk_grid_attach(GTK_GRID(grid), label1, 0, 0, 1, 1); + + g->fit_v = dtgtk_button_new(dtgtk_cairo_paint_perspective, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER | 1, NULL); + gtk_widget_set_hexpand(GTK_WIDGET(g->fit_v), TRUE); + gtk_widget_set_size_request(g->fit_v, -1, DT_PIXEL_APPLY_DPI(24)); + gtk_grid_attach_next_to(GTK_GRID(grid), g->fit_v, label1, GTK_POS_RIGHT, 1, 1); + + g->fit_h = dtgtk_button_new(dtgtk_cairo_paint_perspective, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER | 2, NULL); + gtk_widget_set_hexpand(GTK_WIDGET(g->fit_h), TRUE); + gtk_widget_set_size_request(g->fit_h, -1, DT_PIXEL_APPLY_DPI(24)); + gtk_grid_attach_next_to(GTK_GRID(grid), g->fit_h, g->fit_v, GTK_POS_RIGHT, 1, 1); + + g->fit_both = dtgtk_button_new(dtgtk_cairo_paint_perspective, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER | 3, NULL); + gtk_widget_set_hexpand(GTK_WIDGET(g->fit_both), TRUE); + gtk_widget_set_size_request(g->fit_both, -1, DT_PIXEL_APPLY_DPI(24)); + gtk_grid_attach_next_to(GTK_GRID(grid), g->fit_both, g->fit_h, GTK_POS_RIGHT, 1, 1); + + GtkWidget *label2 = gtk_label_new(_("get structure")); + gtk_widget_set_halign(label2, GTK_ALIGN_START); + gtk_grid_attach(GTK_GRID(grid), label2, 0, 1, 1, 1); + + g->structure = dtgtk_button_new(dtgtk_cairo_paint_structure, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER, NULL); + gtk_widget_set_hexpand(GTK_WIDGET(g->structure), TRUE); + gtk_grid_attach_next_to(GTK_GRID(grid), g->structure, label2, GTK_POS_RIGHT, 1, 1); + + g->clean = dtgtk_button_new(dtgtk_cairo_paint_cancel, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER, NULL); + gtk_widget_set_hexpand(GTK_WIDGET(g->clean), TRUE); + gtk_grid_attach_next_to(GTK_GRID(grid), g->clean, g->structure, GTK_POS_RIGHT, 1, 1); + + g->eye = dtgtk_togglebutton_new(dtgtk_cairo_paint_eye_toggle, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER, NULL); + gtk_widget_set_hexpand(GTK_WIDGET(g->eye), TRUE); + gtk_grid_attach_next_to(GTK_GRID(grid), g->eye, g->clean, GTK_POS_RIGHT, 1, 1); + + gtk_box_pack_start(GTK_BOX(self->widget), grid, TRUE, TRUE, 0); + + gtk_widget_show_all(g->f_length); + gtk_widget_set_no_show_all(g->f_length, TRUE); + gtk_widget_show_all(g->crop_factor); + gtk_widget_set_no_show_all(g->crop_factor, TRUE); + gtk_widget_show_all(g->orthocorr); + gtk_widget_set_no_show_all(g->orthocorr, TRUE); + gtk_widget_show_all(g->aspect); + gtk_widget_set_no_show_all(g->aspect, TRUE); + + + switch(p->mode) + { + case ASHIFT_MODE_GENERIC: + gtk_widget_hide(g->f_length); + gtk_widget_hide(g->crop_factor); + gtk_widget_hide(g->orthocorr); + gtk_widget_hide(g->aspect); + break; + case ASHIFT_MODE_SPECIFIC: + default: + gtk_widget_show(g->f_length); + gtk_widget_show(g->crop_factor); + gtk_widget_show(g->orthocorr); + gtk_widget_show(g->aspect); + break; + } + + gtk_widget_set_tooltip_text(g->rotation, _("rotate image")); + gtk_widget_set_tooltip_text(g->lensshift_v, _("apply lens shift correction in one direction")); + gtk_widget_set_tooltip_text(g->lensshift_h, _("apply lens shift correction in one direction")); + gtk_widget_set_tooltip_text(g->shear, _("shear the image along one diagonal")); + gtk_widget_set_tooltip_text(g->guide_lines, _("display guide lines overlay")); + gtk_widget_set_tooltip_text(g->cropmode, _("automatically crop to avoid black edges")); + gtk_widget_set_tooltip_text(g->mode, _("lens model of the perspective correction: " + "generic or according to the focal length")); + gtk_widget_set_tooltip_text(g->f_length, _("focal length of the lens, " + "default value set from exif data if available")); + gtk_widget_set_tooltip_text(g->crop_factor, _("crop factor of the camera sensor, " + "default value set from exif data if available, " + "manual setting is often required")); + gtk_widget_set_tooltip_text(g->orthocorr, _("the level of lens dependent correction, set to maximum for full lens dependency, " + "set to zero for the generic case")); + gtk_widget_set_tooltip_text(g->aspect, _("adjust aspect ratio of image by horizontal and vertical scaling")); + gtk_widget_set_tooltip_text(g->fit_v, _("automatically correct for vertical perspective distortion\n" + "ctrl-click to only fit rotation\n" + "shift-click to only fit lens shift")); + gtk_widget_set_tooltip_text(g->fit_h, _("automatically correct for horizontal perspective distortion\n" + "ctrl-click to only fit rotation\n" + "shift-click to only fit lens shift")); + gtk_widget_set_tooltip_text(g->fit_both, _("automatically correct for vertical and " + "horizontal perspective distortions; fitting rotation," + "lens shift in both directions, and shear\n" + "ctrl-click to only fit rotation\n" + "shift-click to only fit lens shift\n" + "ctrl-shift-click to only fit rotation and lens shift")); + gtk_widget_set_tooltip_text(g->structure, _("analyse line structure in image\n" + "ctrl-click for an additional edge enhancement\n" + "shift-click for an additional detail enhancement\n" + "ctrl-shift-click for a combination of both methods")); + gtk_widget_set_tooltip_text(g->clean, _("remove line structure information")); + gtk_widget_set_tooltip_text(g->eye, _("toggle visibility of structure lines")); + + g_signal_connect(G_OBJECT(g->rotation), "value-changed", G_CALLBACK(rotation_callback), self); + g_signal_connect(G_OBJECT(g->lensshift_v), "value-changed", G_CALLBACK(lensshift_v_callback), self); + g_signal_connect(G_OBJECT(g->lensshift_h), "value-changed", G_CALLBACK(lensshift_h_callback), self); + g_signal_connect(G_OBJECT(g->shear), "value-changed", G_CALLBACK(shear_callback), self); + g_signal_connect(G_OBJECT(g->guide_lines), "value-changed", G_CALLBACK(guide_lines_callback), self); + g_signal_connect(G_OBJECT(g->cropmode), "value-changed", G_CALLBACK(cropmode_callback), self); + g_signal_connect(G_OBJECT(g->mode), "value-changed", G_CALLBACK(mode_callback), self); + g_signal_connect(G_OBJECT(g->f_length), "value-changed", G_CALLBACK(f_length_callback), self); + g_signal_connect(G_OBJECT(g->crop_factor), "value-changed", G_CALLBACK(crop_factor_callback), self); + g_signal_connect(G_OBJECT(g->orthocorr), "value-changed", G_CALLBACK(orthocorr_callback), self); + g_signal_connect(G_OBJECT(g->aspect), "value-changed", G_CALLBACK(aspect_callback), self); + g_signal_connect(G_OBJECT(g->fit_v), "button-press-event", G_CALLBACK(fit_v_button_clicked), (gpointer)self); + g_signal_connect(G_OBJECT(g->fit_h), "button-press-event", G_CALLBACK(fit_h_button_clicked), (gpointer)self); + g_signal_connect(G_OBJECT(g->fit_both), "button-press-event", G_CALLBACK(fit_both_button_clicked), (gpointer)self); + g_signal_connect(G_OBJECT(g->structure), "button-press-event", G_CALLBACK(structure_button_clicked), (gpointer)self); + g_signal_connect(G_OBJECT(g->clean), "clicked", G_CALLBACK(clean_button_clicked), (gpointer)self); + g_signal_connect(G_OBJECT(g->eye), "toggled", G_CALLBACK(eye_button_toggled), (gpointer)self); + g_signal_connect(G_OBJECT(self->widget), "draw", G_CALLBACK(draw), self); + + /* add signal handler for preview pipe finish to redraw the overlay */ + dt_control_signal_connect(darktable.signals, DT_SIGNAL_DEVELOP_PREVIEW_PIPE_FINISHED, + G_CALLBACK(process_after_preview_callback), self); + +} + +void gui_cleanup(struct dt_iop_module_t *self) +{ + dt_control_signal_disconnect(darktable.signals, G_CALLBACK(process_after_preview_callback), self); + + dt_iop_ashift_gui_data_t *g = (dt_iop_ashift_gui_data_t *)self->gui_data; + dt_pthread_mutex_destroy(&g->lock); + free(g->lines); + free(g->buf); + free(g->points); + free(g->points_idx); + free(self->gui_data); + self->gui_data = NULL; +} +#endif // if 0 +//----------------------------------------------------------------------------- + +// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh +// vim: shiftwidth=2 expandtab tabstop=2 cindent +// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified; diff --git a/rtengine/ashift_lsd.c b/rtengine/ashift_lsd.c new file mode 100644 index 000000000..29bdf8bed --- /dev/null +++ b/rtengine/ashift_lsd.c @@ -0,0 +1,2335 @@ +/* + This file is part of darktable, + copyright (c) 2016 Ulrich Pegelow. + + darktable is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + darktable is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with darktable. If not, see . +*/ + + +/* For line detection we are using the LSD code as published below. + * Changes versus the original code: + * do not include "lsd.h" (not needed) + * make all interface functions static + * comment out unused interface functions + * catch (unlikely) division by zero near line 2035 + * rename rad1 and rad2 to radius1 and radius2 in reduce_region_radius() + * to avoid naming conflict in windows build + * + */ + +/* TODO: LSD employs intensive sanity checks of input data and allocation + * results. In case of errors it will terminate the program. On the one side + * this is not optimal for a module within darktable - it should better + * report errors upstream where they should be handled properly. On the other + * hand the kind of error which could be triggered in LSD would make it very unlikely + * that the darktable process could survive anyhow. + */ + +// clang-format off + +/*================================================================================== + * begin LSD code version 1.6. downloaded on January 30, 2016 + *==================================================================================*/ + +/*---------------------------------------------------------------------------- + + LSD - Line Segment Detector on digital images + + This code is part of the following publication and was subject + to peer review: + + "LSD: a Line Segment Detector" by Rafael Grompone von Gioi, + Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, + Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd + http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd + + Copyright (c) 2007-2011 rafael grompone von gioi + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + ----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** @file lsd.c + LSD module code + @author rafael grompone von gioi + */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** @mainpage LSD code documentation + + This is an implementation of the Line Segment Detector described + in the paper: + + "LSD: A Fast Line Segment Detector with a False Detection Control" + by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, + and Gregory Randall, IEEE Transactions on Pattern Analysis and + Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010. + + and in more details in the CMLA Technical Report: + + "LSD: A Line Segment Detector, Technical Report", + by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, + Gregory Randall, CMLA, ENS Cachan, 2010. + + The version implemented here includes some further improvements + described in the following publication, of which this code is part: + + "LSD: a Line Segment Detector" by Rafael Grompone von Gioi, + Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, + Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd + http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd + + The module's main function is lsd(). + + The source code is contained in two files: lsd.h and lsd.c. + + HISTORY: + - version 1.6 - nov 2011: + - changes in the interface, + - max_grad parameter removed, + - the factor 11 was added to the number of test + to consider the different precision values + tested, + - a minor bug corrected in the gradient sorting + code, + - the algorithm now also returns p and log_nfa + for each detection, + - a minor bug was corrected in the image scaling, + - the angle comparison in "isaligned" changed + from < to <=, + - "eps" variable renamed "log_eps", + - "lsd_scale_region" interface was added, + - minor changes to comments. + - version 1.5 - dec 2010: Changes in 'refine', -W option added, + and more comments added. + - version 1.4 - jul 2010: lsd_scale interface added and doxygen doc. + - version 1.3 - feb 2010: Multiple bug correction and improved code. + - version 1.2 - dec 2009: First full Ansi C Language version. + - version 1.1 - sep 2009: Systematic subsampling to scale 0.8 and + correction to partially handle "angle problem". + - version 1.0 - jan 2009: First complete Megawave2 and Ansi C Language + version. + + @author rafael grompone von gioi + */ +/*----------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +//#include "lsd.h" + +/** ln(10) */ +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 +#endif /* !M_LN10 */ + +/** PI */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif /* !M_PI */ + +#ifndef FALSE +#define FALSE 0 +#endif /* !FALSE */ + +#ifndef TRUE +#define TRUE 1 +#endif /* !TRUE */ + +/** Label for pixels with undefined gradient. */ +#define NOTDEF -1024.0 + +/** 3/2 pi */ +#define M_3_2_PI 4.71238898038 + +/** 2 pi */ +#define M_2__PI 6.28318530718 + +/** Label for pixels not used in yet. */ +#define NOTUSED 0 + +/** Label for pixels already used in detection. */ +#define USED 1 + +/*----------------------------------------------------------------------------*/ +/** Chained list of coordinates. + */ +struct coorlist +{ + int x,y; + struct coorlist * next; +}; + +/*----------------------------------------------------------------------------*/ +/** A point (or pixel). + */ +struct point {int x,y;}; + + +/*----------------------------------------------------------------------------*/ +/*------------------------- Miscellaneous functions --------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** Fatal error, print a message to standard-error output and exit. + */ +static void error(const char * msg) +{ + fprintf(stderr,"LSD Error: %s\n",msg); + exit(EXIT_FAILURE); +} + +/*----------------------------------------------------------------------------*/ +/** Doubles relative error factor + */ +#define RELATIVE_ERROR_FACTOR 100.0 + +/*----------------------------------------------------------------------------*/ +/** Compare doubles by relative error. + + The resulting rounding error after floating point computations + depend on the specific operations done. The same number computed by + different algorithms could present different rounding errors. For a + useful comparison, an estimation of the relative rounding error + should be considered and compared to a factor times EPS. The factor + should be related to the cumulated rounding error in the chain of + computation. Here, as a simplification, a fixed factor is used. + */ +static int double_equal(double a, double b) +{ + double abs_diff,aa,bb,abs_max; + + /* trivial case */ + if( a == b ) return TRUE; + + abs_diff = fabs(a-b); + aa = fabs(a); + bb = fabs(b); + abs_max = aa > bb ? aa : bb; + + /* DBL_MIN is the smallest normalized number, thus, the smallest + number whose relative error is bounded by DBL_EPSILON. For + smaller numbers, the same quantization steps as for DBL_MIN + are used. Then, for smaller numbers, a meaningful "relative" + error should be computed by dividing the difference by DBL_MIN. */ + if( abs_max < DBL_MIN ) abs_max = DBL_MIN; + + /* equal if relative error <= factor x eps */ + return (abs_diff / abs_max) <= (RELATIVE_ERROR_FACTOR * DBL_EPSILON); +} + +/*----------------------------------------------------------------------------*/ +/** Computes Euclidean distance between point (x1,y1) and point (x2,y2). + */ +static double dist(double x1, double y1, double x2, double y2) +{ + return sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ); +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------- 'list of n-tuple' data type ------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** 'list of n-tuple' data type + + The i-th component of the j-th n-tuple of an n-tuple list 'ntl' + is accessed with: + + ntl->values[ i + j * ntl->dim ] + + The dimension of the n-tuple (n) is: + + ntl->dim + + The number of n-tuples in the list is: + + ntl->size + + The maximum number of n-tuples that can be stored in the + list with the allocated memory at a given time is given by: + + ntl->max_size + */ +typedef struct ntuple_list_s +{ + unsigned int size; + unsigned int max_size; + unsigned int dim; + double * values; +} * ntuple_list; + +/*----------------------------------------------------------------------------*/ +/** Free memory used in n-tuple 'in'. + */ +static void free_ntuple_list(ntuple_list in) +{ + if( in == NULL || in->values == NULL ) + error("free_ntuple_list: invalid n-tuple input."); + free( (void *) in->values ); + free( (void *) in ); +} + +/*----------------------------------------------------------------------------*/ +/** Create an n-tuple list and allocate memory for one element. + @param dim the dimension (n) of the n-tuple. + */ +static ntuple_list new_ntuple_list(unsigned int dim) +{ + ntuple_list n_tuple; + + /* check parameters */ + if( dim == 0 ) error("new_ntuple_list: 'dim' must be positive."); + + /* get memory for list structure */ + n_tuple = (ntuple_list) malloc( sizeof(struct ntuple_list_s) ); + if( n_tuple == NULL ) error("not enough memory."); + + /* initialize list */ + n_tuple->size = 0; + n_tuple->max_size = 1; + n_tuple->dim = dim; + + /* get memory for tuples */ + n_tuple->values = (double *) malloc( sizeof(double) * dim*n_tuple->max_size ); + if( n_tuple->values == NULL ) error("not enough memory."); + + return n_tuple; +} + +/*----------------------------------------------------------------------------*/ +/** Enlarge the allocated memory of an n-tuple list. + */ +static void enlarge_ntuple_list(ntuple_list n_tuple) +{ + /* check parameters */ + if( n_tuple == NULL || n_tuple->values == NULL || n_tuple->max_size == 0 ) + error("enlarge_ntuple_list: invalid n-tuple."); + + /* duplicate number of tuples */ + n_tuple->max_size *= 2; + + /* realloc memory */ + n_tuple->values = (double *) realloc( (void *) n_tuple->values, + sizeof(double) * n_tuple->dim * n_tuple->max_size ); + if( n_tuple->values == NULL ) error("not enough memory."); +} + +/*----------------------------------------------------------------------------*/ +/** Add a 7-tuple to an n-tuple list. + */ +static void add_7tuple( ntuple_list out, double v1, double v2, double v3, + double v4, double v5, double v6, double v7 ) +{ + /* check parameters */ + if( out == NULL ) error("add_7tuple: invalid n-tuple input."); + if( out->dim != 7 ) error("add_7tuple: the n-tuple must be a 7-tuple."); + + /* if needed, alloc more tuples to 'out' */ + if( out->size == out->max_size ) enlarge_ntuple_list(out); + if( out->values == NULL ) error("add_7tuple: invalid n-tuple input."); + + /* add new 7-tuple */ + out->values[ out->size * out->dim + 0 ] = v1; + out->values[ out->size * out->dim + 1 ] = v2; + out->values[ out->size * out->dim + 2 ] = v3; + out->values[ out->size * out->dim + 3 ] = v4; + out->values[ out->size * out->dim + 4 ] = v5; + out->values[ out->size * out->dim + 5 ] = v6; + out->values[ out->size * out->dim + 6 ] = v7; + + /* update number of tuples counter */ + out->size++; +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------- Image Data Types -----------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** char image data type + + The pixel value at (x,y) is accessed by: + + image->data[ x + y * image->xsize ] + + with x and y integer. + */ +typedef struct image_char_s +{ + unsigned char * data; + unsigned int xsize,ysize; +} * image_char; + +/*----------------------------------------------------------------------------*/ +/** Free memory used in image_char 'i'. + */ +static void free_image_char(image_char i) +{ + if( i == NULL || i->data == NULL ) + error("free_image_char: invalid input image."); + free( (void *) i->data ); + free( (void *) i ); +} + +/*----------------------------------------------------------------------------*/ +/** Create a new image_char of size 'xsize' times 'ysize'. + */ +static image_char new_image_char(unsigned int xsize, unsigned int ysize) +{ + image_char image; + + /* check parameters */ + if( xsize == 0 || ysize == 0 ) error("new_image_char: invalid image size."); + + /* get memory */ + image = (image_char) malloc( sizeof(struct image_char_s) ); + if( image == NULL ) error("not enough memory."); + image->data = (unsigned char *) calloc( (size_t) (xsize*ysize), + sizeof(unsigned char) ); + if( image->data == NULL ) error("not enough memory."); + + /* set image size */ + image->xsize = xsize; + image->ysize = ysize; + + return image; +} + +/*----------------------------------------------------------------------------*/ +/** Create a new image_char of size 'xsize' times 'ysize', + initialized to the value 'fill_value'. + */ +static image_char new_image_char_ini( unsigned int xsize, unsigned int ysize, + unsigned char fill_value ) +{ + image_char image = new_image_char(xsize,ysize); /* create image */ + unsigned int N = xsize*ysize; + unsigned int i; + + /* check parameters */ + if( image == NULL || image->data == NULL ) + error("new_image_char_ini: invalid image."); + + /* initialize */ + for(i=0; idata[i] = fill_value; + + return image; +} + +/*----------------------------------------------------------------------------*/ +/** int image data type + + The pixel value at (x,y) is accessed by: + + image->data[ x + y * image->xsize ] + + with x and y integer. + */ +typedef struct image_int_s +{ + int * data; + unsigned int xsize,ysize; +} * image_int; + +/*----------------------------------------------------------------------------*/ +/** Create a new image_int of size 'xsize' times 'ysize'. + */ +static image_int new_image_int(unsigned int xsize, unsigned int ysize) +{ + image_int image; + + /* check parameters */ + if( xsize == 0 || ysize == 0 ) error("new_image_int: invalid image size."); + + /* get memory */ + image = (image_int) malloc( sizeof(struct image_int_s) ); + if( image == NULL ) error("not enough memory."); + image->data = (int *) calloc( (size_t) (xsize*ysize), sizeof(int) ); + if( image->data == NULL ) error("not enough memory."); + + /* set image size */ + image->xsize = xsize; + image->ysize = ysize; + + return image; +} + +/*----------------------------------------------------------------------------*/ +/** Create a new image_int of size 'xsize' times 'ysize', + initialized to the value 'fill_value'. + */ +static image_int new_image_int_ini( unsigned int xsize, unsigned int ysize, + int fill_value ) +{ + image_int image = new_image_int(xsize,ysize); /* create image */ + unsigned int N = xsize*ysize; + unsigned int i; + + /* initialize */ + for(i=0; idata[i] = fill_value; + + return image; +} + +/*----------------------------------------------------------------------------*/ +/** double image data type + + The pixel value at (x,y) is accessed by: + + image->data[ x + y * image->xsize ] + + with x and y integer. + */ +typedef struct image_double_s +{ + double * data; + unsigned int xsize,ysize; +} * image_double; + +/*----------------------------------------------------------------------------*/ +/** Free memory used in image_double 'i'. + */ +static void free_image_double(image_double i) +{ + if( i == NULL || i->data == NULL ) + error("free_image_double: invalid input image."); + free( (void *) i->data ); + free( (void *) i ); +} + +/*----------------------------------------------------------------------------*/ +/** Create a new image_double of size 'xsize' times 'ysize'. + */ +static image_double new_image_double(unsigned int xsize, unsigned int ysize) +{ + image_double image; + + /* check parameters */ + if( xsize == 0 || ysize == 0 ) error("new_image_double: invalid image size."); + + /* get memory */ + image = (image_double) malloc( sizeof(struct image_double_s) ); + if( image == NULL ) error("not enough memory."); + image->data = (double *) calloc( (size_t) (xsize*ysize), sizeof(double) ); + if( image->data == NULL ) error("not enough memory."); + + /* set image size */ + image->xsize = xsize; + image->ysize = ysize; + + return image; +} + +/*----------------------------------------------------------------------------*/ +/** Create a new image_double of size 'xsize' times 'ysize' + with the data pointed by 'data'. + */ +static image_double new_image_double_ptr( unsigned int xsize, + unsigned int ysize, double * data ) +{ + image_double image; + + /* check parameters */ + if( xsize == 0 || ysize == 0 ) + error("new_image_double_ptr: invalid image size."); + if( data == NULL ) error("new_image_double_ptr: NULL data pointer."); + + /* get memory */ + image = (image_double) malloc( sizeof(struct image_double_s) ); + if( image == NULL ) error("not enough memory."); + + /* set image */ + image->xsize = xsize; + image->ysize = ysize; + image->data = data; + + return image; +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------- Gaussian filter ------------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** Compute a Gaussian kernel of length 'kernel->dim', + standard deviation 'sigma', and centered at value 'mean'. + + For example, if mean=0.5, the Gaussian will be centered + in the middle point between values 'kernel->values[0]' + and 'kernel->values[1]'. + */ +static void gaussian_kernel(ntuple_list kernel, double sigma, double mean) +{ + double sum = 0.0; + double val; + unsigned int i; + + /* check parameters */ + if( kernel == NULL || kernel->values == NULL ) + error("gaussian_kernel: invalid n-tuple 'kernel'."); + if( sigma <= 0.0 ) error("gaussian_kernel: 'sigma' must be positive."); + + /* compute Gaussian kernel */ + if( kernel->max_size < 1 ) enlarge_ntuple_list(kernel); + kernel->size = 1; + for(i=0;idim;i++) + { + val = ( (double) i - mean ) / sigma; + kernel->values[i] = exp( -0.5 * val * val ); + sum += kernel->values[i]; + } + + /* normalization */ + if( sum >= 0.0 ) for(i=0;idim;i++) kernel->values[i] /= sum; +} + +/*----------------------------------------------------------------------------*/ +/** Scale the input image 'in' by a factor 'scale' by Gaussian sub-sampling. + + For example, scale=0.8 will give a result at 80% of the original size. + + The image is convolved with a Gaussian kernel + @f[ + G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} + @f] + before the sub-sampling to prevent aliasing. + + The standard deviation sigma given by: + - sigma = sigma_scale / scale, if scale < 1.0 + - sigma = sigma_scale, if scale >= 1.0 + + To be able to sub-sample at non-integer steps, some interpolation + is needed. In this implementation, the interpolation is done by + the Gaussian kernel, so both operations (filtering and sampling) + are done at the same time. The Gaussian kernel is computed + centered on the coordinates of the required sample. In this way, + when applied, it gives directly the result of convolving the image + with the kernel and interpolated to that particular position. + + A fast algorithm is done using the separability of the Gaussian + kernel. Applying the 2D Gaussian kernel is equivalent to applying + first a horizontal 1D Gaussian kernel and then a vertical 1D + Gaussian kernel (or the other way round). The reason is that + @f[ + G(x,y) = G(x) * G(y) + @f] + where + @f[ + G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}. + @f] + The algorithm first applies a combined Gaussian kernel and sampling + in the x axis, and then the combined Gaussian kernel and sampling + in the y axis. + */ +static image_double gaussian_sampler( image_double in, double scale, + double sigma_scale ) +{ + image_double aux,out; + ntuple_list kernel; + unsigned int N,M,h,n,x,y,i; + int xc,yc,j,double_x_size,double_y_size; + double sigma,xx,yy,sum,prec; + + /* check parameters */ + if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 ) + error("gaussian_sampler: invalid image."); + if( scale <= 0.0 ) error("gaussian_sampler: 'scale' must be positive."); + if( sigma_scale <= 0.0 ) + error("gaussian_sampler: 'sigma_scale' must be positive."); + + /* compute new image size and get memory for images */ + if( in->xsize * scale > (double) UINT_MAX || + in->ysize * scale > (double) UINT_MAX ) + error("gaussian_sampler: the output image size exceeds the handled size."); + N = (unsigned int) ceil( in->xsize * scale ); + M = (unsigned int) ceil( in->ysize * scale ); + aux = new_image_double(N,in->ysize); + out = new_image_double(N,M); + + /* sigma, kernel size and memory for the kernel */ + sigma = scale < 1.0 ? sigma_scale / scale : sigma_scale; + /* + The size of the kernel is selected to guarantee that the + the first discarded term is at least 10^prec times smaller + than the central value. For that, h should be larger than x, with + e^(-x^2/2sigma^2) = 1/10^prec. + Then, + x = sigma * sqrt( 2 * prec * ln(10) ). + */ + prec = 3.0; + h = (unsigned int) ceil( sigma * sqrt( 2.0 * prec * log(10.0) ) ); + n = 1+2*h; /* kernel size */ + kernel = new_ntuple_list(n); + + /* auxiliary double image size variables */ + double_x_size = (int) (2 * in->xsize); + double_y_size = (int) (2 * in->ysize); + + /* First subsampling: x axis */ + for(x=0;xxsize;x++) + { + /* + x is the coordinate in the new image. + xx is the corresponding x-value in the original size image. + xc is the integer value, the pixel coordinate of xx. + */ + xx = (double) x / scale; + /* coordinate (0.0,0.0) is in the center of pixel (0,0), + so the pixel with xc=0 get the values of xx from -0.5 to 0.5 */ + xc = (int) floor( xx + 0.5 ); + gaussian_kernel( kernel, sigma, (double) h + xx - (double) xc ); + /* the kernel must be computed for each x because the fine + offset xx-xc is different in each case */ + + for(y=0;yysize;y++) + { + sum = 0.0; + for(i=0;idim;i++) + { + j = xc - h + i; + + /* symmetry boundary condition */ + while( j < 0 ) j += double_x_size; + while( j >= double_x_size ) j -= double_x_size; + if( j >= (int) in->xsize ) j = double_x_size-1-j; + + sum += in->data[ j + y * in->xsize ] * kernel->values[i]; + } + aux->data[ x + y * aux->xsize ] = sum; + } + } + + /* Second subsampling: y axis */ + for(y=0;yysize;y++) + { + /* + y is the coordinate in the new image. + yy is the corresponding x-value in the original size image. + yc is the integer value, the pixel coordinate of xx. + */ + yy = (double) y / scale; + /* coordinate (0.0,0.0) is in the center of pixel (0,0), + so the pixel with yc=0 get the values of yy from -0.5 to 0.5 */ + yc = (int) floor( yy + 0.5 ); + gaussian_kernel( kernel, sigma, (double) h + yy - (double) yc ); + /* the kernel must be computed for each y because the fine + offset yy-yc is different in each case */ + + for(x=0;xxsize;x++) + { + sum = 0.0; + for(i=0;idim;i++) + { + j = yc - h + i; + + /* symmetry boundary condition */ + while( j < 0 ) j += double_y_size; + while( j >= double_y_size ) j -= double_y_size; + if( j >= (int) in->ysize ) j = double_y_size-1-j; + + sum += aux->data[ x + j * aux->xsize ] * kernel->values[i]; + } + out->data[ x + y * out->xsize ] = sum; + } + } + + /* free memory */ + free_ntuple_list(kernel); + free_image_double(aux); + + return out; +} + + +/*----------------------------------------------------------------------------*/ +/*--------------------------------- Gradient ---------------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** Computes the direction of the level line of 'in' at each point. + + The result is: + - an image_double with the angle at each pixel, or NOTDEF if not defined. + - the image_double 'modgrad' (a pointer is passed as argument) + with the gradient magnitude at each point. + - a list of pixels 'list_p' roughly ordered by decreasing + gradient magnitude. (The order is made by classifying points + into bins by gradient magnitude. The parameters 'n_bins' and + 'max_grad' specify the number of bins and the gradient modulus + at the highest bin. The pixels in the list would be in + decreasing gradient magnitude, up to a precision of the size of + the bins.) + - a pointer 'mem_p' to the memory used by 'list_p' to be able to + free the memory when it is not used anymore. + */ +static image_double ll_angle( image_double in, double threshold, + struct coorlist ** list_p, void ** mem_p, + image_double * modgrad, unsigned int n_bins ) +{ + image_double g; + unsigned int n,p,x,y,adr,i; + double com1,com2,gx,gy,norm,norm2; + /* the rest of the variables are used for pseudo-ordering + the gradient magnitude values */ + int list_count = 0; + struct coorlist * list; + struct coorlist ** range_l_s; /* array of pointers to start of bin list */ + struct coorlist ** range_l_e; /* array of pointers to end of bin list */ + struct coorlist * start; + struct coorlist * end; + double max_grad = 0.0; + + /* check parameters */ + if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 ) + error("ll_angle: invalid image."); + if( threshold < 0.0 ) error("ll_angle: 'threshold' must be positive."); + if( list_p == NULL ) error("ll_angle: NULL pointer 'list_p'."); + if( mem_p == NULL ) error("ll_angle: NULL pointer 'mem_p'."); + if( modgrad == NULL ) error("ll_angle: NULL pointer 'modgrad'."); + if( n_bins == 0 ) error("ll_angle: 'n_bins' must be positive."); + + /* image size shortcuts */ + n = in->ysize; + p = in->xsize; + + /* allocate output image */ + g = new_image_double(in->xsize,in->ysize); + + /* get memory for the image of gradient modulus */ + *modgrad = new_image_double(in->xsize,in->ysize); + + /* get memory for "ordered" list of pixels */ + list = (struct coorlist *) calloc( (size_t) (n*p), sizeof(struct coorlist) ); + *mem_p = (void *) list; + range_l_s = (struct coorlist **) calloc( (size_t) n_bins, + sizeof(struct coorlist *) ); + range_l_e = (struct coorlist **) calloc( (size_t) n_bins, + sizeof(struct coorlist *) ); + if( list == NULL || range_l_s == NULL || range_l_e == NULL ) + error("not enough memory."); + for(i=0;idata[(n-1)*p+x] = NOTDEF; + for(y=0;ydata[p*y+p-1] = NOTDEF; + + /* compute gradient on the remaining pixels */ + for(x=0;xdata[adr+p+1] - in->data[adr]; + com2 = in->data[adr+1] - in->data[adr+p]; + + gx = com1+com2; /* gradient x component */ + gy = com1-com2; /* gradient y component */ + norm2 = gx*gx+gy*gy; + norm = sqrt( norm2 / 4.0 ); /* gradient norm */ + + (*modgrad)->data[adr] = norm; /* store gradient norm */ + + if( norm <= threshold ) /* norm too small, gradient no defined */ + g->data[adr] = NOTDEF; /* gradient angle not defined */ + else + { + /* gradient angle computation */ + g->data[adr] = atan2(gx,-gy); + + /* look for the maximum of the gradient */ + if( norm > max_grad ) max_grad = norm; + } + } + + /* compute histogram of gradient values */ + for(x=0;xdata[y*p+x]; + + /* store the point in the right bin according to its norm */ + i = (unsigned int) (norm * (double) n_bins / max_grad); + if( i >= n_bins ) i = n_bins-1; + if( range_l_e[i] == NULL ) + range_l_s[i] = range_l_e[i] = list+list_count++; + else + { + range_l_e[i]->next = list+list_count; + range_l_e[i] = list+list_count++; + } + range_l_e[i]->x = (int) x; + range_l_e[i]->y = (int) y; + range_l_e[i]->next = NULL; + } + + /* Make the list of pixels (almost) ordered by norm value. + It starts by the larger bin, so the list starts by the + pixels with the highest gradient value. Pixels would be ordered + by norm value, up to a precision given by max_grad/n_bins. + */ + for(i=n_bins-1; i>0 && range_l_s[i]==NULL; i--); + start = range_l_s[i]; + end = range_l_e[i]; + if( start != NULL ) + while(i>0) + { + --i; + if( range_l_s[i] != NULL ) + { + end->next = range_l_s[i]; + end = range_l_e[i]; + } + } + *list_p = start; + + /* free memory */ + free( (void *) range_l_s ); + free( (void *) range_l_e ); + + return g; +} + +/*----------------------------------------------------------------------------*/ +/** Is point (x,y) aligned to angle theta, up to precision 'prec'? + */ +static int isaligned( int x, int y, image_double angles, double theta, + double prec ) +{ + double a; + + /* check parameters */ + if( angles == NULL || angles->data == NULL ) + error("isaligned: invalid image 'angles'."); + if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize ) + error("isaligned: (x,y) out of the image."); + if( prec < 0.0 ) error("isaligned: 'prec' must be positive."); + + /* angle at pixel (x,y) */ + a = angles->data[ x + y * angles->xsize ]; + + /* pixels whose level-line angle is not defined + are considered as NON-aligned */ + if( a == NOTDEF ) return FALSE; /* there is no need to call the function + 'double_equal' here because there is + no risk of problems related to the + comparison doubles, we are only + interested in the exact NOTDEF value */ + + /* it is assumed that 'theta' and 'a' are in the range [-pi,pi] */ + theta -= a; + if( theta < 0.0 ) theta = -theta; + if( theta > M_3_2_PI ) + { + theta -= M_2__PI; + if( theta < 0.0 ) theta = -theta; + } + + return theta <= prec; +} + +/*----------------------------------------------------------------------------*/ +/** Absolute value angle difference. + */ +static double angle_diff(double a, double b) +{ + a -= b; + while( a <= -M_PI ) a += M_2__PI; + while( a > M_PI ) a -= M_2__PI; + if( a < 0.0 ) a = -a; + return a; +} + +/*----------------------------------------------------------------------------*/ +/** Signed angle difference. + */ +static double angle_diff_signed(double a, double b) +{ + a -= b; + while( a <= -M_PI ) a += M_2__PI; + while( a > M_PI ) a -= M_2__PI; + return a; +} + + +/*----------------------------------------------------------------------------*/ +/*----------------------------- NFA computation ------------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** Computes the natural logarithm of the absolute value of + the gamma function of x using the Lanczos approximation. + See http://www.rskey.org/gamma.htm + + The formula used is + @f[ + \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) } + (x+5.5)^{x+0.5} e^{-(x+5.5)} + @f] + so + @f[ + \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right) + + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n) + @f] + and + q0 = 75122.6331530, + q1 = 80916.6278952, + q2 = 36308.2951477, + q3 = 8687.24529705, + q4 = 1168.92649479, + q5 = 83.8676043424, + q6 = 2.50662827511. + */ +static double log_gamma_lanczos(double x) +{ + static double q[7] = { 75122.6331530, 80916.6278952, 36308.2951477, + 8687.24529705, 1168.92649479, 83.8676043424, + 2.50662827511 }; + double a = (x+0.5) * log(x+5.5) - (x+5.5); + double b = 0.0; + int n; + + for(n=0;n<7;n++) + { + a -= log( x + (double) n ); + b += q[n] * pow( x, (double) n ); + } + return a + log(b); +} + +/*----------------------------------------------------------------------------*/ +/** Computes the natural logarithm of the absolute value of + the gamma function of x using Windschitl method. + See http://www.rskey.org/gamma.htm + + The formula used is + @f[ + \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e} + \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x + @f] + so + @f[ + \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x + + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right). + @f] + This formula is a good approximation when x > 15. + */ +static double log_gamma_windschitl(double x) +{ + return 0.918938533204673 + (x-0.5)*log(x) - x + + 0.5*x*log( x*sinh(1/x) + 1/(810.0*pow(x,6.0)) ); +} + +/*----------------------------------------------------------------------------*/ +/** Computes the natural logarithm of the absolute value of + the gamma function of x. When x>15 use log_gamma_windschitl(), + otherwise use log_gamma_lanczos(). + */ +#define log_gamma(x) ((x)>15.0?log_gamma_windschitl(x):log_gamma_lanczos(x)) + +/*----------------------------------------------------------------------------*/ +/** Size of the table to store already computed inverse values. + */ +#define TABSIZE 100000 + +// clang-format on + +static double *inv = NULL; /* table to keep computed inverse values */ + +__attribute__((constructor)) static void invConstructor() +{ + if(inv) return; + inv = (double *)malloc(sizeof(double) * TABSIZE); +} + +__attribute__((destructor)) static void invDestructor() +{ + free(inv); + inv = NULL; +} + +// clang-format off + +/*----------------------------------------------------------------------------*/ +/** Computes -log10(NFA). + + NFA stands for Number of False Alarms: + @f[ + \mathrm{NFA} = NT \cdot B(n,k,p) + @f] + + - NT - number of tests + - B(n,k,p) - tail of binomial distribution with parameters n,k and p: + @f[ + B(n,k,p) = \sum_{j=k}^n + \left(\begin{array}{c}n\\j\end{array}\right) + p^{j} (1-p)^{n-j} + @f] + + The value -log10(NFA) is equivalent but more intuitive than NFA: + - -1 corresponds to 10 mean false alarms + - 0 corresponds to 1 mean false alarm + - 1 corresponds to 0.1 mean false alarms + - 2 corresponds to 0.01 mean false alarms + - ... + + Used this way, the bigger the value, better the detection, + and a logarithmic scale is used. + + @param n,k,p binomial parameters. + @param logNT logarithm of Number of Tests + + The computation is based in the gamma function by the following + relation: + @f[ + \left(\begin{array}{c}n\\k\end{array}\right) + = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }. + @f] + We use efficient algorithms to compute the logarithm of + the gamma function. + + To make the computation faster, not all the sum is computed, part + of the terms are neglected based on a bound to the error obtained + (an error of 10% in the result is accepted). + */ +static double nfa(int n, int k, double p, double logNT) +{ + double tolerance = 0.1; /* an error of 10% in the result is accepted */ + double log1term,term,bin_term,mult_term,bin_tail,err,p_term; + int i; + + /* check parameters */ + if( n<0 || k<0 || k>n || p<=0.0 || p>=1.0 ) + error("nfa: wrong n, k or p values."); + + /* trivial cases */ + if( n==0 || k==0 ) return -logNT; + if( n==k ) return -logNT - (double) n * log10(p); + + /* probability term */ + p_term = p / (1.0-p); + + /* compute the first term of the series */ + /* + binomial_tail(n,k,p) = sum_{i=k}^n bincoef(n,i) * p^i * (1-p)^{n-i} + where bincoef(n,i) are the binomial coefficients. + But + bincoef(n,k) = gamma(n+1) / ( gamma(k+1) * gamma(n-k+1) ). + We use this to compute the first term. Actually the log of it. + */ + log1term = log_gamma( (double) n + 1.0 ) - log_gamma( (double) k + 1.0 ) + - log_gamma( (double) (n-k) + 1.0 ) + + (double) k * log(p) + (double) (n-k) * log(1.0-p); + term = exp(log1term); + + /* in some cases no more computations are needed */ + if( double_equal(term,0.0) ) /* the first term is almost zero */ + { + if( (double) k > (double) n * p ) /* at begin or end of the tail? */ + return -log1term / M_LN10 - logNT; /* end: use just the first term */ + else + return -logNT; /* begin: the tail is roughly 1 */ + } + + /* compute more terms if needed */ + bin_tail = term; + for(i=k+1;i<=n;i++) + { + /* + As + term_i = bincoef(n,i) * p^i * (1-p)^(n-i) + and + bincoef(n,i)/bincoef(n,i-1) = n-1+1 / i, + then, + term_i / term_i-1 = (n-i+1)/i * p/(1-p) + and + term_i = term_i-1 * (n-i+1)/i * p/(1-p). + 1/i is stored in a table as they are computed, + because divisions are expensive. + p/(1-p) is computed only once and stored in 'p_term'. + */ + bin_term = (double) (n-i+1) * ( ii. + Then, the error on the binomial tail when truncated at + the i term can be bounded by a geometric series of form + term_i * sum mult_term_i^j. */ + err = term * ( ( 1.0 - pow( mult_term, (double) (n-i+1) ) ) / + (1.0-mult_term) - 1.0 ); + + /* One wants an error at most of tolerance*final_result, or: + tolerance * abs(-log10(bin_tail)-logNT). + Now, the error that can be accepted on bin_tail is + given by tolerance*final_result divided by the derivative + of -log10(x) when x=bin_tail. that is: + tolerance * abs(-log10(bin_tail)-logNT) / (1/bin_tail) + Finally, we truncate the tail if the error is less than: + tolerance * abs(-log10(bin_tail)-logNT) * bin_tail */ + if( err < tolerance * fabs(-log10(bin_tail)-logNT) * bin_tail ) break; + } + } + return -log10(bin_tail) - logNT; +} + + +/*----------------------------------------------------------------------------*/ +/*--------------------------- Rectangle structure ----------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** Rectangle structure: line segment with width. + */ +struct rect +{ + double x1,y1,x2,y2; /* first and second point of the line segment */ + double width; /* rectangle width */ + double x,y; /* center of the rectangle */ + double theta; /* angle */ + double dx,dy; /* (dx,dy) is vector oriented as the line segment */ + double prec; /* tolerance angle */ + double p; /* probability of a point with angle within 'prec' */ +}; + +/*----------------------------------------------------------------------------*/ +/** Copy one rectangle structure to another. + */ +static void rect_copy(struct rect * in, struct rect * out) +{ + /* check parameters */ + if( in == NULL || out == NULL ) error("rect_copy: invalid 'in' or 'out'."); + + /* copy values */ + out->x1 = in->x1; + out->y1 = in->y1; + out->x2 = in->x2; + out->y2 = in->y2; + out->width = in->width; + out->x = in->x; + out->y = in->y; + out->theta = in->theta; + out->dx = in->dx; + out->dy = in->dy; + out->prec = in->prec; + out->p = in->p; +} + +/*----------------------------------------------------------------------------*/ +/** Rectangle points iterator. + + The integer coordinates of pixels inside a rectangle are + iteratively explored. This structure keep track of the process and + functions ri_ini(), ri_inc(), ri_end(), and ri_del() are used in + the process. An example of how to use the iterator is as follows: + \code + + struct rect * rec = XXX; // some rectangle + rect_iter * i; + for( i=ri_ini(rec); !ri_end(i); ri_inc(i) ) + { + // your code, using 'i->x' and 'i->y' as coordinates + } + ri_del(i); // delete iterator + + \endcode + The pixels are explored 'column' by 'column', where we call + 'column' a set of pixels with the same x value that are inside the + rectangle. The following is an schematic representation of a + rectangle, the 'column' being explored is marked by colons, and + the current pixel being explored is 'x,y'. + \verbatim + + vx[1],vy[1] + * * + * * + * * + * ye + * : * + vx[0],vy[0] : * + * : * + * x,y * + * : * + * : vx[2],vy[2] + * : * + y ys * + ^ * * + | * * + | * * + +---> x vx[3],vy[3] + + \endverbatim + The first 'column' to be explored is the one with the smaller x + value. Each 'column' is explored starting from the pixel of the + 'column' (inside the rectangle) with the smallest y value. + + The four corners of the rectangle are stored in order that rotates + around the corners at the arrays 'vx[]' and 'vy[]'. The first + point is always the one with smaller x value. + + 'x' and 'y' are the coordinates of the pixel being explored. 'ys' + and 'ye' are the start and end values of the current column being + explored. So, 'ys' < 'ye'. + */ +typedef struct +{ + double vx[4]; /* rectangle's corner X coordinates in circular order */ + double vy[4]; /* rectangle's corner Y coordinates in circular order */ + double ys,ye; /* start and end Y values of current 'column' */ + int x,y; /* coordinates of currently explored pixel */ +} rect_iter; + +/*----------------------------------------------------------------------------*/ +/** Interpolate y value corresponding to 'x' value given, in + the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the smaller + of 'y1' and 'y2'. + + The following restrictions are required: + - x1 <= x2 + - x1 <= x + - x <= x2 + */ +static double inter_low(double x, double x1, double y1, double x2, double y2) +{ + /* check parameters */ + if( x1 > x2 || x < x1 || x > x2 ) + error("inter_low: unsuitable input, 'x1>x2' or 'xx2'."); + + /* interpolation */ + if( double_equal(x1,x2) && y1y2 ) return y2; + return y1 + (x-x1) * (y2-y1) / (x2-x1); +} + +/*----------------------------------------------------------------------------*/ +/** Interpolate y value corresponding to 'x' value given, in + the line 'x1,y1' to 'x2,y2'; if 'x1=x2' return the larger + of 'y1' and 'y2'. + + The following restrictions are required: + - x1 <= x2 + - x1 <= x + - x <= x2 + */ +static double inter_hi(double x, double x1, double y1, double x2, double y2) +{ + /* check parameters */ + if( x1 > x2 || x < x1 || x > x2 ) + error("inter_hi: unsuitable input, 'x1>x2' or 'xx2'."); + + /* interpolation */ + if( double_equal(x1,x2) && y1y2 ) return y1; + return y1 + (x-x1) * (y2-y1) / (x2-x1); +} + +/*----------------------------------------------------------------------------*/ +/** Free memory used by a rectangle iterator. + */ +static void ri_del(rect_iter * iter) +{ + if( iter == NULL ) error("ri_del: NULL iterator."); + free( (void *) iter ); +} + +/*----------------------------------------------------------------------------*/ +/** Check if the iterator finished the full iteration. + + See details in \ref rect_iter + */ +static int ri_end(rect_iter * i) +{ + /* check input */ + if( i == NULL ) error("ri_end: NULL iterator."); + + /* if the current x value is larger than the largest + x value in the rectangle (vx[2]), we know the full + exploration of the rectangle is finished. */ + return (double)(i->x) > i->vx[2]; +} + +/*----------------------------------------------------------------------------*/ +/** Increment a rectangle iterator. + + See details in \ref rect_iter + */ +static void ri_inc(rect_iter * i) +{ + /* check input */ + if( i == NULL ) error("ri_inc: NULL iterator."); + + /* if not at end of exploration, + increase y value for next pixel in the 'column' */ + if( !ri_end(i) ) i->y++; + + /* if the end of the current 'column' is reached, + and it is not the end of exploration, + advance to the next 'column' */ + while( (double) (i->y) > i->ye && !ri_end(i) ) + { + /* increase x, next 'column' */ + i->x++; + + /* if end of exploration, return */ + if( ri_end(i) ) return; + + /* update lower y limit (start) for the new 'column'. + + We need to interpolate the y value that corresponds to the + lower side of the rectangle. The first thing is to decide if + the corresponding side is + + vx[0],vy[0] to vx[3],vy[3] or + vx[3],vy[3] to vx[2],vy[2] + + Then, the side is interpolated for the x value of the + 'column'. But, if the side is vertical (as it could happen if + the rectangle is vertical and we are dealing with the first + or last 'columns') then we pick the lower value of the side + by using 'inter_low'. + */ + if( (double) i->x < i->vx[3] ) + i->ys = inter_low((double)i->x,i->vx[0],i->vy[0],i->vx[3],i->vy[3]); + else + i->ys = inter_low((double)i->x,i->vx[3],i->vy[3],i->vx[2],i->vy[2]); + + /* update upper y limit (end) for the new 'column'. + + We need to interpolate the y value that corresponds to the + upper side of the rectangle. The first thing is to decide if + the corresponding side is + + vx[0],vy[0] to vx[1],vy[1] or + vx[1],vy[1] to vx[2],vy[2] + + Then, the side is interpolated for the x value of the + 'column'. But, if the side is vertical (as it could happen if + the rectangle is vertical and we are dealing with the first + or last 'columns') then we pick the lower value of the side + by using 'inter_low'. + */ + if( (double)i->x < i->vx[1] ) + i->ye = inter_hi((double)i->x,i->vx[0],i->vy[0],i->vx[1],i->vy[1]); + else + i->ye = inter_hi((double)i->x,i->vx[1],i->vy[1],i->vx[2],i->vy[2]); + + /* new y */ + i->y = (int) ceil(i->ys); + } +} + +/*----------------------------------------------------------------------------*/ +/** Create and initialize a rectangle iterator. + + See details in \ref rect_iter + */ +static rect_iter * ri_ini(struct rect * r) +{ + double vx[4],vy[4]; + int n,offset; + rect_iter * i; + + /* check parameters */ + if( r == NULL ) error("ri_ini: invalid rectangle."); + + /* get memory */ + i = (rect_iter *) malloc(sizeof(rect_iter)); + if( i == NULL ) error("ri_ini: Not enough memory."); + + /* build list of rectangle corners ordered + in a circular way around the rectangle */ + vx[0] = r->x1 - r->dy * r->width / 2.0; + vy[0] = r->y1 + r->dx * r->width / 2.0; + vx[1] = r->x2 - r->dy * r->width / 2.0; + vy[1] = r->y2 + r->dx * r->width / 2.0; + vx[2] = r->x2 + r->dy * r->width / 2.0; + vy[2] = r->y2 - r->dx * r->width / 2.0; + vx[3] = r->x1 + r->dy * r->width / 2.0; + vy[3] = r->y1 - r->dx * r->width / 2.0; + + /* compute rotation of index of corners needed so that the first + point has the smaller x. + + if one side is vertical, thus two corners have the same smaller x + value, the one with the largest y value is selected as the first. + */ + if( r->x1 < r->x2 && r->y1 <= r->y2 ) offset = 0; + else if( r->x1 >= r->x2 && r->y1 < r->y2 ) offset = 1; + else if( r->x1 > r->x2 && r->y1 >= r->y2 ) offset = 2; + else offset = 3; + + /* apply rotation of index. */ + for(n=0; n<4; n++) + { + i->vx[n] = vx[(offset+n)%4]; + i->vy[n] = vy[(offset+n)%4]; + } + + /* Set an initial condition. + + The values are set to values that will cause 'ri_inc' (that will + be called immediately) to initialize correctly the first 'column' + and compute the limits 'ys' and 'ye'. + + 'y' is set to the integer value of vy[0], the starting corner. + + 'ys' and 'ye' are set to very small values, so 'ri_inc' will + notice that it needs to start a new 'column'. + + The smallest integer coordinate inside of the rectangle is + 'ceil(vx[0])'. The current 'x' value is set to that value minus + one, so 'ri_inc' (that will increase x by one) will advance to + the first 'column'. + */ + i->x = (int) ceil(i->vx[0]) - 1; + i->y = (int) ceil(i->vy[0]); + i->ys = i->ye = -DBL_MAX; + + /* advance to the first pixel */ + ri_inc(i); + + return i; +} + +/*----------------------------------------------------------------------------*/ +/** Compute a rectangle's NFA value. + */ +static double rect_nfa(struct rect * rec, image_double angles, double logNT) +{ + rect_iter * i; + int pts = 0; + int alg = 0; + + /* check parameters */ + if( rec == NULL ) error("rect_nfa: invalid rectangle."); + if( angles == NULL ) error("rect_nfa: invalid 'angles'."); + + /* compute the total number of pixels and of aligned points in 'rec' */ + for(i=ri_ini(rec); !ri_end(i); ri_inc(i)) /* rectangle iterator */ + if( i->x >= 0 && i->y >= 0 && + i->x < (int) angles->xsize && i->y < (int) angles->ysize ) + { + ++pts; /* total number of pixels counter */ + if( isaligned(i->x, i->y, angles, rec->theta, rec->prec) ) + ++alg; /* aligned points counter */ + } + ri_del(i); /* delete iterator */ + + return nfa(pts,alg,rec->p,logNT); /* compute NFA value */ +} + + +/*----------------------------------------------------------------------------*/ +/*---------------------------------- Regions ---------------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** Compute region's angle as the principal inertia axis of the region. + + The following is the region inertia matrix A: + @f[ + + A = \left(\begin{array}{cc} + Ixx & Ixy \\ + Ixy & Iyy \\ + \end{array}\right) + + @f] + where + + Ixx = sum_i G(i).(y_i - cx)^2 + + Iyy = sum_i G(i).(x_i - cy)^2 + + Ixy = - sum_i G(i).(x_i - cx).(y_i - cy) + + and + - G(i) is the gradient norm at pixel i, used as pixel's weight. + - x_i and y_i are the coordinates of pixel i. + - cx and cy are the coordinates of the center of th region. + + lambda1 and lambda2 are the eigenvalues of matrix A, + with lambda1 >= lambda2. They are found by solving the + characteristic polynomial: + + det( lambda I - A) = 0 + + that gives: + + lambda1 = ( Ixx + Iyy + sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2 + + lambda2 = ( Ixx + Iyy - sqrt( (Ixx-Iyy)^2 + 4.0*Ixy*Ixy) ) / 2 + + To get the line segment direction we want to get the angle the + eigenvector associated to the smallest eigenvalue. We have + to solve for a,b in: + + a.Ixx + b.Ixy = a.lambda2 + + a.Ixy + b.Iyy = b.lambda2 + + We want the angle theta = atan(b/a). It can be computed with + any of the two equations: + + theta = atan( (lambda2-Ixx) / Ixy ) + + or + + theta = atan( Ixy / (lambda2-Iyy) ) + + When |Ixx| > |Iyy| we use the first, otherwise the second (just to + get better numeric precision). + */ +static double get_theta( struct point * reg, int reg_size, double x, double y, + image_double modgrad, double reg_angle, double prec ) +{ + double lambda,theta,weight; + double Ixx = 0.0; + double Iyy = 0.0; + double Ixy = 0.0; + int i; + + /* check parameters */ + if( reg == NULL ) error("get_theta: invalid region."); + if( reg_size <= 1 ) error("get_theta: region size <= 1."); + if( modgrad == NULL || modgrad->data == NULL ) + error("get_theta: invalid 'modgrad'."); + if( prec < 0.0 ) error("get_theta: 'prec' must be positive."); + + /* compute inertia matrix */ + for(i=0; idata[ reg[i].x + reg[i].y * modgrad->xsize ]; + Ixx += ( (double) reg[i].y - y ) * ( (double) reg[i].y - y ) * weight; + Iyy += ( (double) reg[i].x - x ) * ( (double) reg[i].x - x ) * weight; + Ixy -= ( (double) reg[i].x - x ) * ( (double) reg[i].y - y ) * weight; + } + if( double_equal(Ixx,0.0) && double_equal(Iyy,0.0) && double_equal(Ixy,0.0) ) + error("get_theta: null inertia matrix."); + + /* compute smallest eigenvalue */ + lambda = 0.5 * ( Ixx + Iyy - sqrt( (Ixx-Iyy)*(Ixx-Iyy) + 4.0*Ixy*Ixy ) ); + + /* compute angle */ + theta = fabs(Ixx)>fabs(Iyy) ? atan2(lambda-Ixx,Ixy) : atan2(Ixy,lambda-Iyy); + + /* The previous procedure doesn't cares about orientation, + so it could be wrong by 180 degrees. Here is corrected if necessary. */ + if( angle_diff(theta,reg_angle) > prec ) theta += M_PI; + + return theta; +} + +/*----------------------------------------------------------------------------*/ +/** Computes a rectangle that covers a region of points. + */ +static void region2rect( struct point * reg, int reg_size, + image_double modgrad, double reg_angle, + double prec, double p, struct rect * rec ) +{ + double x,y,dx,dy,l,w,theta,weight,sum,l_min,l_max,w_min,w_max; + int i; + + /* check parameters */ + if( reg == NULL ) error("region2rect: invalid region."); + if( reg_size <= 1 ) error("region2rect: region size <= 1."); + if( modgrad == NULL || modgrad->data == NULL ) + error("region2rect: invalid image 'modgrad'."); + if( rec == NULL ) error("region2rect: invalid 'rec'."); + + /* center of the region: + + It is computed as the weighted sum of the coordinates + of all the pixels in the region. The norm of the gradient + is used as the weight of a pixel. The sum is as follows: + cx = \sum_i G(i).x_i + cy = \sum_i G(i).y_i + where G(i) is the norm of the gradient of pixel i + and x_i,y_i are its coordinates. + */ + x = y = sum = 0.0; + for(i=0; idata[ reg[i].x + reg[i].y * modgrad->xsize ]; + x += (double) reg[i].x * weight; + y += (double) reg[i].y * weight; + sum += weight; + } + if( sum <= 0.0 ) error("region2rect: weights sum equal to zero."); + x /= sum; + y /= sum; + + /* theta */ + theta = get_theta(reg,reg_size,x,y,modgrad,reg_angle,prec); + + /* length and width: + + 'l' and 'w' are computed as the distance from the center of the + region to pixel i, projected along the rectangle axis (dx,dy) and + to the orthogonal axis (-dy,dx), respectively. + + The length of the rectangle goes from l_min to l_max, where l_min + and l_max are the minimum and maximum values of l in the region. + Analogously, the width is selected from w_min to w_max, where + w_min and w_max are the minimum and maximum of w for the pixels + in the region. + */ + dx = cos(theta); + dy = sin(theta); + l_min = l_max = w_min = w_max = 0.0; + for(i=0; i l_max ) l_max = l; + if( l < l_min ) l_min = l; + if( w > w_max ) w_max = w; + if( w < w_min ) w_min = w; + } + + /* store values */ + rec->x1 = x + l_min * dx; + rec->y1 = y + l_min * dy; + rec->x2 = x + l_max * dx; + rec->y2 = y + l_max * dy; + rec->width = w_max - w_min; + rec->x = x; + rec->y = y; + rec->theta = theta; + rec->dx = dx; + rec->dy = dy; + rec->prec = prec; + rec->p = p; + + /* we impose a minimal width of one pixel + + A sharp horizontal or vertical step would produce a perfectly + horizontal or vertical region. The width computed would be + zero. But that corresponds to a one pixels width transition in + the image. + */ + if( rec->width < 1.0 ) rec->width = 1.0; +} + +/*----------------------------------------------------------------------------*/ +/** Build a region of pixels that share the same angle, up to a + tolerance 'prec', starting at point (x,y). + */ +static void region_grow( int x, int y, image_double angles, struct point * reg, + int * reg_size, double * reg_angle, image_char used, + double prec ) +{ + double sumdx,sumdy; + int xx,yy,i; + + /* check parameters */ + if( angles == NULL || angles->data == NULL ) + error("region_grow: invalid image 'angles'."); + if( x < 0 || y < 0 || x >= (int) angles->xsize || y >= (int) angles->ysize ) + error("region_grow: (x,y) out of the image."); + if( reg == NULL ) error("region_grow: invalid 'reg'."); + if( reg_size == NULL ) error("region_grow: invalid pointer 'reg_size'."); + if( reg_angle == NULL ) error("region_grow: invalid pointer 'reg_angle'."); + if( used == NULL || used->data == NULL ) + error("region_grow: invalid image 'used'."); + + /* first point of the region */ + *reg_size = 1; + reg[0].x = x; + reg[0].y = y; + *reg_angle = angles->data[x+y*angles->xsize]; /* region's angle */ + sumdx = cos(*reg_angle); + sumdy = sin(*reg_angle); + used->data[x+y*used->xsize] = USED; + + /* try neighbors as new region points */ + for(i=0; i<*reg_size; i++) + for(xx=reg[i].x-1; xx<=reg[i].x+1; xx++) + for(yy=reg[i].y-1; yy<=reg[i].y+1; yy++) + if( xx>=0 && yy>=0 && xx<(int)used->xsize && yy<(int)used->ysize && + used->data[xx+yy*used->xsize] != USED && + isaligned(xx,yy,angles,*reg_angle,prec) ) + { + /* add point */ + used->data[xx+yy*used->xsize] = USED; + reg[*reg_size].x = xx; + reg[*reg_size].y = yy; + ++(*reg_size); + + /* update region's angle */ + sumdx += cos( angles->data[xx+yy*angles->xsize] ); + sumdy += sin( angles->data[xx+yy*angles->xsize] ); + *reg_angle = atan2(sumdy,sumdx); + } +} + +/*----------------------------------------------------------------------------*/ +/** Try some rectangles variations to improve NFA value. Only if the + rectangle is not meaningful (i.e., log_nfa <= log_eps). + */ +static double rect_improve( struct rect * rec, image_double angles, + double logNT, double log_eps ) +{ + struct rect r; + double log_nfa,log_nfa_new; + double delta = 0.5; + double delta_2 = delta / 2.0; + int n; + + log_nfa = rect_nfa(rec,angles,logNT); + + if( log_nfa > log_eps ) return log_nfa; + + /* try finer precisions */ + rect_copy(rec,&r); + for(n=0; n<5; n++) + { + r.p /= 2.0; + r.prec = r.p * M_PI; + log_nfa_new = rect_nfa(&r,angles,logNT); + if( log_nfa_new > log_nfa ) + { + log_nfa = log_nfa_new; + rect_copy(&r,rec); + } + } + + if( log_nfa > log_eps ) return log_nfa; + + /* try to reduce width */ + rect_copy(rec,&r); + for(n=0; n<5; n++) + { + if( (r.width - delta) >= 0.5 ) + { + r.width -= delta; + log_nfa_new = rect_nfa(&r,angles,logNT); + if( log_nfa_new > log_nfa ) + { + rect_copy(&r,rec); + log_nfa = log_nfa_new; + } + } + } + + if( log_nfa > log_eps ) return log_nfa; + + /* try to reduce one side of the rectangle */ + rect_copy(rec,&r); + for(n=0; n<5; n++) + { + if( (r.width - delta) >= 0.5 ) + { + r.x1 += -r.dy * delta_2; + r.y1 += r.dx * delta_2; + r.x2 += -r.dy * delta_2; + r.y2 += r.dx * delta_2; + r.width -= delta; + log_nfa_new = rect_nfa(&r,angles,logNT); + if( log_nfa_new > log_nfa ) + { + rect_copy(&r,rec); + log_nfa = log_nfa_new; + } + } + } + + if( log_nfa > log_eps ) return log_nfa; + + /* try to reduce the other side of the rectangle */ + rect_copy(rec,&r); + for(n=0; n<5; n++) + { + if( (r.width - delta) >= 0.5 ) + { + r.x1 -= -r.dy * delta_2; + r.y1 -= r.dx * delta_2; + r.x2 -= -r.dy * delta_2; + r.y2 -= r.dx * delta_2; + r.width -= delta; + log_nfa_new = rect_nfa(&r,angles,logNT); + if( log_nfa_new > log_nfa ) + { + rect_copy(&r,rec); + log_nfa = log_nfa_new; + } + } + } + + if( log_nfa > log_eps ) return log_nfa; + + /* try even finer precisions */ + rect_copy(rec,&r); + for(n=0; n<5; n++) + { + r.p /= 2.0; + r.prec = r.p * M_PI; + log_nfa_new = rect_nfa(&r,angles,logNT); + if( log_nfa_new > log_nfa ) + { + log_nfa = log_nfa_new; + rect_copy(&r,rec); + } + } + + return log_nfa; +} + +/*----------------------------------------------------------------------------*/ +/** Reduce the region size, by elimination the points far from the + starting point, until that leads to rectangle with the right + density of region points or to discard the region if too small. + */ +static int reduce_region_radius( struct point * reg, int * reg_size, + image_double modgrad, double reg_angle, + double prec, double p, struct rect * rec, + image_char used, image_double angles, + double density_th ) +{ + double density,radius1,radius2,rad,xc,yc; + int i; + + /* check parameters */ + if( reg == NULL ) error("reduce_region_radius: invalid pointer 'reg'."); + if( reg_size == NULL ) + error("reduce_region_radius: invalid pointer 'reg_size'."); + if( prec < 0.0 ) error("reduce_region_radius: 'prec' must be positive."); + if( rec == NULL ) error("reduce_region_radius: invalid pointer 'rec'."); + if( used == NULL || used->data == NULL ) + error("reduce_region_radius: invalid image 'used'."); + if( angles == NULL || angles->data == NULL ) + error("reduce_region_radius: invalid image 'angles'."); + + /* compute region points density */ + density = (double) *reg_size / + ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); + + /* if the density criterion is satisfied there is nothing to do */ + if( density >= density_th ) return TRUE; + + /* compute region's radius */ + xc = (double) reg[0].x; + yc = (double) reg[0].y; + radius1 = dist( xc, yc, rec->x1, rec->y1 ); + radius2 = dist( xc, yc, rec->x2, rec->y2 ); + rad = radius1 > radius2 ? radius1 : radius2; + + /* while the density criterion is not satisfied, remove farther pixels */ + while( density < density_th ) + { + rad *= 0.75; /* reduce region's radius to 75% of its value */ + + /* remove points from the region and update 'used' map */ + for(i=0; i<*reg_size; i++) + if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) > rad ) + { + /* point not kept, mark it as NOTUSED */ + used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED; + /* remove point from the region */ + reg[i].x = reg[*reg_size-1].x; /* if i==*reg_size-1 copy itself */ + reg[i].y = reg[*reg_size-1].y; + --(*reg_size); + --i; /* to avoid skipping one point */ + } + + /* reject if the region is too small. + 2 is the minimal region size for 'region2rect' to work. */ + if( *reg_size < 2 ) return FALSE; + + /* re-compute rectangle */ + region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec); + + /* re-compute region points density */ + density = (double) *reg_size / + ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); + } + + /* if this point is reached, the density criterion is satisfied */ + return TRUE; +} + +/*----------------------------------------------------------------------------*/ +/** Refine a rectangle. + + For that, an estimation of the angle tolerance is performed by the + standard deviation of the angle at points near the region's + starting point. Then, a new region is grown starting from the same + point, but using the estimated angle tolerance. If this fails to + produce a rectangle with the right density of region points, + 'reduce_region_radius' is called to try to satisfy this condition. + */ +static int refine( struct point * reg, int * reg_size, image_double modgrad, + double reg_angle, double prec, double p, struct rect * rec, + image_char used, image_double angles, double density_th ) +{ + double angle,ang_d,mean_angle,tau,density,xc,yc,ang_c,sum,s_sum; + int i,n; + + /* check parameters */ + if( reg == NULL ) error("refine: invalid pointer 'reg'."); + if( reg_size == NULL ) error("refine: invalid pointer 'reg_size'."); + if( prec < 0.0 ) error("refine: 'prec' must be positive."); + if( rec == NULL ) error("refine: invalid pointer 'rec'."); + if( used == NULL || used->data == NULL ) + error("refine: invalid image 'used'."); + if( angles == NULL || angles->data == NULL ) + error("refine: invalid image 'angles'."); + + /* compute region points density */ + density = (double) *reg_size / + ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); + + /* if the density criterion is satisfied there is nothing to do */ + if( density >= density_th ) return TRUE; + + /*------ First try: reduce angle tolerance ------*/ + + /* compute the new mean angle and tolerance */ + xc = (double) reg[0].x; + yc = (double) reg[0].y; + ang_c = angles->data[ reg[0].x + reg[0].y * angles->xsize ]; + sum = s_sum = 0.0; + n = 0; + for(i=0; i<*reg_size; i++) + { + used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED; + if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) < rec->width ) + { + angle = angles->data[ reg[i].x + reg[i].y * angles->xsize ]; + ang_d = angle_diff_signed(angle,ang_c); + sum += ang_d; + s_sum += ang_d * ang_d; + ++n; + } + } + + /* should not happen */ + if(n == 0) return FALSE; + + mean_angle = sum / (double) n; + tau = 2.0 * sqrt( (s_sum - 2.0 * mean_angle * sum) / (double) n + + mean_angle*mean_angle ); /* 2 * standard deviation */ + + /* find a new region from the same starting point and new angle tolerance */ + region_grow(reg[0].x,reg[0].y,angles,reg,reg_size,®_angle,used,tau); + + /* if the region is too small, reject */ + if( *reg_size < 2 ) return FALSE; + + /* re-compute rectangle */ + region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec); + + /* re-compute region points density */ + density = (double) *reg_size / + ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width ); + + /*------ Second try: reduce region radius ------*/ + if( density < density_th ) + return reduce_region_radius( reg, reg_size, modgrad, reg_angle, prec, p, + rec, used, angles, density_th ); + + /* if this point is reached, the density criterion is satisfied */ + return TRUE; +} + + +/*----------------------------------------------------------------------------*/ +/*-------------------------- Line Segment Detector ---------------------------*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +/** LSD full interface. + */ +static +double * LineSegmentDetection( int * n_out, + double * img, int X, int Y, + double scale, double sigma_scale, double quant, + double ang_th, double log_eps, double density_th, + int n_bins, + int ** reg_img, int * reg_x, int * reg_y ) +{ + image_double image; + ntuple_list out = new_ntuple_list(7); + double * return_value; + image_double scaled_image,angles,modgrad; + image_char used; + image_int region = NULL; + struct coorlist * list_p; + void * mem_p; + struct rect rec; + struct point * reg; + int reg_size,min_reg_size,i; + unsigned int xsize,ysize; + double rho,reg_angle,prec,p,log_nfa,logNT; + int ls_count = 0; /* line segments are numbered 1,2,3,... */ + + + /* check parameters */ + if( img == NULL || X <= 0 || Y <= 0 ) error("invalid image input."); + if( scale <= 0.0 ) error("'scale' value must be positive."); + if( sigma_scale <= 0.0 ) error("'sigma_scale' value must be positive."); + if( quant < 0.0 ) error("'quant' value must be positive."); + if( ang_th <= 0.0 || ang_th >= 180.0 ) + error("'ang_th' value must be in the range (0,180)."); + if( density_th < 0.0 || density_th > 1.0 ) + error("'density_th' value must be in the range [0,1]."); + if( n_bins <= 0 ) error("'n_bins' value must be positive."); + + + /* angle tolerance */ + prec = M_PI * ang_th / 180.0; + p = ang_th / 180.0; + rho = quant / sin(prec); /* gradient magnitude threshold */ + + + /* load and scale image (if necessary) and compute angle at each pixel */ + image = new_image_double_ptr( (unsigned int) X, (unsigned int) Y, img ); + if( scale != 1.0 ) + { + scaled_image = gaussian_sampler( image, scale, sigma_scale ); + angles = ll_angle( scaled_image, rho, &list_p, &mem_p, + &modgrad, (unsigned int) n_bins ); + free_image_double(scaled_image); + } + else + angles = ll_angle( image, rho, &list_p, &mem_p, &modgrad, + (unsigned int) n_bins ); + xsize = angles->xsize; + ysize = angles->ysize; + + /* Number of Tests - NT + + The theoretical number of tests is Np.(XY)^(5/2) + where X and Y are number of columns and rows of the image. + Np corresponds to the number of angle precisions considered. + As the procedure 'rect_improve' tests 5 times to halve the + angle precision, and 5 more times after improving other factors, + 11 different precision values are potentially tested. Thus, + the number of tests is + 11 * (X*Y)^(5/2) + whose logarithm value is + log10(11) + 5/2 * (log10(X) + log10(Y)). + */ + logNT = 5.0 * ( log10( (double) xsize ) + log10( (double) ysize ) ) / 2.0 + + log10(11.0); + min_reg_size = (int) (-logNT/log10(p)); /* minimal number of points in region + that can give a meaningful event */ + + + /* initialize some structures */ + if( reg_img != NULL && reg_x != NULL && reg_y != NULL ) /* save region data */ + region = new_image_int_ini(angles->xsize,angles->ysize,0); + used = new_image_char_ini(xsize,ysize,NOTUSED); + reg = (struct point *) calloc( (size_t) (xsize*ysize), sizeof(struct point) ); + if( reg == NULL ) error("not enough memory!"); + + + /* search for line segments */ + for(; list_p != NULL; list_p = list_p->next ) + if( used->data[ list_p->x + list_p->y * used->xsize ] == NOTUSED && + angles->data[ list_p->x + list_p->y * angles->xsize ] != NOTDEF ) + /* there is no risk of double comparison problems here + because we are only interested in the exact NOTDEF value */ + { + /* find the region of connected point and ~equal angle */ + region_grow( list_p->x, list_p->y, angles, reg, ®_size, + ®_angle, used, prec ); + + /* reject small regions */ + if( reg_size < min_reg_size ) continue; + + /* construct rectangular approximation for the region */ + region2rect(reg,reg_size,modgrad,reg_angle,prec,p,&rec); + + /* Check if the rectangle exceeds the minimal density of + region points. If not, try to improve the region. + The rectangle will be rejected if the final one does + not fulfill the minimal density condition. + This is an addition to the original LSD algorithm published in + "LSD: A Fast Line Segment Detector with a False Detection Control" + by R. Grompone von Gioi, J. Jakubowicz, J.M. Morel, and G. Randall. + The original algorithm is obtained with density_th = 0.0. + */ + if( !refine( reg, ®_size, modgrad, reg_angle, + prec, p, &rec, used, angles, density_th ) ) continue; + + /* compute NFA value */ + log_nfa = rect_improve(&rec,angles,logNT,log_eps); + if( log_nfa <= log_eps ) continue; + + /* A New Line Segment was found! */ + ++ls_count; /* increase line segment counter */ + + /* + The gradient was computed with a 2x2 mask, its value corresponds to + points with an offset of (0.5,0.5), that should be added to output. + The coordinates origin is at the center of pixel (0,0). + */ + rec.x1 += 0.5; rec.y1 += 0.5; + rec.x2 += 0.5; rec.y2 += 0.5; + + /* scale the result values if a subsampling was performed */ + if( scale != 1.0 ) + { + rec.x1 /= scale; rec.y1 /= scale; + rec.x2 /= scale; rec.y2 /= scale; + rec.width /= scale; + } + + /* add line segment found to output */ + add_7tuple( out, rec.x1, rec.y1, rec.x2, rec.y2, + rec.width, rec.p, log_nfa ); + + /* add region number to 'region' image if needed */ + if( region != NULL ) + for(i=0; idata[ reg[i].x + reg[i].y * region->xsize ] = ls_count; + } + + + /* free memory */ + free( (void *) image ); /* only the double_image structure should be freed, + the data pointer was provided to this functions + and should not be destroyed. */ + free_image_double(angles); + free_image_double(modgrad); + free_image_char(used); + free( (void *) reg ); + free( (void *) mem_p ); + + /* return the result */ + if( reg_img != NULL && reg_x != NULL && reg_y != NULL ) + { + if( region == NULL ) error("'region' should be a valid image."); + *reg_img = region->data; + if( region->xsize > (unsigned int) INT_MAX || + region->ysize > (unsigned int) INT_MAX ) + error("region image to big to fit in INT sizes."); + *reg_x = (int) (region->xsize); + *reg_y = (int) (region->ysize); + + /* free the 'region' structure. + we cannot use the function 'free_image_int' because we need to keep + the memory with the image data to be returned by this function. */ + free( (void *) region ); + } + if( out->size > (unsigned int) INT_MAX ) + error("too many detections to fit in an INT."); + *n_out = (int) (out->size); + + return_value = out->values; + free( (void *) out ); /* only the 'ntuple_list' structure must be freed, + but the 'values' pointer must be keep to return + as a result. */ + + return return_value; +} +#if 0 +/*----------------------------------------------------------------------------*/ +/** LSD Simple Interface with Scale and Region output. + */ +static +double * lsd_scale_region( int * n_out, + double * img, int X, int Y, double scale, + int ** reg_img, int * reg_x, int * reg_y ) +{ + /* LSD parameters */ + double sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as + sigma = sigma_scale/scale. */ + double quant = 2.0; /* Bound to the quantization error on the + gradient norm. */ + double ang_th = 22.5; /* Gradient angle tolerance in degrees. */ + double log_eps = 0.0; /* Detection threshold: -log10(NFA) > log_eps */ + double density_th = 0.7; /* Minimal density of region points in rectangle. */ + int n_bins = 1024; /* Number of bins in pseudo-ordering of gradient + modulus. */ + + return LineSegmentDetection( n_out, img, X, Y, scale, sigma_scale, quant, + ang_th, log_eps, density_th, n_bins, + reg_img, reg_x, reg_y ); +} + +/*----------------------------------------------------------------------------*/ +/** LSD Simple Interface with Scale. + */ +static +double * lsd_scale(int * n_out, double * img, int X, int Y, double scale) +{ + return lsd_scale_region(n_out,img,X,Y,scale,NULL,NULL,NULL); +} + +/*----------------------------------------------------------------------------*/ +/** LSD Simple Interface. + */ +static +double * lsd(int * n_out, double * img, int X, int Y) +{ + /* LSD parameters */ + double scale = 0.8; /* Scale the image by Gaussian filter to 'scale'. */ + + return lsd_scale(n_out,img,X,Y,scale); +} +/*----------------------------------------------------------------------------*/ +#endif +/*================================================================================== + * end of LSD code + *==================================================================================*/ + +// clang-format on + +#undef NOTDEF +#undef NOTUSED +#undef USED +#undef RELATIVE_ERROR_FACTOR +#undef TABSIZE + +// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh +// vim: shiftwidth=2 expandtab tabstop=2 cindent +// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified; diff --git a/rtengine/ashift_nmsimplex.c b/rtengine/ashift_nmsimplex.c new file mode 100644 index 000000000..512bac878 --- /dev/null +++ b/rtengine/ashift_nmsimplex.c @@ -0,0 +1,425 @@ +/* + This file is part of darktable, + copyright (c) 2016 Ulrich Pegelow. + + darktable is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + darktable is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with darktable. If not, see . +*/ + +/* For parameter optimization we are using the Nelder-Mead simplex method + * implemented by Michael F. Hutt. + * Changes versus the original code: + * do not include "nmsimplex.h" (not needed) + * renamed configuration variables to NMS_* + * add additional argument to objfun for arbitrary parameters + * simplex() returns number of used iterations instead of min value + * maximum number of iterations as function parameter + * make interface function simplex() static + * initialize i and j to avoid compiler warnings + * comment out printing of status inormation + * reformat according to darktable's clang standards + */ + +/*================================================================================== + * begin nmsimplex code downloaded from http://www.mikehutt.com/neldermead.html + * on February 6, 2016 + *==================================================================================*/ +/* + * Program: nmsimplex.c + * Author : Michael F. Hutt + * http://www.mikehutt.com + * 11/3/97 + * + * An implementation of the Nelder-Mead simplex method. + * + * Copyright (c) 1997-2011 + * + * 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. + * + * + * Jan. 6, 1999 + * Modified to conform to the algorithm presented + * in Margaret H. Wright's paper on Direct Search Methods. + * + * Jul. 23, 2007 + * Fixed memory leak. + * + * Mar. 1, 2011 + * Added constraints. + */ + +//#include "nmsimplex.h" + +static int simplex(double (*objfunc)(double[], void *params), double start[], int n, double EPSILON, double scale, + int maxiter, void (*constrain)(double[], int n), void *params) +{ + + int vs; /* vertex with smallest value */ + int vh; /* vertex with next smallest value */ + int vg; /* vertex with largest value */ + + int i = 0, j = 0, m, row; + int k; /* track the number of function evaluations */ + int itr; /* track the number of iterations */ + + double **v; /* holds vertices of simplex */ + double pn, qn; /* values used to create initial simplex */ + double *f; /* value of function at each vertex */ + double fr; /* value of function at reflection point */ + double fe; /* value of function at expansion point */ + double fc; /* value of function at contraction point */ + double *vr; /* reflection - coordinates */ + double *ve; /* expansion - coordinates */ + double *vc; /* contraction - coordinates */ + double *vm; /* centroid - coordinates */ + //double min; + + double fsum, favg, s, cent; + + /* dynamically allocate arrays */ + + /* allocate the rows of the arrays */ + v = (double **)malloc((n + 1) * sizeof(double *)); + f = (double *)malloc((n + 1) * sizeof(double)); + vr = (double *)malloc(n * sizeof(double)); + ve = (double *)malloc(n * sizeof(double)); + vc = (double *)malloc(n * sizeof(double)); + vm = (double *)malloc(n * sizeof(double)); + + /* allocate the columns of the arrays */ + for(i = 0; i <= n; i++) + { + v[i] = (double *)malloc(n * sizeof(double)); + } + + /* create the initial simplex */ + /* assume one of the vertices is 0,0 */ + + pn = scale * (sqrt(n + 1) - 1 + n) / (n * sqrt(2)); + qn = scale * (sqrt(n + 1) - 1) / (n * sqrt(2)); + + for(i = 0; i < n; i++) + { + v[0][i] = start[i]; + } + + for(i = 1; i <= n; i++) + { + for(j = 0; j < n; j++) + { + if(i - 1 == j) + { + v[i][j] = pn + start[j]; + } + else + { + v[i][j] = qn + start[j]; + } + } + } + + if(constrain != NULL) + { + constrain(v[j], n); + } + /* find the initial function values */ + for(j = 0; j <= n; j++) + { + f[j] = objfunc(v[j], params); + } + + k = n + 1; +#if 0 + /* print out the initial values */ + printf("Initial Values\n"); + for(j = 0; j <= n; j++) + { + for(i = 0; i < n; i++) + { + printf("%f %f\n", v[j][i], f[j]); + } + } +#endif + + /* begin the main loop of the minimization */ + for(itr = 1; itr <= maxiter; itr++) + { + /* find the index of the largest value */ + vg = 0; + for(j = 0; j <= n; j++) + { + if(f[j] > f[vg]) + { + vg = j; + } + } + + /* find the index of the smallest value */ + vs = 0; + for(j = 0; j <= n; j++) + { + if(f[j] < f[vs]) + { + vs = j; + } + } + + /* find the index of the second largest value */ + vh = vs; + for(j = 0; j <= n; j++) + { + if(f[j] > f[vh] && f[j] < f[vg]) + { + vh = j; + } + } + + /* calculate the centroid */ + for(j = 0; j <= n - 1; j++) + { + cent = 0.0; + for(m = 0; m <= n; m++) + { + if(m != vg) + { + cent += v[m][j]; + } + } + vm[j] = cent / n; + } + + /* reflect vg to new vertex vr */ + for(j = 0; j <= n - 1; j++) + { + /*vr[j] = (1+NMS_ALPHA)*vm[j] - NMS_ALPHA*v[vg][j];*/ + vr[j] = vm[j] + NMS_ALPHA * (vm[j] - v[vg][j]); + } + if(constrain != NULL) + { + constrain(vr, n); + } + fr = objfunc(vr, params); + k++; + + if(fr < f[vh] && fr >= f[vs]) + { + for(j = 0; j <= n - 1; j++) + { + v[vg][j] = vr[j]; + } + f[vg] = fr; + } + + /* investigate a step further in this direction */ + if(fr < f[vs]) + { + for(j = 0; j <= n - 1; j++) + { + /*ve[j] = NMS_GAMMA*vr[j] + (1-NMS_GAMMA)*vm[j];*/ + ve[j] = vm[j] + NMS_GAMMA * (vr[j] - vm[j]); + } + if(constrain != NULL) + { + constrain(ve, n); + } + fe = objfunc(ve, params); + k++; + + /* by making fe < fr as opposed to fe < f[vs], + Rosenbrocks function takes 63 iterations as opposed + to 64 when using double variables. */ + + if(fe < fr) + { + for(j = 0; j <= n - 1; j++) + { + v[vg][j] = ve[j]; + } + f[vg] = fe; + } + else + { + for(j = 0; j <= n - 1; j++) + { + v[vg][j] = vr[j]; + } + f[vg] = fr; + } + } + + /* check to see if a contraction is necessary */ + if(fr >= f[vh]) + { + if(fr < f[vg] && fr >= f[vh]) + { + /* perform outside contraction */ + for(j = 0; j <= n - 1; j++) + { + /*vc[j] = NMS_BETA*v[vg][j] + (1-NMS_BETA)*vm[j];*/ + vc[j] = vm[j] + NMS_BETA * (vr[j] - vm[j]); + } + if(constrain != NULL) + { + constrain(vc, n); + } + fc = objfunc(vc, params); + k++; + } + else + { + /* perform inside contraction */ + for(j = 0; j <= n - 1; j++) + { + /*vc[j] = NMS_BETA*v[vg][j] + (1-NMS_BETA)*vm[j];*/ + vc[j] = vm[j] - NMS_BETA * (vm[j] - v[vg][j]); + } + if(constrain != NULL) + { + constrain(vc, n); + } + fc = objfunc(vc, params); + k++; + } + + + if(fc < f[vg]) + { + for(j = 0; j <= n - 1; j++) + { + v[vg][j] = vc[j]; + } + f[vg] = fc; + } + /* at this point the contraction is not successful, + we must halve the distance from vs to all the + vertices of the simplex and then continue. + 10/31/97 - modified to account for ALL vertices. + */ + else + { + for(row = 0; row <= n; row++) + { + if(row != vs) + { + for(j = 0; j <= n - 1; j++) + { + v[row][j] = v[vs][j] + (v[row][j] - v[vs][j]) / 2.0; + } + } + } + if(constrain != NULL) + { + constrain(v[vg], n); + } + f[vg] = objfunc(v[vg], params); + k++; + if(constrain != NULL) + { + constrain(v[vh], n); + } + f[vh] = objfunc(v[vh], params); + k++; + } + } +#if 0 + /* print out the value at each iteration */ + printf("Iteration %d\n", itr); + for(j = 0; j <= n; j++) + { + for(i = 0; i < n; i++) + { + printf("%f %f\n", v[j][i], f[j]); + } + } +#endif + /* test for convergence */ + fsum = 0.0; + for(j = 0; j <= n; j++) + { + fsum += f[j]; + } + favg = fsum / (n + 1); + s = 0.0; + for(j = 0; j <= n; j++) + { + s += pow((f[j] - favg), 2.0) / (n); + } + s = sqrt(s); + if(s < EPSILON) break; + } + /* end main loop of the minimization */ + + /* find the index of the smallest value */ + vs = 0; + for(j = 0; j <= n; j++) + { + if(f[j] < f[vs]) + { + vs = j; + } + } +#if 0 + printf("The minimum was found at\n"); + for(j = 0; j < n; j++) + { + printf("%e\n", v[vs][j]); + start[j] = v[vs][j]; + } + double min = objfunc(v[vs], params); + k++; + printf("The minimum value is %f\n", min); + printf("%d Function Evaluations\n", k); + printf("%d Iterations through program\n", itr); +#else + for(j = 0; j < n; j++) + { + start[j] = v[vs][j]; + } +#endif + free(f); + free(vr); + free(ve); + free(vc); + free(vm); + for(i = 0; i <= n; i++) + { + free(v[i]); + } + free(v); + return itr; +} + +/*================================================================================== + * end of nmsimplex code + *==================================================================================*/ + +// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh +// vim: shiftwidth=2 expandtab tabstop=2 cindent +// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified; diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 0ae63a618..f04afb1ee 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -182,7 +182,7 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array /* interpolateBadPixelsNcolors: correct raw pixels looking at the bitmap * takes into consideration if there are multiple bad pixels in the neighborhood */ -int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, const int colors) +int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, const int colours) { constexpr float eps = 1.f; int counter = 0; @@ -204,9 +204,9 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co continue; } - float wtdsum[colors]; - float norm[colors]; - for (int c = 0; c < colors; ++c) { + float wtdsum[colours]; + float norm[colours]; + for (int c = 0; c < colours; ++c) { wtdsum[c] = norm[c] = 0.f; } @@ -216,41 +216,41 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co continue; } - for (int c = 0; c < colors; ++c) { - const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][(col + dx) * colors + c] - rawData[row + 1][(col - dx) * colors + c]) + eps); - wtdsum[c] += dirwt * (rawData[row - 1][(col + dx) * colors + c] + rawData[row + 1][(col - dx) * colors + c]); + for (int c = 0; c < colours; ++c) { + const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][(col + dx) * colours + c] - rawData[row + 1][(col - dx) * colours + c]) + eps); + wtdsum[c] += dirwt * (rawData[row - 1][(col + dx) * colours + c] + rawData[row + 1][(col - dx) * colours + c]); norm[c] += dirwt; } } // horizontal interpolation if (!(bitmapBads.get(col - 1, row) || bitmapBads.get(col + 1, row))) { - for (int c = 0; c < colors; ++c) { - const float dirwt = 1.f / (fabsf(rawData[row][(col - 1) * colors + c] - rawData[row][(col + 1) * colors + c]) + eps); - wtdsum[c] += dirwt * (rawData[row][(col - 1) * colors + c] + rawData[row][(col + 1) * colors + c]); + for (int c = 0; c < colours; ++c) { + const float dirwt = 1.f / (fabsf(rawData[row][(col - 1) * colours + c] - rawData[row][(col + 1) * colours + c]) + eps); + wtdsum[c] += dirwt * (rawData[row][(col - 1) * colours + c] + rawData[row][(col + 1) * colours + c]); norm[c] += dirwt; } } // vertical interpolation if (!(bitmapBads.get(col, row - 1) || bitmapBads.get(col, row + 1))) { - for (int c = 0; c < colors; ++c) { - const float dirwt = 1.f / (fabsf(rawData[row - 1][col * colors + c] - rawData[row + 1][col * colors + c]) + eps); - wtdsum[c] += dirwt * (rawData[row - 1][col * colors + c] + rawData[row + 1][col * colors + c]); + for (int c = 0; c < colours; ++c) { + const float dirwt = 1.f / (fabsf(rawData[row - 1][col * colours + c] - rawData[row + 1][col * colours + c]) + eps); + wtdsum[c] += dirwt * (rawData[row - 1][col * colours + c] + rawData[row + 1][col * colours + c]); norm[c] += dirwt; } } if (LIKELY(norm[0] > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% - for (int c = 0; c < colors; ++c) { - rawData[row][col * colors + c] = wtdsum[c] / (2.f * norm[c]); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps + for (int c = 0; c < colours; ++c) { + rawData[row][col * colours + c] = wtdsum[c] / (2.f * norm[c]); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps } counter++; } else { //backup plan -- simple average. Same method for all channels. We could improve this, but it's really unlikely that this case happens int tot = 0; - float sum[colors]; - for (int c = 0; c < colors; ++c) { + float sum[colours]; + for (int c = 0; c < colours; ++c) { sum[c] = 0.f; } @@ -260,8 +260,8 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co continue; } - for (int c = 0; c < colors; ++c) { - sum[c] += rawData[row + dy][(col + dx) * colors + c]; + for (int c = 0; c < colours; ++c) { + sum[c] += rawData[row + dy][(col + dx) * colours + c]; } tot++; @@ -269,8 +269,8 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co } if (tot > 0) { - for (int c = 0; c < colors; ++c) { - rawData[row][col * colors + c] = sum[c] / tot; + for (int c = 0; c < colours; ++c) { + rawData[row][col * colours + c] = sum[c] / tot; } counter ++; @@ -477,7 +477,7 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, const bool findHotPixels, const bool findDeadPixels) const { BENCHFUN - const float varthresh = (20.0 * (thresh / 100.0) + 1.0) / 24.f; + const float varthresh = (20.f * (thresh / 100.f) + 1.f) / 24.f; // counter for dead or hot pixels int counter = 0; diff --git a/rtengine/bayer_bilinear_demosaic.cc b/rtengine/bayer_bilinear_demosaic.cc new file mode 100644 index 000000000..5b3835ce9 --- /dev/null +++ b/rtengine/bayer_bilinear_demosaic.cc @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////////////////// +// +// Bilinear bayer demosaic, optimized for speed, intended use is for flat regions of dual-demosaic +// +// copyright (c) 2020 Ingo Weyrich +// +// +// code dated: May 09, 2020 +// +// bayer_bilinear_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 "rawimagesource.h" +#include "rt_math.h" + +using namespace rtengine; + +void RawImageSource::bayer_bilinear_demosaic(const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue) +{ + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 1; i < H - 1; ++i) { + float **nonGreen1 = red; + float **nonGreen2 = blue; + if (FC(i, 0) == 2 || FC(i, 1) == 2) { // blue row => swap pointers + std::swap(nonGreen1, nonGreen2); + } +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif + for (int j = 2 - (FC(i, 1) & 1); j < W - 2; j += 2) { // always begin with a green pixel + green[i][j] = intp(blend[i][j], green[i][j], rawData[i][j]); + nonGreen1[i][j] = intp(blend[i][j], nonGreen1[i][j], (rawData[i][j - 1] + rawData[i][j + 1]) * 0.5f); + nonGreen2[i][j] = intp(blend[i][j], nonGreen2[i][j], (rawData[i - 1][j] + rawData[i + 1][j]) * 0.5f); + green[i][j + 1] = intp(blend[i][j + 1], green[i][j + 1], ((rawData[i - 1][j + 1] + rawData[i][j]) + (rawData[i][j + 2] + rawData[i + 1][j + 1])) * 0.25f); + nonGreen1[i][j + 1] = intp(blend[i][j + 1], nonGreen1[i][j + 1], rawData[i][j + 1]); + nonGreen2[i][j + 1] = intp(blend[i][j + 1], nonGreen2[i][j + 1], ((rawData[i - 1][j] + rawData[i - 1][j + 2]) + (rawData[i + 1][j] + rawData[i + 1][j + 2])) * 0.25f); + } + } +} diff --git a/rtengine/cache.h b/rtengine/cache.h index 6c1dacf43..77a2017f3 100644 --- a/rtengine/cache.h +++ b/rtengine/cache.h @@ -65,7 +65,7 @@ public: virtual void onDestroy() = 0; }; - Cache(unsigned long _size, Hook* _hook = nullptr) : + explicit Cache(unsigned long _size, Hook* _hook = nullptr) : store_size(_size), hook(_hook) { diff --git a/rtengine/calc_distort.cc b/rtengine/calc_distort.cc index 7af47adb2..3a7a4a1c4 100644 --- a/rtengine/calc_distort.cc +++ b/rtengine/calc_distort.cc @@ -5,8 +5,8 @@ locations (before and after tracking) to text files and to PPM files, and prints the features to the screen. **********************************************************************/ -#include "klt/pnmio.h" -#include "klt/klt.h" +#include +#include #include #include diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index d136d6a21..5cb56b2ae 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -2,20 +2,25 @@ * This file is part of RawTherapee. */ #include "camconst.h" + +#include +#include +#include +#include +#include +#include +#include + #include #include #include + #include "settings.h" #include "rt_math.h" -#include -#include // cJSON is a very minimal JSON parser lib in C, not for threaded stuff etc, so if we're going to use JSON more than just // here we should probably replace cJSON with something beefier. #include "cJSON.h" -#include -#include -#include namespace rtengine { @@ -23,73 +28,75 @@ namespace rtengine 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; } -bool -CameraConst::parseApertureScaling(CameraConst *cc, void *ji_) +bool CameraConst::parseApertureScaling(CameraConst *cc, const void *ji_) { - cJSON *ji = (cJSON *)ji_; + const cJSON *ji = static_cast(ji_); if (ji->type != cJSON_Array) { fprintf(stderr, "\"ranges\":\"aperture_scaling\" must be an array\n"); return false; } - for (ji = ji->child; ji != nullptr; ji = ji->next) { - cJSON *js = cJSON_GetObjectItem(ji, "aperture"); + for (ji = ji->child; ji; ji = ji->next) { + const cJSON *js = cJSON_GetObjectItem(ji, "aperture"); if (!js) { fprintf(stderr, "missing \"ranges\":\"aperture_scaling\":\"aperture\" object item.\n"); return false; - } else if (js->type != cJSON_Number) { + } + + if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"aperture_scaling\":\"aperture\" must be a number.\n"); return false; } - float aperture = (float)js->valuedouble; + const float aperture = js->valuedouble; js = cJSON_GetObjectItem(ji, "scale_factor"); if (!js) { fprintf(stderr, "missing \"ranges\":\"aperture_scaling\":\"scale_factor\" object item.\n"); return false; - } else if (js->type != cJSON_Number) { + } + + if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"aperture_scaling\":\"scale_factor\" must be a number.\n"); return false; } - float scale_factor = (float)js->valuedouble; - cc->mApertureScaling.insert(std::pair(aperture, scale_factor)); + const float scale_factor = js->valuedouble; + cc->mApertureScaling.emplace(aperture, scale_factor); } return true; } -bool -CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) +bool CameraConst::parseLevels(CameraConst *cc, int bw, const void *ji_) { - cJSON *ji = (cJSON *)ji_; + const cJSON *ji = static_cast(ji_); if (ji->type == cJSON_Number) { - struct camera_const_levels lvl; + camera_const_levels lvl; lvl.levels[0] = lvl.levels[1] = lvl.levels[2] = lvl.levels[3] = ji->valueint; - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].emplace(0, lvl); return true; - } else if (ji->type != cJSON_Array) { + } + + if (ji->type != cJSON_Array) { fprintf(stderr, "\"ranges\":\"%s\" must be a number or an array\n", bw ? "white" : "black"); return false; } if (ji->child->type == cJSON_Number) { - struct camera_const_levels lvl; + camera_const_levels lvl; int i; - cJSON *js; + const cJSON *js; - for (js = ji->child, i = 0; js != nullptr && i < 4; js = js->next, i++) { + for (js = ji->child, i = 0; js && i < 4; js = js->next, i++) { lvl.levels[i] = js->valueint; } @@ -97,39 +104,36 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) lvl.levels[3] = lvl.levels[1]; // G2 = G1 } else if (i == 1) { lvl.levels[3] = lvl.levels[2] = lvl.levels[1] = lvl.levels[0]; - } else if (i != 4 || js != nullptr) { + } else if (i != 4 || js) { fprintf(stderr, "\"ranges\":\"%s\" array must have 1, 3 or 4 numbers.\n", bw ? "white" : "black"); return false; } - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].emplace(0, lvl); return true; } - for (ji = ji->child; ji != nullptr; ji = ji->next) { - int iso[1000] = { 0 }; - int iso_count = 0; - cJSON *js = cJSON_GetObjectItem(ji, "iso"); + for (ji = ji->child; ji; ji = ji->next) { + const cJSON *js = cJSON_GetObjectItem(ji, "iso"); if (!js) { fprintf(stderr, "missing \"ranges\":\"%s\":\"iso\" object item.\n", bw ? "white" : "black"); return false; - } else if (js->type == cJSON_Number) { - iso[0] = js->valueint; - iso_count = 1; - } else if (js->type == cJSON_Array) { - int i; + } - for (js = js->child, i = 0; js != nullptr && i < 1000; js = js->next, i++) { + std::vector isos; + + if (js->type == cJSON_Number) { + isos.push_back(js->valueint); + } else if (js->type == cJSON_Array) { + for (js = js->child; js; js = js->next) { if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"%s\":\"iso\" must be a number or an array of numbers.\n", bw ? "white" : "black"); return false; } - iso[i] = js->valueint; + isos.push_back(js->valueint); } - - iso_count = i; } else { fprintf(stderr, "\"ranges\":\"%s\":\"iso\" must be an array or a number.\n", bw ? "white" : "black"); return false; @@ -142,14 +146,14 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) return false; } - struct camera_const_levels lvl; + camera_const_levels lvl; if (js->type == cJSON_Number) { lvl.levels[0] = lvl.levels[1] = lvl.levels[2] = lvl.levels[3] = js->valueint; } else if (js->type == cJSON_Array) { int i; - for (js = js->child, i = 0; js != nullptr && i < 4; js = js->next, i++) { + for (js = js->child, i = 0; js && i < 4; js = js->next, i++) { if (js->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"%s\":\"levels\" must be a number or an array of numbers.\n", bw ? "white" : "black"); return false; @@ -162,7 +166,7 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) lvl.levels[3] = lvl.levels[1]; // G2 = G1 } else if (i == 1) { lvl.levels[3] = lvl.levels[2] = lvl.levels[1] = lvl.levels[0]; - } else if (i != 4 || js != nullptr) { + } else if (i != 4 || js) { fprintf(stderr, "\"ranges\":\"%s\":\"levels\" array must have 1, 3 or 4 numbers.\n", bw ? "white" : "black"); return false; } @@ -171,40 +175,100 @@ CameraConst::parseLevels(CameraConst *cc, int bw, void *ji_) return false; } - for (int i = 0; i < iso_count; i++) { - cc->mLevels[bw].insert(std::pair(iso[i], lvl)); + for (auto iso : isos) { + cc->mLevels[bw].emplace(iso, lvl); } } return true; } -CameraConst * -CameraConst::parseEntry(void *cJSON_, const char *make_model) +CameraConst* CameraConst::parseEntry(const void *cJSON_, const char *make_model) { - cJSON *js, *ji, *jranges; - js = (cJSON *)cJSON_; + const cJSON *js = static_cast(cJSON_); - CameraConst *cc = new CameraConst; + std::unique_ptr cc(new CameraConst); cc->make_model = make_model; - ji = cJSON_GetObjectItem(js, "dcraw_matrix"); + const auto get_raw_crop = + [](int w, int h, const cJSON *ji, CameraConst *cc) -> bool + { + std::array rc; + + if (ji->type != cJSON_Array) { + //fprintf(stderr, "\"raw_crop\" must be an array\n"); + return false; + } + + int i; + + for (i = 0, ji = ji->child; i < 4 && ji != nullptr; i++, ji = ji->next) { + if (ji->type != cJSON_Number) { + //fprintf(stderr, "\"raw_crop\" array must contain numbers\n"); + return false; + } + + //cc->raw_crop[i] = ji->valueint; + rc[i] = ji->valueint; + } + + if (i != 4 || ji != nullptr) { + //fprintf(stderr, "\"raw_crop\" must contain 4 numbers\n"); + return false; + } + + cc->raw_crop[std::make_pair(w, h)] = rc; + return true; + }; + + const auto get_masked_areas = + [](int w, int h, const cJSON *ji, CameraConst *cc) -> bool + { + std::array, 2> rm = {}; + + if (ji->type != cJSON_Array) { + //fprintf(stderr, "\"masked_areas\" must be an array\n"); + return false; + } + + int i; + + for (i = 0, ji = ji->child; i < 2 * 4 && ji != nullptr; i++, ji = ji->next) { + if (ji->type != cJSON_Number) { + //fprintf(stderr, "\"masked_areas\" array must contain numbers\n"); + return false; + } + + //cc->raw_mask[i / 4][i % 4] = ji->valueint; + rm[i / 4][i % 4] = ji->valueint; + } + + if (i % 4 != 0) { + //fprintf(stderr, "\"masked_areas\" array length must be divisable by 4\n"); + return false; + } + + cc->raw_mask[std::make_pair(w, h)] = rm; + return true; + }; + + const cJSON *ji = cJSON_GetObjectItem(js, "dcraw_matrix"); if (ji) { if (ji->type != cJSON_Array) { fprintf(stderr, "\"dcraw_matrix\" must be an array\n"); - goto parse_error; + return nullptr; } int i; - for (i = 0, ji = ji->child; i < 12 && ji != nullptr; i++, ji = ji->next) { + for (i = 0, ji = ji->child; i < 12 && ji; i++, ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"dcraw_matrix\" array must contain numbers\n"); - goto parse_error; + return nullptr; } - cc->dcraw_matrix[i] = (short)ji->valueint; + cc->dcraw_matrix[i] = ji->valueint; } } @@ -212,24 +276,32 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Array) { - fprintf(stderr, "\"raw_crop\" must be an array\n"); - goto parse_error; - } - - int i; - - for (i = 0, ji = ji->child; i < 4 && ji != nullptr; i++, ji = ji->next) { - if (ji->type != cJSON_Number) { - fprintf(stderr, "\"raw_crop\" array must contain numbers\n"); - goto parse_error; + fprintf(stderr, "invalid entry for raw_crop.\n"); + return nullptr; + } else if (!get_raw_crop(0, 0, ji, cc.get())) { + cJSON *je; + cJSON_ArrayForEach(je, ji) { + if (!cJSON_IsObject(je)) { + fprintf(stderr, "invalid entry for raw_crop.\n"); + return nullptr; + } else { + auto js = cJSON_GetObjectItem(je, "frame"); + if (!js || js->type != cJSON_Array || + cJSON_GetArraySize(js) != 2 || + !cJSON_IsNumber(cJSON_GetArrayItem(js, 0)) || + !cJSON_IsNumber(cJSON_GetArrayItem(js, 1))) { + fprintf(stderr, "invalid entry for raw_crop.\n"); + return nullptr; + } + int w = cJSON_GetArrayItem(js, 0)->valueint; + int h = cJSON_GetArrayItem(js, 1)->valueint; + js = cJSON_GetObjectItem(je, "crop"); + if (!js || !get_raw_crop(w, h, js, cc.get())) { + fprintf(stderr, "invalid entry for raw_crop.\n"); + return nullptr; + } + } } - - cc->raw_crop[i] = ji->valueint; - } - - if (i != 4 || ji != nullptr) { - fprintf(stderr, "\"raw_crop\" must contain 4 numbers\n"); - goto parse_error; } } @@ -237,44 +309,48 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Array) { - fprintf(stderr, "\"masked_areas\" must be an array\n"); - goto parse_error; - } - - int i; - - for (i = 0, ji = ji->child; i < 8 * 4 && ji != nullptr; i++, ji = ji->next) { - if (ji->type != cJSON_Number) { - fprintf(stderr, "\"masked_areas\" array must contain numbers\n"); - goto parse_error; + fprintf(stderr, "invalid entry for masked_areas.\n"); + return nullptr; + } else if (!get_masked_areas(0, 0, ji, cc.get())) { + cJSON *je; + cJSON_ArrayForEach(je, ji) { + if (!cJSON_IsObject(je)) { + fprintf(stderr, "invalid entry for masked_areas.\n"); + return nullptr; + } else { + auto js = cJSON_GetObjectItem(je, "frame"); + if (!js || js->type != cJSON_Array || + cJSON_GetArraySize(js) != 2 || + !cJSON_IsNumber(cJSON_GetArrayItem(js, 0)) || + !cJSON_IsNumber(cJSON_GetArrayItem(js, 1))) { + fprintf(stderr, "invalid entry for masked_areas.\n"); + return nullptr; + } + int w = cJSON_GetArrayItem(js, 0)->valueint; + int h = cJSON_GetArrayItem(js, 1)->valueint; + js = cJSON_GetObjectItem(je, "areas"); + if (!js || !get_masked_areas(w, h, js, cc.get())) { + fprintf(stderr, "invalid entry for masked_areas.\n"); + return nullptr; + } + } } - - cc->raw_mask[i / 4][i % 4] = ji->valueint; - } - - if (i % 4 != 0) { - fprintf(stderr, "\"masked_areas\" array length must be divisible by 4\n"); - goto parse_error; } } - jranges = cJSON_GetObjectItem(js, "ranges"); + const cJSON *jranges = cJSON_GetObjectItem(js, "ranges"); if (jranges) { ji = cJSON_GetObjectItem(jranges, "black"); - if (ji) { - if (!parseLevels(cc, 0, ji)) { - goto parse_error; - } + if (ji && !parseLevels(cc.get(), 0, ji)) { + return nullptr; } ji = cJSON_GetObjectItem(jranges, "white"); - if (ji) { - if (!parseLevels(cc, 1, ji)) { - goto parse_error; - } + if (ji && !parseLevels(cc.get(), 1, ji)) { + return nullptr; } ji = cJSON_GetObjectItem(jranges, "white_max"); @@ -282,32 +358,28 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"ranges\":\"white_max\" must be a number\n"); - goto parse_error; + return nullptr; } - cc->white_max = (int)ji->valueint; + cc->white_max = ji->valueint; } ji = cJSON_GetObjectItem(jranges, "aperture_scaling"); - if (ji) { - if (!parseApertureScaling(cc, ji)) { - goto parse_error; - } + if (ji && !parseApertureScaling(cc.get(), ji)) { + return nullptr; } } for (int bw = 0; bw < 2; bw++) { - struct camera_const_levels lvl; + camera_const_levels lvl; if (!cc->get_Levels(lvl, bw, 0, 0)) { - std::map::iterator it; - it = cc->mLevels[bw].begin(); + const auto it = cc->mLevels[bw].cbegin(); - if (it != cc->mLevels[bw].end()) { + if (it != cc->mLevels[bw].cend()) { // insert levels with lowest iso as the default (iso 0) - struct camera_const_levels lvl = it->second; - cc->mLevels[bw].insert(std::pair(0, lvl)); + cc->mLevels[bw].emplace(0, it->second); } } } @@ -317,13 +389,13 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Array) { fprintf(stderr, "\"pdaf_pattern\" must be an array\n"); - goto parse_error; + return nullptr; } - for (ji = ji->child; ji != nullptr; ji = ji->next) { + for (ji = ji->child; ji; ji = ji->next) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"pdaf_pattern\" array must contain numbers\n"); - goto parse_error; + return nullptr; } cc->pdafPattern.push_back(ji->valueint); @@ -335,7 +407,7 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_Number) { fprintf(stderr, "\"pdaf_offset\" must contain a number\n"); - goto parse_error; + return nullptr; } cc->pdafOffset = ji->valueint; @@ -346,27 +418,21 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) if (ji) { if (ji->type != cJSON_False && ji->type != cJSON_True) { fprintf(stderr, "\"global_green_equilibration\" must be a boolean\n"); - goto parse_error; + return nullptr; } cc->globalGreenEquilibration = (ji->type == cJSON_True); } - return cc; - -parse_error: - delete cc; - return nullptr; + return cc.release(); } -bool -CameraConst::has_dcrawMatrix() +bool CameraConst::has_dcrawMatrix() const { return dcraw_matrix[0] != 0; } -void -CameraConst::update_dcrawMatrix(const short *other) +void CameraConst::update_dcrawMatrix(const short *other) { if (!other) { return; @@ -377,8 +443,7 @@ CameraConst::update_dcrawMatrix(const short *other) } } -const short * -CameraConst::get_dcrawMatrix() +const short* CameraConst::get_dcrawMatrix() const { if (!has_dcrawMatrix()) { return nullptr; @@ -387,130 +452,134 @@ CameraConst::get_dcrawMatrix() return dcraw_matrix; } -bool -CameraConst::has_pdafPattern() -{ - return pdafPattern.size() > 0; -} - -std::vector -CameraConst::get_pdafPattern() +const std::vector& CameraConst::get_pdafPattern() const { return pdafPattern; } -void -CameraConst::update_pdafPattern(const std::vector &other) +void CameraConst::update_pdafPattern(const std::vector &other) { if (other.empty()) { return; } + pdafPattern = other; } -void -CameraConst::update_pdafOffset(int other) +void CameraConst::update_pdafOffset(int other) { if (other == 0) { return; } + pdafOffset = other; } -bool -CameraConst::has_rawCrop() + +bool CameraConst::has_rawCrop(int raw_width, int raw_height) const { - return raw_crop[0] != 0 || raw_crop[1] != 0 || raw_crop[2] != 0 || raw_crop[3] != 0; + return raw_crop.find(std::make_pair(raw_width, raw_height)) != raw_crop.end() || raw_crop.find(std::make_pair(0, 0)) != raw_crop.end(); } -void -CameraConst::get_rawCrop(int& left_margin, int& top_margin, int& width, int& height) + +void CameraConst::get_rawCrop(int raw_width, int raw_height, int &left_margin, int &top_margin, int &width, int &height) const { - left_margin = raw_crop[0]; - top_margin = raw_crop[1]; - width = raw_crop[2]; - height = raw_crop[3]; + auto it = raw_crop.find(std::make_pair(raw_width, raw_height)); + if (it == raw_crop.end()) { + it = raw_crop.find(std::make_pair(0, 0)); + } + if (it != raw_crop.end()) { + left_margin = it->second[0]; + top_margin = it->second[1]; + width = it->second[2]; + height = it->second[3]; + } else { + left_margin = top_margin = width = height = 0; + } } -bool -CameraConst::has_rawMask(int idx) + +bool CameraConst::has_rawMask(int raw_width, int raw_height, int idx) const { - if (idx < 0 || idx > 7) { + if (idx < 0 || idx > 1) { return false; } - return (raw_mask[idx][0] | raw_mask[idx][1] | raw_mask[idx][2] | raw_mask[idx][3]) != 0; + auto it = raw_mask.find(std::make_pair(raw_width, raw_height)); + if (it == raw_mask.end()) { + it = raw_mask.find(std::make_pair(0, 0)); + } + if (it != raw_mask.end()) { + return (it->second[idx][0] | it->second[idx][1] | it->second[idx][2] | it->second[idx][3]) != 0; + } else { + return false; + } } -void -CameraConst::get_rawMask(int idx, int& top, int& left, int& bottom, int& right) + +void CameraConst::get_rawMask(int raw_width, int raw_height, int idx, int &top, int &left, int &bottom, int &right) const { top = left = bottom = right = 0; - if (idx < 0 || idx > 7) { + if (idx < 0 || idx > 1) { return; } - top = raw_mask[idx][0]; - left = raw_mask[idx][1]; - bottom = raw_mask[idx][2]; - right = raw_mask[idx][3]; + auto it = raw_mask.find(std::make_pair(raw_width, raw_height)); + if (it == raw_mask.end()) { + it = raw_mask.find(std::make_pair(0, 0)); + } + + if (it != raw_mask.end()) { + top = it->second[idx][0]; + left = it->second[idx][1]; + bottom = it->second[idx][2]; + right = it->second[idx][3]; + } } -void -CameraConst::update_Levels(const CameraConst *other) +void CameraConst::update_Levels(const CameraConst *other) { if (!other) { return; } - if (other->mLevels[0].size()) { - mLevels[0].clear(); + if (!other->mLevels[0].empty()) { mLevels[0] = other->mLevels[0]; } - if (other->mLevels[1].size()) { - mLevels[1].clear(); + if (!other->mLevels[1].empty()) { mLevels[1] = other->mLevels[1]; } - if (other->mApertureScaling.size()) { - mApertureScaling.clear(); + if (!other->mApertureScaling.empty()) { mApertureScaling = other->mApertureScaling; } if (other->white_max) { white_max = other->white_max; } - -// for (std::map::iterator i=other->mLevels[0].begin(); i!=other->mLevels[0].end(); i++) { -// } } -void -CameraConst::update_Crop(CameraConst *other) +void CameraConst::update_Crop(CameraConst *other) { if (!other) { return; } - if (other->has_rawCrop()) { - other->get_rawCrop(raw_crop[0], raw_crop[1], raw_crop[2], raw_crop[3]); - } + raw_crop.insert(other->raw_crop.begin(), other->raw_crop.end()); } -bool -CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float fnumber) +bool CameraConst::get_Levels(camera_const_levels & lvl, int bw, int iso, float fnumber) const { - std::map::iterator it; - it = mLevels[bw].find(iso); + std::map::const_iterator it = mLevels[bw].find(iso); if (it == mLevels[bw].end()) { - std::map::iterator best_it = mLevels[bw].begin(); + auto best_it = mLevels[bw].cbegin(); if (iso > 0) { for (it = mLevels[bw].begin(); it != mLevels[bw].end(); ++it) { - if (abs(it->first - iso) <= abs(best_it->first - iso)) { + if (std::abs(it->first - iso) <= std::abs(best_it->first - iso)) { best_it = it; } else { break; @@ -527,35 +596,34 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float lvl = it->second; - if (bw == 1 && fnumber > 0 && mApertureScaling.size() > 0) { - std::map::iterator it; - it = mApertureScaling.find(fnumber); + if (bw == 1 && fnumber > 0 && !mApertureScaling.empty()) { + std::map::const_iterator scaleIt = mApertureScaling.find(fnumber); - if (it == mApertureScaling.end()) { + if (scaleIt == mApertureScaling.end()) { // fnumber may be an exact aperture, eg 1.414, or a rounded eg 1.4. In our map we // should have rounded numbers so we translate and retry the lookup // table with traditional 1/3 stop f-number rounding used by most cameras, we only // have in the range 0.7 - 10.0, but aperture scaling rarely happen past f/4.0 - const float fn_tab[8][3] = { - { 0.7, 0.8, 0.9 }, - { 1.0, 1.1, 1.2 }, - { 1.4, 1.6, 1.8 }, - { 2.0, 2.2, 2.5 }, - { 2.8, 3.2, 3.5 }, - { 4.0, 4.5, 5.0 }, - { 5.6, 6.3, 7.1 }, - { 8.0, 9.0, 10.0 } + constexpr float fn_tab[8][3] = { + { 0.7f, 0.8f, 0.9f }, + { 1.f, 1.1f, 1.2f }, + { 1.4f, 1.6f, 1.8f }, + { 2.f, 2.2f, 2.5f }, + { 2.8f, 3.2f, 3.5f }, + { 4.f, 4.5f, 5.f }, + { 5.6f, 6.3f, 7.1f }, + { 8.f, 9.f, 10.f } }; for (int avh = 0; avh < 8; avh++) { for (int k = 0; k < 3; k++) { - float av = (avh - 1) + (float)k / 3; - float aperture = sqrtf(powf(2, av)); + const float av = (avh - 1) + k / 3.f; + const float aperture = std::sqrt(std::pow(2.f, av)); - if (fnumber > aperture * 0.97 && fnumber < aperture / 0.97) { + if (fnumber > aperture * 0.97f && fnumber < aperture / 0.97f) { fnumber = fn_tab[avh][k]; - it = mApertureScaling.find(fnumber); + scaleIt = mApertureScaling.find(fnumber); avh = 7; break; } @@ -563,23 +631,21 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float } } - float scaling = 1.0; + float scaling = 1.f; - if (it == mApertureScaling.end()) { - std::map::reverse_iterator it; - - for (it = mApertureScaling.rbegin(); it != mApertureScaling.rend(); ++it) { - if (it->first > fnumber) { - scaling = it->second; + if (scaleIt == mApertureScaling.end()) { + for (auto entry = mApertureScaling.crbegin(); entry != mApertureScaling.crend(); ++entry) { + if (entry->first > fnumber) { + scaling = entry->second; } else { break; } } } else { - scaling = it->second; + scaling = scaleIt->second; } - if (scaling > 1.0) { + if (scaling > 1.f) { for (int i = 0; i < 4; i++) { lvl.levels[i] *= scaling; @@ -593,24 +659,22 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float return true; } -int -CameraConst::get_BlackLevel(const int idx, const int iso_speed) +int CameraConst::get_BlackLevel(const int idx, const int iso_speed) const { assert(idx >= 0 && idx <= 3); - struct camera_const_levels lvl; + camera_const_levels lvl; - if (!get_Levels(lvl, 0, iso_speed, 0.0)) { + if (!get_Levels(lvl, 0, iso_speed, 0.f)) { return -1; } return lvl.levels[idx]; } -int -CameraConst::get_WhiteLevel(const int idx, const int iso_speed, const float fnumber) +int CameraConst::get_WhiteLevel(const int idx, const int iso_speed, const float fnumber) const { assert(idx >= 0 && idx <= 3); - struct camera_const_levels lvl; + camera_const_levels lvl; if (!get_Levels(lvl, 1, iso_speed, fnumber)) { return -1; @@ -619,48 +683,44 @@ CameraConst::get_WhiteLevel(const int idx, const int iso_speed, const float fnum return lvl.levels[idx]; } -bool -CameraConst::has_globalGreenEquilibration() +bool CameraConst::has_globalGreenEquilibration() const { return globalGreenEquilibration >= 0; } -bool -CameraConst::get_globalGreenEquilibration() +bool CameraConst::get_globalGreenEquilibration() const { return globalGreenEquilibration > 0; } -void -CameraConst::update_globalGreenEquilibration(bool other) +void CameraConst::update_globalGreenEquilibration(bool other) { globalGreenEquilibration = (other ? 1 : 0); } -bool -CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) +bool CameraConstantsStore::parse_camera_constants_file(const Glib::ustring& filename_) { // read the file into a single long string const char *filename = filename_.c_str(); FILE *stream = fopen(filename, "rt"); - if (stream == nullptr) { + if (!stream) { fprintf(stderr, "Could not open camera constants file \"%s\": %s\n", filename, strerror(errno)); return false; } - size_t bufsize = 16384; - size_t increment = 2 * bufsize; + size_t bufsize = 262144; + size_t increment = bufsize; size_t datasize = 0, ret; char *buf = (char *)malloc(bufsize); - while ((ret = fread(&buf[datasize], 1, bufsize - datasize, stream)) != 0) { + while ((ret = fread(&buf[datasize], 1, bufsize - datasize - 1, stream)) != 0) { datasize += ret; - if (datasize == bufsize) { // we need more memory + if (datasize == bufsize - 1) { // we need more memory bufsize += increment; void *temp = realloc(buf, bufsize); // try to realloc buffer with new size - if(!temp) { // realloc failed + if (!temp) { // realloc failed temp = malloc(bufsize); // alloc now buffer if (temp) { // alloc worked memcpy(temp, buf, bufsize - increment); // copy old buffer content to new buffer @@ -683,17 +743,13 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) fclose(stream); - if(datasize == bufsize) { - buf = (char *)realloc(buf, datasize + 1); - } - buf[datasize] = '\0'; // remove comments cJSON_Minify(buf); // parse - cJSON *jsroot = cJSON_Parse(buf); + cJSON* const jsroot = cJSON_Parse(buf); if (!jsroot) { char str[128]; @@ -711,20 +767,16 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) } free(buf); - /*{ - char *js_str = cJSON_Print(jsroot); - printf("%s\n", js_str); - free(js_str); - }*/ - cJSON *js = cJSON_GetObjectItem(jsroot, "camera_constants"); + + const cJSON *js = cJSON_GetObjectItem(jsroot, "camera_constants"); if (!js) { fprintf(stderr, "missing \"camera_constants\" object item\n"); goto parse_error; } - for (js = js->child; js != nullptr; js = js->next) { - cJSON *ji = cJSON_GetObjectItem(js, "make_model"); + for (js = js->child; js; js = js->next) { + const cJSON *ji = cJSON_GetObjectItem(js, "make_model"); if (!ji) { fprintf(stderr, "missing \"make_model\" object item\n"); @@ -738,30 +790,30 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) is_array = true; } - while (ji != nullptr) { + while (ji) { if (ji->type != cJSON_String) { fprintf(stderr, "\"make_model\" must be a string or an array of strings\n"); goto parse_error; } - CameraConst *cc = CameraConst::parseEntry((void *)js, ji->valuestring); + CameraConst* const cc = CameraConst::parseEntry((const void *)js, ji->valuestring); if (!cc) { goto parse_error; } - Glib::ustring make_model(ji->valuestring); - make_model = make_model.uppercase(); + std::string make_model(ji->valuestring); + std::transform(make_model.begin(), make_model.end(), make_model.begin(), ::toupper); - const auto ret = mCameraConstants.emplace(make_model, cc); + const auto entry = mCameraConstants.emplace(make_model, cc); - if(ret.second) { // entry inserted into map + if (entry.second) { // entry inserted into map if (settings->verbose) { printf("Add camera constants for \"%s\"\n", make_model.c_str()); } } else { // The CameraConst already exist for this camera make/model -> we merge the values - CameraConst *existingcc = ret.first->second; + CameraConst* const existingcc = entry.first->second; // updating the dcraw matrix existingcc->update_dcrawMatrix(cc->get_dcrawMatrix()); @@ -809,33 +861,30 @@ CameraConstantsStore::~CameraConstantsStore() } } -void CameraConstantsStore::init(Glib::ustring baseDir, Glib::ustring userSettingsDir) +void CameraConstantsStore::init(const Glib::ustring& baseDir, const Glib::ustring& userSettingsDir) { parse_camera_constants_file(Glib::build_filename(baseDir, "camconst.json")); - Glib::ustring userFile(Glib::build_filename(userSettingsDir, "camconst.json")); + const Glib::ustring userFile(Glib::build_filename(userSettingsDir, "camconst.json")); if (Glib::file_test(userFile, Glib::FILE_TEST_EXISTS)) { parse_camera_constants_file(userFile); } } -CameraConstantsStore * -CameraConstantsStore::getInstance() +CameraConstantsStore* CameraConstantsStore::getInstance() { static CameraConstantsStore instance_; return &instance_; } -CameraConst * -CameraConstantsStore::get(const char make[], const char model[]) +const CameraConst* CameraConstantsStore::get(const char make[], const char model[]) const { - Glib::ustring key(make); + std::string key(make); key += " "; key += model; - key = key.uppercase(); - std::map::iterator it; - it = mCameraConstants.find(key); + std::transform(key.begin(), key.end(), key.begin(), ::toupper); + const auto it = mCameraConstants.find(key); if (it == mCameraConstants.end()) { return nullptr; diff --git a/rtengine/camconst.h b/rtengine/camconst.h index 1096e1767..273bdd7a1 100644 --- a/rtengine/camconst.h +++ b/rtengine/camconst.h @@ -1,54 +1,62 @@ -/* +/* -*- C++ -*- + * * This file is part of RawTherapee. */ #pragma once -#include #include +#include +#include #include +namespace Glib +{ + +class ustring; + +} + namespace rtengine { -struct camera_const_levels { - int levels[4]; -}; - -class CameraConst +class CameraConst final { private: + struct camera_const_levels { + int levels[4]; + }; + std::string make_model; short dcraw_matrix[12]; - int raw_crop[4]; - int raw_mask[8][4]; + std::map, std::array> raw_crop; + std::map, std::array, 2>> raw_mask; int white_max; - std::map mLevels[2]; + 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); - bool get_Levels(struct camera_const_levels & lvl, int bw, int iso, float fnumber); + static bool parseLevels(CameraConst *cc, int bw, const void *ji); + static bool parseApertureScaling(CameraConst *cc, const void *ji); + bool get_Levels(camera_const_levels & lvl, int bw, int iso, float fnumber) const; public: - static CameraConst *parseEntry(void *cJSON, const char *make_model); - bool has_dcrawMatrix(void); - bool has_pdafPattern(void); + static CameraConst *parseEntry(const void *cJSON, const char *make_model); + bool has_dcrawMatrix(void) const; 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(); + const short *get_dcrawMatrix(void) const; + const std::vector& get_pdafPattern() const; + int get_pdafOffset() const {return pdafOffset;}; + bool has_rawCrop(int raw_width, int raw_height) const; + void get_rawCrop(int raw_width, int raw_height, int& left_margin, int& top_margin, int& width, int& height) const; + bool has_rawMask(int raw_width, int raw_height, int idx) const; + void get_rawMask(int raw_width, int raw_height, int idx, int& top, int& left, int& bottom, int& right) const; + int get_BlackLevel(int idx, int iso_speed) const; + int get_WhiteLevel(int idx, int iso_speed, float fnumber) const; + bool has_globalGreenEquilibration() const; + bool get_globalGreenEquilibration() const; void update_Levels(const CameraConst *other); void update_Crop(CameraConst *other); void update_pdafPattern(const std::vector &other); @@ -56,19 +64,20 @@ public: void update_globalGreenEquilibration(bool other); }; -class CameraConstantsStore +class CameraConstantsStore final { private: std::map mCameraConstants; CameraConstantsStore(); - bool parse_camera_constants_file(Glib::ustring filename); + bool parse_camera_constants_file(const Glib::ustring& filename); public: ~CameraConstantsStore(); - void init(Glib::ustring baseDir, Glib::ustring userSettingsDir); + void init(const Glib::ustring& baseDir, const Glib::ustring& userSettingsDir); static CameraConstantsStore *getInstance(void); - CameraConst *get(const char make[], const char model[]); + const CameraConst *get(const char make[], const char model[]) const; }; -} +} // namespace rtengine + diff --git a/rtengine/camconst.json b/rtengine/camconst.json index ab42f3d19..c4bf9b14a 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -70,6 +70,14 @@ Examples: // cropped so the "negative number" way is not totally safe. "raw_crop": [ 10, 20, 4000, 3000 ], + // multi-aspect support (added 2020-12-03) + // "frame" defines the full dimensions the crop applies to + // (with [0, 0] being the fallback crop if none of the other applies) + "raw_crop" : [ + { "frame" : [4100, 3050], "crop": [10, 20, 4050, 3020] }, + { "frame" : [0, 0], "crop": [10, 20, 4000, 3000] } + ] + // Almost same as MaskedAreas DNG tag, used for black level measuring. Here up to two areas can be defined // by tetrads of numbers: "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], @@ -84,6 +92,14 @@ Examples: // 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. + // multi-aspect support (added 2020-12-03) + // "frame" defines the full dimensions the masked areas apply to + // (with [0, 0] being the fallback crop if none of the other applies) + "masked_areas" : [ + { "frame" : [4100, 3050], "areas": [10, 20, 4050, 3020] }, + { "frame" : [0, 0], "areas": [10, 20, 4000, 3000] } + ] + // 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) @@ -314,7 +330,7 @@ Camera constants: { // Quality A "make_model": "Canon EOS 5D Mark II", - "dcraw_matrix": [ 4716,603,-830,-7798,15474,2480,-1496,1937,6651 ], + "dcraw_matrix": [ 4716,603,-830,-7799,15474,2480,-1496,1937,6651 ], "ranges": { // black levels are read from raw masked pixels // white levels are same for all colors, but vary on ISO @@ -360,6 +376,11 @@ Camera constants: } }, + { // Quality C + "make_model": "Canon EOS-1Ds", + "dcraw_matrix": [ 3925, 4060, -1739, -8973, 16552, 2545, -3287, 3945, 8243 ] // DNG + }, + { // Quality C, INTERMEDIATE ISO SAMPLES MISSING "make_model": "Canon EOS-1D X Mark II", "dcraw_matrix": [ 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 ], @@ -401,9 +422,16 @@ Camera constants: } }, + { // Quality C, initial data by @agriggio, white frame samples provided by @noirsabb in #5862, color charts not processed yet + "make_model" : "CANON EOS-1D X MARK III", + "raw_crop": [ 72, 38, 5496, 3670 ], + "masked_areas" : [ 40, 10, 5534, 70 ], + "ranges" : { "white" : 16382 } + }, + { // Quality A "make_model": "Canon EOS 5D Mark III", - "dcraw_matrix": [ 6722,-635,-963,-4287,12460,2028,-908,2162,5668 ], + "dcraw_matrix": [ 6722,-635,-963,-4287,12460,2028,-909,2162,5668 ], "ranges": { // black levels are read from raw masked pixels // white levels are same for all colors, but vary on ISO @@ -430,7 +458,8 @@ Camera constants: { // Quality B, some intermediate ISO samples missing, LENR samples missing so White Levels not properly indicated, some aperture scaling missing "make_model": "Canon EOS 5D Mark IV", - "dcraw_matrix": [ 6446,-366,-864,-4436,12204,2513,-952,2496,6348 ], // DNG_V9.7 D65 + "global_green_equilibration" : true, + "dcraw_matrix": [ 6445,-366,-864,-4436,12204,2513,-953,2496,6348 ], // DNG v13.2 "raw_crop": [ 136, 42, 6740, 4500 ], // full size 6880x4544, official crop 148,54,6867,4533 "masked_areas": [ 54, 4, 4534, 132 ], "ranges": { @@ -521,7 +550,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 useful 120,44,6264x4180 + "raw_crop": [ 120, 44, 6264, 4180 ], // fullraw size 6384x4224 useful 120,44,6264x4180 // TODO: See EOS RP // "raw_crop": [ 128, 52, 6248, 4168 ], // official jpeg crop 120+12,44+12,6240x4160 "masked_areas": [ 44, 4, 4220, 116 ], "ranges": { @@ -553,10 +582,44 @@ Camera constants: } }, + { // Quality B, taken from 6D Mark II because identical sensor (different matrix) + "make_model": "Canon EOS RP", + "dcraw_matrix": [ 8608,-2097,-1178,-5425,13265,2383,-1149,2238,5680 ], // DNG v13.2 + // Let dcraw handle crop, because camconst shouldn't override for different crop factors. See #6255 + "masked_areas": [ 44, 4, 4220, 116 ], // Potential problem for different crop factor as well + "ranges": { + "white": [ + { "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200 ], "levels": 16300 }, // typical 16383 + { "iso": [ 4000, 6400, 8000, 12800 ], "levels": 16200 }, // typical 16383 + { "iso": [ 16000, 25600 ], "levels": 16100 }, // typical 16383 + { "iso": [ 160 ], "levels": 13000 }, // typical 13044 + { "iso": [ 320, 640, 1250, 2500 ], "levels": 13250 }, // typical 13337 + { "iso": [ 5000, 10000 ], "levels": 13100 }, // typical 13367 + { "iso": [ 20000, 40000 ], "levels": 12900 }, // typical 13367 + { "iso": [ 51200, 102400 ], "levels": 15900 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + // no scale factors known for f/1.0 (had no lenses to test with), but the + // ISO 160-320... 13044 white levels maxes out at "white_max" for f/1.2 and below anyway. + { "aperture": 1.2, "scale_factor": 1.130 }, // guessed + { "aperture": 1.4, "scale_factor": 1.100 }, // guessed + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.060 }, // 13890/13044=1.065 11284/10512 = 1.073 + { "aperture": 2.0, "scale_factor": 1.040 }, // 13602/13044=1.042 11151/10512 = 1.060 + { "aperture": 2.2, "scale_factor": 1.030 }, // 10982/10512=1.045 + { "aperture": 2.5, "scale_factor": 1.020 }, // 10840/10512 = 1.030 + { "aperture": 2.8, "scale_factor": 1.010 }, // 13530/13367= 1.012 - 12225/12048 = 1.015 + { "aperture": 3.2, "scale_factor": 1.005 }, // 12194/12048 = 1.012 + { "aperture": 3.5, "scale_factor": 1.000 } // 12092/12048 = 1.004 + ] + } + }, + { // Quality A, ISO and aperture WL data by CharlyW at RawTherapee forums, missing samples safely guessed "make_model": "Canon EOS 7D", "dcraw_matrix": [ 5962,-171,-732,-4189,12307,2099,-911,1981,6304 ], // Colin Walker - //"dcraw_matrix": [ 6844,-996,-856,-3876,11761,2396,-593,1772,6198 ], // dcraw + //"dcraw_matrix": [ 6843,-996,-856,-3876,11761,2396,-593,1772,6198 ], // DNG v13.2 "ranges": { "white": [ { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584 @@ -610,7 +673,7 @@ Camera constants: { // Quality A - ISO and aperture WL data by Ilias at Avclub gr forums "make_model": "Canon EOS 40D", - "dcraw_matrix": [ 6071,-747,-856,-7653,15365,2441,-2025,2553,7315 ], + "dcraw_matrix": [ 6070,-746,-856,-7652,15365,2442,-2026,2553,7314 ], // DNG v13.2 "raw_crop": [ 30, 18, 3908, 2602 ], "masked_areas": [ 20, 2, 2616, 20 ], "ranges": { @@ -639,7 +702,7 @@ Camera constants: { // Quality A, ISO and aperture WL data by Ayshih at Magic Lantern forums "make_model": "Canon EOS 50D", - "dcraw_matrix": [ 4920,616,-593,-6493,13964,2784,-1774,3178,7005 ], + "dcraw_matrix": [ 4920,616,-593,-6494,13965,2784,-1774,3178,7004 ], // DNG v13.2 "ranges": { "white": [ { "iso": [ 100, 125 ], "levels": 13300 }, // typical 13432 @@ -689,7 +752,8 @@ Camera constants: { // Quality A, ISO and aperture WL data by Shalrath at RawTherapee forums "make_model": "Canon EOS 60D", - "dcraw_matrix": [ 6719,-994,-925,-4408,12426,2211,-887,2129,6051 ], + "dcraw_matrix": [ 6719,-994,-925,-4408,12426,2211,-887,2129,6051 ], // Origin unknown + //"dcraw_matrix": [ 6941, -1164, -857, -3825, 11597, 2534, -416, 1540, 6039 ], // DNG v13.2 "ranges": { "white": [ { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13583 @@ -742,7 +806,7 @@ Camera constants: { // Quality B, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed "make_model": "Canon EOS 80D", - "dcraw_matrix": [ 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 ], // DNG_V9.5 D65 + "dcraw_matrix": [ 7457,-672,-937,-4849,12495,2643,-1213,2354,5492 ], // DNG v13.2 "raw_crop": [ 264, 34, 6024, 4022 ], // full size 6288x4056, official crop 276,46,6275,4045 "masked_areas": [ 40, 96, 4000, 260 ], "ranges": { @@ -807,7 +871,8 @@ Camera constants: // Canon mid-range DSLRs (Rebels) { // Quality C - "make_model": [ "Canon EOS 400D DIGITAL" ], + "make_model": "Canon EOS 400D DIGITAL", + "dcraw_matrix": [ 7054, -1501, -990, -8156, 15544, 2812, -1278, 1414, 7796 ], "ranges": { "white": 4056 } @@ -865,8 +930,8 @@ Camera constants: } }, - { // Quality A, only one scaling factor missing and guessed safely, EOS 700D not tested but available samples look same as 650D - "make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i", "Canon EOS Kiss X6i", "Canon EOS 700D", "Canon EOS Rebel T5i", "Canon EOS Kiss X7i" ], + { // Quality A, only one scaling factor missing and guessed safely, EOS 700D not tested but available samples look same as 650D, EOS 100D shares sensor and came out the same time as the 700D + "make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i", "Canon EOS Kiss X6i", "Canon EOS 700D", "Canon EOS Rebel T5i", "Canon EOS Kiss X7i", "Canon EOS 100D", "Canon EOS Rebel SL1", "Canon EOS Kiss X7" ], "dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ], "ranges": { "white": [ @@ -922,7 +987,7 @@ Camera constants: { // 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 + "dcraw_matrix": [ 6969,-512,-968,-4425,12161,2553,-739,1981,5601 ], // DNG v13.2 "raw_crop": [ 264, 36, 6024, 4020 ], // full size 6288x4056, official crop 276,48,6275,4047 "masked_areas": [ 40, 96, 4000, 260 ], "ranges": { @@ -1014,6 +1079,14 @@ Camera constants: } }, + { // Quality C, samples provided by falket #5495 + "make_model": [ "Canon EOS 2000D", "Canon EOS Rebel T7", "Canon EOS Kiss X90" ], + // raw_crop is handled by dcraw + // "dcraw_matrix": [ 8532, -701, -1167, -4095, 11879, 2508, -797, 2424, 7010 ], // Adobe DNG v.10.3 + "dcraw_matrix": [ 8300, -2110, -1120, -4917, 12694, 2482, -938, 2141, 5666 ], // Adobe DNG v.10.3 (v2) + "ranges": { "white": 15300 } // typical value, very non-linear behavior near clipping + }, + // Canon MILC (mirrorless interchangeable-lens camera) { // Quality B, missing scaling factors are guessed safely from 650D relative data @@ -1045,7 +1118,7 @@ Camera constants: { // Quality C, inconsistent WL per ISO, missing scaling factors "make_model": "Canon EOS M10", - "dcraw_matrix": [ 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 ], // DNGv9.3 D65 + "dcraw_matrix": [ 6400,-480,-888,-5294,13415,2047,-1296,2203,6137 ], // DNG v13.2 "ranges": { "white": [ { "iso": [ 100, 125, 160, 320, 500, 2000, 4000, 6400 ], "levels": 16300 }, // typical 16383 @@ -1143,12 +1216,75 @@ Camera constants: "raw_crop": [ 144, 72, 6984, 4660 ] }, - { // Quality C, only raw crop + { // Quality B, samples by jonathanBieler (#5922). No dual-pixel information. "make_model": [ "Canon EOS R" ], - "raw_crop": [ 144, 46, 6744, 4500 ] + "dcraw_matrix" : [ 8293, -1789, -1094, -5025, 12925, 2327, -1199, 2769, 6108 ], // DNG v2 style + "raw_crop": [ 144, 46, 6744, 4500 ], + "masked_areas": [ 50, 40, 4540, 140 ], // Taken from ART + "ranges" : { "white" : 16367 } // Typically 16383 without LENR, with LENR safest value is 15800 for ISO 25600 + }, + + { // Quality C + "make_model": "Canon EOS R3", + "dcraw_matrix" : [ 9423, -2839, -1195, -4532, 12377, 2415, -483, 1374, 5276 ], + "raw_crop": [ 160, 120, 6024, 4024 ] + }, + + { // Quality C + "make_model": "Canon EOS R5", + "dcraw_matrix" : [9766, -2953, -1254, -4276, 12116, 2433, -437, 1336, 5131], + "raw_crop" : [ + { "frame" : [ 8352, 5586 ], "crop" : [ 128, 96, 8224, 5490 ] }, + { "frame" : [ 5248, 3510 ], "crop" : [ 128, 96, 5120, 3382 ] } + ], + "masked_areas" : [ + { "frame" : [ 8352, 5586 ], "areas": [ 94, 20, 5578, 122 ] }, + { "frame" : [ 5248, 3510 ], "areas": [ 94, 20, 3510, 122 ] } + ], + "ranges" : { "white" : 16382 } + }, + + { // Quality C + "make_model": "Canon EOS R6", + "dcraw_matrix" : [8293, -1611, -1132, -4759, 12710, 2275, -1013, 2415, 5508], + "raw_crop": [ + { "frame": [5568, 3708], "crop" : [ 72, 38, 5496, 3670 ] }, + { "frame": [3584, 2386], "crop" : [ 156, 108, 3404, 2270 ] } + ], + "masked_areas" : [ + { "frame": [5568, 3708], "areas": [ 40, 10, 5534, 70 ] }, + { "frame": [3584, 2386], "areas": [ 40, 10, 2374, 110 ] } + ], + "ranges" : { "white" : 16382 } + }, + + { // Quality C + "make_model": ["Canon EOS R6m2", "Canon EOS R8"], + "dcraw_matrix": [9539, -2795, -1224, -4175, 11998, 2458, -465, 1755, 6048], + "raw_crop": [ + {"frame": [6188, 4120], "crop": [154, 96, 6024, 4024]}, + {"frame": [3936, 2612], "crop": [156, 96, 3780, 2516]} + ], + "masked_areas": [ + {"frame": [6188, 4120], "areas": [4, 4, 4116, 150, 4, 150, 92, 6184]}, + {"frame": [3936, 2612], "areas": [4, 4, 2608, 150, 4, 150, 92, 3932]} + ] + }, + + { // Quality C + "make_model": "Canon EOS R7", + "dcraw_matrix" : [10424, -3138, -1300, -4221, 11938, 2584, -547, 1658, 6183], + "raw_crop": [ 144, 72, 6984, 4660 ], + "masked_areas" : [ 70, 20, 4724, 138 ] + }, + + { // Quality C + "make_model": "Canon EOS R10", + "dcraw_matrix" : [9269, -2012, -1107, -3990, 11762, 2527, -569, 2093, 4913], + "raw_crop": [ 144, 40, 6048, 4020 ], + "masked_areas" : [ 38, 20, 4052, 138 ] }, -// Canon Powershot { // Quality C, CHDK DNGs, raw frame correction "make_model": "Canon PowerShot A3100 IS", "raw_crop": [ 24, 12, 4032, 3024 ] // full size 4036X3026 @@ -1195,7 +1331,8 @@ Camera constants: { // Quality B "make_model": "Canon PowerShot G3 X", - "dcraw_matrix": [ 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 ], // DNG_V9.1.1 D65 + //"dcraw_matrix": [ 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 ], // DNG_V9.1.1 D65 + "dcraw_matrix": [ 6941, -1164, -857, -3825, 11597, 2534, -416, 1540, 6039 ], // DNG v13.2 - looks worse "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 "masked_areas": [ 40, 4, 3680, 76 ], "ranges": { "white": 16300 } @@ -1203,7 +1340,7 @@ Camera constants: { // Quality B, "make_model": "Canon PowerShot G7 X", - "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65 + "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1414,5049 ], // DNG v13.2 //"raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4 "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 "masked_areas": [ 40, 4, 3680, 76 ], @@ -1211,17 +1348,27 @@ Camera constants: }, { // Quality B, - "make_model": [ "Canon PowerShot G5 X", "Canon PowerShot G9 X", "Canon PowerShot G7 X Mark II", "Canon PowerShot G9 X Mark II" ], - "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65 + "make_model": [ "Canon PowerShot G5 X", "Canon PowerShot G7 X Mark II" ], + "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1414,5049 ], // DNG v13.2 //"raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4 "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 "masked_areas": [ 40, 4, 3680, 76 ], "ranges": { "white": 15500 } // some sporadic samples are clipped lower than 16383, one ISO125 sample at 15500 }, + { // Quality B, separated entry from above due to alternate color matrix (effect unsure) + "make_model": "Canon PowerShot G9 X Mark II", + "dcraw_matrix": [ 10056, -4131, -944, -2576, 11143, 1625, -239, 1293, 5179 ], // DNG v13.2 + //"dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1414,5049 ], // DNG v8.7 + "raw_crop": [ 128, 36, 5480, 3656 ], + "masked_areas": [ 40, 4, 3680, 76 ], + "ranges": { "white": 15500 } + }, + { // Quality A, changes for raw crop which is wrong (larger) in dcraw "make_model": "Canon PowerShot S120", - "dcraw_matrix": [ 6961,-1685,-695,-4625,12945,1836,-1114,2152,5518 ], + "dcraw_matrix": [ 6941, -1164, -857, -3825, 11597, 2534, -416, 1540, 6039 ], // Adobe DNG v13.2 + //"dcraw_matrix": [ 6961, -1685, -695, -4625, 12945, 1836, -1114, 2152, 5518 ], // Adobe DNG v12.2 "raw_crop": [ 120, 30, 4024, 3030 ], "masked_areas": [ 32, 2, 3028, 80 ], "ranges": { "white": 4050 } @@ -1229,17 +1376,24 @@ Camera constants: { // Quality C "make_model": "Canon PowerShot SX50 HS", + "dcraw_matrix": [ 12432, -4753, -1247, -2110, 10691, 1629, -412, 1623, 4926 ], "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 + "dcraw_matrix": [ 13161,-5451,-1344,-1989,10653,1531,-47,1271,4955 ], // DNG v13.2 "raw_crop": [ 120, 34, 4616, 3464 ], // full raw 4768x3516, Usable 96,16,4672,3498 - Canon official 4608x3456 left 124 top 38, "masked_areas": [ 20, 2, 3480, 80 ], "ranges": { "white": 4050 } // nominal 4080-4093 }, + { // Quality C, only raw crop + "make_model": "Canon PowerShot SX70 HS", + "dcraw_matrix" : [18285, -8907, -1951, -1845, 10688, 1323, 364, 1101, 5139], // taken from ART + "raw_crop": [ 96, 17, 5248, 3932 ] + }, + { // Quality C "make_model": "Canon PowerShot SX150 IS", "dcraw_matrix": [ 13481, -4867, -1063, -2074, 9960, 2472, -170, 1474, 3894 ], // Adobe DNG Converter 11.1 ColorMatrix1 (there is only one matrix and illuminant, and it's for daylight) @@ -1253,9 +1407,7 @@ Camera constants: { // Quality C "make_model": [ "DJI FC2103" ], - "ranges": { - "black": 4080 - } + "ranges": { "black": 4080 } }, { // Quality C @@ -1264,12 +1416,22 @@ Camera constants: }, { // Quality C - "make_model": "FUJIFILM GFX 100", - "raw_crop": [ 0, 2, 11664, 8734 ] + "make_model": "DJI FC3170", + "ranges": { "white": 65472 } + }, + + { // Quality C + "make_model": [ "FUJIFILM GFX 100", "FUJIFILM GFX100S" ], + "dcraw_matrix" : [ 16212, -8423, -1583, -4336, 12583, 1937, -195, 726, 6199 ], // taken from ART + "raw_crop": [ + // multi-aspect crop to account for 16-shot pixel shift images + { "frame" : [11808, 8754], "crop" : [ 0, 2, 11664, 8734 ] }, + { "frame" : [23616, 17508], "crop" : [ 0, 4, 23328, 17468 ] } + ] }, { // Quality B - "make_model": "FUJIFILM GFX 50S", + "make_model": [ "FUJIFILM GFX 50R", "FUJIFILM GFX 50S", "FUJIFILM GFX50S II" ], "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 - useful 8280x6208 @@ -1335,16 +1497,30 @@ Camera constants: "ranges": { "white": 4050 } }, + { // Quality C + "make_model": "Fujifilm X-A20", + "ranges": { "white": 3838 } + }, + { // Quality B - "make_model": [ "FUJIFILM X-T1", "FUJIFILM X-T10", "FUJIFILM X-E2" ], + "make_model": [ "FUJIFILM X-T10", "FUJIFILM X-E2" ], "dcraw_matrix": [ 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 ], // DNG D65 //"dcraw_matrix": [ 9289,-3279,-632,-3539,11137,2758,-1049,1950,6544 ], // X-RITE D55 - //"raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296 - experimental crop + //"raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296 "ranges": { "white": 16100 } }, + { // Quality B, samples provided by Claes + "make_model": "FUJIFILM X-T1", + "dcraw_matrix": [ 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 ], // DNG D65 + "raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296 + "ranges": { "white": [ 16202, 16277, 16232 ] } // LENR on from ISO4000+ negligibly underestimates white level + // No aperture scaling data provided, but likely negligible + }, + { // Quality C "make_model": [ "FUJIFILM X-T100" ], + "dcraw_matrix" : [11673, -4760, -1041, -3988, 12058, 2166, -771, 1417, 5568], // taken from ART "ranges": { "white": 16100 } }, @@ -1361,7 +1537,7 @@ Camera constants: }, { // Quality B - "make_model": [ "FUJIFILM X-T2", "FUJIFILM X-T20", "FUJIFILM X-E3", "FUJIFILM X100F", "FUJIFILM X-PRO2", "FUJIFILM X-H1" ], + "make_model": [ "FUJIFILM X-T20", "FUJIFILM X-E3", "FUJIFILM X100F", "FUJIFILM X-H1" ], "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 // "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 @@ -1369,9 +1545,43 @@ Camera constants: "ranges": { "white": 16100 } }, - { // Quality C, only raw crop - "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30" ], - "raw_crop": [ 0, 5, 6252, 4176] + { // Quality C + "make_model": "FUJIFILM X-E4", + "dcraw_matrix": [ 13426, -6334, -1177, -4244, 12136, 2371, -580, 1303, 5980 ], // DNG v13.2 + "raw_crop": [ 0, 5, 6252, 4126 ] + }, + + { // Quality B, samples provided by Daniel Catalina #5824 + "make_model": "FUJIFILM X-T2", + "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 + "raw_crop": [ 0, 5, 6032, 4026 ], // xee X-T20 + "ranges": { "white": [ 16195, 16270, 16195 ] } // With LENR on and ISO4000+ starts to overestimate white level, more realistic would be 16090 + // Negligible aperture scaling effect + }, + + { // Quality B, samples provided by Claes + "make_model": "FUJIFILM X-PRO2", + "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 + "raw_crop": [ 0, 5, 6032, 4026 ], // see X-T2 + "ranges": { "white": [ 16105, 16270, 16082 ] } // These values are the lowest pixel values >16000 for all ISOs. LENR has a negligible effect. + // No aperture scaling data provided, but likely negligible + }, + + { // Quality A, samples provided by Daniel Catalina (#5839) and pi99y (#5860) + "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-PRO3" ], + "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65 + "raw_crop": [ 0, 5, 6252, 4176], + "white": [ 16170, 16275, 16170 ] // typical safe-margins with LENR + // negligible aperture scaling effect + }, + + { // Quality B + "make_model": [ "FUJIFILM X-T30", "FUJIFILM X-T30 II", "FUJIFILM X100V", "FUJIFILM X-T4", "FUJIFILM X-S10" ], + "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65 + "raw_crop": [ + {"frame": [6384, 3348], "crop": [624, 0, 5004, 3347]}, // Sports finder mode. + {"frame": [0, 0], "crop": [0, 5, 6252, 4176]} + ] }, { // Quality B @@ -1386,12 +1596,42 @@ Camera constants: "ranges": { "white": 4040 } }, + { // Quality B + "make_model": [ "FUJIFILM X-T5", "FUJIFILM X-H2" ], + "dcraw_matrix": [ 11809, -5358, -1141, -4248, 12164, 2343, -514, 1097, 5848 ], // RawSpeed / DNG + "raw_crop": [ 0, 5, 7752, 5184 ] + }, + + { // Quality C + "make_model": "FUJIFILM DBP for GX680", + "dcraw_matrix": [ 12741, -4916, -1420, -8510, 16791, 1715, -1767, 2302, 7771 ], // same as S2Pro as per LibRaw + "ranges": { "white": 4096, "black": 132 } + }, + + { // Quality C, Leica C-Lux names can differ? + "make_model" : [ "LEICA C-LUX", "LEICA CAM-DC25" ], + "dcraw_matrix" : [7790, -2736, -755, -3452, 11870, 1769, -628, 1647, 4898] + }, + + { // Quality B + "make_model" : "LEICA D-LUX 7", + "dcraw_matrix" : [11577, -4230, -1106, -3967, 12211, 1957, -758, 1762, 5610] // DNG + // "dcraw_matrix" : [8585, -3127, -833, -4005, 12250, 1953, -650, 1494, 4862] // DNG alternate + }, + { // Quality B, Matrix from Adobe's dcp D65 instead of the internal in Leica's DNG "make_model": "LEICA Q (Typ 116)", "dcraw_matrix": [ 10068,-4043,-1068,-5319,14268,1044,-765,1701,6522 ], // DCP D65 "raw_crop": [ 4, 4, -4, -4 ] // full raw 6016x4016, Official 6000x4000 }, + // TODO: Temporary workaround for issues #6237 and #6498. + //{ // Quality C + // "make_model": "LEICA M8", + // "dcraw_matrix": [ 7675, -2196, -305, -5860, 14119, 1855, -2425, 4006, 6578 ], // DNG + // "ranges": { "white": 16383 } + //}, + { // Quality C "make_model": "LEICA Q2", "raw_crop": [ 0, 0, 8392, 5624 ] @@ -1408,6 +1648,16 @@ Camera constants: "raw_crop": [ 0, 0, 0, -18 ] // 18 rows at bottom are garbage }, + { // Quality C, only raw crop + "make_model": "Leica SL2-S", + "raw_crop": [ 0, 2, 0, -4 ] // 2 rows at top and 4 rows at bottom are garbage + }, + + { // Quality C + "make_model" : ["LEICA V-LUX 5","Panasonic DC-FZ1000M2"], + "dcraw_matrix" : [9803, -4185, -992, -4066, 12578, 1628, -838, 1824, 5288] // DNG + }, + { // Quality C "make_model": "LG mobile LG-H815", "dcraw_matrix": [ 5859,547,-1250,-6484,15547,547,-2422,5625,3906 ], // DNG D65 @@ -1423,15 +1673,21 @@ Camera constants: }, { // Quality A - "make_model": [ "Nikon 1 V3", "Nikon 1 J4" ], // Same format + "make_model": "Nikon 1 V3", "dcraw_matrix": [ 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 ], // matrix from DNG_v8.5 d65 //"dcraw_matrix": [ 5306,-1066,-469,-3865,11189,3076,-399,1341,5120 ], // matrix dXo D50, "ranges": { "white": 4080 } // Black is auto extracted from Exif, lower WL to 4080 from 4095 due to some non linearity detected at raw highlights }, + { // Quality A + "make_model": "Nikon 1 J4", // Similar to V3, different matrix + "dcraw_matrix": [ 6588, -1305, -693, -3277, 10987, 2634, -355, 2016, 5106 ], // DNG v13.2 + "ranges": { "white": 4080 } + }, + { // Quality B "make_model": "Nikon 1 J5", // - "dcraw_matrix": [ 7520,-2518,-645,-3844,12102,1945,-913,2249,6835 ], // DNG_v9.1 D65 + "dcraw_matrix": [ 7520,-2519,-645,-3844,12102,1945,-914,2249,6835 ], // DNG v13.2 //"dcraw_matrix": [ 7651,-2102,-751,-3299,11101,1651,-1011,2242,5770 ], // matrix from ICC converted to dcraw format XYZ on ImagingResource still life sample "ranges": { "white": [ @@ -1448,13 +1704,23 @@ Camera constants: "ranges": { "white": 4080 } // BL autodetected from Exif }, -// For all Nikon DSLRs which have multiple bitdepth options (14- and 12-bit) we define the 14-bit value and RT adapts it to 12-bit -// when a 12-bit bitdepth is detected (WL12 = WL14*4095/16383) + { // Quality C + "make_model": "Nikon D2Hs", + "dcraw_matrix": [ 5733, -911, -629, -7967, 15987, 2055, -3050, 4013, 7048 ] // DNG + }, + + { // Quality C + "make_model": "Nikon D2Xs", + "dcraw_matrix": [ 10230, -2768, -1255, -8302, 15900, 2551, -797, 680, 7148 ] // DNG + }, + + // For all Nikon DSLRs which have multiple bitdepth options (14- and 12-bit) we define the 14-bit value and RT adapts it to 12-bit + // when a 12-bit bitdepth is detected (WL12 = WL14*4095/16383) { // Quality B, samples by Johan Thor at RT.Issues, measures at long exposures with LENR are missing // but a safety margin is included - aperture scaling makes no significant difference "make_model": "Nikon D3S", - "dcraw_matrix": [ 8828,-2406,-694,-4874,12603,2541,-660,1509,7587 ], // dcp d65 + "dcraw_matrix": [ 8828,-2406,-694,-4874,12603,2541,-660,1509,7586 ], // DNG v13.2 "ranges": { "white": [ { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500 ], "levels": 15520 }, // typical G1,G2 15520-15800 R,B 16383 @@ -1489,6 +1755,7 @@ Camera constants: { // Quality B, lacks aperture and ISO scaling, known to exist, but little to gain as the levels are so close to white_max "make_model": "Nikon D7000", "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], // matrix provided by Tanveer(tsk1979) + //"dcraw_matrix": [ 8198, -2239, -725, -4871, 12388, 2798, -1043, 2050, 7181 ], // DNG v13.2 "ranges": { // measured at ISO 100. ISO differences not measured, but known to exist "white": [ 16300, 15700, 16300 ], // typical R 16383, G 15778, B 16383 @@ -1499,7 +1766,7 @@ Camera constants: { // Quality B "make_model": "NIKON COOLPIX A", - "dcraw_matrix": [ 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 ], // dng_d65 + "dcraw_matrix": [ 8198,-2239,-725,-4871,12388,2798,-1043,2050,7181 ], // DNG v13.2 "ranges": { "white": [ { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500, 640, 800 ], "levels": [ 16300, 15700, 16300 ] }, // typical G1,G2 15760-15800 R,B 16383 @@ -1512,24 +1779,54 @@ Camera constants: } }, - { // Quality B + { // Quality A, samples provided by dimonoid (#5842) "make_model": "NIKON COOLPIX P1000", "dcraw_matrix": [ 14294, -6116, -1333, -1628, 10219, 1637, -14, 1158, 5022 ], // ColorMatrix2 from Adobe DNG Converter 11.4 - "ranges": { "black": 200, "white": 4093 } + "ranges": { + "black": 200, + "white": [ 4000, 4050, 3950 ] // Typical values without LENR: 4009, 4093, 3963 + } // No significant influence of ISO + // No aperture scaling reported + }, + + { // Quality B, samples provided by arvindpgh (#6066) + // Sensor shows some non-uniformity, need other sample to verify + // There seems to be some aperture scaling, but insufficient data to accurately determine + "make_model": "Nikon COOLPIX P950", + "dcraw_matrix": [ 13307,-5642,-1290,-2048,10581,1689,-64,1222,5175 ], // DNG v13.2 + "ranges": { + "black": 200, + "white": [ + { "iso": [ 100 ], "levels": [ 3994, 4093, 3963 ] }, // LENR can be quite aggressive at higher ISO + { "iso": [ 200 ], "levels": [ 3993, 4092, 3962 ] }, + { "iso": [ 400 ], "levels": [ 3992, 4091, 3961 ] }, + { "iso": [ 800, 1600, 3200, 6400 ], "levels": [ 3996, 4095, 3965 ] } + ] + } }, { // Quality B, no LENR samples "make_model": "Nikon D5", - "dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 ], // adobe dng_v9.5 d65 + "dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-754,1486,6338 ], // DNG v13.2 "ranges": { "black": 0, "white": 16300 } // WL typical 16383 set to 16300 for safety }, + { // Quality C + "make_model": "Nikon D6", + "dcraw_matrix": [ 9028, -3423, -1035, -6321, 14265, 2217, -1013, 1683, 6928 ] // DNG + }, + { // Quality B "make_model": "Nikon D3400", "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v9.7 d65 "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety }, + { // Quality C + "make_model": "Nikon D3500", + "dcraw_matrix": [ 8821, -2938, -785, -4178, 12142, 2287, -824, 1651, 6860 ] // DNG + }, + { // Quality B "make_model": "Nikon D5300", "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v8.8 d65 @@ -1554,6 +1851,12 @@ Camera constants: "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety, }, + { // Quality C + "make_model": "Nikon D300s", + "dcraw_matrix": [ 9030, -1992, -716, -8465, 16302, 2256, -2689, 3217, 8068 ] // DNG + //"dcraw_matrix": [ 9000, -1966, -711, -7030, 14976, 2185, -2354, 2959, 7990 ] // DNG alternate + }, + { // Quality B, samples by joachip at RT forums, are measures at long exposures with LongExposureNoiseReduction // aperture scaling known to exist, but little to gain as the levels are so close to white_max "make_model": "Nikon D600", @@ -1589,7 +1892,7 @@ Camera constants: { // Quality B, data from RusselCottrell at RT forums. sensor is not uniform "make_model": "Nikon D700", - "dcraw_matrix": [ 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 ], + "dcraw_matrix": [ 8139,-2171,-664,-8748,16541,2296,-1924,2008,8093 ], // DNG v13.2 //"dcraw_matrix": [ 9336,-3405,14,-7321,14779,2764,-914,1171,8248 ], // illuminant A "ranges": { "white": [ 15500, 15500, 15500 ] } // Non linearities start at 15500 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892 @@ -1598,10 +1901,15 @@ Camera constants: { // Quality B, "make_model": "Nikon D750", - "dcraw_matrix": [ 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 ], // adobe dcp d65 DNGv8.7 + "dcraw_matrix": [ 9020,-2890,-715,-4535,12436,2348,-934,1918,7086 ], // DNG v13.2 "ranges": { "white": 16300 } // WL values for 14-bit files, RT auto adapts it for 12-bit files. TypicalWL 16383 set to 16300 for safety }, + { // Quality C + "make_model": "Nikon D780", + "dcraw_matrix": [ 9943, -3270, -839, -5323, 13269, 2259, -1198, 2083, 7557 ] // DNG + }, + { // Quality B, data from RussellCottrell at RT forums. Largest aperture scale factor is 1.013, about 1/50th of a stop "make_model": [ "Nikon D800", "Nikon D800E" ], "dcraw_matrix": [ 7866,-2108,-555,-4869,12483,2681,-1176,2069,7501 ], // D800/D800E from dcraw.c @@ -1621,9 +1929,14 @@ Camera constants: "ranges": { "white": 16300 } // WL values for 14-bit files, RT auto adapts it for 12-bit files. Typical WL at 16383 }, + { // Quality C + "make_model": "Nikon D810A", + "dcraw_matrix": [ 11973, -5685, -888, -1965, 10326, 1901, -115, 1123, 7169 ] // DNG + }, + { // Quality A, Samples by zorgtool at RT forums "make_model": "Nikon D850", - "dcraw_matrix": [ 10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785 ], // DNGv9.12.1 d65 + "dcraw_matrix": [ 10405,-3755,-1270,-5461,13787,1792,-1040,2015,6785 ], // DNG v13.2 "ranges": { "white": [ { "iso": [ 64, 80, 100, 125, 160, 200, 250, 320 ], "levels": [ 16250, 16050, 16250 ] }, // R,B 16383 G1,G2 16145-16155 @@ -1653,26 +1966,100 @@ Camera constants: } }, + { // Quality C + "make_model": "Nikon D70s", + "dcraw_matrix": [ 7732, -2421, -789, -8238, 15883, 2498, -859, 783, 7330 ] // DNG + }, + { // Quality B "make_model": "Nikon D80", - "dcraw_matrix": [ 8629,-2410,-883,-9055,16940,2171,-1490,1363,8520 ], // Dcraw.c d65 + "dcraw_matrix": [ 8628,-2410,-883,-9055,16940,2171,-1491,1363,8520 ], // DNG v13.2 "ranges": { "white": 3980 } // 12-bit files. }, { // Quality C, only color matrix and PDAF lines info "make_model" : "Nikon Z 7", - "dcraw_matrix" : [10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785], // Adobe DNG Converter 11.0 ColorMatrix2 + "dcraw_matrix" : [10405,-3755,-1270,-5461,13787,1792,-1040,2015,6785], // DNG v13.2 "pdaf_pattern" : [0, 12], "pdaf_offset" : 29 }, + { // Quality C + "make_model" : "Nikon Z 7_2", + "dcraw_matrix" : [13705, -6004, -1401, -5464, 13568, 2062, -940, 1706, 7618] // DNG + }, + + { // Quality C + "make_model" : "NIKON Z 9", + "dcraw_matrix" : [13389, -6049, -1441, -4544, 12757, 1969, 229, 498, 7390] //DNG + }, + { // Quality C, only color matrix and PDAF lines info "make_model" : "Nikon Z 6", - "dcraw_matrix" : [8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464], // Adobe DNG Converter 11.1 Beta ColorMatrix2 + "dcraw_matrix" : [8210, -2534, -683, -5355, 13338, 2212, -1143, 1928, 6464], // DNG v13.2 "pdaf_pattern" : [0, 12], "pdaf_offset" : 32 }, + { // Quality C + "make_model" : "Nikon Z 6_2", + "dcraw_matrix" : [9943, -3270, -839, -5323, 13269, 2259, -1198, 2083, 7557] // DNG + }, + + { // Quality C + "make_model" : "NIKON Z 5", + "dcraw_matrix" : [8695, -2559, -648, -5015, 12710, 2575, -1280, 2215, 7514] // DNG v13.2 + }, + + { // Quality A, white levels and PDAF lines measured by Yann Leprince #5851 + "make_model" : [ "Nikon Z 50", "Nikon Z fc" ], + "dcraw_matrix" : [11640, -4829, -1079, -5107, 13006, 2325, -972, 1711, 7380], // Adobe DNG Converter 12.2.1 ColorMatrix2 (D65) + "ranges": { + "white": [ + // White level was consistently measured at 16383 for non-LENR images. These values are computed using + // 16383 - 6 * read_noise (where read_noise values are extracted from + // https://www.photonstophotos.net/Charts/RN_ADU.htm#Nikon%20Z%2050_14 for iso < 1600, fitted in the + // 1600-10183 range, and extrapolated from that fit into the 12800-204800 range, where the read noise + // provided by photonstophotos is underestimated due to in-body noise reduction. These values were + // verified to be below the 1st percentile of the distribution, on LENR white frames taken with a 2 s + // shutter in a variety of conditions (apertures from 1.8 to 6.3). + {"iso": 100, "levels": 16374}, + {"iso": 126, "levels": 16371}, + {"iso": 159, "levels": 16367}, + {"iso": 200, "levels": 16367}, + {"iso": 251, "levels": 16364}, + {"iso": 318, "levels": 16360}, + {"iso": 400, "levels": 16366}, + {"iso": 503, "levels": 16364}, + {"iso": 636, "levels": 16362}, + {"iso": 800, "levels": 16358}, + {"iso": 1006, "levels": 16349}, + {"iso": 1273, "levels": 16345}, + {"iso": 1600, "levels": 16337}, + {"iso": 2011, "levels": 16327}, + {"iso": 2546, "levels": 16313}, + {"iso": 3200, "levels": 16298}, + {"iso": 4022, "levels": 16278}, + {"iso": 5091, "levels": 16253}, + {"iso": 6400, "levels": 16223}, + {"iso": 8045, "levels": 16186}, + {"iso": 10183, "levels": 16139}, + {"iso": 12800, "levels": 16082}, + {"iso": 16090, "levels": 16013}, + {"iso": 20366, "levels": 15924}, + {"iso": 25600, "levels": 15818}, + {"iso": 32180, "levels": 15687}, + {"iso": 40731, "levels": 15521}, + {"iso": 51200, "levels": 15321}, + {"iso": 102400, "levels": 14388}, + {"iso": 204800, "levels": 12633} + ] + }, + "pdaf_offset": 0, + // Every 12th line from 285 to 3441. These lines (specifically, the blue subpixels) have a lower standard deviation on a black frame. + "pdaf_pattern": [285, 297, 309, 321, 333, 345, 357, 369, 381, 393, 405, 417, 429, 441, 453, 465, 477, 489, 501, 513, 525, 537, 549, 561, 573, 585, 597, 609, 621, 633, 645, 657, 669, 681, 693, 705, 717, 729, 741, 753, 765, 777, 789, 801, 813, 825, 837, 849, 861, 873, 885, 897, 909, 921, 933, 945, 957, 969, 981, 993, 1005, 1017, 1029, 1041, 1053, 1065, 1077, 1089, 1101, 1113, 1125, 1137, 1149, 1161, 1173, 1185, 1197, 1209, 1221, 1233, 1245, 1257, 1269, 1281, 1293, 1305, 1317, 1329, 1341, 1353, 1365, 1377, 1389, 1401, 1413, 1425, 1437, 1449, 1461, 1473, 1485, 1497, 1509, 1521, 1533, 1545, 1557, 1569, 1581, 1593, 1605, 1617, 1629, 1641, 1653, 1665, 1677, 1689, 1701, 1713, 1725, 1737, 1749, 1761, 1773, 1785, 1797, 1809, 1821, 1833, 1845, 1857, 1869, 1881, 1893, 1905, 1917, 1929, 1941, 1953, 1965, 1977, 1989, 2001, 2013, 2025, 2037, 2049, 2061, 2073, 2085, 2097, 2109, 2121, 2133, 2145, 2157, 2169, 2181, 2193, 2205, 2217, 2229, 2241, 2253, 2265, 2277, 2289, 2301, 2313, 2325, 2337, 2349, 2361, 2373, 2385, 2397, 2409, 2421, 2433, 2445, 2457, 2469, 2481, 2493, 2505, 2517, 2529, 2541, 2553, 2565, 2577, 2589, 2601, 2613, 2625, 2637, 2649, 2661, 2673, 2685, 2697, 2709, 2721, 2733, 2745, 2757, 2769, 2781, 2793, 2805, 2817, 2829, 2841, 2853, 2865, 2877, 2889, 2901, 2913, 2925, 2937, 2949, 2961, 2973, 2985, 2997, 3009, 3021, 3033, 3045, 3057, 3069, 3081, 3093, 3105, 3117, 3129, 3141, 3153, 3165, 3177, 3189, 3201, 3213, 3225, 3237, 3249, 3261, 3273, 3285, 3297, 3309, 3321, 3333, 3345, 3357, 3369, 3381, 3393, 3405, 3417, 3429, 3441] + }, + { // 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 @@ -1686,6 +2073,11 @@ Camera constants: } }, + { // Quality C + "make_model": "OLYMPUS E-M5MarkIII", + "dcraw_matrix": [ 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5165 ] // DNG + }, + { // Quality B, 20Mp and 80Mp raw frames "make_model": "OLYMPUS PEN-F", "dcraw_matrix": [ 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 ], // dng_v9.5 D65 @@ -1701,8 +2093,7 @@ Camera constants: { // Quality B, 20Mp and 80Mp raw frames, "make_model": "OLYMPUS E-M1MarkII", - "dcraw_matrix": [ 9383,-3170,-763,-2457,10702,2020,-384,1236,5552 ], // dng_V9.10 D65 - //"dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], // beta, dng_v9.8 D65 + "dcraw_matrix": [ 9383,-3170,-764,-2457,10702,2020,-384,1236,5552 ], // dng_V9.10 D65 "raw_crop": [ 8, 8, -16, -8 ], // full raw 5240X3912, jpeg top12,left12,5184x3888, full hires 10400X7792, jpeg crop 8,8,10368x7776 "ranges": { "white": [ @@ -1721,41 +2112,59 @@ Camera constants: "ranges": { "white": 4080 } // nominal 4095-4094, spread with some settings as long exposure }, + { // Quality C + "make_model": "OLYMPUS E-M1MarkIII", + "dcraw_matrix": [ 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5165 ] // DNG + }, + { // Quality C, only raw crop for highres mode "make_model": "OLYMPUS E-M1X", + "dcraw_matrix": [ 11896, -5110, -1076, -3181, 11378, 2048, -519, 1224, 5165 ], // DNG v11.2 "raw_crop": [ 0, 0, 10388, 0 ] // Highres mode largest valid, full 80Mp 10400X7792, works also for non highres mode because larger width will be ignored }, { // Quality B, crop correction "make_model": [ "OLYMPUS E-M10", "OLYMPUS E-M10MarkII", "OLYMPUS E-M10 Mark III" ], - "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], + "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-628,1427,5437 ], // DNG v13.2 "raw_crop": [ 0, 0, 4624, 3472 ], // largest valid - full frame is 4640x3472 //"raw_crop": [ 4, 4, 4616, 3464 ], // olympus jpeg crop 8, 8, 4608, 3456 "ranges": { "white": 4080 } }, + { // Quality C + "make_model": "OLYMPUS E-M10MarkIV", + "dcraw_matrix": [ 9476, -3182, -765, -2613, 10958, 1893, -449, 1315, 5268 ], + "range": { "white": 4000, "black": 254 } + }, + { // 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 ], + "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-628,1427,5437 ], // DNG v13.2 "ranges": { "white": 4040 } // nominal 4056 }, { // Quality C "make_model": [ "OLYMPUS E-PL9" ], + "dcraw_matrix": [ 8380, -2630, -639, -2887, 10725, 2496, -628, 1427, 5437 ], "ranges": { "white": 4080 } // nominal 4093 }, + { // Quality C + "make_model": [ "OLYMPUS E-PL10" ], + "dcraw_matrix": [ 9197, -3190, -659, -2606, 10830, 2039, -458, 1250, 5457 ] + }, + { // 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 + "dcraw_matrix": [ 9197,-3190,-659,-2606,10830,2039,-458,1250,5457 ], // DNG v13.2 "ranges": { "white": 4080 } // nominal 4093 }, { // Quality B, per ISO WL measures missing "make_model": [ "OLYMPUS SH-2", "Olympus SH-3" ], - "dcraw_matrix": [ 10156,-3425,-1077,-2611,11177,1624,-385,1592,5080 ], // DNG_V9.1 D65 + "dcraw_matrix": [ 10156,-3426,-1077,-2611,11177,1624,-385,1592,5080 ], // DNG v13.2 "ranges": { "white": 4050 } // safe for worst case detected, nominal is 4093 }, @@ -1766,8 +2175,9 @@ Camera constants: "ranges": { "white": 4050 } // safe for worst case detected, nominal is 4093 }, - { // Quality C, only raw crop + { // Quality B "make_model": "OLYMPUS TG-6", + "dcraw_matrix" : [10899, -3833, -1082, -2112, 10736, 1575, -267, 1452, 5269], // DNG v13.2 "raw_crop": [ 0, 0, -24, 0 ] // 24 pixels at right are garbage }, @@ -1776,16 +2186,32 @@ Camera constants: "global_green_equilibration" : true }, - { // Quality X + { // Quality C + "make_model": ["OLYMPUS STYLUS1", "OLYMPUS STYLUS1,1s"], + "dcraw_matrix" : [8360, -2420, -880, -3928, 12353, 1739, -1381, 2416, 5173] // DNG + }, + + { // Quality C + "make_model": ["OM Digital Solutions OM-1"], + "ranges": { "white": 4095 }, + "raw_crop" : [ + { "frame" : [10400, 7792], "crop": [0, 0, 10390, 7792] }, + { "frame" : [8180, 6132], "crop": [0, 0, 8172, 6132] }, + { "frame" : [5220, 3912], "crop": [0, 0, 5220, 3912] } + ] + }, + + { // Quality B "make_model": [ "Panasonic DC-LX100M2" ], - "dcraw_matrix": [ 11577, -4230, -1106, -3967, 12211, 1957, -758, 1762, 5610 ], // Adobe DNG Converter 11.0 ColorMatrix2 + "dcraw_matrix": [ 11577, -4230, -1106, -3967, 12211, 1957, -759, 1762, 5610 ], // DNG v13.2 + //"dcraw_matrix": [ 8585, -3127, -833, -4005, 12250, 1953, -650, 1494, 4862 ], // DNG v13.2 alternate "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 + "dcraw_matrix": [ 7685, -2375, -634, -3688, 11700, 2249, -748, 1545, 5111 ], // DNG v13.2 "ranges": { "black": 15, // 15 is BL offset. dcraw/RT reads the base black from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -1796,13 +2222,22 @@ Camera constants: } }, + { // Quality C + "make_model": [ "Panasonic DC-G90", "Panasonic DC-G95", "Panasonic DC-G99" ], + "dcraw_matrix": [ 9657, -3963, -748, -3361, 11378, 2258, -568, 1414, 5158 ], // DNG + "ranges": { "black": 15 } // see above: RT already reads a value from exif + }, + + { // Quality C + "make_model": [ "Panasonic DC-G100", "Panasonic DC-G110" ], + "dcraw_matrix": [ 8370, -2869, -710, -3389, 11372, 2298, -640, 1598, 4887 ] // DNG + }, + { // Quality C, only color matrix "make_model" : "Panasonic DC-GF10", - "dcraw_matrix": [ 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 ], // ColorMatrix2 from Adobe DNG Converter 11.3 + "dcraw_matrix": [ 7610, -2781, -576, -4614, 12195, 2733, -1375, 2393, 6490 ], // DNG v13.2 "raw_crop": [ 0, 0, 4600, 0 ], // SensorWidth=4816 SensorHeight=3464. Width=4600 to match DNG. - "ranges": { - "black": 15 - } + "ranges": { "black": 15 } }, { // Quality B, CameraPhone, some samples are missing but has the same sensor as FZ1000 .. @@ -1820,7 +2255,7 @@ Camera constants: { // Quality B "make_model": [ "Panasonic DC-FZ80", "Panasonic DC-FZ81", "Panasonic DC-FZ82", "Panasonic DC-FZ83" ], - "dcraw_matrix": [ 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 ], // DNGv9.10.1 D65 + "dcraw_matrix": [ 11532, -4324, -1066, -2375, 10847, 1749, -564, 1699, 4351 ], // DNG v13.2 "raw_crop": [ 0, 6, -8, -2 ], // fullraw4/3 5040x3688 official 8,8,4904,3680 = 4896X3672. Dcraw 0,0,4912,3688 RT's frame gets smaller than dcraw but works better with auto distortion "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. dcraw/RT read the base offset from Exif and calculates total BL = BLbase+BLoffset }, @@ -1839,7 +2274,7 @@ Camera constants: { // Quality A, samples by helices at RT forums "make_model": [ "Panasonic DMC-FZ1000", "Leica V-LUX (Typ 114)" ], - "dcraw_matrix": [ 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 ], // dcp_v8.6 d65 + "dcraw_matrix": [ 7830,-2696,-764,-3325,11667,1865,-641,1712,4824 ], // DNG v13.2 "ranges": { "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -1852,7 +2287,7 @@ Camera constants: { // Quality B, "make_model": [ "Panasonic DMC-FZ2500", "Panasonic DMC-FZ2000", "Panasonic DMC-FZH1" ], - "dcraw_matrix": [ 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 ], // dcp_v9.8 d65 + "dcraw_matrix": [ 7386,-2443,-743,-3437,11863,1757,-608,1660,4766 ], // DNG v13.2 "ranges": { "black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -1897,6 +2332,11 @@ Camera constants: "ranges": { "black": 14, "white": 4050 } // 12+1+1 is BL offset }, + { // Quality C + "make_model": [ "Panasonic DMC-ZS60", "Panasonic DMC-TZ80", "Panasonic DMC-TZ85" ], + "dcraw_matrix": [ 8550, -2908, -842, -3195, 11529, 1881, -338, 1603, 4631 ] // DNG + }, + { // Quality A, samples by Hombre "make_model": [ "Panasonic DC-ZS70", "Panasonic DC-TZ90", "Panasonic DC-TZ91", "Panasonic DC-TZ92", "Panasonic DC-TZ93" ], "dcraw_matrix": [ 9052,-3117,-883,-3045,11346,1927,-205,1520,4730 ], // DNG_V9.10.1 D65 @@ -1904,7 +2344,12 @@ Camera constants: "ranges": { "black": 16, "white": 4050 } // 12+3+1 is BL offset }, -// Panasonic DMC-FZ150,G10,G1,G2,G3,G5,GF1,GF2,GF3 are included as overwrites of the same items of rawimage.cc to test the dcraw9.21 patch + { // Quality C + "make_model": [ "Panasonic DC-ZS80", "Panasonic DC-TZ95" ], + "dcraw_matrix": [ 12194, -5340, -1329, -3035, 11394, 1858, -50, 1418, 5219 ] // DNG + }, + + // Panasonic DMC-FZ150,G10,G1,G2,G3,G5,GF1,GF2,GF3 are included as overwrites of the same items of rawimage.cc to test the dcraw9.21 patch { // Quality A, Replicated from rawimage.cc "make_model": [ "Panasonic DMC-G10", "Panasonic DMC-G2" ], @@ -2016,7 +2461,7 @@ Camera constants: { // Quality B, some ISO WLevels are safely guessed "make_model": "Panasonic DMC-GH4", - "dcraw_matrix": [ 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 ], // dng_v8.5 d65 + "dcraw_matrix": [ 7122,-2108,-512,-3155,11201,2231,-541,1423,5044 ], // DNG v13.2 "ranges": { "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -2029,7 +2474,7 @@ Camera constants: { // Quality C "make_model": "Panasonic DC-GH5", - "dcraw_matrix": [ 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 ], // DNG_v9.9 D65 + "dcraw_matrix": [ 7641,-2336,-605,-3218,11298,2187,-485,1338,5121 ], // DNG v13.2 "ranges": { "black": 15, // 16 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -2080,7 +2525,7 @@ Camera constants: { // Quality A "make_model": [ "Panasonic DMC-G7", "Panasonic DMC-G70" ], - "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ], // DNG_v9.1 D65 + "dcraw_matrix": [ 7610,-2781,-576,-4614,12195,2733,-1375,2393,6490 ], // DNG v13.2 "ranges": { "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -2093,7 +2538,7 @@ Camera constants: { // Quality B "make_model": [ "Panasonic DMC-GX80", "Panasonic DMC-GX85", "Panasonic DMC-GX7MK2" ], - "dcraw_matrix": [ 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 ], // DNG_v9.6 D65 + "dcraw_matrix": [ 7771,-3020,-629,-4029,11950,2345,-822,1976,6119 ], // DNG v13.2 "ranges": { "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -2106,7 +2551,7 @@ 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 + "dcraw_matrix": [ 7564,-2263,-606,-3149,11238,2177,-540,1435,4853 ], // DNG v13.2 "ranges": { "black": 16, "white": 4080 @@ -2115,7 +2560,7 @@ Camera constants: { // 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 + "dcraw_matrix": [ 7610,-2781,-576,-4614,12195,2733,-1375,2393,6490 ], // DNG v13.2 "ranges": { "black": 16, // 16 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -2128,7 +2573,7 @@ Camera constants: { // Quality B "make_model": "Panasonic DMC-GX8", - "dcraw_matrix": [ 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 ], // DNG_v9.1.1 D65 + "dcraw_matrix": [ 7564,-2263,-606,-3149,11238,2177,-540,1435,4853 ], // DNG v13.2 "ranges": { "black": 15, // 16 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset "white": [ @@ -2198,6 +2643,16 @@ Camera constants: } }, + { // Quality C + "make_model": "Panasonic DC-S1H", + "dcraw_matrix": [ 9397, -3719, -805, -5425, 13326, 2309, -972, 1715, 6034 ] // DNG + }, + + { // Quality C, possibly the same as DC-S1. We have a custom DCP which is better. + "make_model": "Panasonic DC-S5", + "dcraw_matrix": [ 9744, -3905, -779, -4899, 12807, 2324, -798, 1630, 5827 ] // DNG + }, + { // Quality B, per ISO info missing "make_model": "PENTAX K-x", "dcraw_matrix": [ 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 ], // adobe dcp d65 @@ -2251,7 +2706,7 @@ Camera constants: { // Quality B, Intemediate ISO samples missing, Pentax_DNG WLtags are after BL sutraction and not valid "make_model": [ "RICOH PENTAX K-1", "PENTAX K-1" ], - "dcraw_matrix": [ 8596,-2981,-639,-4202,12046,2431,-685,1424,6122 ], // adobe DNG v9.7 D65 + "dcraw_matrix": [ 8596,-2981,-639,-4202,12045,2431,-685,1424,6122 ], // DNG v13.2 //"dcraw_matrix": [ 8566,-2746,-1201,-3612,12204,1550,-893,1680,6264 ], // PENTAX DNG //"raw_crop": [ 6, 18, 7376, 4932 ], // full frame 7392x4950, cropped to official DNG raw_crop 6,18,7382,4950, official jpeg crop 8,10,7360x4912 "ranges": { @@ -2265,6 +2720,11 @@ Camera constants: } }, + { // Quality C, possibly the same as K-1 + "make_model": [ "RICOH PENTAX K-1 Mark II", "PENTAX K-1 Mark II" ], + "dcraw_matrix": [ 8596, -2981, -639, -4202, 12045, 2431, -685, 1424, 6122 ] // DNG + }, + { // Quality B, intermediate ISOs info missing "make_model": [ "RICOH PENTAX K-3", "PENTAX K-3" ], "dcraw_matrix": [ 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 ], // adobe dcp d65 @@ -2282,6 +2742,12 @@ Camera constants: } }, + { // Quality C + "make_model": ["RICOH PENTAX K-3 MARK III", "PENTAX K-3 MARK III"], + "dcraw_matrix" : [7003, -1618, -887, -4614, 12728, 2065, -645, 1441, 5734], + "raw_crop": [ 24, 34, -28, -14 ] + }, + { // Quality B, intermediate ISOs info missing "make_model": [ "RICOH PENTAX 645Z", "PENTAX 645Z" ], "dcraw_matrix": [ 9519,-3591,-664,-4074,11725,2671,-624,1501,6653 ], // adobe dcp d65 @@ -2299,7 +2765,7 @@ Camera constants: { // Quality B, intermediate ISOs info missing, spread due to blackframe subtraction guessed to be around 10levels "make_model": "PENTAX K10D", - "dcraw_matrix": [ 9566,-2863,-803,-7170,15172,2112,-818,803,9705 ], // adobe DNG d65 + "dcraw_matrix": [ 9679, -2965, -811, -8622, 16514, 2182, -975, 883, 9793 ], // DNG v13.2 //"raw_crop": [ 0, , 3888, 2608 ], "ranges": { "white": [ @@ -2397,16 +2863,27 @@ Camera constants: "make_model": "Sigma sd Quattro", "raw_crop": [ 200, 74, 5632, 3698 ] }, + + { // Quality C + "make_model": "Sigma fp", + "dcraw_matrix": [ 12431, -5541, -1000, -4387, 12361, 2265, -732, 1526, 5970 ] // DNG + }, + + { // Quality C + "make_model": "Sony NEX-F3", + "dcraw_matrix": [ 5991, -1456, -455, -4764, 12135, 2980, -707, 1424, 6701 ] // DNG + }, + { // Quality A, correction for color matrix from Colin Walker's d50 to dng d65 "make_model": "Sony NEX-C3", //"dcraw_matrix": [ 5130,-1055,-269,-4473,11797,3050,-701,1310,7121 ], // Colin walker's d50 kept for possible consistency issues - "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1424,6701 ], // DNG v13.2 "ranges": { "black": 512, "white": 16300 } }, { // Quality A, correction for frame width "make_model": "Sony NEX-5N", - "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1424,6701 ], // DNG v13.2 "raw_crop": [ 0, 0, 4920, 3276 ], "ranges": { "black": 512, "white": 16300 } }, @@ -2420,35 +2897,40 @@ Camera constants: { // Quality B "make_model": "Sony ILCA-68", - "dcraw_matrix": [ 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 ], // adobe DNGv9.5 d65 + "dcraw_matrix": [ 6435,-1903,-536,-4722,12448,2550,-663,1363,6516 ], // DNG v13.2 "raw_crop": [ 0, 0, -30, 0 ], "ranges": { "black": 512, "white": 16300 } }, { // Quality B, correction for frame width, crop modes covered "make_model": "Sony ILCA-99M2", - "dcraw_matrix": [ 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 ], // DNG_v9.8 D65 + "dcraw_matrix": [ 6660,-1918,-472,-4613,12398,2485,-649,1433,6447 ], // DNG v13.2 "raw_crop": [ 0, 0, -36, 0 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage "ranges": { "black": 512, "white": 16300 } }, + { // Quality C + "make_model": "Sony ILCE-1", + "dcraw_matrix": [ 8161, -2947, -739, -4811, 12668, 2389, -437, 1229, 6524 ] // DNG v13.2 + }, + { // Quality A, correction for frame width "make_model": [ "Sony ILCE-3000", "Sony ILCE-3500", "Sony ILCE-5000", "Sony ILCE-QX1" ], - "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1424,6701 ], // DNG v13.2 "ranges": { "black": 512, "white": 16300 }, "raw_crop": [ 0, 0, 5476, 3656 ] }, { // Quality A "make_model": "Sony ILCE-5100", - "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1424,6701 ], // DNG v13.2 "raw_crop": [ 0, 0, 6024, 4024 ], "ranges": { "black": 512, "white": 16300 } }, { // Quality A "make_model": "Sony ILCE-6000", - "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 + "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1424,6701 ], // adobe dcp d65 "raw_crop": [ 0, 0, 6024, 4024 ], "ranges": { "black": 512, "white": 16300 }, // detected by hand, using the picture from https://www.dpreview.com/forums/thread/3923513 @@ -2457,9 +2939,18 @@ Camera constants: "pdaf_offset" : 3 }, + { // Quality B, probably similar to ILCE-6000 / 6300 / 6500, not checked + "make_model": [ "Sony ILCE-6100","Sony ILCE-6400","Sony ILCE-6600" ], + "dcraw_matrix": [ 7657, -2847, -607, -4083, 11966, 2389, -684, 1418, 5844 ], // DNG + "raw_crop": [ 0, 0, 6024, 4024 ], + "ranges": { "black": 512, "white": 16300 }, + "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 + "dcraw_matrix": [ 5973,-1696,-419,-3826,11797,2293,-639,1398,5789 ], // DNG_v9.8 D65 "raw_crop": [ 0, 0, 6024, 4024 ], "ranges": { "black": 512, "white": 16300 }, // contributed by Horshak from https://www.dpreview.com/forums/post/60873077 @@ -2467,6 +2958,11 @@ Camera constants: "pdaf_offset" : 3 }, + { // Quality C + "make_model": "Sony ILCE-7C", + "dcraw_matrix": [ 7374, -2389, -551, -5435, 13162, 2519, -1006, 1795, 6552 ] + }, + { // Quality A, correction for frame width "make_model": "Sony ILCE-7R", "dcraw_matrix": [ 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 ], @@ -2483,9 +2979,15 @@ Camera constants: { // Quality C, correction for frame width "make_model": [ "Sony DSC-RX0", "Sony DSC-RX0M2" ], + "dcraw_matrix": [ 9396, -3507, -843, -2497, 11111, 1572, -343, 1355, 5089 ], "raw_crop": [ 0, 0, -8, 0 ] // 8 rightmost columns are garbage }, + { // Quality C + "make_model": "Sony DSC-RX1R", + "dcraw_matrix": [ 6344, -1612, -462, -4863, 12477, 2681, -865, 1786, 6899 ] + }, + { // 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 @@ -2498,7 +3000,7 @@ Camera constants: { // Quality C, color matrix copied from ILCE-9, LongExposures 2-3sec only "make_model": "Sony ILCE-7M3", - "dcraw_matrix": [ 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 ], // ILCE-9, DNG_v9.12 D65 + "dcraw_matrix": [ 7374, -2389, -551, -5435, 13162, 2519, -1006, 1795, 6552 ], // DNG v13.2 // "raw_crop": [ 8, 8, 6008, 4008 ], // full raw frame 6048x4024 Dcraw auto identify 6024x4024, jpeg 12,12,6000x4000 // "ranges": { "black": 512, "white": 16300 } "ranges": { @@ -2525,9 +3027,14 @@ Camera constants: "pdaf_offset" : 9 }, + { // Quality C + "make_model": "Sony ILCE-7M4", + "dcraw_matrix": [ 7460, -2365, -588, -5687, 13442, 2474, -624, 1156, 6584 ] // ColorMatrix2 using illuminant D65 from Adobe DNG Converter 14.2 + }, + { // Quality C, "make_model": "Sony ILCE-7RM3", - "dcraw_matrix": [ 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 ], // DNG_v10.1 D65 + "dcraw_matrix": [ 6640,-1847,-503,-5238,13010,2474,-993,1673,6526 ], // DNG v13.2 "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], @@ -2536,11 +3043,12 @@ Camera constants: { // Quality C, "make_model": "Sony ILCE-7RM4", + "dcraw_matrix": [ 7662, -2686, -660, -5240, 12965, 2530, -796, 1508, 6167 ], "raw_crop": [ 0, 0, -32, 0 ] // full raw frame 9600x6376 - 32 rightmost columns are garbage. Using -32 instead of 9568 to support also 16-shot pixelshift files }, - { // Quality B, color matrix copied from a7rm2 - "make_model": "Sony ILCE-9", + { // Quality B, assumed correct for 9M2 as well + "make_model": ["Sony ILCE-9","Sony ILCE-9M2"], "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 }, @@ -2554,13 +3062,23 @@ Camera constants: { // Quality B, correction for frame width "make_model": [ "Sony ILCE-7S", "Sony ILCE-7SM2" ], "dcraw_matrix": [ 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 ], // DNG_v9.2 D65 - "raw_crop": [ 0, 0, 4254, 2848 ], + "raw_crop" : [ + { "frame" : [ 2816, 1872 ], "crop" : [ 0, 0, 2792, 1872 ] }, + { "frame" : [ 4254, 2848 ], "crop" : [ 0, 0, 4254, 2848 ] } + ], "ranges": { "black": 512, "white": 16300 } }, { // Quality C - "make_model": [ "Sony DSC-HX99" ], - "raw_crop": [ 0, 0, -8, 0 ] // 8 rightmost columns are garbage + "make_model": "Sony ILCE-7SM3", + "dcraw_matrix": [ 6912, -2127, -469, -4470, 12175, 2587, -398, 1477, 6492 ] // DNG + }, + + { // Quality C + "make_model": [ "Sony DSC-HX95", "Sony DSC-HX99" ], + "dcraw_matrix": [ 13076, -5686, -1481, -4027, 12851, 1251, -167, 725, 4937 ], + "raw_crop": [ 0, 0, -8, 0 ], // 8 rightmost columns are garbage + "ranges": { "black": 800, "white": 16300 } }, { // Quality B @@ -2569,18 +3087,67 @@ Camera constants: "ranges": { "white": 16368 } }, + { // Quality C + "make_model": "Sony DSC-RX100", + "dcraw_matrix": [ 8651, -2754, -1057, -3464, 12206, 1373, -568, 1398, 4434 ], // DNG + "ranges": { "black": 800, "white": 16300 } + }, + { // Quality A "make_model": [ "Sony DSC-RX100M2", "Sony DSC-RX100M3", "Sony DSC-RX100M4", "Sony DSC-RX100M5" ], "dcraw_matrix": [ 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 ], // DNG_v9.8 D65 "ranges": { "black": 800, "white": 16300 } }, - { // Quality B - "make_model": [ "Sony DSC-RX10M2", "Sony DSC-RX10M3", "Sony DSC-RX10M4" ], - "dcraw_matrix": [ 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 ], // DNG_v9.6 D65 + { // Quality C + "make_model": "Sony DSC-RX100M5A", + "dcraw_matrix": [ 11176, -4700, -965, -4004, 12184, 2032, -764, 1726, 5876 ], // DNG "ranges": { "black": 800, "white": 16300 } }, + { // Quality C + "make_model": "Sony DSC-RX100M6", + "dcraw_matrix": [ 7325, -2321, -596, -3494, 11674, 2055, -668, 1562, 5031 ], // DNG + "ranges": { "black": 800, "white": 16300 } + }, + + { // Quality C + "make_model": "Sony DSC-RX100M7", + "dcraw_matrix": [ 10315, -4390, -937, -4859, 12734, 2365, -735, 1537, 5997 ], // DNG + "ranges": { "black": 800, "white": 16300 } + }, + + { // Quality B + "make_model": [ "Sony DSC-RX10M2", "Sony DSC-RX10M3" ], + "dcraw_matrix": [ 6679,-1825,-745,-5047,13255,1953,-1580,2422,5183 ], //DNG v13.2 + "ranges": { "black": 800, "white": 16300 } + }, + + { // Quality B + "make_model": "Sony DSC-RX10M4", // Similar to M2 and M3, different matrix + "dcraw_matrix": [ 7699, -2566, -629, -2967, 11270, 1928, -378, 1286, 4807 ], // DNG v13.2 + "ranges": { "black": 800, "white": 16300 } + }, + + { // Quality C + "make_model": "Sony DCZV1B", // Sony ZV-1 + "dcraw_matrix": [ 8280, -2987, -703, -3532, 11645, 2133, -550, 1542, 5312 ] // DNG + }, + + { // Quality C + "make_model": "Sony SLT-A99V", + "dcraw_matrix": [ 6344, -1612, -462, -4863, 12477, 2681, -865, 1786, 6899 ] // DNG + }, + + { // Quality A + "make_model": "Sony ZV-1", + "dcraw_matrix": [ 8280, -2987, -703, -3531, 11645, 2133, -550, 1542, 5312 ], // DNG v15.2 + "ranges": { "black": 800 }, // White level from EXIF. + "raw_crop": [ 0, 0, 5496, 3672 ], + "pdaf_pattern": [0, 24, 48, 72, 88, 120], + "pdaf_offset": 17 + }, + { // 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 @@ -2649,6 +3216,12 @@ Camera constants: "ranges": { "black": 0, "white": 64400 } }, + { // Quality B + "make_model": ["HASSELBLAD NEX-7", "SONY NEX-7"], // Hasselblad NEX-7 also known as Hasselblad Lunar + "dcraw_matrix": [ 5491,-1192,-363,-4951,12342,2948,-911,1722,7191 ], // DNG v13.2 + "ranges": { "black": 512, "white": 16372 } // Typical white level (samples provided by @ggc on Pixls, influence from LENR unknown + }, + { // Quality A for tested CFV, the other models have the same sensor (16 megapixel square sensor) "make_model": [ "Hasselblad V96C", "Hasselblad CFV", "Hasselblad CFV-II" ], "dcraw_matrix": [ 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809 ] // borrowed from Adobe's DNG converter @@ -2694,6 +3267,11 @@ Camera constants: "raw_crop": [ 64, 108, 11608, 8708 ] }, + { // Quality C + "make_model": "Hasselblad L1D-20c", // DJI Mavic 2 Pro + "dcraw_matrix": [ 6267, -2021, -687, -4664, 13343, 1399, -234, 1019, 5524 ] // DNG 13.2 + }, + { "make_model": [ "HUAWEI DLI-L22" ], "dcraw_matrix": [ 6984, -812, -975, -4792, 13481, 1381, -1056, 2355, 4873 ] // ColorMatrix1 (D65, wrong order) from Adobe DNG Converter 11.2.1 diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc index 6274154cb..b5f04a1c8 100644 --- a/rtengine/canon_cr3_decoder.cc +++ b/rtengine/canon_cr3_decoder.cc @@ -18,6 +18,7 @@ */ // Code adapted from ART +// https://bitbucket.org/agriggio/art/ /* * * This file is part of ART. @@ -37,11 +38,16 @@ */ // Code adapted from libraw -/* -*- C++ -*- - * Copyright 2019 LibRaw LLC (info@libraw.org) +// https://github.com/LibRaw/LibRaw/ +/* + * File: libraw_crxdec.cpp + * Copyright (C) 2018-2019 Alexey Danilchenko + * Copyright (C) 2019 Alex Tutubalin, LibRaw LLC * - LibRaw is free software; you can redistribute it and/or modify - it under the terms of the one of two licenses as you choose: + Canon CR3 file decoder + +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). @@ -49,13 +55,14 @@ 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 (See file LICENSE.CDDL provided in LibRaw distribution archive for details). -*/ + */ #include #include #include #include #include +#include #include "dcraw.h" @@ -63,17 +70,16 @@ void DCraw::parse_canon_cr3() { - strncpy(make, "Canon", sizeof(make)); - unsigned long long szAtomList = ifp->size; short nesting = -1; - char AtomNameStack[128]; - unsigned short nTrack = 0; + short nTrack = -1; short TrackType; + char AtomNameStack[128]; + strncpy(make, "Canon", sizeof(make)); const int err = parseCR3(0, szAtomList, nesting, AtomNameStack, nTrack, TrackType); - if (err == 0 || err == -14) { // no error, or too deep nesting + if ((err == 0 || err == -14) && nTrack >= 0) { // no error, or too deep nesting selectCRXTrack(nTrack); } } @@ -84,12 +90,13 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) std::int64_t maxbitcount = 0; std::uint32_t maxjpegbytes = 0; + memset(bitcounts, 0, sizeof(bitcounts)); + for (unsigned int i = 0; i <= maxTrack && i < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT; ++i) { CanonCR3Data::crx_data_header_t* const d = &RT_canon_CR3_data.crx_header[i]; if (d->MediaType == 1) { // RAW bitcounts[i] = std::int64_t(d->nBits) * std::int64_t(d->f_width) * std::int64_t(d->f_height); - if (bitcounts[i] > maxbitcount) { maxbitcount = bitcounts[i]; } @@ -116,7 +123,6 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) has_framei = true; framei = i; } - framecnt++; } } @@ -136,17 +142,14 @@ void DCraw::selectCRXTrack(unsigned short maxTrack) filters = 0x94949494; break; } - case 1: { filters = 0x61616161; break; } - case 2: { filters = 0x49494949; break; } - case 3: { filters = 0x16161616; break; @@ -176,7 +179,7 @@ int DCraw::parseCR3( unsigned long long szAtomList, short& nesting, char* AtomNameStack, - unsigned short& nTrack, + short& nTrack, short& TrackType ) { @@ -303,7 +306,7 @@ int DCraw::parseCR3( unsigned long long lHdr; char UIID[16]; - uchar CMP1[36]; + uchar CMP1[85]; char HandlerType[5]; char MediaFormatID[5]; // unsigned int ImageWidth, ImageHeight; @@ -496,14 +499,15 @@ int DCraw::parseCR3( } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAW")) { lHdr = 82; } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWCMP1")) { + int read_size = szAtomContent > 85 ? 85 : szAtomContent; if (szAtomContent >= 40) { - fread(CMP1, 1, 36, ifp); + fread(CMP1, 1, read_size, ifp); } else { err = -7; goto fin; } - if (crxParseImageHeader(CMP1, nTrack)) { + if (crxParseImageHeader(CMP1, nTrack, read_size)) { RT_canon_CR3_data.crx_header[nTrack].MediaType = 1; } } else if (!strcmp(AtomNameStack, "moovtrakmdiaminfstblstsdCRAWJPEG")) { @@ -531,6 +535,7 @@ int DCraw::parseCR3( } if ( + nTrack >= 0 && nTrack < RT_canon_CR3_data.CRXTRACKS_MAXCOUNT && RT_canon_CR3_data.crx_header[nTrack].MediaSize && RT_canon_CR3_data.crx_header[nTrack].MediaOffset && oAtom + szAtom >= oAtomList + szAtomList @@ -596,7 +601,9 @@ int DCraw::parseCR3( relpos_inBox += lTag; } } - + if (!szItem) { + goto fin; + } relpos_inDir += szItem; } @@ -662,7 +669,7 @@ std::uint32_t _byteswap_ulong(std::uint32_t x) #endif struct LibRaw_abstract_datastream { - IMFILE* ifp; + rtengine::IMFILE* ifp; void lock() { @@ -725,14 +732,21 @@ struct CrxSubband { CrxBandParam* bandParam; std::uint64_t mdatOffset; std::uint8_t* bandBuf; - std::int32_t bandSize; - std::uint64_t dataSize; - bool supportsPartial; - std::int32_t quantValue; std::uint16_t width; std::uint16_t height; - std::int32_t paramK; + std::int32_t qParam; + std::int32_t kParam; + std::int32_t qStepBase; + std::uint32_t qStepMult; + bool supportsPartial; + std::int32_t bandSize; + std::uint64_t dataSize; std::int64_t dataOffset; + short rowStartAddOn; + short rowEndAddOn; + short colStartAddOn; + short colEndAddOn; + short levelShift; }; struct CrxPlaneComp { @@ -747,6 +761,12 @@ struct CrxPlaneComp { std::int8_t tileFlag; }; +struct CrxQStep { + std::uint32_t *qStepTbl; + int width; + int height; +}; + struct CrxTile { CrxPlaneComp* comps; std::int8_t tileFlag; @@ -755,6 +775,10 @@ struct CrxTile { std::int32_t tileSize; std::uint16_t width; std::uint16_t height; + bool hasQPData; + CrxQStep *qStep; + std::uint32_t mdatQPDataSize; + std::uint16_t mdatExtraSize; }; struct CrxImage { @@ -762,6 +786,7 @@ struct CrxImage { std::uint16_t planeWidth; std::uint16_t planeHeight; std::uint8_t samplePrecision; + std::uint8_t medianBits; std::uint8_t subbandCount; std::uint8_t levels; std::uint8_t nBits; @@ -783,25 +808,14 @@ enum TileFlags { E_HAS_TILES_ON_THE_TOP = 8 }; -const std::int32_t exCoefNumTbl[0x120] = { - // level 1 - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, +const std::int32_t exCoefNumTbl[144] = { +1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, +0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, +0, 0, 1, 2, 2, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 2, 2, +1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2, 1, 1, 1, +1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 0, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - // level 2 - 1, 1, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 3, 2, 1, 0, 1, 0, 0, 0, 0, 0, 1, - 2, 4, 4, 2, 1, 2, 1, 0, 0, 0, 0, 1, 1, 4, 3, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, - 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 3, 2, 1, 0, 1, 0, 0, 0, 0, 0, 1, 2, 4, - 4, 2, 1, 2, 1, 0, 0, 0, 0, 1, 1, 4, 3, 1, 1, 1, 1, 0, 0, 0, 0, - - // level 3 - 1, 1, 7, 7, 1, 1, 3, 3, 1, 1, 1, 1, 1, 0, 7, 6, 1, 0, 3, 2, 1, 0, 1, 0, 1, - 2, 10, 10, 2, 2, 5, 4, 2, 1, 2, 1, 1, 1, 10, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, - 1, 9, 9, 1, 2, 4, 4, 2, 1, 2, 1, 1, 0, 9, 8, 1, 1, 4, 3, 1, 1, 1, 1, 1, 2, - 8, 8, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 8, 7, 1, 1, 3, 3, 1, 1, 1, 1 -}; +constexpr std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; const std::uint32_t JS[32] = { 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, @@ -835,7 +849,7 @@ inline void crxFillBuffer(CrxBitstream* bitStrm) #endif if (bitStrm->curBufSize < 1) { // nothing read - throw std::exception(); + throw std::runtime_error("Unexpected end of file in CRX bitstream"); } bitStrm->mdatSize -= bitStrm->curBufSize; @@ -845,7 +859,6 @@ inline void crxFillBuffer(CrxBitstream* bitStrm) inline int crxBitstreamGetZeros(CrxBitstream* bitStrm) { -// std::uint32_t bitData = bitStrm->bitData; std::uint32_t nonZeroBit = 0; std::uint64_t nextData = 0; std::int32_t result = 0; @@ -934,9 +947,16 @@ inline std::uint32_t crxBitstreamGetBits(CrxBitstream* bitStrm, int bits) result = bitData >> (32 - bits); // 32-bits bitStrm->bitData = bitData << bits; bitStrm->bitsLeft = bitsLeft - bits; + return result; } +inline std::int32_t crxPrediction(std::int32_t left, std::int32_t top, std::int32_t deltaH, std::int32_t deltaV) +{ + std::int32_t symb[4] = {left + deltaH, left + deltaH, left, top}; + return symb[(((deltaV < 0) ^ (deltaH < 0)) << 1) + ((left < top) ^ (deltaH < 0))]; +} + inline std::int32_t crxPredictKParameter(std::int32_t prevK, std::int32_t bitCode, std::int32_t maxVal = 0) { const std::int32_t newKParam = @@ -1093,7 +1113,7 @@ inline void crxDecodeSymbolL1Rounded(CrxBandParam* param, bool doSym = true, boo } std::int32_t code = -(bitCode & 1) ^ (bitCode >> 1); - param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code < 0) + sym; + param->lineBuf1[1] = param->roundedBitsMask * 2 * code + (code >> 31) + sym; if (doCode) { if (param->lineBuf0[2] > param->lineBuf0[1]) { @@ -1628,11 +1648,9 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (!param || !bandBuf) { return false; } - if (param->curLine >= param->subbandHeight) { return false; } - if (param->curLine == 0) { const std::int32_t lineLength = param->subbandWidth + 2; @@ -1641,7 +1659,7 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) if (param->supportsPartial) { if (param->roundedBitsMask <= 0) { - param->lineBuf0 = param->paramData; + param->lineBuf0 = reinterpret_cast(param->paramData); param->lineBuf1 = param->lineBuf0 + lineLength; const std::int32_t* const lineBuf = param->lineBuf1 + 1; @@ -1660,7 +1678,7 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) } } - param->lineBuf0 = param->paramData; + param->lineBuf0 = reinterpret_cast(param->paramData); param->lineBuf1 = param->lineBuf0 + lineLength; const std::int32_t* const lineBuf = param->lineBuf1 + 1; @@ -1672,8 +1690,8 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) ++param->curLine; } } else { - param->lineBuf2 = param->nonProgrData; - param->lineBuf0 = param->paramData; + param->lineBuf2 = reinterpret_cast(param->nonProgrData); + param->lineBuf0 = reinterpret_cast(param->paramData); param->lineBuf1 = param->lineBuf0 + lineLength; const std::int32_t* const lineBuf = param->lineBuf1 + 1; @@ -1686,13 +1704,13 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) } } else if (!param->supportsPartial) { const std::int32_t lineLength = param->subbandWidth + 2; - param->lineBuf2 = param->nonProgrData; + param->lineBuf2 = reinterpret_cast(param->nonProgrData); if (param->curLine & 1) { - param->lineBuf1 = param->paramData; + param->lineBuf1 = reinterpret_cast(param->paramData); param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = param->paramData; + param->lineBuf0 = reinterpret_cast(param->paramData); param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1708,10 +1726,10 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = param->paramData; + param->lineBuf1 = reinterpret_cast(param->paramData); param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = param->paramData; + param->lineBuf0 = reinterpret_cast(param->paramData); param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1727,10 +1745,10 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) const std::int32_t lineLength = param->subbandWidth + 2; if (param->curLine & 1) { - param->lineBuf1 = param->paramData; + param->lineBuf1 = reinterpret_cast(param->paramData); param->lineBuf0 = param->lineBuf1 + lineLength; } else { - param->lineBuf0 = param->paramData; + param->lineBuf0 = reinterpret_cast(param->paramData); param->lineBuf1 = param->lineBuf0 + lineLength; } @@ -1747,28 +1765,34 @@ bool crxDecodeLine(CrxBandParam* param, std::uint8_t* bandBuf) return true; } -bool crxDecodeLineWithIQuantization(CrxSubband* subband) +inline int getSubbandRow(CrxSubband *band, int row) { - constexpr std::int32_t q_step_tbl[6] = {0x28, 0x2D, 0x33, 0x39, 0x40, 0x48}; + return row < band->rowStartAddOn + ? 0 + : (row < band->height - band->rowEndAddOn ? row - band->rowEndAddOn + : band->height - band->rowEndAddOn - band->rowStartAddOn - 1); +} +bool crxDecodeLineWithIQuantization(CrxSubband* subband, CrxQStep *qStep) +{ if (!subband->dataSize) { memset(subband->bandBuf, 0, subband->bandSize); return true; } - if (subband->supportsPartial) { + if (subband->supportsPartial && !qStep) { std::uint32_t bitCode = crxBitstreamGetZeros(&subband->bandParam->bitStream); if (bitCode >= 23) { bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, 8); - } else if (subband->paramK) { - bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, subband->paramK) | (bitCode << subband->paramK); + } else if (subband->kParam) { + bitCode = crxBitstreamGetBits(&subband->bandParam->bitStream, subband->kParam) | (bitCode << subband->kParam); } - subband->quantValue += -(bitCode & 1) ^ (bitCode >> 1); // converting encoded to signed integer - subband->paramK = crxPredictKParameter(subband->paramK, bitCode); + subband->qParam += -(bitCode & 1) ^ (bitCode >> 1); // converting encoded to signed integer + subband->kParam = crxPredictKParameter(subband->kParam, bitCode); - if (subband->paramK > 7) { + if (subband->kParam > 7) { return false; } } @@ -1777,21 +1801,41 @@ bool crxDecodeLineWithIQuantization(CrxSubband* subband) return false; } - if (subband->width == 0) { + if (subband->width <= 0) { return true; } // update subband buffers std::int32_t* const bandBuf = reinterpret_cast(subband->bandBuf); - std::int32_t qScale = q_step_tbl[subband->quantValue % 6] >> (6 - subband->quantValue / 6); + if (qStep) { + // new version + std::uint32_t *qStepTblPtr = &qStep->qStepTbl[qStep->width * getSubbandRow(subband, subband->bandParam->curLine - 1)]; + for (int i = 0; i < subband->colStartAddOn; ++i) { + int32_t quantVal = subband->qStepBase + ((qStepTblPtr[0] * subband->qStepMult) >> 3); + bandBuf[i] *= rtengine::LIM(quantVal, 1, 0x168000); + } - if (subband->quantValue / 6 >= 6) { - qScale = q_step_tbl[subband->quantValue % 6] * (1 << (subband->quantValue / 6 + 26)); - } + for (int i = subband->colStartAddOn; i < subband->width - subband->colEndAddOn; ++i) { + int32_t quantVal = subband->qStepBase + ((qStepTblPtr[(i - subband->colStartAddOn) >> subband->levelShift] * subband->qStepMult) >> 3); + bandBuf[i] *= rtengine::LIM(quantVal, 1, 0x168000); + } + int lastIdx = (subband->width - subband->colEndAddOn - subband->colStartAddOn - 1) >> subband->levelShift; + for (int i = subband->width - subband->colEndAddOn; i < subband->width; ++i) + { + int32_t quantVal = subband->qStepBase + ((qStepTblPtr[lastIdx] * subband->qStepMult) >> 3); + bandBuf[i] *= rtengine::LIM(quantVal, 1, 0x168000); + } + } else { + // prev. version + std::int32_t qScale = q_step_tbl[subband->qParam % 6] >> (6 - subband->qParam / 6); + if (subband->qParam / 6 >= 6) { + qScale = q_step_tbl[subband->qParam % 6] * (1 << (subband->qParam / 6 + 26)); + } - if (qScale != 1) { - for (std::int32_t i = 0; i < subband->width; ++i) { - bandBuf[i] *= qScale; + if (qScale != 1) { + for (std::int32_t i = 0; i < subband->width; ++i) { + bandBuf[i] *= qScale; + } } } @@ -1877,41 +1921,42 @@ std::int32_t* crxIdwt53FilterGetLine(CrxPlaneComp* comp, std::int32_t level) return result; } -bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level) +bool crxIdwt53FilterDecode(CrxPlaneComp* comp, std::int32_t level, CrxQStep *qStep) { if (comp->waveletTransform[level].curH) { return true; } CrxSubband* const sband = comp->subBands + 3 * level; + CrxQStep* qStepLevel = qStep ? qStep + level : 0; if (comp->waveletTransform[level].height - 3 <= comp->waveletTransform[level].curLine && !(comp->tileFlag & E_HAS_TILES_ON_THE_BOTTOM)) { if (comp->waveletTransform[level].height & 1) { if (level) { - if (!crxIdwt53FilterDecode(comp, level - 1)) { + if (!crxIdwt53FilterDecode(comp, level - 1, qStep)) { return false; } - } else if (!crxDecodeLineWithIQuantization(sband)) { + } else if (!crxDecodeLineWithIQuantization(sband, qStepLevel)) { return false; } - if (!crxDecodeLineWithIQuantization(sband + 1)) { + if (!crxDecodeLineWithIQuantization(sband + 1, qStepLevel)) { return false; } } } else { if (level) { - if (!crxIdwt53FilterDecode(comp, level - 1)) { + if (!crxIdwt53FilterDecode(comp, level - 1, qStep)) { return false; } - } else if (!crxDecodeLineWithIQuantization(sband)) { // LL band + } else if (!crxDecodeLineWithIQuantization(sband, qStepLevel)) { // LL band return false; } if ( - !crxDecodeLineWithIQuantization(sband + 1) // HL band - || !crxDecodeLineWithIQuantization(sband + 2) // LH band - || !crxDecodeLineWithIQuantization(sband + 3) // HH band + !crxDecodeLineWithIQuantization(sband + 1, qStepLevel) // HL band + || !crxDecodeLineWithIQuantization(sband + 2, qStepLevel) // LH band + || !crxDecodeLineWithIQuantization(sband + 3, qStepLevel) // HH band ) { return false; } @@ -2127,18 +2172,19 @@ bool crxIdwt53FilterTransform(CrxPlaneComp* comp, std::uint32_t level) return true; } -bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) +bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel, CrxQStep *qStep) { - if (prevLevel < 0) { + if (prevLevel == 0) { return true; } - for (int curLevel = 0, curBand = 0; curLevel < prevLevel + 1; ++curLevel, curBand += 3) { + for (int curLevel = 0, curBand = 0; curLevel < prevLevel; curLevel++, curBand += 3) { + CrxQStep* qStepLevel = qStep ? qStep + curLevel : 0; CrxWaveletTransform* const wavelet = comp->waveletTransform + curLevel; if (curLevel) { wavelet[0].subband0Buf = crxIdwt53FilterGetLine(comp, curLevel - 1); - } else if (!crxDecodeLineWithIQuantization(comp->subBands + curBand)) { + } else if (!crxDecodeLineWithIQuantization(comp->subBands + curBand, qStepLevel)) { return false; } @@ -2146,9 +2192,9 @@ bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (wavelet->height > 1) { if ( - !crxDecodeLineWithIQuantization(comp->subBands + curBand + 1) - || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2) - || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 3) + !crxDecodeLineWithIQuantization(comp->subBands + curBand + 1, qStepLevel) + || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2, qStepLevel) + || !crxDecodeLineWithIQuantization(comp->subBands + curBand + 3, qStepLevel) ) { return false; } @@ -2160,7 +2206,7 @@ bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) if (comp->tileFlag & E_HAS_TILES_ON_THE_TOP) { crxHorizontal53(lineBufL0, wavelet->lineBuf[1], wavelet, comp->tileFlag); - if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 3)|| !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2)) { + if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 3, qStepLevel)|| !crxDecodeLineWithIQuantization(comp->subBands + curBand + 2, qStepLevel)) { return false; } @@ -2219,11 +2265,11 @@ bool crxIdwt53FilterInitialize(CrxPlaneComp* comp, std::int32_t prevLevel) } } - if (!crxIdwt53FilterDecode(comp, curLevel) || !crxIdwt53FilterTransform(comp, curLevel)) { + if (!crxIdwt53FilterDecode(comp, curLevel, qStep) || !crxIdwt53FilterTransform(comp, curLevel)) { return false; } } else { - if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 1)) { + if (!crxDecodeLineWithIQuantization(comp->subBands + curBand + 1, qStepLevel)) { return false; } @@ -2347,8 +2393,8 @@ void crxConvertPlaneLine( const std::int16_t* const plane2 = plane1 + planeSize; const std::int16_t* const plane3 = plane2 + planeSize; - const std::int32_t median = 1 << (img->nBits - 1) << 10; - const std::int32_t maxVal = (1 << img->nBits) - 1; + const std::int32_t median = 1 << (img->medianBits - 1) << 10; + const std::int32_t maxVal = (1 << img->medianBits) - 1; const std::uint32_t rawLineOffset = 4 * img->planeWidth * imageRow; // for this stage - all except imageRow is ignored @@ -2569,7 +2615,7 @@ bool DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) for (int tCol = 0; tCol < img->tileCols; ++tCol) { const CrxTile* const tile = img->tiles + tRow * img->tileRows + tCol; CrxPlaneComp* const planeComp = tile->comps + planeNumber; - const std::uint64_t tileMdatOffset = tile->dataOffset + planeComp->dataOffset; + const std::uint64_t tileMdatOffset = tile->dataOffset + tile->mdatQPDataSize + tile->mdatExtraSize + planeComp->dataOffset; // decode single tile if (!crxSetupSubbandData(img, planeComp, tile, tileMdatOffset)) { @@ -2577,12 +2623,12 @@ bool DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) } if (img->levels) { - if (!crxIdwt53FilterInitialize(planeComp, img->levels - 1)) { + if (!crxIdwt53FilterInitialize(planeComp, img->levels, tile->qStep)) { return false; } for (int i = 0; i < tile->height; ++i) { - if (!crxIdwt53FilterDecode(planeComp, img->levels - 1) || !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { + if (!crxIdwt53FilterDecode(planeComp, img->levels - 1, tile->qStep) || !crxIdwt53FilterTransform(planeComp, img->levels - 1)) { return false; } @@ -2609,9 +2655,8 @@ bool DCraw::crxDecodePlane(void* p, std::uint32_t planeNumber) imageCol += tile->width; } - imageRow += img->tiles[tRow * img->tileRows].height; + imageRow += img->tiles[tRow * img->tileCols].height; } - return true; } @@ -2620,12 +2665,164 @@ namespace using crx_data_header_t = DCraw::CanonCR3Data::crx_data_header_t; -bool crxReadSubbandHeaders( +std::uint32_t crxReadQP(CrxBitstream *bitStrm, std::int32_t kParam) +{ + std::uint32_t qp = crxBitstreamGetZeros(bitStrm); + if (qp >= 23) + qp = crxBitstreamGetBits(bitStrm, 8); + else if (kParam) + qp = crxBitstreamGetBits(bitStrm, kParam) | (qp << kParam); + return qp; +} + +void crxDecodeGolombTop(CrxBitstream *bitStrm, std::int32_t width, std::int32_t *lineBuf, std::int32_t *kParam) +{ + lineBuf[0] = 0; + while (width-- > 0) + { + lineBuf[1] = lineBuf[0]; + std::uint32_t qp = crxReadQP(bitStrm, *kParam); + lineBuf[1] += -(qp & 1) ^ (qp >> 1); + *kParam = crxPredictKParameter(*kParam, qp, 7); + ++lineBuf; + } + lineBuf[1] = lineBuf[0] + 1; +} + +void crxDecodeGolombNormal(CrxBitstream *bitStrm, std::int32_t width, std::int32_t *lineBuf0, std::int32_t *lineBuf1, std::int32_t *kParam) +{ + lineBuf1[0] = lineBuf0[1]; + std::int32_t deltaH = lineBuf0[1] - lineBuf0[0]; + while (width-- > 0) + { + lineBuf1[1] = crxPrediction(lineBuf1[0], lineBuf0[1], deltaH, lineBuf0[0] - lineBuf1[0]); + std::uint32_t qp = crxReadQP(bitStrm, *kParam); + lineBuf1[1] += -(qp & 1) ^ (qp >> 1); + if (width) { + deltaH = lineBuf0[2] - lineBuf0[1]; + *kParam = crxPredictKParameter(*kParam, (qp + 2 * std::abs(deltaH)) >> 1, 7); + ++lineBuf0; + } else { + *kParam = crxPredictKParameter(*kParam, qp, 7); + } + ++lineBuf1; + } + lineBuf1[1] = lineBuf1[0] + 1; +} + +bool crxMakeQStep(CrxImage *img, CrxTile *tile, std::int32_t *qpTable, std::uint32_t totalQP) +{ + if (img->levels > 3 || img->levels < 1) { + return false; + } + int qpWidth = (tile->width >> 3) + ((tile->width & 7) != 0); + int qpHeight = (tile->height >> 1) + (tile->height & 1); + int qpHeight4 = (tile->height >> 2) + ((tile->height & 3) != 0); + int qpHeight8 = (tile->height >> 3) + ((tile->height & 7) != 0); + std::size_t totalHeight = qpHeight; + if (img->levels > 1) { + totalHeight += qpHeight4; + } + if (img->levels > 2) { + totalHeight += qpHeight8; + } + + tile->qStep = static_cast( + malloc(totalHeight * qpWidth * sizeof(std::uint32_t) + img->levels * sizeof(CrxQStep)) + ); + + if (!tile->qStep) { + return false; + } + std::uint32_t *qStepTbl = (std::uint32_t *)(tile->qStep + img->levels); + CrxQStep *qStep = tile->qStep; + switch (img->levels) { + case 3: + qStep->qStepTbl = qStepTbl; + qStep->width = qpWidth; + qStep->height = qpHeight8; + for (int qpRow = 0; qpRow < qpHeight8; ++qpRow) { + int row0Idx = qpWidth * std::min(4 * qpRow, qpHeight - 1); + int row1Idx = qpWidth * std::min(4 * qpRow + 1, qpHeight - 1); + int row2Idx = qpWidth * std::min(4 * qpRow + 2, qpHeight - 1); + int row3Idx = qpWidth * std::min(4 * qpRow + 3, qpHeight - 1); + + for (int qpCol = 0; qpCol < qpWidth; ++qpCol, ++qStepTbl) { + std::int32_t quantVal = qpTable[row0Idx++] + qpTable[row1Idx++] + qpTable[row2Idx++] + qpTable[row3Idx++]; + // not sure about this nonsense - why is it not just avg like with 2 levels? + quantVal = ((quantVal < 0) * 3 + quantVal) >> 2; + if (quantVal / 6 >= 6) + *qStepTbl = q_step_tbl[quantVal % 6] * (1 << (quantVal / 6 + 26)); + else + *qStepTbl = q_step_tbl[quantVal % 6] >> (6 - quantVal / 6); + } + } + // continue to the next level - we always decode all levels + ++qStep; + case 2: + qStep->qStepTbl = qStepTbl; + qStep->width = qpWidth; + qStep->height = qpHeight4; + for (int qpRow = 0; qpRow < qpHeight4; ++qpRow) { + int row0Idx = qpWidth * std::min(2 * qpRow, qpHeight - 1); + int row1Idx = qpWidth * std::min(2 * qpRow + 1, qpHeight - 1); + + for (int qpCol = 0; qpCol < qpWidth; ++qpCol, ++qStepTbl) { + std::int32_t quantVal = (qpTable[row0Idx++] + qpTable[row1Idx++]) / 2; + if (quantVal / 6 >= 6) + *qStepTbl = q_step_tbl[quantVal % 6] * (1 << (quantVal / 6 + 26)); + else + *qStepTbl = q_step_tbl[quantVal % 6] >> (6 - quantVal / 6); + } + } + // continue to the next level - we always decode all levels + ++qStep; + case 1: + qStep->qStepTbl = qStepTbl; + qStep->width = qpWidth; + qStep->height = qpHeight; + for (int qpRow = 0; qpRow < qpHeight; ++qpRow) { + for (int qpCol = 0; qpCol < qpWidth; ++qpCol, ++qStepTbl, ++qpTable) { + if (*qpTable / 6 >= 6) + *qStepTbl = q_step_tbl[*qpTable % 6] * (1 << (*qpTable / 6 + 26)); + else + *qStepTbl = q_step_tbl[*qpTable % 6] >> (6 - *qpTable / 6); + } + } + break; + } + return true; +} + +inline void crxSetupSubbandIdx(crx_data_header_t *hdr, CrxImage *img, CrxSubband *band, int level, + short colStartIdx, short bandWidthExCoef, short rowStartIdx, + short bandHeightExCoef) +{ + if (hdr->version == 0x200) + { + band->rowStartAddOn = rowStartIdx; + band->rowEndAddOn = bandHeightExCoef; + band->colStartAddOn = colStartIdx; + band->colEndAddOn = bandWidthExCoef; + band->levelShift = 3 - level; + } + else + { + band->rowStartAddOn = 0; + band->rowEndAddOn = 0; + band->colStartAddOn = 0; + band->colEndAddOn = 0; + band->levelShift = 0; + } +} + +bool crxReadSubbandHeaders( // Combined with crxProcessSubbands function + crx_data_header_t* hdr, CrxImage* img, CrxTile* tile, CrxPlaneComp* comp, std::uint8_t** subbandMdatPtr, - std::uint32_t* mdatSize + std::int32_t* mdatSize ) { CrxSubband* band = comp->subBands + img->subbandCount - 1; // set to last band @@ -2640,8 +2837,8 @@ bool crxReadSubbandHeaders( // Coefficient structure is a bit unclear and convoluted: // 3 levels max - 8 groups (for tile width rounded to 8 bytes) // of 3 band per level 4 sets of coefficients for each - const std::int32_t* rowExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->width & 7); - const std::int32_t* colExCoef = exCoefNumTbl + 0x60 * (img->levels - 1) + 12 * (tile->height & 7); + const std::int32_t* rowExCoef = exCoefNumTbl + 0x30 * (img->levels - 1) + 6 * (tile->width & 7); + const std::int32_t* colExCoef = exCoefNumTbl + 0x30 * (img->levels - 1) + 6 * (tile->height & 7); for (int level = 0; level < img->levels; ++level) { const std::int32_t widthOddPixel = bandWidth & 1; @@ -2653,36 +2850,41 @@ bool crxReadSubbandHeaders( std::int32_t bandWidthExCoef1 = 0; std::int32_t bandHeightExCoef0 = 0; std::int32_t bandHeightExCoef1 = 0; + std::int32_t colStartIdx = 0; + std::int32_t rowStartIdx = 0; if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - bandWidthExCoef0 = rowExCoef[0]; - bandWidthExCoef1 = rowExCoef[1]; + bandWidthExCoef0 = rowExCoef[2 * level]; + bandWidthExCoef1 = rowExCoef[2 * level + 1]; } if (tile->tileFlag & E_HAS_TILES_ON_THE_LEFT) { ++bandWidthExCoef0; + colStartIdx = 1; } if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { - bandHeightExCoef0 = colExCoef[0]; - bandHeightExCoef1 = colExCoef[1]; + bandHeightExCoef0 = colExCoef[2 * level]; + bandHeightExCoef1 = colExCoef[2 * level + 1]; } if (tile->tileFlag & E_HAS_TILES_ON_THE_TOP) { ++bandHeightExCoef0; + rowStartIdx = 1; } band[0].width = bandWidth + bandWidthExCoef0 - widthOddPixel; band[0].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + crxSetupSubbandIdx(hdr, img, band, level + 1, colStartIdx, bandWidthExCoef0 - colStartIdx, rowStartIdx, bandHeightExCoef0 - rowStartIdx); band[-1].width = bandWidth + bandWidthExCoef1; band[-1].height = bandHeight + bandHeightExCoef0 - heightOddPixel; + crxSetupSubbandIdx(hdr, img, band - 1, level + 1, 0, bandWidthExCoef1, rowStartIdx, bandHeightExCoef0 - rowStartIdx); band[-2].width = bandWidth + bandWidthExCoef0 - widthOddPixel; band[-2].height = bandHeight + bandHeightExCoef1; + crxSetupSubbandIdx(hdr, img, band - 2, level + 1, colStartIdx, bandWidthExCoef0 - colStartIdx, 0, bandHeightExCoef1); - rowExCoef += 4; - colExCoef += 4; band -= 3; } @@ -2690,17 +2892,23 @@ bool crxReadSubbandHeaders( bandHeightExCoef = 0; if (tile->tileFlag & E_HAS_TILES_ON_THE_RIGHT) { - bandWidthExCoef = exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->width & 7) + 4 * (img->levels - 1) + 1]; + bandWidthExCoef = rowExCoef[2 * img->levels - 1]; } if (tile->tileFlag & E_HAS_TILES_ON_THE_BOTTOM) { - bandHeightExCoef = exCoefNumTbl[0x60 * (img->levels - 1) + 12 * (tile->height & 7) + 4 * (img->levels - 1) + 1]; + bandHeightExCoef = colExCoef[2 * img->levels - 1]; } } band->width = bandWidthExCoef + bandWidth; band->height = bandHeightExCoef + bandHeight; + if (img->levels) { + crxSetupSubbandIdx(hdr, img, band, img->levels, 0, bandWidthExCoef, 0, bandHeightExCoef); + } + // End of crxProcessSubbands + + // Begin of crxReadSubbandHeaders if (!img->subbandCount) { return true; } @@ -2709,35 +2917,61 @@ bool crxReadSubbandHeaders( band = comp->subBands; for (unsigned int curSubband = 0; curSubband < img->subbandCount; curSubband++, band++) { - if (*mdatSize < 0xC) { + if (*mdatSize < 4) { return false; } - if (sgetn(2, *subbandMdatPtr) != 0xFF03) { + int hdrSign = sgetn(2, *subbandMdatPtr); + int hdrSize = sgetn(2, *subbandMdatPtr + 2); + + if (*mdatSize < hdrSize + 4) { + return false; + } + if ((hdrSign != 0xFF03 || hdrSize != 8) && (hdrSign != 0xFF13 || hdrSize != 16)) { return false; } - const std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); const std::uint32_t subbandSize = sgetn(4, *subbandMdatPtr + 4); - - if (curSubband != bitData >> 28) { + if (curSubband != ((*subbandMdatPtr)[8] & 0xF0) >> 4) { band->dataSize = subbandSize; return false; } - band->dataSize = subbandSize - (bitData & 0x7FF); - band->supportsPartial = bitData & 0x8000; band->dataOffset = subbandOffset; - band->quantValue = (bitData >> 19) & 0xFF; - band->paramK = 0; - band->bandParam = nullptr; - band->bandBuf = nullptr; + band->kParam = 0; + band->bandParam = 0; + band->bandBuf = 0; band->bandSize = 0; + if (hdrSign == 0xFF03) { + // old header + std::uint32_t bitData = sgetn(4, *subbandMdatPtr + 8); + band->dataSize = subbandSize - (bitData & 0x7FFFF); + band->supportsPartial = bitData & 0x8000000; + band->qParam = (bitData >> 19) & 0xFF; + band->qStepBase = 0; + band->qStepMult = 0; + } else { + // new header + if (sgetn(2, *subbandMdatPtr + 8) & 0xFFF) { + // partial and qParam are not supported + return false; + } + if (sgetn(2, *subbandMdatPtr + 18)) { + // new header terminated by 2 zero bytes + return false; + } + band->supportsPartial = false; + band->qParam = 0; + band->dataSize = subbandSize - sgetn(2, *subbandMdatPtr + 16); + band->qStepBase = sgetn(4, *subbandMdatPtr + 12); + band->qStepMult = sgetn(2, *subbandMdatPtr + 10); + } + subbandOffset += subbandSize; - *subbandMdatPtr += 0xC; - *mdatSize -= 0xC; + *subbandMdatPtr += hdrSize + 4; + *mdatSize -= hdrSize + 4; } return true; @@ -2747,7 +2981,7 @@ bool crxReadImageHeaders( crx_data_header_t* hdr, CrxImage* img, std::uint8_t* mdatPtr, - std::uint32_t mdatSize + std::uint32_t mdatHdrSize ) { const unsigned int nTiles = img->tileRows * img->tileCols; @@ -2836,7 +3070,7 @@ bool crxReadImageHeaders( if (img->subbandCount) { for (int curBand = 0; curBand < img->subbandCount; curBand++, band++) { band->supportsPartial = false; - band->quantValue = 4; + band->qParam = 4; band->bandParam = nullptr; band->dataSize = 0; } @@ -2847,32 +3081,53 @@ bool crxReadImageHeaders( } std::uint32_t tileOffset = 0; - std::uint32_t dataSize = mdatSize; + std::int32_t dataSize = mdatHdrSize; std::uint8_t* dataPtr = mdatPtr; CrxTile* tile = img->tiles; for (unsigned int curTile = 0; curTile < nTiles; curTile++, tile++) { - if (dataSize < 0xC) { + if (dataSize < 4) { return false; } - if (sgetn(2, dataPtr) != 0xFF01) { + int hdrSign = sgetn(2, dataPtr); + int hdrSize = sgetn(2, dataPtr + 2); + if ((hdrSign != 0xFF01 || hdrSize != 8) && (hdrSign != 0xFF11 || (hdrSize != 8 && hdrSize != 16))) { + return false; + } + if (dataSize < hdrSize + 4) { + return false; + } + int tailSign = sgetn(2, dataPtr + 10); + if ((hdrSize == 8 && tailSign) || (hdrSize == 16 && tailSign != 0x4000)) { + return false; + } + if (sgetn(2, dataPtr + 8) != static_cast(curTile)) { return false; } - if (sgetn(2, dataPtr + 8) != curTile) { - return false; - } - - dataSize -= 0xC; + dataSize -= hdrSize + 4; tile->tileSize = sgetn(4, dataPtr + 4); tile->dataOffset = tileOffset; + tile->qStep = 0; - const std::int32_t hdrExtraBytes = sgetn(2, dataPtr + 2) - 8; + if (hdrSize == 16) { + // extended header data - terminated by 0 bytes + if (sgetn(2, dataPtr + 18) != 0) { + return false; + } + tile->hasQPData = true; + tile->mdatQPDataSize = sgetn(4, dataPtr + 12); + tile->mdatExtraSize = sgetn(2, dataPtr + 16); + } else { + tile->hasQPData = false; + tile->mdatQPDataSize = 0; + tile->mdatExtraSize = 0; + } + + dataPtr += hdrSize + 4; tileOffset += tile->tileSize; - dataPtr += hdrExtraBytes + 0xC; - dataSize -= hdrExtraBytes; std::uint32_t compOffset = 0; CrxPlaneComp* comp = tile->comps; @@ -2882,13 +3137,17 @@ bool crxReadImageHeaders( return false; } - if (sgetn(2, dataPtr) != 0xFF02) { + hdrSign = sgetn(2, dataPtr); + hdrSize = sgetn(2, dataPtr + 2); + if ((hdrSign != 0xFF02 && hdrSign != 0xFF12) || hdrSize != 8) { return false; } - if (compNum != dataPtr[8] >> 4) { return false; } + if (sgetn(3, dataPtr + 9) != 0) { + return false; + } comp->compSize = sgetn(4, dataPtr + 4); @@ -2912,7 +3171,60 @@ bool crxReadImageHeaders( comp->roundedBitsMask = 1 << (compHdrRoundedBits - 1); } - if (!crxReadSubbandHeaders(img, tile, comp, &dataPtr, &dataSize)) { + if (!crxReadSubbandHeaders(hdr, img, tile, comp, &dataPtr, &dataSize)) { + return false; + } + } + } + + if (hdr->version != 0x200) { + return true; + } + + tile = img->tiles; + for (unsigned int curTile = 0; curTile < nTiles; ++curTile, ++tile) { + if (tile->hasQPData) { + CrxBitstream bitStrm; + bitStrm.bitData = 0; + bitStrm.bitsLeft = 0; + bitStrm.curPos = 0; + bitStrm.curBufSize = 0; + bitStrm.mdatSize = tile->mdatQPDataSize; + bitStrm.curBufOffset = img->mdatOffset + tile->dataOffset; + bitStrm.input = img->input; + + crxFillBuffer(&bitStrm); + + unsigned int qpWidth = (tile->width >> 3) + ((tile->width & 7) != 0); + unsigned int qpHeight = (tile->height >> 1) + (tile->height & 1); + unsigned long totalQP = static_cast(qpHeight) * qpWidth; + + try { + std::vector qpTable(totalQP + 2 * (qpWidth + 2)); + std::int32_t *qpCurElem = qpTable.data(); + // 2 lines padded with extra pixels at the start and at the end + std::int32_t *qpLineBuf = qpTable.data() + totalQP; + std::int32_t kParam = 0; + for (unsigned qpRow = 0; qpRow < qpHeight; ++qpRow) { + std::int32_t *qpLine0 = qpRow & 1 ? qpLineBuf + qpWidth + 2 : qpLineBuf; + std::int32_t *qpLine1 = qpRow & 1 ? qpLineBuf : qpLineBuf + qpWidth + 2; + + if (qpRow) { + crxDecodeGolombNormal(&bitStrm, qpWidth, qpLine0, qpLine1, &kParam); + } else { + crxDecodeGolombTop(&bitStrm, qpWidth, qpLine1, &kParam); + } + + for (unsigned qpCol = 0; qpCol < qpWidth; ++qpCol) { + *qpCurElem++ = qpLine1[qpCol + 1] + 4; + } + } + + // now we read QP data - build tile QStep + if (!crxMakeQStep(img, tile, qpTable.data(), totalQP)) { + return false; + } + } catch (...) { return false; } } @@ -2927,12 +3239,12 @@ bool crxSetupImageData( std::int16_t* outBuf, std::uint64_t mdatOffset, std::uint32_t mdatSize, - std::uint8_t* mdatHdrPtr + std::uint8_t* mdatHdrPtr, + std::int32_t mdatHdrSize ) { - constexpr bool IncrBitTable[32] = { - false, false, false, false, false, false, false, false, false, true, true, false, false, false, true, false, - false, false, true, false, false, true, true, true, false, true, true, true, false, false, false, false + constexpr bool IncrBitTable[16] = { + false, false, false, false, false, false, false, false, false, true, true, false, false, false, true, false }; img->planeWidth = hdr->f_width; @@ -2950,7 +3262,10 @@ bool crxSetupImageData( img->tileCols = (img->planeWidth + hdr->tileWidth - 1) / hdr->tileWidth; img->tileRows = (img->planeHeight + hdr->tileHeight - 1) / hdr->tileHeight; - if (img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16) { + if ( + img->planeWidth - hdr->tileWidth * (img->tileCols - 1) < 0x16 || + img->planeHeight - hdr->tileHeight * (img->tileRows - 1) < 0x16 + ) { return false; } @@ -2965,6 +3280,7 @@ bool crxSetupImageData( img->mdatSize = mdatSize; img->planeBuf = nullptr; img->outBufs[0] = img->outBufs[1] = img->outBufs[2] = img->outBufs[3] = nullptr; + img->medianBits = hdr->medianBits; // The encoding type 3 needs all 4 planes to be decoded to generate row of // RGGB values. It seems to be using some other colour space for raw encoding @@ -2974,7 +3290,7 @@ bool crxSetupImageData( // left as is. if (img->encType == 3 && img->nPlanes == 4 && img->nBits > 8) { img->planeBuf = static_cast( - malloc(img->planeHeight * img->planeWidth * img->nPlanes * ((img->samplePrecision + 7) >> 3)) + malloc(static_cast(img->planeHeight) * img->planeWidth * img->nPlanes * ((img->samplePrecision + 7) >> 3)) ); if (!img->planeBuf) { @@ -3031,21 +3347,24 @@ bool crxSetupImageData( } // read header - return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatSize); + return crxReadImageHeaders(hdr, img, mdatHdrPtr, mdatHdrSize); } void crxFreeImageData(CrxImage* img) { - CrxTile* tile = img->tiles; - const int nTiles = img->tileRows * img->tileCols; - if (img->tiles) { - for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) { + CrxTile* const tile = img->tiles; + const int nTiles = img->tileRows * img->tileCols; + + for (std::int32_t curTile = 0; curTile < nTiles; ++curTile) { if (tile[curTile].comps) { for (std::int32_t curPlane = 0; curPlane < img->nPlanes; ++curPlane) { crxFreeSubbandData(img, tile[curTile].comps + curPlane); } } + if (tile[curTile].qStep) { + free(tile[curTile].qStep); + } } free(img->tiles); @@ -3107,13 +3426,14 @@ void DCraw::crxLoadRaw() { CrxImage img; - if (RT_canon_CR3_data.crx_track_selected >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { + if (RT_canon_CR3_data.crx_track_selected < 0 || + RT_canon_CR3_data.crx_track_selected >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { derror(); } crx_data_header_t hdr = RT_canon_CR3_data.crx_header[RT_canon_CR3_data.crx_track_selected]; - LibRaw_abstract_datastream input = {ifp}; + LibRaw_abstract_datastream input = { ifp }; img.input = &input; // libraw_internal_data.internal_data.input; // update sizes for the planes @@ -3124,9 +3444,10 @@ void DCraw::crxLoadRaw() hdr.tileHeight >>= 1; } -// /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; + // /*imgdata.color.*/maximum = (1 << hdr.nBits) - 1; + tiff_bps = hdr.nBits; - std::uint8_t* const hdrBuf = static_cast(malloc(hdr.mdatHdrSize)); + std::uint8_t* const hdrBuf = static_cast(malloc(hdr.mdatHdrSize * 2)); // read image header #ifdef _OPENMP @@ -3144,7 +3465,7 @@ void DCraw::crxLoadRaw() } // parse and setup the image data - if (!crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf)) { + if (!crxSetupImageData(&hdr, &img, reinterpret_cast(raw_image), hdr.MediaOffset /*data_offset*/, hdr.MediaSize /*RT_canon_CR3_data.data_size*/, hdrBuf, hdr.mdatHdrSize*2)) { derror(); } @@ -3159,9 +3480,9 @@ void DCraw::crxLoadRaw() crxFreeImageData(&img); } -bool DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) +bool DCraw::crxParseImageHeader(uchar* cmp1TagData, int nTrack, int size) { - if (nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { + if (nTrack < 0 || nTrack >= RT_canon_CR3_data.CRXTRACKS_MAXCOUNT) { return false; } @@ -3184,9 +3505,18 @@ bool DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) hdr->hasTileCols = cmp1TagData[27] >> 7; hdr->hasTileRows = (cmp1TagData[27] >> 6) & 1; hdr->mdatHdrSize = sgetn(4, cmp1TagData + 28); + int extHeader = cmp1TagData[32] >> 7; + int useMedianBits = 0; + hdr->medianBits = hdr->nBits; + + if (extHeader && size >= 56 && hdr->nPlanes == 4) + useMedianBits = cmp1TagData[56] >> 6 & 1; + + if (useMedianBits && size >= 84) + hdr->medianBits = cmp1TagData[84]; // validation - if (hdr->version != 0x100 || !hdr->mdatHdrSize) { + if ((hdr->version != 0x100 && hdr->version != 0x200) || !hdr->mdatHdrSize) { return false; } @@ -3205,25 +3535,16 @@ bool DCraw::crxParseImageHeader(uchar* cmp1TagData, unsigned int nTrack) } if (hdr->nPlanes == 1) { - if (hdr->cfaLayout || hdr->encType) { - return false; - } - - if (hdr->nBits != 8) { + if (hdr->cfaLayout || hdr->encType || hdr->nBits != 8) { return false; } } else if ( hdr->nPlanes != 4 - || (hdr->f_width & 1) - || (hdr->f_height & 1) - || (hdr->tileWidth & 1) - || (hdr->tileHeight & 1) + || hdr->f_width & 1 + || hdr->f_height & 1 + || hdr->tileWidth & 1 + || hdr->tileHeight & 1 || hdr->cfaLayout > 3 - || ( - hdr->encType - && hdr->encType != 1 - && hdr->encType != 3 - ) || hdr->nBits == 8 ) { return false; diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc index e5bfde555..83c44aa18 100644 --- a/rtengine/capturesharpening.cc +++ b/rtengine/capturesharpening.cc @@ -33,6 +33,50 @@ namespace { +void compute13x13kernel(float sigma, float kernel[13][13]) { + + const double temp = -2.f * rtengine::SQR(sigma); + float sum = 0.f; + for (int i = -6; i <= 6; ++i) { + for (int j = -6; j <= 6; ++j) { + if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 2.0)) { + kernel[i + 6][j + 6] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 6][j + 6]; + } else { + kernel[i + 6][j + 6] = 0.f; + } + } + } + + for (int i = 0; i < 13; ++i) { + for (int j = 0; j < 13; ++j) { + kernel[i][j] /= sum; + } + } +} + +void compute9x9kernel(float sigma, float kernel[9][9]) { + + const double temp = -2.f * rtengine::SQR(sigma); + float sum = 0.f; + for (int i = -4; i <= 4; ++i) { + for (int j = -4; j <= 4; ++j) { + if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 1.5)) { + kernel[i + 4][j + 4] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 4][j + 4]; + } else { + kernel[i + 4][j + 4] = 0.f; + } + } + } + + for (int i = 0; i < 9; ++i) { + for (int j = 0; j < 9; ++j) { + kernel[i][j] /= sum; + } + } +} + void compute7x7kernel(float sigma, float kernel[7][7]) { const double temp = -2.f * rtengine::SQR(sigma); @@ -83,12 +127,8 @@ void compute3x3kernel(float sigma, float kernel[3][3]) { float sum = 0.f; for (int i = -1; i <= 1; ++i) { for (int j = -1; j <= 1; ++j) { - if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) { - kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); - sum += kernel[i + 1][j + 1]; - } else { - kernel[i + 1][j + 1] = 0.f; - } + kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp); + sum += kernel[i + 1][j + 1]; } } @@ -99,31 +139,7 @@ void compute3x3kernel(float sigma, float kernel[3][3]) { } } -inline void initTile(float** dst, const int tileSize) -{ - - // first rows - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < tileSize; ++j) { - dst[i][j] = 1.f; - } - } - - // left and right border - for (int i = 3; i < tileSize - 3; ++i) { - dst[i][0] = dst[i][1] = dst[i][2] = 1.f; - dst[i][tileSize - 3] = dst[i][tileSize - 2] = dst[i][tileSize - 1] = 1.f; - } - - // last rows - for (int i = tileSize - 3 ; i < tileSize; ++i) { - for (int j = 0; j < tileSize; ++j) { - dst[i][j] = 1.f; - } - } -} - -inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[3][3]) +void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[3][3]) { const float c11 = kernel[0][0]; @@ -131,6 +147,11 @@ inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RES const float c00 = kernel[1][1]; for (int i = 1; i < tileSize - 1; i++) { +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif for (int j = 1; j < tileSize - 1; j++) { const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + @@ -140,7 +161,7 @@ inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RES } } -inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[5][5]) +void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[5][5]) { const float c21 = kernel[0][1]; @@ -151,6 +172,11 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES for (int i = 2; i < tileSize - 2; ++i) { // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif for (int j = 2; j < tileSize - 2; ++j) { const float val = c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + @@ -163,7 +189,7 @@ inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RES } } -inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[7][7]) +void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[7][7]) { const float c31 = kernel[0][2]; @@ -177,6 +203,11 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST for (int i = 3; i < tileSize - 3; ++i) { // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif for (int j = 3; j < tileSize - 3; ++j) { const float val = c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + @@ -192,13 +223,117 @@ inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** REST } } -inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[3][3]) +void gauss9x9div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[9][9]) +{ + + const float c42 = kernel[0][2]; + const float c41 = kernel[0][3]; + const float c40 = kernel[0][4]; + const float c33 = kernel[1][1]; + const float c32 = kernel[1][2]; + const float c31 = kernel[1][3]; + const float c30 = kernel[1][4]; + const float c22 = kernel[2][2]; + const float c21 = kernel[2][3]; + const float c20 = kernel[2][4]; + const float c11 = kernel[3][3]; + const float c10 = kernel[3][4]; + const float c00 = kernel[4][4]; + + for (int i = 4; i < tileSize - 4; ++i) { + // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif + for (int j = 4; j < tileSize - 4; ++j) { + const float val = c42 * ((src[i - 4][j - 2] + src[i - 4][j + 2]) + (src[i - 2][j - 4] + src[i - 2][j + 4]) + (src[i + 2][j - 4] + src[i + 2][j + 4]) + (src[i + 4][j - 2] + src[i + 4][j + 2])) + + c41 * ((src[i - 4][j - 1] + src[i - 4][j + 1]) + (src[i - 1][j - 4] + src[i - 1][j + 4]) + (src[i + 1][j - 4] + src[i + 1][j + 4]) + (src[i + 4][j - 1] + src[i + 4][j + 1])) + + c40 * (src[i - 4][j] + src[i][j - 4] + src[i][j + 4] + src[i + 4][j]) + + c33 * (src[i - 3][j - 3] + src[i - 3][j + 3] + src[i + 3][j - 3] + src[i + 3][j + 3]) + + c32 * ((src[i - 3][j - 2] + src[i - 3][j + 2]) + (src[i - 2][j - 3] + src[i - 2][j + 3]) + (src[i + 2][j - 3] + src[i + 2][j + 3]) + (src[i + 3][j - 2] + src[i + 3][j + 2])) + + c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + + dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); + } + } +} + +void gauss13x13div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int tileSize, const float kernel[13][13]) +{ + const float c60 = kernel[0][6]; + const float c53 = kernel[1][3]; + const float c52 = kernel[1][4]; + const float c51 = kernel[1][5]; + const float c50 = kernel[1][6]; + const float c44 = kernel[2][2]; + const float c42 = kernel[2][4]; + const float c41 = kernel[2][5]; + const float c40 = kernel[2][6]; + const float c33 = kernel[3][3]; + const float c32 = kernel[3][4]; + const float c31 = kernel[3][5]; + const float c30 = kernel[3][6]; + const float c22 = kernel[4][4]; + const float c21 = kernel[4][5]; + const float c20 = kernel[4][6]; + const float c11 = kernel[5][5]; + const float c10 = kernel[5][6]; + const float c00 = kernel[6][6]; + + for (int i = 6; i < tileSize - 6; ++i) { + // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif + for (int j = 6; j < tileSize - 6; ++j) { + const float val = c60 * (src[i - 6][j] + src[i][j - 6] + src[i][j + 6] + src[i + 6][j]) + + c53 * ((src[i - 5][j - 3] + src[i - 5][j + 3]) + (src[i - 3][j - 5] + src[i - 3][j + 5]) + (src[i + 3][j - 5] + src[i + 3][j + 5]) + (src[i + 5][j - 3] + src[i + 5][j + 3])) + + c52 * ((src[i - 5][j - 2] + src[i - 5][j + 2]) + (src[i - 2][j - 5] + src[i - 2][j + 5]) + (src[i + 2][j - 5] + src[i + 2][j + 5]) + (src[i + 5][j - 2] + src[i + 5][j + 2])) + + c51 * ((src[i - 5][j - 1] + src[i - 5][j + 1]) + (src[i - 1][j - 5] + src[i - 1][j + 5]) + (src[i + 1][j - 5] + src[i + 1][j + 5]) + (src[i + 5][j - 1] + src[i + 5][j + 1])) + + c50 * ((src[i - 5][j] + src[i][j - 5] + src[i][j + 5] + src[i + 5][j]) + ((src[i - 4][j - 3] + src[i - 4][j + 3]) + (src[i - 3][j - 4] + src[i - 3][j + 4]) + (src[i + 3][j - 4] + src[i + 3][j + 4]) + (src[i + 4][j - 3] + src[i + 4][j + 3]))) + + c44 * (src[i - 4][j - 4] + src[i - 4][j + 4] + src[i + 4][j - 4] + src[i + 4][j + 4]) + + c42 * ((src[i - 4][j - 2] + src[i - 4][j + 2]) + (src[i - 2][j - 4] + src[i - 2][j + 4]) + (src[i + 2][j - 4] + src[i + 2][j + 4]) + (src[i + 4][j - 2] + src[i + 4][j + 2])) + + c41 * ((src[i - 4][j - 1] + src[i - 4][j + 1]) + (src[i - 1][j - 4] + src[i - 1][j + 4]) + (src[i + 1][j - 4] + src[i + 1][j + 4]) + (src[i + 4][j - 1] + src[i + 4][j + 1])) + + c40 * (src[i - 4][j] + src[i][j - 4] + src[i][j + 4] + src[i + 4][j]) + + c33 * (src[i - 3][j - 3] + src[i - 3][j + 3] + src[i + 3][j - 3] + src[i + 3][j + 3]) + + c32 * ((src[i - 3][j - 2] + src[i - 3][j + 2]) + (src[i - 2][j - 3] + src[i - 2][j + 3]) + (src[i + 2][j - 3] + src[i + 2][j + 3]) + (src[i + 3][j - 2] + src[i + 3][j + 2])) + + c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + + dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f); + } + } +} + +void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[3][3]) { const float c11 = kernel[0][0]; const float c10 = kernel[0][1]; const float c00 = kernel[1][1]; for (int i = 1; i < tileSize - 1; i++) { +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif for (int j = 1; j < tileSize - 1; j++) { const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + @@ -209,7 +344,7 @@ inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int t } -inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[5][5]) +void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[5][5]) { const float c21 = kernel[0][1]; @@ -220,6 +355,11 @@ inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int for (int i = 2; i < tileSize - 2; ++i) { // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif for (int j = 2; j < tileSize - 2; ++j) { const float val = c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + @@ -232,7 +372,7 @@ inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int } } -inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[7][7]) +void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[7][7]) { const float c31 = kernel[0][2]; @@ -246,6 +386,11 @@ inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int t for (int i = 3; i < tileSize - 3; ++i) { // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif for (int j = 3; j < tileSize - 3; ++j) { const float val = c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + @@ -261,6 +406,105 @@ inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int t } } +void gauss9x9mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[9][9]) +{ + + const float c42 = kernel[0][2]; + const float c41 = kernel[0][3]; + const float c40 = kernel[0][4]; + const float c33 = kernel[1][1]; + const float c32 = kernel[1][2]; + const float c31 = kernel[1][3]; + const float c30 = kernel[1][4]; + const float c22 = kernel[2][2]; + const float c21 = kernel[2][3]; + const float c20 = kernel[2][4]; + const float c11 = kernel[3][3]; + const float c10 = kernel[3][4]; + const float c00 = kernel[4][4]; + + for (int i = 4; i < tileSize - 4; ++i) { + // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif + for (int j = 4; j < tileSize - 4; ++j) { + const float val = c42 * ((src[i - 4][j - 2] + src[i - 4][j + 2]) + (src[i - 2][j - 4] + src[i - 2][j + 4]) + (src[i + 2][j - 4] + src[i + 2][j + 4]) + (src[i + 4][j - 2] + src[i + 4][j + 2])) + + c41 * ((src[i - 4][j - 1] + src[i - 4][j + 1]) + (src[i - 1][j - 4] + src[i - 1][j + 4]) + (src[i + 1][j - 4] + src[i + 1][j + 4]) + (src[i + 4][j - 1] + src[i + 4][j + 1])) + + c40 * (src[i - 4][j] + src[i][j - 4] + src[i][j + 4] + src[i + 4][j]) + + c33 * (src[i - 3][j - 3] + src[i - 3][j + 3] + src[i + 3][j - 3] + src[i + 3][j + 3]) + + c32 * ((src[i - 3][j - 2] + src[i - 3][j + 2]) + (src[i - 2][j - 3] + src[i - 2][j + 3]) + (src[i + 2][j - 3] + src[i + 2][j + 3]) + (src[i + 3][j - 2] + src[i + 3][j + 2])) + + c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + dst[i][j] *= val; + } + } +} + +void gauss13x13mult(float** RESTRICT src, float** RESTRICT dst, const int tileSize, const float kernel[13][13]) +{ + + const float c60 = kernel[0][6]; + const float c53 = kernel[1][3]; + const float c52 = kernel[1][4]; + const float c51 = kernel[1][5]; + const float c50 = kernel[1][6]; + const float c44 = kernel[2][2]; + const float c42 = kernel[2][4]; + const float c41 = kernel[2][5]; + const float c40 = kernel[2][6]; + const float c33 = kernel[3][3]; + const float c32 = kernel[3][4]; + const float c31 = kernel[3][5]; + const float c30 = kernel[3][6]; + const float c22 = kernel[4][4]; + const float c21 = kernel[4][5]; + const float c20 = kernel[4][6]; + const float c11 = kernel[5][5]; + const float c10 = kernel[5][6]; + const float c00 = kernel[6][6]; + + for (int i = 6; i < tileSize - 6; ++i) { + // I tried hand written SSE code but gcc vectorizes better +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep +#endif + for (int j = 6; j < tileSize - 6; ++j) { + const float val = c60 * (src[i - 6][j] + src[i][j - 6] + src[i][j + 6] + src[i + 6][j]) + + c53 * ((src[i - 5][j - 3] + src[i - 5][j + 3]) + (src[i - 3][j - 5] + src[i - 3][j + 5]) + (src[i + 3][j - 5] + src[i + 3][j + 5]) + (src[i + 5][j - 3] + src[i + 5][j + 3])) + + c52 * ((src[i - 5][j - 2] + src[i - 5][j + 2]) + (src[i - 2][j - 5] + src[i - 2][j + 5]) + (src[i + 2][j - 5] + src[i + 2][j + 5]) + (src[i + 5][j - 2] + src[i + 5][j + 2])) + + c51 * ((src[i - 5][j - 1] + src[i - 5][j + 1]) + (src[i - 1][j - 5] + src[i - 1][j + 5]) + (src[i + 1][j - 5] + src[i + 1][j + 5]) + (src[i + 5][j - 1] + src[i + 5][j + 1])) + + c50 * ((src[i - 5][j] + src[i][j - 5] + src[i][j + 5] + src[i + 5][j]) + ((src[i - 4][j - 3] + src[i - 4][j + 3]) + (src[i - 3][j - 4] + src[i - 3][j + 4]) + (src[i + 3][j - 4] + src[i + 3][j + 4]) + (src[i + 4][j - 3] + src[i + 4][j + 3]))) + + c44 * (src[i - 4][j - 4] + src[i - 4][j + 4] + src[i + 4][j - 4] + src[i + 4][j + 4]) + + c42 * ((src[i - 4][j - 2] + src[i - 4][j + 2]) + (src[i - 2][j - 4] + src[i - 2][j + 4]) + (src[i + 2][j - 4] + src[i + 2][j + 4]) + (src[i + 4][j - 2] + src[i + 4][j + 2])) + + c41 * ((src[i - 4][j - 1] + src[i - 4][j + 1]) + (src[i - 1][j - 4] + src[i - 1][j + 4]) + (src[i + 1][j - 4] + src[i + 1][j + 4]) + (src[i + 4][j - 1] + src[i + 4][j + 1])) + + c40 * (src[i - 4][j] + src[i][j - 4] + src[i][j + 4] + src[i + 4][j]) + + c33 * (src[i - 3][j - 3] + src[i - 3][j + 3] + src[i + 3][j - 3] + src[i + 3][j + 3]) + + c32 * ((src[i - 3][j - 2] + src[i - 3][j + 2]) + (src[i - 2][j - 3] + src[i - 2][j + 3]) + (src[i + 2][j - 3] + src[i + 2][j + 3]) + (src[i + 3][j - 2] + src[i + 3][j + 2])) + + c31 * ((src[i - 3][j - 1] + src[i - 3][j + 1]) + (src[i - 1][j - 3] + src[i - 1][j + 3]) + (src[i + 1][j - 3] + src[i + 1][j + 3]) + (src[i + 3][j - 1] + src[i + 3][j + 1])) + + c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) + + c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) + + c21 * ((src[i - 2][j - 1] + src[i - 2][j + 1]) + (src[i - 1][j - 2] + src[i - 1][j + 2]) + (src[i + 1][j - 2] + src[i + 1][j + 2]) + (src[i + 2][j - 1] + src[i + 2][j + 1])) + + c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) + + c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + + c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + + c00 * src[i][j]; + + dst[i][j] *= val; + } + } +} + void buildClipMaskBayer(const float * const *rawData, int W, int H, float** clipMask, const float whites[2][2]) { @@ -399,7 +643,7 @@ float calcRadiusBayer(const float * const *rawData, int W, int H, float lowerLim } } } - return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f); + return std::sqrt(1.f / std::log(maxRatio)); } float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, unsigned int starty, unsigned int startx) @@ -490,37 +734,38 @@ float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLi } } } - return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f); + return std::sqrt(1.f / std::log(maxRatio)); } bool checkForStop(float** tmpIThr, float** iterCheck, int fullTileSize, int border) { - bool stopped = false; - for (int ii = border; !stopped && ii < fullTileSize - border; ++ii) { + for (int ii = border; ii < fullTileSize - border; ++ii) { #ifdef __SSE2__ for (int jj = border; jj < fullTileSize - border; jj += 4) { - if (_mm_movemask_ps((vfloat)vmaskf_lt(LVFU(tmpIThr[ii][jj]), LVFU(iterCheck[ii - border][jj - border])))) { - stopped = true; - break; + if (UNLIKELY(_mm_movemask_ps((vfloat)vmaskf_lt(LVFU(tmpIThr[ii][jj]), LVFU(iterCheck[ii - border][jj - border]))))) { + return true; } } #else for (int jj = border; jj < fullTileSize - border; ++jj) { if (tmpIThr[ii][jj] < iterCheck[ii - border][jj - border]) { - stopped = true; - break; + return true; } } #endif } - return stopped; + return false; } -void CaptureDeconvSharpening (float ** clipmask, float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, double sigmaCornerOffset, int iterations, bool checkIterStop, rtengine::ProgressListener* plistener, double startVal, double endVal) +void CaptureDeconvSharpening (float** luminance, const float* const * oldLuminance, const float * const * blend, int W, int H, float sigma, float sigmaCornerOffset, int iterations, bool checkIterStop, rtengine::ProgressListener* plistener, double startVal, double endVal) { BENCHFUN - const bool is5x5 = (sigma <= 0.84 && sigmaCornerOffset == 0.0); - const bool is3x3 = (sigma < 0.6 && sigmaCornerOffset == 0.0); + const bool is9x9 = (sigma <= 1.5f && sigmaCornerOffset == 0.f); + const bool is7x7 = (sigma <= 1.15f && sigmaCornerOffset == 0.f); + const bool is5x5 = (sigma <= 0.84f && sigmaCornerOffset == 0.f); + const bool is3x3 = (sigma < 0.6f && sigmaCornerOffset == 0.f); + float kernel13[13][13]; + float kernel9[9][9]; float kernel7[7][7]; float kernel5[5][5]; float kernel3[3][3]; @@ -528,19 +773,24 @@ BENCHFUN compute3x3kernel(sigma, kernel3); } else if (is5x5) { compute5x5kernel(sigma, kernel5); - } else { + } else if (is7x7) { compute7x7kernel(sigma, kernel7); + } else if (is9x9) { + compute9x9kernel(sigma, kernel9); + } else { + compute13x13kernel(sigma, kernel13); } constexpr int tileSize = 32; - const int border = iterations <= 30 ? 5 : 7; + const int border = (is3x3 || is5x5 || is7x7) ? iterations <= 30 ? 5 : 7 : 8; const int fullTileSize = tileSize + 2 * border; - const float cornerRadius = std::min(1.15f, sigma + sigmaCornerOffset); + const float cornerRadius = std::min(2.f, sigma + sigmaCornerOffset); const float cornerDistance = sqrt(rtengine::SQR(W * 0.5f) + rtengine::SQR(H * 0.5f)); const float distanceFactor = (cornerRadius - sigma) / cornerDistance; double progress = startVal; const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H); + constexpr float minBlend = 0.01f; #ifdef _OPENMP @@ -550,9 +800,9 @@ BENCHFUN int progresscounter = 0; array2D tmpIThr(fullTileSize, fullTileSize); array2D tmpThr(fullTileSize, fullTileSize); + tmpThr.fill(1.f); array2D lumThr(fullTileSize, fullTileSize); array2D iterCheck(tileSize, tileSize); - initTile(tmpThr, fullTileSize); #ifdef _OPENMP #pragma omp for schedule(dynamic,16) collapse(2) #endif @@ -567,14 +817,14 @@ BENCHFUN if (checkIterStop) { for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { - iterCheck[k][l] = oldLuminance[ii][jj] * clipmask[ii][jj] * 0.5f; - maxVal = std::max(maxVal, clipmask[ii][jj]); + iterCheck[k][l] = oldLuminance[ii][jj] * blend[ii][jj] * 0.5f; + maxVal = std::max(maxVal, blend[ii][jj]); } } } else { for (int k = 0, ii = endOfCol ? H - fullTileSize + border : i; k < tileSize; ++k, ++ii) { for (int l = 0, jj = endOfRow ? W - fullTileSize + border : j; l < tileSize; ++l, ++jj) { - maxVal = std::max(maxVal, clipmask[ii][jj]); + maxVal = std::max(maxVal, blend[ii][jj]); } } } @@ -593,14 +843,14 @@ BENCHFUN if (checkIterStop) { for (int ii = 0; ii < tileSize; ++ii) { for (int jj = 0; jj < tileSize; ++jj) { - iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * clipmask[i + ii][j + jj] * 0.5f; - maxVal = std::max(maxVal, clipmask[i + ii][j + jj]); + iterCheck[ii][jj] = oldLuminance[i + ii][j + jj] * blend[i + ii][j + jj] * 0.5f; + maxVal = std::max(maxVal, blend[i + ii][j + jj]); } } } else { for (int ii = 0; ii < tileSize; ++ii) { for (int jj = 0; jj < tileSize; ++jj) { - maxVal = std::max(maxVal, clipmask[i + ii][j + jj]); + maxVal = std::max(maxVal, blend[i + ii][j + jj]); } } } @@ -615,61 +865,100 @@ BENCHFUN } } } - bool stopped = false; if (is3x3) { - for (int k = 0; k < iterations && !stopped; ++k) { + for (int k = 0; k < iterations; ++k) { // apply 3x3 gaussian blur and divide luminance by result of gaussian blur gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel3); gauss3x3mult(tmpThr, tmpIThr, fullTileSize, kernel3); - if (checkIterStop) { - stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; } } } else if (is5x5) { - for (int k = 0; k < iterations && !stopped; ++k) { + for (int k = 0; k < iterations; ++k) { // apply 5x5 gaussian blur and divide luminance by result of gaussian blur gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel5); gauss5x5mult(tmpThr, tmpIThr, fullTileSize, kernel5); - if (checkIterStop) { - stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; + } + } + } else if (is7x7) { + for (int k = 0; k < iterations; ++k) { + // apply 5x5 gaussian blur and divide luminance by result of gaussian blur + gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel7); + gauss7x7mult(tmpThr, tmpIThr, fullTileSize, kernel7); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; + } + } + } else if (is9x9) { + for (int k = 0; k < iterations; ++k) { + // apply 5x5 gaussian blur and divide luminance by result of gaussian blur + gauss9x9div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel9); + gauss9x9mult(tmpThr, tmpIThr, fullTileSize, kernel9); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; } } } else { - if (sigmaCornerOffset != 0.0) { + if (sigmaCornerOffset != 0.f) { const float distance = sqrt(rtengine::SQR(i + tileSize / 2 - H / 2) + rtengine::SQR(j + tileSize / 2 - W / 2)); const float sigmaTile = static_cast(sigma) + distanceFactor * distance; if (sigmaTile >= 0.4f) { - if (sigmaTile > 0.84) { // have to use 7x7 kernel + if (sigmaTile > 1.5f) { // have to use 13x13 kernel + float lkernel13[13][13]; + compute13x13kernel(static_cast(sigma) + distanceFactor * distance, lkernel13); + for (int k = 0; k < iterations; ++k) { + // apply 13x13 gaussian blur and divide luminance by result of gaussian blur + gauss13x13div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel13); + gauss13x13mult(tmpThr, tmpIThr, fullTileSize, lkernel13); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; + } + } + } else if (sigmaTile > 1.15f) { // have to use 9x9 kernel + float lkernel9[9][9]; + compute9x9kernel(static_cast(sigma) + distanceFactor * distance, lkernel9); + for (int k = 0; k < iterations; ++k) { + // apply 9x9 gaussian blur and divide luminance by result of gaussian blur + gauss9x9div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel9); + gauss9x9mult(tmpThr, tmpIThr, fullTileSize, lkernel9); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; + } + } + } else if (sigmaTile > 0.84f) { // have to use 7x7 kernel float lkernel7[7][7]; compute7x7kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); - for (int k = 0; k < iterations && !stopped; ++k) { + for (int k = 0; k < iterations; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); gauss7x7mult(tmpThr, tmpIThr, fullTileSize, lkernel7); - if (checkIterStop) { - stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; } } } else { // can use 5x5 kernel - float lkernel7[5][5]; - compute5x5kernel(static_cast(sigma) + distanceFactor * distance, lkernel7); - for (int k = 0; k < iterations && !stopped; ++k) { + float lkernel5[5][5]; + compute5x5kernel(static_cast(sigma) + distanceFactor * distance, lkernel5); + for (int k = 0; k < iterations; ++k) { // apply 7x7 gaussian blur and divide luminance by result of gaussian blur - gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel7); - gauss5x5mult(tmpThr, tmpIThr, fullTileSize, lkernel7); - if (checkIterStop) { - stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, lkernel5); + gauss5x5mult(tmpThr, tmpIThr, fullTileSize, lkernel5); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; } } } } } else { - for (int k = 0; k < iterations && !stopped; ++k) { - // apply 7x7 gaussian blur and divide luminance by result of gaussian blur - gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel7); - gauss7x7mult(tmpThr, tmpIThr, fullTileSize, kernel7); - if (checkIterStop) { - stopped = checkForStop(tmpIThr, iterCheck, fullTileSize, border); + for (int k = 0; k < iterations; ++k) { + // apply 13x13 gaussian blur and divide luminance by result of gaussian blur + gauss13x13div(tmpIThr, tmpThr, lumThr, fullTileSize, kernel13); + gauss13x13mult(tmpThr, tmpIThr, fullTileSize, kernel13); + if (checkIterStop && k < iterations - 1 && checkForStop(tmpIThr, iterCheck, fullTileSize, border)) { + break; } } } @@ -678,23 +967,23 @@ BENCHFUN // special handling for small tiles at end of row or column for (int k = border, ii = endOfCol ? H - fullTileSize : i - border; k < fullTileSize - border; ++k) { for (int l = border, jj = endOfRow ? W - fullTileSize : j - border; l < fullTileSize - border; ++l) { - luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], std::max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]); + luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], tmpIThr[k][l], luminance[ii + k][jj + l]); } } } else { for (int ii = border; ii < fullTileSize - border; ++ii) { for (int jj = border; jj < fullTileSize - border; ++jj) { - luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], std::max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]); + luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], tmpIThr[ii][jj], luminance[i + ii - border][j + jj - border]); } } } if (plistener) { - if (++progresscounter % 16 == 0) { + if (++progresscounter % 32 == 0) { #ifdef _OPENMP #pragma omp critical(csprogress) #endif { - progress += 16.0 * progressStep; + progress += 32.0 * progressStep; progress = rtengine::min(progress, endVal); plistener->setProgress(progress); } @@ -721,13 +1010,14 @@ void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams plistener->setProgress(0.0); } BENCHFUN + constexpr float xyz_rgb[3][3] = { // XYZ from RGB { 0.412453, 0.357580, 0.180423 }, { 0.212671, 0.715160, 0.072169 }, { 0.019334, 0.119193, 0.950227 } }; - float contrast = conrastThreshold / 100.f; + float contrast = conrastThreshold / 100.0; const float clipVal = (ri->get_white(1) - ri->get_cblack(1)) * scale_mul[1]; @@ -737,7 +1027,7 @@ BENCHFUN array2D clipMask(W, H); constexpr float clipLimit = 0.95f; - constexpr float maxSigma = 1.15f; + constexpr float maxSigma = 2.f; if (getSensorType() == ST_BAYER) { const float whites[2][2] = { @@ -786,6 +1076,10 @@ BENCHFUN } } + if (std::isnan(radius)) { + return; + } + if (showMask) { array2D& L = blue; // blue will be overridden anyway => we can use its buffer to store L #ifdef _OPENMP @@ -799,8 +1093,7 @@ BENCHFUN plistener->setProgress(0.1); } - array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask - buildBlendMask(L, blend, W, H, contrast, sharpeningParams.autoContrast, clipMask); + buildBlendMask(L, clipMask, W, H, contrast, sharpeningParams.autoContrast, clipMask); if (plistener) { plistener->setProgress(0.2); } @@ -810,7 +1103,7 @@ BENCHFUN #endif for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { - red[i][j] = green[i][j] = blue[i][j] = blend[i][j] * 16384.f; + red[i][j] = green[i][j] = blue[i][j] = clipMask[i][j] * 16384.f; } } if (plistener) { @@ -819,23 +1112,23 @@ BENCHFUN return; } - array2D* Lbuffer = nullptr; + std::unique_ptr> Lbuffer; if (!redCache) { - Lbuffer = new array2D(W, H); + Lbuffer.reset(new array2D(W, H)); } - array2D* YOldbuffer = nullptr; + std::unique_ptr> YOldbuffer; if (!greenCache) { - YOldbuffer = new array2D(W, H); + YOldbuffer.reset(new array2D(W, H)); } - array2D* YNewbuffer = nullptr; + std::unique_ptr> YNewbuffer; if (!blueCache) { - YNewbuffer = new array2D(W, H); + YNewbuffer.reset(new array2D(W, H)); } - array2D& L = Lbuffer ? *Lbuffer : red; - array2D& YOld = YOldbuffer ? * YOldbuffer : green; - array2D& YNew = YNewbuffer ? * YNewbuffer : blue; + array2D& L = Lbuffer.get() ? *Lbuffer.get() : red; + array2D& YOld = YOldbuffer.get() ? *YOldbuffer.get() : green; + array2D& YNew = YNewbuffer.get() ? *YNewbuffer.get() : blue; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) @@ -847,43 +1140,35 @@ BENCHFUN if (plistener) { plistener->setProgress(0.1); } + // calculate contrast based blend factors to reduce sharpening in regions with low contrast - array2D& blend = clipMask; // we can share blend and clipMask buffer here - buildBlendMask(L, blend, W, H, contrast, sharpeningParams.autoContrast, clipMask); + buildBlendMask(L, clipMask, W, H, contrast, sharpeningParams.autoContrast, clipMask); if (plistener) { plistener->setProgress(0.2); } conrastThreshold = contrast * 100.f; - - CaptureDeconvSharpening(clipMask, YNew, YOld, blend, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, sharpeningParams.deconvitercheck, plistener, 0.2, 0.9); + CaptureDeconvSharpening(YNew, YOld, clipMask, W, H, radius, sharpeningParams.deconvradiusOffset, sharpeningParams.deconviter, sharpeningParams.deconvitercheck, plistener, 0.2, 0.9); if (plistener) { plistener->setProgress(0.9); } + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < H; ++i) { - int j = 0; -#ifdef __SSE2__ - for (; j < W - 3; j += 4) { - const vfloat factor = vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)); - STVFU(red[i][j], LVFU(redVals[i][j]) * factor); - STVFU(green[i][j], LVFU(greenVals[i][j]) * factor); - STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor); - } - +#if defined(__clang__) + #pragma clang loop vectorize(assume_safety) +#elif defined(__GNUC__) + #pragma GCC ivdep #endif - for (; j < W; ++j) { - const float factor = std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f); + for (int j = 0; j < W; ++j) { + const float factor = YNew[i][j] / std::max(YOld[i][j], 0.00001f); red[i][j] = redVals[i][j] * factor; green[i][j] = greenVals[i][j] * factor; blue[i][j] = blueVals[i][j] * factor; } } - delete Lbuffer; - delete YOldbuffer; - delete YNewbuffer; if (plistener) { plistener->setProgress(1.0); } diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index c7e49b2ed..25f0c852d 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -2,7 +2,7 @@ * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath - * + * Changes in Ciecam02 with Ciecam16 Jacques Desmis jdesmis@gmail.com 12/2020 * 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 @@ -22,14 +22,22 @@ #include #include "sleef.h" -#ifdef _DEBUG -#include "settings.h" -#include -#endif - #undef CLIPD -#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0) +#define CLIPD(a) ((a)>0.f?((a)<1.f?(a):1.f):0.f) #define MAXR(a,b) ((a) > (b) ? (a) : (b)) +#define Jzazbz_b 1.15 +#define Jzazbz_g 0.66 +#define Jzazbz_c1 (3424/4096.0) +#define Jzazbz_c2 (2413/128.0) +#define Jzazbz_c3 (2392/128.0) +#define Jzazbz_n (2610/16384.0) +#define Jzazbz_p (1.7*2523/32.0) +#define Jzazbz_d (-0.56) +#define Jzazbz_d0 (1.6295499532821566e-11) +#define Jzazbz_ni (16384.0/2610.0) +#define Jzazbz_pi (32.0/4289.1) //4289.1 = 2523 * 1.7 + + namespace rtengine { @@ -53,7 +61,7 @@ void Ciecam02::curvecolorfloat (float satind, float satval, float &sres, float p } } -void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf & outCurve) +void Ciecam02::curveJfloat (float br, float contr, float thr, const LUTu & histogram, LUTf & outCurve) { // check if brightness curve is needed @@ -72,10 +80,12 @@ void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf brightcurvePoints[5] = 0.7f; // shoulder point brightcurvePoints[6] = min (1.0f, 0.7f + br / 300.0f); //value at shoulder point } else { - brightcurvePoints[3] = 0.1f - br / 150.0f; // toe point + brightcurvePoints[3] = max(0.0, 0.1 - (double) br / 150.0); // toe point + // brightcurvePoints[3] = 0.1f - br / 150.0f; // toe point brightcurvePoints[4] = 0.1f; // value at toe point - brightcurvePoints[5] = min (1.0f, 0.7f - br / 300.0f); // shoulder point + // brightcurvePoints[5] = min (1.0f, 0.7f - br / 300.0f); // shoulder point + brightcurvePoints[5] = 0.7f - br / 300.0f; // shoulder point brightcurvePoints[6] = 0.7f; // value at shoulder point } @@ -102,7 +112,6 @@ void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf outCurve.makeIdentity (32767.f); } - if (contr > 0.00001f || contr < -0.00001f) { // compute mean luminance of the image with the curve applied @@ -115,6 +124,10 @@ void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf } avg /= sum; + // printf("avg=%f \n", (double) avg); + float thrmin = (thr - contr / 250.0f); + float thrmax = (thr + contr / 250.0f); + std::vector contrastcurvePoints (9); contrastcurvePoints[0] = double (DCT_NURBS); @@ -122,11 +135,11 @@ void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf contrastcurvePoints[1] = 0.f; // black point. Value in [0 ; 1] range contrastcurvePoints[2] = 0.f; // black point. Value in [0 ; 1] range - contrastcurvePoints[3] = avg - avg * (0.6f - contr / 250.0f); // toe point - contrastcurvePoints[4] = avg - avg * (0.6f + contr / 250.0f); // value at toe point + contrastcurvePoints[3] = avg - avg * thrmin; // toe point + contrastcurvePoints[4] = avg - avg * thrmax;// value at toe point - contrastcurvePoints[5] = avg + (1 - avg) * (0.6f - contr / 250.0f); // shoulder point - contrastcurvePoints[6] = avg + (1 - avg) * (0.6f + contr / 250.0f); // value at shoulder point + contrastcurvePoints[5] = avg + (1.f - avg) * thrmin; // shoulder point + contrastcurvePoints[6] = avg + (1.f - avg) * thrmax; // value at shoulder point contrastcurvePoints[7] = 1.f; // white point contrastcurvePoints[8] = 1.f; // value at white point @@ -187,26 +200,30 @@ 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)); } -float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb ) +float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int c16, float plum) { 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); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); 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); -// 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(c16 == 1) { + cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc, c16); + rp = MAXR (rp, 0.0f); + gp = MAXR (gp, 0.0f); + bp = MAXR (bp, 0.0f); + } else { + rp = MAXR (rc, 0.0f); + gp = MAXR (gc, 0.0f); + bp = MAXR (bc, 0.0f); + } rpa = nonlinear_adaptationfloat ( rp, fl ); gpa = nonlinear_adaptationfloat ( gp, fl ); @@ -215,97 +232,303 @@ 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_cat02float ( float &r, float &g, float &b, float x, float y, float 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 +void Ciecam02::xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int c16, float plum) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + //original cat02 //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); -// } + float peakLum = 1.f/ plum; + if(c16 == 1) {//cat02 + 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); + } else if (c16 == 16) {//cat16 + r = ( 0.401288f * x) + (0.650173f * y) - (0.051461f * z); //cat16 + g = (-0.250268f * x) + (1.204414f * y) + (0.045854f * z); + b = ( -0.002079f * x) + (0.048952f * y) + (0.953127f * z); + } else if (c16 == 21) {//cam16 PQ + float rp = ( 0.401288f * x) + (0.650173f * y) - (0.051461f * z); //cat16 + float gp = (-0.250268f * x) + (1.204414f * y) + (0.045854f * z); + float bp = ( -0.002079f * x) + (0.048952f * y) + (0.953127f * z); + rp *= 0.01f; + gp *= 0.01f; + bp *= 0.01f; + float tmp = pow_F(rp * peakLum, Jzazbz_n); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + r = 100.f * pow((Jzazbz_c1 + Jzazbz_c2 * tmp) / (1. + Jzazbz_c3 * tmp), Jzazbz_p); + if(std::isnan(r) || r < 0.f) { + r = 0.f; + } + + tmp = pow_F(gp * peakLum, Jzazbz_n); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + g = 100.f * pow((Jzazbz_c1 + Jzazbz_c2 * tmp) / (1. + Jzazbz_c3 * tmp), Jzazbz_p); + if(std::isnan(g) || g < 0.f) { + g = 0.f; + } + tmp = pow_F(bp * peakLum, Jzazbz_n); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + + b = 100.f * pow((Jzazbz_c1 + Jzazbz_c2 * tmp) / (1. + Jzazbz_c3 * tmp), Jzazbz_p); + if(std::isnan(b) || b < 0.f) { + b = 0.f; + } + } + } + #ifdef __SSE2__ -void Ciecam02::xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z ) -{ +void Ciecam02::xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z, int c16, vfloat plum) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash //gamut correction M.H.Brill S.Susstrunk - r = ( F2V (1.007245f) * x) + (F2V (0.011136f) * y) - (F2V (0.018381f) * z); //Changjun Li - g = (F2V (-0.318061f) * x) + (F2V (1.314589f) * y) + (F2V (0.003471f) * z); - b = z; + if(c16 == 1) { + r = ( F2V (1.007245f) * x) + (F2V (0.011136f) * y) - (F2V (0.018381f) * z); //Changjun Li + g = (F2V (-0.318061f) * x) + (F2V (1.314589f) * y) + (F2V (0.003471f) * z); + b = z; + } else if (c16 == 16) { + //cat16 + r = ( F2V (0.401288f) * x) + (F2V (0.650173f) * y) - (F2V (0.051461f) * z); + g = -(F2V (0.250268f) * x) + (F2V (1.204414f) * y) + (F2V (0.045854f) * z); + b = -(F2V(0.002079f) * x) + (F2V(0.048952f) * y) + (F2V(0.953127f) * z); + } else if (c16 == 21) { + vfloat rp = ( F2V (0.401288f) * x) + (F2V (0.650173f) * y) - (F2V (0.051461f) * z); + vfloat gp = -(F2V (0.250268f) * x) + (F2V (1.204414f) * y) + (F2V (0.045854f) * z); + vfloat bp = -(F2V(0.002079f) * x) + (F2V(0.048952f) * y) + (F2V(0.953127f) * z); + vfloat Jzazbz_c1v = F2V(Jzazbz_c1); + vfloat Jzazbz_c2v = F2V(Jzazbz_c2); + vfloat Jzazbz_nv = F2V(Jzazbz_n); + vfloat Jzazbz_c3v = F2V(Jzazbz_c3); + vfloat Jzazbz_pv = F2V(Jzazbz_p); + vfloat mulone = F2V(0.01f); + vfloat mulhund = F2V(100.f); + float RR, GG, BB; + vfloat one = F2V(1.); + vfloat peakLumv = one / plum; + rp *= mulone; + gp *= mulone; + bp *= mulone; + vfloat tmp = pow_F(rp * peakLumv, Jzazbz_nv ); + STVF(RR, tmp); + if(std::isnan(RR)) {//to avoid crash + tmp = F2V(0.f);; + } + r = mulhund * pow_F((Jzazbz_c1v + Jzazbz_c2v * tmp) / (one + Jzazbz_c3v * tmp), Jzazbz_pv); + STVF(RR, r); + if(std::isnan(RR) || RR < 0.f) {//to avoid crash + r = F2V(0.f);; + } + tmp = pow_F(gp * peakLumv, Jzazbz_nv ); + STVF(RR, tmp); + if(std::isnan(RR)) {//to avoid crash + tmp = F2V(0.f);; + } + + g = mulhund * pow_F((Jzazbz_c1v + Jzazbz_c2v * tmp) / (one + Jzazbz_c3v * tmp), Jzazbz_pv); + STVF(GG, g); + if(std::isnan(GG) || GG < 0.f) {//to avoid crash + g = F2V(0.f);; + } + + tmp = pow_F(bp * peakLumv, Jzazbz_nv ); + STVF(RR, tmp); + if(std::isnan(RR)) {//to avoid crash + tmp = F2V(0.f);; + } + + b = mulhund * pow_F((Jzazbz_c1v + Jzazbz_c2v * tmp) / (one + Jzazbz_c3v * tmp), Jzazbz_pv); + STVF(BB, b); + if(std::isnan(BB) || BB < 0.f) {//to avoid crash + b = F2V(0.f);; + } + + } } #endif -void Ciecam02::cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float 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 +void Ciecam02::cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16, float plum) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + //original cat02 //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); -// } + float pl = plum; + if(c16 == 1) { + 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); + } else if(c16 == 16){//cat16 + x = ( 1.86206786f * r) - (1.01125463f * g) + (0.14918677f * b); //Cat16 + y = ( 0.38752654f * r) + (0.62144744f * g) + (-0.00897398f * b); + z = ( -0.0158415f * r) - (0.03412294f * g) + (1.04996444f * b); + }else if(c16 == 21){//cam16 PQ + float lp = ( 1.86206786f * r) - (1.01125463f * g) + (0.14918677f * b); //Cat16 + float mp = ( 0.38752654f * r) + (0.62144744f * g) + (-0.00897398f * b); + float sp = ( -0.0158415f * r) - (0.03412294f * g) + (1.04996444f * b); + lp *= 0.01f; + float tmp = pow_F(lp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + + float prov = (Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2); + x = pl * pow_F(prov, Jzazbz_ni); + if(std::isnan(x)) {//to avoid crash + x = 0.f; + } + x *= 100.f; + mp *= 0.01f; + tmp = pow_F(mp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + prov = (Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2); + y = pl * pow_F(prov, Jzazbz_ni); + if(std::isnan(y)) { + y = 0.f; + } + y *= 100.f; + sp *= 0.01f; + tmp = pow_F(sp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.f; + } + prov = (Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2); + z = pl * pow_F(prov, Jzazbz_ni); + if(std::isnan(z)) { + z = 0.; + } + z *= 100.f; + + } + } #ifdef __SSE2__ -void Ciecam02::cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b ) -{ +void Ciecam02::cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16, vfloat plum ) +{ //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + vfloat plv = plum; //gamut correction M.H.Brill S.Susstrunk - x = ( F2V (0.99015849f) * r) - (F2V (0.00838772f) * g) + (F2V (0.018229217f) * b); //Changjun Li - y = ( F2V (0.239565979f) * r) + (F2V (0.758664642f) * g) + (F2V (0.001770137f) * b); - z = b; + if(c16 == 1) {//cat02 + x = ( F2V (0.99015849f) * r) - (F2V (0.00838772f) * g) + (F2V (0.018229217f) * b); //Changjun Li + y = ( F2V (0.239565979f) * r) + (F2V (0.758664642f) * g) + (F2V (0.001770137f) * b); + z = b; + } else if(c16 == 16) { + //cat16 + x = ( F2V (1.86206786f) * r) - (F2V (1.01125463f) * g) + (F2V (0.14918677f) * b); + y = ( F2V (0.38752654f) * r) + (F2V (0.621447744f) * g) - (F2V (0.00897398f) * b); + z = -(F2V(0.0158415f) * r) - (F2V(0.03412294f) * g) + (F2V(1.04996444f) * b); + }else if(c16 == 21){//cam16 PQ + vfloat lp = ( F2V (1.86206786f) * r) - (F2V (1.01125463f) * g) + (F2V (0.14918677f) * b); + vfloat mp = ( F2V (0.38752654f) * r) + (F2V (0.621447744f) * g) - (F2V (0.00897398f) * b); + vfloat sp = -(F2V(0.0158415f) * r) - (F2V(0.03412294f) * g) + (F2V(1.04996444f) * b); + float XX,YY,ZZ; + vfloat Jzazbz_c1v = F2V(Jzazbz_c1); + vfloat Jzazbz_c2v = F2V(Jzazbz_c2); + vfloat Jzazbz_c3v = F2V(Jzazbz_c3); + vfloat Jzazbz_piv = F2V(Jzazbz_pi); + vfloat Jzazbz_niv = F2V(Jzazbz_ni); + vfloat mulone = F2V(0.01f); + vfloat mulhund = F2V(100.f); + lp *= mulone; + float pro; + vfloat tmp = pow_F(lp, Jzazbz_piv); + STVF(XX, tmp); + if(std::isnan(XX)) {//to avoid crash + tmp = F2V(0.f);; + } + vfloat prov = (Jzazbz_c1v - tmp) / ((Jzazbz_c3v * tmp) - Jzazbz_c2v); + x = plv * pow_F(prov, Jzazbz_niv); + STVF(XX, x); + if(std::isnan(XX)) {//to avoid crash + x = F2V(0.f);; + } + x *= mulhund; + mp *= mulone; + tmp = pow_F(mp, Jzazbz_piv); + STVF(YY, tmp); + if(std::isnan(YY)) {//to avoid crash + tmp = F2V(0.f);; + } + prov = (Jzazbz_c1v - tmp) / ((Jzazbz_c3v * tmp) - Jzazbz_c2v); + y = plv * pow_F(prov, Jzazbz_niv); + STVF(YY, y); + if(std::isnan(YY)) {//to avoid crash + y = F2V(0.f);; + } + y *= mulhund; + sp *= mulone; + tmp = pow_F(sp, Jzazbz_piv); + STVF(ZZ, tmp); + if(std::isnan(ZZ)) {//to avoid crash + tmp = F2V(0.f);; + } + prov = (Jzazbz_c1v - tmp) / ((Jzazbz_c3v * tmp) - Jzazbz_c2v); + STVF(pro, prov); + z = plv * pow_F(prov, Jzazbz_niv); + STVF(ZZ, z); + if(std::isnan(ZZ)) {//to avoid crash + z = F2V(0.f);; + } + z *= mulhund; + + } + } #endif -void Ciecam02::hpe_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b ) +void Ciecam02::hpe_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16) { - x = (1.910197f * r) - (1.112124f * g) + (0.201908f * b); - y = (0.370950f * r) + (0.629054f * g) - (0.000008f * b); - z = b; + x = (1.910197f * r) - (1.112124f * g) + (0.201908f * b); + y = (0.370950f * r) + (0.629054f * g) - (0.000008f * b); + z = b; } #ifdef __SSE2__ -void Ciecam02::hpe_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b ) +void Ciecam02::hpe_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16) { - x = (F2V (1.910197f) * r) - (F2V (1.112124f) * g) + (F2V (0.201908f) * b); - y = (F2V (0.370950f) * r) + (F2V (0.629054f) * g) - (F2V (0.000008f) * b); - z = b; + x = (F2V (1.910197f) * r) - (F2V (1.112124f) * g) + (F2V (0.201908f) * b); + y = (F2V (0.370950f) * r) + (F2V (0.629054f) * g) - (F2V (0.000008f) * b); + z = b; } #endif -void Ciecam02::cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b) +void Ciecam02::cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b, int c16) { -// gamu = 1; -// -// if (gamu == 0) { +// original cat02 // 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); -// } + if(c16 == 1) {//cat02 + 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); + } else {//cat16 + rh = ( 1.f * r) + (0.f * g) + ( 0.f * b); + gh = ( 0.f * r) + (1.f * g) + (0.f * b); + bh = (0.0f * r) + (0.0f * g) + (1.0f * b); + } + } #ifdef __SSE2__ -void Ciecam02::cat02_to_hpefloat ( vfloat &rh, vfloat &gh, vfloat &bh, vfloat r, vfloat g, vfloat b) +void Ciecam02::cat02_to_hpefloat ( vfloat &rh, vfloat &gh, vfloat &bh, vfloat r, vfloat g, vfloat b, int c16) { + if(c16 == 1) { //Changjun Li - rh = ( F2V (0.550930835f) * r) + (F2V (0.519435987f) * g) - ( F2V (0.070356303f) * b); - gh = ( F2V (0.055954056f) * r) + (F2V (0.89973132f) * g) + (F2V (0.044315524f) * b); - bh = b; + rh = ( F2V (0.550930835f) * r) + (F2V (0.519435987f) * g) - ( F2V (0.070356303f) * b); + gh = ( F2V (0.055954056f) * r) + (F2V (0.89973132f) * g) + (F2V (0.044315524f) * b); + bh = b; + } else {//cat16 + rh = ( F2V (1.f) * r) + (F2V (0.f) * g) + ( F2V (0.f) * b); + gh = ( F2V (0.f) * r) + (F2V (1.f) * g) + (F2V (0.f) * b); + bh = b; + + } } #endif @@ -404,11 +627,11 @@ void Ciecam02::calculate_abfloat ( vfloat &aa, vfloat &bb, vfloat h, vfloat e, v #endif 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) + float &cz, float &aw, float &wh, float &pfl, float &fl, float c, int c16, float plum) { n = yb / yw; - if (pilotd == 2.0) { + if (pilotd == 2.f) { d = d_factorfloat ( f, la ); } else { d = pilotd; @@ -417,24 +640,17 @@ void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float x 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); + aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, c16, plum); wh = ( 4.0f / c ) * ( aw + 4.0f ) * pow_F ( fl, 0.25f ); pfl = pow_F ( fl, 0.25f ); -#ifdef _DEBUG - - if (settings->verbose) { - printf ("Source float d=%f aw=%f fl=%f wh=%f c=%f awc=%f\n", d, aw, fl, wh, c, (4.f / c) * (aw + 4.f)); - } - -#endif } 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) + float &cz, float &aw, float &fl, int c16, float plum) { n = yb / yw; - if (pilotd == 2.0) { + if (pilotd == 2.f) { d = d_factorfloat ( f, la ); } else { d = pilotd; @@ -444,19 +660,135 @@ void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float x 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); -#ifdef _DEBUG + aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, c16, plum); +} - if (settings->verbose) { - printf ("Viewing float d=%f aw=%f fl=%f n=%f\n", d, aw, fl, n); + +void Ciecam02::xyz2jzczhz ( double &Jz, double &az, double &bz, double x, double y, double z, double pl, double &Lp, double &Mp, double &Sp, bool zcam) +{ //from various web + double Xp, Yp, Zp, L, M, S, Iz; + double peakLum = 1. / pl; + //I change 10000 for peaklum function of la (absolute luminance)- default 10000 + Xp = Jzazbz_b * x - ((Jzazbz_b - 1.) * z); + Yp = Jzazbz_g * y - ((Jzazbz_g - 1.) * x); + Zp = z; + + L = 0.41478972 * Xp + 0.579999 * Yp + 0.0146480 * Zp; + M = -0.2015100 * Xp + 1.120649 * Yp + 0.0531008 * Zp; + S = -0.0166008 * Xp + 0.264800 * Yp + 0.6684799 * Zp; + + //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + // Lp = pow((Jzazbz_c1 + Jzazbz_c2 * pow(std::max((L * peakLum), 0.), Jzazbz_n)) / (1. + Jzazbz_c3 * pow((L * peakLum), Jzazbz_n)), Jzazbz_p); + // Mp = pow((Jzazbz_c1 + Jzazbz_c2 * pow(std::max((M * peakLum),0.), Jzazbz_n)) / (1. + Jzazbz_c3 * pow((M * peakLum), Jzazbz_n)), Jzazbz_p); + // Sp = pow((Jzazbz_c1 + Jzazbz_c2 * pow(std::max((S * peakLum), 0.), Jzazbz_n)) / (1. + Jzazbz_c3 * pow((S * peakLum), Jzazbz_n)), Jzazbz_p); + double temp = pow(L * peakLum, Jzazbz_n); + if(std::isnan(temp)) {//to avoid crash + temp = 0.; + } + Lp = pow((Jzazbz_c1 + Jzazbz_c2 * temp) / (1. + Jzazbz_c3 * temp), Jzazbz_p); + if(std::isnan(Lp)) {//to avoid crash + Lp = 0.; + } + + temp = pow(M * peakLum, Jzazbz_n); + if(std::isnan(temp)) {//to avoid crash + temp = 0.; + } + Mp = pow((Jzazbz_c1 + Jzazbz_c2 * temp) / (1. + Jzazbz_c3 * temp), Jzazbz_p); + if(std::isnan(Mp)) {//to avoid crash + Mp = 0.; } -#endif + temp = pow(S * peakLum, Jzazbz_n); + if(std::isnan(temp)) {//to avoid crash + temp = 0.; + } + Sp = pow((Jzazbz_c1 + Jzazbz_c2 * temp) / (1. + Jzazbz_c3 * temp), Jzazbz_p); + if(std::isnan(Sp)) {//to avoid crash + Sp = 0.; + } + + Iz = 0.5 * Lp + 0.5 * Mp; + az = 3.524000 * Lp - 4.066708 * Mp + 0.542708 * Sp; + bz = 0.199076 * Lp + 1.096799 * Mp - 1.295875 * Sp; + if(!zcam) { + Jz = (((1. + Jzazbz_d) * Iz) / (1. + Jzazbz_d * Iz)) - Jzazbz_d0; + // Jz = std::max((((1. + Jzazbz_d) * Iz) / (1. + Jzazbz_d * Iz)) - Jzazbz_d0, 0.); + } else { + //or if we use ZCAM Jz = Mp - Jzazbz_d0 + Jz = Mp - Jzazbz_d0; + } +} + + +void Ciecam02::jzczhzxyz (double &x, double &y, double &z, double jz, double az, double bz, double pl, double &L, double &M, double &S, bool zcam) +{ //from various web + //I use isnan() because I have tested others solutions with std::max(xxx,0) and in some cases crash + + double Xp, Yp, Zp, Lp, Mp, Sp, Iz, tmp; + + if(!zcam) { + // Iz = std::max((jz + Jzazbz_d0) / (1. + Jzazbz_d - Jzazbz_d * (jz + Jzazbz_d0)), 0.); + Iz = (jz + Jzazbz_d0) / (1. + Jzazbz_d - Jzazbz_d * (jz + Jzazbz_d0)); + } else { + //or if we use ZCAM Iz = Jz + Jzazbz_d0 + Iz = jz + Jzazbz_d0; + } + + Lp = Iz + 0.138605043271539 * az + 0.0580473161561189 * bz; + Mp = Iz - 0.138605043271539 * az - 0.0580473161561189 * bz; + Sp = Iz - 0.0960192420263189 * az - 0.811891896056039 * bz; + //I change optionally 10000 for pl function of la(absolute luminance) default 10000 + + tmp = pow(Lp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.; + } + L = pl * pow((Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2), Jzazbz_ni); + if(std::isnan(L)) {//to avoid crash + L = 0.; + } + + tmp = pow(Mp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.; + } + M = pl * pow((Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2), Jzazbz_ni); + if(std::isnan(M)) {//to avoid crash + M = 0.; + } + + tmp = pow(Sp, Jzazbz_pi); + if(std::isnan(tmp)) {//to avoid crash + tmp = 0.; + } + S = pl * pow((Jzazbz_c1 - tmp) / ((Jzazbz_c3 * tmp) - Jzazbz_c2), Jzazbz_ni); + if(std::isnan(S)) {//to avoid crash + S = 0.; + } + + Xp = 1.9242264357876067 * L - 1.0047923125953657 * M + 0.0376514040306180 * S; + Yp = 0.3503167620949991 * L + 0.7264811939316552 * M - 0.0653844229480850 * S; + Zp = -0.0909828109828475 * L - 0.3127282905230739 * M + 1.5227665613052603 * S; + + x = (Xp + (Jzazbz_b - 1.) * Zp) / Jzazbz_b; + + if(std::isnan(x)) {//to avoid crash + x = 0.; + } + y = (Yp + (Jzazbz_g - 1.) * x) / Jzazbz_g; + if(std::isnan(y)) { + y = 0.; + } + z = Zp; + if(std::isnan(z)) { + z = 0.; + } } 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, 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, int c16, float plum) { float r, g, b; @@ -467,20 +799,23 @@ 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); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); 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); + cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc, c16); -// 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(c16 == 1) {//cat02 + rp = MAXR (rp, 0.0f); + gp = MAXR (gp, 0.0f); + bp = MAXR (bp, 0.0f); + } else {//cat16 + rp = MAXR (rc, 0.0f); + gp = MAXR (gc, 0.0f); + bp = MAXR (bc, 0.0f); + } rpa = nonlinear_adaptationfloat ( rp, fl ); gpa = nonlinear_adaptationfloat ( gp, fl ); @@ -492,14 +827,12 @@ void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q myh = xatan2f ( cb, ca ); if ( myh < 0.0f ) { - myh += (2.f * rtengine::RT_PI); + myh += (2.f * rtengine::RT_PI_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 -// } J = pow_F ( a / aw, c * cz * 0.5f); @@ -518,7 +851,7 @@ void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q #ifdef __SSE2__ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloat &Q, vfloat &M, vfloat &s, vfloat aw, vfloat fl, vfloat wh, vfloat x, vfloat y, vfloat z, vfloat xw, vfloat yw, vfloat zw, - vfloat c, vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d) + vfloat c, vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d, int c16, vfloat plum) { vfloat r, g, b; @@ -529,18 +862,26 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa vfloat a, ca, cb; vfloat e, t; - xyz_to_cat02float ( r, g, b, x, y, z); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); vfloat onev = F2V (1.f); rc = r * (((yw * d) / rw) + (onev - d)); gc = g * (((yw * d) / gw) + (onev - d)); bc = b * (((yw * d) / bw) + (onev - d)); - cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc); + cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc, c16); + //gamut correction M.H.Brill S.Susstrunk - rp = vmaxf (rp, ZEROV); - gp = vmaxf (gp, ZEROV); - bp = vmaxf (bp, ZEROV); + if(c16 == 1) {//cat02 + rp = vmaxf (rp, ZEROV); + gp = vmaxf (gp, ZEROV); + bp = vmaxf (bp, ZEROV); + } else {//cat16 + rp = vmaxf (rc, ZEROV); + gp = vmaxf (gc, ZEROV); + bp = vmaxf (bc, ZEROV); + } + rpa = nonlinear_adaptationfloat ( rp, fl ); gpa = nonlinear_adaptationfloat ( gp, fl ); bpa = nonlinear_adaptationfloat ( bp, fl ); @@ -575,7 +916,7 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, float fl, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, float pow1, float nbb, float ncb, float cz, float d) + float c, float nc, float pow1, float nbb, float ncb, float cz, float d, int c16, float plum) { float r, g, b; @@ -586,20 +927,24 @@ 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); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); + xyz_to_cat02float ( r, g, b, x, y, z, c16, plum); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); 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); + cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc, c16); + + if(c16 == 1) {//cat02 + rp = MAXR (rp, 0.0f); + gp = MAXR (gp, 0.0f); + bp = MAXR (bp, 0.0f); + } else {//cat16 + rp = MAXR (rc, 0.0f); + gp = MAXR (gc, 0.0f); + bp = MAXR (bc, 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); @@ -620,14 +965,12 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f myh = xatan2f ( cb, ca ); if ( myh < 0.0f ) { - myh += (2.f * rtengine::RT_PI); + myh += (2.f * rtengine::RT_PI_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 -// } J = pow_F ( a / aw, c * cz * 0.5f); @@ -642,7 +985,7 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f 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, 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, int c16, float plum) { float r, g, b; float rc, gc, bc; @@ -651,8 +994,7 @@ 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); + xyz_to_cat02float(rw, gw, bw, xw, yw, zw, c16, plum); e = ((961.53846f) * nc * ncb) * (xcosf(h * rtengine::RT_PI_F_180 + 2.0f) + 3.8f); #ifdef __SSE2__ @@ -681,20 +1023,27 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, fl gp = inverse_nonlinear_adaptationfloat(gpa, fl); bp = inverse_nonlinear_adaptationfloat(bpa, fl); #endif - hpe_to_xyzfloat(x, y, z, rp, gp, bp); - xyz_to_cat02float(rc, gc, bc, x, y, z); - r = rc / (((yw * d) / rw) + (1.0f - d)); - g = gc / (((yw * d) / gw) + (1.0f - d)); - b = bc / (((yw * d) / bw) + (1.0f - d)); + if(c16 == 1) {//cat02 + hpe_to_xyzfloat(x, y, z, rp, gp, bp, c16); + xyz_to_cat02float(rc, gc, bc, x, y, z, c16, plum); - cat02_to_xyzfloat(x, y, z, r, g, b); + r = rc / (((yw * d) / rw) + (1.0f - d)); + g = gc / (((yw * d) / gw) + (1.0f - d)); + b = bc / (((yw * d) / bw) + (1.0f - d)); + } else {//cat16 + r = rp / (((yw * d) / rw) + (1.0f - d)); + g = gp / (((yw * d) / gw) + (1.0f - d)); + b = bp / (((yw * d) / bw) + (1.0f - d)); + } + + cat02_to_xyzfloat(x, y, z, r, g, b, c16, plum); } #ifdef __SSE2__ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h, vfloat xw, vfloat yw, vfloat zw, - vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz) + vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz, int c16, vfloat plum) { vfloat r, g, b; vfloat rc, gc, bc; @@ -703,7 +1052,7 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J vfloat rw, gw, bw; vfloat a, ca, cb; vfloat e, t; - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, c16, plum); 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 / (vsqrtf ( J ) * pow1), F2V (1.1111111f) ); @@ -715,14 +1064,20 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J gp = inverse_nonlinear_adaptationfloat ( gpa, fl ); bp = inverse_nonlinear_adaptationfloat ( bpa, fl ); - hpe_to_xyzfloat ( x, y, z, rp, gp, bp ); - xyz_to_cat02float ( rc, gc, bc, x, y, z ); + if(c16 == 1) {//cat02 + hpe_to_xyzfloat ( x, y, z, rp, gp, bp, c16); + xyz_to_cat02float ( rc, gc, bc, x, y, z, c16, plum ); - r = rc / (((yw * d) / rw) + (F2V (1.0f) - d)); - g = gc / (((yw * d) / gw) + (F2V (1.0f) - d)); - b = bc / (((yw * d) / bw) + (F2V (1.0f) - d)); + r = rc / (((yw * d) / rw) + (F2V (1.0f) - d)); + g = gc / (((yw * d) / gw) + (F2V (1.0f) - d)); + b = bc / (((yw * d) / bw) + (F2V (1.0f) - d)); + } else {//cat16 + r = rp / (((yw * d) / rw) + (F2V (1.0f) - d)); + g = gp / (((yw * d) / gw) + (F2V (1.0f) - d)); + b = bp / (((yw * d) / bw) + (F2V (1.0f) - d)); + } - cat02_to_xyzfloat ( x, y, z, r, g, b ); + cat02_to_xyzfloat ( x, y, z, r, g, b, c16, plum ); } #endif @@ -780,6 +1135,4 @@ vfloat Ciecam02::inverse_nonlinear_adaptationfloat ( vfloat c, vfloat fl ) return (F2V (100.0f) / fl) * pow_F ( (F2V (27.13f) * c) / (F2V (400.0f) - c), F2V (2.38095238f) ); } #endif -//end CIECAM Billy Bigg - } diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 75ccfaa8c..5312635f6 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -33,17 +33,17 @@ namespace rtengine { class Ciecam02 -{ +{//also used with Ciecam16 private: static float d_factorfloat ( float f, float la ); static float calculate_fl_from_la_ciecam02float ( float la ); - 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); + static float achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int c16, float plum); + static void xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int c16, float plum); + static void cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b, int c16); #ifdef __SSE2__ - static void xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z ); - static void cat02_to_hpefloat ( vfloat &rh, vfloat &gh, vfloat &bh, vfloat r, vfloat g, vfloat b ); + static void xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z, int c16, vfloat plum); + static void cat02_to_hpefloat ( vfloat &rh, vfloat &gh, vfloat &bh, vfloat r, vfloat g, vfloat b, int c16); static vfloat nonlinear_adaptationfloat ( vfloat c, vfloat fl ); #endif @@ -52,20 +52,26 @@ private: 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); + static void hpe_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16); + static void cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int c16, float plum); #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 ); static void Aab_to_rgbfloat ( vfloat &r, vfloat &g, vfloat &b, vfloat A, vfloat aa, vfloat bb, vfloat nbb ); - static void hpe_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b ); - static void cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b ); + static void hpe_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16); + static void cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b, int c16, vfloat plum); #endif public: Ciecam02 () {} static void curvecolorfloat (float satind, float satval, float &sres, float parsat); - static void curveJfloat (float br, float contr, const LUTu & histogram, LUTf & outCurve ) ; + static void curveJfloat (float br, float contr, float thr, const LUTu & histogram, LUTf & outCurve ) ; + + static void xyz2jzczhz (double &Jz, double &az, double &bz, double x, double y, double z, double pl, double &Lp, double &Mp, double &Sp, bool zcam); + + static void jzczhzxyz (double &x, double &y, double &z, double Jz, double az, double bz, double pl, double &L, double &M, double &S, bool zcam); + + /** * Inverse transform from CIECAM02 JCh to XYZ. @@ -73,40 +79,40 @@ public: 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, 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, int c16, float plum); #ifdef __SSE2__ static void jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h, vfloat xw, vfloat yw, vfloat zw, - vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz ); + vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz, int c16, vfloat plum ); #endif /** * Forward transform from XYZ to CIECAM02 JCh. */ 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); + float &cz, float &aw, float &wh, float &pfl, float &fl, float c, int c16, float plum); 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); + float &cz, float &aw, float &fl, int c16, float plum); static void xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, float fl, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, float n, float nbb, float ncb, float cz, float d ); + float c, float nc, float n, float nbb, float ncb, float cz, float d, int c16, float plum); static void 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, 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, int c16, float plum); #ifdef __SSE2__ static void xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloat &Q, vfloat &M, vfloat &s, vfloat aw, vfloat fl, vfloat wh, vfloat x, vfloat y, vfloat z, vfloat xw, vfloat yw, vfloat zw, - vfloat c, vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d ); + vfloat c, vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat pfl, vfloat cz, vfloat d, int c16, vfloat plum); #endif diff --git a/rtengine/cieimage.h b/rtengine/cieimage.h index fea675cd4..329c0ba74 100644 --- a/rtengine/cieimage.h +++ b/rtengine/cieimage.h @@ -23,7 +23,7 @@ namespace rtengine { -class CieImage : +class CieImage final : public NonCopyable { private: diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index e3bd9c988..4c70ad951 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -57,7 +57,7 @@ bool loadFile( rtengine::procparams::ColorManagementParams icm; icm.workingProfile = working_color_space; - img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), rtengine::procparams::RAWParams()); + img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), rtengine::procparams::RAWParams(), 0); if (!working_color_space.empty()) { img_src.convertColorSpace(img_float.get(), icm, curr_wb); diff --git a/rtengine/color.cc b/rtengine/color.cc index 8d20fb9ba..085fd41ce 100644 --- a/rtengine/color.cc +++ b/rtengine/color.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 "rtengine.h" #include "color.h" @@ -23,10 +24,7 @@ #include "sleef.h" #include "opthelper.h" #include "iccstore.h" - -#ifdef _DEBUG -#include "mytime.h" -#endif +#include using namespace std; @@ -44,6 +42,9 @@ LUTf Color::igammatab_srgb; LUTf Color::igammatab_srgb1; LUTf Color::gammatab_srgb; LUTf Color::gammatab_srgb1; +LUTf Color::gammatab_srgb327; +LUTf Color::gammatab_bt709; +LUTf Color::igammatab_bt709; LUTf Color::denoiseGammaTab; LUTf Color::denoiseIGammaTab; @@ -102,20 +103,6 @@ LUTf Color::_10GY30, Color::_10GY40, Color::_10GY50, Color::_10GY60, Color::_10G LUTf Color::_75GY30, Color::_75GY40, Color::_75GY50, Color::_75GY60, Color::_75GY70, Color::_75GY80; LUTf Color::_5GY30, Color::_5GY40, Color::_5GY50, Color::_5GY60, Color::_5GY70, Color::_5GY80; -#ifdef _DEBUG -MunsellDebugInfo::MunsellDebugInfo() -{ - reinitValues(); -} -void MunsellDebugInfo::reinitValues() -{ - maxdhue[0] = maxdhue[1] = maxdhue[2] = maxdhue[3] = 0.0f; - maxdhuelum[0] = maxdhuelum[1] = maxdhuelum[2] = maxdhuelum[3] = 0.0f; - depass = depassLum = 0; -} -#endif - - void Color::init () { @@ -129,9 +116,12 @@ void Color::init () gammatabThumb(maxindex, 0); igammatab_srgb(maxindex, 0); + igammatab_bt709(maxindex, 0); igammatab_srgb1(maxindex, 0); gammatab_srgb(maxindex, 0); + gammatab_bt709(maxindex, 0); gammatab_srgb1(maxindex, 0); + gammatab_srgb327(32768, 0); denoiseGammaTab(maxindex, 0); denoiseIGammaTab(maxindex, 0); @@ -196,6 +186,18 @@ void Color::init () } #ifdef _OPENMP #pragma omp section +#endif + { + for (int i = 0; i < 32768; i++) + { + gammatab_srgb327[i] = gamma2(i / 32767.0); + } + + gammatab_srgb327 *= 32767.f; + // gamma2curve.share(gammatab_srgb, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); // shares the buffer with gammatab_srgb but has different clip flags + } +#ifdef _OPENMP + #pragma omp section #endif { for (int i = 0; i < maxindex; i++) @@ -205,6 +207,7 @@ void Color::init () igammatab_srgb *= 65535.f; } + #ifdef _OPENMP #pragma omp section #endif @@ -281,6 +284,22 @@ void Color::init () break; } +#ifdef _OPENMP + #pragma omp section +#endif + + for (int i = 0; i < maxindex; i++) { + gammatab_bt709[i] = 65535.0 * gamma709(i / 65535.0); + } + +#ifdef _OPENMP + #pragma omp section +#endif + + for (int i = 0; i < maxindex; i++) { + igammatab_bt709[i] = 65535.0 * igamma709(i / 65535.0); + } + #ifdef _OPENMP #pragma omp section #endif @@ -926,6 +945,7 @@ void Color::xyz2Prophoto (float x, float y, float z, float &r, float &g, float & 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)) ; } + void Color::Prophotoxyz (float r, float g, float b, float &x, float &y, float &z) { x = ((xyz_prophoto[0][0] * r + xyz_prophoto[0][1] * g + xyz_prophoto[0][2] * b)) ; @@ -940,6 +960,17 @@ void Color::rgbxyz (float r, float g, float b, float &x, float &y, float &z, con z = ((xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b)) ; } +void Color::rgbxyY(float r, float g, float b, float &x, float &y, float &Y, const float xyz_rgb[3][3]) +{ + const float xx = xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b; + const float yy = xyz_rgb[1][0] * r + xyz_rgb[1][1] * g + xyz_rgb[1][2] * b; + const float zz = xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b; + const float som = xx + yy + zz; + x = xx / som; + y = yy / som; + Y = yy / 65535.f; +} + void Color::rgbxyz (float r, float g, float b, float &x, float &y, float &z, const float xyz_rgb[3][3]) { x = ((xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b)) ; @@ -986,23 +1017,6 @@ void Color::xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][ r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; } -// same for float -void Color::xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]) -{ - r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; - g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; - b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; -} - -#ifdef __SSE2__ -void Color::xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]) -{ - r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; - g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; - b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; -} -#endif // __SSE2__ - #ifdef __SSE2__ void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) { @@ -1160,48 +1174,26 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u float koymcp = 0.f; if(setting == "ROYGCBPM-Abs" || setting == "ROYGCBPM-Rel") { - float obM = 0.f; - float ogM = 0.f; - float orM = 0.f; - - float ybM = 0.f; - float yrM = 0.f; - float ygM = 0.f; - - float mgM = 0.f; - float mrM = 0.f; - float mbM = 0.f; - - float pgM = 0.f; - float prM = 0.f; - float pbM = 0.f; - - float crM = 0.f; - float cgM = 0.f; - float cbM = 0.f; - //printf("mixred=%f\n",mixerRed); - float fcompl = 1.f; - if(complement && algo == "SP") { + if (complement && algo == "SP") { fcompl = 3.f; //special - } else if(complement && algo == "LI") { + } else if (complement && algo == "LI") { fcompl = 1.5f; //linear } // ponderate filters: report to R=G=B=33 // I ponder RGB channel, not only orange or yellow or cyan, etc...it's my choice ! - if(mixerOrange != 33) { - if (algo == "SP") { //special - if (mixerOrange >= 33) { - orM = fcompl * (mixerOrange * 0.67f - 22.11f) / 100.f; - } else { - orM = fcompl * (-0.3f * mixerOrange + 9.9f) / 100.f; - } + if (mixerOrange != 33.f) { + float ogM = 0.f; + float orM = 0.f; - if (mixerOrange >= 33) { + if (algo == "SP") { //special + if (mixerOrange > 33.f) { + orM = fcompl * (mixerOrange * 0.67f - 22.11f) / 100.f; ogM = fcompl * (-0.164f * mixerOrange + 5.412f) / 100.f; } else { + orM = fcompl * (-0.3f * mixerOrange + 9.9f) / 100.f; ogM = fcompl * (0.4f * mixerOrange - 13.2f) / 100.f; } } else if (algo == "LI") { //linear @@ -1209,30 +1201,24 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u ogM = fcompl * (0.5f * mixerOrange - 16.5f) / 100.f; } - if(complement) { - obM = (-0.492f * mixerOrange + 16.236f) / 100.f; - } + const float obM = complement ? (-0.492f * mixerOrange + 16.236f) / 100.f : 0.f; - mixerRed += orM; + mixerRed += orM; mixerGreen += ogM; - mixerBlue += obM; + mixerBlue += obM; koymcp += (orM + ogM + obM); - // printf("mixred+ORange=%f\n",mixerRed); - } - if(mixerYellow != 33) { + if (mixerYellow != 33.f) { + float yrM = 0.f; if (algo == "SP") { yrM = fcompl * (-0.134f * mixerYellow + 4.422f) / 100.f; //22.4 } else if (algo == "LI") { yrM = fcompl * (0.5f * mixerYellow - 16.5f) / 100.f; //22.4 } - ygM = fcompl * (0.5f * mixerYellow - 16.5f ) / 100.f; - - if(complement) { - ybM = (-0.492f * mixerYellow + 16.236f) / 100.f; - } + const float ygM = fcompl * (0.5f * mixerYellow - 16.5f ) / 100.f; + const float ybM = complement ? (-0.492f * mixerYellow + 16.236f) / 100.f : 0.f; mixerRed += yrM; mixerGreen += ygM; @@ -1240,17 +1226,15 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u koymcp += (yrM + ygM + ybM); } - if(mixerMagenta != 33) { + if (mixerMagenta != 33.f) { + float mrM = 0.f; + float mbM = 0.f; if (algo == "SP") { - if(mixerMagenta >= 33) { + if (mixerMagenta > 33.f) { mrM = fcompl * ( 0.67f * mixerMagenta - 22.11f) / 100.f; - } else { - mrM = fcompl * (-0.3f * mixerMagenta + 9.9f) / 100.f; - } - - if(mixerMagenta >= 33) { mbM = fcompl * (-0.164f * mixerMagenta + 5.412f) / 100.f; } else { + mrM = fcompl * (-0.3f * mixerMagenta + 9.9f) / 100.f; mbM = fcompl * ( 0.4f * mixerMagenta - 13.2f) / 100.f; } } else if (algo == "LI") { @@ -1258,9 +1242,7 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u mbM = fcompl * (0.5f * mixerMagenta - 16.5f) / 100.f; } - if(complement) { - mgM = (-0.492f * mixerMagenta + 16.236f) / 100.f; - } + const float mgM = complement ? (-0.492f * mixerMagenta + 16.236f) / 100.f : 0.f; mixerRed += mrM; mixerGreen += mgM; @@ -1268,18 +1250,16 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u koymcp += (mrM + mgM + mbM); } - if(mixerPurple != 33) { + if (mixerPurple != 33.f) { + float prM = 0.f; if (algo == "SP") { prM = fcompl * (-0.134f * mixerPurple + 4.422f) / 100.f; } else if (algo == "LI") { prM = fcompl * (0.5f * mixerPurple - 16.5f) / 100.f; } - pbM = fcompl * (0.5f * mixerPurple - 16.5f) / 100.f; - - if(complement) { - pgM = (-0.492f * mixerPurple + 16.236f) / 100.f; - } + const float pbM = fcompl * (0.5f * mixerPurple - 16.5f) / 100.f; + const float pgM = complement ? (-0.492f * mixerPurple + 16.236f) / 100.f : 0.f; mixerRed += prM; mixerGreen += pgM; @@ -1287,18 +1267,16 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u koymcp += (prM + pgM + pbM); } - if(mixerCyan != 33) { + if (mixerCyan != 33.f) { + float cgM = 0.f; if (algo == "SP") { cgM = fcompl * (-0.134f * mixerCyan + 4.422f) / 100.f; } else if (algo == "LI") { cgM = fcompl * (0.5f * mixerCyan - 16.5f) / 100.f; } - cbM = fcompl * (0.5f * mixerCyan - 16.5f) / 100.f; - - if(complement) { - crM = (-0.492f * mixerCyan + 16.236f) / 100.f; - } + const float cbM = fcompl * (0.5f * mixerCyan - 16.5f) / 100.f; + const float crM = complement ? (-0.492f * mixerCyan + 16.236f) / 100.f : 0.f; mixerRed += crM; mixerGreen += cgM; @@ -1318,7 +1296,7 @@ void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::u filblue = 1.f; filcor = 1.f; - if (filter == "None") { + if (filter == "None") { filred = 1.f; filgreen = 1.f; filblue = 1.f; @@ -1409,15 +1387,7 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa Color::Lab2Lch(a_1, b_1, c1, h1); Lr = L1 / 327.68f; //for gamutlch //gamut control on r1 g1 b1 -#ifndef NDEBUG - bool neg = false; - bool more_rgb = false; - - //gamut control : Lab values are in gamut - Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb); -#else Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f); -#endif L1 = Lr * 327.68f; @@ -1428,14 +1398,7 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa Lr = L2 / 327.68f; //for gamutlch //gamut control on r2 g2 b2 -#ifndef NDEBUG - neg = false; - more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly(h2, Lr, c2, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb); -#else Color::gamutLchonly(h2, Lr, c2, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f); -#endif L2 = Lr * 327.68f; // interpolating Lch values @@ -1465,15 +1428,8 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa // here I have put gamut control with gamutlchonly on final process Lr = L1 / 327.68f; //for gamutlch -#ifndef NDEBUG - neg = false; - more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb); -#else //gamut control : Lab values are in gamut Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f); -#endif //convert CH ==> ab L1 = Lr * 327.68f; @@ -1489,101 +1445,79 @@ void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int alg const float xl, const float yl, const float zl, const float x2, const float y2, const float z2, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo) { - float X1, Y1, Z1, X2, Y2, Z2, X, Y, Z, XL, YL, ZL; - float L1 = 0.f, L2, LL, a_1 = 0.f, b_1 = 0.f, a_2 = 0.f, b_2 = 0.f, a_L, b_L; + float L1 = 0.f, a_1 = 0.f, b_1 = 0.f, a_2 = 0.f, b_2 = 0.f, a_L = 0.f, b_L = 0.f; - // converting color 1 to Lab (image) - Color::rgbxyz(r1, g1, b1, X1, Y1, Z1, xyz_rgb); - - if(algm == 1) {//use H interpolate + if (algm == 1) {//use H interpolate + // converting color 1 to Lab (image) + float X1, Y1, Z1; + Color::rgbxyz(r1, g1, b1, X1, Y1, Z1, xyz_rgb); Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1); - //Color::Lab2Lch(a_1, b_1, c_1, h_1) ; } // converting color l lab(low) first color - if(twoc == 0) { // 2 colours - //Color::rgbxyz(rl, gl, bl, XL, YL, ZL, xyz_rgb); - XL = xl; - YL = yl; - ZL = zl; - - if(algm <= 1) {//use H interpolate - Color::XYZ2Lab(XL, YL, ZL, LL, a_L, b_L); + if (twoc == 0) { // 2 colours + if (algm == 1) {//use H interpolate + float unused; + Color::XYZ2Lab(xl, yl, zl, unused, a_L, b_L); } } // converting color 2 to lab (universal or high) - X2 = x2; - Y2 = y2; - Z2 = z2; - - if(algm == 1 ) { - Color::XYZ2Lab(X2, Y2, Z2, L2, a_2, b_2); - //Color::Lab2Lch(a_2, b_2, c_2, h_2) ; + if (algm == 1) { + float unused; + Color::XYZ2Lab(x2, y2, z2, unused, a_2, b_2); } - float cal, calH, calm; - cal = calH = calm = 1.f - chromat; - float med = 1.f; - float medH = 0.f; - - float calan; - calan = chromat; - - float calby; - calby = luma; - - if(twoc == 0) { // 2 colours - calan = chromat; + float cal, calH; + cal = calH = 1.f - chromat; + if (twoc == 0) { // 2 colours //calculate new balance chroma - if (realL > iplow && realL <= med) { - cal = realL * calan / (iplow - med) - med * calan / (iplow - med); + constexpr float med = 1.f; + if (realL > iplow && realL <= med) { + cal = realL * chromat / (iplow - med) - chromat / (iplow - med); } else if (realL <= iplow) { - cal = realL * calan / iplow; + cal = realL * chromat / iplow; } - if (realL > medH && realL <= iphigh) { - calH = realL * calan / (iphigh - medH) - medH * calan / (iphigh - medH); + if (realL > 0.f && realL <= iphigh) { + calH = realL * chromat / iphigh; } else if (realL > iphigh) { - calH = realL * calan; //*(iphigh-1.f) - calan*(iphigh-1.f);//it is better without transition in highlight + calH = realL * chromat; //*(iphigh-1.f) - chromat*(iphigh-1.f);//it is better without transition in highlight } } - float aaH, bbH; - - if(algm <= 1) { - if(twoc == 0 && metchrom == 3) { // 2 colours only with special "ab" - if(algm == 1) { - aaH = a_1 + (a_2 - a_1) * calH; - bbH = b_1 + (b_2 - b_1) * calH; //pass to line after + if (algm <= 1) { + if (twoc == 0 && metchrom == 3) { // 2 colours only with special "ab" + if (algm == 1) { + const float aaH = a_1 + (a_2 - a_1) * calH; + const float bbH = b_1 + (b_2 - b_1) * calH; //pass to line after a_1 = aaH + (a_L - aaH) * cal * balance; b_1 = bbH + (b_L - bbH) * cal * balance; } - } else if(twoc == 1) { - if(metchrom == 0) { + } else if (twoc == 1) { + if (metchrom == 0) { a_1 = a_1 + (a_2 - a_1) * balance; b_1 = b_1 + (b_2 - b_1) * balance; - } else if(metchrom == 1) { - a_1 = a_1 + (a_2 - a_1) * calan * balance; - b_1 = b_1 + (b_2 - b_1) * calan * balance; - } else if(metchrom == 2) { - a_1 = a_1 + (a_2 - a_1) * calan * balance; - b_1 = b_1 + (b_2 - b_1) * calby * balance; + } else if (metchrom == 1) { + a_1 = a_1 + (a_2 - a_1) * chromat * balance; + b_1 = b_1 + (b_2 - b_1) * chromat * balance; + } else if (metchrom == 2) { + a_1 = a_1 + (a_2 - a_1) * chromat * balance; + b_1 = b_1 + (b_2 - b_1) * luma * balance; } } } + float X, Y, Z; Color::Lab2XYZ(L1, a_1, b_1, X, Y, Z); - Color::xyz2rgb(X, Y, Z, ro, go, bo, rgb_xyz);// ro go bo in gamut } -void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma) +void Color::calcGamma (double pwr, double ts, GammaValues &gamma) { //from Dcraw (D.Coffin) - int i; - double g[6], bnd[2] = {0., 0.}; + double g[6], bnd[2] = {}; g[0] = pwr; g[1] = ts; @@ -1591,7 +1525,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 < 99; i++) { + for (int i = 0; i < 99; i++) { g[2] = (bnd[0] + bnd[1]) / 2.; if (g[0]) { @@ -1614,16 +1548,16 @@ void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma) g[5] = 1. / (g[1] * SQR(g[3]) / 2. + 1. - g[2] - g[3] - g[2] * g[3] * (log(g[3]) - 1.)) - 1.; } - if (!mode--) { - gamma[0] = g[0]; - gamma[1] = g[1]; - gamma[2] = g[2]; - gamma[3] = g[3]; - gamma[4] = g[4]; - gamma[5] = g[5]; - gamma[6] = 0.; - return; - } + gamma[0] = g[0]; + gamma[1] = g[1]; + gamma[2] = g[2]; + gamma[3] = g[3]; + gamma[4] = g[4]; + gamma[5] = g[5]; + gamma[6] = 0.; + // if (rtengine::settings->verbose) { + // printf("g0=%f g1=%f g2=%f g3=%f g4=%f g5=%f\n", g[0], g[1], g[2], g[3], g[4], g[5]); + // } } void Color::gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, float divisor, float factor) { @@ -1700,17 +1634,11 @@ void Color::gammanf2lut (LUTf &gammacurve, float gamma, float divisor, float fac #endif } -void Color::Lab2XYZ(float L, float a, float b, float &x, float &y, float &z) +float Color::L2Y(float L) { - float LL = L / 327.68f; - float aa = a / 327.68f; - float bb = b / 327.68f; - 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; - z = 65535.0f * f2xyz(fz) * D50z; - y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa; + const float LL = L / 327.68f; + const float fy = (c1By116 * LL) + c16By116; // (L+16)/116 + return (LL > epskapf) ? 65535.f * fy * fy * fy : 65535.f * LL / kappaf; } void Color::L2XYZ(float L, float &x, float &y, float &z) // for black & white @@ -1723,27 +1651,6 @@ void Color::L2XYZ(float L, float &x, float &y, float &z) // for black & white y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa; } - -#ifdef __SSE2__ -void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z) -{ - vfloat c327d68 = F2V(327.68f); - L /= c327d68; - a /= c327d68; - b /= c327d68; - 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); - x = c65535 * f2xyz(fx) * F2V(D50x); - z = c65535 * f2xyz(fz) * F2V(D50z); - vfloat res1 = fy * fy * fy; - vfloat res2 = L / F2V(kappa); - y = vself(vmaskf_gt(L, F2V(epskap)), res1, res2); - y *= c65535; -} -#endif // __SSE2__ - inline float Color::computeXYZ2Lab(float f) { if (f < 0.f) { @@ -1755,19 +1662,6 @@ inline float Color::computeXYZ2Lab(float 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) { @@ -1832,7 +1726,7 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, } } -void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3], int width) +void Color::RGB2L(const float *R, const float *G, const float *B, float *L, const float wp[3][3], int width) { #ifdef __SSE2__ @@ -2017,6 +1911,152 @@ void Color::Lch2Luv(float c, float h, float &u, float &v) v = c * sincosval.y; } +void Color::primaries_to_xyz(double p[6], double Wx, double Wz, double *pxyz) +{ + //calculate Xr, Xg, Xb, Yr, Yb, Tg, Zr,Zg Zb + double Wy = 1.0; + 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; + + //invert matrix + if (!rtengine::invertMatrix(input_prim, inv_input_prim)) { + std::cout << "Matrix is not invertible, skipping" << std::endl; + } + + //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]; + + //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; + + //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; + + //cone dest + 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]; + } + } + } + + 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]; + } + } + } + + //push result in pxyz + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + pxyz[i * 3 + j] = mat_xyz_brad[i][j]; + } + } +} /* * Gamut mapping algorithm @@ -2038,13 +2078,19 @@ void Color::Lch2Luv(float c, float h, float &u, float &v) * columns of the matrix p=xyz_rgb are RGB tristimulus primaries in XYZ * c is the color fixed on the boundary; and m=0 for c=0, m=1 for c=255 */ -void Color::gamutmap(float &X, float &Y, float &Z, const double p[3][3]) + +void Color::gamutmap(float &X, float Y, float &Z, const double p[3][3]) { - float u = 4 * X / (X + 15 * Y + 3 * Z) - u0; - float v = 9 * Y / (X + 15 * Y + 3 * Z) - v0; - + float epsil = 0.0001f; + float intermXYZ = X + 15 * Y + 3 * Z; + if(intermXYZ <= 0.f) { + intermXYZ = epsil; + } + + float u = 4 * X / (intermXYZ) - u0; + float v = 9 * Y / (intermXYZ) - v0; float lam[3][2]; - float lam_min = 1.0; + float lam_min = 1.0f; for (int c = 0; c < 3; c++) for (int m = 0; m < 2; m++) { @@ -2062,109 +2108,53 @@ void Color::gamutmap(float &X, float &Y, float &Z, const double p[3][3]) p[0][c] * (5 * Y * p[1][c1] + m * 65535 * p[1][c1] * p[2][c2] + Y * p[2][c1] - m * 65535 * p[1][c2] * p[2][c1]) + m * 65535 * p[0][c2] * (p[1][c1] * p[2][c] - p[1][c] * p[2][c1]))); - if (lam[c][m] < lam_min && lam[c][m] > 0) { + if (lam[c][m] < lam_min && lam[c][m] > 0.f) { lam_min = lam[c][m]; } } - u = u * lam_min + u0; - v = v * lam_min + v0; + u = u * (double) lam_min + u0; + v = v * (double) lam_min + v0; X = (9 * u * Y) / (4 * v); - Z = (12 - 3 * u - 20 * v) * Y / (4 * v); + float intermuv = 12 - 3 * u - 20 * v; + if(intermuv < 0.f) { + intermuv = 0.f; + } + Z = (intermuv) * Y / (4 * v); + + + } -void Color::skinred ( double J, double h, double sres, double Sp, float dred, float protect_red, int sk, float rstprotection, float ko, double &s) -{ - float factorskin, factorsat, factor, factorskinext, interm; - float scale = 100.0f / 100.1f; //reduction in normal zone - float scaleext = 1.0f; //reduction in transition zone - float deltaHH = 0.3f; //HH value transition : I have choice 0.3 radians - float HH; - bool doskin = false; - - //rough correspondence between h (JC) and H (lab) that has relatively little importance because transitions that blur the correspondence is not linear - if ((float)h > 8.6f && (float)h <= 74.f ) { - HH = (1.15f / 65.4f) * (float)h - 0.0012f; //H > 0.15 H<1.3 - doskin = true; - } else if((float)h > 0.f && (float)h <= 8.6f ) { - HH = (0.19f / 8.6f ) * (float)h - 0.04f; //H>-0.04 H < 0.15 - doskin = true; - } else if((float)h > 355.f && (float)h <= 360.f) { - HH = (0.11f / 5.0f ) * (float)h - 7.96f; //H>-0.15 <-0.04 - doskin = true; - } else if((float)h > 74.f && (float)h < 95.f ) { - HH = (0.30f / 21.0f) * (float)h + 0.24285f; //H>1.3 H<1.6 - doskin = true; - } - - if(doskin) { - float chromapro = sres / Sp; - - if(sk == 1) { //in C mode to adapt dred to J - if (J < 16.0) { - dred = 40.0f; - } else if(J < 22.0) { - dred = 2.5f * (float)J; - } else if(J < 60.0) { - dred = 55.0f; - } else if(J < 70.0) { - dred = -1.5f * (float)J + 145.0f; - } else { - dred = 40.0f; - } - } - - if(chromapro > 0.0) { - Color::scalered ( rstprotection, chromapro, 0.0, HH, deltaHH, scale, scaleext); //Scale factor - } - - if(chromapro > 1.0) { - interm = (chromapro - 1.0f) * 100.0f; - factorskin = 1.0f + (interm * scale) / 100.0f; - factorskinext = 1.0f + (interm * scaleext) / 100.0f; - } else { - factorskin = chromapro ; - factorskinext = chromapro ; - } - - factorsat = chromapro; - factor = factorsat; - Color::transitred ( HH, s, dred, factorskin, protect_red, factorskinext, deltaHH, factorsat, factor); //transition - s *= factor; - } else { - s = ko * sres; - } - -} void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s) { float HH; bool doskin = false; //rough correspondence between h (JC) and H (lab) that has relatively little importance because transitions that blur the correspondence is not linear - if ((float)h > 8.6f && (float)h <= 74.f ) { - HH = (1.15f / 65.4f) * (float)h - 0.0012f; //H > 0.15 H<1.3 + if (h > 8.6f && h <= 74.f) { + HH = (1.15f / 65.4f) * h - 0.0012f; //H > 0.15 H<1.3 doskin = true; - } else if((float)h > 0.f && (float)h <= 8.6f ) { - HH = (0.19f / 8.6f ) * (float)h - 0.04f; //H>-0.04 H < 0.15 + } else if(h > 0.f && h <= 8.6f) { + HH = (0.19f / 8.6f) * h - 0.04f; //H>-0.04 H < 0.15 doskin = true; - } else if((float)h > 355.f && (float)h <= 360.f) { - HH = (0.11f / 5.0f ) * (float)h - 7.96f; //H>-0.15 <-0.04 + } else if(h > 355.f && h <= 360.f) { + HH = (0.11f / 5.0f) * h - 7.96f; //H>-0.15 <-0.04 doskin = true; - } else if((float)h > 74.f && (float)h < 95.f ) { - HH = (0.30f / 21.0f) * (float)h + 0.24285f; //H>1.3 H<1.6 + } else if(h > 74.f && h < 95.f ) { + HH = (0.30f / 21.0f) * h + 0.24285f; //H>1.3 H<1.6 doskin = true; } if(doskin) { - float factorskin, factorsat, factor, factorskinext; + float factorskin, factor, factorskinext; float deltaHH = 0.3f; //HH value transition : I have choice 0.3 radians float chromapro = sres / Sp; if(sk == 1) { //in C mode to adapt dred to J - if (J < 16.f) { + if (J < 16.f) { dred = 40.f; } else if(J < 22.f) { dred = 2.5f * J; @@ -2181,7 +2171,7 @@ void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, f float scale = 0.999000999f; // 100.0f/100.1f; reduction in normal zone float scaleext = 1.0f; //reduction in transition zone Color::scalered ( rstprotection, chromapro, 0.0, HH, deltaHH, scale, scaleext);//Scale factor - float interm = (chromapro - 1.0f); + const float interm = chromapro - 1.0f; factorskin = 1.0f + (interm * scale); factorskinext = 1.0f + (interm * scaleext); } else { @@ -2189,21 +2179,14 @@ void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, f factorskinext = chromapro ; } - factorsat = chromapro; - factor = factorsat; - Color::transitred ( HH, s, dred, factorskin, protect_red, factorskinext, deltaHH, factorsat, factor); //transition + factor = chromapro; + Color::transitred ( HH, s, dred, factorskin, protect_red, factorskinext, deltaHH, chromapro, factor); //transition s *= factor; } else { s = ko * sres; } - } - - - - - void Color::scalered ( const float rstprotection, const float param, const float limit, const float HH, const float deltaHH, float &scale, float &scaleext) { if(rstprotection < 99.9999f) { @@ -2258,55 +2241,24 @@ void Color::transitred (const float HH, float const Chprov1, const float dred, c * float correctlum : correction Hue for luminance (brigtness, contrast,...) * MunsellDebugInfo* munsDbgInfo: (Debug target only) object to collect information. */ -#ifdef _DEBUG -void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHuechroma, float &correctlum, MunsellDebugInfo* munsDbgInfo) -#else void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHuechroma, float &correctlum) -#endif { - bool contin1, contin2; - float correctionHue = 0.0, correctionHueLum = 0.0; - bool correctL; + if (CC >= 6.f && CC < 140.f) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation) + constexpr 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(CC >= 6.0 && CC < 140) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation) - static const float huelimit[8] = { -2.48, -0.55, 0.44, 1.52, 1.87, 3.09, -0.27, 0.44}; //limits hue of blue-purple, red-yellow, green-yellow, red-purple + Chprov1 = rtengine::LIM(Chprov1, 6.f, 140.f); - if (Chprov1 > 140.f) { - Chprov1 = 139.f; //limits of LUTf - } - - if (Chprov1 < 6.f) { - Chprov1 = 6.f; - } - - for(int zo = 1; zo <= 4; zo++) { - if(HH > huelimit[2 * zo - 2] && HH < huelimit[2 * zo - 1]) { - //zone=zo; - contin1 = contin2 = false; - correctL = false; + for (int zo = 1; zo <= 4; ++zo) { + if (HH > huelimit[2 * zo - 2] && HH < huelimit[2 * zo - 1]) { + bool correctL = false; + float correctionHue = 0.f, correctionHueLum = 0.f; MunsellLch (Lprov1, HH, Chprov1, CC, correctionHue, zo, correctionHueLum, correctL); //munsell chroma correction -#ifdef _DEBUG - float absCorrectionHue = fabs(correctionHue); - - if(correctionHue != 0.0) { - int idx = zo - 1; - #pragma omp critical (maxdhue) - { - munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue); - } - } - - if(absCorrectionHue > 0.45) - #pragma omp atomic - munsDbgInfo->depass++; //verify if no bug in calculation - -#endif correctionHuechroma = correctionHue; //preserve if(lumaMuns) { + bool contin1 = false; float correctlumprov = 0.f; - float correctlumprov2 = 0.f; if(correctL) { //for Munsell luminance correction @@ -2315,64 +2267,22 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl correctL = false; } - correctionHueLum = 0.0; - correctionHue = 0.0; - - if(fabs(Lprov1 - Loldd) > 6.0) { + if (std::fabs(Lprov1 - Loldd) > 6.f) { + correctionHueLum = 0.f; + correctionHue = 0.f; // correction if delta L significative..Munsell luminance MunsellLch (Loldd, HH, Chprov1, Chprov1, correctionHue, zo, correctionHueLum, correctL); - if(correctL) { - correctlumprov2 = correctionHueLum; - contin2 = true; - correctL = false; - } - - correctionHueLum = 0.0; - - if(contin1 && contin2) { - correctlum = correctlumprov2 - correctlumprov; - } - -#ifdef _DEBUG - float absCorrectLum = fabs(correctlum); - - if(correctlum != 0.0) { - int idx = zo - 1; - #pragma omp critical (maxdhuelum) - { - munsDbgInfo->maxdhuelum[idx] = MAX(munsDbgInfo->maxdhuelum[idx], absCorrectLum); + if(contin1) { + correctlum = correctionHueLum - correctlumprov; } } - - if(absCorrectLum > 0.35) - #pragma omp atomic - munsDbgInfo->depassLum++; //verify if no bug in calculation - -#endif } } + break; } } - } - -#ifdef _DEBUG - - if (correctlum < -0.35f) { - correctlum = -0.35f; - } else if(correctlum > 0.35f) { - correctlum = 0.35f; - } - - if (correctionHuechroma < -0.45f) { - correctionHuechroma = -0.45f; - } else if(correctionHuechroma > 0.45f) { - correctionHuechroma = 0.45f; - } - -#endif - } /* @@ -2391,9 +2301,6 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl 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 @@ -2406,7 +2313,8 @@ void Color::AllMunsellLch(float Lprov1, float HH, float Chprov1, float CC, float for(int zo = 1; zo <= 4; zo++) { if(HH > huelimit[2 * zo - 2] && HH < huelimit[2 * zo - 1]) { //zone=zo; - correctL = false; + float correctionHue = 0.f, correctionHueLum = 0.f; + bool correctL = false; MunsellLch (Lprov1, HH, Chprov1, CC, correctionHue, zo, correctionHueLum, correctL); //munsell chroma correction correctionHuechroma = correctionHue; //preserve break; @@ -2431,19 +2339,11 @@ void Color::AllMunsellLch(float Lprov1, float HH, float Chprov1, float CC, float * 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) * bool neg and moreRGB : only in DEBUG mode to calculate iterations for negatives values and > 65535 */ -#ifdef _DEBUG -void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb) -#else void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef) -#endif { const float ClipLevel = 65535.0f; bool inGamut; -#ifdef _DEBUG - neg = false, more_rgb = false; -#endif float2 sincosval = xsincosf(HH); - do { inGamut = true; @@ -2465,10 +2365,6 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo // gamut control before saturation to put Lab values in future gamut, but not RGB if (R < 0.0f || G < 0.0f || B < 0.0f) { -#ifdef _DEBUG - neg = true; -#endif - if (Lprov1 < 0.1f) { Lprov1 = 0.1f; } @@ -2514,10 +2410,6 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo } 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 - more_rgb = true; -#endif - if (Lprov1 > 99.999f) { Lprov1 = 99.98f; } @@ -2552,17 +2444,10 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo * 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) * bool neg and moreRGB : only in DEBUG mode to calculate iterations for negatives values and > 65535 */ -#ifdef _DEBUG -void Color::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, bool &neg, bool &more_rgb) -#else void Color::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) -#endif { constexpr float ClipLevel = 65535.0f; bool inGamut; -#ifdef _DEBUG - neg = false, more_rgb = false; -#endif float ChprovSave = Chprov1; do { @@ -2584,9 +2469,6 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr // gamut control before saturation to put Lab values in future gamut, but not RGB if (R < 0.0f || G < 0.0f || B < 0.0f) { -#ifdef _DEBUG - neg = true; -#endif if (isnan(HH)) { float atemp = ChprovSave * sincosval.y * 327.68; @@ -2629,7 +2511,8 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr } } - Chprov1 *= higherCoef; // decrease the chromaticity value + Chprov1 *= higherCoef; // decrease the chromaticity value + if (Chprov1 <= 3.0f) { Lprov1 += lowerCoef; @@ -2639,10 +2522,6 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr } 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 - more_rgb = true; -#endif - if (Lprov1 > 99.999f) { Lprov1 = 99.98f; } @@ -2764,17 +2643,10 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr } -#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) -#else void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef) -#endif { const float ClipLevel = 65535.0f; bool inGamut; -#ifdef _DEBUG - neg = false, more_rgb = false; -#endif do { inGamut = true; @@ -2798,10 +2670,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const // gamut control before saturation to put Lab values in future gamut, but not RGB if (R < 0.0f || G < 0.0f || B < 0.0f) { -#ifdef _DEBUG - neg = true; -#endif - if (Lprov1 < 0.01f) { Lprov1 = 0.01f; } @@ -2816,10 +2684,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const } 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 - more_rgb = true; -#endif - if (Lprov1 > 99.999f) { Lprov1 = 99.98f; } @@ -2859,19 +2723,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const */ 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; - t1e.set(); - int negat = 0, moreRGB = 0; - MunsellDebugInfo* MunsDebugInfo = nullptr; - - if (corMunsell) { - MunsDebugInfo = new MunsellDebugInfo(); - } - -#endif - float correctlum = 0.f; - float correctionHuechroma = 0.f; #ifdef __SSE2__ // precalculate H and C using SSE float HHBuffer[N]; @@ -2908,9 +2759,6 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, float2 sincosval; if(gamut) { -#ifdef _DEBUG - bool neg, more_rgb; -#endif // According to mathematical laws we can get the sin and cos of HH by simple operations float R, G, B; @@ -2923,36 +2771,15 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, } //gamut control : Lab values are in gamut -#ifdef _DEBUG - gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, isHLEnabled, 0.15f, 0.96f, neg, more_rgb); -#else gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, isHLEnabled, 0.15f, 0.96f); -#endif - -#ifdef _DEBUG - - if(neg) { - negat++; - } - - if(more_rgb) { - moreRGB++; - } - -#endif } labL[j] = Lprov1 * 327.68f; - correctionHuechroma = 0.f; - correctlum = 0.f; + float correctionHuechroma = 0.f; + float correctlum = 0.f; if(corMunsell) -#ifdef _DEBUG - AllMunsellLch(lumaMuns, Lprov1, Loldd, HH, Chprov1, Coldd, correctionHuechroma, correctlum, MunsDebugInfo); - -#else AllMunsellLch(lumaMuns, Lprov1, Loldd, HH, Chprov1, Coldd, correctionHuechroma, correctlum); -#endif if(correctlum == 0.f && correctionHuechroma == 0.f) { if(!gamut) { @@ -2973,1408 +2800,8 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, laba[j] = Chprov1 * sincosval.y * 327.68f; labb[j] = Chprov1 * sincosval.x * 327.68f; } - -#ifdef _DEBUG - t2e.set(); - - if (settings->verbose) { - printf("Color::LabGamutMunsell (correction performed in %d usec):\n", t2e.etime(t1e)); - printf(" Gamut : G1negat=%iiter G165535=%iiter \n", negat, moreRGB); - - 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); - printf(" Munsell luminance : MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad depass=%u\n", MunsDebugInfo->maxdhuelum[0] , MunsDebugInfo->maxdhuelum[1], MunsDebugInfo->maxdhuelum[2], MunsDebugInfo->maxdhuelum[3], MunsDebugInfo->depassLum); - } else { - printf(" Munsell correction wasn't requested\n"); - } - } - - if (MunsDebugInfo) { - delete MunsDebugInfo; - } - -#endif - } -/* - * MunsellLch correction - * Copyright (c) 2012 Jacques Desmis - * - * Find the right LUT and calculate the correction - */ -void Color::MunsellLch (float lum, float hue, float chrom, float memChprov, float &correction, int zone, float &lbe, bool &correctL) -{ - - int x = int(memChprov); - int y = int(chrom); - - //begin PB correction + sky - if(zone == 1) { - if(lum > 5.0) { - if(lum < 15.0) { - if( (hue >= (_15PB10[x] - 0.035)) && (hue < (_15PB10[x] + 0.052) && x <= 45)) { - if(y > 49) { - y = 49; - } - - correction = _15PB10[y] - _15PB10[x] ; - lbe = _15PB10[y]; - correctL = true; - } else if (( hue >= ( _3PB10[x] - 0.052)) && (hue < (_45PB10[x] + _3PB10[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _3PB10[y] - _3PB10[x]; - lbe = _3PB10[y]; - correctL = true; - } else if (( hue >= (_45PB10[x] + _3PB10[x]) / 2.0) && (hue < (_45PB10[x] + 0.052)) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _45PB10[y] - _45PB10[x] ; - lbe = _45PB10[y]; - correctL = true; - } else if (( hue >= (_6PB10[x] - 0.052) && (hue < (_6PB10[x] + _75PB10[x]) / 2.0))) { - correction = _6PB10[y] - _6PB10[x] ; - lbe = _6PB10[y]; - correctL = true; - } else if (( hue >= (_6PB10[x] + _75PB10[x]) / 2.0) && (hue < (_9PB10[x] + _75PB10[x]) / 2.0)) { - correction = _75PB10[y] - _75PB10[x] ; - lbe = _75PB10[y]; - correctL = true; - } else if (( hue >= (_9PB10[x] + _75PB10[x]) / 2.0) && (hue < (_9PB10[x] + _10PB10[x]) / 2.0)) { - correction = _9PB10[y] - _9PB10[x] ; - lbe = _9PB10[y]; - correctL = true; - } else if (( hue >= (_10PB10[x] + _9PB10[x]) / 2.0) && (hue < (_1P10[x] + _10PB10[x]) / 2.0)) { - correction = _10PB10[y] - _10PB10[x] ; - lbe = _10PB10[y]; - correctL = true; - } else if (( hue >= (_10PB10[x] + _1P10[x]) / 2.0) && (hue < (_1P10[x] + _4P10[x]) / 2.0)) { - correction = _1P10[y] - _1P10[x]; - lbe = _1P10[y]; - correctL = true; - } else if (( hue >= (_1P10[x] + _4P10[x]) / 2.0) && (hue < (0.035 + _4P10[x]) / 2.0)) { - correction = _4P10[y] - _4P10[x] ; - lbe = _4P10[y]; - correctL = true; - } - } else if (lum < 25.0) { - if( (hue >= (_15PB20[x] - 0.035)) && (hue < (_15PB20[x] + _3PB20[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _15PB20[y] - _15PB20[x] ; - lbe = _15PB20[y]; - correctL = true; - } else if (( hue >= (_15PB20[x] + _3PB20[x]) / 2.0) && (hue < (_45PB20[x] + _3PB20[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _3PB20[y] - _3PB20[x] ; - lbe = _3PB20[y]; - correctL = true; - } else if (( hue >= (_45PB20[x] + _3PB20[x]) / 2.0) && (hue < ( _45PB20[x] + 0.052)) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _45PB20[y] - _45PB20[x] ; - lbe = _45PB20[y]; - correctL = true; - } else if (( hue >= (_45PB20[x] + 0.052)) && (hue < (_6PB20[x] + _75PB20[x]) / 2.0)) { - correction = _6PB20[y] - _6PB20[x]; - lbe = _6PB20[y]; - correctL = true; - } else if (( hue >= (_6PB20[x] + _75PB20[x]) / 2.0) && (hue < (_9PB20[x] + _75PB20[x]) / 2.0)) { - correction = _75PB20[y] - _75PB20[x] ; - lbe = _75PB20[y]; - correctL = true; - } else if (( hue >= (_9PB20[x] + _75PB20[x]) / 2.0) && (hue < (_9PB20[x] + _10PB20[x]) / 2.0)) { - correction = _9PB20[y] - _9PB20[x] ; - lbe = _9PB20[y]; - correctL = true; - } else if (( hue >= (_10PB20[x] + _9PB20[x]) / 2.0) && (hue < (_1P20[x] + _10PB20[x]) / 2.0)) { - correction = _10PB20[y] - _10PB20[x] ; - lbe = _10PB20[y]; - correctL = true; - } else if (( hue >= (_10PB20[x] + _1P20[x]) / 2.0) && (hue < (_1P20[x] + _4P20[x]) / 2.0)) { - correction = _1P20[y] - _1P20[x] ; - lbe = _1P20[y]; - correctL = true; - } else if (( hue >= (_1P20[x] + _4P20[x]) / 2.0) && (hue < (0.035 + _4P20[x]) / 2.0)) { - correction = _4P20[y] - _4P20[x] ; - lbe = _4P20[y]; - correctL = true; - } - } else if (lum < 35.0) { - if( (hue >= (_15PB30[x] - 0.035)) && (hue < (_15PB30[x] + _3PB30[x]) / 2.0) && x <= 85 ) { - if(y > 89) { - y = 89; - } - - correction = _15PB30[y] - _15PB30[x] ; - lbe = _15PB30[y]; - correctL = true; - } else if (( hue >= (_15PB30[x] + _3PB30[x]) / 2.0) && (hue < (_45PB30[x] + _3PB30[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _3PB30[y] - _3PB30[x] ; - lbe = _3PB30[y]; - correctL = true; - } else if (( hue >= (_45PB30[x] + _3PB30[x]) / 2.0) && (hue < (_45PB30[x] + 0.052)) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _45PB30[y] - _45PB30[x] ; - lbe = _45PB30[y]; - correctL = true; - } else if (( hue >= ( _45PB30[x] + 0.052)) && (hue < (_6PB30[x] + _75PB30[x]) / 2.0)) { - correction = _6PB30[y] - _6PB30[x] ; - lbe = _6PB30[y]; - correctL = true; - } else if (( hue >= (_6PB30[x] + _75PB30[x]) / 2.0) && (hue < (_9PB30[x] + _75PB30[x]) / 2.0)) { - correction = _75PB30[y] - _75PB30[x] ; - lbe = _75PB30[y] ; - correctL = true; - } else if (( hue >= (_9PB30[x] + _75PB30[x]) / 2.0) && (hue < (_9PB30[x] + _10PB30[x]) / 2.0)) { - correction = _9PB30[y] - _9PB30[x] ; - lbe = _9PB30[y]; - correctL = true; - } else if (( hue >= (_10PB30[x] + _9PB30[x]) / 2.0) && (hue < (_1P30[x] + _10PB30[x]) / 2.0)) { - correction = _10PB30[y] - _10PB30[x] ; - lbe = _10PB30[y]; - correctL = true; - } else if (( hue >= (_10PB30[x] + _1P30[x]) / 2.0) && (hue < (_1P30[x] + _4P30[x]) / 2.0)) { - correction = _1P30[y] - _1P30[x] ; - lbe = _1P30[y]; - correctL = true; - } else if (( hue >= (_1P30[x] + _4P30[x]) / 2.0) && (hue < (0.035 + _4P30[x]) / 2.0)) { - correction = _4P30[y] - _4P30[x] ; - lbe = _4P30[y]; - correctL = true; - } - } else if (lum < 45.0) { - if( (hue <= (_05PB40[x] + _15PB40[x]) / 2.0) && (hue > (_05PB40[x] + _10B40[x]) / 2.0) && x < 75 ) { - if(y > 75) { - y = 75; - } - - correction = _05PB40[y] - _05PB40[x] ; - lbe = _05PB40[y]; - correctL = true; - } else if( (hue <= (_05PB40[x] + _10B40[x]) / 2.0) && (hue > (_10B40[x] + _9B40[x]) / 2.0) && x < 70 ) { - if(y > 70) { - y = 70; - } - - correction = _10B40[y] - _10B40[x] ; - lbe = _10B40[y]; - correctL = true; - } else if( (hue <= (_10B40[x] + _9B40[x]) / 2.0) && (hue > (_9B40[x] + _7B40[x]) / 2.0) && x < 70 ) { - if(y > 70) { - y = 70; - } - - correction = _9B40[y] - _9B40[x] ; - lbe = _9B40[y]; - correctL = true; - } else if( (hue <= (_9B40[x] + _7B40[x]) / 2.0) && (hue > (_5B40[x] + _7B40[x]) / 2.0) && x < 70 ) { - if(y > 70) { - y = 70; - } - - correction = _7B40[y] - _7B40[x] ; - lbe = _7B40[y]; - correctL = true; - } else if (( hue <= (_5B40[x] + _7B40[x]) / 2.0) && (hue > (_5B40[x] - 0.035)) && x < 70) { - if(y > 70) { - y = 70; // - } - - correction = _5B40[y] - _5B40[x] ; - lbe = _5B40[y]; - correctL = true; - } - - else if( (hue >= (_15PB40[x] - 0.035)) && (hue < (_15PB40[x] + _3PB40[x]) / 2.0) && x <= 85 ) { - if(y > 89) { - y = 89; - } - - correction = _15PB40[y] - _15PB40[x] ; - lbe = _15PB40[y]; - correctL = true; - } else if (( hue >= (_15PB40[x] + _3PB40[x]) / 2.0) && (hue < (_45PB40[x] + _3PB40[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _3PB40[y] - _3PB40[x] ; - lbe = _3PB40[y]; - correctL = true; - } else if (( hue >= (_45PB40[x] + _3PB40[x]) / 2.0) && (hue < (_45PB40[x] + 0.052)) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _45PB40[y] - _45PB40[x] ; - lbe = _45PB40[y] ; - correctL = true; - } else if (( hue >= (_45PB40[x] + 0.052)) && (hue < (_6PB40[x] + _75PB40[x]) / 2.0)) { - correction = _6PB40[y] - _6PB40[x] ; - lbe = _6PB40[y]; - correctL = true; - } else if (( hue >= (_6PB40[x] + _75PB40[x]) / 2.0) && (hue < (_9PB40[x] + _75PB40[x]) / 2.0)) { - correction = _75PB40[y] - _75PB40[x] ; - lbe = _75PB40[y]; - correctL = true; - } else if (( hue >= (_9PB40[x] + _75PB40[x]) / 2.0) && (hue < (_9PB40[x] + _10PB40[x]) / 2.0)) { - correction = _9PB40[y] - _9PB40[x] ; - lbe = _9PB40[y]; - correctL = true; - } else if (( hue >= (_10PB40[x] + _9PB40[x]) / 2.0) && (hue < (_1P40[x] + _10PB40[x]) / 2.0)) { - correction = _10PB40[y] - _10PB40[x] ; - lbe = _10PB40[y]; - correctL = true; - } else if (( hue >= (_10PB40[x] + _1P40[x]) / 2.0) && (hue < (_1P40[x] + _4P40[x]) / 2.0)) { - correction = _1P40[y] - _1P40[x] ; - lbe = _1P40[y]; - correctL = true; - } else if (( hue >= (_1P40[x] + _4P40[x]) / 2.0) && (hue < (0.035 + _4P40[x]) / 2.0)) { - correction = _4P40[y] - _4P40[x] ; - lbe = _4P40[y]; - correctL = true; - } - } else if (lum < 55.0) { - if( (hue <= (_05PB50[x] + _15PB50[x]) / 2.0) && (hue > (_05PB50[x] + _10B50[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _05PB50[y] - _05PB50[x] ; - lbe = _05PB50[y]; - correctL = true; - } else if( (hue <= (_05PB50[x] + _10B50[x]) / 2.0) && (hue > (_10B50[x] + _9B50[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _10B50[y] - _10B50[x] ; - lbe = _10B50[y]; - correctL = true; - } else if( (hue <= (_10B50[x] + _9B50[x]) / 2.0) && (hue > (_9B50[x] + _7B50[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _9B50[y] - _9B50[x] ; - lbe = _9B50[y]; - correctL = true; - } else if( (hue <= (_9B50[x] + _7B50[x]) / 2.0) && (hue > (_5B50[x] + _7B50[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _7B50[y] - _7B50[x] ; - lbe = _7B50[y]; - correctL = true; - } else if (( hue <= (_5B50[x] + _7B50[x]) / 2.0) && (hue > (_5B50[x] - 0.035)) && x < 79) { - if(y > 79) { - y = 79; // - } - - correction = _5B50[y] - _5B50[x] ; - lbe = _5B50[y]; - correctL = true; - } - - else if( (hue >= (_15PB50[x] - 0.035)) && (hue < (_15PB50[x] + _3PB50[x]) / 2.0) && x <= 85 ) { - if(y > 89) { - y = 89; - } - - correction = _15PB50[y] - _15PB50[x] ; - lbe = _15PB50[y]; - correctL = true; - } else if (( hue >= (_15PB50[x] + _3PB50[x]) / 2.0) && (hue < (_45PB50[x] + _3PB50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _3PB50[y] - _3PB50[x] ; - lbe = _3PB50[y]; - correctL = true; - } else if (( hue >= (_45PB50[x] + _3PB50[x]) / 2.0) && (hue < (_6PB50[x] + _45PB50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _45PB50[y] - _45PB50[x] ; - lbe = _45PB50[y]; - correctL = true; - } else if (( hue >= (_6PB50[x] + _45PB50[x]) / 2.0) && (hue < (_6PB50[x] + _75PB50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _6PB50[y] - _6PB50[x] ; - lbe = _6PB50[y]; - correctL = true; - } else if (( hue >= (_6PB50[x] + _75PB50[x]) / 2.0) && (hue < (_9PB50[x] + _75PB50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _75PB50[y] - _75PB50[x] ; - lbe = _75PB50[y]; - correctL = true; - } else if (( hue >= (_9PB50[x] + _75PB50[x]) / 2.0) && (hue < (_9PB50[x] + _10PB50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _9PB50[y] - _9PB50[x] ; - lbe = _9PB50[y]; - correctL = true; - } else if (( hue >= (_10PB50[x] + _9PB50[x]) / 2.0) && (hue < (_1P50[x] + _10PB50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _10PB50[y] - _10PB50[x] ; - lbe = _10PB50[y]; - correctL = true; - } else if (( hue >= (_10PB50[x] + _1P50[x]) / 2.0) && (hue < (_1P50[x] + _4P50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _1P50[y] - _1P50[x] ; - lbe = _1P50[y]; - correctL = true; - } else if (( hue >= (_1P50[x] + _4P50[x]) / 2.0) && (hue < (0.035 + _4P50[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _4P50[y] - _4P50[x] ; - lbe = _4P50[y]; - correctL = true; - } - } else if (lum < 65.0) { - if( (hue <= (_05PB60[x] + _15PB60[x]) / 2.0) && (hue > (_05PB60[x] + _10B60[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _05PB60[y] - _05PB60[x] ; - lbe = _05PB60[y]; - correctL = true; - } else if( (hue <= (_05PB60[x] + _10B60[x]) / 2.0) && (hue > (_10B60[x] + _9B60[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _10B60[y] - _10B60[x] ; - lbe = _10B60[y]; - correctL = true; - } else if( (hue <= (_10B60[x] + _9B60[x]) / 2.0) && (hue > (_9B60[x] + _7B60[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _9B60[y] - _9B60[x] ; - lbe = _9B60[y]; - correctL = true; - } else if( (hue <= (_9B60[x] + _7B60[x]) / 2.0) && (hue > (_5B60[x] + _7B60[x]) / 2.0) && x < 79 ) { - if(y > 79) { - y = 79; - } - - correction = _7B60[y] - _7B60[x] ; - lbe = _7B60[y]; - correctL = true; - } else if (( hue <= (_5B60[x] + _7B60[x]) / 2.0) && (hue > (_5B60[x] - 0.035)) && x < 79) { - if(y > 79) { - y = 79; // - } - - correction = _5B60[y] - _5B60[x] ; - lbe = _5B60[y]; - correctL = true; - } - - else if( (hue >= (_15PB60[x] - 0.035)) && (hue < (_15PB60[x] + _3PB60[x]) / 2.0) && x <= 85 ) { - if(y > 89) { - y = 89; - } - - correction = _15PB60[y] - _15PB60[x] ; - lbe = _15PB60[y]; - correctL = true; - } else if (( hue >= (_15PB60[x] + _3PB60[x]) / 2.0) && (hue < (_45PB60[x] + _3PB60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _3PB60[y] - _3PB60[x] ; - lbe = _3PB60[y]; - correctL = true; - } else if (( hue >= (_45PB60[x] + _3PB60[x]) / 2.0) && (hue < (_6PB60[x] + _45PB60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _45PB60[y] - _45PB60[x] ; - lbe = _45PB60[y]; - correctL = true; - } else if (( hue >= (_6PB60[x] + _45PB60[x]) / 2.0) && (hue < (_6PB60[x] + _75PB60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _6PB60[y] - _6PB60[x] ; - lbe = _6PB60[y]; - correctL = true; - } else if (( hue >= (_6PB60[x] + _75PB60[x]) / 2.0) && (hue < (_9PB60[x] + _75PB60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _75PB60[y] - _75PB60[x] ; - lbe = _75PB60[y]; - correctL = true; - } else if (( hue >= (_9PB60[x] + _75PB60[x]) / 2.0) && (hue < (_9PB60[x] + _10PB60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _9PB60[y] - _9PB60[x] ; - lbe = _9PB60[y]; - correctL = true; - } else if (( hue >= (_10PB60[x] + _9PB60[x]) / 2.0) && (hue < (_1P60[x] + _10PB60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _10PB60[y] - _10PB60[x] ; - lbe = _10PB60[y]; - correctL = true; - } else if (( hue >= (_10PB60[x] + _1P60[x]) / 2.0) && (hue < (_1P60[x] + _4P60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _1P60[y] - _1P60[x] ; - lbe = _1P60[y]; - correctL = true; - } else if (( hue >= (_1P60[x] + _4P60[x]) / 2.0) && (hue < (0.035 + _4P60[x]) / 2.0) && x <= 85) { - if(y > 89) { - y = 89; - } - - correction = _4P60[y] - _4P60[x] ; - lbe = _4P60[y]; - correctL = true; - } - } else if (lum < 75.0) { - if( (hue <= (_05PB70[x] + _15PB70[x]) / 2.0) && (hue > (_05PB70[x] + _10B70[x]) / 2.0) && x < 50 ) { - if(y > 49) { - y = 49; - } - - correction = _05PB70[y] - _05PB70[x] ; - lbe = _05PB70[y]; - correctL = true; - } else if( (hue <= (_05PB70[x] + _10B70[x]) / 2.0) && (hue > (_10B70[x] + _9B70[x]) / 2.0) && x < 50 ) { - if(y > 49) { - y = 49; - } - - correction = _10B70[y] - _10B70[x] ; - lbe = _10B70[y]; - correctL = true; - } else if( (hue <= (_10B70[x] + _9B70[x]) / 2.0) && (hue > (_9B70[x] + _7B70[x]) / 2.0) && x < 50 ) { - if(y > 49) { - y = 49; - } - - correction = _9B70[y] - _9B70[x] ; - lbe = _9B70[y]; - correctL = true; - } else if( (hue <= (_9B70[x] + _7B70[x]) / 2.0) && (hue > (_5B70[x] + _7B70[x]) / 2.0) && x < 50 ) { - if(y > 49) { - y = 49; - } - - correction = _7B70[y] - _7B70[x] ; - lbe = _7B70[y]; - correctL = true; - } else if (( hue <= (_5B70[x] + _7B70[x]) / 2.0) && (hue > (_5B70[x] - 0.035)) && x < 50) { - if(y > 49) { - y = 49; // - } - - correction = _5B70[y] - _5B70[x] ; - lbe = _5B70[y]; - correctL = true; - } - - else if( (hue >= (_15PB70[x] - 0.035)) && (hue < (_15PB70[x] + _3PB70[x]) / 2.0) && x < 50 ) { - if(y > 49) { - y = 49; - } - - correction = _15PB70[y] - _15PB70[x] ; - lbe = _15PB70[y]; - correctL = true; - } else if (( hue >= (_45PB70[x] + _3PB70[x]) / 2.0) && (hue < (_6PB70[x] + _45PB70[x]) / 2.0) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _45PB70[y] - _45PB70[x] ; - lbe = _45PB70[y]; - correctL = true; - } else if (( hue >= (_6PB70[x] + _45PB70[x]) / 2.0) && (hue < (_6PB70[x] + _75PB70[x]) / 2.0) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _6PB70[y] - _6PB70[x] ; - lbe = _6PB70[y]; - correctL = true; - } else if (( hue >= (_6PB70[x] + _75PB70[x]) / 2.0) && (hue < (_9PB70[x] + _75PB70[x]) / 2.0) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _75PB70[y] - _75PB70[x] ; - lbe = _75PB70[y]; - correctL = true; - } else if (( hue >= (_9PB70[x] + _75PB70[x]) / 2.0) && (hue < (_9PB70[x] + 0.035)) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _9PB70[y] - _9PB70[x] ; - lbe = _9PB70[y]; - correctL = true; - } - } else if (lum < 85.0) { - if( (hue <= (_05PB80[x] + _15PB80[x]) / 2.0) && (hue > (_05PB80[x] + _10B80[x]) / 2.0) && x < 40 ) { - if(y > 39) { - y = 39; - } - - correction = _05PB80[y] - _05PB80[x] ; - lbe = _05PB80[y] ; - correctL = true; - } else if( (hue <= (_05PB80[x] + _10B80[x]) / 2.0) && (hue > (_10B80[x] + _9B80[x]) / 2.0) && x < 40 ) { - if(y > 39) { - y = 39; - } - - correction = _10B80[y] - _10B80[x] ; - lbe = _10B80[y]; - correctL = true; - } else if( (hue <= (_10B80[x] + _9B80[x]) / 2.0) && (hue > (_9B80[x] + _7B80[x]) / 2.0) && x < 40 ) { - if(y > 39) { - y = 39; - } - - correction = _9B80[y] - _9B80[x] ; - lbe = _9B80[y]; - correctL = true; - } else if( (hue <= (_9B80[x] + _7B80[x]) / 2.0) && (hue > (_5B80[x] + _7B80[x]) / 2.0) && x < 50 ) { - if(y > 49) { - y = 49; - } - - correction = _7B80[y] - _7B80[x] ; - lbe = _7B80[y]; - correctL = true; - } else if (( hue <= (_5B80[x] + _7B80[x]) / 2.0) && (hue > (_5B80[x] - 0.035)) && x < 50) { - if(y > 49) { - y = 49; // - } - - correction = _5B80[y] - _5B80[x] ; - lbe = _5B80[y]; - correctL = true; - } - - else if( (hue >= (_15PB80[x] - 0.035)) && (hue < (_15PB80[x] + _3PB80[x]) / 2.0) && x < 50 ) { - if(y > 49) { - y = 49; - } - - correction = _15PB80[y] - _15PB80[x] ; - lbe = _15PB80[y]; - correctL = true; - } else if (( hue >= (_45PB80[x] + _3PB80[x]) / 2.0) && (hue < (_6PB80[x] + _45PB80[x]) / 2.0) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _45PB80[y] - _45PB80[x] ; - lbe = _45PB80[y]; - correctL = true; - } else if (( hue >= (_6PB80[x] + _45PB80[x]) / 2.0) && (hue < (_6PB80[x] + _75PB80[x]) / 2.0) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _6PB80[y] - _6PB80[x] ; - lbe = _6PB80[y]; - correctL = true; - } else if (( hue >= (_6PB80[x] + _75PB80[x]) / 2.0) && (hue < (_9PB80[x] + _75PB80[x]) / 2.0) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _75PB80[y] - _75PB80[x] ; - lbe = _75PB80[y]; - correctL = true; - } else if (( hue >= (_9PB80[x] + _75PB80[x]) / 2.0) && (hue < (_9PB80[x] + 0.035)) && x < 50) { - if(y > 49) { - y = 49; - } - - correction = _9PB80[y] - _9PB80[x] ; - lbe = _9PB80[y]; - correctL = true; - } - } - } - } - // end PB correction - - //red yellow correction - else if(zone == 2) { - if(lum > 15.0) { - if(lum < 25.0) { - if( (hue <= (_10YR20[x] + 0.035)) && (hue > (_10YR20[x] + _85YR20[x]) / 2.0) && x <= 45) { - if(y > 49) { - y = 49; - } - - correction = _10YR20[y] - _10YR20[x] ; - lbe = _10YR20[y]; - correctL = true; - } else if (( hue <= (_85YR20[x] + _10YR20[x]) / 2.0) && (hue > (_85YR20[x] + 0.035) && x <= 45)) { - if(y > 49) { - y = 49; - } - - correction = _85YR20[y] - _85YR20[x] ; - lbe = _85YR20[y]; - correctL = true; - } - } else if (lum < 35.0) { - if( (hue <= (_10YR30[x] + 0.035)) && (hue > (_10YR30[x] + _85YR30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10YR30[y] - _10YR30[x] ; - lbe = _10YR30[y]; - correctL = true; - } else if( (hue <= (_10YR30[x] + _85YR30[x]) / 2.0) && (hue > (_85YR30[x] + _7YR30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _85YR30[y] - _85YR30[x] ; - lbe = _85YR30[y]; - correctL = true; - } else if (( hue <= (_85YR30[x] + _7YR30[x]) / 2.0) && (hue > (_7YR30[x] + _55YR30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7YR30[y] - _7YR30[x] ; - lbe = _7YR30[y]; - correctL = true; - } else if (( hue <= (_7YR30[x] + _55YR30[x]) / 2.0) && (hue > (_55YR30[x] + _4YR30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _55YR30[y] - _55YR30[x] ; - lbe = _55YR30[y]; - correctL = true; - } else if (( hue <= (_55YR30[x] + _4YR30[x]) / 2.0) && (hue > (_4YR30[x] + _25YR30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _4YR30[y] - _4YR30[x] ; - lbe = _4YR30[y]; - correctL = true; - } else if (( hue <= (_4YR30[x] + _25YR30[x]) / 2.0) && (hue > (_25YR30[x] + _10R30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _25YR30[y] - _25YR30[x] ; - lbe = _25YR30[y]; - correctL = true; - } else if (( hue <= (_25YR30[x] + _10R30[x]) / 2.0) && (hue > (_10R30[x] + _9R30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10R30[y] - _10R30[x] ; - lbe = _10R30[y]; - correctL = true; - } else if (( hue <= (_10R30[x] + _9R30[x]) / 2.0) && (hue > (_9R30[x] + _7R30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _9R30[y] - _9R30[x] ; - lbe = _9R30[y]; - correctL = true; - } else if (( hue <= (_9R30[x] + _7R30[x]) / 2.0) && (hue > (_7R30[x] - 0.035)) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7R30[y] - _7R30[x] ; - lbe = _7R30[y] ; - correctL = true; - } - } else if (lum < 45.0) { - if( (hue <= (_10YR40[x] + 0.035)) && (hue > (_10YR40[x] + _85YR40[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10YR40[y] - _10YR40[x] ; - lbe = _10YR40[y]; - correctL = true; - } else if( (hue <= (_10YR40[x] + _85YR40[x]) / 2.0) && (hue > (_85YR40[x] + _7YR40[x]) / 2.0) && x < 85 ) { - if(y > 89) { - y = 89; - } - - correction = _85YR40[y] - _85YR40[x] ; - lbe = _85YR40[y]; - correctL = true; - } else if (( hue <= (_85YR40[x] + _7YR40[x]) / 2.0) && (hue > (_7YR40[x] + _55YR40[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7YR40[y] - _7YR40[x] ; - lbe = _7YR40[y]; - correctL = true; - } else if (( hue <= (_7YR40[x] + _55YR40[x]) / 2.0) && (hue > (_55YR40[x] + _4YR40[x]) / 2.0) && x < 85 ) { - if(y > 89) { - y = 89; - } - - correction = _55YR40[y] - _55YR40[x] ; - lbe = _55YR40[y]; - correctL = true; - } else if (( hue <= (_55YR40[x] + _4YR40[x]) / 2.0) && (hue > (_4YR40[x] + _25YR40[x]) / 2.0) && x < 85 ) { - if(y > 89) { - y = 89; - } - - correction = _4YR40[y] - _4YR40[x] ; - lbe = _4YR40[y]; - correctL = true; - } else if (( hue <= (_4YR40[x] + _25YR40[x]) / 2.0) && (hue > (_25YR40[x] + _10R40[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _25YR40[y] - _25YR40[x] ; - lbe = _25YR40[y] ; - correctL = true; - } else if (( hue <= (_25YR40[x] + _10R40[x]) / 2.0) && (hue > (_10R40[x] + _9R40[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10R40[y] - _10R40[x] ; - lbe = _10R40[y]; - correctL = true; - } else if (( hue <= (_10R40[x] + _9R40[x]) / 2.0) && (hue > (_9R40[x] + _7R40[x]) / 2.0) && x < 85 ) { - if(y > 89) { - y = 89; - } - - correction = _9R40[y] - _9R40[x] ; - lbe = _9R40[y]; - correctL = true; - } else if (( hue <= (_9R40[x] + _7R40[x]) / 2.0) && (hue > (_7R40[x] - 0.035)) && x < 85 ) { - if(y > 89) { - y = 89; - } - - correction = _7R40[y] - _7R40[x] ; - lbe = _7R40[y]; - correctL = true; - } - } else if (lum < 55.0) { - if( (hue <= (_10YR50[x] + 0.035)) && (hue > (_10YR50[x] + _85YR50[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10YR50[y] - _10YR50[x] ; - lbe = _10YR50[y]; - correctL = true; - } else if( (hue <= (_10YR50[x] + _85YR50[x]) / 2.0) && (hue > (_85YR50[x] + _7YR50[x]) / 2.0) && x < 85 ) { - if(y > 89) { - y = 89; - } - - correction = _85YR50[y] - _85YR50[x] ; - lbe = _85YR50[y]; - correctL = true; - } else if (( hue <= (_85YR50[x] + _7YR50[x]) / 2.0) && (hue > (_7YR50[x] + _55YR50[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7YR50[y] - _7YR50[x] ; - lbe = _7YR50[y]; - correctL = true; - } else if (( hue <= (_7YR50[x] + _55YR50[x]) / 2.0) && (hue > (_55YR50[x] + _4YR50[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _55YR50[y] - _55YR50[x] ; - lbe = _55YR50[y]; - correctL = true; - } else if (( hue <= (_55YR50[x] + _4YR50[x]) / 2.0) && (hue > (_4YR50[x] + _25YR50[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _4YR50[y] - _4YR50[x] ; - lbe = _4YR50[y]; - correctL = true; - } else if (( hue <= (_4YR50[x] + _25YR50[x]) / 2.0) && (hue > (_25YR50[x] + _10R50[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _25YR50[y] - _25YR50[x] ; - lbe = _25YR50[y]; - correctL = true; - } else if (( hue <= (_25YR50[x] + _10R50[x]) / 2.0) && (hue > (_10R50[x] + _9R50[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10R50[y] - _10R50[x] ; - lbe = _10R50[y]; - correctL = true; - } else if (( hue <= (_10R50[x] + _9R50[x]) / 2.0) && (hue > (_9R50[x] + _7R50[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _9R50[y] - _9R50[x] ; - lbe = _9R50[y]; - correctL = true; - } else if (( hue <= (_9R50[x] + _7R50[x]) / 2.0) && (hue > (_7R50[x] - 0.035)) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7R50[y] - _7R50[x] ; - lbe = _7R50[y]; - correctL = true; - } - } else if (lum < 65.0) { - if( (hue <= (_10YR60[x] + 0.035)) && (hue > (_10YR60[x] + _85YR60[x]) / 2.0)) { - ; - correction = _10YR60[y] - _10YR60[x] ; - lbe = _10YR60[y]; - correctL = true; - } else if( (hue <= (_10YR60[x] + _85YR60[x]) / 2.0) && (hue > (_85YR60[x] + _7YR60[x]) / 2.0) ) { - ; - correction = _85YR60[y] - _85YR60[x] ; - lbe = _85YR60[y]; - correctL = true; - } else if (( hue <= (_85YR60[x] + _7YR60[x]) / 2.0) && (hue > (_7YR60[x] + _55YR60[x]) / 2.0)) { - correction = _7YR60[y] - _7YR60[x] ; - lbe = _7YR60[y]; - correctL = true; - } else if (( hue <= (_7YR60[x] + _55YR60[x]) / 2.0) && (hue > (_55YR60[x] + _4YR60[x]) / 2.0)) { - correction = _55YR60[y] - _55YR60[x] ; - lbe = _55YR60[y]; - correctL = true; - } else if (( hue <= (_55YR60[x] + _4YR60[x]) / 2.0) && (hue > (_4YR60[x] + _25YR60[x]) / 2.0)) { - correction = _4YR60[y] - _4YR60[x] ; - lbe = _4YR60[y]; - correctL = true; - } else if (( hue <= (_4YR60[x] + _25YR60[x]) / 2.0) && (hue > (_25YR60[x] + _10R60[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _25YR60[y] - _25YR60[x] ; - lbe = _25YR60[y]; - correctL = true; - } else if (( hue <= (_25YR60[x] + _10R60[x]) / 2.0) && (hue > (_10R60[x] + _9R60[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10R60[y] - _10R60[x] ; - lbe = _10R60[y]; - correctL = true; - } else if (( hue <= (_10R60[x] + _9R60[x]) / 2.0) && (hue > (_9R60[x] + _7R60[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _9R60[y] - _9R60[x] ; - lbe = _9R60[y]; - correctL = true; - } else if (( hue <= (_9R60[x] + _7R60[x]) / 2.0) && (hue > (_7R60[x] - 0.035)) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7R60[y] - _7R60[x] ; - lbe = _7R60[y]; - correctL = true; - } - } else if (lum < 75.0) { - if( (hue <= (_10YR70[x] + 0.035)) && (hue > (_10YR70[x] + _85YR70[x]) / 2.0)) { - correction = _10YR70[y] - _10YR70[x] ; - lbe = _10YR70[y]; - correctL = true; - } else if( (hue <= (_10YR70[x] + _85YR70[x]) / 2.0) && (hue > (_85YR70[x] + _7YR70[x]) / 2.0)) { - correction = _85YR70[y] - _85YR70[x] ; - lbe = _85YR70[y]; - correctL = true; - } - - if (( hue <= (_85YR70[x] + _7YR70[x]) / 2.0) && (hue > (_7YR70[x] + _55YR70[x]) / 2.0)) { - correction = _7YR70[y] - _7YR70[x] ; - lbe = _7YR70[y]; - correctL = true; - } else if (( hue <= (_7YR70[x] + _55YR70[x]) / 2.0) && (hue > (_55YR70[x] + _4YR70[x]) / 2.0)) { - correction = _55YR70[y] - _55YR70[x] ; - lbe = _55YR70[y]; - correctL = true; - } else if (( hue <= (_55YR70[x] + _4YR70[x]) / 2.0) && (hue > (_4YR70[x] + _25YR70[x]) / 2.0)) { - correction = _4YR70[y] - _4YR70[x] ; - lbe = _4YR70[y]; - correctL = true; - } else if (( hue <= (_4YR70[x] + _25YR70[x]) / 2.0) && (hue > (_25YR70[x] + _10R70[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _25YR70[y] - _25YR70[x] ; - lbe = _25YR70[y]; - correctL = true; - } else if (( hue <= (_25YR70[x] + _10R70[x]) / 2.0) && (hue > (_10R70[x] + _9R70[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10R70[y] - _10R70[x] ; - lbe = _10R70[y]; - correctL = true; - } else if (( hue <= (_10R70[x] + _9R70[x]) / 2.0) && (hue > (_9R70[x] + _7R70[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _9R70[y] - _9R70[x] ; - lbe = _9R70[y] ; - correctL = true; - } else if (( hue <= (_9R70[x] + _7R70[x]) / 2.0) && (hue > (_7R70[x] - 0.035)) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7R70[y] - _7R70[x] ; - lbe = _7R70[y]; - correctL = true; - } - } else if (lum < 85.0) { - if( (hue <= (_10YR80[x] + 0.035)) && (hue > (_10YR80[x] + _85YR80[x]) / 2.0)) { - correction = _10YR80[y] - _10YR80[x] ; - lbe = _10YR80[y]; - correctL = true; - } else if( (hue <= (_10YR80[x] + _85YR80[x]) / 2.0) && (hue > (_85YR80[x] + _7YR80[x]) / 2.0)) { - correction = _85YR80[y] - _85YR80[x] ; - lbe = _85YR80[y]; - } else if (( hue <= (_85YR80[x] + _7YR80[x]) / 2.0) && (hue > (_7YR80[x] + _55YR80[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _7YR80[y] - _7YR80[x] ; - lbe = _7YR80[y]; - correctL = true; - } else if (( hue <= (_7YR80[x] + _55YR80[x]) / 2.0) && (hue > (_55YR80[x] + _4YR80[x]) / 2.0) && x < 45) { - correction = _55YR80[y] - _55YR80[x] ; - lbe = _55YR80[y]; - correctL = true; - } else if (( hue <= (_55YR80[x] + _4YR80[x]) / 2.0) && (hue > (_4YR80[x] - 0.035) && x < 45)) { - if(y > 49) { - y = 49; - } - - correction = _4YR80[y] - _4YR80[x] ; - lbe = _4YR80[y] ; - correctL = true; - } - } else if (lum < 95.0) { - if( (hue <= (_10YR90[x] + 0.035)) && (hue > (_10YR90[x] - 0.035) && x < 85)) { - if(y > 89) { - y = 89; - } - - correction = _10YR90[y] - _10YR90[x] ; - lbe = _10YR90[y]; - correctL = true; - } else if ( hue <= (_85YR90[x] + 0.035) && hue > (_85YR90[x] - 0.035) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _85YR90[y] - _85YR90[x] ; - lbe = _85YR90[y]; - correctL = true; - } else if (( hue <= (_55YR90[x] + 0.035) && (hue > (_55YR90[x] - 0.035) && x < 45))) { - if(y > 49) { - y = 49; - } - - correction = _55YR90[y] - _55YR90[x] ; - lbe = _55YR90[y]; - correctL = true; - } - } - } - } - //end red yellow - - //Green yellow correction - else if(zone == 3) { - if (lum >= 25.0) { - if (lum < 35.0) { - if( (hue <= (_7G30[x] + 0.035)) && (hue > (_7G30[x] + _5G30[x]) / 2.0) ) { - correction = _7G30[y] - _7G30[x] ; - lbe = _7G30[y]; - correctL = true; - } else if( (hue <= (_7G30[x] + _5G30[x]) / 2.0) && (hue > (_5G30[x] + _25G30[x]) / 2.0)) { - correction = _5G30[y] - _5G30[x] ; - lbe = _5G30[y]; - correctL = true; - } else if (( hue <= (_25G30[x] + _5G30[x]) / 2.0) && (hue > (_25G30[x] + _1G30[x]) / 2.0)) { - correction = _25G30[y] - _25G30[x] ; - lbe = _25G30[y]; - correctL = true; - } else if (( hue <= (_1G30[x] + _25G30[x]) / 2.0) && (hue > (_1G30[x] + _10GY30[x]) / 2.0)) { - correction = _1G30[y] - _1G30[x] ; - lbe = _1G30[y]; - correctL = true; - } else if (( hue <= (_1G30[x] + _10GY30[x]) / 2.0) && (hue > (_10GY30[x] + _75GY30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10GY30[y] - _10GY30[x] ; - lbe = _10GY30[y]; - correctL = true; - } else if (( hue <= (_10GY30[x] + _75GY30[x]) / 2.0) && (hue > (_75GY30[x] + _5GY30[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _75GY30[y] - _75GY30[x] ; - lbe = _75GY30[y]; - correctL = true; - } else if (( hue <= (_5GY30[x] + _75GY30[x]) / 2.0) && (hue > (_5GY30[x] - 0.035)) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _5GY30[y] - _5GY30[x] ; - lbe = _5GY30[y] ; - correctL = true; - } - } else if (lum < 45.0) { - if( (hue <= (_7G40[x] + 0.035)) && (hue > (_7G40[x] + _5G40[x]) / 2.0) ) { - correction = _7G40[y] - _7G40[x] ; - lbe = _7G40[y]; - correctL = true; - } else if( (hue <= (_7G40[x] + _5G40[x]) / 2.0) && (hue > (_5G40[x] + _25G40[x]) / 2.0)) { - correction = _5G40[y] - _5G40[x] ; - lbe = _5G40[y]; - correctL = true; - } else if (( hue <= (_25G40[x] + _5G40[x]) / 2.0) && (hue > (_25G40[x] + _1G40[x]) / 2.0)) { - correction = _25G40[y] - _25G40[x] ; - lbe = _25G40[y]; - correctL = true; - } else if (( hue <= (_1G40[x] + _25G40[x]) / 2.0) && (hue > (_1G40[x] + _10GY40[x]) / 2.0)) { - correction = _1G40[y] - _1G40[x] ; - lbe = _1G40[y]; - correctL = true; - } else if (( hue <= (_1G40[x] + _10GY40[x]) / 2.0) && (hue > (_10GY40[x] + _75GY40[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _10GY40[y] - _10GY40[x] ; - lbe = _10GY40[y]; - correctL = true; - } else if (( hue <= (_10GY40[x] + _75GY40[x]) / 2.0) && (hue > (_75GY40[x] + _5GY40[x]) / 2.0) && x < 85) { - if(y > 89) { - y = 89; - } - - correction = _75GY40[y] - _75GY40[x] ; - lbe = _75GY40[y]; - correctL = true; - } else if (( hue <= (_5GY40[x] + _75GY40[x]) / 2.0) && (hue > (_5GY40[x] - 0.035)) && x < 85) { - if(y > 89) { - y = 89; // - } - - correction = _5GY40[y] - _5GY40[x] ; - lbe = _5GY40[y]; - correctL = true; - } - } else if (lum < 55.0) { - if( (hue <= (_7G50[x] + 0.035)) && (hue > (_7G50[x] + _5G50[x]) / 2.0) ) { - correction = _7G50[y] - _7G50[x] ; - lbe = _7G50[y]; - correctL = true; - } else if( (hue <= (_7G50[x] + _5G50[x]) / 2.0) && (hue > (_5G50[x] + _25G50[x]) / 2.0)) { - correction = _5G50[y] - _5G50[x] ; - lbe = _5G50[y]; - correctL = true; - } else if (( hue <= (_25G50[x] + _5G50[x]) / 2.0) && (hue > (_25G50[x] + _1G50[x]) / 2.0)) { - correction = _25G50[y] - _25G50[x] ; - lbe = _25G50[y]; - correctL = true; - } else if (( hue <= (_1G50[x] + _25G50[x]) / 2.0) && (hue > (_1G50[x] + _10GY50[x]) / 2.0)) { - correction = _1G50[y] - _1G50[x] ; - lbe = _1G50[y]; - correctL = true; - } else if (( hue <= (_1G50[x] + _10GY50[x]) / 2.0) && (hue > (_10GY50[x] + _75GY50[x]) / 2.0)) { - correction = _10GY50[y] - _10GY50[x] ; - lbe = _10GY50[y]; - correctL = true; - } else if (( hue <= (_10GY50[x] + _75GY50[x]) / 2.0) && (hue > (_75GY50[x] + _5GY50[x]) / 2.0)) { - correction = _75GY50[y] - _75GY50[x] ; - lbe = _75GY50[y]; - correctL = true; - } else if (( hue <= (_5GY50[x] + _75GY50[x]) / 2.0) && (hue > (_5GY50[x] - 0.035))) { - correction = _5GY50[y] - _5GY50[x] ; - lbe = _5GY50[y]; - correctL = true; - } - } else if (lum < 65.0) { - if( (hue <= (_7G60[x] + 0.035)) && (hue > (_7G60[x] + _5G60[x]) / 2.0) ) { - correction = _7G60[y] - _7G60[x] ; - lbe = _7G60[y]; - correctL = true; - } else if( (hue <= (_7G60[x] + _5G60[x]) / 2.0) && (hue > (_5G60[x] + _25G60[x]) / 2.0)) { - correction = _5G60[y] - _5G60[x] ; - lbe = _5G60[y]; - correctL = true; - } else if (( hue <= (_25G60[x] + _5G60[x]) / 2.0) && (hue > (_25G60[x] + _1G60[x]) / 2.0)) { - correction = _25G60[y] - _25G60[x] ; - lbe = _25G60[y]; - correctL = true; - } else if (( hue <= (_1G60[x] + _25G60[x]) / 2.0) && (hue > (_1G60[x] + _10GY60[x]) / 2.0)) { - correction = _1G60[y] - _1G60[x] ; - lbe = _1G60[y]; - correctL = true; - } else if (( hue <= (_1G60[x] + _10GY60[x]) / 2.0) && (hue > (_10GY60[x] + _75GY60[x]) / 2.0)) { - correction = _10GY60[y] - _10GY60[x] ; - lbe = _10GY60[y]; - correctL = true; - } else if (( hue <= (_10GY60[x] + _75GY60[x]) / 2.0) && (hue > (_75GY60[x] + _5GY60[x]) / 2.0)) { - correction = _75GY60[y] - _75GY60[x] ; - lbe = _75GY60[y] ; - correctL = true; - } else if (( hue <= (_5GY60[x] + _75GY60[x]) / 2.0) && (hue > (_5GY60[x] - 0.035))) { - correction = _5GY60[y] - _5GY60[x] ; - lbe = _5GY60[y]; - correctL = true; - } - } else if (lum < 75.0) { - if( (hue <= (_7G70[x] + 0.035)) && (hue > (_7G70[x] + _5G70[x]) / 2.0) ) { - correction = _7G70[y] - _7G70[x] ; - lbe = _7G70[y]; - correctL = true; - } else if( (hue <= (_7G70[x] + _5G70[x]) / 2.0) && (hue > (_5G70[x] + _25G70[x]) / 2.0)) { - correction = _5G70[y] - _5G70[x] ; - lbe = _5G70[y]; - correctL = true; - } else if (( hue <= (_25G70[x] + _5G70[x]) / 2.0) && (hue > (_25G70[x] + _1G70[x]) / 2.0)) { - correction = _25G70[y] - _25G70[x] ; - lbe = _25G70[y]; - correctL = true; - } else if (( hue <= (_1G70[x] + _25G70[x]) / 2.0) && (hue > (_1G70[x] + _10GY70[x]) / 2.0)) { - correction = _1G70[y] - _1G70[x] ; - lbe = _1G70[y] ; - correctL = true; - } else if (( hue <= (_1G70[x] + _10GY70[x]) / 2.0) && (hue > (_10GY70[x] + _75GY70[x]) / 2.0)) { - correction = _10GY70[y] - _10GY70[x] ; - lbe = _10GY70[y]; - correctL = true; - } else if (( hue <= (_10GY70[x] + _75GY70[x]) / 2.0) && (hue > (_75GY70[x] + _5GY70[x]) / 2.0)) { - correction = _75GY70[y] - _75GY70[x] ; - lbe = _75GY70[y]; - correctL = true; - } else if (( hue <= (_5GY70[x] + _75GY70[x]) / 2.0) && (hue > (_5GY70[x] - 0.035))) { - correction = _5GY70[y] - _5GY70[x] ; - lbe = _5GY70[y]; - correctL = true; - } - } else if (lum < 85.0) { - if( (hue <= (_7G80[x] + 0.035)) && (hue > (_7G80[x] + _5G80[x]) / 2.0) ) { - correction = _7G80[y] - _7G80[x] ; - lbe = _7G80[y]; - correctL = true; - } else if( (hue <= (_7G80[x] + _5G80[x]) / 2.0) && (hue > (_5G80[x] + _25G80[x]) / 2.0)) { - correction = _5G80[y] - _5G80[x] ; - lbe = _5G80[y]; - correctL = true; - } else if (( hue <= (_25G80[x] + _5G80[x]) / 2.0) && (hue > (_25G80[x] + _1G80[x]) / 2.0)) { - correction = _25G80[y] - _25G80[x] ; - lbe = _25G80[y]; - correctL = true; - } else if (( hue <= (_1G80[x] + _25G80[x]) / 2.0) && (hue > (_1G80[x] + _10GY80[x]) / 2.0)) { - correction = _1G80[y] - _1G80[x] ; - lbe = _1G80[y]; - correctL = true; - } else if (( hue <= (_1G80[x] + _10GY80[x]) / 2.0) && (hue > (_10GY80[x] + _75GY80[x]) / 2.0)) { - correction = _10GY80[y] - _10GY80[x] ; - lbe = _10GY80[y]; - correctL = true; - } else if (( hue <= (_10GY80[x] + _75GY80[x]) / 2.0) && (hue > (_75GY80[x] + _5GY80[x]) / 2.0)) { - correction = _75GY80[y] - _75GY80[x] ; - lbe = _75GY80[y]; - correctL = true; - } else if (( hue <= (_5GY80[x] + _75GY80[x]) / 2.0) && (hue > (_5GY80[x] - 0.035))) { - correction = _5GY80[y] - _5GY80[x] ; - lbe = _5GY80[y]; - correctL = true; - } - } - } - } - //end green yellow - - //Red purple correction : only for L < 30 - else if(zone == 4) { - if (lum > 5.0) { - if (lum < 15.0) { - if( (hue <= (_5R10[x] + 0.035)) && (hue > (_5R10[x] - 0.043)) && x < 45) { - if(y > 44) { - y = 44; - } - - correction = _5R10[y] - _5R10[x] ; - lbe = _5R10[y]; - correctL = true; - } else if( (hue <= (_25R10[x] + 0.043)) && (hue > (_25R10[x] + _10RP10[x]) / 2.0) && x < 45 ) { - if(y > 44) { - y = 44; - } - - correction = _25R10[y] - _25R10[x] ; - lbe = _25R10[y]; - correctL = true; - } else if ( (hue <= (_25R10[x] + _10RP10[x]) / 2.0) && (hue > (_10RP10[x] - 0.035) ) && x < 45) { - if(y > 44) { - y = 44; - } - - correction = _10RP10[y] - _10RP10[x] ; - lbe = _10RP10[y]; - correctL = true; - } - } else if (lum < 25.0) { - if( (hue <= (_5R20[x] + 0.035)) && (hue > (_5R20[x] + _25R20[x]) / 2.0) && x < 70 ) { - if(y > 70) { - y = 70; - } - - correction = _5R20[y] - _5R20[x] ; - lbe = _5R20[y]; - correctL = true; - } else if( (hue <= (_5R20[x] + _25R20[x]) / 2.0) && (hue > (_10RP20[x] + _25R20[x]) / 2.0) && x < 70) { - if(y > 70) { - y = 70; - } - - correction = _25R20[y] - _25R20[x] ; - lbe = _25R20[y]; - correctL = true; - } else if (( hue <= (_10RP20[x] + _25R20[x]) / 2.0) && (hue > (_10RP20[x] - 0.035)) && x < 70) { - if(y > 70) { - y = 70; - } - - correction = _10RP20[y] - _10RP20[x] ; - lbe = _10RP20[y]; - correctL = true; - } - } else if (lum < 35.0) { - if( (hue <= (_5R30[x] + 0.035)) && (hue > (_5R30[x] + _25R30[x]) / 2.0) && x < 85 ) { - if(y > 85) { - y = 85; - } - - correction = _5R30[y] - _5R30[x] ; - lbe = _5R30[y]; - correctL = true; - } else if( (hue <= (_5R30[x] + _25R30[x]) / 2.0) && (hue > (_10RP30[x] + _25R30[x]) / 2.0) && x < 85) { - if(y > 85) { - y = 85; - } - - correction = _25R30[y] - _25R30[x] ; - lbe = _25R30[y]; - correctL = true; - } else if (( hue <= (_10RP30[x] + _25R30[x]) / 2.0) && (hue > (_10RP30[x] - 0.035)) && x < 85) { - if(y > 85) { - y = 85; - } - - correction = _10RP30[y] - _10RP30[x] ; - lbe = _10RP30[y]; - correctL = true; - } - } - } - } - - //end red purple -} - - /* * SkinSat * Copyright (c)2011 Jacques Desmis @@ -4477,11 +2904,6 @@ void Color::SkinSat (float lum, float hue, float chrom, float &satreduc) */ void Color::initMunsell () { -#ifdef _DEBUG - MyTime t1e, t2e; - t1e.set(); -#endif - const int maxInd = 140; const int maxInd2 = 90; const int maxInd3 = 50; @@ -7082,14 +5504,6 @@ void Color::initMunsell () //printf("5GY %1.2f %1.2f %1.2f\n",_5GY80[44],_5GY80[84],_5GY80[125] ); -#ifdef _DEBUG - t2e.set(); - - if (settings->verbose) { - printf("Lutf Munsell %d usec\n", t2e.etime(t1e)); - } - -#endif } } diff --git a/rtengine/color.h b/rtengine/color.h index 211615de1..3622a9e36 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -20,38 +20,22 @@ #pragma once #include -#include #include "rt_math.h" #include "LUT.h" -#include "iccmatrices.h" #include "lcms2.h" #include "sleef.h" -#define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c) +namespace Glib +{ +class ustring; +} namespace rtengine { typedef std::array GammaValues; -#ifdef _DEBUG - -class MunsellDebugInfo -{ -public: - float maxdhuelum[4]; - float maxdhue[4]; - unsigned int depass; - unsigned int depassLum; - - MunsellDebugInfo(); - void reinitValues(); -}; - -#endif - - class Color { @@ -100,7 +84,6 @@ private: #endif static float computeXYZ2Lab(float f); - static float computeXYZ2LabY(float f); public: @@ -132,7 +115,7 @@ public: 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 eps_max = MAXVALD * 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; @@ -144,9 +127,10 @@ public: 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 u0 = 4.0 * static_cast(D50x) / (static_cast(D50x) + 15 + 3 * static_cast(D50z)); + constexpr static double v0 = 9.0 / (static_cast(D50x) + 15 + 3 * static_cast(D50z)); constexpr static double epskap = 8.0; + constexpr static float epskapf = epskap; constexpr static float c1By116 = 1.0 / 116.0; constexpr static float c16By116 = 16.0 / 116.0; @@ -161,12 +145,15 @@ public: static LUTf igammatab_srgb; static LUTf igammatab_srgb1; static LUTf gammatab_srgb; + static LUTf gammatab_srgb327; static LUTf gammatab_srgb1; + static LUTf gammatab_bt709; static LUTf denoiseGammaTab; static LUTf denoiseIGammaTab; static LUTf igammatab_24_17; + static LUTf igammatab_bt709; static LUTf gammatab_24_17a; static LUTf gammatab_13_2; static LUTf igammatab_13_2; @@ -183,6 +170,16 @@ public: static void init (); static void cleanup (); + static inline float computeXYZ2LabY(float f) + { + if (f < 0.f) { + return 327.68f * (kappa * f / MAXVALF); + } else if (f > 65535.f) { + return 327.68f * (116.f * xcbrtf(f / MAXVALF) - 16.f); + } else { + return cachefy[f]; + } + } /** * @brief Extract luminance "sRGB" from red/green/blue values @@ -206,7 +203,12 @@ public: 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]; + return static_cast(r) * workingspace[1][0] + static_cast(g) * workingspace[1][1] + static_cast(b) * workingspace[1][2]; + } + + static float rgbLuminance(float r, float g, float b, const float workingspace[3]) + { + return r * workingspace[0] + g * workingspace[1] + b * workingspace[2]; } #ifdef __SSE2__ @@ -573,9 +575,20 @@ public: */ static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const double rgb_xyz[3][3]); static void xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][3]); - static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]); + static inline void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]) + { + r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; + g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; + b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; + } + #ifdef __SSE2__ - static void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]); + static inline void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]) + { + r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; + g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ; + b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; + } #endif @@ -591,6 +604,7 @@ public: * @param xyz_rgb[3][3] transformation matrix to use for the conversion */ static void rgbxyz (float r, float g, float b, float &x, float &y, float &z, const double xyz_rgb[3][3]); + static void rgbxyY(float r, float g, float b, float &x, float &y, float &Y, const float xyz_rgb[3][3]); static void rgbxyz (float r, float g, float b, float &x, float &y, float &z, const float xyz_rgb[3][3]); #ifdef __SSE2__ static void rgbxyz (vfloat r, vfloat g, vfloat b, vfloat &x, vfloat &y, vfloat &z, const vfloat xyz_rgb[3][3]); @@ -605,11 +619,40 @@ public: * @param y Y coordinate [0 ; 65535] ; can be negative! (return value) * @param z Z coordinate [0 ; 65535] ; can be negative! (return value) */ - static void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z); + static inline void 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 = (c1By116 * LL) + c16By116; // (L+16)/116 + float fx = (0.002f * aa) + fy; + float fz = fy - (0.005f * bb); + x = 65535.f * f2xyz(fx) * D50x; + z = 65535.f * f2xyz(fz) * D50z; + y = (LL > epskapf) ? 65535.f * fy * fy * fy : 65535.f * LL / kappaf; + } + static void L2XYZ(float L, float &x, float &y, float &z); + static float L2Y(float L); #ifdef __SSE2__ - static void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z); +static inline void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z) +{ + vfloat c327d68 = F2V(327.68f); + L /= c327d68; + a /= c327d68; + b /= c327d68; + 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); + x = c65535 * f2xyz(fx) * F2V(D50x); + z = c65535 * f2xyz(fz) * F2V(D50z); + vfloat res1 = fy * fy * fy; + vfloat res2 = L / F2V(kappa); + y = vself(vmaskf_gt(L, F2V(epskap)), res1, res2); + y *= c65535; +} #endif // __SSE2__ /** @@ -624,7 +667,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 Lab2RGBLimit(float *L, float *a, float *b, float *R, float *G, float *B, const float wp[3][3], float limit, float afactor, float bfactor, int width); - static void RGB2L(float *X, float *Y, float *Z, float *L, const float wp[3][3], int width); + static void RGB2L(const float *R, const float *G, const float *B, float *L, const float wp[3][3], int width); /** * @brief Convert Lab in Yuv @@ -972,10 +1015,10 @@ public: template static inline T interpolatePolarHue_PI (T h1, T h2, U balance) { - float d = h2 - h1; - float f; + T d = h2 - h1; + T f; f = T(balance); - double h; + T h; if (h1 > h2) { std::swap(h1, h2); @@ -986,7 +1029,7 @@ public: if (d < T(0) || d < T(0.5) || d > T(1.)) { //there was an inversion here !! d > T(rtengine::RT_PI) h1 += T(1.); h = h1 + f * (h2 - h1); - h = std::fmod(h, 1.); + h = std::fmod(h, T(1.)); } else { h = h1 + f * d; } @@ -1007,8 +1050,6 @@ public: * @brief Get the gamma curves' parameters used by LCMS2 * @param pwr gamma value [>1] * @param ts slope [0 ; 20] - * @param mode [always 0] - * @imax imax [always 0] * @param gamma a pointer to an array of 6 double gamma values: * gamma0 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value) * gamma1 used in ip2Lab2rgb [0 ; 20], can be superior to 20, but it's quite unusual(return value) @@ -1017,7 +1058,7 @@ public: * gamma4 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value) * gamma5 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value) */ - static void calcGamma (double pwr, double ts, int mode, GammaValues &gamma); + static void calcGamma (double pwr, double ts, GammaValues &gamma); /** @@ -1137,23 +1178,25 @@ public: } - /* +/* * @brief Get the gamma value for Gamma=2.2 Slope=4.5 * @param x red, green or blue channel's value [0 ; 1] * @return the gamma modified's value [0 ; 1] * +*/ static inline double gamma709 (double x) { return x <= 0.0176 ? x*4.5 : 1.0954*exp(log(x)/2.2)-0.0954; } - +/* * @brief Get the inverse gamma value for Gamma=2.2 Slope=4.5 * @param x red, green or blue channel's value [0 ; 1] * @return the inverse gamma modified's value [0 ; 1] * +*/ static inline double igamma709 (double x) { return x <= 0.0795 ? x/4.5 : exp(log((x+0.0954)/1.0954)*2.2); } - */ + @@ -1377,11 +1420,7 @@ public: * @param munsDbgInfo (Debug target only) object to collect information */ -#ifdef _DEBUG - static void AllMunsellLch (bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHueChroma, float &correctlum, MunsellDebugInfo* munsDbgInfo); -#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); @@ -1406,15 +1445,9 @@ public: * @param neg (Debug target only) to calculate iterations for negatives values * @param moreRGB (Debug target only) to calculate iterations for values >65535 */ -#ifdef _DEBUG - static void gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb); - static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb); - static void gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb); -#else static void gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef); static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef); static void gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef); -#endif static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &saturation, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef); @@ -1477,9 +1510,58 @@ public: static void scalered ( float rstprotection, float param, float limit, float HH, float deltaHH, float &scale, float &scaleext); static void transitred (float HH, float Chprov1, float dred, float factorskin, float protect_red, float factorskinext, float deltaHH, float factorsat, float &factor); - static void skinred ( double J, double h, double sres, double Sp, float dred, float protect_red, int sk, float rstprotection, float ko, double &s); static void skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s); -// static void scaleredcdbl ( float skinprot, float param, float limit, float HH, float deltaHH, float &scale,float &scaleext); + + static inline void pregamutlab(float lum, float hue, float &chr) //big approximation to limit gamut (Prophoto) before good gamut procedure for locallab chroma, to avoid crash + { + if (lum >= 95.0f) { + if (hue > 1.5f && hue < 2.f) { + chr = 120.f; + } else if (hue > 0.7f && hue <= 1.5f) { + chr = 60.f; + } else { + chr = 40.f; + } + } else if (lum > 75.f) { + if (hue > 1.f && hue < 3.14f) { + chr = 130.f; + } else if (hue > -0.4f && hue <= 1.f) { + chr = 80.f; + } else if (hue > -3.15f && hue < -2.f) { + chr = 80.f; + } else { + chr = 60.f; + } + + } else if (lum > 35.f) { + chr = 100.f; + } else if (lum > 20.f) { + if (hue < -1.f && hue > -2.f) { + chr = 120.f; + } else { + chr = 80.f; + } + } else if (lum > 7.f) { + if (hue < -1.f && hue > -1.8f) { + chr = 120.f; + } else { + chr = 60.f; + } + + } else { + if (hue < -1.f && hue > -1.6f) { + chr = 80.f; + } else { + chr = 40.f; + } + + } + + // if(lum < 4.f) { + // chr = 0.1f; + // } + } + static inline void SkinSatCbdl (float lum, float hue, float chrom, float skinprot, float &scale, bool neg, float b_l, float t_l, float t_r) { @@ -1759,12 +1841,19 @@ public: /** * @brief Gamut correction in the XYZ color space * @param X X channel input value and corrected output value [0 ; 65535] - * @param Y Y channel input value and corrected output value [0 ; 65535] + * @param Y Y channel input value[0 ; 65535] * @param Z Z channel input value and corrected output value [0 ; 65535] * @param p working profile */ - static void gamutmap(float &X, float &Y, float &Z, const double p[3][3]); + static void gamutmap(float &X, float Y, float &Z, const double p[3][3]); + /** + * @brief Convert primaries in XYZ values in function of illuminant + * @param p primaries red, gree, blue + * @param Wx Wy white for illuminant + * @param pxyz return matrix XYZ + */ + static void primaries_to_xyz (double p[6], double Wx, double Wz, double *pxyz); /** * @brief Get HSV's hue from the Lab's hue @@ -1797,7 +1886,6 @@ public: } else if (HH >= -0.1f && HH < 0.f ) { hr = 0.1 * double(HH) + 0.93; //hr 0.92 0.93 red } - // in case of ! if (hr < 0.0) { hr += 1.0; @@ -1808,6 +1896,59 @@ public: return (hr); } + static inline double huejz_to_huehsv2 (float HH) + { + //hr=translate Hue Jz value (-Pi +Pi) in approximative hr (hsv values) (0 1) + // with multi linear correspondences (I expect another time with Jz there is no error !!) + double hr = 0.0; + //always put h between 0 and 1 + // make with my chart 468 colors... + // HH ==> Hz value ; hr HSv value + if (HH >= 0.2f && HH < 0.75f) { + hr = 0.12727273 * double(HH) + 0.90454551;//hr 0.93 1.00 full red + } else if (HH >= 0.75f && HH < 1.35f) { + hr = 0.15 * double(HH) - 0.1125;//hr 0.00 0.09 red yellow orange + } else if (HH >= 1.35f && HH < 1.85f) { + hr = 0.32 * double(HH) - 0.342; //hr 0.09 0.25 orange yellow + } else if (HH >= 1.85f && HH < 2.46f) { + hr = 0.23442623 * double(HH) -0.18368853;//hr 0.25 0.393 yellow green green + } else if (HH >= 2.46f && HH < 3.14159f) { + hr = 0.177526 * double(HH) -0.043714;//hr 0.393 0.51315 green ==> 0.42 Lab + } else if (HH >= -3.14159f && HH < -2.89f) { + hr = 0.3009078 * double(HH) + 1.459329;//hr 0.51315 0.5897 green cyan ==> -2.30 Lab + } else if (HH >= -2.89f && HH < -2.7f) { + hr = 0.204542 * double(HH) + 1.1808264;//hr 0.5897 0.628563 cyan + } else if (HH >= -2.7f && HH < -2.17f) { + hr = 0.121547 * double(HH) + 0.956399;//hr 0.628563 0.692642 blue blue-sky + } else if (HH >= -2.17f && HH < -0.9f) { + hr = 0.044882 * double(HH) + 0.789901;//hr 0.692642 0.749563 blue blue-sky + } else if (HH >= -0.9f && HH < -0.1f) { + hr = 0.2125 * double(HH) + 0.940813;//hr 0.749563 0.919563 purple magenta + } else if (HH >= -0.1f && HH < 0.2f) { + hr = 0.03479 * double(HH) + 0.923042;//hr 0.919563 0.93 red + } + // in case of ! + if (hr < 0.0) { + hr += 1.0; + } else if(hr > 1.0) { + hr -= 1.0; + } + + return (hr); + } + +// HSV 0.93 1.0 red - Lab 0.0 0.6 Jz 0.20 0.75 +// HSV 0.00 0.9 red orange - Lab 0.6 1.4 Jz 0.50 1.35 +// HSV 0.09 0.25 oran - yellow - Lab 1.4 2.0 Jz 1.35 1.85 +// HSV 0.25 0.39 yellow - gree - Lab 2.0 3.0 Jz 1.85 2.40 +// HSV 0.39 0.50 green - cyan Lab 3.0 -2.8 Jz 2.40 3.10 +// HSV 0.50 0.58 cyan Lab-2.8 -2.3 Jz 3.10 -2.90 +// HSV 0.58 0.69 blue - sky Lab-2.3 -1.3 Jz -2.90 -2.17 +// HSV 0.69 0.75 blue - Lab-1.3 -0.9 Jz -2.17 -0.90 +// HSV 0.75 0.92 purple - Lab-0.9 -0.1 Jz -0.9 -0.10 +// HSV 0.92 0.93 magenta Lab-0.1 0.0 Jz -0.1 0.20 + + static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, int W) { int i = 0; #ifdef __SSE2__ diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 02d3e0e6d..756fdf906 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -27,11 +27,13 @@ #include #include "sleef.h" #include "settings.h" +#include "iccstore.h" + namespace rtengine { -static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer. +static const color_match_type cie_colour_match_jd2 = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer. {0.0000000, 0.000000, 0.000000}, {0.0000000, 0.000000, 0.000000}, {0.0001299, 0.0003917, 0.0006061}, {0.0002321, 0.000006965, 0.001086}, {0.0004149, 0.00001239, 0.001946}, {0.0007416, 0.00002202, 0.003846}, {0.001368, 0.000039, 0.006450001}, {0.002236, 0.000064, 0.01054999}, {0.004243, 0.000120, 0.02005001}, @@ -67,7 +69,109 @@ static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desm {0.000001251141, 0.00000045181, 0.000000} }; -ColorTemp::ColorTemp (double t, double g, double e, const std::string &m) : temp(t), green(g), equal(e), method(m) + +static const color_match_type cie_colour_match_jd = {//350nm to 830nm 5 nm J.Desmis 10° Standard Observer. +{0.000000000000, 0.000000000000, 0.000000000000}, +{0.000000000000, 0.000000000000, 0.000000000000}, +{0.000000122200, 0.000000013398, 0.000000535027}, +{0.000000919270, 0.000000100650, 0.000004028300}, +{0.000005958600, 0.000000651100, 0.000026143700}, +{0.000033266000, 0.000003625000, 0.000146220000}, +{0.000159952000, 0.000017364000, 0.000704776000}, +{0.000662440000, 0.000071560000, 0.002927800000}, +{0.002361600000, 0.000253400000, 0.010482200000}, +{0.007242300000, 0.000768500000, 0.032344000000}, +{0.019109700000, 0.002004400000, 0.086010900000}, +{0.043400000000, 0.004509000000, 0.197120000000}, +{0.084736000000, 0.008756000000, 0.389366000000}, +{0.140638000000, 0.014456000000, 0.656760000000}, +{0.204492000000, 0.021391000000, 0.972542000000}, +{0.264737000000, 0.029497000000, 1.282500000000}, +{0.314679000000, 0.038676000000, 1.553480000000}, +{0.357719000000, 0.049602000000, 1.798500000000}, +{0.383734000000, 0.062077000000, 1.967280000000}, +{0.386726000000, 0.074704000000, 2.027300000000}, +{0.370702000000, 0.089456000000, 1.994800000000}, +{0.342957000000, 0.106256000000, 1.900700000000}, +{0.302273000000, 0.128201000000, 1.745370000000}, +{0.254085000000, 0.152761000000, 1.554900000000}, +{0.195618000000, 0.185190000000, 1.317560000000}, +{0.132349000000, 0.219940000000, 1.030200000000}, +{0.080507000000, 0.253589000000, 0.772125000000}, +{0.041072000000, 0.297665000000, 0.570060000000}, +{0.016172000000, 0.339133000000, 0.415254000000}, +{0.005132000000, 0.395379000000, 0.302356000000}, +{0.003816000000, 0.460777000000, 0.218502000000}, +{0.015444000000, 0.531360000000, 0.159249000000}, +{0.037465000000, 0.606741000000, 0.112044000000}, +{0.071358000000, 0.685660000000, 0.082248000000}, +{0.117749000000, 0.761757000000, 0.060709000000}, +{0.172953000000, 0.823330000000, 0.043050000000}, +{0.236491000000, 0.875211000000, 0.030451000000}, +{0.304213000000, 0.923810000000, 0.020584000000}, +{0.376772000000, 0.961988000000, 0.013676000000}, +{0.451584000000, 0.982200000000, 0.007918000000}, +{0.529826000000, 0.991761000000, 0.003988000000}, +{0.616053000000, 0.999110000000, 0.001091000000}, +{0.793832000000, 0.982380000000, 0.000000000000}, +{0.878655000000, 0.955552000000, 0.000000000000}, +{0.951162000000, 0.915175000000, 0.000000000000}, +{1.014160000000, 0.868934000000, 0.000000000000}, +{1.074300000000, 0.825623000000, 0.000000000000}, +{1.118520000000, 0.777405000000, 0.000000000000}, +{1.134300000000, 0.720353000000, 0.000000000000}, +{1.123990000000, 0.658341000000, 0.000000000000}, +{1.089100000000, 0.593878000000, 0.000000000000}, +{1.030480000000, 0.527963000000, 0.000000000000}, +{0.950740000000, 0.461834000000, 0.000000000000}, +{0.856297000000, 0.398057000000, 0.000000000000}, +{0.754930000000, 0.339554000000, 0.000000000000}, +{0.647467000000, 0.283493000000, 0.000000000000}, +{0.535110000000, 0.228254000000, 0.000000000000}, +{0.431567000000, 0.179828000000, 0.000000000000}, +{0.343690000000, 0.140211000000, 0.000000000000}, +{0.268329000000, 0.107633000000, 0.000000000000}, +{0.204300000000, 0.081187000000, 0.000000000000}, +{0.152568000000, 0.060281000000, 0.000000000000}, +{0.112210000000, 0.044096000000, 0.000000000000}, +{0.081260600000, 0.031800400000, 0.000000000000}, +{0.057930000000, 0.022601700000, 0.000000000000}, +{0.040850800000, 0.015905100000, 0.000000000000}, +{0.028623000000, 0.011130300000, 0.000000000000}, +{0.019941300000, 0.007748800000, 0.000000000000}, +{0.013842000000, 0.005375100000, 0.000000000000}, +{0.009576880000, 0.003717740000, 0.000000000000}, +{0.006605200000, 0.002564560000, 0.000000000000}, +{0.004552630000, 0.001768470000, 0.000000000000}, +{0.003144700000, 0.001222390000, 0.000000000000}, +{0.002174960000, 0.000846190000, 0.000000000000}, +{0.001505700000, 0.000586440000, 0.000000000000}, +{0.001044760000, 0.000407410000, 0.000000000000}, +{0.000727450000, 0.000284041000, 0.000000000000}, +{0.000508258000, 0.000198730000, 0.000000000000}, +{0.000356380000, 0.000139550000, 0.000000000000}, +{0.000250969000, 0.000098428000, 0.000000000000}, +{0.000177730000, 0.000069819000, 0.000000000000}, +{0.000126390000, 0.000049737000, 0.000000000000}, +{0.000090151000, 0.000035540500, 0.000000000000}, +{0.000064525800, 0.000025486000, 0.000000000000}, +{0.000046339000, 0.000018338400, 0.000000000000}, +{0.000033411700, 0.000013249000, 0.000000000000}, +{0.000024209000, 0.000009619600, 0.000000000000}, +{0.000017611500, 0.000007012800, 0.000000000000}, +{0.000012855000, 0.000005129800, 0.000000000000}, +{0.000009413630, 0.000003764730, 0.000000000000}, +{0.000006913000, 0.000002770810, 0.000000000000}, +{0.000005093470, 0.000002046130, 0.000000000000}, +{0.000003767100, 0.000001516770, 0.000000000000}, +{0.000002795310, 0.000001128090, 0.000000000000}, +{0.000002082000, 0.000000842160, 0.000000000000}, +{0.000001553140, 0.000000629700, 0.000000000000} +}; + + + +ColorTemp::ColorTemp (double t, double g, double e, const std::string &m, StandardObserver o) : temp(t), green(g), equal(e), method(m), observer(o) { clip (temp, green, equal); } @@ -85,12 +189,24 @@ void ColorTemp::clip (double &temp, double &green, double &equal) equal = rtengine::LIM(equal, MINEQUAL, MAXEQUAL); } -ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e), method("Custom") +ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e, StandardObserver observer) : equal(e), method("Custom"), observer(observer) { - mul2temp (mulr, mulg, mulb, equal, temp, green); + mul2temp (mulr, mulg, mulb, equal, observer, temp, green); } -void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const +ColorTemp ColorTemp::convertObserver(StandardObserver observer) const +{ + if (observer == this->observer) { + return *this; + } + double r; + double g; + double b; + getMultipliers(r, g, b); + return ColorTemp(r, g, b, equal, observer); +} + +void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, StandardObserver observer, double& temp, double& green) const { double maxtemp = MAXTEMP, mintemp = MINTEMP; @@ -98,7 +214,7 @@ void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmu temp = (maxtemp + mintemp) / 2; while (maxtemp - mintemp > 1) { - temp2mul (temp, 1.0, equal, tmpr, tmpg, tmpb); + temp2mul (temp, 1.0, equal, observer, tmpr, tmpg, tmpb); if (tmpb / tmpr > bmul / rmul) { maxtemp = temp; @@ -395,6 +511,618 @@ const double ColorTemp::ColorchechGreE2_spect[97] = { 0.4297, 0.4837, 0.5142, 0.5446, 0.5541, 0.5636, 0.5608, 0.5579, 0.5480, 0.5381, 0.5258, 0.5135, 0.4959, 0.4783, 0.4570, 0.4356, 0.4124, 0.3891, 0.3710, 0.3529, 0.3425, 0.3320, 0.3266, 0.3211, 0.3180, 0.3149, 0.3129, 0.3108, 0.3123, 0.3137, 0.3193, 0.3248, 0.3335, 0.3422, 0.3518, 0.3613, 0.3693, 0.3772, 0.3810, 0.3847, 0.3838, 0.3829, 0.3838, 0.3847, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +const double ColorTemp::ColorGreenM25_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0758, 0.0614, 0.0662, 0.0591, 0.0648, 0.0633, 0.0671, 0.0613, 0.0621, 0.0610, 0.0680, 0.0690, 0.0784, 0.0830, 0.0920, 0.1070, 0.1231, 0.1423, 0.1607, 0.1731, 0.1816, 0.1911, 0.1951, 0.1986, 0.1915, 0.1889, + 0.1758, 0.1673, 0.1606, 0.1505, 0.1384, 0.1317, 0.1230, 0.1149, 0.1081, 0.0992, 0.0882, 0.0785, 0.0709, 0.0629, 0.0550, 0.0502, 0.0486, 0.0474, 0.0445, 0.0434, 0.0429, 0.0423, 0.0411, 0.0405, 0.0397, 0.0387, 0.0399, 0.0398, 0.0398, 0.0407, 0.0408, 0.0426, 0.0445, 0.0443, 0.0468, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//0 658 45 0 0 131 98 84 123 104 131 112 121 121 139 128 148 199 296 389 476 689 945 1132 1326 1490 1674 1741 1775 1868 1914 1928 1961 1972 1992 2045 2064 2053 2048 2072 2086 2081 2069 2056 2073 2096 2114 2067 2089 2100 2061 2019 1983 1971 1961 2016 1956 1946 1922 1983 1991 +const double ColorTemp::ColorYellowkeltano_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0658, 0.0045, 0.0, 0.0, 0.0131, 0.0098, 0.0084, 0.0123, 0.0104, 0.0131, 0.0112, 0.0121, 0.0121, 0.0139, + 0.0128, 0.0148, 0.0199, 0.0296, 0.0389, 0.0476, 0.0689, 0.0945, 0.1132, 0.1326, 0.1490, 0.1674, 0.1741, 0.1775, 0.1868, + 0.1914, 0.1928, 0.1961, 0.1972, 0.1992, 0.2045, 0.2064, 0.2053, 0.2048, 0.2072, 0.2086, 0.2081, 0.2069, 0.2056, 0.2073, + 0.2096, 0.2114, 0.2067, 0.2089, 0.2100, 0.2061, 0.2019, 0.1983, 0.1971, 0.1961, 0.2016, 0.1956, 0.1946, 0.1922, 0.1983, 0.1991, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::ColorGreenalsi_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1732, 0.0292, 0.0315, 0.0533, 0.0469, 0.0359, 0.0404, 0.0356, 0.0345, 0.0374, 0.0348, 0.0336, 0.0332, 0.0333, 0.0342, + 0.0330, 0.0350, 0.0343, 0.0354, 0.0371, 0.0399, 0.0426, 0.0497, 0.0541, 0.0616, 0.0701, 0.0750, 0.0764, 0.0783, 0.0794, + 0.0784, 0.0732, 0.0708, 0.0652, 0.0612, 0.0595, 0.0570, 0.0531, 0.0507, 0.0501, 0.0488, 0.0458, 0.0437, 0.0420, 0.0436, + 0.0424, 0.0417, 0.0389, 0.0380, 0.0378, 0.0371, 0.0350, 0.0333, 0.0350, 0.0394, 0.0379, 0.0446, 0.0491, 0.0575, 0.0734, 0.0953, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//1890 1097 855 899 987 881 807 804 787 691 643 549 465 404 385 302 244 195 165 159 123 129 108 111 114 126 126 134 162 170 213 248 279 351 412 566 752 909 1069 1270 1526 +//1707 1858 1999 2112 2293 2422 2471 2611 2718 2710 2778 2807 2825 2856 2909 2901 2974 3042 3044 3075 +const double ColorTemp::ColorRedpetunia_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1890, 0.1097, 0.0855, 0.0899, 0.0987, 0.0881, 0.0807, 0.0804, 0.0787, 0.0691, 0.0643, 0.0549, 0.0465, 0.0404, 0.0385, + 0.0302, 0.0244, 0.0195, 0.0165, 0.0159, 0.0123, 0.0129, 0.0108, 0.0111, 0.0114, 0.0126, 0.0126, 0.0134, 0.0162, 0.0170, + 0.0213, 0.0248, 0.0279, 0.0351, 0.0412, 0.0566, 0.0752, 0.0909, 0.1069, 0.1270, 0.1526, 0.1707, 0.1858, 0.1999, 0.2112, + 0.2293, 0.2422, 0.2471, 0.2611, 0.2718, 0.2710, 0.2778, 0.2807, 0.2825, 0.2856, 0.2909, 0.2901, 0.2974, 0.3042, 0.3044, 0.3075, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.1588 0.1980 0.2789 0.4585 0.6059 0.6609 0.6674 0.6599 0.6551 0.6472 0.6423 0.6485 0.6515 0.6379 0.6193 0.6121 0.6026 0.5678 0.5310 0.5245 0.5305 0.5324 0.5262 0.5219 0.5247 0.5312 0.5436 0.5634 0.5832 0.5943 0.5953 0.5902 0.5805 0.5754 0.5901 0.6262 + +const double ColorTemp::JDC468_B14_75Redspect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1588, 0.1780, 0.1980, 0.2310, 0.2789, 0.3213, 0.4585, 0.5324, 0.6059, 0.6334, 0.6609, 0.6630, 0.6674, 0.6640, 0.6599, 0.6600, 0.6551, 0.6532, 0.6472, 0.6450, + 0.6423, 0.6467, 0.6485, 0.6500, 0.6515, 0.6456, 0.6379, 0.6285, 0.6193, 0.6150, 0.6121, 0.6056, 0.6026, 0.5812, 0.5678, 0.5490, 0.5310, 0.5307, 0.5245, 0.5300, + 0.5305, 0.5310, 0.5324, 0.5298, 0.5262, 0.5230, 0.5219, 0.5231, 0.5247, 0.5280, 0.5312, 0.5364, 0.5436, 0.5550, 0.5634, 0.5731, 0.5832, 0.5901, 0.5943, 0.5950, + 0.5953, 0.5926, 0.5902, 0.5850, 0.5805, 0.5770, 0.5754, 0.6012, 0.6262, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +const double ColorTemp::ColorRedkurttu_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0979, 0.1536, 0.0745, 0.1145, 0.0937, 0.0996, 0.0972, 0.0924, 0.0875, 0.0878, 0.0826, 0.0766, 0.0658, 0.0599, 0.0545, + 0.0509, 0.0443, 0.0381, 0.0356, 0.0327, 0.0318, 0.0304, 0.0295, 0.0288, 0.0285, 0.0271, 0.0281, 0.0282, 0.0278, 0.0280, + 0.0296, 0.0309, 0.0324, 0.0342, 0.0343, 0.0376, 0.0419, 0.0464, 0.0520, 0.0634, 0.0747, 0.0905, 0.1093, 0.1167, 0.1264, + 0.1439, 0.1650, 0.1928, 0.2183, 0.2380, 0.2537, 0.2754, 0.2893, 0.3009, 0.3115, 0.3213, 0.3173, 0.3222, 0.3237, 0.3192, 0.3210, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#light red flower (lupiini) +//1792 1553 1684 1882 1909 1847 2053 2084 2045 2052 2039 2084 2041 2044 2007 1984 1906 1876 1886 1855 1859 1875 1816 1800 1811 1780 1802 1816 1838 1915 1973 2018 2083 2114 2133 2226 2304 2385 2458 2494 2571 2689 2738 2774 2734 2759 2781 2831 2844 2857 2878 2876 2884 2920 2932 2860 2894 2934 2925 2928 2921 +const double ColorTemp::ColorRedlupiini_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1792, 0.1553, 0.1684, 0.1882, 0.1909, 0.1847, 0.2053, 0.2084, 0.2045, 0.2052, 0.2039, 0.2084, 0.2041, 0.2044, 0.2007, 0.1984, 0.1906, 0.1876, + 0.1886, 0.1855, 0.1859, 0.1875, 0.1816, 0.1800, 0.1811, 0.1780, 0.1802, 0.1816, 0.1838, 0.1915, 0.1973, 0.2018, 0.2083, 0.2114, 0.2133, 0.2226, + 0.2304, 0.2385, 0.2458, 0.2494, 0.2571, 0.2689, 0.2738, 0.2774, 0.2734, 0.2759, 0.2781, 0.2831, 0.2844, 0.2857, 0.2878, 0.2876, 0.2884, 0.2920, + 0.2932, 0.2860, 0.2894, 0.2934, 0.2925, 0.2928, 0.2921, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#red flower (hevosminttu) +//1280 706 612 462 391 339 253 285 261 264 239 208 201 186 185 161 156 149 146 148 161 144 143 151 147 146 139 148 173 185 185 197 222 238 283 322 384 439 519 633 792 922 1061 1186 1235 1342 1538 1691 1839 1974 2024 2098 2128 2187 2204 2217 2267 2299 2339 2331 2322 +const double ColorTemp::ColorRedhevosminttu_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1280, 0.0706, 0.0612, 0.0462, 0.0391, 0.0339, 0.0253, 0.0285, 0.0261, 0.0264, 0.0239, 0.0208, 0.0201, 0.0186, 0.0185, 0.0161, 0.0156, 0.0149, + 0.0146, 0.0148, 0.0161, 0.0144, 0.0143, 0.0151, 0.0147, 0.0146, 0.0139, 0.0148, 0.0173, 0.0185, 0.0185, 0.0197, 0.0222, 0.0238, 0.0283, 0.0322, + 0.0384, 0.0439, 0.0519, 0.0633, 0.0792, 0.0922, 0.1061, 0.1186, 0.1235, 0.1342, 0.1538, 0.1691, 0.1839, 0.1974, 0.2024, 0.2098, 0.2128, 0.2187, 0.2204, + 0.2217, 0.2267, 0.2299, 0.2339, 0.2331, 0.2322, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#red flower (neilikka) +//0 0 394 0 245 95 174 149 194 171 181 175 172 167 147 137 107 108 100 87 93 87 83 77 80 67 72 64 83 84 88 90 91 94 114 133 178 241 309 419 612 823 992 1153 1222 1366 1503 1658 1767 1841 1884 1992 2035 2007 2009 2045 2065 2229 2290 2395 2449 +const double ColorTemp::ColorRedneilikka_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0394, 0.0, 0.0245, 0.0095, 0.0174, 0.0149, 0.0194, 0.0171, 0.0181, 0.0175, 0.0172, 0.0167, 0.0147, 0.0137, 0.0107, 0.0108, 0.0100, + 0.0087, 0.0093, 0.0087, 0.0083, 0.0077, 0.0080, 0.0067, 0.0072, 0.0064, 0.0083, 0.0084, 0.0088, 0.0090, 0.0091, 0.0094, 0.0114, 0.0133, + 0.0178, 0.0241, 0.0309, 0.0419, 0.0612, 0.0823, 0.0992, 0.1153, 0.1222, 0.1366, 0.1503, 0.1658, 0.1767, 0.1841, 0.1884, 0.1992, 0.2035, 0.2007, 0.2009, + 0.2045, 0.2065, 0.2229, 0.2290, 0.2395, 0.2449, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red petal (pelargonia) +//2529 2048 2087 2698 2452 2372 2531 2475 2296 2294 2159 2111 1986 1898 1854 1729 1586 1501 1392 1332 1343 1255 1217 1182 1183 1203 1230 1277 1381 1474 1615 1762 1876 2028 2214 2464 2657 2919 3051 3172 3293 3421 3395 3494 3438 3495 3506 3490 3454 3487 3431 3452 3484 3438 3422 3368 3325 3441 3356 3432 3320 +const double ColorTemp::ColorRedpelagornia_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2529, 0.2048, 0.2087, 0.2698, 0.2452, 0.2372, 0.2531, 0.2475, 0.2296, 0.2294, 0.2159, 0.2111, 0.1986, 0.1898, 0.1854, 0.1729, 0.1586, 0.1501, 0.1392, 0.1332, 0.1343, + 0.1255, 0.1217, 0.1182, 0.1183, 0.1203, 0.1230, 0.1277, 0.1381, 0.1474, 0.1615, 0.1762, 0.1876, 0.2028, 0.2214, 0.2464, 0.2657, 0.2919, 0.3051, 0.3172, 0.3293, 0.3421, + 0.3395, 0.3494, 0.3438, 0.3495, 0.3506, 0.3490, 0.3454, 0.3487, 0.3431, 0.3452, 0.3484, 0.3438, 0.3422, 0.3368, 0.3325, 0.3441, 0.3356, 0.3432, 0.3320, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red flower (talvio) +//3131 2199 2559 2540 2844 2530 2694 2765 2594 2673 2617 2629 2491 2384 2308 2256 2081 1973 1857 1752 1719 1652 1527 1477 1459 1386 1341 1283 1318 1334 1354 1424 1495 1543 1634 1773 1950 2129 2272 2431 2642 2827 2941 3045 3082 3158 3216 3307 3364 3388 3387 3517 3573 3501 3499 3523 3495 3606 3493 3518 3522 +const double ColorTemp::ColorRedtalvio_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3131, 0.2199, 0.2559, 0.2540, 0.2844, 0.2530, 0.2694, 0.2765, 0.2594, 0.2673, 0.2617, 0.2629, 0.2491, 0.2384, 0.2308, 0.2256, 0.2081, 0.1973, 0.1857, 0.1752, 0.1719, + 0.1652, 0.1527, 0.1477, 0.1459, 0.1386, 0.1341, 0.1283, 0.1318, 0.1334, 0.1354, 0.1424, 0.1495, 0.1543, 0.1634, 0.1773, 0.1950, 0.2129, 0.2272, 0.2431, 0.2642, 0.2827, + 0.2941, 0.3045, 0.3082, 0.3158, 0.3216, 0.3307, 0.3364, 0.3388, 0.3387, 0.3517, 0.3573, 0.3501, 0.3499, 0.3523, 0.3495, 0.3606, 0.3493, 0.3518, 0.3522, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +//#brown dry leaf (poimulehti) +//964 520 223 244 261 247 196 199 200 207 202 198 209 204 207 222 205 218 213 212 224 218 230 235 251 250 245 250 263 273 271 275 281 264 274 288 287 307 303 307 323 304 335 335 346 345 347 348 370 364 380 393 384 407 419 421 419 433 431 461 465 +//RIs 67 +const double ColorTemp::ColorBrownpoimulehti_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0964, 0.0520, 0.0223, 0.0244, 0.0261, 0.0247, 0.0196, 0.0199, 0.0200, 0.0207, 0.0202, 0.0198, 0.0209, 0.0204, 0.0207, 0.0222, 0.0205, 0.0218, 0.0213, + 0.0212, 0.0224, 0.0218, 0.0230, 0.0235, 0.0251, 0.0250, 0.0245, 0.0250, 0.0263, 0.0273, 0.0271, 0.0275, 0.0281, 0.0264, 0.0274, 0.0288, 0.0287, 0.0307, + 0.0303, 0.0307, 0.0323, 0.0304, 0.0335, 0.0335, 0.0346, 0.0345, 0.0347, 0.0348, 0.0370, 0.0364, 0.0380, 0.0393, 0.0384, 0.0407, + 0.0419, 0.0421, 0.0419, 0.0433, 0.0431, 0.0461, 0.0465, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#orange leaf (koristepensas, tuntematon) +//241 195 223 489 574 565 634 605 574 613 645 636 644 628 621 603 614 654 676 719 776 795 862 879 918 918 955 980 1013 1055 1132 1225 1258 1362 1427 1579 1796 1936 2079 2258 2440 2597 2728 2790 2777 2857 2923 2991 3031 3040 3037 3094 3066 3023 3093 3044 3082 3085 3147 3226 3192 +const double ColorTemp::ColorOrangetuntematon_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0241, 0.0195, 0.0223, 0.0489, 0.0574, 0.0565, 0.0634, 0.0605, 0.0574, 0.0613, 0.0645, 0.0636, 0.0644, 0.0628, 0.0621, 0.0603, 0.0614, 0.0654, 0.0676, + 0.0719, 0.0776, 0.0795, 0.0862, 0.0879, 0.0918, 0.0918, 0.0955, 0.0980, 0.1013, 0.1055, 0.1132, 0.1225, 0.1258, 0.1362, 0.1427, 0.1579, 0.1796, 0.1936, 0.2079, + 0.2258, 0.2440, 0.2597, 0.2728, 0.2790, 0.2777, 0.2857, 0.2923, 0.2991, 0.3031, 0.3040, 0.3037, 0.3094, 0.3066, 0.3023, 0.3093, 0.3044, 0.3082, 0.3085, 0.3147, 0.3226, 0.3192, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//,#orange leaf (lehmus) +//1062 866 443 544 496 485 492 458 450 425 458 477 497 461 451 481 454 500 515 538 529 593 638 670 686 711 718 729 741 760 796 833 895 958 1016 1128 1246 1344 1450 1505 1596 1636 1621 1631 1627 1628 1658 1583 1486 1415 1322 1265 1159 1062 975 974 1063 1326 1736 2141 2568 +const double ColorTemp::ColorOrangetlehmus_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1062, 0.0866, 0.0443, 0.0544, 0.0496, 0.0485, 0.0492, 0.0458, 0.0450, 0.0425, 0.0458, 0.0477, 0.0497, 0.0461, 0.0451, 0.0481, 0.0454, 0.0500, 0.0515, + 0.0538, 0.0529, 0.0593, 0.0638, 0.0670, 0.0686, 0.0711, 0.0718, 0.0729, 0.0741, 0.0760, 0.0796, 0.0833, 0.0895, 0.0958, 0.1016, 0.1128, 0.1246, 0.1344, 0.1450, + 0.1505, 0.1596, 0.1636, 0.1621, 0.1631, 0.1627, 0.1628, 0.1658, 0.1583, 0.1486, 0.1415, 0.1322, 0.1265, 0.1159, 0.1062, 0.0975, 0.0974, 0.1063, 0.1326, 0.1736, 0.2141, 0.2568, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#orange leaf (vaahtera) +//1517 551 664 659 521 585 460 385 424 389 375 374 359 380 371 373 379 387 378 394 405 416 463 496 536 542 577 579 619 642 678 710 777 829 894 1035 1174 1334 1484 1611 1798 1941 2012 2065 2135 2229 2286 2317 2332 2357 2323 2330 2292 2236 2137 2093 2180 2240 2368 2487 2528 +const double ColorTemp::ColorOrangvaahtera_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1517, 0.0551, 0.0664, 0.0659, 0.0521, 0.0585, 0.0460, 0.0385, 0.0424, 0.0389, 0.0375, 0.0374, 0.0359, 0.0380, 0.0371, 0.0373, 0.0379, 0.0387, 0.0378, + 0.0394, 0.0405, 0.0416, 0.0463, 0.0496, 0.0536, 0.0542, 0.0577, 0.0579, 0.0619, 0.0642, 0.0678, 0.0710, 0.0777, 0.0829, 0.0894, 0.1035, 0.1174, 0.1334, 0.1484, + 0.1611, 0.1798, 0.1941, 0.2012, 0.2065, 0.2135, 0.2229, 0.2286, 0.2317, 0.2332, 0.2357, 0.2323, 0.2330, 0.2292, 0.2236, 0.2137, 0.2093, 0.2180, 0.2240, 0.2368, 0.2487, 0.2528, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#brown dry leaf (lehmus) +//758 236 148 430 347 435 438 495 439 454 472 471 461 459 458 479 492 482 499 513 520 545 567 594 623 647 698 717 744 792 803 834 864 876 916 932 963 1013 1025 1060 1099 1118 1153 1175 1207 1242 1268 1266 1284 1305 1305 1304 1353 1360 1330 1332 1413 1502 1610 1682 1737 +const double ColorTemp::ColorBrownlehmus_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0758, 0.0236, 0.0148, 0.0430, 0.0347, 0.0435, 0.0438, 0.0495, 0.0439, 0.0454, 0.0472, 0.0471, 0.0461, 0.0459, 0.0458, 0.0479, 0.0492, 0.0482, 0.0499, 0.0513, + 0.0520, 0.0545, 0.0567, 0.0594, 0.0623, 0.0647, 0.0698, 0.0717, 0.0744, 0.0792, 0.0803, 0.0834, 0.0864, 0.0876, 0.0916, 0.0932, 0.0963, 0.1013, 0.1025, 0.1060, + 0.1099, 0.1118, 0.1153, 0.1175, 0.1207, 0.1242, 0.1268, 0.1266, 0.1284, 0.1305, 0.1305, 0.1304, 0.1353, 0.1360, 0.1330, 0.1332, 0.1413, 0.1502, 0.1610, 0.1682, 0.1737, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#brown moss (nuotiosammal) +//482 260 178 92 104 88 92 40 43 52 58 64 70 63 67 67 62 76 82 82 91 96 104 116 135 141 142 155 168 179 198 199 193 201 212 218 226 240 242 238 255 265 277 266 265 283 289 275 289 277 291 288 277 252 262 260 264 299 375 411 446 +const double ColorTemp::ColorBrownuotiosammal_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0482, 0.0260, 0.0178, 0.0092, 0.0104, 0.0088, 0.0092, 0.0040, 0.0043, 0.0052, 0.0058, 0.0064, 0.0070, 0.0063, 0.0067, 0.0067, 0.0062, 0.0076, 0.0082, 0.0082, 0.0091, 0.0096, + 0.0104, 0.0116, 0.0135, 0.0141, 0.0142, 0.0155, 0.0168, 0.0179, 0.0198, 0.0199, 0.0193, 0.0201, 0.0212, 0.0218, 0.0226, 0.0240, 0.0242, 0.0238, 0.0255, 0.0265, + 0.0277, 0.0266, 0.0265, 0.0283, 0.0289, 0.0275, 0.0289, 0.0277, 0.0291, 0.0288, 0.0277, 0.0252, 0.0262, 0.0260, 0.0264, 0.0299, 0.0375, 0.0411, 0.0446, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#black soil +//0 0 89 122 52 53 104 127 130 134 137 137 134 136 138 139 134 140 142 148 154 153 152 150 151 156 153 166 154 171 163 163 166 166 169 169 166 174 174 170 170 168 176 177 176 174 179 180 180 183 177 193 178 187 194 193 182 196 184 195 195 +const double ColorTemp::ColorBlacksoil_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0089, 0.0122, 0.0052, 0.0053, 0.0104, 0.0127, 0.0130, 0.0134, 0.0137, 0.0137, 0.0134, 0.0136, 0.0138, 0.0139, 0.0134, 0.0140, 0.0142, 0.0148, 0.0154, 0.0153, + 0.0152, 0.0150, 0.0151, 0.0156, 0.0153, 0.0166, 0.0154, 0.0171, 0.0163, 0.0163, 0.0166, 0.0166, 0.0169, 0.0169, 0.0166, 0.0174, 0.0174, 0.0170, 0.0170, 0.0168, 0.0176, 0.0177, + 0.0176, 0.0174, 0.0179, 0.0180, 0.0180, 0.0183, 0.0177, 0.0193, 0.0178, 0.0187, 0.0194, 0.0193, 0.0182, 0.0196, 0.0184, 0.0195, 0.0195, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#black, dry leaf (pihlaja) +//0 79 111 172 174 201 214 211 207 207 191 200 196 206 196 194 203 207 204 208 210 212 211 208 209 219 222 224 231 241 232 244 249 250 267 264 262 269 282 277 289 284 279 302 289 308 313 315 310 325 313 319 356 340 331 347 356 352 364 373 352 +const double ColorTemp::ColorBlackpihlaja[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0079, 0.0111, 0.0172, 0.0174, 0.0201, 0.0214, 0.0211, 0.0207, 0.0207, 0.0191, 0.0200, 0.0196, 0.0206, 0.0196, 0.0194, 0.0203, 0.0207, 0.0204, 0.0208, 0.0210, 0.0212, + 0.0211, 0.0208, 0.0209, 0.0219, 0.0222, 0.0224, 0.0231, 0.0241, 0.0232, 0.0244, 0.0249, 0.0250, 0.0267, 0.0264, 0.0262, 0.0269, 0.0282, 0.0277, 0.0289, 0.0284, 0.0279, 0.0302, + 0.0289, 0.0308, 0.0313, 0.0315, 0.0310, 0.0325, 0.0313, 0.0319, 0.0356, 0.0340, 0.0331, 0.0347, 0.0356, 0.0352, 0.0364, 0.0373, 0.0352, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//#gray lichen (nahkajaekaelae) +//1204 585 1113 733 600 653 715 685 726 682 713 691 719 691 683 693 711 715 701 700 720 697 706 696 723 714 726 738 729 735 737 739 742 746 746 761 743 735 722 717 728 749 721 712 705 737 733 758 780 785 775 771 755 744 743 742 755 779 849 940 1042 +//RIS 74 +const double ColorTemp::ColorGraynahjajaekaelae_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1204, 0.0585, 0.1113, 0.0733, 0.0600, 0.0653, 0.0715, 0.0685, 0.0726, 0.0682, 0.0713, 0.0691, 0.0719, 0.0691, 0.0683, 0.0693, 0.0711, 0.0715, 0.0701, 0.0700, + 0.0720, 0.0697, 0.0706, 0.0696, 0.0723, 0.0714, 0.0726, 0.0738, 0.0729, 0.0735, 0.0737, 0.0739, 0.0742, 0.0746, 0.0746, 0.0761, 0.0743, 0.0735, 0.0722, 0.0717, + 0.0728, 0.0749, 0.0721, 0.0712, 0.0705, 0.0737, 0.0733, 0.0758, 0.0780, 0.0785, 0.0775, 0.0771, 0.0755, 0.0744, 0.0743, 0.0742, 0.0755, 0.0779, 0.0849, 0.0940, 0.1042, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green moss (nuotiosammal) +//120 65 134 31 209 124 104 96 97 95 76 79 83 93 83 95 95 104 117 127 140 161 214 252 290 310 328 343 347 373 365 351 347 343 311 301 285 283 263 256 255 251 257 235 227 224 233 208 194 186 165 160 151 149 157 161 185 243 309 425 543 +const double ColorTemp::ColorGreennuotisammal_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0120, 0.0065, 0.0134, 0.0031, 0.0209, 0.0124, 0.0104, 0.0096, 0.0097, 0.0095, 0.0076, 0.0079, 0.0083, 0.0093, 0.0083, 0.0095, 0.0095, 0.0104, 0.0117, 0.0127, 0.0140, 0.0161, + 0.0214, 0.0252, 0.0290, 0.0310, 0.0328, 0.0343, 0.0347, 0.0373, 0.0365, 0.0351, 0.0347, 0.0343, 0.0311, 0.0301, 0.0285, 0.0283, 0.0263, 0.0256, 0.0255, 0.0251, + 0.0257, 0.0235, 0.0227, 0.0224, 0.0233, 0.0208, 0.0194, 0.0186, 0.0165, 0.0160, 0.0151, 0.0149, 0.0157, 0.0161, 0.0185, 0.0243, 0.0309, 0.0425, 0.0543, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#green leaf (leskenlehti) +//525 273 0 378 318 164 224 276 316 266 303 290 305 286 290 303 323 323 352 383 405 482 614 743 920 1015 1139 1192 1175 1216 1195 1145 1116 1009 947 867 802 754 741 709 675 625 574 579 561 565 557 511 471 419 399 372 365 395 375 382 458 555 716 1002 1407 +const double ColorTemp::ColorGreenleskenlehti_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0525, 0.0273, 0.0, 0.0378, 0.0318, 0.0164, 0.0224, 0.0276, 0.0316, 0.0266, 0.0303, 0.0290, 0.0305, 0.0286, 0.0290, 0.0303, 0.0323, 0.0323, 0.0352, 0.0383, 0.0405, 0.0482, + 0.0614, 0.0743, 0.0920, 0.1015, 0.1139, 0.1192, 0.1175, 0.1216, 0.1195, 0.1145, 0.1116, 0.1009, 0.0947, 0.0867, 0.0802, 0.0754, 0.0741, 0.0709, 0.0675, 0.0625, + 0.0574, 0.0579, 0.0561, 0.0565, 0.0557, 0.0511, 0.0471, 0.0419, 0.0399, 0.0372, 0.0365, 0.0395, 0.0375, 0.0382, 0.0458, 0.0555, 0.0716, 0.1002, 0.1407, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green leaf (linnunkaali) +//602 0 267 306 339 335 300 247 292 289 295 298 292 318 312 289 299 307 310 320 350 375 446 499 574 634 698 725 736 754 736 702 668 633 590 551 514 499 467 460 445 424 415 409 399 412 393 380 370 362 366 343 342 350 333 350 364 418 494 670 914 +//RIS 77 +const double ColorTemp::ColorGreenlinnunkaali_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0602, 0.0, 0.0267, 0.0306, 0.0339, 0.0335, 0.0300, 0.0247, 0.0292, 0.0289, 0.0295, 0.0298, 0.0292, 0.0318, 0.0312, 0.0289, 0.0299, 0.0307, 0.0310, 0.0320, + 0.0350, 0.0375, 0.0446, 0.0499, 0.0574, 0.0634, 0.0698, 0.0725, 0.0736, 0.0754, 0.0736, 0.0702, 0.0668, 0.0633, 0.0590, 0.0551, 0.0514, 0.0499, 0.0467, 0.0460, + 0.0445, 0.0424, 0.0415, 0.0409, 0.0399, 0.0412, 0.0393, 0.0380, 0.0370, 0.0362, 0.0366, 0.0343, 0.0342, 0.0350, 0.0333, 0.0350, 0.0364, 0.0418, 0.0494, 0.0670, 0.0914, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#green leaf (pelto-ohake) +//0 366 360 233 173 179 157 175 206 205 180 179 173 178 187 189 184 171 195 204 193 219 253 297 365 431 467 489 493 516 500 466 426 406 380 343 316 295 276 282 265 253 239 228 226 229 238 237 216 221 219 217 212 219 229 258 284 309 375 487 732 +const double ColorTemp::ColorGreenpelto_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0366, 0.0360, 0.0233, 0.0173, 0.0179, 0.0157, 0.0175, 0.0206, 0.0205, 0.0180, 0.0179, 0.0173, 0.0178, 0.0187, 0.0189, 0.0184, 0.0171, 0.0195, 0.0204, 0.0193, 0.0219, + 0.0253, 0.0297, 0.0365, 0.0431, 0.0467, 0.0489, 0.0493, 0.0516, 0.0500, 0.0466, 0.0426, 0.0406, 0.0380, 0.0343, 0.0316, 0.0295, 0.0276, 0.0282, 0.0265, 0.0253, 0.0239, + 0.0228, 0.0226, 0.0229, 0.0238, 0.0237, 0.0216, 0.0221, 0.0219, 0.0217, 0.0212, 0.0219, 0.0229, 0.0258, 0.0284, 0.0309, 0.0375, 0.0487, 0.0732, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green rod (voikukka), +//2205 1755 1710 1365 1159 1207 1024 1118 1127 1141 1134 1125 1149 1140 1120 1128 1139 1156 1212 1273 1262 1359 1461 1519 1568 1599 1660 1668 1680 1718 1697 1690 1672 1675 1663 1644 1642 1652 1626 1623 1653 1621 1614 1590 1625 1609 1615 1576 1509 1483 1418 1391 1324 1294 1267 1220 1315 1417 1650 1861 2006 +const double ColorTemp::ColorGreenrodvoikukka[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2205, 0.1755, 0.1710, 0.1365, 0.1159, 0.1207, 0.1024, 0.1118, 0.1127, 0.1141, 0.1134, 0.1125, 0.1149, 0.1140, 0.1120, 0.1128, 0.1139, 0.1156, 0.1212, 0.1273, 0.1262, 0.1359, + 0.1461, 0.1519, 0.1568, 0.1599, 0.1660, 0.1668, 0.1680, 0.1718, 0.1697, 0.1690, 0.1672, 0.1675, 0.1663, 0.1644, 0.1642, 0.1652, 0.1626, 0.1623, 0.1653, 0.1621, 0.1614, 0.1590, + 0.1625, 0.1609, 0.1615, 0.1576, 0.1509, 0.1483, 0.1418, 0.1391, 0.1324, 0.1294, 0.1267, 0.1220, 0.1315, 0.1417, 0.1650, 0.1861, 0.2006, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green leaf (lehmus) +//2362 1024 945 666 617 604 591 580 648 631 656 607 616 653 643 626 643 656 710 753 801 929 1105 1277 1437 1601 1742 1774 1798 1848 1832 1820 1787 1730 1663 1593 1541 1461 1446 1419 1335 1298 1247 1192 1197 1199 1156 1072 1007 942 899 832 824 793 755 801 860 1031 1305 1809 2260 +const double ColorTemp::ColorGreenlehmus[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2362, 0.1024, 0.0945, 0.0666, 0.0617, 0.0604, 0.0591, 0.0580, 0.0648, 0.0631, 0.0656, 0.0607, 0.0616, 0.0653, 0.0643, 0.0626, 0.0643, 0.0656, 0.0710, 0.0753, + 0.0801, 0.0929, 0.1105, 0.1277, 0.1437, 0.1601, 0.1742, 0.1774, 0.1798, 0.1848, 0.1832, 0.1820, 0.1787, 0.1730, 0.1663, 0.1593, 0.1541, 0.1461, 0.1446, 0.1419, 0.1335, 0.1298, + 0.1247, 0.1192, 0.1197, 0.1199, 0.1156, 0.1072, 0.1007, 0.0942, 0.0899, 0.0832, 0.0824, 0.0793, 0.0755, 0.0801, 0.0860, 0.1031, 0.1305, 0.1809, 0.2260, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green leaf (koristeherukka) +//945 292 315 433 321 294 295 321 278 261 282 272 270 278 285 274 277 268 269 283 275 309 325 389 450 493 551 557 587 585 567 554 515 487 460 424 409 387 353 349 353 333 309 309 312 315 321 298 304 304 281 273 293 311 314 333 355 392 439 595 811 +const double ColorTemp::ColorGreenkoriste[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0945, 0.0292, 0.0315, 0.0433, 0.0321, 0.0294, 0.0295, 0.0321, 0.0278, 0.0261, 0.0282, 0.0272, 0.0270, 0.0278, 0.0285, 0.0274, 0.0277, 0.0268, 0.0269, 0.0283, + 0.0275, 0.0309, 0.0325, 0.0389, 0.0450, 0.0493, 0.0551, 0.0557, 0.0587, 0.0585, 0.0567, 0.0554, 0.0515, 0.0487, 0.0460, 0.0424, 0.0409, 0.0387, 0.0353, 0.0349, + 0.0353, 0.0333, 0.0309, 0.0309, 0.0312, 0.0315, 0.0321, 0.0298, 0.0304, 0.0304, 0.0281, 0.0273, 0.0293, 0.0311, 0.0314, 0.0333, 0.0355, 0.0392, 0.0439, 0.0595, 0.0811, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#green leaf (poimulehti) +//1102 146 630 266 247 261 285 238 273 281 272 260 262 254 274 263 273 278 296 309 322 388 493 607 712 840 953 986 1006 1034 999 981 918 855 794 711 649 627 604 563 531 515 467 450 448 466 445 421 402 385 369 345 346 319 330 359 378 439 578 835 1177 +const double ColorTemp::ColorGreenpoimulehti[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1102, 0.0146, 0.0630, 0.0266, 0.0247, 0.0261, 0.0285, 0.0238, 0.0273, 0.0281, 0.0272, 0.0260, 0.0262, 0.0254, 0.0274, 0.0263, 0.0273, 0.0278, 0.0296, 0.0309, 0.0322, + 0.0388, 0.0493, 0.0607, 0.0712, 0.0840, 0.0953, 0.0986, 0.1006, 0.1034, 0.0999, 0.0981, 0.0918, 0.0855, 0.0794, 0.0711, 0.0649, 0.0627, 0.0604, 0.0563, 0.0531, 0.0515, + 0.0467, 0.0450, 0.0448, 0.0466, 0.0445, 0.0421, 0.0402, 0.0385, 0.0369, 0.0345, 0.0346, 0.0319, 0.0330, 0.0359, 0.0378, 0.0439, 0.0578, 0.0835, 0.1177, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#green leaf (hopeapaju) +//787 512 1260 1032 765 881 994 908 983 985 941 985 971 967 964 937 928 959 973 992 1004 1017 1053 1102 1180 1227 1281 1309 1317 1328 1318 1271 1238 1222 1179 1152 1131 1092 1086 1078 1083 1020 1015 1000 1027 1037 1028 970 962 977 952 963 955 935 980 979 963 1028 1059 1228 1401 +const double ColorTemp::ColorGreenhopeapaju[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0787, 0.0512, 0.1260, 0.1032, 0.0765, 0.0881, 0.0994, 0.0908, 0.0983, 0.0985, 0.0941, 0.0985, 0.0971, 0.0967, 0.0964, 0.0937, 0.0928, 0.0959, 0.0973, 0.0992, 0.1004, + 0.1017, 0.1053, 0.1102, 0.1180, 0.1227, 0.1281, 0.1309, 0.1317, 0.1328, 0.1318, 0.1271, 0.1238, 0.1222, 0.1179, 0.1152, 0.1131, 0.1092, 0.1086, 0.1078, 0.1083, 0.1020, + 0.1015, 0.1000, 0.1027, 0.1037, 0.1028, 0.0970, 0.0962, 0.0977, 0.0952, 0.0963, 0.0955, 0.0935, 0.0980, 0.0979, 0.0963, 0.1028, 0.1059, 0.1228, 0.1401, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red flower (uuden guinean liisa) +//2288 1861 2364 2229 2783 2842 2842 2923 2902 2990 2828 2871 2772 2723 2639 2558 2424 2315 2169 2094 2064 1964 1865 1739 1680 1624 1548 1457 1424 1408 1434 1451 1492 1528 1597 1755 1951 2147 2367 2648 2986 3236 3393 3596 3665 3786 3879 3915 3926 3994 3987 4017 4026 4112 4067 4125 4139 4121 4050 4040 4095 +const double ColorTemp::ColorReduuden[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2288, 0.1861, 0.2364, 0.2229, 0.2783, 0.2842, 0.2842, 0.2923, 0.2902, 0.2990, 0.2828, 0.2871, 0.2772, 0.2723, 0.2639, 0.2558, 0.2424, 0.2315, 0.2169, 0.2094, 0.2064, + 0.1964, 0.1865, 0.1739, 0.1680, 0.1624, 0.1548, 0.1457, 0.1424, 0.1408, 0.1434, 0.1451, 0.1492, 0.1528, 0.1597, 0.1755, 0.1951, 0.2147, 0.2367, 0.2648, 0.2986, 0.3236, + 0.3393, 0.3596, 0.3665, 0.3786, 0.3879, 0.3915, 0.3926, 0.3994, 0.3987, 0.4017, 0.4026, 0.4112, 0.4067, 0.4125, 0.4139, 0.4121, 0.4050, 0.4040, 0.4095, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#red flower (pajuangervo) +//445 1024 605 833 937 959 1052 1028 1049 1029 1017 975 948 882 865 812 757 718 658 638 628 597 554 523 509 509 485 475 469 492 479 477 490 525 555 597 641 704 756 846 948 1055 1164 1221 1266 1339 1393 1491 1553 1604 1608 1650 1643 1652 1655 1658 1651 1739 1813 1818 1938 +const double ColorTemp::ColorRedpajuan[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0445, 0.1024, 0.0605, 0.0833, 0.0937, 0.0959, 0.1052, 0.1028, 0.1049, 0.1029, 0.1017, 0.0975, 0.0948, 0.0882, 0.0865, 0.0812, 0.0757, 0.0718, 0.0658, 0.0638, 0.0628, 0.0597, + 0.0554, 0.0523, 0.0509, 0.0509, 0.0485, 0.0475, 0.0469, 0.0492, 0.0479, 0.0477, 0.0490, 0.0525, 0.0555, 0.0597, 0.0641, 0.0704, 0.0756, 0.0846, 0.0948, 0.1055, 0.1164, 0.1221, + 0.1266, 0.1339, 0.1393, 0.1491, 0.1553, 0.1604, 0.1608, 0.1650, 0.1643, 0.1652, 0.1655, 0.1658, 0.1651, 0.1739, 0.1813, 0.1818, 0.1938, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#red flower (jaloangervo) +//120 152 512 635 662 538 749 713 743 792 777 785 733 726 728 749 709 674 661 657 645 635 598 570 553 544 545 538 546 514 540 567 585 577 602 651 690 765 836 907 980 1089 1147 1188 1212 1253 1318 1371 1412 1473 1459 1478 1548 1582 1564 1590 1595 1714 1728 1814 1837 +const double ColorTemp::ColorRedjaloan[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0120, 0.0152, 0.0512, 0.0635, 0.0662, 0.0538, 0.0749, 0.0713, 0.0743, 0.0792, 0.0777, 0.0785, 0.0733, 0.0726, 0.0728, 0.0749, 0.0709, 0.0674, 0.0661, 0.0657, 0.0645, 0.0635, + 0.0598, 0.0570, 0.0553, 0.0544, 0.0545, 0.0538, 0.0546, 0.0514, 0.0540, 0.0567, 0.0585, 0.0577, 0.0602, 0.0651, 0.0690, 0.0765, 0.0836, 0.0907, 0.0980, 0.1089, 0.1147, 0.1188, + 0.1212, 0.1253, 0.1318, 0.1371, 0.1412, 0.1473, 0.1459, 0.1478, 0.1548, 0.1582, 0.1564, 0.1590, 0.1595, 0.1714, 0.1728, 0.1814, 0.1837, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (ukonhattu) +//801 682 1070 1319 1311 1420 1453 1394 1318 1292 1268 1179 1132 1054 1015 948 846 780 731 709 705 667 621 598 555 522 505 493 498 500 494 471 479 463 450 461 487 515 546 574 555 562 539 558 546 552 567 626 715 807 862 978 1086 1199 1313 1323 1350 1366 1358 1320 1365 +const double ColorTemp::ColorBlueukon[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0801, 0.0682, 0.1070, 0.1319, 0.1311, 0.1420, 0.1453, 0.1394, 0.1318, 0.1292, 0.1268, 0.1179, 0.1132, 0.1054, 0.1015, 0.0948, 0.0846, 0.0780, 0.0731, 0.0709, 0.0705, 0.0667, + 0.0621, 0.0598, 0.0555, 0.0522, 0.0505, 0.0493, 0.0498, 0.0500, 0.0494, 0.0471, 0.0479, 0.0463, 0.0450, 0.0461, 0.0487, 0.0515, 0.0546, 0.0574, 0.0555, 0.0562, 0.0539, 0.0558, + 0.0546, 0.0552, 0.0567, 0.0626, 0.0715, 0.0807, 0.0862, 0.0978, 0.1086, 0.1199, 0.1313, 0.1323, 0.1350, 0.1366, 0.1358, 0.1320, 0.1365, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (orvokki) +//292 528 645 1000 932 1439 1752 1947 2077 2158 2169 2153 2164 2132 2091 1993 1916 1876 1803 1702 1659 1554 1503 1425 1330 1229 1186 1134 1065 1031 1014 993 989 980 939 936 945 995 1055 1104 1180 1247 1284 1343 1349 1403 1458 1538 1634 1790 1880 2006 2218 2396 2556 2612 2735 2811 2765 2840 2877 +const double ColorTemp::ColorBlueorvokki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0292, 0.0528, 0.0645, 0.1000, 0.0932, 0.1439, 0.1752, 0.1947, 0.2077, 0.2158, 0.2169, 0.2153, 0.2164, 0.2132, 0.2091, 0.1993, 0.1916, 0.1876, 0.1803, 0.1702, 0.1659, 0.1554, + 0.1503, 0.1425, 0.1330, 0.1229, 0.1186, 0.1134, 0.1065, 0.1031, 0.1014, 0.0993, 0.0989, 0.0980, 0.0939, 0.0936, 0.0945, 0.0995, 0.1055, 0.1104, 0.1180, 0.1247, 0.1284, 0.1343, + 0.1349, 0.1403, 0.1458, 0.1538, 0.1634, 0.1790, 0.1880, 0.2006, 0.2218, 0.2396, 0.2556, 0.2612, 0.2735, 0.2811, 0.2765, 0.2840, 0.2877, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (malvikki) +//1062 528 749 571 512 538 455 445 431 384 353 299 249 212 190 162 123 105 90 81 83 75 78 72 59 56 61 54 71 69 70 62 63 65 70 74 78 73 76 87 90 104 119 119 131 145 156 184 225 255 314 414 538 669 849 1068 1247 1467 1701 1885 2032 +const double ColorTemp::ColorBluemalvikki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1062, 0.0528, 0.0749, 0.0571, 0.0512, 0.0538, 0.0455, 0.0445, 0.0431, 0.0384, 0.0353, 0.0299, 0.0249, 0.0212, 0.0190, 0.0162, 0.0123, 0.0105, 0.0090, 0.0081, 0.0083, 0.0075, + 0.0078, 0.0072, 0.0059, 0.0056, 0.0061, 0.0054, 0.0071, 0.0069, 0.0070, 0.0062, 0.0063, 0.0065, 0.0070, 0.0074, 0.0078, 0.0073, 0.0076, 0.0087, 0.0090, 0.0104, 0.0119, 0.0119, + 0.0131, 0.0145, 0.0156, 0.0184, 0.0225, 0.0255, 0.0314, 0.0414, 0.0538, 0.0669, 0.0849, 0.1068, 0.1247, 0.1467, 0.1701, 0.1885, 0.2032, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#black dry leaf (maitohorsma) +//256 0 172 356 213 270 203 203 195 208 202 201 210 210 203 204 209 203 209 201 205 201 194 210 206 197 203 198 207 201 204 202 198 200 198 197 186 203 202 198 200 208 206 231 235 223 244 254 278 289 297 309 338 335 338 368 412 524 686 926 1185 +const double ColorTemp::ColorBlackmaito[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0256, 0.0, 0.0172, 0.0356, 0.0213, 0.0270, 0.0203, 0.0203, 0.0195, 0.0208, 0.0202, 0.0201, 0.0210, 0.0210, 0.0203, 0.0204, 0.0209, 0.0203, 0.0209, 0.0201, 0.0205, 0.0201, + 0.0194, 0.0210, 0.0206, 0.0197, 0.0203, 0.0198, 0.0207, 0.0201, 0.0204, 0.0202, 0.0198, 0.0200, 0.0198, 0.0197, 0.0186, 0.0203, 0.0202, 0.0198, 0.0200, 0.0208, 0.0206, 0.0231, + 0.0235, 0.0223, 0.0244, 0.0254, 0.0278, 0.0289, 0.0297, 0.0309, 0.0338, 0.0335, 0.0338, 0.0368, 0.0412, 0.0524, 0.0686, 0.0926, 0.1185, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#orange berry (pihlaja) +//945 731 585 433 247 408 266 314 293 305 289 288 280 297 262 298 277 274 291 293 285 303 300 310 324 336 364 377 426 465 499 561 602 667 741 890 1028 1164 1275 1465 1602 1640 1695 1744 1812 1837 1859 1805 1791 1822 1796 1751 1715 1655 1575 1600 1560 1618 1666 1740 1838 +const double ColorTemp::ColorOrangpihlaja[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0945, 0.0731, 0.0585, 0.0433, 0.0247, 0.0408, 0.0266, 0.0314, 0.0293, 0.0305, 0.0289, 0.0288, 0.0280, 0.0297, 0.0262, 0.0298, 0.0277, 0.0274, 0.0291, 0.0293, 0.0285, 0.0303, + 0.0300, 0.0310, 0.0324, 0.0336, 0.0364, 0.0377, 0.0426, 0.0465, 0.0499, 0.0561, 0.0602, 0.0667, 0.0741, 0.0890, 0.1028, 0.1164, 0.1275, 0.1465, 0.1602, 0.1640, 0.1695, 0.1744, + 0.1812, 0.1837, 0.1859, 0.1805, 0.1791, 0.1822, 0.1796, 0.1751, 0.1715, 0.1655, 0.1575, 0.1600, 0.1560, 0.1618, 0.1666, 0.1740, 0.1838, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#green flower (lehmus=linden) +//2677 1682 1170 1032 1085 816 728 755 833 832 813 845 857 884 855 882 914 997 1084 1179 1231 1437 1661 1873 2048 2209 2378 2408 2442 2509 2503 2452 2457 2418 2383 2348 2277 2213 2221 2169 2146 2048 1977 1960 2000 1993 1961 1899 1784 1748 1625 1517 1389 1260 1165 1143 1244 1522 1870 2324 2586 +//RIS 81 +const double ColorTemp::ColorGreenlinden[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2677, 0.1682, 0.1170, 0.1032, 0.1085, 0.0816, 0.0728, 0.0755, 0.0833, 0.0832, 0.0813, 0.0845, 0.0857, 0.0884, 0.0855, 0.0882, 0.0914, 0.0997, 0.1084, 0.1179, 0.1231, 0.1437, + 0.1661, 0.1873, 0.2048, 0.2209, 0.2378, 0.2408, 0.2442, 0.2509, 0.2503, 0.2452, 0.2457, 0.2418, 0.2383, 0.2348, 0.2277, 0.2213, 0.2221, 0.2169, 0.2146, 0.2048, 0.1977, 0.1960, + 0.2000, 0.1993, 0.1961, 0.1899, 0.1784, 0.1748, 0.1625, 0.1517, 0.1389, 0.1260, 0.1165, 0.1143, 0.1244, 0.1522, 0.1870, 0.2324, 0.2586, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow petal (lehmus) +//1890 1097 900 832 814 799 758 853 803 808 833 862 916 943 960 969 1039 1162 1283 1370 1427 1529 1689 1781 1894 1950 2105 2118 2140 2185 2191 2199 2234 2266 2263 2297 2328 2312 2298 2332 2344 2312 2288 2347 2384 2390 2358 2280 2306 2315 2310 2253 2274 2271 2242 2292 2254 2208 2319 2314 2264 +const double ColorTemp::ColorYellowlehmus[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1890, 0.1097, 0.0900, 0.0832, 0.0814, 0.0799, 0.0758, 0.0853, 0.0803, 0.0808, 0.0833, 0.0862, 0.0916, 0.0943, 0.0960, 0.0969, 0.1039, 0.1162, 0.1283, 0.1370, 0.1427, + 0.1529, 0.1689, 0.1781, 0.1894, 0.1950, 0.2105, 0.2118, 0.2140, 0.2185, 0.2191, 0.2199, 0.2234, 0.2266, 0.2263, 0.2297, 0.2328, 0.2312, 0.2298, 0.2332, 0.2344, 0.2312, 0.2288, + 0.2347, 0.2384, 0.2390, 0.2358, 0.2280, 0.2306, 0.2315, 0.2310, 0.2253, 0.2274, 0.2271, 0.2242, 0.2292, 0.2254, 0.2208, 0.2319, 0.2314, 0.2264, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow flower (suikeroalpi) +//2048 1666 1140 1210 699 680 615 566 567 561 609 585 614 572 599 575 636 730 982 1194 1360 1766 2222 2558 2849 3048 3201 3395 3395 3484 3576 3623 3606 3672 3651 3634 3647 3669 3715 3660 3720 3692 3704 3784 3683 3731 3681 3697 3635 3694 3617 3610 3632 3663 3616 3595 3599 3584 3588 3613 3527 +const double ColorTemp::ColorYellowsuikeroalpi[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2048, 0.1666, 0.1140, 0.1210, 0.0699, 0.0680, 0.0615, 0.0566, 0.0567, 0.0561, 0.0609, 0.0585, 0.0614, 0.0572, 0.0599, 0.0575, 0.0636, 0.0730, 0.0982, 0.1194, 0.1360, 0.1766, + 0.2222, 0.2558, 0.2849, 0.3048, 0.3201, 0.3395, 0.3395, 0.3484, 0.3576, 0.3623, 0.3606, 0.3672, 0.3651, 0.3634, 0.3647, 0.3669, 0.3715, 0.3660, 0.3720, 0.3692, 0.3704, 0.3784, + 0.3683, 0.3731, 0.3681, 0.3697, 0.3635, 0.3694, 0.3617, 0.3610, 0.3632, 0.3663, 0.3616, 0.3595, 0.3599, 0.3584, 0.3588, 0.3613, 0.3527, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow flower (pensashanhikki) +//356 1365 1024 902 535 387 355 247 365 307 321 330 319 332 317 336 408 487 709 963 1235 1631 2111 2436 2718 2950 3151 3262 3313 3420 3448 3475 3491 3534 3520 3565 3622 3631 3626 3657 3640 3607 3641 3627 3601 3591 3588 3667 3618 3601 3630 3613 3592 3609 3569 3590 3568 3563 3588 3480 3471 +const double ColorTemp::ColorYellowpensashanhikki1[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0356, 0.1365, 0.1024, 0.0902, 0.0535, 0.0387, 0.0355, 0.0247, 0.0365, 0.0307, 0.0321, 0.0330, 0.0319, 0.0332, 0.0317, 0.0336, 0.0408, 0.0487, 0.0709, 0.0963, 0.1235, + 0.1631, 0.2111, 0.2436, 0.2718, 0.2950, 0.3151, 0.3262, 0.3313, 0.3420, 0.3448, 0.3475, 0.3491, 0.3534, 0.3520, 0.3565, 0.3622, 0.3631, 0.3626, 0.3657, 0.3640, 0.3607, + 0.3641, 0.3627, 0.3601, 0.3591, 0.3588, 0.3667, 0.3618, 0.3601, 0.3630, 0.3613, 0.3592, 0.3609, 0.3569, 0.3590, 0.3568, 0.3563, 0.3588, 0.3480, 0.3471, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#yellow sepal (pensashanhikki) +//1068 427 326 416 428 590 503 470 539 526 546 540 539 526 497 546 555 603 753 903 1010 1268 1563 1868 2068 2226 2429 2495 2560 2625 2636 2610 2655 2667 2635 2630 2612 2560 2597 2588 2543 2478 2499 2472 2438 2431 2379 2406 2361 2319 2264 2174 2128 2010 1942 1912 1930 2148 2334 2585 2764 +const double ColorTemp::ColorYellowpensashanhikki2[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1068, 0.0427, 0.0326, 0.0416, 0.0428, 0.0590, 0.0503, 0.0470, 0.0539, 0.0526, 0.0546, 0.0540, 0.0539, 0.0526, 0.0497, 0.0546, 0.0555, 0.0603, 0.0753, 0.0903, 0.1010, 0.1268, + 0.1563, 0.1868, 0.2068, 0.2226, 0.2429, 0.2495, 0.2560, 0.2625, 0.2636, 0.2610, 0.2655, 0.2667, 0.2635, 0.2630, 0.2612, 0.2560, 0.2597, 0.2588, 0.2543, 0.2478, 0.2499, 0.2472, + 0.2438, 0.2431, 0.2379, 0.2406, 0.2361, 0.2319, 0.2264, 0.2174, 0.2128, 0.2010, 0.1942, 0.1912, 0.1930, 0.2148, 0.2334, 0.2585, 0.2764, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#blue flower (hiidenvirna) +//315 512 675 832 765 865 807 867 911 904 852 826 780 753 711 661 595 528 513 476 431 391 361 331 305 276 240 229 237 223 212 208 215 205 203 195 209 212 222 266 296 322 356 352 388 391 411 425 473 532 550 630 669 748 823 879 904 917 930 950 942 +const double ColorTemp::ColorBluehiidenvirna[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0315, 0.0512, 0.0675, 0.0832, 0.0765, 0.0865, 0.0807, 0.0867, 0.0911, 0.0904, 0.0852, 0.0826, 0.0780, 0.0753, 0.0711, 0.0661, 0.0595, 0.0528, 0.0513, 0.0476, 0.0431, 0.0391, + 0.0361, 0.0331, 0.0305, 0.0276, 0.0240, 0.0229, 0.0237, 0.0223, 0.0212, 0.0208, 0.0215, 0.0205, 0.0203, 0.0195, 0.0209, 0.0212, 0.0222, 0.0266, 0.0296, 0.0322, 0.0356, 0.0352, + 0.0388, 0.0391, 0.0411, 0.0425, 0.0473, 0.0532, 0.0550, 0.0630, 0.0669, 0.0748, 0.0823, 0.0879, 0.0904, 0.0917, 0.0930, 0.0950, 0.0942, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#blue flower (kurkkuyrtti) +//2687 1553 2181 2246 2209 2263 2442 2347 2261 2353 2292 2230 2095 2008 1896 1782 1569 1443 1333 1223 1177 1074 992 902 813 755 701 626 577 548 525 498 469 445 456 448 428 441 448 447 455 467 496 534 527 586 668 798 966 1126 1289 1469 1679 1870 2013 2040 2060 2077 2104 2155 2119 +//RIS 87 +const double ColorTemp::ColorBluekurkkuyrtti[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2687, 0.1553, 0.2181, 0.2246, 0.2209, 0.2263, 0.2442, 0.2347, 0.2261, 0.2353, 0.2292, 0.2230, 0.2095, 0.2008, 0.1896, 0.1782, 0.1569, 0.1443, 0.1333, 0.1223, 0.1177, 0.1074, + 0.0992, 0.0902, 0.0813, 0.0755, 0.0701, 0.0626, 0.0577, 0.0548, 0.0525, 0.0498, 0.0469, 0.0445, 0.0456, 0.0448, 0.0428, 0.0441, 0.0448, 0.0447, 0.0455, 0.0467, 0.0496, 0.0534, + 0.0527, 0.0586, 0.0668, 0.0798, 0.0966, 0.1126, 0.1289, 0.1469, 0.1679, 0.1870, 0.2013, 0.2040, 0.2060, 0.2077, 0.2104, 0.2155, 0.2119, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#pink (siankaersaemoe) +//585 859 758 1094 780 1012 987 1067 1059 1034 1098 1110 1097 1040 1058 1048 1028 1014 1068 1024 1023 1025 1032 1029 1011 1007 986 973 946 906 949 923 943 949 956 998 1051 1107 1166 1242 1284 1355 1394 1438 1451 1543 1589 1588 1612 1616 1562 1534 1562 1541 1494 1492 1518 1650 1749 1907 1991 +const double ColorTemp::ColorPinksiankaersaemoe[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0585, 0.0859, 0.0758, 0.1094, 0.0780, 0.1012, 0.0987, 0.1067, 0.1059, 0.1034, 0.1098, 0.1110, 0.1097, 0.1040, 0.1058, 0.1048, 0.1028, 0.1014, 0.1068, 0.1024, 0.1023, 0.1025, + 0.1032, 0.1029, 0.1011, 0.1007, 0.0986, 0.0973, 0.0946, 0.0906, 0.0949, 0.0923, 0.0943, 0.0949, 0.0956, 0.0998, 0.1051, 0.1107, 0.1166, 0.1242, 0.1284, 0.1355, 0.1394, 0.1438, + 0.1451, 0.1543, 0.1589, 0.1588, 0.1612, 0.1616, 0.1562, 0.1534, 0.1562, 0.1541, 0.1494, 0.1492, 0.1518, 0.1650, 0.1749, 0.1907, 0.1991, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#violet flower (harakankello) +//2520 1462 1890 1898 1751 1713 1555 1516 1471 1403 1282 1209 1144 1135 1069 976 895 823 782 762 713 685 661 635 603 559 551 550 541 567 562 574 580 589 586 620 670 690 718 801 786 769 773 739 800 806 837 845 971 1043 1102 1241 1359 1502 1611 1726 1793 1859 1909 1969 2014 +//RIS 89 +const double ColorTemp::ColorVioletharakankello[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2520, 0.1462, 0.1890, 0.1898, 0.1751, 0.1713, 0.1555, 0.1516, 0.1471, 0.1403, 0.1282, 0.1209, 0.1144, 0.1135, 0.1069, 0.0976, 0.0895, 0.0823, 0.0782, 0.0762, 0.0713, + 0.0685, 0.0661, 0.0635, 0.0603, 0.0559, 0.0551, 0.0550, 0.0541, 0.0567, 0.0562, 0.0574, 0.0580, 0.0589, 0.0586, 0.0620, 0.0670, 0.0690, 0.0718, 0.0801, 0.0786, 0.0769, + 0.0773, 0.0739, 0.0800, 0.0806, 0.0837, 0.0845, 0.0971, 0.1043, 0.1102, 0.1241, 0.1359, 0.1502, 0.1611, 0.1726, 0.1793, 0.1859, 0.1909, 0.1969, 0.2014, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#violet flower (alsikeapila) +//1260 585 765 1065 937 881 847 943 1075 1053 1020 994 1008 1026 1015 980 962 949 925 908 880 864 843 814 802 749 698 691 677 660 653 660 631 633 644 692 743 809 889 1005 1160 1325 1396 1450 1526 1583 1655 1674 1689 1707 1675 1674 1624 1576 1564 1591 1613 1717 1851 1962 2033 +const double ColorTemp::ColorVioletalsikeapila[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1260, 0.0585, 0.0765, 0.1065, 0.0937, 0.0881, 0.0847, 0.0943, 0.1075, 0.1053, 0.1020, 0.0994, 0.1008, 0.1026, 0.1015, 0.0980, 0.0962, 0.0949, 0.0925, 0.0908, 0.0880, 0.0864, + 0.0843, 0.0814, 0.0802, 0.0749, 0.0698, 0.0691, 0.0677, 0.0660, 0.0653, 0.0660, 0.0631, 0.0633, 0.0644, 0.0692, 0.0743, 0.0809, 0.0889, 0.1005, 0.1160, 0.1325, 0.1396, 0.1450, + 0.1526, 0.1583, 0.1655, 0.1674, 0.1689, 0.1707, 0.1675, 0.1674, 0.1624, 0.1576, 0.1564, 0.1591, 0.1613, 0.1717, 0.1851, 0.1962, 0.2033, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#violet flower (akilleija) +//843 1340 1393 1254 1290 1452 1508 1519 1454 1384 1301 1256 1178 1113 1056 985 884 827 743 720 691 664 605 578 540 507 499 475 485 494 492 479 487 493 471 495 559 595 645 689 720 732 716 723 734 750 804 849 948 1041 1169 1362 1525 1693 1761 1935 2071 2235 2376 2493 2604 +const double ColorTemp::ColorVioletakilleija[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0843, 0.1340, 0.1393, 0.1254, 0.1290, 0.1452, 0.1508, 0.1519, 0.1454, 0.1384, 0.1301, 0.1256, 0.1178, 0.1113, 0.1056, 0.0985, 0.0884, 0.0827, 0.0743, 0.0720, 0.0691, 0.0664, + 0.0605, 0.0578, 0.0540, 0.0507, 0.0499, 0.0475, 0.0485, 0.0494, 0.0492, 0.0479, 0.0487, 0.0493, 0.0471, 0.0495, 0.0559, 0.0595, 0.0645, 0.0689, 0.0720, 0.0732, 0.0716, 0.0723, + 0.0734, 0.0750, 0.0804, 0.0849, 0.0948, 0.1041, 0.1169, 0.1362, 0.1525, 0.1693, 0.1761, 0.1935, 0.2071, 0.2235, 0.2376, 0.2493, 0.2604, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#orange flower (kehaekukka) +//0 0 0 0 0 0 102 58 128 125 137 122 122 134 123 136 159 138 163 151 167 178 192 177 206 226 315 451 707 1045 1446 1707 1944 2131 2276 2524 2719 2841 2968 3052 3199 3264 3282 3429 3451 3454 3477 3556 3478 3565 3595 3569 3582 3582 3559 3610 3626 3668 3733 3692 3722 +const double ColorTemp::ColorOrangekehaekukka[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0102, 0.0058, 0.0128, 0.0125, 0.0137, 0.0122, 0.0122, 0.0134, 0.0123, 0.0136, 0.0159, 0.0138, 0.0163, 0.0151, 0.0167, 0.0178, 0.0192, + 0.0177, 0.0206, 0.0226, 0.0315, 0.0451, 0.0707, 0.1045, 0.1446, 0.1707, 0.1944, 0.2131, 0.2276, 0.2524, 0.2719, 0.2841, 0.2968, 0.3052, 0.3199, 0.3264, 0.3282, 0.3429, + 0.3451, 0.3454, 0.3477, 0.3556, 0.3478, 0.3565, 0.3595, 0.3569, 0.3582, 0.3582, 0.3559, 0.3610, 0.3626, 0.3668, 0.3733, 0.3692, 0.3722, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#red berry (pihlaja) +//0 0 0 0 25 84 128 87 165 130 167 147 155 146 148 165 158 159 164 160 158 158 157 157 173 173 179 195 210 234 264 302 349 386 461 572 735 886 1038 1216 1376 1521 1607 1691 1728 1769 1842 1843 1865 1910 1881 1920 1909 1909 1891 1879 1915 1879 1878 1843 1832 +const double ColorTemp::ColorRedpihlaja[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0025, 0.0084, 0.0128, 0.0087, 0.0165, 0.0130, 0.0167, 0.0147, 0.0155, 0.0146, 0.0148, 0.0165, 0.0158, 0.0159, 0.0164, 0.0160, 0.0158, 0.0158, + 0.0157, 0.0157, 0.0173, 0.0173, 0.0179, 0.0195, 0.0210, 0.0234, 0.0264, 0.0302, 0.0349, 0.0386, 0.0461, 0.0572, 0.0735, 0.0886, 0.1038, 0.1216, 0.1376, 0.1521, 0.1607, 0.1691, + 0.1728, 0.1769, 0.1842, 0.1843, 0.1865, 0.1910, 0.1881, 0.1920, 0.1909, 0.1909, 0.1891, 0.1879, 0.1915, 0.1879, 0.1878, 0.1843, 0.1832, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#violet flower (petunia) +//292 66 227 313 325 332 310 319 300 268 229 193 164 137 127 104 67 50 49 37 34 34 44 32 33 31 38 41 33 34 45 44 37 42 44 49 49 67 80 89 110 130 137 145 153 171 194 223 275 321 391 464 580 720 907 1055 1230 1436 1548 1777 1933 +//RIS 94 +const double ColorTemp::ColorVioletpetunia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0292, 0.0066, 0.0227, 0.0313, 0.0325, 0.0332, 0.0310, 0.0319, 0.0300, 0.0268, 0.0229, 0.0193, 0.0164, 0.0137, 0.0127, 0.0104, 0.0067, 0.0050, 0.0049, 0.0037, 0.0034, 0.0034, + 0.0044, 0.0032, 0.0033, 0.0031, 0.0038, 0.0041, 0.0033, 0.0034, 0.0045, 0.0044, 0.0037, 0.0042, 0.0044, 0.0049, 0.0049, 0.0067, 0.0080, 0.0089, 0.0110, 0.0130, 0.0137, 0.0145, + 0.0153, 0.0171, 0.0194, 0.0223, 0.0275, 0.0321, 0.0391, 0.0464, 0.0580, 0.0720, 0.0907, 0.1055, 0.1230, 0.1436, 0.1548, 0.1777, 0.1933, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#violet flower (orvokki) +//195 0 152 31 22 32 77 69 45 20 27 26 13 12 14 11 15 23 16 18 16 12 16 10 16 15 13 15 15 16 14 20 14 17 15 17 15 17 17 17 23 24 29 38 36 38 37 43 58 65 70 86 113 155 222 285 405 506 645 817 1035 +const double ColorTemp::ColorVioletorvokki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0195, 0.0, 0.0152, 0.0031, 0.0022, 0.0032, 0.0077, 0.0069, 0.0045, 0.0020, 0.0027, 0.0026, 0.0013, 0.0012, 0.0014, 0.0011, 0.0015, 0.0023, 0.0016, 0.0018, 0.0016, 0.0012, 0.0016, + 0.0010, 0.0016, 0.0015, 0.0013, 0.0015, 0.0015, 0.0016, 0.0014, 0.0020, 0.0014, 0.0017, 0.0015, 0.0017, 0.0015, 0.0017, 0.0017, 0.0017, 0.0023, 0.0024, 0.0029, 0.0038, 0.0036, + 0.0038, 0.0037, 0.0043, 0.0058, 0.0065, 0.0070, 0.0086, 0.0113, 0.0155, 0.0222, 0.0285, 0.0405, 0.0506, 0.0645, 0.0817, 0.1035, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#blue flower (sinisievikki) +//801 1109 1861 2325 2329 2380 2562 2565 2558 2611 2517 2567 2475 2397 2337 2294 2195 2001 1881 1892 1854 1746 1668 1580 1491 1362 1229 1178 1110 1094 1072 1019 994 960 928 879 836 859 863 951 1046 1102 1154 1193 1174 1166 1153 1199 1275 1316 1376 1550 1739 1918 2104 2228 2364 2377 2423 2394 2334 +const double ColorTemp::ColorBluesinisievikki[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0801, 0.1109, 0.1861, 0.2325, 0.2329, 0.2380, 0.2562, 0.2565, 0.2558, 0.2611, 0.2517, 0.2567, 0.2475, 0.2397, 0.2337, 0.2294, 0.2195, 0.2001, 0.1881, 0.1892, 0.1854, 0.1746, + 0.1668, 0.1580, 0.1491, 0.1362, 0.1229, 0.1178, 0.1110, 0.1094, 0.1072, 0.1019, 0.0994, 0.0960, 0.0928, 0.0879, 0.0836, 0.0859, 0.0863, 0.0951, 0.1046, 0.1102, 0.1154, 0.1193, + 0.1174, 0.1166, 0.1153, 0.1199, 0.1275, 0.1316, 0.1376, 0.1550, 0.1739, 0.1918, 0.2104, 0.2228, 0.2364, 0.2377, 0.2423, 0.2394, 0.2334, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#blue flower (iisoppi) +//623 85 605 833 776 756 755 781 774 775 697 724 697 654 617 575 536 494 460 469 442 436 400 393 380 358 369 352 342 368 357 360 342 342 341 335 355 353 365 376 382 392 412 412 407 414 420 449 487 504 517 571 651 734 806 885 968 1088 1210 1296 1411 +const double ColorTemp::ColorBlueiisoppi[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0623, 0.0085, 0.0605, 0.0833, 0.0776, 0.0756, 0.0755, 0.0781, 0.0774, 0.0775, 0.0697, 0.0724, 0.0697, 0.0654, 0.0617, 0.0575, 0.0536, 0.0494, 0.0460, 0.0469, 0.0442, 0.0436, + 0.0400, 0.0393, 0.0380, 0.0358, 0.0369, 0.0352, 0.0342, 0.0368, 0.0357, 0.0360, 0.0342, 0.0342, 0.0341, 0.0335, 0.0355, 0.0353, 0.0365, 0.0376, 0.0382, 0.0392, 0.0412, 0.0412, + 0.0407, 0.0414, 0.0420, 0.0449, 0.0487, 0.0504, 0.0517, 0.0571, 0.0651, 0.0734, 0.0806, 0.0885, 0.0968, 0.1088, 0.1210, 0.1296, 0.1411, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//#white petal (ojakaersaemoe) +//1732 951 1800 1365 1801 1697 1762 2103 2243 2218 2200 2206 2255 2254 2269 2261 2272 2251 2254 2260 2256 2266 2247 2269 2310 2273 2345 2312 2301 2323 2302 2314 2362 2355 2348 2362 2396 2374 2362 2381 2396 2440 2383 2347 2422 2419 2472 2423 2406 2425 2377 2381 2380 2398 2390 2404 2370 2375 2364 2411 2417 +const double ColorTemp::ColorWhiteojaka[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1732, 0.0951, 0.1800, 0.1365, 0.1801, 0.1697, 0.1762, 0.2103, 0.2243, 0.2218, 0.2200, 0.2206, 0.2255, 0.2254, 0.2269, 0.2261, 0.2272, 0.2251, 0.2254, 0.2260, 0.2256, 0.2266, + 0.2247, 0.2269, 0.2310, 0.2273, 0.2345, 0.2312, 0.2301, 0.2323, 0.2302, 0.2314, 0.2362, 0.2355, 0.2348, 0.2362, 0.2396, 0.2374, 0.2362, 0.2381, 0.2396, 0.2440, 0.2383, 0.2347, + 0.2422, 0.2419, 0.2472, 0.2423, 0.2406, 0.2425, 0.2377, 0.2381, 0.2380, 0.2398, 0.2390, 0.2404, 0.2370, 0.2375, 0.2364, 0.2411, 0.2417, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//#white flower (petunia) +//4095 4022 4410 4095 4095 4095 4193 4207 4388 4328 4223 4168 4221 4304 4245 4210 4212 4192 4181 4233 4207 4224 4197 4262 4243 4241 4274 4257 4204 4285 4265 4241 4267 4275 4245 4276 4260 4217 4217 4244 4240 4186 4160 4156 4227 4286 4237 4137 4202 4187 4100 4112 4103 4090 4125 4115 4098 4036 4047 4105 4050 +const double ColorTemp::ColorWhitepetunia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4095, 0.4022, 0.4410, 0.4095, 0.4095, 0.4095, 0.4193, 0.4207, 0.4388, 0.4328, 0.4223, 0.4168, 0.4221, 0.4304, 0.4245, 0.4210, 0.4212, 0.4192, 0.4181, 0.4233, 0.4207, 0.4224, + 0.4197, 0.4262, 0.4243, 0.4241, 0.4274, 0.4257, 0.4204, 0.4285, 0.4265, 0.4241, 0.4267, 0.4275, 0.4245, 0.4276, 0.4260, 0.4217, 0.4217, 0.4244, 0.4240, 0.4186, 0.4160, 0.4156, + 0.4227, 0.4286, 0.4237, 0.4137, 0.4202, 0.4187, 0.4100, 0.4112, 0.4103, 0.4090, 0.4125, 0.4115, 0.4098, 0.4036, 0.4047, 0.4105, 0.4050, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//#blue flower (lobelia dortmanna) +//0 660 1277 1544 1612 1961 1909 1950 1901 1907 1809 1785 1685 1622 1522 1377 1178 1054 931 898 850 732 610 508 434 370 343 329 303 265 232 199 183 169 172 177 200 233 214 214 199 186 199 228 249 321 435 684 1006 1345 1703 2082 2432 2661 2843 2936 3079 3015 3003 3045 3038 +//RIS 98 +const double ColorTemp::ColorBluelobelia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0660, 0.1277, 0.1544, 0.1612, 0.1961, 0.1909, 0.1950, 0.1901, 0.1907, 0.1809, 0.1785, 0.1685, 0.1622, 0.1522, 0.1377, 0.1178, 0.1054, 0.0931, 0.0898, 0.0850, 0.0732, + 0.0610, 0.0508, 0.0434, 0.0370, 0.0343, 0.0329, 0.0303, 0.0265, 0.0232, 0.0199, 0.0183, 0.0169, 0.0172, 0.0177, 0.0200, 0.0233, 0.0214, 0.0214, 0.0199, 0.0186, 0.0199, + 0.0228, 0.0249, 0.0321, 0.0435, 0.0684, 0.1006, 0.1345, 0.1703, 0.2082, 0.2432, 0.2661, 0.2843, 0.2936, 0.3079, 0.3015, 0.3003, 0.3045, 0.3038, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//#white petal (pelargonia) +//3493 2882 2284 2730 2869 2609 2781 2869 2861 2869 2795 2810 2740 2716 2650 2631 2539 2554 2450 2453 2447 2451 2343 2408 2404 2367 2343 2401 2474 2549 2668 2759 2843 2883 2989 3106 3209 3344 3383 3404 3453 3521 3495 3571 3521 3548 3582 3557 3581 3539 3563 3589 3597 3579 3502 3546 3507 3554 3490 3561 3518 +const double ColorTemp::ColorWhitepelargonia[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3493, 0.2882, 0.2284, 0.2730, 0.2869, 0.2609, 0.2781, 0.2869, 0.2861, 0.2869, 0.2795, 0.2810, 0.2740, 0.2716, 0.2650, 0.2631, 0.2539, 0.2554, 0.2450, 0.2453, 0.2447, + 0.2451, 0.2343, 0.2408, 0.2404, 0.2367, 0.2343, 0.2401, 0.2474, 0.2549, 0.2668, 0.2759, 0.2843, 0.2883, 0.2989, 0.3106, 0.3209, 0.3344, 0.3383, 0.3404, 0.3453, 0.3521, + 0.3495, 0.3571, 0.3521, 0.3548, 0.3582, 0.3557, 0.3581, 0.3539, 0.3563, 0.3589, 0.3597, 0.3579, 0.3502, 0.3546, 0.3507, 0.3554, 0.3490, 0.3561, 0.3518, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +/* +#white petal (paeivaenkakkara) +2168 1365 1969 2095 2231 2530 2944 3092 3107 3148 3188 3207 3195 3216 3225 3261 3211 3228 3260 3237 3258 3276 3265 3316 3327 3291 3315 3324 3355 3255 3264 3308 3324 3328 3282 3253 3220 3257 3289 3265 3245 3297 3284 3292 3228 3312 3290 3277 3278 3284 3182 3244 3273 3291 3212 3256 3154 3243 3306 3234 3155 +*/ +const double ColorTemp::ColorWhitepaeivaen[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2168, 0.1365, 0.1969, 0.2095, 0.2231, 0.2530, 0.2944, 0.3092, 0.3107, 0.3148, 0.3188, 0.3207, 0.3195, 0.3216, 0.3225, 0.3261, 0.3211, 0.3228, 0.3260, 0.3237, 0.3258, + 0.3276, 0.3265, 0.3316, 0.3327, 0.3291, 0.3315, 0.3324, 0.3355, 0.3255, 0.3264, 0.3308, 0.3324, 0.3328, 0.3282, 0.3253, 0.3220, 0.3257, 0.3289, 0.3265, 0.3245, 0.3297, + 0.3284, 0.3292, 0.3228, 0.3312, 0.3290, 0.3277, 0.3278, 0.3284, 0.3182, 0.3244, 0.3273, 0.3291, 0.3212, 0.3256, 0.3154, 0.3243, 0.3306, 0.3234, 0.3155, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + //spectral data Colorchecker24 : Green B3 const double ColorTemp::ColorchechGreB3_spect[97] = { @@ -446,6 +1174,21 @@ const double ColorTemp::ColorchechGraC4_67_spect[97] = { 0.369, 0.3689, 0.368, 0.3673, 0.3678, 0.3684, 0.37, 0.3711, 0.3712, 0.3714, 0.3714, 0.3714, 0.371, 0.3707, 0.37, 0.3694, 0.3697, 0.3703, 0.3697, 0.3692, 0.3688, 0.3685, 0.3675, 0.3669, 0.3657, 0.3647, 0.3635, 0.3625, 0.361, 0.3596, 0.3585, 0.3579, 0.357, 0.3560, 0.3555, 0.3548, 0.3535, 0.3526, 0.3513, 0.3500, 0.349, 0.3475, 0.3467, 0.3460, 0.3452, 0.3444, 0.3431, 0.3421, 0.3411, 0.3403, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +const double ColorTemp::Fictif_61greyspect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::JDC468_K15_87greyspect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1984, 0.2223, 0.2448, 0.2934, 0.3415, 0.4425, 0.5707, 0.6609, 0.7619, 0.7956, 0.8275, 0.8280, 0.8292, 0.8223, 0.8156, 0.8112, 0.8076, 0.8040, 0.7982, 0.7970, 0.7954, 0.8013, 0.8083, 0.8141, 0.8184, 0.8167, + 0.8137, 0.8080, 0.8026, 0.8013, 0.7988, 0.7963, 0.7942, 0.7855, 0.7765, 0.7680, 0.7603, 0.7640, 0.7681, 0.7750, 0.7827, 0.7876, 0.7923, 0.7935, 0.7945, 0.7955, 0.7964, 0.7975, 0.7982, 0.8000, 0.8017, 0.8051, + 0.8090, 0.8145, 0.8191, 0.8234, 0.8269, 0.8300, 0.8327, 0.8342, 0.8359, 0.8375, 0.8390, 0.8405, 0.8421, 0.8436, 0.8452, 0.8480, 0.8504, 0.8564, 0.8611, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; +//K15 275 275 0.1984 0.2448 0.3415 0.5707 0.7619 0.8275 0.8292 0.8156 0.8076 0.7982 0.7954 0.8083 0.8184 0.8137 0.8026 0.7988 0.7942 0.7765 0.7603 0.7681 0.7827 0.7923 0.7945 0.7964 0.7982 0.8017 0.8090 0.8191 0.8269 0.8327 0.8359 0.8390 0.8421 0.8452 0.8504 0.8611 //spectral data Colorchecker24 : Skin B1 //use also for palette WB @@ -478,7 +1221,7 @@ const double ColorTemp::ColorchechDCBluN881_m7_m14_spect[97] = { //spectral data ColorcheckerSG : Skin F7 //use also for palette WB const double ColorTemp::ColorchechSGSkiF763_14_26_spect[97] = { - 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0508, 0.64, 0.0776, 0.903, 0.1099, 0.1128, 0.1256, 0.128, 0.1307, 0.133, 0.1357, 0.139, 0.1425, 0.148, 0.1523, 0.159, 0.1669, 0.177, 0.1871, 0.20, 0.2118, 0.2235, 0.2355, 0.2445, 0.2537, 0.259, 0.2655, 0.268, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0508, 0.064, 0.0776, 0.903, 0.1099, 0.1128, 0.1256, 0.128, 0.1307, 0.133, 0.1357, 0.139, 0.1425, 0.148, 0.1523, 0.159, 0.1669, 0.177, 0.1871, 0.20, 0.2118, 0.2235, 0.2355, 0.2445, 0.2537, 0.259, 0.2655, 0.268, 0.2700, 0.2708, 0.2716, 0.2743, 0.2770, 0.2803, 0.2827, 0.283, 0.2832, 0.283, 0.2828, 0.295, 0.3079, 0.344, 0.3803, 0.4105, 0.4409, 0.455, 0.4694, 0.477, 0.4851, 0.4896, 0.4962, 0.501, 0.5066, 0.511, 0.5160, 0.521, 0.5256, 0.529, 0.5318, 0.535, 0.5383, 0.541, 0.5451, 0.549, 0.5524, 0.556, 0.5597, 0.562, 0.5650, 0.568, 0.5709, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; @@ -531,15 +1274,156 @@ const double ColorTemp::JDC468_GraK14_44_spect[97] = { 0.1408, 0.14330, 0.1475, 0.15170, 0.1583, 0.16500, 0.172, 0.17940, 0.1836, 0.18780, 0.188, 0.18820, 0.186, 0.18430, 0.1801, 0.17620, 0.1741, 0.17210, 0.179, 0.18420, 0.1991, 0.21430, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +const double ColorTemp::JDC468_BluM5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1510, 0.1802, 0.2069, 0.2550, 0.3047, 0.4055, 0.5069, 0.590, 0.6747, 0.701, 0.7351, 0.7345, 0.7338, 0.7195, 0.7063, 0.693, 0.6732, 0.6490, 0.6261, 0.5993, 0.5723, 0.5560, + 0.5401, 0.526, 0.5106, 0.4805, 0.4504, 0.42, 0.3907, 0.385, 0.3799, 0.3750, 0.3695, 0.3340, 0.3005, 0.2692, 0.2382, 0.2387, 0.2389, 0.2501, 0.2610, 0.2635, 0.2662, 0.2601, 0.2541, + 0.2450, 0.2426, 0.2430, 0.2434, 0.2490, 0.2523, 0.2612, 0.2692, 0.2694, 0.2996, 0.3145, 0.3329, 0.3413, 0.3498, 0.3467, 0.3442, 0.3355, 0.3266, 0.3131, 0.2996, 0.2911, 0.2831, 0.2950, 0.3070, 0.3430, 0.3799, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//m5 317 //0.1510 0.2069 0.3047 0.5069 0.6747 0.7351 0.7338 0.7063 0.6732 0.6261 0.5723 0.5401 +// 0.5106 0.4504 0.3907 0.3799 0.3695 0.3005 0.2382 0.2389 0.2610 0.2662 0.2541 +// 0.2426 0.2434 0.2523 0.2692 0.2996 0.3329 0.3498 0.3442 0.3266 0.2996 0.2831 0.3070 0.3799 + +const double ColorTemp::JDC468_RedG21va_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1207, 0.141, 0.1585, 0.1810, 0.2073, 0.2529, 0.2959, 0.3210, 0.3476, 0.3350, 0.3232, 0.2845, 0.2564, 0.2140, 0.1823, 0.1523, 0.1266, 0.1001, 0.0792, 0.061, 0.0439, 0.0349, 0.0295, 0.0260, 0.0222, + 0.0180, 0.0135, 0.0111, 0.0087, 0.0090, 0.0094, 0.0101, 0.0109, 0.0093, 0.0086, 0.0090, 0.0091, 0.0061, 0.0321, 0.0086, 0.1368, 0.2312, 0.3256, 0.4112, 0.4958, 0.5444, 0.5884, 0.6002, 0.6264, 0.6323, 0.6473, + 0.6546, 0.6659, 0.6775, 0.6881, 0.6982, 0.7081, 0.7150, 0.7201, 0.7217, 0.7232, 0.7222, 0.7215, 0.7187, 0.7157, 0.7144, 0.7131, 0.7196, 0.7269, 0.7303, 0.7599, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//g21 177 0.1207 0.1585 0.2073 0.2959 0.3476 0.3232 0.2564 0.1823 0.1266 0.0792 0.0439 0.0295 0.0222 0.0135 0.0087 0.0094 0.0109 0.0086 0.0091 0.0321 +// 0.1368 0.3256 0.4958 0.5884 0.6264 0.6473 0.6659 0.6881 0.7081 0.7201 0.7232 0.7215 0.7157 0.7131 0.7269 0.7599 +const double ColorTemp::JDC468_RedI9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0258, 0.023, 0.0220, 0.0205, 0.0189, 0.0183, 0.0174, 0.0168, 0.0162, 0.0152, 0.0148, 0.0145, 0.0139, 0.0136, 0.0133, 0.0130, 0.0127, 0.0130, 0.0133, 0.0151, 0.0168, 0.0218, 0.0268, 0.0317, 0.0367, 0.0330, + 0.0313, 0.0270, 0.0227, 0.0240, 0.0255, 0.0280, 0.0302, 0.0280, 0.0225, 0.0215, 0.0209, 0.0424, 0.0639, 0.1401, 0.2131, 0.3250, 0.4369, 0.5210, 0.6265, 0.6795, 0.7336, 0.7551, 0.7784, 0.7890, 0.7994, 0.8070, + 0.8146, 0.8210, 0.8277, 0.8321, 0.8362, 0.8398, 0.8439, 0.8470, 0.8504, 0.8530, 0.8572, 0.8612, 0.8653, 0.8689, 0.8715, 0.8730, 0.8747, 0.8766, 0.8788, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//I9 RED 217 0.0258 0.0220 0.0189 0.0174 0.0162 0.0148 0.0139 0.0133 0.0127 0.0133 0.0168 0.0268 0.0367 0.0313 0.0227 0.0255 0.0302 0.0225 0.0209 0.0639 0.2131 0.4369 0.6265 0.7336 0.7784 0.7994 0.8146 0.8277 0.8362 0.8439 0.8504 0.8572 0.8653 0.8715 0.8747 0.8788 + +const double ColorTemp::JDC468_YelN10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0531, 0.0520, 0.0504, 0.0510, 0.0518, 0.0608, 0.0628, 0.0669, 0.0699, 0.0705, 0.0716, 0.0720, 0.0735, 0.0755, 0.0775, 0.0800, 0.0825, 0.0896, 0.0969, 0.1260, 0.1563, 0.2312, 0.3096, 0.4132, 0.5177, 0.5905, 0.6637, + 0.7251, 0.7350, 0.7458, 0.7480, 0.7507, 0.7460, 0.7414, 0.7356, 0.7301, 0.7320, 0.7347, 0.7390, 0.7438, 0.7472, 0.7500, 0.7508, 0.7515, 0.7528, 0.7538, 0.7550, 0.7563, 0.7581, 0.7607, 0.7642, 0.7686, 0.7710, + 0.7791, 0.7840, 0.7872, 0.7902, 0.7935, 0.7955, 0.7979, 0.7995, 0.8021, 0.8035, 0.8058, 0.8072, 0.8090, 0.8110, 0.8143, 0.8198, 0.8259, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//n10 348 0.0531 0.0504 0.0518 0.0628 0.0699 0.0716 0.0735 0.0775 0.0825 0.0969 0.1563 0.3096 0.5177 0.6637 0.7251 0.7458 0.7507 0.7414 0.7301 0.7347 0.7438 0.7500 0.7515 0.7538 0.7563 0.7607 0.7686 0.7791 0.7872 0.7935 0.7979 0.8021 0.8058 0.8090 0.8143 0.8259 +const double ColorTemp::JDC468_GreN7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0112, 0.0102, 0.0094, 0.0096, 0.0099, 0.0100, 0.0100, 0.0100, 0.0100, 0.0099, 0.0099, 0.0099, 0.0099, 0.0099, 0.0099, 0.0100, 0.0100, 0.0103, 0.0107, 0.0129, 0.0151, 0.0312, 0.0462, 0.1015, 0.1571, 0.2270, 0.2977, + 0.3558, 0.3441, 0.3321, 0.3020, 0.2710, 0.2312, 0.1954, 0.1602, 0.1251, 0.1003, 0.0794, 0.0672, 0.0563, 0.0513, 0.0452, 0.0418, 0.0378, 0.0356, 0.0337, 0.0336, 0.0335, 0.0345, 0.0358, 0.0383, 0.0405, 0.0445, 0.0497, + 0.0612, 0.0647, 0.0670, 0.0660, 0.0644, 0.0620, 0.0574, 0.0525, 0.0483, 0.0460, 0.0436, 0.0484, 0.0532, 0.0690, 0.0870, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//n7 345 0.0112 0.0094 0.0099 0.0100 0.0100 0.0099 0.0099 0.0099 0.0100 0.0107 0.0151 0.0462 0.1571 0.2977 0.3558 0.3321 0.2710 0.1954 0.1251 0.0794 0.0563 0.0452 0.0378 0.0337 0.0335 0.0358 0.0405 0.0497 0.0612 0.0670 0.0644 0.0574 0.0483 0.0436 0.0532 0.0870 + +const double ColorTemp::JDC468_GreA10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0958, 0.1010, 0.1090, 0.1172, 0.1352, 0.1954, 0.1957, 0.2178, 0.2402, 0.2477, 0.2553, 0.2594, 0.2622, 0.2667, 0.2707, 0.2760, 0.2805, 0.2913, 0.3023, 0.3376, 0.3715, 0.4345, 0.5030, 0.5702, 0.6376, 0.6724, 0.7072, + 0.7216, 0.7160, 0.7110, 0.6990, 0.6865, 0.6667, 0.6446, 0.6174, 0.5921, 0.5727, 0.5511, 0.5386, 0.5238, 0.5134, 0.5070, 0.4980, 0.4918, 0.4867, 0.4830, 0.4834, 0.4838, 0.4889, 0.4906, 0.4976, 0.5046, 0.5162, 0.5279, + 0.5519, 0.5589, 0.5649, 0.5645, 0.5639, 0.5576, 0.5552, 0.5480, 0.5407, 0.5377, 0.5326, 0.5387, 0.5498, 0.5732, 0.5966, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::JDC468_GreQ7_spect[97] = { //468 Q7 + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0149, 0.0139, 0.0133, 0.0128, 0.0123, 0.01185, 0.0114, 0.011, 0.0106, 0.01045, 0.0103, 0.0104, 0.0105, 0.01065, 0.0108, 0.0109, 0.0110, 0.0117, 0.0124, 0.0205, 0.0283, 0.071, 0.1122, 0.2051, + 0.3017, 0.385, 0.4690, 0.4880, 0.5069, 0.4811, 0.4561, 0.411, 0.3687, 0.3185, 0.2673, 0.2190, 0.1703, 0.1371, 0.1042, 0.086, 0.0695, 0.598, 0.0527, 0.0475, 0.04210, 0.039, 0.03600, 0.0357, 0.0355, 0.037, + 0.0381, 0.0405, 0.0438, 0.0499, 0.0555, 0.0635, 0.0708, 0.074, 0.0789, 0.077, 0.0751, 0.071, 0.0658, 0.059, 0.0530, 0.049, 0.0458, 0.052, 0.0570, 0.077, 0.0982, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//a10 Green 10 0.0958 0.1090 0.1352 0.1957 0.2402 0.2553 0.2622 0.2707 0.2805 0.3023 0.3715 0.5030 0.6376 0.7072 0.7216 0.7110 0.6865 0.6446 0.5921 0.5511 0.5238 0.5070 0.4918 0.4830 0.4838 0.4906 0.5046 0.5279 0.5519 0.5649 0.5639 0.5552 0.5407 0.5326 0.5498 0.5966 +const double ColorTemp::JDC468_GreK7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0114, 0.0111, 0.0109, 0.0107, 0.0105, 0.0106, 0.0108, 0.0107, 0.0106, 0.0105, 0.0104, 0.0103, 0.0103, 0.0106, 0.0109, 0.0112, 0.0118, 0.0135, 0.0153, 0.0244, 0.0334, 0.0666, 0.0984, 0.1534, 0.2082, 0.2412, 0.2835, + 0.2959, 0.2843, 0.2735, 0.2516, 0.2305, 0.2012, 0.1728, 0.1435, 0.1156, 0.0964, 0.0772, 0.0671, 0.0570, 0.0518, 0.0468, 0.0436, 0.0397, 0.0380, 0.0354, 0.0354, 0.0355, 0.0367, 0.0380, 0.0402, 0.0426, 0.0481, 0.0523, + 0.0643, 0.0678, 0.0704, 0.0693, 0.0676, 0.0639, 0.0609, 0.0567, 0.0514, 0.0487, 0.0468, 0.0518, 0.0567, 0.0730, 0.0902, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//k7 Green 267 0.0114 0.0109 0.0105 0.0108 0.0106 0.0104 0.0103 0.0109 0.0118 0.0153 0.0334 0.0984 0.2082 0.2835 0.2959 0.2735 0.2305 0.1728 0.1156 0.0772 0.0570 0.0468 0.0397 0.0354 0.0355 0.0380 0.0426 0.0523 0.0643 0.0704 0.0676 0.0609 0.0514 0.0468 0.0567 0.0902 + +const double ColorTemp::JDC468_PurE24_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0677, 0.901, 0.1043, 0.1298, 0.1534, 0.1913, 0.2297, 0.2553, 0.2756, 0.2789, 0.2620, 0.2380, 0.2135, 0.1837, 0.1536, 0.1312, 0.1068, 0.0867, 0.0663, 0.0517, 0.0368, 0.0309, 0.0247, 0.0214, 0.0186, 0.0151, 0.0116, + 0.0077, 0.0079, 0.0079, 0.0083, 0.0086, 0.0077, 0.0071, 0.0071, 0.0072, 0.0107, 0.0147, 0.0298, 0.0440, 0.0661, 0.0880, 0.1010, 0.1152, 0.1193, 0.1236, 0.1260, 0.1287, 0.1326, 0.1366, 0.1428, 0.1489, 0.1596, 0.1697, + 0.1936, 0.1996, 0.2057, 0.2036, 0.2015, 0.1954, 0.1890, 0.1798, 0.1706, 0.1651, 0.1603, 0.1692, 0.1788, 0.2075, 0.2363, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//E24 Pur 128 0.0677 0.1043 0.1534 0.2297 0.2756 0.2620 0.2135 0.1536 0.1068 0.0663 0.0368 0.0247 0.0186 0.0116 0.0077 0.0079 0.0086 0.0071 0.0072 0.0147 0.0440 0.0880 0.1152 0.1236 0.1287 0.1366 0.1489 0.1697 0.1936 0.2057 0.2015 0.1890 0.1706 0.1603 0.1788 0.2363 + //spectral data 468 color : Blue H10 - Gamut > WidegamutRGB const double ColorTemp::JDC468_BluH10_spect[97] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 0.01590, 0.028, 0.03970, 0.0697, 0.09970, 0.1526, 0.20550, 0.253, 0.30110, 0.3412, 0.38180, 0.423, 0.46610, 0.4683, 0.51030, 0.4999, 0.49950, 0.4785, 0.45810, 0.429, 0.39950, 0.374, 0.35010, 0.3135, 0.29630, + 0.01590, 0.028, 0.03970, 0.0697, 0.09970, 0.1526, 0.20550, 0.253, 0.30110, 0.3412, 0.38180, 0.423, 0.46610, 0.4683, 0.51030, 0.5005, 0.49950, 0.4785, 0.45810, 0.429, 0.39950, 0.374, 0.35010, 0.3135, 0.29630, 0.2587, 0.22070, 0.182, 0.14450, 0.1125, 0.09060, 0.072, 0.04810, 0.033, 0.01740, 0.0113, 0.00520, 0.004, 0.00290, 0.0028, 0.00270, 0.0027, 0.00270, 0.0027, 0.00280, 0.0027, 0.00270, 0.0028, 0.00280, - 0.0029, 0.00300, 0.0029, 0.00290, 0.0029, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.0031, 0.00320, 0.0035, 0.00380, 0.047, 0.00560, + 0.0029, 0.00300, 0.0029, 0.00290, 0.0029, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.00290, 0.0029, 0.0031, 0.00320, 0.0035, 0.00380, 0.0047, 0.00560, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +//0.0159, 0.028, 0.0397, 0.0697, 0.0997, 0.1526, 0.2055, 0.253, 0.3011, 0.3412, 0.3818, 0.423, 0.4661, 0.5103 0.4995 0.4581 0.3995 0.3501 0.2963 +//0.2207 0.1445 0.0906 0.0481 0.0174 0.0052 0.0029 0.0027 0.0027 0.0028 0.0027 0.0028 0.0030 0.0029 0.0029 0.0029 0.0029 0.0029 0.0029 +//0.0029 0.0032 0.0038 0.0056 + +const double ColorTemp::JDC468_BluD6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1127, 0.143, 0.1773, 0.223, 0.2813, 0.3987, 0.4782, 0.5665, 0.6470, 0.6870, 0.7270, 0.7403, 0.7593, 0.7592, 0.7591, 0.7480, 0.7402, 0.7234, 0.7054, 0.6876, 0.6617, 0.6512, 0.6302, 0.6124, 0.5962, 0.5660, + 0.5352, 0.5009, 0.4655, 0.4356, 0.4191, 0.3923, 0.3619, 0.3145, 0.2653, 0.2245, 0.1744, 0.1499, 0.1255, 0.1124, 0.1014, 0.0972, 0.0855, 0.0786, 0.0715, 0.0659, 0.0626, 0.0625, 0.0624, 0.0645, 0.0670, 0.0714, + 0.0769, 0.0865, 0.0964, 0.1086, 0.1200, 0.123, 0.1327, 0.1309, 0.1281, 0.1214, 0.1146, 0.1023, 0.0950, 0.0901, 0.0839, 0.0918, 0.1009, 0.1260, 0.1597, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + + +}; +//d6 blue 84 0.1127 0.1773 0.2813 0.4782 0.6470 0.7270 0.7593 0.7591 0.7402 0.7054 0.6617 0.6302 0.5962 0.5352 0.4655 0.4191 0.3619 0.2653 0.1744 0.1255 0.1014 0.0855 0.0715 0.0626 0.0624 0.0670 0.0769 0.0964 0.1200 0.1327 0.1281 0.1146 0.0950 0.0839 0.1009 0.1597 +const double ColorTemp::JDC468_BluF4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0180, 0.0270, 0.0324, 0.0453, 0.0611, 0.0845, 0.1066, 0.1234, 0.1446, 0.1567, 0.1718, 0.1867, 0.1954, 0.2024, 0.2083, 0.2090, 0.2096, 0.2060, 0.2036, 0.1990, 0.1947, 0.1920, 0.1901, 0.1856, 0.1794, 0.1667, 0.1516, 0.1321, + 0.1167, 0.1032, 0.0876, 0.0730, 0.0584, 0.0445, 0.0296, 0.0212, 0.0125, 0.0099, 0.0069, 0.0060, 0.0053, 0.0050, 0.0049, 0.0047, 0.0046, 0.0045, 0.0044, 0.0043, 0.0043, 0.0043, 0.0043, 0.0046, 0.0049, 0.0050, 0.0052, 0.0057, + 0.0063, 0.0066, 0.0069, 0.0067, 0.0066, 0.0063, 0.0059, 0.0056, 0.0053, 0.0054, 0.0055, 0.0062, 0.0069, 0.0099, 0.0122, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +// f4 blue 134 0.0180 0.0324 0.0611 0.1066 0.1446 0.1718 0.1954 0.2083 0.2096 0.2036 0.1947 0.1901 0.1794 0.1516 0.1167 0.0876 0.0584 0.0296 0.0125 0.0069 0.0053 0.0049 0.0046 0.0044 0.0043 0.0043 0.0049 0.0052 0.0063 0.0069 0.0066 0.0059 0.0053 0.0055 0.0069 0.0122 +const double ColorTemp::JDC468_GreI8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0230, 0.0232, 0.0234, 0.0254, 0.0263, 0.0298, 0.0329, 0.0367, 0.0377, 0.0388, 0.0399, 0.0410, 0.0421, 0.0440, 0.0460, 0.0481, 0.0496, 0.0523, 0.0559, 0.0645, 0.0727, 0.0878, 0.1020, 0.1156, 0.1288, 0.1334, 0.1394, 0.1398, + 0.1402, 0.1407, 0.1413, 0.1409, 0.1396, 0.1334, 0.1276, 0.1200, 0.1129, 0.1095, 0.1064, 0.1053, 0.1043, 0.1031, 0.1021, 0.1001, 0.0980, 0.0970, 0.0952, 0.0963, 0.0967, 0.0990, 0.1009, 0.1042, 0.1078, 0.1130, 0.1188, 0.1251, + 0.1307, 0.1335, 0.1374, 0.1376, 0.1378, 0.1362, 0.1345, 0.1312, 0.1278, 0.1257, 0.1240, 0.1290, 0.1345, 0.1476, 0.1615, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +// i8 green215 215 0.0230 0.0234 0.0263 0.0329 0.0377 0.0399 0.0421 0.0460 0.0496 0.0559 0.0727 0.1020 0.1288 0.1394 0.1402 0.1413 0.1396 0.1276 0.1129 0.1064 0.1043 0.1021 0.0980 0.0952 0.0967 0.1009 0.1078 0.1188 0.1307 0.1374 0.1378 0.1345 0.1278 0.1240 0.1345 0.1615 + +const double ColorTemp::JDC468_OraO18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0826, 0.0830, 0.0832, 0.0861, 0.0892, 0.0993, 0.1108, 0.1180, 0.1248, 0.1253, 0.1263, 0.1261, 0.1259, 0.1267, 0.1289, 0.1304, 0.1319, 0.1370, 0.1419, 0.1631, 0.1851, 0.2311, 0.2743, 0.3131, 0.3536, 0.3551, 0.3585, 0.3488, 0.3322, + 0.3470, 0.3575, 0.3680, 0.3498, 0.3316, 0.3224, 0.3129, 0.3578, 0.4013, 0.4734, 0.5454, 0.5978, 0.6502, 0.6745, 0.6982, 0.7080, 0.7182, 0.7273, 0.7269, 0.7308, 0.7342, 0.7393, 0.7436, 0.7498, 0.7550, 0.7597, 0.7640, 0.7680, 0.7713, + 0.7766, 0.7786, 0.7816, 0.7841, 0.7863, 0.7889, 0.7902, 0.7931, 0.7957, 0.7997, 0.8068, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; +// o18 ora 382 382 0.0826 0.0832 0.0892 0.1108 0.1248 0.1263 0.1259 0.1289 0.1319 0.1419 0.1851 0.2743 0.3536 0.3585 0.3322 0.3470 0.3680 0.3316 0.3129 0.4013 0.5454 0.6502 0.6982 0.7182 0.7269 0.7342 0.7436 0.7550 0.7640 0.7713 0.7766 0.7816 0.7863 0.7902 0.7957 0.8068 +const double ColorTemp::JDC468_OraD17_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0462, 0.0442, 0.0422, 0.0401, 0.0383, 0.0390, 0.0396, 0.0396, 0.0395, 0.0388, 0.0380, 0.0378, 0.0376, 0.0381, 0.0384, 0.0391, 0.0399, 0.0421, 0.0451, 0.0561, 0.0676, 0.0934, 0.1189, 0.1432, 0.1671, 0.1650, 0.1632, 0.1512, 0.1402, 0.1456, + 0.1521, 0.1613, 0.1696, 0.1552, 0.1409, 0.1342, 0.1283, 0.1689, 0.2084, 0.2845, 0.3575, 0.4183, 0.4797, 0.5090, 0.5389, 0.5498, 0.5617, 0.5667, 0.5728, 0.5788, 0.5822, 0.5889, 0.5938, 0.6011, 0.6081, 0.6145, 0.6212, 0.6267, 0.6304, 0.6331, + 0.6352, 0.6361, 0.6373, 0.6372, 0.6370, 0.6376, 0.6384, 0.6413, 0.6483, 0.6523, 0.6668, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; + +// d17 ora 95 95 0.0462 0.0422 0.0383 0.0396 0.0395 0.0380 0.0376 0.0384 0.0399 0.0451 0.0676 0.1189 0.1671 0.1632 0.1402 0.1521 0.1696 0.1409 0.1283 0.2084 0.3575 0.4797 0.5389 0.5617 0.5728 0.5822 0.5938 0.6081 0.6212 0.6304 0.6352 0.6373 0.6370 0.6384 0.6483 0.6668 //spectral data ColorLab : Skin 35 15 17 const double ColorTemp::ColabSkin35_15_17_spect[97] = { @@ -827,7 +1711,877 @@ const double ColorTemp::ColabSky42_0_m24_spect[97] = { 0.0979, 0.112, 0.1269, 0.134, 0.1430, 0.147, 0.1497, 0.151, 0.1529, 0.1545, 0.1561, 0.158, 0.1603, 0.1616, 0.1627, 0.1625, 0.1623, 0.1614, 0.1605, 0.159, 0.1575, 0.1567, 0.1557, 0.1563, 0.1569, 0.159, 0.1627, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; +//spectral data ColorLab : blue 77 -44 -50 +const double ColorTemp::Colorblue_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0316, 0.0480, 0.0658, 0.0925, 0.1199, 0.1812, 0.2424, 0.2770, 0.3145, 0.3430, 0.3702, 0.4022, 0.4346, 0.4560, 0.4778, 0.4843, 0.4902, 0.4940, 0.4960, 0.4920, 0.4889, 0.4820, + 0.4764, 0.4685, 0.4606, 0.4486, 0.4379, 0.4160, 0.3955, 0.3640, 0.3330, 0.2990, 0.2660, 0.2291, 0.1991, 0.1705, 0.1403, 0.1220, 0.1067, 0.0967, 0.0907, 0.0846, 0.0785, 0.0698, + 0.0601, 0.0525, 0.0455, 0.0423, 0.0386, 0.0370, 0.0358, 0.0354, 0.0351, 0.0368, 0.0382, 0.0413, 0.0449, 0.0474, 0.0492, 0.0484, 0.0477, 0.0460, 0.0437, 0.0402, 0.0371, 0.0349, + 0.0329, 0.0341, 0.0356, 0.0410, 0.0462, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + +}; +//0.1571 0.2150 0.3040 0.3684 0.3952 0.3965 0.3782 0.3418 0.2995 0.2543 0.2043 0.1686 0.1420 0.1070 0.0785 0.0725 0.0755 0.0695 0.0680 0.0914 0.1379 0.1833 0.2038 0.2065 0.2079 0.2110 0.2176 0.2319 0.2518 0.2632 0.2616 0.2522 0.2380 0.2290 0.2432 0.2901 + +const double ColorTemp::ColorViolA1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1571, 0.185, 0.2150, 0.255, 0.3040, 0.332, 0.3684, 0.381, 0.3952, 0.3956, 0.3965, 0.387, 0.3782, 0.362, 0.3418, 0.322, 0.2995, 0.275, 0.2543, 0.229, 0.2043, 0.185, 0.1686, + 0.155, 0.1420, 0.131, 0.1070, 0.093, 0.0785, 0.075, 0.0725, 0.074, 0.0755, 0.072, 0.0695, 0.069, 0.0680, 0.083, 0.0914, 0.115, 0.1379, 0.162, 0.1833, 0.193, 0.2038, 0.205, + 0.2065, 0.207, 0.2079, 0.209, 0.2110, 0.214, 0.2176, 0.226, 0.2319, 0.242, 0.2518, 0.258, 0.2632, 0.263, 0.2616, 0.256, 0.2522, 0.246, 0.2380, 0.233, 0.2290, 0.235, 0.2432, 0.265, 0.2901, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//0.2270 0.2413 0.3287 0.4079 0.4469 0.4594 0.4535 0.4268 0.3886 0.3427 0.2866 0.2433 0.2087 0.1604 0.1181 0.1069 0.1098 0.0985 0.0916 0.1130 0.1496 0.1746 0.1783 0.1742 0.1738 0.1763 0.1831 0.1975 0.2169 0.2274 0.2247 0.2140 0.1990 0.1897 0.2039 0.2508 + +const double ColorTemp::ColorViolA4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2270, 0231, 0.2413, 0.286, 0.3287, 0.367, 0.4079, 0.427, 0.4469, 0.452, 0.4594, 0.456, 0.4535, 0.432, 0.4268, 0.403, 0.3886, 0.368, 0.3427, 0.314, 0.2866, 0.265, 0.2433, 0.222, + 0.2087, 0.183, 0.1604, 0.130, 0.1181, 0.112, 0.1069, 0.108, 0.1098, 0.103, 0.0985, 0.094, 0.0916, 0.104, 0.1130, 0.131, 0.1496, 0.152, 0.1746, 0.176, 0.1783, 0.176, 0.1742, 0.174, + 0.1738, 0.175, 0.1763, 0.181, 0.1831, 0.192, 0.1975, 0.206, 0.2169, 0.222, 0.2274, 0.226, 0.2247, 0.219, 0.2140, 0.206, 0.1990, 0.195, 0.1897, 0.196, 0.2039, 0.221, 0.2508, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.1426 0.2660 0.3556 0.4259 0.4459 0.4317 0.3942 0.3425 0.2917 0.2413 0.1885 0.1524 0.1267 0.0948 0.0700 0.0661 0.0708 0.0671 0.0699 0.1092 0.2099 0.3582 0.4857 0.5583 0.5950 0.6146 0.6307 0.6495 0.6720 0.6825 0.6809 0.6718 0.6593 0.6517 0.6649 0.7066 +const double ColorTemp::ColorViolA6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1426, 0.203, 0.2660, 0.315, 0.3556, 0.392, 0.4259, 0.435, 0.4459, 0.437, 0.4317, 0.417, 0.3942, 0.365, 0.3425, 0.317, 0.2917, 0.266, 0.2413, 0.218, 0.1885, 0.172, 0.1524, 0.141, + 0.1267, 0.112, 0.0948, 0.083, 0.0700, 0.068, 0.0661, 0.068, 0.0708, 0.069, 0.0671, 0.068, 0.0699, 0.900, 0.1092, 0.159, 0.2099, 0.284, 0.3582, 0.441, 0.4857, 0.525, 0.5583, 0.567, + 0.5950, 0.605, 0.6146, 0.623, 0.6307, 0.638, 0.6495, 0.661, 0.6720, 0.679, 0.6825, 0.681, 0.6809, 0.675, 0.6718, 0.667, 0.6593, 0.655, 0.6517, 0.658, 0.6649, 0.681, 0.7066, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.4939 0.3859 0.4198 0.4780 0.5328 0.5672 0.5880 0.5994 0.6029 0.5981 0.5808 0.5618 0.5369 0.4819 0.4190 0.3921 0.3815 0.3400 0.2991 0.2977 0.3090 0.3088 0.2930 0.2753 0.2660 0.2636 0.2678 0.2811 0.2995 0.3125 0.3153 0.3111 0.3006 0.2952 0.3116 0.3584 +const double ColorTemp::ColorBlueSkyK3_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4939, 0.435, 0.3859, 0.403, 0.4198, 0.446, 0.4780, 0.505, 0.5328, 0.552, 0.5672, 0.578, 0.5880, 0.595, 0.5994, 0.602, 0.6029, 0.600, 0.5981, 0.588, 0.5808, 0.571, 0.5618, 0.551, + 0.5369, 0.503, 0.4819, 0.452, 0.4190, 0.404, 0.3921, 0.386, 0.3815, 0.364, 0.3400, 0.321, 0.2991, 0.298, 0.2977, 0.304, 0.3090, 0.309, 0.3088, 0.302, 0.2930, 0.284, 0.2753, 0.271, + 0.2660, 0.265, 0.2636, 0.266, 0.2678, 0.275, 0.2811, 0.290, 0.2995, 0.306, 0.3125, 0.314, 0.3153, 0.313, 0.3111, 0.307, 0.3006, 0.298, .2952, 0.306, 0.3116, 0.325, 0.3584, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0.4058 0.4734 0.5372 0.6051 0.6698 0.6992 0.7118 0.7135 0.7071 0.6938 0.6702 0.6511 0.6282 0.5732 0.5103 0.4913 0.4926 0.4604 0.4341 0.4648 0.5111 0.5335 0.5283 0.5154 0.5098 0.5093 0.5151 0.5309 0.5520 0.5642 0.5657 0.5598 0.5489 0.5430 0.5601 0.6067 + +const double ColorTemp::ColorBlueSkyK9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4058, 0.441, 0.4734, 0.502, 0.5372, 0.585, 0.6051, 0.643, 0.6698, 0.685, 0.6992, 0.705, 0.7118, 0.712, 0.7135, 0.711, 0.7071, 0.702, 0.6938, 0.681, 0.6702, 0.663, 0.6511, 0.642, + 0.6282, 0.604, 0.5732, 0.542, 0.5103, 0.499, 0.4913, 0.492, 0.4926, 0.475, 0.4604, 0.452, 0.4341, 0.453, 0.4648, 0.496, 0.5111, 0.525, 0.5335, 0.531, 0.5283, 0.522, 0.5154, 0.512, + 0.5098, 0.509, 0.5093, 0.513, 0.5151, 0.523, 0.5309, 0.544, 0.5520, 0.562, 0.5642, 0.565, 0.5657, 0.562, 0.5598, 0.554, 0.5489, 0.546, 0.5430, 0.553, 0.5601, 0.576, 0.6067, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//42 C4 0.3280 0.2611 0.3781 0.4646 0.5292 0.5732 0.6112 0.6307 0.6310 0.6181 0.5847 0.5488 0.5066 0.4358 0.3585 0.3151 0.2855 0.2309 0.1786 0.1546 0.1443 0.1359 0.1245 0.1151 0.1120 0.1127 0.1169 0.1275 0.1421 0.1504 0.1488 0.1416 0.1303 0.1241 0.1355 0.1739 +const double ColorTemp::ColorBlueSkyC4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3280, 0.2950, 0.2611, 0.304, 0.3781, 0.423, 0.4646, 0.498, 0.5292, 0.555, 0.5732, 0.591, 0.6112, 0.6221, 0.6307, 0.631, 0.6310, 0.625, 0.6181, 0.607, 0.5847, 0.563, 0.5488, 0.524, + 0.5066, 0.465, 0.4358, 0.398, 0.3585, 0.336, 0.3151, 0.302, 0.2855, 0.254, 0.2309, 0.203, 0.1786, 0.166, 0.1546, 0.149, 0.1443, 0.143, 0.1359, 0.131, 0.1245, 0.123, 0.115, 0.114, + 0.1120, 0.112, 0.1127, 0.114, 0.1169, 0.122, 0.1275, 0.133, 0.1421, 0.147, 0.1504, 0.149, 0.1488, 0.145, 0.1416, 0.136, 0.1303, 0.127, 0.1241, 0.132, 0.1355, 0.155, 0.1739, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//52 C14 0.5697 0.4660 0.5000 0.5560 0.6072 0.6402 0.6632 0.6850 0.7069 0.7292 0.7488 0.7678 0.7786 0.7721 0.7544 0.7394 0.7232 0.6889 0.6446 0.6171 0.5966 0.5743 0.5425 0.5093 0.4884 0.4784 0.4774 0.4822 0.4944 0.5076 0.5186 0.5268 0.5303 0.5332 0.5454 0.5760 +const double ColorTemp::ColorBlueSkyC14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5697, 0.511, 0.4660, 0.481, 0.5000, 0.528, 0.5560, 0.583, 0.6072, 0.622, 0.6402, 0.653, 0.6632, 0.674, 0.6850, 0.699, 0.7069, 0.717, 0.7292, 0.735, 0.7488, 0.757, 0.7678, 0.773, + 0.7786, 0.776, 0.7721, 0.765, 0.7544, 0.746, 0.7394, 0.731, 0.7232, 0.704, 0.6889, 0.674, 0.6446, 0.631, 0.6171, 0.606, 0.5966, 0.585, 0.5743, 0.5570, 0.5425, 0.529, 0.5093, 0.498, + 0.4884, 0.482, 0.4784, 0.478, 0.4774, 0.481, 0.4822, 0.487, 0.4944, 0.503, 0.5076, 0.512, 0.5186, 0.522, 0.5268, 0.529, 0.5303, 0.532, 0.5332, 0.539, 0.5454, 0.565, 0.5760, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//80 E4 0.1483 0.1756 0.2536 0.3084 0.3665 0.4189 0.4746 0.5127 0.5239 0.5193 0.4917 0.4569 0.4123 0.3422 0.2672 0.2179 0.1820 0.1356 0.0972 0.0784 0.0698 0.0646 0.0592 0.0556 0.0546 0.0551 0.0571 0.0611 0.0670 0.0701 0.0692 0.0661 0.0620 0.0606 0.0663 0.0834 +const double ColorTemp::ColorBlueSkyE4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1483, 0.161, 0.1756, 0.213, 0.2536, 0.283, 0.3084, 0.331, 0.3665, 0.387, 0.4189, 0.445, 0.4746, 0.496, 0.5127, 0.519, 0.5239, 0.522, 0.5193, 0.508, 0.4917, 0.476, 0.4569, 0.431, + 0.4123, 0.375, 0.3422, 0.309, 0.2672, 0.242, 0.2179, 0.208, 0.1820, 0.162, 0.1356, 0.113, 0.0972, 0.091, 0.0784, 0.073, 0.0698, 0.066, 0.0646, 0.062, 0.0592, 0.057, 0.0556, 0.055, + 0.0546, 0.055, 0.0551, 0.056, 0.0571, 0.059, 0.0611, 0.064, 0.0670, 0.069, 0.0701, 0.070, 0.0692, 0.067, 0.0661, 0.065, 0.0620, 0.061, 0.0606, 0.063, 0.0663, 0.072, 0.0834, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//229 M1 0.3100 0.2922 0.3514 0.4042 0.4443 0.4769 0.5002 0.5133 0.5187 0.5179 0.5057 0.4928 0.4729 0.4235 0.3643 0.3371 0.3234 0.2827 0.2418 0.2338 0.2370 0.2329 0.2184 0.2028 0.1958 0.1937 0.1973 0.2084 0.2244 0.2351 0.2372 0.2331 0.2239 0.2178 0.2319 0.2731 +const double ColorTemp::ColorBlueSkyM1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3100, 0.303, 0.2922, 0.322, 0.3514, 0.376, 0.4042, 0.424, 0.4443, 0.457, 0.4769, 0.497, 0.5002, 0.507, 0.5133, 0.516, 0.5187, 0.518, 0.5179, 0.511, 0.5057, 0.497, 0.4928, 0.483, + 0.4729, 0.454, 0.4235, 0.398, 0.3643, 0.346, 0.3371, 0.329, 0.3234, 0.301, 0.2827, 0.263, 0.2418, 0.235, 0.2338, 0.235, 0.2370, 0.236, 0.2329, 0.226, 0.2184, 0.213, 0.2028, 0.198, + 0.1958, 0.194, 0.1937, 0.196, 0.1973, 0.203, 0.2084, 0.212, 0.2244, 0.233, 0.2351, 0.236, 0.2372, 0.234, 0.2331, 0.229, 0.2239, 0.222, 0.2178, 0.224, 0.2319, 0.251, 0.2731, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//514 2B1 0.5277 0.4431 0.4972 0.5820 0.6387 0.6750 0.7001 0.7140 0.7202 0.7193 0.7053 0.6891 0.6657 0.6181 0.5614 0.5312 0.5101 0.4589 0.4045 0.3857 0.3826 0.3751 0.3574 0.3393 0.3314 0.3304 0.3368 0.3523 0.3742 0.3874 0.3883 0.3818 0.3693 0.3616 0.3800 0.4324 +const double ColorTemp::ColorBlueSky2B1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5277, 0.485, 0.4431, 0.476, 0.4972, 0.539, 0.5820, 0.607, 0.6387, 0.653, 0.6750, 0.691, 0.7001, 0.707, 0.7140, 0.718, 0.7202, 0.720, 0.7193, 0.713, 0.7053, 0.695, 0.6891, 0.674, + 0.6657, 0.632, 0.6181, 0.587, 0.5614, 0.543, 0.5312, 0.521, 0.5101, 0.483, 0.4589, 0.431, 0.4045, 0.398, 0.3857, 0.385, 0.3826, 0.376, 0.3751, 0.364, 0.3574, 0.346, 0.3393, 0.335, + 0.3314, 0.331, 0.3304, 0.333, 0.3368, 0.346, 0.3523, 0.363, 0.3742, 0.382, 0.3874, 0.385, 0.3883, 0.384, 0.3818, 0.375, 0.3693, 0.364, 0.3616, 0.374, 0.3800, 0.396, 0.4324, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//368 T7 0.1943 0.3199 0.4536 0.5443 0.6043 0.6499 0.6839 0.7125 0.7329 0.7482 0.7527 0.7514 0.7383 0.7028 0.6526 0.6034 0.5500 0.4708 0.3848 0.3268 0.2929 0.2712 0.2493 0.2316 0.2243 0.2234 0.2288 0.2436 0.2640 0.2762 0.2767 0.2693 0.2566 0.2489 0.2665 0.3165 +const double ColorTemp::ColorBlueSkyT7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1943, 0.256, 0.3199, 0.376, 0.4536, 0.494, 0.5443, 0.572, 0.6043, 0.631, 0.6499, 0.664, 0.6839, 0.698, 0.7125, 0.726, 0.7329, 0.741, 0.7482, 0.751, 0.7527, 0.752, 0.7514, 0.745, + 0.7383, 0.721, 0.7028, 0.675, 0.6526, 0.631, 0.6034, 0.589, 0.5500, 0.512, 0.4708, 0.432, 0.3848, 0.342, 0.3268, 0.311, 0.2929, 0.282, 0.2712, 0.261, 0.2493, 0.236, 0.2316, 0.227, + 0.2243, 0.223, 0.2234, 0.229, 0.2288, 0.235, 0.2436, 0.255, 0.2640, 0.268, 0.2762, 0.277, 0.2767, 0.272, 0.2693, 0.263, 0.2566, 0.254, 0.2489, 0.255, 0.2665, 0.275, 0.3165, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//399 U19 0.5829 0.4865 0.4927 0.5690 0.6221 0.6532 0.6728 0.6832 0.6889 0.6884 0.6771 0.6648 0.6465 0.6038 0.5524 0.5297 0.5194 0.4797 0.4387 0.4356 0.4455 0.4444 0.4282 0.4094 0.4009 0.3992 0.4046 0.4185 0.4385 0.4515 0.4545 0.4505 0.4411 0.4368 0.4539 0.5013 +const double ColorTemp::ColorBlueSkyU19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5829, 0.534, 0.4865, 0.489, 0.4927, 0.532, 0.5690, 0.593, 0.6221, 0.641, 0.6532, 0.662, 0.6728, 0.674, 0.6832, 0.687, 0.6889, 0.688, 0.6884, 0.683, 0.6771, 0.671, 0.6648, 0.665, + 0.6465, 0.622, 0.6038, 0.583, 0.5524, 0.542, 0.5297, 0.523, 0.5194, 0.492, 0.4797, 0.451, 0.4387, 0.436, 0.4356, 0.442, 0.4455, 0.445, 0.4444, 0.432, 0.4282, 0.413, 0.4094, 0.404, + 0.4009, 0.400, 0.3992, 0.402, 0.4046, 0.411, 0.4185, 0.426, 0.4385, 0.446, 0.4515, 0.452, 0.4545, 0.452, 0.4505, 0.446, 0.4411, 0.438, 0.4368, 0.443, 0.4539, 0.467, 0.5013, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//382 U2 0.3594 0.3425 0.3214 0.3654 0.4097 0.4360 0.4590 0.4793 0.5002 0.5234 0.5476 0.5745 0.5940 0.5901 0.5703 0.5545 0.5384 0.5029 0.4592 0.4334 0.4149 0.3947 0.3657 0.3363 0.3177 0.3087 0.3077 0.3123 0.3231 0.3351 0.3454 0.3520 0.3545 0.3562 0.3674 0.3976 +const double ColorTemp::ColorBlueSkyU2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3594, 0.345, 0.3425, 0.333, 0.3214, 0.346, 0.3654, 0.387, 0.4097, 0.424, 0.4360, 0.446, 0.4590, 0.467, 0.4793, 0.494, 0.5002, 0.517, 0.5234, 0.538, 0.5476, 0.564, 0.5745, 0.583, + 0.5940, 0.593, 0.5901, 0.580, 0.5703, 0.563, 0.5545, 0.546, 0.5384, 0.521, 0.5029, 0.478, 0.4592, 0.444, 0.4334, 0.421, 0.4149, 0.408, 0.3947, 0.378, 0.3657, 0.352, 0.3363, 0.324, + 0.3177, 0.313, 0.3087, 0.308, 0.3077, 0.310, 0.3123, 0.317, 0.3231, 0.329, 0.3351, 0.339, 0.3454, 0.348, 0.3520, 0.353, 0.3545, 0.355, 0.3562, 0.359, 0.3674, 0.375, 0.3976, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//378 T17 0.4213 0.3332 0.4205 0.5078 0.5650 0.6025 0.6223 0.6279 0.6195 0.5981 0.5578 0.5197 0.4785 0.4074 0.3325 0.3030 0.2918 0.2511 0.2125 0.2105 0.2198 0.2199 0.2083 0.1945 0.1895 0.1898 0.1954 0.2094 0.2288 0.2406 0.2399 0.2317 0.2189 0.2108 0.2261 0.2755 +const double ColorTemp::ColorBlueSkyT17_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4213, 0.376, 0.3332, 0.387, 0.4205, 0.467, 0.5078, 0.532, 0.5650, 0.587, 0.6025, 0.611, 0.6223, 0.624, 0.6279, 0.623, 0.6195, 0.607, 0.5981, 0.576, 0.5578, 0.534, 0.5197, 0.499, + 0.4785, 0.435, 0.4074, 0.376, 0.3325, 0.317, 0.3030, 0.295, 0.2918, 0.272, 0.2511, 0.235, 0.2125, 0.212, 0.2105, 0.214, 0.2198, 0.219, 0.2199, 0.215, 0.2083, 0.202, 0.1945, 0.191, + 0.1895, 0.189, 0.1898, 0.193, 0.1954, 0.202, 0.2094, 0.215, 0.2288, 0.236, 0.2406, 0.240, 0.2399, 0.236, 0.2317, 0.225, 0.2189, 0.214, 0.2108, 0.218, 0.2261, 0.245, 0.2755, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//236 M8 -0.0593 0.0128 0.0031 0.0149 0.0197 0.0221 0.0223 0.0230 0.0232 0.0237 0.0243 0.0247 0.0249 0.0249 0.0248 0.0247 0.0244 0.0240 0.0240 0.0242 0.0244 0.0247 0.0252 0.0254 0.0262 0.0269 0.0271 0.0273 0.0278 0.0280 0.0276 0.0275 0.0282 0.0288 0.0295 0.0303 +const double ColorTemp::ColorBlackM8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0593, 0.040, 0.0128, 0.023, 0.0031, 0.024, 0.0149, 0.017, 0.0197, 0.021, 0.0221, 0.022, 0.0223, 0.023, 0.0230, 0.023, 0.0232, 0.023, 0.0237, 0.024, 0.0243, 0.024, 0.0247, 0.024, + 0.0249, 0.025, 0.0249, 0.025, 0.0248, 0.025, 0.0247, 0.024, 0.0244, 0.024, 0.0240, 0.024, 0.0240, 0.024, 0.0242, 0.024, 0.0244, 0.024, 0.0247, 0.025, 0.0252, 0.025, 0.0254, 0.026, + 0.0262, 0.027, 0.0269, 0.027, 0.0271, 0.027, 0.0273, 0.027, 0.0278, 0.028, 0.0280, 0.028, 0.0276, 0.028, 0.0275, 0.028, 0.0282, 0.028, 0.0288, 0.029, 0.0295, 0.030, 0.0303, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//240 M12 -0.0377 0.0146 0.0167 0.0222 0.0257 0.0261 0.0270 0.0271 0.0274 0.0281 0.0287 0.0299 0.0306 0.0304 0.0297 0.0285 0.0277 0.0267 0.0257 0.0257 0.0258 0.0259 0.0263 0.0276 0.0279 0.0288 0.0297 0.0302 0.0304 0.0303 0.0302 0.0303 0.0310 0.0321 0.0337 0.0356 +const double ColorTemp::ColorBlackM12_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0377, 0.022, 0.0146, 0.015, 0.0167, 0.020, 0.0222, 0.023, 0.0257, 0.026, 0.0261, 0.027, 0.0270, 0.027, 0.0271, 0.027, 0.0274, 0.028, 0.0281, 0.028, 0.0287, 0.029, 0.0299, 0.030, + 0.0306, 0.030, 0.0304, 0.030, 0.0297, 0.029, 0.0285, 0.028, 0.0277, 0.027, 0.0267, 0.026, 0.0257, 0.026, 0.0257, 0.026, 0.0258, 0.026, 0.0259, 0.026, 0.0263, 0.027, 0.0276, 0.028, + 0.0279, 0.028, 0.0288, 0.029, 0.0297, 0.030, 0.0302, 0.030, 0.0304, 0.030, 0.0303, 0.030, 0.0302, 0.030, 0.0303, 0.031, 0.0310, 0.031, 0.0321, 0.033, 0.0337, 0.035, 0.0356, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//241 M13 0.2961 0.0487 0.0261 0.0330 0.0296 0.0305 0.0305 0.0314 0.0320 0.0322 0.0335 0.0348 0.0352 0.0347 0.0336 0.0325 0.0314 0.0299 0.0284 0.0284 0.0286 0.0288 0.0290 0.0299 0.0306 0.0314 0.0320 0.0328 0.0332 0.0331 0.0330 0.0328 0.0337 0.0350 0.0366 0.0385 +const double ColorTemp::ColorBlackM13_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2961, 0.100, 0.0487, 0.035, 0.0261, 0.030, 0.0330, 0.031, 0.0296, 0.030, 0.0305, 0.030, 0.0305, 0.031, 0.0314, 0.032, 0.0320, 0.032, 0.0322, 0.033, 0.0335, 0.034, 0.0348, 0.035, + 0.0352, 0.035, 0.0347, 0.034, 0.0336, 0.033, 0.0325, 0.032, 0.0314, 0.030, 0.0299, 0.029, 0.0284, 0.028, 0.0284, 0.029, 0.0286, 0.029, 0.0288, 0.029, 0.0290, 0.030, 0.0299, 0.030, + 0.0306, 0.031, 0.0314, 0.032, 0.0320, 0.032, 0.0328, 0.033, 0.0332, 0.033, 0.0331, 0.033, 0.0330, 0.033, 0.0328, 0.033, 0.0337, 0.034, 0.0350, 0.036, 0.0366, 0.037, 0.0385, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//525 2B12 0.3848 0.4127 0.4780 0.5375 0.5917 0.6194 0.6353 0.6485 0.6625 0.6784 0.7010 0.7367 0.7706 0.7847 0.7843 0.7826 0.7799 0.7689 0.7521 0.7463 0.7401 0.7314 0.7168 0.7008 0.6904 0.6860 0.6861 0.6896 0.6986 0.7064 0.7138 0.7185 0.7233 0.7281 0.7338 0.7498 +const double ColorTemp::ColorWhite2B12_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3848, 0.405, 0.4127, 0.435, 0.4780, 0.501, 0.5375, 0.572, 0.5917, 0.606, 0.6194, 0.627, 0.6353, 0.642, 0.6485, 0.653, 0.6625, 0.669, 0.6784, 0.692, 0.7010, 0.072, 0.7367, 0.0760, + 0.7706, 0.775, 0.7847, 0.784, 0.7843, 0.784, 0.7826, 0.781, 0.7799, 0.775, 0.7689, 0.762, 0.7521, 0.748, 0.7463, 0.743, 0.7401, 0.731, 0.7314, 0.723, 0.7168, 0.705, 0.7008, 0.701, + 0.6904, 0.689, 0.6860, 0.686, 0.6861, 0.687, 0.6896, 0.691, 0.6986, 0.701, 0.7064, 0.711, 0.7138, 0.715, 0.7185, 0.721, 0.7233, 0.725, 0.7281, 0.731, 0.7338, 0.741, 0.7498, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//527 2B14 0.6608 0.5900 0.6114 0.6747 0.7329 0.7599 0.7706 0.7776 0.7831 0.7890 0.7952 0.8074 0.8185 0.8214 0.8201 0.8218 0.8244 0.8229 0.8192 0.8281 0.8344 0.8388 0.8415 0.8445 0.8495 0.8521 0.8556 0.8604 0.8666 0.8687 0.8687 0.8672 0.8682 0.8703 0.8720 0.8803 +const double ColorTemp::ColorWhite2B14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.6608, 0.631, 0.5900, 0.605, 0.6114, 0.634, 0.6747, 0.698, 0.7329, 0.745, 0.7599, 0.765, 0.7706, 0.775, 0.7776, 0.781, 0.7831, 0.786, 0.7890, 0.792, 0.7952, 0.797, 0.8074, 0.810, + 0.8185, 0.821, 0.8214, 0.821, 0.8201, 0.821, 0.8218, 0.822, 0.8244, 0.823, 0.8229, 0.822, 0.8192, 0.824, 0.8281, 0.831, 0.8344, 0.836, 0.8388, 0.840, 0.8415, 0.843, 0.8445, 0.847, + 0.8495, 0.851, 0.8521, 0.853, 0.8556, 0.858, 0.8604, 0.863, 0.8666, 0.867, 0.8687, 0.869, 0.8687, 0.867, 0.8672, 0.868, 0.8682, 0.870, 0.8703, 0.871, 0.8720, 0.874, 0.8803, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//97 97 0.0031 0.0047 0.0056 0.0064 0.0070 0.0070 0.0071 0.0066 0.0065 0.0065 0.0064 0.0063 0.0063 0.0058 0.0052 0.0052 0.0053 0.0047 0.0044 0.0052 0.0066 0.0077 0.0081 0.0082 0.0084 0.0089 0.0096 0.0106 0.0121 0.0127 0.0128 0.0124 0.0115 0.0117 0.0133 0.0169 +const double ColorTemp::JDC468_Blackred97_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0031, 0.0035, 0.0047, 0.0050, 0.0056, 0.0060, 0.0064, 0.0065, 0.0070, 0.007, 0.0070, 0.007, 0.0071, 0.007, 0.0066, 0.007, 0.0065, 0.006, 0.0065, 0.006, 0.0064, 0.006, 0.0063, + 0.006, 0.0063, 0.006, 0.0058, 0.005, 0.0052, 0.005, 0.0052, 0.005, 0.0053, 0.005, 0.0047, 0.005, 0.0044, 0.005, 0.0052, 0.006, 0.0066, 0.007, 0.0077, 0.008, 0.0081, 0.008, 0.008, + 0.008, 0.0084, 0.009, 0.0089, 0.009, 0.0096, 0.01, 0.0106, 0.011, 0.0121, 0.012, 0.0127, 0.012, 0.0128, 0.012, 0.0124, 0.012, 0.0115, 0.012, 0.0117, 0.013, 0.0133, 0.015, 0.0169, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//443 443 0.0067 0.0068 0.0067 0.0074 0.0083 0.0088 0.0092 0.0093 0.0098 0.0099 0.0101 0.0106 0.0109 0.0104 0.0094 0.0086 0.0075 0.0058 0.0044 0.0039 0.0037 0.0038 0.0036 0.0035 0.0036 0.0033 0.0033 0.0036 0.0038 0.0042 0.0041 0.0036 0.0033 0.0035 0.0042 0.0062 +const double ColorTemp::JDC468_Blackredbl443_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0067, 0.0067, 0.0068, 0.0068, 0.0067, 0.0070, 0.0074, 0.008, 0.0083, 0.0085, 0.0088, 0.009, 0.0092, 0.0092, 0.0093, 0.0096, 0.0098, 0.0098, 0.0099, 0.01, 0.0101, 0.0104, 0.0106, + 0.0106, 0.0109, 0.0105, 0.0104, 0.01, 0.0094, 0.09, 0.0086, 0.08, 0.0075, 0.06, 0.0058, 0.05, 0.0044, 0.04, 0.0039, 0.0038, 0.0037, 0.0037, 0.0038, 0.0037, 0.0036, 0.0036, + 0.0035, 0.0036, 0.0036, 0.0034, 0.0033, 0.0033, 0.0033, 0.0035, 0.0036, 0.0037, 0.0038, 0.004, 0.0042, 0.004, 0.0041, 0.004, 0.0036, 0.0034, 0.0033, 0.0034, 0.0035, 0.004, 0.0042, 0.005, 0.0062, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//27 27 0.0060 0.0064 0.0070 0.0076 0.0086 0.0086 0.0088 0.0089 0.0089 0.0083 0.0079 0.0078 0.0077 0.0067 0.0059 0.0057 0.0056 0.0046 0.0041 0.0045 0.0050 0.0056 0.0054 0.0053 0.0054 0.0055 0.0057 0.0065 0.0073 0.0079 0.0080 0.0075 0.0067 0.0068 0.0081 0.0114 +const double ColorTemp::JDC468_Blackbl27_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0060, 0.0062, 0.0064, 0.0066, 0.0070, 0.0073, 0.0076, 0.008, 0.0086, 0.0086, 0.0086, 0.0087, 0.0088, 0.0088, 0.0089, 0.0089, 0.0089, 0.0085, 0.0083, 0.008, 0.0079, 0.0078, 0.0078, + 0.0078, 0.0077, 0.007, 0.0067, 0.006, 0.0059, 0.0057, 0.0057, 0.0057, 0.0056, 0.005, 0.0046, 0.0045, 0.0041, 0.0043, 0.0045, 0.0047, 0.0050, 0.0053, 0.0056, 0.0055, 0.0054, 0.0055, + 0.0053, 0.0053, 0.0054, 0.0054, 0.0055, 0.0056, 0.0057, 0.006, 0.0065, 0.007, 0.0073, 0.0075, 0.0079, 0.008, 0.0080, 0.008, 0.0075, 0.007, 0.0067, 0.0067, 0.0068, 0.007, 0.0081, 0.01, 0.0114, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//28 28 0.0092 0.0118 0.0155 0.0218 0.0267 0.0296 0.0312 0.0306 0.0282 0.0244 0.0205 0.0186 0.0167 0.0126 0.0091 0.0080 0.0071 0.0050 0.0042 0.0042 0.0044 0.0045 0.0045 0.0042 0.0041 0.0039 0.0040 0.0043 0.0048 0.0050 0.0047 0.0042 0.0041 0.0042 0.0049 0.0074 +const double ColorTemp::JDC468_Blackbl28_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0092, 0.01, 0.0118, 0.012, 0.0155, 0.016, 0.0218, 0.025, 0.0267, 0.028, 0.0296, 0.03, 0.0312, 0.031, 0.0306, 0.03, 0.0282, 0.026, 0.0244, 0.022, 0.0205, 0.02, 0.0186, 0.017, 0.0167, + 0.015, 0.0126, 0.01, 0.0091, 0.0085, 0.0080, 0.0075, 0.0071, 0.006, 0.0050, 0.05, 0.0042, 0.0042, 0.0042, 0.0043, 0.0044, 0.0044, 0.0045, 0.0045, 0.0045, 0.0043, 0.0042, 0.0042, + 0.0041, 0.004, 0.0039, 0.004, 0.0040, 0.004, 0.0043, 0.0044, 0.0048, 0.005, 0.0050, 0.0048, 0.0047, 0.0045, 0.0042, 0.0041, 0.0041, 0.0041, 0.0042, 0.0045, 0.0049, 0.006, 0.0074, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//214 214 0.0072 0.0062 0.0061 0.0064 0.0069 0.0071 0.0075 0.0081 0.0082 0.0088 0.0103 0.0126 0.0145 0.0146 0.0140 0.0133 0.0118 0.0094 0.0070 0.0059 0.0051 0.0046 0.0045 0.0043 0.0045 0.0045 0.0048 0.0056 0.0065 0.0072 0.0067 0.0065 0.0057 0.0058 0.0068 0.0103 +const double ColorTemp::JDC468_Blackgr214_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0072, 0.007, 0.0062, 0.0062, 0.0061, 0.0063, 0.0064, 0.0067, 0.0069, 0.007, 0.0071, 0.0072, 0.0075, 0.008, 0.0081, 0.008, 0.0082, 0.0085, 0.0088, 0.009, 0.0103, 0.011, 0.0126, + 0.012, 0.0145, 0.0145, 0.0146, 0.014, 0.0140, 0.014, 0.0133, 0.012, 0.0118, 0.01, 0.0094, 0.008, 0.0070, 0.006, 0.0059, 0.0055, 0.0051, 0.005, 0.0046, 0.0045, 0.0045, 0.0044, + 0.0043, 0.0044, 0.0045, 0.0045, 0.0045, 0.0046, 0.0048, 0.005, 0.0056, 0.006, 0.0065, 0.007, 0.0072, 0.007, 0.0067, 0.0066, 0.0065, 0.006, 0.0057, 0.0056, 0.0058, 0.006, 0.0068, 0.008, 0.0103, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//436 436 0.0095 0.0123 0.0173 0.0242 0.0293 0.0317 0.0310 0.0283 0.0246 0.0197 0.0152 0.0129 0.0112 0.0083 0.0063 0.0059 0.0056 0.0045 0.0043 0.0050 0.0059 0.0064 0.0062 0.0060 0.0060 0.0062 0.0066 0.0075 0.0086 0.0093 0.0089 0.0082 0.0073 0.0072 0.0088 0.0139 +const double ColorTemp::JDC468_Blackbl436_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0095, 0.01, 0.0123, 0.013, 0.0173, 0.02, 0.0242, 0.026, 0.0293, 0.03, 0.0317, 0.031, 0.0310, 0.03, 0.0283, 0.025, 0.0246, 0.02, 0.0197, 0.018, 0.0152, 0.014, 0.0129, 0.012, + 0.0112, 0.01, 0.0083, 0.007, 0.0063, 0.006, 0.0059, 0.0058, 0.0056, 0.005, 0.0045, 0.0045, 0.0043, 0.005, 0.0050, 0.0055, 0.0059, 0.006, 0.0064, 0.0063, 0.0062, 0.006, 0.0060, + 0.006, 0.0060, 0.006, 0.0062, 0.0064, 0.0066, 0.007, 0.0075, 0.008, 0.0086, 0.009, 0.0093, 0.009, 0.0089, 0.0086, 0.0082, 0.008, 0.0073, 0.0072, 0.0072, 0.008, 0.0088, 0.01, 0.0139, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//455 455 0.1560 0.1943 0.2724 0.4469 0.5896 0.6393 0.6390 0.6239 0.6096 0.5895 0.5698 0.5662 0.5603 0.5304 0.4977 0.4975 0.4998 0.4601 0.4261 0.4520 0.4986 0.5237 0.5270 0.5260 0.5297 0.5375 0.5504 0.5711 0.5910 0.6023 0.6029 0.5977 0.5880 0.5830 0.5978 0.6345 +const double ColorTemp::JDC468_Whitebl455_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1560, 0.18, 0.1943, 0.25, 0.2724, 0.40, 0.4469, 0.50, 0.5896, 0.60, 0.6393, 0.639, 0.6390, 0.625, 0.6239, 0.61, 0.6096, 0.60, 0.5895, 0.57, 0.5698, 0.567, 0.5662, 0.56, + 0.5603, 0.55, 0.5304, 0.51, 0.4977, 0.498, 0.4975, 0.498, 0.4998, 0.47, 0.4601, 0.44, 0.4261, 0.43, 0.4520, 0.47, 0.4986, 0.51, 0.5237, 0.525, 0.5270, 0.526, 0.5260, 0.528, + 0.5297, 0.53, 0.5375, 0.54, 0.5504, 0.56, 0.5711, 0.58, 0.5910, 0.595, 0.6023, 0.602, 0.6029, 0.600, 0.5977, 0.59, 0.5880, 0.585, 0.5830, 0.59, 0.5978, 0.61, 0.6345, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//101 101 0.0076 0.0094 0.0116 0.0139 0.0158 0.0158 0.0152 0.0142 0.0130 0.0111 0.0094 0.0090 0.0085 0.0069 0.0058 0.0057 0.0058 0.0048 0.0044 0.0060 0.0094 0.0126 0.0141 0.0141 0.0148 0.0157 0.0172 0.0197 0.0227 0.0245 0.0242 0.0233 0.0215 0.0205 0.0240 0.0321 +const double ColorTemp::JDC468_Blackvio101_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0076, 0.008, 0.0094, 0.01, 0.0116, 0.012, 0.0139, 0.015, 0.0158, 0.0158, 0.0158, 0.0156, 0.0152, 0.015, 0.0142, 0.014, 0.0130, 0.012, 0.0111, 0.01, 0.0094, 0.009, 0.0090, 0.009, + 0.0085, 0.008, 0.0069, 0.006, 0.0058, 0.0057, 0.0057, 0.0058, 0.0058, 0.005, 0.0048, 0.0045, 0.0044, 0.005, 0.0060, 0.008, 0.0094, 0.011, 0.0126, 0.013, 0.0141, 0.014, 0.0141, 0.0145, 0.0148, 0.015, 0.0157, 0.016, 0.0172, 0.018, 0.0197, 0.021, 0.0227, 0.023, 0.0245, 0.0241, + 0.0242, 0.0235, 0.0233, 0.022, 0.0215, 0.021, 0.0205, 0.022, 0.0240, 0.026, 0.0321, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//92 92 0.1652 0.2036 0.2848 0.4708 0.6230 0.6758 0.6761 0.6619 0.6502 0.6343 0.6195 0.6194 0.6169 0.5939 0.5677 0.5678 0.5695 0.5373 0.5105 0.5356 0.5778 0.6020 0.6073 0.6090 0.6124 0.6187 0.6295 0.6456 0.6603 0.6693 0.6716 0.6704 0.6660 0.6640 0.6749 0.7003 +const double ColorTemp::JDC468_Whitebl92_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1652, 0.19, 0.2036, 0.24, 0.2848, 0.35, 0.4708, 0.55, 0.6230, 0.65, 0.6758, 0.6759, 0.6761, 0.665, 0.6619, 0.655, 0.6502, 0.64, 0.6343, 0.62, 0.6195, 0.6194, 0.6194, 0.618, + 0.6169, 0.605, 0.5939, 0.58, 0.5677, 0.5677, 0.5678, 0.568, 0.5695, 0.555, 0.5373, 0.52, 0.5105, 0.52, 0.5356, 0.55, 0.5778, 0.60, 0.6020, 0.605, 0.6073, 0.608, 0.6090, 0.61, + 0.6124, 0.615, 0.6187, 0.62, 0.6295, 0.64, 0.6456, 0.65, 0.6603, 0.665, 0.6693, 0.67, 0.6716, 0.671, 0.6704, 0.669, 0.6660, 0.665, 0.6640, 0.67, 0.6749, 0.69, 0.7003, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//94 94 0.0506 0.0569 0.0678 0.0906 0.1088 0.1160 0.1184 0.1195 0.1203 0.1215 0.1293 0.1474 0.1609 0.1538 0.1415 0.1466 0.1535 0.1364 0.1248 0.1494 0.1871 0.2098 0.2163 0.2179 0.2217 0.2282 0.2372 0.2500 0.2631 0.2713 0.2739 0.2725 0.2678 0.2660 0.2770 0.3025 +const double ColorTemp::JDC468_Greyredbl94_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0506, 0.053, 0.0569, 0.06, 0.0678, 0.08, 0.0906, 0.1, 0.1088, 0.11, 0.1160, 0.117, 0.1184, 0.119, 0.1195, 0.12, 0.1203, 0.1205, 0.1215, 0.125, 0.1293, 0.133, 0.1474, 0.15, + 0.1609, 0.155, 0.1538, 0.145, 0.1415, 0.143, 0.1466, 0.15, 0.1535, 0.14, 0.1364, 0.13, 0.1248, 0.14, 0.1494, 0.17, 0.1871, 0.200, 0.2098, 0.21, 0.2163, 0.217, 0.2179, 0.22, + 0.2217, 0.222, 0.2282, 0.23, 0.2372, 0.24, 0.2500, 0.256, 0.2631, 0.27, 0.2713, 0.272, 0.2739, 0.273, 0.2725, 0.27, 0.2678, 0.267, 0.2660, 0.272, 0.2770, 0.28, 0.3025, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + + +//32 32 0.0933 0.1333 0.1967 0.3132 0.4096 0.4556 0.4763 0.4845 0.4870 0.4852 0.4868 0.4959 0.4971 0.4755 0.4407 0.4085 0.3643 0.2922 0.2161 0.1658 0.1370 0.1190 0.1040 0.0947 0.0949 0.1001 0.1106 0.1306 0.1536 0.1652 0.1609 0.1480 0.1291 0.1188 0.1370 0.1933 +const double ColorTemp::JDC468_Blue32_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0933, 0.11, 0.1333, 0.17, 0.1967, 0.265, 0.3132, 0.35, 0.4096, 0.43, 0.4556, 0.465, 0.4763, 0.48, 0.4845, 0.486, .4870, 0.486, 0.4852, 0.486, 0.4868, 0.49, 0.4959, 0.496, + 0.4971, 0.48, 0.4755, 0.46, 0.4407, 0.42, 0.4085, 0.38, 0.3643, 0.32, 0.2922, 0.25, 0.2161, 0.19, 0.1658, 0.15, 0.1370, 0.12, 0.1190, 0.11, 0.1040, 0.10, 0.0947, 0.0948, + 0.0949, 0.097, 0.1001, 0.105, 0.1106, 0.12, 0.1306, 0.14, 0.1536, 0.16, 0.1652, 0.162, 0.1609, 0.154, 0.1480, 0.135, 0.1291, 0.12, 0.1188, 0.125, 0.1370, 0.16, 0.1933, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + + +//236 236 0.0165 0.0259 0.0432 0.0684 0.0858 0.0895 0.0828 0.0683 0.0527 0.0365 0.0235 0.0177 0.0143 0.0096 0.0067 0.0063 0.0060 0.0052 0.0053 0.0061 0.0074 0.0083 0.0085 0.0080 0.0078 0.0076 0.0081 0.0095 0.0112 0.0121 0.0114 0.0100 0.0086 0.0083 0.0102 0.0180 +const double ColorTemp::JDC468_Blue236_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0165, 0.021, 0.0259, 0.035, 0.0432, 0.05, 0.0684, 0.075, 0.0858, 0.087, 0.0895, 0.085, 0.0828, 0.075, 0.0683, 0.058, 0.0527, 0.045, 0.0365, 0.031, 0.0235, 0.021, 0.0177, 0.016, + 0.0143, 0.012, 0.0096, 0.0085, 0.0067, 0.0065, 0.0063, 0.0062, 0.0060, 0.006, 0.0052, 0.0052, 0.0053, 0.006, 0.0061, 0.007, 0.0074, 0.008, 0.0083, 0.0084, 0.0085, 0.0083, + 0.0080, 0.008, 0.0078, 0.0077, 0.0076, 0.008, 0.0081, 0.009, 0.0095, 0.01, 0.0112, 0.012, 0.0121, 0.012, 0.0114, 0.011, 0.0100, 0.009, 0.0086, 0.0085, 0.0083, 0.009, 0.0102, 0.0015, 0.0180, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//300 300 0.0079 0.0085 0.0087 0.0092 0.0094 0.0093 0.0093 0.0095 0.0097 0.0110 0.0158 0.0544 0.1907 0.3753 0.4883 0.5181 0.5044 0.4631 0.4070 0.3594 0.3262 0.3054 0.2873 0.2772 0.2790 0.2875 0.3029 0.3292 0.3571 0.3719 0.3693 0.3573 0.3371 0.3253 0.3471 0.4087 +const double ColorTemp::JDC468_Gre300_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0079, 0.008, 0.0085, 0.0086, 0.0087, 0.009, 0.0092, 0.0093, 0.0094, 0.0094, 0.0093, 0.0093, 0.0093, 0.0094, 0.0095, 0.0096, 0.0097, 0.01, 0.0110, 0.012, 0.0158, 0.045, + 0.0544, 0.134, 0.1907, 0.25, 0.3753, 0.435, 0.4883, 0.505, 0.5181, 0.512, 0.5044, 0.485, 0.4631, 0.433, 0.4070, 0.387, 0.3594, 0.334, 0.3262, 0.31, 0.3054, 0.295, 0.2873, 0.292, + 0.2772, 0.278, 0.2790, 0.281, 0.2875, 0.291, 0.3029, 0.3121, 0.3292, 0.333, 0.3571, 0.365, 0.3719, 0.365, 0.3693, 0.362, 0.3573, 0.342, 0.3371, 0.325, 0.3253, 0.336, 0.3471, 0.367, 0.4087, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//340 340 0.0175 0.0320 0.0587 0.0989 0.1267 0.1322 0.1210 0.0978 0.0732 0.0487 0.0297 0.0212 0.0167 0.0106 0.0069 0.0064 0.0062 0.0051 0.0052 0.0061 0.0073 0.0081 0.0080 0.0076 0.0075 0.0072 0.0077 0.0088 0.0105 0.0112 0.0104 0.0092 0.0079 0.0075 0.0092 0.0167 +const double ColorTemp::JDC468_Blue340_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0175, 0.02, 0.0320, 0.04, 0.0587, 0.08, 0.0989, 0.11, 0.1267, 0.13, 0.1322, 0.125, 0.1210, 0.111, 0.0978, 0.08, 0.0732, 0.06, 0.0487, 0.04, 0.0297, 0.025, 0.0212, 0.02, + 0.0167, 0.012, 0.0106, 0.008, 0.0069, 0.0065, 0.0064, 0.0063, 0.0062, 0.0055, 0.0051, 0.0051, 0.0052, 0.006, 0.0061, 0.007, 0.0073, 0.008, 0.0081, 0.008, 0.0080, 0.0078, + 0.0076, 0.0076, 0.0075, 0.0074, 0.0072, 0.0075, 0.0077, 0.008, 0.0088, 0.0092, 0.0105, 0.011, 0.0112, 0.0108, 0.0104, 0.01, 0.0092, 0.008, 0.0079, 0.0075, 0.0075, 0.008, + 0.0092, 0.01, 0.0167, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//110 110 0.0954 0.1234 0.1702 0.2631 0.3363 0.3664 0.3799 0.3905 0.4002 0.4160 0.4582 0.5262 0.5798 0.5915 0.5742 0.5465 0.5035 0.4364 0.3581 0.2977 0.2589 0.2349 0.2152 0.2030 0.2032 0.2106 0.2249 0.2511 0.2799 0.2951 0.2915 0.2776 0.2552 0.2419 0.2638 0.3287 +const double ColorTemp::JDC468_Gree110_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0954, 0.11, 0.1234, 0.15, 0.1702, 0.22, 0.2631, 0.312, 0.3363, 0.352, 0.3664, 0.372, 0.3799, 0.385, 0.3905, 0.395, 0.4002, 0.41, 0.4160, 0.43, 0.4582, 0.511, 0.5262, 0.544, + 0.5798, 0.585, 0.5915, 0.585, 0.5742, 0.563, 0.5465, 0.523, 0.5035, 0.465, 0.4364, 0.389, 0.3581, 0.3334, 0.2977, 0.275, 0.2589, 0.245, 0.2349, 0.223, 0.2152, 0.211, 0.2030, 0.204, + 0.2032, 0.206, 0.2106, 0.221, 0.2249, 0.243, 0.2511, 0.271, 0.2799, 0.286, 0.2951, 0.294, 0.2915, 0.2876, 0.2776, 0.2657, 0.2552, 0.2456, 0.2419, 0.253, 0.2638, 0.275, 0.3287, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//457 457 0.0127 0.0126 0.0112 0.0110 0.0109 0.0106 0.0105 0.0104 0.0110 0.0136 0.0318 0.1246 0.3262 0.5051 0.5566 0.5181 0.4406 0.3429 0.2411 0.1647 0.1202 0.0968 0.0804 0.0709 0.0703 0.0747 0.0840 0.1023 0.1243 0.1355 0.1311 0.1179 0.0993 0.0884 0.1043 0.1590 +const double ColorTemp::JDC468_Gree457_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0127, 0.0126, 0.0126, 0.012, 0.0112, 0.011, 0.0110, 0.011, 0.0109, 0.0107, 0.0106, 0.0105, 0.0105, 0.0105, 0.0104, 0.0107, 0.0110, 0.0124, 0.0136, 0.0234, 0.0318, 0.09, + 0.1246, 0.22, 0.3262, 0.43, 0.5051, 0.52, 0.5566, 0.54, 0.5181, 0.476, 0.4406, 0.398, 0.3429, 0.296, 0.2411, 0.203, 0.1647, 0.142, 0.1202, 0.1, 0.0968, 0.09, 0.0804, 0.08, + 0.0709, 0.0708, 0.0703, 0.0723, 0.0747, 0.08, 0.0840, 0.09, 0.1023, 0.11, 0.1243, 0.13, 0.1355, 0.132, 0.1311, 0.12, 0.1179, 0.10, 0.0993, 0.09, 0.0884, 0.09, 0.1043, 0.12, 0.1590, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//241 241 0.0134 0.0106 0.0110 0.0108 0.0111 0.0114 0.0114 0.0115 0.0114 0.0122 0.0192 0.0731 0.2455 0.4689 0.6183 0.6852 0.7107 0.7112 0.7059 0.7177 0.7335 0.7445 0.7487 0.7523 0.7555 0.7606 0.7683 0.7779 0.7855 0.7915 0.7964 0.8011 0.8056 0.8097 0.8144 0.8239 +const double ColorTemp::JDC468_Yel241_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0134, 0.012, 0.0106, 0.011, 0.0110, 0.011, 0.0108, 0.011, 0.0111, 0.0112, 0.0114, 0.0114, 0.0114, 0.0114, 0.0115, 0.0114, 0.0114, 0.012, 0.0122, 0.017, 0.0192, 0.05, 0.0731, 0.12, + 0.2455, 0.355, 0.4689, 0.556, 0.6183, 0.645, 0.6852, 0.698, 0.7107, 0.711, 0.7112, 0.708, 0.7059, 0.712, 0.7177, 0.724, 0.7335, 0.742, 0.7445, 0.746, 0.7487, 0.751, 0.7523, 0.753, + 0.7555, 0.758, 0.760, 0.7626, 0.7683, 0.771, 0.7779, 0.782, 0.7855, 0.791, 0.7915, 0.794, 0.7964, 0.799, 0.8011, 0.804, 0.8056, 0.807, 0.8097, 0.811, 0.8144, 0.820, 0.8239, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//321 321 0.0247 0.0203 0.0182 0.0183 0.0182 0.0179 0.0182 0.0188 0.0199 0.0249 0.0529 0.1519 0.3116 0.4138 0.4410 0.4679 0.4906 0.4655 0.4517 0.5203 0.6238 0.6952 0.7270 0.7406 0.7469 0.7527 0.7607 0.7708 0.7786 0.7849 0.7897 0.7940 0.7984 0.8025 0.8069 0.8160 +const double ColorTemp::JDC468_Ora321_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0247, 0.022, 0.0203, 0.019, 0.0182, 0.0182, 0.0183, 0.0182, 0.0182, 0.018, 0.0179, 0.018, 0.0182, 0.0185, 0.0188, 0.019, 0.0199, 0.022, 0.0249, 0.035, 0.0529, 0.112, + 0.1519, 0.231, 0.3116, 0.365, 0.4138, 0.421, 0.4410, 0.451, 0.4679, 0.485, 0.4906, 0.473, 0.4655, 0.455, 0.4517, 0.487, 0.5203, 0.578, 0.6238, 0.667, 0.6952, 0.711, 0.7270, 0.735, + 0.7406, 0.743, 0.7469, .751, 0.7527, 0.756, 0.7607, 0.765, 0.7708, 0.774, 0.7786, 0.782, 0.7849, 0.786, 0.7897, 0.79, 0.7940, 0.794, 0.7984, 0.799, 0.8025, 0.805, 0.8069, 0.811, 0.8160, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//353 353 0.0260 0.0294 0.0331 0.0420 0.0490 0.0517 0.0541 0.0572 0.0608 0.0664 0.0813 0.1070 0.1291 0.1344 0.1317 0.1356 0.1390 0.1289 0.1195 0.1278 0.1420 0.1493 0.1500 0.1500 0.1527 0.1576 0.1651 0.1759 0.1870 0.1942 0.1963 0.1952 0.1910 0.1898 0.1995 0.2209 +const double ColorTemp::JDC468_Yellow353_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0260, 0.027, 0.0294, 0.031, 0.0331, 0.037, 0.0420, 0.045, 0.0490, 0.051, 0.0517, 0.053, 0.0541, 0.056, 0.0572, 0.059, 0.0608, 0.063, 0.0664, 0.072, 0.0813, 0.096, 0.1070, 0.112, + 0.1291, 0.132, 0.1344, 0.133, 0.1317, 0.134, 0.1356, 0.137, 0.1390, 0.134, 0.1289, 0.123, 0.1195, 0.122, 0.1278, 0.134, 0.1420, 0.145, 0.1493, 0.15, 0.1500, 0.15, 0.1500, 0.153, + 0.1527, 0.154, 0.1576, 0.162, 0.1651, 0.172, 0.1759, 0.182, 0.1870, 0.191, 0.1942, 0.195, 0.1963, 0.196, 0.1952, 0.193, 0.1910, 0.19, 0.1898, 0.195, 0.1995, 0.21, 0.2209, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//465 465 0.0388 0.0654 0.1020 0.1557 0.1880 0.1783 0.1434 0.1013 0.0684 0.0410 0.0219 0.0149 0.0117 0.0080 0.0062 0.0062 0.0062 0.0056 0.0063 0.0098 0.0230 0.0440 0.0577 0.0617 0.0645 0.0690 0.0766 0.0903 0.1064 0.1144 0.1113 0.1022 0.0898 0.0833 0.0962 0.1377 +const double ColorTemp::JDC468_Mag465_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0388, 0.05, 0.0654, 0.09, 0.1020, 0.12, 0.1557, 0.17, 0.1880, 0.182, 0.1783, 0.162, 0.1434, 0.12, 0.1013, 0.09, 0.0684, 0.05, 0.0410, 0.03, 0.0219, 0.02, 0.0149, 0.012, + 0.0117, 0.009, 0.0080, 0.007, 0.0062, 0.0062, 0.0062, 0.0062, 0.0062, 0.006, 0.0056, 0.006, 0.0063, 0.008, 0.0098, 0.018, 0.0230, 0.03, 0.0440, 0.05, 0.0577, 0.06, 0.0617, 0.062, + 0.0645, 0.065, 0.0690, 0.07, 0.0766, 0.08, 0.0903, 0.1, 0.1064, 0.111, 0.1144, 0.112, 0.1113, 0.104, 0.1022, 0.09, 0.0898, 0.088, 0.0833, 0.09, 0.0962, 0.111, 0.1377, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//333 333 0.1030 0.1508 0.2133 0.3191 0.3910 0.3895 0.3424 0.2770 0.2184 0.1593 0.1074 0.0825 0.0669 0.0430 0.0265 0.0278 0.0315 0.0212 0.0163 0.0355 0.0861 0.1365 0.1565 0.1589 0.1629 0.1713 0.1852 0.2099 0.2378 0.2517 0.2469 0.2322 0.2102 0.1973 0.2191 0.2855 +const double ColorTemp::JDC468_Mag333_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1030, 0.12, 0.1508, 0.18, 0.2133, 0.26, 0.3191, 0.364, 0.3910, 0.39, 0.3895, 0.375, 0.3424, 0.312, 0.2770, 0.251, 0.2184, 0.183, 0.1593, 0.122, 0.1074, 0.1, 0.0825, 0.07, + 0.0669, 0.05, 0.0430, 0.03, 0.0265, 0.027, 0.0278, 0.03, 0.0315, 0.025, 0.0212, 0.02, 0.0163, 0.03, 0.0355, 0.05, 0.0861, 0.112, 0.1365, 0.143, 0.1565, 0.157, 0.1589, 0.16, + 0.1629, 0.165, 0.1713, 0.175, 0.1852, 0.19, 0.2099, 0.221, 0.2378, 0.245, 0.2517, 0.25, 0.2469, 0.238, 0.2322, 0.224, 0.2102, 0.206, 0.1973, 0.209, 0.2191, 0.231, 0.2855, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + + +//203 203 0.0833 0.1329 0.2005 0.3099 0.3855 0.3916 0.3530 0.2926 0.2346 0.1741 0.1201 0.0934 0.0759 0.0495 0.0306 0.0308 0.0330 0.0214 0.0150 0.0256 0.0510 0.0723 0.0769 0.0748 0.0761 0.0813 0.0911 0.1087 0.1295 0.1399 0.1353 0.1232 0.1064 0.0971 0.1137 0.1677 +const double ColorTemp::JDC468_Mag203_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0833, 0.11, 0.1329, 0.16, 0.2005, 0.25, 0.3099, 0.342, 0.3855, 0.39, 0.3916, 0.374, 0.3530, 0.321, 0.2926, 0.267, 0.2346, 0.21, 0.1741, 0.153, 0.1201, 0.1, 0.0934, 0.08, + 0.0759, 0.06, 0.0495, 0.04, 0.0306, 0.0307, 0.0308, 0.032, 0.0330, 0.025, 0.0214, 0.018, 0.0150, 0.02, 0.0256, 0.04, 0.0510, 0.06, 0.0723, 0.074, 0.0769, 0.075, 0.0748, 0.076, + 0.0761, 0.08, 0.0813, 0.09, 0.0911, 0.1, 0.1087, 0.115, 0.1295, 0.134, 0.1399, 0.136, 0.1353, 0.131, 0.1232, 0.114, 0.1064, 0.1, 0.0971, 0.105, 0.1137, 0.123, 0.1677, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//blue cyan +const double ColorTemp::J570_BlueB6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1611, 0.18, 0.1947, 0.23, 0.2639, 0.31, 0.3488, 0.37, 0.4022, 0.43, 0.4517, 0.49, 0.501, 0.52, 0.5317, 0.534, 0.5367, 0.53, 0.5246, 0.51, 0.4905, 0.47, 0.4510, 0.43, 0.4059, + 0.37, 0.3351, 0.31, 0.2612, 0.24, 0.2177, 0.205, 0.1883, 0.16, 0.1444, 0.123, 0.1065, 0.1, 0.0889, 0.085, 0.0811, 0.08, 0.0757, 0.071, 0.0695, 0.067, 0.0648, 0.064, 0.0634, + 0.063, 0.0637, 0.065, 0.0662, 0.068, 0.0714, 0.075, 0.0787, 0.08, 0.0828, 0.082, 0.0822, 0.08, 0.0781, 0.075, 0.0726, 0.071, 0.0698, 0.075, 0.0770, 0.08, 0.0973, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueB15_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2207, 0.2, 0.1897, 0.21, 0.2274, 0.25, 0.2805, 0.30, 0.3216, 0.34, 0.3596, 0.38, 0.4003, 0.42, 0.4438, 0.47, 0.4909, 0.52, 0.5469, 0.57, 0.6009, 0.62, 0.6414, 0.65, 0.6557, + 0.64, 0.6275, 0.59, 0.5675, 0.53, 0.5022, 0.48, 0.4348, 0.39, 0.3473, 0.31, 0.2613, 0.24, 0.2039, 0.18, 0.1696, 0.15, 0.1465, 0.13, 0.1243, 0.11, 0.1055, 0.10, 0.0952, 0.094, + 0.0911, 0.091, 0.0906, 0.092, 0.0940, 0.1, 0.1006, 0.104, 0.1075, 0.11, 0.1125, 0.113, 0.1146, 0.113, 0.1129, 0.112, 0.1120, 0.115, 0.1198, 0.13, 0.1431, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueC2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2534, 0.25, 0.2454, 0.28, 0.3101, 0.33, 0.3567, 0.37, 0.3981, 0.41, 0.4258, 0.43, 0.4472, 0.45, 0.4574, 0.455, 0.4571, 0.45, 0.4468, 0.43, 0.4205, 0.41, 0.3947, 0.38, + 0.3647, 0.33, 0.3074, 0.27, 0.2471, 0.23, 0.2221, 0.22, 0.2128, 0.20, 0.1810, 0.17, 0.1510, 0.15, 0.1486, 0.15, 0.1546, 0.154, 0.1532, 0.15, 0.1426, 0.135, 0.1310, 0.125, + 0.1257, 0.125, 0.1246, 0.126, 0.1276, 0.13, 0.1360, 0.14, 0.1483, 0.15, 0.1566, 0.157, 0.1575, 0.155, 0.1535, 0.15, 0.1453, 0.143, 0.1403, 0.146, 0.1510, 0.16, 0.1855, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueC14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5697, 0.51, 0.4660, 0.49, 0.5000, 0.53, 0.5560, 0.58, 0.6072, 0.62, 0.6402, 0.65, 0.6632, 0.67, 0.6850, 0.69, 0.7069, 0.71, 0.7292, 0.74, 0.7488, 0.75, 0.7678, 0.77, 0.7786, + 0.775, 0.7721, 0.76, 0.7544, 0.75, 0.7394, 0.73, 0.7232, 0.70, 0.6889, 0.66, 0.6446, 0.63, 0.6171, 0.61, 0.5966, 0.58, 0.5743, 0.56, 0.5425, 0.53, 0.5093, 0.50, 0.4884, 0.48, + 0.4784, 0.475, 0.4774, 0.48, 0.4822, 0.49, 0.4944, 0.50, 0.5076, 0.51, 0.5186, 0.52, 0.5268, 0.53, 0.5303, 0.532, 0.5332, 0.54, 0.5454, 0.56, 0.5760, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueC16_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1909, 0.10, 0.0635, 0.06, 0.0554, 0.056, 0.0571, 0.057, 0.0580, 0.06, 0.0608, 0.063, 0.0662, 0.07, 0.0712, 0.072, 0.0742, 0.08, 0.0811, 0.09, 0.0985, 0.11, 0.1363, 0.15, + 0.1743, 0.173, 0.1720, 0.15, 0.1372, 0.12, 0.1005, 0.09, 0.0731, 0.06, 0.0509, 0.04, 0.0374, 0.036, 0.0322, 0.032, 0.0308, 0.031, 0.0309, 0.031, 0.0319, 0.033, + 0.0333, 0.034, 0.0349, 0.035, 0.0364, 0.037, 0.0377, 0.038, 0.0386, 0.0386, 0.0386, 0.0384, 0.0383, 0.038, 0.0377, 0.0377, 0.0378, 0.038, 0.0386, 0.04, 0.0417, 0.043, + 0.0461, 0.049, 0.0514, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0060, 0.04, 0.0975, 0.11, 0.1297, 0.13, 0.1426, 0.15, 0.1538, 0.16, 0.1624, 0.165, 0.1684, 0.17, 0.1727, 0.175, 0.1761, 0.178, 0.1798, 0.18, 0.1863, 0.19, 0.1993, 0.20, + 0.2091, 0.205, 0.2041, 0.20, 0.1902, 0.19, 0.1836, 0.182, 0.1809, 0.17, 0.1675, 0.16, 0.1527, 0.151, 0.1511, 0.153, 0.1541, 0.154, 0.1545, 0.153, 0.1516, 0.15, + 0.1484, 0.149, 0.1489, 0.15, 0.1516, 0.153, 0.1563, 0.16, 0.1654, 0.17, 0.1766, 0.18, 0.1827, 0.182, 0.1817, 0.18, 0.1766, 0.17, 0.1693, 0.166, 0.1643, 0.17, 0.1726, 0.18, 0.1978, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1613, 0.20, 0.2384, 0.30, 0.3288, 0.35, 0.4026, 0.43, 0.4630, 0.48, 0.4992, 0.51, 0.5294, 0.53, 0.5377, 0.53, 0.5261, 0.51, 0.4995, 0.48, 0.4513, 0.43, 0.4064, 0.38, + 0.3620, 0.31, 0.2935, 0.25, 0.2263, 0.21, 0.1977, 0.19, 0.1851, 0.17, 0.1519, 0.14, 0.1213, 0.12, 0.1149, 0.113, 0.1162, 0.114, 0.1133, 0.11, 0.1053, 0.10, 0.0976, 0.095, + 0.0947, 0.095, 0.0953, 0.097, 0.0985, 0.1, 0.1070, 0.11, 0.1188, 0.12, 0.1256, 0.124, 0.1246, 0.12, 0.1187, 0.11, 0.1099, 0.105, 0.1048, 0.11, 0.1145, 0.12, 0.145, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3003, 0.20, 0.1512, 0.20, 0.2149, 0.25, 0.2709, 0.30, 0.3127, 0.32, 0.3534, 0.37, 0.4001, 0.42, 0.4456, 0.46, 0.4882, 0.51, 0.5343, 0.55, 0.5728, 0.58, 0.5968, 0.595, + 0.5932, 0.56, 0.5490, 0.51, 0.4756, 0.43, 0.3989, 0.37, 0.3256, 0.28, 0.2424, 0.21, 0.1691, 0.15, 0.1239, 0.10, 0.0998, 0.09, 0.0866, 0.08, 0.0752, 0.07, 0.0664, 0.065, + 0.0623, 0.062, 0.0616, 0.062, 0.0626, 0.064, 0.0662, 0.07, 0.0720, 0.075, 0.0767, 0.077, 0.0784, 0.078, 0.0770, 0.075, 0.0734, 0.073, 0.0716, 0.075, 0.0779, 0.08, 0.0968, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueF13_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3075, 0.22, 0.1514, 0.13, 0.1216, 0.125, 0.1264, 0.13, 0.1312, 0.14, 0.1448, 0.15, 0.1665, 0.17, 0.1850, 0.19, 0.1922, 0.195, 0.1970, 0.20, 0.2036, 0.21, + 0.2136, 0.213, 0.2122, 0.19, 0.1832, 0.16, 0.1412, 0.12, 0.1066, 0.09, 0.0810, 0.07, 0.0579, 0.05, 0.0422, 0.04, 0.0358, 0.035, 0.0336, 0.033, 0.0335, 0.0335, + 0.0339, 0.034, 0.0348, 0.035, 0.0358, 0.036, 0.0371, 0.038, 0.0384, 0.039, 0.0394, 0.04, 0.0405, 0.0404, 0.0405, 0.04, 0.0399, 0.039, 0.0387, 0.039, + 0.0396, 0.04, 0.0422, 0.045, 0.0467, 0.05, 0.0527, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueG9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0937, 0.09, 0.0891, 0.07, 0.0621, 0.07, 0.0735, 0.08, 0.0842, 0.09, 0.0918, 0.1, 0.1009, 0.105, 0.1091, 0.11, 0.1158, 0.12, 0.1254, 0.13, 0.1452, 0.16, + 0.1805, 0.20, 0.2126, 0.213, 0.2128, 0.20, 0.1863, 0.17, 0.1550, 0.14, 0.1270, 0.1, 0.0973, 0.08, 0.0725, 0.06, 0.0585, 0.055, 0.0521, 0.05, 0.0486, 0.047, + 0.0458, 0.045, 0.0441, 0.044, 0.0439, 0.044, 0.0443, 0.045, 0.0455, 0.046, 0.0478, 0.049, 0.0500, 0.051, 0.0512, 0.051, 0.0511, 0.05, 0.0498, 0.049, + 0.0487, 0.049, 0.0495, 0.05, 0.0531, 0.055, 0.0620, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueG19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1198, 0.12, 0.1376, 0.15, 0.1735, 0.18, 0.1903, 0.20, 0.2116, 0.22, 0.2322, 0.24, 0.2555, 0.27, 0.2802, 0.29, 0.3077, 0.32, 0.3420, 0.36, 0.3822, 0.41, + 0.4261, 0.43, 0.4565, 0.45, 0.4481, 0.43, 0.4109, 0.39, 0.3736, 0.35, 0.3368, 0.30, 0.2811, 0.25, 0.2228, 0.19, 0.1839, 0.17, 0.1592, 0.15, 0.1394, 0.12, + 0.1183, 0.1, 0.0998, 0.09, 0.0897, 0.085, 0.0851, 0.085, 0.0844, 0.085, 0.0863, 0.09, 0.0912, 0.095, 0.0977, 0.1, 0.1027, 0.105, 0.1064, 0.106, 0.1064, 0.106, + 0.1067, 0.11, 0.1135, 0.12, 0.1319, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueI5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1096, 012, 0.1546, 0.16, 0.1855, 0.2, 0.2350, 0.25, 0.2720, 0.29, 0.3065, 0.32, 0.3404, 0.36, 0.3782, 0.4, 0.4229, 0.45, 0.4801, 0.51, 0.5416, 0.57, + 0.5962, 0.61, 0.6281, 0.62, 0.6144, 0.58, 0.5680, 0.55, 0.5211, 0.5, 0.4726, 0.43, 0.3991, 0.37, 0.3209, 0.29, 0.2674, 0.25, 0.2311, 0.22, 0.2000, 0.18, + 0.1656, 0.15, 0.1349, 0.12, 0.1161, 0.11, 0.1078, 0.105, 0.1046, 0.105, 0.1049, 0.107, 0.1097, 0.11, 0.1179, 0.12, 0.1264, 0.13, 0.1337, 0.135, 0.1378, 0.14, 0.1402, 0.145, 0.1474, 0.15, 0.1662, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueH15_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1047, 0.105, 0.1078, 0.12, 0.1550, 0.20, 0.2110, 0.23, 0.2487, 0.27, 0.2893, 0.31, 0.3386, 0.35, 0.3723, 0.375, 0.3773, 0.37, 0.3665, 0.35, 0.3373, 0.32, + 0.3037, 0.28, 0.2663, 0.24, 0.2106, 0.17, 0.1540, 0.13, 0.1200, 0.11, 0.0980, 0.08, 0.0721, 0.06, 0.0527, 0.05, 0.0448, 0.043, 0.0418, 0.041, 0.0403, 0.04, + 0.0390, 0.039, 0.0386, 0.039, 0.0392, 0.04, 0.0401, 0.041, 0.0413, 0.042, 0.0435, 0.044, 0.0456, 0.046, 0.0465, 0.046, 0.0457, 0.045, 0.0447, 0.044, 0.0435, 0.044, + 0.0442, 0.046, 0.0485, 0.05, 0.0576, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueI3_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1759, 0.21, 0.2647, 0.31, 0.3209, 0.36, 0.4249, 0.45, 0.4957, 0.52, 0.5536, 0.57, 0.6073, 0.62, 0.6431, 0.65, 0.6538, 0.653, 0.6506, 0.64, 0.6282, 0.61, + 0.5973, 0.57, 0.5559, 0.52, 0.4856, 0.43, 0.4033, 0.37, 0.3417, 0.32, 0.2901, 0.26, 0.2211, 0.19, 0.1585, 0.14, 0.1236, 0.11, 0.1062, 0.1, 0.0959, 0.09, + 0.0865, 0.085, 0.0801, 0.08, 0.0780, 0.079, 0.0788, 0.08, 0.0819, 0.09, 0.0903, 0.1, 0.1009, 0.105, 0.1073, 0.106, 0.1055, 0.1, 0.0998, 0.095, 0.0914, 0.09, 0.0863, 0.09, 0.0961, 0.11, 0.1250, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueI19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3031, 0.28, 0.2588, 0.25, 0.2472, 0.26, 0.2738, 0.29, 0.3035, 0.31, 0.3271, 0.33, 0.3496, 0.36, 0.3724, 0.38, 0.3968, 0.41, 0.4252, 0.44, 0.4562, 0.47, + 0.4899, 0.5, 0.5147, 0.512, 0.5100, 0.49, 0.4841, 0.47, 0.4608, 0.45, 0.4373, 0.42, 0.3934, 0.37, 0.3420, 0.32, 0.3086, 0.30, 0.2850, 0.27, 0.2622, 0.25, + 0.2334, 0.22, 0.2054, 0.19, 0.1887, 0.185, 0.1806, 0.18, 0.1791, 0.18, 0.1825, 0.185, 0.1909, 0.2, 0.2018, 0.21, 0.2108, 0.213, 0.2164, 0.217, 0.2180, 0.219, + 0.2198, 0.22, 0.2295, 0.24, 0.2562, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueJ4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0290, 0.02, 0.0598, 0.1, 0.1278, 0.15, 0.1764, 0.19, 0.2052, 0.21, 0.2331, 0.25, 0.2642, 0.28, 0.2906, 0.3, 0.3093, 0.31, 0.3263, 0.33, 0.3413, 0.35, + 0.3550, 0.354, 0.3532, 0.33, 0.3206, 0.3, 0.2685, 0.24, 0.2212, 0.2, 0.1802, 0.16, 0.1346, 0.1, 0.0965, 0.08, 0.0751, 0.07, 0.0646, 0.06, 0.0586, 0.055, + 0.0535, 0.052, 0.0504, 0.05, 0.0491, 0.0495, 0.0493, 0.05, 0.0504, 0.051, 0.0529, 0.053, 0.0565, 0.057, 0.0591, 0.059, 0.0593, 0.058, 0.0576, 0.056, 0.0556, 0.055, + 0.0553, 0.06, 0.0602, 0.065, 0.0727, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueJ6_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3039, 0.3, 0.2571, 0.27, 0.2960, 0.31, 0.3446, 0.37, 0.3937, 0.41, 0.4405, 0.47, 0.4884, 0.51, 0.5337, 0.56, 0.5771, 0.59, 0.6221, 0.64, 0.6589, 0.67, + 0.6808, 0.68, 0.6770, 0.65, 0.6375, 0.59, 0.5693, 0.53, 0.4933, 0.45, 0.4160, 0.39, 0.3223, 0.26, 0.2338, 0.21, 0.1761, 0.16, 0.1447, 0.13, 0.1258, 0.12, + 0.1090, 0.1, 0.0961, 0.09, 0.0899, 0.089, 0.0877, 0.088, 0.0892, 0.09, 0.0949, 0.1, 0.1045, 0.11, 0.1115, 0.112, 0.1131, 0.112, 0.1115, 0.11, 0.1065, 0.105, + 0.1033, 0.11, 0.1122, 0.12, 0.1400, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_BlueJ11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1274, 0.1, 0.091, 0.08, 0.0656, 0.064, 0.0604, 0.06, 0.0570, 0.06, 0.0604, 0.061, 0.0644, 0.065, 0.0668, 0.07, 0.0700, 0.072, 0.0754, 0.08, 0.0874, 0.1, + 0.1111, 0.12, 0.1327, 0.132, 0.1313, 0.12, 0.1127, 0.1, 0.0931, 0.08, 0.0758, 0.06, 0.0580, 0.05, 0.0449, 0.04, 0.0385, 0.036, 0.0360, 0.035, 0.0351, 0.035, + 0.0351, 0.035, 0.0355, 0.036, 0.0371, 0.0375, 0.0379, 0.038, 0.0388, 0.04, 0.0406, 0.041, 0.0414, 0.0415, 0.0416, 0.041, 0.0409, 0.04, + 0.0398, 0.04, 0.0397, 0.04, 0.0424, 0.043, 0.0458, 0.05, 0.0522, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueJ13_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2802, 0.28, 0.2820, 0.3, 0.3461, 0.4, 0.4357, 0.45, 0.5027, 0.53, 0.5528, 0.58, 0.6001, 0.62, 0.6402, 0.66, 0.6730, 0.69, 0.7019, 0.71, 0.7216, 0.725, + 0.7288, 0.72, 0.7172, 0.7, 0.6779, 0.65, 0.6160, 0.58, 0.5478, 0.52, 0.4751, 0.43, 0.3816, 0.35, 0.2882, 0.25, 0.2260, 0.2, 0.1905, 0.18, 0.1699, 0.16, + 0.1514, 0.14, 0.1361, 0.13, 0.1295, 0.129, 0.1281, 0.13, 0.1309, 0.135, 0.1408, 0.145, 0.1546, 0.16, 0.1644, 0.165, 0.1656, 0.162, + 0.1606, 0.155, 0.1516, 0.15, 0.1461, 0.15, 0.1585, 0.16, 0.1975, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueK5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1727, 0.18, 0.1814, 0.19, 0.1931, 0.21, 0.2379, 0.25, 0.2728, 0.29, 0.3054, 0.31, 0.3396, 0.36, 0.3780, 0.4, 0.4243, 0.45, 0.4829, 0.51, 0.5464, 0.57, + 0.6024, 0.62, 0.6348, 0.63, 0.6209, 0.59, 0.5741, 0.55, 0.5258, 0.49, 0.4755, 0.43, 0.4003, 0.37, 0.3204, 0.3, 0.2656, 0.25, 0.2282, 0.21, 0.1966, 0.17, + 0.1624, 0.15, 0.1322, 0.12, 0.1137, 0.11, 0.1052, 0.105, 0.1025, 0.102, 0.1028, 0.105, 0.1075, 0.11, 0.1155, 0.12, 0.1237, 0.13, 0.1310, 0.133, + 0.1352, 0.136, 0.1370, 0.14, 0.1444, 0.15, 0.1632, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueN1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1936, 0.194, 0.1942, 0.22, 0.2692, 0.29, 0.3102, 0.33, 0.3535, 0.37, 0.3885, 0.4, 0.4230, 0.44, 0.4594, 0.48, 0.5011, 0.52, 0.5510, 0.58, 0.6022, 0.62, 0.6479, 0.66, + 0.6748, 0.67, 0.6640, 0.65, 0.6268, 0.61, 0.5919, 0.58, 0.5549, 0.53, 0.4921, 0.46, 0.4209, 0.39, 0.3723, 0.35, 0.3364, 0.32, 0.3005, 0.28, 0.2569, 0.23, 0.2154, 0.19, + 0.1897, 0.18, 0.1768, 0.175, 0.1723, 0.173, 0.1722, 0.175, 0.1785, 0.18, 0.1892, 0.19, 0.2017, 0.21, 0.2134, 0.22, 0.2202, 0.222, 0.2247, 0.23, 0.2333, 0.24, 0.2566, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueN4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3138, 0.25, 0.2038, 0.19, 0.1787, 0.18, 0.1840, 0.2, 0.2109, 0.23, 0.2400, 0.26, 0.2715, 0.29, 0.3075, 0.33, 0.3534, 0.39, 0.4149, 0.45, 0.4863, 0.52, + 0.5520, 0.57, 0.5904, 0.58, 0.5750, 0.55, 0.5198, 0.48, 0.4602, 0.43, 0.3997, 0.36, 0.3199, 0.27, 0.2411, 0.2, 0.1883, 0.17, 0.1553, 0.14, 0.1307, 0.12, + 0.1062, 0.1, 0.0859, 0.08, 0.0746, 0.07, 0.0697, 0.069, 0.0678, 0.068, 0.0683, 0.07, 0.0715, 0.075, 0.0765, 0.08, 0.0818, 0.085, 0.0862, 0.087, 0.0885, 0.089, + 0.0899, 0.09, 0.0951, 0.1, 0.1090, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueO19_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1231, 0.13, 0.1348, 0.12, 0.1152, 0.12, 0.1368, 0.15, 0.1627, 0.17, 0.1860, 0.2, 0.2130, 0.23, 0.2462, 0.26, 0.2859, 0.31, 0.3425, 0.38, 0.4152, 0.45, 0.4902, 0.51, + 0.5386, 0.53, 0.5259, 0.49, 0.4652, 0.43, 0.3950, 0.35, 0.3266, 0.28, 0.2469, 0.21, 0.1750, 0.15, 0.1293, 0.12, 0.1033, 0.09, 0.0859, 0.08, 0.0703, 0.06, 0.0578, 0.055, + 0.0521, 0.05, 0.0494, 0.049, 0.0492, 0.049, 0.0498, 0.05, 0.0522, 0.053, 0.0558, 0.058, 0.0590, 0.06, 0.0615, 0.062, 0.0625, 0.063, 0.0634, 0.065, 0.0670, 0.07, 0.0776, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_BlueU8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0776, 0.1, 0.1703, 0.23, 0.2942, 0.35, 0.4022, 0.45, 0.4795, 0.51, 0.5389, 0.56, 0.5968, 0.6, 0.6362, 0.64, 0.6512, 0.652, 0.6523, 0.64, 0.6340, 0.62, 0.6052, 0.58, + 0.5645, 0.53, 0.4952, 0.45, 0.4124, 0.38, 0.3457, 0.32, 0.2883, 0.25, 0.2164, 0.19, 0.1529, 0.14, 0.1168, 0.1, 0.0983, 0.09, 0.0883, 0.08, 0.0798, 0.075, 0.0735, 0.073, + 0.0720, 0.072, 0.0726, 0.074, 0.0757, 0.08, 0.0830, 0.09, 0.0930, 0.095, 0.0989, 0.097, 0.0971, 0.095, 0.0911, 0.085, 0.0832, 0.08, 0.0795, 0.082, 0.0877, 0.09, 0.1140, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//N8 +const double ColorTemp::J570_NeuN8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0632, -0.04, -0.0244, 0.01, 0.0125, 0.02, 0.0294, 0.03, 0.0326, 0.033, 0.0352, 0.036, 0.0361, 0.037, 0.0374, 0.0374, 0.0373, 0.038, 0.0378, 0.039, 0.0397, 0.04, + 0.0421, 0.043, 0.0431, 0.042, 0.0417, 0.04, 0.0391, 0.038, 0.0378, 0.037, 0.0368, 0.035, 0.0347, 0.034, 0.0335, 0.034, 0.0341, 0.035, 0.0350, 0.035, 0.0355, 0.036, + 0.0357, 0.0357, 0.0358, 0.036, 0.0369, 0.037, 0.0372, 0.0376, 0.0378, 0.038, 0.0388, 0.039, 0.0397, 0.04, 0.0400, 0.0395, 0.0394, 0.039, 0.0386, 0.0385, 0.0384, 0.039, + 0.0395, 0.04, 0.0415, 0.043, 0.0448, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuN9_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0573, 0.054, 0.0516, 0.053, 0.0548, 0.05, 0.0401, 0.041, 0.0424, 0.043, 0.0449, 0.046, 0.0467, 0.047, 0.0473, 0.0473, 0.0474, 0.048, 0.0483, 0.05, 0.0508, 0.053, + 0.0558, 0.057, 0.0584, 0.058, 0.0550, 0.05, 0.0495, 0.048, 0.0468, 0.0465, 0.0460, 0.044, 0.0430, 0.042, 0.0411, 0.042, 0.0425, 0.044, 0.0457, 0.046, 0.0473, 0.0474, + 0.0475, 0.0475, 0.0474, 0.0475, 0.0476, 0.048, 0.0487, 0.049, 0.0499, 0.05, 0.0515, 0.052, 0.0533, 0.054, 0.0544, 0.054, 0.0539, 0.053, 0.0526, 0.052, 0.0512, 0.0515, + 0.0515, 0.053, 0.0538, 0.056, 0.0597, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuO8_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0014, 0.02, 0.0806, 0.07, 0.0673, 0.07, 0.0854, 0.09, 0.0901, 0.095, 0.0960, 0.098, 0.0992, 0.1, 0.1017, 0.102, 0.1030, 0.104, 0.1052, 0.107, 0.1098, 0.11, + 0.1176, 0.12, 0.1230, 0.12, 0.1176, 0.11, 0.1071, 0.105, 0.1032, 0.103, 0.1032, 0.1, 0.0963, 0.09, 0.0899, 0.09, 0.0939, 0.095, 0.1007, 0.102, 0.1037, 0.104, + 0.1029, 0.102, 0.1014, 0.102, 0.1020, 0.103, 0.1039, 0.105, 0.1072, 0.11, 0.1134, 0.12, 0.1207, 0.122, 0.1245, 0.123, 0.1236, 0.121, 0.1205, 0.12, 0.1158, 0.115, + 0.1132, 0.115, 0.1185, 0.12, 0.1345, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuO11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2926, 0.2, 0.1863, 0.16, 0.1428, 0.14, 0.1322, 0.134, 0.1396, 0.14, 0.1450, 0.146, 0.1498, 0.15, 0.1527, 0.155, 0.1554, 0.157, 0.1583, 0.16, 0.1631, 0.17, + 0.1754, 0.18, 0.1841, 0.18, 0.1761, 0.17, 0.1600, 0.155, 0.1549, 0.155, 0.1555, 0.15, 0.1449, 0.14, 0.1352, 0.14, 0.1414, 0.15, 0.1519, 0.153, 0.1568, 0.156, + 0.1556, 0.154, 0.1534, 0.154, 0.1547, 0.156, 0.1573, 0.16, 0.1622, 0.17, 0.1713, 0.18, 0.1823, 0.185, 0.1886, 0.188, 0.1873, 0.183, 0.1829, 0.18, 0.1753, 0.174, + 0.1716, 0.175, 0.1800, 0.2, 0.2039, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuD5_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0840, 0.1, 0.1627, 0.18, 0.1934, 0.2, 0.2234, 0.23, 0.2430, 0.25, 0.2547, 0.26, 0.2618, 0.264, 0.2651, 0.265, 0.2655, 0.2655, 0.2659, 0.266, 0.2674, 0.27, + 0.2776, 0.28, 0.2841, 0.27, 0.2654, 0.25, 0.2351, 0.23, 0.2246, 0.225, 0.2247, 0.22, 0.2074, 0.20, 0.1913, 0.20, 0.2029, 0.21, 0.2231, 0.23, 0.2337, 0.233, + 0.2327, 0.23, 0.2291, 0.23, 0.2305, 0.232, 0.2344, 0.24, 0.2417, 0.25, 0.2553, 0.26, 0.2724, 0.28, 0.2816, 0.28, 0.2797, 0.276, 0.2720, 0.27, + 0.2603, 0.26, 0.2536, 0.26, 0.2660, 0.28, 0.3027, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_NeuE11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1699, 0.18, 0.1971, 0.21, 0.2276, 0.23, 0.2483, 0.25, 0.2690, 0.28, 0.2820, 0.29, 0.2916, 0.295, 0.2992, 0.3, 0.3064, 0.31, 0.3151, 0.32, 0.3301, 0.34, 0.3593, 0.37, + 0.3873, 0.39, 0.3913, 0.38, 0.3793, 0.375, 0.3723, 0.37, 0.3678, 0.35, 0.3482, 0.33, 0.3249, 0.32, 0.3188, 0.319, 0.3188, 0.318, 0.3179, 0.315, 0.3128, 0.31, + 0.3086, 0.31, 0.3105, 0.312, 0.3148, 0.313, 0.3222, 0.33, 0.3364, 0.34, 0.3535, 0.36, 0.3629, 0.362, 0.3621, 0.36, 0.3549, 0.35, 0.3444, 0.34, 0.3394, 0.35, 0.3511, 0.36, 0.3862, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_NeuK16_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5837, 0.45, 0.4117, 0.43, 0.4427, 0.47, 0.5098, 0.52, 0.5451, 0.55, 0.5698, 0.57, 0.5828, 0.59, 0.5939, 0.6, 0.6045, 0.607, 0.6140, 0.62, 0.6219, 0.63, 0.6330, 0.64, + 0.6419, 0.643, 0.6440, 0.642, 0.6417, 0.64, 0.6379, 0.631, 0.6309, 0.62, 0.6154, 0.6, 0.5911, 0.58, 0.5736, 0.57, 0.5612, 0.56, 0.5539, 0.55, 0.5462, 0.543, + 0.5406, 0.542, 0.5418, 0.543, 0.5452, 0.55, 0.5529, 0.56, 0.5654, 0.57, 0.5806, 0.584, 0.5888, 0.589, 0.5898, 0.586, 0.5858, 0.58, 0.5796, 0.577, 0.5770, 0.58, 0.5883, 0.59, 0.6190, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuM3_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2659, 0.255, 0.2526, 0.26, 0.2616, 0.27, 0.2854, 0.29, 0.3088, 0.31, 0.3231, 0.33, 0.3336, 0.34, 0.3421, 0.345, 0.347, 0.35, 0.3542, 0.36, 0.3647, 0.37, + 0.3854, 0.4, 0.4041, 0.402, 0.4012, 0.39, 0.3856, 0.38, 0.3769, 0.375, 0.3725, 0.36, 0.3525, 0.34, 0.3286, 0.325, 0.3247, 0.326, 0.3279, 0.328, 0.3285, 0.325, + 0.3240, 0.322, 0.3202, 0.321, 0.3220, 0.323, 0.3267, 0.33, 0.3342, 0.34, 0.3487, 0.35, 0.3667, 0.37, 0.3761, 0.375, 0.3746, 0.37, 0.3670, 0.36, 0.3559, 0.35, 0.3498, 0.35, 0.3630, 0.37, 0.3998, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuN18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1284, 0.11, 0.1090, 0.13, 0.1573, 0.17, 0.1837, 0.19, 0.1971, 0.2, 0.2059, 0.21, 0.2143, 0.22, 0.2213, 0.225, 0.2271, 0.23, 0.2341, 0.24, 0.2487, 0.26, 0.2764, 0.29, + 0.3025, 0.303, 0.3052, 0.3, 0.2919, 0.29, 0.2843, 0.283, 0.2800, 0.27, 0.2612, 0.24, 0.2394, 0.235, 0.2339, 0.234, 0.2340, 0.233, 0.2326, 0.23, 0.2277, 0.225, + 0.2235, 0.224, 0.2246, 0.226, 0.2282, 0.23, 0.2349, 0.24, 0.2477, 0.25, 0.2632, 0.27, 0.2714, 0.271, 0.2702, 0.27, 0.2637, 0.26, 0.2538, 0.25, 0.2479, 0.25, 0.2589, 0.26, 0.2918, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuQ1_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0610, 0.06, 0.0592, 0.04, 0.0339, 0.04, 0.0338, 0.034, 0.0350, 0.036, 0.0363, 0.037, 0.0380, 0.038, 0.0383, 0.0383, 0.0385, 0.04, 0.0408, 0.042, 0.0451, 0.05, + 0.0524, 0.055, 0.0589, 0.058, 0.0585, 0.055, 0.0529, 0.05, 0.0456, 0.04, 0.0390, 0.035, 0.0330, 0.03, 0.0286, 0.028, 0.0275, 0.0276, 0.0275, 0.0278, 0.0279, 0.028, + 0.0289, 0.03, 0.0304, 0.031, 0.0320, 0.032, 0.0328, 0.033, 0.0341, 0.0345, 0.0346, 0.0346, 0.0347, 0.034, 0.0341, 0.034, 0.0336, 0.034, 0.0340, 0.035, + 0.0351, 0.036, 0.0373, 0.038, 0.0411, 0.042, 0.0446, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuS7_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1447, 0.06, 0.0448, 0.042, 0.0411, 0.03, 0.0282, 0.028, 0.0270, 0.029, 0.0298, 0.03, 0.0319, 0.032, 0.0331, 0.0333, 0.0335, 0.036, 0.0361, 0.038, 0.0403, 0.045, + 0.0493, 0.05, 0.0599, 0.06, 0.0636, 0.062, 0.0606, 0.06, 0.0547, 0.05, 0.0488, 0.045, 0.0421, 0.04, 0.0366, 0.035, 0.0335, 0.033, 0.0323, 0.032, 0.0320, 0.032, + 0.0321, 0.0322, 0.0324, 0.033, 0.0333, 0.034, 0.0345, 0.035, 0.0356, 0.036, 0.0364, 0.037, 0.0372, 0.037, 0.0367, 0.0365, 0.0363, 0.0364, + 0.0361, 0.0362, 0.0363, 0.037, 0.0376, 0.04, 0.0412, 0.042, 0.0450, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuV10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1439, 0.07, 0.0583, 0.04, 0.0372, 0.037, 0.0362, 0.035, 0.0344, 0.034, 0.0340, 0.035, 0.0351, 0.036, 0.0361, 0.0361, 0.0361, 0.037, 0.0377, 0.039, 0.0404, 0.042, + 0.0450, 0.047, 0.0483, 0.048, 0.0475, 0.045, 0.0436, 0.04, 0.0387, 0.036, 0.0343, 0.03, 0.0299, 0.028, 0.0271, 0.027, 0.0262, 0.0262, 0.0262, 0.0267, 0.0269, 0.027, + 0.0283, 0.029, 0.0299, 0.03, 0.0308, 0.031, 0.0319, 0.032, 0.0331, 0.0333, 0.0337, 0.0337, 0.0337, 0.0333, 0.0332, 0.0332, 0.0331, 0.0331, 0.0331, 0.034, + 0.0341, 0.035, 0.0371, 0.038, 0.0399, 0.041, 0.0432, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuW18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.4685, 0.45, 0.4262, 0.5, 0.5061, 0.55, 0.5898, 0.6, 0.6487, 0.66, 0.6781, 0.68, 0.6947, 0.7, 0.7070, 0.71, 0.7185, 0.72, 0.7294, 0.73, 0.7383, 0.74, 0.7499, 0.75, + 0.7582, 0.758, 0.7582, 0.755, 0.7531, 0.75, 0.7484, 0.745, 0.7422, 0.73, 0.7263, 0.72, 0.7033, 0.7, 0.6913, 0.69, 0.6820, 0.68, 0.6738, 0.67, 0.6628, 0.66, + 0.6512, 0.65, 0.6462, 0.645, 0.6448, 0.645, 0.6485, 0.65, 0.6569, 0.66, 0.6698, 0.67, 0.6781, 0.68, 0.6822, 0.682, 0.6820, 0.682, 0.6815, 0.682, 0.6820, 0.69, 0.6907, 0.7, 0.7152, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuZ14_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.2765, 0.2, 0.1352, 0.13, 0.1222, 0.121, 0.1206, 0.13, 0.1300, 0.134, 0.1357, 0.14, 0.1407, 0.142, 0.1455, 0.147, 0.1485, 0.15, 0.1539, 0.16, 0.1648, 0.17, + 0.1844, 0.2, 0.2015, 0.202, 0.2024, 0.2, 0.1922, 0.19, 0.1868, 0.185, 0.1841, 0.18, 0.1715, 0.16, 0.1566, 0.155, 0.1536, 0.154, 0.1545, 0.154, 0.1536, 0.151, + 0.1500, 0.148, 0.1471, 0.1472, 0.1478, 0.15, 0.1505, 0.153, 0.1552, 0.16, 0.1641, 0.17, 0.1751, 0.18, 0.1813, 0.181, 0.1801, 0.18, + 0.1757, 0.17, 0.1683, 0.165, 0.1642, 0.17, 0.1728, 0.18, 0.1970, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::J570_NeuC18_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0555, 0.055, 0.0545, 0.055, 0.0585, 0.058, 0.0577, 0.056, 0.0554, 0.056, 0.0564, 0.058, 0.0590, 0.06, 0.0611, 0.062, 0.0638, 0.065, 0.0685, 0.07, 0.0797, 0.09, + 0.1009, 0.11, 0.1222, 0.124, 0.1298, 0.127, 0.1257, 0.123, 0.1208, 0.12, 0.1164, 0.11, 0.1067, 0.1, 0.0954, 0.09, 0.0895, 0.088, 0.0862, 0.085, 0.0834, 0.082, + 0.0806, 0.08, 0.0782, 0.078, 0.0780, 0.078, 0.0789, 0.08, 0.0813, 0.084, 0.0858, 0.09, 0.0911, 0.092, 0.0944, 0.093, 0.0938, 0.092, 0.0914, 0.09, 0.0878, 0.086, + 0.0858, 0.09, 0.0903, 0.1, 0.1037, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuD17_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1980, 0.1, 0.0793, 0.06, 0.0578, 0.05, 0.0476, 0.046, 0.0454, 0.046, 0.0471, 0.048, 0.0499, 0.05, 0.0518, 0.052, 0.0533, 0.055, 0.0574, 0.06, 0.0676, 0.07, + 0.0897, 0.1, 0.1129, 0.113, 0.1140, 0.1, 0.0958, 0.08, 0.0743, 0.06, 0.0566, 0.05, 0.0422, 0.04, 0.0332, 0.03, 0.0297, 0.0295, 0.0292, 0.0293, 0.0294, 0.03, + 0.0306, 0.031, 0.0319, 0.032, 0.0339, 0.034, 0.0353, 0.036, 0.0363, 0.037, 0.0370, 0.037, 0.0372, 0.037, 0.0368, 0.0365, 0.0363, 0.036, + 0.0360, 0.037, 0.0376, 0.039, 0.0406, 0.042, 0.0448, 0.046, 0.0499, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuJ11_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1274, 0.1, 0.0916, 0.08, 0.0656, 0.061, 0.0604, 0.06, 0.0570, 0.06, 0.0604, 0.062, 0.0644, 0.065, 0.0668, 0.069, 0.0700, 0.072, 0.0754, 0.08, 0.0874, 0.1, + 0.1111, 0.12, 0.1327, 0.132, 0.1313, 0.12, 0.1127, 0.1, 0.0931, 0.08, 0.0758, 0.06, 0.0580, 0.05, 0.0449, 0.04, 0.0385, 0.037, 0.0360, 0.036, 0.0351, 0.035, + 0.0351, 0.0354, 0.0355, 0.036, 0.0371, 0.0375, 0.0379, 0.038, 0.0388, 0.04, 0.0406, 0.041, 0.0414, 0.0415, 0.0416, 0.041, 0.0409, 0.04, 0.0398, 0.0397, 0.0397, 0.04, + 0.0424, 0.043, 0.0458, 0.048, 0.0522, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::J570_NeuL4_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0348, 0.05, 0.0700, 0.09, 0.1043, 0.11, 0.1320, 0.14, 0.1505, 0.16, 0.1622, 0.17, 0.1721, 0.18, 0.1805, 0.185, 0.1877, 0.19, 0.1955, 0.2, 0.2068, 0.21, + 0.2226, 0.23, 0.2350, 0.235, 0.2352, 0.23, 0.2251, 0.22, 0.2128, 0.2, 0.1990, 0.18, 0.1761, 0.16, 0.1494, 0.13, 0.1296, 0.12, 0.1171, 0.11, 0.1089, 0.105, + 0.1010, 0.1, 0.0949, 0.093, 0.0926, 0.093, 0.0937, 0.095, 0.0961, 0.1, 0.1020, 0.11, 0.1104, 0.112, 0.1150, 0.115, 0.1155, 0.113, 0.1123, 0.11, + 0.1070, 0.105, 0.1040, 0.11, 0.1110, 0.12, 0.1323, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +const double ColorTemp::Colorlab_n72_n2_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0116, 0.01, 0.0171, 0.05, 0.0625, 0.08, 0.1486, 0.16, 0.1963, 0.2, 0.2409, 0.26, 0.2974, 0.31, 0.3468, 0.36, 0.3790, 0.39, 0.4075, 0.41, 0.4216, 0.43, + 0.4399, 0.47, 0.4878, 0.50, 0.5589, 0.57, 0.5882, 0.57, 0.5566, 0.52, 0.5030, 0.46, 0.4451, 0.42, 0.3928, 0.37, 0.3625, 0.35, 0.3396, 0.29, 0.2670, 0.15, + 0.1028, 0.05, -0.0397, -0.08, -0.1151, -0.12, -0.1464, -0.15, -0.1582, -0.16, -0.1609, -0.16, -0.1581, -0.155, -0.1556, -0.156, + -0.1582, -0.16, -0.1621, -0.165, -0.1683, -0.17, -0.1719, -0.17, -0.1696, -0.165, -0.1623, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_10_n70_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0964, 0.1, 0.1534, 0.2, 0.2437, 0.33, 0.4663, 0.5, 0.6005, 0.65, 0.6958, 0.75, 0.8010, 0.83, 0.8598, 0.858, 0.8579, 0.85, 0.8432, 0.83, 0.8102, 0.79, + 0.7607, 0.7, 0.6760, 0.6, 0.5530, 0.5, 0.4212, 0.3, 0.2974, 0.2, 0.1839, 0.1, 0.0743, 0.03, -0.0208, -0.05, -0.0747, -0.08, -0.0913, -0.05, -0.0458, 0.03, + 0.0806, 0.1, 0.1936, 0.2, 0.2556, 0.27, 0.2816, 0.29, 0.2925, 0.3, 0.3033, 0.31, 0.3175, 0.32, 0.3257, 0.325, 0.3246, 0.32, + 0.3187, 0.31, 0.3082, 0.305, 0.3014, 0.304, 0.3059, 0.31, 0.3253, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n33_n70_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0615, 0.1, 0.1219, 0.2, 0.2179, 0.3, 0.4397, 0.5, 0.5722, 0.6, 0.6714, 0.7, 0.7834, 0.8, 0.8535, 0.86, 0.8647, 0.864, 0.8642, 0.864, 0.8429, 0.82, + 0.8035, 0.75, 0.7316, 0.7, 0.6238, 0.55, 0.4996, 0.45, 0.3717, 0.3, 0.2487, 0.2, 0.1299, 0.06, 0.0272, 0.01, -0.0315, -0.04, -0.0557, -0.051, + -0.0519, -0.03, -0.0234, 0.001, 0.0041, 0.01, 0.0201, 0.021, 0.0269, 0.028, 0.0298, 0.03, 0.0371, 0.04, 0.0497, 0.05, 0.0578, 0.056, + 0.0557, 0.05, 0.0490, 0.04, 0.0374, 0.03, 0.0299, 0.03, 0.0348, 0.04, 0.0537, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n8_n74_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0603, 0.08, 0.1069, 0.15, 0.1810, 0.25, 0.3573, 0.4, 0.4634, 0.5, 0.5406, 0.6, 0.6266, 0.65, 0.6772, 0.679, 0.6800, 0.68, 0.6732, 0.66, 0.6511, 0.63, + 0.6136, 0.6, 0.5444, 0.5, 0.4415, 0.4, 0.3317, 0.3, 0.2286, 0.2, 0.1336, 0.1, 0.0425, 0.01, -0.0360, -0.05, -0.0807, -0.09, -0.0967, -0.08, + -0.0761, -0.05, -0.0119, 0.02, 0.0462, 0.05, 0.0784, 0.08, 0.0919, 0.095, 0.0974, 0.1, 0.1046, 0.11, 0.1152, 0.12, 0.1217, 0.121, + 0.1205, 0.12, 0.1155, 0.11, 0.1067, 0.104, 0.1010, 0.103, 0.1047, 0.11, 0.1199, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_19_n69_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1281, 0.16, 0.1941, 0.24, 0.2982, 0.4, 0.5607, 0.65, 0.7192, 0.8, 0.8299, 0.9, 0.9517, 1.0, 1.0174, 1.014, 1.0115, 1.0, 0.9899, 0.96, 0.9475, 0.91, + 0.8877, 0.82, 0.7902, 0.7, 0.6508, 0.57, 0.5008, 0.45, 0.3595, 0.3, 0.2302, 0.15, 0.1049, 0.02, -0.0045, -0.03, -0.0662, -0.07, -0.0832, -0.05, -0.0161, 0.05, + 0.1648, 0.2, 0.3257, 0.37, 0.4137, 0.43, 0.4506, 0.46, 0.4661, 0.47, 0.4801, 0.49, 0.4974, 0.5, 0.5072, 0.505, 0.5062, 0.5, 0.4995, 0.49, 0.4876, 0.48, + 0.4799, 0.48, 0.4849, 0.49, 0.5081, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n80_10_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0247, -0.01, -0.0057, 0.01, 0.0242, 0.05, 0.0736, 0.08, 0.0996, 0.1, 0.1281, 0.14, 0.1660, 0.19, 0.2037, 0.21, 0.2337, 0.25, 0.2618, 0.27, 0.2793, 0.29, + 0.3024, 0.32, 0.3564, 0.4, 0.4360, 0.44, 0.4788, 0.47, 0.4655, 0.45, 0.4308, 0.42, 0.3920, 0.37, 0.3564, 0.34, 0.3357, 0.32, 0.3167, 0.28, 0.2434, 0.1, + 0.0745, 0.01, -0.0725, -0.09, -0.1506, -0.18, -0.1831, -0.19, -0.1955, -0.195, -0.1995, -0.199, -0.1989, -0.198, + -0.1976, -0.198, -0.1999, -0.2, -0.2027, -0.208, -0.2070, -0.208, -0.2094, -0.208, -0.2080, -0.207, -0.2038, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +const double ColorTemp::Colorlab_n80_26_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.0325, -0.03, -0.0203, -0.01, -0.0012, 0.01, 0.0228, 0.03, 0.0332, 0.04, 0.0506, 0.06, 0.0762, 0.09, 0.1069, 0.12, 0.1370, 0.15, 0.1666, 0.17, 0.1877, 0.2, + 0.2174, 0.25, 0.2849, 0.33, 0.3849, 0.4, 0.4477, 0.45, 0.4509, 0.44, 0.4305, 0.42, 0.4049, 0.39, 0.3806, 0.37, 0.3664, 0.35, 0.3495, 0.29, 0.2724, 0.1, + 0.0921, 0.01, -0.0651, -0.09, -0.1489, -0.15, -0.1837, -0.19, -0.1970, -0.2, -0.2020, -0.202, -0.2029, -0.203, -0.2026, -0.204, + -0.2047, -0.205, -0.2069, -0.208, -0.2099, -0.21, -0.2115, -0.21, -0.2106, -0.209, -0.2086, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +/* +//0,1767000 0,2207000 0,3142000 0,5269000 0,7018000 0,7605000 0,7580000 0,7366000 0,7182000 0,6929000 0,6661000 0,6542000 +//0,6420000 0,6085000 0,5752000 0,5728000 0,5723000 0,5318000 0,4982000 0,5226000 0,5670000 0,5929000 0,5977000 0,5975000 +//0,6002000 0,6065000 0,6177000 0,6352000 0,6526000 0,6623000 0,6633000 0,6593000 0,6517000 0,6479000 0,6607000 0,6908000 + +const double ColorTemp::JDC468_greyc14_66_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1767, 0.19, 0.2207, 0.25, 0.3142, 0.40, 0.5269, 0.63, 0.7018, 0.73, 0.7605, 0.76, 0.7580, 0.74, 0.7366, 0.725, 0.7182, 0.705, 0.6929, 0.68, 0.6661, 0.66, 0.6542, 0.65, + 0.642, 0.62, 0.6085, 0.585, 0.5752, 0.573, 0.5728, 0.573, 0.5723, 0.555, 0.5318, 0.51, 0.4982, 0.51, 0.5226, 0.54, 0.5670, 0.58, 0.5929, 0.594, 0.5977, 0.597, 0.5975, 0.6, + 0.6002, 0.602, 0.6065, 0.61, 0.6177, 0.62, 0.6352, 0.64, 0.6526, 0.66, 0.6623, 0.662, 0.6633, 0.66, 0.6593, 0.653, 0.6517, 0.65, 0.6479, 0.65, 0.6607, 0.69, 0.6908, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +//0,1325000 0,1637000 0,2222000 0,3492000 0,4523000 0,4897000 0,4918000 0,4840000 0,4761000 0,4638000 0,4538000 0,4582000 +// 0,4588000 0,4360000 0,4091000 0,4101000 0,4128000 0,3785000 0,3494000 0,3720000 0,4122000 0,4339000 0,4362000 0,4355000 +// 0,4395000 0,4475000 0,4606000 0,4807000 0,5006000 0,5125000 0,5145000 0,5112000 0,5029000 0,4992000 0,5150000 0,5526000 + +const double ColorTemp::JDC468_greym13_325_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1325, 0.15, 0.1637, 0.2, 0.2222, 0.28, 0.3492, 0.40, 0.4523, 0.47, 0.4897, 0.49, 0.4918, 0.49, 0.4840, 0.48, 0.4761, 0.47, 0.4638, 0.46, 0.4538, 0.455, 0.4582, 0.458, + 0.4588, 0.45, 0.4360, 0.42, 0.4091, 0.41, 0.4101, 0.411, 0.4128, 0.405, 0.3785, 0.36, 0.3494, 0.36, 0.3720, 0.41, 0.4122, 0.425, 0.4339, 0.435, 0.4362, 0.597, 0.4355, 0.437, + 0.4395, 0.44, 0.4475, 0.45, 0.4606, 0.47, 0.4807, 0.49, 0.5006, 0.51, 0.5125, 0.513, 0.5145, 0.512, 0.5112, 0.51, 0.5029, 0.5, 0.4992, 0.51, 0.5150, 0.53, 0.5526, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; + +//0,0823000 0,1036000 0,1337000 0,1966000 0,2468000 0,2679000 0,2728000 0,2726000 0,2724000 0,2698000 0,2705000 0,2810000 +// 0,2879000 0,2756000 0,2586000 0,2601000 0,2617000 0,2357000 0,2124000 0,2241000 0,2471000 0,2581000 0,2569000 0,2548000 +// 0,2579000 0,2653000 0,2765000 0,2941000 0,3126000 0,3230000 0,3238000 0,3189000 0,3091000 0,3043000 0,3200000 0,3579000 + +const double ColorTemp::JDC468_greyf26_156_spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0823, 0.1, 0.1036, 0.11, 0.1337, 0.16, 0.1966, 0.22, 0.2468, 0.255, 0.2679, 0.27, 0.2728, 0.273, 0.2726, 0.273, 0.2724, 0.271, 0.2698, 0.27, 0.2705, 0.275, 0.2810, 0.285, + 0.2879, 0.28, 0.2756, 0.26, 0.2586, 0.26, 0.2601, 0.261, 0.2617, 0.25, 0.2357, 0.22, 0.2124, 0.22, 0.2241, 0.23, 0.2471, 0.25, 0.2581, 0.278, 0.2569, 0.255, 0.2548, 0.255, + 0.2579, 0.26, 0.2653, 0.27, 0.2765, 0.28, 0.2941, 0.30, 0.3126, 0.32, 0.3230, 0.323, 0.3238, 0.32, 0.3189, 0.31, 0.3091, 0.302, 0.3043, 0.31, 0.3200, 0.34, 0.3579, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +*/ +//A1 0.0912 0.1228 0.1712 0.2978 0.3713 0.4241 0.4861 0.5255 0.5355 0.5363 0.5237 0.5251 +// 0.5722 0.6554 0.6936 0.6675 0.6203 0.5651 0.5116 0.4825 0.4714 0.4866 0.5320 0.5729 +// 0.5968 0.6069 0.6131 0.6198 0.6285 0.6325 0.6316 0.6282 0.6227 0.6196 0.6215 0.6337 + +const double ColorTemp::Colorlab_n80_5_9_5_9spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0912, 0.1, 0.1228, 0.15, 0.1712, 0.2, 0.2978, 0.32, 0.3713, 0.41, 0.4241, 0.44, 0.4861, 0.51, 0.5255, 0.53, 0.5355, 0.534, 0.5363, 0.53, 0.5237, 0.524, 0.5251, 0.56, + 0.5722, 0.6, 0.6554, 0.67, 0.6936, 0.67, 0.6675, 0.65, 0.6203, 0.6, 0.5651, 0.54, 0.5116, 0.5, 0.4825, 0.48, 0.4714, 0.48, 0.4866, 0.5, 0.5320, 0.55, 0.5729, 0.58, + 0.5968, 0.6, 0.6069, 0.61, 0.6131, 0.615, 0.6198, 0.62, 0.6285, 0.63, 0.6325, 0.632, 0.6316, 0.63, 0.6282, 0.625, 0.6227, 0.62, 0.6196, 0.62, 0.6215, 0.63, 0.6337, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +/* +//A2 0.0385 0.0514 0.0711 0.1229 0.1528 0.1744 0.1999 0.2163 0.2209 0.2216 0.2167 0.2185 +//0.2414 0.2813 0.3012 0.2922 0.2734 0.2511 0.2292 0.2173 0.2127 0.2183 0.2354 0.2508 +//0.2599 0.2637 0.2662 0.2689 0.2725 0.2742 0.2738 0.2724 0.2701 0.2689 0.2697 0.2747 + +const double ColorTemp::Colorlab_n57_5_6_9spect[97] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0385, 0.04, 0.0514, 0.06, 0.0711, 0.1, 0.1229, 0.14, 0.1528, 0.16, 0.1744, 0.18, 0.1999, 0.2, 0.2163, 0.22, 0.2209, 0.221, 0.2216, 0.22, 0.2167, 0.216, 0.2185, 0.23, + 0.2414, 0.26, 0.2813, 0.3, 0.3012, 0.3, 0.2922, 0.28, 0.2734, 0.26, 0.2511, 0.24, 0.2292, 0.22, 0.2173, 0.215, 0.2127, 0.215, 0.2183, 0.22, 0.2354, 0.24, 0.2508, 0.255, + 0.2599, 0.26, 0.2637, 0.263, 0.2662, 0.267, 0.2689, 0.27, 0.2725, 0.273, 0.2742, 0.274, 0.2738, 0.273, 0.2724, 0.271, 0.2701, 0.27, 0.2689, 0.269, 0.2697, 0.27, 0.2747, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +*/ /* * Name: XYZtoCorColorTemp.c * @@ -1024,21 +2778,218 @@ void ColorTemp::cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, dou } -void ColorTemp::temp2mulxyz (double temp, const std::string &method, double &Xxyz, double &Zxyz) +void ColorTemp::cieCAT02float(float Xw, float Yw, float Zw, float &CAM02BB00, float &CAM02BB01, float &CAM02BB02, float &CAM02BB10, float &CAM02BB11, float &CAM02BB12, float &CAM02BB20, float &CAM02BB21, float &CAM02BB22, float adap) +{ + +// CIECAT02 - J.Desmis January 2012 review September 2012 + const float whiteD50p[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with these tools + + float cam_dest[3] = {0., 0., 0.}; + float cam_orig[3] = {0., 0., 0.}; + const float CAT02[3][3] = {{0.7328, 0.4296, -0.1624},//CAT02 2002 + { -0.7036, 1.6975, 0.0061}, + {0.0030, 0.0136, 0.9834} + }; + const float INVCAT02[3][3] = {{1.09612382083551, -0.278869000218287, 0.182745179382773}, //Inverse CAT02 + {0.454369041975359, 0.4735331543070412, 0.0720978037172291}, + { -0.009627608738442936, -0.00569803121611342, 1.01532563995454} + }; + + float inv_white_orig[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float intermed[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + + float intermed_2[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float CAM02[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float 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 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 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; + + //inverse white + inv_white_orig[0][0] = 1. / cam_orig[0]; // 1/RoS + inv_white_orig[1][1] = 1. / cam_orig[1]; // 1/GaS + inv_white_orig[2][2] = 1. / cam_orig[2]; // 1/BeS + + //intermediates computation + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + intermed[i][j] = inv_white_orig[i][i] * CAT02[i][j]; + } + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + intermed_2[i][j] = cam_dest[i] * intermed[i][j]; + } + + //and CAM02 + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) { + CAM02[i][j] += INVCAT02[i][k] * intermed_2[k][j]; + } + + //adaptation jdc : slightly different from CIECAM02 : Rc=(Yw(D/Rw)+(1-D))*R , but it's work ! true at 0 and 1 + CAM02[1][1] = (CAM02[1][1] - 1.0) * D + 1.0; + CAM02[0][0] = (CAM02[0][0] - 1.0) * D + 1.0; + CAM02[2][2] = (CAM02[2][2] - 1.0) * D + 1.0; +// CAM02[1][1] *= D; +// CAM02[0][0] *= D; +// CAM02[2][2] *= D; + CAM02[0][1] *= D; + CAM02[0][2] *= D; + CAM02[1][0] *= D; + CAM02[1][2] *= D; + CAM02[2][0] *= D; + CAM02[2][1] *= D; + //CAT02 matrix with D adaptation + CAM02BB00 = CAM02[0][0]; + CAM02BB01 = CAM02[0][1]; + CAM02BB02 = CAM02[0][2]; + CAM02BB10 = CAM02[1][0]; + CAM02BB11 = CAM02[1][1]; + CAM02BB12 = CAM02[1][2]; + CAM02BB20 = CAM02[2][0]; + CAM02BB21 = CAM02[2][1]; + CAM02BB22 = CAM02[2][2]; + +} + +void ColorTemp::icieCAT02float(float Xw, float Yw, float Zw, float &iCAM02BB00, float &iCAM02BB01, float &iCAM02BB02, float &iCAM02BB10, float &iCAM02BB11, float &iCAM02BB12, float &iCAM02BB20, float &iCAM02BB21, float &iCAM02BB22, float adap) +{ + +// CIECAT02 - J.Desmis January 2012 review September 2017 + const float whiteD50p[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with these tools + + float cam_dest[3] = {0., 0., 0.}; + float cam_orig[3] = {0., 0., 0.}; + const float CAT02[3][3] = {{0.7328, 0.4296, -0.1624},//CAT02 2002 + { -0.7036, 1.6975, 0.0061}, + {0.0030, 0.0136, 0.9834} + }; + const float INVCAT02[3][3] = {{1.09612382083551, -0.278869000218287, 0.182745179382773}, //Inverse CAT02 + {0.454369041975359, 0.4735331543070412, 0.0720978037172291}, + { -0.009627608738442936, -0.00569803121611342, 1.01532563995454} + }; + + float inv_white_orig[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float intermed[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + + float intermed_2[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float INVCAM02[3][3] = {{0., 0., 0.}, + {0., 0., 0.}, + {0., 0., 0.} + }; + float D = adap / 2.; + + //white destination Wd : RT use always D50 + cam_dest[0] = INVCAT02[0][0] * whiteD50p[0] + INVCAT02[0][1] * whiteD50p[1] + INVCAT02[0][2] * whiteD50p[2]; //Cone response RoD + cam_dest[1] = INVCAT02[1][0] * whiteD50p[0] + INVCAT02[1][1] * whiteD50p[1] + INVCAT02[1][2] * whiteD50p[2]; //GaD + cam_dest[2] = INVCAT02[2][0] * whiteD50p[0] + INVCAT02[2][1] * whiteD50p[1] + INVCAT02[2][2] * whiteD50p[2]; //BeD + + //origin white Ws : A, D65, custom, etc. + cam_orig[0] = INVCAT02[0][0] * Xw + INVCAT02[0][1] * Yw + INVCAT02[0][2] * Zw; //Cone response RoS + cam_orig[1] = INVCAT02[1][0] * Xw + INVCAT02[1][1] * Yw + INVCAT02[1][2] * Zw; + cam_orig[2] = INVCAT02[2][0] * Xw + INVCAT02[2][1] * Yw + INVCAT02[2][2] * Zw; +// 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; + + //inverse white + inv_white_orig[0][0] = 1. / cam_orig[0]; // 1/RoS + inv_white_orig[1][1] = 1. / cam_orig[1]; // 1/GaS + inv_white_orig[2][2] = 1. / cam_orig[2]; // 1/BeS + + //intermediates computation + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + // intermed[i][j] = inv_white_orig[i][i] * INVCAT02[i][j]; + intermed[i][j] = inv_white_orig[i][i] * CAT02[i][j]; + } + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3 ; j++) { + intermed_2[i][j] = cam_dest[i] * intermed[i][j]; + } + + //and CAM02 + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) { + INVCAM02[i][j] += INVCAT02[i][k] * intermed_2[k][j]; + } + + //adaptation jdc : slightly different from CIECAM02 : Rc=(Yw(D/Rw)+(1-D))*R , but it's work ! true at 0 and 1 + INVCAM02[0][0] = (INVCAM02[0][0] - 1.0) * D + 1.0; + INVCAM02[2][2] = (INVCAM02[2][2] - 1.0) * D + 1.0; + INVCAM02[0][1] *= D; + INVCAM02[0][2] *= D; + INVCAM02[1][0] *= D; + INVCAM02[1][2] *= D; + INVCAM02[2][0] *= D; + INVCAM02[2][1] *= D; + //CAT02 matrix with D adaptation + iCAM02BB00 = INVCAM02[0][0]; + iCAM02BB01 = INVCAM02[0][1]; + iCAM02BB02 = INVCAM02[0][2]; + iCAM02BB10 = INVCAM02[1][0]; + iCAM02BB11 = INVCAM02[1][1]; + iCAM02BB12 = INVCAM02[1][2]; + iCAM02BB20 = INVCAM02[2][0]; + iCAM02BB21 = INVCAM02[2][1]; + iCAM02BB22 = INVCAM02[2][2]; + +} + + +void ColorTemp::temp2mulxyz (double temp, const std::string &method, StandardObserver observer, double &Xxyz, double &Zxyz) { double x, y, z; // We first test for specially handled methods const auto iterator = spectMap.find(method); - + const auto &color_match = (observer == StandardObserver::TEN_DEGREES) ? cie_colour_match_jd : cie_colour_match_jd2; +/* if(observer == StandardObserver::TEN_DEGREES){ + printf("General Observer 10°\n"); + } else { + printf("General Observer 2°\n"); + } +*/ if (iterator != spectMap.end()) { - spectrum_to_xyz_preset(iterator->second, x, y, z); + spectrum_to_xyz_preset(iterator->second, x, y, z, color_match); } else { // otherwise we use the Temp+Green generic solution if (temp <= INITIALBLACKBODY) { // if temperature is between 2000K and 4000K we use blackbody, because there will be no Daylight reference below 4000K... // of course, the previous version of RT used the "magical" but wrong formula of U.Fuchs (Ufraw). - spectrum_to_xyz_blackbody(temp, x, y, z); + spectrum_to_xyz_blackbody(temp, x, y, z, color_match); } else { // from 4000K up to 25000K: using the D illuminant (daylight) which is standard double x_D, y_D; @@ -1057,7 +3008,7 @@ void ColorTemp::temp2mulxyz (double temp, const std::string &method, double &Xxy double interm = 0.0241 + 0.2562 * x_D - 0.734 * y_D; double m1 = (-1.3515 - 1.7703 * x_D + 5.9114 * y_D) / interm; double m2 = (0.03 - 31.4424 * x_D + 30.0717 * y_D) / interm; - spectrum_to_xyz_daylight(m1, m2, x, y, z); + spectrum_to_xyz_daylight(m1, m2, x, y, z, color_match); } } @@ -1065,16 +3016,16 @@ void ColorTemp::temp2mulxyz (double temp, const std::string &method, double &Xxy Zxyz = (1.0 - x - y) / y; } -void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const +void ColorTemp::temp2mul (double temp, double green, double equal, StandardObserver observer, double& rmul, double& gmul, double& bmul) const { clip(temp, green, equal); double Xwb, Zwb; - temp2mulxyz(temp, method, Xwb, Zwb); + temp2mulxyz(temp, method, observer, Xwb, Zwb); - float adj = 1.f; + double adj = 1.0; if(equal < 0.9999 || equal > 1.0001 ) { - adj = (100.f + ( 1000.f - (1000.f * (float)equal) ) / 20.f) / 100.f; + adj = (100.0 + ( 1000.0 - (1000.0 * equal) ) / 20.0) / 100.0; } @@ -1236,17 +3187,25 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, float CRI_RT = 0.0, CRI[50]; float CRI_RTs = 0.0, CRIs[8]; + const auto &color_match = (observer == StandardObserver::TEN_DEGREES) ? cie_colour_match_jd : cie_colour_match_jd2; + //exceptional must be used by advice people + if(observer == StandardObserver::TEN_DEGREES){ + printf("CRI Observer 10°\n"); + } else { + printf("CRI Observer 2°\n"); + } + for(int i = 0; i < N_c; i++) { - spectrum_to_color_xyz_preset(spec_color[i], spect_illum[illum + 3], XchkLamp[i], YchkLamp[i], ZchkLamp[i]); + spectrum_to_color_xyz_preset(spec_color[i], spect_illum[illum + 3], XchkLamp[i], YchkLamp[i], ZchkLamp[i], color_match); } //calculate XYZ for each color : for Blackbody and Daylight at tempw if(tempw <= INITIALBLACKBODY) { for(int i = 0; i < N_c; i++) { - spectrum_to_color_xyz_blackbody(spec_color[i], tempw, Xchk[i], Ychk[i], Zchk[i]); + spectrum_to_color_xyz_blackbody(spec_color[i], tempw, Xchk[i], Ychk[i], Zchk[i], color_match); } - spectrum_to_xyz_blackbody(tempw, x, y, z);//for white point + spectrum_to_xyz_blackbody(tempw, x, y, z, color_match);//for white point } else { // after 6600K (arbitrary) I use daylight...because ...but there is no lamp... double m11, m22, x_DD, y_DD, interm2; @@ -1264,10 +3223,10 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; for(int i = 0; i < N_c; i++) { - spectrum_to_color_xyz_daylight(spec_color[i], m11, m22, Xchk[i], Ychk[i], Zchk[i]); + spectrum_to_color_xyz_daylight(spec_color[i], m11, m22, Xchk[i], Ychk[i], Zchk[i], color_match); } - spectrum_to_xyz_daylight(m11, m22, x, y, z); + spectrum_to_xyz_daylight(m11, m22, x, y, z, color_match); } if (settings->verbose) { @@ -1389,7 +3348,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, } for(int i = 0; i < 8; i++) { - CRIs[i] = 100 - 3.0 * DeltaEs[i]; //3.0 coef to adapt ==> same results than CRI "official" + CRIs[i] = 100 - 3.f * DeltaEs[i]; //3.0 coef to adapt ==> same results than CRI "official" } for(int i = 0; i < 8; i++) { @@ -1409,7 +3368,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, } for(int i = 0; i < N_c; i++) { - CRI[i] = 100 - 3.0 * DeltaE[i]; //3.0 coef to adapt ==> same results than CRI "official" + CRI[i] = 100 - 3.f * DeltaE[i]; //3.0 coef to adapt ==> same results than CRI "official" } for(int i = 0; i < N_c; i++) { @@ -1425,8 +3384,8 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, quadCRI /= N_c; if(settings->CRI_color != 0) { - printf("CRI_standard=%i CRI:1->8=%i %i %i %i %i %i %i %i Sigma=%2.1f\n", (int) CRI_RTs, (int) CRIs[0], (int) CRIs[1], (int) CRIs[2], (int) CRIs[3], (int) CRIs[4], (int) CRIs[5], (int) CRIs[6], (int) CRIs[7], sqrt(quadCRIs)); - printf("CRI_RT_exten=%i CRI:9->20=%i %i %i %i %i %i %i %i %i %i %i %i Sigma=%2.1f\n", (int) CRI_RT, (int) CRI[8], (int) CRI[9], (int) CRI[10], (int) CRI[11], (int) CRI[12], (int) CRI[13], (int) CRI[14], (int) CRI[15], (int) CRI[16], (int) CRI[17], (int) CRI[18], (int) CRI[19], sqrt(quadCRI)); + printf("CRI_standard=%i CRI:1->8=%i %i %i %i %i %i %i %i Sigma=%2.1f\n", (int) CRI_RTs, (int) CRIs[0], (int) CRIs[1], (int) CRIs[2], (int) CRIs[3], (int) CRIs[4], (int) CRIs[5], (int) CRIs[6], (int) CRIs[7], sqrt(static_cast(quadCRIs))); + printf("CRI_RT_exten=%i CRI:9->20=%i %i %i %i %i %i %i %i %i %i %i %i Sigma=%2.1f\n", (int) CRI_RT, (int) CRI[8], (int) CRI[9], (int) CRI[10], (int) CRI[11], (int) CRI[12], (int) CRI[13], (int) CRI[14], (int) CRI[15], (int) CRI[16], (int) CRI[17], (int) CRI[18], (int) CRI[19], static_cast(sqrt(quadCRI))); } } } @@ -1438,8 +3397,8 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, //calculate spectral data for blackbody at temp! double ColorTemp::blackbody_spect(double wavelength, double temperature) { - double wlm = wavelength * 1e-9; /* Wavelength in meters */ - return (3.7417715247e-16 / pow(wlm, 5)) / //3.7417..= c1 = 2*Pi*h*c2 where h=Planck constant, c=velocity of light + const double wlm = wavelength * 1e-9; /* Wavelength in meters */ + return (3.7417715247e-16 / rtengine::pow5(wlm)) / //3.7417..= c1 = 2*Pi*h*c2 where h=Planck constant, c=velocity of light (xexp(1.438786e-2 / (wlm * temperature)) - 1.0); //1.4387..= c2 = h*c/k where k=Boltzmann constant } @@ -1455,21 +3414,22 @@ The next 3 methods are inspired from: this values are often called xBar yBar zBar and are characteristics of a color / illuminant -values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2 +values cie_colour_match2[][3] = 2° Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increase precision used by J.Walker and pass to 350nm to 830nm +And also add 10° standard observer */ -void ColorTemp::spectrum_to_xyz_daylight(double _m1, double _m2, double &x, double &y, double &z) +void ColorTemp::spectrum_to_xyz_daylight(double _m1, double _m2, double &x, double &y, double &z, const color_match_type &color_match) { int i; double lambda, X = 0, Y = 0, Z = 0, XYZ; for (i = 0, lambda = 350.; lambda < 830.1; i++, lambda += 5.) { double Me = daylight_spect(lambda, _m1, _m2); - X += Me * cie_colour_match_jd[i][0]; - Y += Me * cie_colour_match_jd[i][1]; - Z += Me * cie_colour_match_jd[i][2]; + X += Me * color_match[i][0]; + Y += Me * color_match[i][1]; + Z += Me * color_match[i][2]; } XYZ = (X + Y + Z); @@ -1478,16 +3438,16 @@ void ColorTemp::spectrum_to_xyz_daylight(double _m1, double _m2, double &x, doub z = Z / XYZ; } -void ColorTemp::spectrum_to_xyz_blackbody(double _temp, double &x, double &y, double &z) +void ColorTemp::spectrum_to_xyz_blackbody(double _temp, double &x, double &y, double &z, const color_match_type &color_match) { int i; double lambda, X = 0, Y = 0, Z = 0, XYZ; for (i = 0, lambda = 350.; lambda < 830.1; i++, lambda += 5.) { double Me = blackbody_spect(lambda, _temp); - X += Me * cie_colour_match_jd[i][0]; - Y += Me * cie_colour_match_jd[i][1]; - Z += Me * cie_colour_match_jd[i][2]; + X += Me * color_match[i][0]; + Y += Me * color_match[i][1]; + Z += Me * color_match[i][2]; } XYZ = (X + Y + Z); @@ -1496,7 +3456,7 @@ void ColorTemp::spectrum_to_xyz_blackbody(double _temp, double &x, double &y, do z = Z / XYZ; } -void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, double &y, double &z) +void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, double &y, double &z, const color_match_type &color_match) { int i; double lambda, X = 0, Y = 0, Z = 0, XYZ; @@ -1513,15 +3473,16 @@ void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, dou this values are often called xBar yBar zBar and are characteristics of a color / illuminant - values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2 + values cie_colour_match_jd2[][3] = 2° Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increased the precision used by J.Walker and pass from 350nm to 830nm + And also add standard observer 10° */ for (i = 0, lambda = 350.; lambda < 830.1; i++, lambda += 5.) { double Me = get_spectral_color(lambda, spec_intens); - X += Me * cie_colour_match_jd[i][0]; - Y += Me * cie_colour_match_jd[i][1]; - Z += Me * cie_colour_match_jd[i][2]; + X += Me * color_match[i][0]; + Y += Me * color_match[i][1]; + Z += Me * color_match[i][2]; } XYZ = (X + Y + Z); @@ -1531,7 +3492,7 @@ void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, dou } //calculate XYZ from spectrum data (color) and illuminant : J.Desmis December 2011 -void ColorTemp::spectrum_to_color_xyz_preset(const double* spec_color, const double* spec_intens, double &xx, double &yy, double &zz) +void ColorTemp::spectrum_to_color_xyz_preset(const double* spec_color, const double* spec_intens, double &xx, double &yy, double &zz, const color_match_type &color_match) { int i; double lambda, X = 0, Y = 0, Z = 0, Yo = 0; @@ -1543,9 +3504,9 @@ void ColorTemp::spectrum_to_color_xyz_preset(const double* spec_color, const dou Me = get_spectral_color(lambda, spec_color); Mc = get_spectral_color(lambda, spec_intens); - X += Mc * cie_colour_match_jd[i][0] * Me; - Y += Mc * cie_colour_match_jd[i][1] * Me; - Z += Mc * cie_colour_match_jd[i][2] * Me; + X += Mc * color_match[i][0] * Me; + Y += Mc * color_match[i][1] * Me; + Z += Mc * color_match[i][2] * Me; } for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { @@ -1553,7 +3514,7 @@ void ColorTemp::spectrum_to_color_xyz_preset(const double* spec_color, const dou double Ms; Ms = get_spectral_color(lambda, spec_intens); - Yo += cie_colour_match_jd[i][1] * Ms; + Yo += color_match[i][1] * Ms; } xx = X / Yo; @@ -1562,65 +3523,41 @@ void ColorTemp::spectrum_to_color_xyz_preset(const double* spec_color, const dou } //calculate XYZ from spectrum data (color) and illuminant : J.Desmis december 2011 -void ColorTemp::spectrum_to_color_xyz_daylight(const double* spec_color, double _m1, double _m2, double &xx, double &yy, double &zz) +void ColorTemp::spectrum_to_color_xyz_daylight(const double* spec_color, double _m1, double _m2, double &xx, double &yy, double &zz, const color_match_type &color_match) { int i; - double lambda, X = 0, Y = 0, Z = 0, Yo = 0; + double lambda, X = 0, Y = 0, Z = 0; for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Me; - double Mc; - - Me = get_spectral_color(lambda, spec_color); - Mc = daylight_spect(lambda, _m1, _m2); - X += Mc * cie_colour_match_jd[i][0] * Me; - Y += Mc * cie_colour_match_jd[i][1] * Me; - Z += Mc * cie_colour_match_jd[i][2] * Me; + const double Me = spec_color[i]; + const double Mc = daylight_spect(lambda, _m1, _m2); + X += Mc * color_match[i][0] * Me; + Y += Mc * color_match[i][1] * Me; + Z += Mc * color_match[i][2] * Me; } - for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Ms; - - Ms = daylight_spect(lambda, _m1, _m2); - Yo += cie_colour_match_jd[i][1] * Ms; - } - - xx = X / Yo; - yy = Y / Yo; - zz = Z / Yo; + xx = X / Y; + yy = 1.0; + zz = Z / Y; } //calculate XYZ from spectrum data (color) and illuminant : J.Desmis december 2011 -void ColorTemp::spectrum_to_color_xyz_blackbody(const double* spec_color, double _temp, double &xx, double &yy, double &zz) +void ColorTemp::spectrum_to_color_xyz_blackbody(const double* spec_color, double _temp, double &xx, double &yy, double &zz, const color_match_type &color_match) { int i; - double lambda, X = 0, Y = 0, Z = 0, Yo = 0; + double lambda, X = 0, Y = 0, Z = 0; for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Me; - double Mc; - - Me = get_spectral_color(lambda, spec_color); - Mc = blackbody_spect(lambda, _temp); - X += Mc * cie_colour_match_jd[i][0] * Me; - Y += Mc * cie_colour_match_jd[i][1] * Me; - Z += Mc * cie_colour_match_jd[i][2] * Me; + const double Me = spec_color[i]; + const double Mc = blackbody_spect(lambda, _temp); + X += Mc * color_match[i][0] * Me; + Y += Mc * color_match[i][1] * Me; + Z += Mc * color_match[i][2] * Me; } - for (i = 0, lambda = 350; lambda < 830.1; i++, lambda += 5) { - - double Ms; - - Ms = blackbody_spect(lambda, _temp); - Yo += cie_colour_match_jd[i][1] * Ms; - } - - xx = X / Yo; - yy = Y / Yo; - zz = Z / Yo; + xx = X / Y; + yy = 1.0; + zz = Z / Y; } double ColorTemp::daylight_spect(double wavelength, double m1, double m2) @@ -1633,14 +3570,14 @@ double ColorTemp::daylight_spect(double wavelength, double m1, double m2) 53.30, 56.10, 58.90, 60.40, 61.90 }; //s1 - static const double s1[97] = {41.60, 39.80, 38.00, 40.70, 43.40, 40.95, 38.50, 36.75, 35.00, 39.20, 43.40, 44.85, 46.30, 45.10, 43.90, 40.50, 37.10, 36.90, 36.70, 36.30, 35.90, 34.25, 32.60, 30.25, 27.90, 26.10, 24.30, 22.20, 20.10, 18.15, 16.20, 14.70, + static const double s1[97] = {41.60, 39.80, 38.00, 40.20, 42.40, 40.45, 38.50, 36.75, 35.00, 39.20, 43.40, 44.85, 46.30, 45.10, 43.90, 40.50, 37.10, 36.90, 36.70, 36.30, 35.90, 34.25, 32.60, 30.25, 27.90, 26.10, 24.30, 22.20, 20.10, 18.15, 16.20, 14.70, 13.20, 10.90, 8.60, 7.35, 6.10, 5.15, 4.20, 3.05, 1.90, 0.95, 0.00, -0.80, -1.60, -2.55, -3.50, -3.50, -3.50, -4.65, -5.80, -6.50, -7.20, -7.90, -8.60, -9.05, -9.50, -10.20, -10.90, -10.80, -10.70, -11.35, -12.00, -13.00, -14.00, - -13.80, -13.60, -12.80, -12.00, -12.65, -13.30, -13.10, -12.90, -11.75, -10.60, -11.10, -11.60, -11.90, -12.20, -11.20, -10.20, -9.00, -7.80, -9.50, -11.20, -10.80, -10.50, -10.60, -10.15, -9.70, -9.00, -8.30, + -13.80, -13.60, -12.80, -12.00, -12.65, -13.30, -13.10, -12.90, -11.75, -10.60, -11.10, -11.60, -11.90, -12.20, -11.20, -10.20, -9.00, -7.80, -9.50, -11.20, -10.80, -10.40, -10.50, -10.60, -10.15, -9.70, -9.00, -8.30, -8.80, -9.30, -9.55, -9.80 }; //s2 static const double s2[97] = {6.70, 6.00, 5.30, 5.70, 6.10, 4.55, 3.00, 2.10, 1.20, 0.05, -1.10, -0.80, -0.50, -0.60, -0.70, -0.95, -1.20, -1.90, -2.60, -2.75, -2.90, -2.85, -2.80, -2.70, -2.60, -2.60, -2.60, -2.20, -1.80, -1.65, -1.50, -1.40, -1.30, - -1.25, -1.20, -1.10, -1.00, -0.75, -0.50, -0.40, -0.30, -0.15, 0.00, 0.10, 0.20, 0.35, 0.50, 1.30, 2.10, 2.65, 3.65, 4.10, 4.40, 4.70, 4.90, 5.10, 5.90, 6.70, 7.00, 7.30, 7.95, 8.60, 9.20, 9.80, 10.00, 10.20, 9.25, 8.30, 8.95, + -1.25, -1.20, -1.10, -1.00, -0.75, -0.50, -0.40, -0.30, -0.15, 0.00, 0.10, 0.20, 0.35, 0.50, 1.30, 2.10, 2.65, 3.20, 3.65, 4.10, 4.40, 4.70, 4.90, 5.10, 5.90, 6.70, 7.00, 7.30, 7.95, 8.60, 9.20, 9.80, 10.00, 10.20, 9.25, 8.30, 8.95, 9.60, 9.05, 8.50, 7.75, 7.00, 7.30, 7.60, 7.80, 8.00, 7.35, 6.70, 5.95, 5.20, 6.30, 7.40, 7.10, 6.80, 6.90, 7.00, 6.70, 6.40, 5.95, 5.50, 5.80, 6.10, 6.30, 6.50 }; @@ -1648,6 +3585,277 @@ double ColorTemp::daylight_spect(double wavelength, double m1, double m2) return (s0[wlm] + m1 * s1[wlm] + m2 * s2[wlm]); } +//tempxy : return x and y of xyY for 200 or more refreence color, and for T temperature from 2000K to 12000K +// we can change step for temperature and increase number for T > 7500K if necessary +//these values Temp, x, y are references for all calculations and very precise. +//copyright J.Desmis august 2017 and june 2018 +void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar) +{ + const double* spec_colorforxcyc[] = {//color references + JDC468_BluH10_spect, JDC468_BluD6_spect, ColorchechCyaF3_spect, JDC468_BluM5_spect, // 0 3 + ColorGreenM25_spect, JDC468_GreK7_spect, ColabSky42_0_m24_spect, ColabSky60_0_m31_spect, ColorchechBluC150_m5_m22_spect,//8 + JDC468_GreQ7_spect, ColorchechDCBluN881_m7_m14_spect, ColorchechGreB3_spect, ColorchechPurD2_spect, //12 + ColorchechSGBlaN3_6_spect, ColorchechGraC4_67_spect, JDC468_K15_87greyspect,//15 + JDC468_GraK14_44_spect, ColorGreenalsi_spect, Fictif_61greyspect, ColorchechGreD1_spect,//19 + ColorchechWhiA496_spect, JDC468_GreA10_spect, JDC468_GreI8_spect,//22 + ColabSkin91_4_14_spect, JDC468_PurE24_spect, //24 + ColorchechSGSkiK285_11_17_spect, ColorchechGreE2_spect, ColorchechMagE3_spect, //27 + ColorchechSkiB166_18_18_spect, ColabSkin70_7_32_spect, ColorchechSGSkiF763_14_26_spect,//30 + ColorchechSkiA138_13_14_spect, ColabSkin57_22_18_spect, JDC468_YelN10_spect,//33 + ColabSkin35_15_17_spect, ColabSkin40_17_17_spect, ColorRedkurttu_spect, ColorYellowkeltano_spect, ColorchechYelD3_spect, JDC468_OraO18_spect,//39 + JDC468_GreN7_spect, JDC468_RedG21va_spect, JDC468_OraD17_spect,//42 + ColorchechredC3_spect, JDC468_RedI9_spect, ColorRedpetunia_spect, ColorchechOraA2_spect,//46 + ColabSkin87_8_8_spect, ColabSkin89_8_21_spect, ColabSkin75_8_4_spect, ColabSkin75_10_33_spect,//50 + ColabSkin65_33_11_spect, ColabSkin65_7_24_spect, ColabSkin57_19_6_spect, ColabSkin57_4_19_spect, ColabSkin57_10_28_spect, ColabSkin40_17_6_spect,//56 + ColabSkin26_18_18_spect, ColabSkin90_m1_20_spect, ColorRedlupiini_spect, ColorRedhevosminttu_spect, //60 + ColorRedneilikka_spect, ColorRedpelagornia_spect, ColorRedtalvio_spect, ColorBrownpoimulehti_spect, ColorOrangetuntematon_spect,//65 + ColorOrangetlehmus_spect, ColorOrangvaahtera_spect, ColorBrownlehmus_spect, ColorBrownuotiosammal_spect,//69 + ColorBlacksoil_spect, ColorGraynahjajaekaelae_spect, //71 + ColorGreennuotisammal_spect, ColorGreenleskenlehti_spect, ColorGreenlinnunkaali_spect, //74 + ColorGreenpelto_spect, ColorGreenrodvoikukka, ColorGreenlehmus, ColorGreenlinden, ColorYellowlehmus, ColorYellowsuikeroalpi, //80 + ColorYellowpensashanhikki1, ColorYellowpensashanhikki2, ColorBluehiidenvirna, ColorBluekurkkuyrtti, //84 + ColorPinksiankaersaemoe, ColorVioletharakankello, ColorVioletalsikeapila, ColorVioletakilleija, ColorOrangekehaekukka,//89 + ColorRedpihlaja, ColorVioletpetunia, ColorVioletorvokki, ColorBluesinisievikki, ColorBlueiisoppi, ColorBluelobelia, //95 + ColorWhiteojaka, ColorWhitepetunia, ColorWhitepelargonia, ColorWhitepaeivaen, JDC468_B14_75Redspect,//100 + ColorGreenkoriste, ColorGreenpoimulehti, ColorGreenhopeapaju, //103 + ColorReduuden, ColorRedpajuan, ColorRedjaloan, ColorBlueukon, ColorBlueorvokki, ColorBluemalvikki, //109 + ColorBlackmaito, ColorOrangpihlaja, ColorBlackpihlaja, //112 + ColorViolA1_spect, ColorViolA4_spect, ColorViolA6_spect, ColorBlueSkyK3_spect, ColorBlueSkyK9_spect, //117 + ColorBlueSkyC4_spect, ColorBlueSkyC14_spect, ColorBlueSkyE4_spect, //120 + ColorBlueSkyM1_spect, ColorBlueSky2B1_spect, ColorBlueSkyT7_spect, //123 + ColorBlueSkyU19_spect, ColorBlueSkyU2_spect, ColorBlueSkyT17_spect, //126 + ColorBlackM8_spect, ColorBlackM12_spect, ColorBlackM13_spect, ColorWhite2B12_spect, ColorWhite2B14_spect, //131 + JDC468_Blackred97_spect, JDC468_Blackredbl443_spect, JDC468_Blackbl27_spect, JDC468_Blackbl28_spect, //135 + JDC468_Blackgr214_spect, JDC468_Blackbl436_spect, JDC468_Whitebl455_spect, JDC468_Blackvio101_spect, JDC468_Whitebl92_spect, JDC468_Greyredbl94_spect, //141 + JDC468_Blue32_spect, JDC468_Blue236_spect, JDC468_Gre300_spect, //144 + JDC468_Blue340_spect, JDC468_Gree110_spect, JDC468_Gree457_spect, JDC468_Yel241_spect, JDC468_Ora321_spect, JDC468_Yellow353_spect, JDC468_Mag465_spect, //151 + JDC468_Mag333_spect, JDC468_Mag203_spect, J570_BlueB6_spect, J570_BlueB15_spect, J570_BlueC2_spect, J570_BlueC14_spect, J570_BlueC16_spect,//158 + J570_BlueF1_spect, J570_BlueF2_spect, J570_BlueF10_spect, J570_BlueF13_spect, J570_BlueG9_spect, J570_BlueG19_spect, J570_BlueI5_spect,//165 + J570_BlueI3_spect, J570_BlueI19_spect, J570_BlueJ4_spect, J570_BlueJ6_spect, J570_BlueJ11_spect, J570_BlueK5_spect, //171 + J570_BlueN1_spect, J570_BlueN4_spect, J570_BlueO19_spect, J570_BlueU8_spect, J570_NeuN8_spect,//176 + J570_NeuN9_spect, J570_NeuO8_spect, J570_NeuO11_spect, J570_NeuD5_spect,//180 + J570_NeuE11_spect, J570_NeuK16_spect, J570_NeuM3_spect, J570_NeuN18_spect, + J570_NeuQ1_spect, J570_NeuS7_spect, + J570_NeuV10_spect, J570_NeuW18_spect, J570_NeuZ14_spect, //189 + J570_NeuC18_spect, J570_NeuD17_spect, J570_NeuJ11_spect, J570_NeuL4_spect, Colorlab_n72_n2_spect, + Colorlab_10_n70_spect, Colorlab_n33_n70_spect, Colorlab_n8_n74_spect, Colorlab_19_n69_spect, Colorlab_n80_10_spect, Colorlab_n80_26_spect, + Colorlab_n80_5_9_5_9spect //, Colorlab_n57_5_6_9spect + + /*JDC468_greyc14_66_spect, JDC468_greym13_325_spect, JDC468_greyf26_156_spect*/ + }; + + + typedef struct WbTxyz { + double Tem; + double XX; + double ZZ; + } WbTxyz; + //probably can be "passed" with rawimagesource.cc but I don't know how to do this. + constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values - same table as in Rawimagesource.cc x wb and y wb are calculated after + {2001., 1.273842, 0.145295}, + {2101., 1.244008, 0.167533}, + {2201., 1.217338, 0.190697}, + {2301., 1.193444, 0.214632}, + {2401., 1.171996, 0.239195}, + {2501., 1.152883, 0.264539}, + {2605., 1.134667, 0.290722}, + {2655., 1.126659, 0.303556}, + {2705., 1.119049, 0.316446}, + {2755., 1.111814, 0.329381}, + {2803., 1.105381, 0.342193}, + {2856., 1.098258, 0.355599}, + {2910., 1.091550, 0.369645}, + {2960., 1.085649, 0.382655}, + {3003., 1.080982, 0.394258}, + {3050., 1.075727, 0.406057}, + {3103., 1.070277, 0.419815}, + {3153., 1.065384, 0.432769}, + {3203., 1.060906, 0.446161}, + {3250., 1.056535, 0.457806}, + {3303., 1.052034, 0.471422}, + {3353., 1.047990, 0.484218}, + {3400., 1.044547, 0.496719}, + {3450., 1.040667, 0.508891}, + {3500., 1.037145, 0.521523}, + {3550., 1.033783, 0.534090}, + {3600., 1.030574, 0.546590}, + {3650., 1.027510, 0.559020}, + {3699., 1.024834, 0.571722}, + {3801., 1.019072, 0.596102}, + {3851., 1.016527, 0.608221}, + {3902., 1.014244, 0.621136}, + {3952., 1.011729, 0.632447}, + {4002., 0.996153, 0.609518}, + {4052., 0.993720, 0.620805}, + {4102., 0.993908, 0.631520}, + {4152., 0.989179, 0.643262}, + {4202., 0.989283, 0.653999}, + {4252., 0.985039, 0.665536}, + {4302., 0.985067, 0.676288}, + {4352., 0.981271, 0.687599}, + {4402., 0.981228, 0.698349}, + {4452., 0.977843, 0.709425}, + {4502., 0.977736, 0.720159}, + {4552., 0.974728, 0.730993}, + {4602., 0.974562, 0.741698}, + {4652., 0.971899, 0.752284}, + {4702., 0.971681, 0.762949}, + {4752., 0.969335, 0.773285}, + {4802., 0.969069, 0.783899}, + {4827., 0.967570, 0.788836}, + {4852., 0.967011, 0.793982}, + {4877., 0.966465, 0.799108}, + {4902., 0.965933, 0.804214}, + {4927., 0.965414, 0.809229}, + {4952., 0.964908, 0.814366}, + {4977., 0.964415, 0.819412}, + {5002., 0.963934, 0.824438}, + {5027., 0.963465, 0.829444}, + {5052., 0.963008, 0.834429}, + {5077., 0.962563, 0.839395}, + {5102., 0.962129, 0.844339}, + {5127., 0.961706, 0.849263}, + {5152., 0.961294, 0.854166}, + {5177., 0.960893, 0.859049}, + {5202., 0.960501, 0.863911}, + {5252., 0.959749, 0.873572}, + {5302., 0.959313, 0.883815}, + {5352., 0.958361, 0.892644}, + {5402., 0.957903, 0.902793}, + {5452., 0.957116, 0.911379}, + {5502., 0.956639, 0.921431}, + {5552., 0.956002, 0.929779}, + {5602., 0.955509, 0.939728}, + {5652., 0.955008, 0.947842}, + {5702., 0.954502, 0.957685}, + {5752., 0.954124, 0.965569}, + {5802., 0.953608, 0.975303}, + {5852., 0.953342, 0.982963}, + {5902., 0.952818, 0.992584}, + {5952., 0.952652, 1.000025}, + {6002., 0.952122, 1.009532}, + {6052., 0.952047, 1.016759}, + {6102., 0.951514, 1.026149}, + {6152., 0.951520, 1.033168}, + {6202., 0.950985, 1.042439}, + {6252., 0.951064, 1.049256}, + {6302., 0.950530, 1.058406}, + {6352., 0.950674, 1.065027}, + {6402., 0.950143, 1.074055}, + {6452., 0.950345, 1.080484}, + {6502., 0.950201, 1.088097}, + {6552., 0.950070, 1.095633}, + {6602., 0.949952, 1.103094}, + {6652., 0.949846, 1.110479}, + {6702., 0.949752, 1.119138}, + {6752., 0.949668, 1.125027}, + {6802., 0.949596, 1.132190}, + {6902., 0.949033, 1.147691}, + {7002., 0.949402, 1.160129}, + {7152., 0.949348, 1.180429}, + {7301., 0.948896, 1.201432}, + {7451., 0.949434, 1.219076}, + {7601., 0.949099, 1.239061}, + {7751., 0.949729, 1.255559}, + {7901., 0.949498, 1.274460}, + {8151., 0.950361, 1.300912}, + {8301., 0.950253, 1.318464}, + {8451., 0.950966, 1.332651}, + {8601., 0.950941, 1.349261}, + {8801., 0.951772, 1.367421}, + {9001., 0.951969, 1.387639}, + {9201., 0.952784, 1.404422}, + {9401., 0.953081, 1.423213}, + {9901., 0.954537, 1.464134}, + {10501., 0.956321, 1.508623}, + {11001., 0.957747, 1.541281}, + {12001., 0.960440, 1.601019} + }; + + int N_c = sizeof(spec_colorforxcyc) / sizeof(spec_colorforxcyc[0]); //number of color + int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point + typedef struct XYZref { + double Xref; + double Yref; + double Zref; + } XYZref; + XYZref Refxyz[N_c + 1]; + + for (int i = 0; i < N_c; i++) { + Refxyz[i].Xref = 0.f; + Refxyz[i].Yref = 0.f; + Refxyz[i].Zref = 0.f; + } + + const color_match_type &color_match = (wbpar.observer == StandardObserver::TEN_DEGREES) ? cie_colour_match_jd : cie_colour_match_jd2; + + // const color_match_type &color_match = (wbpar.observer == StandardObserver::TEN_DEGREES) ? cie_colour_match_jd : cie_colour_match_jd2; + + if (separated) { + const double tempw = Txyz[repref].Tem; + + if (tempw <= INITIALBLACKBODY) { + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_blackbody(spec_colorforxcyc[i], tempw, TX[i], TY[i], TZ[i], color_match); + } + } else { + double m11, m22, x_DD, y_DD, interm2; + + if (tempw <= 7000) { + x_DD = -4.6070e9 / (tempw * tempw * tempw) + 2.9678e6 / (tempw * tempw) + 0.09911e3 / tempw + 0.244063; + } else { + x_DD = -2.0064e9 / (tempw * tempw * tempw) + 1.9018e6 / (tempw * tempw) + 0.24748e3 / tempw + 0.237040; + } + + y_DD = -3.0 * x_DD * x_DD + 2.87 * x_DD - 0.275; + //calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D + //S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda) + interm2 = (0.0241 + 0.2562 * x_DD - 0.734 * y_DD); + m11 = (-1.3515 - 1.7703 * x_DD + 5.9114 * y_DD) / interm2; + m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; + + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_daylight(spec_colorforxcyc[i], m11, m22, TX[i], TY[i], TZ[i], color_match); + } + } + } else { + for (int tt = 0; tt < N_t; tt++) { + const double tempw = Txyz[tt].Tem; + + if (tempw <= INITIALBLACKBODY) { + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_blackbody(spec_colorforxcyc[i], tempw, Refxyz[i].Xref, Refxyz[i].Yref, Refxyz[i].Zref, color_match); + } + } else { + double x_DD; + + if (tempw <= 7000) { + x_DD = -4.6070e9 / (tempw * tempw * tempw) + 2.9678e6 / (tempw * tempw) + 0.09911e3 / tempw + 0.244063; + } else { + x_DD = -2.0064e9 / (tempw * tempw * tempw) + 1.9018e6 / (tempw * tempw) + 0.24748e3 / tempw + 0.237040; + } + + const double y_DD = -3.0 * x_DD * x_DD + 2.87 * x_DD - 0.275; + //calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D + //S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda) + const double interm2 = (0.0241 + 0.2562 * x_DD - 0.734 * y_DD); + const double m11 = (-1.3515 - 1.7703 * x_DD + 5.9114 * y_DD) / interm2; + const double m22 = (0.03 - 31.4424 * x_DD + 30.0717 * y_DD) / interm2; + + for (int i = 0; i < N_c; i++) { + spectrum_to_color_xyz_daylight(spec_colorforxcyc[i], m11, m22, Refxyz[i].Xref, Refxyz[i].Yref, Refxyz[i].Zref, color_match); + } + } + + for (int i = 0; i < N_c; i++) { + Tx[i][tt] = Refxyz[i].Xref; + Ty[i][tt] = Refxyz[i].Yref; + Tz[i][tt] = Refxyz[i].Zref; + } + } + } +} + } diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index a38e01072..0fe56b7cd 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -21,10 +21,13 @@ #include #include #include +#include "procparams.h" namespace rtengine { +using color_match_type = double [97][3]; + constexpr double MINTEMP = 1500.0; constexpr double MAXTEMP = 60000.0; constexpr double MINGREEN = 0.02; @@ -33,6 +36,10 @@ constexpr double MINEQUAL = 0.8; constexpr double MAXEQUAL = 1.5; constexpr double INITIALBLACKBODY = 4000.0; +enum class StandardObserver { + TWO_DEGREES, + TEN_DEGREES, +}; class ColorTemp { @@ -42,31 +49,36 @@ private: double green; double equal; std::string method; + StandardObserver observer{StandardObserver::TEN_DEGREES}; static void clip (double &temp, double &green); static void clip (double &temp, double &green, double &equal); int XYZtoCorColorTemp(double x0, double y0 , double z0, double &temp) const; - void temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const; + void temp2mul (double temp, double green, double equal, StandardObserver observer, double& rmul, double& gmul, double& bmul) const; const static std::map spectMap; public: + static constexpr StandardObserver DEFAULT_OBSERVER = StandardObserver::TEN_DEGREES; ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {} explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {} - ColorTemp (double t, double g, double e, const std::string &m); - ColorTemp (double mulr, double mulg, double mulb, double e); + ColorTemp (double t, double g, double e, const std::string &m, StandardObserver o); + ColorTemp (double mulr, double mulg, double mulb, double e, StandardObserver observer); + static void tempxy(bool separated, int repref, float **Tx, float **Ty, float **Tz, float **Ta, float **Tb, float **TL, double *TX, double *TY, double *TZ, const procparams::WBParams & wbpar); - void update (const double rmul, const double gmul, const double bmul, const double equal, const double tempBias=0.0) + void update (const double rmul, const double gmul, const double bmul, const double equal, StandardObserver observer, const double tempBias=0.0) { this->equal = equal; - mul2temp (rmul, gmul, bmul, this->equal, temp, green); + this->observer = observer; + mul2temp (rmul, gmul, bmul, this->equal, observer, temp, green); if (tempBias != 0.0 && tempBias >= -1.0 && tempBias <= 1.0) { temp += temp * tempBias; } } - void useDefaults (const double equal) + void useDefaults (const double equal, StandardObserver observer) { temp = 6504; // Values copied from procparams.cc green = 1.0; this->equal = equal; + this->observer = observer; } inline std::string getMethod() const @@ -85,20 +97,28 @@ public: { return equal; } + inline StandardObserver getObserver() const + { + return observer; + } + + ColorTemp convertObserver(StandardObserver observer) const; void getMultipliers (double &mulr, double &mulg, double &mulb) const { - temp2mul (temp, green, equal, mulr, mulg, mulb); + temp2mul (temp, green, equal, observer, mulr, mulg, mulb); } - void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const; - static void temp2mulxyz (double tem, const std::string &method, double &Xxyz, double &Zxyz); + void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, StandardObserver observer, double& temp, double& green) const; + static void temp2mulxyz (double tem, const std::string &method, StandardObserver observer, 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 cieCAT02float(float Xw, float Yw, float Zw, float &CAM02BB00, float &CAM02BB01, float &CAM02BB02, float &CAM02BB10, float &CAM02BB11, float &CAM02BB12, float &CAM02BB20, float &CAM02BB21, float &CAM02BB22, float adap); + static void icieCAT02float(float Xw, float Yw, float Zw, float &iCAM02BB00, float &iCAM02BB01, float &iCAM02BB02, float &iCAM02BB10, float &iCAM02BB11, float &iCAM02BB12, float &iCAM02BB20, float &iCAM02BB21, float &iCAM02BB22, float adap); bool operator== (const ColorTemp& other) const { - return fabs(temp - other.temp) < 1e-10 && fabs(green - other.green) < 1e-10; + return fabs(temp - other.temp) < 1e-10 && fabs(green - other.green) < 1e-10 && observer != other.observer; } bool operator!= (const ColorTemp& other) const { @@ -162,6 +182,125 @@ public: static const double ColorchechGreD1_spect[97]; static const double ColorchechSGBlaN3_6_spect[97];//ColorChecker SG N3 static const double JDC468_GraK14_44_spect[97];//468 K14 + static const double JDC468_BluM5_spect[97]; //468 M5 + static const double JDC468_BluD6_spect[97]; //468 D6 + static const double JDC468_BluF4_spect[97]; //468 F4 + static const double JDC468_RedG21va_spect[97]; //468 G21 modifié + static const double JDC468_RedI9_spect[97]; //468 I9 + static const double JDC468_GreI8_spect[97]; //468 I8 + static const double JDC468_GreQ7_spect[97]; //468 Q7 + static const double ColorGreenM25_spect[97]; + static const double ColorYellowkeltano_spect[97]; + static const double ColorGreenalsi_spect[97]; + static const double ColorRedpetunia_spect[97]; + static const double ColorRedkurttu_spect[97]; + static const double ColorRedlupiini_spect[97]; + static const double ColorRedhevosminttu_spect[97]; + static const double ColorRedneilikka_spect[97]; + static const double ColorRedpelagornia_spect[97]; + static const double ColorRedtalvio_spect[97]; + static const double ColorBrownpoimulehti_spect[97]; + static const double ColorOrangetuntematon_spect[97]; + static const double ColorOrangetlehmus_spect[97]; + static const double ColorOrangvaahtera_spect[97]; + static const double ColorBrownlehmus_spect[97]; + static const double ColorBrownuotiosammal_spect[97]; + static const double ColorBlacksoil_spect[97]; + static const double ColorGraynahjajaekaelae_spect[97]; + static const double ColorGreennuotisammal_spect[97]; + static const double ColorGreenleskenlehti_spect[97]; + static const double ColorGreenlinnunkaali_spect[97]; + static const double ColorGreenpelto_spect[97]; + static const double ColorGreenrodvoikukka[97]; + static const double ColorGreenlehmus[97]; + static const double ColorGreenlinden[97]; + static const double ColorYellowlehmus[97]; + static const double ColorYellowsuikeroalpi[97]; + static const double ColorYellowpensashanhikki1[97]; + static const double ColorYellowpensashanhikki2[97]; + static const double ColorBluehiidenvirna[97]; + static const double ColorBluekurkkuyrtti[97]; + static const double ColorPinksiankaersaemoe[97]; + static const double ColorVioletharakankello[97]; + static const double ColorVioletalsikeapila[97]; + static const double ColorVioletakilleija[97]; + static const double ColorOrangekehaekukka[97]; + static const double ColorRedpihlaja[97]; + static const double ColorVioletpetunia[97]; + static const double ColorVioletorvokki[97]; + static const double ColorBluesinisievikki[97]; + static const double ColorBlueiisoppi[97]; + static const double ColorBluelobelia[97]; + static const double ColorWhiteojaka[97]; + static const double ColorWhitepetunia[97]; + static const double ColorWhitepelargonia[97]; + static const double ColorWhitepaeivaen[97]; + static const double JDC468_B14_75Redspect[97]; + static const double Colorblue_spect[97]; + static const double ColorGreenkoriste[97]; + static const double ColorGreenpoimulehti[97]; + static const double ColorGreenhopeapaju[97]; + static const double ColorReduuden[97]; + static const double ColorRedpajuan[97]; + static const double ColorRedjaloan[97]; + static const double ColorBlueukon[97]; + static const double ColorBlueorvokki[97]; + static const double ColorBluemalvikki[97]; + static const double ColorBlackmaito[97]; + static const double ColorOrangpihlaja[97]; + static const double ColorBlackpihlaja[97]; + static const double ColorViolA1_spect[97]; + static const double ColorViolA4_spect[97]; + static const double ColorViolA6_spect[97]; + static const double ColorBlueSkyK3_spect[97]; + static const double ColorBlueSkyK9_spect[97]; + static const double ColorBlueSkyC4_spect[97]; + static const double ColorBlueSkyC14_spect[97]; + static const double ColorBlueSkyE4_spect[97]; + static const double ColorBlueSkyM1_spect[97]; + static const double ColorBlueSky2B1_spect[97]; + static const double ColorBlueSkyT7_spect[97]; + static const double ColorBlueSkyU19_spect[97]; + static const double ColorBlueSkyU2_spect[97]; + static const double ColorBlueSkyT17_spect[97]; + static const double ColorBlackM8_spect[97]; + static const double ColorBlackM12_spect[97]; + static const double ColorBlackM13_spect[97]; + static const double ColorWhite2B12_spect[97]; + static const double ColorWhite2B14_spect[97]; + static const double JDC468_Blackred97_spect[97]; + static const double JDC468_Blackredbl443_spect[97]; + static const double JDC468_Blackbl27_spect[97]; + static const double JDC468_Blackbl28_spect[97]; + static const double JDC468_Blackgr214_spect[97]; + static const double JDC468_Blackbl436_spect[97]; + static const double JDC468_Whitebl455_spect[97]; + static const double JDC468_Blackvio101_spect[97]; + static const double JDC468_Whitebl92_spect[97]; + static const double JDC468_Greyredbl94_spect[97]; + static const double JDC468_Blue32_spect[97]; + static const double JDC468_Blue236_spect[97]; + static const double JDC468_Gre300_spect[97]; + static const double JDC468_Blue340_spect[97]; + static const double JDC468_Gree110_spect[97]; + static const double JDC468_Gree457_spect[97]; + static const double JDC468_Yel241_spect[97]; + static const double JDC468_Ora321_spect[97]; + static const double JDC468_Yellow353_spect[97]; + static const double JDC468_Mag465_spect[97]; + static const double JDC468_Mag333_spect[97]; + static const double JDC468_Mag203_spect[97]; + + + static const double JDC468_OraO18_spect[97]; //468 O18 + static const double JDC468_OraD17_spect[97]; //468 D17 + static const double Fictif_61greyspect[97];//468 K15 + static const double JDC468_K15_87greyspect[97]; + static const double JDC468_YelN10_spect[97]; //468 N10 + static const double JDC468_GreN7_spect[97]; //468 N7 + static const double JDC468_GreA10_spect[97]; //468 A10 + static const double JDC468_GreK7_spect[97]; //468 K7 + static const double JDC468_PurE24_spect[97]; //468 E24 static const double JDC468_BluH10_spect[97];//468 H10 static const double ColabSkin35_15_17_spect[97];//Skin L 35 static const double ColabSkin57_22_18_spect[97];//Skin L 57 @@ -195,14 +334,70 @@ public: static const double ColabSkin70_7_32_spect[97];//Skin L 77 static const double ColabSky60_0_m31_spect[97];//Sky L=60 static const double ColabSky42_0_m24_spect[97];//Sky L=42 + static const double J570_BlueB6_spect[97];//blue Cyan + static const double J570_BlueB15_spect[97];//blue Cyan + static const double J570_BlueC2_spect[97];//blue Cyan + static const double J570_BlueC14_spect[97];//blue Cyan + static const double J570_BlueC16_spect[97];//blue Cyan + static const double J570_BlueF1_spect[97];//blue Cyan + static const double J570_BlueF2_spect[97];//blue Cyan + static const double J570_BlueF10_spect[97];//blue Cyan + static const double J570_BlueF13_spect[97];//blue Cyan + static const double J570_BlueG9_spect[97];//blue Cyan + static const double J570_BlueG19_spect[97];//blue Cyan + static const double J570_BlueI5_spect[97];//blue Cyan + static const double J570_BlueH15_spect[97];//blue Cyan + static const double J570_BlueI3_spect[97];//blue Cyan + static const double J570_BlueI19_spect[97];//blue Cyan + static const double J570_BlueJ4_spect[97];//blue Cyan + static const double J570_BlueJ6_spect[97];//blue Cyan + static const double J570_BlueJ11_spect[97];//blue Cyan + static const double J570_BlueJ13_spect[97];//blue Cyan + static const double J570_BlueK5_spect[97];//blue Cyan + static const double J570_BlueN1_spect[97];//blue Cyan + static const double J570_BlueN4_spect[97];//blue Cyan + static const double J570_BlueO19_spect[97];//blue Cyan + static const double J570_BlueU8_spect[97];//blue Cyan + static const double J570_NeuN8_spect[97];//neutral + static const double J570_NeuN9_spect[97];//neutral + static const double J570_NeuO8_spect[97];//neutral + static const double J570_NeuO11_spect[97];//neutral + static const double J570_NeuD5_spect[97];//neutral + static const double J570_NeuE11_spect[97];//neutral + static const double J570_NeuK16_spect[97];//neutral + static const double J570_NeuM3_spect[97];//neutral + static const double J570_NeuN18_spect[97];//neutral + static const double J570_NeuQ1_spect[97];//neutral + static const double J570_NeuS7_spect[97];//neutral + static const double J570_NeuV10_spect[97];//neutral + static const double J570_NeuW18_spect[97];//neutral + static const double J570_NeuZ14_spect[97];//neutral + static const double J570_NeuC18_spect[97];//neutral + static const double J570_NeuD17_spect[97];//neutral + static const double J570_NeuJ11_spect[97];//neutral + static const double J570_NeuL4_spect[97];//neutral + static const double Colorlab_n72_n2_spect[97]; + static const double Colorlab_10_n70_spect[97]; + static const double Colorlab_n33_n70_spect[97]; + static const double Colorlab_n8_n74_spect[97]; + static const double Colorlab_19_n69_spect[97]; + static const double Colorlab_n80_10_spect[97]; + static const double Colorlab_n80_26_spect[97]; + static const double Colorlab_n80_5_9_5_9spect[97]; +// static const double Colorlab_n57_5_6_9spect[97]; + + /* + static const double JDC468_greyc14_66_spect[97]; + static const double JDC468_greym13_325_spect[97]; + static const double JDC468_greyf26_156_spect[97]; + */ + static void spectrum_to_xyz_daylight (double _m1, double _m2, double &x, double &y, double &z, const color_match_type &color_match); + static void spectrum_to_xyz_blackbody (double _temp, double &x, double &y, double &z, const color_match_type &color_match); + static void spectrum_to_xyz_preset (const double* spec_intens, double &x, double &y, double &z, const color_match_type &color_match); - static void spectrum_to_xyz_daylight (double _m1, double _m2, double &x, double &y, double &z); - static void spectrum_to_xyz_blackbody (double _temp, double &x, double &y, double &z); - static void spectrum_to_xyz_preset (const double* spec_intens, double &x, double &y, double &z); - - static void spectrum_to_color_xyz_daylight (const double* spec_color, double _m1, double _m2, double &xx, double &yy, double &zz); - static void spectrum_to_color_xyz_blackbody (const double* spec_color, double _temp, double &xx, double &yy, double &zz); - static void spectrum_to_color_xyz_preset (const double* spec_color, const double* spec_intens, double &xx, double &yy, double &zz); + static void spectrum_to_color_xyz_daylight (const double* spec_color, double _m1, double _m2, double &xx, double &yy, double &zz, const color_match_type &color_match); + static void spectrum_to_color_xyz_blackbody (const double* spec_color, double _temp, double &xx, double &yy, double &zz, const color_match_type &color_match); + static void spectrum_to_color_xyz_preset (const double* spec_color, const double* spec_intens, double &xx, double &yy, double &zz, const color_match_type &color_match); }; } diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h index c127a7adf..592bd2f37 100644 --- a/rtengine/cplx_wavelet_dec.h +++ b/rtengine/cplx_wavelet_dec.h @@ -33,37 +33,38 @@ class wavelet_decomposition : public NonCopyable { public: - - typedef float internal_type; - float *coeff0; - bool memoryAllocationFailed; - -private: - - static const int maxlevels = 10;//should be greater than any conceivable order of decimation - - int lvltot, subsamp; - int m_w, m_h;//dimensions - - int wavfilt_len, wavfilt_offset; - float *wavfilt_anal; - float *wavfilt_synth; - - - wavelet_level * wavelet_decomp[maxlevels]; - -public: + using internal_type = float; template wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop = 1, int numThreads = 1, int Daub4Len = 6); ~wavelet_decomposition(); - internal_type ** level_coeffs(int level) const + bool memory_allocation_failed() const + { + return memoryAllocationFailed; + } + + const internal_type* const* level_coeffs(int level) const { return wavelet_decomp[level]->subbands(); } + internal_type* const* level_coeffs(int level) + { + return wavelet_decomp[level]->subbands(); + } + + const internal_type* get_coeff0() const + { + return coeff0; + } + + internal_type* get_coeff0() + { + return coeff0; + } + int level_W(int level) const { return wavelet_decomp[level]->width(); @@ -88,13 +89,47 @@ public: { return subsamp; } + template void reconstruct(E * dst, const float blend = 1.f); + +private: + static const int maxlevels = 10; // should be greater than any conceivable order of decimation + + int lvltot; + int subsamp; + // Dimensions + int m_w; + int m_h; + + int wavfilt_len; + int wavfilt_offset; + internal_type* wavfilt_anal; + internal_type* wavfilt_synth; + + internal_type* coeff0; + bool memoryAllocationFailed; + + wavelet_level* wavelet_decomp[maxlevels]; }; template -wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop, int numThreads, int Daub4Len) - : coeff0(nullptr), memoryAllocationFailed(false), lvltot(0), subsamp(subsampling), m_w(width), m_h(height) +wavelet_decomposition::wavelet_decomposition( + E * src, + int width, + int height, + int maxlvl, + int subsampling, + int skipcrop, + int numThreads, + int Daub4Len +) : + lvltot(0), + subsamp(subsampling), + m_w(width), + m_h(height), + coeff0(nullptr), + memoryAllocationFailed(false) { //initialize wavelet filters @@ -135,6 +170,14 @@ wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int //n=0 lopass, n=1 hipass } } +/* } else if(wavfilt_len == 22) { + for (int n = 0; n < 2; n++) { + for (int i = 0; i < wavfilt_len; i++) { + wavfilt_anal[wavfilt_len * (n) + i] = Daub4_anal22[n][i]; + wavfilt_synth[wavfilt_len * (n) + i] = Daub4_anal22[n][wavfilt_len - 1 - i]; + //n=0 lopass, n=1 hipass + } + } */ } else if(wavfilt_len == 4) { for (int n = 0; n < 2; n++) { for (int i = 0; i < wavfilt_len; i++) { @@ -144,7 +187,7 @@ wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int } } } - +//printf("OK cplx\n"); // after coefficient rotation, data structure is: // wavelet_decomp[scale][channel={lo,hi1,hi2,hi3}][pixel_array] diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h index 6287fc03b..3386be8d0 100644 --- a/rtengine/cplx_wavelet_filter_coeffs.h +++ b/rtengine/cplx_wavelet_filter_coeffs.h @@ -49,6 +49,13 @@ const float Daub4_anal16[2][16] ALIGNED16 = {//Daub 14 { -0.0002501134f, -0.0012739524f, -0.0003037575f, 0.008874895f, 0.01171997f , -0.026891225f, -0.057001725f, 0.05042335f, 0.158417505f, -0.10175691f, -0.33218624f, 0.515574245f, -0.28039564f, 0.055049715f, 0.f, 0.f} }; -// if necessary ?? we can add D20 !! +const float Daub4_anal22[2][22] ALIGNED16 = {//Daub 20 + {0.f, 0.f, 0.01885858f, 0.13306109f, 0.37278535f, 0.48681406f, 0.19881887f, -0.1766681f, -0.13855494f, 0.09006372f, 0.0658015f, -0.05048328f, -0.02082962f, + 0.0234849f, 0.002550218f, -0.0075895f, 0.0009866627f, 0.001408843f, -0.000484973f, -0.0000823545f, 0.0000661271f, -0.00000939f}, + {0.00000939f, -0.0000661271f, 0.0000823545f, 0.000484973f, -0.001408843f, -0.0009866627f, 0.0075895f, -0.002550218f, -0.0234849f, + 0.02082962f, 0.05048328f, -0.0658015f, -0.09006372f, 0.13855494f, 0.1766681f, -0.19881887f, -0.48681406f, -0.37278535f, -0.13306109f, -0.01885858f, 0.f, 0.f} +}; + +// if necessary ?? we can add D20 !! } diff --git a/rtengine/curves.cc b/rtengine/curves.cc index b2105a091..81d5b175b 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -21,8 +21,7 @@ #include #include #include -#include -#include +#include #include "rt_math.h" @@ -33,13 +32,40 @@ #include "opthelper.h" #include "ciecam02.h" #include "color.h" +#include "iccmatrices.h" #include "iccstore.h" using namespace std; +namespace { +void fillCurveArray(const rtengine::DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed) +{ + if (needed) { + for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1) { + // change to [0,1] range + // apply custom/parametric/NURBS curve, if any + outCurve[i] = diagCurve->getVal(i / 65535.f); + } + + // if skip > 1, let apply linear interpolation in the skipped points of the curve + if (skip > 1) { + const float skipmul = 1.f / skip; + + for (int i = 0; i <= 0x10000 - skip; i += skip) { + for (int j = 1; j < skip; j++) { + outCurve[i + j] = (outCurve[i] * (skip - j) + outCurve[i + skip] * j) * skipmul; + } + } + } + + outCurve *= 65535.f; + } else { + outCurve.makeIdentity(); + } +} +} namespace rtengine { - bool sanitizeCurve(std::vector& curve) { // A curve is valid under one of the following conditions: @@ -47,19 +73,19 @@ bool sanitizeCurve(std::vector& curve) // 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); + curve.push_back(DCT_Linear); return true; - } else if(curve.size() == 1 && curve[0] != DCT_Linear) { + } 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) { + } else if ((curve.size() % 2 == 0 || curve.size() < 5) && curve[0] != DCT_Parametric) { curve.clear(); - curve.push_back (DCT_Linear); + curve.push_back(DCT_Linear); return true; - } else if(curve[0] == DCT_Parametric) { + } else if (curve[0] == DCT_Parametric) { if (curve.size() < 8) { curve.clear(); - curve.push_back (DCT_Linear); + curve.push_back(DCT_Linear); return true; } else { // curve[1] to curve[3] must be ordered ascending and distinct @@ -73,12 +99,13 @@ bool sanitizeCurve(std::vector& curve) } } } + 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) {} +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 () +void Curve::AddPolygons() { if (firstPointIncluded) { poly_x.push_back(x1); @@ -93,8 +120,8 @@ void Curve::AddPolygons () double tr2t = tr * 2 * t; // adding a point to the polyline - poly_x.push_back( tr2 * x1 + tr2t * x2 + t2 * x3); - poly_y.push_back( tr2 * y1 + tr2t * y2 + t2 * y3); + poly_x.push_back(tr2 * x1 + tr2t * x2 + t2 * x3); + poly_y.push_back(tr2 * y1 + tr2t * y2 + t2 * y3); } // adding the last point of the sub-curve @@ -102,11 +129,11 @@ void Curve::AddPolygons () poly_y.push_back(y3); } -void Curve::fillDyByDx () +void Curve::fillDyByDx() { dyByDx.resize(poly_x.size() - 1); - for(unsigned int i = 0; i < poly_x.size() - 1; i++) { + for (unsigned int i = 0; i < poly_x.size() - 1; i++) { double dx = poly_x[i + 1] - poly_x[i]; double dy = poly_y[i + 1] - poly_y[i]; dyByDx[i] = dy / dx; @@ -123,7 +150,7 @@ void Curve::fillHash() double milestone = 0.; for (unsigned short i = 0; i < (hashSize + 1);) { - while(poly_x[polyIter] <= milestone) { + while (poly_x[polyIter] <= milestone) { ++polyIter; } @@ -136,7 +163,7 @@ void Curve::fillHash() polyIter = 0; for (unsigned int i = 0; i < hashSize + 1u;) { - while(poly_x[polyIter] < (milestone + increment)) { + while (poly_x[polyIter] < (milestone + increment)) { ++polyIter; } @@ -173,7 +200,7 @@ void Curve::fillHash() * This method return the number of control points of a curve. Not suitable for parametric curves. * @return number of control points of the curve. 0 will be sent back for Parametric curves */ -int Curve::getSize () const +int Curve::getSize() const { return N; } @@ -200,37 +227,7 @@ void Curve::getControlPoint(int cpNum, double &x, double &y) const const double CurveFactory::sRGBGamma = 2.2; const double CurveFactory::sRGBGammaCurve = 2.4; -void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed) -{ - if (needed) { - - for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1 ) { - // change to [0,1] range - float val = (float)i / 65535.f; - // apply custom/parametric/NURBS curve, if any - val = diagCurve->getVal (val); - // store result in a temporary array - outCurve[i] = val; - } - - // if skip>1, let apply linear interpolation in the skipped points of the curve - if (skip > 1) { - float skipmul = 1.f / (float) skip; - - for (int i = 0; i <= 0x10000 - skip; i += skip) { - for(int j = 1; j < skip; j++) { - outCurve[i + j] = ( outCurve[i] * (skip - j) + outCurve[i + skip] * j ) * skipmul; - } - } - } - - outCurve *= 65535.f; - } else { - outCurve.makeIdentity(); - } -} - -void CurveFactory::curveLightBrightColor (const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3, +void CurveFactory::curveLightBrightColor(const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3, const LUTu & histogram, LUTu & outBeforeCCurveHistogram,//for Luminance const LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma ColorAppearance & customColCurve1, ColorAppearance & customColCurve2, ColorAppearance & customColCurve3, int skip) @@ -289,9 +286,9 @@ void CurveFactory::curveLightBrightColor (const std::vector& curvePoints } } -void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std::vector& curvePointsbw2, - const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance - ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip) +void CurveFactory::curveBW(const std::vector& curvePointsbw, const std::vector& curvePointsbw2, + const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance + ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip) { const float gamma_ = Color::sRGBGammaCurve; @@ -319,7 +316,7 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std if (!curvePointsbw.empty() && curvePointsbw[0] > DCT_Linear && curvePointsbw[0] < DCT_Unchanged) { DiagonalCurve tcurve(curvePointsbw, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCCurveHistogrambw ) { + if (outBeforeCCurveHistogrambw) { histNeeded = true; } @@ -335,32 +332,15 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std } } -// add curve Lab : C=f(L) -void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip) -{ - clcutili = false; - std::unique_ptr dCurve; - - if (!clcurvePoints.empty() && clcurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(clcurvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (dCurve && !dCurve->isIdentity()) { - clcutili = true; - } - } - - fillCurveArray(dCurve.get(), clCurve, skip, clcutili); -} - -void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) +bool CurveFactory::diagonalCurve2Lut(const std::vector& curvePoints, LUTf & curve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) { bool needed = false; std::unique_ptr dCurve; outBeforeCurveHistogram.clear(); bool histNeeded = false; - if (!mapcurvePoints.empty() && mapcurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(mapcurvePoints, CURVES_MIN_POLY_POINTS / skip)); + if (!curvePoints.empty() && curvePoints[0] != 0) { + dCurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeCurveHistogram) { histNeeded = true; @@ -368,7 +348,6 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m if (dCurve && !dCurve->isIdentity()) { needed = true; - mapcontlutili = true; } } @@ -376,77 +355,32 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m histogram.compressTo(outBeforeCurveHistogram, 32768); } - fillCurveArray(dCurve.get(), mapcurve, skip, needed); + fillCurveArray(dCurve.get(), curve, skip, needed); + return needed; } -void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) -{ - bool needed = false; - std::unique_ptr dCurve; - outBeforeCurveHistogram.clear(); - bool histNeeded = false; - - if (!dehaclcurvePoints.empty() && dehaclcurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (outBeforeCurveHistogram) { - histNeeded = true; - } - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - dehacontlutili = true; - } - } - - if (histNeeded) { - histogram.compressTo(outBeforeCurveHistogram, 32768); - } - - fillCurveArray(dCurve.get(), dehaclCurve, skip, needed); -} - -// add curve Lab wavelet : Cont=f(L) -void CurveFactory::curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip) -{ - bool needed = false; - std::unique_ptr dCurve; - - if (!wavclcurvePoints.empty() && wavclcurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip)); - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - wavcontlutili = true; - } - } - - fillCurveArray(dCurve.get(), wavclCurve, skip, needed); -} - -// add curve Colortoning : C=f(L) and CLf(L) -void CurveFactory::curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip) +bool CurveFactory::diagonalCurve2Lut(const std::vector& curvePoints, LUTf& curve, int skip) { bool needed = false; std::unique_ptr dCurve; if (!curvePoints.empty() && curvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { needed = true; } } - fillCurveArray(dCurve.get(), ToningCurve, skip, needed); + fillCurveArray(dCurve.get(), curve, skip, needed); + return needed; + } - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutili, bool & cclutili, - const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, - const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, - int skip) +void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & cclutili, + const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, + const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, + int skip) { autili = butili = ccutili = cclutili = false; @@ -454,7 +388,7 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil // create a curve if needed if (!acurvePoints.empty() && acurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { autili = true; @@ -463,12 +397,12 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil fillCurveArray(dCurve.get(), aoutCurve, skip, autili); - dCurve = nullptr; + dCurve.reset(); //----------------------------------------------------- if (!bcurvePoints.empty() && bcurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { butili = true; @@ -477,12 +411,12 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil fillCurveArray(dCurve.get(), boutCurve, skip, butili); - dCurve = nullptr; + dCurve.reset(); //----------------------------------------------- if (!cccurvePoints.empty() && cccurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { ccutili = true; @@ -491,12 +425,12 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil fillCurveArray(dCurve.get(), satCurve, skip, ccutili); - dCurve = nullptr; + dCurve.reset(); //---------------------------- if (!lccurvePoints.empty() && lccurvePoints[0] != 0) { - dCurve = std::unique_ptr(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip)); + dCurve.reset(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { cclutili = true; @@ -522,20 +456,19 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou // the curve shapes are defined in sRGB gamma, but the output curves will operate on linear floating point data, // hence we do both forward and inverse gamma conversions here. const float gamma_ = Color::sRGBGammaCurve; - const float start = expf(gamma_ * logf( -0.055 / ((1.0 / gamma_ - 1.0) * 1.055 ))); - const float slope = 1.055 * powf (start, 1.0 / gamma_ - 1) - 0.055 / start; + const float start = expf(gamma_ * logf(-0.055 / ((1.0 / gamma_ - 1.0) * 1.055))); + const float slope = 1.055 * powf(start, 1.0 / gamma_ - 1) - 0.055 / start; const float mul = 1.055; const float add = 0.055; + // a: slope of the curve, black: starting point at the x axis - const float a = powf (2.0, ecomp); + const float a = powf(2.0, ecomp); // clear array that stores histogram valid before applying the custom curve outBeforeCCurveHistogram.clear(); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% std::unique_ptr brightcurve; @@ -548,14 +481,14 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou brightcurvePoints[1] = 0.; //black point. Value in [0 ; 1] range brightcurvePoints[2] = 0.; //black point. Value in [0 ; 1] range - if(br > 0) { + if (br > 0) { brightcurvePoints[3] = 0.1; //toe point brightcurvePoints[4] = 0.1 + br / 150.0; //value at toe point brightcurvePoints[5] = 0.7; //shoulder point - brightcurvePoints[6] = min(1.0, 0.7 + br / 300.0); //value at shoulder point + brightcurvePoints[6] = min(1.0, 0.7 + br / 300.0); //value at shoulder point } else { - brightcurvePoints[3] = max(0.0, 0.1 - br / 150.0); //toe point + brightcurvePoints[3] = max(0.0, 0.1 - br / 150.0); //toe point brightcurvePoints[4] = 0.1; //value at toe point brightcurvePoints[5] = 0.7 - br / 300.0; //shoulder point @@ -565,12 +498,10 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou brightcurvePoints[7] = 1.; // white point brightcurvePoints[8] = 1.; // value at white point - brightcurve = std::unique_ptr(new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip)); + brightcurve.reset(new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip)); } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details + hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details float exp_scale = a; float scale = 65536.0; float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0; @@ -586,11 +517,11 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou #ifdef __SSE2__ int i = shoulder + 1; - if(i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference + if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference // change to [0,1] range float val = (float)i - shoulder; float R = val * comp / (scalemshoulder); - hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision i++; } @@ -615,7 +546,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou for (int i = shoulder + 1; i < 0x10000; i++) { // change to [0,1] range - hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision R += increment; } @@ -627,9 +558,8 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou // curve without contrast LUTf dcurve(0x10000); - //%%%%%%%%%%%%%%%%%%%%%%%%%% // change to [0,1] range - shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value. + shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value. if (black == 0.0) { shCurve.makeConstant(1.f); } else { @@ -667,11 +597,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou dcurve[i] = val; } - brightcurve = nullptr; - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + brightcurve.reset(); // check if contrast curve is needed if (contr > 0.00001 || contr < -0.00001) { @@ -688,7 +614,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou avg /= sum; - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% std::vector contrastcurvePoints(9); contrastcurvePoints[0] = DCT_NURBS; @@ -706,15 +631,12 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou const DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // apply contrast enhancement for (int i = 0; i <= 0xffff; i++) { - dcurve[i] = contrastcurve.getVal (dcurve[i]); + dcurve[i] = contrastcurve.getVal(dcurve[i]); } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // create second curve if needed bool histNeeded = false; customToneCurve2.Reset(); @@ -726,15 +648,11 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou customToneCurve2.Set(tcurve, gamma_); } - if (outBeforeCCurveHistogram ) { + if (outBeforeCCurveHistogram) { histNeeded = true; } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // create first curve if needed customToneCurve1.Reset(); @@ -750,8 +668,6 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - #ifdef __SSE2__ vfloat gamma_v = F2V(gamma_); vfloat startv = F2V(start); @@ -762,7 +678,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou for (int i = 0; i <= 0xffff; i += 4) { vfloat valv = LVFU(dcurve[i]); - valv = igamma (valv, gamma_v, startv, slopev, mulv, addv); + valv = igamma(valv, gamma_v, startv, slopev, mulv, addv); STVFU(outCurve[i], c65535v * valv); } @@ -770,7 +686,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou for (int i = 0; i <= 0xffff; i++) { float val = dcurve[i]; - val = igamma (val, gamma_, start, slope, mul, add); + val = igamma(val, gamma_, start, slope, mul, add); outCurve[i] = (65535.f * val); } @@ -788,55 +704,116 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, - const LUTu & histogram, LUTf & outCurve, - LUTu & outBeforeCCurveHistogram, int skip, bool & utili) +void CurveFactory::Curvelocalhl(double ecomp, double hlcompr, double hlcomprthresh, LUTf & hlCurve) { - utili = false; - // clear array that stores histogram valid before applying the custom curve - if (outBeforeCCurveHistogram) { - outBeforeCCurveHistogram.clear(); - } + // a: slope of the curve + const float a = powf(2.0f, ecomp); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details + float exp_scale = a; + float maxran = 65536.f; + float scale = maxran; + float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0; + float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1; + + if (comp <= 0.0f) { + hlCurve.makeConstant(exp_scale); + } else { + hlCurve.makeConstant(exp_scale, shoulder + 1); + + float scalemshoulder = scale - shoulder; + +#ifdef __SSE2__ + int i = shoulder + 1; + + if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference + // change to [0,1] range + float val = (float)i - shoulder; + float R = val * comp / (scalemshoulder); + hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + i++; + } + + vdouble onev = _mm_set1_pd(1.0); + vdouble Rv = _mm_set_pd((i + 1 - shoulder) * (double)comp / scalemshoulder, (i - shoulder) * (double)comp / scalemshoulder); + vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder); + vdouble exp_scalev = _mm_set1_pd(exp_scale); + + // for (; i < 0x10000; i += 2) { + for (; i < maxran; i += 2) { + // change to [0,1] range + vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv; + vfloat resultfv = _mm_cvtpd_ps(resultv); + _mm_store_ss(&hlCurve[i], resultfv); + resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1, 1, 1, 1)); + _mm_store_ss(&hlCurve[i + 1], resultfv); + Rv += incrementv; + } + +#else + float R = comp / scalemshoulder; + float increment = R; + + // for (int i = shoulder + 1; i < 0x10000; i++) { + for (int i = shoulder + 1; i < maxran; i++) { + // change to [0,1] range + hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + R += increment; + } + +#endif + + } +} + +void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, double hlcomprthresh, + double shcompr, double br, double cont, double lumare, + LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTf & lightCurveloc, float avg, + int skip) +{ + + const float gamma_ = 2.22; //BT 709 + const float start = expf(gamma_ * logf(-0.0954f / ((1.0f / gamma_ - 1.0f) * 1.0954f))); + const float slope = 1.0954f * powf(start, 1.0f / gamma_ - 1.f) - 0.0954f / start; + const float mul = 1.0954f; + const float add = 0.0954f; + float maxran = 65536.f; //65536 // check if brightness curve is needed if (br > 0.00001 || br < -0.00001) { - utili = true; - + // utili = true; + if(br > 0) { + br /= 4.f;//to avoid artifacts in some cases + } std::vector brightcurvePoints; brightcurvePoints.resize(9); - brightcurvePoints.at(0) = double(DCT_NURBS); + 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 + 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(3) = 0.2; // toe point + brightcurvePoints.at(4) = 0.2 + br / 250.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 + brightcurvePoints.at(5) = 0.6; // shoulder point + brightcurvePoints.at(6) = min(1.0, 0.6 + br / 200.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(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(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 + brightcurvePoints.at(7) = 1.; // white point + brightcurvePoints.at(8) = 1.; // value at white point DiagonalCurve brightcurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Applying brightness curve for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow @@ -845,7 +822,211 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector 0.00001 || cont < -0.00001) { + + + int k = avg * 32768; + avg = lightCurveloc[k]; + 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 - cont / 250.0); // toe point + contrastcurvePoints.at(4) = avg - avg * (0.6 + cont / 250.0); // value at toe point + + contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - cont / 250.0); // shoulder point + contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + cont / 250.0); // value at shoulder point + + contrastcurvePoints.at(7) = 1.; // white point + contrastcurvePoints.at(8) = 1.; // value at white point + + DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); + + // apply contrast enhancement + for (int i = 0; i < 32768; i++) { + lightCurveloc[i] = contrastcurve.getVal(lightCurveloc[i]); + } + + } + + lightCurveloc *= 32767.f; + + for (int i = 32768; i < 32770; i++) { // set last two elements of lut to 32768 and 32769 to allow linear interpolation + lightCurveloc[i] = (float)i; + } + + // a: slope of the curve, black: starting point at the x axis + const float a = powf(2.0f, ecomp); + + // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery + hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details + float exp_scale = a; + float scale = maxran; + float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0; + float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1; + + if (comp <= 0.0f) { + hlCurve.makeConstant(exp_scale); + } else { + hlCurve.makeConstant(exp_scale, shoulder + 1); + + float scalemshoulder = scale - shoulder; + +#ifdef __SSE2__ + int i = shoulder + 1; + + if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference + // change to [0,1] range + float val = (float)i - shoulder; + float R = val * comp / (scalemshoulder); + hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + i++; + } + + vdouble onev = _mm_set1_pd(1.0); + vdouble Rv = _mm_set_pd((i + 1 - shoulder) * (double)comp / scalemshoulder, (i - shoulder) * (double)comp / scalemshoulder); + vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder); + vdouble exp_scalev = _mm_set1_pd(exp_scale); + + // for (; i < 0x10000; i += 2) { + for (; i < maxran; i += 2) { + // change to [0,1] range + vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv; + vfloat resultfv = _mm_cvtpd_ps(resultv); + _mm_store_ss(&hlCurve[i], resultfv); + resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1, 1, 1, 1)); + _mm_store_ss(&hlCurve[i + 1], resultfv); + Rv += incrementv; + } + +#else + float R = comp / scalemshoulder; + float increment = R; + + // for (int i = shoulder + 1; i < 0x10000; i++) { + for (int i = shoulder + 1; i < maxran; i++) { + // change to [0,1] range + hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + R += increment; + } + +#endif + + } + + // curve without contrast + LUTf dcurve(maxran); + + // change to [0,1] range + shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value. + if (black == 0.0) { + shCurve.makeConstant(1.f); + } else { + const float val = 1.f / (maxran - 1.f); + shCurve[0] = simplebasecurve(val, black, 0.015 * shcompr) / val; + } + + // gamma correction + float val = Color::gammatab_bt709[0] / maxran; + // store result in a temporary array + dcurve[0] = LIM01(val); + + for (int i = 1; i < maxran; i++) { + if (black != 0.0) { + const float bval = i / 65535.f; + shCurve[i] = simplebasecurve(bval, black, 0.015 * shcompr) / bval; + } + + // gamma correction + dcurve[i] = Color::gammatab_bt709[i] / maxran; + } + +#ifdef __SSE2__ + vfloat gamma_v = F2V(gamma_); + vfloat startv = F2V(start); + vfloat slopev = F2V(slope); + vfloat mulv = F2V(mul); + vfloat addv = F2V(add); + // vfloat c65535v = F2V (65535.f); + vfloat c65535v = F2V(maxran - 1.f); + + for (int i = 0; i <= (maxran - 1.f); i += 4) { + vfloat valv = LVFU(dcurve[i]); + valv = igamma(valv, gamma_v, startv, slopev, mulv, addv); + STVFU(outCurve[i], c65535v * valv); + } +#else + for (int i = 0; i <= (maxran - 1.f); i++) { + outCurve[i] = (maxran - 1.f) * igamma(dcurve[i], gamma_, start, slope, mul, add); + } +#endif +} + +void CurveFactory::complexLCurve(double br, double contr, const std::vector& curvePoints, + const LUTu & histogram, LUTf & outCurve, + LUTu & outBeforeCCurveHistogram, int skip, bool & utili) +{ + + utili = false; + + // clear array that stores histogram valid before applying the custom curve + if (outBeforeCCurveHistogram) { + outBeforeCCurveHistogram.clear(); + } + + // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery + + // check if brightness curve is needed + if (br > 0.00001 || br < -0.00001) { + utili = true; + + 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(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip); + + // Applying brightness curve + for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow + + // change to [0,1] range + float val = (float)i / 32767.0; + + // apply brightness curve + val = brightcurve.getVal(val); // store result in a temporary array outCurve[i] = LIM01(val); @@ -855,10 +1036,6 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector 0.00001 || contr < -0.00001) { utili = true; @@ -874,69 +1051,57 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector contrastcurvePoints; - if(sum) { + if (sum) { avg /= sum; - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% contrastcurvePoints.resize(9); - contrastcurvePoints.at(0) = double(DCT_NURBS); + 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(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(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(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 - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + contrastcurvePoints.at(7) = 1.; // white point + contrastcurvePoints.at(8) = 1.; // value at white point } else { - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // sum has an invalid value (next to 0, producing a division by zero, so we create a fake contrast curve, producing a white image contrastcurvePoints.resize(5); - contrastcurvePoints.at(0) = double(DCT_NURBS); + contrastcurvePoints.at(0) = double (DCT_NURBS); - contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range + contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range + contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(3) = 1.; // white point - contrastcurvePoints.at(4) = 1.; // value at white point - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + contrastcurvePoints.at(3) = 1.; // white point + contrastcurvePoints.at(4) = 1.; // value at white point } DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); // apply contrast enhancement for (int i = 0; i < 32768; i++) { - outCurve[i] = contrastcurve.getVal (outCurve[i]); + outCurve[i] = contrastcurve.getVal(outCurve[i]); } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // create a curve if needed std::unique_ptr tcurve; bool histNeeded = false; if (!curvePoints.empty() && curvePoints[0] != 0) { - tcurve = std::unique_ptr(new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip)); + tcurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeCCurveHistogram) { histNeeded = true; } } - if (tcurve && tcurve->isIdentity()) { - tcurve = nullptr; - } - - if (tcurve) { + if (tcurve && !tcurve->isIdentity()) { utili = true; //if active // L values go up to 32767, last stop is for highlight overflow @@ -950,15 +1115,15 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorgetVal (outCurve[i]); + val = tcurve->getVal(outCurve[i]); - outCurve[i] = (32767.f * val); + outCurve[i] = 32767.f * val; } } else { // Skip the slow getval method if no curve is used (or an identity curve) // L values go up to 32767, last stop is for highlight overflow - if(histNeeded) { + if (histNeeded) { histogram.compressTo(outBeforeCCurveHistogram, 32768, outCurve); } @@ -967,30 +1132,22 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, LUTf & outCurve, int skip) +void CurveFactory::RGBCurve(const std::vector& curvePoints, LUTf & outCurve, int skip) { // create a curve if needed std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] != 0) { - tcurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); + tcurve.reset(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); } - if (tcurve && tcurve->isIdentity()) { - tcurve = nullptr; - } - - if (tcurve) { + if (tcurve && !tcurve->isIdentity()) { if (!outCurve) { outCurve(65536, 0); } @@ -1007,6 +1164,1328 @@ void CurveFactory::RGBCurve (const std::vector& curvePoints, LUTf & outC } } +LocretigainCurverab::LocretigainCurverab() : sum(0.f) {}; + +void LocretigainCurverab::Reset() +{ + lutLocretigainCurverab.reset(); + sum = 0.f; +} + +void LocretigainCurverab::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocretigainCurverab(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocretigainCurverab[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocretigainCurverab[i] < 0.02f) { + lutLocretigainCurverab[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocretigainCurverab[i]; + } + + //lutLocCurve.dump("wav"); +} + +void LocretigainCurverab::Set(const std::vector &curvePoints) +{ + + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } +} +LocHHmaskblCurve::LocHHmaskblCurve() : sum(0.f) {}; + +void LocHHmaskblCurve::Reset() +{ + lutLocHHmaskblCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskblCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskblCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskblCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskblCurve[i] < 0.02f) { + lutLocHHmaskblCurve[i] = 0.02f; + } + + sum += lutLocHHmaskblCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + +void LocHHmaskblCurve::Set(const std::vector &curvePoints, bool & lhmasblutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lhmasblutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocLLmaskblCurve::LocLLmaskblCurve() : sum(0.f) {}; + +void LocLLmaskblCurve::Reset() +{ + lutLocLLmaskblCurve.reset(); + sum = 0.f; +} + +void LocLLmaskblCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmaskblCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmaskblCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmaskblCurve[i] < 0.02f) { + lutLocLLmaskblCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmaskblCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocLLmaskblCurve::Set(const std::vector &curvePoints, bool & llmasblutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + llmasblutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocCCmaskblCurve::LocCCmaskblCurve() : sum(0.f) {}; + +void LocCCmaskblCurve::Reset() +{ + lutLocCCmaskblCurve.reset(); + sum = 0.f; +} + +void LocCCmaskblCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmaskblCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmaskblCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmaskblCurve[i] < 0.02f) { + lutLocCCmaskblCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmaskblCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocCCmaskblCurve::Set(const std::vector &curvePoints, bool & lcmasblutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lcmasblutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + +LocHHmasktmCurve::LocHHmasktmCurve() : sum(0.f) {}; + +void LocHHmasktmCurve::Reset() +{ + lutLocHHmasktmCurve.reset(); + sum = 0.f; +} + + +void LocHHmasktmCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmasktmCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmasktmCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmasktmCurve[i] < 0.02f) { + lutLocHHmasktmCurve[i] = 0.02f; + } + + sum += lutLocHHmasktmCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + +void LocHHmasktmCurve::Set(const std::vector &curvePoints, bool & lhmastmutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lhmastmutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocLLmasktmCurve::LocLLmasktmCurve() : sum(0.f) {}; + +void LocLLmasktmCurve::Reset() +{ + lutLocLLmasktmCurve.reset(); + sum = 0.f; +} + +void LocLLmasktmCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmasktmCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmasktmCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmasktmCurve[i] < 0.02f) { + lutLocLLmasktmCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmasktmCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocLLmasktmCurve::Set(const std::vector &curvePoints, bool & llmastmutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + llmastmutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocCCmasktmCurve::LocCCmasktmCurve() : sum(0.f) {}; + +void LocCCmasktmCurve::Reset() +{ + lutLocCCmasktmCurve.reset(); + sum = 0.f; +} + +void LocCCmasktmCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmasktmCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmasktmCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmasktmCurve[i] < 0.02f) { + lutLocCCmasktmCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmasktmCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocCCmasktmCurve::Set(const std::vector &curvePoints, bool & lcmastmutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lcmastmutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + + +LocHHmaskretiCurve::LocHHmaskretiCurve() : sum(0.f) {}; + +void LocHHmaskretiCurve::Reset() +{ + lutLocHHmaskretiCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskretiCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskretiCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskretiCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskretiCurve[i] < 0.02f) { + lutLocHHmaskretiCurve[i] = 0.02f; + } + + sum += lutLocHHmaskretiCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + +void LocHHmaskretiCurve::Set(const std::vector &curvePoints, bool & lhmasretiutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lhmasretiutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocLLmaskretiCurve::LocLLmaskretiCurve() : sum(0.f) {}; + +void LocLLmaskretiCurve::Reset() +{ + lutLocLLmaskretiCurve.reset(); + sum = 0.f; +} + +void LocLLmaskretiCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmaskretiCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmaskretiCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmaskretiCurve[i] < 0.02f) { + lutLocLLmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmaskretiCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocLLmaskretiCurve::Set(const std::vector &curvePoints, bool & llmasretiutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + llmasretiutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocCCmaskretiCurve::LocCCmaskretiCurve() : sum(0.f) {}; + +void LocCCmaskretiCurve::Reset() +{ + lutLocCCmaskretiCurve.reset(); + sum = 0.f; +} + +void LocCCmaskretiCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmaskretiCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmaskretiCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmaskretiCurve[i] < 0.02f) { + lutLocCCmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmaskretiCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocCCmaskretiCurve::Set(const std::vector &curvePoints, bool & lcmasretiutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lcmasretiutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + + + + + + +LocHHmaskcbCurve::LocHHmaskcbCurve() : sum(0.f) {}; + +void LocHHmaskcbCurve::Reset() +{ + lutLocHHmaskcbCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskcbCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskcbCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskcbCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskcbCurve[i] < 0.02f) { + lutLocHHmaskcbCurve[i] = 0.02f; + } + + sum += lutLocHHmaskcbCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + +void LocHHmaskcbCurve::Set(const std::vector &curvePoints, bool & lhmascbutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lhmascbutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocLLmaskcbCurve::LocLLmaskcbCurve() : sum(0.f) {}; + +void LocLLmaskcbCurve::Reset() +{ + lutLocLLmaskcbCurve.reset(); + sum = 0.f; +} + +void LocLLmaskcbCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmaskcbCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmaskcbCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmaskcbCurve[i] < 0.02f) { + lutLocLLmaskcbCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmaskcbCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocLLmaskcbCurve::Set(const std::vector &curvePoints, bool & llmascbutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + llmascbutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocCCmaskcbCurve::LocCCmaskcbCurve() : sum(0.f) {}; + +void LocCCmaskcbCurve::Reset() +{ + lutLocCCmaskcbCurve.reset(); + sum = 0.f; +} + +void LocCCmaskcbCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmaskcbCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmaskcbCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmaskcbCurve[i] < 0.02f) { + lutLocCCmaskcbCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmaskcbCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocCCmaskcbCurve::Set(const std::vector &curvePoints, bool & lcmascbutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lcmascbutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + + +LocHHmaskSHCurve::LocHHmaskSHCurve() : sum(0.f) {}; + +void LocHHmaskSHCurve::Reset() +{ + lutLocHHmaskSHCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskSHCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskSHCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskSHCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskSHCurve[i] < 0.02f) { + lutLocHHmaskSHCurve[i] = 0.02f; + } + + sum += lutLocHHmaskSHCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocHHmaskSHCurve::Set(const std::vector &curvePoints, bool & lhmasSHutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lhmasSHutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + +LocLLmaskSHCurve::LocLLmaskSHCurve() : sum(0.f) {}; + +void LocLLmaskSHCurve::Reset() +{ + lutLocLLmaskSHCurve.reset(); + sum = 0.f; +} + +void LocLLmaskSHCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmaskSHCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmaskSHCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmaskSHCurve[i] < 0.02f) { + lutLocLLmaskSHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmaskSHCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocLLmaskSHCurve::Set(const std::vector &curvePoints, bool & llmasSHutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + llmasSHutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + + +LocCCmaskSHCurve::LocCCmaskSHCurve() : sum(0.f) {}; + +void LocCCmaskSHCurve::Reset() +{ + lutLocCCmaskSHCurve.reset(); + sum = 0.f; +} + +void LocCCmaskSHCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmaskSHCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmaskSHCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmaskSHCurve[i] < 0.02f) { + lutLocCCmaskSHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmaskSHCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocCCmaskSHCurve::Set(const std::vector &curvePoints, bool & lcmasSHutili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lcmasSHutili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + + + +LocHHmaskexpCurve::LocHHmaskexpCurve() : sum(0.f) {}; + +void LocHHmaskexpCurve::Reset() +{ + lutLocHHmaskexpCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskexpCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskexpCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskexpCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskexpCurve[i] < 0.02f) { + lutLocHHmaskexpCurve[i] = 0.02f; + } + + sum += lutLocHHmaskexpCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocHHmaskexpCurve::Set(const std::vector &curvePoints, bool & lhmasexputili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lhmasexputili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + +LocLLmaskexpCurve::LocLLmaskexpCurve() : sum(0.f) {}; + +void LocLLmaskexpCurve::Reset() +{ + lutLocLLmaskexpCurve.reset(); + sum = 0.f; +} + +void LocLLmaskexpCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmaskexpCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmaskexpCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmaskexpCurve[i] < 0.02f) { + lutLocLLmaskexpCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmaskexpCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocLLmaskexpCurve::Set(const std::vector &curvePoints, bool & llmasexputili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + llmasexputili = true; + Set(ttcurve); + } else { + Reset(); + } +} + + + + +LocCCmaskexpCurve::LocCCmaskexpCurve() : sum(0.f) {}; + +void LocCCmaskexpCurve::Reset() +{ + lutLocCCmaskexpCurve.reset(); + sum = 0.f; +} + +void LocCCmaskexpCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmaskexpCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmaskexpCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmaskexpCurve[i] < 0.02f) { + lutLocCCmaskexpCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmaskexpCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +void LocCCmaskexpCurve::Set(const std::vector &curvePoints, bool & lcmasexputili) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + lcmasexputili = true; + Set(ttcurve); + } else { + Reset(); + } +} + +LocHHmaskCurve::LocHHmaskCurve() : sum(0.f) {}; + +void LocHHmaskCurve::Reset() +{ + lutLocHHmaskCurve.reset(); + sum = 0.f; +} + + +void LocHHmaskCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHmaskCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHmaskCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHmaskCurve[i] < 0.02f) { + lutLocHHmaskCurve[i] = 0.02f; + } + + sum += lutLocHHmaskCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +bool LocHHmaskCurve::Set(const std::vector &curvePoints) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + Set(ttcurve); + return true; + } else { + Reset(); + return false; + } +} + + + + +LocCCmaskCurve::LocCCmaskCurve() : sum(0.f) {}; + +void LocCCmaskCurve::Reset() +{ + lutLocCCmaskCurve.reset(); + sum = 0.f; +} + + +void LocCCmaskCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCCmaskCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCCmaskCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCCmaskCurve[i] < 0.02f) { + lutLocCCmaskCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCCmaskCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +bool LocCCmaskCurve::Set(const std::vector &curvePoints) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + Set(ttcurve); + return true; + } else { + Reset(); + return false; + } +} + +LocLLmaskCurve::LocLLmaskCurve() : sum(0.f) {}; + +void LocLLmaskCurve::Reset() +{ + lutLocLLmaskCurve.reset(); + sum = 0.f; +} + +void LocLLmaskCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLLmaskCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLLmaskCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLLmaskCurve[i] < 0.02f) { + lutLocLLmaskCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLLmaskCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +bool LocLLmaskCurve::Set(const std::vector &curvePoints) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + Set(ttcurve); + return true; + } else { + Reset(); + return false; + } +} + + + + +LocHHCurve::LocHHCurve() : sum(0.f) {}; + +void LocHHCurve::Reset() +{ + lutLocHHCurve.reset(); + sum = 0.f; +} +void LocHHCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocHHCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocHHCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocHHCurve[i] < 0.02f) { + lutLocHHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocHHCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +bool LocHHCurve::Set(const std::vector &curvePoints) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + Set(ttcurve); + return true; + } else { + Reset(); + return false; + } +} + + +LocLHCurve::LocLHCurve() : sum(0.f) {}; + +void LocLHCurve::Reset() +{ + lutLocLHCurve.reset(); + sum = 0.f; +} + +void LocLHCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocLHCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocLHCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocLHCurve[i] < 0.02f) { + lutLocLHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocLHCurve[i]; + } + + //lutLocCurve.dump("wav"); +} + + + + +bool LocLHCurve::Set(const std::vector &curvePoints) +{ + + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { +// if (LHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + return true; + } else { + Reset(); + return false; + } +} + +LocCHCurve::LocCHCurve() : sum(0.f) {}; + +void LocCHCurve::Reset() +{ + lutLocCHCurve.reset(); + sum = 0.f; +} +void LocCHCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocCHCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocCHCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocCHCurve[i] < 0.02f) { + lutLocCHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocCHCurve[i]; + } + + //lutLocHHCurve.dump("wav"); +} + + + +bool LocCHCurve::Set(const std::vector &curvePoints) +{ + // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + ttcurve.setIdentityValue(0.); + Set(ttcurve); + return true; + } else { + Reset(); + return false; + } +} + + + + + +LocwavCurve::LocwavCurve() : sum(0.f) {}; + +void LocwavCurve::Reset() +{ + lutLocwavCurve.reset(); + sum = 0.f; +} + +void LocwavCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocwavCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocwavCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocwavCurve[i] < 0.02f) { + lutLocwavCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocwavCurve[i]; + } + + //lutLocCurve.dump("wav"); +} +bool LocwavCurve::Set(const std::vector &curvePoints) +{ + + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + return true; + } else { + Reset(); + return false; + } +} + +LocretitransCurve::LocretitransCurve() : sum(0.f) {}; + +void LocretitransCurve::Reset() +{ + lutLocretitransCurve.reset(); + sum = 0.f; +} + +void LocretitransCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocretitransCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocretitransCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocretitransCurve[i] < 0.02f) { + lutLocretitransCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocretitransCurve[i]; + } + + //lutLocCurve.dump("wav"); +} +void LocretitransCurve::Set(const std::vector &curvePoints) +{ + + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } +} + + +LocretigainCurve::LocretigainCurve() : sum(0.f) {}; + +void LocretigainCurve::Reset() +{ + lutLocretigainCurve.reset(); + sum = 0.f; +} + +void LocretigainCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutLocretigainCurve(501); // raise this value if the quality suffers from this number of samples + sum = 0.f; + + for (int i = 0; i < 501; i++) { + lutLocretigainCurve[i] = pCurve.getVal(double (i) / 500.); + + if (lutLocretigainCurve[i] < 0.02f) { + lutLocretigainCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value + } + + sum += lutLocretigainCurve[i]; + } + + //lutLocCurve.dump("wav"); +} +void LocretigainCurve::Set(const std::vector &curvePoints) +{ + + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } +} + + void ColorAppearance::Reset() { @@ -1019,7 +2498,7 @@ void ColorAppearance::Set(const Curve &pCurve) lutColCurve(65536); for (int i = 0; i < 65536; i++) { - lutColCurve[i] = pCurve.getVal(double(i) / 65535.) * 65535.; + lutColCurve[i] = pCurve.getVal(double (i) / 65535.) * 65535.; } } @@ -1038,10 +2517,10 @@ void RetinextransmissionCurve::Set(const Curve &pCurve) return; } - luttransmission(501); // raise this value if the quality suffers from this number of samples + luttransmission(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - luttransmission[i] = pCurve.getVal(double(i) / 500.); + luttransmission[i] = pCurve.getVal(double (i) / 500.); } } @@ -1071,10 +2550,10 @@ void RetinexgaintransmissionCurve::Set(const Curve &pCurve) return; } - lutgaintransmission(501); // raise this value if the quality suffers from this number of samples + lutgaintransmission(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - lutgaintransmission[i] = pCurve.getVal(double(i) / 500.); + lutgaintransmission[i] = pCurve.getVal(double (i) / 500.); } } @@ -1101,9 +2580,9 @@ void ToneCurve::Set(const Curve &pCurve, float gamma) if (gamma <= 0.0 || gamma == 1.) { for (int i = 0; i < 65536; i++) { - lutToneCurve[i] = (float)pCurve.getVal(float(i) / 65535.f) * 65535.f; + lutToneCurve[i] = (float)pCurve.getVal(float (i) / 65535.f) * 65535.f; } - } else if(gamma == (float)Color::sRGBGammaCurve) { + } else if (gamma == (float)Color::sRGBGammaCurve) { // for sRGB gamma we can use luts, which is much faster for (int i = 0; i < 65536; i++) { float val = Color::gammatab_srgb[i] / 65535.f; @@ -1113,17 +2592,17 @@ void ToneCurve::Set(const Curve &pCurve, float gamma) } } else { - const float start = expf(gamma * logf( -0.055 / ((1.0 / gamma - 1.0) * 1.055 ))); - const float slope = 1.055 * powf (start, 1.0 / gamma - 1) - 0.055 / start; + const float start = expf(gamma * logf(-0.055 / ((1.0 / gamma - 1.0) * 1.055))); + const float slope = 1.055 * powf(start, 1.0 / gamma - 1) - 0.055 / start; const float mul = 1.055; const float add = 0.055; // apply gamma, that is 'pCurve' is defined with the given gamma and here we convert it to a curve in linear space for (int i = 0; i < 65536; i++) { - float val = float(i) / 65535.f; - val = CurveFactory::gamma (val, gamma, start, slope, mul, add); + float val = float (i) / 65535.f; + val = CurveFactory::gamma(val, gamma, start, slope, mul, add); val = pCurve.getVal(val); - val = CurveFactory::igamma (val, gamma, start, slope, mul, add); + val = CurveFactory::igamma(val, gamma, start, slope, mul, add); lutToneCurve[i] = val * 65535.f; } } @@ -1141,10 +2620,10 @@ void OpacityCurve::Set(const Curve *pCurve) return; } - lutOpacityCurve(501); // raise this value if the quality suffers from this number of samples + lutOpacityCurve(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - lutOpacityCurve[i] = pCurve->getVal(double(i) / 500.); + lutOpacityCurve[i] = pCurve->getVal(double (i) / 500.); } //lutOpacityCurve.dump("opacity"); @@ -1155,18 +2634,13 @@ void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili) std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); + tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); tcurve->setIdentityValue(0.); - } - - if (tcurve) { Set(tcurve.get()); opautili = true; - tcurve = nullptr; } } - WavCurve::WavCurve() : sum(0.f) {} void WavCurve::Reset() @@ -1182,13 +2656,13 @@ void WavCurve::Set(const Curve &pCurve) return; } - lutWavCurve(501); // raise this value if the quality suffers from this number of samples + lutWavCurve(501); // raise this value if the quality suffers from this number of samples sum = 0.f; for (int i = 0; i < 501; i++) { - lutWavCurve[i] = pCurve.getVal(double(i) / 500.); + lutWavCurve[i] = pCurve.getVal(double (i) / 500.); - if(lutWavCurve[i] < 0.02f) { + if (lutWavCurve[i] < 0.02f) { lutWavCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value } @@ -1209,6 +2683,41 @@ void WavCurve::Set(const std::vector &curvePoints) } } +Wavblcurve::Wavblcurve() {} + +void Wavblcurve::Reset() +{ + lutblcurve.reset(); +} + +void Wavblcurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutblcurve(501); // raise this value if the quality suffers from this number of samples + + for (int i = 0; i < 501; i++) { + lutblcurve[i] = pCurve.getVal(double(i) / 500.); + } +} + +void Wavblcurve::Set(const std::vector &curvePoints) +{ + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } + +} + + + WavOpacityCurveRG::WavOpacityCurveRG() {} @@ -1224,10 +2733,10 @@ void WavOpacityCurveRG::Set(const Curve &pCurve) return; } - lutOpacityCurveRG(501); // raise this value if the quality suffers from this number of samples + lutOpacityCurveRG(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - lutOpacityCurveRG[i] = pCurve.getVal(double(i) / 500.); + lutOpacityCurveRG[i] = pCurve.getVal(double (i) / 500.); } } @@ -1243,6 +2752,43 @@ void WavOpacityCurveRG::Set(const std::vector &curvePoints) } +WavOpacityCurveSH::WavOpacityCurveSH() {} + +void WavOpacityCurveSH::Reset() +{ + lutOpacityCurveSH.reset(); +} + +void WavOpacityCurveSH::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + Reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutOpacityCurveSH(501); // raise this value if the quality suffers from this number of samples + + for (int i = 0; i < 501; i++) { + lutOpacityCurveSH[i] = pCurve.getVal(double(i) / 500.); + } +} + +void WavOpacityCurveSH::Set(const std::vector &curvePoints) +{ + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } + +} + + + + + WavOpacityCurveBY::WavOpacityCurveBY() {} void WavOpacityCurveBY::Reset() @@ -1257,10 +2803,10 @@ void WavOpacityCurveBY::Set(const Curve &pCurve) return; } - lutOpacityCurveBY(501); // raise this value if the quality suffers from this number of samples + lutOpacityCurveBY(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - lutOpacityCurveBY[i] = pCurve.getVal(double(i) / 500.); + lutOpacityCurveBY[i] = pCurve.getVal(double (i) / 500.); } } @@ -1289,10 +2835,10 @@ void WavOpacityCurveW::Set(const Curve &pCurve) return; } - lutOpacityCurveW(501); // raise this value if the quality suffers from this number of samples + lutOpacityCurveW(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - lutOpacityCurveW[i] = pCurve.getVal(double(i) / 500.); + lutOpacityCurveW[i] = pCurve.getVal(double (i) / 500.); } } @@ -1321,10 +2867,10 @@ void WavOpacityCurveWL::Set(const Curve &pCurve) return; } - lutOpacityCurveWL(501); // raise this value if the quality suffers from this number of samples + lutOpacityCurveWL(501); // raise this value if the quality suffers from this number of samples for (int i = 0; i < 501; i++) { - lutOpacityCurveWL[i] = pCurve.getVal(double(i) / 500.); + lutOpacityCurveWL[i] = pCurve.getVal(double (i) / 500.); } } @@ -1355,13 +2901,13 @@ void NoiseCurve::Set(const Curve &pCurve) return; } - lutNoiseCurve(501); // raise this value if the quality suffers from this number of samples + lutNoiseCurve(501); // raise this value if the quality suffers from this number of samples sum = 0.f; for (int i = 0; i < 501; i++) { - lutNoiseCurve[i] = pCurve.getVal(double(i) / 500.); + lutNoiseCurve[i] = pCurve.getVal(double (i) / 500.); - if(lutNoiseCurve[i] < 0.01f) { + if (lutNoiseCurve[i] < 0.01f) { lutNoiseCurve[i] = 0.01f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value } @@ -1435,7 +2981,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], //lr1=low; for (int i = 0; i <= upperBound; ++i) { - double x = double(i) / double(upperBound); + double x = double (i) / double (upperBound); if (x > nextX) { ++ptNum; @@ -1451,13 +2997,13 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], } if (!ptNum) { - Color::hsv2rgb(float(prevY), satur, lr1, r, g, b); + Color::hsv2rgb(float (prevY), satur, lr1, r, g, b); Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb); lut1[i] = xx; lut2[i] = yy; lut3[i] = zz; } else if (ptNum >= nPoints) { - Color::hsv2rgb(float(nextY), satur, lr2, r, g, b); + Color::hsv2rgb(float (nextY), satur, lr2, r, g, b); Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb); lut1[i] = xx; lut2[i] = yy; @@ -1467,8 +3013,8 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], if (dY > 0.000001 || dY < -0.000001) { float r1, g1, b1, r2, g2, b2; - Color::hsv2rgb(float(prevY), satur, lr1, r1, g1, b1); - Color::hsv2rgb(float(nextY), satur, lr2, r2, g2, b2); + Color::hsv2rgb(float (prevY), satur, lr1, r1, g1, b1); + Color::hsv2rgb(float (nextY), satur, lr2, r2, g2, b2); LUTf dum; float X1, X2, Y1, Y2, Z1, Z2, L1, a_1, b_1, c1, h1; Color::rgbxyz(r2, g2, b2, X2, Y2, Z2, xyz_rgb); @@ -1476,34 +3022,27 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], //I use XYZ to mix color 1 and 2 rather than rgb (gamut) and rather than Lab artifacts X1 = X1 + (X2 - X1) * currY / dY; - if(X1 < 0.f) { + if (X1 < 0.f) { X1 = 0.f; //negative value not good } Y1 = Y1 + (Y2 - Y1) * currY / dY; - if(Y1 < 0.f) { + if (Y1 < 0.f) { Y1 = 0.f; } Z1 = Z1 + (Z2 - Z1) * currY / dY; - if(Z1 < 0.f) { + if (Z1 < 0.f) { Z1 = 0.f; } - Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1);//prepare to gamut control + Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1); //prepare to gamut control Color::Lab2Lch(a_1, b_1, c1, h1); float Lr = L1 / 327.68f; float RR, GG, BB; -#ifndef NDEBUG - bool neg = false; - bool more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb); -#else Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f); -#endif L1 = Lr * 327.68f; float La, Lb, X, Y, Z; // converting back to rgb @@ -1513,7 +3052,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], lut2[i] = Y; lut3[i] = Z; } else { - Color::hsv2rgb(float(nextY), satur, lumin, r, g, b); + Color::hsv2rgb(float (nextY), satur, lumin, r, g, b); Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb); lut1[i] = xx; lut2[i] = yy; @@ -1521,14 +3060,6 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], } } } - - /* - #ifndef NDEBUG - lutRed.dump("red"); - lutGreen.dump("green"); - lutBlue.dump("blue"); - #endif - */ } void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], float satur, float lumin) @@ -1536,10 +3067,7 @@ void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const do std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); - } - - if (tcurve) { + tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); SetXYZ(tcurve.get(), xyz_rgb, satur, lumin); } } @@ -1572,7 +3100,7 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve) Color::eInterpolationDirection dir = Color::ID_DOWN; for (int i = 0; i <= upperBound; ++i) { - double x = double(i) / double(upperBound); + double x = double (i) / double (upperBound); if (x > nextX) { ++ptNum; @@ -1586,12 +3114,12 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve) } if (!ptNum) { - Color::hsv2rgb(float(prevY), 1.f, 1.f, r, g, b); + Color::hsv2rgb(float (prevY), 1.f, 1.f, r, g, b); lut1[i] = r; lut2[i] = g; lut3[i] = b; } else if (ptNum >= nPoints) { - Color::hsv2rgb(float(nextY), 1.f, 1.f, r, g, b); + Color::hsv2rgb(float (nextY), 1.f, 1.f, r, g, b); lut1[i] = r; lut2[i] = g; lut3[i] = b; @@ -1605,29 +3133,21 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve) Color::hsv2rgb(h2, 1.f, 1.f, ro, go, bo); #else float r1, g1, b1, r2, g2, b2, ro, go, bo; - Color::hsv2rgb(float(prevY), 1., 1., r1, g1, b1); - Color::hsv2rgb(float(nextY), 1., 1., r2, g2, b2); + Color::hsv2rgb(float (prevY), 1., 1., r1, g1, b1); + Color::hsv2rgb(float (nextY), 1., 1., r2, g2, b2); Color::interpolateRGBColor(currY / dY, r1, g1, b1, r2, g2, b2, Color::CHANNEL_LIGHTNESS | Color::CHANNEL_CHROMATICITY | Color::CHANNEL_HUE, xyz_rgb, rgb_xyz, ro, go, bo); #endif lut1[i] = ro; lut2[i] = go; lut3[i] = bo; } else { - Color::hsv2rgb(float(nextY), 1.f, 1.f, r, g, b); + Color::hsv2rgb(float (nextY), 1.f, 1.f, r, g, b); lut1[i] = r; lut2[i] = g; lut3[i] = b; } } } - - /* - #ifndef NDEBUG - lut1.dump("red"); - lut2.dump("green"); - lut3.dump("blue"); - #endif - */ } void ColorGradientCurve::SetRGB(const std::vector &curvePoints) @@ -1635,10 +3155,7 @@ void ColorGradientCurve::SetRGB(const std::vector &curvePoints) std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); - } - - if (tcurve) { + tcurve.reset(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); SetRGB(tcurve.get()); } } @@ -1681,18 +3198,18 @@ void PerceptualToneCurve::cubic_spline(const float x[], const float y[], const i A[i][len - 1] = 6 * (b[i + 1] - b[i]); } - for(i = 1; i < len - 2; i++) { + for (i = 1; i < len - 2; i++) { float v = A[i + 1][i] / A[i][i]; - for(j = 1; j <= len - 1; j++) { + for (j = 1; j <= len - 1; j++) { A[i + 1][j] -= v * A[i][j]; } } - for(i = len - 2; i > 0; i--) { + for (i = len - 2; i > 0; i--) { float acc = 0; - for(j = i; j <= len - 2; j++) { + for (j = i; j <= len - 2; j++) { acc += A[i][j] * c[j]; } @@ -1812,7 +3329,7 @@ float PerceptualToneCurve::calculateToneCurveContrastValue() const // Note: the analysis is made on the gamma encoded curve, as the LUT is linear we make backwards gamma to struct find_tc_slope_fun_arg arg = { this }; - float k = find_minimum_interval_halving(find_tc_slope_fun, &arg, 0.1, 5.0, 0.01, 20); // normally found in 8 iterations + float k = find_minimum_interval_halving(find_tc_slope_fun, &arg, 0.1, 5.0, 0.01, 20); // normally found in 8 iterations //fprintf(stderr, "average slope: %f\n", k); float maxslope = 0; @@ -1869,7 +3386,7 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float if (oog_r && oog_g && oog_b) { continue; } - + float r = CLIP(rc[i]); float g = CLIP(gc[i]); float b = CLIP(bc[i]); @@ -1892,17 +3409,35 @@ 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; - if (!oog_r) rc[i] = 65535.f; - if (!oog_g) gc[i] = 65535.f; - if (!oog_b) 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; - if (!oog_r) rc[i] = 0.f; - if (!oog_g) gc[i] = 0.f; - if (!oog_b) bc[i] = 0.f; + if (!oog_r) { + rc[i] = 0.f; + } + + if (!oog_g) { + gc[i] = 0.f; + } + + if (!oog_b) { + bc[i] = 0.f; + } + continue; } @@ -1925,11 +3460,13 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float Color::Prophotoxyz(r, g, b, x, y, z); float J, C, h; - Ciecam02::xyz2jch_ciecam02float( J, C, h, - aw, fl, - x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f, - xw, yw, zw, - c, nc, pow1, nbb, ncb, cz, d); + int c16 = 1;//always Cat02....to reserve compatibility + float plum = 100.f; + Ciecam02::xyz2jch_ciecam02float(J, C, h, + aw, fl, + x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f, + xw, yw, zw, + c, nc, pow1, nbb, ncb, cz, d, c16, plum); if (!isfinite(J) || !isfinite(C) || !isfinite(h)) { @@ -1942,9 +3479,18 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float g = newg; b = newb; } - if (!oog_r) rc[i] = r; - if (!oog_g) gc[i] = g; - if (!oog_b) bc[i] = b; + + if (!oog_r) { + rc[i] = r; + } + + if (!oog_g) { + gc[i] = g; + } + + if (!oog_b) { + bc[i] = b; + } continue; } @@ -2035,11 +3581,10 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float } C *= cmul; - - Ciecam02::jch2xyz_ciecam02float( x, y, z, - J, C, h, - xw, yw, zw, - c, nc, pow1, nbb, ncb, fl, cz, d, aw ); + Ciecam02::jch2xyz_ciecam02float(x, y, z, + J, C, h, + xw, yw, zw, + c, nc, pow1, nbb, ncb, fl, cz, d, aw, c16, plum); 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. @@ -2052,9 +3597,17 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float b = newb; } - if (!oog_r) rc[i] = r; - if (!oog_g) gc[i] = g; - if (!oog_b) bc[i] = b; + if (!oog_r) { + rc[i] = r; + } + + if (!oog_g) { + gc[i] = g; + } + + if (!oog_b) { + bc[i] = b; + } continue; } @@ -2115,9 +3668,18 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float g = newg; b = newb; } - if (!oog_r) rc[i] = r; - if (!oog_g) gc[i] = g; - if (!oog_b) 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]; @@ -2137,10 +3699,11 @@ void PerceptualToneCurve::init() f = 1.00f; c = 0.69f; nc = 1.00f; - + int c16 = 1;//with cat02 for compatibility + float plum = 100.f; 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 ); + cz, aw, wh, pfl, fl, c, c16, plum); + pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f); { // init contrast-value-to-chroma-scaling conversion curve @@ -2186,7 +3749,7 @@ void PerceptualToneCurve::init() } } -void PerceptualToneCurve::initApplyState(PerceptualToneCurveState & state, Glib::ustring workingSpace) const +void PerceptualToneCurve::initApplyState(PerceptualToneCurveState & state, const Glib::ustring &workingSpace) const { // Get the curve's contrast value, and convert to a chroma scaling @@ -2208,7 +3771,7 @@ void PerceptualToneCurve::initApplyState(PerceptualToneCurveState & state, Glib: state.Working2Prophoto[i][j] += prophoto_xyz[i][k] * Work[k][j]; } - Work = ICCStore::getInstance()->workingSpaceInverseMatrix (workingSpace); + Work = ICCStore::getInstance()->workingSpaceInverseMatrix(workingSpace); memset(state.Prophoto2Working, 0, sizeof(state.Prophoto2Working)); for (int i = 0; i < 3; i++) diff --git a/rtengine/curves.h b/rtengine/curves.h index bc8193b76..02503aff2 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -22,21 +22,23 @@ #include #include -#include - #include "rt_math.h" #include "flatcurvetypes.h" #include "diagonalcurvetypes.h" -#include "pipettebuffer.h" #include "noncopyable.h" #include "LUT.h" #include "sleef.h" #define CURVES_MIN_POLY_POINTS 1000 -#include "rt_math.h" - #define CLIPI(a) ((a)>0?((a)<65534?(a):65534):0) +namespace Glib +{ + +class ustring; + +} + using namespace std; namespace rtengine @@ -72,7 +74,8 @@ inline void setUnlessOOG(vfloat &r, vfloat &g, vfloat &b, const vfloat rr, const bool sanitizeCurve(std::vector& curve); -namespace curves { +namespace curves +{ inline void setLutVal(const LUTf &lut, float &val) { @@ -122,33 +125,41 @@ class CurveFactory protected: // functions calculating the parameters of the contrast curve based on the desired slope at the center - static double solve_upper (double m, double c, double deriv); - static double solve_lower (double m, double c, double deriv); - static double dupper (const double b, const double m, const double c); - static double dlower (const double b, const double m, const double c); + static double solve_upper(double m, double c, double deriv); + static double solve_lower(double m, double c, double deriv); + static double dupper(const double b, const double m, const double c); + static double dlower(const double b, const double m, const double c); // basic convex function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point - static inline double basel (double x, double m1, double m2) + static inline double basel(double x, double m1, double m2) { if (x == 0.0) { return 0.0; } - double k = sqrt ((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2); + double k = sqrt((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2); double l = (m1 - m2) / (1.0 - m2) + k; double lx = xlog(x); return m2 * x + (1.0 - m2) * (2.0 - xexp(k * lx)) * xexp(l * lx); } + static inline double basel_alt(double x) + { + return (2.0 - x) * x * x * x; + } // basic concave function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point - static inline double baseu (double x, double m1, double m2) + static inline double baseu(double x, double m1, double m2) { return 1.0 - basel(1.0 - x, m1, m2); } + static inline double baseu_alt(double x) + { + return x * (2.0 + (x - 2.0) * x * x); + } // convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery - static inline double cupper (double x, double m, double hr) + static inline double cupper(double x, double m, double hr) { if (hr > 1.0) { - return baseu (x, m, 2.0 * (hr - 1.0) / m); + return baseu(x, m, 2.0 * (hr - 1.0) / m); } double x1 = (1.0 - hr) / m; @@ -165,12 +176,12 @@ protected: return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0); } // concave curve between (0,0) and (1,1) with slope m at (1,1). sr controls the shadow recovery - static inline double clower (double x, double m, double sr) + static inline double clower(double x, double m, double sr) { return 1.0 - cupper(1.0 - x, m, sr); } // convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery - static inline double cupper2 (double x, double m, double hr) + static inline double cupper2(double x, double m, double hr) { double x1 = (1.0 - hr) / m; double x2 = x1 + hr; @@ -185,7 +196,7 @@ protected: return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0.3 * hr); } - static inline double clower2 (double x, double m, double sr) + static inline double clower2(double x, double m, double sr) { //curve for b<0; starts with positive slope and then rolls over toward straight line to x=y=1 double x1 = sr / 1.5 + 0.00001; @@ -199,7 +210,7 @@ protected: } // tone curve base. a: slope (from exp.comp.), b: black point normalized by 65535, // D: max. x value (can be>1), hr,sr: highlight,shadow recovery - static inline double basecurve (double x, double a, double b, double D, double hr, double sr) + static inline double basecurve(double x, double a, double b, double D, double hr, double sr) { if (b < 0) { double m = 0.5;//midpoint @@ -217,7 +228,7 @@ protected: double y = a * D > 1.0 ? 0.25 : (m - b / a) * slope; if (x <= m) { - return b == 0 ? x * slope : clower (x / m, slope * m / y, sr) * y; + return b == 0 ? x * slope : clower(x / m, slope * m / y, sr) * y; } else if (a * D > 1.0) { return y + (1.0 - y) * cupper2((x - m) / (D - m), slope * (D - m) / (1.0 - y), hr); } else { @@ -225,7 +236,7 @@ protected: } } } - static inline double simplebasecurve (double x, double b, double sr) + static inline double simplebasecurve(double x, double b, double sr) { // a = 1, D = 1, hr = 0 (unused for a = D = 1) if (b == 0.0) { @@ -246,7 +257,7 @@ protected: double y = (m - b) * slope; if (x <= m) { - return clower (x / m, slope * m / y, sr) * y; + return clower(x / m, slope * m / y, sr) * y; } else { return y + (x - m) * slope; } @@ -279,65 +290,65 @@ public: } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - static inline double centercontrast (double x, double b, double m); + static inline double centercontrast(double x, double b, double m); // standard srgb gamma and its inverse - static inline double gamma2 (double x) + static inline double gamma2(double x) { return x <= 0.00304 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055; } - static inline double igamma2 (double x) + static inline double igamma2(double x) { return x <= 0.03928 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve); } - static inline float gamma2 (float x) + static inline float gamma2(float x) { - return x <= 0.00304 ? x * 12.92310 : 1.055 * expf(logf(x) / sRGBGammaCurve) - 0.055; + return x <= 0.00304f ? x * 12.92310f : 1.055f * expf(logf(x) / static_cast(sRGBGammaCurve)) - 0.055f; } - static inline float igamma2 (float x) + static inline float igamma2(float x) { - return x <= 0.03928 ? x / 12.92310 : expf(logf((x + 0.055) / 1.055) * sRGBGammaCurve); + return x <= 0.03928f ? x / 12.92310f : expf(logf((x + 0.055f) / 1.055f) * static_cast(sRGBGammaCurve)); } // gamma function with adjustable parameters - static inline double gamma (double x, double gamma, double start, double slope, double mul, double add) + static inline double gamma(double x, double gamma, double start, double slope, double mul, double add) { return (x <= start ? x*slope : exp(log(x) / gamma) * mul - add); } - static inline double igamma (double x, double gamma, double start, double slope, double mul, double add) + static inline double igamma(double x, double gamma, double start, double slope, double mul, double add) { - return (x <= start * slope ? x / slope : exp(log((x + add) / mul) * gamma) ); + return (x <= start * slope ? x / slope : exp(log((x + add) / mul) * gamma)); } - static inline float gamma (float x, float gamma, float start, float slope, float mul, float add) + static inline float gamma(float x, float gamma, float start, float slope, float mul, float add) { return (x <= start ? x*slope : xexpf(xlogf(x) / gamma) * mul - add); } - static inline float igamma (float x, float gamma, float start, float slope, float mul, float add) + static inline float igamma(float x, float gamma, float start, float slope, float mul, float add) { - return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma) ); + return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma)); } #ifdef __SSE2__ - static inline vfloat igamma (vfloat x, vfloat gamma, vfloat start, vfloat slope, vfloat mul, vfloat add) + static inline vfloat igamma(vfloat x, vfloat gamma, vfloat start, vfloat slope, vfloat mul, vfloat add) { #if !defined(__clang__) - return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma) ); + return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma)); #else return vself(vmaskf_le(x, start * slope), x / slope, xexpf(xlogf((x + add) / mul) * gamma)); #endif } #endif - static inline float hlcurve (const float exp_scale, const float comp, const float hlrange, float level) + static inline float hlcurve(const float exp_scale, const float comp, const float hlrange, float level) { - if (comp > 0.0) { - float val = level + (hlrange - 65536.0); + if (comp > 0.f) { + float val = level + (hlrange - 65536.f); - if(val == 0.0f) { // to avoid division by zero + if (val == 0.0f) { // to avoid division by zero val = 0.000001f; } float Y = val * exp_scale / hlrange; Y *= comp; - if(Y <= -1.0) { // to avoid log(<=0) + if(Y <= -1.f) { // to avoid log(<=0) Y = -.999999f; } @@ -348,29 +359,36 @@ public: } } + public: - static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, - const std::vector& curvePoints, const std::vector& curvePoints2, - const LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, + static void complexCurve(double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, + const std::vector& curvePoints, const std::vector& curvePoints2, + const LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, + int skip = 1); - int skip = 1); - static void curveBW (const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, - ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip); - - static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip); - - static void curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip); - static void curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); - static void mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); - - static void curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip); - - static void complexsgnCurve ( bool & autili, bool & butili, bool & ccutili, bool & clcutili, const std::vector& acurvePoints, - const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, + static void complexCurvelocal(double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double cont, double lumare, + LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTf & lightCurveloc, float avg, int skip = 1); - static void complexLCurve (double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili); - static void curveLightBrightColor ( + static void Curvelocalhl(double ecomp, double hlcompr, double hlcomprthresh, LUTf & hlCurve); + + static void curveBW(const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, + ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip); + + static bool diagonalCurve2Lut(const std::vector& curvePoints, LUTf& curve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); + static bool diagonalCurve2Lut(const std::vector& curvePoints, LUTf& curve, int skip); + + static void complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & clcutili, const std::vector& acurvePoints, + const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, + int skip = 1); + + static void updatechroma( + const std::vector& cccurvePoints, + LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma + int skip = 1); + static void complexLCurve(double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili); + + static void curveLightBrightColor( const std::vector& curvePoints, const std::vector& curvePoints2, const std::vector& curvePoints3, @@ -380,7 +398,7 @@ public: ColorAppearance & outColCurve2, ColorAppearance & outColCurve3, int skip = 1); - static void RGBCurve (const std::vector& curvePoints, LUTf & outCurve, int skip); + static void RGBCurve(const std::vector& curvePoints, LUTf & outCurve, int skip); }; @@ -418,65 +436,72 @@ protected: double increment; int nbr_points; - static inline double p00 (double x, double prot) + static inline double p00(double x, double prot) { - return CurveFactory::clower (x, 2.0, prot); + return CurveFactory::clower(x, 2.0, prot); } - static inline double p11 (double x, double prot) + static inline double p11(double x, double prot) { - return CurveFactory::cupper (x, 2.0, prot); + return CurveFactory::cupper(x, 2.0, prot); } - static inline double p01 (double x, double prot) + static inline double p01(double x, double prot) { - return x <= 0.5 ? CurveFactory::clower (x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::cupper ((x - 0.5) * 2, 2.0, prot) * 0.5; + return x <= 0.5 ? CurveFactory::clower(x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::cupper((x - 0.5) * 2, 2.0, prot) * 0.5; } - static inline double p10 (double x, double prot) + static inline double p10(double x, double prot) { - return x <= 0.5 ? CurveFactory::cupper (x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::clower ((x - 0.5) * 2, 2.0, prot) * 0.5; + return x <= 0.5 ? CurveFactory::cupper(x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::clower((x - 0.5) * 2, 2.0, prot) * 0.5; } - static inline double pfull (double x, double prot, double sh, double hl) + static inline double pfull(double x, double prot, double sh, double hl) { return (1 - sh) * (1 - hl) * p00(x, prot) + sh * hl * p11(x, prot) + (1 - sh) * hl * p01(x, prot) + sh * (1 - hl) * p10(x, prot); } + static inline double pfull_alt(double x, double sh, double hl) + { + double t = (1.0 - sh) * (1.0 - hl) * CurveFactory::basel_alt(x) + sh * hl * CurveFactory::baseu_alt(x); + return x <= 0.5 + ? t + (1.0 - sh) * hl * CurveFactory::basel_alt(2.0 * x) * 0.5 + sh * (1.0 - hl) * CurveFactory::baseu_alt(2.0 * x) * 0.5 + : t + (1.0 - sh) * hl * (0.5 + CurveFactory::baseu_alt(2.0 * x - 1.0) * 0.5) + sh * (1.0 - hl) * (0.5 + CurveFactory::basel_alt(2.0 * x - 1.0) * 0.5); + } void fillHash(); void fillDyByDx(); public: - Curve (); - virtual ~Curve () {}; - void AddPolygons (); - int getSize () const; // return the number of control points + Curve(); + virtual ~Curve() {}; + void AddPolygons(); + int getSize() const; // return the number of control points void getControlPoint(int cpNum, double &x, double &y) const; - virtual double getVal (double t) const = 0; - virtual void getVal (const std::vector& t, std::vector& res) const = 0; + virtual double getVal(double t) const = 0; + virtual void getVal(const std::vector& t, std::vector& res) const = 0; - virtual bool isIdentity () const = 0; + virtual bool isIdentity() const = 0; }; -class DiagonalCurve : public Curve +class DiagonalCurve final : public Curve { protected: DiagonalCurveType kind; - void spline_cubic_set (); + void spline_cubic_set(); void catmull_rom_set(); - void NURBS_set (); + void NURBS_set(); public: - explicit DiagonalCurve (const std::vector& points, int ppn = CURVES_MIN_POLY_POINTS); - ~DiagonalCurve () override; + explicit DiagonalCurve(const std::vector& points, int ppn = CURVES_MIN_POLY_POINTS); + ~DiagonalCurve() override; - double getVal (double t) const override; - void getVal (const std::vector& t, std::vector& res) const override; - bool isIdentity () const override + 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; }; }; -class FlatCurve : public Curve, public rtengine::NonCopyable +class FlatCurve final : public Curve { private: @@ -486,17 +511,17 @@ private: double identityValue; bool periodic; - void CtrlPoints_set (); + void CtrlPoints_set(); public: - explicit FlatCurve (const std::vector& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS); - ~FlatCurve () override; + explicit FlatCurve(const std::vector& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS); + ~FlatCurve() override; - double getVal (double t) const override; - void getVal (const std::vector& t, std::vector& res) const override; - bool setIdentityValue (double iVal); - bool isIdentity () const override + double getVal(double t) const override; + void getVal(const std::vector& t, std::vector& res) const override; + bool setIdentityValue(double iVal); + bool isIdentity() const override { return kind == FCT_Empty; }; @@ -579,11 +604,11 @@ public: void Set(const std::vector &curvePoints, bool &opautili); // TODO: transfer this method to the Color class... - float blend (float x, float lower, float upper) const + float blend(float x, float lower, float upper) const { return (upper - lower) * lutOpacityCurve[x * 500.f] + lower; } - void blend3f (float x, float lower1, float upper1, float &result1, float lower2, float upper2, float &result2, float lower3, float upper3, float &result3) const + void blend3f(float x, float lower1, float upper1, float &result1, float lower2, float upper2, float &result2, float lower3, float upper3, float &result3) const { float opacity = lutOpacityCurve[x * 500.f]; result1 = (upper1 - lower1) * opacity + lower1; @@ -597,6 +622,824 @@ public: } }; +class LocLHCurve +{ +private: + LUTf lutLocLHCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLHCurve() {}; + LocLHCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLHCurve[index]; + } + operator bool (void) const + { + return lutLocLHCurve; + } +}; + +class LocHHmaskblCurve +{ +private: + LUTf lutLocHHmaskblCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskblCurve() {}; + LocHHmaskblCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lhmasblutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskblCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskblCurve; + } +}; + +class LocCCmaskblCurve +{ +private: + LUTf lutLocCCmaskblCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmaskblCurve() {}; + LocCCmaskblCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lcmasblutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmaskblCurve[index]; + } + operator bool (void) const + { + return lutLocCCmaskblCurve; + } +}; + +class LocLLmaskblCurve +{ +private: + LUTf lutLocLLmaskblCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmaskblCurve() {}; + LocLLmaskblCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & llmasblutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmaskblCurve[index]; + } + operator bool (void) const + { + return lutLocLLmaskblCurve; + } +}; + + + +class LocHHmasktmCurve +{ +private: + LUTf lutLocHHmasktmCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmasktmCurve() {}; + LocHHmasktmCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lhmastmutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmasktmCurve[index]; + } + operator bool (void) const + { + return lutLocHHmasktmCurve; + } +}; + + +class LocCCmasktmCurve +{ +private: + LUTf lutLocCCmasktmCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmasktmCurve() {}; + LocCCmasktmCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lcmastmutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmasktmCurve[index]; + } + operator bool (void) const + { + return lutLocCCmasktmCurve; + } +}; + +class LocLLmasktmCurve +{ +private: + LUTf lutLocLLmasktmCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmasktmCurve() {}; + LocLLmasktmCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & llmastmutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmasktmCurve[index]; + } + operator bool (void) const + { + return lutLocLLmasktmCurve; + } +}; + + + +class LocHHmaskretiCurve +{ +private: + LUTf lutLocHHmaskretiCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskretiCurve() {}; + LocHHmaskretiCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lhmasretiutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskretiCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskretiCurve; + } +}; + + +class LocCCmaskretiCurve +{ +private: + LUTf lutLocCCmaskretiCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmaskretiCurve() {}; + LocCCmaskretiCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lcmasretiutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmaskretiCurve[index]; + } + operator bool (void) const + { + return lutLocCCmaskretiCurve; + } +}; + +class LocLLmaskretiCurve +{ +private: + LUTf lutLocLLmaskretiCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmaskretiCurve() {}; + LocLLmaskretiCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & llmasretiutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmaskretiCurve[index]; + } + operator bool (void) const + { + return lutLocLLmaskretiCurve; + } +}; + + + + + +class LocHHmaskcbCurve +{ +private: + LUTf lutLocHHmaskcbCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskcbCurve() {}; + LocHHmaskcbCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lhmascbutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskcbCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskcbCurve; + } +}; + + +class LocCCmaskcbCurve +{ +private: + LUTf lutLocCCmaskcbCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmaskcbCurve() {}; + LocCCmaskcbCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lcmascbutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmaskcbCurve[index]; + } + operator bool (void) const + { + return lutLocCCmaskcbCurve; + } +}; + +class LocLLmaskcbCurve +{ +private: + LUTf lutLocLLmaskcbCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmaskcbCurve() {}; + LocLLmaskcbCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & llmascbutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmaskcbCurve[index]; + } + operator bool (void) const + { + return lutLocLLmaskcbCurve; + } +}; + + + + +class LocHHmaskexpCurve +{ +private: + LUTf lutLocHHmaskexpCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskexpCurve() {}; + LocHHmaskexpCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lhmasexputili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskexpCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskexpCurve; + } +}; + + +class LocCCmaskexpCurve +{ +private: + LUTf lutLocCCmaskexpCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmaskexpCurve() {}; + LocCCmaskexpCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lcmasexputili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmaskexpCurve[index]; + } + operator bool (void) const + { + return lutLocCCmaskexpCurve; + } +}; + +class LocLLmaskexpCurve +{ +private: + LUTf lutLocLLmaskexpCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmaskexpCurve() {}; + LocLLmaskexpCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & llmasexputili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmaskexpCurve[index]; + } + operator bool (void) const + { + return lutLocLLmaskexpCurve; + } +}; + + +class LocHHmaskSHCurve +{ +private: + LUTf lutLocHHmaskSHCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskSHCurve() {}; + LocHHmaskSHCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lhmasSHutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskSHCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskSHCurve; + } +}; + + +class LocCCmaskSHCurve +{ +private: + LUTf lutLocCCmaskSHCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmaskSHCurve() {}; + LocCCmaskSHCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & lcmasSHutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmaskSHCurve[index]; + } + operator bool (void) const + { + return lutLocCCmaskSHCurve; + } +}; + +class LocLLmaskSHCurve +{ +private: + LUTf lutLocLLmaskSHCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmaskSHCurve() {}; + LocLLmaskSHCurve(); + void Reset(); + void Set(const std::vector &curvePoints, bool & llmasSHutili); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmaskSHCurve[index]; + } + operator bool (void) const + { + return lutLocLLmaskSHCurve; + } +}; + + + + +class LocHHmaskCurve +{ +private: + LUTf lutLocHHmaskCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHmaskCurve() {}; + LocHHmaskCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHmaskCurve[index]; + } + operator bool (void) const + { + return lutLocHHmaskCurve; + } +}; + + +class LocCCmaskCurve +{ +private: + LUTf lutLocCCmaskCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCCmaskCurve() {}; + LocCCmaskCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCCmaskCurve[index]; + } + operator bool (void) const + { + return lutLocCCmaskCurve; + } +}; + +class LocLLmaskCurve +{ +private: + LUTf lutLocLLmaskCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocLLmaskCurve() {}; + LocLLmaskCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocLLmaskCurve[index]; + } + operator bool (void) const + { + return lutLocLLmaskCurve; + } +}; + + +class LocHHCurve +{ +private: + LUTf lutLocHHCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocHHCurve() {}; + LocHHCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocHHCurve[index]; + } + operator bool (void) const + { + return lutLocHHCurve; + } +}; + + +class LocCHCurve +{ +private: + LUTf lutLocCHCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocCHCurve() {}; + LocCHCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocCHCurve[index]; + } + operator bool (void) const + { + return lutLocCHCurve; + } +}; + +class LocretigainCurve +{ +private: + LUTf lutLocretigainCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocretigainCurve() {}; + LocretigainCurve(); + void Reset(); + void Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocretigainCurve[index]; + } + operator bool (void) const + { + return lutLocretigainCurve; + } +}; + +class LocretitransCurve +{ +private: + LUTf lutLocretitransCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocretitransCurve() {}; + LocretitransCurve(); + void Reset(); + void Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocretitransCurve[index]; + } + operator bool (void) const + { + return lutLocretitransCurve; + } +}; + + +class LocwavCurve +{ +private: + LUTf lutLocwavCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocwavCurve() {}; + LocwavCurve(); + void Reset(); + bool Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocwavCurve[index]; + } + +#ifdef __SSE2__ + vfloat operator[](vfloat index) const + { + return lutLocwavCurve[index]; + } +#endif + + operator bool (void) const + { + return lutLocwavCurve; + } +}; + + +class LocretigainCurverab +{ +private: + LUTf lutLocretigainCurverab; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~LocretigainCurverab() {}; + LocretigainCurverab(); + void Reset(); + void Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutLocretigainCurverab[index]; + } + operator bool (void) const + { + return lutLocretigainCurverab; + } +}; + + class WavCurve { private: @@ -625,6 +1468,30 @@ public: } }; +class Wavblcurve +{ +private: + LUTf lutblcurve; // 0xffff range + void Set(const Curve &pCurve); +public: + virtual ~Wavblcurve() {}; + Wavblcurve(); + + void Reset(); + // void Set(const std::vector &curvePoints, bool &opautili); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutblcurve[index]; + } + + operator bool (void) const + { + return lutblcurve; + } +}; + + class WavOpacityCurveRG { private: @@ -647,6 +1514,32 @@ public: return lutOpacityCurveRG; } }; + +class WavOpacityCurveSH +{ +private: + LUTf lutOpacityCurveSH; // 0xffff range + void Set(const Curve &pCurve); +public: + virtual ~WavOpacityCurveSH() {}; + WavOpacityCurveSH(); + + void Reset(); + // void Set(const std::vector &curvePoints, bool &opautili); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutOpacityCurveSH[index]; + } + + operator bool (void) const + { + return lutOpacityCurveSH; + } +}; + + + class WavOpacityCurveBY { private: @@ -798,10 +1691,10 @@ public: }; //lightness curve -inline void Lightcurve::Apply (float& Li) const +inline void Lightcurve::Apply(float& Li) const { - assert (lutColCurve); + assert(lutColCurve); curves::setLutVal(lutColCurve, Li); } @@ -813,10 +1706,10 @@ public: }; //brightness curve -inline void Brightcurve::Apply (float& Br) const +inline void Brightcurve::Apply(float& Br) const { - assert (lutColCurve); + assert(lutColCurve); curves::setLutVal(lutColCurve, Br); } @@ -828,10 +1721,10 @@ public: }; //Chroma curve -inline void Chromacurve::Apply (float& Cr) const +inline void Chromacurve::Apply(float& Cr) const { - assert (lutColCurve); + assert(lutColCurve); curves::setLutVal(lutColCurve, Cr); } @@ -842,10 +1735,10 @@ public: }; //Saturation curve -inline void Saturcurve::Apply (float& Sa) const +inline void Saturcurve::Apply(float& Sa) const { - assert (lutColCurve); + assert(lutColCurve); curves::setLutVal(lutColCurve, Sa); } @@ -857,10 +1750,10 @@ public: }; //Colorfullness curve -inline void Colorfcurve::Apply (float& Cf) const +inline void Colorfcurve::Apply(float& Cf) const { - assert (lutColCurve); + assert(lutColCurve); curves::setLutVal(lutColCurve, Cf); } @@ -875,8 +1768,8 @@ public: // and ending at `r[end]` (and respectively for `b` and `g`). Uses SSE // and requires that `r`, `g`, and `b` pointers have the same alignment. void BatchApply( - const size_t start, const size_t end, - float *r, float *g, float *b) const; + const size_t start, const size_t end, + float *r, float *g, float *b) const; }; class AdobeToneCurve : public ToneCurve @@ -940,32 +1833,35 @@ private: float calculateToneCurveContrastValue() const; public: static void init(); - void initApplyState(PerceptualToneCurveState & state, Glib::ustring workingSpace) const; + void initApplyState(PerceptualToneCurveState & state, const Glib::ustring& workingSpace) const; void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b, const PerceptualToneCurveState &state) const; }; // Standard tone curve -inline void StandardToneCurve::Apply (float& r, float& g, float& b) const +inline void StandardToneCurve::Apply(float& r, float& g, float& b) const { - assert (lutToneCurve); + assert(lutToneCurve); curves::setLutVal(lutToneCurve, r, g, b); } + inline void StandardToneCurve::BatchApply( - const size_t start, const size_t end, - float *r, float *g, float *b) const { - assert (lutToneCurve); - assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); - assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); + 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); + 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. @@ -977,11 +1873,13 @@ inline void StandardToneCurve::BatchApply( break; #endif } + setUnlessOOG(r[i], g[i], b[i], lutToneCurve[r[i]], lutToneCurve[g[i]], lutToneCurve[b[i]]); i++; } #ifdef __SSE2__ + for (; i + 3 < end; i += 4) { vfloat r_val = LVF(r[i]); vfloat g_val = LVF(g[i]); @@ -996,39 +1894,40 @@ inline void StandardToneCurve::BatchApply( for (; i < end; ++i) { setUnlessOOG(r[i], g[i], b[i], lutToneCurve[r[i]], lutToneCurve[g[i]], lutToneCurve[b[i]]); } + #endif } // 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& ir, float& ig, float& ib) const +inline void AdobeToneCurve::Apply(float& ir, float& ig, float& ib) const { - assert (lutToneCurve); + assert(lutToneCurve); float r = CLIP(ir); float g = CLIP(ig); float b = CLIP(ib); if (r >= g) { - if (g > b) { - RGBTone (r, g, b); // Case 1: r >= g > b + if (g > b) { + RGBTone(r, g, b); // Case 1: r >= g > b } else if (b > r) { - RGBTone (b, r, g); // Case 2: b > r >= g + RGBTone(b, r, g); // Case 2: b > r >= g } else if (b > g) { - RGBTone (r, b, g); // Case 3: r >= b > g + RGBTone(r, b, g); // Case 3: r >= b > g } else { // Case 4: r == g == b r = lutToneCurve[r]; g = lutToneCurve[g]; b = g; } } else { - if (r >= b) { - RGBTone (g, r, b); // Case 5: g > r >= b + if (r >= b) { + RGBTone(g, r, b); // Case 5: g > r >= b } else if (b > g) { - RGBTone (b, g, r); // Case 6: b > g > r + RGBTone(b, g, r); // Case 6: b > g > r } else { - RGBTone (g, b, r); // Case 7: g >= b > r + RGBTone(g, b, r); // Case 7: g >= b > r } } @@ -1120,19 +2019,20 @@ inline void AdobeToneCurve::RGBTone (vfloat& maxval, vfloat& medval, vfloat& min // Modifying the Luminance channel only inline void LuminanceToneCurve::Apply(float &ir, float &ig, float &ib) const { - assert (lutToneCurve); + 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; const float coef = newLuminance / currLuminance; - r = LIM(r * coef, 0.f, 65535.f); - g = LIM(g * coef, 0.f, 65535.f); - b = LIM(b * coef, 0.f, 65535.f); + 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); } @@ -1158,21 +2058,21 @@ inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const #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 vself(eqmask, a1, b + a2 * b3 / a3); + 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 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& ir, float& ig, float& ib) const +inline void WeightedStdToneCurve::Apply(float& ir, float& ig, float& ib) const { - assert (lutToneCurve); + assert(lutToneCurve); float r = CLIP(ir); float g = CLIP(ig); @@ -1190,23 +2090,25 @@ inline void WeightedStdToneCurve::Apply (float& ir, float& ig, float& ib) const float g3 = Triangle(b, b3, g); 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); + 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 { - assert (lutToneCurve); - assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); - assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); +inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const +{ + assert(lutToneCurve); + assert(lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert(lutToneCurve.getClip() & LUT_CLIP_ABOVE); // 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); + 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. @@ -1218,6 +2120,7 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en break; #endif } + Apply(r[i], g[i], b[i]); i++; } @@ -1259,6 +2162,7 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en for (; i < end; ++i) { Apply(r[i], g[i], b[i]); } + #endif } diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 11fe306b8..b65bb5f72 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -1064,9 +1064,11 @@ void DCPProfile::apply( for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { + double temp = 0.0; for (int k = 0; k < 3; ++k) { - mat[i][j] += work_matrix[i][k] * xyz_cam[k][j]; + temp += work_matrix[i][k] * xyz_cam[k][j]; } + mat[i][j] = temp; } } @@ -1092,9 +1094,11 @@ void DCPProfile::apply( for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { + double temp = 0.0; for (int k = 0; k < 3; ++k) { - pro_photo[i][j] += prophoto_xyz[i][k] * xyz_cam[k][j]; + temp += prophoto_xyz[i][k] * xyz_cam[k][j]; } + pro_photo[i][j] = temp; } } @@ -1102,9 +1106,11 @@ void DCPProfile::apply( for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { + double temp = 0.0; for (int k = 0; k < 3; ++k) { - work[i][j] += work_matrix[i][k] * xyz_prophoto[k][j]; + temp += work_matrix[i][k] * xyz_prophoto[k][j]; } + work[i][j] = temp; } } @@ -1173,27 +1179,35 @@ void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use mWork = ICCStore::getInstance()->workingSpaceMatrix (working_space); memset(as_out.data->pro_photo, 0, sizeof(as_out.data->pro_photo)); - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + double temp = 0.0; for (int k = 0; k < 3; k++) { - as_out.data->pro_photo[i][j] += prophoto_xyz[i][k] * mWork[k][j]; + temp += prophoto_xyz[i][k] * mWork[k][j]; } + as_out.data->pro_photo[i][j] = temp; + } + } mWork = ICCStore::getInstance()->workingSpaceInverseMatrix (working_space); memset(as_out.data->work, 0, sizeof(as_out.data->work)); - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + double temp = 0.0; for (int k = 0; k < 3; k++) { - as_out.data->work[i][j] += mWork[i][k] * xyz_prophoto[k][j]; + temp += mWork[i][k] * xyz_prophoto[k][j]; } + as_out.data->work[i][j] = temp; + } + } } } void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int height, int tile_width, const DCPProfileApplyState& as_in) const { -#define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0) +#define FCLIP(a) ((a)>0.f?((a)<65535.5f?(a):65535.5f):0.f) #define CLIP01(a) ((a)>0?((a)<1?(a):1):0) float exp_scale = as_in.data->bl_scale; @@ -1754,7 +1768,7 @@ inline void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vect } } -bool DCPProfile::isValid() +bool DCPProfile::isValid() const { return valid; } @@ -1836,7 +1850,7 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) } } -bool DCPStore::isValidDCPFileName(const Glib::ustring& filename) const +bool DCPStore::isValidDCPFileName(const Glib::ustring& filename) { if (!Glib::file_test(filename, Glib::FILE_TEST_EXISTS) || Glib::file_test(filename, Glib::FILE_TEST_IS_DIR)) { return false; diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 573349348..2aec6da12 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -63,7 +63,7 @@ public: bool getHasBaselineExposureOffset() const; Illuminants getIlluminants() const; - bool isValid(); + bool isValid() const; void apply( Imagefloat* img, @@ -159,7 +159,7 @@ public: void init(const Glib::ustring& rt_profile_dir, bool loadAll = true); - bool isValidDCPFileName(const Glib::ustring& filename) const; + static bool isValidDCPFileName(const Glib::ustring& filename); DCPProfile* getProfile(const Glib::ustring& filename) const; DCPProfile* getStdProfile(const Glib::ustring& camShortName) const; diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 812f122b3..c7bcfc910 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -21,7 +21,6 @@ /*RT*/#define LOCALTIME /*RT*/#define DJGPP /*RT*/#include "jpeg.h" -/*RT*/#include "lj92.h" /*RT*/#ifdef _OPENMP /*RT*/#include /*RT*/#endif @@ -62,12 +61,8 @@ $Date: 2018/06/01 20:36:25 $ */ -#define DCRAW_VERSION "9.28" +//#define DCRAW_VERSION "9.28" -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#define _USE_MATH_DEFINES #include #include #include @@ -94,9 +89,12 @@ #ifdef WIN32 #include #include -#define snprintf _snprintf +#ifndef strcasecmp #define strcasecmp stricmp +#endif +#ifndef strncasecmp #define strncasecmp strnicmp +#endif typedef __int64 INT64; typedef unsigned __int64 UINT64; #else @@ -158,7 +156,6 @@ const float d65_white[3] = { 0.950456, 1, 1.088754 }; #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; } @@ -275,11 +272,7 @@ void CLASS derror() if (feof(ifp)) fprintf (stderr,_("Unexpected end of file\n")); else -#ifdef WIN32 - fprintf (stderr,_("Corrupt data near 0x%I64x\n"), (INT64) ftello(ifp)); -#else fprintf (stderr,_("Corrupt data near 0x%llx\n"), (INT64) ftello(ifp)); -#endif } data_error++; /*RT Issue 2467 longjmp (failure, 1);*/ @@ -929,7 +922,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh) } getbits(-1); } - FORC3 row[c] = (jh->row + ((jrow & 1) + 1) * (jh->wide*jh->clrs*((jrow+c) & 1))); + FORC3 row[c] = jh->row + jh->wide*jh->clrs*((jrow+c) & 1); for (col=0; col < jh->wide; col++) FORC(jh->clrs) { diff = ljpeg_diff (jh->huff[c]); @@ -1132,61 +1125,6 @@ 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; @@ -1405,7 +1343,7 @@ void CLASS nikon_load_raw() void CLASS nikon_yuv_load_raw() { - int row, col, yuv[4], rgb[3], b, c; + int row, col, yuv[4] = {}, rgb[3], b, c; UINT64 bitbuf=0; for (row=0; row < raw_height; row++) @@ -2025,7 +1963,7 @@ void CLASS phase_one_load_raw_c() #endif { int len[2], pred[2]; - IMFILE ifpthr = *ifp; + rtengine::IMFILE ifpthr = *ifp; ifpthr.plistener = nullptr; #ifdef _OPENMP @@ -2052,9 +1990,8 @@ void CLASS phase_one_load_raw_c() } else if ((col & 7) == 0) { for (int i = 0; i < 2; i++) { int j; - for (j = 0; j < 5 && !ph1_bits(1); j++) - ; - if (j--) { + for (j = 0; j < 5 && !ph1_bits(1); j++) ; + if (j--) { len[i] = length[j * 2 + ph1_bits(1)]; } } @@ -2527,6 +2464,30 @@ void CLASS unpacked_load_raw() } } +// RT - from LibRaw +void CLASS unpacked_load_raw_FujiDBP() +/* +for Fuji DBP for GX680, aka DX-2000 + DBP_tile_width = 688; + DBP_tile_height = 3856; + DBP_n_tiles = 8; +*/ +{ + int scan_line, tile_n; + int nTiles = 8; + tile_width = raw_width / nTiles; + ushort *tile; + tile = (ushort *) calloc(raw_height, tile_width * 2); + for (tile_n = 0; tile_n < nTiles; tile_n++) { + read_shorts(tile, tile_width * raw_height); + for (scan_line = 0; scan_line < raw_height; scan_line++) { + memcpy(&raw_image[scan_line * raw_width + tile_n * tile_width], + &tile[scan_line * tile_width], tile_width * 2); + } + } + free(tile); + fseek(ifp, -2, SEEK_CUR); // avoid EOF error +} // RT void CLASS sony_arq_load_raw() @@ -3380,7 +3341,7 @@ void CLASS sony_arw2_load_raw() { uchar *data = new (std::nothrow) uchar[raw_width + 1]; merror(data, "sony_arw2_load_raw()"); - IMFILE ifpthr = *ifp; + rtengine::IMFILE ifpthr = *ifp; int pos = ifpthr.pos; ushort pix[16]; @@ -4092,7 +4053,7 @@ void CLASS foveon_interpolate() FORC3 diag[c][i] = LAST(1,1)*LAST(2,2) - LAST(1,2)*LAST(2,1); #undef LAST FORC3 div[c] = diag[c][0]*0.3127 + diag[c][1]*0.329 + diag[c][2]*0.3583; - sprintf (str, "%sRGBNeutral", model2); + snprintf(str, sizeof(str), "%sRGBNeutral", model2); if (foveon_camf_param ("IncludeBlocks", str)) foveon_fixed (div, 3, str); num = 0; @@ -4460,6 +4421,12 @@ void CLASS crop_masked_pixels() } } } else { + if (height + top_margin > raw_height) { + top_margin = raw_height - MIN(height, raw_height); + } + if (width + left_margin > raw_width) { + left_margin = raw_width - MIN(width, raw_width); + } #ifdef _OPENMP #pragma omp parallel for #endif @@ -5579,9 +5546,11 @@ void CLASS parse_makernote (int base, int uptag) offset = get4(); fseek (ifp, offset-8, SEEK_CUR); } else if (!strcmp (buf,"OLYMPUS") || - !strcmp (buf,"PENTAX ")) { + !strcmp (buf,"PENTAX ") || + !strncmp(buf,"OM SYS",6)) { // From LibRaw base = ftell(ifp)-10; fseek (ifp, -2, SEEK_CUR); + if (buf[1] == 'M') get4(); // From LibRaw order = get2(); if (buf[0] == 'O') get2(); } else if (!strncmp (buf,"SONY",4) || @@ -5627,7 +5596,7 @@ nf: order = 0x4949; 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]; + uchar iso[1] = {}; fread (iso, 1, 1, ifp); iso_speed = 100 * pow(2,(float)iso[0]/12.0-5); } @@ -6118,13 +6087,56 @@ get2_256: offsetChannelBlackLevel2 = save1 + (0x0149 << 1); offsetWhiteLevels = save1 + (0x031c << 1); break; + case 2024: // 1D X Mark III, ColorDataSubVer 32 + // imCanon.ColorDataVer = 10; + imCanon.ColorDataSubVer = get2(); + fseek(ifp, save1 + (0x0055 << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)/*RGGB_2_RGBG(c)*/] = (float)get2(); + // get2(); + // FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2(); + // get2(); + // FORC4 icWBC[LIBRAW_WBI_Measured][RGGB_2_RGBG(c)] = get2(); + // fseek(ifp, save1 + (0x0096 << 1), SEEK_SET); + // Canon_WBpresets(2, 12); + // fseek(ifp, save1 + (0x0118 << 1), SEEK_SET); + // Canon_WBCTpresets(0); + offsetChannelBlackLevel = save1 + (0x0326 << 1); + offsetChannelBlackLevel2 = save1 + (0x0157 << 1); + offsetWhiteLevels = save1 + (0x032a << 1); + break; + case 3656: // EOS R6, ColorDataSubVer 33 + // imCanon.ColorDataVer = 10; + imCanon.ColorDataSubVer = get2(); + + // The constant 0x0055 was found in LibRaw; more specifically by + // spelunking in LibRaw:src/metadata/canon.cpp. + fseek(ifp, save1 + (0x0055 << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + + offsetChannelBlackLevel = save1 + (0x326 << 1); + offsetChannelBlackLevel2 = save1 + (0x157 << 1); + offsetWhiteLevels = save1 + (0x32a << 1); + break; + case 3973: // R3; ColorDataSubVer: 34 + case 3778: // R7, R10; ColorDataSubVer: 48 + // imCanon.ColorDataVer = 11; + imCanon.ColorDataSubVer = get2(); + + fseek(ifp, save1 + ((0x0069+0x0064) << 1), SEEK_SET); + FORC4 cam_mul[c ^ (c >> 1)] = (float)get2(); + + offsetChannelBlackLevel2 = save1 + ((0x0069+0x0102) << 1); + offsetChannelBlackLevel = save1 + ((0x0069+0x0213) << 1); + offsetWhiteLevels = save1 + ((0x0069+0x0217) << 1); + break; } if (offsetChannelBlackLevel) { fseek(ifp, offsetChannelBlackLevel, SEEK_SET); FORC4 - bls += (cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2()); + bls += (RT_canon_levels_data.cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2()); + RT_canon_levels_data.black_ok = true; imCanon.AverageBlackLevel = bls / 4; // RT_blacklevel_from_constant = ThreeValBool::F; } @@ -6136,7 +6148,8 @@ get2_256: imCanon.SpecularWhiteLevel = get2(); // FORC4 // imgdata.color.linear_max[c] = imCanon.SpecularWhiteLevel; - maximum = imCanon.SpecularWhiteLevel; + RT_canon_levels_data.white = imCanon.SpecularWhiteLevel; + RT_canon_levels_data.white_ok = true; // RT_whitelevel_from_constant = ThreeValBool::F; } @@ -6144,7 +6157,8 @@ get2_256: { fseek(ifp, offsetChannelBlackLevel2, SEEK_SET); FORC4 - bls += (cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2()); + bls += (RT_canon_levels_data.cblack/*imCanon.ChannelBlackLevel*/[c ^ (c >> 1)] = get2()); + RT_canon_levels_data.black_ok = true; imCanon.AverageBlackLevel = bls / 4; // RT_blacklevel_from_constant = ThreeValBool::F; } @@ -6209,8 +6223,8 @@ void CLASS parse_exif (int base) case 36867: case 36868: get_timestamp(0); break; case 37377: if ((expo = -getreal(type)) < 128) - tiff_ifd[tiff_nifds-1].shutter = - shutter = pow (2, expo); break; + 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; case 37500: parse_makernote (base, 0); break; @@ -6331,12 +6345,13 @@ void CLASS parse_mos (int offset) void CLASS linear_table (unsigned len) { - int i; - if (len > 0x1000) len = 0x1000; - read_shorts (curve, len); - for (i=len; i < 0x1000; i++) - curve[i] = curve[i-1]; - maximum = curve[0xfff]; + const unsigned maxLen = std::min(0x10000ull, 1ull << tiff_bps); + len = std::min(len, maxLen); + read_shorts(curve, len); + maximum = curve[len - 1]; + for (std::size_t i = len; i < maxLen; ++i) { + curve[i] = maximum; + } } void CLASS parse_kodak_ifd (int base) @@ -6394,7 +6409,7 @@ int CLASS parse_tiff_ifd (int base) 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*/ rtengine::IMFILE *sfp; /*RT*/ int pana_raw = 0; if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0]) @@ -6461,6 +6476,9 @@ int CLASS parse_tiff_ifd (int base) case 3: case 257: case 61442: /* ImageHeight */ tiff_ifd[ifd].height = getint(type); break; + case 254: + tiff_ifd[ifd].new_sub_file_type = getint(type); + break; case 258: /* BitsPerSample */ case 61443: tiff_ifd[ifd].samples = len & 7; @@ -6730,7 +6748,7 @@ int CLASS parse_tiff_ifd (int base) raw_height = height; left_margin = top_margin = filters = flip = 0; } - sprintf (model, "Ixpress %d-Mp", height*width/1000000); + snprintf(model, sizeof(model), "Ixpress %d-Mp", height*width/1000000); load_raw = &CLASS imacon_full_load_raw; if (filters) { if (left_margin & 1) filters = 0x61616161; @@ -6794,14 +6812,17 @@ guess_cfa_pc: linear_table (len); break; case 50713: /* BlackLevelRepeatDim */ + if (tiff_ifd[ifd].new_sub_file_type != 0) break; cblack[4] = get2(); cblack[5] = get2(); if (cblack[4] * cblack[5] > sizeof cblack / sizeof *cblack - 6) cblack[4] = cblack[5] = 1; break; case 61450: + if (tiff_ifd[ifd].new_sub_file_type != 0) break; cblack[4] = cblack[5] = MIN(sqrt(len),64); case 50714: /* BlackLevel */ + if (tiff_ifd[ifd].new_sub_file_type != 0) break; RT_blacklevel_from_constant = ThreeValBool::F; //----------------------------------------------------------------------------- // taken from LibRaw. @@ -6900,7 +6921,7 @@ it under the terms of the one of two licenses as you choose: break; case 50778: case 50779: - if( get2() == 21 ) + if( get2() != 17 ) // 17 is Standard light A cm_D65 = (tag-50778); break; case 50829: /* ActiveArea */ @@ -6919,7 +6940,6 @@ it under the terms of the one of two licenses as you choose: 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(); @@ -6938,8 +6958,48 @@ it under the terms of the one of two licenses as you choose: break; } case 51009: /* OpcodeList2 */ - meta_offset = ftell(ifp); - break; + { + meta_offset = ftell(ifp); + const 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(); + if (opcode == 9 && gainMaps.size() < 4) { + fseek(ifp, 4, SEEK_CUR); // skip 4 bytes as we know that the opcode 4 takes 4 byte + fseek(ifp, 8, SEEK_CUR); // skip 8 bytes as they don't interest us currently + GainMap gainMap; + gainMap.Top = get4(); + gainMap.Left = get4(); + gainMap.Bottom = get4(); + gainMap.Right = get4(); + gainMap.Plane = get4(); + gainMap.Planes = get4(); + gainMap.RowPitch = get4(); + gainMap.ColPitch = get4(); + gainMap.MapPointsV = get4(); + gainMap.MapPointsH = get4(); + gainMap.MapSpacingV = getreal(12); + gainMap.MapSpacingH = getreal(12); + gainMap.MapOriginV = getreal(12); + gainMap.MapOriginH = getreal(12); + gainMap.MapPlanes = get4(); + const std::size_t n = static_cast(gainMap.MapPointsV) * static_cast(gainMap.MapPointsH) * static_cast(gainMap.MapPlanes); + gainMap.MapGain.reserve(n); + for (std::size_t i = 0; i < n; ++i) { + gainMap.MapGain.push_back(getreal(11)); + } + gainMaps.push_back(std::move(gainMap)); + } else { + fseek(ifp, 8, SEEK_CUR); // skip 8 bytes as they don't interest us currently + fseek(ifp, get4(), SEEK_CUR); + } + } + } + order = oldOrder; + break; + } case 64772: /* Kodak P-series */ if (len < 13) break; fseek (ifp, 16, SEEK_CUR); @@ -6958,7 +7018,7 @@ it under the terms of the one of two licenses as you choose: fread (buf, sony_length, 1, ifp); sony_decrypt (buf, sony_length/4, 1, sony_key); sfp = ifp; -/*RT*/ ifp = fopen (buf, sony_length); +/*RT*/ ifp = rtengine::fopen (buf, sony_length); // if ((ifp = tmpfile())) { // fwrite (buf, sony_length, 1, ifp); // fseek (ifp, 0, SEEK_SET); @@ -7095,7 +7155,8 @@ void CLASS apply_tiff() load_flags = 24; 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) { + tiff_bps = 14; + if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { load_flags = 81; tiff_bps = 12; } slr: @@ -7113,7 +7174,7 @@ void CLASS apply_tiff() 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) && + if ((!strncmp(make,"OLYMPUS",7) || !strncmp(make, "OM Digi", 7)) && // OM Digi from LibRaw tiff_ifd[raw].bytes*7 > raw_width*raw_height) load_raw = &CLASS olympus_load_raw; // ------- RT ------- @@ -7168,7 +7229,8 @@ void CLASS apply_tiff() // load_raw = &CLASS packed_load_raw; load_raw = &CLASS nikon_14bit_load_raw; } else - load_raw = &CLASS nikon_load_raw; break; + load_raw = &CLASS nikon_load_raw; + break; case 65535: load_raw = &CLASS pentax_load_raw; break; case 65000: @@ -7264,7 +7326,7 @@ void CLASS parse_external_jpeg() { const char *file, *ext; char *jname, *jfile, *jext; -/*RT*/ IMFILE *save=ifp; +/*RT*/ rtengine::IMFILE *save=ifp; ext = strrchr (ifname, '.'); file = strrchr (ifname, '/'); @@ -7292,7 +7354,7 @@ void CLASS parse_external_jpeg() *jext = '0'; } if (strcmp (jname, ifname)) { -/*RT*/ if ((ifp = fopen (jname))) { +/*RT*/ if ((ifp = rtengine::fopen (jname))) { // if ((ifp = fopen (jname, "rb"))) { if (verbose) fprintf (stderr,_("Reading metadata from %s ...\n"), jname); @@ -7722,7 +7784,7 @@ void CLASS parse_smal (int offset, int fsize) raw_height = height = get2(); raw_width = width = get2(); strcpy (make, "SMaL"); - sprintf (model, "v%d %dx%d", ver, width, height); + snprintf(model, sizeof(model), "v%d %dx%d", ver, width, height); if (ver == 6) load_raw = &CLASS smal_v6_load_raw; if (ver == 9) load_raw = &CLASS smal_v9_load_raw; } @@ -7750,7 +7812,7 @@ void CLASS parse_cine() } fseek (ifp, off_setup+792, SEEK_SET); strcpy (make, "CINE"); - sprintf (model, "%d", get4()); + snprintf(model, sizeof(model), "%d", get4()); fseek (ifp, 12, SEEK_CUR); switch ((i=get4()) & 0xffffff) { case 3: filters = 0x94949494; break; @@ -8644,6 +8706,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10901,-4095,-1074,-1141,9208,2293,-62,1417,5158 } }, { "Olympus XZ-2", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, + { "OM Digital Solutions OM-1", 0, 0, + { 9488, -3984, -714, -2887, 10945, 2229, -137, 960, 5786 } }, // From LibRaw { "OmniVision", 0, 0, /* DJC */ { 12782,-4059,-379,-478,9066,1413,1340,1513,5176 } }, { "Pentax *ist DL2", 0, 0, @@ -9063,7 +9127,7 @@ void CLASS adobe_coeff (const char *make, const char *model) char name[130]; int i, j; - sprintf (name, "%s %s", make, model); + snprintf(name, sizeof(name), "%s %s", make, model); // -- RT -------------------------------------------------------------------- @@ -9083,11 +9147,24 @@ void CLASS adobe_coeff (const char *make, const char *model) 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 (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_blacklevel_from_constant == ThreeValBool::T && table[i].black) { + if (RT_canon_levels_data.black_ok) { + unsigned c; + FORC4 RT_canon_levels_data.cblack[c] = (ushort) table[i].black; + } else { + black = (ushort) table[i].black; + } + } + if (RT_whitelevel_from_constant == ThreeValBool::T && table[i].maximum) { + if (RT_canon_levels_data.white_ok) { + RT_canon_levels_data.white = (ushort) table[i].maximum; + } else { + 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; @@ -9098,6 +9175,8 @@ void CLASS adobe_coeff (const char *make, const char *model) if (load_raw == &CLASS sony_arw2_load_raw) { // RT: arw2 scale fix black <<= 2; tiff_bps += 2; + } else if (load_raw == &CLASS panasonic_load_raw) { + tiff_bps = RT_pana_info.bpp; } { /* Check for RawTherapee table overrides and extensions */ int black_level, white_level; @@ -9234,6 +9313,7 @@ void CLASS identify() { 3944, 2622, 30, 18, 6, 2 }, { 3948, 2622, 42, 18, 0, 2 }, { 3984, 2622, 76, 20, 0, 2, 14 }, + { 4032, 2656, 112, 44, 10, 0 }, { 4104, 3048, 48, 12, 24, 12 }, { 4116, 2178, 4, 2, 0, 0 }, { 4152, 2772, 192, 12, 0, 0 }, @@ -9571,7 +9651,7 @@ void CLASS identify() apply_tiff(); if (!strcmp(model, "X-T3")) { height = raw_height - 2; - } else if (!strcmp(model, "GFX 100")) { + } else if (!strcmp(model, "GFX 100") || !strcmp(model, "GFX100S")) { load_flags = 0; } if (!load_raw) { @@ -9727,9 +9807,9 @@ void CLASS identify() if (!strncasecmp (model, make, i) && model[i++] == ' ') memmove (model, model+i, 64-i); if (!strncmp (model,"FinePix ",8)) - strcpy (model, model+8); +/* RT */ memmove (model, model+8, 64-8); if (!strncmp (model,"Digital Camera ",15)) - strcpy (model, model+15); +/* RT */ memmove (model, model+15, 64-15); desc[511] = artist[63] = make[63] = model[63] = model2[63] = 0; if (!is_raw) goto notraw; @@ -9764,6 +9844,8 @@ void CLASS identify() if(!dng_version) {top_margin = 18; height -= top_margin; } if (height == 3014 && width == 4096) /* Ricoh GX200 */ width = 4014; + if (height == 3280 && width == 4992 && !strncmp(model, "D5100", 5)) + { --height; } // Last row contains corrupt data. See issue #5654. if (dng_version) { if (filters == UINT_MAX) filters = 0; if (filters) is_raw *= tiff_samples; @@ -9771,7 +9853,7 @@ void CLASS identify() switch (tiff_compress) { case 0: case 1: load_raw = &CLASS packed_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 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; @@ -9868,6 +9950,8 @@ void CLASS identify() filters = 0; tiff_samples = colors = 3; load_raw = &CLASS canon_sraw_load_raw; + //FORC4 cblack[c] = 0; // ALB + RT_canon_levels_data.black_ok = RT_canon_levels_data.white_ok = false; } else if (!strcmp(model,"PowerShot 600")) { height = 613; width = 854; @@ -10047,13 +10131,29 @@ canon_a5: } else if (!strncmp(model, "X-A3", 4) || !strncmp(model, "X-A5", 4)) { width = raw_width = 6016; height = raw_height = 4014; + } else if (!strcmp(model, "X-Pro3") || !strcmp(model, "X-T3") || !strcmp(model, "X-T30") || !strcmp(model, "X-T4") || !strcmp(model, "X100V") || !strcmp(model, "X-S10")) { + width = raw_width = 6384; + height = raw_height = 4182; + } else if (!strcmp(model, "DBP for GX680")) { // Special case for #4204 + width = raw_width = 5504; + height = raw_height = 3856; } - top_margin = (raw_height - height) >> 2 << 1; - left_margin = (raw_width - width ) >> 2 << 1; + top_margin = (raw_height - MIN(height, raw_height)) >> 2 << 1; + left_margin = (raw_width - MIN(width, raw_width) ) >> 2 << 1; if (width == 2848 || width == 3664) filters = 0x16161616; 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 (width == 5504) { // #4204, taken from LibRaw + left_margin = 32; + top_margin = 8; + width = raw_width - 2*left_margin; + height = raw_height - 2*top_margin; + load_raw = &CLASS unpacked_load_raw_FujiDBP; + filters = 0x16161616; + load_flags = 0; + flip = 6; + } if (!strcmp(model,"HS50EXR") || !strcmp(model,"F900EXR")) { width += 2; @@ -10107,7 +10207,6 @@ konica_400z: } } else if (!strcmp(model,"*ist D")) { load_raw = &CLASS unpacked_load_raw; - data_error = -1; } else if (!strcmp(model,"*ist DS")) { height -= 2; } else if (!strcmp(make,"Samsung") && raw_width == 4704) { @@ -10521,7 +10620,7 @@ bw: colors = 1; load_raw = &CLASS rollei_load_raw; } if (!model[0]) - sprintf (model, "%dx%d", width, height); + snprintf(model, sizeof(model), "%dx%d", width, height); if (filters == UINT_MAX) filters = 0x94949494; if (thumb_offset && !thumb_height) { fseek (ifp, thumb_offset, SEEK_SET); @@ -10531,6 +10630,14 @@ bw: colors = 1; } } dng_skip: + if (!dng_version && is_raw) { + if (RT_canon_levels_data.black_ok) { + FORC4 cblack[c] = RT_canon_levels_data.cblack[c]; + } + if (RT_canon_levels_data.white_ok) { + maximum = RT_canon_levels_data.white; + } + } if ((use_camera_matrix & (use_camera_wb || dng_version)) && cmatrix[0][0] > 0.125 && strncmp(RT_software.c_str(), "Adobe DNG Converter", 19) != 0 @@ -11015,13 +11122,76 @@ void CLASS nikon_14bit_load_raw() free(buf); } +bool CLASS isGainMapSupported() const { + if (!(dng_version && isBayer())) { + return false; + } + const auto n = gainMaps.size(); + if (n != 4) { // we need 4 gainmaps for bayer files + if (rtengine::settings->verbose) { + std::cout << "GainMap has " << n << " maps, but 4 are needed" << std::endl; + } + return false; + } + unsigned int check = 0; + bool noOp = true; + for (const auto &m : gainMaps) { + if (m.MapGain.size() < 1) { + if (rtengine::settings->verbose) { + std::cout << "GainMap has invalid size of " << m.MapGain.size() << std::endl; + } + return false; + } + if (m.MapGain.size() != static_cast(m.MapPointsV) * static_cast(m.MapPointsH) * static_cast(m.MapPlanes)) { + if (rtengine::settings->verbose) { + std::cout << "GainMap has size of " << m.MapGain.size() << ", but needs " << m.MapPointsV * m.MapPointsH * m.MapPlanes << std::endl; + } + return false; + } + if (m.RowPitch != 2 || m.ColPitch != 2) { + if (rtengine::settings->verbose) { + std::cout << "GainMap needs Row/ColPitch of 2/2, but has " << m.RowPitch << "/" << m.ColPitch << std::endl; + } + return false; + } + if (m.Top == 0){ + if (m.Left == 0) { + check += 1; + } else if (m.Left == 1) { + check += 2; + } + } else if (m.Top == 1) { + if (m.Left == 0) { + check += 4; + } else if (m.Left == 1) { + check += 8; + } + } + for (size_t i = 0; noOp && i < m.MapGain.size(); ++i) { + if (m.MapGain[i] != 1.f) { // we have at least one value != 1.f => map is not a nop + noOp = false; + } + } + } + if (noOp || check != 15) { // all maps are nops or the structure of the combination of 4 maps is not correct + if (rtengine::settings->verbose) { + if (noOp) { + std::cout << "GainMap is a nop" << std::endl; + } else { + std::cout << "GainMap has unsupported type : " << check << std::endl; + } + } + return false; + } + return true; +} + /* 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 #ifdef __GNUC__ #pragma GCC diagnostic pop diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 89c1fcaff..aadc0b969 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -19,9 +19,13 @@ #pragma once +#include +#include + #include "myfile.h" #include - +#include "dnggainmap.h" +#include "settings.h" class DCraw { @@ -73,7 +77,7 @@ public: protected: int exif_base, ciff_base, ciff_len; - IMFILE *ifp; + rtengine::IMFILE *ifp; FILE *ofp; short order; const char *ifname; @@ -125,7 +129,7 @@ protected: int cur_buf_size; // buffer size uchar *cur_buf; // currently read block int fillbytes; // Counter to add extra byte for block size N*16 - IMFILE *input; + rtengine::IMFILE *input; struct int_pair grad_even[3][41]; // tables of gradients struct int_pair grad_odd[3][41]; ushort *linealloc; @@ -165,6 +169,8 @@ protected: PanasonicRW2Info(): bpp(0), encoding(0) {} }; PanasonicRW2Info RT_pana_info; + std::vector gainMaps; + public: struct CanonCR3Data { // contents of tag CMP1 for relevant track in CR3 file @@ -182,18 +188,41 @@ public: int32_t hasTileCols; int32_t hasTileRows; int32_t mdatHdrSize; + int32_t medianBits; // Not from header, but from datastream uint32_t MediaSize; int64_t MediaOffset; uint32_t MediaType; /* 1 -> /C/RAW, 2-> JPEG */ }; - static constexpr size_t CRXTRACKS_MAXCOUNT = 16; + static constexpr int CRXTRACKS_MAXCOUNT = 16; crx_data_header_t crx_header[CRXTRACKS_MAXCOUNT]; - unsigned int crx_track_selected; + int crx_track_selected; short CR3_CTMDtag; }; + + bool isBayer() const + { + return (filters != 0 && filters != 9); + } + + const std::vector& getGainMaps() const { + return gainMaps; + } + + bool isGainMapSupported() const; + + struct CanonLevelsData { + unsigned cblack[4]; + unsigned white; + bool black_ok; + bool white_ok; + CanonLevelsData(): cblack{0}, white{0}, black_ok(false), white_ok(false) {} + }; + protected: CanonCR3Data RT_canon_CR3_data; + + CanonLevelsData RT_canon_levels_data; float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; @@ -209,7 +238,7 @@ protected: } first_decode[2048], *second_decode, *free_decode; struct tiff_ifd { - int width, height, bps, comp, phint, offset, flip, samples, bytes; + int new_sub_file_type, width, height, bps, comp, phint, offset, flip, samples, bytes; int tile_width, tile_length, sample_format, predictor; float shutter; } tiff_ifd[10]; @@ -278,7 +307,7 @@ void parse_redcine(); class getbithuff_t { public: - getbithuff_t(DCraw *p,IMFILE *&i, unsigned &z):parent(p),bitbuf(0),vbits(0),reset(0),ifp(i),zero_after_ff(z){} + getbithuff_t(DCraw *p,rtengine::IMFILE *&i, unsigned &z):parent(p),bitbuf(0),vbits(0),reset(0),ifp(i),zero_after_ff(z){} unsigned operator()(int nbits, ushort *huff); private: @@ -288,7 +317,7 @@ private: DCraw *parent; unsigned bitbuf; int vbits, reset; - IMFILE *&ifp; + rtengine::IMFILE *&ifp; unsigned &zero_after_ff; }; getbithuff_t getbithuff; @@ -296,7 +325,7 @@ getbithuff_t getbithuff; class nikbithuff_t { public: - explicit nikbithuff_t(IMFILE *&i):bitbuf(0),errors(0),vbits(0),ifp(i){} + explicit nikbithuff_t(rtengine::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; } @@ -309,7 +338,7 @@ private: } unsigned bitbuf, errors; int vbits; - IMFILE *&ifp; + rtengine::IMFILE *&ifp; }; nikbithuff_t nikbithuff; @@ -329,7 +358,6 @@ 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); @@ -378,7 +406,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):order(o),ifp(i),bitbuf(0),vbits(0){} + ph1_bithuff_t(DCraw *p, rtengine::IMFILE *i, short &o):order(o),ifp(i),bitbuf(0),vbits(0){} unsigned operator()(int nbits, ushort *huff); unsigned operator()(int nbits); unsigned operator()(); @@ -412,7 +440,7 @@ private: } short ℴ - IMFILE* const ifp; + rtengine::IMFILE* const ifp; UINT64 bitbuf; int vbits; }; @@ -423,6 +451,7 @@ void parse_hasselblad_gain(); void hasselblad_load_raw(); void leaf_hdr_load_raw(); void unpacked_load_raw(); +void unpacked_load_raw_FujiDBP(); void sinar_4shot_load_raw(); void imacon_full_load_raw(); void packed_load_raw(); @@ -430,11 +459,11 @@ void nokia_load_raw(); class pana_bits_t{ public: - pana_bits_t(IMFILE *i, unsigned &u, unsigned enc): + pana_bits_t(rtengine::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; + rtengine::IMFILE *ifp; unsigned &load_flags; uchar buf[0x4000]; int vbits; @@ -566,13 +595,13 @@ void parse_canon_cr3(); void selectCRXTrack(unsigned short maxTrack); int parseCR3(unsigned long long oAtomList, unsigned long long szAtomList, short &nesting, - char *AtomNameStack, unsigned short &nTrack, short &TrackType); + char *AtomNameStack, short &nTrack, short &TrackType); bool crxDecodePlane(void *p, uint32_t planeNumber); void crxLoadDecodeLoop(void *img, int nPlanes); void crxConvertPlaneLineDf(void *p, int imageRow); void crxLoadFinalizeLoopE3(void *p, int planeHeight); void crxLoadRaw(); -bool crxParseImageHeader(uchar *cmp1TagData, unsigned int nTrack); +bool crxParseImageHeader(uchar *cmp1TagData, int nTrack, int size); //----------------------------------------------------------------------------- }; diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index a6889b954..bce6f2291 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -18,20 +18,29 @@ * along with RawTherapee. If not, see . */ +#include +#include + #include "cieimage.h" +#include "color.h" #include "curves.h" #include "dcp.h" #include "dcrop.h" +#include "guidedfilter.h" #include "image8.h" #include "imagefloat.h" +#include "improccoordinator.h" #include "labimage.h" #include "mytime.h" #include "procparams.h" #include "refreshmap.h" #include "rt_math.h" +#include "utils.h" #include "../rtgui/editcallbacks.h" +#pragma GCC diagnostic warning "-Wall" +#pragma GCC diagnostic warning "-Wextra" namespace { @@ -48,8 +57,8 @@ namespace rtengine { Crop::Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow) - : PipetteBuffer(editDataProvider), origCrop(nullptr), laboCrop(nullptr), labnCrop(nullptr), - cropImg (nullptr), transCrop (nullptr), cieCrop (nullptr), + : PipetteBuffer(editDataProvider), origCrop(nullptr), spotCrop(nullptr), laboCrop(nullptr), labnCrop(nullptr), + cropImg(nullptr), shbuf_real(nullptr), transCrop(nullptr), cieCrop(nullptr), shbuffer(nullptr), updating(false), newUpdatePending(false), skip(10), cropx(0), cropy(0), cropw(-1), croph(-1), trafx(0), trafy(0), trafw(-1), trafh(-1), @@ -92,7 +101,7 @@ void Crop::setListener(DetailedCropListener* il) } } -EditUniqueID Crop::getCurrEditID() +EditUniqueID Crop::getCurrEditID() const { const EditSubscriber *subscriber = PipetteBuffer::dataProvider ? PipetteBuffer::dataProvider->getCurrSubscriber() : nullptr; return subscriber ? subscriber->getEditID() : EUID_None; @@ -147,6 +156,7 @@ 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; const bool overrideWindow = cropImageListener; + bool spotsDone = false; if (overrideWindow) { cropImageListener->getWindow(wx, wy, ww, wh, ws); @@ -173,8 +183,6 @@ void Crop::update(int todo) int widIm = parent->fw;//full image int heiIm = parent->fh; - bool needstransform = parent->ipf.needsTransform(); - if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock lock(parent->minit); // Also used in improccoord @@ -184,8 +192,8 @@ void Crop::update(int todo) setCropSizes(rqcropx, rqcropy, rqcropw, rqcroph, skip, true); } - // printf("x=%d y=%d crow=%d croh=%d skip=%d\n",rqcropx, rqcropy, rqcropw, rqcroph, skip); - // printf("trafx=%d trafyy=%d trafwsk=%d trafHs=%d \n",trafx, trafy, trafw*skip, trafh*skip); + // printf("x=%d y=%d crow=%d croh=%d skip=%d\n",rqcropx, rqcropy, rqcropw, rqcroph, skip); + // printf("trafx=%d trafyy=%d trafwsk=%d trafHs=%d \n",trafx, trafy, trafw*skip, trafh*skip); Imagefloat *calclum = nullptr;//for Luminance denoise curve NoiseCurve noiseLCurve; @@ -223,18 +231,18 @@ 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); + parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw, 0); } } 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); + parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw, 0); } } 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); + parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw, 0); if ((!isDetailWindow) && parent->adnListener && skip == 1 && params.dirpyrDenoise.enabled) { float lowdenoise = 1.f; @@ -276,7 +284,7 @@ void Crop::update(int todo) crW = 250; } - // if(settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int((tileWskip/2));}//adapted to scale of preview + // if (settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int((tileWskip/2));}//adapted to scale of preview if (settings->leveldnv == 2) { crW = int (tileWskip / 2); } @@ -400,7 +408,7 @@ void Crop::update(int todo) crH = 250; } - // if(settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int((tileWskip/2));}//adapted to scale of preview + // if (settings->leveldnv ==2) {crW=int(tileWskip/2);crH=int((tileWskip/2));}//adapted to scale of preview if (settings->leveldnv == 2) { crW = int (tileWskip / 2); crH = int (tileHskip / 2); @@ -446,7 +454,7 @@ 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); + parent->imgsrc->getImage(parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.raw, 0); // we only need image reduced to 1/4 here for (int ii = 0; ii < crH; ii += 2) { @@ -592,7 +600,6 @@ void Crop::update(int todo) params.dirpyrDenoise.redchro = maxr; params.dirpyrDenoise.bluechro = maxb; parent->denoiseInfoStore.valid = true; - if (parent->adnListener) { parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro); } @@ -605,10 +612,17 @@ void Crop::update(int todo) //end evaluate noise } - // if(params.dirpyrDenoise.Cmethod=="AUT" || params.dirpyrDenoise.Cmethod=="PON") {//reinit origCrop after Auto + // 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); + parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw, 0); + } + + if ((todo & M_SPOT) && params.spot.enabled && !params.spot.entries.empty()) { + spotsDone = true; + PreviewProps pp(trafx, trafy, trafw * skip, trafh * skip, skip); + //parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw); + parent->ipf.removeSpots(origCrop, parent->imgsrc, params.spot.entries, pp, parent->currWB, nullptr, tr); } DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; @@ -644,7 +658,8 @@ void Crop::update(int todo) parent->adnListener->noiseChanged(0.f, 0.f); } - if (todo & M_LINDENOISE) { + if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { + if (skip == 1 && denoiseParams.enabled) { float nresi, highresi; @@ -667,8 +682,16 @@ void Crop::update(int todo) } } + if (params.filmNegative.enabled && params.filmNegative.colorSpace == FilmNegativeParams::ColorSpace::INPUT) { + parent->ipf.filmNegativeProcess(baseCrop, baseCrop, params.filmNegative); + } + parent->imgsrc->convertColorSpace(origCrop, params.icm, parent->currWB); + if (params.filmNegative.enabled && params.filmNegative.colorSpace != FilmNegativeParams::ColorSpace::INPUT) { + parent->ipf.filmNegativeProcess(baseCrop, baseCrop, params.filmNegative); + } + delete [] min_r; delete [] min_b; delete [] lumL; @@ -684,6 +707,28 @@ 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); + // Apply Spot removal + if ((todo & M_SPOT) && !spotsDone) { + if (params.spot.enabled && !params.spot.entries.empty()) { + if(!spotCrop) { + spotCrop = new Imagefloat (cropw, croph); + } + baseCrop->copyData (spotCrop); + PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); + int tr = getCoarseBitMask(params.coarse); + parent->ipf.removeSpots (spotCrop, parent->imgsrc, params.spot.entries, pp, parent->currWB, ¶ms.icm, tr); + } else { + if (spotCrop) { + delete spotCrop; + spotCrop = nullptr; + } + } + } + + if (spotCrop) { + baseCrop = spotCrop; + } + std::unique_ptr fattalCrop; if ((todo & M_HDR) && (params.fattal.enabled || params.dehaze.enabled)) { @@ -706,10 +751,10 @@ void Crop::update(int todo) fattalCrop.reset(f); PreviewProps pp(0, 0, parent->fw, parent->fh, skip); int tr = getCoarseBitMask(params.coarse); - parent->imgsrc->getImage(parent->currWB, tr, f, pp, params.toneCurve, params.raw); + parent->imgsrc->getImage(parent->currWB, tr, f, pp, params.toneCurve, params.raw, 0); parent->imgsrc->convertColorSpace(f, params.icm, parent->currWB); - if (params.dirpyrDenoise.enabled) { + if (params.dirpyrDenoise.enabled || params.filmNegative.enabled || params.spot.enabled) { // copy the denoised crop int oy = trafy / skip; int ox = trafx / skip; @@ -735,8 +780,8 @@ void Crop::update(int todo) } if (need_fattal) { - parent->ipf.dehaze(f); - parent->ipf.ToneMapFattal02(f); + parent->ipf.dehaze(f, params.dehaze); + parent->ipf.ToneMapFattal02(f, params.fattal, 3, 0, nullptr, 0, 0, 0); } // crop back to the size expected by the rest of the pipeline @@ -766,8 +811,9 @@ void Crop::update(int todo) } } + const bool needstransform = parent->ipf.needsTransform(skips(parent->fw, skip), skips(parent->fh, skip), parent->imgsrc->getRotateDegree(), parent->imgsrc->getMetaData()); // transform - if (needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) { + if (needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) { if (!transCrop) { transCrop = new Imagefloat(cropw, croph); } @@ -784,10 +830,7 @@ void Crop::update(int todo) baseCrop = transCrop; } } else { - if (transCrop) { - delete transCrop; - } - + delete transCrop; transCrop = nullptr; } @@ -802,59 +845,455 @@ void Crop::update(int todo) } - if (todo & M_RGBCURVE) { - Imagefloat *workingCrop = baseCrop; - if (params.icm.workingTRC == "Custom") { //exec TRC IN free - const Glib::ustring profile = params.icm.workingProfile; + if ((todo & (M_AUTOEXP | M_RGBCURVE)) && params.locallab.enabled && !params.locallab.spots.empty()) { - 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); + //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. + parent->ipf.rgb2lab(*baseCrop, *laboCrop, params.icm.workingProfile); + + + labnCrop->CopyFrom(laboCrop); + + const std::unique_ptr reservCrop(new LabImage(*laboCrop, true)); + const std::unique_ptr lastorigCrop(new LabImage(*laboCrop, true)); + std::unique_ptr savenormtmCrop; + std::unique_ptr savenormretiCrop; + auto& lllocalcurve2 = parent->lllocalcurve; + auto& cllocalcurve2 = parent->cllocalcurve; + auto& lclocalcurve2 = parent->lclocalcurve; + auto& cclocalcurve2 = parent->cclocalcurve; + auto& rgblocalcurve2 = parent->rgblocalcurve; + auto& exlocalcurve2 = parent->exlocalcurve; + auto& lmasklocalcurve2 = parent->lmasklocalcurve; + auto& lmaskexplocalcurve2 = parent->lmaskexplocalcurve; + auto& lmaskSHlocalcurve2 = parent->lmaskSHlocalcurve; + auto& lmaskviblocalcurve2 = parent->lmaskviblocalcurve; + auto& lmasktmlocalcurve2 = parent->lmasktmlocalcurve; + auto& lmaskretilocalcurve2 = parent->lmaskretilocalcurve; + auto& lmaskcblocalcurve2 = parent->lmaskcblocalcurve; + auto& lmaskbllocalcurve2 = parent->lmaskbllocalcurve; + auto& lmasklclocalcurve2 = parent->lmasklclocalcurve; + auto& lmaskloglocalcurve2 = parent->lmaskloglocalcurve; + auto& lmaskcielocalcurve2 = parent->lmaskcielocalcurve; + auto& cielocalcurve2 = parent->cielocalcurve; + auto& cielocalcurve22 = parent->cielocalcurve2; + auto& jzlocalcurve2 = parent->jzlocalcurve; + auto& czlocalcurve2 = parent->czlocalcurve; + auto& czjzlocalcurve2 = parent->czjzlocalcurve; + auto& hltonecurveloc2 = parent->hltonecurveloc; + auto& shtonecurveloc2 = parent->shtonecurveloc; + auto& tonecurveloc2 = parent->tonecurveloc; + auto& lightCurveloc2 = parent->lightCurveloc; + auto& locRETgainCurve = parent->locRETgainCurve; + auto& locRETtransCurve = parent->locRETtransCurve; + auto& loclhCurve = parent->loclhCurve; + auto& lochhCurve = parent->lochhCurve; + auto& locchCurve = parent->locchCurve; + auto& lochhCurvejz = parent->lochhCurvejz; + auto& locchCurvejz = parent->locchCurvejz; + auto& loclhCurvejz = parent->loclhCurvejz; + auto& locccmasCurve = parent->locccmasCurve; + auto& locllmasCurve = parent->locllmasCurve; + auto& lochhmasCurve = parent->lochhmasCurve; + auto& lochhhmasCurve = parent->lochhhmasCurve; + auto& locccmasexpCurve = parent->locccmasexpCurve; + auto& locllmasexpCurve = parent->locllmasexpCurve; + auto& lochhmasexpCurve = parent->lochhmasexpCurve; + auto& locccmasSHCurve = parent->locccmasSHCurve; + auto& locllmasSHCurve = parent->locllmasSHCurve; + auto& lochhmasSHCurve = parent->lochhmasSHCurve; + auto& locccmasvibCurve = parent->locccmasvibCurve; + auto& locllmasvibCurve = parent->locllmasvibCurve; + auto& lochhmasvibCurve = parent->lochhmasvibCurve; + auto& locccmaslcCurve = parent->locccmaslcCurve; + auto& locllmaslcCurve = parent->locllmaslcCurve; + auto& lochhmaslcCurve = parent->lochhmaslcCurve; + auto& locccmascbCurve = parent->locccmascbCurve; + auto& locllmascbCurve = parent->locllmascbCurve; + auto& lochhmascbCurve = parent->lochhmascbCurve; + auto& locccmasretiCurve = parent->locccmasretiCurve; + auto& locllmasretiCurve = parent->locllmasretiCurve; + auto& lochhmasretiCurve = parent->lochhmasretiCurve; + auto& locccmastmCurve = parent->locccmastmCurve; + auto& locllmastmCurve = parent->locllmastmCurve; + auto& lochhmastmCurve = parent->lochhmastmCurve; + auto& locccmasblCurve = parent->locccmasblCurve; + auto& locllmasblCurve = parent->locllmasblCurve; + auto& lochhmasblCurve = parent->lochhmasblCurve; + auto& locccmaslogCurve = parent->locccmaslogCurve; + auto& locllmaslogCurve = parent->locllmaslogCurve; + auto& lochhmaslogCurve = parent->lochhmaslogCurve; + auto& locccmascieCurve = parent->locccmascieCurve; + auto& locllmascieCurve = parent->locllmascieCurve; + auto& lochhmascieCurve = parent->lochhmascieCurve; + + auto& locccmas_Curve = parent->locccmas_Curve; + auto& locllmas_Curve = parent->locllmas_Curve; + auto& lochhmas_Curve = parent->lochhmas_Curve; + auto& lochhhmas_Curve = parent->lochhhmas_Curve; + auto& locwavCurve = parent->locwavCurve; + auto& locwavCurvejz = parent->locwavCurvejz; + auto& loclmasCurveblwav = parent->loclmasCurveblwav; + auto& loclmasCurvecolwav = parent->loclmasCurvecolwav; + auto& loclevwavCurve = parent->loclevwavCurve; + auto& locconwavCurve = parent->locconwavCurve; + auto& loccompwavCurve = parent->loccompwavCurve; + auto& loccomprewavCurve = parent->loccomprewavCurve; + auto& locedgwavCurve = parent->locedgwavCurve; + auto& locwavCurvehue = parent->locwavCurvehue; + auto& locwavCurveden = parent->locwavCurveden; + auto& lmasklocal_curve2 = parent->lmasklocal_curve; + auto& loclmasCurve_wav = parent->loclmasCurve_wav; + + for (int sp = 0; sp < (int)params.locallab.spots.size(); sp++) { + locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); + locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve); + const bool LHutili = loclhCurve.Set(params.locallab.spots.at(sp).LHcurve); + const bool HHutili = lochhCurve.Set(params.locallab.spots.at(sp).HHcurve); + const bool CHutili = locchCurve.Set(params.locallab.spots.at(sp).CHcurve); + const bool HHutilijz = lochhCurvejz.Set(params.locallab.spots.at(sp).HHcurvejz); + const bool CHutilijz = locchCurvejz.Set(params.locallab.spots.at(sp).CHcurvejz); + const bool LHutilijz = loclhCurvejz.Set(params.locallab.spots.at(sp).LHcurvejz); + const bool lcmasutili = locccmasCurve.Set(params.locallab.spots.at(sp).CCmaskcurve); + const bool llmasutili = locllmasCurve.Set(params.locallab.spots.at(sp).LLmaskcurve); + const bool lhmasutili = lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); + const bool lhhmasutili = lochhhmasCurve.Set(params.locallab.spots.at(sp).HHhmaskcurve); + const bool lcmasexputili = locccmasexpCurve.Set(params.locallab.spots.at(sp).CCmaskexpcurve); + const bool llmasexputili = locllmasexpCurve.Set(params.locallab.spots.at(sp).LLmaskexpcurve); + const bool lhmasexputili = lochhmasexpCurve.Set(params.locallab.spots.at(sp).HHmaskexpcurve); + const bool lcmasSHutili = locccmasSHCurve.Set(params.locallab.spots.at(sp).CCmaskSHcurve); + const bool llmasSHutili = locllmasSHCurve.Set(params.locallab.spots.at(sp).LLmaskSHcurve); + const bool lhmasSHutili = lochhmasSHCurve.Set(params.locallab.spots.at(sp).HHmaskSHcurve); + const bool lcmasvibutili = locccmasvibCurve.Set(params.locallab.spots.at(sp).CCmaskvibcurve); + const bool llmasvibutili = locllmasvibCurve.Set(params.locallab.spots.at(sp).LLmaskvibcurve); + const bool lhmasvibutili = lochhmasvibCurve.Set(params.locallab.spots.at(sp).HHmaskvibcurve); + const bool lcmascbutili = locccmascbCurve.Set(params.locallab.spots.at(sp).CCmaskcbcurve); + const bool llmascbutili = locllmascbCurve.Set(params.locallab.spots.at(sp).LLmaskcbcurve); + const bool lhmascbutili = lochhmascbCurve.Set(params.locallab.spots.at(sp).HHmaskcbcurve); + const bool lcmasretiutili = locccmasretiCurve.Set(params.locallab.spots.at(sp).CCmaskreticurve); + const bool llmasretiutili = locllmasretiCurve.Set(params.locallab.spots.at(sp).LLmaskreticurve); + const bool lhmasretiutili = lochhmasretiCurve.Set(params.locallab.spots.at(sp).HHmaskreticurve); + const bool lcmastmutili = locccmastmCurve.Set(params.locallab.spots.at(sp).CCmasktmcurve); + const bool llmastmutili = locllmastmCurve.Set(params.locallab.spots.at(sp).LLmasktmcurve); + const bool lhmastmutili = lochhmastmCurve.Set(params.locallab.spots.at(sp).HHmasktmcurve); + const bool lcmasblutili = locccmasblCurve.Set(params.locallab.spots.at(sp).CCmaskblcurve); + const bool llmasblutili = locllmasblCurve.Set(params.locallab.spots.at(sp).LLmaskblcurve); + const bool lhmasblutili = lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve); + const bool lcmaslogutili = locccmaslogCurve.Set(params.locallab.spots.at(sp).CCmaskcurveL); + const bool llmaslogutili = locllmaslogCurve.Set(params.locallab.spots.at(sp).LLmaskcurveL); + const bool lhmaslogutili = lochhmaslogCurve.Set(params.locallab.spots.at(sp).HHmaskcurveL); + const bool lcmascieutili = locccmascieCurve.Set(params.locallab.spots.at(sp).CCmaskciecurve); + const bool llmascieutili = locllmascieCurve.Set(params.locallab.spots.at(sp).LLmaskciecurve); + const bool lhmascieutili = lochhmascieCurve.Set(params.locallab.spots.at(sp).HHmaskciecurve); + + const bool lcmas_utili = locccmas_Curve.Set(params.locallab.spots.at(sp).CCmask_curve); + const bool llmas_utili = locllmas_Curve.Set(params.locallab.spots.at(sp).LLmask_curve); + const bool lhmas_utili = lochhmas_Curve.Set(params.locallab.spots.at(sp).HHmask_curve); + const bool lhhmas_utili = lochhhmas_Curve.Set(params.locallab.spots.at(sp).HHhmask_curve); + const bool lmasutili_wav = loclmasCurve_wav.Set(params.locallab.spots.at(sp).LLmask_curvewav); + const bool lmasutiliblwav = loclmasCurveblwav.Set(params.locallab.spots.at(sp).LLmaskblcurvewav); + const bool lmasutilicolwav = loclmasCurvecolwav.Set(params.locallab.spots.at(sp).LLmaskcolcurvewav); + const bool lcmaslcutili = locccmaslcCurve.Set(params.locallab.spots.at(sp).CCmasklccurve); + const bool llmaslcutili = locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve); + const bool lhmaslcutili = lochhmaslcCurve.Set(params.locallab.spots.at(sp).HHmasklccurve); + const bool locwavutili = locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve); + const bool locwavutilijz = locwavCurvejz.Set(params.locallab.spots.at(sp).locwavcurvejz); + const bool locwavhueutili = locwavCurvehue.Set(params.locallab.spots.at(sp).locwavcurvehue); + const bool locwavdenutili = locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden); + const bool loclevwavutili = loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve); + const bool locconwavutili = locconwavCurve.Set(params.locallab.spots.at(sp).locconwavcurve); + const bool loccompwavutili = loccompwavCurve.Set(params.locallab.spots.at(sp).loccompwavcurve); + const bool loccomprewavutili = loccomprewavCurve.Set(params.locallab.spots.at(sp).loccomprewavcurve); + const bool locedgwavutili = locedgwavCurve.Set(params.locallab.spots.at(sp).locedgwavcurve); + const bool locallutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).llcurve, lllocalcurve2, skip); + const bool localclutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).clcurve, cllocalcurve2, skip); + const bool locallcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).lccurve, lclocalcurve2, skip); + const bool localrgbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).rgbcurve, rgblocalcurve2, skip); + const bool localcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).cccurve, cclocalcurve2, skip); + const bool localexutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).excurve, exlocalcurve2, skip); + const bool localmaskutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve2, skip); + const bool localmaskexputili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve2, skip); + const bool localmaskSHutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve2, skip); + const bool localmaskvibutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve2, skip); + const bool localmasktmutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve2, skip); + const bool localmaskretiutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve2, skip); + const bool localmaskcbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve2, skip); + const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve2, skip); + const bool localmaskblutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve2, skip); + const bool localmasklogutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskcurveL, lmaskloglocalcurve2, skip); + const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve2, skip); + const bool localmaskcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskciecurve, lmaskcielocalcurve2, skip); + const bool localcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve, cielocalcurve2, skip); + const bool localcieutili2 = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve2, cielocalcurve22, skip); + const bool localjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).jzcurve, jzlocalcurve2, skip); + const bool localczutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czcurve, czlocalcurve2, skip); + const bool localczjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czjzcurve, czjzlocalcurve2, skip); + + double ecomp = params.locallab.spots.at(sp).expcomp; + double black = params.locallab.spots.at(sp).black; + double hlcompr = params.locallab.spots.at(sp).hlcompr; + double hlcomprthresh = params.locallab.spots.at(sp).hlcomprthresh; + double shcompr = params.locallab.spots.at(sp).shcompr; + double br = params.locallab.spots.at(sp).lightness; + if (black < 0. && params.locallab.spots.at(sp).expMethod == "pde" ) { + black *= 1.5; + } + std::vector localldenoiselc; + + double cont = params.locallab.spots.at(sp).contrast; + double huere, chromare, lumare, huerefblu, chromarefblu, lumarefblu, sobelre; + huerefblu = parent->huerefblurs[sp]; + chromarefblu = parent->chromarefblurs[sp]; + lumarefblu = parent->lumarefblurs[sp]; + huere = parent->huerefs[sp]; + chromare = parent->chromarefs[sp]; + lumare = parent->lumarefs[sp]; + sobelre = parent->sobelrefs[sp]; + const float avge = parent->avgs[sp]; + float meantme = parent->meantms[sp]; + float stdtme = parent->stdtms[sp]; + float meanretie = parent->meanretis[sp]; + float stdretie = parent->stdretis[sp]; + + float fab = 1.f; + float minCD; + float maxCD; + float mini; + float maxi; + float Tmean; + float Tsigma; + float Tmin; + float Tmax; + int lastsav; + float highresi = 0.f; + float nresi = 0.f; + float highresi46 =0.f; + float nresi46 = 0.f; + float Lhighresi = 0.f; + float Lnresi = 0.f; + float Lhighresi46 = 0.f; + float Lnresi46 = 0.f; +/* huerefp[sp] = huere; + chromarefp[sp] = chromare; + lumarefp[sp] = lumare; +*/ + CurveFactory::complexCurvelocal(ecomp, black / 65535., hlcompr, hlcomprthresh, shcompr, br, cont, lumare, + hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, avge, + skip); + // Locallab mask are only shown for selected spot + int fh = parent->fh; + int fw = parent->fw; + + if (sp == params.locallab.selspot) { + + parent->ipf.Lab_Local(1, sp, (float**)shbuffer, labnCrop, labnCrop, reservCrop.get(), savenormtmCrop.get(), savenormretiCrop.get(), lastorigCrop.get(), fw, fh, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, locRETtransCurve, + lllocalcurve2,locallutili, + cllocalcurve2, localclutili, + lclocalcurve2, locallcutili, + loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz, loclhCurvejz, + + lmasklocalcurve2, localmaskutili, + lmaskexplocalcurve2, localmaskexputili, + lmaskSHlocalcurve2, localmaskSHutili, + lmaskviblocalcurve2, localmaskvibutili, + lmasktmlocalcurve2, localmasktmutili, + lmaskretilocalcurve2, localmaskretiutili, + lmaskcblocalcurve2, localmaskcbutili, + lmaskbllocalcurve2, localmaskblutili, + lmasklclocalcurve2, localmasklcutili, + lmaskloglocalcurve2, localmasklogutili, + lmasklocal_curve2, localmask_utili, + lmaskcielocalcurve2, localmaskcieutili, + cielocalcurve2,localcieutili, + cielocalcurve22,localcieutili2, + jzlocalcurve2,localjzutili, + czlocalcurve2,localczutili, + czjzlocalcurve2,localczjzutili, + + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, + locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, + locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, + locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, + locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, + locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, + locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, + + locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmasSHutili, lochhmascieCurve, lhmascieutili, + + lochhhmas_Curve, lhhmas_utili, + loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, + locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, + loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, + locwavCurvehue, locwavhueutili, + locwavCurveden, locwavdenutili, + locedgwavCurve, locedgwavutili, + loclmasCurve_wav,lmasutili_wav, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, + huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, + parent->previewDeltaE, parent->locallColorMask, parent->locallColorMaskinv, parent->locallExpMask, parent->locallExpMaskinv, parent->locallSHMask, parent->locallSHMaskinv, parent->locallvibMask, parent->localllcMask, parent->locallsharMask, parent->locallcbMask, parent->locallretiMask, parent->locallsoftMask, parent->localltmMask, parent->locallblMask, + parent->localllogMask, parent->locall_Mask, parent->locallcieMask, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + meantme, stdtme, meanretie, stdretie, fab, + highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46); + + LocallabListener::locallabDenoiseLC denoiselc; + denoiselc.highres = highresi; + denoiselc.nres = nresi; + denoiselc.highres46 = highresi46; + denoiselc.nres46 = nresi46; + denoiselc.Lhighres = Lhighresi; + denoiselc.Lnres = Lnresi; + denoiselc.Lhighres46 = Lhighresi46; + denoiselc.Lnres46 = Lnresi46; + localldenoiselc.push_back(denoiselc); + + if (parent->previewDeltaE || parent->locallColorMask == 5 || parent->locallvibMask == 4 || parent->locallExpMask == 5 || parent->locallSHMask == 4 || parent->localllcMask == 4 || parent->localltmMask == 4 || parent->localllogMask == 4 || parent->locallsoftMask == 6 || parent->localllcMask == 4 || parent->locallcieMask == 4) { + params.blackwhite.enabled = false; + params.colorToning.enabled = false; + params.rgbCurves.enabled = false; + params.chmixer.enabled = false; + params.hsvequalizer.enabled = false; + params.filmSimulation.enabled = false; + params.toneCurve.black = 0.f; + params.toneCurve.saturation = 0.f; + params.toneCurve.brightness= 0.f; + params.toneCurve.contrast = 0.f; + params.toneCurve.hlcompr = 0.f; + //these 3 are "before" LA + //params.toneCurve.expcomp = 0; + //params.toneCurve.curve = { 0 }; + //params.toneCurve.curve2 = { 0 }; + params.colorappearance.enabled = false; + params.vibrance.enabled = false; + params.labCurve.enabled = false; + params.wavelet.enabled = false; + params.epd.enabled = false; + params.softlight.enabled = false; + } + /* + if (parent->locallListener) { + parent->locallListener->refChanged2(huerefp, chromarefp, lumarefp, fabrefp, params.locallab.selspot); + + } + */ + denoiselc.highres = highresi; + denoiselc.nres = nresi; + denoiselc.highres46 = highresi46; + denoiselc.nres46 = nresi46; + denoiselc.Lhighres = Lhighresi; + denoiselc.Lnres = Lnresi; + denoiselc.Lhighres46 = Lhighresi46; + denoiselc.Lnres46 = Lnresi46; + localldenoiselc.push_back(denoiselc); + + + if (parent->locallListener) { + parent->locallListener->denChanged(localldenoiselc, params.locallab.selspot); + } + + } else { + parent->ipf.Lab_Local(1, sp, (float**)shbuffer, labnCrop, labnCrop, reservCrop.get(), savenormtmCrop.get(), savenormretiCrop.get(), lastorigCrop.get(), fw, fh, cropx / skip, cropy / skip, skips(parent->fw, skip), skips(parent->fh, skip), skip, locRETgainCurve, locRETtransCurve, + lllocalcurve2,locallutili, + cllocalcurve2, localclutili, + lclocalcurve2, locallcutili, + loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz, loclhCurvejz, + lmasklocalcurve2, localmaskutili, + lmaskexplocalcurve2, localmaskexputili, + lmaskSHlocalcurve2, localmaskSHutili, + lmaskviblocalcurve2, localmaskvibutili, + lmasktmlocalcurve2, localmasktmutili, + lmaskretilocalcurve2, localmaskretiutili, + lmaskcblocalcurve2, localmaskcbutili, + lmaskbllocalcurve2, localmaskblutili, + lmasklclocalcurve2, localmasklcutili, + lmaskloglocalcurve2, localmasklogutili, + lmasklocal_curve2, localmask_utili, + lmaskcielocalcurve2, localmaskcieutili, + cielocalcurve2,localcieutili, + cielocalcurve22,localcieutili2, + jzlocalcurve2,localjzutili, + czlocalcurve2,localczutili, + czjzlocalcurve2,localczjzutili, + + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili,lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, + locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, + locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, + locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, + locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, + locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, + locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, + + locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, + lochhhmas_Curve, lhhmas_utili, + + loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, + locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, + loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, + locwavCurvehue, locwavhueutili, + locwavCurveden, locwavdenutili, + locedgwavCurve, locedgwavutili, + loclmasCurve_wav,lmasutili_wav, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve2, localcutili, rgblocalcurve2, localrgbutili, localexutili, exlocalcurve2, hltonecurveloc2, shtonecurveloc2, tonecurveloc2, lightCurveloc2, + huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + meantme, stdtme, meanretie, stdretie, fab, + highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46); + } + + + if (sp + 1u < params.locallab.spots.size()) { + // do not copy for last spot as it is not needed anymore + lastorigCrop->CopyFrom(labnCrop); + } + + if (skip <= 2) { + Glib::usleep(settings->cropsleep); //wait to avoid crash when crop 100% and move window } } + /* + delete [] huerefp; + delete [] chromarefp; + delete [] lumarefp; + delete [] fabrefp; + */ + + parent->ipf.lab2rgb(*labnCrop, *baseCrop, params.icm.workingProfile); + } + + if (todo & M_RGBCURVE) { double rrm, ggm, bbm; DCPProfileApplyState as; DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, as); LUTu histToneCurve; - parent->ipf.rgbProc (workingCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, + parent->ipf.rgbProc (baseCrop, 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; - if (colortest && cropw>115 && croph>115) - for(int j=1;j<5;j++){ - xref+=j*30;yref+=j*30; - if (settings->verbose) { - printf("after rgbProc RGB Xr%i Yr%i Skip=%d R=%f G=%f B=%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); - printf("after rgbProc Lab Xr%i Yr%i Skip=%d l=%f a=%f b=%f \n",xref,yref,skip, - laboCrop->L[(int)(xref/skip)][(int)(yref/skip)]/327, - laboCrop->a[(int)(xref/skip)][(int)(yref/skip)]/327, - laboCrop->b[(int)(xref/skip)][(int)(yref/skip)]/327); - } - }*/ - // apply luminance operations - if (todo & (M_LUMINANCE + M_COLOR)) { + 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); - - //parent->ipf.luminanceCurve (labnCrop, labnCrop, parent->lumacurve); bool utili = parent->utili; bool autili = parent->autili; bool butili = parent->butili; @@ -863,9 +1302,18 @@ void Crop::update(int todo) bool cclutili = parent->cclutili; LUTu dummy; + if (params.colorToning.enabled && params.colorToning.method == "LabGrid") { + parent->ipf.colorToningLabGrid(labnCrop, 0,labnCrop->W , 0, labnCrop->H, false); + } + parent->ipf.shadowsHighlights(labnCrop, params.sh.enabled, params.sh.lab,params.sh.highlights ,params.sh.shadows, params.sh.radius, skip, params.sh.htonalwidth, params.sh.stonalwidth); + + if (params.localContrast.enabled) { + // Alberto's local contrast + parent->ipf.localContrast(labnCrop, labnCrop->L, params.localContrast, false, 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.vibrance(labnCrop, params.vibrance, params.toneCurve.hrenabled, params.icm.workingProfile); parent->ipf.labColorCorrectionRegions(labnCrop); if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { @@ -883,8 +1331,8 @@ void Crop::update(int todo) parent->ipf.MLsharpen(labnCrop); if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - parent->ipf.MLmicrocontrast (labnCrop); - parent->ipf.sharpening (labnCrop, params.sharpening, parent->sharpMask); + parent->ipf.MLmicrocontrast(labnCrop); + parent->ipf.sharpening(labnCrop, params.sharpening, parent->sharpMask); } } @@ -903,7 +1351,7 @@ void Crop::update(int todo) int minwin = min(labnCrop->W, labnCrop->H); int maxlevelcrop = 10; - // if(cp.mul[9]!=0)maxlevelcrop=10; + // if (cp.mul[9]!=0)maxlevelcrop=10; // adap maximum level wavelet to size of crop if (minwin * skip < 1024) { maxlevelcrop = 9; //sampling wavelet 512 @@ -967,22 +1415,234 @@ void Crop::update(int todo) } WavCurve wavCLVCurve; + WavCurve wavdenoise; + WavCurve wavdenoiseh; + Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; + WavOpacityCurveSH waOpacityCurveSH; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; + LUTf wavclCurve; - params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + LabImage *unshar = nullptr; + Glib::ustring provis; + LabImage *provradius = nullptr; + bool procont = WaveParams.expcontrast; + bool prochro = WaveParams.expchroma; + bool proedge = WaveParams.expedge; + bool profin = WaveParams.expfinal; + bool proton = WaveParams.exptoning; + bool pronois = WaveParams.expnoise; - parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + if (WaveParams.showmask) { + // WaveParams.showmask = false; + // WaveParams.expclari = true; + } + + + if (WaveParams.softrad > 0.f) { + provradius = new LabImage(*labnCrop, true); + } + + + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + + provis = params.wavelet.CLmethod; + params.wavelet.CLmethod = "all"; + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + unshar = new LabImage(*labnCrop, true); + + params.wavelet.CLmethod = provis; + + WaveParams.expcontrast = false; + WaveParams.expchroma = false; + WaveParams.expedge = false; + WaveParams.expfinal = false; + WaveParams.exptoning = false; + WaveParams.expnoise = false; + } + + + +// parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavblcurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = procont; + WaveParams.expchroma = prochro; + WaveParams.expedge = proedge; + WaveParams.expfinal = profin; + WaveParams.exptoning = proton; + WaveParams.expnoise = pronois; + if (WaveParams.softrad > 0.f) { + array2D ble(labnCrop->W, labnCrop->H); + array2D guid(labnCrop->W, labnCrop->H); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(labnCrop->W, labnCrop->H); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < labnCrop->H ; ir++) + for (int jr = 0; jr < labnCrop->W; jr++) { + float X, Y, Z; + float L = provradius->L[ir][jr]; + float a = provradius->a[ir][jr]; + float b = provradius->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + float La = labnCrop->L[ir][jr]; + float aa = labnCrop->a[ir][jr]; + float ba = labnCrop->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + ble[ir][jr] = Y / 32768.f; + } + double epsilmax = 0.0001; + double epsilmin = 0.00001; + double aepsil = (epsilmax - epsilmin) / 100.f; + double bepsil = epsilmin; //epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / skip * (0.5f + 0.8f * WaveParams.softrad); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < labnCrop->H; ir++) + for (int jr = 0; jr < labnCrop->W; jr++) { + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + labnCrop->L[ir][jr] = L; + } + delete tmpImage; + } + + } + + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + + float mL = (float)(WaveParams.mergeL / 100.f); + float mC = (float)(WaveParams.mergeC / 100.f); + float mL0; + float mC0; + float background = 0.f; + int show = 0; + + if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { + mL0 = mC0 = 0.f; + mL = -1.5f * mL; + mC = -mC; + background = 12000.f; + show = 0; + } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { + mL0 = mL; + mC0 = mC; + background = 0.f; + show = 0; + } else { + mL0 = mL = mC0 = mC = 0.f; + background = 0.f; + show = 0; + } + + float indic = 1.f; + if (WaveParams.showmask){ + mL0 = mC0 = -1.f; + indic = -1.f; + mL = fabs(mL); + mC = fabs(mC); + show = 1; + } + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int x = 0; x < labnCrop->H; x++) + for (int y = 0; y < labnCrop->W; y++) { + labnCrop->L[x][y] = LIM((1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * labnCrop->L[x][y], 0.f, 32768.f); + labnCrop->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * labnCrop->a[x][y]; + labnCrop->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * labnCrop->b[x][y]; + } + + delete unshar; + unshar = NULL; + if (WaveParams.softrad > 0.f) { + delete provradius; + provradius = NULL; + } + + + } + + + + } + + parent->ipf.softLight(labnCrop, params.softlight); + + if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE) { + const int GW = labnCrop->W; + const int GH = labnCrop->H; + std::unique_ptr provis; + const float pres = 0.01f * params.icm.preser; + if (pres > 0.f && params.icm.wprim != ColorManagementParams::Primaries::DEFAULT) { + provis.reset(new LabImage(GW, GH)); + provis->CopyFrom(labnCrop); + } + + const std::unique_ptr tmpImage1(new Imagefloat(GW, GH)); + + parent->ipf.lab2rgb(*labnCrop, *tmpImage1, params.icm.workingProfile); + + const float gamtone = parent->params->icm.workingTRCGamma; + const float slotone = parent->params->icm.workingTRCSlope; + + int illum = rtengine::toUnderlying(params.icm.will); + const int prim = rtengine::toUnderlying(params.icm.wprim); + + Glib::ustring prof = params.icm.workingProfile; + + cmsHTRANSFORM cmsDummy = nullptr; + int ill = 0; + parent->ipf.workingtrc(tmpImage1.get(), tmpImage1.get(), GW, GH, -5, prof, 2.4, 12.92310, ill, 0, cmsDummy, true, false, false); + parent->ipf.workingtrc(tmpImage1.get(), tmpImage1.get(), GW, GH, 5, prof, gamtone, slotone, illum, prim, cmsDummy, false, true, true); + + parent->ipf.rgb2lab(*tmpImage1, *labnCrop, params.icm.workingProfile); + //labnCrop and provis + if (provis) { + parent->ipf.preserv(labnCrop, provis.get(), GW, GH); + } + if (params.icm.fbw) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int x = 0; x < GH; x++) + for (int y = 0; y < GW; y++) { + labnCrop->a[x][y] = 0.f; + labnCrop->b[x][y] = 0.f; + } + } } - parent->ipf.softLight(labnCrop); - - // } - - // } if (params.colorappearance.enabled) { float fnum = parent->imgsrc->getMetaData()->getFNumber(); // F number float fiso = parent->imgsrc->getMetaData()->getISOSpeed() ; // ISO @@ -994,8 +1654,9 @@ void Crop::update(int todo) 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 + double kexp = 0.; + E_V += kexp * params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * 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 } @@ -1026,6 +1687,8 @@ void Crop::update(int todo) // all pipette buffer processing should be finished now 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); @@ -1081,6 +1744,7 @@ void Crop::freeAll() laboCrop = nullptr; } + if (labnCrop) { delete labnCrop; labnCrop = nullptr; @@ -1096,6 +1760,11 @@ void Crop::freeAll() cieCrop = nullptr; } + if (shbuffer) { + delete [] shbuffer; + shbuffer = nullptr; + } + PipetteBuffer::flush(); } @@ -1121,7 +1790,7 @@ bool check_need_larger_crop_for_lcp_distortion(int fw, int fh, int x, int y, int * 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 cropX, int cropY, int cropW, int cropH, int skip, bool internal) { if (!internal) { @@ -1130,10 +1799,10 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter bool changed = false; - rqcropx = rcx; - rqcropy = rcy; - rqcropw = rcw; - rqcroph = rch; + rqcropx = cropX; + rqcropy = cropY; + rqcropw = cropW; + rqcroph = cropH; // store and set requested crop size int rqx1 = LIM(rqcropx, 0, parent->fullw - 1); @@ -1167,41 +1836,42 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter 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)) { - // 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)); - int x1 = orx - dW; - int x2 = orx + orw + dW; - int y1 = ory - dH; - int y2 = ory + orh + dH; + if (parent->ipf.needsTransform(skips(parent->fw, skip), skips(parent->fh, skip), parent->imgsrc->getRotateDegree(), parent->imgsrc->getMetaData())) { + 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)); + int x1 = orx - dW; + int x2 = orx + orw + dW; + int y1 = ory - dH; + int y2 = ory + orh + dH; - if (x1 < 0) { - x2 += -x1; - x1 = 0; + if (x1 < 0) { + x2 += -x1; + x1 = 0; + } + + if (x2 > parent->fw) { + x1 -= x2 - parent->fw; + x2 = parent->fw; + } + + if (y1 < 0) { + y2 += -y1; + y1 = 0; + } + + if (y2 > parent->fh) { + y1 -= y2 - parent->fh; + 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); } - - if (x2 > parent->fw) { - x1 -= x2 - parent->fw; - x2 = parent->fw; - } - - if (y1 < 0) { - y2 += -y1; - y1 = 0; - } - - if (y2 > parent->fh) { - y1 -= y2 - parent->fh; - 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); } - leftBorder = skips(rqx1 - bx1, skip); upperBorder = skips(rqy1 - by1, skip); @@ -1209,8 +1879,11 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter int orW, orH; parent->imgsrc->getSize(cp, orW, orH); - trafx = orx; - trafy = ory; + if (trafx != orx || trafy != ory) { + trafx = orx; + trafy = ory; + changed = true; + } int cw = skips(bw, skip); int ch = skips(bh, skip); @@ -1247,6 +1920,8 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter laboCrop = new LabImage(cropw, croph); + // if (translabCrop) translabCrop->reallocLab(); + if (labnCrop) { delete labnCrop; // labnCrop can't be resized } @@ -1265,6 +1940,21 @@ bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool inter cieCrop = nullptr; } + if (shbuffer) { + delete [] shbuffer; + } + + if (shbuf_real) { + delete [] shbuf_real; + } + + shbuffer = new float*[croph]; + shbuf_real = new float[(croph + 2)*cropw]; + + for (int i = 0; i < croph; i++) { + shbuffer[i] = shbuf_real + cropw * i + cropw; + } + if (editType == ET_PIPETTE) { PipetteBuffer::resize(cropw, croph); } else if (PipetteBuffer::bufferCreated()) { diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h index c65c1e72f..19d84c3f3 100644 --- a/rtengine/dcrop.h +++ b/rtengine/dcrop.h @@ -18,11 +18,7 @@ */ #pragma once -#include "improccoordinator.h" #include "rtengine.h" -#include "improcfun.h" -#include "imagesource.h" -#include "procevents.h" #include "pipettebuffer.h" #include "../rtgui/threadutils.h" @@ -30,25 +26,29 @@ namespace rtengine { class Image8; +class CieImage; using namespace procparams; class ImProcCoordinator; -class Crop : public DetailedCrop, public PipetteBuffer +class Crop final : public DetailedCrop, public PipetteBuffer { protected: // --- permanently allocated in RAM and only renewed on size changes Imagefloat* origCrop; // "one chunk" allocation + Imagefloat* spotCrop; // "one chunk" allocation 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 * shbuf_real; // "one chunk" 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** shbuffer; bool updating; /// Flag telling if an updater thread is currently processing bool newUpdatePending; /// Flag telling the updater thread that a new update is pending @@ -65,20 +65,20 @@ protected: MyMutex cropMutex; ImProcCoordinator* const parent; const bool isDetailWindow; - EditUniqueID getCurrEditID(); - bool setCropSizes (int cropX, int cropY, int cropW, int cropH, int skip, bool internal); - void freeAll (); + EditUniqueID getCurrEditID() const; + bool setCropSizes(int cropX, int cropY, int cropW, int cropH, int skip, bool internal); + void freeAll(); public: - Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow); + Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow); ~Crop () override; - +// MyMutex* locMutex; void setEditSubscriber(EditSubscriber* newSubscriber); bool hasListener(); - void update (int todo); + void update(int todo); void setWindow (int cropX, int cropY, int cropW, int cropH, int skip) override { - setCropSizes (cropX, cropY, cropW, cropH, skip, false); + setCropSizes(cropX, cropY, cropW, cropH, skip, false); } /** @brief Synchronously look out if a full update is necessary diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 538858a9a..e5eb5a5aa 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -878,7 +878,7 @@ void RawImageSource::nodemosaic(bool bw) for (int j = 0; j < W; j++) { if (bw) { red[i][j] = green[i][j] = blue[i][j] = rawData[i][j]; - } else if(ri->getSensorType() != ST_FUJI_XTRANS) { + } else if(ri->getSensorType() == ST_BAYER) { switch( FC(i, j)) { case 0: red[i][j] = rawData[i][j]; @@ -895,7 +895,7 @@ void RawImageSource::nodemosaic(bool bw) red[i][j] = green[i][j] = 0; break; } - } else { + } else if(ri->getSensorType() == ST_FUJI_XTRANS) { switch( ri->XTRANSFC(i, j)) { case 0: red[i][j] = rawData[i][j]; @@ -912,6 +912,10 @@ void RawImageSource::nodemosaic(bool bw) red[i][j] = green[i][j] = 0; break; } + } else { + red[i][j] = rawData[i][j * 3 + 0]; + green[i][j] = rawData[i][j * 3 + 1]; + blue[i][j] = rawData[i][j * 3 + 2]; } } } @@ -972,11 +976,11 @@ inline void RawImageSource::dcb_initTileLimits(int &colMin, int &rowMin, int &co } if( y0 + TILESIZE + TILEBORDER >= H - border) { - rowMax = TILEBORDER + H - border - y0; + rowMax = std::min(TILEBORDER + H - border - y0, rowMax); } if( x0 + TILESIZE + TILEBORDER >= W - border) { - colMax = TILEBORDER + W - border - x0; + colMax = std::min(TILEBORDER + W - border - x0, colMax); } } @@ -1069,7 +1073,7 @@ void RawImageSource::dcb_hid(float (*image)[3], int x0, int y0) for (int col = colMin + (FC(y0 - TILEBORDER + row, x0 - TILEBORDER + colMin) & 1), indx = row * CACHESIZE + col; col < colMax; col += 2, indx += 2) { assert(indx - u - 1 >= 0 && indx + u + 1 < u * u); - image[indx][1] = 0.25*(image[indx-1][1]+image[indx+1][1]+image[indx-u][1]+image[indx+u][1]); + image[indx][1] = 0.25f * (image[indx-1][1]+image[indx+1][1]+image[indx-u][1]+image[indx+u][1]); } } diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 1fb1d2e1b..34215e58c 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -17,28 +17,82 @@ * along with RawTherapee. If not, see . */ -#include -#include +#include #include +#include +#include +#include +#include + #include #include #include "dfmanager.h" -#include "../rtgui/options.h" -#include "rawimage.h" + #include "imagedata.h" +#include "jaggedarray.h" +#include "noncopyable.h" +#include "pixelsmap.h" +#include "rawimage.h" #include "utils.h" -namespace rtengine +#include "../rtgui/options.h" + +namespace { -// *********************** class dfInfo ************************************** +std::string toUppercase(const std::string& string) +{ + return Glib::ustring(string).uppercase(); +} + +class dfInfo final +{ +public: + Glib::ustring pathname; // filename of dark frame + std::list pathNames; // other similar dark frames, used for average + std::string maker; // manufacturer + std::string model; // model + int iso; // ISO (gain) + double shutter; // shutter or exposure time in sec + time_t timestamp; // seconds since 1 Jan 1970 + + + dfInfo(const Glib::ustring &name, const std::string &mak, const std::string &mod, int iso, double shut, time_t t) + : pathname(name), maker(mak), model(mod), iso(iso), shutter(shut), timestamp(t), ri(nullptr) {} + + dfInfo(const dfInfo &o) + : pathname(o.pathname), maker(o.maker), model(o.model), iso(o.iso), shutter(o.shutter), timestamp(o.timestamp), ri(nullptr) {} + ~dfInfo(); + + dfInfo &operator =(const dfInfo &o); + + // Calculate virtual distance between two shots; different model return infinite + double distance(const std::string &mak, const std::string &mod, int iso, double shutter) const; + + static std::string key(const std::string &mak, const std::string &mod, int iso, double shut); + std::string key() const + { + return key(maker, model, iso, shutter); + } + + const rtengine::RawImage* getRawImage(); + const std::vector& getHotPixels(); + +private: + rtengine::RawImage* ri; // Dark Frame raw data + std::vector badPixels; // Extracted hot pixels + + void updateBadPixelList(const rtengine::RawImage* df); + void updateRawImage(); +}; + dfInfo::~dfInfo() { delete ri; } -inline dfInfo& dfInfo::operator =(const dfInfo &o) +inline dfInfo& dfInfo::operator = (const dfInfo &o) { if (this != &o) { pathname = o.pathname; @@ -48,7 +102,7 @@ inline dfInfo& dfInfo::operator =(const dfInfo &o) shutter = o.shutter; timestamp = o.timestamp; - if( ri ) { + if (ri) { delete ri; ri = nullptr; } @@ -57,38 +111,13 @@ inline dfInfo& dfInfo::operator =(const dfInfo &o) return *this; } -bool dfInfo::operator <(const dfInfo &e2) const -{ - if( this->maker.compare( e2.maker) >= 0 ) { - return false; - } - - if( this->model.compare( e2.model) >= 0 ) { - return false; - } - - if( this->iso >= e2.iso ) { - return false; - } - - if( this->shutter >= e2.shutter ) { - return false; - } - - if( this->timestamp >= e2.timestamp ) { - return false; - } - - return true; -} - -std::string dfInfo::key(const std::string &mak, const std::string &mod, int iso, double shut ) +std::string dfInfo::key(const std::string &mak, const std::string &mod, int iso, double shut) { std::ostringstream s; s << mak << " " << mod << " "; s.width(5); s << iso << "ISO "; - s.precision( 2 ); + s.precision(2); s.width(4); s << shut << "s"; return s.str(); @@ -96,115 +125,106 @@ std::string dfInfo::key(const std::string &mak, const std::string &mod, int iso, double dfInfo::distance(const std::string &mak, const std::string &mod, int iso, double shutter) const { - if( this->maker.compare( mak) != 0 ) { + if (this->maker.compare(mak) != 0) { return INFINITY; } - if( this->model.compare( mod) != 0 ) { + if (this->model.compare(mod) != 0) { return INFINITY; } - double dISO = (log(this->iso / 100.) - log(iso / 100.)) / log(2); - double dShutter = (log(this->shutter) - log(shutter)) / log(2); - return sqrt( dISO * dISO + dShutter * dShutter); + const double dISO = (log(this->iso / 100.) - log(iso / 100.)) / log(2); + const double dShutter = (log(this->shutter) - log(shutter)) / log(2); + return std::sqrt(dISO * dISO + dShutter * dShutter); } -RawImage* dfInfo::getRawImage() +const rtengine::RawImage* dfInfo::getRawImage() { - if(ri) { + if (ri) { return ri; } updateRawImage(); - updateBadPixelList( ri ); + updateBadPixelList(ri); return ri; } -std::vector& dfInfo::getHotPixels() +const std::vector& dfInfo::getHotPixels() { - if( !ri ) { + if (!ri) { updateRawImage(); - updateBadPixelList( ri ); + updateBadPixelList(ri); } return badPixels; } + /* updateRawImage() load into ri the actual pixel data from pathname if there is a single shot * otherwise load each file from the pathNames list and extract a template from the media; * the first file is used also for reading all information other than pixels */ void dfInfo::updateRawImage() { - typedef unsigned int acc_t; - if( !pathNames.empty() ) { - std::list::iterator iName = pathNames.begin(); - ri = new RawImage(*iName); // First file used also for extra pixels information (width,height, shutter, filters etc.. ) + if (!pathNames.empty()) { + std::list::const_iterator iName = pathNames.begin(); + ri = new rtengine::RawImage(*iName); // First file used also for extra pixels information (width,height, shutter, filters etc.. ) - if( ri->loadRaw(true)) { + if (ri->loadRaw(true)) { delete ri; ri = nullptr; } else { - int H = ri->get_height(); - int W = ri->get_width(); + const int H = ri->get_height(); + const int W = ri->get_width(); ri->compress_image(0); - int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) ? 1 : 3); - acc_t **acc = new acc_t*[H]; - - for( int row = 0; row < H; row++) { - acc[row] = new acc_t[rSize ]; - } + const int rSize = W * ((ri->getSensorType() == rtengine::ST_BAYER || ri->getSensorType() == rtengine::ST_FUJI_XTRANS) ? 1 : 3); + rtengine::JaggedArray acc(W, H); // copy first image into accumulators - for (int row = 0; row < H; row++) + for (int row = 0; row < H; row++) { for (int col = 0; col < rSize; col++) { acc[row][col] = ri->data[row][col]; } + } int nFiles = 1; // First file data already loaded - for( ++iName; iName != pathNames.end(); ++iName) { - RawImage* temp = new RawImage(*iName); + for (++iName; iName != pathNames.end(); ++iName) { + rtengine::RawImage temp(*iName); - if( !temp->loadRaw(true)) { - temp->compress_image(0); //\ TODO would be better working on original, because is temporary + if (!temp.loadRaw(true)) { + 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 ) { - for( int row = 0; row < H; row++) { - for( int col = 0; col < W; col++) { - acc[row][col] += temp->data[row][col]; + if (ri->getSensorType() == rtengine::ST_BAYER || ri->getSensorType() == rtengine::ST_FUJI_XTRANS) { + for (int row = 0; row < H; row++) { + for (int col = 0; col < W; col++) { + acc[row][col] += temp.data[row][col]; } } } else { - for( int row = 0; row < H; row++) { - for( int col = 0; col < W; col++) { - acc[row][3 * col + 0] += temp->data[row][3 * col + 0]; - acc[row][3 * col + 1] += temp->data[row][3 * col + 1]; - acc[row][3 * col + 2] += temp->data[row][3 * col + 2]; + for (int row = 0; row < H; row++) { + for (int col = 0; col < W; col++) { + acc[row][3 * col + 0] += temp.data[row][3 * col + 0]; + acc[row][3 * col + 1] += temp.data[row][3 * col + 1]; + acc[row][3 * col + 2] += temp.data[row][3 * col + 2]; } } } } - - delete temp; } - + const float factor = 1.f / nFiles; for (int row = 0; row < H; row++) { for (int col = 0; col < rSize; col++) { - ri->data[row][col] = acc[row][col] / nFiles; + ri->data[row][col] = acc[row][col] * factor; } - - delete [] acc[row]; } - - delete [] acc; } } else { - ri = new RawImage(pathname); + ri = new rtengine::RawImage(pathname); - if( ri->loadRaw(true)) { + if (ri->loadRaw(true)) { delete ri; ri = nullptr; } else { @@ -213,35 +233,36 @@ void dfInfo::updateRawImage() } } -void dfInfo::updateBadPixelList( RawImage *df ) +void dfInfo::updateBadPixelList(const rtengine::RawImage *df) { - if(!df) { + if (!df) { return; } - const float threshold = 10.f / 8.f; + constexpr float threshold = 10.f / 8.f; - if( df->getSensorType() == ST_BAYER || df->getSensorType() == ST_FUJI_XTRANS ) { - std::vector badPixelsTemp; + if (df->getSensorType() == rtengine::ST_BAYER || df->getSensorType() == rtengine::ST_FUJI_XTRANS) { + std::vector badPixelsTemp; #ifdef _OPENMP #pragma omp parallel #endif { - std::vector badPixelsThread; + 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++) { - float m = (df->data[row - 2][col - 2] + df->data[row - 2][col] + df->data[row - 2][col + 2] + - df->data[row][col - 2] + df->data[row][col + 2] + - df->data[row + 2][col - 2] + df->data[row + 2][col] + df->data[row + 2][col + 2]); + for (int row = 2; row < df->get_height() - 2; ++row) { + for (int col = 2; col < df->get_width() - 2; ++col) { + const float m = df->data[row - 2][col - 2] + df->data[row - 2][col] + df->data[row - 2][col + 2] + + df->data[row][col - 2] + df->data[row][col + 2] + + df->data[row + 2][col - 2] + df->data[row + 2][col] + df->data[row + 2][col + 2]; - if( df->data[row][col] > m * threshold ) { + if (df->data[row][col] > m * threshold) { badPixelsThread.emplace_back(col, row); } } + } #ifdef _OPENMP #pragma omp critical @@ -250,48 +271,78 @@ void dfInfo::updateBadPixelList( RawImage *df ) } badPixels.insert(badPixels.end(), badPixelsTemp.begin(), badPixelsTemp.end()); } else { - for( int row = 1; row < df->get_height() - 1; row++) - for( int col = 1; col < df->get_width() - 1; col++) { + for (int row = 1; row < df->get_height() - 1; ++row) { + for (int col = 1; col < df->get_width() - 1; ++col) { float m[3]; - for( int c = 0; c < 3; c++) { - m[c] = (df->data[row - 1][3 * (col - 1) + c] + df->data[row - 1][3 * col + c] + df->data[row - 1][3 * (col + 1) + c] + - df->data[row] [3 * (col - 1) + c] + df->data[row] [3 * col + c] + - df->data[row + 1][3 * (col - 1) + c] + df->data[row + 1][3 * col + c] + df->data[row + 1][3 * (col + 1) + c]); + for (int c = 0; c < 3; c++) { + m[c] = df->data[row - 1][3 * (col - 1) + c] + df->data[row - 1][3 * col + c] + df->data[row - 1][3 * (col + 1) + c] + + df->data[row] [3 * (col - 1) + c] + df->data[row] [3 * col + c] + + df->data[row + 1][3 * (col - 1) + c] + df->data[row + 1][3 * col + c] + df->data[row + 1][3 * (col + 1) + c]; } - if( df->data[row][3 * col] > m[0]*threshold || df->data[row][3 * col + 1] > m[1]*threshold || df->data[row][3 * col + 2] > m[2]*threshold) { + if (df->data[row][3 * col] > m[0]*threshold || df->data[row][3 * col + 1] > m[1]*threshold || df->data[row][3 * col + 2] > m[2]*threshold) { badPixels.emplace_back(col, row); } } + } } - if( settings->verbose ) { + if (rtengine::settings->verbose) { std::cout << "Extracted " << badPixels.size() << " pixels from darkframe:" << df->get_filename().c_str() << std::endl; } } -// ************************* class DFManager ********************************* +} -void DFManager::init(const Glib::ustring& pathname) +class rtengine::DFManager::Implementation final : + public NonCopyable +{ +public: + void init(const Glib::ustring& pathname); + Glib::ustring getPathname() const + { + return currentPath; + }; + void getStat(int& totFiles, int& totTemplates) const; + const RawImage* searchDarkFrame(const std::string& mak, const std::string& mod, int iso, double shut, time_t t); + const RawImage* searchDarkFrame(const Glib::ustring& filename); + const std::vector* getHotPixels(const std::string& mak, const std::string& mod, int iso, double shut, time_t t); + const std::vector* getHotPixels(const Glib::ustring& filename); + const std::vector* getBadPixels(const std::string& mak, const std::string& mod, const std::string& serial) const; + +private: + typedef std::multimap dfList_t; + typedef std::map > bpList_t; + dfList_t dfList; + bpList_t bpList; + bool initialized; + Glib::ustring currentPath; + dfInfo* addFileInfo(const Glib::ustring &filename, bool pool = true); + dfInfo* find(const std::string &mak, const std::string &mod, int isospeed, double shut, time_t t); + int scanBadPixelsFile(const Glib::ustring &filename); +}; + + +void rtengine::DFManager::Implementation::init(const Glib::ustring& pathname) { if (pathname.empty()) { return; } std::vector names; - auto dir = Gio::File::create_for_path (pathname); + const auto dir = Gio::File::create_for_path(pathname); if (!dir || !dir->query_exists()) { return; } try { - auto enumerator = dir->enumerate_children ("standard::name"); + const auto enumerator = dir->enumerate_children("standard::name"); - while (auto file = enumerator->next_file ()) { - names.emplace_back (Glib::build_filename (pathname, file->get_name ())); + while (const auto file = enumerator->next_file()) { + names.emplace_back(Glib::build_filename(pathname, file->get_name())); } } catch (Glib::Exception&) {} @@ -299,40 +350,40 @@ void DFManager::init(const Glib::ustring& pathname) dfList.clear(); bpList.clear(); - for (size_t i = 0; i < names.size(); i++) { - size_t lastdot = names[i].find_last_of ('.'); + for (const auto &name : names) { + const auto lastdot = name.find_last_of('.'); - if (lastdot != Glib::ustring::npos && names[i].substr(lastdot) == ".badpixels" ) { - int n = scanBadPixelsFile( names[i] ); + if (lastdot != Glib::ustring::npos && name.substr(lastdot) == ".badpixels") { + const int n = scanBadPixelsFile(name); - if( n > 0 && settings->verbose) { - printf("Loaded %s: %d pixels\n", names[i].c_str(), n); + if (n > 0 && settings->verbose) { + printf("Loaded %s: %d pixels\n", name.c_str(), n); } continue; } try { - addFileInfo(names[i]); - } catch( std::exception& e ) {} + addFileInfo(name); + } catch(std::exception& e) {} } // Where multiple shots exist for same group, move filename to list - for( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { - dfInfo &i = iter->second; + for (auto &df : dfList) { + dfInfo &i = df.second; - if( !i.pathNames.empty() && !i.pathname.empty() ) { - i.pathNames.push_back( i.pathname ); + if (!i.pathNames.empty() && !i.pathname.empty()) { + i.pathNames.push_back(i.pathname); i.pathname.clear(); } - if( settings->verbose ) { - if( !i.pathname.empty() ) { - printf( "%s: %s\n", i.key().c_str(), i.pathname.c_str()); + if (settings->verbose) { + if (!i.pathname.empty()) { + printf("%s: %s\n", i.key().c_str(), i.pathname.c_str()); } else { - printf( "%s: MEAN of \n ", i.key().c_str()); + printf("%s: MEAN of \n ", i.key().c_str()); - for(std::list::iterator path = i.pathNames.begin(); path != i.pathNames.end(); ++path) { + for (std::list::iterator path = i.pathNames.begin(); path != i.pathNames.end(); ++path) { printf("%s, ", path->c_str()); } @@ -345,9 +396,140 @@ void DFManager::init(const Glib::ustring& pathname) return; } -dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) +void rtengine::DFManager::Implementation::getStat(int& totFiles, int& totTemplates) const { - auto ext = getFileExtension(filename); + totFiles = 0; + totTemplates = 0; + + for (const auto &df : dfList) { + const dfInfo &i = df.second; + + if (i.pathname.empty()) { + totTemplates++; + totFiles += i.pathNames.size(); + } else { + totFiles++; + } + } +} + +/* The search for the best match is twofold: + * if perfect matches for iso and shutter are found, then the list is scanned for lesser distance in time + * otherwise if no match is found, the whole list is searched for lesser distance in iso and shutter + */ +const rtengine::RawImage* rtengine::DFManager::Implementation::searchDarkFrame(const std::string& mak, const std::string& mod, int iso, double shut, time_t t) +{ + dfInfo* df = find(toUppercase(mak), toUppercase(mod), iso, shut, t); + + if (df) { + return df->getRawImage(); + } else { + return nullptr; + } +} + +const rtengine::RawImage* rtengine::DFManager::Implementation::searchDarkFrame(const Glib::ustring& filename) +{ + for (auto& df : dfList) { + if (df.second.pathname.compare(filename) == 0) { + return df.second.getRawImage(); + } + } + + dfInfo *df = addFileInfo(filename, false); + + if (df) { + return df->getRawImage(); + } + + return nullptr; +} + +const std::vector* rtengine::DFManager::Implementation::getHotPixels(const Glib::ustring& filename) +{ + for (auto& df : dfList) { + if (df.second.pathname.compare(filename) == 0) { + return &df.second.getHotPixels(); + } + } + + return nullptr; +} + +const std::vector* rtengine::DFManager::Implementation::getHotPixels(const std::string& mak, const std::string& mod, int iso, double shut, time_t t) +{ + dfInfo* df = find(toUppercase(mak), toUppercase(mod), iso, shut, t); + + if (df) { + if (settings->verbose) { + if (!df->pathname.empty()) { + printf("Searched hotpixels from %s\n", df->pathname.c_str()); + } else { + if (!df->pathNames.empty()) { + printf("Searched hotpixels from template (first %s)\n", df->pathNames.begin()->c_str()); + } + } + } + + return &df->getHotPixels(); + } else { + return nullptr; + } +} + +const std::vector* rtengine::DFManager::Implementation::getBadPixels(const std::string& mak, const std::string& mod, const std::string& serial) const +{ + bpList_t::const_iterator iter; + bool found = false; + + if (!serial.empty()) { + // search with serial number first + std::ostringstream s; + s << mak << " " << mod << " " << serial; + iter = bpList.find(s.str()); + + if (iter != bpList.end()) { + found = true; + } + + if (settings->verbose) { + if (found) { + printf("%s.badpixels found\n", s.str().c_str()); + } else { + printf("%s.badpixels not found\n", s.str().c_str()); + } + } + } + + if (!found) { + // search without serial number + std::ostringstream s; + s << mak << " " << mod; + iter = bpList.find(s.str()); + + if (iter != bpList.end()) { + found = true; + } + + if (settings->verbose) { + if (found) { + printf("%s.badpixels found\n", s.str().c_str()); + } else { + printf("%s.badpixels not found\n", s.str().c_str()); + } + } + } + + if (!found) { + return nullptr; + } else { + return &(iter->second); + } +} + +dfInfo* rtengine::DFManager::Implementation::addFileInfo(const Glib::ustring& filename, bool pool) +{ + const auto ext = getFileExtension(filename); if (ext.empty() || !options.is_extention_enabled(ext)) { return nullptr; @@ -367,7 +549,7 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) auto info = file->query_info("standard::name,standard::type,standard::is-hidden"); - if (!info && info->get_file_type() == Gio::FILE_TYPE_DIRECTORY) { + if (!info || info->get_file_type() == Gio::FILE_TYPE_DIRECTORY) { return nullptr; } @@ -376,37 +558,34 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) } RawImage ri(filename); - int res = ri.loadRaw(false); // Read information about shot - if (res != 0) { + if (ri.loadRaw(false) != 0) { // Read information about shot return nullptr; } - dfList_t::iterator iter; - - if(!pool) { - dfInfo n(filename, "", "", 0, 0, 0); - iter = dfList.emplace("", n); + if (!pool) { + const dfInfo n(filename, "", "", 0, 0, 0); + auto iter = dfList.emplace("", n); return &(iter->second); } FramesData idata(filename, std::unique_ptr(new RawMetaDataLocation(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen())), true); /* Files are added in the map, divided by same maker/model,ISO and shutter*/ - std::string key(dfInfo::key(((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed())); - iter = dfList.find(key); + std::string key(dfInfo::key(toUppercase(idata.getMake()), toUppercase(idata.getModel()), idata.getISOSpeed(), idata.getShutterSpeed())); + auto iter = dfList.find(key); - if(iter == dfList.end()) { - dfInfo n(filename, ((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed(), idata.getDateTimeAsTS()); + if (iter == dfList.end()) { + dfInfo n(filename, toUppercase(idata.getMake()), toUppercase(idata.getModel()), idata.getISOSpeed(), idata.getShutterSpeed(), idata.getDateTimeAsTS()); iter = dfList.emplace(key, n); } else { while(iter != dfList.end() && iter->second.key() == key && ABS(iter->second.timestamp - idata.getDateTimeAsTS()) > 60 * 60 * 6) { // 6 hour difference ++iter; } - if(iter != dfList.end()) { + if (iter != dfList.end()) { iter->second.pathNames.push_back(filename); } else { - dfInfo n(filename, ((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed(), idata.getDateTimeAsTS()); + dfInfo n(filename, toUppercase(idata.getMake()), toUppercase(idata.getModel()), idata.getISOSpeed(), idata.getShutterSpeed(), idata.getDateTimeAsTS()); iter = dfList.emplace(key, n); } } @@ -418,44 +597,23 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) return nullptr; } -void DFManager::getStat( int &totFiles, int &totTemplates) +dfInfo* rtengine::DFManager::Implementation::find(const std::string& mak, const std::string& mod, int isospeed, double shut, time_t t) { - totFiles = 0; - totTemplates = 0; - - for( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { - dfInfo &i = iter->second; - - if( i.pathname.empty() ) { - totTemplates++; - totFiles += i.pathNames.size(); - } else { - totFiles++; - } - } -} - -/* The search for the best match is twofold: - * if perfect matches for iso and shutter are found, then the list is scanned for lesser distance in time - * otherwise if no match is found, the whole list is searched for lesser distance in iso and shutter - */ -dfInfo* DFManager::find( const std::string &mak, const std::string &mod, int isospeed, double shut, time_t t ) -{ - if( dfList.empty() ) { + if (dfList.empty()) { return nullptr; } - std::string key( dfInfo::key(mak, mod, isospeed, shut) ); - dfList_t::iterator iter = dfList.find( key ); + const std::string key(dfInfo::key(mak, mod, isospeed, shut)); + dfList_t::iterator iter = dfList.find(key); - if( iter != dfList.end() ) { + if (iter != dfList.end()) { dfList_t::iterator bestMatch = iter; time_t bestDeltaTime = ABS(iter->second.timestamp - t); - for(++iter; iter != dfList.end() && !key.compare( iter->second.key() ); ++iter ) { - time_t d = ABS(iter->second.timestamp - t ); + for (++iter; iter != dfList.end() && !key.compare(iter->second.key()); ++iter) { + const time_t d = ABS(iter->second.timestamp - t); - if( d < bestDeltaTime ) { + if (d < bestDeltaTime) { bestMatch = iter; bestDeltaTime = d; } @@ -465,185 +623,122 @@ dfInfo* DFManager::find( const std::string &mak, const std::string &mod, int iso } else { iter = dfList.begin(); dfList_t::iterator bestMatch = iter; - double bestD = iter->second.distance( mak, mod, isospeed, shut ); + double bestD = iter->second.distance(mak, mod, isospeed, shut); - for( ++iter; iter != dfList.end(); ++iter ) { - double d = iter->second.distance( mak, mod, isospeed, shut ); + for (++iter; iter != dfList.end(); ++iter) { + const double d = iter->second.distance(mak, mod, isospeed, shut); - if( d < bestD ) { + if (d < bestD) { bestD = d; bestMatch = iter; } } - return bestD != INFINITY ? &(bestMatch->second) : nullptr ; + return bestD != RT_INFINITY ? &(bestMatch->second) : nullptr ; } } -RawImage* DFManager::searchDarkFrame( const std::string &mak, const std::string &mod, int iso, double shut, time_t t ) +int rtengine::DFManager::Implementation::scanBadPixelsFile(const Glib::ustring& filename) { - dfInfo *df = find( ((Glib::ustring)mak).uppercase(), ((Glib::ustring)mod).uppercase(), iso, shut, t ); + FILE *file = ::fopen( filename.c_str(), "r" ); - if( df ) { - return df->getRawImage(); - } else { - return nullptr; - } -} - -RawImage* DFManager::searchDarkFrame( const Glib::ustring filename ) -{ - for ( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { - if( iter->second.pathname.compare( filename ) == 0 ) { - return iter->second.getRawImage(); - } + if (!file) { + return 0; } - dfInfo *df = addFileInfo( filename, false ); + const auto lastdot = filename.find_last_of('.'); + auto dirpos1 = filename.find_last_of('/'); + auto dirpos2 = filename.find_last_of('\\'); - if(df) { - return df->getRawImage(); - } - - return nullptr; -} -std::vector *DFManager::getHotPixels ( const Glib::ustring filename ) -{ - for ( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { - if( iter->second.pathname.compare( filename ) == 0 ) { - return &iter->second.getHotPixels(); - } - } - - return nullptr; -} -std::vector *DFManager::getHotPixels ( const std::string &mak, const std::string &mod, int iso, double shut, time_t t ) -{ - dfInfo *df = find( ((Glib::ustring)mak).uppercase(), ((Glib::ustring)mod).uppercase(), iso, shut, t ); - - if( df ) { - if( settings->verbose ) { - if( !df->pathname.empty() ) { - printf( "Searched hotpixels from %s\n", df->pathname.c_str()); - } else { - if( !df->pathNames.empty() ) { - printf( "Searched hotpixels from template (first %s)\n", df->pathNames.begin()->c_str()); - } - } - } - - return &df->getHotPixels(); - } else { - return nullptr; - } -} - -int DFManager::scanBadPixelsFile( Glib::ustring filename ) -{ - FILE *file = fopen( filename.c_str(), "r" ); - - if( !file ) { - return false; - } - - size_t lastdot = filename.find_last_of ('.'); - size_t dirpos1 = filename.find_last_of ('/'); - size_t dirpos2 = filename.find_last_of ('\\'); - - if( dirpos1 == Glib::ustring::npos && dirpos2 == Glib::ustring::npos ) { + if (dirpos1 == Glib::ustring::npos && dirpos2 == Glib::ustring::npos) { dirpos1 = 0; - } else if( dirpos1 != Glib::ustring::npos && dirpos2 != Glib::ustring::npos ) { + } else if (dirpos1 != Glib::ustring::npos && dirpos2 != Glib::ustring::npos) { dirpos1 = (dirpos1 > dirpos2 ? dirpos1 : dirpos2); - } else if( dirpos1 == Glib::ustring::npos ) { + } else if (dirpos1 == Glib::ustring::npos) { dirpos1 = dirpos2; } - std::string makmodel(filename, dirpos1 + 1, lastdot - (dirpos1 + 1) ); + const std::string makmodel(filename, dirpos1 + 1, lastdot - (dirpos1 + 1)); std::vector bp; char line[256]; - if(fgets(line, sizeof(line), file )) { + if (fgets(line, sizeof(line), file)) { int x, y; int offset = 0; int numparms = sscanf(line, "%d %d", &x, &y); - if( numparms == 1 ) { // only one number in first line means, that this is the offset. + if (numparms == 1) { // only one number in first line means, that this is the offset. offset = x; - } else if(numparms == 2) { + } else if (numparms == 2) { bp.emplace_back(x + offset, y + offset); } - while( fgets(line, sizeof(line), file ) ) { - if( sscanf(line, "%d %d", &x, &y) == 2 ) { + while(fgets(line, sizeof(line), file)) { + if (sscanf(line, "%d %d", &x, &y) == 2) { bp.emplace_back(x + offset, y + offset); } } } - int numPixels = bp.size(); + const int numPixels = bp.size(); - if( numPixels > 0 ) { - bpList[ makmodel ] = bp; + if (numPixels > 0) { + bpList[makmodel] = bp; } fclose(file); return numPixels; } -std::vector *DFManager::getBadPixels ( const std::string &mak, const std::string &mod, const std::string &serial) +rtengine::DFManager& rtengine::DFManager::getInstance() { - bpList_t::iterator iter; - bool found = false; - - if( !serial.empty() ) { - // search with serial number first - std::ostringstream s; - s << mak << " " << mod << " " << serial; - iter = bpList.find( s.str() ); - - if( iter != bpList.end() ) { - found = true; - } - - if( settings->verbose ) { - if(found) { - printf("%s.badpixels found\n", s.str().c_str()); - } else { - printf("%s.badpixels not found\n", s.str().c_str()); - } - } - - } - - if(!found) { - // search without serial number - std::ostringstream s; - s << mak << " " << mod; - iter = bpList.find( s.str() ); - - if( iter != bpList.end() ) { - found = true; - } - - if( settings->verbose ) { - if(found) { - printf("%s.badpixels found\n", s.str().c_str()); - } else { - printf("%s.badpixels not found\n", s.str().c_str()); - } - } - } - - if(!found) { - return nullptr; - } else { - return &(iter->second); - } + static DFManager instance; + return instance; } -// Global variable -DFManager dfm; - - +void rtengine::DFManager::init(const Glib::ustring& pathname) +{ + implementation->init(pathname); } +Glib::ustring rtengine::DFManager::getPathname() const +{ + return implementation->getPathname(); +} + +void rtengine::DFManager::getStat(int& totFiles, int& totTemplates) const +{ + implementation->getStat(totFiles, totTemplates); +} + +const rtengine::RawImage* rtengine::DFManager::searchDarkFrame(const std::string& mak, const std::string& mod, int iso, double shut, time_t t) +{ + return implementation->searchDarkFrame(mak, mod, iso, shut, t); +} + +const rtengine::RawImage* rtengine::DFManager::searchDarkFrame(const Glib::ustring& filename) +{ + return implementation->searchDarkFrame(filename); +} + +const std::vector* rtengine::DFManager::getHotPixels(const std::string& mak, const std::string& mod, int iso, double shut, time_t t) +{ + return implementation->getHotPixels(mak, mod, iso, shut, t); +} + +const std::vector* rtengine::DFManager::getHotPixels(const Glib::ustring& filename) +{ + return implementation->getHotPixels(filename); +} + +const std::vector* rtengine::DFManager::getBadPixels(const std::string& mak, const std::string& mod, const std::string& serial) const +{ + return implementation->getBadPixels(mak, mod, serial); +} + +rtengine::DFManager::DFManager() : + implementation(new Implementation) +{ +} + +rtengine::DFManager::~DFManager() = default; diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h index 216dcfc53..01ee7479a 100644 --- a/rtengine/dfmanager.h +++ b/rtengine/dfmanager.h @@ -18,89 +18,40 @@ */ #pragma once -#include -#include -#include +#include #include +#include #include -#include "pixelsmap.h" - namespace rtengine { +struct badPix; + class RawImage; -class dfInfo + +class DFManager final { public: + static DFManager& getInstance(); - Glib::ustring pathname; // filename of dark frame - std::list pathNames; // other similar dark frames, used for average - std::string maker; ///< manufacturer - std::string model; ///< model - int iso; ///< ISO (gain) - double shutter; ///< shutter or exposure time in sec - time_t timestamp; ///< seconds since 1 Jan 1970 + void init(const Glib::ustring& pathname); + Glib::ustring getPathname() const; + void getStat(int& totFiles, int& totTemplates) const; + const RawImage* searchDarkFrame(const std::string& mak, const std::string& mod, int iso, double shut, time_t t); + const RawImage* searchDarkFrame(const Glib::ustring& filename); + const std::vector* getHotPixels(const std::string& mak, const std::string& mod, int iso, double shut, time_t t); + const std::vector* getHotPixels(const Glib::ustring& filename); + const std::vector* getBadPixels(const std::string& mak, const std::string& mod, const std::string& serial) const; +private: + DFManager(); + ~DFManager(); - dfInfo(const Glib::ustring &name, const std::string &mak, const std::string &mod, int iso, double shut, time_t t) - : pathname(name), maker(mak), model(mod), iso(iso), shutter(shut), timestamp(t), ri(nullptr) {} + class Implementation; - dfInfo( const dfInfo &o) - : pathname(o.pathname), maker(o.maker), model(o.model), iso(o.iso), shutter(o.shutter), timestamp(o.timestamp), ri(nullptr) {} - ~dfInfo(); - - dfInfo &operator =(const dfInfo &o); - bool operator <(const dfInfo &e2) const; - - // Calculate virtual distance between two shots; different model return infinite - double distance(const std::string &mak, const std::string &mod, int iso, double shutter) const; - - static std::string key(const std::string &mak, const std::string &mod, int iso, double shut ); - std::string key() - { - return key( maker, model, iso, shutter); - } - - RawImage *getRawImage(); - std::vector &getHotPixels(); - -protected: - RawImage *ri; ///< Dark Frame raw data - std::vector badPixels; ///< Extracted hot pixels - - void updateBadPixelList( RawImage *df ); - void updateRawImage(); + const std::unique_ptr implementation; }; -class DFManager -{ -public: - void init(const Glib::ustring &pathname); - Glib::ustring getPathname() - { - return currentPath; - }; - void getStat( int &totFiles, int &totTemplate); - RawImage *searchDarkFrame( const std::string &mak, const std::string &mod, int iso, double shut, time_t t ); - RawImage *searchDarkFrame( const Glib::ustring filename ); - std::vector *getHotPixels ( const std::string &mak, const std::string &mod, int iso, double shut, time_t t ); - std::vector *getHotPixels ( const Glib::ustring filename ); - std::vector *getBadPixels ( const std::string &mak, const std::string &mod, const std::string &serial); - -protected: - typedef std::multimap dfList_t; - typedef std::map > bpList_t; - dfList_t dfList; - bpList_t bpList; - bool initialized; - Glib::ustring currentPath; - dfInfo *addFileInfo(const Glib::ustring &filename, bool pool = true ); - dfInfo *find( const std::string &mak, const std::string &mod, int isospeed, double shut, time_t t ); - int scanBadPixelsFile( Glib::ustring filename ); -}; - -extern DFManager dfm; - } diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index bb20b7cc1..1173f8803 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -16,8 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include -#include #include "curves.h" #include #include @@ -65,23 +63,23 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) } } - if (x[0] != 0.0f || x[N - 1] != 1.0f) + if (x[0] != 0.0 || x[N - 1] != 1.0) // Special (and very rare) case where all points are on the identity line but // not reaching the limits { identity = false; } - if(x[0] == 0.f && x[1] == 0.f) + if(x[0] == 0.0 && x[1] == 0.0) // Avoid crash when first two points are at x = 0 (git Issue 2888) { - x[1] = 0.01f; + x[1] = 0.01; } - if(x[0] == 1.f && x[1] == 1.f) + if(x[0] == 1.0 && x[1] == 1.0) // Avoid crash when first two points are at x = 1 (100 in gui) (git Issue 2923) { - x[0] = 0.99f; + x[0] = 0.99; } if (!identity) { @@ -97,7 +95,7 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) } } } else if (kind == DCT_Parametric) { - if ((p.size() == 8 || p.size() == 9) && (p.at(4) != 0.0f || p.at(5) != 0.0f || p.at(6) != 0.0f || p.at(7) != 0.0f)) { + if ((p.size() == 8 || p.size() == 9) && (p.at(4) != 0.0 || p.at(5) != 0.0 || p.at(6) != 0.0 || p.at(7) != 0.0)) { identity = false; x = new double[9]; @@ -118,8 +116,8 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) } mc = -xlog(2.0) / xlog(x[2]); - double mbase = pfull (0.5, x[8], x[6], x[5]); - mfc = mbase <= 1e-14 ? 0.0 : xexp(xlog(mbase) / mc); // value of the curve at the center point + double mbase = pfull_alt (0.5, x[6], x[5]); + mfc = xexp(xlog(mbase) / mc); // value of the curve at the center point msc = -xlog(2.0) / xlog(x[1] / x[2]); mhc = -xlog(2.0) / xlog((x[3] - x[2]) / (1 - x[2])); } @@ -426,7 +424,6 @@ void DiagonalCurve::catmull_rom_set() /*****************************************************************************/ - double DiagonalCurve::getVal (double t) const { @@ -437,20 +434,24 @@ double DiagonalCurve::getVal (double t) const return 0.0; } - double tv = xexp(mc * xlog(t)); - double base = pfull (tv, x[8], x[6], x[5]); - double stretched = base <= 1e-14 ? 0.0 : xexp(xlog(base) / mc); + double tv = xexp(max(mc * xlog(t),-236.0)); // prevents numerical issues when calling pfull, at the cost of minor artifacts + double base = pfull_alt (tv, x[6], x[5]); + double stretched = xexp(xlog(base) / mc); if (t < x[2]) { // add shadows effect: - double stv = xexp(msc * xlog(stretched / mfc)); - double sbase = pfull (stv, x[8], x[7], 0.5); - return mfc * (sbase <= 1e-14 ? 0.0 : xexp(xlog(sbase) / msc)); + double stv = xexp(max(msc * xlog(stretched / mfc),-236.0)); + double sbase = pfull_alt (stv, x[7], 0.5); + return mfc * xexp(xlog(sbase) / msc); } else { // add highlights effect: - double htv = xexp(mhc * xlog((stretched - mfc) / (1 - mfc))); - double hbase = pfull (htv, x[8], 0.5, x[4]); - return mfc + (1 - mfc) * (hbase <= 1e-14 ? 0.0 : xexp(xlog(hbase) / mhc)); + double htv = xexp(max(mhc * xlog((stretched - mfc) / (1.0 - mfc)),-236.0)); + if (htv < 1e-6) { + return stretched; // this part of the curve isn't affected by highlight, return the base curve + } else { + double hbase = pfull_alt (htv, 0.5, x[4]); + return mfc + (1.0 - mfc) * xexp(xlog(hbase) / mhc); + } } break; diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index 1f62badcb..92a5ae7ee 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -25,6 +25,7 @@ #include "array2D.h" #include "cieimage.h" #include "color.h" +#include "curves.h" #include "improcfun.h" #include "LUT.h" #include "opthelper.h" @@ -37,6 +38,7 @@ float rangeFn(float i) { return 1.f / (i + 1000.f); } + void dirpyr_channel(const float * const * data_fine, float ** data_coarse, int width, int height, int level, int scale) { // scale is spacing of directional averaging weights @@ -228,11 +230,11 @@ void fillLut(LUTf &irangefn, int level, double dirpyrThreshold, float mult, floa } const float offs = skinprot == 0.f ? 0.f : -1.f; - constexpr float noise = 2000.f; - const float noisehi = 1.33f * noise * dirpyrThreshold / expf(level * log(3.0)), noiselo = 0.66f * noise * dirpyrThreshold / expf(level * log(3.0)); + constexpr double noise = 2000.0; + const float noisehi = 1.33 * noise * dirpyrThreshold / exp(level * log(3.0)), noiselo = 0.66 * noise * dirpyrThreshold / exp(level * log(3.0)); for (int i = 0; i < 0x20000; i++) { - if (abs(i - 0x10000) > noisehi || multbis < 1.0) { + if (abs(i - 0x10000) > noisehi || multbis < 1.f) { irangefn[i] = multbis + offs; } else { if (abs(i - 0x10000) < noiselo) { @@ -244,6 +246,22 @@ void fillLut(LUTf &irangefn, int level, double dirpyrThreshold, float mult, floa } } +void idirpyr_eq_channel_loc(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult, const double dirpyrThreshold, float ** hue, float ** chrom, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scaleprev, bool multiThread) +{ + LUTf irangefn(0x20000); + fillLut(irangefn, level, dirpyrThreshold, mult, skinprot); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + const float hipass = data_fine[i][j] - data_coarse[i][j]; + buffer[i][j] += irangefn[hipass + 0x10000] * hipass; + } + } +} + void idirpyr_eq_channel(const float * const * data_coarse, const float * const * data_fine, float ** buffer, int width, int height, int level, float mult, const double dirpyrThreshold, const float * const * hue, const float * const * chrom, const double skinprot, float b_l, float t_l, float t_r) { const float skinprotneg = -skinprot; @@ -262,7 +280,7 @@ void idirpyr_eq_channel(const float * const * data_coarse, const float * const * buffer[i][j] += irangefn[hipass + 0x10000] * hipass; } } - } else if (skinprot > 0.f) { + } else if (skinprot > 0.0) { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -314,7 +332,7 @@ void idirpyr_eq_channelcam(const float * const * data_coarse, const float * cons buffer[i][j] += irangefn[hipass + 0x10000] * hipass; } } - } else if (skinprot > 0.f) { + } else if (skinprot > 0.0) { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -507,4 +525,161 @@ void ImProcFunctions::dirpyr_equalizercam(const CieImage *ncie, float ** src, fl } } +void ImProcFunctions::cbdl_local_temp(float ** src, float ** loctemp, int srcwidth, int srcheight, const float * mult, float kchro, const double dirpyrThreshold, const float mergeL, const float contres, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scaleprev, bool multiThread) +{ + constexpr int maxlevelloc = 6; + constexpr int scalesloc[maxlevelloc] = {1, 2, 4, 8, 16, 32}; + const float atten123 = rtengine::LIM(settings->level123_cbdl, 0.f, 50.f); + const float atten0 = rtengine::LIM(settings->level0_cbdl, 0.f, 40.f); + int lastlevel = maxlevelloc; + + if (settings->verbose) { + printf("Dirpyr scaleprev=%i\n", scaleprev); + } + + while (lastlevel > 0 && fabs(mult[lastlevel - 1] - 1) < 0.001) { + + lastlevel--; + //printf("last level to process %d \n",lastlevel); + } + + if (lastlevel == 0) { + return; + } + + float multi[6]; + + for (int lv = 0; lv < 6; ++lv) { + if (scalesloc[lv] < scaleprev) { + const float factor = lv >= 1 ? atten123 : atten0; + multi[lv] = (factor * ((float) mult[lv] - 1.f) / 100.f) + 1.f; //modulate action if zoom < 100% + } else { + multi[lv] = mult[lv]; + } + } + + if (settings->verbose) { + printf("CbDL local 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); + + + dirpyr_channel(src, dirpyrlo[0], srcwidth, srcheight, 0, std::max(scalesloc[0] / scaleprev, 1)); + + + for (int level = 1; level < lastlevel; ++level) { + dirpyr_channel(dirpyrlo[level - 1], dirpyrlo[level], srcwidth, srcheight, level, std::max(scalesloc[level] / scaleprev, 1)); + } + + // with the current implementation of idirpyr_eq_channel we can safely use the buffer from last level as buffer, saves some memory +// float ** buffer = dirpyrlo[lastlevel - 1]; + array2D residbuff(srcwidth, srcheight); + array2D resid5(srcwidth, srcheight); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < srcheight; i++) + for (int j = 0; j < srcwidth; j++) { + residbuff[i][j] = 0.f; + } + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < srcheight; i++) + for (int j = 0; j < srcwidth; j++) { + residbuff[i][j] = dirpyrlo[lastlevel - 1][i][j]; + resid5[i][j] = dirpyrlo[lastlevel - 1][i][j]; + } + + + double avg = 0.f; + if(contres != 0.f) { + int ng = 0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg, ng) +#endif + for (int i = 0; i < srcheight; i++) { + for (int j = 0; j < srcwidth; j++) { + avg += residbuff[i][j]; + ng++; + } + } + avg /= ng; + avg /= 32768.f; + avg = LIM01(avg); + } + float contreal = 0.3f * contres; + DiagonalCurve resid_contrast({ + DCT_NURBS, + 0, 0, + avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), + avg + (1 - avg) * (0.6 - contreal / 250.0), avg + (1 - avg) * (0.6 + contreal / 250.0), + 1, 1 + }); + + if(contres != 0.f) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < srcheight; i++) + for (int j = 0; j < srcwidth; j++) { + float buf = LIM01(residbuff[i][j] / 32768.f); + buf = resid_contrast.getVal(buf); + buf *= 32768.f; + residbuff[i][j] = buf; + } + } + + + for (int level = lastlevel - 1; level > 0; level--) { + idirpyr_eq_channel_loc(dirpyrlo[level], dirpyrlo[level - 1], residbuff, srcwidth, srcheight, level, multi[level], dirpyrThreshold, nullptr, nullptr, skinprot, gamutlab, b_l, t_l, t_r, b_r, choice, scaleprev, multiThread); + } + + scale = scalesloc[0]; + + idirpyr_eq_channel_loc(dirpyrlo[0], src, residbuff, srcwidth, srcheight, 0, multi[0], dirpyrThreshold, nullptr, nullptr, skinprot, gamutlab, b_l, t_l, t_r, b_r, choice, scaleprev, multiThread); + + array2D loct(srcwidth, srcheight); +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < srcheight; i++) { + for (int j = 0; j < srcwidth; j++) { + loct[i][j] = LIM(residbuff[i][j],0.f,32768.f); // TODO: Really a clip necessary? + } + } + + float clar = 0.01f * mergeL; + +/* + if(clar == 0.f) { + clar = 0.0f; + } +// printf("clar=%f \n", clar); +*/ + if(clar > 0.f) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < srcheight; i++) { + for (int j = 0; j < srcwidth; j++) { + loctemp[i][j] = LIM((1.f + clar) * loct[i][j] - clar * resid5[i][j],0.f,32768.f); + } + } + } else { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < srcheight; i++) { + for (int j = 0; j < srcwidth; j++) { + loctemp[i][j] = LIM(loct[i][j],0.f,32768.f); + } + } + } +} + } diff --git a/rtengine/dnggainmap.h b/rtengine/dnggainmap.h new file mode 100644 index 000000000..25a01fd0f --- /dev/null +++ b/rtengine/dnggainmap.h @@ -0,0 +1,43 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Ingo Weyrich + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#pragma once + +#include +#include + +struct GainMap +{ + std::uint32_t Top; + std::uint32_t Left; + std::uint32_t Bottom; + std::uint32_t Right; + std::uint32_t Plane; + std::uint32_t Planes; + std::uint32_t RowPitch; + std::uint32_t ColPitch; + std::uint32_t MapPointsV; + std::uint32_t MapPointsH; + double MapSpacingV; + double MapSpacingH; + double MapOriginV; + double MapOriginH; + std::uint32_t MapPlanes; + std::vector MapGain; +}; diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc index 93508808c..558d9095b 100644 --- a/rtengine/dual_demosaic_RT.cc +++ b/rtengine/dual_demosaic_RT.cc @@ -33,9 +33,6 @@ #include "../rtgui/options.h" -//#define BENCHMARK -#include "StopWatch.h" - using namespace std; namespace rtengine @@ -43,20 +40,22 @@ namespace rtengine void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::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) { + if (contrast == 0.0 && !autoContrast) { // contrast == 0.0 means only first demosaicer will be used if(isBayer) { - if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) ) { + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4)) { amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4)) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)) { rcd_demosaic(options.chunkSizeRCD, options.measure); } } else { - if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) { + if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS)) { xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); } else { xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); @@ -69,15 +68,19 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams array2D L(winw, winh); if (isBayer) { - if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4)) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); - } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4) ) { + } else if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)) { rcd_demosaic(options.chunkSizeRCD, options.measure); } } else { - if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) ) { + if (raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS)) { xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); } else { xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); @@ -91,59 +94,47 @@ void RawImageSource::dual_demosaic_RT(bool isBayer, const procparams::RAWParams }; #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel for schedule(dynamic,16) #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); - } + 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 + + // calculate contrast based blend factors to use flat demosaicer in regions with low contrast JaggedArray blend(winw, winh); - float contrastf = contrast / 100.f; + float contrastf = contrast / 100.0; buildBlendMask(L, blend, winw, winh, contrastf, autoContrast); contrast = contrastf * 100.f; - array2D& redTmp = L; // L is not needed anymore => reuse it - array2D greenTmp(winw, winh); - array2D blueTmp(winw, winh); - if (isBayer) { - vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); + if (raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || + raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBBILINEAR)) { + bayer_bilinear_demosaic(blend, rawData, red, green, blue); + } else { + array2D& redTmp = L; // L is not needed anymore => reuse it + array2D greenTmp(winw, winh); + array2D blueTmp(winw, winh); + vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for(int i = 0; i < winh; ++i) { + // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache + for(int j = 0; j < winw; ++j) { + red[i][j] = intp(blend[i][j], red[i][j], redTmp[i][j]); + } + for(int j = 0; j < winw; ++j) { + green[i][j] = intp(blend[i][j], green[i][j], greenTmp[i][j]); + } + for(int j = 0; j < winw; ++j) { + blue[i][j] = intp(blend[i][j], blue[i][j], blueTmp[i][j]); + } + } + } } else { - fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); + fast_xtrans_interpolate_blend(blend, rawData, red, green, blue); } - - - // 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 617ec2747..32be2ceb2 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -33,7 +34,7 @@ using namespace rtengine::procparams; namespace { -const int ISO_MAX = 512000; +const int ISO_MAX = 819200; const double FNUMBER_MAX = 100.0; const double FOCALLEN_MAX = 10000.0; const double SHUTTERSPEED_MAX = 1000.0; @@ -77,7 +78,7 @@ bool DynamicProfileRule::operator< (const DynamicProfileRule &other) const } -bool DynamicProfileRule::matches (const rtengine::FramesMetaData *im) const +bool DynamicProfileRule::matches (const rtengine::FramesMetaData *im, const Glib::ustring& filename) const { return (iso (im->getISOSpeed()) && fnumber (im->getFNumber()) @@ -86,6 +87,7 @@ bool DynamicProfileRule::matches (const rtengine::FramesMetaData *im) const && expcomp (im->getExpComp()) && camera (im->getCamera()) && lens (im->getLens()) + && path (filename) && imagetype(im->getImageType(0))); } @@ -214,10 +216,27 @@ 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.path, kf, group, "path"); get_optional (rule.imagetype, kf, group, "imagetype"); try { rule.profilepath = kf.get_string (group, "profilepath"); + #if defined (WIN32) + // if this is Windows, replace any "/" in the path with "\\" + size_t pos = rule.profilepath.find("/"); + while (pos != Glib::ustring::npos) { + rule.profilepath.replace(pos, 1, "\\"); + pos = rule.profilepath.find("/", pos); + } + #endif + #if !defined (WIN32) + // if this is not Windows, replace any "\\" in the path with "/" + size_t pos = rule.profilepath.find("\\"); + while (pos != Glib::ustring::npos) { + rule.profilepath.replace(pos, 1, "/"); + pos = rule.profilepath.find("\\", pos); + } + #endif } catch (Glib::KeyFileError &) { dynamicRules.pop_back(); } @@ -247,11 +266,19 @@ 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, "path", rule.path); set_optional (kf, group, "imagetype", rule.imagetype); kf.set_string (group, "profilepath", rule.profilepath); } - return kf.save_to_file (Glib::build_filename (Options::rtdir, "dynamicprofile.cfg")); + std::string fn = Glib::build_filename (Options::rtdir, "dynamicprofile.cfg"); + if (Glib::file_test(fn, Glib::FILE_TEST_IS_SYMLINK)) { + // file is symlink; use target instead + // symlinks apparently are not recognízed on Windows + return kf.save_to_file (g_file_read_link (fn.c_str(), NULL)); + } else { + return kf.save_to_file (fn); + } } const std::vector &DynamicProfileRules::getRules() diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h index d91b91aee..654db3a8e 100644 --- a/rtengine/dynamicprofile.h +++ b/rtengine/dynamicprofile.h @@ -51,7 +51,7 @@ public: }; DynamicProfileRule(); - bool matches (const rtengine::FramesMetaData *im) const; + bool matches (const rtengine::FramesMetaData *im, const Glib::ustring& filename) const; bool operator< (const DynamicProfileRule &other) const; int serial_number; @@ -62,6 +62,7 @@ public: Range expcomp; Optional camera; Optional lens; + Optional path; Optional imagetype; Glib::ustring profilepath; }; diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index ad4bda3cd..009be0714 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -360,8 +360,8 @@ void RawImageSource::eahd_demosaic () int wh = 0; - for (int dmi = 0; dmi < 9; dmi++) { - wh += (dLmaph[dmi] <= eL) * (dCamaph[dmi] <= eCa) * (dCbmaph[dmi] <= eCb); + for (int d = 0; d < 9; ++d) { + wh += (dLmaph[d] <= eL) * (dCamaph[d] <= eCa) * (dCbmaph[d] <= eCb); } homh[imx][j - 1] += wh; @@ -376,8 +376,8 @@ void RawImageSource::eahd_demosaic () int wv = 0; - for (int dmi = 0; dmi < 9; dmi++) { - wv += (dLmapv[dmi] <= eL) * (dCamapv[dmi] <= eCa) * (dCbmapv[dmi] <= eCb); + for (int d = 0; d < 9; ++d) { + wv += (dLmapv[d] <= eL) * (dCamapv[d] <= eCa) * (dCbmapv[d] <= eCb); } homv[imx][j - 1] += wv; diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index 772096b87..ca8fb4cc4 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -281,7 +281,6 @@ void RawImageSource::fast_demosaic() int right = min(left + TS, W - bord + 2); #ifdef __SSE2__ - int j, cc; __m128 wtuv, wtdv, wtlv, wtrv; __m128 greenv, tempv, absv, abs2v; __m128 c16v = _mm_set1_ps( 16.0f ); @@ -302,7 +301,7 @@ void RawImageSource::fast_demosaic() float wtu, wtd, wtl, wtr; #ifdef __SSE2__ selmask = (vmask)_mm_andnot_ps( (__m128)selmask, (__m128)andmask); - + int j, cc; for (j = left, cc = 0; j < right - 3; j += 4, cc += 4) { tempv = LVFU(rawData[i][j]); absv = vabsf(LVFU(rawData[i - 1][j]) - LVFU(rawData[i + 1][j])); @@ -421,16 +420,12 @@ void RawImageSource::fast_demosaic() temp1v = LVFU(redtile[rr * TS + cc]); temp2v = greenv - zd25v * (greensumv - LVFU(redtile[(rr - 1) * TS + cc]) - LVFU(redtile[(rr + 1) * TS + cc]) - LVFU(redtile[rr * TS + cc - 1]) - LVFU(redtile[rr * TS + cc + 1])); -// temp2v = greenv - zd25v*((LVFU(greentile[(rr-1)*TS+cc])-LVFU(redtile[(rr-1)*TS+cc]))+(LVFU(greentile[(rr+1)*TS+cc])-LVFU(redtile[(rr+1)*TS+cc]))+ -// (LVFU(greentile[rr*TS+cc-1])-LVFU(redtile[rr*TS+cc-1]))+(LVFU(greentile[rr*TS+cc+1])-LVFU(redtile[rr*TS+cc+1]))); _mm_storeu_ps( &redtile[rr * TS + cc], vself(selmask, temp1v, temp2v)); temp1v = LVFU(bluetile[rr * TS + cc]); temp2v = greenv - zd25v * (greensumv - LVFU(bluetile[(rr - 1) * TS + cc]) - LVFU(bluetile[(rr + 1) * TS + cc]) - LVFU(bluetile[rr * TS + cc - 1]) - LVFU(bluetile[rr * TS + cc + 1])); -// temp2v = greenv - zd25v*((LVFU(greentile[(rr-1)*TS+cc])-LVFU(bluetile[(rr-1)*TS+cc]))+(LVFU(greentile[(rr+1)*TS+cc])-LVFU(bluetile[(rr+1)*TS+cc]))+ -// (LVFU(greentile[rr*TS+cc-1])-LVFU(bluetile[rr*TS+cc-1]))+(LVFU(greentile[rr*TS+cc+1])-LVFU(bluetile[rr*TS+cc+1]))); _mm_storeu_ps( &bluetile[rr * TS + cc], vself(selmask, temp1v, temp2v)); } @@ -450,7 +445,7 @@ void RawImageSource::fast_demosaic() for (int i = top + 2, rr = 2; i < bottom - 2; i++, rr++) { #ifdef __SSE2__ - + int j, cc; for (j = left + 2, cc = 2; j < right - 5; j += 4, cc += 4) { _mm_storeu_ps(&red[i][j], vmaxf(LVFU(redtile[rr * TS + cc]), ZEROV)); _mm_storeu_ps(&green[i][j], vmaxf(LVFU(greentile[rr * TS + cc]), ZEROV)); diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index ce60277e1..c55bc5108 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -428,7 +428,7 @@ ffInfo* FFManager::find( const std::string &mak, const std::string &mod, const s } } - return bestD != INFINITY ? &(bestMatch->second) : nullptr ; + return bestD != RT_INFINITY ? &(bestMatch->second) : nullptr ; } } diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h index 80ef5fa1c..f3303f12b 100644 --- a/rtengine/ffmanager.h +++ b/rtengine/ffmanager.h @@ -29,7 +29,7 @@ namespace rtengine { class RawImage; -class ffInfo +class ffInfo final { public: @@ -71,7 +71,7 @@ protected: void updateRawImage(); }; -class FFManager +class FFManager final { public: void init(const Glib::ustring &pathname); diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc index 1f27983ed..eb029d77a 100644 --- a/rtengine/filmnegativeproc.cc +++ b/rtengine/filmnegativeproc.cc @@ -21,375 +21,647 @@ #include "rawimage.h" #include "rawimagesource.h" +#include "improcfun.h" +#include "improccoordinator.h" +#include "imagefloat.h" #include "coord.h" -#include "mytime.h" #include "opthelper.h" #include "pixelsmap.h" #include "procparams.h" #include "rt_algo.h" #include "rtengine.h" +#include "rtthumbnail.h" #include "sleef.h" //#define BENCHMARK -#include "StopWatch.h" +//#include "StopWatch.h" +#include "iccstore.h" +#include "rt_math.h" +#include "color.h" + namespace { +using rtengine::settings; +using rtengine::Coord2D; +using rtengine::ColorTemp; +using rtengine::findMinMaxPercentile; +using rtengine::ImageSource; +using rtengine::Imagefloat; +using rtengine::procparams::FilmNegativeParams; +using rtengine::procparams::ColorManagementParams; +using rtengine::procparams::RAWParams; +using rtengine::ICCStore; +using rtengine::MAXVALF; +using rtengine::CLIP; +using rtengine::TMatrix; +using rtengine::Color; +using RGB = rtengine::procparams::FilmNegativeParams::RGB; -bool channelsAvg( - const rtengine::RawImage* ri, - int width, - int height, - const float* cblacksom, - rtengine::Coord spotPos, - int spotSize, - const rtengine::procparams::FilmNegativeParams& params, - std::array& avgs -) +Coord2D translateCoord(const rtengine::ImProcFunctions& ipf, int fw, int fh, int x, int y) { - avgs = {}; // Channel averages - if (ri->getSensorType() != rtengine::ST_BAYER && ri->getSensorType() != rtengine::ST_FUJI_XTRANS) { - return false; + const std::vector points = {Coord2D(x, y)}; + + std::vector red; + std::vector green; + std::vector blue; + ipf.transCoord(fw, fh, points, red, green, blue); + + return green[0]; +} + + +void getSpotAvgMax(ImageSource *imgsrc, ColorTemp currWB, const std::unique_ptr ¶ms, + Coord2D p, int tr, int spotSize, RGB &avg, RGB &max) +{ + int x1 = MAX(0, (int)p.x - spotSize / 2); + int y1 = MAX(0, (int)p.y - spotSize / 2); + PreviewProps pp(x1, y1, spotSize, spotSize, 1); + + if (settings->verbose) { + printf("Spot: %d,%d %d,%d\n", x1, y1, x1 + spotSize / 2, y1 + spotSize / 2); } - if (rtengine::settings->verbose) { - printf("Spot coord: x=%d y=%d\n", spotPos.x, spotPos.y); - } + rtengine::Imagefloat spotImg(spotSize, spotSize); + imgsrc->getImage(currWB, tr, &spotImg, pp, params->toneCurve, params->raw, 0); - const int half_spot_size = spotSize / 2; + auto avgMax = [spotSize, &spotImg](RGB & avg, RGB & max) -> void { + avg = {}; + max = {}; - const int& x1 = spotPos.x - half_spot_size; - const int& x2 = spotPos.x + half_spot_size; - const int& y1 = spotPos.y - half_spot_size; - const int& y2 = spotPos.y + half_spot_size; + for (int i = 0; i < spotSize; ++i) + { + for (int j = 0; j < spotSize; ++j) { - if (x1 < 0 || x2 > width || y1 < 0 || y2 > height) { - return false; // Spot goes outside bounds, bail out. - } + float r = spotImg.r(i, j); + float g = spotImg.g(i, j); + float b = spotImg.b(i, j); - std::array pxCount = {}; // Per-channel sample counts - for (int c = x1; c < x2; ++c) { - for (int r = y1; r < y2; ++r) { - const int ch = ri->getSensorType() == rtengine::ST_BAYER ? ri->FC(r,c) : ri->XTRANSFC(r,c); - - ++pxCount[ch]; - - // Sample the original unprocessed values from RawImage, subtracting black levels. - // Scaling is irrelevant, as we are only interested in the ratio between two spots. - avgs[ch] += ri->data[r][c] - cblacksom[ch]; + avg.r += r; + avg.g += g; + avg.b += b; + max.r = MAX(max.r, r); + max.g = MAX(max.g, g); + max.b = MAX(max.b, b); + } } - } - for (int ch = 0; ch < 3; ++ch) { - avgs[ch] /= pxCount[ch]; - } - - return true; -} - -} - -bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams ¤tParams, std::array& newExps) -{ - newExps = { - static_cast(currentParams.redRatio * currentParams.greenExp), - static_cast(currentParams.greenExp), - static_cast(currentParams.blueRatio * currentParams.greenExp) + avg.r /= (spotSize * spotSize); + avg.g /= (spotSize * spotSize); + avg.b /= (spotSize * spotSize); }; - constexpr int spotSize = 32; // TODO: Make this configurable? + if (params->filmNegative.colorSpace == rtengine::FilmNegativeParams::ColorSpace::INPUT) { + avgMax(avg, max); + } else { + // Convert spot image to current working space + imgsrc->convertColorSpace(&spotImg, params->icm, currWB); - Coord spot; - std::array clearVals; - std::array denseVals; + avgMax(avg, max); - // Sample first spot - transformPosition(spotA.x, spotA.y, tran, spot.x, spot.y); - if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, currentParams, clearVals)) { - return false; + // TODO handle custom color profile ! } - // Sample second spot - transformPosition(spotB.x, spotB.y, tran, spot.x, spot.y); - if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, currentParams, denseVals)) { - return false; - } - - // Detect which one is the dense spot, based on green channel - if (clearVals[1] < denseVals[1]) { - std::swap(clearVals, denseVals); - } + // Clip away zeroes or negative numbers, you never know + avg.r = MAX(avg.r, 1.f); + avg.g = MAX(avg.g, 1.f); + avg.b = MAX(avg.b, 1.f); if (settings->verbose) { - printf("Clear film values: R=%g G=%g B=%g\n", clearVals[0], clearVals[1], clearVals[2]); - printf("Dense film values: R=%g G=%g B=%g\n", denseVals[0], denseVals[1], denseVals[2]); + printf("Average Spot RGB: %f,%f,%f\n", avg.r, avg.g, avg.b); } +} - const float denseGreenRatio = clearVals[1] / denseVals[1]; - // Calculate logarithms in arbitrary base - const auto logBase = - [](float base, float num) -> float - { - return std::log(num) / std::log(base); - }; +void calcMedians( + const rtengine::Imagefloat* input, + int x1, int y1, int x2, int y2, + float &rmed, float &gmed, float &bmed +) +{ + using rtengine::findMinMaxPercentile; - // Calculate exponents for each channel, based on the ratio between the bright and dark values, - // compared to the ratio in the reference channel (green) - for (int ch = 0; ch < 3; ++ch) { - if (ch == 1) { - newExps[ch] = 1.f; // Green is the reference channel - } else { - newExps[ch] = CLAMP(logBase(clearVals[ch] / denseVals[ch], denseGreenRatio), 0.3f, 4.f); + // Channel vectors to calculate medians + std::vector rv, gv, bv; + + const int sz = (x2 - x1) * (y2 - y1); + rv.reserve(sz); + gv.reserve(sz); + bv.reserve(sz); + + + for (int ii = y1; ii < y2; ii ++) { + for (int jj = x1; jj < x2; jj ++) { + rv.push_back(input->r(ii, jj)); + gv.push_back(input->g(ii, jj)); + bv.push_back(input->b(ii, jj)); } } - if (settings->verbose) { - printf("New exponents: R=%g G=%g B=%g\n", newExps[0], newExps[1], newExps[2]); - } - - return true; + // Calculate channel medians of the specified area + findMinMaxPercentile(rv.data(), rv.size(), 0.5f, rmed, 0.5f, rmed, true); + findMinMaxPercentile(gv.data(), gv.size(), 0.5f, gmed, 0.5f, gmed, true); + findMinMaxPercentile(bv.data(), bv.size(), 0.5f, bmed, 0.5f, bmed, true); } -void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativeParams ¶ms) + +RGB getMedians(const rtengine::Imagefloat* input, int borderPercent) { -// BENCHFUNMICRO + float rmed, gmed, bmed; + // Cut 20% border from medians calculation. It will probably contain outlier values + // from the film holder, which will bias the median result. + const int bW = input->getWidth() * borderPercent / 100; + const int bH = input->getHeight() * borderPercent / 100; + calcMedians(input, bW, bH, + input->getWidth() - bW, input->getHeight() - bH, + rmed, gmed, bmed); + + if (settings->verbose) { + printf("Channel medians: R=%g, G=%g, B=%g\n", rmed, gmed, bmed); + } + + return { rmed, gmed, bmed }; +} + +/* +// TODO not needed for now +void convertColorSpace(Imagefloat* input, const TMatrix &src2xyz, const TMatrix &xyz2dest) +{ + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < input->getHeight(); i++) { + for (int j = 0; j < input->getWidth(); j++) { + + float newr = input->r(i, j); + float newg = input->g(i, j); + float newb = input->b(i, j); + + float x, y, z; + Color::rgbxyz (newr, newg, newb, x, y, z, src2xyz); + Color::xyz2rgb (x, y, z, newr, newg, newb, xyz2dest); + + input->r(i, j) = newr; + input->g(i, j) = newg; + input->b(i, j) = newb; + + } + } +} +*/ + + +/** + * Perform actual film negative inversion process. + * Returns true if the input and output reference values are not set in params; refIn/refOut will be updated with median-based estimates. + * Otherwise, use provided values in params and return false + */ +bool doProcess(Imagefloat *input, Imagefloat *output, + const FilmNegativeParams ¶ms, const ColorManagementParams &icmParams, + RGB &refIn, RGB &refOut) +{ + bool refsUpdated = false; + + float rexp = -(params.greenExp * params.redRatio); + float gexp = -params.greenExp; + float bexp = -(params.greenExp * params.blueRatio); + + // In case we are processing a thumbnail, reference values might not be set in params, + // so make an estimate on the fly, using channel medians + if (refIn.g <= 0.f) { + // Calc medians, 20% border cut + refIn = getMedians(input, 20); + refsUpdated = true; + } else { + refIn = params.refInput; + } + + if (refOut.g <= 0.f) { + // Median will correspond to gray, 1/24th of max in the output + refOut = { MAXVALF / 24.f, MAXVALF / 24.f, MAXVALF / 24.f }; + refsUpdated = true; + } else { + refOut = params.refOutput; + } + + // Apply channel exponents to reference input values, and compute suitable multipliers + // in order to reach reference output values. + float rmult = refOut.r / pow_F(rtengine::max(refIn.r, 1.f), rexp); + float gmult = refOut.g / pow_F(rtengine::max(refIn.g, 1.f), gexp); + float bmult = refOut.b / pow_F(rtengine::max(refIn.b, 1.f), bexp); + + +#ifdef __SSE2__ + const vfloat clipv = F2V(MAXVALF); + const vfloat rexpv = F2V(rexp); + const vfloat gexpv = F2V(gexp); + const vfloat bexpv = F2V(bexp); + const vfloat rmultv = F2V(rmult); + const vfloat gmultv = F2V(gmult); + const vfloat bmultv = F2V(bmult); +#endif + + const int rheight = input->getHeight(); + const int rwidth = input->getWidth(); + + for (int i = 0; i < rheight; i++) { + float *rlinein = input->r(i); + float *glinein = input->g(i); + float *blinein = input->b(i); + float *rlineout = output->r(i); + float *glineout = output->g(i); + float *blineout = output->b(i); + int j = 0; +#ifdef __SSE2__ + + for (; j < rwidth - 3; j += 4) { + STVFU(rlineout[j], vminf(rmultv * pow_F(LVFU(rlinein[j]), rexpv), clipv)); + STVFU(glineout[j], vminf(gmultv * pow_F(LVFU(glinein[j]), gexpv), clipv)); + STVFU(blineout[j], vminf(bmultv * pow_F(LVFU(blinein[j]), bexpv), clipv)); + } + +#endif + + for (; j < rwidth; ++j) { + rlineout[j] = CLIP(rmult * pow_F(rlinein[j], rexp)); + glineout[j] = CLIP(gmult * pow_F(glinein[j], gexp)); + blineout[j] = CLIP(bmult * pow_F(blinein[j], bexp)); + } + } + + return refsUpdated; +} + + +} + + + +bool rtengine::ImProcFunctions::filmNegativeProcess( + Imagefloat *input, Imagefloat *output, FilmNegativeParams &fnp, + const RAWParams &rawParams, const ImageSource* imgsrc, const ColorTemp &currWB) +{ + //BENCHFUNMICRO + + if (!fnp.enabled) { + return false; + } + + bool paramsUpdated = false; + + RGB &refIn = fnp.refInput; + RGB &refOut = fnp.refOutput; + + // If we're opening a profile from an older version, apply the proper multiplier + // compensations to make processing backwards compatible. + + if (fnp.backCompat == FilmNegativeParams::BackCompat::V1) { + // Calc medians, no border cut, compensate currWB in+out + refIn = getMedians(input, 0); + refOut = { MAXVALF / 24.f, MAXVALF / 24.f, MAXVALF / 24.f }; + + std::array scale_mul = { 1.f, 1.f, 1.f, 1.f }; + float autoGainComp, rm, gm, bm; + imgsrc->getWBMults(currWB, params->raw, scale_mul, autoGainComp, rm, gm, bm); + + refOut.r *= rm; + refOut.g *= gm; + refOut.b *= bm; + + paramsUpdated = true; + + } else if (fnp.backCompat == FilmNegativeParams::BackCompat::V2) { + + std::array scale_mul = { 1.f, 1.f, 1.f, 1.f }; + float autoGainComp, rm, gm, bm; + imgsrc->getWBMults(currWB, params->raw, scale_mul, autoGainComp, rm, gm, bm); + + float rm2, gm2, bm2; + imgsrc->getWBMults(rtengine::ColorTemp(3500., 1., 1., "Custom", currWB.getObserver()), params->raw, scale_mul, autoGainComp, rm2, gm2, bm2); + float mg = rtengine::max(rm2, gm2, bm2); + rm2 /= mg; + gm2 /= mg; + bm2 /= mg; + + if (fnp.refInput.g == 0.f) { + // Calc medians, 20% border cut + refIn = getMedians(input, 20); + refOut = { MAXVALF / 24.f, MAXVALF / 24.f, MAXVALF / 24.f }; + } else if (fnp.refInput.g > 0.f) { + // Calc refInput + refOutput from base levels, compensate currWB in, 3500 out + refIn = fnp.refInput; + refIn.r *= rm * scale_mul[0]; + refIn.g *= gm * scale_mul[1]; + refIn.b *= bm * scale_mul[2]; + refOut = { MAXVALF / 512.f, MAXVALF / 512.f, MAXVALF / 512.f }; + } + + refOut.r *= rm * autoGainComp / rm2; + refOut.g *= gm * autoGainComp / gm2; + refOut.b *= bm * autoGainComp / bm2; + + paramsUpdated = true; + + } + + if (settings->verbose && fnp.backCompat != FilmNegativeParams::BackCompat::CURRENT) { + printf("Upgraded from V%d - refIn: R=%g G=%g B=%g refOut: R=%g G=%g B=%g\n", + (int)fnp.backCompat, + static_cast(refIn.r), static_cast(refIn.g), static_cast(refIn.b), + static_cast(refOut.r), static_cast(refOut.g), static_cast(refOut.b)); + } + + // FilmNeg params are now upgraded to the latest version + fnp.backCompat = FilmNegativeParams::BackCompat::CURRENT; + + // Perform actual inversion. Return true if reference values are computed from medians + paramsUpdated |= doProcess(input, output, fnp, this->params->icm, refIn, refOut); + + return paramsUpdated; + +} + +void rtengine::ImProcFunctions::filmNegativeProcess(rtengine::Imagefloat *input, rtengine::Imagefloat *output, + const procparams::FilmNegativeParams ¶ms) +{ + //BENCHFUNMICRO if (!params.enabled) { return; } - // Exponents are expressed as positive in the parameters, so negate them in order - // to get the reciprocals. - const std::array exps = { - static_cast(-params.redRatio * params.greenExp), - static_cast(-params.greenExp), - static_cast(-params.blueRatio * params.greenExp) - }; + RGB refIn = params.refInput, refOut = params.refOutput; - MyTime t1, t2, t3,t4, t5; + doProcess(input, output, params, this->params->icm, refIn, refOut); - t1.set(); +} - // Channel vectors to calculate medians - std::array, 3> cvs; - // Sample one every 5 pixels, and push the value in the appropriate channel vector. - // Choose an odd step, not a multiple of the CFA size, to get a chance to visit each channel. - if (ri->getSensorType() == ST_BAYER) { - for (int row = 0; row < H; row += 5) { - const int c0 = ri->FC(row, 0); - const int c1 = ri->FC(row, 5); - int col = 0; - for (; col < W - 5; col += 10) { - cvs[c0].push_back(rawData[row][col]); - cvs[c1].push_back(rawData[row][col + 5]); - } - if (col < W) { - cvs[c0].push_back(rawData[row][col]); - } - } - } - else if (ri->getSensorType() == ST_FUJI_XTRANS) { - for (int row = 0; row < H; row += 5) { - const std::array cs = { - ri->XTRANSFC(row, 0), - ri->XTRANSFC(row, 5), - ri->XTRANSFC(row, 10), - ri->XTRANSFC(row, 15), - ri->XTRANSFC(row, 20), - ri->XTRANSFC(row, 25) - }; - int col = 0; - for (; col < W - 25; col += 30) { - for (int c = 0; c < 6; ++c) { - cvs[cs[c]].push_back(rawData[row][col + c * 5]); - } - } - for (int c = 0; col < W; col += 5, ++c) { - cvs[cs[c]].push_back(rawData[row][col]); - } - } - } +bool rtengine::ImProcCoordinator::getFilmNegativeSpot(int x, int y, const int spotSize, RGB &refInput, RGB &refOutput) +{ + MyMutex::MyLock lock(mProcessing); - constexpr float MAX_OUT_VALUE = 65000.f; + const int tr = getCoarseBitMask(params->coarse); - t2.set(); + const Coord2D p = translateCoord(ipf, fw, fh, x, y); + + // Get the average channel values from the sampled spot + RGB avg, max; + getSpotAvgMax(imgsrc, currWB, params, p, tr, spotSize, avg, max); + + float rexp = -(params->filmNegative.greenExp * params->filmNegative.redRatio); + float gexp = -params->filmNegative.greenExp; + float bexp = -(params->filmNegative.greenExp * params->filmNegative.blueRatio); + + float rmult = params->filmNegative.refOutput.r / pow_F(rtengine::max(params->filmNegative.refInput.r, 1.f), rexp); + float gmult = params->filmNegative.refOutput.g / pow_F(rtengine::max(params->filmNegative.refInput.g, 1.f), gexp); + float bmult = params->filmNegative.refOutput.b / pow_F(rtengine::max(params->filmNegative.refInput.b, 1.f), bexp); + + refInput = avg; + + refOutput.r = rmult * pow_F(avg.r, rexp); + refOutput.g = gmult * pow_F(avg.g, gexp); + refOutput.b = bmult * pow_F(avg.b, bexp); + + return true; +} + + + + + + + +// ---------- >>> legacy mode >>> --------------- + + +// For backwards compatibility with profiles saved by RT 5.7 - 5.8 +void rtengine::Thumbnail::processFilmNegative( + const procparams::ProcParams ¶ms, + const Imagefloat* baseImg, + const int rwidth, const int rheight +) +{ + + // Channel exponents + const float rexp = -params.filmNegative.redRatio * params.filmNegative.greenExp; + const float gexp = -params.filmNegative.greenExp; + const float bexp = -params.filmNegative.blueRatio * params.filmNegative.greenExp; + + const float MAX_OUT_VALUE = 65000.f; + + // Channel medians + float rmed, gmed, bmed; + + // If using the old method, calculate medians on the whole image + calcMedians(baseImg, 0, 0, rwidth, rheight, rmed, gmed, bmed); if (settings->verbose) { - printf("Median vector fill loop time us: %d\n", t2.etime(t1)); + printf("FilmNeg legacy V1 :: Thumbnail input channel medians: %g %g %g\n", rmed, gmed, bmed); } - t2.set(); + // Calculate output medians + rmed = powf(rmed, rexp); + gmed = powf(gmed, gexp); + bmed = powf(bmed, bexp); - std::array medians; // Channel median values - std::array mults = { - 1.f, - 1.f, - 1.f - }; // Channel normalization multipliers + // Calculate output multipliers so that the median value is 1/24 of the output range. + float rmult, gmult, bmult; + rmult = (MAX_OUT_VALUE / 24.f) / rmed; + gmult = (MAX_OUT_VALUE / 24.f) / gmed; + bmult = (MAX_OUT_VALUE / 24.f) / bmed; - for (int c = 0; c < 3; ++c) { - // Find median values for each channel - if (!cvs[c].empty()) { - findMinMaxPercentile(cvs[c].data(), cvs[c].size(), 0.5f, medians[c], 0.5f, medians[c], true); - medians[c] = pow_F(rtengine::max(medians[c], 1.f), exps[c]); - // Determine the channel multiplier so that N times the median becomes 65k. This clips away - // the values in the dark border surrounding the negative (due to the film holder, for example), - // the reciprocal of which have blown up to stellar values. - mults[c] = MAX_OUT_VALUE / (medians[c] * 24.f); + float rsum = 0.f, gsum = 0.f, bsum = 0.f; + + for (int i = 0; i < rheight; i++) { + for (int j = 0; j < rwidth; j++) { + rsum += baseImg->r(i, j); + gsum += baseImg->g(i, j); + bsum += baseImg->b(i, j); } } - t3.set(); + const float ravg = rsum / (rheight * rwidth); + const float gavg = gsum / (rheight * rwidth); + const float bavg = bsum / (rheight * rwidth); + + // Shifting current WB multipliers, based on channel averages. + rmult /= gavg / ravg; + // gmult /= gAvg / gAvg; green chosen as reference channel + bmult /= gavg / bavg; if (settings->verbose) { - printf("Sample count: %zu, %zu, %zu\n", cvs[0].size(), cvs[1].size(), cvs[2].size()); - printf("Medians: %g %g %g\n", medians[0], medians[1], medians[2] ); - printf("Computed multipliers: %g %g %g\n", mults[0], mults[1], mults[2] ); - printf("Median calc time us: %d\n", t3.etime(t2)); + printf("FilmNeg legacy V1 :: Thumbnail computed multipliers: %g %g %g\n", static_cast(rmult), static_cast(gmult), static_cast(bmult)); } - constexpr float CLIP_VAL = 65535.f; - - t3.set(); - - if (ri->getSensorType() == ST_BAYER) { #ifdef __SSE2__ - const vfloat onev = F2V(1.f); - const vfloat clipv = F2V(CLIP_VAL); + const vfloat clipv = F2V(MAXVALF); + const vfloat rexpv = F2V(rexp); + const vfloat gexpv = F2V(gexp); + const vfloat bexpv = F2V(bexp); + const vfloat rmultv = F2V(rmult); + const vfloat gmultv = F2V(gmult); + const vfloat bmultv = F2V(bmult); #endif -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, 16) -#endif - for (int row = 0; row < H; ++row) { - int col = 0; - // Avoid trouble with zeroes, minimum pixel value is 1. - const float exps0 = exps[FC(row, col)]; - const float exps1 = exps[FC(row, col + 1)]; - const float mult0 = mults[FC(row, col)]; - const float mult1 = mults[FC(row, col + 1)]; + for (int i = 0; i < rheight; i++) { + float *rline = baseImg->r(i); + float *gline = baseImg->g(i); + float *bline = baseImg->b(i); + int j = 0; #ifdef __SSE2__ - const vfloat expsv = _mm_setr_ps(exps0, exps1, exps0, exps1); - const vfloat multsv = _mm_setr_ps(mult0, mult1, mult0, mult1); - for (; col < W - 3; col += 4) { - STVFU(rawData[row][col], vminf(multsv * pow_F(vmaxf(LVFU(rawData[row][col]), onev), expsv), clipv)); - } -#endif // __SSE2__ - for (; col < W - 1; col += 2) { - rawData[row][col] = rtengine::min(mult0 * pow_F(rtengine::max(rawData[row][col], 1.f), exps0), CLIP_VAL); - rawData[row][col + 1] = rtengine::min(mult1 * pow_F(rtengine::max(rawData[row][col + 1], 1.f), exps1), CLIP_VAL); - } - if (col < W) { - rawData[row][col] = rtengine::min(mult0 * pow_F(rtengine::max(rawData[row][col], 1.f), exps0), CLIP_VAL); - } + + for (; j < rwidth - 3; j += 4) { + STVFU(rline[j], vminf(rmultv * pow_F(LVFU(rline[j]), rexpv), clipv)); + STVFU(gline[j], vminf(gmultv * pow_F(LVFU(gline[j]), gexpv), clipv)); + STVFU(bline[j], vminf(bmultv * pow_F(LVFU(bline[j]), bexpv), clipv)); } - } else if (ri->getSensorType() == ST_FUJI_XTRANS) { -#ifdef __SSE2__ - const vfloat onev = F2V(1.f); - const vfloat clipv = F2V(CLIP_VAL); + #endif -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, 16) -#endif - for (int row = 0; row < H; row ++) { - int col = 0; - // Avoid trouble with zeroes, minimum pixel value is 1. - const std::array expsc = { - exps[ri->XTRANSFC(row, 0)], - exps[ri->XTRANSFC(row, 1)], - exps[ri->XTRANSFC(row, 2)], - exps[ri->XTRANSFC(row, 3)], - exps[ri->XTRANSFC(row, 4)], - exps[ri->XTRANSFC(row, 5)] - }; - const std::array multsc = { - mults[ri->XTRANSFC(row, 0)], - mults[ri->XTRANSFC(row, 1)], - mults[ri->XTRANSFC(row, 2)], - mults[ri->XTRANSFC(row, 3)], - mults[ri->XTRANSFC(row, 4)], - mults[ri->XTRANSFC(row, 5)] - }; -#ifdef __SSE2__ - const vfloat expsv0 = _mm_setr_ps(expsc[0], expsc[1], expsc[2], expsc[3]); - const vfloat expsv1 = _mm_setr_ps(expsc[4], expsc[5], expsc[0], expsc[1]); - const vfloat expsv2 = _mm_setr_ps(expsc[2], expsc[3], expsc[4], expsc[5]); - const vfloat multsv0 = _mm_setr_ps(multsc[0], multsc[1], multsc[2], multsc[3]); - const vfloat multsv1 = _mm_setr_ps(multsc[4], multsc[5], multsc[0], multsc[1]); - const vfloat multsv2 = _mm_setr_ps(multsc[2], multsc[3], multsc[4], multsc[5]); - for (; col < W - 11; col += 12) { - STVFU(rawData[row][col], vminf(multsv0 * pow_F(vmaxf(LVFU(rawData[row][col]), onev), expsv0), clipv)); - STVFU(rawData[row][col + 4], vminf(multsv1 * pow_F(vmaxf(LVFU(rawData[row][col + 4]), onev), expsv1), clipv)); - STVFU(rawData[row][col + 8], vminf(multsv2 * pow_F(vmaxf(LVFU(rawData[row][col + 8]), onev), expsv2), clipv)); - } -#endif // __SSE2__ - for (; col < W - 5; col += 6) { - for (int c = 0; c < 6; ++c) { - rawData[row][col + c] = rtengine::min(multsc[c] * pow_F(rtengine::max(rawData[row][col + c], 1.f), expsc[c]), CLIP_VAL); - } - } - for (int c = 0; col < W; col++, c++) { - rawData[row][col + c] = rtengine::min(multsc[c] * pow_F(rtengine::max(rawData[row][col + c], 1.f), expsc[c]), CLIP_VAL); - } + for (; j < rwidth; ++j) { + rline[j] = CLIP(rmult * pow_F(rline[j], rexp)); + gline[j] = CLIP(gmult * pow_F(gline[j], gexp)); + bline[j] = CLIP(bmult * pow_F(bline[j], bexp)); } } - - t4.set(); - - if (settings->verbose) { - printf("Pow loop time us: %d\n", t4.etime(t3)); - } - - t4.set(); - - PixelsMap bitmapBads(W, H); - - int totBP = 0; // Hold count of bad pixels to correct - - if (ri->getSensorType() == ST_BAYER) { -#ifdef _OPENMP - #pragma omp parallel for reduction(+:totBP) schedule(dynamic,16) -#endif - for (int i = 0; i < H; ++i) { - for (int j = 0; j < W; ++j) { - if (rawData[i][j] >= MAX_OUT_VALUE) { - bitmapBads.set(j, i); - ++totBP; - } - } - } - - if (totBP > 0) { - interpolateBadPixelsBayer(bitmapBads, rawData); - } - - } - else if (ri->getSensorType() == ST_FUJI_XTRANS) { -#ifdef _OPENMP - #pragma omp parallel for reduction(+:totBP) schedule(dynamic,16) -#endif - for (int i = 0; i < H; ++i) { - for (int j = 0; j < W; ++j) { - if (rawData[i][j] >= MAX_OUT_VALUE) { - bitmapBads.set(j, i); - totBP++; - } - } - } - - if (totBP > 0) { - interpolateBadPixelsXtrans(bitmapBads); - } - } - - t5.set(); - - if (settings->verbose) { - printf("Bad pixels count: %d\n", totBP); - printf("Bad pixels interpolation time us: %d\n", t5.etime(t4)); - } } + + +// For backwards compatibility with intermediate dev version (see filmneg_stable_mults branch) +void rtengine::Thumbnail::processFilmNegativeV2( + const procparams::ProcParams ¶ms, + const Imagefloat* baseImg, + const int rwidth, const int rheight +) +{ + + // Channel exponents + const float rexp = -params.filmNegative.redRatio * params.filmNegative.greenExp; + const float gexp = -params.filmNegative.greenExp; + const float bexp = -params.filmNegative.blueRatio * params.filmNegative.greenExp; + + // Calculate output multipliers + float rmult, gmult, bmult; + + const float MAX_OUT_VALUE = 65000.f; + + // If the film base values are not set in params, estimate multipliers from each channel's median value. + if (params.filmNegative.refInput.r <= 0.f) { + + // Channel medians + float rmed, gmed, bmed; + + // The new method cuts out a 20% border from medians calculation. + const int bW = rwidth * 20 / 100; + const int bH = rheight * 20 / 100; + calcMedians(baseImg, bW, bH, rwidth - bW, rheight - bH, rmed, gmed, bmed); + + if (settings->verbose) { + printf("FilmNeg legacy V2 :: Thumbnail input channel medians: %g %g %g\n", rmed, gmed, bmed); + } + + // Calculate output medians + rmed = powf(rmed, rexp); + gmed = powf(gmed, gexp); + bmed = powf(bmed, bexp); + + // Calculate output multipliers so that the median value is 1/24 of the output range. + rmult = (MAX_OUT_VALUE / 24.f) / rmed; + gmult = (MAX_OUT_VALUE / 24.f) / gmed; + bmult = (MAX_OUT_VALUE / 24.f) / bmed; + + } else { + + // Read film-base values from params + float rbase = params.filmNegative.refInput.r; // redBase; + float gbase = params.filmNegative.refInput.g; // greenBase; + float bbase = params.filmNegative.refInput.b; // blueBase; + + // Reconstruct scale_mul coefficients from thumbnail metadata: + // redMultiplier / camwbRed is pre_mul[0] + // pre_mul[0] * scaleGain is scale_mul[0] + // Apply channel scaling to raw (unscaled) input base values, to + // match with actual (scaled) data in baseImg + rbase *= (redMultiplier / camwbRed) * scaleGain; + gbase *= (greenMultiplier / camwbGreen) * scaleGain; + bbase *= (blueMultiplier / camwbBlue) * scaleGain; + + if (settings->verbose) { + printf("FilmNeg legacy V2 :: Thumbnail input film base values: %g %g %g\n", rbase, gbase, bbase); + } + + // Apply exponents to get output film base values + rbase = powf(rbase, rexp); + gbase = powf(gbase, gexp); + bbase = powf(bbase, bexp); + + // Calculate multipliers so that film base value is 1/512th of the output range. + rmult = (MAX_OUT_VALUE / 512.f) / rbase; + gmult = (MAX_OUT_VALUE / 512.f) / gbase; + bmult = (MAX_OUT_VALUE / 512.f) / bbase; + + } + + + // Get and un-apply multipliers to adapt the thumbnail to a known fixed WB setting, + // as in the main image processing. + + double r, g, b; + ColorTemp(3500., 1., 1., "Custom", params.wb.observer).getMultipliers(r, g, b); + //iColorMatrix is cam_rgb + const double rm = camwbRed / (iColorMatrix[0][0] * r + iColorMatrix[0][1] * g + iColorMatrix[0][2] * b); + const double gm = camwbGreen / (iColorMatrix[1][0] * r + iColorMatrix[1][1] * g + iColorMatrix[1][2] * b); + const double bm = camwbBlue / (iColorMatrix[2][0] * r + iColorMatrix[2][1] * g + iColorMatrix[2][2] * b); + + // Normalize max WB multiplier to 1.f + const double m = max(rm, gm, bm); + rmult /= rm / m; + gmult /= gm / m; + bmult /= bm / m; + + + if (settings->verbose) { + printf("FilmNeg legacy V2 :: Thumbnail computed multipliers: %g %g %g\n", static_cast(rmult), static_cast(gmult), static_cast(bmult)); + } + + +#ifdef __SSE2__ + const vfloat clipv = F2V(MAXVALF); + const vfloat rexpv = F2V(rexp); + const vfloat gexpv = F2V(gexp); + const vfloat bexpv = F2V(bexp); + const vfloat rmultv = F2V(rmult); + const vfloat gmultv = F2V(gmult); + const vfloat bmultv = F2V(bmult); +#endif + + for (int i = 0; i < rheight; i++) { + float *rline = baseImg->r(i); + float *gline = baseImg->g(i); + float *bline = baseImg->b(i); + int j = 0; +#ifdef __SSE2__ + + for (; j < rwidth - 3; j += 4) { + STVFU(rline[j], vminf(rmultv * pow_F(LVFU(rline[j]), rexpv), clipv)); + STVFU(gline[j], vminf(gmultv * pow_F(LVFU(gline[j]), gexpv), clipv)); + STVFU(bline[j], vminf(bmultv * pow_F(LVFU(bline[j]), bexpv), clipv)); + } + +#endif + + for (; j < rwidth; ++j) { + rline[j] = CLIP(rmult * pow_F(rline[j], rexp)); + gline[j] = CLIP(gmult * pow_F(gline[j], gexp)); + bline[j] = CLIP(bmult * pow_F(bline[j], bexp)); + } + } +} + +// ----------------- <<< legacy mode <<< ------------ + + diff --git a/rtengine/filmnegativethumb.cc b/rtengine/filmnegativethumb.cc deleted file mode 100644 index b31432a55..000000000 --- a/rtengine/filmnegativethumb.cc +++ /dev/null @@ -1,124 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2019 Alberto Romei - * - * 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 "LUT.h" -#include "rtengine.h" -#include "rtthumbnail.h" -#include "opthelper.h" -#include "sleef.h" -#include "rt_algo.h" -#include "settings.h" -#include "procparams.h" -#define BENCHMARK -#include "StopWatch.h" - -void rtengine::Thumbnail::processFilmNegative( - const procparams::ProcParams ¶ms, - const Imagefloat* baseImg, - const int rwidth, const int rheight, - float &rmi, float &gmi, float &bmi -) { - - // Channel exponents - const float rexp = -params.filmNegative.redRatio * params.filmNegative.greenExp; - const float gexp = -params.filmNegative.greenExp; - const float bexp = -params.filmNegative.blueRatio * params.filmNegative.greenExp; - - // Need to calculate channel averages, to fake the same conditions - // found in rawimagesource, where get_ColorsCoeff is called with - // forceAutoWB=true. - float rsum = 0.f, gsum = 0.f, bsum = 0.f; - - // Channel vectors to calculate medians - std::vector rv, gv, bv; - - for (int i = 0; i < rheight; i++) { - for (int j = 0; j < rwidth; j++) { - const float r = baseImg->r(i, j); - const float g = baseImg->g(i, j); - const float b = baseImg->b(i, j); - - rsum += r; - gsum += g; - bsum += b; - - rv.push_back(r); - gv.push_back(g); - bv.push_back(b); - } - } - - const float ravg = rsum / (rheight*rwidth); - const float gavg = gsum / (rheight*rwidth); - const float bavg = bsum / (rheight*rwidth); - - // Shifting current WB multipliers, based on channel averages. - rmi /= (gavg/ravg); - // gmi /= (gAvg/gAvg); green chosen as reference channel - bmi /= (gavg/bavg); - - float rmed, gmed, bmed; - findMinMaxPercentile(rv.data(), rv.size(), 0.5f, rmed, 0.5f, rmed, true); - findMinMaxPercentile(gv.data(), gv.size(), 0.5f, gmed, 0.5f, gmed, true); - findMinMaxPercentile(bv.data(), bv.size(), 0.5f, bmed, 0.5f, bmed, true); - - rmed = powf(rmed, rexp); - gmed = powf(gmed, gexp); - bmed = powf(bmed, bexp); - - const float MAX_OUT_VALUE = 65000.f; - const float rmult = (MAX_OUT_VALUE / (rmed * 24)) ; - const float gmult = (MAX_OUT_VALUE / (gmed * 24)) ; - const float bmult = (MAX_OUT_VALUE / (bmed * 24)) ; - - if (settings->verbose) { - printf("Thumbnail channel medians: %g %g %g\n", rmed, gmed, bmed); - printf("Thumbnail computed multipliers: %g %g %g\n", rmult, gmult, bmult); - } - -#ifdef __SSE2__ - const vfloat clipv = F2V(MAXVALF); - const vfloat rexpv = F2V(rexp); - const vfloat gexpv = F2V(gexp); - const vfloat bexpv = F2V(bexp); - const vfloat rmultv = F2V(rmult); - const vfloat gmultv = F2V(gmult); - const vfloat bmultv = F2V(bmult); -#endif - - for (int i = 0; i < rheight; i++) { - float *rline = baseImg->r(i); - float *gline = baseImg->g(i); - float *bline = baseImg->b(i); - int j = 0; -#ifdef __SSE2__ - for (; j < rwidth - 3; j +=4) { - STVFU(rline[j], vminf(rmultv * pow_F(LVFU(rline[j]), rexpv), clipv)); - STVFU(gline[j], vminf(gmultv * pow_F(LVFU(gline[j]), gexpv), clipv)); - STVFU(bline[j], vminf(bmultv * pow_F(LVFU(bline[j]), bexpv), clipv)); - } -#endif - for (; j < rwidth; ++j) { - rline[j] = CLIP(rmult * pow_F(rline[j], rexp)); - gline[j] = CLIP(gmult * pow_F(gline[j], gexp)); - bline[j] = CLIP(bmult * pow_F(bline[j], bexp)); - } - } -} diff --git a/rtengine/fujicompressed.cc b/rtengine/fujicompressed.cc index 45622eb7f..c1c620657 100644 --- a/rtengine/fujicompressed.cc +++ b/rtengine/fujicompressed.cc @@ -25,7 +25,7 @@ int bitDiff (int value1, int value2) int decBits = 0; if ( value2 < value1 ) - while (decBits <= 12 && (value2 << ++decBits) < value1) + while (decBits <= 14 && (value2 << ++decBits) < value1) ; return decBits; @@ -42,7 +42,7 @@ void CLASS init_fuji_compr (struct fuji_compressed_params* info) derror(); } - info->q_table = (char *) malloc (32768); + info->q_table = (char *) malloc (2 << fuji_bits); merror (info->q_table, "init_fuji_compr()"); if (fuji_raw_type == 16) { @@ -83,19 +83,23 @@ void CLASS init_fuji_compr (struct fuji_compressed_params* info) } // populting gradients - if (info->q_point[4] == 0x3FFF) { - info->total_values = 0x4000; - info->raw_bits = 14; - info->max_bits = 56; - info->maxDiff = 256; - } else if (info->q_point[4] == 0xFFF) { - info->total_values = 4096; - info->raw_bits = 12; - info->max_bits = 48; - info->maxDiff = 64; - } else { - derror(); - } + //if (info->q_point[4] == 0x3FFF) { + // info->total_values = 0x4000; + // info->raw_bits = 14; + // info->max_bits = 56; + // info->maxDiff = 256; + //} else if (info->q_point[4] == 0xFFF) { + // info->total_values = 4096; + // info->raw_bits = 12; + // info->max_bits = 48; + // info->maxDiff = 64; + //} else { + // derror(); + //} + info->total_values = (1 << fuji_bits); + info->raw_bits = fuji_bits; + info->max_bits = 4 * info->raw_bits; + info->maxDiff = info->total_values >> 6; } #define FUJI_BUF_SIZE 0x10000u @@ -1017,7 +1021,7 @@ void CLASS parse_fuji_compressed_header() || h_total_lines > 0x800 || h_total_lines == 0 || h_total_lines != h_raw_height / 6 - || (h_raw_bits != 12 && h_raw_bits != 14) + || (h_raw_bits != 12 && h_raw_bits != 14 && h_raw_bits != 16) || (h_raw_type != 16 && h_raw_type != 0)) { xtransCompressed = false; return; diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index 8d9e5de38..99201a860 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -1355,7 +1355,6 @@ template void gaussVerticalmult (T** src, T** dst, const int W, const i template void gaussianBlurImpl(T** src, T** dst, const int W, const int H, const double sigma, bool useBoxBlur, eGaussType gausstype = GAUSS_STANDARD, T** buffer2 = nullptr) { - static constexpr auto GAUSS_SKIP = 0.25; static constexpr auto GAUSS_3X3_LIMIT = 0.6; static constexpr auto GAUSS_5X5_LIMIT = 0.84; static constexpr auto GAUSS_7X7_LIMIT = 1.15; @@ -1405,6 +1404,9 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int } else { if (sigma < GAUSS_SKIP) { // don't perform filtering +#ifdef _OPENMP +#pragma omp single +#endif if (src != dst) { for(int i = 0; i < H; ++i) { memcpy(dst[i], src[i], W * sizeof(T)); diff --git a/rtengine/gauss.h b/rtengine/gauss.h index e226bbc13..71e3506da 100644 --- a/rtengine/gauss.h +++ b/rtengine/gauss.h @@ -19,5 +19,7 @@ #pragma once enum eGaussType {GAUSS_STANDARD, GAUSS_MULT, GAUSS_DIV}; +static constexpr auto GAUSS_SKIP = 0.25; + void gaussianBlur(float** src, float** dst, const int W, const int H, const double sigma, bool useBoxBlur = false, eGaussType gausstype = GAUSS_STANDARD, float** buffer2 = nullptr); diff --git a/rtengine/green_equil_RT.cc b/rtengine/green_equil_RT.cc index fc4f18548..a66bca160 100644 --- a/rtengine/green_equil_RT.cc +++ b/rtengine/green_equil_RT.cc @@ -47,7 +47,7 @@ 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]; + avgg += static_cast(rawData[i][j]); } int ng = (W - 2 * border + (FC(i, border) & 1)) / 2; @@ -71,15 +71,15 @@ void RawImageSource::green_equilibrate_global(array2D &rawData) avgg2 = 1.0; } - double corrg1 = (avgg1 / ng1 + avgg2 / ng2) / 2.0 / (avgg1 / ng1); - double corrg2 = (avgg1 / ng1 + avgg2 / ng2) / 2.0 / (avgg2 / ng2); + const float corrg1 = (avgg1 / ng1 + avgg2 / ng2) / 2.0 / (avgg1 / ng1); + const float corrg2 = (avgg1 / ng1 + avgg2 / ng2) / 2.0 / (avgg2 / ng2); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif for (int i = border; i < H - border; i++) { - double corrg = (i & 1) ? corrg2 : corrg1; + const float corrg = (i & 1) ? corrg2 : corrg1; for (int j = border + ((FC(i, border) & 1) ^ 1); j < W - border; j += 2) { rawData[i][j] *= corrg; @@ -220,7 +220,7 @@ void RawImageSource::green_equilibrate(const GreenEqulibrateThreshold &thresh, a float tf = thresh(rr, cc); - if (c1 + c2 < 6 * tf * fabs(d1 - d2)) { + if (c1 + c2 < 6 * tf * std::fabs(d1 - d2)) { //pixel interpolation float gin = cfa[rr][cc >> 1]; diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc index 6b2adb773..3f5e00e05 100644 --- a/rtengine/guidedfilter.cc +++ b/rtengine/guidedfilter.cc @@ -3,7 +3,6 @@ * This file is part of RawTherapee. * * Copyright (c) 2018 Alberto Griggio - * Optimized 2019 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 @@ -16,10 +15,10 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . -*/ + * along with RawTherapee. If not, see . + */ -/* +/** * This is a Fast Guided Filter implementation, derived directly from the * pseudo-code of the paper: * @@ -27,21 +26,36 @@ * by Kaiming He, Jian Sun * * available at https://arxiv.org/abs/1505.00996 -*/ + */ +#include "array2D.h" #include "boxblur.h" #include "guidedfilter.h" -#include "imagefloat.h" +#include "boxblur.h" +#include "sleef.h" #include "rescale.h" +#include "imagefloat.h" -#define BENCHMARK -#include "StopWatch.h" +namespace rtengine { -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 -{ + +namespace { int calculate_subsampling(int w, int h, int r) { @@ -64,129 +78,203 @@ int calculate_subsampling(int w, int h, int r) } // namespace + void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling) { - enum Op {MUL, DIVEPSILON, SUBMUL}; + + const int W = src.getWidth(); + const int H = src.getHeight(); + + if (subsampling <= 0) { + subsampling = calculate_subsampling(W, H, r); + } + + enum Op { MUL, DIVEPSILON, ADD, SUB, ADDMUL, SUBMUL }; const auto apply = -#ifdef _OPENMP - [multithread, epsilon](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void -#else - // removed multithread to fix clang warning on msys2 clang builds, which don't support OpenMp - [epsilon](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void -#endif + [=](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(); + const int w = res.getWidth(); + const int h = res.getHeight(); #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: - res[y][x] = a[y][x] * b[y][x]; - break; - case DIVEPSILON: - res[y][x] = a[y][x] / (b[y][x] + epsilon); // note: the value of epsilon intentionally has an impact on the result. It is not only to avoid divisions by zero - break; - case SUBMUL: - res[y][x] = c[y][x] - (a[y][x] * b[y][x]); - break; - default: - assert(false); - res[y][x] = 0; - break; + 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 = - [multithread](array2D &d, const array2D &s) -> void + [=](array2D &d, const array2D &s) -> void { - rescaleBilinear(s, d, multithread); + if (d.getWidth() == s.getWidth() && d.getHeight() == s.getHeight()) { +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < s.getHeight(); ++y) { + for (int x = 0; x < s.getWidth(); ++x) { + d[y][x] = s[y][x]; + } + } + } else { + rescaleBilinear(s, d, multithread); + } }; + // const auto f_upsample = f_subsample; + + const size_t w = W / subsampling; + const size_t h = H / subsampling; + const auto f_mean = [multithread](array2D &d, array2D &s, int rad) -> void { - rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1); - boxblur(static_cast(s), static_cast(d), rad, s.width(), s.height(), multithread); + rad = LIM(rad, 0, (min(s.getWidth(), s.getHeight()) - 1) / 2 - 1); + // boxblur(s, d, rad, s.getWidth(), s.getHeight(), multithread); + boxblur(static_cast(s), static_cast(d), rad, s.getWidth(), s.getHeight(), multithread); }; - const int W = src.width(); - const int H = src.height(); - - if (subsampling <= 0) { - subsampling = calculate_subsampling(W, H, r); - } - - const size_t w = W / subsampling; - const size_t h = H / subsampling; - const float r1 = float(r) / subsampling; - array2D I1(w, h); array2D p1(w, h); - f_subsample(I1, guide); + f_subsample(I1, I); + f_subsample(p1, p); - if (&guide == &src) { - f_mean(p1, I1, r1); + DEBUG_DUMP(I); + DEBUG_DUMP(p); + DEBUG_DUMP(I1); + DEBUG_DUMP(p1); - apply(MUL, I1, I1, I1); // I1 = I1 * I1 + float r1 = float(r) / subsampling; - f_mean(I1, I1, r1); + array2D meanI(w, h); + f_mean(meanI, I1, r1); + DEBUG_DUMP(meanI); - apply(SUBMUL, I1, p1, p1, I1); // I1 = I1 - p1 * p1 - apply(DIVEPSILON, I1, I1, I1); // I1 = I1 / (I1 + epsilon) - apply(SUBMUL, p1, I1, p1, p1); // p1 = p1 - I1 * p1 + array2D meanp(w, h); + f_mean(meanp, p1, r1); + DEBUG_DUMP(meanp); - } else { - f_subsample(p1, src); + array2D &corrIp = p1; + apply(MUL, corrIp, I1, p1); + f_mean(corrIp, corrIp, r1); + DEBUG_DUMP(corrIp); - array2D meanI(w, h); - f_mean(meanI, I1, r1); + array2D &corrI = I1; + apply(MUL, corrI, I1, I1); + f_mean(corrI, corrI, r1); + DEBUG_DUMP(corrI); - array2D meanp(w, h); - f_mean(meanp, p1, r1); + array2D &varI = corrI; + apply(SUBMUL, varI, meanI, meanI, corrI); + DEBUG_DUMP(varI); - apply(MUL, p1, I1, p1); + array2D &covIp = corrIp; + apply(SUBMUL, covIp, meanI, meanp, corrIp); + DEBUG_DUMP(covIp); - f_mean(p1, p1, r1); + array2D &a = varI; + apply(DIVEPSILON, a, covIp, varI); + DEBUG_DUMP(a); - apply(MUL, I1, I1, I1); + array2D &b = covIp; + apply(SUBMUL, b, a, meanI, meanp); + DEBUG_DUMP(b); - f_mean(I1, I1, r1); + array2D &meana = a; + f_mean(meana, a, r1); + DEBUG_DUMP(meana); - apply(SUBMUL, I1, meanI, meanI, I1); - apply(SUBMUL, p1, meanI, meanp, p1); - apply(DIVEPSILON, I1, p1, I1); - apply(SUBMUL, p1, I1, meanI, meanp); - } + array2D &meanb = b; + f_mean(meanb, b, r1); + DEBUG_DUMP(meanb); - f_mean(I1, I1, r1); - f_mean(p1, p1, r1); - - const int Ws = I1.width(); - const int Hs = I1.height(); - const int Wd = dst.width(); - const int Hd = dst.height(); - - const float col_scale = static_cast(Ws) / static_cast(Wd); - const float row_scale = static_cast(Hs) / static_cast(Hd); + // speedup by heckflosse67 + const int Ws = meana.getWidth(); + const int Hs = meana.getHeight(); + const int Wd = q.getWidth(); + const int Hd = q.getHeight(); + const float col_scale = float(Ws) / float(Wd); + const float row_scale = float(Hs) / float(Hd); #ifdef _OPENMP - #pragma omp parallel for if (multithread) +# pragma omp parallel for if (multithread) #endif - for (int y = 0; y < Hd; ++y) { - const float ymrs = y * row_scale; + float ymrs = y * row_scale; for (int x = 0; x < Wd; ++x) { - dst[y][x] = getBilinearValue(I1, x * col_scale, ymrs) * guide[y][x] + getBilinearValue(p1, x * col_scale, ymrs); + q[y][x] = getBilinearValue(meana, x * col_scale, ymrs) * I[y][x] + getBilinearValue(meanb, x * col_scale, ymrs); } } } + +void guidedFilterLog(const array2D &guide, float base, array2D &chan, int r, float eps, bool multithread, int subsampling) +{ +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < chan.getHeight(); ++y) { + for (int x = 0; x < chan.getWidth(); ++x) { + chan[y][x] = xlin2log(max(chan[y][x], 0.f), base); + } + } + + guidedFilter(guide, chan, chan, r, eps, multithread, subsampling); + +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < chan.getHeight(); ++y) { + for (int x = 0; x < chan.getWidth(); ++x) { + chan[y][x] = xlog2lin(max(chan[y][x], 0.f), base); + } + } +} + + +void guidedFilterLog(float base, array2D &chan, int r, float eps, bool multithread, int subsampling) +{ + guidedFilterLog(chan, base, chan, r, eps, multithread, subsampling); +} + } // namespace rtengine + + + + diff --git a/rtengine/guidedfilter.h b/rtengine/guidedfilter.h index 2d8b70369..94147b411 100644 --- a/rtengine/guidedfilter.h +++ b/rtengine/guidedfilter.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . + * along with RawTherapee. If not, see . */ #pragma once @@ -28,4 +28,8 @@ namespace rtengine void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling=0); +void guidedFilterLog(float base, array2D &chan, int r, float eps, bool multithread, int subsampling=0); + +void guidedFilterLog(const array2D &guide, float base, array2D &chan, int r, float eps, bool multithread, int subsampling=0); + } // namespace rtengine diff --git a/rtengine/helperavx.h b/rtengine/helperavx.h index 528760a92..de4ecf880 100644 --- a/rtengine/helperavx.h +++ b/rtengine/helperavx.h @@ -3,6 +3,11 @@ // this code was taken from http://shibatch.sourceforge.net/ // Many thanks to the author: Naoki Shibata // +// Copyright Naoki Shibata and contributors 2010 - 2021. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file sleef_LICENSE.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// //////////////////////////////////////////////////////////////// #ifndef __AVX__ #error Please specify -mavx. diff --git a/rtengine/helpersse2.h b/rtengine/helpersse2.h index e8c489b04..8e87032f0 100644 --- a/rtengine/helpersse2.h +++ b/rtengine/helpersse2.h @@ -3,6 +3,11 @@ // this code was taken from http://shibatch.sourceforge.net/ // Many thanks to the author of original version: Naoki Shibata // +// Copyright Naoki Shibata and contributors 2010 - 2021. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file sleef_LICENSE.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// // This version contains modifications made by Ingo Weyrich // //////////////////////////////////////////////////////////////// diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 697a5e3d3..f573ff015 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -32,6 +32,15 @@ #include "opthelper.h" #include "rawimagesource.h" #include "rt_math.h" +#define BENCHMARK +#include "StopWatch.h" +#include "guidedfilter.h" +#include "settings.h" +#include "gauss.h" +#include "rescale.h" +#include "iccstore.h" +#include "color.h" +#include "linalgebra.h" namespace { @@ -287,9 +296,13 @@ void boxblur_resamp(const float* const* src, float** dst, float** temp, int H, i namespace rtengine { +extern const Settings *settings; +using namespace procparams; + const ProcParams params; -void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue) -{ +void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue, int blur) +{ + //BENCHFUN double progress = 0.0; if (plistener) { @@ -306,7 +319,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue constexpr float threshpct = 0.25f; constexpr float maxpct = 0.95f; constexpr float epsilon = 0.00001f; - //%%%%%%%%%%%%%%%%%%%% + //for blend algorithm: constexpr float blendthresh = 1.0; // Transform matrixes rgb>lab and back @@ -323,7 +336,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue if (settings->verbose) { for (int c = 0; c < 3; ++c) { - printf("chmax[%d] : %f\tclmax[%d] : %f\tratio[%d] : %f\n", c, chmax[c], c, clmax[c], c, chmax[c] / clmax[c]); + printf("chmax[%d] : %f\tclmax[%d] : %f\tratio[%d] : %f\n", c, static_cast(chmax[c]), c, static_cast(clmax[c]), c, static_cast(chmax[c] / clmax[c])); } } @@ -366,7 +379,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue if (settings->verbose) { for (int c = 0; c < 3; ++c) { - printf("correction factor[%d] : %f\n", c, factor[c]); + printf("correction factor[%d] : %f\n", c, static_cast(factor[c])); } } @@ -394,7 +407,9 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue int miny = height - 1; int maxy = 0; +#ifdef _OPENMP #pragma omp parallel for reduction(min:minx,miny) reduction(max:maxx,maxy) schedule(dynamic, 16) +#endif for (int i = 0; i < height; ++i) { for (int j = 0; j< width; ++j) { if (red[i][j] >= max_f[0] || green[i][j] >= max_f[1] || blue[i][j] >= max_f[2]) { @@ -410,11 +425,6 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue return; } - if (plistener) { - progress += 0.05; - plistener->setProgress(progress); - } - constexpr int blurBorder = 256; minx = std::max(0, minx - blurBorder); miny = std::max(0, miny - blurBorder); @@ -428,21 +438,8 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue array2D temp(bufferWidth, blurHeight); // allocate temporary buffer // blur RGB channels - boxblur2(red, channelblur[0], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); - - if (plistener) { - progress += 0.07; - plistener->setProgress(progress); - } - boxblur2(green, channelblur[1], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); - - if (plistener) { - progress += 0.07; - plistener->setProgress(progress); - } - boxblur2(blue, channelblur[2], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); if (plistener) { @@ -456,7 +453,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue #endif for (int i = 0; i < blurHeight; ++i) { for (int j = 0; j < blurWidth; ++j) { - channelblur[0][i][j] = fabsf(channelblur[0][i][j] - red[i + miny][j + minx]) + fabsf(channelblur[1][i][j] - green[i + miny][j + minx]) + fabsf(channelblur[2][i][j] - blue[i + miny][j + minx]); + channelblur[0][i][j] = std::fabs(channelblur[0][i][j] - red[i + miny][j + minx]) + std::fabs(channelblur[1][i][j] - green[i + miny][j + minx]) + std::fabs(channelblur[2][i][j] - blue[i + miny][j + minx]); } } @@ -496,7 +493,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue && blue[i + miny][j + minx] < max_f[2] ) { // if one or more channels is highlight but none are blown, add to highlight accumulator - hipass_sum += channelblur[0][i][j]; + hipass_sum += static_cast(channelblur[0][i][j]); ++hipass_norm; hilite_full[0][i][j] = red[i + miny][j + minx]; @@ -507,7 +504,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue } } - const float hipass_ave = 2.f * hipass_sum / (hipass_norm + epsilon); + const float hipass_ave = 2.0 * hipass_sum / (hipass_norm + static_cast(epsilon)); if (plistener) { progress += 0.05; @@ -515,7 +512,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue } array2D hilite_full4(bufferWidth, blurHeight); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + //blur highlight data boxblur2(hilite_full[3], hilite_full4, temp, 0, 0, blurHeight, blurWidth, bufferWidth, 1); @@ -552,9 +549,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue multi_array2D hilite(hfw + 1, hfh + 1, ARRAY2D_CLEAR_DATA, 48); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // blur and resample highlight data; range=size of blur, pitch=sample spacing - array2D temp2(blurWidth / pitch + (blurWidth % pitch == 0 ? 0 : 1), blurHeight); for (int m = 0; m < 4; ++m) { @@ -637,11 +632,11 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue } if (hilite[3][2][j] <= epsilon) { - hilite_dir[0 + c][0][j] = hilite_dir0[c][j][2]; + hilite_dir[0 + c][0][j] = hilite_dir0[c][j][2]; } if (hilite[3][3][j] <= epsilon) { - hilite_dir[0 + c][1][j] = hilite_dir0[c][j][3]; + hilite_dir[0 + c][1][j] = hilite_dir0[c][j][3]; } if (hilite[3][hfh - 3][j] <= epsilon) { @@ -924,8 +919,43 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue hilite[c].free(); } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // now reconstruct clipped channels using color ratios + //using code from ART - thanks to Alberto Griggio + const int W2 = blur > 0 ? blurWidth / 2.f + 0.5f : 0; + const int H2 = blur > 0 ? blurHeight / 2.f + 0.5f : 0; + array2D mask(W2, H2, ARRAY2D_CLEAR_DATA); + array2D rbuf(W2, H2); + array2D gbuf(W2, H2); + array2D bbuf(W2, H2); + array2D guide(W2, H2); + + if (blur > 0) { + array2D rbuffer(blurWidth, blurHeight, minx, miny, red, ARRAY2D_BYREFERENCE); + rescaleNearest(rbuffer, rbuf, true); + array2D gbuffer(blurWidth, blurHeight, minx, miny, green, ARRAY2D_BYREFERENCE); + rescaleNearest(gbuffer, gbuf, true); + array2D bbuffer(blurWidth, blurHeight, minx, miny, blue, ARRAY2D_BYREFERENCE); + rescaleNearest(bbuffer, bbuf, true); + + LUTf gamma(65536); +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < 65536; ++i) { + gamma[i] = pow_F(i / 65535.f, 2.2f); + } + + const float xyzcam[3] = {static_cast(imatrices.xyz_cam[1][0]), static_cast(imatrices.xyz_cam[1][1]), static_cast(imatrices.xyz_cam[1][2])}; +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < H2; ++y) { + for (int x = 0; x < W2; ++x) { + guide[y][x] = gamma[Color::rgbLuminance(rbuf[y][x], gbuf[y][x], bbuf[y][x], xyzcam)]; + } + } + } +//end adding code ART #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -1006,21 +1036,20 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue // Copy converted pixel back if (pixel[0] > blendpt) { const float rfrac = LIM01(medFactor[0] * (pixel[0] - blendpt)); - rgb_blend[0] = rfrac * rgb[0] + (1.f - rfrac) * pixel[0]; + rgb_blend[0] = intp(rfrac, rgb[0], pixel[0]); } if (pixel[1] > blendpt) { const float gfrac = LIM01(medFactor[1] * (pixel[1] - blendpt)); - rgb_blend[1] = gfrac * rgb[1] + (1.f - gfrac) * pixel[1]; + rgb_blend[1] = intp(gfrac, rgb[1], pixel[1]); } if (pixel[2] > blendpt) { const float bfrac = LIM01(medFactor[2] * (pixel[2] - blendpt)); - rgb_blend[2] = bfrac * rgb[2] + (1.f - bfrac) * pixel[2]; + rgb_blend[2] = intp(bfrac, rgb[2], pixel[2]); } //end of HLRecovery_blend estimation - //%%%%%%%%%%%%%%%%%%%%%%% //there are clipped highlights //first, determine weighted average of unclipped extensions (weighting is by 'hue' proximity) @@ -1046,7 +1075,7 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue } for (int dir = 0; dir < 2; ++dir) { - const float Yhi2 = 1.f / ( hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]); + const float Yhi2 = 1.f / (hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]); if (Yhi2 < 2.f) { const float dirwt = 1.f / ((1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir[dir * 4 + 0][i1][j1] * Yhi2) + @@ -1076,14 +1105,18 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue continue; } + //using code from ART - thanks to Alberto Griggio + float maskval = 1.f; + const int yy = i + miny; + const int xx = j + minx; + //now correct clipped channels if (pixel[0] > max_f[0] && pixel[1] > max_f[1] && pixel[2] > max_f[2]) { //all channels clipped - const float mult = whitept / (0.299f * clipfix[0] + 0.587f * clipfix[1] + 0.114f * clipfix[2]); - red[i + miny][j + minx] = clipfix[0] * mult; - green[i + miny][j + minx] = clipfix[1] * mult; - blue[i + miny][j + minx] = clipfix[2] * mult; + red[yy][xx] = clipfix[0] * mult; + green[yy][xx] = clipfix[1] * mult; + blue[yy][xx] = clipfix[2] * mult; } else {//some channels clipped const float notclipped[3] = { pixel[0] <= max_f[0] ? 1.f : 0.f, @@ -1092,29 +1125,98 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue }; if (notclipped[0] == 0.f) { //red clipped - red[i + miny][j + minx] = max(pixel[0], clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) / + red[yy][xx] = max(pixel[0], clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) / (notclipped[1] * clipfix[1] + notclipped[2] * clipfix[2] + epsilon))); } if (notclipped[1] == 0.f) { //green clipped - green[i + miny][j + minx] = max(pixel[1], clipfix[1] * ((notclipped[2] * pixel[2] + notclipped[0] * pixel[0]) / + green[yy][xx] = max(pixel[1], clipfix[1] * ((notclipped[2] * pixel[2] + notclipped[0] * pixel[0]) / (notclipped[2] * clipfix[2] + notclipped[0] * clipfix[0] + epsilon))); } if (notclipped[2] == 0.f) { //blue clipped - blue[i + miny][j + minx] = max(pixel[2], clipfix[2] * ((notclipped[0] * pixel[0] + notclipped[1] * pixel[1]) / + blue[yy][xx] = max(pixel[2], clipfix[2] * ((notclipped[0] * pixel[0] + notclipped[1] * pixel[1]) / (notclipped[0] * clipfix[0] + notclipped[1] * clipfix[1] + epsilon))); } + + maskval = 1.f - (notclipped[0] + notclipped[1] + notclipped[2]) / 5.f; } - Y = 0.299f * red[i + miny][j + minx] + 0.587f * green[i + miny][j + minx] + 0.114f * blue[i + miny][j + minx]; + Y = 0.299f * red[yy][xx] + 0.587f * green[yy][xx] + 0.114f * blue[yy][xx]; if (Y > whitept) { const float mult = whitept / Y; + red[yy][xx] *= mult; + green[yy][xx] *= mult; + blue[yy][xx] *= mult; + } - red[i + miny][j + minx] *= mult; - green[i + miny][j + minx] *= mult; - blue[i + miny][j + minx] *= mult; + if (blur > 0) { + const int ii = i / 2; + const int jj = j / 2; + rbuf[ii][jj] = red[yy][xx]; + gbuf[ii][jj] = green[yy][xx]; + bbuf[ii][jj] = blue[yy][xx]; + mask[ii][jj] = maskval; + } + } + } + + if (blur > 0) { + if (plistener) { + progress += 0.05; + plistener->setProgress(progress); + } + blur = rtengine::LIM(blur - 1, 0, 3); + + constexpr float vals[4][3] = {{4.0f, 0.3f, 0.3f}, + // {3.5f, 0.5f, 0.2f}, + {3.0f, 1.0f, 0.1f}, + {3.0f, 2.0f, 0.01f}, + {2.0f, 3.0f, 0.001f} + }; + + const float rad1 = vals[blur][0]; + const float rad2 = vals[blur][1]; + const float th = vals[blur][2]; + + guidedFilter(guide, mask, mask, rad1, th, true, 1); + if (plistener) { + progress += 0.03; + plistener->setProgress(progress); + } + if (blur > 0) { //no use of 2nd guidedFilter if Blur = 0 (slider to 1)..speed-up and very small differences. + guidedFilter(guide, rbuf, rbuf, rad2, 0.01f * 65535.f, true, 1); + if (plistener) { + progress += 0.03; + plistener->setProgress(progress); + } + guidedFilter(guide, gbuf, gbuf, rad2, 0.01f * 65535.f, true, 1); + if (plistener) { + progress += 0.03; + plistener->setProgress(progress); + } + guidedFilter(guide, bbuf, bbuf, rad2, 0.01f * 65535.f, true, 1); + if (plistener) { + progress += 0.03; + plistener->setProgress(progress); + } + } +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < blurHeight; ++y) { + const float fy = y * 0.5f; + const int yy = y / 2; + for (int x = 0; x < blurWidth; ++x) { + const int xx = x / 2; + const float m = mask[yy][xx]; + if (m > 0.f) { + const float fx = x * 0.5f; + red[y + miny][x + minx] = intp(m, getBilinearValue(rbuf, fx, fy), red[y + miny][x + minx]); + green[y + miny][x + minx] = intp(m, getBilinearValue(gbuf, fx, fy), green[y + miny][x + minx]); + blue[y + miny][x + minx] = intp(m, getBilinearValue(bbuf, fx, fy), blue[y + miny][x + minx]); + } } } } @@ -1125,5 +1227,371 @@ void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue }// end of HLReconstruction + +//----------------------------------------------------------------------------- +// "inpaint opposed" algorithm taken from darktable +// +// (Very effective, very simple, very neat) +// +// Kudos to the original authors (@jenshannoschwalm from dt, in collaboration +// with @garagecoder and @Iain from gmic). +// +// Copyright and description of the original code follows +// +/* + Copyright (C) 2022 darktable developers. + + darktable is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + darktable is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with darktable. If not, see . +*/ + +/* The refavg values are calculated in raw-RGB-cube3 space + We calculate all color channels in the 3x3 photosite area, this can be understaood as a "superpixel", + the "asking" location is in the centre. + As this works for bayer and xtrans sensors we don't have a fixed ratio but calculate the average + for every color channel first. + refavg for one of red, green or blue is defined as means of both other color channels (opposing). + + The basic idea / observation for the _process_opposed algorithm is, the refavg is a good estimate + for any clipped color channel in the vast majority of images, working mostly fine both for small specular + highlighted spots and large areas. + + The correction via some sort of global chrominance further helps to correct color casts. + The chrominace data are taken from the areas morphologically very close to clipped data. + Failures of the algorithm (color casts) are in most cases related to + a) very large differences between optimal white balance coefficients vs what we have as D65 in the darktable pipeline + b) complicated lightings so the gradients are not well related + c) a wrong whitepoint setting in the rawprepare module. + d) the maths might not be best +*/ +//----------------------------------------------------------------------------- + +namespace { + +constexpr int HL_BORDER = 8; +constexpr float HL_POWERF = 3.0f; + +// void border_fill_zero(int *d, int width, int height) +// { +// for (int i = 0; i < HL_BORDER * width; i++) { +// d[i] = 0; +// } +// for (int i = (height - HL_BORDER - 1) * width; i < width*height; i++) { +// d[i] = 0; +// } +// for (int row = HL_BORDER; row < height - HL_BORDER; row++) { +// int *p1 = d + row*width; +// int *p2 = d + (row+1)*width - HL_BORDER; +// for(int i = 0; i < HL_BORDER; i++) { +// p1[i] = p2[i] = 0; +// } +// } +// } + + +int test_dilate(const int *img, int i, int w1) +{ + int retval = 0; + retval = img[i-w1-1] | img[i-w1] | img[i-w1+1] | + img[i-1] | img[i] | img[i+1] | + img[i+w1-1] | img[i+w1] | img[i+w1+1]; + if (retval) { + return retval; + } + + const size_t w2 = 2*w1; + retval = img[i-w2-1] | img[i-w2] | img[i-w2+1] | + img[i-w1-2] | img[i-w1+2] | + img[i-2] | img[i+2] | + img[i+w1-2] | img[i+w1+2] | + img[i+w2-1] | img[i+w2] | img[i+w2+1]; + if (retval) { + return retval; + } + + const size_t w3 = 3*w1; + retval = img[i-w3-2] | img[i-w3-1] | img[i-w3] | img[i-w3+1] | img[i-w3+2] | + img[i-w2-3] | img[i-w2-2] | img[i-w2+2] | img[i-w2+3] | + img[i-w1-3] | img[i-w1+3] | + img[i-3] | img[i+3] | + img[i+w1-3] | img[i+w1+3] | + img[i+w2-3] | img[i+w2-2] | img[i+w2+2] | img[i+w2+3] | + img[i+w3-2] | img[i+w3-1] | img[i+w3] | img[i+w3+1] | img[i+w3+2]; + return retval; +} + + +void dilating(const int *img, int *o, int w1, int height) +{ +#ifdef _OPENMP +# pragma omp parallel for +#endif + for (int row = HL_BORDER; row < height - HL_BORDER; row++) { + for (int col = HL_BORDER, i = row*w1 + col; col < w1 - HL_BORDER; col++, i++) { + o[i] = test_dilate(img, i, w1); + } + } +} + +} // namespace + +void RawImageSource::highlight_recovery_opposed(float scale_mul[3], const ColorTemp &wb, float gainth) +{ + //BENCHFUN + + if (settings->verbose) { + std::cout << "Applying Highlight Recovery: Inpaint opposed" << std::endl; + } + + if (plistener) { + plistener->setProgressStr("PROGRESSBAR_HLREC"); + plistener->setProgress(0); + } + + double rr, gg, bb; + wb.getMultipliers(rr, gg, bb); + wbMul2Camera(rr, gg, bb); + + float gain = 1.2f * gainth; + + float clipval = 0.987f / gain; + const float scalecoeffs[3] = { + scale_mul[0] * float(rr) / 65535.f, + scale_mul[1] * float(gg) / 65535.f, + scale_mul[2] * float(bb) / 65535.f, + }; + const float clips[3] = { + clipval * float(rr), + clipval * float(gg), + clipval * float(bb) + }; + const float clipdark[3] = { + 0.03f * clips[0], + 0.125f * clips[1], + 0.03f * clips[2] + }; + + bool anyclipped = false; + float **chan[3] = { red, green, blue }; + + const float clipscale[3] = { + clips[0] / scalecoeffs[0], + clips[1] / scalecoeffs[1], + clips[2] / scalecoeffs[2] + }; + + int x1 = W, y1 = H, x2 = 0, y2 = 0; + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + for (int c = 0; c < 3; ++c) { + if (chan[c][y][x] >= clipscale[c]) { + anyclipped = true; + x1 = std::min(x, x1); + x2 = std::max(x, x2); + y1 = std::min(y, y1); + y2 = std::max(y, y2); + } + } + } + } + + if (!anyclipped) { + if (plistener) { + plistener->setProgress(1.0); + } + return; + } + + x1 = std::max(x1-1, 0); + x2 = std::min(x2+1, W-1); + y1 = std::max(y1-1, 0); + y2 = std::min(y2+1, H-1); + + const int cW = x2 - x1 + 1; + const int cH = y2 - y1 + 1; + +#ifdef _OPENMP +# pragma omp parallel for +#endif + for (int y = 0; y < cH; ++y) { + const int yy = y + y1; + for (int x = 0; x < cW; ++x) { + const int xx = x + x1; + for (int c = 0; c < 3; ++c) { + chan[c][yy][xx] *= scalecoeffs[c]; + } + } + } + + if (plistener) { + plistener->setProgress(0.1); + } + + multi_array2D tmp(cW, cH); + + const int pwidth = cW + 2 * HL_BORDER; + const int pheight = cH + 2 * HL_BORDER; + const int p_size = pwidth * pheight; + AlignedBuffer mask_vec(4 * p_size); + int *mask_buffer = mask_vec.data; + + const auto mask_val = + [&](int c, int y, int x) -> int & + { + return mask_buffer[c * p_size + (HL_BORDER + y) * pwidth + x + HL_BORDER]; + }; + + const auto set_refavg = + [&](int y, int x) -> bool + { + const int yy = y + y1; + const int xx = x + x1; + bool found = false; + for (int c = 0; c < 3 && !found; ++c) { + if (chan[c][yy][xx] >= clips[c]) { + found = true; + } + } + if (!found) { + return false; + } + + float mean[3] = { 0.0f, 0.0f, 0.0f }; + for (int dy = -1; dy < 2; dy++) { + for (int dx = -1; dx < 2; dx++) { + for (int c = 0; c < 3; ++c) { + mean[c] += std::max(0.0f, chan[c][yy+dy][xx+dx]); + } + } + } + for (int c = 0; c < 3; ++c) { + mean[c] = pow_F(mean[c] / 9.0f, 1.0f / HL_POWERF); + } + + const float croot_refavg[3] = { + 0.5f * (mean[1] + mean[2]), + 0.5f * (mean[0] + mean[2]), + 0.5f * (mean[0] + mean[1]) + }; + + for (int c = 0; c < 3; ++c) { + if (chan[c][yy][xx] >= clips[c]) { + tmp[c][y][x] = pow_F(croot_refavg[c], HL_POWERF); + mask_val(c, y, x) = 1; + } + } + return true; + }; + +#ifdef _OPENMP +# pragma omp parallel for +#endif + for (int y = 0; y < cH; ++y) { + const int yy = y + y1; + for (int x = 0; x < cW; ++x) { + const int xx = x + x1; + for (int c = 0; c < 3; ++c) { + tmp[c][y][x] = std::max(0.f, chan[c][yy][xx]); + } + + if ((x > 0) && (x < cW - 1) && (y > 0) && (y < cH - 1)) { + set_refavg(y, x); + } + } + } + + if (plistener) { + plistener->setProgress(0.3); + } + + for (size_t i = 0; i < 3; i++) { + int *mask = mask_buffer + i * p_size; + int *tmp = mask_buffer + 3 * p_size; + //border_fill_zero(mask, pwidth, pheight); + dilating(mask, tmp, pwidth, pheight); + memcpy(mask, tmp, p_size * sizeof(int)); + } + + float cr_sum[3] = { 0.f, 0.f, 0.f }; + int cr_cnt[3] = { 0, 0, 0 }; + +#ifdef _OPENMP +# pragma omp parallel for reduction(+ : cr_sum, cr_cnt) +#endif + for (int y = 1; y < cH-1; ++y) { + const int yy = y + y1; + for (int x = 1; x < cW-1; ++x) { + const int xx = x + x1; + for (int c = 0; c < 3; ++c) { + const float inval = std::max(0.0f, chan[c][yy][xx]); + if (mask_val(c, y, x) && (inval > clipdark[c]) && (inval < clips[c])) { + cr_sum[c] += inval - tmp[c][y][x]; + ++cr_cnt[c]; + } + } + } + } + + if (plistener) { + plistener->setProgress(0.6); + } + + float chrominance[3] = { + cr_sum[0] / std::max(1.f, float(cr_cnt[0])), + cr_sum[1] / std::max(1.f, float(cr_cnt[1])), + cr_sum[2] / std::max(1.f, float(cr_cnt[2])) + }; + +#ifdef _OPENMP +# pragma omp parallel for +#endif + for (int y = 0; y < cH; ++y) { + const int yy = y + y1; + for (int x = 0; x < cW; ++x) { + const int xx = x + x1; + for (int c = 0; c < 3; ++c) { + const float inval = std::max(0.0f, chan[c][yy][xx]); + if (inval >= clips[c]) { + chan[c][yy][xx] = std::max(inval, tmp[c][y][x] + chrominance[c]); + } + } + } + } + + if (plistener) { + plistener->setProgress(0.9); + } + +#ifdef _OPENMP +# pragma omp parallel for +#endif + for (int y = 0; y < cH; ++y) { + const int yy = y + y1; + for (int x = 0; x < cW; ++x) { + const int xx = x + x1; + for (int c = 0; c < 3; ++c) { + chan[c][yy][xx] /= scalecoeffs[c]; + } + } + } + + if (plistener) { + plistener->setProgress(1.0); + } +} + + + + } diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index f5d16866e..350dbbfab 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -179,7 +179,7 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) }; idx = -1; for (ssize_t i = curve.size()-1; i > 0; i -= 2) { - if (curve[i] <= 0.f) { + if (curve[i] <= 0.0) { idx = i+1; break; } @@ -229,7 +229,7 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) } // namespace -void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, std::vector &outCurve) +void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, StandardObserver observer, std::vector &outCurve) { BENCHFUN @@ -279,7 +279,7 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st { RawMetaDataLocation rml; eSensorType sensor_type; - int w, h; + int w = 0, h = 0; std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true, true)); if (!thumb) { if (settings->verbose) { @@ -313,7 +313,7 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st 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)); + std::unique_ptr thumb(Thumbnail::loadFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, observer, false, true)); if (!thumb) { if (settings->verbose) { std::cout << "histogram matching: raw decoding failed, generating a neutral curve" << std::endl; @@ -328,7 +328,7 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st 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)); - if (std::abs(thumb_ratio - target_ratio) > 0.01) { + if (std::abs(thumb_ratio - target_ratio) > 0.01f) { int cx = 0, cy = 0; if (thumb_ratio > target_ratio) { // crop the height @@ -342,7 +342,7 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st tw -= cw; } if (settings->verbose) { - std::cout << "histogram matching: cropping target to get an aspect ratio of " << round(thumb_ratio * 100)/100.0 << ":1, new size is " << tw << "x" << th << std::endl; + std::cout << "histogram matching: cropping target to get an aspect ratio of " << round(thumb_ratio * 100)/100.f << ":1, new size is " << tw << "x" << th << std::endl; } if (cx || cy) { diff --git a/rtengine/homogeneouscoordinates.cc b/rtengine/homogeneouscoordinates.cc new file mode 100644 index 000000000..85b189b9f --- /dev/null +++ b/rtengine/homogeneouscoordinates.cc @@ -0,0 +1,191 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 Lawrence Lee + * + * 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 "homogeneouscoordinates.h" + +namespace rtengine +{ + +template +homogeneous::Vector operator*(const homogeneous::Matrix& a, const homogeneous::Vector& b) +{ + homogeneous::Vector prod; + + prod.fill(0); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + prod[i] += a[i][j] * b[j]; + } + } + + return prod; +} + +template +homogeneous::Matrix operator*(const homogeneous::Matrix& a, const homogeneous::Matrix& b) +{ + homogeneous::Matrix prod; + + for (int i = 0; i < 4; i++) { + prod[i].fill(0); + + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + prod[i][j] += a[i][k] * b[k][j]; + } + } + } + + return prod; +} + +namespace homogeneous +{ + +template +Matrix projectionMatrix(T location, Axis normal) +{ + Matrix matrix; + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + matrix[i][j] = 0; + } + } + + matrix[0][0] = location; + matrix[1][1] = location; + matrix[2][2] = location; + matrix[3][3] = 0; + + switch (normal) { + case X: + matrix[3][0] = 1; + break; + + case Y: + matrix[3][1] = 1; + break; + + case Z: + matrix[3][2] = 1; + break; + } + + return matrix; +} + +template +Matrix rotationMatrix(double radians, Axis axis) +{ + Matrix matrix; + + switch (axis) { + case X: + matrix[0][0] = 1; + matrix[0][1] = 0; + matrix[0][2] = 0; + matrix[1][0] = 0; + matrix[1][1] = cos(radians); + matrix[1][2] = -sin(radians); + matrix[2][0] = 0; + matrix[2][1] = sin(radians); + matrix[2][2] = cos(radians); + break; + + case Y: + matrix[0][0] = cos(radians); + matrix[0][1] = 0; + matrix[0][2] = sin(radians); + matrix[1][0] = 0; + matrix[1][1] = 1; + matrix[1][2] = 0; + matrix[2][0] = -sin(radians); + matrix[2][1] = 0; + matrix[2][2] = cos(radians); + break; + + case Z: + matrix[0][0] = cos(radians); + matrix[0][1] = -sin(radians); + matrix[0][2] = 0; + matrix[1][0] = sin(radians); + matrix[1][1] = cos(radians); + matrix[1][2] = 0; + matrix[2][0] = 0; + matrix[2][1] = 0; + matrix[2][2] = 1; + break; + } + + matrix[0][3] = 0; + matrix[1][3] = 0; + matrix[2][3] = 0; + matrix[3][0] = 0; + matrix[3][1] = 0; + matrix[3][2] = 0; + matrix[3][3] = 1; + + return matrix; +} + +template +Matrix scaleMatrix(T x, T y, T z) +{ + Matrix matrix; + + for (int i = 0; i < 4; i++) { + matrix[i].fill(0); + } + + matrix[0][0] = x; + matrix[1][1] = y; + matrix[2][2] = z; + matrix[3][3] = 1; + + return matrix; +} + +template +Matrix translationMatrix(T x, T y, T z) +{ + Matrix matrix; + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 3; j++) { + matrix[i][j] = 0; + } + } + + matrix[0][0] = 1; + matrix[1][1] = 1; + matrix[2][2] = 1; + matrix[0][3] = x; + matrix[1][3] = y; + matrix[2][3] = z; + matrix[3][3] = 1; + + return matrix; +} + +} + +} diff --git a/rtengine/homogeneouscoordinates.h b/rtengine/homogeneouscoordinates.h new file mode 100644 index 000000000..12a2227ae --- /dev/null +++ b/rtengine/homogeneouscoordinates.h @@ -0,0 +1,84 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 Lawrence Lee + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#pragma once + +#include + +namespace rtengine +{ + +namespace homogeneous +{ + +enum Axis {X, Y, Z}; + +template +using Matrix = std::array, 4>; + +/** + * 3 dimensional homogeneous vector. + */ +template +using Vector = std::array; + +/** + * Creates a 3 dimensional transformation matrix for projection onto a plane. + * @param location Distance from the origin to the plane. + * @param normal Direction of the plane's normal. + */ +template +Matrix projectionMatrix(T location, Axis normal); + +/** + * Creates a 3 dimensional transformation matrix for rotation. + * @param radians Rotation angle. + * @param axis Axis of rotation. + */ +template +Matrix rotationMatrix(double radians, Axis axis); + +/** + * Creates a 3 dimensional transformation matrix for scaling. + * @param x Scale in x-direction + * @param y Scale in y-direction + * @param z Scale in z-direction + */ +template +Matrix scaleMatrix(T x, T y, T z); + +/** + * Creates a 3 dimensional transformation matrix for translation. + * @param x Translation in the the x-direction. + * @param y Translation in the the y-direction. + * @param z Translation in the the z-direction. + */ +template +Matrix translationMatrix(T x, T y, T z); + +} + +template +homogeneous::Vector operator*(const homogeneous::Matrix& a, const homogeneous::Vector& b); + +template +homogeneous::Matrix operator*(const homogeneous::Matrix& a, const homogeneous::Matrix& b); + +} + +#include "homogeneouscoordinates.cc" diff --git a/rtengine/iccjpeg.cc b/rtengine/iccjpeg.cc index 5e652296f..69771df02 100644 --- a/rtengine/iccjpeg.cc +++ b/rtengine/iccjpeg.cc @@ -18,7 +18,7 @@ */ #include "iccjpeg.h" -#include /* define malloc() */ +#include /* @@ -155,12 +155,9 @@ marker_is_icc (jpeg_saved_marker_ptr marker) * If TRUE is returned, *icc_data_ptr is set to point to the * returned data, and *icc_data_len is set to its length. * - * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc() - * and must be freed by the caller with free() when the caller no longer - * needs it. (Alternatively, we could write this routine to use the - * IJG library's memory allocator, so that the data would be freed implicitly - * at jpeg_finish_decompress() time. But it seems likely that many apps - * will prefer to have the data stick around after decompression finishes.) + * IMPORTANT: the data at **icc_data_ptr has been allocated with new + * and must be freed by the caller with delete[] when the caller no longer + * needs it. * * NOTE: if the file contains invalid ICC APP2 markers, we just silently * return FALSE. You might want to issue an error message instead. @@ -235,7 +232,7 @@ read_icc_profile (j_decompress_ptr cinfo, } /* Allocate space for assembled data */ - icc_data = (JOCTET *) malloc(total_length * sizeof(JOCTET)); + icc_data = new (std::nothrow) JOCTET[total_length]; if (icc_data == nullptr) { return FALSE; /* oops, out of memory */ diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index aea03664e..06d5a4b0c 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include +#include #include #include @@ -43,7 +44,6 @@ #include "color.h" #include "cJSON.h" -#define inkc_constant 0x696E6B43 namespace { @@ -352,7 +352,7 @@ cmsHPROFILE rtengine::ProfileContent::toProfile() const double slope = slopetag == 0 ? eps : slopetag; GammaValues g_b; //gamma parameters - Color::calcGamma(pwr, ts, 0, g_b); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 + Color::calcGamma(pwr, ts, 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; @@ -455,6 +455,8 @@ public: if (loadAll) { loadProfiles(profilesDir, &fileProfiles, &fileProfileContents, nullptr, false); loadProfiles(userICCDir, &fileProfiles, &fileProfileContents, nullptr, false); + Glib::ustring user_output_icc_dir = Glib::build_filename(options.rtdir, "iccprofiles", "output"); + loadProfiles(user_output_icc_dir, &fileProfiles, &fileProfileContents, nullptr, false); } // Input profiles @@ -636,7 +638,7 @@ public: MyMutex::MyLock lock(mutex); - for (const auto profile : fileProfiles) { + for (const auto& profile : fileProfiles) { if ( ( type == ICCStore::ProfileType::MONITOR @@ -1152,102 +1154,6 @@ std::vector rtengine::ICCStore::getWorkingProfiles() return implementation->getWorkingProfiles(); } -// WARNING: the caller must lock lcmsMutex -cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) -{ - // forgive me for the messy code, quick hack to change gamma of an ICC profile to the RT standard gamma - if (!iprof) { - return nullptr; - } - - cmsUInt32Number bytesNeeded = 0; - cmsSaveProfileToMem(iprof, nullptr, &bytesNeeded); - - if (bytesNeeded == 0) { - return nullptr; - } - - uint8_t *data = new uint8_t[bytesNeeded + 1]; - cmsSaveProfileToMem(iprof, data, &bytesNeeded); - const uint8_t *p = &data[128]; // skip 128 byte header - uint32_t tag_count; - memcpy(&tag_count, p, 4); - p += 4; - tag_count = ntohl(tag_count); - - struct icctag { - uint32_t sig; - uint32_t offset; - uint32_t size; - } tags[tag_count]; - - 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); - tags[i].sig = ntohl(tags[i].sig); - tags[i].offset = ntohl(tags[i].offset); - tags[i].size = ntohl(tags[i].size); - p += 12; - - if (tags[i].sig != 0x62545243 && // bTRC - tags[i].sig != 0x67545243 && // gTRC - tags[i].sig != 0x72545243 && // rTRC - tags[i].sig != 0x6B545243) { // kTRC - data_size += (tags[i].size + 3) & ~3; - } - } - - uint32_t sz = 128 + 4 + tag_count * 12 + data_size; - uint8_t *nd = new uint8_t[sz]; - memset(nd, 0, sz); - memcpy(nd, data, 128 + 4); - sz = htonl(sz); - memcpy(nd, &sz, 4); - uint32_t offset = 128 + 4 + tag_count * 12; - uint32_t gamma_offset = 0; - - for (uint32_t i = 0; i < tag_count; i++) { - struct icctag tag; - tag.sig = htonl(tags[i].sig); - - if (tags[i].sig == 0x62545243 || // bTRC - tags[i].sig == 0x67545243 || // gTRC - tags[i].sig == 0x72545243 || // rTRC - 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) }; - memcpy(&nd[offset], pcurve, 12); - - //if (gamma_size == 14) { - uint16_t gm = htons(gamma); - memcpy(&nd[offset + 12], &gm, 2); - //} - - offset += (gamma_size + 3) & ~3; - } - - tag.offset = htonl(gamma_offset); - tag.size = htonl(gamma_size); - } else { - 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; - } - - memcpy(&nd[128 + 4 + i * 12], &tag, 12); - } - - cmsHPROFILE oprof = cmsOpenProfileFromMem(nd, ntohl(sz)); - delete [] nd; - delete [] data; - return oprof; -} - cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool gamma, const Glib::ustring& name) { diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index 731a155bb..fb2331263 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -39,7 +39,7 @@ namespace procparams typedef const double(*TMatrix)[3]; -class ProfileContent +class ProfileContent final { public: ProfileContent(); @@ -54,7 +54,7 @@ private: std::string data; }; -class ICCStore +class ICCStore final { public: enum class ProfileType { @@ -96,7 +96,6 @@ public: /*static*/ std::vector getWorkingProfiles(); - static cmsHPROFILE makeStdGammaProfile(cmsHPROFILE iprof); static cmsHPROFILE createFromMatrix(const double matrix[3][3], bool gamma = false, const Glib::ustring& name = Glib::ustring()); private: diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 7309dd91f..cdb7dd6eb 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -20,7 +20,6 @@ #include -#include #include #include "alignedbuffer.h" @@ -28,7 +27,7 @@ #include "imagedimensions.h" #include "LUT.h" #include "rt_math.h" - +#include "procparams.h" #include "../rtgui/threadutils.h" #define TR_NONE 0 @@ -41,6 +40,13 @@ #define CHECK_BOUNDS 0 +namespace Glib +{ + +class ustring; + +} + namespace rtengine { @@ -105,6 +111,10 @@ public: { rm = gm = bm = 1.0; } + virtual void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) + { + rm = gm = bm = 1.0; + } }; @@ -210,7 +220,7 @@ public: #endif return ptrs[row][col]; } - const T operator() (size_t row, size_t col) const + const T& operator() (size_t row, size_t col) const { #if CHECK_BOUNDS assert (row < height_ && col < width_); @@ -337,6 +347,23 @@ public: } } + /** Copy the a sub-region of the data to another PlanarRGBData */ + void copyData(PlanarWhateverData *dest, int x, int y, int width, int height) + { + assert (dest != NULL); + // Make sure that the size is the same, reallocate if necessary + dest->allocate(width, height); + + if (dest->width == -1) { + printf("ERROR: PlanarRGBData::copyData >>> allocation failed!\n"); + return; + } + + for (int i = y, j = 0; i < y + height; ++i, ++j) { + memcpy (dest->v(i) + x, v(j), width * sizeof(T)); + } + } + void rotate (int deg) override { @@ -658,7 +685,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) override + void allocate (int W, int H) final { if (W == width && H == height) { @@ -746,7 +773,26 @@ public: } } - void rotate (int deg) override + /** Copy the a sub-region of the data to another PlanarRGBData */ + void copyData(PlanarRGBData *dest, int x, int y, int width, int height) + { + assert (dest != NULL); + // Make sure that the size is the same, reallocate if necessary + dest->allocate(width, height); + + if (dest->width == -1) { + printf("ERROR: PlanarRGBData::copyData >>> allocation failed!\n"); + return; + } + + for (int i = y, j = 0; i < y + height; ++i, ++j) { + memcpy (dest->r(i) + x, r(j), width * sizeof(T)); + memcpy (dest->g(i) + x, g(j), width * sizeof(T)); + memcpy (dest->b(i) + x, b(j), width * sizeof(T)); + } + } + + void rotate (int deg) final { if (deg == 90) { @@ -873,7 +919,7 @@ public: } } - void hflip () override + void hflip () final { int width2 = width / 2; @@ -905,7 +951,7 @@ public: #endif } - void vflip () override + void vflip () final { int height2 = height / 2; @@ -989,7 +1035,7 @@ public: } } - void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const override + void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const final { histogram.clear(); avg_r = avg_g = avg_b = 0.; @@ -1264,7 +1310,7 @@ public: #endif return ptr[3 * (row * width + col)]; } - const T operator() (size_t row, size_t col) const + const T& operator() (size_t row, size_t col) const { #if CHECK_BOUNDS assert (row < height_ && col < width_); @@ -1328,7 +1374,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) override + void allocate (int W, int H) final { if (W == width && H == height) { @@ -1382,7 +1428,24 @@ public: memcpy (dest->data, data, 3 * width * height * sizeof(T)); } - void rotate (int deg) override + /** Copy the a sub-region of the data to another PlanarRGBData */ + void copyData(ChunkyRGBData *dest, int x, int y, int width, int height) + { + assert (dest != NULL); + // Make sure that the size is the same, reallocate if necessary + dest->allocate(width, height); + + if (dest->width == -1) { + printf("ERROR: PlanarRGBData::copyData >>> allocation failed!\n"); + return; + } + + for (int i = y, j = 0; i < y + height; ++i, ++j) { + memcpy (dest->r(i) + x, r(j), 3 * width * sizeof(T)); + } + } + + void rotate (int deg) final { if (deg == 90) { @@ -1516,7 +1579,7 @@ public: } } - void hflip () override + void hflip () final { int width2 = width / 2; @@ -1552,7 +1615,7 @@ public: } } - void vflip () override + void vflip () final { AlignedBuffer lBuffer(3 * width); @@ -1619,7 +1682,7 @@ public: } } - void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const override + void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const final { histogram.clear(); avg_r = avg_g = avg_b = 0.; @@ -1799,9 +1862,6 @@ public: * @return The mutex */ virtual MyMutex& getMutex () = 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 () 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 */ @@ -1822,12 +1882,16 @@ public: * @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 (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const = 0; + virtual int saveAsTIFF ( + const Glib::ustring &fname, + int bps = -1, + bool isFloat = false, + bool uncompressed = false, + bool big = 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; - /** @brief Free the image */ - virtual void free () = 0; }; /** @brief This class represents an image having a float pixel planar representation. diff --git a/rtengine/image16.cc b/rtengine/image16.cc index a98d64d51..ae981c7bd 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -134,7 +134,21 @@ Image16* Image16::copy() const return cp; } -void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const +Image16* Image16::copySubRegion (int x, int y, int width, int height) +{ + Image16* cp = NULL; + int realWidth = LIM(x + width, 0, this->width) - x; + int realHeight = LIM(y + height, 0, this->height) - y; + + if (realWidth > 0 && realHeight > 0) { + cp = new Image16 (realWidth, realHeight); + copyData(cp, x, y, realWidth, realHeight); + } + + return cp; +} + +void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const { // compute channel multipliers @@ -147,10 +161,10 @@ void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, P gm = dgm; bm = dbm; - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm = 1.f / rm; + gm = 1.f / gm; + bm = 1.f / bm; + float mul_lum = 0.299f * rm + 0.587f * gm + 0.114f * bm; rm /= mul_lum; gm /= mul_lum; bm /= mul_lum; @@ -187,8 +201,6 @@ void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, P gm /= area; bm /= area; -#define GCLIP( x ) Color::gamma_srgb(CLIP(x)) - #ifdef _OPENMP #pragma omp parallel { @@ -260,10 +272,10 @@ void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, P lineB[dst_x] = CLIP(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); + float larea = src_sub_width * src_sub_height; + lineR[dst_x] = CLIP(rm2 * rtot / larea); + lineG[dst_x] = CLIP(gm2 * gtot / larea); + lineB[dst_x] = CLIP(bm2 * btot / larea); } } } @@ -297,21 +309,6 @@ void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, P #undef GCLIP } -Image8* Image16::to8() const -{ - Image8* img8 = new Image8(width, height); - - 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)); - } - } - - return img8; -} - // Parallelized transformation; create transform with cmsFLAGS_NOCACHE! void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform) { diff --git a/rtengine/image16.h b/rtengine/image16.h index d0053cbfc..273ae63a1 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -29,7 +29,7 @@ namespace rtengine class Image8; class Imagefloat; -class Image16 : public IImage16, public ImageIO +class Image16 final : public IImage16, public ImageIO { public: @@ -39,10 +39,9 @@ public: ~Image16() override; Image16* copy() const; + Image16* copySubRegion (int x, int y, int width, int height); - Image8* to8() const; - - void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; + void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const override; const char* getType() const override { @@ -67,11 +66,6 @@ public: return getEmbeddedProfile(); } - int getBitsPerPixel() const override - { - return 8 * sizeof(unsigned short); - } - int saveToFile(const Glib::ustring &fname) const override { return save(fname); @@ -87,7 +81,7 @@ public: return saveJPEG(fname, quality, subSamp); } - int saveAsTIFF(const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override + int saveAsTIFF(const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false, bool big = false) const override { return saveTIFF(fname, bps, isFloat, uncompressed); } @@ -97,10 +91,6 @@ public: setProgressListener(pl); } - 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 66ad8b60f..1b4e49d84 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -100,7 +100,7 @@ Image8* Image8::copy () const return cp; } -void Image8::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const +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; @@ -111,10 +111,10 @@ void Image8::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, P gm = dgm; bm = dbm; - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm = 1.f / rm; + gm = 1.f / gm; + bm = 1.f / bm; + float mul_lum = 0.299f * rm + 0.587f * gm + 0.114f * bm; rm /= mul_lum; gm /= mul_lum; bm /= mul_lum; @@ -151,8 +151,6 @@ void Image8::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, P gm /= area; bm /= area; -#define GCLIP( x ) Color::gamma_srgb(CLIP(x)) - #ifdef _OPENMP #pragma omp parallel { diff --git a/rtengine/image8.h b/rtengine/image8.h index f125dccf8..416dc9143 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -27,7 +27,7 @@ namespace rtengine { class Imagefloat; -class Image8 : public IImage8, public ImageIO +class Image8 final : public IImage8, public ImageIO { public: @@ -38,7 +38,7 @@ public: Image8* copy () const; - void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; + void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const override; const char* getType () const override { @@ -64,11 +64,6 @@ public: return getEmbeddedProfile (); } - int getBitsPerPixel () const override - { - return 8 * sizeof(unsigned char); - } - int saveToFile (const Glib::ustring &fname) const override { return save (fname); @@ -84,9 +79,15 @@ public: return saveJPEG (fname, quality, subSamp); } - int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override + int saveAsTIFF ( + const Glib::ustring &fname, + int bps = -1, + bool isFloat = false, + bool uncompressed = false, + bool big = false + ) const override { - return saveTIFF (fname, bps, isFloat, uncompressed); + return saveTIFF (fname, bps, isFloat, uncompressed, big); } void setSaveProgressListener (ProgressListener* pl) override @@ -94,11 +95,6 @@ public: setProgressListener (pl); } - void free () override - { - delete this; - } - }; } diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 24cfefde9..fb2fcaf3a 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -19,6 +19,7 @@ #include #include +#include #include @@ -39,17 +40,17 @@ using namespace rtengine; -extern "C" IptcData *iptc_data_new_from_jpeg_file (FILE* infile); +extern "C" IptcData *iptc_data_new_from_jpeg_file(FILE* infile); namespace { -Glib::ustring to_utf8 (const std::string& str) +Glib::ustring to_utf8(const std::string& str) { try { - return Glib::locale_to_utf8 (str); + return Glib::locale_to_utf8(str); } catch (Glib::Error&) { - return Glib::convert_with_fallback (str, "UTF-8", "ISO-8859-1", "?"); + return Glib::convert_with_fallback(str, "UTF-8", "ISO-8859-1", "?"); } } @@ -57,7 +58,8 @@ template T getFromFrame( const std::vector>& frames, std::size_t frame, - const std::function& function + const std::function& function, + T defval = {} ) { if (frame < frames.size()) { @@ -66,21 +68,40 @@ T getFromFrame( if (!frames.empty()) { return function(*frames[0]); } - return {}; + return defval; } -} - -FramesMetaData* FramesMetaData::fromFile (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) +const std::string& validateUft8(const std::string& str, const std::string& on_error = "???") { - return new FramesData (fname, std::move(rml), firstFrameOnly); + if (Glib::ustring(str).validate()) { + return str; + } + + return on_error; } -FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* rootDir, rtexif::TagDirectory* firstRootDir) : +} + +FramesMetaData* FramesMetaData::fromFile(const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) +{ + return new FramesData(fname, std::move(rml), firstFrameOnly); +} + +static struct tm timeFromTS(const time_t ts) +{ +#if !defined(WIN32) + struct tm tm; + return *gmtime_r(&ts, &tm); +#else + return *gmtime(&ts); +#endif +} + +FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* rootDir, rtexif::TagDirectory* firstRootDir, time_t ts) : frameRootDir(frameRootDir_), iptc(nullptr), - time{}, - timeStamp{}, + time(timeFromTS(ts)), + timeStamp(ts), iso_speed(0), aperture(0.), focal_len(0.), @@ -113,36 +134,39 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (!tag) { newFrameRootDir = rootDir; tag = newFrameRootDir->findTag("Make"); + if (!tag) { // For some raw files (like Canon's CR2 files), the metadata are contained in the first root directory newFrameRootDir = firstRootDir; tag = newFrameRootDir->findTag("Make"); } } + if (tag) { - make = tag->valueToString(); + make = validateUft8(tag->valueToString()); + // Same dcraw treatment for (const auto& corp : { - "Canon", - "NIKON", - "EPSON", - "KODAK", - "Kodak", - "OLYMPUS", - "PENTAX", - "RICOH", - "MINOLTA", - "Minolta", - "Konica", - "CASIO", - "Sinar", - "Phase One", - "SAMSUNG", - "Mamiya", - "MOTOROLA", - "Leaf", - "Panasonic" - }) { + "Canon", + "NIKON", + "EPSON", + "KODAK", + "Kodak", + "OLYMPUS", + "PENTAX", + "RICOH", + "MINOLTA", + "Minolta", + "Konica", + "CASIO", + "Sinar", + "Phase One", + "SAMSUNG", + "Mamiya", + "MOTOROLA", + "Leaf", + "Panasonic" + }) { if (make.find(corp) != std::string::npos) { // Simplify company names make = corp; break; @@ -153,8 +177,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } tag = newFrameRootDir->findTagUpward("Model"); + if (tag) { - model = tag->valueToString(); + model = validateUft8(tag->valueToString()); } if (!model.empty()) { @@ -179,7 +204,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } - if (model.find( "Digital Camera ") != std::string::npos) { + if (model.find("Digital Camera ") != std::string::npos) { model.erase(0, 15); } } else { @@ -189,13 +214,14 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (model == "Unknown") { tag = newFrameRootDir->findTag("UniqueCameraModel"); if (tag) { - model = tag->valueToString(); + model = validateUft8(tag->valueToString()); } } tag = newFrameRootDir->findTagUpward("Orientation"); + if (tag) { - orientation = tag->valueToString (); + orientation = validateUft8(tag->valueToString()); } // Look for Rating metadata in the following order: @@ -217,45 +243,47 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* tag = newFrameRootDir->findTagUpward("MakerNote"); rtexif::TagDirectory* mnote = nullptr; + if (tag) { mnote = tag->getDirectory(); } rtexif::TagDirectory* exif = nullptr; tag = newFrameRootDir->findTagUpward("Exif"); + if (tag) { - exif = tag->getDirectory (); + exif = tag->getDirectory(); } if (exif) { // standard exif tags - if ((tag = exif->getTag ("ShutterSpeedValue"))) { - shutter = tag->toDouble (); + if ((tag = exif->getTag("ShutterSpeedValue"))) { + shutter = tag->toDouble(); } - if ((tag = exif->getTag ("ExposureTime"))) { - shutter = tag->toDouble (); + if ((tag = exif->getTag("ExposureTime"))) { + shutter = tag->toDouble(); } - if ((tag = exif->getTag ("ApertureValue"))) { - aperture = tag->toDouble (); + if ((tag = exif->getTag("ApertureValue"))) { + aperture = tag->toDouble(); } - if ((tag = exif->getTag ("FNumber"))) { - aperture = tag->toDouble (); + if ((tag = exif->getTag("FNumber"))) { + aperture = tag->toDouble(); } - if ((tag = exif->getTag ("ExposureBiasValue"))) { - expcomp = tag->toDouble (); + if ((tag = exif->getTag("ExposureBiasValue"))) { + expcomp = tag->toDouble(); } - if ((tag = exif->getTag ("FocalLength"))) { - focal_len = tag->toDouble (); + if ((tag = exif->getTag("FocalLength"))) { + focal_len = tag->toDouble(); } - if ((tag = exif->getTag ("FocalLengthIn35mmFilm"))) { - focal_len35mm = tag->toDouble (); + if ((tag = exif->getTag("FocalLengthIn35mmFilm"))) { + focal_len35mm = tag->toDouble(); } // Focus distance from EXIF or XMP. MakerNote ones are scattered and partly encrypted @@ -283,12 +311,12 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } - if ((tag = exif->getTag ("ISOSpeedRatings"))) { - iso_speed = tag->toDouble (); + if ((tag = exif->getTag("ISOSpeedRatings"))) { + iso_speed = tag->toDouble(); } if ((tag = exif->findTag("DateTimeOriginal", true))) { - if (sscanf ((const char*)tag->getValue(), "%d:%d:%d %d:%d:%d", &time.tm_year, &time.tm_mon, &time.tm_mday, &time.tm_hour, &time.tm_min, &time.tm_sec) == 6) { + if (sscanf((const char*)tag->getValue(), "%d:%d:%d %d:%d:%d", &time.tm_year, &time.tm_mon, &time.tm_mday, &time.tm_hour, &time.tm_min, &time.tm_sec) == 6) { time.tm_year -= 1900; time.tm_mon -= 1; time.tm_isdst = -1; @@ -296,14 +324,14 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } - tag = exif->findTag ("SerialNumber"); + tag = exif->findTag("SerialNumber"); - if(!tag) { - tag = exif->findTag ("InternalSerialNumber"); + if (!tag) { + tag = exif->findTag("InternalSerialNumber"); } if (tag) { - serial = tag->valueToString(); + serial = validateUft8(tag->valueToString()); } // guess lens... @@ -311,19 +339,18 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* // Sometimes (e.g. DNG) EXIF already contains lens data - if(!make.compare (0, 8, "FUJIFILM")) { - if(exif->getTag ("LensModel")) { - lens = exif->getTag ("LensModel")->valueToString (); + if (!make.compare(0, 8, "FUJIFILM")) { + if (exif->getTag("LensModel")) { + lens = validateUft8(exif->getTag("LensModel")->valueToString()); } - } else if(!make.compare (0, 4, "SONY")) { + } else if (!make.compare(0, 4, "SONY")) { if (iso_speed == 65535 || iso_speed == 0) { - rtexif::Tag* isoTag = exif->getTag ("RecommendedExposureIndex"); + rtexif::Tag* isoTag = exif->getTag("RecommendedExposureIndex"); - if(isoTag) { + if (isoTag) { iso_speed = isoTag->toDouble(); } } - } if (lens == "Unknown") { @@ -340,9 +367,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* const rtexif::Tag* const lens_make = exif->getTag(0xA433); const std::string make = lens_make - ? lens_make->valueToString() + ? validateUft8(lens_make->valueToString()) : std::string(); - const std::string model = lens_model->valueToString(); + const std::string model = validateUft8(lens_model->valueToString()); if (!model.empty()) { lens = make; @@ -362,7 +389,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (mnote) { - if (!make.compare (0, 5, "NIKON")) { + if (!make.compare(0, 5, "NIKON")) { // ISO at max value supported, check manufacturer specific if (iso_speed == 65535 || iso_speed == 0) { rtexif::Tag* isoTag = mnote->getTagP("ISOInfo/ISO"); @@ -374,25 +401,25 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* bool lensOk = false; - if (mnote->getTag ("LensData")) { - std::string ldata = mnote->getTag ("LensData")->valueToString (); + if (mnote->getTag("LensData")) { + std::string ldata = validateUft8(mnote->getTag("LensData")->valueToString()); size_t pos; - if (ldata.size() > 10 && (pos = ldata.find ("Lens = ")) != Glib::ustring::npos) { - lens = ldata.substr (pos + 7); + if (ldata.size() > 10 && (pos = ldata.find("Lens = ")) != Glib::ustring::npos) { + lens = ldata.substr(pos + 7); - if (lens.compare (0, 7, "Unknown")) { + if (lens.compare(0, 7, "Unknown")) { lensOk = true; } else { size_t pos = lens.find("$FL$"); // is there a placeholder for focallength? - if(pos != Glib::ustring::npos) { // then fill in focallength - lens = lens.replace(pos, 4, exif->getTag ("FocalLength")->valueToString ()); + if (pos != Glib::ustring::npos) { // then fill in focallength + lens = lens.replace(pos, 4, validateUft8(exif->getTag("FocalLength")->valueToString())); - if(mnote->getTag ("LensType")) { - std::string ltype = mnote->getTag ("LensType")->valueToString (); + if (mnote->getTag("LensType")) { + const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString()); - if(ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens, should be always + if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens, should be always lens = lens.replace(0, 7, "MF"); } @@ -408,8 +435,8 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } - if (!lensOk && mnote->getTag ("Lens")) { - std::string ldata = mnote->getTag ("Lens")->valueToString (); + if (!lensOk && mnote->getTag("Lens")) { + const std::string ldata = validateUft8(mnote->getTag("Lens")->valueToString()); size_t i = 0, j = 0; double n[4] = {0.0}; @@ -429,7 +456,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* int den = atoi(ldata.substr(j, i).c_str()); j = i + 2; i += 2; - n[m] = (double) nom / std::max(den,1); + n[m] = (double) nom / std::max(den, 1); } std::ostringstream str; @@ -445,17 +472,17 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* lens = str.str(); // Look whether it's MF or AF - if(mnote->getTag ("LensType")) { - std::string ltype = mnote->getTag ("LensType")->valueToString (); + if (mnote->getTag("LensType")) { + const std::string ltype = validateUft8(mnote->getTag("LensType")->valueToString()); - if(ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens + if (ltype.find("MF = Yes") != Glib::ustring::npos) { // check, whether it's a MF lens lens = lens.replace(0, 7, "MF"); // replace 'Unknwon' with 'MF' } else { lens = lens.replace(0, 7, "AF"); // replace 'Unknwon' with 'AF' } } } - } else if (!make.compare (0, 5, "Canon")) { + } else if (!make.compare(0, 5, "Canon")) { // ISO at max value supported, check manufacturer specific if (iso_speed == 65535 || iso_speed == 0) { rtexif::Tag* baseIsoTag = mnote->getTagP("CanonShotInfo/BaseISO"); @@ -469,9 +496,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* // canon EXIF have a string for lens model rtexif::Tag *lt = mnote->getTag("LensType"); - if ( lt ) { + if (lt) { if (lt->toInt()) { - std::string ldata = lt->valueToString (); + const std::string ldata = validateUft8(lt->valueToString()); if (ldata.size() > 1) { found = true; @@ -491,8 +518,8 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if( !found || remaining_size < 7U ) { lt = mnote->findTag("LensID"); - if ( lt ) { - std::string ldata = lt->valueToString (); + if (lt) { + const std::string ldata = validateUft8(lt->valueToString()); if (ldata.size() > 1) { lens = ldata; @@ -502,16 +529,19 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } else if (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX"))) { // ISO at max value supported, check manufacturer specific if (iso_speed == 65535 || iso_speed == 0) { - rtexif::Tag* baseIsoTag = mnote->getTag("ISO"); + const rtexif::Tag* const baseIsoTag = mnote->getTag("ISO"); + if (baseIsoTag) { - std::string isoData = baseIsoTag->valueToString(); + const std::string isoData = baseIsoTag->valueToString(); + if (isoData.size() > 1) { - iso_speed = stoi(isoData); + iso_speed = std::stoi(isoData); } } } - if (mnote->getTag ("LensType")) { - lens = mnote->getTag ("LensType")->valueToString(); + + if (mnote->getTag("LensType")) { + lens = validateUft8(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") { @@ -522,61 +552,61 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } // Try to get the FocalLength from the LensInfo structure, where length below 10mm will be correctly set - rtexif::Tag* flt = mnote->getTagP ("LensInfo/FocalLength"); + rtexif::Tag* flt = mnote->getTagP("LensInfo/FocalLength"); if (flt) { // Don't replace Exif focal_len if Makernotes focal_len is 0 if (flt->toDouble() > 0) { - focal_len = flt->toDouble (); + focal_len = flt->toDouble(); } } else if ((flt = mnote->getTagP ("FocalLength"))) { focal_len = mnote->getTag("FocalLength")->toDouble (); } - if (mnote->getTag ("FocalLengthIn35mmFilm")) { - focal_len35mm = mnote->getTag ("FocalLengthIn35mmFilm")->toDouble (); + if (mnote->getTag("FocalLengthIn35mmFilm")) { + focal_len35mm = mnote->getTag("FocalLengthIn35mmFilm")->toDouble(); } - } else if (mnote && (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA"))) { + } else if (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA")) { if (mnote->getTag ("LensID")) { - lens = mnote->getTag ("LensID")->valueToString (); - if (lens == "Unknown") { + lens = validateUft8(mnote->getTag("LensID")->valueToString()); + if (!lens.compare (0, 7, "Unknown")) { lens_from_make_and_model(); } } - } else if (!make.compare (0, 7, "OLYMPUS")) { - if (mnote->getTag ("Equipment")) { - rtexif::TagDirectory* eq = mnote->getTag ("Equipment")->getDirectory (); + } else if (!make.compare(0, 7, "OLYMPUS")) { + if (mnote->getTag("Equipment")) { + rtexif::TagDirectory* eq = mnote->getTag("Equipment")->getDirectory(); - if (eq->getTag ("LensType")) { - lens = eq->getTag ("LensType")->valueToString (); + if (eq->getTag("LensType")) { + lens = validateUft8(eq->getTag("LensType")->valueToString()); } } if (lens == "Unknown") { lens_from_make_and_model(); } - } else if (mnote && !make.compare (0, 9, "Panasonic")) { + } else if (!make.compare (0, 9, "Panasonic")) { if (mnote->getTag ("LensType")) { - std::string panalens = mnote->getTag("LensType")->valueToString(); + const std::string panalens = validateUft8(mnote->getTag("LensType")->valueToString()); if (panalens.find("LUMIX") != Glib::ustring::npos) { lens = "Panasonic " + panalens; - } - else { + } else { lens = panalens; } } } - } else if (exif->getTag ("DNGLensInfo")) { - lens = exif->getTag ("DNGLensInfo")->valueToString (); + } else if (exif->getTag("DNGLensInfo")) { + lens = validateUft8(exif->getTag("DNGLensInfo")->valueToString()); } else if (!lens_from_make_and_model() && exif->getTag ("LensInfo")) { - lens = exif->getTag ("LensInfo")->valueToString (); + lens = validateUft8(exif->getTag("LensInfo")->valueToString()); } } } rtexif::Tag* t = newFrameRootDir->getTag(0x83BB); + if (t) { - iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ()); + iptc = iptc_data_new_from_data((unsigned char*)t->getValue(), (unsigned)t->getValueSize()); } @@ -590,8 +620,9 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* const rtexif::Tag* const pi = frameRootDir->findTag("PhotometricInterpretation"); const rtexif::Tag* const c = frameRootDir->findTag("Compression"); - if (mnote && (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX")))) { + 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) { isHDR = true; @@ -601,10 +632,12 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } else { const rtexif::Tag* const dm = mnote->findTag("DriveMode"); + if (dm) { char buffer[60]; dm->toString(buffer, 3); buffer[3] = 0; + if (!strcmp(buffer, "HDR")) { isHDR = true; #if PRINT_HDR_PS_DETECTION @@ -652,6 +685,7 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* samplesperpixel = spp->toInt(); photometric = pi->toInt(); + if (photometric == PHOTOMETRIC_LOGLUV) { if (!c) { compression = COMPRESSION_NONE; @@ -732,7 +766,8 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* sampleFormat = IIOSF_UNSIGNED_CHAR; } else if (bitspersample <= 16) { sampleFormat = IIOSF_UNSIGNED_SHORT; - if (mnote && (!make.compare (0, 4, "SONY")) && bitspersample >= 12 && samplesperpixel == 4) { + + if (mnote && (!make.compare(0, 4, "SONY")) && bitspersample >= 12 && samplesperpixel == 4) { isPixelShift = true; #if PRINT_HDR_PS_DETECTION printf("PixelShift detected ! -> \"Make\" = SONY, bitsPerPixel > 8, samplesPerPixel == 4\n"); @@ -757,20 +792,20 @@ FrameData::FrameData(rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } -FrameData::~FrameData () +FrameData::~FrameData() { if (iptc) { - iptc_data_free (iptc); + iptc_data_free(iptc); } } -procparams::IPTCPairs FrameData::getIPTCData () const +procparams::IPTCPairs FrameData::getIPTCData() const { return getIPTCData(iptc); } -procparams::IPTCPairs FrameData::getIPTCData (IptcData* iptc_) +procparams::IPTCPairs FrameData::getIPTCData(IptcData* iptc_) { procparams::IPTCPairs iptcc; @@ -782,34 +817,34 @@ procparams::IPTCPairs FrameData::getIPTCData (IptcData* iptc_) unsigned char buffer[2100]; for (int i = 0; i < 16; i++) { - IptcDataSet* ds = iptc_data_get_next_dataset (iptc_, nullptr, IPTC_RECORD_APP_2, strTags[i].tag); + IptcDataSet* ds = iptc_data_get_next_dataset(iptc_, nullptr, IPTC_RECORD_APP_2, strTags[i].tag); if (ds) { - iptc_dataset_get_data (ds, buffer, 2100); + iptc_dataset_get_data(ds, buffer, 2100); std::vector icValues; - icValues.push_back (to_utf8((char*)buffer)); + icValues.push_back(to_utf8((char*)buffer)); iptcc[strTags[i].field] = icValues; - iptc_dataset_unref (ds); + iptc_dataset_unref(ds); } } IptcDataSet* ds = nullptr; std::vector keywords; - while ((ds = iptc_data_get_next_dataset (iptc_, ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS))) { - iptc_dataset_get_data (ds, buffer, 2100); - keywords.push_back (to_utf8((char*)buffer)); + while ((ds = iptc_data_get_next_dataset(iptc_, ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS))) { + iptc_dataset_get_data(ds, buffer, 2100); + keywords.push_back(to_utf8((char*)buffer)); } iptcc["Keywords"] = keywords; ds = nullptr; std::vector suppCategories; - while ((ds = iptc_data_get_next_dataset (iptc_, ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY))) { - iptc_dataset_get_data (ds, buffer, 2100); - suppCategories.push_back (to_utf8((char*)buffer)); - iptc_dataset_unref (ds); + while ((ds = iptc_data_get_next_dataset(iptc_, ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY))) { + iptc_dataset_get_data(ds, buffer, 2100); + suppCategories.push_back(to_utf8((char*)buffer)); + iptc_dataset_unref(ds); } iptcc["SupplementalCategories"] = suppCategories; @@ -817,11 +852,11 @@ procparams::IPTCPairs FrameData::getIPTCData (IptcData* iptc_) } -bool FrameData::getPixelShift () const +bool FrameData::getPixelShift() const { return isPixelShift; } -bool FrameData::getHDR () const +bool FrameData::getHDR() const { return isHDR; } @@ -829,75 +864,75 @@ std::string FrameData::getImageType () const { return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; } -IIOSampleFormat FrameData::getSampleFormat () const +IIOSampleFormat FrameData::getSampleFormat() const { return sampleFormat; } -rtexif::TagDirectory* FrameData::getExifData () const +rtexif::TagDirectory* FrameData::getExifData() const { return frameRootDir; } -bool FrameData::hasExif () const +bool FrameData::hasExif() const { return frameRootDir && frameRootDir->getCount(); } -bool FrameData::hasIPTC () const +bool FrameData::hasIPTC() const { return iptc; } -tm FrameData::getDateTime () const +tm FrameData::getDateTime() const { return time; } -time_t FrameData::getDateTimeAsTS () const +time_t FrameData::getDateTimeAsTS() const { return timeStamp; } -int FrameData::getISOSpeed () const +int FrameData::getISOSpeed() const { return iso_speed; } -double FrameData::getFNumber () const +double FrameData::getFNumber() const { return aperture; } -double FrameData::getFocalLen () const +double FrameData::getFocalLen() const { return focal_len; } -double FrameData::getFocalLen35mm () const +double FrameData::getFocalLen35mm() const { return focal_len35mm; } -float FrameData::getFocusDist () const +float FrameData::getFocusDist() const { return focus_dist; } -double FrameData::getShutterSpeed () const +double FrameData::getShutterSpeed() const { return shutter; } -double FrameData::getExpComp () const +double FrameData::getExpComp() const { return expcomp; } -std::string FrameData::getMake () const +std::string FrameData::getMake() const { return make; } -std::string FrameData::getModel () const +std::string FrameData::getModel() const { return model; } -std::string FrameData::getLens () const +std::string FrameData::getLens() const { return lens; } -std::string FrameData::getSerialNumber () const +std::string FrameData::getSerialNumber() const { return serial; } -std::string FrameData::getOrientation () const +std::string FrameData::getOrientation() const { return orientation; } @@ -909,17 +944,17 @@ int FrameData::getRating () const -void FramesData::setDCRawFrameCount (unsigned int frameCount) +void FramesData::setDCRawFrameCount(unsigned int frameCount) { dcrawFrameCount = frameCount; } -unsigned int FramesData::getRootCount () const +unsigned int FramesData::getRootCount() const { return roots.size(); } -unsigned int FramesData::getFrameCount () const +unsigned int FramesData::getFrameCount() const { return dcrawFrameCount ? dcrawFrameCount : frames.size(); } @@ -933,14 +968,14 @@ bool FramesData::getPixelShift () const return frames.empty() ? false : frames.at(0)->getPixelShift (); } -bool FramesData::getHDR (unsigned int frame) const +bool FramesData::getHDR(unsigned int frame) const { // 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.empty() || frame >= frames.size() ? false : frames.at(0)->getHDR (); + return frames.empty() || frame >= frames.size() ? false : frames.at(0)->getHDR(); } std::string FramesData::getImageType (unsigned int frame) const @@ -948,53 +983,58 @@ 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 +IIOSampleFormat FramesData::getSampleFormat(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? IIOSF_UNKNOWN : frames.at(frame)->getSampleFormat (); + return frames.empty() || frame >= frames.size() ? IIOSF_UNKNOWN : frames.at(frame)->getSampleFormat(); } -rtexif::TagDirectory* FramesData::getFrameExifData (unsigned int frame) const +rtexif::TagDirectory* FramesData::getFrameExifData(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? nullptr : frames.at(frame)->getExifData (); + return frames.empty() || frame >= frames.size() ? nullptr : frames.at(frame)->getExifData(); } -rtexif::TagDirectory* FramesData::getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const +rtexif::TagDirectory* FramesData::getBestExifData(ImageSource *imgSource, procparams::RAWParams *rawParams) const { rtexif::TagDirectory *td = nullptr; + if (frames.empty()) { return nullptr; } + if (imgSource && rawParams) { eSensorType sensorType = imgSource->getSensorType(); unsigned int imgNum = 0; + if (sensorType == ST_BAYER) { imgNum = rtengine::LIM(rawParams->bayersensor.imageNum, 0, frames.size() - 1); - /* - // might exist someday ? - } else if (sensorType == ST_FUJI_XTRANS) { - imgNum = rtengine::LIM(rawParams->xtranssensor.imageNum, 0, frames.size() - 1); - } else if (sensorType == ST_NONE && !imgSource->isRAW()) { - // standard image multiframe support should come here (when implemented in GUI) - */ + /* + // might exist someday ? + } else if (sensorType == ST_FUJI_XTRANS) { + imgNum = rtengine::LIM(rawParams->xtranssensor.imageNum, 0, frames.size() - 1); + } else if (sensorType == ST_NONE && !imgSource->isRAW()) { + // standard image multiframe support should come here (when implemented in GUI) + */ } - td = getFrameExifData (imgNum); + td = getFrameExifData(imgNum); rtexif::Tag* makeTag; + if (td && (makeTag = td->findTag("Make", true))) { td = makeTag->getParent(); } else { td = getRootExifData(0); } } + return td; } -rtexif::TagDirectory* FramesData::getRootExifData (unsigned int root) const +rtexif::TagDirectory* FramesData::getRootExifData(unsigned int root) const { return roots.empty() || root >= roots.size() ? nullptr : roots.at(root); } -procparams::IPTCPairs FramesData::getIPTCData (unsigned int frame) const +procparams::IPTCPairs FramesData::getIPTCData(unsigned int frame) const { if (frame < frames.size() && frames.at(frame)->hasIPTC()) { return frames.at(frame)->getIPTCData(); @@ -1040,7 +1080,8 @@ tm FramesData::getDateTime(unsigned int frame) const [](const FrameData& frame_data) { return frame_data.getDateTime(); - } + }, + modTime ); } @@ -1052,7 +1093,8 @@ time_t FramesData::getDateTimeAsTS(unsigned int frame) const [](const FrameData& frame_data) { return frame_data.getDateTimeAsTS(); - } + }, + modTimeStamp ); } @@ -1214,62 +1256,62 @@ int FramesData::getRating(unsigned int frame) const //------inherited functions--------------// -std::string FramesMetaData::apertureToString (double aperture) +std::string FramesMetaData::apertureToString(double aperture) { char buffer[256]; - sprintf (buffer, "%0.1f", aperture); + snprintf(buffer, sizeof(buffer), "%0.1f", aperture); return buffer; } -std::string FramesMetaData::shutterToString (double shutter) +std::string FramesMetaData::shutterToString(double shutter) { char buffer[256]; if (shutter > 0.0 && shutter <= 0.5) { - sprintf (buffer, "1/%0.0f", 1.0 / shutter); + snprintf(buffer, sizeof(buffer), "1/%0.0f", 1.0 / shutter); } else { - sprintf (buffer, "%0.1f", shutter); + snprintf(buffer, sizeof(buffer), "%0.1f", shutter); } return buffer; } -std::string FramesMetaData::expcompToString (double expcomp, bool maskZeroexpcomp) +std::string FramesMetaData::expcompToString(double expcomp, bool maskZeroexpcomp) { char buffer[256]; if (maskZeroexpcomp) { if (expcomp != 0.0) { - sprintf (buffer, "%0.2f", expcomp); + snprintf(buffer, sizeof(buffer), "%0.2f", expcomp); return buffer; } else { return ""; } } else { - sprintf (buffer, "%0.2f", expcomp); + snprintf(buffer, sizeof(buffer), "%0.2f", expcomp); return buffer; } } -double FramesMetaData::shutterFromString (std::string s) +double FramesMetaData::shutterFromString(std::string s) { - size_t i = s.find_first_of ('/'); + size_t i = s.find_first_of('/'); if (i == std::string::npos) { - return atof (s.c_str()); + return atof(s.c_str()); } else { - return atof (s.substr(0, i).c_str()) / atof (s.substr(i + 1).c_str()); + return atof(s.substr(0, i).c_str()) / atof(s.substr(i + 1).c_str()); } } -double FramesMetaData::apertureFromString (std::string s) +double FramesMetaData::apertureFromString(std::string s) { - return atof (s.c_str()); + return atof(s.c_str()); } extern "C" { @@ -1285,7 +1327,7 @@ extern "C" { }; IptcData * - iptc_data_new_from_jpeg_file (FILE *infile) + iptc_data_new_from_jpeg_file(FILE *infile) { IptcData *d; unsigned char * buf; @@ -1297,52 +1339,57 @@ extern "C" { return nullptr; } - d = iptc_data_new (); + d = iptc_data_new(); if (!d) { return nullptr; } - buf = (unsigned char*)iptc_mem_alloc (d->priv->mem, buf_len); + buf = (unsigned char*)iptc_mem_alloc(d->priv->mem, buf_len); if (!buf) { - iptc_data_unref (d); + iptc_data_unref(d); return nullptr; } - len = iptc_jpeg_read_ps3 (infile, buf, buf_len); + len = iptc_jpeg_read_ps3(infile, buf, buf_len); if (len <= 0) { goto failure; } - offset = iptc_jpeg_ps3_find_iptc (buf, len, &iptc_len); + offset = iptc_jpeg_ps3_find_iptc(buf, len, &iptc_len); if (offset <= 0) { goto failure; } - iptc_data_load (d, buf + offset, iptc_len); + iptc_data_load(d, buf + offset, iptc_len); - iptc_mem_free (d->priv->mem, buf); + iptc_mem_free(d->priv->mem, buf); return d; failure: - iptc_mem_free (d->priv->mem, buf); - iptc_data_unref (d); + iptc_mem_free(d->priv->mem, buf); + iptc_data_unref(d); return nullptr; } } -FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) : - iptc(nullptr), dcrawFrameCount (0) +FramesData::FramesData(const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) : + iptc(nullptr), dcrawFrameCount(0) { + GStatBuf statbuf = {}; + g_stat(fname.c_str(), &statbuf); + modTimeStamp = statbuf.st_mtime; + modTime = timeFromTS(modTimeStamp); + if (rml && (rml->exifBase >= 0 || rml->ciffBase >= 0)) { - FILE* f = g_fopen (fname.c_str (), "rb"); + FILE* f = g_fopen(fname.c_str(), "rb"); if (f) { - rtexif::ExifManager exifManager (f, std::move(rml), firstFrameOnly); + rtexif::ExifManager exifManager(f, std::move(rml), firstFrameOnly); if (exifManager.f && exifManager.rml) { if (exifManager.rml->exifBase >= 0) { exifManager.parseRaw (); @@ -1356,8 +1403,9 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0), modTimeStamp))); } + for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); @@ -1367,57 +1415,64 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0), modTimeStamp))); } - rewind (exifManager.f); // Not sure this is necessary - iptc = iptc_data_new_from_jpeg_file (exifManager.f); + + rewind(exifManager.f); // Not sure this is necessary + iptc = iptc_data_new_from_jpeg_file(exifManager.f); } - fclose (f); + + fclose(f); } } else if (hasTiffExtension(fname)) { - FILE* f = g_fopen (fname.c_str (), "rb"); + FILE* f = g_fopen(fname.c_str(), "rb"); if (f) { - rtexif::ExifManager exifManager (f, std::move(rml), firstFrameOnly); + rtexif::ExifManager exifManager(f, std::move(rml), firstFrameOnly); exifManager.parseTIFF(); roots = exifManager.roots; // creating FrameData for (auto currFrame : exifManager.frames) { - frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0), modTimeStamp))); } + 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 ()); + iptc = iptc_data_new_from_data((unsigned char*)t->getValue(), (unsigned)t->getValueSize()); break; } } - fclose (f); + + fclose(f); } } } -FramesData::~FramesData () +FramesData::~FramesData() { for (auto currRoot : roots) { delete currRoot; } if (iptc) { - iptc_data_free (iptc); + iptc_data_free(iptc); } } diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index ff8ed4b86..752fafab3 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -23,12 +23,18 @@ #include #include -#include #include #include "imageio.h" +namespace Glib +{ + +class ustring; + +} + namespace rtexif { @@ -38,7 +44,7 @@ class TagDirectory; namespace rtengine { -class FrameData +class FrameData final { protected: @@ -66,7 +72,7 @@ protected: public: - FrameData (rtexif::TagDirectory* frameRootDir, rtexif::TagDirectory* rootDir, rtexif::TagDirectory* firstRootDir); + FrameData (rtexif::TagDirectory* frameRootDir, rtexif::TagDirectory* rootDir, rtexif::TagDirectory* firstRootDir, time_t ts = 0); virtual ~FrameData (); bool getPixelShift () const; @@ -95,7 +101,7 @@ public: int getRating () const; }; -class FramesData : public FramesMetaData { +class FramesData final : public FramesMetaData { private: // frame's root IFD, can be a file root IFD or a SUB-IFD std::vector> frames; @@ -103,6 +109,8 @@ private: std::vector roots; IptcData* iptc; unsigned int dcrawFrameCount; + struct tm modTime; + time_t modTimeStamp; public: explicit FramesData (const Glib::ustring& fname, std::unique_ptr rml = nullptr, bool firstFrameOnly = false); diff --git a/rtengine/imagedimensions.cc b/rtengine/imagedimensions.cc index 5b60e5da7..5e780558c 100644 --- a/rtengine/imagedimensions.cc +++ b/rtengine/imagedimensions.cc @@ -54,6 +54,14 @@ int PreviewProps::getSkip() const return skip; } +void PreviewProps::set (int x, int y, int w, int h, int skip) { + this->x = x; + this->y = y; + this->width = w; + this->height = h; + this->skip = skip; +} + ImageDimensions::ImageDimensions() : width(-1), height(-1) diff --git a/rtengine/imagedimensions.h b/rtengine/imagedimensions.h index eb92798c3..fce7a4dea 100644 --- a/rtengine/imagedimensions.h +++ b/rtengine/imagedimensions.h @@ -29,6 +29,7 @@ public: int getWidth() const; int getHeight() const; int getSkip() const; + void set (int x, int y, int w, int h, int skip); private: int x; diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 1da91a4b4..e4cb28e6b 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -165,8 +165,22 @@ Imagefloat* Imagefloat::copy () const return cp; } +Imagefloat* Imagefloat::copySubRegion (int x, int y, int width, int height) +{ + Imagefloat* cp = NULL; + int realWidth = LIM(x + width, 0, this->width) - x; + int realHeight = LIM(y + height, 0, this->height) - y; + + if (realWidth > 0 && realHeight > 0) { + cp = new Imagefloat (realWidth, realHeight); + copyData(cp, x, y, realWidth, realHeight); + } + + return cp; +} + // This is called by the StdImageSource class. We assume that fp images from StdImageSource don't have to deal with gamma -void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const +void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const { // compute channel multipliers @@ -178,10 +192,10 @@ void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* imag gm = dgm; bm = dbm; - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm = 1.f / rm; + gm = 1.f / gm; + bm = 1.f / bm; + float mul_lum = 0.299f * rm + 0.587f * gm + 0.114f * bm; rm /= mul_lum; gm /= mul_lum; bm /= mul_lum; @@ -288,10 +302,10 @@ void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* imag 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] = CLIP0(rm2 * rtot / area); - lineG[dst_x] = CLIP0(gm2 * gtot / area); - lineB[dst_x] = CLIP0(bm2 * btot / area); + float larea = src_sub_width * src_sub_height; + lineR[dst_x] = CLIP0(rm2 * rtot / larea); + lineG[dst_x] = CLIP0(gm2 * gtot / larea); + lineB[dst_x] = CLIP0(bm2 * btot / larea); } } } @@ -327,53 +341,47 @@ void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* imag #endif } -Image8* -Imagefloat::to8() const +// From ART. +void Imagefloat::multiply(float factor, bool multithread) { - Image8* img8 = new Image8(width, height); -#ifdef _OPENMP - #pragma omp parallel for schedule(static) + const int W = width; + const int H = height; +#ifdef __SSE2__ + vfloat vfactor = F2V(factor); #endif - for (int h = 0; h < height; ++h) { - for (int w = 0; w < width; ++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))); - } - } - - return img8; -} - -Image16* -Imagefloat::to16() const -{ - Image16* img16 = new Image16(width, height); #ifdef _OPENMP - #pragma omp parallel for schedule(static) +# pragma omp parallel for firstprivate(W, H) schedule(dynamic, 5) if (multithread) #endif - - for (int h = 0; h < height; ++h) { - for (int w = 0; w < width; ++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)); + for (int y = 0; y < H; y++) { + int x = 0; +#ifdef __SSE2__ + for (; x < W-3; x += 4) { + vfloat rv = LVF(r(y, x)); + vfloat gv = LVF(g(y, x)); + vfloat bv = LVF(b(y, x)); + STVF(r(y, x), rv * vfactor); + STVF(g(y, x), gv * vfactor); + STVF(b(y, x), bv * vfactor); + } +#endif + for (; x < W; ++x) { + r(y, x) *= factor; + g(y, x) *= factor; + b(y, x) *= factor; } } - - return img16; } void Imagefloat::normalizeFloat(float srcMinVal, float srcMaxVal) { - float scale = MAXVALD / (srcMaxVal - srcMinVal); - int w = width; - int h = height; + const float scale = MAXVALF / (srcMaxVal - srcMinVal); + const int w = width; + const int h = height; #ifdef _OPENMP - #pragma omp parallel for firstprivate(w, h, srcMinVal, scale) schedule(dynamic, 5) + #pragma omp parallel for schedule(dynamic, 5) #endif for (int y = 0; y < h; y++) { @@ -386,96 +394,15 @@ void Imagefloat::normalizeFloat(float srcMinVal, float srcMaxVal) } // convert values's range to [0;1] ; this method assumes that the input values's range is [0;65535] -void Imagefloat::normalizeFloatTo1() +void Imagefloat::normalizeFloatTo1(bool multithread) { - - int w = width; - int h = height; - -#ifdef _OPENMP - #pragma omp parallel for firstprivate(w, h) schedule(dynamic, 5) -#endif - - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - r(y, x) /= 65535.f; - g(y, x) /= 65535.f; - b(y, x) /= 65535.f; - } - } + multiply(1.f/65535.f, multithread); } // convert values's range to [0;65535 ; this method assumes that the input values's range is [0;1] -void Imagefloat::normalizeFloatTo65535() +void Imagefloat::normalizeFloatTo65535(bool multithread) { - - int w = width; - int h = height; - -#ifdef _OPENMP - #pragma omp parallel for firstprivate(w, h) schedule(dynamic, 5) -#endif - - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - r(y, x) *= 65535.f; - g(y, x) *= 65535.f; - b(y, x) *= 65535.f; - } - } -} - -void Imagefloat::calcCroppedHistogram(const ProcParams ¶ms, float scale, LUTu & hist) -{ - - hist.clear(); - - // Set up factors to calc the lightness - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); - - float facRed = wprof[1][0]; - float facGreen = wprof[1][1]; - float facBlue = wprof[1][2]; - - - // calc pixel size - 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++) { - int i = (int)(facRed * r(y, x) + facGreen * g(y, x) + facBlue * b(y, x)); - - if (i < 0) { - i = 0; - } else if (i > 65535) { - i = 65535; - } - - histThr[i]++; - } - } - -#ifdef _OPENMP - #pragma omp critical -#endif - { - for(int i = 0; i <= 0xffff; i++) { - hist[i] += histThr[i]; - } - } - } - + multiply(65535.f, multithread); } // Parallelized transformation; create transform with cmsFLAGS_NOCACHE! diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 4a2b2f7e1..38a4bf651 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -34,7 +34,7 @@ class LabImage; /* * Image type used by most tools; expected range: [0.0 ; 65535.0] */ -class Imagefloat : public IImagefloat, public ImageIO +class Imagefloat final : public IImagefloat, public ImageIO { public: @@ -44,11 +44,9 @@ public: ~Imagefloat () override; Imagefloat* copy () const; + Imagefloat* copySubRegion (int x, int y, int width, int height); - Image8* to8() const; - Image16* to16() const; - - void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const override; + void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const override; const char* getType () const override { @@ -72,10 +70,6 @@ public: { return getEmbeddedProfile (); } - int getBitsPerPixel () const override - { - return 8 * sizeof(float); - } int saveToFile (const Glib::ustring &fname) const override { return save (fname); @@ -88,18 +82,20 @@ public: { return saveJPEG (fname, quality, subSamp); } - int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override + int saveAsTIFF ( + const Glib::ustring &fname, + int bps = -1, + bool isFloat = false, + bool uncompressed = false, + bool big = false + ) const override { - return saveTIFF (fname, bps, isFloat, uncompressed); + return saveTIFF (fname, bps, isFloat, uncompressed, big); } void setSaveProgressListener (ProgressListener* pl) override { setProgressListener (pl); } - void free () override - { - delete this; - } inline uint16_t DNG_FloatToHalf(float f) const { @@ -109,35 +105,35 @@ public: } tmp; tmp.f = f; - int32_t sign = (tmp.i >> 16) & 0x00008000; + const int32_t lsign = (tmp.i >> 16) & 0x00008000; int32_t exponent = ((tmp.i >> 23) & 0x000000ff) - (127 - 15); - int32_t mantissa = tmp.i & 0x007fffff; + int32_t mantissa = tmp.i & 0x007fffff; if (exponent <= 0) { if (exponent < -10) { - return (uint16_t)sign; + return (uint16_t)lsign; } mantissa = (mantissa | 0x00800000) >> (1 - exponent); if (mantissa & 0x00001000) mantissa += 0x00002000; - return (uint16_t)(sign | (mantissa >> 13)); + return (uint16_t)(lsign | (mantissa >> 13)); } else if (exponent == 0xff - (127 - 15)) { if (mantissa == 0) { - return (uint16_t)(sign | 0x7c00); + return (uint16_t)(lsign | 0x7c00); } else { - return (uint16_t)(sign | 0x7c00 | (mantissa >> 13)); + return (uint16_t)(lsign | 0x7c00 | (mantissa >> 13)); } } if (mantissa & 0x00001000) { mantissa += 0x00002000; if (mantissa & 0x00800000) { - mantissa = 0; // overflow in significand, + 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)(lsign | 0x7c00); // infinity with the same sign as f. } - return (uint16_t)(sign | (exponent << 10) | (mantissa >> 13)); + return (uint16_t)(lsign | (exponent << 10) | (mantissa >> 13)); } // From DNG SDK dng_utils.h @@ -148,13 +144,13 @@ public: uint32_t i; } tmp; - int32_t sign = (halfValue >> 15) & 0x00000001; + const int32_t lsign = (halfValue >> 15) & 0x00000001; int32_t exponent = (halfValue >> 10) & 0x0000001f; - int32_t mantissa = halfValue & 0x000003ff; + int32_t mantissa = halfValue & 0x000003ff; if (exponent == 0) { if (mantissa == 0) { // Plus or minus zero - tmp.i = (uint32_t) (sign << 31); + tmp.i = (uint32_t) (lsign << 31); return tmp.f; } else { // Denormalized number -- renormalize it @@ -168,7 +164,7 @@ public: } 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)); + tmp.i = (uint32_t)((lsign << 31) | ((0x1eL + 127 - 15) << 23) | (0x3ffL << 13)); return tmp.f; } else { // Nan -- Just set to zero. @@ -179,32 +175,32 @@ public: exponent += (127 - 15); mantissa <<= 13; // Assemble sign, exponent and mantissa. - tmp.i = (uint32_t) ((sign << 31) | (exponent << 23) | mantissa); + tmp.i = (uint32_t) ((lsign << 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]; + const int32_t lsign = (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); + return (uint32_t) (lsign << 31); } else { // Denormalized number -- renormalize it while (!(mantissa & 0x00010000)) { - mantissa <<= 1; - exponent -= 1; - } - exponent += 1; - 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)); + return (uint32_t) ((lsign << 31) | ((0x7eL + 128 - 64) << 23) | (0xffffL << 7)); } else { // Nan -- Just set to zero. return 0; @@ -214,13 +210,13 @@ public: exponent += (128 - 64); mantissa <<= 7; // Assemble sign, exponent and mantissa. - return (uint32_t) ((sign << 31) | (exponent << 23) | mantissa); + return (uint32_t) ((lsign << 31) | (exponent << 23) | mantissa); } + void multiply(float factor, bool multithread); void normalizeFloat(float srcMinVal, float srcMaxVal) override; - void normalizeFloatTo1(); - void normalizeFloatTo65535(); - void calcCroppedHistogram(const ProcParams ¶ms, float scale, LUTu & hist); + void normalizeFloatTo1(bool multithread=true); + void normalizeFloatTo65535(bool multithread=true); void ExecCMSTransform(cmsHTRANSFORM hTransform); void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); }; diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index fce181c3f..31c97aeb8 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -17,20 +17,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include -#include -#include -#include #include #include +#include +#include +#include +#include + #include +#include #include -#include "rt_math.h" -#include "procparams.h" -#include "utils.h" -#include "../rtgui/options.h" -#include "../rtgui/version.h" -#include "../rtexif/rtexif.h" +#include +#include +#include #ifdef WIN32 #include @@ -38,12 +37,20 @@ #include #endif +#include "color.h" +#include "iccjpeg.h" #include "imageio.h" #include "iptcpairs.h" -#include "iccjpeg.h" -#include "color.h" - #include "jpeg.h" +#include "procparams.h" +#include "rt_math.h" +#include "utils.h" + +#include "../rtgui/options.h" +#include "../rtgui/version.h" + +#include "../rtexif/rtexif.h" + using namespace std; using namespace rtengine; @@ -194,7 +201,6 @@ ImageIO::ImageIO() : profileData(nullptr), profileLength(0), loadedProfileData(nullptr), - loadedProfileDataJpg(false), loadedProfileLength(0), exifChange(new procparams::ExifPairs), iptc(nullptr), @@ -516,7 +522,6 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) jpeg_read_header(&cinfo, TRUE); deleteLoadedProfileData(); - loadedProfileDataJpg = true; bool hasprofile = read_icc_profile (&cinfo, (JOCTET**)&loadedProfileData, (unsigned int*)&loadedProfileLength); if (hasprofile) { @@ -601,7 +606,6 @@ int ImageIO::loadJPEG (const Glib::ustring &fname) cinfo.out_color_space = JCS_RGB; deleteLoadedProfileData(); - loadedProfileDataJpg = true; bool hasprofile = read_icc_profile (&cinfo, (JOCTET**)&loadedProfileData, (unsigned int*)&loadedProfileLength); if (hasprofile) { @@ -677,14 +681,17 @@ int ImageIO::getTIFFSampleFormat (const Glib::ustring &fname, IIOSampleFormat &s return IMIO_VARIANTNOTSUPPORTED; } - if (!TIFFGetField(in, TIFFTAG_SAMPLEFORMAT, &sampleformat)) + if (!TIFFGetField(in, TIFFTAG_SAMPLEFORMAT, &sampleformat)) { /* * WARNING: This is a dirty hack! * We assume that files which doesn't contain the TIFFTAG_SAMPLEFORMAT tag * (which is the case with uncompressed TIFFs produced by RT!) are RGB files, * but that may be not true. --- Hombre */ - { + sampleformat = SAMPLEFORMAT_UINT; + } else if (sampleformat == SAMPLEFORMAT_VOID) { + // according to https://www.awaresystems.be/imaging/tiff/tifftags/sampleformat.html + // we assume SAMPLEFORMAT_UINT if SAMPLEFORMAT_VOID is set sampleformat = SAMPLEFORMAT_UINT; } @@ -792,6 +799,8 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) if (!hasTag) { // These are needed TIFFClose(in); + fprintf(stderr, "Error 1 loading %s\n", fname.c_str()); + fflush(stderr); return IMIO_VARIANTNOTSUPPORTED; } @@ -800,6 +809,8 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) if (config != PLANARCONFIG_CONTIG) { TIFFClose(in); + fprintf(stderr, "Error 2 loading %s\n", fname.c_str()); + fflush(stderr); return IMIO_VARIANTNOTSUPPORTED; } @@ -847,7 +858,6 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) char* profdata; deleteLoadedProfileData(); - loadedProfileDataJpg = false; if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &loadedProfileLength, &profdata)) { embProfile = cmsOpenProfileFromMem (profdata, loadedProfileLength); @@ -859,32 +869,33 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) allocate (width, height); - unsigned char* linebuffer = new unsigned char[TIFFScanlineSize(in) * (samplesperpixel == 1 ? 3 : 1)]; + std::unique_ptr linebuffer(new unsigned char[TIFFScanlineSize(in) * (samplesperpixel == 1 ? 3 : 1)]); for (int row = 0; row < height; row++) { - if (TIFFReadScanline(in, linebuffer, row, 0) < 0) { + if (TIFFReadScanline(in, linebuffer.get(), row, 0) < 0) { TIFFClose(in); - delete [] linebuffer; + fprintf(stderr, "Error 3 loading %s\n", fname.c_str()); + fflush(stderr); return IMIO_READERROR; } if (samplesperpixel > 3) { for (int i = 0; i < width; i++) { - memcpy (linebuffer + i * 3 * bitspersample / 8, linebuffer + i * samplesperpixel * bitspersample / 8, 3 * bitspersample / 8); + memcpy(linebuffer.get() + i * 3 * bitspersample / 8, linebuffer.get() + i * samplesperpixel * bitspersample / 8, 3 * bitspersample / 8); } } else if (samplesperpixel == 1) { const size_t bytes = bitspersample / 8; for (int i = width - 1; i >= 0; --i) { - const unsigned char* const src = linebuffer + i * bytes; - unsigned char* const dest = linebuffer + i * 3 * bytes; + const unsigned char* const src = linebuffer.get() + i * bytes; + unsigned char* const dest = linebuffer.get() + i * 3 * bytes; memcpy(dest + 2 * bytes, src, bytes); memcpy(dest + 1 * bytes, src, bytes); memcpy(dest + 0 * bytes, src, bytes); } } - setScanline (row, linebuffer, bitspersample); + setScanline (row, linebuffer.get(), bitspersample); if (pl && !(row % 100)) { pl->setProgress ((double)(row + 1) / height); @@ -892,7 +903,6 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) } TIFFClose(in); - delete [] linebuffer; if (pl) { pl->setProgressStr ("PROGRESSBAR_READY"); @@ -1023,7 +1033,7 @@ int ImageIO::savePNG (const Glib::ustring &fname, int bps) const #if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED) png_set_option(png, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON); #endif - + png_infop info = png_create_info_struct(png); if (!info) { @@ -1222,25 +1232,34 @@ int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) con jpeg_start_compress(&cinfo, TRUE); - // buffer for exif and iptc markers - unsigned char* buffer = new unsigned char[165535]; //FIXME: no buffer size check so it can be overflowed in createJPEGMarker() for large tags, and then software will crash - unsigned int size; + // buffer for exif marker + unsigned char* exifBuffer = nullptr; + unsigned int exifBufferSize = 0; // assemble and write exif marker if (exifRoot) { - int size = rtexif::ExifManager::createJPEGMarker (exifRoot, *exifChange, cinfo.image_width, cinfo.image_height, buffer); + rtexif::ExifManager::createJPEGMarker (exifRoot, *exifChange, cinfo.image_width, cinfo.image_height, exifBuffer, exifBufferSize); - if (size > 0 && size < 65530) { - jpeg_write_marker(&cinfo, JPEG_APP0 + 1, buffer, size); + if (exifBufferSize > 0 && exifBufferSize < 65530) { + jpeg_write_marker(&cinfo, JPEG_APP0 + 1, exifBuffer, exifBufferSize); } + } + if (exifBuffer != nullptr) { + delete [] exifBuffer; + } + + // buffer for iptc marker + unsigned char* iptcBuffer = new unsigned char[65535]; + // assemble and write iptc marker if (iptc) { unsigned char* iptcdata; + unsigned int iptcSize; bool error = false; - if (iptc_data_save (iptc, &iptcdata, &size)) { + if (iptc_data_save (iptc, &iptcdata, &iptcSize)) { if (iptcdata) { iptc_data_free_buf (iptc, iptcdata); } @@ -1250,7 +1269,7 @@ int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) con int bytes = 0; - if (!error && (bytes = iptc_jpeg_ps3_save_iptc (nullptr, 0, iptcdata, size, buffer, 65532)) < 0) { + if (!error && (bytes = iptc_jpeg_ps3_save_iptc (nullptr, 0, iptcdata, iptcSize, iptcBuffer, 65532)) < 0) { error = true; } @@ -1259,11 +1278,11 @@ int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) con } if (!error) { - jpeg_write_marker(&cinfo, JPEG_APP0 + 13, buffer, bytes); + jpeg_write_marker(&cinfo, JPEG_APP0 + 13, iptcBuffer, bytes); } } - delete [] buffer; + delete [] iptcBuffer; // write icc profile to the output if (profileData) { @@ -1324,7 +1343,13 @@ int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) con return IMIO_SUCCESS; } -int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool uncompressed) const +int ImageIO::saveTIFF ( + const Glib::ustring &fname, + int bps, + bool isFloat, + bool uncompressed, + bool big +) const { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; @@ -1338,23 +1363,35 @@ int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool u bps = getBPS (); } - int lineWidth = width * 3 * bps / 8; - unsigned char* linebuffer = new unsigned char[lineWidth]; + int lineWidth = width * 3 * (bps / 8); + std::vector linebuffer(lineWidth); + + std::string mode = "w"; // little hack to get libTiff to use proper byte order (see TIFFClienOpen()): - const char *mode = !exifRoot ? "w" : (exifRoot->getOrder() == rtexif::INTEL ? "wl" : "wb"); + if (exifRoot) { + if (exifRoot->getOrder() == rtexif::INTEL) { + mode += 'l'; + } else { + mode += 'b'; + } + } + + if (big) { + mode += '8'; + } + #ifdef WIN32 FILE *file = g_fopen_withBinaryAndLock (fname); int fileno = _fileno(file); int osfileno = _get_osfhandle(fileno); - TIFF* out = TIFFFdOpen (osfileno, fname.c_str(), mode); + TIFF* out = TIFFFdOpen (osfileno, fname.c_str(), mode.c_str()); #else - TIFF* out = TIFFOpen(fname.c_str(), mode); + TIFF* out = TIFFOpen(fname.c_str(), mode.c_str()); int fileno = TIFFFileno (out); #endif if (!out) { - delete [] linebuffer; return IMIO_CANNOTWRITEFILE; } @@ -1365,7 +1402,7 @@ int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool u bool applyExifPatch = false; - if (exifRoot) { + if (exifRoot && !big) { rtexif::TagDirectory* cl = (const_cast (exifRoot))->clone (nullptr); // ------------------ remove some unknown top level tags which produce warnings when opening a tiff (might be useless) ----------------- @@ -1395,18 +1432,19 @@ int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool u if (exif) { int exif_size = exif->calculateSize(); - unsigned char *buffer = new unsigned char[exif_size + 8]; // TIFFOpen writes out the header and sets file pointer at position 8 + const uint64_t file_offset = 8; // must be 64-bit, because TIFFTAG_EXIFIFD is + unsigned char *buffer = new unsigned char[exif_size + file_offset]; - exif->write (8, buffer); + exif->write (file_offset, buffer); - write (fileno, buffer + 8, exif_size); + write (fileno, buffer + file_offset, exif_size); delete [] buffer; // let libtiff know that scanlines or any other following stuff should go // at a different offset: - TIFFSetWriteOffset (out, exif_size + 8); - TIFFSetField (out, TIFFTAG_EXIFIFD, 8); + TIFFSetWriteOffset (out, exif_size + file_offset); + TIFFSetField (out, TIFFTAG_EXIFIFD, file_offset); applyExifPatch = true; } } @@ -1447,24 +1485,19 @@ int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool u } #if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::MOTOROLA; + bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::MOTOROLA; #else - bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::INTEL; + bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::INTEL; #endif + if (iptcdata) { rtexif::Tag iptcTag(nullptr, rtexif::lookupAttrib (rtexif::ifdAttribs, "IPTCData")); iptcTag.initLongArray((char*)iptcdata, iptclen); if (needsReverse) { unsigned char *ptr = iptcTag.getValue(); - for (int a = 0; a < iptcTag.getCount(); ++a) { - unsigned char cc; - cc = ptr[3]; - ptr[3] = ptr[0]; - ptr[0] = cc; - cc = ptr[2]; - ptr[2] = ptr[1]; - ptr[1] = cc; - ptr += 4; + for (int a = 0; a < iptcTag.getCount(); ++a, ptr += 4) { + std::swap(ptr[0], ptr[3]); + std::swap(ptr[1], ptr[2]); } } TIFFSetField (out, TIFFTAG_RICHTIFFIPTC, iptcTag.getCount(), (long*)iptcTag.getValue()); @@ -1483,6 +1516,19 @@ int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool u TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_ADOBE_DEFLATE); TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, (bps == 16 || bps == 32) && isFloat ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); + [out]() + { + const std::vector default_tags = rtexif::ExifManager::getDefaultTIFFTags(nullptr); + + TIFFSetField (out, TIFFTAG_XRESOLUTION, default_tags[2]->toDouble()); + TIFFSetField (out, TIFFTAG_YRESOLUTION, default_tags[3]->toDouble()); + TIFFSetField (out, TIFFTAG_RESOLUTIONUNIT, default_tags[4]->toInt()); + + for (auto default_tag : default_tags) { + delete default_tag; + } + }(); + if (!uncompressed) { TIFFSetField (out, TIFFTAG_PREDICTOR, (bps == 16 || bps == 32) && isFloat ? PREDICTOR_FLOATINGPOINT : PREDICTOR_HORIZONTAL); } @@ -1491,32 +1537,25 @@ int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool u } for (int row = 0; row < height; row++) { - getScanline (row, linebuffer, bps, isFloat); + getScanline (row, linebuffer.data(), 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; + std::swap(linebuffer[i], linebuffer[i + 1]); } } } 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; + std::swap(linebuffer[i], linebuffer[i + 3]); + std::swap(linebuffer[i + 1], linebuffer[i + 2]); } } } - if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { + if (TIFFWriteScanline (out, linebuffer.data(), row, 0) < 0) { TIFFClose (out); - delete [] linebuffer; return IMIO_CANNOTWRITEFILE; } @@ -1566,8 +1605,6 @@ int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool u fclose (file); #endif - delete [] linebuffer; - if (pl) { pl->setProgressStr ("PROGRESSBAR_READY"); pl->setProgress (1.0); @@ -1689,11 +1726,7 @@ MyMutex& ImageIO::mutex () void ImageIO::deleteLoadedProfileData( ) { if(loadedProfileData) { - if(loadedProfileDataJpg) { - free(loadedProfileData); - } else { - delete[] loadedProfileData; - } + delete[] loadedProfileData; } loadedProfileData = nullptr; diff --git a/rtengine/imageio.h b/rtengine/imageio.h index d9afa926f..e900feccd 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -70,7 +70,6 @@ protected: char* profileData; int profileLength; char* loadedProfileData; - bool loadedProfileDataJpg; int loadedProfileLength; const std::unique_ptr exifChange; IptcData* iptc; @@ -94,7 +93,7 @@ public: void setSampleArrangement(IIOSampleArrangement sArrangement); IIOSampleArrangement getSampleArrangement() const; - virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, PreviewProps pp) const = 0; + 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, const unsigned char* buffer, int bps, unsigned int numSamples = 3) = 0; @@ -114,7 +113,13 @@ public: 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; + int saveTIFF ( + const Glib::ustring &fname, + int bps = -1, + bool isFloat = false, + bool uncompressed = false, + bool big = false + ) const; cmsHPROFILE getEmbeddedProfile () const; void getEmbeddedProfileData (int& length, unsigned char*& pdata) const; diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index e0c26aa9f..1f4c2179a 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -25,8 +25,9 @@ #include "coord2d.h" #include "imagedata.h" -#include "LUT.h" #include "rtengine.h" +#include "colortemp.h" +#include "array2D.h" template class LUT; @@ -86,21 +87,17 @@ protected: public: ImageSource () : references (1), redAWBMul(-1.), greenAWBMul(-1.), blueAWBMul(-1.), - embProfile(nullptr), idata(nullptr), dirpyrdenoiseExpComp(INFINITY) {} + embProfile(nullptr), idata(nullptr), dirpyrdenoiseExpComp(RT_INFINITY) {} ~ImageSource () override {} virtual int load (const Glib::ustring &fname) = 0; virtual void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) {}; - virtual void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) {}; - virtual bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams& currentParams, std::array& newExps) { return false; }; virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) {}; virtual void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; virtual void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; virtual void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; - virtual void flushRawData () {}; - virtual void flushRGB () {}; + virtual void flush () = 0; virtual void HLRecovery_Global (const procparams::ToneCurveParams &hrp) {}; - virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; virtual bool isRGBSourceModified () const = 0; // tracks whether cached rgb output of demosaic has been modified @@ -109,9 +106,10 @@ public: virtual int getFrameCount () = 0; virtual int getFlatFieldAutoClipValue () = 0; + virtual void getWBMults (const ColorTemp &ctemp, const procparams::RAWParams &raw, std::array& scale_mul, float &autoGainComp, float &rm, float &gm, float &bm) const = 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 procparams::ToneCurveParams &hlp, const procparams::RAWParams &raw) = 0; + virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hlp, const procparams::RAWParams &raw, int opposed) = 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 @@ -119,8 +117,11 @@ public: virtual void convertColorSpace (Imagefloat* image, const procparams::ColorManagementParams &cmp, const ColorTemp &wb) = 0; // DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) = 0; + virtual void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) = 0; virtual ColorTemp getWB () const = 0; - virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) = 0; + virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal, StandardObserver observer) = 0; + virtual void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) = 0; + virtual void getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, const procparams::WBParams & wbpar) = 0; virtual double getDefGain () const { @@ -136,6 +137,7 @@ public: virtual ImageMatrices* getImageMatrices () = 0; virtual bool isRAW () const = 0; + virtual bool isGainMapSupported () const = 0; virtual DCPProfile* getDCP (const procparams::ColorManagementParams &cmp, DCPProfileApplyState &as) { return nullptr; @@ -143,11 +145,11 @@ public: virtual void setProgressListener (ProgressListener* pl) {} - void increaseRef () override + void increaseRef () final { references++; } - void decreaseRef () override + void decreaseRef () final { references--; @@ -165,25 +167,25 @@ public: } // for RAW files, compute a tone curve using histogram matching on the embedded thumbnail - virtual void getAutoMatchedToneCurve(const procparams::ColorManagementParams &cp, std::vector &outCurve) + virtual void getAutoMatchedToneCurve(const procparams::ColorManagementParams &cp, StandardObserver observer, std::vector &outCurve) { outCurve = { 0.0 }; } - double getDirPyrDenoiseExpComp ( ) + double getDirPyrDenoiseExpComp () const { return dirpyrdenoiseExpComp; } // functions inherited from the InitialImage interface - Glib::ustring getFileName () override + Glib::ustring getFileName () final { return fileName; } - cmsHPROFILE getEmbeddedProfile () override + cmsHPROFILE getEmbeddedProfile () final { return embProfile; } - const FramesMetaData* getMetaData () override + const FramesMetaData* getMetaData () final { return idata; } @@ -193,6 +195,9 @@ public: } virtual void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) = 0; virtual void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) = 0; + virtual void wbMul2Camera(double &rm, double &gm, double &bm) = 0; + virtual void wbCamera2Mul(double &rm, double &gm, double &bm) = 0; + }; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index a4ca0ea0b..3a3529131 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1,6 +1,6 @@ /* * This file is part of RawTherapee. - * + * * Copyright (c) 2004-2010 Gabor Horvath * * RawTherapee is free software: you can redistribute it and/or modify @@ -17,17 +17,18 @@ * along with RawTherapee. If not, see . */ #include -#include -#include + #include #include "improccoordinator.h" +#include "array2D.h" #include "cieimage.h" #include "color.h" #include "colortemp.h" #include "curves.h" #include "dcp.h" +#include "guidedfilter.h" #include "iccstore.h" #include "image8.h" #include "imagefloat.h" @@ -35,7 +36,9 @@ #include "labimage.h" #include "lcp.h" #include "procparams.h" +#include "tweakoperator.h" #include "refreshmap.h" +#include "utils.h" #include "../rtgui/options.h" @@ -43,6 +46,12 @@ #include #endif +namespace +{ + +constexpr int VECTORSCOPE_SIZE = 128; + +} namespace rtengine { @@ -50,16 +59,18 @@ namespace rtengine ImProcCoordinator::ImProcCoordinator() : orig_prev(nullptr), oprevi(nullptr), + spotprev(nullptr), oprevl(nullptr), nprevl(nullptr), fattal_11_dcrop_cache(nullptr), previmg(nullptr), workimg(nullptr), - ncie (nullptr), - imgsrc (nullptr), - lastAwbEqual (0.), - lastAwbTempBias (0.0), - monitorIntent (RI_RELATIVE), + ncie(nullptr), + imgsrc(nullptr), + lastAwbEqual(0.), + lastAwbTempBias(0.0), + lastAwbauto(""), + monitorIntent(RI_RELATIVE), softProof(false), gamutCheck(false), sharpMask(false), @@ -110,6 +121,21 @@ ImProcCoordinator::ImProcCoordinator() : histLRETI(256), + hist_lrgb_dirty(false), + hist_raw_dirty(false), + + vectorscopeScale(0), + vectorscope_hc_dirty(false), + vectorscope_hs_dirty(false), + vectorscope_hc(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), + vectorscope_hs(VECTORSCOPE_SIZE, VECTORSCOPE_SIZE), + waveformScale(0), + waveform_dirty(false), + waveformRed(0, 0), + waveformGreen(0, 0), + waveformBlue(0, 0), + waveformLuma(0, 0), + CAMBrightCurveJ(), CAMBrightCurveQ(), rCurve(), @@ -135,13 +161,16 @@ ImProcCoordinator::ImProcCoordinator() : pdSharpenAutoRadiusListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), + filmNegListener(nullptr), actListener(nullptr), + primListener(nullptr), adnListener(nullptr), awavListener(nullptr), dehaListener(nullptr), hListener(nullptr), resultValid(false), params(new procparams::ProcParams), + tweakOperator(nullptr), lastOutputProfile("BADFOOD"), lastOutputIntent(RI__COUNT), lastOutputBPC(false), @@ -163,7 +192,57 @@ ImProcCoordinator::ImProcCoordinator() : highQualityComputed(false), customTransformIn(nullptr), customTransformOut(nullptr), - ipf(params.get(), true) + ipf(params.get(), true), + + // Locallab + locallListener(nullptr), + lllocalcurve(65536, LUT_CLIP_OFF), + cllocalcurve(65536, LUT_CLIP_OFF), + lclocalcurve(65536, LUT_CLIP_OFF), + cclocalcurve(65536, LUT_CLIP_OFF), + rgblocalcurve(65536, LUT_CLIP_OFF), + exlocalcurve(65536, LUT_CLIP_OFF), + hltonecurveloc(65536, LUT_CLIP_OFF), //32768 + shtonecurveloc(65536, LUT_CLIP_OFF), + tonecurveloc(65536, LUT_CLIP_OFF), + lightCurveloc(32770, LUT_CLIP_OFF), + lmasklocalcurve(65536, LUT_CLIP_OFF), + lmaskexplocalcurve(65536, LUT_CLIP_OFF), + lmaskSHlocalcurve(65536, LUT_CLIP_OFF), + lmaskviblocalcurve(65536, LUT_CLIP_OFF), + lmasktmlocalcurve(65536, LUT_CLIP_OFF), + lmaskretilocalcurve(65536, LUT_CLIP_OFF), + lmaskcblocalcurve(65536, LUT_CLIP_OFF), + lmaskbllocalcurve(65536, LUT_CLIP_OFF), + lmasklclocalcurve(65536, LUT_CLIP_OFF), + lmaskloglocalcurve(65536, LUT_CLIP_OFF), + lmasklocal_curve(65536, LUT_CLIP_OFF), + lmaskcielocalcurve(65536, LUT_CLIP_OFF), + cielocalcurve(65536, LUT_CLIP_OFF), + cielocalcurve2(65536, LUT_CLIP_OFF), + jzlocalcurve(65536, LUT_CLIP_OFF), + czlocalcurve(65536, LUT_CLIP_OFF), + czjzlocalcurve(65536, LUT_CLIP_OFF), + lastspotdup(false), + previewDeltaE(false), + locallColorMask(0), + locallColorMaskinv(0), + locallExpMask(0), + locallExpMaskinv(0), + locallSHMask(0), + locallSHMaskinv(0), + locallvibMask(0), + localllcMask(0), + locallcbMask(0), + locallretiMask(0), + locallsoftMask(0), + localltmMask(0), + locallblMask(0), + locallsharMask(0), + localllogMask(0), + locall_Mask(0), + locallcieMask(0), + retistrsav(nullptr) { } @@ -194,12 +273,12 @@ ImProcCoordinator::~ImProcCoordinator() imgsrc->decreaseRef(); - if(customTransformIn) { + if (customTransformIn) { cmsDeleteTransform(customTransformIn); customTransformIn = nullptr; } - if(customTransformOut) { + if (customTransformOut) { cmsDeleteTransform(customTransformOut); customTransformOut = nullptr; } @@ -212,9 +291,32 @@ void ImProcCoordinator::assign(ImageSource* imgsrc) this->imgsrc = imgsrc; } -void ImProcCoordinator::getParams(procparams::ProcParams* dst) +void ImProcCoordinator::getParams(procparams::ProcParams* dst, bool tweaked) { - *dst = *params; + if (!tweaked && paramsBackup.operator bool()) { + *dst = *paramsBackup; + } else { + *dst = *params; + } +} + +void ImProcCoordinator::backupParams() +{ + if (!params) { + return; + } + if (!paramsBackup) { + paramsBackup.reset(new ProcParams()); + } + *paramsBackup = *params; +} + +void ImProcCoordinator::restoreParams() +{ + if (!paramsBackup || !params) { + return; + } + *params = *paramsBackup; } DetailedCrop* ImProcCoordinator::createCrop(::EditDataProvider *editDataProvider, bool isDetailWindow) @@ -227,15 +329,17 @@ DetailedCrop* ImProcCoordinator::createCrop(::EditDataProvider *editDataProvider // todo: bitmask containing desired actions, taken from changesSinceLast void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) { + // TODO Locallab printf MyMutex::MyLock processingLock(mProcessing); bool highDetailNeeded = options.prevdemo == PD_Sidecar ? true : (todo & M_HIGHQUAL); + // printf("metwb=%s \n", params->wb.method.c_str()); // 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 + if (crops[i]->get_skip() == 1) { // skip=1 -> full resolution highDetailNeeded = true; break; } @@ -252,7 +356,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) RAWParams rp = params->raw; ColorManagementParams cmp = params->icm; LCurveParams lcur = params->labCurve; - + bool spotsDone = false; + 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)) { @@ -279,24 +384,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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); + hist_raw_dirty = !(hListener && hListener->updateHistogramRaw()); highDetailPreprocessComputed = highDetailNeeded; - - // After preprocess, run film negative processing if enabled - if ( - (todo & M_RAW) - && ( - imgsrc->getSensorType() == ST_BAYER - || imgsrc->getSensorType() == ST_FUJI_XTRANS - ) - && params->filmNegative.enabled - ) { - imgsrc->filmNegativeProcess(params->filmNegative); - } } /* @@ -312,13 +408,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // 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, imgsrc->isMono()); + imageTypeListener->imageTypeChanged(imgsrc->isRAW(), imgsrc->getSensorType() == ST_BAYER, imgsrc->getSensorType() == ST_FUJI_XTRANS, imgsrc->isMono(), imgsrc->isGainMapSupported()); } - + bool iscolor = (params->toneCurve.method == "Color");// || params->toneCurve.method == "Coloropp"); if ((todo & M_RAW) || (!highDetailRawComputed && highDetailNeeded) - || (params->toneCurve.hrenabled && params->toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) - || (!params->toneCurve.hrenabled && params->toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { + // || (params->toneCurve.hrenabled && params->toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) + // || (!params->toneCurve.hrenabled && params->toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { + || (params->toneCurve.hrenabled && !iscolor && imgsrc->isRGBSourceModified()) + || (!params->toneCurve.hrenabled && iscolor && imgsrc->isRGBSourceModified())) { if (settings->verbose) { if (imgsrc->getSensorType() == ST_BAYER) { @@ -327,8 +425,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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)) { + + 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)); @@ -336,6 +435,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } 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, params->pdsharpening.enabled); @@ -343,8 +443,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) { bayerAutoContrastListener->autoContrastChanged(contrastThreshold); } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) { - xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); + + xtransAutoContrastListener->autoContrastChanged(contrastThreshold); } + // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag todo |= (M_INIT | M_CSHARP); @@ -354,9 +456,11 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) double pdSharpencontrastThreshold = params->pdsharpening.contrast; double pdSharpenRadius = params->pdsharpening.deconvradius; imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold, pdSharpenRadius); + if (pdSharpenAutoContrastListener && params->pdsharpening.autoContrast) { pdSharpenAutoContrastListener->autoContrastChanged(pdSharpencontrastThreshold); } + if (pdSharpenAutoRadiusListener && params->pdsharpening.autoRadius) { pdSharpenAutoRadiusListener->autoRadiusChanged(pdSharpenRadius); } @@ -365,8 +469,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if ((todo & M_RAW) || (!highDetailRawComputed && highDetailNeeded) - || (params->toneCurve.hrenabled && params->toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) - || (!params->toneCurve.hrenabled && params->toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { + // || (params->toneCurve.hrenabled && params->toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) + // || (!params->toneCurve.hrenabled && params->toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { + || (params->toneCurve.hrenabled && !iscolor && imgsrc->isRGBSourceModified()) + || (!params->toneCurve.hrenabled && iscolor && imgsrc->isRGBSourceModified())) { if (highDetailNeeded) { highDetailRawComputed = true; } else { @@ -381,6 +487,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } + if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { + if (params->wb.method == "autitcgreen") { + imgsrc->getrgbloc(0, 0, fh, fw, 0, 0, fh, fw, params->wb); + } + } + if ((todo & (M_RETINEX | M_INIT)) && params->retinex.enabled) { bool dehacontlutili = false; bool mapcontlutili = false; @@ -397,51 +509,94 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } + const bool autowb = (params->wb.method == "autold" || params->wb.method == "autitcgreen"); + if (settings->verbose) { + printf("automethod=%s \n", params->wb.method.c_str()); + } 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 + // 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); + currWB = ColorTemp(params->wb.temperature, params->wb.green, params->wb.equal, params->wb.method, params->wb.observer); + float studgood = 1000.f; 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) { + lastAwbauto = ""; //reinitialize auto + } else if (autowb) { + if (params->wb.method == "autitcgreen" || lastAwbEqual != params->wb.equal || lastAwbObserver != params->wb.observer || lastAwbTempBias != params->wb.tempBias || lastAwbauto != params->wb.method) { 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 tempitc = 5000.f; + double greenitc = 1.; + currWBitc = imgsrc->getWB(); + double tempref = currWBitc.getTemp() * (1. + params->wb.tempBias); + double greenref = currWBitc.getGreen(); + if (settings->verbose && params->wb.method == "autitcgreen") { + printf("tempref=%f greref=%f\n", tempref, greenref); } - //double rr,gg,bb; - //autoWB.getMultipliers(rr,gg,bb); + imgsrc->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw, params->toneCurve); + + if (params->wb.method == "autitcgreen") { + params->wb.temperature = tempitc; + params->wb.green = greenitc; + currWB = ColorTemp(params->wb.temperature, params->wb.green, 1., params->wb.method, params->wb.observer); + //printf("tempitc=%f greitc=%f\n", tempitc, greenitc); + + currWB.getMultipliers(rm, gm, bm); + } + + if (rm != -1.) { + double bias = params->wb.tempBias; + + if (params->wb.method == "autitcgreen") { + bias = 0.; + } + + autoWB.update(rm, gm, bm, params->wb.equal, params->wb.observer, bias); + lastAwbEqual = params->wb.equal; + lastAwbObserver = params->wb.observer; + lastAwbTempBias = params->wb.tempBias; + lastAwbauto = params->wb.method; + } else { + lastAwbEqual = -1.; + lastAwbObserver = ColorTemp::DEFAULT_OBSERVER; + lastAwbTempBias = 0.0; + lastAwbauto = ""; + autoWB.useDefaults(params->wb.equal, params->wb.observer); + } + + } currWB = autoWB; } + double rw = 1.; + double gw = 1.; + double bw = 1.; if (params->wb.enabled) { - params->wb.temperature = currWB.getTemp(); + currWB = currWB.convertObserver(params->wb.observer); + params->wb.temperature = static_cast(currWB.getTemp()); params->wb.green = currWB.getGreen(); + currWB.getMultipliers(rw, gw, bw); + imgsrc->wbMul2Camera(rw, gw, bw); + // printf("ra=%f ga=%f ba=%f\n", rw, gw, bw); } - if (params->wb.method == "Auto" && awbListener && params->wb.enabled) { - awbListener->WBChanged(params->wb.temperature, params->wb.green); + if (awbListener) { + if (params->wb.method == "autitcgreen") { + awbListener->WBChanged(params->wb.temperature, params->wb.green, rw, gw, bw, studgood); + } else { + awbListener->WBChanged(params->wb.temperature, params->wb.green, rw, gw, bw, -1.f); + } } /* @@ -477,8 +632,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) PreviewProps pp(0, 0, fw, fh, scale); // Tells to the ImProcFunctions' tools what is the preview scale, which may lead to some simplifications ipf.setScale(scale); + int inpaintopposed = 1;//force getimage to use inpaint-opposed if enable, only once + imgsrc->getImage(currWB, tr, orig_prev, pp, params->toneCurve, params->raw, inpaintopposed); + + if ((todo & M_SPOT) && params->spot.enabled && !params->spot.entries.empty()) { + spotsDone = true; + PreviewProps pp(0, 0, fw, fh, scale); + ipf.removeSpots(orig_prev, imgsrc, params->spot.entries, pp, currWB, nullptr, tr); + } - imgsrc->getImage(currWB, tr, orig_prev, pp, params->toneCurve, params->raw); denoiseInfoStore.valid = false; //ColorTemp::CAT02 (orig_prev, ¶ms) ; // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale); @@ -496,16 +658,16 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) float max_r[nbw*nbh]; float max_b[nbw*nbh]; - if(denoiseParams.Lmethod == "CUR") { - if(noiseLCurve) + if (denoiseParams.Lmethod == "CUR") { + if (noiseLCurve) denoiseParams.luma = 0.5f; else denoiseParams.luma = 0.0f; - } else if(denoiseParams.Lmethod == "SLI") + } else if (denoiseParams.Lmethod == "SLI") noiseLCurve.Reset(); - if(noiseLCurve || noiseCCurve){//only allocate memory if enabled and scale=1 + 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;iiconvertColorSpace(orig_prev, params->icm, currWB); + + if (params->filmNegative.enabled) { + + // Process film negative AFTER colorspace conversion + if (params->filmNegative.colorSpace != FilmNegativeParams::ColorSpace::INPUT) { + imgsrc->convertColorSpace(orig_prev, params->icm, currWB); + } + + // Perform negative inversion. If needed, upgrade filmNegative params for backwards compatibility with old profiles + if (ipf.filmNegativeProcess(orig_prev, orig_prev, params->filmNegative, params->raw, imgsrc, currWB) && filmNegListener) { + filmNegListener->filmRefValuesChanged(params->filmNegative.refInput, params->filmNegative.refOutput); + } + + // Process film negative BEFORE colorspace conversion (legacy mode) + if (params->filmNegative.colorSpace == FilmNegativeParams::ColorSpace::INPUT) { + imgsrc->convertColorSpace(orig_prev, params->icm, currWB); + } + + } else { + imgsrc->convertColorSpace(orig_prev, params->icm, currWB); + } ipf.firstAnalysis(orig_prev, *params, vhist16); } + oprevi = orig_prev; + + if ((todo & M_SPOT) && !spotsDone) { + if (params->spot.enabled && !params->spot.entries.empty()) { + allocCache(spotprev); + orig_prev->copyData(spotprev); + PreviewProps pp(0, 0, fw, fh, scale); + ipf.removeSpots(spotprev, imgsrc, params->spot.entries, pp, currWB, ¶ms->icm, tr); + } else { + if (spotprev) { + delete spotprev; + spotprev = nullptr; + } + } + } + if (spotprev) { + spotprev->copyData(orig_prev); + } + 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); + ipf.dehaze(orig_prev, params->dehaze); + ipf.ToneMapFattal02(orig_prev, params->fattal, 3, 0, nullptr, 0, 0, 0); if (oprevi != orig_prev) { delete oprevi; } } - oprevi = orig_prev; - // Remove transformation if unneeded - bool needstransform = ipf.needsTransform(); + bool needstransform = ipf.needsTransform(fw, fh, imgsrc->getRotateDegree(), imgsrc->getMetaData()); + 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); @@ -560,6 +761,14 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } + for (int sp = 0; sp < (int)params->locallab.spots.size(); sp++) { + if(params->locallab.spots.at(sp).expsharp && params->dirpyrequalizer.cbdlMethod == "bef") { + if(params->locallab.spots.at(sp).shardamping < 1) { + params->locallab.spots.at(sp).shardamping = 1; + } + } + } + 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(); @@ -584,7 +793,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (params->toneCurve.histmatching) { if (!params->toneCurve.fromHistMatching) { - imgsrc->getAutoMatchedToneCurve(params->icm, params->toneCurve.curve); + imgsrc->getAutoMatchedToneCurve(params->icm, params->wb.observer, params->toneCurve.curve); } if (params->toneCurve.autoexp) { @@ -603,40 +812,553 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) aeListener->autoMatchedToneCurveChanged(params->toneCurve.curveMode, params->toneCurve.curve); } } - } - 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); + // Encoding log with locallab + if (params->locallab.enabled && !params->locallab.spots.empty()) { + const int sizespot = (int)params->locallab.spots.size(); + const LocallabParams::LocallabSpot defSpot; + + float *sourceg = nullptr; + sourceg = new float[sizespot]; + float *sourceab = nullptr; + sourceab = new float[sizespot]; + float *targetg = nullptr; + targetg = new float[sizespot]; + bool *log = nullptr; + log = new bool[sizespot]; + bool *cie = nullptr; + cie = new bool[sizespot]; + bool *autocomput = nullptr; + autocomput = new bool[sizespot]; + float *blackev = nullptr; + blackev = new float[sizespot]; + float *whiteev = nullptr; + whiteev = new float[sizespot]; + bool *Autogr = nullptr; + Autogr = new bool[sizespot]; + bool *autocie = nullptr; + autocie = new bool[sizespot]; + + + float *locx = nullptr; + locx = new float[sizespot]; + float *locy = nullptr; + locy = new float[sizespot]; + float *locxL = nullptr; + locxL = new float[sizespot]; + float *locyT = nullptr; + locyT = new float[sizespot]; + float *centx = nullptr; + centx = new float[sizespot]; + float *centy = nullptr; + centy = new float[sizespot]; + + for (int sp = 0; sp < sizespot; sp++) { + log[sp] = params->locallab.spots.at(sp).explog; + cie[sp] = params->locallab.spots.at(sp).expcie; + autocomput[sp] = params->locallab.spots.at(sp).autocompute; + autocie[sp] = params->locallab.spots.at(sp).Autograycie; + blackev[sp] = params->locallab.spots.at(sp).blackEv; + whiteev[sp] = params->locallab.spots.at(sp).whiteEv; + sourceg[sp] = params->locallab.spots.at(sp).sourceGray; + sourceab[sp] = params->locallab.spots.at(sp).sourceabs; + Autogr[sp] = params->locallab.spots.at(sp).Autogray; + targetg[sp] = params->locallab.spots.at(sp).targetGray; + locx[sp] = params->locallab.spots.at(sp).loc.at(0) / 2000.0; + locy[sp] = params->locallab.spots.at(sp).loc.at(2) / 2000.0; + locxL[sp] = params->locallab.spots.at(sp).loc.at(1) / 2000.0; + locyT[sp] = params->locallab.spots.at(sp).loc.at(3) / 2000.0; + centx[sp] = params->locallab.spots.at(sp).centerX / 2000.0 + 0.5; + centy[sp] = params->locallab.spots.at(sp).centerY / 2000.0 + 0.5; + + const bool fullimstd = params->locallab.spots.at(sp).fullimage;//for log encoding standard + const bool fullimjz = true;//always force fullimage in log encoding Jz - always possible to put a checkbox if need + + if ((log[sp] && autocomput[sp]) || (cie[sp] && autocie[sp])) { + constexpr int SCALE = 10; + int fw, fh, tr = TR_NONE; + imgsrc->getFullSize(fw, fh, tr); + PreviewProps pp(0, 0, fw, fh, SCALE); + + float ysta = std::max(static_cast(centy[sp] - locyT[sp]), 0.f); + float yend = std::min(static_cast(centy[sp] + locy[sp]), 1.f); + float xsta = std::max(static_cast(centx[sp] - locxL[sp]), 0.f); + float xend = std::min(static_cast(centx[sp] + locx[sp]), 1.f); + + if (fullimstd && (log[sp] && autocomput[sp])) { + ysta = 0.f; + yend = 1.f; + xsta = 0.f; + xend = 1.f; + } + + if (fullimjz && (cie[sp] && autocie[sp])) { + ysta = 0.f; + yend = 1.f; + xsta = 0.f; + xend = 1.f; + } + + ipf.getAutoLogloc(sp, imgsrc, sourceg, blackev, whiteev, Autogr, sourceab, fw, fh, xsta, xend, ysta, yend, SCALE); + // printf("sp=%i sg=%f sab=%f\n", sp, sourceg[sp], sourceab[sp]); + params->locallab.spots.at(sp).blackEv = blackev[sp]; + params->locallab.spots.at(sp).whiteEv = whiteev[sp]; + params->locallab.spots.at(sp).blackEvjz = blackev[sp]; + params->locallab.spots.at(sp).whiteEvjz = whiteev[sp]; + params->locallab.spots.at(sp).sourceGray = sourceg[sp]; + params->locallab.spots.at(sp).sourceabs = sourceab[sp]; + params->locallab.spots.at(sp).sourceGraycie = sourceg[sp]; + params->locallab.spots.at(sp).sourceabscie = sourceab[sp]; + float jz1 = defSpot.jz100; + if (locallListener) { + locallListener->logencodChanged(blackev[sp], whiteev[sp], sourceg[sp], sourceab[sp], targetg[sp], autocomput[sp], autocie[sp], jz1); + } + } } - const Glib::ustring profile = params->icm.workingProfile; + delete [] locx; + delete [] locy; + delete [] locxL; + delete [] locyT; + delete [] centx; + delete [] centy; - 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; - } - 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; - } - ipf.workingtrc(oprevi, oprevi, cw, ch, 5, params->icm.workingProfile, params->icm.workingTRCGamma, params->icm.workingTRCSlope, customTransformOut, false, true, true); - } + delete [] autocie; + delete [] Autogr; + delete [] whiteev; + delete [] blackev; + delete [] targetg; + delete [] sourceab; + delete [] sourceg; + delete [] cie; + delete [] log; + delete [] autocomput; } } - if ((todo & M_RGBCURVE) || (todo & M_CROP)) { - // if (hListener) oprevi->calcCroppedHistogram(params, scale, histCropped); + if ((todo & (M_AUTOEXP | M_RGBCURVE | M_CROP)) && params->locallab.enabled && !params->locallab.spots.empty()) { + + ipf.rgb2lab(*oprevi, *oprevl, params->icm.workingProfile); + nprevl->CopyFrom(oprevl); + // int maxspot = 1; + //************************************************************* + // locallab + //************************************************************* + + /* + * 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 . + * 2017 2018 Jacques Desmis + * 2019 Pierre Cabrera + */ + const std::unique_ptr reserv(new LabImage(*oprevl, true)); + const std::unique_ptr lastorigimp(new LabImage(*oprevl, true)); + std::unique_ptr savenormdr; + std::unique_ptr savenormtm; + std::unique_ptr savenormreti; + float **shbuffer = nullptr; + int sca = 1; + double huere, chromare, lumare, huerefblu, chromarefblu, lumarefblu, sobelre; + float avge, meantme, stdtme, meanretie, stdretie; + //std::vector locallref; + std::vector locallretiminmax; + huerefs.resize(params->locallab.spots.size()); + huerefblurs.resize(params->locallab.spots.size()); + chromarefblurs.resize(params->locallab.spots.size()); + lumarefblurs.resize(params->locallab.spots.size()); + chromarefs.resize(params->locallab.spots.size()); + lumarefs.resize(params->locallab.spots.size()); + sobelrefs.resize(params->locallab.spots.size()); + avgs.resize(params->locallab.spots.size()); + meantms.resize(params->locallab.spots.size()); + stdtms.resize(params->locallab.spots.size()); + meanretis.resize(params->locallab.spots.size()); + stdretis.resize(params->locallab.spots.size()); + const int sizespot = (int)params->locallab.spots.size(); + + float *huerefp = nullptr; + huerefp = new float[sizespot]; + float *chromarefp = nullptr; + chromarefp = new float[sizespot]; + float *lumarefp = nullptr; + lumarefp = new float[sizespot]; + float *fabrefp = nullptr; + fabrefp = new float[sizespot]; + + for (int sp = 0; sp < (int)params->locallab.spots.size(); sp++) { + + if (params->locallab.spots.at(sp).equiltm && params->locallab.spots.at(sp).exptonemap) { + savenormtm.reset(new LabImage(*oprevl, true)); + } + + if (params->locallab.spots.at(sp).equilret && params->locallab.spots.at(sp).expreti) { + savenormreti.reset(new LabImage(*oprevl, true)); + } + // Set local curves of current spot to LUT + locRETgainCurve.Set(params->locallab.spots.at(sp).localTgaincurve); + locRETtransCurve.Set(params->locallab.spots.at(sp).localTtranscurve); + const bool LHutili = loclhCurve.Set(params->locallab.spots.at(sp).LHcurve); + const bool HHutili = lochhCurve.Set(params->locallab.spots.at(sp).HHcurve); + const bool CHutili = locchCurve.Set(params->locallab.spots.at(sp).CHcurve); + const bool HHutilijz = lochhCurvejz.Set(params->locallab.spots.at(sp).HHcurvejz); + const bool CHutilijz = locchCurvejz.Set(params->locallab.spots.at(sp).CHcurvejz); + const bool LHutilijz = loclhCurvejz.Set(params->locallab.spots.at(sp).LHcurvejz); + const bool lcmasutili = locccmasCurve.Set(params->locallab.spots.at(sp).CCmaskcurve); + const bool llmasutili = locllmasCurve.Set(params->locallab.spots.at(sp).LLmaskcurve); + const bool lhmasutili = lochhmasCurve.Set(params->locallab.spots.at(sp).HHmaskcurve); + const bool lhhmasutili = lochhhmasCurve.Set(params->locallab.spots.at(sp).HHhmaskcurve); + const bool llmasexputili = locllmasexpCurve.Set(params->locallab.spots.at(sp).LLmaskexpcurve); + const bool lcmasexputili = locccmasexpCurve.Set(params->locallab.spots.at(sp).CCmaskexpcurve); + const bool lhmasexputili = lochhmasexpCurve.Set(params->locallab.spots.at(sp).HHmaskexpcurve); + const bool llmasSHutili = locllmasSHCurve.Set(params->locallab.spots.at(sp).LLmaskSHcurve); + const bool lcmasSHutili = locccmasSHCurve.Set(params->locallab.spots.at(sp).CCmaskSHcurve); + const bool lhmasSHutili = lochhmasSHCurve.Set(params->locallab.spots.at(sp).HHmaskSHcurve); + const bool llmasvibutili = locllmasvibCurve.Set(params->locallab.spots.at(sp).LLmaskvibcurve); + const bool lcmasvibutili = locccmasvibCurve.Set(params->locallab.spots.at(sp).CCmaskvibcurve); + const bool lhmasvibutili = lochhmasvibCurve.Set(params->locallab.spots.at(sp).HHmaskvibcurve); + const bool llmascbutili = locllmascbCurve.Set(params->locallab.spots.at(sp).LLmaskcbcurve); + const bool lcmascbutili = locccmascbCurve.Set(params->locallab.spots.at(sp).CCmaskcbcurve); + const bool lhmascbutili = lochhmascbCurve.Set(params->locallab.spots.at(sp).HHmaskcbcurve); + const bool llmaslcutili = locllmaslcCurve.Set(params->locallab.spots.at(sp).LLmasklccurve); + const bool lcmaslcutili = locccmaslcCurve.Set(params->locallab.spots.at(sp).CCmasklccurve); + const bool lhmaslcutili = lochhmaslcCurve.Set(params->locallab.spots.at(sp).HHmasklccurve); + const bool llmasretiutili = locllmasretiCurve.Set(params->locallab.spots.at(sp).LLmaskreticurve); + const bool lcmasretiutili = locccmasretiCurve.Set(params->locallab.spots.at(sp).CCmaskreticurve); + const bool lhmasretiutili = lochhmasretiCurve.Set(params->locallab.spots.at(sp).HHmaskreticurve); + const bool llmastmutili = locllmastmCurve.Set(params->locallab.spots.at(sp).LLmasktmcurve); + const bool lcmastmutili = locccmastmCurve.Set(params->locallab.spots.at(sp).CCmasktmcurve); + const bool lhmastmutili = lochhmastmCurve.Set(params->locallab.spots.at(sp).HHmasktmcurve); + const bool llmasblutili = locllmasblCurve.Set(params->locallab.spots.at(sp).LLmaskblcurve); + const bool lcmasblutili = locccmasblCurve.Set(params->locallab.spots.at(sp).CCmaskblcurve); + const bool lhmasblutili = lochhmasblCurve.Set(params->locallab.spots.at(sp).HHmaskblcurve); + const bool llmaslogutili = locllmaslogCurve.Set(params->locallab.spots.at(sp).LLmaskcurveL); + const bool lcmaslogutili = locccmaslogCurve.Set(params->locallab.spots.at(sp).CCmaskcurveL); + const bool lhmaslogutili = lochhmaslogCurve.Set(params->locallab.spots.at(sp).HHmaskcurveL); + const bool llmascieutili = locllmascieCurve.Set(params->locallab.spots.at(sp).LLmaskciecurve); + const bool lcmascieutili = locccmascieCurve.Set(params->locallab.spots.at(sp).CCmaskciecurve); + const bool lhmascieutili = lochhmascieCurve.Set(params->locallab.spots.at(sp).HHmaskciecurve); + + const bool lcmas_utili = locccmas_Curve.Set(params->locallab.spots.at(sp).CCmask_curve); + const bool llmas_utili = locllmas_Curve.Set(params->locallab.spots.at(sp).LLmask_curve); + const bool lhmas_utili = lochhmas_Curve.Set(params->locallab.spots.at(sp).HHmask_curve); + const bool lhhmas_utili = lochhhmas_Curve.Set(params->locallab.spots.at(sp).HHhmask_curve); + const bool lmasutiliblwav = loclmasCurveblwav.Set(params->locallab.spots.at(sp).LLmaskblcurvewav); + const bool lmasutilicolwav = loclmasCurvecolwav.Set(params->locallab.spots.at(sp).LLmaskcolcurvewav); + const bool locwavutili = locwavCurve.Set(params->locallab.spots.at(sp).locwavcurve); + const bool locwavutilijz = locwavCurvejz.Set(params->locallab.spots.at(sp).locwavcurvejz); + const bool loclevwavutili = loclevwavCurve.Set(params->locallab.spots.at(sp).loclevwavcurve); + const bool locconwavutili = locconwavCurve.Set(params->locallab.spots.at(sp).locconwavcurve); + const bool loccompwavutili = loccompwavCurve.Set(params->locallab.spots.at(sp).loccompwavcurve); + const bool loccomprewavutili = loccomprewavCurve.Set(params->locallab.spots.at(sp).loccomprewavcurve); + const bool locwavhueutili = locwavCurvehue.Set(params->locallab.spots.at(sp).locwavcurvehue); + const bool locwavdenutili = locwavCurveden.Set(params->locallab.spots.at(sp).locwavcurveden); + const bool locedgwavutili = locedgwavCurve.Set(params->locallab.spots.at(sp).locedgwavcurve); + const bool lmasutili_wav = loclmasCurve_wav.Set(params->locallab.spots.at(sp).LLmask_curvewav); + const bool locallutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).llcurve, lllocalcurve, sca); + const bool localclutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).clcurve, cllocalcurve, sca); + const bool locallcutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).lccurve, lclocalcurve, sca); + const bool localcutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).cccurve, cclocalcurve, sca); + const bool localrgbutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).rgbcurve, rgblocalcurve, sca); + const bool localexutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).excurve, exlocalcurve, sca); + const bool localmaskutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, sca); + const bool localmaskexputili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, sca); + const bool localmaskSHutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, sca); + const bool localmaskvibutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve, sca); + const bool localmasktmutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, sca); + const bool localmaskretiutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, sca); + const bool localmaskcbutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, sca); + const bool localmaskblutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, sca); + const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, sca); + const bool localmasklogutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).LmaskcurveL, lmaskloglocalcurve, sca); + const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, sca); + const bool localmaskcieutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).Lmaskciecurve, lmaskcielocalcurve, sca); + const bool localcieutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).ciecurve, cielocalcurve, sca); + const bool localcieutili2 = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).ciecurve2, cielocalcurve2, sca); + const bool localjzutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).jzcurve, jzlocalcurve, sca); + const bool localczutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).czcurve, czlocalcurve, sca); + const bool localczjzutili = CurveFactory::diagonalCurve2Lut(params->locallab.spots.at(sp).czjzcurve, czjzlocalcurve, sca); + double ecomp = params->locallab.spots.at(sp).expcomp; + double black = params->locallab.spots.at(sp).black; + double hlcompr = params->locallab.spots.at(sp).hlcompr; + double hlcomprthresh = params->locallab.spots.at(sp).hlcomprthresh; + double shcompr = params->locallab.spots.at(sp).shcompr; + double br = params->locallab.spots.at(sp).lightness; + double cont = params->locallab.spots.at(sp).contrast; + + if (black < 0. && params->locallab.spots.at(sp).expMethod == "pde") { + black *= 1.5; + } + + // Reference parameters computation + if (params->locallab.spots.at(sp).spotMethod == "exc") { + ipf.calc_ref(sp, reserv.get(), reserv.get(), 0, 0, pW, pH, scale, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, avge, locwavCurveden, locwavdenutili); + } else { + ipf.calc_ref(sp, nprevl, nprevl, 0, 0, pW, pH, scale, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, avge, locwavCurveden, locwavdenutili); + } + + meantme = 0.f; + stdtme = 0.f; + meanretie = 0.f; + stdretie = 0.f; + float fab = 1.f; + bool istm = params->locallab.spots.at(sp).equiltm && params->locallab.spots.at(sp).exptonemap; + bool isreti = params->locallab.spots.at(sp).equilret && params->locallab.spots.at(sp).expreti; + //preparation for mean and sigma on current RT-spot + float locx = 0.f; + float locy = 0.f; + float locxl = 0.f; + float locyt = 0.f; + float centx = 0.f; + float centy = 0.f; + float ysta = 0.f; + float yend = 1.f; + float xsta = 0.f; + float xend = 1.f; + if (istm || isreti) { + locx = params->locallab.spots.at(sp).loc.at(0) / 2000.0; + locy = params->locallab.spots.at(sp).loc.at(2) / 2000.0; + locxl= params->locallab.spots.at(sp).loc.at(1) / 2000.0; + locyt = params->locallab.spots.at(sp).loc.at(3) / 2000.0; + centx = params->locallab.spots.at(sp).centerX / 2000.0 + 0.5; + centy = params->locallab.spots.at(sp).centerY / 2000.0 + 0.5; + ysta = std::max(static_cast(centy - locyt), 0.f); + yend = std::min(static_cast(centy + locy), 1.f); + xsta = std::max(static_cast(centx - locxl), 0.f); + xend = std::min(static_cast(centx + locx), 1.f); + // printf("xsta=%f xend=%f ysta=%f yend=%f \n", xsta, xend, ysta, yend); + } + int ww = nprevl->W; + int hh = nprevl->H; + int xxs = xsta * ww; + int xxe = xend * ww; + int yys = ysta * hh; + int yye = yend * hh; + + if (istm) { //calculate mean and sigma on full image for RT-spot use by normalize_mean_dt + ipf.mean_sig (nprevl->L, meantme, stdtme, xxs, xxe, yys, yye); + } + if (isreti) { //calculate mean and sigma on full image for RT-spot use by normalize_mean_dt + ipf.mean_sig (nprevl->L, meanretie, stdretie,xxs, xxe, yys, yye) ; + } + + double huerblu = huerefblurs[sp] = huerefblu; + double chromarblu = chromarefblurs[sp] = chromarefblu; + double lumarblu = lumarefblurs[sp] = lumarefblu; + double huer = huerefs[sp] = huere; + double chromar = chromarefs[sp] = chromare; + double lumar = lumarefs[sp] = lumare ; + double sobeler = sobelrefs[sp] = sobelre; + float avg = avgs[sp] = avge; + float meantm = meantms[sp] = meantme; + float stdtm = stdtms[sp] = stdtme; + float meanreti = meanretis[sp] = meanretie; + float stdreti = stdretis[sp] = stdretie; + huerefp[sp] = huer; + chromarefp[sp] = chromar; + lumarefp[sp] = lumar; + + CurveFactory::complexCurvelocal(ecomp, black / 65535., hlcompr, hlcomprthresh, shcompr, br, cont, lumar, + hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, avg, + sca); + + // Save Locallab mask curve references for current spot + /* + LocallabListener::locallabRef spotref; + spotref.huer = huer; + spotref.lumar = lumar; + spotref.chromar = chromar; + spotref.fab = 1.f; + locallref.push_back(spotref); + */ + // Locallab tools computation + /* Notes: + * - shbuffer is used as nullptr + */ + + // Locallab mask is only showed in detailed image + float minCD; + float maxCD; + float mini; + float maxi; + float Tmean; + float Tsigma; + float Tmin; + float Tmax; + int lastsav; + + float highresi = 0.f; + float nresi = 0.f; + float highresi46 =0.f; + float nresi46 = 0.f; + float Lhighresi = 0.f; + float Lnresi = 0.f; + float Lhighresi46 = 0.f; + float Lnresi46 = 0.f; + + ipf.Lab_Local(3, sp, (float**)shbuffer, nprevl, nprevl, reserv.get(), savenormtm.get(), savenormreti.get(), lastorigimp.get(), fw, fh, 0, 0, pW, pH, scale, locRETgainCurve, locRETtransCurve, + lllocalcurve, locallutili, + cllocalcurve, localclutili, + lclocalcurve, locallcutili, + loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz, loclhCurvejz, + lmasklocalcurve, localmaskutili, + lmaskexplocalcurve, localmaskexputili, + lmaskSHlocalcurve, localmaskSHutili, + lmaskviblocalcurve, localmaskvibutili, + lmasktmlocalcurve, localmasktmutili, + lmaskretilocalcurve, localmaskretiutili, + lmaskcblocalcurve, localmaskcbutili, + lmaskbllocalcurve, localmaskblutili, + lmasklclocalcurve, localmasklcutili, + lmaskloglocalcurve, localmasklogutili, + lmasklocal_curve, localmask_utili, + lmaskcielocalcurve, localmaskcieutili, + cielocalcurve, localcieutili, + cielocalcurve2, localcieutili2, + jzlocalcurve, localjzutili, + czlocalcurve, localczutili, + czjzlocalcurve, localczjzutili, + + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, + locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, + locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, + locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, + locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, + locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, + locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, + + locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, + + lochhhmas_Curve, lhhmas_utili, + loclmasCurveblwav, lmasutiliblwav, + loclmasCurvecolwav, lmasutilicolwav, + locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, + loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, + locwavCurvehue, locwavhueutili, + locwavCurveden, locwavdenutili, + locedgwavCurve, locedgwavutili, + loclmasCurve_wav, lmasutili_wav, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, + huerblu, chromarblu, lumarblu, huer, chromar, lumar, sobeler, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + meantm, stdtm, meanreti, stdreti, fab, + highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46); + + + fabrefp[sp] = fab; + if (istm) { //calculate mean and sigma on full image for use by normalize_mean_dt + float meanf = 0.f; + float stdf = 0.f; + ipf.mean_sig (savenormtm->L, meanf, stdf, xxs, xxe, yys, yye); + + //using 2 unused variables noiselumc and softradiustm + params->locallab.spots.at(sp).noiselumc = (int) meanf; + params->locallab.spots.at(sp).softradiustm = stdf ; + } + + if (isreti) { //calculate mean and sigma on full image for use by normalize_mean_dt + float meanf = 0.f; + float stdf = 0.f; + ipf.mean_sig (savenormreti->L, meanf, stdf,xxs, xxe, yys, yye ); + //using 2 unused variables sensihs and sensiv + params->locallab.spots.at(sp).sensihs = (int) meanf; + params->locallab.spots.at(sp).sensiv = (int) stdf; + } + + + if (sp + 1u < params->locallab.spots.size()) { + // do not copy for last spot as it is not needed anymore + lastorigimp->CopyFrom(nprevl); + } + + // Save Locallab Retinex min/max for current spot + LocallabListener::locallabRetiMinMax retiMinMax; + retiMinMax.cdma = maxCD; + retiMinMax.cdmin = minCD; + retiMinMax.mini = mini; + retiMinMax.maxi = maxi; + retiMinMax.Tmean = Tmean; + retiMinMax.Tsigma = Tsigma; + retiMinMax.Tmin = Tmin; + retiMinMax.Tmax = Tmax; + locallretiminmax.push_back(retiMinMax); + // Recalculate references after + if (params->locallab.spots.at(sp).spotMethod == "exc") { + ipf.calc_ref(sp, reserv.get(), reserv.get(), 0, 0, pW, pH, scale, huerefblu, chromarefblu, lumarefblu, huer, chromar, lumar, sobeler, avg, locwavCurveden, locwavdenutili); + } else { + ipf.calc_ref(sp, nprevl, nprevl, 0, 0, pW, pH, scale, huerefblu, chromarefblu, lumarefblu, huer, chromar, lumar, sobeler, avg, locwavCurveden, locwavdenutili); + } + // Update Locallab reference values according to recurs parameter + if (params->locallab.spots.at(sp).recurs) { + /* + spotref.huer = huer; + spotref.lumar = lumar; + spotref.chromar = chromar; + spotref.fab = fab; + locallref.at(sp).chromar = chromar; + locallref.at(sp).lumar = lumar; + locallref.at(sp).huer = huer; + locallref.at(sp).fab = fab; + */ + huerefp[sp] = huer; + chromarefp[sp] = chromar; + lumarefp[sp] = lumar; + fabrefp[sp] = fab; + + } + // spotref.fab = fab; + // locallref.at(sp).fab = fab; + + // locallref.push_back(spotref); + if (locallListener) { + // locallListener->refChanged(locallref, params->locallab.selspot); + locallListener->refChanged2(huerefp, chromarefp, lumarefp, fabrefp, params->locallab.selspot); + locallListener->minmaxChanged(locallretiminmax, params->locallab.selspot); + } + + } + delete [] huerefp; + delete [] chromarefp; + delete [] lumarefp; + delete [] fabrefp; + // Transmit Locallab reference values and Locallab Retinex min/max to LocallabListener + /* + if (locallListener) { + locallListener->refChanged(locallref, params->locallab.selspot); + locallListener->minmaxChanged(locallretiminmax, params->locallab.selspot); + } + */ + ipf.lab2rgb(*nprevl, *oprevi, params->icm.workingProfile); + //************************************************************* + // end locallab + //************************************************************* + + } + + if ((todo & M_RGBCURVE) || (todo & M_CROP)) { //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, @@ -659,8 +1381,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) {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); + CurveFactory::diagonalCurve2Lut(params->colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); + CurveFactory::diagonalCurve2Lut(params->colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); } if (params->blackwhite.enabled) { @@ -729,12 +1451,12 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) DCPProfileApplyState as; DCPProfile *dcpProf = imgsrc->getDCP(params->icm, as); - ipf.rgbProc (oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, params->toneCurve.saturation, + 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); + printf("ImProcCoordinator / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", static_cast(bwAutoR), static_cast(bwAutoG), static_cast(bwAutoB)); } abwListener->BWChanged((float) rrm, (float) ggm, (float) bbm); @@ -747,17 +1469,20 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // correct GUI black and white with value } + // ipf.Lab_Tile(oprevl, oprevl, scale); + // compute L channel histogram int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); } +// lhist16(32768); 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) + #pragma omp parallel num_threads(numThreads) if (numThreads>1) #endif { LUTu lhist16thr(lhist16.getSize()); @@ -785,19 +1510,30 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) if (todo & M_LUMACURVE) { - CurveFactory::curveCL(clcutili, params->labCurve.clcurve, clcurve, scale == 1 ? 1 : 16); + clcutili = CurveFactory::diagonalCurve2Lut(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); + //scale = 1; + if ((todo & (M_LUMINANCE + M_COLOR)) || (todo & M_AUTOEXP)) { + nprevl->CopyFrom(oprevl); histCCurve.clear(); histLCurve.clear(); + if (params->colorToning.enabled && params->colorToning.method == "LabGrid") { + ipf.colorToningLabGrid(nprevl, 0, nprevl->W, 0, nprevl->H, false); + } + + ipf.shadowsHighlights(nprevl, params->sh.enabled, params->sh.lab,params->sh.highlights ,params->sh.shadows, params->sh.radius, scale, params->sh.htonalwidth, params->sh.stonalwidth); + + if (params->localContrast.enabled) { + // Alberto's local contrast + ipf.localContrast(nprevl, nprevl->L, params->localContrast, false, scale); + } 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.vibrance(nprevl, params->vibrance, params->toneCurve.hrenabled, params->icm.workingProfile); ipf.labColorCorrectionRegions(nprevl); if ((params->colorappearance.enabled && !params->colorappearance.tonecie) || (!params->colorappearance.enabled)) { @@ -810,21 +1546,346 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } - - wavcontlutili = false; - CurveFactory::curveWavContL(wavcontlutili, params->wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); - + wavcontlutili = CurveFactory::diagonalCurve2Lut(params->wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); if ((params->wavelet.enabled)) { WaveletParams WaveParams = params->wavelet; - WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - + WaveParams.getCurves(wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); int kall = 0; - ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + LabImage *unshar = nullptr; + Glib::ustring provis; + LabImage *provradius = nullptr; + bool procont = WaveParams.expcontrast; + bool prochro = WaveParams.expchroma; + bool proedge = WaveParams.expedge; + bool profin = WaveParams.expfinal; + bool proton = WaveParams.exptoning; + bool pronois = WaveParams.expnoise; + if (WaveParams.showmask) { + // WaveParams.showmask = false; + // WaveParams.expclari = true; + } + + if (WaveParams.softrad > 0.f) { + provradius = new LabImage(*nprevl, true); + } + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + provis = params->wavelet.CLmethod; + params->wavelet.CLmethod = "all"; + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + unshar = new LabImage(*nprevl, true); + + params->wavelet.CLmethod = provis; + + WaveParams.expcontrast = false; + WaveParams.expchroma = false; + WaveParams.expedge = false; + WaveParams.expfinal = false; + WaveParams.exptoning = false; + WaveParams.expnoise = false; + } + + ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); + + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = procont; + WaveParams.expchroma = prochro; + WaveParams.expedge = proedge; + WaveParams.expfinal = profin; + WaveParams.exptoning = proton; + WaveParams.expnoise = pronois; + + if (WaveParams.softrad > 0.f) { + + array2D ble(pW, pH); + array2D guid(pW, pH); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(pW, pH); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + float X, Y, Z; + float L = provradius->L[ir][jr]; + float a = provradius->a[ir][jr]; + float b = provradius->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + float La = nprevl->L[ir][jr]; + float aa = nprevl->a[ir][jr]; + float ba = nprevl->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + ble[ir][jr] = Y / 32768.f; + } + + double epsilmax = 0.0001; + double epsilmin = 0.00001; + double aepsil = (epsilmax - epsilmin) / 100.f; + double bepsil = epsilmin; //epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / scale * (0.5f + 0.8f * WaveParams.softrad); + // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + nprevl->L[ir][jr] = L; + } + + delete tmpImage; + + } + + } + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + float mL = (float)(WaveParams.mergeL / 100.f); + float mC = (float)(WaveParams.mergeC / 100.f); + float mL0; + float mC0; + float background = 0.f; + int show = 0; + + + + if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { + mL0 = mC0 = 0.f; + mL = - 1.5f * mL; + mC = -mC; + background = 12000.f; + show = 0; + } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { + mL0 = mL; + mC0 = mC; + background = 0.f; + show = 0; + } else { + mL0 = mL = mC0 = mC = 0.f; + background = 0.f; + show = 0; + } + float indic = 1.f; + + if (WaveParams.showmask){ + mL0 = mC0 = -1.f; + indic = -1.f; + mL = fabs(mL); + mC = fabs(mC); + show = 1; + } +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int x = 0; x < pH; x++) + for (int y = 0; y < pW; y++) { + nprevl->L[x][y] = LIM((1.f + mL0) * (unshar->L[x][y]) + show * background - mL * indic * nprevl->L[x][y], 0.f, 32768.f); + nprevl->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * indic * nprevl->a[x][y]; + nprevl->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * indic * nprevl->b[x][y]; + } + + delete unshar; + unshar = NULL; + + +/* + if (WaveParams.softrad > 0.f) { + array2D ble(pW, pH); + array2D guid(pW, pH); +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + ble[ir][jr] = (nprevl->L[ir][jr] - provradius->L[ir][jr]) / 32768.f; + guid[ir][jr] = provradius->L[ir][jr] / 32768.f; + } + double epsilmax = 0.001; + double epsilmin = 0.0001; + double aepsil = (epsilmax - epsilmin) / 90.f; + double bepsil = epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / scale * (0.001f + 0.8f * WaveParams.softrad); + // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < pH; ir++) + for (int jr = 0; jr < pW; jr++) { + nprevl->L[ir][jr] = provradius->L[ir][jr] + 32768.f * ble[ir][jr]; + } + } +*/ + if (WaveParams.softrad > 0.f) { + + delete provradius; + provradius = NULL; + + } + + + } + } - ipf.softLight(nprevl); + ipf.softLight(nprevl, params->softlight); + + if (params->icm.workingTRC != ColorManagementParams::WorkingTrc::NONE) { + const int GW = nprevl->W; + const int GH = nprevl->H; + std::unique_ptr provis; + const float pres = 0.01f * params->icm.preser; + if (pres > 0.f && params->icm.wprim != ColorManagementParams::Primaries::DEFAULT) { + provis.reset(new LabImage(GW, GH)); + provis->CopyFrom(nprevl); + } + + std::unique_ptr tmpImage1(new Imagefloat(GW, GH)); + + ipf.lab2rgb(*nprevl, *tmpImage1, params->icm.workingProfile); + + const float gamtone = params->icm.workingTRCGamma; + const float slotone = params->icm.workingTRCSlope; + + int illum = toUnderlying(params->icm.will); + const int prim = toUnderlying(params->icm.wprim); + + Glib::ustring prof = params->icm.workingProfile; + cmsHTRANSFORM dummy = nullptr; + int ill = 0; + ipf.workingtrc(tmpImage1.get(), tmpImage1.get(), GW, GH, -5, prof, 2.4, 12.92310, ill, 0, dummy, true, false, false); + ipf.workingtrc(tmpImage1.get(), tmpImage1.get(), GW, GH, 5, prof, gamtone, slotone, illum, prim, dummy, false, true, true); + + ipf.rgb2lab(*tmpImage1, *nprevl, params->icm.workingProfile); + //nprevl and provis + if (provis) { + ipf.preserv(nprevl, provis.get(), GW, GH); + } + if (params->icm.fbw) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int x = 0; x < GH; x++) + for (int y = 0; y < GW; y++) { + nprevl->a[x][y] = 0.f; + nprevl->b[x][y] = 0.f; + } + } + + tmpImage1.reset(); + + if (prim == 12) {//pass red gre blue xy in function of area dats Ciexy + float redgraphx = params->icm.labgridcieALow; + float redgraphy = params->icm.labgridcieBLow; + float blugraphx = params->icm.labgridcieAHigh; + float blugraphy = params->icm.labgridcieBHigh; + float gregraphx = params->icm.labgridcieGx; + float gregraphy = params->icm.labgridcieGy; + float redxx = 0.55f * (redgraphx + 1.f) - 0.1f; + redxx = rtengine::LIM(redxx, 0.41f, 1.f); + float redyy = 0.55f * (redgraphy + 1.f) - 0.1f; + redyy = rtengine::LIM(redyy, 0.f, 0.7f); + float bluxx = 0.55f * (blugraphx + 1.f) - 0.1f; + bluxx = rtengine::LIM(bluxx, -0.1f, 0.5f); + float bluyy = 0.55f * (blugraphy + 1.f) - 0.1f; + bluyy = rtengine::LIM(bluyy, -0.1f, 0.5f); + + float grexx = 0.55f * (gregraphx + 1.f) - 0.1f; + grexx = rtengine::LIM(grexx, -0.1f, 0.4f); + float greyy = 0.55f * (gregraphy + 1.f) - 0.1f; + greyy = rtengine::LIM(greyy, 0.5f, 1.f); + + if (primListener) { + primListener->primChanged (redxx, redyy, bluxx, bluyy, grexx, greyy); + } + } else {//all other cases - pass Cie xy to update graph Ciexy + float r_x = params->icm.redx; + float r_y = params->icm.redy; + float b_x = params->icm.blux; + float b_y = params->icm.bluy; + float g_x = params->icm.grex; + float g_y = params->icm.grey; + //printf("rx=%f ry=%f \n", (double) r_x, (double) r_y); + float wx = 0.33f; + float wy = 0.33f; + + switch (illum) { + case 1://D41 + wx = 0.37798f; + wy = 0.38123f; + break; + case 2://D50 + wx = 0.3457f; + wy = 0.3585f; + break; + case 3://D55 + wx = 0.3324f; + wy = 0.3474f; + break; + case 4://D60 + wx = 0.3217f; + wy = 0.3377f; + break; + case 5://D65 + wx = 0.3127f; + wy = 0.3290f; + break; + case 6://D80 + wx = 0.2937f; + wy = 0.3092f; + break; + case 7://D120 + wx = 0.2697f; + wy = 0.2808f; + break; + case 8://stdA + wx = 0.4476f; + wy = 0.4074f; + break; + case 9://2000K + wx = 0.5266f; + wy = 0.4133f; + break; + case 10://1500K + wx = 0.5857f; + wy = 0.3932f; + break; + } + + if (primListener) { + primListener->iprimChanged (r_x, r_y, b_x, b_y, g_x, g_y, wx, wy); + } + } + } if (params->colorappearance.enabled) { // L histo and Chroma histo for ciecam @@ -869,12 +1930,15 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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 + double kexp = 0.; + E_V += kexp * params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = pow(2.0, E_V - 3.0); // cd / m2 // end calculation adaptation scene luminosity } - + if(params->colorappearance.catmethod == "symg") {//force abolute luminance scenescene to 400 in symmetric + adap = 400.; + } float d, dj, yb; bool execsharp = false; @@ -895,19 +1959,62 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) 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, 0 , scale, execsharp, d, dj, yb, 1); - + ipf.ciecam_02float(ncie, float (adap), pW, 2, nprevl, params.get(), customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 0, scale, execsharp, d, dj, yb, 1); + //call listener if ((params->colorappearance.autodegree || params->colorappearance.autodegreeout) && acListener && params->colorappearance.enabled) { - acListener->autoCamChanged(100.* (double)d, 100.* (double)dj); + if(params->colorappearance.catmethod == "symg") {//force chromatic adaptation to 90 in symmetric + d = 0.9; + dj = 0.9; + } + acListener->autoCamChanged(100.* (double)d, 100.* (double)dj); } if (params->colorappearance.autoadapscen && acListener && params->colorappearance.enabled) { - acListener->adapCamChanged(adap); //real value of adapt scene + acListener->adapCamChanged(adap); //real value of adapt scene, force to 400 in symmetric } if (params->colorappearance.autoybscen && acListener && params->colorappearance.enabled) { + if(params->colorappearance.catmethod == "symg") {//force yb scene to 18 in symmetric + yb = 18; + } + acListener->ybCamChanged((int) yb); //real value Yb scene } + double tempsym = 5003.; + int wmodel = 0;//wmodel allows - arbitrary - choice of illuminant and temp with choice + if (params->colorappearance.wbmodel == "RawT") { + wmodel = 0; + } else if (params->colorappearance.wbmodel == "RawTCAT02") { + wmodel = 1; + } else if (params->colorappearance.wbmodel == "free") { + wmodel = 2;//force white balance in symmetric + } + + if(params->colorappearance.catmethod == "symg" && wmodel == 2) { + tempsym = params->wb.temperature;//force white balance in symmetric + } else { + if (params->colorappearance.illum == "iA") {//otherwise force illuminant source + tempsym = 2856.; + } else if (params->colorappearance.illum == "i41") { + tempsym = 4100.; + } else if (params->colorappearance.illum == "i50") { + tempsym = 5003.; + } else if (params->colorappearance.illum == "i55") { + tempsym = 5503.; + } else if (params->colorappearance.illum == "i60") { + tempsym = 6000. ; + } else if (params->colorappearance.illum == "i65") { + tempsym = 6504.; + } else if (params->colorappearance.illum == "i75") { + tempsym = 7504.; + } else if (params->colorappearance.illum == "ifree") { + tempsym = params->wb.temperature;//force white balance in symmetric + } + } + if (params->colorappearance.enabled && params->colorappearance.autotempout) { + acListener->wbCamChanged(tempsym, 1.f); //real temp and tint = 1. + } + } else { // CIECAM is disabled, we free up its image buffer to save some space if (ncie) { @@ -926,6 +2033,8 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } + // if (todo & (M_AUTOEXP | M_RGBCURVE)) { + // 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; @@ -935,7 +2044,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) } } - // process crop, if needed +// process crop, if needed for (size_t i = 0; i < crops.size(); i++) 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 @@ -951,8 +2060,10 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) // Computing the internal image for analysis, i.e. conversion from WCS->Output profile delete workimg; + workimg = nullptr; + workimg = ipf.lab2rgb(nprevl, 0, 0, pW, pH, params->icm); - } catch (char * str) { + } catch (std::exception&) { return; } } @@ -971,24 +2082,53 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) imageListener->imageReady(params->crop); } + hist_lrgb_dirty = vectorscope_hc_dirty = vectorscope_hs_dirty = waveform_dirty = true; if (hListener) { - updateLRGBHistograms(); - hListener->histogramChanged(histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI); + if (hListener->updateHistogram()) { + updateLRGBHistograms(); + } + if (hListener->updateVectorscopeHC()) { + updateVectorscopeHC(); + } + if (hListener->updateVectorscopeHS()) { + updateVectorscopeHS(); + } + if (hListener->updateWaveform()) { + updateWaveforms(); + } + notifyHistogramChanged(); } } + if (orig_prev != oprevi) { delete oprevi; oprevi = nullptr; } - - } +void ImProcCoordinator::setTweakOperator (TweakOperator *tOperator) +{ + if (tOperator) { + tweakOperator = tOperator; + } +} + +void ImProcCoordinator::unsetTweakOperator (TweakOperator *tOperator) +{ + if (tOperator && tOperator == tweakOperator) { + tweakOperator = nullptr; + } +} void ImProcCoordinator::freeAll() { if (allocated) { + if (spotprev && spotprev != oprevi) { + delete spotprev; + } + spotprev = nullptr; + if (orig_prev != oprevi) { delete oprevi; } @@ -1014,12 +2154,22 @@ void ImProcCoordinator::freeAll() } delete workimg; + workimg = nullptr; } allocated = false; } +void ImProcCoordinator::allocCache (Imagefloat* &imgfloat) +{ + if (imgfloat == nullptr) { + imgfloat = new Imagefloat(pW, pH); + } else { + imgfloat->allocate(pW, pH); + } +} + /** @brief Handles image buffer (re)allocation and trigger sizeChanged of SizeListener[s] * If the scale change, 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) @@ -1038,9 +2188,9 @@ void ImProcCoordinator::setScale(int prevscale) do { prevscale--; - PreviewProps pp(0, 0, fw, fh, prevscale); - imgsrc->getSize(pp, nW, nH); - } while (nH < 400 && prevscale > 1 && (nW * nH < 1000000)); // sctually hardcoded values, perhaps a better choice is possible + 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 (nW != pW || nH != pH) { @@ -1053,6 +2203,7 @@ void ImProcCoordinator::setScale(int prevscale) 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); @@ -1072,8 +2223,42 @@ void ImProcCoordinator::setScale(int prevscale) } -void ImProcCoordinator::updateLRGBHistograms() +void ImProcCoordinator::notifyHistogramChanged() { + if (hListener) { + hListener->histogramChanged( + histRed, + histGreen, + histBlue, + histLuma, + histToneCurve, + histLCurve, + histCCurve, + histLCAM, + histCCAM, + histRedRaw, + histGreenRaw, + histBlueRaw, + histChroma, + histLRETI, + vectorscopeScale, + vectorscope_hc, + vectorscope_hs, + waveformScale, + waveformRed, + waveformGreen, + waveformBlue, + waveformLuma + ); + } +} + +bool ImProcCoordinator::updateLRGBHistograms() +{ + + if (!hist_lrgb_dirty) { + return false; + } int x1, y1, x2, y2; params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); @@ -1131,24 +2316,188 @@ void ImProcCoordinator::updateLRGBHistograms() } } + hist_lrgb_dirty = false; + return true; + } -bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, double tempBias) +bool ImProcCoordinator::updateVectorscopeHC() +{ + if (!workimg || !vectorscope_hc_dirty) { + return false; + } + + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + + constexpr int size = VECTORSCOPE_SIZE; + constexpr float norm_factor = size / (128.f * 655.36f); + vectorscope_hc.fill(0); + + vectorscopeScale = (x2 - x1) * (y2 - y1); + + const std::unique_ptr a(new float[vectorscopeScale]); + const std::unique_ptr b(new float[vectorscopeScale]); + const std::unique_ptr L(new float[vectorscopeScale]); + ipf.rgb2lab(*workimg, x1, y1, x2 - x1, y2 - y1, L.get(), a.get(), b.get(), params->icm); +#ifdef _OPENMP + #pragma omp parallel +#endif + { + array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); +#ifdef _OPENMP + #pragma omp for nowait +#endif + for (int i = y1; i < y2; ++i) { + for (int j = x1, ofs_lab = (i - y1) * (x2 - x1); j < x2; ++j, ++ofs_lab) { + const int col = norm_factor * a[ofs_lab] + size / 2 + 0.5f; + const int row = norm_factor * b[ofs_lab] + size / 2 + 0.5f; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscopeThr[row][col]++; + } + } + } +#ifdef _OPENMP + #pragma omp critical +#endif + { + vectorscope_hc += vectorscopeThr; + } + } + + vectorscope_hc_dirty = false; + return true; +} + +bool ImProcCoordinator::updateVectorscopeHS() +{ + if (!workimg || !vectorscope_hs_dirty) { + return false; + } + + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + + constexpr int size = VECTORSCOPE_SIZE; + vectorscope_hs.fill(0); + + vectorscopeScale = (x2 - x1) * (y2 - y1); + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + array2D vectorscopeThr(size, size, ARRAY2D_CLEAR_DATA); +#ifdef _OPENMP + #pragma omp for nowait +#endif + for (int i = y1; i < y2; ++i) { + int ofs = (i * pW + x1) * 3; + for (int j = x1; j < x2; ++j) { + const float red = 257.f * workimg->data[ofs++]; + const float green = 257.f * workimg->data[ofs++]; + const float blue = 257.f * workimg->data[ofs++]; + float h, s, l; + Color::rgb2hslfloat(red, green, blue, h, s, l); + const auto sincosval = xsincosf(2.f * RT_PI_F * h); + const int col = s * sincosval.y * (size / 2) + size / 2; + const int row = s * sincosval.x * (size / 2) + size / 2; + if (col >= 0 && col < size && row >= 0 && row < size) { + vectorscopeThr[row][col]++; + } + } + } +#ifdef _OPENMP + #pragma omp critical +#endif + { + vectorscope_hs += vectorscopeThr; + } + } + + vectorscope_hs_dirty = false; + return true; +} + +bool ImProcCoordinator::updateWaveforms() +{ + if (!workimg) { + // free memory + waveformRed.free(); + waveformGreen.free(); + waveformBlue.free(); + waveformLuma.free(); + return true; + } + + if (!waveform_dirty) { + return false; + } + + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + int waveform_width = waveformRed.getWidth(); + + if (waveform_width != x2 - x1) { + // Resize waveform arrays. + waveform_width = x2 - x1; + waveformRed(waveform_width, 256); + waveformGreen(waveform_width, 256); + waveformBlue(waveform_width, 256); + waveformLuma(waveform_width, 256); + } + + // Start with zero. + waveformRed.fill(0); + waveformGreen.fill(0); + waveformBlue.fill(0); + waveformLuma.fill(0); + + constexpr float luma_factor = 255.f / 32768.f; + for (int i = y1; i < y2; i++) { + int ofs = (i * pW + x1) * 3; + float* L_row = nprevl->L[i] + x1; + + for (int j = 0; j < waveform_width; j++) { + waveformRed[workimg->data[ofs++]][j]++; + waveformGreen[workimg->data[ofs++]][j]++; + waveformBlue[workimg->data[ofs++]][j]++; + waveformLuma[LIM(L_row[j] * luma_factor, 0, 255)][j]++; + } + } + + waveformScale = y2 - y1; + waveform_dirty = false; + return true; +} + +bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, StandardObserver observer, double tempBias) { if (imgsrc) { - if (lastAwbEqual != equal || lastAwbTempBias != tempBias) { + if (lastAwbEqual != equal || lastAwbObserver != observer || lastAwbTempBias != tempBias || lastAwbauto != params->wb.method) { // Issue 2500 MyMutex::MyLock lock(minit); // Also used in crop window double rm, gm, bm; - imgsrc->getAutoWBMultipliers(rm, gm, bm); + params->wb.method = "autold";//same result as before multiple Auto WB + + // imgsrc->getAutoWBMultipliers(rm, gm, bm); + double tempitc = 5000.; + double greenitc = 1.; + float studgood = 1000.f; + double tempref, greenref; + imgsrc->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc, studgood, 0, 0, fh, fw, 0, 0, fh, fw, rm, gm, bm, params->wb, params->icm, params->raw, params->toneCurve); if (rm != -1) { - autoWB.update(rm, gm, bm, equal, tempBias); + autoWB.update(rm, gm, bm, equal, observer, tempBias); lastAwbEqual = equal; + lastAwbObserver = observer; lastAwbTempBias = tempBias; + lastAwbauto = params->wb.method; } else { lastAwbEqual = -1.; - autoWB.useDefaults(equal); + lastAwbObserver = ColorTemp::DEFAULT_OBSERVER; + autoWB.useDefaults(equal, observer); + lastAwbauto = ""; lastAwbTempBias = 0.0; } } @@ -1164,12 +2513,13 @@ bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, dou } } -void ImProcCoordinator::getCamWB(double& temp, double& green) +void ImProcCoordinator::getCamWB(double& temp, double& green, StandardObserver observer) { if (imgsrc) { - temp = imgsrc->getWB().getTemp(); - green = imgsrc->getWB().getGreen(); + const ColorTemp color_temp = imgsrc->getWB().convertObserver(observer); + temp = color_temp.getTemp(); + green = color_temp.getGreen(); } } @@ -1191,8 +2541,8 @@ void ImProcCoordinator::getSpotWB(int x, int y, int rect, double& temp, double& 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, params->wb.observer); + currWB = ColorTemp(params->wb.temperature, params->wb.green, params->wb.equal, params->wb.method, params->wb.observer); //double rr,gg,bb; //currWB.getMultipliers(rr,gg,bb); @@ -1207,30 +2557,7 @@ void ImProcCoordinator::getSpotWB(int x, int y, int rect, double& temp, double& } } -bool ImProcCoordinator::getFilmNegativeExponents(int xA, int yA, int xB, int yB, std::array& newExps) -{ - MyMutex::MyLock lock(mProcessing); - const auto xlate = - [this](int x, int y) -> Coord2D - { - const std::vector points = {Coord2D(x, y)}; - - std::vector red; - std::vector green; - std::vector blue; - ipf.transCoord(fw, fh, points, red, green, blue); - - return green[0]; - }; - - const int tr = getCoarseBitMask(params->coarse); - - const Coord2D p1 = xlate(xA, yA); - const Coord2D p2 = xlate(xB, yB); - - return imgsrc->getFilmNegativeExponents(p1, p2, tr, params->filmNegative, newExps); -} void ImProcCoordinator::getAutoCrop(double ratio, int &x, int &y, int &w, int &h) { @@ -1289,7 +2616,7 @@ void ImProcCoordinator::getSoftProofing(bool &softProof, bool &gamutCheck) gamutCheck = this->gamutCheck; } -ProcEvent ImProcCoordinator::setSharpMask (bool sharpMask) +ProcEvent ImProcCoordinator::setSharpMask(bool sharpMask) { if (this->sharpMask != sharpMask) { sharpMaskChanged = true; @@ -1307,35 +2634,39 @@ void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool a MyMutex::MyLock lock(mProcessing); int fW, fH; + std::unique_ptr validParams(new ProcParams()); + getParams(validParams.get()); - int tr = getCoarseBitMask(params->coarse); + int tr = getCoarseBitMask(validParams->coarse); imgsrc->getFullSize(fW, fH, tr); PreviewProps pp(0, 0, fW, fH, 1); - ProcParams ppar = *params; + ProcParams ppar = *validParams; ppar.toneCurve.hrenabled = false; 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); + ColorTemp currWB = ColorTemp(validParams->wb.temperature, validParams->wb.green, validParams->wb.equal, validParams->wb.method, validParams->wb.observer); - if (params->wb.method == "Camera") { + if (validParams->wb.method == "Camera") { currWB = imgsrc->getWB(); - } else if (params->wb.method == "Auto") { - if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias) { + } else if (validParams->wb.method == "autold") { + if (lastAwbEqual != validParams->wb.equal || lastAwbObserver != validParams->wb.observer || lastAwbTempBias != validParams->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; + autoWB.update(rm, gm, bm, validParams->wb.equal, validParams->wb.observer, validParams->wb.tempBias); + lastAwbEqual = validParams->wb.equal; + lastAwbObserver = validParams->wb.observer; + lastAwbTempBias = validParams->wb.tempBias; } else { lastAwbEqual = -1.; + lastAwbObserver = ColorTemp::DEFAULT_OBSERVER; lastAwbTempBias = 0.0; - autoWB.useDefaults(params->wb.equal); + autoWB.useDefaults(validParams->wb.equal, validParams->wb.observer); } } @@ -1346,10 +2677,10 @@ void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool a currWB = ColorTemp(); // = no white balance } - imgsrc->getImage(currWB, tr, im, pp, ppar.toneCurve, ppar.raw); + imgsrc->getImage(currWB, tr, im, pp, ppar.toneCurve, ppar.raw, 0); ImProcFunctions ipf(&ppar, true); - if (ipf.needsTransform()) { + if (ipf.needsTransform(fW, fH, imgsrc->getRotateDegree(), imgsrc->getMetaData())) { Imagefloat* trImg = new Imagefloat(fW, fH); ipf.transform(im, trImg, 0, 0, 0, 0, fW, fH, fW, fH, imgsrc->getMetaData(), imgsrc->getRotateDegree(), true); @@ -1357,12 +2688,12 @@ void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool a 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 (validParams->crop.enabled) { + Imagefloat *tmpim = new Imagefloat(validParams->crop.w, validParams->crop.h); + int cx = validParams->crop.x; + int cy = validParams->crop.y; + int cw = validParams->crop.w; + int ch = validParams->crop.h; #ifdef _OPENMP #pragma omp parallel for #endif @@ -1393,7 +2724,7 @@ void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool a } int imw, imh; - double tmpScale = ipf.resizeScale(params.get(), fW, fH, imw, imh); + double tmpScale = ipf.resizeScale(validParams.get(), fW, fH, imw, imh); if (tmpScale != 1.0) { Imagefloat* tempImage = new Imagefloat(imw, imh); @@ -1466,8 +2797,9 @@ void ImProcCoordinator::process() while (changeSinceLast) { const bool panningRelatedChange = - params->toneCurve.isPanningRelatedChange(nextParams->toneCurve) + params->toneCurve.isPanningRelatedChange(nextParams->toneCurve) || params->labCurve != nextParams->labCurve + || params->locallab != nextParams->locallab || params->localContrast != nextParams->localContrast || params->rgbCurves != nextParams->rgbCurves || params->colorToning != nextParams->colorToning @@ -1477,6 +2809,7 @@ void ImProcCoordinator::process() || params->epd != nextParams->epd || params->fattal != nextParams->fattal || params->sh != nextParams->sh + || params->toneEqualizer != nextParams->toneEqualizer || params->crop != nextParams->crop || params->coarse != nextParams->coarse || params->commonTrans != nextParams->commonTrans @@ -1500,12 +2833,23 @@ void ImProcCoordinator::process() || params->dirpyrequalizer != nextParams->dirpyrequalizer || params->dehaze != nextParams->dehaze || params->pdsharpening != nextParams->pdsharpening + || params->filmNegative != nextParams->filmNegative + || params->spot.enabled != nextParams->spot.enabled || sharpMaskChanged; sharpMaskChanged = false; *params = *nextParams; int change = changeSinceLast; changeSinceLast = 0; + + if (tweakOperator) { + // TWEAKING THE PROCPARAMS FOR THE SPOT ADJUSTMENT MODE + backupParams(); + tweakOperator->tweakParams(*params); + } else if (paramsBackup) { + paramsBackup.release(); + } + paramsUpdateMutex.unlock(); // M_VOID means no update, and is a bit higher that the rest @@ -1570,4 +2914,61 @@ void ImProcCoordinator::setHighQualComputed() highQualityComputed = true; } +void ImProcCoordinator::requestUpdateWaveform() +{ + if (!hListener) { + return; + } + bool updated = updateWaveforms(); + if (updated) { + notifyHistogramChanged(); + } +} + +void ImProcCoordinator::requestUpdateHistogram() +{ + if (!hListener) { + return; + } + bool updated = updateLRGBHistograms(); + if (updated) { + notifyHistogramChanged(); + } +} + +void ImProcCoordinator::requestUpdateHistogramRaw() +{ + if (!hListener) { + return; + } + // Don't need to actually update histogram because it is always + // up-to-date. + if (hist_raw_dirty) { + hist_raw_dirty = false; + notifyHistogramChanged(); + } +} + +void ImProcCoordinator::requestUpdateVectorscopeHC() +{ + if (!hListener) { + return; + } + bool updated = updateVectorscopeHC(); + if (updated) { + notifyHistogramChanged(); + } +} + +void ImProcCoordinator::requestUpdateVectorscopeHS() +{ + if (!hListener) { + return; + } + bool updated = updateVectorscopeHS(); + if (updated) { + notifyHistogramChanged(); + } +} + } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 96d1f80ce..50c14ef9e 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -27,7 +27,6 @@ #include "imagesource.h" #include "improcfun.h" #include "LUT.h" -#include "procevents.h" #include "rtengine.h" #include "../rtgui/threadutils.h" @@ -43,6 +42,7 @@ namespace rtengine using namespace procparams; class Crop; +class TweakOperator; /** @brief Manages the image processing, espc. of the preview windows * @@ -55,7 +55,7 @@ class Crop; * but using this class' LUT and other precomputed parameters. The main preview area is displaying a non framed Crop object, * while detail windows are framed Crop objects. */ -class ImProcCoordinator : public StagedImageProcessor +class ImProcCoordinator final : public StagedImageProcessor, public HistogramObservable { friend class Crop; @@ -63,6 +63,7 @@ class ImProcCoordinator : public StagedImageProcessor protected: Imagefloat *orig_prev; Imagefloat *oprevi; + Imagefloat *spotprev; LabImage *oprevl; LabImage *nprevl; Imagefloat *fattal_11_dcrop_cache; // global cache for ToneMapFattal02 used in 1:1 detail windows (except when denoise is active) @@ -74,9 +75,14 @@ protected: ColorTemp currWB; ColorTemp autoWB; + ColorTemp currWBloc; + ColorTemp autoWBloc; + ColorTemp currWBitc; double lastAwbEqual; + StandardObserver lastAwbObserver{ColorTemp::DEFAULT_OBSERVER}; double lastAwbTempBias; + Glib::ustring lastAwbauto; Glib::ustring monitorProfile; RenderingIntent monitorIntent; @@ -89,7 +95,7 @@ protected: bool highDetailRawComputed; bool allocated; - void freeAll (); + void freeAll(); // Precomputed values used by DetailedCrop ---------------------------------------------- @@ -123,6 +129,16 @@ protected: LUTu histBlue, histBlueRaw; LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve; LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI; + bool hist_lrgb_dirty; + /// Used to simulate a lazy update of the raw histogram. + bool hist_raw_dirty; + int vectorscopeScale; + bool vectorscope_hc_dirty, vectorscope_hs_dirty; + array2D vectorscope_hc, vectorscope_hs; + /// Waveform's intensity. Same as height of reference image. + int waveformScale; + bool waveform_dirty; + array2D waveformRed, waveformGreen, waveformBlue, waveformLuma; LUTf CAMBrightCurveJ, CAMBrightCurveQ; @@ -136,7 +152,11 @@ protected: NoiseCurve noiseLCurve; NoiseCurve noiseCCurve; WavCurve wavCLVCurve; + WavCurve wavdenoise; + WavCurve wavdenoiseh; + Wavblcurve wavblcurve; WavOpacityCurveRG waOpacityCurveRG; + WavOpacityCurveSH waOpacityCurveSH; WavOpacityCurveBY waOpacityCurveBY; WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; @@ -171,12 +191,15 @@ protected: AutoRadiusListener *pdSharpenAutoRadiusListener; FrameCountListener *frameCountListener; ImageTypeListener *imageTypeListener; - + FilmNegListener *filmNegListener; AutoColorTonListener* actListener; + AutoprimListener* primListener; AutoChromaListener* adnListener; WaveletListener* awavListener; RetinexListener* dehaListener; +// LocallabListener* locallListener; + HistogramListener* hListener; std::vector sizeListeners; @@ -186,13 +209,26 @@ protected: MyMutex minit; // to gain mutually exclusive access to ... to what exactly? - void reallocAll (); - void updateLRGBHistograms (); - void setScale (int prevscale); + void backupParams(); + void restoreParams(); + void allocCache (Imagefloat* &imgfloat); + void notifyHistogramChanged(); + void reallocAll(); + /// Updates L, R, G, and B histograms. Returns true unless not updated. + bool updateLRGBHistograms(); + /// Updates the H-C vectorscope. Returns true unless not updated. + bool updateVectorscopeHC(); + /// Updates the H-S vectorscope. Returns true unless not updated. + bool updateVectorscopeHS(); + /// Updates all waveforms. Returns true unless not updated. + bool updateWaveforms(); + void setScale(int prevscale); void updatePreviewImage (int todo, bool panningRelatedChange); MyMutex mProcessing; - const std::unique_ptr params; + const std::unique_ptr params; // used for the rendering, can be eventually tweaked + std::unique_ptr paramsBackup; // backup of the untweaked procparams + TweakOperator* tweakOperator; // for optimization purpose, the output profile, output rendering intent and // output BPC will trigger a regeneration of the profile on parameter change only @@ -217,15 +253,138 @@ protected: bool clcutili; bool opautili; bool wavcontlutili; - void startProcessing (); - void process (); + void startProcessing(); + void process(); float colourToningSatLimit; float colourToningSatLimitOpacity; bool highQualityComputed; cmsHTRANSFORM customTransformIn; cmsHTRANSFORM customTransformOut; - ImProcFunctions ipf; + + //locallab + LocallabListener* locallListener; + LUTf lllocalcurve; + LUTf cllocalcurve; + LUTf lclocalcurve; + LUTf cclocalcurve; + LUTf rgblocalcurve; + LUTf exlocalcurve; + LUTf hltonecurveloc; + LUTf shtonecurveloc; + LUTf tonecurveloc; + LUTf lightCurveloc; + LUTf lmasklocalcurve; + LUTf lmaskexplocalcurve; + LUTf lmaskSHlocalcurve; + LUTf lmaskviblocalcurve; + LUTf lmasktmlocalcurve; + LUTf lmaskretilocalcurve; + LUTf lmaskcblocalcurve; + LUTf lmaskbllocalcurve; + LUTf lmasklclocalcurve; + LUTf lmaskloglocalcurve; + LUTf lmasklocal_curve; + LUTf lmaskcielocalcurve; + LUTf cielocalcurve; + LUTf cielocalcurve2; + LUTf jzlocalcurve; + LUTf czlocalcurve; + LUTf czjzlocalcurve; + + LocretigainCurve locRETgainCurve; + LocretitransCurve locRETtransCurve; + LocretigainCurverab locRETgainCurverab; + LocLHCurve loclhCurve; + LocHHCurve lochhCurve; + LocCHCurve locchCurve; + LocHHCurve lochhCurvejz; + LocCHCurve locchCurvejz; + LocLHCurve loclhCurvejz; + LocCCmaskCurve locccmasCurve; + LocLLmaskCurve locllmasCurve; + LocHHmaskCurve lochhmasCurve; + LocHHmaskCurve lochhhmasCurve; + LocCCmaskCurve locccmasexpCurve; + LocLLmaskCurve locllmasexpCurve; + LocHHmaskCurve lochhmasexpCurve; + LocCCmaskCurve locccmasSHCurve; + LocLLmaskCurve locllmasSHCurve; + LocHHmaskCurve lochhmasSHCurve; + LocCCmaskCurve locccmasvibCurve; + LocLLmaskCurve locllmasvibCurve; + LocHHmaskCurve lochhmasvibCurve; + LocCCmaskCurve locccmaslcCurve; + LocLLmaskCurve locllmaslcCurve; + LocHHmaskCurve lochhmaslcCurve; + LocCCmaskCurve locccmascbCurve; + LocLLmaskCurve locllmascbCurve; + LocHHmaskCurve lochhmascbCurve; + LocCCmaskCurve locccmasretiCurve; + LocLLmaskCurve locllmasretiCurve; + LocHHmaskCurve lochhmasretiCurve; + LocCCmaskCurve locccmastmCurve; + LocLLmaskCurve locllmastmCurve; + LocHHmaskCurve lochhmastmCurve; + LocCCmaskCurve locccmasblCurve; + LocLLmaskCurve locllmasblCurve; + LocHHmaskCurve lochhmasblCurve; + LocCCmaskCurve locccmas_Curve; + LocLLmaskCurve locllmas_Curve; + LocHHmaskCurve lochhmas_Curve; + LocHHmaskCurve lochhhmas_Curve; + LocCCmaskCurve locccmaslogCurve; + LocLLmaskCurve locllmaslogCurve; + LocHHmaskCurve lochhmaslogCurve; + LocCCmaskCurve locccmascieCurve; + LocLLmaskCurve locllmascieCurve; + LocHHmaskCurve lochhmascieCurve; + + LocwavCurve locwavCurve; + LocwavCurve loclmasCurveblwav; + LocwavCurve loclmasCurvecolwav; + LocwavCurve loclevwavCurve; + LocwavCurve locconwavCurve; + LocwavCurve loccompwavCurve; + LocwavCurve loccomprewavCurve; + LocwavCurve locwavCurveden; + LocwavCurve locedgwavCurve; + LocwavCurve loclmasCurve_wav; + LocwavCurve locwavCurvehue; + LocwavCurve locwavCurvejz; + + std::vector huerefs; + std::vector huerefblurs; + std::vector chromarefblurs; + std::vector lumarefblurs; + std::vector chromarefs; + std::vector lumarefs; + std::vector sobelrefs; + std::vector avgs; + std::vector meantms; + std::vector stdtms; + std::vector meanretis; + std::vector stdretis; + + bool lastspotdup; + bool previewDeltaE; + int locallColorMask; + int locallColorMaskinv; + int locallExpMask; + int locallExpMaskinv; + int locallSHMask; + int locallSHMaskinv; + int locallvibMask; + int localllcMask; + int locallcbMask; + int locallretiMask; + int locallsoftMask; + int localltmMask; + int locallblMask; + int locallsharMask; + int localllogMask; + int locall_Mask; + int locallcieMask; public: @@ -233,7 +392,7 @@ public: ~ImProcCoordinator () override; void assign (ImageSource* imgsrc); - void getParams (procparams::ProcParams* dst) override; + void getParams (procparams::ProcParams* dst, bool tweaked=false) override; void startProcessing (int changeCode) override; ProcParams* beginUpdateParams () override; @@ -241,10 +400,11 @@ public: void endUpdateParams (int changeFlags) override; void stopProcessing () override; + std::string *retistrsav; void setPreviewScale (int scale) override { - setScale (scale); + setScale(scale); } int getPreviewScale () override { @@ -273,10 +433,12 @@ public: DetailedCrop* createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow) override; - bool getAutoWB (double& temp, double& green, double equal, double tempBias) override; - void getCamWB (double& temp, double& green) override; + void setTweakOperator (TweakOperator *tOperator) override; + void unsetTweakOperator (TweakOperator *tOperator) override; + bool getAutoWB (double& temp, double& green, double equal, StandardObserver observer, double tempBias) override; + void getCamWB (double& temp, double& green, StandardObserver observer) override; void getSpotWB (int x, int y, int rectSize, double& temp, double& green) override; - bool getFilmNegativeExponents(int xA, int yA, int xB, int yB, std::array& newExps) override; + bool getFilmNegativeSpot(int x, int y, int spotSize, FilmNegativeParams::RGB &refInput, FilmNegativeParams::RGB &refOutput) override; void getAutoCrop (double ratio, int &x, int &y, int &w, int &h) override; bool getHighQualComputed() override; void setHighQualComputed() override; @@ -294,6 +456,28 @@ public: updaterThreadStart.unlock(); } + void setLocallabMaskVisibility(bool previewDeltaE, int locallColorMask, int locallColorMaskinv, int locallExpMask, int locallExpMaskinv, int locallSHMask, int locallSHMaskinv, int locallvibMask, int locallsoftMask, int locallblMask, int localltmMask, int locallretiMask, int locallsharMask, int localllcMask, int locallcbMask, int localllogMask, int locall_Mask, int locallcieMask) override + { + this->previewDeltaE = previewDeltaE; + this->locallColorMask = locallColorMask; + this->locallColorMaskinv = locallColorMaskinv; + this->locallExpMask = locallExpMask; + this->locallExpMaskinv = locallExpMaskinv; + this->locallSHMask = locallSHMask; + this->locallSHMaskinv = locallSHMaskinv; + this->locallvibMask = locallvibMask; + this->locallsoftMask = locallsoftMask; + this->locallblMask = locallblMask; + this->localltmMask = localltmMask; + this->locallretiMask = locallretiMask; + this->locallsharMask = locallsharMask; + this->localllcMask = localllcMask; + this->locallcbMask = locallcbMask; + this->localllogMask = localllogMask; + this->locall_Mask = locall_Mask; + this->locallcieMask = locallcieMask; + } + void setProgressListener (ProgressListener* pl) override { plistener = pl; @@ -304,14 +488,14 @@ public: } void setSizeListener (SizeListener* il) override { - sizeListeners.push_back (il); + sizeListeners.push_back(il); } void delSizeListener (SizeListener* il) override { - std::vector::iterator it = std::find (sizeListeners.begin(), sizeListeners.end(), il); + std::vector::iterator it = std::find(sizeListeners.begin(), sizeListeners.end(), il); if (it != sizeListeners.end()) { - sizeListeners.erase (it); + sizeListeners.erase(it); } } void setAutoExpListener (AutoExpListener* ael) override @@ -320,7 +504,13 @@ public: } void setHistogramListener (HistogramListener *h) override { + if (hListener) { + hListener->setObservable(nullptr); + } hListener = h; + if (h) { + h->setObservable(this); + } } void setAutoCamListener (AutoCamListener* acl) override { @@ -338,6 +528,10 @@ public: { actListener = bwct; } + void setAutoprimListener (AutoprimListener* pri) override + { + primListener = pri; + } void setAutoChromaListener (AutoChromaListener* adn) override { adnListener = adn; @@ -346,6 +540,10 @@ public: { dehaListener = adh; } + void setLocallabListener (LocallabListener* lla) override + { + locallListener = lla; + } void setWaveletListener (WaveletListener* awa) override { awavListener = awa; @@ -385,6 +583,11 @@ public: imageTypeListener = itl; } + void setFilmNegListener (FilmNegListener* fnl) override + { + filmNegListener = fnl; + } + void saveInputICCReference (const Glib::ustring& fname, bool apply_wb) override; InitialImage* getInitialImage () override @@ -403,7 +606,7 @@ public: } struct DenoiseInfoStore { - DenoiseInfoStore () : chM (0), max_r{}, max_b{}, ch_M{}, valid (false) {} + DenoiseInfoStore() : chM(0), max_r{}, max_b{}, ch_M{}, valid(false) {} float chM; float max_r[9]; float max_b[9]; @@ -412,6 +615,11 @@ public: } denoiseInfoStore; + void requestUpdateHistogram() override; + void requestUpdateHistogramRaw() override; + void requestUpdateVectorscopeHC() override; + void requestUpdateVectorscopeHS() override; + void requestUpdateWaveform() override; }; } diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 59fb0f016..8a0e699d6 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -31,15 +31,16 @@ #include "cieimage.h" #include "clutstore.h" #include "color.h" +#include "colortemp.h" #include "curves.h" #include "dcp.h" #include "EdgePreservingDecomposition.h" #include "iccmatrices.h" #include "iccstore.h" #include "imagesource.h" -#include "improccoordinator.h" #include "improcfun.h" #include "labimage.h" +#include "pipettebuffer.h" #include "procparams.h" #include "rt_math.h" #include "rtengine.h" @@ -50,14 +51,11 @@ #include "../rtgui/editcallbacks.h" -#ifdef _DEBUG -#include "mytime.h" -#endif +#pragma GCC diagnostic warning "-Wextra" +#pragma GCC diagnostic warning "-Wdouble-promotion" -#undef CLIPD -#define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) - -namespace { +namespace +{ using namespace rtengine; @@ -137,7 +135,7 @@ void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, flo 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; + (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve(exp_scale, comp, hlrange, b))) / 3.f; // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place rtemp[ti * tileSize + tj + k] = r * tonefactor; @@ -165,7 +163,7 @@ void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, flo //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; + (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve(exp_scale, comp, hlrange, b))) / 3.f; // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place rtemp[ti * tileSize + tj] = r * tonefactor; @@ -175,31 +173,37 @@ void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, flo } } -void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { +void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) +{ // this is a hack to avoid the blue=>black bug (Issue 2141) for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; #ifdef __SSE2__ - for (; j < tW - 3; j+=4, tj+=4) { + + for (; j < tW - 3; j += 4, tj += 4) { vfloat rv = LVF(rtemp[ti * tileSize + tj]); vfloat gv = LVF(gtemp[ti * tileSize + tj]); vmask zeromask = vorm(vmaskf_eq(rv, ZEROV), vmaskf_eq(gv, ZEROV)); - if(_mm_movemask_ps((vfloat)zeromask)) { + + if (_mm_movemask_ps((vfloat)zeromask)) { for (int k = 0; k < 4; ++k) { float r = rtemp[ti * tileSize + tj + k]; float g = gtemp[ti * tileSize + tj + k]; + 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); + Color::rgb2hsv(r, g, b, h, s, v); s *= 0.99f; - Color::hsv2rgb (h, s, v, rtemp[ti * tileSize + tj + k], gtemp[ti * tileSize + tj + k], btemp[ti * tileSize + tj + k]); + Color::hsv2rgb(h, s, v, rtemp[ti * tileSize + tj + k], gtemp[ti * tileSize + tj + k], btemp[ti * tileSize + tj + k]); } } } } + #endif + for (; j < tW; j++, tj++) { float r = rtemp[ti * tileSize + tj]; float g = gtemp[ti * tileSize + tj]; @@ -207,40 +211,45 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, 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); + Color::rgb2hsv(r, g, b, h, s, v); s *= 0.99f; - Color::hsv2rgb (h, s, v, rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + Color::hsv2rgb(h, s, v, rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); } } } } -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) { +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 == ToneCurveMode::STD) { // Standard - const StandardToneCurve& userToneCurve = static_cast (customToneCurve); + 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 == ToneCurveMode::FILMLIKE) { // Adobe like - const AdobeToneCurve& userToneCurve = static_cast (customToneCurve); + const AdobeToneCurve& 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 == ToneCurveMode::SATANDVALBLENDING) { // apply the curve on the saturation and value channels - const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve); + 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 == ToneCurveMode::WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted - const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve); + 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 == ToneCurveMode::LUMINANCE) { // apply the curve to the luminance channel - const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve); + 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++) { @@ -248,14 +257,16 @@ void customToneCurve(const ToneCurve &customToneCurve, ToneCurveMode curveMode, } } } else if (curveMode == ToneCurveMode::PERCEPTUAL) { // apply curve while keeping color appearance constant - const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve); + const PerceptualToneCurve& userToneCurve = static_cast(customToneCurve); + for (int i = istart, ti = 0; i < tH; i++, ti++) { userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize], ptcApplyState); } } } -void fillEditFloat(float *editIFloatTmpR, float *editIFloatTmpG, float *editIFloatTmpB, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { +void fillEditFloat(float *editIFloatTmpR, float *editIFloatTmpG, float *editIFloatTmpB, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) +{ for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { editIFloatTmpR[ti * tileSize + tj] = Color::gamma2curve[rtemp[ti * tileSize + tj]] / 65535.f; @@ -273,25 +284,26 @@ namespace rtengine using namespace procparams; -ImProcFunctions::~ImProcFunctions () +ImProcFunctions::~ImProcFunctions() { if (monitorTransform) { - cmsDeleteTransform (monitorTransform); + cmsDeleteTransform(monitorTransform); } } -void ImProcFunctions::setScale (double iscale) +void ImProcFunctions::setScale(double iscale) { scale = iscale; } -void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck) +void ImProcFunctions::updateColorProfiles(const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck) { // set up monitor transform if (monitorTransform) { - cmsDeleteTransform (monitorTransform); + cmsDeleteTransform(monitorTransform); } + gamutWarning.reset(nullptr); monitorTransform = nullptr; @@ -300,17 +312,17 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, if (!monitorProfile.empty()) { #if !defined(__APPLE__) // No support for monitor profiles on OS X, all data is sRGB - monitor = ICCStore::getInstance()->getProfile (monitorProfile); + monitor = ICCStore::getInstance()->getProfile(monitorProfile); #else - monitor = ICCStore::getInstance()->getProfile (settings->srgb); + monitor = ICCStore::getInstance()->getProfile(settings->srgb); #endif } if (monitor) { - MyMutex::MyLock lcmsLock (*lcmsMutex); + MyMutex::MyLock lcmsLock(*lcmsMutex); cmsUInt32Number flags; - cmsHPROFILE iprof = cmsCreateLab4Profile (nullptr); + cmsHPROFILE iprof = cmsCreateLab4Profile(nullptr); cmsHPROFILE gamutprof = nullptr; cmsUInt32Number gamutbpc = 0; RenderingIntent gamutintent = RI_RELATIVE; @@ -320,20 +332,24 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, if (softProof) { cmsHPROFILE oprof = nullptr; RenderingIntent outIntent; - + flags = cmsFLAGS_SOFTPROOFING | cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; if (!settings->printerProfile.empty()) { - oprof = ICCStore::getInstance()->getProfile (settings->printerProfile); + 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; } @@ -345,27 +361,30 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, // } const auto make_gamma_table = - [](cmsHPROFILE prof, cmsTagSignature tag) -> void + [](cmsHPROFILE prof, cmsTagSignature tag) -> void { + cmsToneCurve *tc = static_cast(cmsReadTag(prof, tag)); + + if (tc) { - 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); - } + 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 ( + monitorTransform = cmsCreateProofingTransform( iprof, TYPE_Lab_FLT, monitor, TYPE_RGB_FLT, softproof, //oprof, @@ -383,9 +402,11 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, if (gamutCheck) { gamutprof = oprof; + if (params->icm.outputBPC) { gamutbpc = cmsFLAGS_BLACKPOINTCOMPENSATION; } + gamutintent = outIntent; } } @@ -401,9 +422,11 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, // softProofCreated = true; // } gamutprof = monitor; + if (settings->monitorBPC) { gamutbpc = cmsFLAGS_BLACKPOINTCOMPENSATION; } + gamutintent = monitorIntent; } @@ -414,21 +437,21 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } - monitorTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, monitor, TYPE_RGB_FLT, 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); + cmsCloseProfile(iprof); } } -void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const ProcParams ¶ms, LUTu & histogram) +void ImProcFunctions::firstAnalysis(const Imagefloat* const original, const ProcParams ¶ms, LUTu & histogram) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params.icm.workingProfile); lumimul[0] = wprof[1][0]; lumimul[1] = wprof[1][1]; @@ -436,7 +459,7 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro int W = original->getWidth(); int H = original->getHeight(); - float lumimulf[3] = {static_cast (lumimul[0]), static_cast (lumimul[1]), static_cast (lumimul[2])}; + float lumimulf[3] = {static_cast(lumimul[0]), static_cast(lumimul[1]), static_cast(lumimul[2])}; // calculate histogram of the y channel needed for contrast curve calculation in exposure adjustments histogram.clear(); @@ -444,11 +467,11 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro if (multiThread) { #ifdef _OPENMP - const int numThreads = min (max (W * H / (int)histogram.getSize(), 1), omp_get_max_threads()); + const int numThreads = min(max(W * H / (int)histogram.getSize(), 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) if(numThreads>1) #endif { - LUTu hist (histogram.getSize()); + LUTu hist(histogram.getSize()); hist.clear(); #ifdef _OPENMP #pragma omp for nowait @@ -457,9 +480,9 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { - float r = original->r (i, j); - float g = original->g (i, j); - float b = original->b (i, j); + float r = original->r(i, j); + float g = original->g(i, j); + float b = original->b(i, j); int y = (lumimulf[0] * r + lumimulf[1] * g + lumimulf[2] * b); hist[y]++; @@ -473,15 +496,15 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro } #ifdef _OPENMP - static_cast (numThreads); // to silence cppcheck warning + static_cast(numThreads); // to silence cppcheck warning #endif } else { for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { - float r = original->r (i, j); - float g = original->g (i, j); - float b = original->b (i, j); + float r = original->r(i, j); + float g = original->g(i, j); + float b = original->b(i, j); int y = (lumimulf[0] * r + lumimulf[1] * g + lumimulf[2] * b); histogram[y]++; @@ -490,27 +513,23 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro } } + // 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, - bool showSharpMask) + +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, + bool showSharpMask) { if (params->colorappearance.enabled) { - -#ifdef _DEBUG - MyTime t1e, t2e; - t1e.set(); -#endif - //preparate for histograms CIECAM LUTu hist16JCAM; LUTu hist16_CCAM; if (pW != 1 && params->colorappearance.datacie) { //only with improccoordinator - hist16JCAM (32768); + hist16JCAM(32768); hist16JCAM.clear(); - hist16_CCAM (48000); + hist16_CCAM(48000); hist16_CCAM.clear(); } @@ -518,8 +537,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw int width = lab->W, height = lab->H; float minQ = 10000.f; float maxQ = -1000.f; - float Yw; - Yw = 1.0; + double Yw = 1.0; double Xw, Zw; float f = 0.f, nc = 0.f, la, c = 0.f, xw, yw, zw, f2 = 1.f, c2 = 1.f, nc2 = 1.f, yb2; float fl, n, nbb, ncb, aw; //d @@ -530,13 +548,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw double Xwsc, Zwsc; const bool epdEnabled = params->epd.enabled; - bool ciedata = (params->colorappearance.datacie && pW != 1) && ! ((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) + bool ciedata = (params->colorappearance.datacie && pW != 1) && !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); - 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); + ColorTemp::temp2mulxyz(params->wb.temperature, params->wb.method, params->wb.observer, Xw, Zw); //compute white Xw Yw Zw : white current WB + ColorTemp::temp2mulxyz(params->colorappearance.tempout, "Custom", params->wb.observer, Xwout, Zwout); + ColorTemp::temp2mulxyz(params->colorappearance.tempsc, "Custom", params->wb.observer, Xwsc, Zwsc); //viewing condition for surrsrc if (params->colorappearance.surrsrc == "Average") { @@ -584,7 +602,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw } */ //with which algorithm - if (params->colorappearance.algo == "JC") { + if (params->colorappearance.algo == "JC") { alg = 0; } else if (params->colorappearance.algo == "JS") { alg = 1; @@ -596,13 +614,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw algepd = true; } - xwd = 100.f * Xwout; - zwd = 100.f * Zwout; - ywd = 100.f / params->colorappearance.greenout;//approximation to simplify + xwd = 100.0 * Xwout; + zwd = 100.0 * Zwout; + ywd = 100.0 / params->colorappearance.greenout;//approximation to simplify - xws = 100.f * Xwsc; - zws = 100.f * Zwsc; - yws = 100.f / params->colorappearance.greensc;//approximation to simplify + xws = 100.0 * Xwsc; + zws = 100.0 * Zwsc; + yws = 100.0 / params->colorappearance.greensc;//approximation to simplify /* @@ -680,6 +698,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw const float deg = (params->colorappearance.degree) / 100.0f; const float pilot = params->colorappearance.autodegree ? 2.0f : deg; + const float degout = (params->colorappearance.degreeout) / 100.0f; const float pilotout = params->colorappearance.autodegreeout ? 2.0f : degout; @@ -699,20 +718,20 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if (alg == 3 || alg == 1) { schr = params->colorappearance.schroma; - if (schr > 0.0) { - schr = schr / 2.0f; //divide sensibility for saturation + if (schr > 0.f) { + schr = schr / 2.f; //divide sensibility for saturation } if (alg == 3) { - if (schr == -100.0f) { + if (schr == -100.f) { schr = -99.f; } - if (schr == 100.0f) { + if (schr == 100.f) { schr = 98.f; } } else { - if (schr == -100.0f) { + if (schr == -100.f) { schr = -99.8f; } } @@ -751,22 +770,22 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw LUTu hist16J; LUTu hist16Q; - if ((needJ && CAMBrightCurveJ.dirty) || (needQ && CAMBrightCurveQ.dirty) || (std::isnan (mean) && settings->viewinggreySc != 0)) { + if ((needJ && CAMBrightCurveJ.dirty) || (needQ && CAMBrightCurveQ.dirty) || (std::isnan(mean) && settings->viewinggreySc != 0)) { if (needJ) { - hist16J (32768); + hist16J(32768); hist16J.clear(); } if (needQ) { - hist16Q (32768); + hist16Q(32768); hist16Q.clear(); } 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()); + const int numThreads = min(max(width * height / 65536, 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) if(numThreads>1) #endif { @@ -774,12 +793,12 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw LUTu hist16Qthr; if (needJ) { - hist16Jthr (hist16J.getSize()); + hist16Jthr(hist16J.getSize()); hist16Jthr.clear(); } if (needQ) { - hist16Qthr (hist16Q.getSize()); + hist16Qthr(hist16Q.getSize()); hist16Qthr.clear(); } @@ -788,7 +807,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw #endif - for (int i = 0; i < height; i++) + for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { //rough correspondence between L and J float currL = lab->L[i][j] / 327.68f; float koef; //rough correspondence between L and J @@ -828,7 +847,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw } if (needJ) { - hist16Jthr[ (int) ((koef * lab->L[i][j]))]++; //evaluate histogram luminance L # J + hist16Jthr[(int)((koef * lab->L[i][j]))]++; //evaluate histogram luminance L # J } //estimation of wh only with La @@ -844,15 +863,16 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw } */ if (needQ) { - hist16Qthr[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 + hist16Qthr[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 //perhaps needs to introduce whestim ?? //hist16Qthr[ (int) (sqrtf ((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 calculate Yb + sum += static_cast(koef) * static_cast(lab->L[i][j]); //evaluate mean J to calculate Yb //sumQ += whestim * sqrt ((koef * (lab->L[i][j])) / 32768.f); //can be used in case of... } + } #ifdef _OPENMP #pragma omp critical @@ -868,8 +888,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw } - if (std::isnan (mean)) { - mean = (sum / ((height) * width)) / 327.68f; //for Yb for all image...if one day "pipette" we can adapt Yb for each zone + if (std::isnan(mean)) { + mean = (sum / ((height) * width)) / 327.68; //for Yb for all image...if one day "pipette" we can adapt Yb for each zone } } #ifdef _OPENMP @@ -884,7 +904,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw // if (settings->viewinggreySc == 0) { //auto if (params->colorappearance.autoybscen && pwb == 2) {//auto - if (mean < 15.f) { + if (mean < 15.f) { yb = 3.0f; } else if (mean < 30.f) { yb = 5.0f; @@ -910,15 +930,15 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw // } else if (settings->viewinggreySc == 1) { } else { - yb = (float) params->colorappearance.ybscen; + yb = (float) params->colorappearance.ybscen; } const bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated const int gamu = (params->colorappearance.gamut) ? 1 : 0; - xw = 100.0f * Xw; - yw = 100.0f * Yw; - zw = 100.0f * Zw; + xw = 100.0 * Xw; + yw = 100.0 * Yw; + zw = 100.0 * Zw; float xw1 = 0.f, yw1 = 0.f, zw1 = 0.f, xw2 = 0.f, yw2 = 0.f, zw2 = 0.f; // settings of WB: scene and viewing @@ -947,36 +967,45 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float cz, wh, pfl; - Ciecam02::initcam1float (yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); + int c16 = 1; + + if (params->colorappearance.modelmethod == "02") { + c16 = 1; + } else if (params->colorappearance.modelmethod == "16") { + c16 = 16; + } //I don't use PQ here...hence no 21 + + float plum = 100.f; + Ciecam02::initcam1float(yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c, c16, plum); //printf ("wh=%f \n", wh); - const float pow1 = pow_F ( 1.64f - pow_F ( 0.29f, n ), 0.73f ); + const float pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f); float nj, nbbj, ncbj, czj, awj, flj; - Ciecam02::initcam2float (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, c16, plum); #ifdef __SSE2__ const float reccmcz = 1.f / (c2 * czj); #endif - const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f ); + const float pow1n = pow_F(1.64f - pow_F(0.29f, nj), 0.73f); const float epsil = 0.0001f; const float coefQ = 32767.f / wh; const float a_w = aw; const float c_ = c; const float f_l = fl; - const float coe = pow_F (fl, 0.25f); - const float QproFactor = ( 0.4f / c ) * ( aw + 4.0f ) ; - const bool LabPassOne = ! ((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) - || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); + const float coe = pow_F(fl, 0.25f); + const float QproFactor = (0.4f / c) * (aw + 4.0f) ; + const bool LabPassOne = !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) + || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); //printf("coQ=%f\n", coefQ); if (needJ) { if (!CAMBrightCurveJ) { - CAMBrightCurveJ (32768, LUT_CLIP_ABOVE); + CAMBrightCurveJ(32768, LUT_CLIP_ABOVE); } if (CAMBrightCurveJ.dirty) { - Ciecam02::curveJfloat (params->colorappearance.jlight, params->colorappearance.contrast, hist16J, CAMBrightCurveJ);//lightness and contrast J + Ciecam02::curveJfloat(params->colorappearance.jlight, params->colorappearance.contrast, 0.6f, hist16J, CAMBrightCurveJ); //lightness and contrast J CAMBrightCurveJ /= 327.68f; CAMBrightCurveJ.dirty = false; } @@ -984,11 +1013,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if (needQ) { if (!CAMBrightCurveQ) { - CAMBrightCurveQ (32768, LUT_CLIP_ABOVE); + CAMBrightCurveQ(32768, LUT_CLIP_ABOVE); } if (CAMBrightCurveQ.dirty) { - Ciecam02::curveJfloat (params->colorappearance.qbright, params->colorappearance.qcontrast, hist16Q, CAMBrightCurveQ);//brightness and contrast Q + Ciecam02::curveJfloat(params->colorappearance.qbright, params->colorappearance.qcontrast, 0.6f, hist16Q, CAMBrightCurveQ); //brightness and contrast Q // CAMBrightCurveQ /= coefQ; CAMBrightCurveQ.dirty = false; } @@ -996,7 +1025,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.workingProfile); + 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]}, @@ -1006,10 +1035,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw #ifdef __SSE2__ 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; @@ -1023,10 +1050,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float Mbuffer[bufferLength] ALIGNED16; float sbuffer[bufferLength] ALIGNED16; #endif -#ifndef _DEBUG #ifdef _OPENMP #pragma omp for schedule(dynamic, 16) -#endif #endif for (int i = 0; i < height; i++) { @@ -1036,24 +1061,26 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw vfloat x, y, z; vfloat J, C, h, Q, M, s; - vfloat c655d35 = F2V (655.35f); + vfloat c655d35 = F2V(655.35f); for (k = 0; k < width - 3; k += 4) { - Color::Lab2XYZ (LVFU (lab->L[i][k]), LVFU (lab->a[i][k]), LVFU (lab->b[i][k]), x, y, z); + Color::Lab2XYZ(LVFU(lab->L[i][k]), LVFU(lab->a[i][k]), LVFU(lab->b[i][k]), x, y, z); x = x / c655d35; y = y / c655d35; z = z / c655d35; - Ciecam02::xyz2jchqms_ciecam02float ( J, C, h, - Q, M, s, F2V (aw), F2V (fl), F2V (wh), - x, y, z, - F2V (xw1), F2V (yw1), F2V (zw1), - F2V (c), F2V (nc), F2V (pow1), F2V (nbb), F2V (ncb), F2V (pfl), F2V (cz), F2V (d)); - STVF (Jbuffer[k], J); - STVF (Cbuffer[k], C); - STVF (hbuffer[k], h); - STVF (Qbuffer[k], Q); - STVF (Mbuffer[k], M); - STVF (sbuffer[k], s); + float plum = 100.f; + vfloat plumv = F2V(plum); + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, F2V(aw), F2V(fl), F2V(wh), + x, y, z, + F2V(xw1), F2V(yw1), F2V(zw1), + F2V(c), F2V(nc), F2V(pow1), F2V(nbb), F2V(ncb), F2V(pfl), F2V(cz), F2V(d), c16, plumv); + STVF(Jbuffer[k], J); + STVF(Cbuffer[k], C); + STVF(hbuffer[k], h); + STVF(Qbuffer[k], Q); + STVF(Mbuffer[k], M); + STVF(sbuffer[k], s); } for (; k < width; k++) { @@ -1062,16 +1089,16 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float b = lab->b[i][k]; float x, y, z; //convert Lab => XYZ - Color::Lab2XYZ (L, a, b, x, y, z); + Color::Lab2XYZ(L, a, b, x, y, z); x = x / 655.35f; y = y / 655.35f; z = z / 655.35f; float J, C, h, Q, M, s; - Ciecam02::xyz2jchqms_ciecam02float ( J, C, h, - Q, M, s, aw, fl, wh, - x, y, z, - xw1, yw1, zw1, - c, nc, pow1, nbb, ncb, pfl, cz, d); + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, aw, fl, wh, + x, y, z, + xw1, yw1, zw1, + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); Jbuffer[k] = J; Cbuffer[k] = C; hbuffer[k] = h; @@ -1100,16 +1127,16 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float b = lab->b[i][j]; float x1, y1, z1; //convert Lab => XYZ - Color::Lab2XYZ (L, a, b, x1, y1, z1); + Color::Lab2XYZ(L, a, b, x1, y1, z1); x = (float)x1 / 655.35f; y = (float)y1 / 655.35f; z = (float)z1 / 655.35f; //process source==> normal - Ciecam02::xyz2jchqms_ciecam02float ( J, C, h, - Q, M, s, aw, fl, wh, - x, y, z, - xw1, yw1, zw1, - c, nc, pow1, nbb, ncb, pfl, cz, d); + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, aw, fl, wh, + x, y, z, + xw1, yw1, zw1, + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); #endif float Jpro, Cpro, hpro, Qpro, Mpro, spro; Jpro = J; @@ -1118,81 +1145,106 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Qpro = Q; Mpro = M; spro = s; + bool jp = false; + + if ((hasColCurve1) && (curveMode == ColorAppearanceParams::TcMode::BRIGHT)) { + jp = true; + float Qq = Qpro * coefQ; + float Qold = Qpro; + const Brightcurve& userColCurveB1 = static_cast(customColCurve1); + userColCurveB1.Apply(Qq); + Qq = Qq / coefQ; + Qpro = 0.2f * (Qq - Qold) + Qold; + } + + if ((hasColCurve2) && (curveMode2 == ColorAppearanceParams::TcMode::BRIGHT)) { + jp = true; + float Qq2 = Qpro * coefQ; + float Qold2 = Qpro; + const Brightcurve& userColCurveB2 = static_cast(customColCurve2); + userColCurveB2.Apply(Qq2); + Qq2 = Qq2 / coefQ; + Qpro = 0.2f * (Qq2 - Qold2) + Qold2; + } + + if (jp) { + Jpro = SQR((10.f * Qpro) / wh); + } // we cannot have all algorithms with all chroma curves if (alg == 0) { Jpro = CAMBrightCurveJ[Jpro * 327.68f]; //lightness CIECAM02 + contrast - Qpro = QproFactor * sqrtf (Jpro); + Qpro = QproFactor * sqrtf(Jpro); float Cp = (spro * spro * Qpro) / (1000000.f); Cpro = Cp * 100.f; float sres; - Ciecam02::curvecolorfloat (chr, Cp, sres, 1.8f); - Color::skinredfloat (Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); + Ciecam02::curvecolorfloat(chr, Cp, sres, 1.8f); + Color::skinredfloat(Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); } else if (alg == 1) { // Lightness saturation Jpro = CAMBrightCurveJ[Jpro * 327.68f]; //lightness CIECAM02 + contrast float sres; float Sp = spro / 100.0f; float parsat = 1.5f; //parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation) - Ciecam02::curvecolorfloat (schr, Sp, sres, parsat); + Ciecam02::curvecolorfloat(schr, Sp, sres, parsat); float dred = 100.f; // in C mode float protect_red = 80.0f; // in C mode - dred = 100.0f * sqrtf ((dred * coe) / Qpro); - protect_red = 100.0f * sqrtf ((protect_red * coe) / Qpro); - Color::skinredfloat (Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); - Qpro = QproFactor * sqrtf (Jpro); + dred = 100.0f * sqrtf((dred * coe) / Qpro); + protect_red = 100.0f * sqrtf((protect_red * coe) / Qpro); + Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); + Qpro = QproFactor * sqrtf(Jpro); Cpro = (spro * spro * Qpro) / (10000.0f); } else if (alg == 2) { //printf("Qp0=%f ", Qpro); - Qpro = CAMBrightCurveQ[ (float) (Qpro * coefQ)] / coefQ; //brightness and contrast + Qpro = CAMBrightCurveQ[(float)(Qpro * coefQ)] / coefQ; //brightness and contrast //printf("Qpaf=%f ", Qpro); float Mp, sres; Mp = Mpro / 100.0f; - Ciecam02::curvecolorfloat (mchr, Mp, sres, 2.5f); + Ciecam02::curvecolorfloat(mchr, Mp, sres, 2.5f); 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 - Color::skinredfloat (Jpro, hpro, sres, Mp, dred, protect_red, 0, rstprotection, 100.f, Mpro); - Jpro = SQR ((10.f * Qpro) / wh); + Color::skinredfloat(Jpro, hpro, sres, Mp, dred, protect_red, 0, rstprotection, 100.f, Mpro); + Jpro = SQR((10.f * Qpro) / wh); Cpro = Mpro / coe; Qpro = (Qpro == 0.f ? epsil : Qpro); // avoid division by zero - spro = 100.0f * sqrtf ( Mpro / Qpro ); + spro = 100.0f * sqrtf(Mpro / Qpro); } else { /*if(alg == 3) */ - Qpro = CAMBrightCurveQ[ (float) (Qpro * coefQ)] / coefQ; //brightness and contrast + Qpro = CAMBrightCurveQ[(float)(Qpro * coefQ)] / coefQ; //brightness and contrast float Mp, sres; Mp = Mpro / 100.0f; - Ciecam02::curvecolorfloat (mchr, Mp, sres, 2.5f); + Ciecam02::curvecolorfloat(mchr, Mp, sres, 2.5f); 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 - Color::skinredfloat (Jpro, hpro, sres, Mp, dred, protect_red, 0, rstprotection, 100.f, Mpro); - Jpro = SQR ((10.f * Qpro) / wh); + Color::skinredfloat(Jpro, hpro, sres, Mp, dred, protect_red, 0, rstprotection, 100.f, Mpro); + Jpro = SQR((10.f * Qpro) / wh); Cpro = Mpro / coe; Qpro = (Qpro == 0.f ? epsil : Qpro); // avoid division by zero - spro = 100.0f * sqrtf ( Mpro / Qpro ); + spro = 100.0f * sqrtf(Mpro / Qpro); if (Jpro > 99.9f) { Jpro = 99.9f; } - Jpro = CAMBrightCurveJ[ (float) (Jpro * 327.68f)]; //lightness CIECAM02 + contrast + Jpro = CAMBrightCurveJ[(float)(Jpro * 327.68f)]; //lightness CIECAM02 + contrast float Sp = spro / 100.0f; - Ciecam02::curvecolorfloat (schr, Sp, sres, 1.5f); + Ciecam02::curvecolorfloat(schr, Sp, sres, 1.5f); dred = 100.f; // in C mode protect_red = 80.0f; // in C mode - dred = 100.0f * sqrtf ((dred * coe) / Q); - protect_red = 100.0f * sqrtf ((protect_red * coe) / Q); - Color::skinredfloat (Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); - Qpro = QproFactor * sqrtf (Jpro); + dred = 100.0f * sqrtf((dred * coe) / Q); + protect_red = 100.0f * sqrtf((protect_red * coe) / Q); + Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); + Qpro = QproFactor * sqrtf(Jpro); float Cp = (spro * spro * Qpro) / (1000000.f); Cpro = Cp * 100.f; - Ciecam02::curvecolorfloat (chr, Cp, sres, 1.8f); - Color::skinredfloat (Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); + Ciecam02::curvecolorfloat(chr, Cp, sres, 1.8f); + Color::skinredfloat(Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); // disabled this code, Issue 2690 // if(Jpro < 1.f && Cpro > 12.f) Cpro=12.f;//reduce artifacts by "pseudo gamut control CIECAM" // else if(Jpro < 2.f && Cpro > 15.f) Cpro=15.f; @@ -1200,172 +1252,78 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw // else if(Jpro < 7.f && Cpro > 50.f) Cpro=50.f; hpro = hpro + hue; - if ( hpro < 0.0f ) { + if (hpro < 0.0f) { hpro += 360.0f; //hue } } - if (hasColCurve1) {//curve 1 with Lightness and Brightness - if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { - 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 (hasColCurve1 && (curveMode == ColorAppearanceParams::TcMode::LIGHT)) { + 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 - } + 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 } + } 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 = (float) (Jj / 327.68f); + Jpro = (float)(Jj / 327.68f); - if (Jpro < 1.f) { - Jpro = 1.f; - } - } else if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { - //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algorithms will be different - float coef = ((aw + 4.f) * (4.f / c)) / 100.f; - float Qanc = Qpro; - float Qq = (float) Qpro * 327.68f * (1.f / coef); - 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 = SQR ((10.f * Qpro) / wh); - - if (Jpro < 1.f) { - Jpro = 1.f; - } + if (Jpro < 1.f) { + Jpro = 1.f; } } - if (hasColCurve2) {//curve 2 with Lightness and Brightness - if (curveMode2 == ColorAppearanceParams::TcMode::LIGHT) { - float Jj = (float) Jpro * 327.68f; - float Jold = Jj; - float Jold100 = (float) Jpro; - float redu = 25.f; - float reduc = 1.f; - const Lightcurve& userColCurveJ2 = static_cast (customColCurve2); - userColCurveJ2.Apply (Jj); + if (hasColCurve2 && (curveMode2 == ColorAppearanceParams::TcMode::LIGHT)) { + float Jj = (float) Jpro * 327.68f; + float Jold = Jj; + 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; + 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 } } - - Jpro = (float) (Jj / 327.68f); - - if (Jpro < 1.f) { - Jpro = 1.f; + } else if (Jj > 10.f) { + if (!t1L) { + Jj = 0.8f * (Jj - Jold) + Jold; + } else { + Jj = 0.4f * (Jj - Jold) + Jold; } - - } 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 + } else if (Jj >= 0.f) { + if (!t1L) { + Jj = 0.90f * (Jj - Jold) + Jold; // not zero ==>artifacts + } else { + Jj = 0.5f * (Jj - Jold) + Jold; } + } - if (Qold == 0.f) { - Qold = 0.001f; - } + Jpro = (float)(Jj / 327.68f); - Qpro = Qanc * (Qq / Qold); - Jpro = SQR ((10.f * Qpro) / wh); - - 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.05f * (Qq - Qold) + Qold; //approximative adaptation - Qpro = (float) (Qq / coef); - Jpro = 100.f * (Qpro * Qpro) / ((4.0f / c) * (4.0f / c) * (aw + 4.0f) * (aw + 4.0f)); - } - - if (Jpro < 1.f) { - Jpro = 1.f; - } + if (Jpro < 1.f) { + Jpro = 1.f; } } @@ -1375,13 +1333,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float coef = 327.68f / parsat; float Cc = (float) Cpro * coef; float Ccold = Cc; - const Chromacurve& userColCurve = static_cast (customColCurve3); - userColCurve.Apply (Cc); + const Chromacurve& userColCurve = static_cast(customColCurve3); + userColCurve.Apply(Cc); float dred = 55.f; float protect_red = 30.0f; int sk = 1; float ko = 1.f / coef; - Color::skinredfloat (Jpro, hpro, Cc, Ccold, dred, protect_red, sk, rstprotection, ko, Cpro); + Color::skinredfloat(Jpro, hpro, Cc, Ccold, dred, protect_red, sk, rstprotection, ko, Cpro); /* if(Jpro < 1.f && Cpro > 12.f) { Cpro = 12.f; //reduce artifacts by "pseudo gamut control CIECAM" @@ -1398,32 +1356,32 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float coef = 327.68f / parsat; float Ss = (float) spro * coef; float Sold = Ss; - const Saturcurve& userColCurve = static_cast (customColCurve3); - userColCurve.Apply (Ss); + const Saturcurve& userColCurve = static_cast(customColCurve3); + userColCurve.Apply(Ss); Ss = 0.6f * (Ss - Sold) + Sold; //divide sensibility saturation float dred = 100.f; // in C mode float protect_red = 80.0f; // in C mode - dred = 100.0f * sqrtf ((dred * coe) / Qpro); - protect_red = 100.0f * sqrtf ((protect_red * coe) / Qpro); + dred = 100.0f * sqrtf((dred * coe) / Qpro); + protect_red = 100.0f * sqrtf((protect_red * coe) / Qpro); int sk = 0; float ko = 1.f / coef; - Color::skinredfloat (Jpro, hpro, Ss, Sold, dred, protect_red, sk, rstprotection, ko, spro); - Qpro = ( 4.0f / c ) * sqrtf ( Jpro / 100.0f ) * ( aw + 4.0f ) ; + Color::skinredfloat(Jpro, hpro, Ss, Sold, dred, protect_red, sk, rstprotection, ko, spro); + Qpro = (4.0f / c) * sqrtf(Jpro / 100.0f) * (aw + 4.0f) ; Cpro = (spro * spro * Qpro) / (10000.0f); } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { // float parsat = 0.8f; //0.68; float coef = 327.68f / parsat; float Mm = (float) Mpro * coef; float Mold = Mm; - const Colorfcurve& userColCurve = static_cast (customColCurve3); - userColCurve.Apply (Mm); + const Colorfcurve& userColCurve = static_cast(customColCurve3); + userColCurve.Apply(Mm); 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::skinredfloat (Jpro, hpro, Mm, Mold, dred, protect_red, sk, rstprotection, ko, Mpro); + Color::skinredfloat(Jpro, hpro, Mm, Mold, dred, protect_red, sk, rstprotection, ko, Mpro); /* if(Jpro < 1.f && Mpro > 12.f * coe) { Mpro = 12.f * coe; //reduce artifacts by "pseudo gamut control CIECAM" @@ -1456,7 +1414,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw ncie->J_p[i][j] = (float)J + epsil; ncie->h_p[i][j] = (float)h; ncie->C_p[i][j] = (float)C + epsil; - ncie->sh_p[i][j] = (float) 3276.8f * (sqrtf ( J ) ) ; + ncie->sh_p[i][j] = (float) 3276.8f * (sqrtf(J)) ; if (epdEnabled) { if (ncie->Q_p[i][j] < minQThr) { @@ -1488,7 +1446,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw libr = J; //327 for J } - posl = (int) (libr * brli); + posl = (int)(libr * brli); hist16JCAM[posl]++; if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { @@ -1502,7 +1460,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw colch = M; } - posc = (int) (colch * chsacol); + posc = (int)(colch * chsacol); hist16_CCAM[posc]++; } @@ -1516,55 +1474,33 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw #else float xx, yy, zz; //process normal==> viewing + TMatrix wprofc = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + const double wpc[3][3] = {//improve precision with double + {wprofc[0][0], wprofc[0][1], wprofc[0][2]}, + {wprofc[1][0], wprofc[1][1], wprofc[1][2]}, + {wprofc[2][0], wprofc[2][1], wprofc[2][2]} + }; - Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, - J, C, h, - xw2, yw2, zw2, - c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj); + Ciecam02::jch2xyz_ciecam02float(xx, yy, zz, + J, C, h, + xw2, yw2, zw2, + c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16, plum); float x, y, z; x = xx * 655.35f; y = yy * 655.35f; z = zz * 655.35f; float Ll, aa, bb; + //convert xyz=>lab - Color::XYZ2Lab (x, y, z, Ll, aa, bb); - - // gamut control in Lab mode; I must study how to do with cIECAM only if (gamu == 1) { - float Lprov1, Chprov1; - Lprov1 = Ll / 327.68f; - Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f; - float2 sincosval; - - if (Chprov1 == 0.0f) { - sincosval.y = 1.f; - sincosval.x = 0.0f; - } else { - sincosval.y = aa / (Chprov1 * 327.68f); - sincosval.x = bb / (Chprov1 * 327.68f); - } - - -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f, neg, more_rgb); -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); -#endif - - lab->L[i][j] = Lprov1 * 327.68f; - lab->a[i][j] = 327.68f * Chprov1 * sincosval.y; - lab->b[i][j] = 327.68f * Chprov1 * sincosval.x; - - } else { - lab->L[i][j] = Ll; - lab->a[i][j] = aa; - lab->b[i][j] = bb; + Color::gamutmap(x, y, z, wpc); } + Color::XYZ2Lab(x, y, z, Ll, aa, bb); + lab->L[i][j] = Ll; + lab->a[i][j] = aa; + lab->b[i][j] = bb; + #endif } } @@ -1577,13 +1513,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float *zbuffer = sbuffer; for (k = 0; k < bufferLength; k += 4) { - Ciecam02::jch2xyz_ciecam02float ( x, y, z, - LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]), - F2V (xw2), F2V (yw2), F2V (zw2), - F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz)); - STVF (xbuffer[k], x * c655d35); - STVF (ybuffer[k], y * c655d35); - STVF (zbuffer[k], z * c655d35); + Ciecam02::jch2xyz_ciecam02float(x, y, z, + LVF(Jbuffer[k]), LVF(Cbuffer[k]), LVF(hbuffer[k]), + F2V(xw2), F2V(yw2), F2V(zw2), + F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16, F2V(plum)); + STVF(xbuffer[k], x * c655d35); + STVF(ybuffer[k], y * c655d35); + STVF(zbuffer[k], z * c655d35); } // XYZ2Lab uses a lookup table. The function behind that lut is a cube root. @@ -1591,13 +1527,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw for (int j = 0; j < width; j++) { float Ll, aa, bb; //convert xyz=>lab - Color::XYZ2Lab (xbuffer[j], ybuffer[j], zbuffer[j], Ll, aa, bb); + Color::XYZ2Lab(xbuffer[j], ybuffer[j], zbuffer[j], Ll, aa, bb); // gamut control in Lab mode; I must study how to do with cIECAM only if (gamu == 1) { float Lprov1, Chprov1; Lprov1 = Ll / 327.68f; - Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f; + Chprov1 = sqrtf(SQR(aa) + SQR(bb)) / 327.68f; float2 sincosval; if (Chprov1 == 0.0f) { @@ -1608,15 +1544,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw sincosval.x = bb / (Chprov1 * 327.68f); } -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f, neg, more_rgb); -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); -#endif + Color::gamutLchonly(sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); lab->L[i][j] = Lprov1 * 327.68f; lab->a[i][j] = 327.68f * Chprov1 * sincosval.y; lab->b[i][j] = 327.68f * Chprov1 * sincosval.x; @@ -1649,26 +1578,16 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if (ciedata) { //update histogram J - hist16JCAM.compressTo (histLCAM); + hist16JCAM.compressTo(histLCAM); //update histogram C - hist16_CCAM.compressTo (histCCAM); + hist16_CCAM.compressTo(histCCAM); } } -#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.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { @@ -1677,7 +1596,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if (params->defringe.enabled) if (execsharp) { lab->deleteLab(); - defringecam (ncie);//defringe adapted to CIECAM + defringecam(ncie); //defringe adapted to CIECAM lab->reallocLab(); } @@ -1688,7 +1607,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw const bool hotbad = params->dirpyrequalizer.skinprotect != 0.0; lab->deleteLab(); - badpixcam (ncie, artifact / scale, 5, 2, chrom, hotbad); //enabled remove artifacts for cbDL + badpixcam(ncie, artifact / scale, 5, 2, chrom, hotbad); //enabled remove artifacts for cbDL lab->reallocLab(); } @@ -1696,7 +1615,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw 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 + badpixcam(ncie, 3.0, 10, mode, 0, true); //for bad pixels CIECAM lab->reallocLab(); } @@ -1705,17 +1624,17 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw buffers[0] = lab->L; buffers[1] = lab->a; buffers[2] = lab->b; - impulsedenoisecam (ncie, buffers); //impulse adapted to CIECAM + impulsedenoisecam(ncie, buffers); //impulse adapted to CIECAM } if (params->sharpenMicro.enabled)if (execsharp) { - 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 - sharpeningcam (ncie, buffer, showSharpMask); // sharpening adapted to CIECAM + sharpeningcam(ncie, buffer, showSharpMask); // sharpening adapted to CIECAM } //if(params->dirpyrequalizer.enabled) if(execsharp) { @@ -1724,11 +1643,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw // 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; + float b_l = static_cast(params->dirpyrequalizer.hueskin.getBottomLeft()) / 100.0f; + float t_l = static_cast(params->dirpyrequalizer.hueskin.getTopLeft()) / 100.0f; + float t_r = static_cast(params->dirpyrequalizer.hueskin.getTopRight()) / 100.0f; lab->deleteLab(); - dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, b_l, t_l, t_r, scale); //contrast by detail adapted to CIECAM + dirpyr_equalizercam(ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, b_l, t_l, t_r, scale); //contrast by detail adapted to CIECAM lab->reallocLab(); } @@ -1740,26 +1659,22 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw */ } - const float Qredi = ( 4.0f / c_) * ( a_w + 4.0f ); - const float co_e = (pow_F (f_l, 0.25f)); + const float Qredi = (4.0f / c_) * (a_w + 4.0f); + const float co_e = (pow_F(f_l, 0.25f)); -#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 for (int j = 0; j < width; j++) { - float interm = fabsf (ncie->sh_p[i][j] / (32768.f)); - ncie->J_p[i][j] = 100.0f * SQR (interm); + float interm = fabsf(ncie->sh_p[i][j] / (32768.f)); + ncie->J_p[i][j] = 100.0f * SQR(interm); ncie->Q_p[i][j] = interm * Qredi; ncie->M_p[i][j] = ncie->C_p[i][j] * co_e; } @@ -1769,13 +1684,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if ((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { ciedata = (params->colorappearance.datacie && pW != 1); if (epdEnabled && params->colorappearance.tonecie && algepd) { lab->deleteLab(); - EPDToneMapCIE (ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale ); + EPDToneMapCIE(ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale); lab->reallocLab(); } @@ -1783,12 +1698,10 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw constexpr float eps = 0.0001f; - const float co_e = (pow_F (f_l, 0.25f)) + eps; + const float co_e = (pow_F(f_l, 0.25f)) + eps; -#ifndef _DEBUG #ifdef _OPENMP #pragma omp parallel -#endif #endif { #ifdef __SSE2__ @@ -1801,10 +1714,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float *zbuffer = hbuffer; // " #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 @@ -1812,7 +1723,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw // if(epdEnabled) ncie->J_p[i][j]=(100.0f* ncie->Q_p[i][j]*ncie->Q_p[i][j])/(w_h*w_h); if (epdEnabled) { - ncie->J_p[i][j] = (100.0f * ncie->Q_p[i][j] * ncie->Q_p[i][j]) / SQR ((4.f / c) * (aw + 4.f)); + ncie->J_p[i][j] = (100.0f * ncie->Q_p[i][j] * ncie->Q_p[i][j]) / SQR((4.f / c) * (aw + 4.f)); } const float ncie_C_p = (ncie->M_p[i][j]) / co_e; @@ -1834,7 +1745,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw libr = ncie->J_p[i][j]; //327 for J } - posl = (int) (libr * brli); + posl = (int)(libr * brli); hist16JCAM[posl]++; if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { @@ -1842,13 +1753,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw colch = ncie_C_p; } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { chsacol = 450.0f; - colch = 100.f * sqrtf (ncie_C_p / ncie->Q_p[i][j]); + colch = 100.f * sqrtf(ncie_C_p / ncie->Q_p[i][j]); } else { /*if(curveMode3 == ColorAppearanceParams::CTCMode::COLORF)*/ chsacol = 400.f;//327.0f; colch = ncie->M_p[i][j]; } - posc = (int) (colch * chsacol); + posc = (int)(colch * chsacol); hist16_CCAM[posc]++; } @@ -1860,21 +1771,21 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw hbuffer[j] = ncie->h_p[i][j]; #else float xx, yy, zz; - Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, - ncie->J_p[i][j], ncie_C_p, ncie->h_p[i][j], - xw2, yw2, zw2, - c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj); + Ciecam02::jch2xyz_ciecam02float(xx, yy, zz, + ncie->J_p[i][j], ncie_C_p, ncie->h_p[i][j], + xw2, yw2, zw2, + c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16, plum); float x = (float)xx * 655.35f; float y = (float)yy * 655.35f; float z = (float)zz * 655.35f; float Ll, aa, bb; //convert xyz=>lab - Color::XYZ2Lab (x, y, z, Ll, aa, bb); + Color::XYZ2Lab(x, y, z, Ll, aa, bb); if (gamu == 1) { float Lprov1, Chprov1; Lprov1 = Ll / 327.68f; - Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f; + Chprov1 = sqrtf(SQR(aa) + SQR(bb)) / 327.68f; float2 sincosval; if (Chprov1 == 0.0f) { @@ -1886,15 +1797,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw } -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f, neg, more_rgb); -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); -#endif + Color::gamutLchonly(sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); lab->L[i][j] = Lprov1 * 327.68f; lab->a[i][j] = 327.68f * Chprov1 * sincosval.y; @@ -1912,19 +1816,19 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw // process line buffers int k; vfloat x, y, z; - vfloat c655d35 = F2V (655.35f); + vfloat c655d35 = F2V(655.35f); for (k = 0; k < bufferLength; k += 4) { - Ciecam02::jch2xyz_ciecam02float ( x, y, z, - LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]), - F2V (xw2), F2V (yw2), F2V (zw2), - F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz)); + Ciecam02::jch2xyz_ciecam02float(x, y, z, + LVF(Jbuffer[k]), LVF(Cbuffer[k]), LVF(hbuffer[k]), + F2V(xw2), F2V(yw2), F2V(zw2), + F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16, F2V(plum)); x *= c655d35; y *= c655d35; z *= c655d35; - STVF (xbuffer[k], x); - STVF (ybuffer[k], y); - STVF (zbuffer[k], z); + STVF(xbuffer[k], x); + STVF(ybuffer[k], y); + STVF(zbuffer[k], z); } // XYZ2Lab uses a lookup table. The function behind that lut is a cube root. @@ -1932,12 +1836,12 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw for (int j = 0; j < width; j++) { float Ll, aa, bb; //convert xyz=>lab - Color::XYZ2Lab (xbuffer[j], ybuffer[j], zbuffer[j], Ll, aa, bb); + Color::XYZ2Lab(xbuffer[j], ybuffer[j], zbuffer[j], Ll, aa, bb); if (gamu == 1) { float Lprov1, Chprov1; Lprov1 = Ll / 327.68f; - Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f; + Chprov1 = sqrtf(SQR(aa) + SQR(bb)) / 327.68f; float2 sincosval; if (Chprov1 == 0.0f) { @@ -1948,15 +1852,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw sincosval.x = bb / (Chprov1 * 327.68f); } -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f, neg, more_rgb); -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); -#endif + Color::gamutLchonly(sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); lab->L[i][j] = Lprov1 * 327.68f; lab->a[i][j] = 327.68f * Chprov1 * sincosval.y; lab->b[i][j] = 327.68f * Chprov1 * sincosval.x; @@ -1977,22 +1874,22 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if (ciedata) { //update histogram J and Q //update histogram J - hist16JCAM.compressTo (histLCAM); + hist16JCAM.compressTo(histLCAM); //update color histogram M,s,C - hist16_CCAM.compressTo (histCCAM); + hist16_CCAM.compressTo(histCCAM); } } } } //end CIECAM -void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty) +void ImProcFunctions::moyeqt(Imagefloat* working, float &moyS, float &eqty) { BENCHFUN - int tHh = working->getHeight(); - int tWw = working->getWidth(); + const int height = working->getHeight(); + const int width = working->getWidth(); double moy = 0.0; double sqrs = 0.0; @@ -2000,22 +1897,22 @@ void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty) #pragma omp parallel for reduction(+:moy,sqrs) schedule(dynamic,16) #endif - for (int i = 0; i < tHh; i++) { - for (int j = 0; j < tWw; j++) { - float s = Color::rgb2s (CLIP (working->r (i, j)), CLIP (working->g (i, j)), CLIP (working->b (i, j))); + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + const double s = Color::rgb2s(CLIP(working->r(i, j)), CLIP(working->g(i, j)), CLIP(working->b(i, j))); moy += s; - sqrs += SQR (s); + sqrs += SQR(s); } } - moy /= (tHh * tWw); - sqrs /= (tHh * tWw); - eqty = sqrt (sqrs - SQR (moy)); + moy /= (height * width); + sqrs /= (height * width); + eqty = std::sqrt(std::max(sqrs - SQR(moy), 0.0)); moyS = moy; } static inline void -filmlike_clip_rgb_tone (float *r, float *g, float *b, const float L) +filmlike_clip_rgb_tone(float *r, float *g, float *b, const float L) { float r_ = *r > L ? L : *r; float b_ = *b > L ? L : *b; @@ -2026,18 +1923,18 @@ filmlike_clip_rgb_tone (float *r, float *g, float *b, const float L) } /*static*/ void -filmlike_clip (float *r, float *g, float *b) +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. const float L = 65535.0; if (*r >= *g) { if (*g > *b) { // Case 1: r >= g > b - filmlike_clip_rgb_tone (r, g, b, L); + filmlike_clip_rgb_tone(r, g, b, L); } else if (*b > *r) { // Case 2: b > r >= g - filmlike_clip_rgb_tone (b, r, g, L); + filmlike_clip_rgb_tone(b, r, g, L); } else if (*b > *g) { // Case 3: r >= b > g - filmlike_clip_rgb_tone (r, b, g, L); + filmlike_clip_rgb_tone(r, b, g, L); } else { // Case 4: r >= g == b *r = *r > L ? L : *r; *g = *g > L ? L : *g; @@ -2045,21 +1942,21 @@ filmlike_clip (float *r, float *g, float *b) } } else { if (*r >= *b) { // Case 5: g > r >= b - filmlike_clip_rgb_tone (g, r, b, L); + filmlike_clip_rgb_tone(g, r, b, L); } else if (*b > *g) { // Case 6: b > g > r - filmlike_clip_rgb_tone (b, g, r, L); + filmlike_clip_rgb_tone(b, g, r, L); } else { // Case 7: g >= b > r - filmlike_clip_rgb_tone (g, b, r, L); + filmlike_clip_rgb_tone(g, b, r, L); } } } -void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, - int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, - const ColorGradientCurve& ctColorCurve, const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clToningcurve, const 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 DCPProfileApplyState& asIn, - LUTu& histToneCurve, size_t chunkSize, bool measure) +void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, + int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, + const ColorGradientCurve& ctColorCurve, const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clToningcurve, const 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 DCPProfileApplyState& asIn, + LUTu& histToneCurve, size_t chunkSize, bool measure) { 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, @@ -2067,12 +1964,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } // Process RGB image and convert to LAB space -void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, - int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, - const ColorGradientCurve& ctColorCurve, const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clToningcurve, const 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 DCPProfileApplyState& asIn, LUTu& histToneCurve, size_t chunkSize, bool measure) +void ImProcFunctions::rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, + int sat, const LUTf& rCurve, const LUTf& gCurve, const LUTf& bCurve, float satLimit, float satLimitOpacity, + const ColorGradientCurve& ctColorCurve, const OpacityCurve& ctOpacityCurve, bool opautili, const LUTf& clToningcurve, const 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 DCPProfileApplyState& asIn, LUTu& histToneCurve, size_t chunkSize, bool measure) { std::unique_ptr stop; @@ -2082,14 +1979,16 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer stop.reset(new StopWatch("rgb processing")); } - Imagefloat *tmpImage = nullptr; + const bool split_tiled_parts_1_2 = params->toneEqualizer.enabled; + + std::unique_ptr tmpImage; Imagefloat* editImgFloat = nullptr; PlanarWhateverData* editWhatever = nullptr; - EditUniqueID editID = pipetteBuffer ? pipetteBuffer->getEditID() : EUID_None; + EditUniqueID editID = pipetteBuffer && pipetteBuffer->bufferCreated() ? pipetteBuffer->getEditID() : EUID_None; if (editID != EUID_None) { - switch (pipetteBuffer->getDataProvider()->getCurrSubscriber()->getPipetteBufferType()) { + switch (pipetteBuffer->getDataProvider()->getCurrSubscriber()->getPipetteBufferType()) { case (BT_IMAGEFLOAT): editImgFloat = pipetteBuffer->getImgFloatBuffer(); break; @@ -2103,25 +2002,25 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.workingProfile); - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); float toxyz[3][3] = { { - static_cast ( wprof[0][0] / Color::D50x), - static_cast ( wprof[0][1] / Color::D50x), - static_cast ( wprof[0][2] / Color::D50x) + static_cast(wprof[0][0] / static_cast(Color::D50x)), + static_cast(wprof[0][1] / static_cast(Color::D50x)), + static_cast(wprof[0][2] / static_cast(Color::D50x)) }, { - static_cast ( wprof[1][0]), - static_cast ( wprof[1][1]), - static_cast ( wprof[1][2]) + static_cast(wprof[1][0]), + static_cast(wprof[1][1]), + static_cast(wprof[1][2]) }, { - static_cast ( wprof[2][0] / Color::D50z), - static_cast ( wprof[2][1] / Color::D50z), - static_cast ( wprof[2][2] / Color::D50z) + static_cast(wprof[2][0] / static_cast(Color::D50z)), + static_cast(wprof[2][1] / static_cast(Color::D50z)), + static_cast(wprof[2][2] / static_cast(Color::D50z)) } }; - float maxFactorToxyz = max (toxyz[1][0], toxyz[1][1], toxyz[1][2]); + float maxFactorToxyz = max(toxyz[1][0], toxyz[1][1], toxyz[1][2]); float equalR = maxFactorToxyz / toxyz[1][0]; float equalG = maxFactorToxyz / toxyz[1][1]; float equalB = maxFactorToxyz / toxyz[1][2]; @@ -2140,7 +2039,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer }; bool mixchannels = params->chmixer.enabled && - (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || + (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || params->chmixer.green[0] != 0 || params->chmixer.green[1] != 100 || params->chmixer.green[2] != 0 || params->chmixer.blue[0] != 0 || params->chmixer.blue[1] != 0 || params->chmixer.blue[2] != 100); @@ -2149,10 +2048,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer FlatCurve* vCurve = nullptr; FlatCurve* bwlCurve = nullptr; - FlatCurveType hCurveType = (FlatCurveType)params->hsvequalizer.hcurve.at (0); - FlatCurveType sCurveType = (FlatCurveType)params->hsvequalizer.scurve.at (0); - FlatCurveType vCurveType = (FlatCurveType)params->hsvequalizer.vcurve.at (0); - FlatCurveType bwlCurveType = (FlatCurveType)params->blackwhite.luminanceCurve.at (0); + FlatCurveType hCurveType = (FlatCurveType)params->hsvequalizer.hcurve.at(0); + FlatCurveType sCurveType = (FlatCurveType)params->hsvequalizer.scurve.at(0); + FlatCurveType vCurveType = (FlatCurveType)params->hsvequalizer.vcurve.at(0); + FlatCurveType bwlCurveType = (FlatCurveType)params->blackwhite.luminanceCurve.at(0); bool hCurveEnabled = params->hsvequalizer.enabled && hCurveType > FCT_Linear; bool sCurveEnabled = params->hsvequalizer.enabled && sCurveType > FCT_Linear; bool vCurveEnabled = params->hsvequalizer.enabled && vCurveType > FCT_Linear; @@ -2160,7 +2059,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // TODO: We should create a 'skip' value like for CurveFactory::complexsgnCurve (rtengine/curves.cc) if (hCurveEnabled) { - hCurve = new FlatCurve (params->hsvequalizer.hcurve); + hCurve = new FlatCurve(params->hsvequalizer.hcurve); if (hCurve->isIdentity()) { delete hCurve; @@ -2170,7 +2069,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } if (sCurveEnabled) { - sCurve = new FlatCurve (params->hsvequalizer.scurve); + sCurve = new FlatCurve(params->hsvequalizer.scurve); if (sCurve->isIdentity()) { delete sCurve; @@ -2180,7 +2079,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } if (vCurveEnabled) { - vCurve = new FlatCurve (params->hsvequalizer.vcurve); + vCurve = new FlatCurve(params->hsvequalizer.vcurve); if (vCurve->isIdentity()) { delete vCurve; @@ -2190,7 +2089,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } if (bwlCurveEnabled) { - bwlCurve = new FlatCurve (params->blackwhite.luminanceCurve); + bwlCurve = new FlatCurve(params->blackwhite.luminanceCurve); if (bwlCurve->isIdentity()) { delete bwlCurve; @@ -2209,24 +2108,24 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer vfloat v_xyz2work[3][3] ALIGNED16; #endif - if ( params->filmSimulation.enabled && !params->filmSimulation.clutFilename.empty() ) { - hald_clut = CLUTStore::getInstance().getClut ( params->filmSimulation.clutFilename ); + if (params->filmSimulation.enabled && !params->filmSimulation.clutFilename.empty()) { + hald_clut = CLUTStore::getInstance().getClut(params->filmSimulation.clutFilename); - if ( hald_clut ) { + if (hald_clut) { clutAndWorkingProfilesAreSame = hald_clut->getProfile() == params->icm.workingProfile; - if ( !clutAndWorkingProfilesAreSame ) { - xyz2clut = ICCStore::getInstance()->workingSpaceInverseMatrix ( hald_clut->getProfile() ); - clut2xyz = ICCStore::getInstance()->workingSpaceMatrix ( hald_clut->getProfile() ); + if (!clutAndWorkingProfilesAreSame) { + xyz2clut = ICCStore::getInstance()->workingSpaceInverseMatrix(hald_clut->getProfile()); + clut2xyz = ICCStore::getInstance()->workingSpaceMatrix(hald_clut->getProfile()); #ifdef __SSE2__ for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - v_work2xyz[i][j] = F2V (wprof[i][j]); - v_xyz2clut[i][j] = F2V (xyz2clut[i][j]); - v_xyz2work[i][j] = F2V (wiprof[i][j]); - v_clut2xyz[i][j] = F2V (clut2xyz[i][j]); + v_work2xyz[i][j] = F2V(wprof[i][j]); + v_xyz2clut[i][j] = F2V(xyz2clut[i][j]); + v_xyz2work[i][j] = F2V(wiprof[i][j]); + v_clut2xyz[i][j] = F2V(clut2xyz[i][j]); } } @@ -2236,12 +2135,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - const float film_simulation_strength = static_cast (params->filmSimulation.strength) / 100.0f; + const float film_simulation_strength = static_cast(params->filmSimulation.strength) / 100.0f; - const float exp_scale = pow (2.0, expcomp); - 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 float exp_scale = pow(2.0, expcomp); + const float comp = (max(0.0, expcomp) + 1.0) * hlcompr / 100.0; + const float shoulder = ((65536.f / max(1.0f, exp_scale)) * (hlcomprthresh / 200.f)) + 0.1f; + const float hlrange = 65536.f - shoulder; + const int tone_curve_black = params->toneCurve.black; const bool isProPhoto = (params->icm.workingProfile == "ProPhoto"); // extracting data from 'params' to avoid cache flush (to be confirmed) ToneCurveMode curveMode = params->toneCurve.curveMode; @@ -2258,91 +2158,61 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer PerceptualToneCurveState ptc1ApplyState, ptc2ApplyState; if (hasToneCurve1 && curveMode == ToneCurveMode::PERCEPTUAL) { - const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve1); - userToneCurve.initApplyState (ptc1ApplyState, params->icm.workingProfile); + const PerceptualToneCurve& userToneCurve = static_cast(customToneCurve1); + userToneCurve.initApplyState(ptc1ApplyState, params->icm.workingProfile); } if (hasToneCurve2 && curveMode2 == ToneCurveMode::PERCEPTUAL) { - const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.initApplyState (ptc2ApplyState, params->icm.workingProfile); + const PerceptualToneCurve& userToneCurve = static_cast(customToneCurve2); + userToneCurve.initApplyState(ptc2ApplyState, params->icm.workingProfile); } bool hasColorToning = params->colorToning.enabled && bool (ctOpacityCurve) && bool (ctColorCurve) && params->colorToning.method != "LabGrid"; - bool hasColorToningLabGrid = params->colorToning.enabled && params->colorToning.method == "LabGrid"; +// bool hasColorToningLabGrid = params->colorToning.enabled && params->colorToning.method == "LabGrid"; // float satLimit = float(params->colorToning.satProtectionThreshold)/100.f*0.7f+0.3f; // float satLimitOpacity = 1.f-(float(params->colorToning.saturatedOpacity)/100.f); float strProtect = pow_F((float (params->colorToning.strength) / 100.f), 0.4f); - /* - // Debug output - Color LUTf points - if (ctColorCurve) { - printf("\nColor curve:"); - for (size_t i=0; i<501; i++) { - if (i==0 || i==250 || i==500) - printf("\n(%.1f)[", float(i)/500.f); - printf("%.3f ", ctColorCurve.lutHueCurve[float(i)]); - if (i==0 || i==250 || i==500) - printf("]\n"); - } - printf("\n"); - } - */ + float RedLow = params->colorToning.redlow / 100.0; + float GreenLow = params->colorToning.greenlow / 100.0; + float BlueLow = params->colorToning.bluelow / 100.0; + float RedMed = params->colorToning.redmed / 100.0; + float GreenMed = params->colorToning.greenmed / 100.0; + float BlueMed = params->colorToning.bluemed / 100.0; + float RedHigh = params->colorToning.redhigh / 100.0; + float GreenHigh = params->colorToning.greenhigh / 100.0; + float BlueHigh = params->colorToning.bluehigh / 100.0; + float SatLow = params->colorToning.shadowsColSat.getBottom() / 100.f; + float SatHigh = params->colorToning.hlColSat.getBottom() / 100.f; - /* - // Debug output - Opacity LUTf points - if (ctOpacityCurve) { - printf("\nOpacity curve:"); - for (size_t i=0; i<501; i++) { - if (i==0 || i==250 || i==500) - printf("\n(%.1f)[", float(i)/500.f); - printf("%.3f ", ctOpacityCurve.lutOpacityCurve[float(i)]); - if (i==0 || i==250 || i==500) - printf("]\n"); - } - printf("\n"); - } - */ + float Balan = params->colorToning.balance; - float RedLow = params->colorToning.redlow / 100.f; - float GreenLow = params->colorToning.greenlow / 100.f; - float BlueLow = params->colorToning.bluelow / 100.f; - float RedMed = params->colorToning.redmed / 100.f; - float GreenMed = params->colorToning.greenmed / 100.f; - float BlueMed = params->colorToning.bluemed / 100.f; - float RedHigh = params->colorToning.redhigh / 100.f; - float GreenHigh = params->colorToning.greenhigh / 100.f; - float BlueHigh = params->colorToning.bluehigh / 100.f; - float SatLow = float (params->colorToning.shadowsColSat.getBottom()) / 100.f; - float SatHigh = float (params->colorToning.hlColSat.getBottom()) / 100.f; - - float Balan = float (params->colorToning.balance); - - 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; + float chMixRR = params->chmixer.red[0] / 10.f; + float chMixRG = params->chmixer.red[1] / 10.f; + float chMixRB = params->chmixer.red[2] / 10.f; + float chMixGR = params->chmixer.green[0] / 10.f; + float chMixGG = params->chmixer.green[1] / 10.f; + float chMixGB = params->chmixer.green[2] / 10.f; + float chMixBR = params->chmixer.blue[0] / 10.f; + float chMixBG = params->chmixer.blue[1] / 10.f; + float chMixBB = params->chmixer.blue[2] / 10.f; bool blackwhite = params->blackwhite.enabled; bool complem = params->blackwhite.enabledcc; - float bwr = float (params->blackwhite.mixerRed); - float bwg = float (params->blackwhite.mixerGreen); - float bwb = float (params->blackwhite.mixerBlue); - float bwrgam = float (params->blackwhite.gammaRed); - float bwggam = float (params->blackwhite.gammaGreen); - float bwbgam = float (params->blackwhite.gammaBlue); - float mixerOrange = float (params->blackwhite.mixerOrange); - float mixerYellow = float (params->blackwhite.mixerYellow); - float mixerCyan = float (params->blackwhite.mixerCyan); - float mixerMagenta = float (params->blackwhite.mixerMagenta); - float mixerPurple = float (params->blackwhite.mixerPurple); + float bwr = params->blackwhite.mixerRed; + float bwg = params->blackwhite.mixerGreen; + float bwb = params->blackwhite.mixerBlue; + float bwrgam = params->blackwhite.gammaRed; + float bwggam = params->blackwhite.gammaGreen; + float bwbgam = params->blackwhite.gammaBlue; + float mixerOrange = params->blackwhite.mixerOrange; + float mixerYellow = params->blackwhite.mixerYellow; + float mixerCyan = params->blackwhite.mixerCyan; + float mixerMagenta = params->blackwhite.mixerMagenta; + float mixerPurple = params->blackwhite.mixerPurple; int algm = 0; - if (params->blackwhite.method == "Desaturation") { + if (params->blackwhite.method == "Desaturation") { algm = 0; } else if (params->blackwhite.method == "LumEqualizer") { algm = 1; @@ -2380,8 +2250,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } bool hasgammabw = gammabwr != 1.f || gammabwg != 1.f || gammabwb != 1.f; - if (hasColorToning || blackwhite || (params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled)) { - tmpImage = new Imagefloat (working->getWidth(), working->getHeight()); + if (hasColorToning || blackwhite || (params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled) || split_tiled_parts_1_2) { + tmpImage.reset(new Imagefloat(working->getWidth(), working->getHeight())); } // For tonecurve histogram @@ -2390,24 +2260,67 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (toneCurveHistSize > 0) { histToneCurve.clear(); - histToneCurveCompression = log2 (65536 / toneCurveHistSize); + histToneCurveCompression = log2(65536 / toneCurveHistSize); } // For tonecurve histogram - const float lumimulf[3] = {static_cast (lumimul[0]), static_cast (lumimul[1]), static_cast (lumimul[2])}; - + const float lumimulf[3] = {static_cast(lumimul[0]), static_cast(lumimul[1]), static_cast(lumimul[2])}; #define TS 112 + const auto tiled_part_1 = + [working, + mixchannels, + &hltonecurve, &shtonecurve, + chMixRR, chMixRG, chMixRB, + chMixGR, chMixGG, chMixGB, + chMixBR, chMixBG, chMixBB, + exp_scale, comp, hlrange, tone_curve_black]( + int istart, int jstart, int tH, int tW, + float *rtemp, float *gtemp, float *btemp) { + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + rtemp[ti * TS + tj] = working->r(i, j); + gtemp[ti * TS + tj] = working->g(i, j); + btemp[ti * TS + tj] = working->b(i, j); + } + } + + if (mixchannels) { + 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]; + + // if (i==100 & j==100) printf("rgbProc input R= %f G= %f B= %f \n",r,g,b); + float rmix = (r * chMixRR + g * chMixRG + b * chMixRB) / 100.f; + float gmix = (r * chMixGR + g * chMixGG + b * chMixGB) / 100.f; + float bmix = (r * chMixBR + g * chMixBG + b * chMixBB) / 100.f; + + rtemp[ti * TS + tj] = rmix; + gtemp[ti * TS + tj] = gmix; + btemp[ti * TS + tj] = bmix; + } + } + } + + highlightToneCurve(hltonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, exp_scale, comp, hlrange); + + if (tone_curve_black != 0) { + shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); + } + }; + #ifdef _OPENMP #pragma omp parallel if (multiThread) #endif { - size_t perChannelSizeBytes = padToAlignment(sizeof (float) * TS * TS + 4 * 64); + size_t perChannelSizeBytes = padToAlignment(sizeof(float) * TS * TS + 4 * 64); AlignedBuffer buffer(3 * perChannelSizeBytes); char *editIFloatBuffer = nullptr; char *editWhateverBuffer = nullptr; - float *rtemp = buffer.data; float *gtemp = &rtemp[perChannelSizeBytes / sizeof(float)]; float *btemp = >emp[perChannelSizeBytes / sizeof(float)]; @@ -2423,17 +2336,17 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float *editIFloatTmpR = nullptr, *editIFloatTmpG = nullptr, *editIFloatTmpB = nullptr, *editWhateverTmp = nullptr; if (editImgFloat) { - editIFloatBuffer = (char *) malloc (3 * sizeof (float) * TS * TS + 20 * 64 + 63); - char *data = (char*) ( ( uintptr_t (editIFloatBuffer) + uintptr_t (63)) / 64 * 64); + editIFloatBuffer = (char *) malloc(3 * sizeof(float) * TS * TS + 20 * 64 + 63); + char *data = (char*)((uintptr_t (editIFloatBuffer) + uintptr_t (63)) / 64 * 64); editIFloatTmpR = (float (*))data; - editIFloatTmpG = (float (*)) ((char*)editIFloatTmpR + sizeof (float) * TS * TS + 4 * 64); - editIFloatTmpB = (float (*)) ((char*)editIFloatTmpG + sizeof (float) * TS * TS + 8 * 64); + editIFloatTmpG = (float (*))((char*)editIFloatTmpR + sizeof(float) * TS * TS + 4 * 64); + editIFloatTmpB = (float (*))((char*)editIFloatTmpG + sizeof(float) * TS * TS + 8 * 64); } if (editWhatever) { - editWhateverBuffer = (char *) malloc (sizeof (float) * TS * TS + 20 * 64 + 63); - char *data = (char*) ( ( uintptr_t (editWhateverBuffer) + uintptr_t (63)) / 64 * 64); + editWhateverBuffer = (char *) malloc(sizeof(float) * TS * TS + 20 * 64 + 63); + char *data = (char*)((uintptr_t (editWhateverBuffer) + uintptr_t (63)) / 64 * 64); editWhateverTmp = (float (*))data; } @@ -2446,10 +2359,45 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer LUTu histToneCurveThr; if (toneCurveHistSize > 0) { - histToneCurveThr (toneCurveHistSize); + histToneCurveThr(toneCurveHistSize); histToneCurveThr.clear(); } + if (split_tiled_parts_1_2) { + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, chunkSize) collapse(2) +#endif + + for (int ii = 0; ii < working->getHeight(); ii += TS) { + for (int jj = 0; jj < working->getWidth(); jj += TS) { + istart = ii; + jstart = jj; + tH = min(ii + TS, working->getHeight()); + tW = min(jj + TS, working->getWidth()); + + + tiled_part_1(istart, jstart, tH, tW, rtemp, gtemp, btemp); + + // Copy tile to image. + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + tmpImage->r(i, j) = rtemp[ti * TS + tj]; + tmpImage->g(i, j) = gtemp[ti * TS + tj]; + tmpImage->b(i, j) = btemp[ti * TS + tj]; + } + } + } + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + if (params->toneEqualizer.enabled) { + toneEqualizer(tmpImage.get()); + } + #ifdef _OPENMP #pragma omp for schedule(dynamic, chunkSize) collapse(2) #endif @@ -2458,44 +2406,23 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int jj = 0; jj < working->getWidth(); jj += TS) { istart = ii; jstart = jj; - tH = min (ii + TS, working->getHeight()); - tW = min (jj + TS, working->getWidth()); + tH = min(ii + TS, working->getHeight()); + tW = min(jj + TS, working->getWidth()); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * TS + tj] = working->r (i, j); - gtemp[ti * TS + tj] = working->g (i, j); - btemp[ti * TS + tj] = working->b (i, j); - } - } - - if (mixchannels) { + if (split_tiled_parts_1_2) { 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]; - - //if (i==100 & j==100) printf("rgbProc input R= %f G= %f B= %f \n",r,g,b); - float rmix = (r * chMixRR + g * chMixRG + b * chMixRB) / 100.f; - float gmix = (r * chMixGR + g * chMixGG + b * chMixGB) / 100.f; - float bmix = (r * chMixBR + g * chMixBG + b * chMixBB) / 100.f; - - rtemp[ti * TS + tj] = rmix; - gtemp[ti * TS + tj] = gmix; - btemp[ti * TS + tj] = bmix; + rtemp[ti * TS + tj] = tmpImage->r(i, j); + gtemp[ti * TS + tj] = tmpImage->g(i, j); + btemp[ti * TS + tj] = tmpImage->b(i, j); } } - } - - highlightToneCurve(hltonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, exp_scale, comp, hlrange); - if (params->toneCurve.black != 0.0) { - shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); + } else { + tiled_part_1(istart, jstart, tH, tW, rtemp, gtemp, btemp); } if (dcpProf) { - dcpProf->step2ApplyTile (rtemp, gtemp, btemp, tW - jstart, tH - istart, TS, asIn); + dcpProf->step2ApplyTile(rtemp, gtemp, btemp, tW - jstart, tH - istart, TS, asIn); } if (params->toneCurve.clampOOG) { @@ -2509,11 +2436,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer 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; } } + } if (histToneCurveThr) { @@ -2539,16 +2468,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float tmpg[4] ALIGNED16; float tmpb[4] ALIGNED16; - for (; j < tW - 3; j+=4, tj+=4) { + for (; j < tW - 3; j += 4, tj += 4) { //brightness/contrast 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 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]]); @@ -2627,9 +2559,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float y = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; float z = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; - float fx = x < MAXVALF ? Color::cachef[x] : 327.68f * std::cbrt (x / MAXVALF); - float fy = y < MAXVALF ? Color::cachef[y] : 327.68f * std::cbrt (y / MAXVALF); - float fz = z < MAXVALF ? Color::cachef[z] : 327.68f * std::cbrt (z / MAXVALF); + float fx = x < MAXVALF ? Color::cachef[x] : 327.68f * std::cbrt(x / MAXVALF); + float fy = y < MAXVALF ? Color::cachef[y] : 327.68f * std::cbrt(y / MAXVALF); + float fz = z < MAXVALF ? Color::cachef[z] : 327.68f * std::cbrt(z / MAXVALF); float a_1 = 500.0f * (fx - fy); float b_1 = 200.0f * (fy - fz); @@ -2658,7 +2590,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //gamut control if (settings->rgbcurveslumamode_gamut) { float Lpro = L_2 / 327.68f; - float Chpro = sqrtf (SQR (a_1) + SQR (b_1)) / 327.68f; + float Chpro = sqrtf(SQR(a_1) + SQR(b_1)) / 327.68f; float HH = NAN; // we set HH to NAN, because then it will be calculated in Color::gamutLchonly only if needed // float HH = xatan2f(b_1, a_1); // According to mathematical laws we can get the sin and cos of HH by simple operations even if we don't calculate HH @@ -2672,21 +2604,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer sincosval.x = b_1 / (Chpro * 327.68f); } -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; //gamut control : Lab values are in gamut - 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, r, g, b, wip, highlight, 0.15f, 0.96f); -#endif + Color::gamutLchonly(HH, sincosval, Lpro, Chpro, r, g, b, wip, highlight, 0.15f, 0.96f); //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_, r, g, b, wip); + Color::Lab2XYZ(L_2, a_1, b_1, x_, y_, z_) ; + 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); @@ -2699,7 +2624,7 @@ 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++) { float h, s, v; - Color::rgb2hsv (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], h, s, v); + Color::rgb2hsv(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], h, s, v); editWhateverTmp[ti * TS + tj] = h; } } @@ -2707,11 +2632,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (sat != 0 || hCurveEnabled || sCurveEnabled || vCurveEnabled) { const float satby100 = sat / 100.f; + for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { float h, s, v; Color::rgb2hsvtc(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], h, s, v); h /= 6.f; + if (sat > 0) { s = std::max(0.f, intp(satby100, 1.f - SQR(SQR(1.f - std::min(s, 1.0f))), s)); } else { /*if (sat < 0)*/ @@ -2720,7 +2647,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //HSV equalizer if (hCurveEnabled) { - h = (hCurve->getVal (double (h)) - 0.5) * 2.f + h; + h = (hCurve->getVal(h) - 0.5) * 2.0 + static_cast(h); if (h > 1.0f) { h -= 1.0f; @@ -2731,10 +2658,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (sCurveEnabled) { //shift saturation - float satparam = (sCurve->getVal (double (h)) - 0.5) * 2; + float satparam = (sCurve->getVal(double (h)) - 0.5) * 2; if (satparam > 0.00001f) { - s = (1.f - satparam) * s + satparam * (1.f - SQR (1.f - min (s, 1.0f))); + s = (1.f - satparam) * s + satparam * (1.f - SQR(1.f - min(s, 1.0f))); if (s < 0.f) { s = 0.f; @@ -2751,11 +2678,11 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } //shift value - float valparam = vCurve->getVal ((double)h) - 0.5f; - valparam *= (1.f - SQR (SQR (1.f - min (s, 1.0f)))); + float valparam = vCurve->getVal(h) - 0.5; + 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 artifacts + 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; @@ -2795,21 +2722,22 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer const float iplow = ctColorCurve.low; const float iphigh = ctColorCurve.high; //2 colours - ctColorCurve.getVal (iphigh, xh, yh, zh); - ctColorCurve.getVal (iplow, xl, yl, zl); + ctColorCurve.getVal(iphigh, xh, yh, zh); + ctColorCurve.getVal(iplow, xl, yl, zl); - Color::xyz2rgb (xh, yh, zh, rh, gh, bh, wip); - Color::xyz2rgb (xl, yl, zl, rl, gl, bl, wip); + Color::xyz2rgb(xh, yh, zh, rh, gh, bh, wip); + Color::xyz2rgb(xl, yl, zl, rl, gl, bl, wip); //reteave rgb value with s and l =1 - retreavergb (rl, gl, bl); + retreavergb(rl, gl, bl); const float krl = rl / (rl + gl + bl); const float kgl = gl / (rl + gl + bl); const float kbl = bl / (rl + gl + bl); - retreavergb (rh, gh, bh); + retreavergb(rh, gh, bh); const float krh = rh / (rh + gh + bh); const float kgh = gh / (rh + gh + bh); const float kbh = bh / (rh + gh + bh); constexpr int mode = 0; + for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { toning2col(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], iplow, iphigh, krl, kgl, kbl, krh, kgh, kbh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); @@ -2821,6 +2749,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer else if (params->colorToning.method == "Splitco") { constexpr float reducac = 0.3f; constexpr int mode = 0; + for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { const float r = rtemp[ti * TS + tj]; @@ -2845,17 +2774,17 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //colortoning with shift color XYZ or Lch else if (params->colorToning.method == "Lab" && opautili) { - int algm = 0; + int algo = 0; bool twocol = true;//true=500 color false=2 color int metchrom = 0; - if (params->colorToning.twocolor == "Std" ) { + if (params->colorToning.twocolor == "Std") { metchrom = 0; - } else if (params->colorToning.twocolor == "All" ) { + } else if (params->colorToning.twocolor == "All") { metchrom = 1; } else if (params->colorToning.twocolor == "Separ") { metchrom = 2; - } else if (params->colorToning.twocolor == "Two" ) { + } else if (params->colorToning.twocolor == "Two") { metchrom = 3; } @@ -2878,25 +2807,25 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer twoc = 1; // 500 colours } - if (params->colorToning.method == "Lab") { - algm = 1; + if (params->colorToning.method == "Lab") { + algo = 1; } else if (params->colorToning.method == "Lch") { - algm = 2; //in case of + algo = 2; //in case of } - if (algm <= 2) { + if (algo <= 2) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { float r = rtemp[ti * TS + tj]; float g = gtemp[ti * TS + tj]; float b = btemp[ti * TS + tj]; float ro, go, bo; - labtoning (r, g, b, ro, go, bo, algm, metchrom, twoc, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, clToningcurve, cl2Toningcurve, iplow, iphigh, wp, wip); + labtoning(r, g, b, ro, go, bo, algo, metchrom, twoc, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, clToningcurve, cl2Toningcurve, iplow, iphigh, wp, wip); setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], ro, go, bo); } } } - } else if (params->colorToning.method.substr (0, 3) == "RGB" && opautili) { + } else if (params->colorToning.method.substr(0, 3) == "RGB" && opautili) { // color toning for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { @@ -2907,7 +2836,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Luminance = (0.299f*r + 0.587f*g + 0.114f*b) float s, l; - Color::rgb2slfloat (r, g, b, s, l); + Color::rgb2slfloat(r, g, b, s, l); float l_ = Color::gammatab_srgb1[l * 65535.f]; @@ -2919,12 +2848,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } float r2, g2, b2; - ctColorCurve.getVal (l_, r2, g2, b2); // get the color from the color curve + ctColorCurve.getVal(l_, r2, g2, b2); // get the color from the color curve float h2, s2, l2; - Color::rgb2hslfloat (r2, g2, b2, h2, s2, l2); // transform this new color to hsl + Color::rgb2hslfloat(r2, g2, b2, h2, s2, l2); // transform this new color to hsl - Color::hsl2rgbfloat (h2, s + ((1.f - s) * (1.f - l) * 0.7f), l, r2, g2, b2); + Color::hsl2rgbfloat(h2, s + ((1.f - s) * (1.f - l) * 0.7f), l, r2, g2, b2); rtemp[ti * TS + tj] = r + (r2 - r) * opacity; // merge the color to the old color, depending on the opacity gtemp[ti * TS + tj] = g + (g2 - g) * opacity; @@ -2942,13 +2871,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int j = jstart, tj = 0; j < tW; j++, tj++) { float X, Y, Z, L, aa, bb; //rgb=>lab - Color::rgbxyz (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], X, Y, Z, wp); + Color::rgbxyz(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], X, Y, Z, wp); //convert Lab - Color::XYZ2Lab (X, Y, Z, L, aa, bb); + Color::XYZ2Lab(X, Y, Z, L, aa, bb); //end rgb=>lab - float HH = xatan2f (bb, aa); // HH hue in -3.141 +3.141 + float HH = xatan2f(bb, aa); // HH hue in -3.141 +3.141 - editWhateverTmp[ti * TS + tj] = float (Color::huelab_to_huehsv2 (HH)); + editWhateverTmp[ti * TS + tj] = float (Color::huelab_to_huehsv2(HH)); } } } @@ -2959,36 +2888,36 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (beforeCurveMode == BlackWhiteParams::TcMode::STD_BW) { // Standard for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const StandardToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); - userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); + const StandardToneCurve& userToneCurvebw = static_cast(customToneCurvebw1); + userToneCurvebw.Apply(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } } else if (beforeCurveMode == BlackWhiteParams::TcMode::FILMLIKE_BW) { // Adobe like for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const AdobeToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); - userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); + const AdobeToneCurve& userToneCurvebw = static_cast(customToneCurvebw1); + userToneCurvebw.Apply(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } } else if (beforeCurveMode == BlackWhiteParams::TcMode::SATANDVALBLENDING_BW) { // apply the curve on the saturation and value channels for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const SatAndValueBlendingToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); + const SatAndValueBlendingToneCurve& userToneCurvebw = static_cast(customToneCurvebw1); // rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); // gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); // btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); + userToneCurvebw.Apply(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } } else if (beforeCurveMode == BlackWhiteParams::TcMode::WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const WeightedStdToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); + const WeightedStdToneCurve& userToneCurvebw = static_cast(customToneCurvebw1); // rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); // gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); // btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); + userToneCurvebw.Apply(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } } @@ -3020,7 +2949,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //gamma correction: pseudo TRC curve if (hasgammabw) { - Color::trcGammaBW (r, g, b, gammabwr, gammabwg, gammabwb); + Color::trcGammaBW(r, g, b, gammabwr, gammabwg, gammabwb); } #endif @@ -3033,7 +2962,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hasgammabw) { //gamma correction: pseudo TRC curve - Color::trcGammaBWRow (&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], tW - jstart, gammabwr, gammabwg, gammabwb); + Color::trcGammaBWRow(&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], tW - jstart, gammabwr, gammabwg, gammabwb); } #endif @@ -3044,12 +2973,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int j = jstart, tj = 0; j < tW; j++, tj++) { //rgb => xyz float X, Y, Z; - Color::rgbxyz (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], X, Y, Z, wp); + Color::rgbxyz(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], X, Y, Z, wp); //xyz => Lab float L, aa, bb; - Color::XYZ2Lab (X, Y, Z, L, aa, bb); - float CC = sqrtf (SQR (aa) + SQR (bb)) / 327.68f; //CC chromaticity in 0..180 or more - float HH = xatan2f (bb, aa); // HH hue in -3.141 +3.141 + Color::XYZ2Lab(X, Y, Z, L, aa, bb); + float CC = sqrtf(SQR(aa) + SQR(bb)) / 327.68f; //CC chromaticity in 0..180 or more + float HH = xatan2f(bb, aa); // HH hue in -3.141 +3.141 float2 sincosval; if (CC == 0.0f) { @@ -3062,14 +2991,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (bwlCurveEnabled) { L /= 32768.f; - double hr = Color::huelab_to_huehsv2 (HH); - float valparam = float ((bwlCurve->getVal (hr) - 0.5f) * 2.0f); //get l_r=f(H) + double hr = Color::huelab_to_huehsv2(HH); + float valparam = (bwlCurve->getVal(hr) - 0.5) * 2.0; //get l_r=f(H) float kcc = (CC / 70.f); //take Chroma into account...70 "middle" of chromaticity (arbitrary and simple), one can imagine other algorithme //reduct action for low chroma and increase action for high chroma valparam *= kcc; if (valparam > 0.f) { - L = (1.f - valparam) * L + valparam * (1.f - SQR (SQR (SQR (SQR (1.f - min (L, 1.0f)))))); // SQR (SQR((SQR) to increase action in low light + L = (1.f - valparam) * L + valparam * (1.f - SQR(SQR(SQR(SQR(1.f - min(L, 1.0f)))))); // SQR (SQR((SQR) to increase action in low light } else { L *= (1.f + valparam); //for negative } @@ -3079,26 +3008,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float RR, GG, BB; L /= 327.68f; -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, sincosval, L, CC, RR, GG, BB, wip, highlight, 0.15f, 0.96f, neg, more_rgb); -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, sincosval, L, CC, RR, GG, BB, wip, highlight, 0.15f, 0.96f); -#endif + Color::gamutLchonly(HH, sincosval, L, CC, RR, GG, BB, wip, highlight, 0.15f, 0.96f); L *= 327.68f; //convert l => rgb - Color::L2XYZ (L, X, Y, Z); + Color::L2XYZ(L, X, Y, Z); float newRed; // We use the red channel for bw - Color::xyz2r (X, Y, Z, newRed, wip); + Color::xyz2r(X, Y, Z, newRed, wip); rtemp[ti * TS + tj] = gtemp[ti * TS + tj] = btemp[ti * TS + tj] = newRed; #ifndef __SSE2__ if (hasgammabw) { //gamma correction: pseudo TRC curve - Color::trcGammaBW (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], gammabwr, gammabwg, gammabwb); + Color::trcGammaBW(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], gammabwr, gammabwg, gammabwb); } #endif @@ -3108,7 +3030,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hasgammabw) { //gamma correction: pseudo TRC curve - Color::trcGammaBWRow (&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], tW - jstart, gammabwr, gammabwg, gammabwb); + Color::trcGammaBWRow(&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], tW - jstart, gammabwr, gammabwg, gammabwb); } #endif @@ -3129,19 +3051,19 @@ 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(rtemp[ti * TS + tj]); + vfloat sourceG = LVF(gtemp[ti * TS + tj]); + vfloat sourceB = LVF(btemp[ti * TS + tj]); vfloat x; vfloat y; vfloat z; - Color::rgbxyz (sourceR, sourceG, sourceB, x, y, z, v_work2xyz); - Color::xyz2rgb (x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_work2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); - STVF (clutr[tj], sourceR); - STVF (clutg[tj], sourceG); - STVF (clutb[tj], sourceB); + STVF(clutr[tj], sourceR); + STVF(clutg[tj], sourceG); + STVF(clutb[tj], sourceB); } #endif @@ -3152,8 +3074,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float sourceB = btemp[ti * TS + tj]; float x, y, z; - Color::rgbxyz ( sourceR, sourceG, sourceB, x, y, z, wprof ); - Color::xyz2rgb (x, y, z, clutr[tj], clutg[tj], clutb[tj], xyz2clut); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, wprof); + Color::xyz2rgb(x, y, z, clutr[tj], clutg[tj], clutb[tj], xyz2clut); } } else { memcpy(clutr, &rtemp[ti * TS], sizeof(float) * TS); @@ -3167,14 +3089,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float &sourceB = clutb[tj]; // Apply gamma sRGB (default RT) - sourceR = Color::gamma_srgbclipped (sourceR); - sourceG = Color::gamma_srgbclipped (sourceG); - sourceB = Color::gamma_srgbclipped (sourceB); + sourceR = Color::gamma_srgbclipped(sourceR); + sourceG = Color::gamma_srgbclipped(sourceG); + sourceB = Color::gamma_srgbclipped(sourceB); } - hald_clut->getRGB ( + hald_clut->getRGB( film_simulation_strength, - std::min (TS, tW - jstart), + std::min(TS, tW - jstart), clutr, clutg, clutb, @@ -3187,9 +3109,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float &sourceB = clutb[tj]; // Apply inverse gamma sRGB - sourceR = Color::igamma_srgb (out_rgbx[tj * 4 + 0]); - sourceG = Color::igamma_srgb (out_rgbx[tj * 4 + 1]); - sourceB = Color::igamma_srgb (out_rgbx[tj * 4 + 2]); + sourceR = Color::igamma_srgb(out_rgbx[tj * 4 + 0]); + sourceG = Color::igamma_srgb(out_rgbx[tj * 4 + 1]); + sourceB = Color::igamma_srgb(out_rgbx[tj * 4 + 2]); } if (!clutAndWorkingProfilesAreSame) { @@ -3200,19 +3122,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer #ifdef __SSE2__ for (; j < tW - 3; j += 4, tj += 4) { - vfloat sourceR = LVF (clutr[tj]); - vfloat sourceG = LVF (clutg[tj]); - vfloat sourceB = LVF (clutb[tj]); + vfloat sourceR = LVF(clutr[tj]); + vfloat sourceG = LVF(clutg[tj]); + vfloat sourceB = LVF(clutb[tj]); vfloat x; vfloat y; vfloat z; - Color::rgbxyz (sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); - Color::xyz2rgb (x, y, z, sourceR, sourceG, sourceB, v_xyz2work); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2work); - STVF (clutr[tj], sourceR); - STVF (clutg[tj], sourceG); - STVF (clutb[tj], sourceB); + STVF(clutr[tj], sourceR); + STVF(clutg[tj], sourceG); + STVF(clutb[tj], sourceB); } #endif @@ -3223,8 +3145,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer 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 ); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, clut2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, wiprof); } } @@ -3243,49 +3165,51 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // filling the pipette buffer by the content of the temp pipette buffers if (editImgFloat) { - editImgFloat->r (i, j) = editIFloatTmpR[ti * TS + tj]; - editImgFloat->g (i, j) = editIFloatTmpG[ti * TS + tj]; - editImgFloat->b (i, j) = editIFloatTmpB[ti * TS + tj]; + editImgFloat->r(i, j) = editIFloatTmpR[ti * TS + tj]; + editImgFloat->g(i, j) = editIFloatTmpG[ti * TS + tj]; + editImgFloat->b(i, j) = editIFloatTmpB[ti * TS + tj]; } else if (editWhatever) { - editWhatever->v (i, j) = editWhateverTmp[ti * TS + tj]; + editWhatever->v(i, j) = editWhateverTmp[ti * TS + tj]; } } } } + // ready, fill lab for (int i = istart, ti = 0; i < tH; i++, ti++) { Color::RGB2Lab(&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], &(lab->L[i][jstart]), &(lab->a[i][jstart]), &(lab->b[i][jstart]), toxyz, tW - jstart); } - if (hasColorToningLabGrid) { - colorToningLabGrid(lab, jstart, tW, istart, tH, false); - } + + // if (hasColorToningLabGrid) { + // colorToningLabGrid(lab, jstart, tW, istart, tH, false); + // } } else { // black & white // Auto channel mixer needs whole image, so we now copy to tmpImage and close the tiled processing for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { // filling the pipette buffer by the content of the temp pipette buffers if (editImgFloat) { - editImgFloat->r (i, j) = editIFloatTmpR[ti * TS + tj]; - editImgFloat->g (i, j) = editIFloatTmpG[ti * TS + tj]; - editImgFloat->b (i, j) = editIFloatTmpB[ti * TS + tj]; + editImgFloat->r(i, j) = editIFloatTmpR[ti * TS + tj]; + editImgFloat->g(i, j) = editIFloatTmpG[ti * TS + tj]; + editImgFloat->b(i, j) = editIFloatTmpB[ti * TS + tj]; } else if (editWhatever) { - editWhatever->v (i, j) = editWhateverTmp[ti * TS + tj]; + editWhatever->v(i, j) = editWhateverTmp[ti * TS + tj]; } - tmpImage->r (i, j) = rtemp[ti * TS + tj]; - tmpImage->g (i, j) = gtemp[ti * TS + tj]; - tmpImage->b (i, j) = btemp[ti * TS + tj]; + tmpImage->r(i, j) = rtemp[ti * TS + tj]; + tmpImage->g(i, j) = gtemp[ti * TS + tj]; + tmpImage->b(i, j) = btemp[ti * TS + tj]; } } } } if (editIFloatBuffer) { - free (editIFloatBuffer); + free(editIFloatBuffer); } if (editWhateverBuffer) { - free (editWhateverBuffer); + free(editWhateverBuffer); } #ifdef _OPENMP @@ -3317,9 +3241,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - nr += tmpImage->r (i, j); - ng += tmpImage->g (i, j); - nb += tmpImage->b (i, j); + nr += static_cast(tmpImage->r(i, j)); + ng += static_cast(tmpImage->g(i, j)); + nb += static_cast(tmpImage->b(i, j)); } } @@ -3328,9 +3252,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer double kng = srgb / ng; double knb = srgb / nb; double sk = knr + kng + knb; - autor = (float) (100.0 * knr / sk); - autog = (float) (100.0 * kng / sk); - autob = (float) (100.0 * knb / sk); + autor = (float)(100.0 * knr / sk); + autog = (float)(100.0 * kng / sk); + autob = (float)(100.0 * knb / sk); } @@ -3347,9 +3271,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } float filcor; - Color::computeBWMixerConstants (params->blackwhite.setting, params->blackwhite.filter, params->blackwhite.algo, filcor, - bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta, - params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm); + Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter, params->blackwhite.algo, filcor, + bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta, + params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) @@ -3359,13 +3283,13 @@ 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__ //gamma correction: pseudo TRC curve if (hasgammabw) { - Color::trcGammaBW (tmpImage->r (i, j), tmpImage->g (i, j), tmpImage->b (i, j), gammabwr, gammabwg, gammabwb); + Color::trcGammaBW(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), gammabwr, gammabwg, gammabwb); } #endif @@ -3375,7 +3299,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hasgammabw) { //gamma correction: pseudo TRC curve - Color::trcGammaBWRow (tmpImage->r (i), tmpImage->g (i), tmpImage->b (i), tW, gammabwr, gammabwg, gammabwb); + Color::trcGammaBWRow(tmpImage->r(i), tmpImage->g(i), tmpImage->b(i), tW, gammabwr, gammabwg, gammabwb); } #endif @@ -3389,7 +3313,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - editWhatever->v (i, j) = Color::gamma2curve[tmpImage->r (i, j)] / 65535.f; // assuming that r=g=b + editWhatever->v(i, j) = Color::gamma2curve[tmpImage->r(i, j)] / 65535.f; // assuming that r=g=b } } } @@ -3403,8 +3327,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurvebw2); - userToneCurve.Apply (tmpImage->r (i, j), tmpImage->g (i, j), tmpImage->b (i, j)); + const StandardToneCurve& userToneCurve = static_cast(customToneCurvebw2); + userToneCurve.Apply(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j)); } } } else if (afterCurveMode == BlackWhiteParams::TcMode::WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted @@ -3414,13 +3338,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { //for ulterior usage if bw data modified for (int j = 0; j < tW; j++) { - const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurvebw2); + const WeightedStdToneCurve& userToneCurve = static_cast(customToneCurvebw2); // tmpImage->r (i, j) = CLIP (tmpImage->r (i, j)); // tmpImage->g (i, j) = CLIP (tmpImage->g (i, j)); // tmpImage->b (i, j) = CLIP (tmpImage->b (i, j)); - userToneCurve.Apply (tmpImage->r (i, j), tmpImage->g (i, j), tmpImage->b (i, j)); + userToneCurve.Apply(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j)); } } } @@ -3437,9 +3361,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - const float r = tmpImage->r (i, j); - const float g = tmpImage->g (i, j); - const float b = tmpImage->b (i, j); + const float r = tmpImage->r(i, j); + const float g = tmpImage->g(i, j); + const float b = tmpImage->b(i, j); const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; @@ -3481,19 +3405,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer const float iphigh = ctColorCurve.high; //2 colours - ctColorCurve.getVal (iphigh, xh, yh, zh); - ctColorCurve.getVal (iplow, xl, yl, zl); + ctColorCurve.getVal(iphigh, xh, yh, zh); + ctColorCurve.getVal(iplow, xl, yl, zl); - Color::xyz2rgb (xh, yh, zh, rh, gh, bh, wip); - Color::xyz2rgb (xl, yl, zl, rl, gl, bl, wip); + Color::xyz2rgb(xh, yh, zh, rh, gh, bh, wip); + Color::xyz2rgb(xl, yl, zl, rl, gl, bl, wip); //retrieve rgb value with s and l =1 - retreavergb (rl, gl, bl); + retreavergb(rl, gl, bl); const float krl = rl / (rl + gl + bl); const float kgl = gl / (rl + gl + bl); const float kbl = bl / (rl + gl + bl); - retreavergb (rh, gh, bh); + retreavergb(rh, gh, bh); const float krh = rh / (rh + gh + bh); const float kgh = gh / (rh + gh + bh); const float kbh = bh / (rh + gh + bh); @@ -3511,17 +3435,17 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //colortoning with shift color Lab else if (params->colorToning.method == "Lab" && opautili) { - int algm = 0; + int algo = 0; bool twocol = true; int metchrom = 0; - if (params->colorToning.twocolor == "Std" ) { + if (params->colorToning.twocolor == "Std") { metchrom = 0; - } else if (params->colorToning.twocolor == "All" ) { + } else if (params->colorToning.twocolor == "All") { metchrom = 1; } else if (params->colorToning.twocolor == "Separ") { metchrom = 2; - } else if (params->colorToning.twocolor == "Two" ) { + } else if (params->colorToning.twocolor == "Two") { metchrom = 3; } @@ -3545,31 +3469,31 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer twoc = 1; // 500 colours } - if (params->colorToning.method == "Lab") { - algm = 1; + if (params->colorToning.method == "Lab") { + algo = 1; } else if (params->colorToning.method == "Lch") { - algm = 2; //in case of + algo = 2; //in case of } - if (algm <= 2) { + if (algo <= 2) { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); + float r = tmpImage->r(i, j); + float g = tmpImage->g(i, j); + 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); + labtoning(r, g, b, ro, go, bo, algo, metchrom, twoc, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, clToningcurve, cl2Toningcurve, iplow, iphigh, wp, wip); setUnlessOOG(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), ro, go, bo); } } } } - else if (params->colorToning.method.substr (0, 3) == "RGB" && opautili) { + else if (params->colorToning.method.substr(0, 3) == "RGB" && opautili) { // color toning #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) @@ -3636,18 +3560,15 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { Color::RGB2Lab(tmpImage->r(i), tmpImage->g(i), tmpImage->b(i), lab->L[i], lab->a[i], lab->b[i], toxyz, tW); - if (hasColorToningLabGrid) { - colorToningLabGrid(lab, 0, tW, i, i + 1, false); - } + + // if (hasColorToningLabGrid) { + // colorToningLabGrid(lab, 0, tW, i, i + 1, false); + // } } } - if (tmpImage) { - delete tmpImage; - } - if (hCurveEnabled) { delete hCurve; } @@ -3660,12 +3581,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer delete vCurve; } - shadowsHighlights(lab); - - if (params->localContrast.enabled) { - // Alberto's local contrast - localContrast(lab); - } } /** @@ -3674,10 +3589,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer * @param g green input and in exit new g * @param b blue input and in exit new b **/ -void ImProcFunctions::retreavergb (float &r, float &g, float &b) +void ImProcFunctions::retreavergb(float &r, float &g, float &b) { - float mini = min (r, g, b); - float maxi = max (r, g, b); + float mini = min(r, g, b); + float maxi = max(r, g, b); float kkm = 65535.f / maxi; if (b == mini && r == maxi) { @@ -3715,7 +3630,7 @@ void ImProcFunctions::retreavergb (float &r, float &g, float &b) * @param bb first degree parameter * @param cc third parameter **/ -void ImProcFunctions::secondeg_end (float reducac, float vinf, float &aa, float &bb, float &cc) +void ImProcFunctions::secondeg_end(float reducac, float vinf, float &aa, float &bb, float &cc) { float zrd = reducac; //value at me linear =0.5 float v0 = vinf; //max shadows @@ -3736,7 +3651,7 @@ void ImProcFunctions::secondeg_end (float reducac, float vinf, float &aa, float * @param aa second degree parameter * @param bb first degree parameter **/ -void ImProcFunctions::secondeg_begin (float reducac, float vend, float &aam, float &bbm) +void ImProcFunctions::secondeg_begin(float reducac, float vend, float &aam, float &bbm) { aam = (2.f - 4.f * reducac) / (vend * vend); bbm = 1.f / vend - aam * vend; @@ -3760,7 +3675,7 @@ void ImProcFunctions::secondeg_begin (float reducac, float vend, float &aam, flo * @param RedHigh [-1..1] value after transformations of sliders [-100..100] for highlights * @param GreenHigh [-1..1] value after transformations of sliders [-100..100] for highlights * @param BlueHigh [-1..1] value after transformations of sliders [-100..100] for highlights -* @param reducac value of the reduction in the middle of the range for second degree increse or decrease action +* @param reducac value of the reduction in the middle of the range for second degree increase or decrease action * @param mode 0 = colour, 1 = Black and White * @param strProtect ? **/ @@ -3781,17 +3696,18 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, if (v > v0) { float aa, bb, cc; - secondeg_end (reducac, v0, aa, bb, cc); + secondeg_end(reducac, v0, aa, bb, cc); kl = aa * v * v + bb * v + cc; //verified ==> exact } else { float aab, bbb; - secondeg_begin (0.7f, v0, aab, bbb); + secondeg_begin(0.7f, v0, aab, bbb); kl = aab * v * v + bbb * v; } } else { //bw coefficient to preserve same results as before for satlimtopacity = 0.5 (default) rlo = strProtect * 0.8f; //0.4 rlm = strProtect * 2.2f; //1.1 rlh = strProtect * 2.4f; //1.2 + if (v > 0.15f) { kl = (-1.f / 0.85f) * v + 1.f / 0.85f; //Low light ==> decrease action after v=0.15 } @@ -3850,12 +3766,12 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, if (v < v0m) { float aam, bbm; float vend = v0m; - secondeg_begin (reducac, vend, aam, bbm); + secondeg_begin(reducac, vend, aam, bbm); km = aam * v * v + bbm * v; //verification = good } else { float v0mm = 0.5f; //max float aamm, bbmm, ccmm; - secondeg_end (reducac, v0mm, aamm, bbmm, ccmm); + secondeg_end(reducac, v0mm, aamm, bbmm, ccmm); km = aamm * v * v + bbmm * v + ccmm; //verification good } @@ -3871,6 +3787,7 @@ 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); @@ -3888,6 +3805,7 @@ 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); @@ -3905,6 +3823,7 @@ 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); @@ -3913,9 +3832,10 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, //high tones constexpr float v00 = 0.8f; //max action float aa0, bb0; - secondeg_begin (reducac, v00, aa0, bb0); + secondeg_begin(reducac, v00, aa0, bb0); float kh; + if (v > v00) { //max action kh = (1.f - v) / (1.f - v00); //High tones } else { @@ -3984,7 +3904,7 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, * @param balanH [0..1] balance for highlights (same slider than for balanS) * @param reducac value of the reduction in the middle of the range for second degree, increase or decrease action **/ -void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float krl, float kgl, float kbl, float krh, float kgh, float kbh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect) +void ImProcFunctions::toning2col(float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float krl, float kgl, float kbl, float krh, float kgh, float kbh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect) { const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; const float v = max(r, g, b) / 65535.f; @@ -3996,22 +3916,25 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g //second degree float aa, bb, cc; //fixed value of reducac =0.4; - secondeg_end (reducac, iplow, aa, bb, cc); + secondeg_end(reducac, iplow, aa, bb, cc); float aab, bbb; - secondeg_begin (0.7f, iplow, aab, bbb); + secondeg_begin(0.7f, iplow, aab, bbb); if (SatLow > 0.f) { float kl = 1.f; + if (v > iplow) { kl = aa * v * v + bb * v + cc; } else if (mode == 0) { kl = aab * v * v + bbb * v; } + const float kmgb = min(r, g, b); + if (kmgb < 20000.f) { //I have tested ...0.85 compromise... - kl *= pow_F ((kmgb / 20000.f), 0.85f); + kl *= pow_F((kmgb / 20000.f), 0.85f); } const float factor = 20000.f * SatLow * kl * rlo * balanS; @@ -4044,10 +3967,11 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g //high tones float aa0, bb0; //fixed value of reducac ==0.4; - secondeg_begin (reducac, iphigh, aa0, bb0); + secondeg_begin(reducac, iphigh, aa0, bb0); if (SatHigh > 0.f) { float kh = 1.f; + if (v > iphigh) { kh = (1.f - v) / (1.f - iphigh); //Low light ==> decrease action after iplow } else { @@ -4055,11 +3979,13 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g } const float kmgb = max(r, g, b); + if (kmgb > 45535.f) { constexpr float cora = 1.f / (45535.f - 65535.f); constexpr float corb = 1.f - cora * 45535.f; kh *= kmgb * cora + corb; } + const float factor = 20000.f * SatHigh * kh * rlh * balanH; r += factor * (krh > 0.f ? krh : 0.f); g += factor * (kgh > 0.f ? kgh : 0.f); @@ -4071,6 +3997,7 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g } float preserv = 1.f; + if (preser == 1) { float lumafter = 0.299f * r + 0.587f * g + 0.114f * b; preserv = lumbefore / lumafter; @@ -4091,7 +4018,7 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g * @param iplow iphigh [0..1] luminance * @param wp wip 3x3 matrix and inverse conversion rgb XYZ **/ -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, const LUTf & clToningcurve, const LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] ) +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, const LUTf & clToningcurve, const LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3]) { ro = CLIP(r); go = CLIP(g); @@ -4099,7 +4026,7 @@ void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go float realL; float h, s, l; - Color::rgb2hsl (ro, go, bo, h, s, l); + Color::rgb2hsl(ro, go, bo, h, s, l); float x2, y2, z2; float xl, yl, zl; @@ -4110,10 +4037,10 @@ void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go } if (twoc == 1) { - ctColorCurve.getVal (l, x2, y2, z2); + ctColorCurve.getVal(l, x2, y2, z2); } else { - ctColorCurve.getVal (iphigh, x2, y2, z2); - ctColorCurve.getVal (iplow, xl, yl, zl); + ctColorCurve.getVal(iphigh, x2, y2, z2); + ctColorCurve.getVal(iplow, xl, yl, zl); } realL = l; @@ -4143,14 +4070,14 @@ void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go } if (algm == 1) { - Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo); + Color::interpolateRGBColor(realL, iplow, iphigh, algm, opacity, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo); } else { - Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity2, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo); + Color::interpolateRGBColor(realL, iplow, iphigh, algm, opacity2, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo); } } -void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, const LUTf& curve) +void ImProcFunctions::luminanceCurve(LabImage* lold, LabImage* lnew, const LUTf& curve) { int W = lold->W; @@ -4170,9 +4097,8 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, const LUTf -void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, const LUTf& acurve, const LUTf& bcurve, const LUTf& satcurve, const LUTf& lhskcurve, const 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, const LUTf& acurve, const LUTf& bcurve, const LUTf& satcurve, const LUTf& lhskcurve, const LUTf& clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) { - int W = lold->W; int H = lold->H; @@ -4185,7 +4111,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW if (editID != EUID_None) { - switch (pipetteBuffer->getDataProvider()->getCurrSubscriber()->getPipetteBufferType()) { + switch (pipetteBuffer->getDataProvider()->getCurrSubscriber()->getPipetteBufferType()) { case (BT_IMAGEFLOAT): break; @@ -4206,7 +4132,8 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW // !params->labCurve.enabled. It is ugly, but it's the smallest code // change that I could find //------------------------------------------------------------------------- - class TempParams { + class TempParams + { const ProcParams **p_; const ProcParams *old_; ProcParams tmp_; @@ -4228,11 +4155,13 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW 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(); } + //------------------------------------------------------------------------- @@ -4241,6 +4170,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW // 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) { @@ -4248,6 +4178,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } } } + return; } @@ -4259,7 +4190,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW bool chutili = false; if (params->labCurve.chromaticity > -100) { - chCurve = new FlatCurve (params->labCurve.chcurve); + chCurve = new FlatCurve(params->labCurve.chcurve); if (chCurve->isIdentity()) { delete chCurve; @@ -4274,7 +4205,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW bool lhutili = false; if (params->labCurve.chromaticity > -100) { - lhCurve = new FlatCurve (params->labCurve.lhcurve); + lhCurve = new FlatCurve(params->labCurve.lhcurve); if (lhCurve->isIdentity()) { delete lhCurve; @@ -4289,7 +4220,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW bool hhutili = false; if (params->labCurve.chromaticity > -100) { - hhCurve = new FlatCurve (params->labCurve.hhcurve); + hhCurve = new FlatCurve(params->labCurve.hhcurve); if (hhCurve->isIdentity()) { delete hhCurve; @@ -4301,22 +4232,12 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } - 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; - t1e.set(); - // init variables to display Munsell corrections - MunsellDebugInfo* MunsDebugInfo = new MunsellDebugInfo(); -#endif - float adjustr = 1.0f; // if(params->labCurve.avoidclip ){ // parameter to adapt curve C=f(C) to gamut - if (params->icm.workingProfile == "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.workingProfile == "Adobe RGB") { adjustr = 1.8f; @@ -4332,6 +4253,9 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW adjustr = 1.8f; } + const float histLFactor = pW != 1 ? histLCurve.getSize() / 100.f : 1.f; + const float histCFactor = pW != 1 ? histCCurve.getSize() * adjustr / 65536.f : 1.f; + // reference to the params structure has to be done outside of the parallelization to avoid CPU cache problem const bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated const int chromaticity = params->labCurve.chromaticity; @@ -4347,62 +4271,57 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW const bool clut = clcutili; const double rstprotection = 100. - params->labCurve.rstprotection; // Red and Skin Tones Protection // avoid color shift is disabled when bwToning is activated and enabled if gamut is true in colorappearanace - const bool avoidColorShift = (params->labCurve.avoidcolorshift || (params->colorappearance.gamut && params->colorappearance.enabled)) && !bwToning ; + // const bool avoidColorShift = (params->labCurve.avoidcolorshift || (params->colorappearance.gamut && params->colorappearance.enabled)) && !bwToning ; + //const bool avoidColorS = params->labCurve.avoidcolorshift; + int gamutmuns = 0; + + if (params->labCurve.gamutmunselmethod == "NONE") { + gamutmuns = 0; + } else if (params->labCurve.gamutmunselmethod == "LAB") { + gamutmuns = 1; + } else if (params->labCurve.gamutmunselmethod == "XYZ") { + gamutmuns = 2; + } else if (params->labCurve.gamutmunselmethod == "XYZREL") { + gamutmuns = 3; + } else if (params->labCurve.gamutmunselmethod == "MUN") { + gamutmuns = 4; + } + const float protectRed = (float)settings->protectred; const double protectRedH = settings->protectredh; - float protect_red, protect_redh; - protect_red = protectRed;//default=60 chroma: one can put more or less if necessary...in 'option' 40...160 + const float protect_red = rtengine::LIM(protectRed, 20.f, 180.f); //default=60 chroma: one can put more or less if necessary...in 'option' 40...160 - if (protect_red < 20.0f) { - protect_red = 20.0; // avoid too low value - } + // default=0.4 rad : one can put more or less if necessary...in 'option' 0.2 ..1.0 + // avoid divide by 0 and negatives values + // avoid too big values + const float protect_redh = rtengine::LIM(protectRedH, 0.1f, 1.f); - if (protect_red > 180.0f) { - protect_red = 180.0; // avoid too high value - } - - protect_redh = float (protectRedH); //default=0.4 rad : one can put more or less if necessary...in 'option' 0.2 ..1.0 - - if (protect_redh < 0.1f) { - protect_redh = 0.1f; //avoid divide by 0 and negatives values - } - - if (protect_redh > 1.0f) { - protect_redh = 1.0f; //avoid too big values - } - - float protect_redhcur = protectRedH;//default=0.4 rad : one can put more or less if necessary...in 'option' 0.2 ..1 - - if (protect_redhcur < 0.1f) { - protect_redhcur = 0.1f; //avoid divide by 0 and negatives values:minimal protection for transition - } - - if (protect_redhcur > 3.5f) { - protect_redhcur = 3.5f; //avoid too big values - } + // default=0.4 rad : one can put more or less if necessary...in 'option' 0.2 ..1 + // avoid divide by 0 and negatives values:minimal protection for transition + // avoid too big values + const float protect_redhcurg = rtengine::LIM(protectRedH, 0.1f, 3.5f); //increase saturation after denoise : ...approximation float factnoise = 1.f; if (params->dirpyrDenoise.enabled) { - factnoise = (1.f + params->dirpyrDenoise.chroma / 500.f); //levels=5 -// if(yyyy) factnoise=(1.f+params->dirpyrDenoise.chroma/100.f);//levels=7 + factnoise = 1.0 + params->dirpyrDenoise.chroma / 500.0; //levels=5 } const float scaleConst = 100.0f / 100.1f; - const bool gamutLch = settings->gamutLch; + //const bool gamutLch = settings->gamutLch; const float amountchroma = (float) settings->amchroma; - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); + 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.workingProfile); + 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]}, @@ -4410,11 +4329,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW }; #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__ @@ -4426,31 +4341,31 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW #endif for (int i = 0; i < H; i++) { - if (avoidColorShift) + // if (avoidColorShift) - // only if user activate Lab adjustments - if (autili || butili || ccutili || cclutili || chutili || lhutili || hhutili || clcutili || utili || chromaticity) { - Color::LabGamutMunsell (lold->L[i], lold->a[i], lold->b[i], W, /*corMunsell*/true, /*lumaMuns*/false, params->toneCurve.hrenabled, /*gamut*/true, wip); - } + // only if user activate Lab adjustments + // if (autili || butili || ccutili || cclutili || chutili || lhutili || hhutili || clcutili || utili || chromaticity) { + // Color::LabGamutMunsell(lold->L[i], lold->a[i], lold->b[i], W, /*corMunsell*/true, /*lumaMuns*/false, params->toneCurve.hrenabled, /*gamut*/true, wip); + // } #ifdef __SSE2__ // precalculate some values using SSE if (bwToning || (!autili && !butili)) { - __m128 c327d68v = _mm_set1_ps (327.68f); + __m128 c327d68v = _mm_set1_ps(327.68f); __m128 av, bv; int k; for (k = 0; k < W - 3; k += 4) { - av = LVFU (lold->a[i][k]); - bv = LVFU (lold->b[i][k]); - STVF (HHBuffer[k], xatan2f (bv, av)); - STVF (CCBuffer[k], vsqrtf (SQRV (av) + SQRV (bv)) / c327d68v); + av = LVFU(lold->a[i][k]); + bv = LVFU(lold->b[i][k]); + STVF(HHBuffer[k], xatan2f(bv, av)); + STVF(CCBuffer[k], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); } for (; k < W; k++) { - HHBuffer[k] = xatan2f (lold->b[i][k], lold->a[i][k]); - CCBuffer[k] = sqrt (SQR (lold->a[i][k]) + SQR (lold->b[i][k])) / 327.68f; + HHBuffer[k] = xatan2f(lold->b[i][k], lold->a[i][k]); + CCBuffer[k] = sqrt(SQR(lold->a[i][k]) + SQR(lold->b[i][k])) / 327.68f; } } @@ -4472,8 +4387,8 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW HH = HHBuffer[j]; CC = CCBuffer[j]; #else - HH = xatan2f (lold->b[i][j], lold->a[i][j]); - CC = sqrt (SQR (lold->a[i][j]) + SQR (lold->b[i][j])) / 327.68f; + HH = xatan2f(lold->b[i][j], lold->a[i][j]); + CC = sqrt(SQR(lold->a[i][j]) + SQR(lold->b[i][j])) / 327.68f; #endif // According to mathematical laws we can get the sin and cos of HH by simple operations @@ -4491,7 +4406,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } if (editPipette && editID == EUID_Lab_LCurve) { - editWhatever->v (i, j) = LIM01 (Lin / 32768.0f); // Lab L pipette + editWhatever->v(i, j) = LIM01 (Lin / 32768.0f); // Lab L pipette } lnew->L[i][j] = curve[Lin]; @@ -4500,11 +4415,11 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW if (editPipette) { if (editID == EUID_Lab_aCurve) { // Lab a pipette - float chromapipa = lold->a[i][j] + (32768.f * 1.28f); - editWhatever->v (i, j) = LIM01 ((chromapipa) / (65536.f * 1.28f)); + float chromapipa = lold->a[i][j] + 32768.f; + editWhatever->v(i, j) = LIM01 ((chromapipa) / (65536.f)); } else if (editID == EUID_Lab_bCurve) { //Lab b pipette - float chromapipb = lold->b[i][j] + (32768.f * 1.28f); - editWhatever->v (i, j) = LIM01 ((chromapipb) / (65536.f * 1.28f)); + float chromapipb = lold->b[i][j] + 32768.f; + editWhatever->v(i, j) = LIM01 ((chromapipb) / (65536.f)); } } @@ -4529,13 +4444,13 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW HH = HHBuffer[j]; CC = CCBuffer[j]; } else { - CC = sqrt (SQR (atmp) + SQR (btmp)) / 327.68f; - HH = xatan2f (btmp, atmp); + CC = sqrt(SQR(atmp) + SQR(btmp)) / 327.68f; + HH = xatan2f(btmp, atmp); } #else - CC = sqrt (SQR (atmp) + SQR (btmp)) / 327.68f; - HH = xatan2f (btmp, atmp); + CC = sqrt(SQR(atmp) + SQR(btmp)) / 327.68f; + HH = xatan2f(btmp, atmp); #endif // According to mathematical laws we can get the sin and cos of HH by simple operations @@ -4555,8 +4470,8 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW if (editPipette) if (editID == EUID_Lab_LHCurve || editID == EUID_Lab_CHCurve || editID == EUID_Lab_HHCurve) {//H pipette - float valpar = Color::huelab_to_huehsv2 (HH); - editWhatever->v (i, j) = valpar; + float valpar = Color::huelab_to_huehsv2(HH); + editWhatever->v(i, j) = valpar; } if (lhutili) { // L=f(H) @@ -4564,7 +4479,9 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW float l_r;//Luminance Lab in 0..1 l_r = Lprov1 / 100.f; { - float valparam = float ((lhCurve->getVal (Color::huelab_to_huehsv2 (HH)) - 0.5f)); //get l_r=f(H) + float valparam = lhCurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5; //get l_r=f(H) + //float valparam = float ((lhCurve->getVal (hr - 0.5f)*2));//get l_r=f(H) + float valparamneg; valparamneg = valparam; float kcc = (CC / amountchroma); //take Chroma into account...40 "middle low" of chromaticity (arbitrary and simple), one can imagine other algorithme @@ -4573,7 +4490,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW valparamneg *= kcc; //slightly different for negative if (valparam > 0.f) { - l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR (((SQR (1.f - min (l_r, 1.0f)))))); + l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - min(l_r, 1.0f)))))); } else //for negative { @@ -4584,7 +4501,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW Lprov1 = l_r * 100.f; - float Chprov2 = sqrt (SQR (atmp) + SQR (btmp)) / 327.68f; + float Chprov2 = sqrt(SQR(atmp) + SQR(btmp)) / 327.68f; //Gamut control especially for negative values slightly different from gamutlchonly bool inRGB; @@ -4593,15 +4510,15 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW float aprov1 = Chprov2 * sincosval.y; float bprov1 = Chprov2 * sincosval.x; - float fy = (Color::c1By116 * Lprov1 ) + Color::c16By116; + float fy = (Color::c1By116 * Lprov1) + Color::c16By116; float fx = (0.002f * aprov1) + fy; float fz = fy - (0.005f * bprov1); - float x_ = 65535.0f * Color::f2xyz (fx) * Color::D50x; - float z_ = 65535.0f * Color::f2xyz (fz) * Color::D50z; - float y_ = (Lprov1 > Color::epskap) ? 65535.0 * fy * fy * fy : 65535.0 * Lprov1 / Color::kappa; + float x_ = 65535.f * Color::f2xyz(fx) * Color::D50x; + float z_ = 65535.f * Color::f2xyz(fz) * Color::D50z; + float y_ = Lprov1 > Color::epskapf ? 65535.f * fy * fy * fy : 65535.f * Lprov1 / Color::kappaf; float R, G, B; - Color::xyz2rgb (x_, y_, z_, R, G, B, wip); + Color::xyz2rgb(x_, y_, z_, R, G, B, wip); if (R < 0.0f || G < 0.0f || B < 0.0f) { if (Lprov1 < 0.1f) { @@ -4626,8 +4543,9 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW // calculate C=f(H) if (chutili) { - double hr = Color::huelab_to_huehsv2 (HH); - float chparam = float ((chCurve->getVal (hr) - 0.5f) * 2.0f); //get C=f(H) + double hr = Color::huelab_to_huehsv2(HH); + float chparam = (chCurve->getVal(hr) - 0.5) * 2.0; //get C=f(H) + float chromaChfactor = 1.0f + chparam; atmp *= chromaChfactor;//apply C=f(H) btmp *= chromaChfactor; @@ -4635,32 +4553,32 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW if (hhutili) { // H=f(H) //hue Lab in -PI +PI - float valparam = float ((hhCurve->getVal (Color::huelab_to_huehsv2 (HH)) - 0.5f) * 1.7f) + HH; //get H=f(H) 1.7 optimisation ! + float valparam = (hhCurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5) * 1.7 + static_cast(HH); //get H=f(H) 1.7 optimisation ! HH = valparam; - sincosval = xsincosf (HH); + sincosval = xsincosf(HH); } if (!bwToning) { - float factorskin, factorsat, factorskinext; + float factorskinc, factorsatc, factorskinextc; if (chromapro > 1.f) { float scale = scaleConst;//reduction in normal zone float scaleext = 1.f;//reduction in transition zone - Color::scalered ( rstprotection, chromapro, 0.0, HH, protect_redh, scale, scaleext);//1.0 + Color::scalered(rstprotection, chromapro, 0.0, HH, protect_redh, scale, scaleext); //1.0 float interm = (chromapro - 1.f); - factorskin = 1.f + (interm * scale); - factorskinext = 1.f + (interm * scaleext); + factorskinc = 1.f + (interm * scale); + factorskinextc = 1.f + (interm * scaleext); } else { - factorskin = chromapro ; // +(chromapro)*scale; - factorskinext = chromapro ;// +(chromapro)*scaleext; + factorskinc = chromapro ; // +(chromapro)*scale; + factorskinextc = chromapro ;// +(chromapro)*scaleext; } - factorsat = chromapro * factnoise; + factorsatc = chromapro * factnoise; //simulate very approximative gamut f(L) : with pyramid transition float dred /*=55.f*/;//C red value limit - if (Lprov1 < 25.f) { + if (Lprov1 < 25.f) { dred = 40.f; } else if (Lprov1 < 30.f) { dred = 3.f * Lprov1 - 35.f; @@ -4675,12 +4593,12 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW // end pyramid // Test if chroma is in the normal range first - Color::transitred ( HH, Chprov1, dred, factorskin, protect_red, factorskinext, protect_redh, factorsat, factorsat); - atmp *= factorsat; - btmp *= factorsat; + Color::transitred(HH, Chprov1, dred, factorskinc, protect_red, factorskinextc, protect_redh, factorsatc, factorsatc); + atmp *= factorsatc; + btmp *= factorsatc; if (editPipette && editID == EUID_Lab_CLCurve) { - editWhatever->v (i, j) = LIM01 (LL / 100.f); // Lab C=f(L) pipette + editWhatever->v(i, j) = LIM01 (LL / 100.f); // Lab C=f(L) pipette } if (clut && LL > 0.f) { // begin C=f(L) @@ -4713,11 +4631,11 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW deltaHH = protect_redhcur; //transition hue - if (chromaCfactor > 0.0) { - Color::scalered ( rstprotection, chromaCfactor, 0.0, HH, deltaHH, scale, scaleext); //1.0 + if (chromaCfactor > 0.f) { + Color::scalered(rstprotection, chromaCfactor, 0.0, HH, deltaHH, scale, scaleext); //1.0 } - if (chromaCfactor > 1.0) { + if (chromaCfactor > 1.f) { float interm = (chromaCfactor - 1.0f) * 100.0f; factorskin = 1.0f + (interm * scale) / 100.0f; factorskinext = 1.0f + (interm * scaleext) / 100.0f; @@ -4728,7 +4646,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW factorsat = chromaCfactor; factor = factorsat; - Color::transitred ( HH, Chprov1, dred, factorskin, protect_redcur, factorskinext, deltaHH, factorsat, factor); + Color::transitred(HH, Chprov1, dred, factorskin, protect_redcur, factorskinext, deltaHH, factorsat, 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)); } @@ -4739,13 +4657,13 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW // I have placed C=f(C) after all C treatments to assure maximum amplitude of "C" if (editPipette && editID == EUID_Lab_CCurve) { - float chromapip = sqrt (SQR (atmp) + SQR (btmp) + 0.001f); - editWhatever->v (i, j) = LIM01 ((chromapip) / (48000.f)); + float chromapip = sqrt(SQR(atmp) + SQR(btmp) + 0.001f); + editWhatever->v(i, j) = LIM01 ((chromapip) / (65536.f / adjustr)); }//Lab C=f(C) pipette if (ccut) { float factorskin, factorsat, factor, factorskinext; - float chroma = sqrt (SQR (atmp) + SQR (btmp) + 0.001f); + float chroma = sqrt(SQR(atmp) + SQR(btmp) + 0.001f); float chromaCfactor = (satcurve[chroma * adjustr]) / (chroma * adjustr); //apply C=f(C) float curf = 0.7f; //empirical coeff because curve is more progressive float scale = 100.0f / 100.1f; //reduction in normal zone for curve CC @@ -4774,11 +4692,11 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW deltaHH = protect_redhcur; //transition hue - if (chromaCfactor > 0.0) { - Color::scalered ( rstprotection, chromaCfactor, 0.0, HH, deltaHH, scale, scaleext); //1.0 + if (chromaCfactor > 0.f) { + Color::scalered(rstprotection, chromaCfactor, 0.0, HH, deltaHH, scale, scaleext); //1.0 } - if (chromaCfactor > 1.0) { + if (chromaCfactor > 1.f) { float interm = (chromaCfactor - 1.0f) * 100.0f; factorskin = 1.0f + (interm * scale) / 100.0f; factorskinext = 1.0f + (interm * scaleext) / 100.0f; @@ -4792,7 +4710,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW factorsat = chromaCfactor; factor = factorsat; - Color::transitred ( HH, Chprov1, dred, factorskin, protect_redcur, factorskinext, deltaHH, factorsat, factor); + Color::transitred(HH, Chprov1, dred, factorskin, protect_redcur, factorskinext, deltaHH, factorsat, factor); atmp *= factor; btmp *= factor; } @@ -4806,8 +4724,8 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } if (editPipette && editID == EUID_Lab_LCCurve) { - float chromapiplc = sqrt (SQR (atmp) + SQR (btmp) + 0.001f); - editWhatever->v (i, j) = LIM01 ((chromapiplc) / (48000.f)); + float chromapiplc = sqrt(SQR(atmp) + SQR(btmp) + 0.001f); + editWhatever->v(i, j) = LIM01 ((chromapiplc) / (65536.f / adjustr)); }//Lab L=f(C) pipette @@ -4816,7 +4734,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW const float xx = 0.25f; //soft : between 0.2 and 0.4 float skdeltaHH; - skdeltaHH = protect_redhcur; //transition hue + skdeltaHH = protect_redhcurg; //transition hue float skbeg = -0.05f; //begin hue skin float skend = 1.60f; //end hue skin @@ -4826,7 +4744,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW float yy = 0.0f; if (Chprov1 < chrmin) { - yy = SQR (Chprov1 / chrmin) * xx; + yy = SQR(Chprov1 / chrmin) * xx; } else { yy = xx; //avoid artifact for low C } @@ -4837,7 +4755,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW skdeltaHH = 0.001f; } - if (HH > skbeg && HH < skend ) { + if (HH > skbeg && HH < skend) { zz = yy; } else if (HH > skbeg - skdeltaHH && HH <= skbeg) { //transition aa = yy / skdeltaHH; @@ -4849,7 +4767,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW zz = aa * HH + bb; } - float chroma = sqrt (SQR (atmp) + SQR (btmp) + 0.001f); + float chroma = sqrt(SQR(atmp) + SQR(btmp) + 0.001f); float Lc = (lhskcurve[chroma * adjustr]) / (chroma * adjustr); //apply L=f(C) Lc = (Lc - 1.0f) * zz + 1.0f; //reduct action Lprov1 *= Lc; //adjust luminance @@ -4860,7 +4778,7 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW histLCurve[Lprov1 * histLFactor]++; } - Chprov1 = sqrt (SQR (atmp) + SQR (btmp)) / 327.68f; + Chprov1 = sqrt(SQR(atmp) + SQR(btmp)) / 327.68f; // labCurve.bwtoning option allows to decouple modulation of a & b curves by saturation // with bwtoning enabled the net effect of a & b curves is visible @@ -4869,48 +4787,67 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW btmp -= lold->b[i][j]; } - if (avoidColorShift) { - //gamutmap Lch ==> preserve Hue,but a little slower than gamutbdy for high values...and little faster for low values - if (gamutLch) { - float R, G, B; + lnew->L[i][j] = Lprov1 * 327.68f; + lnew->a[i][j] = 327.68f * Chprov1 * sincosval.y; + lnew->b[i][j] = 327.68f * Chprov1 * sincosval.x; -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, sincosval, 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, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f); -#endif - lnew->L[i][j] = Lprov1 * 327.68f; -// float2 sincosval = xsincosf(HH); - lnew->a[i][j] = 327.68f * Chprov1 * sincosval.y; - lnew->b[i][j] = 327.68f * Chprov1 * sincosval.x; - } else { - //use gamutbdy - //Luv limiter - float Y, u, v; - Color::Lab2Yuv (lnew->L[i][j], atmp, btmp, Y, u, v); - //Yuv2Lab includes gamut restriction map - Color::Yuv2Lab (Y, u, v, lnew->L[i][j], lnew->a[i][j], lnew->b[i][j], wp); + //gamutmap Lch ==> preserve Hue,but a little slower than gamutbdy for high values...and little faster for low values + if (gamutmuns == 1) { + float R, G, B; + //gamut control : Lab values are in gamut + Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f); + lnew->L[i][j] = Lprov1 * 327.68f; + lnew->a[i][j] = 327.68f * Chprov1 * sincosval.y; + lnew->b[i][j] = 327.68f * Chprov1 * sincosval.x; + } + + if (gamutmuns == 2 || gamutmuns == 3) { + + float xg, yg, zg; + Color::Lab2XYZ(lnew->L[i][j], atmp, btmp, xg, yg, zg); + float x0 = xg; + float y0 = yg; + float z0 = zg; + + Color::gamutmap(xg, yg, zg, wp); + + if (gamutmuns == 3) {//0.5f arbitrary coeff + xg = xg + 0.5f * (x0 - xg); + yg = yg + 0.5f * (y0 - yg); + zg = zg + 0.5f * (z0 - zg); } + float Lag, aag2, bbg2; + Color::XYZ2Lab(xg, yg, zg, Lag, aag2, bbg2); + Lprov1 = Lag / 327.68f; + HH = xatan2f(bbg2, aag2); + Chprov1 = std::sqrt(SQR(aag2) + SQR(bbg2)) / 327.68f; + + if (Chprov1 == 0.0f) { + sincosval.y = 1.f; + sincosval.x = 0.0f; + } else { + sincosval.y = aag2 / (Chprov1 * 327.68f); + sincosval.x = bbg2 / (Chprov1 * 327.68f); + } + + lnew->L[i][j] = Lprov1 * 327.68f; + lnew->a[i][j] = 327.68f * Chprov1 * sincosval.y; + lnew->b[i][j] = 327.68f * Chprov1 * sincosval.x; + + } + + if (gamutmuns > 0) { if (utili || autili || butili || ccut || clut || cclutili || chutili || lhutili || hhutili || clcutili || chromaticity) { float correctionHue = 0.f; // Munsell's correction float correctlum = 0.f; Lprov1 = lnew->L[i][j] / 327.68f; - Chprov = sqrt (SQR (lnew->a[i][j]) + SQR (lnew->b[i][j])) / 327.68f; - -#ifdef _DEBUG - Color::AllMunsellLch (/*lumaMuns*/true, Lprov1, LL, HH, Chprov, memChprov, correctionHue, correctlum, MunsDebugInfo); -#else - Color::AllMunsellLch (/*lumaMuns*/true, Lprov1, LL, HH, Chprov, memChprov, correctionHue, correctlum); -#endif + Chprov = sqrt(SQR(lnew->a[i][j]) + SQR(lnew->b[i][j])) / 327.68f; + Color::AllMunsellLch(/*lumaMuns*/true, Lprov1, LL, HH, Chprov, memChprov, correctionHue, correctlum); if (correctionHue != 0.f || correctlum != 0.f) { - if (fabs (correctionHue) < 0.015f) { + if (fabs(correctionHue) < 0.015f) { HH += correctlum; // correct only if correct Munsell chroma very little. } @@ -4920,13 +4857,16 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW else if(fabs(correctionHue) < 0.1f) HH+=0.35f*correctlum; else if(fabs(correctionHue) < 0.015f) HH+=correctlum; // correct only if correct Munsell chroma very little. */ - sincosval = xsincosf (HH + correctionHue); + sincosval = xsincosf(HH + correctionHue); } lnew->a[i][j] = 327.68f * Chprov * sincosval.y; // apply Munsell lnew->b[i][j] = 327.68f * Chprov * sincosval.x; } - } else { + } + + if (gamutmuns == 0) { + // if(Lprov1 > maxlp) maxlp=Lprov1; // if(Lprov1 < minlp) minlp=Lprov1; if (!bwToning) { @@ -4944,18 +4884,6 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW } } // end of parallelization -#ifdef _DEBUG - - if (settings->verbose) { - t2e.set(); - printf ("Color::AllMunsellLch (correction performed in %d usec):\n", t2e.etime (t1e)); - printf (" Munsell chrominance: MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad dep=%u\n", MunsDebugInfo->maxdhue[0], MunsDebugInfo->maxdhue[1], MunsDebugInfo->maxdhue[2], MunsDebugInfo->maxdhue[3], MunsDebugInfo->depass); - printf (" Munsell luminance : MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad dep=%u\n", MunsDebugInfo->maxdhuelum[0], MunsDebugInfo->maxdhuelum[1], MunsDebugInfo->maxdhuelum[2], MunsDebugInfo->maxdhuelum[3], MunsDebugInfo->depassLum); - } - - delete MunsDebugInfo; -#endif - if (chCurve) { delete chCurve; } @@ -4978,181 +4906,182 @@ void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW //void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) //{ - /* LUT cmultiplier(181021); +/* LUT cmultiplier(181021); - double boost_a = ((float)params->colorBoost.amount + 100.0) / 100.0; - double boost_b = ((float)params->colorBoost.amount + 100.0) / 100.0; + double boost_a = ((float)params->colorBoost.amount + 100.0) / 100.0; + double boost_b = ((float)params->colorBoost.amount + 100.0) / 100.0; - double c, amul = 1.0, bmul = 1.0; - if (boost_a > boost_b) { - c = boost_a; - if (boost_a > 0) - bmul = boost_b / boost_a; - } - else { - c = boost_b; - if (boost_b > 0) - amul = boost_a / boost_b; + double c, amul = 1.0, bmul = 1.0; + if (boost_a > boost_b) { + c = boost_a; + if (boost_a > 0) + bmul = boost_b / boost_a; + } + else { + c = boost_b; + if (boost_b > 0) + amul = boost_a / boost_b; + } + + if (params->colorBoost.enable_saturationlimiter && c>1.0) { + // re-generate color multiplier lookup table + double d = params->colorBoost.saturationlimit / 3.0; + double alpha = 0.5; + double threshold1 = alpha * d; + double threshold2 = c*d*(alpha+1.0) - d; + for (int i=0; i<=181020; i++) { // lookup table stores multipliers with a 0.25 chrominance resolution + double chrominance = (double)i/4.0; + if (chrominance < threshold1) + cmultiplier[i] = c; + else if (chrominance < d) + cmultiplier[i] = (c / (2.0*d*(alpha-1.0)) * (chrominance-d)*(chrominance-d) + c*d/2.0 * (alpha+1.0) ) / chrominance; + else if (chrominance < threshold2) + cmultiplier[i] = (1.0 / (2.0*d*(c*(alpha+1.0)-2.0)) * (chrominance-d)*(chrominance-d) + c*d/2.0 * (alpha+1.0) ) / chrominance; + else + cmultiplier[i] = 1.0; } + } - if (params->colorBoost.enable_saturationlimiter && c>1.0) { - // re-generate color multiplier lookup table - double d = params->colorBoost.saturationlimit / 3.0; - double alpha = 0.5; - double threshold1 = alpha * d; - double threshold2 = c*d*(alpha+1.0) - d; - for (int i=0; i<=181020; i++) { // lookup table stores multipliers with a 0.25 chrominance resolution - double chrominance = (double)i/4.0; - if (chrominance < threshold1) - cmultiplier[i] = c; - else if (chrominance < d) - cmultiplier[i] = (c / (2.0*d*(alpha-1.0)) * (chrominance-d)*(chrominance-d) + c*d/2.0 * (alpha+1.0) ) / chrominance; - else if (chrominance < threshold2) - cmultiplier[i] = (1.0 / (2.0*d*(c*(alpha+1.0)-2.0)) * (chrominance-d)*(chrominance-d) + c*d/2.0 * (alpha+1.0) ) / chrominance; - else - cmultiplier[i] = 1.0; + float eps = 0.001; + double shift_a = params->colorShift.a + eps, shift_b = params->colorShift.b + eps; + + float** oa = lold->a; + float** ob = lold->b; + + #pragma omp parallel for if (multiThread) + for (int i=0; iH; i++) + for (int j=0; jW; j++) { + + double wanted_c = c; + if (params->colorBoost.enable_saturationlimiter && c>1) { + float chroma = (float)(4.0 * sqrt((oa[i][j]+shift_a)*(oa[i][j]+shift_a) + (ob[i][j]+shift_b)*(ob[i][j]+shift_b))); + wanted_c = cmultiplier [chroma]; } - } - float eps = 0.001; - double shift_a = params->colorShift.a + eps, shift_b = params->colorShift.b + eps; - - float** oa = lold->a; - float** ob = lold->b; - - #pragma omp parallel for if (multiThread) - for (int i=0; iH; i++) - for (int j=0; jW; j++) { - - double wanted_c = c; - if (params->colorBoost.enable_saturationlimiter && c>1) { - float chroma = (float)(4.0 * sqrt((oa[i][j]+shift_a)*(oa[i][j]+shift_a) + (ob[i][j]+shift_b)*(ob[i][j]+shift_b))); - wanted_c = cmultiplier [chroma]; + double real_c = wanted_c; + if (wanted_c >= 1.0 && params->colorBoost.avoidclip) { + double cclip = 100000.0; + double cr = tightestroot ((double)lnew->L[i][j]/655.35, (double)(oa[i][j]+shift_a)*amul, (double)(ob[i][j]+shift_b)*bmul, 3.079935, -1.5371515, -0.54278342); + double cg = tightestroot ((double)lnew->L[i][j]/655.35, (double)(oa[i][j]+shift_a)*amul, (double)(ob[i][j]+shift_b)*bmul, -0.92123418, 1.87599, 0.04524418); + double cb = tightestroot ((double)lnew->L[i][j]/655.35, (double)(oa[i][j]+shift_a)*amul, (double)(ob[i][j]+shift_b)*bmul, 0.052889682, -0.20404134, 1.15115166); + if (cr>1.0 && cr1.0 && cg1.0 && cb= 1.0 && params->colorBoost.avoidclip) { - double cclip = 100000.0; - double cr = tightestroot ((double)lnew->L[i][j]/655.35, (double)(oa[i][j]+shift_a)*amul, (double)(ob[i][j]+shift_b)*bmul, 3.079935, -1.5371515, -0.54278342); - double cg = tightestroot ((double)lnew->L[i][j]/655.35, (double)(oa[i][j]+shift_a)*amul, (double)(ob[i][j]+shift_b)*bmul, -0.92123418, 1.87599, 0.04524418); - double cb = tightestroot ((double)lnew->L[i][j]/655.35, (double)(oa[i][j]+shift_a)*amul, (double)(ob[i][j]+shift_b)*bmul, 0.052889682, -0.20404134, 1.15115166); - if (cr>1.0 && cr1.0 && cg1.0 && cba[i][j] = LIM(nna,-32000.0f,32000.0f); - lnew->b[i][j] = LIM(nnb,-32000.0f,32000.0f); } - */ - //delete [] cmultiplier; + + float nna = ((oa[i][j]+shift_a) * real_c * amul); + float nnb = ((ob[i][j]+shift_b) * real_c * bmul); + lnew->a[i][j] = LIM(nna,-32000.0f,32000.0f); + lnew->b[i][j] = LIM(nnb,-32000.0f,32000.0f); + } +*/ +//delete [] cmultiplier; //} -void ImProcFunctions::impulsedenoise (LabImage* lab) +void ImProcFunctions::impulsedenoise(LabImage* lab) { if (params->impulseDenoise.enabled && lab->W >= 8 && lab->H >= 8) { - impulse_nr (lab, (float)params->impulseDenoise.thresh / 20.0 ); + impulse_nr(lab, params->impulseDenoise.thresh / 20.0); } } -void ImProcFunctions::impulsedenoisecam (CieImage* ncie, float **buffers[3]) +void ImProcFunctions::impulsedenoisecam(CieImage* ncie, float **buffers[3]) { if (params->impulseDenoise.enabled && ncie->W >= 8 && ncie->H >= 8) { - impulse_nrcam (ncie, (float)params->impulseDenoise.thresh / 20.0, buffers ); + impulse_nrcam(ncie, params->impulseDenoise.thresh / 20.0, buffers); } } -void ImProcFunctions::defringe (LabImage* lab) +void ImProcFunctions::defringe(LabImage* lab) { if (params->defringe.enabled && lab->W >= 8 && lab->H >= 8) { - PF_correct_RT (lab, params->defringe.radius, params->defringe.threshold); + PF_correct_RT(lab, params->defringe.radius, params->defringe.threshold); } } -void ImProcFunctions::defringecam (CieImage* ncie) +void ImProcFunctions::defringecam(CieImage* ncie) { if (params->defringe.enabled && ncie->W >= 8 && ncie->H >= 8) { - PF_correct_RTcam (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 chrom, bool 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, rad, thr, mode, chrom, hotbad); + Badpixelscam(ncie, rad, thr, mode, chrom, hotbad); } } -void ImProcFunctions::badpixlab (LabImage* lab, double rad, int thr, float chrom) +void ImProcFunctions::badpixlab(LabImage* lab, double rad, int thr, float chrom) { if (lab->W >= 8 && lab->H >= 8) { - BadpixelsLab (lab, rad, thr, chrom); + BadpixelsLab(lab, rad, thr, chrom); } } -void ImProcFunctions::dirpyrequalizer (LabImage* lab, int scale) +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.f; - float t_l = static_cast (params->dirpyrequalizer.hueskin.getTopLeft()) / 100.f; - float t_r = static_cast (params->dirpyrequalizer.hueskin.getTopRight()) / 100.f; + 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; 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 + ImProcFunctions::badpixlab(lab, artifact / scale, 5, chrom); //for artifacts } //dirpyrLab_equalizer(lab, lab, params->dirpyrequalizer.mult); - dirpyr_equalizer (lab->L, lab->L, lab->W, lab->H, lab->a, lab->b, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, b_l, t_l, t_r, scale); + dirpyr_equalizer(lab->L, lab->L, lab->W, lab->H, lab->a, lab->b, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, b_l, t_l, t_r, scale); } } -void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates, int skip) +void ImProcFunctions::EPDToneMapCIE(CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates, int skip) { if (!params->epd.enabled) { return; } - if (params->wavelet.enabled && params->wavelet.tmrs != 0) { - return; - } - + /* + if (params->wavelet.enabled && params->wavelet.tmrs != 0) { + return; + } + */ float stren = params->epd.strength; - float edgest = params->epd.edgeStopping; + const float edgest = std::min(params->epd.edgeStopping, params->localContrast.enabled ? 3.0 : 4.0); float sca = params->epd.scale; float gamm = params->epd.gamma; float rew = params->epd.reweightingIterates; - float Qpro = ( 4.0 / c_) * ( a_w + 4.0 ) ; //estimate Q max if J=100.0 + float Qpro = (4.f / c_) * (a_w + 4.f) ; //estimate Q max if J=100.0 float *Qpr = ncie->Q_p[0]; if (settings->verbose) { - printf ("minQ=%f maxQ=%f Qpro=%f\n", minQ, maxQ, Qpro); + printf("minQ=%f maxQ=%f Qpro=%f\n", static_cast(minQ), static_cast(maxQ), static_cast(Qpro)); } if (maxQ > Qpro) { Qpro = maxQ; } - EdgePreservingDecomposition epd (Wid, Hei); + EdgePreservingDecomposition epd(Wid, Hei); #ifdef _OPENMP #pragma omp parallel for @@ -5163,7 +5092,7 @@ void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wi ncie->Q_p[i][j] = gamm * ncie->Q_p[i][j] / (Qpro); } - float Compression = expf (-stren); //This modification turns numbers symmetric around 0 into exponents. + float Compression = expf(-stren); //This modification turns numbers symmetric around 0 into exponents. float DetailBoost = stren; if (stren < 0.0f) { @@ -5172,19 +5101,17 @@ void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wi //Auto select number of iterates. Note that p->EdgeStopping = 0 makes a Gaussian blur. if (Iterates == 0) { - Iterates = (unsigned int) (edgest * 15.0); + Iterates = edgest * 15.f; } //Jacques Desmis : always Iterates=5 for compatibility images between preview and output - epd.CompressDynamicRange (Qpr, sca / (float)skip, edgest, Compression, DetailBoost, Iterates, rew); + epd.CompressDynamicRange(Qpr, sca / (float)skip, edgest, Compression, DetailBoost, Iterates, rew); //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 + float s = (1.0f + 38.7889f) * powf(Compression, 1.5856f) / (1.0f + 38.7889f * powf(Compression, 1.5856f)); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,10) -#endif #endif for (int i = 0; i < Hei; i++) @@ -5232,71 +5159,36 @@ void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wi */ } - -//Map tones by way of edge preserving decomposition. Is this the right way to include source? -//#include "EdgePreservingDecomposition.cc" -void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip) +void ImProcFunctions::EPDToneMaplocal(int sp, LabImage *lab, LabImage *tmp1, unsigned int Iterates, int skip) { - //Hasten access to the parameters. -// EPDParams *p = (EPDParams *)(¶ms->epd); - //Enabled? Leave now if not. -// if(!p->enabled) return; - if (!params->epd.enabled) { - return; - } + float stren = ((float)params->locallab.spots.at(sp).stren); + const float edgest = std::min(params->locallab.spots.at(sp).estop, params->localContrast.enabled ? 3.0 : 4.0); - if (params->wavelet.enabled && params->wavelet.tmrs != 0) { - return; - } - - float stren = params->epd.strength; - float edgest = params->epd.edgeStopping; - float sca = params->epd.scale; - float gamm = params->epd.gamma; - float rew = params->epd.reweightingIterates; + float sca = ((float)params->locallab.spots.at(sp).scaltm); + float gamm = ((float)params->locallab.spots.at(sp).gamma); + float satur = ((float)params->locallab.spots.at(sp).satur) / 100.f; + float rew = ((float)params->locallab.spots.at(sp).rewei); //Pointers to whole data and size of it. float *L = lab->L[0]; float *a = lab->a[0]; float *b = lab->b[0]; - size_t N = lab->W * lab->H; - EdgePreservingDecomposition epd (lab->W, lab->H); + std::size_t N = static_cast(lab->W) * static_cast(lab->H); + int WW = lab->W ; + + EdgePreservingDecomposition epd(lab->W, lab->H); //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) { - lminL = L[i]; - } - - if (L[i] > lmaxL) { - lmaxL = L[i]; - } - } + float minL = L[0]; + float maxL = minL; #ifdef _OPENMP - #pragma omp critical + #pragma omp parallel for reduction(max:maxL) reduction(min:minL) schedule(dynamic,16) #endif - { - if (lminL < minL) { - minL = lminL; - } - if (lmaxL > maxL) { - maxL = lmaxL; - } - } + for (std::size_t i = 0; i < N; i++) { + minL = rtengine::min(minL, L[i]); + maxL = rtengine::max(maxL, L[i]); } if (minL > 0.0f) { @@ -5307,19 +5199,17 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip maxL = 1.f; } + const float mult = gamm / maxL; #ifdef _OPENMP #pragma omp parallel for #endif - for (size_t i = 0; i < N; ++i) - //{L[i] = (L[i] - minL)/32767.0f; - { - L[i] = (L[i] - minL) / maxL; - L[i] *= gamm; + for (std::size_t i = 0; i < N; i++) { + L[i] = (L[i] - minL) * mult; } //Some interpretations. - float Compression = expf (-stren); //This modification turns numbers symmetric around 0 into exponents. + float Compression = expf(-stren); //This modification turns numbers symmetric around 0 into exponents. float DetailBoost = stren; if (stren < 0.0f) { @@ -5328,34 +5218,121 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip //Auto select number of iterates. Note that p->EdgeStopping = 0 makes a Gaussian blur. if (Iterates == 0) { - Iterates = (unsigned int) (edgest * 15.0f); + Iterates = (unsigned int)(edgest * 15.0f); } /* Debuggery. Saves L for toying with outside of RT. char nm[64]; - sprintf(nm, "%ux%ufloat.bin", lab->W, lab->H); + snprintf(nm, sizeof(nm), "%ux%ufloat.bin", lab->W, lab->H); FILE *f = fopen(nm, "wb"); fwrite(L, N, sizeof(float), f); fclose(f);*/ - epd.CompressDynamicRange (L, sca / float (skip), edgest, Compression, DetailBoost, Iterates, rew); + epd.CompressDynamicRange(L, sca / float (skip), edgest, Compression, DetailBoost, Iterates, rew); //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)); + float s = (1.0f + 38.7889f) * powf(Compression, 1.5856f) / (1.0f + 38.7889f * powf(Compression, 1.5856f)); + float sat = s + 0.3f * s * satur; + + //printf("s=%f sat=%f \n", s, sat); + if (sat == 1.f) { + sat = 1.001f; + } + #ifdef _OPENMP #pragma omp parallel for // removed schedule(dynamic,10) #endif + for (unsigned int i = 0; i < N; i++) { + int x = i / WW; + int y = i - x * WW; + + tmp1->L[x][y] = L[i] * maxL * (1.f / gamm) + minL; + tmp1->a[x][y] = sat * a[i]; + tmp1->b[x][y] = sat * b[i]; + + } +} + + + + + +//Map tones by way of edge preserving decomposition. +void ImProcFunctions::EPDToneMap(LabImage *lab, unsigned int Iterates, int skip) +{ + + if (!params->epd.enabled) { + return; + } + + const float stren = params->epd.strength; + const float edgest = std::min(params->epd.edgeStopping, params->localContrast.enabled ? 3.0 : 4.0); + const float sca = params->epd.scale; + const float gamm = params->epd.gamma; + const float rew = params->epd.reweightingIterates; + //Pointers to whole data and size of it. + float *L = lab->L[0]; + float *a = lab->a[0]; + float *b = lab->b[0]; + const size_t N = lab->W * lab->H; + + EdgePreservingDecomposition epd(lab->W, lab->H); + + //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 = L[0]; + float maxL = L[0]; +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minL) reduction(max:maxL) +#endif + + for (size_t i = 1; i < N; i++) { + minL = std::min(minL, L[i]); + maxL = std::max(maxL, L[i]); + } + + if (maxL == 0.f) { // black input => do nothing + return; + } + + minL = std::min(minL, 0.f); //Disable the shift if there are no negative numbers. I wish there were just no negative numbers to begin with. + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (size_t i = 0; i < N; ++i) { + L[i] = (L[i] - minL) * (gamm / maxL); + } + + //Some interpretations. + const float Compression = expf(-stren); //This modification turns numbers symmetric around 0 into exponents. + const float DetailBoost = std::max(stren, 0.f); //Go with effect of exponent only if uncompressing. + + //Auto select number of iterates. Note that p->EdgeStopping = 0 makes a Gaussian blur. + if (Iterates == 0) { + Iterates = edgest * 15.f; + } + + epd.CompressDynamicRange(L, sca / skip, edgest, Compression, DetailBoost, Iterates, rew); + + //Restore past range, also desaturate a bit per Mantiuk's Color correction for tone mapping. + const float s = (1.f + 38.7889f) * std::pow(Compression, 1.5856f) / (1.f + 38.7889f * std::pow(Compression, 1.5856f)); + + maxL /= gamm; +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (size_t ii = 0; ii < N; ++ii) { a[ii] *= s; b[ii] *= s; - L[ii] = L[ii] * maxL * (1.f / gamm) + minL; + L[ii] = L[ii] * maxL + minL; } } -void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double clip, - double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh) +void ImProcFunctions::getAutoExp(const LUTu &histogram, int histcompr, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh) { float scale = 65536.0f; @@ -5367,7 +5344,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double float ave = 0.f; //find average luminance - histogram.getSumAndAverage (sum, ave); + histogram.getSumAndAverage(sum, ave); //find median of luminance size_t median = 0, count = histogram[0]; @@ -5394,12 +5371,12 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double int j = 0; - for (; j < min ((int)ave, imax); ++j) { + for (; j < min((int)ave, imax); ++j) { if (count < 8) { octile[count] += histogram[j]; if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { - octile[count] = xlog (1. + j) / log (2.f); + octile[count] = xlog(1. + j) / log(2.0); count++;// = min(count+1,7); } } @@ -5412,7 +5389,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double octile[count] += histogram[j]; if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { - octile[count] = xlog (1. + j) / log (2.f); + octile[count] = xlog(1. + j) / log(2.0); count++;// = min(count+1,7); } } @@ -5434,12 +5411,12 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double // lodev = (lodev / (log(2.f) * losum)); // hidev = (hidev / (log(2.f) * hisum)); - if (octile[6] > log1p ((float)imax) / log2 (2.f)) { //if very overxposed image + if (octile[6] > log1p((float)imax) / log2(2.f)) { //if very overxposed image octile[6] = 1.5f * octile[5] - 0.5f * octile[4]; overex = 2; } - if (octile[7] > log1p ((float)imax) / log2 (2.f)) { //if overexposed + if (octile[7] > log1p((float)imax) / log2(2.f)) { //if overexposed octile[7] = 1.5f * octile[6] - 0.5f * octile[5]; overex = 1; } @@ -5461,7 +5438,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double // compute weighted average separation of octiles // for future use in contrast setting for (int i = 1; i < 6; i++) { - ospread += (octile[i + 1] - octile[i]) / max (0.5f, (i > 2 ? (octile[i + 1] - octile[3]) : (octile[3] - octile[i]))); + ospread += (octile[i + 1] - octile[i]) / max(0.5f, (i > 2 ? (octile[i + 1] - octile[3]) : (octile[3] - octile[i]))); } ospread /= 5.f; @@ -5487,7 +5464,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double } //compute clipped white point - unsigned int clippable = (int) (sum * clip / 100.f ); + unsigned int clippable = (int)(static_cast(sum) * clip / 100.0); clipped = 0; int whiteclip = (imax) - 1; @@ -5521,24 +5498,24 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double //sets the mean or median at middle gray, and the amount that sets the estimated top //of the histogram at or near clipping. //float expcomp1 = (log(/*(median/ave)*//*(hidev/lodev)*/midgray*scale/(ave-shc+midgray*shc))+log((hidev/lodev)))/log(2.f); - float expcomp1 = (log (/*(median/ave)*//*(hidev/lodev)*/midgray * scale / (ave - shc + midgray * shc))) / log (2.f); + float expcomp1 = (log(/*(median/ave)*//*(hidev/lodev)*/midgray * scale / (ave - shc + midgray * shc))) / log(2.f); float expcomp2; if (overex == 0) { // image is not overexposed - expcomp2 = 0.5f * ( (15.5f - histcompr - (2.f * oct7 - oct6)) + log (scale / rawmax) / log (2.f) ); + expcomp2 = 0.5f * ((15.5f - histcompr - (2.f * oct7 - oct6)) + log(scale / rawmax) / log(2.f)); } else { - expcomp2 = 0.5f * ( (15.5f - histcompr - (2.f * octile[7] - octile[6])) + log (scale / rawmax) / log (2.f) ); + expcomp2 = 0.5f * ((15.5f - histcompr - (2.f * octile[7] - octile[6])) + log(scale / rawmax) / log(2.f)); } - if (fabs (expcomp1) - fabs (expcomp2) > 1.f) { //for great expcomp - expcomp = (expcomp1 * fabs (expcomp2) + expcomp2 * fabs (expcomp1)) / (fabs (expcomp1) + fabs (expcomp2)); + if (fabs(expcomp1) - fabs(expcomp2) > 1.f) { //for great expcomp + expcomp = (expcomp1 * fabs(expcomp2) + expcomp2 * fabs(expcomp1)) / (fabs(expcomp1) + fabs(expcomp2)); } else { expcomp = 0.5 * (double)expcomp1 + 0.5 * (double) expcomp2; //for small expcomp } - float gain = exp ((float)expcomp * log (2.f)); + float gain = exp((float)expcomp * log(2.f)); - float corr = sqrt (gain * scale / rawmax); + float corr = sqrt(gain * scale / rawmax); black = (int) shc * corr; @@ -5546,27 +5523,27 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double 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 - hlcompr = (int) (100.*comp / (max (0.0, expcomp) + 1.0)); - hlcompr = max (0, min (100, hlcompr)); + double comp = (gain * whiteclip / scale - 1.f) * 2.3f; // 2.3 instead of 2 to increase slightly comp + hlcompr = 100.0 * comp / (max(0.0, expcomp) + 1.0); + hlcompr = max(0, min(100, hlcompr)); //now find brightness if gain didn't bring ave to midgray using //the envelope of the actual 'control cage' brightness curve for simplicity - float midtmp = gain * sqrt (median * ave) / scale; + float midtmp = gain * sqrt(median * ave) / scale; if (midtmp < 0.1f) { - bright = (midgray - midtmp) * 15.0 / (midtmp); + bright = (midgray - midtmp) * 15.f / (midtmp); } else { - bright = (midgray - midtmp) * 15.0 / (0.10833 - 0.0833 * midtmp); + bright = (midgray - midtmp) * 15.f / (0.10833f - 0.0833f * midtmp); } - bright = 0.25 */*(median/ave)*(hidev/lodev)*/max (0, bright); + bright = 0.25 */*(median/ave)*(hidev/lodev)*/max(0, bright); //compute contrast that spreads the average spacing of octiles contr = (int) 50.0f * (1.1f - ospread); - contr = max (0, min (100, contr)); + contr = max(0, min(100, contr)); //take gamma into account - double whiteclipg = (int) (CurveFactory::gamma2 (whiteclip * corr / 65536.0) * 65536.0); + double whiteclipg = (int)(CurveFactory::gamma2(whiteclip * static_cast(corr) / 65536.0) * 65536.0); float gavg = 0.; @@ -5588,10 +5565,10 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double } } - whiteclipg = CurveFactory::igamma2 ((float) (whiteclipg / 65535.0)) * 65535.0; //need to inverse gamma transform to get correct exposure compensation parameter + whiteclipg = CurveFactory::igamma2(whiteclipg / 65535.0) * 65535.0; //need to inverse gamma transform to get correct exposure compensation parameter //correction with gamma - black = (int) ((65535 * black) / whiteclipg); + black = (int)((65535 * black) / whiteclipg); //expcomp = log(65535.0 / (whiteclipg)) / log(2.0); //diagnostics @@ -5647,14 +5624,14 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double expcomp = 12.0; } - bright = max (-100, min (bright, 100)); + bright = max(-100, min(bright, 100)); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_size) +double ImProcFunctions::getAutoDistor(const Glib::ustring &fname, int thumb_size) { if (!fname.empty()) { rtengine::RawMetaDataLocation ri; @@ -5662,13 +5639,13 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si int w_thumb = -1, h_thumb = thumb_size; eSensorType sensorType = rtengine::ST_NONE; - Thumbnail* thumb = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, sensorType, w_thumb, h_thumb, 1, FALSE); + Thumbnail* thumb = rtengine::Thumbnail::loadQuickFromRaw(fname, ri, sensorType, w_thumb, h_thumb, 1, FALSE); if (!thumb) { return 0.0; } - Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, w_raw, h_raw, 1, 1.0, FALSE); + Thumbnail* raw = rtengine::Thumbnail::loadFromRaw(fname, ri, sensorType, w_raw, h_raw, 1, 1.0, ColorTemp::DEFAULT_OBSERVER, FALSE); if (!raw) { delete thumb; @@ -5691,32 +5668,26 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si unsigned char* thumbGray; unsigned char* rawGray; - thumbGray = thumb->getGrayscaleHistEQ (width); - rawGray = raw->getGrayscaleHistEQ (width); + thumbGray = thumb->getGrayscaleHistEQ(width); + rawGray = raw->getGrayscaleHistEQ(width); if (!thumbGray || !rawGray) { - if (thumbGray) { - delete thumbGray; - } - - if (rawGray) { - delete rawGray; - } - + delete[] thumbGray; + delete[] rawGray; delete thumb; delete raw; return 0.0; } double dist_amount; - int dist_result = calcDistortion (thumbGray, rawGray, width, h_thumb, 1, dist_amount); + int dist_result = calcDistortion(thumbGray, rawGray, width, h_thumb, 1, dist_amount); if (dist_result == -1) { // not enough features found, try increasing max. number of features by factor 4 - calcDistortion (thumbGray, rawGray, width, h_thumb, 4, dist_amount); + calcDistortion(thumbGray, rawGray, width, h_thumb, 4, dist_amount); } - delete thumbGray; - delete rawGray; + delete[] thumbGray; + delete[] rawGray; delete thumb; delete raw; return dist_amount; @@ -5725,13 +5696,13 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si } } -void ImProcFunctions::rgb2lab (const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace) +void ImProcFunctions::rgb2lab(const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix ( workingSpace ); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(workingSpace); 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])}, - {static_cast (wprof[2][0]), static_cast (wprof[2][1]), static_cast (wprof[2][2])} + {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])} }; const int W = src.getWidth(); @@ -5744,20 +5715,153 @@ void ImProcFunctions::rgb2lab (const Imagefloat &src, LabImage &dst, const Glib: for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { float X, Y, Z; - Color::rgbxyz (src.r (i, j), src.g (i, j), src.b (i, j), X, Y, Z, wp); + Color::rgbxyz(src.r(i, j), src.g(i, j), src.b(i, j), X, Y, Z, wp); //convert Lab - Color::XYZ2Lab (X, Y, Z, dst.L[i][j], dst.a[i][j], dst.b[i][j]); + Color::XYZ2Lab(X, Y, Z, dst.L[i][j], dst.a[i][j], dst.b[i][j]); } } } -void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace) +void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings) const { - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix ( workingSpace ); + rgb2lab(src, x, y, w, h, L, a, b, icm, consider_histogram_settings, multiThread); +} + +void ImProcFunctions::rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings, bool multiThread) +{ + // Adapted from ImProcFunctions::lab2rgb + const int src_width = src.getWidth(); + const int src_height = src.getHeight(); + + if (x < 0) { + x = 0; + } + + if (y < 0) { + y = 0; + } + + if (x + w > src_width) { + w = src_width - x; + } + + if (y + h > src_height) { + h = src_height - y; + } + + Glib::ustring profile; + + cmsHPROFILE oprof = nullptr; + + if (settings->HistogramWorking && consider_histogram_settings) { + profile = icm.workingProfile; + } else { + profile = icm.outputProfile; + + if (icm.outputProfile.empty() || icm.outputProfile == ColorManagementParams::NoICMString) { + profile = "sRGB"; + } + + oprof = ICCStore::getInstance()->getProfile(profile); + } + + if (oprof) { + cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; // NOCACHE is important for thread safety + + if (icm.outputBPC) { + flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } + + lcmsMutex->lock(); + cmsHPROFILE LabIProf = cmsCreateLab4Profile(nullptr); + cmsHTRANSFORM hTransform = cmsCreateTransform(oprof, TYPE_RGB_8, LabIProf, TYPE_Lab_FLT, icm.outputIntent, flags); + cmsCloseProfile(LabIProf); + lcmsMutex->unlock(); + + // cmsDoTransform is relatively expensive +#ifdef _OPENMP + #pragma omp parallel +#endif + { + AlignedBuffer oBuf(3 * w); + float *outbuffer = oBuf.data; + int condition = y + h; + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = y; i < condition; i++) { + const int ix = 3 * (x + i * src_width); + int iy = 0; + float* rL = L + (i - y) * w; + float* ra = a + (i - y) * w; + float* rb = b + (i - y) * w; + + cmsDoTransform(hTransform, src.data + ix, outbuffer, w); + + for (int j = 0; j < w; j++) { + rL[j] = outbuffer[iy++] * 327.68f; + ra[j] = outbuffer[iy++] * 327.68f; + rb[j] = outbuffer[iy++] * 327.68f; + } + } + } // End of parallelization + + cmsDeleteTransform(hTransform); + } else { + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(profile); + 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])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} + }; + + const int x2 = x + w; + const int y2 = y + h; + constexpr float rgb_factor = 65355.f / 255.f; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int i = y; i < y2; i++) { + int offset = (i - y) * w; + + for (int j = x; j < x2; j++) { + float X, Y, Z; + // lab2rgb uses gamma2curve, which is gammatab_srgb. + const auto& igamma = Color::igammatab_srgb; + Color::rgbxyz(igamma[rgb_factor * src.r(i, j)], igamma[rgb_factor * src.g(i, j)], igamma[rgb_factor * src.b(i, j)], X, Y, Z, wp); + Color::XYZ2Lab(X, Y, Z, L[offset], a[offset], b[offset]); + offset++; + } + } + } +} + +void ImProcFunctions::rgb2lab(std::uint8_t red, std::uint8_t green, std::uint8_t blue, float &L, float &a, float &b, const procparams::ColorManagementParams &icm, bool consider_histogram_settings) +{ + float l_channel[1]; + float a_channel[1]; + float b_channel[1]; + rtengine::Image8 buf(1, 1); + buf.r(0, 0) = red; + buf.g(0, 0) = green; + buf.b(0, 0) = blue; + ImProcFunctions::rgb2lab(buf, 0, 0, 1, 1, l_channel, a_channel, b_channel, icm, consider_histogram_settings, false); + L = l_channel[0]; + a = a_channel[0]; + b = b_channel[0]; +} + +void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace) +{ + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(workingSpace); 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])} + {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])} }; const int W = dst.getWidth(); @@ -5767,7 +5871,7 @@ void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib: for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { - wipv[i][j] = F2V (wiprof[i][j]); + wipv[i][j] = F2V(wiprof[i][j]); } } @@ -5784,19 +5888,19 @@ void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib: for (; j < W - 3; j += 4) { vfloat X, Y, Z; vfloat R, G, B; - Color::Lab2XYZ (LVFU (src.L[i][j]), LVFU (src.a[i][j]), LVFU (src.b[i][j]), X, Y, Z); - Color::xyz2rgb (X, Y, Z, R, G, B, wipv); - STVFU (dst.r (i, j), R); - STVFU (dst.g (i, j), G); - STVFU (dst.b (i, j), B); + Color::Lab2XYZ(LVFU(src.L[i][j]), LVFU(src.a[i][j]), LVFU(src.b[i][j]), X, Y, Z); + Color::xyz2rgb(X, Y, Z, R, G, B, wipv); + STVFU(dst.r(i, j), R); + STVFU(dst.g(i, j), G); + STVFU(dst.b(i, j), B); } #endif for (; j < W; j++) { float X, Y, Z; - Color::Lab2XYZ (src.L[i][j], src.a[i][j], src.b[i][j], X, Y, Z); - Color::xyz2rgb (X, Y, Z, dst.r (i, j), dst.g (i, j), dst.b (i, j), wip); + Color::Lab2XYZ(src.L[i][j], src.a[i][j], src.b[i][j], X, Y, Z); + Color::xyz2rgb(X, Y, Z, dst.r(i, j), dst.g(i, j), dst.b(i, j), wip); } } } @@ -5823,16 +5927,17 @@ void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib: */ void ImProcFunctions::colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread) { - const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; - const float scaling = ColorToningParams::LABGRID_CORR_SCALE; + const double factor = ColorToningParams::LABGRID_CORR_MAX * 3.0; + const double 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) + #pragma omp parallel for if (MultiThread) #endif + for (int y = ystart; y < yend; ++y) { for (int x = xstart; x < xend; ++x) { lab->a[y][x] += lab->L[y][x] * a_scale + a_base; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 661f399ef..2c36a0d31 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -19,11 +19,23 @@ #pragma once #include +#include #include "coord2d.h" #include "gamutwarning.h" +#include "imagedimensions.h" +#include "jaggedarray.h" #include "pipettebuffer.h" +#include "array2D.h" +#include "imagesource.h" +#include +namespace Glib +{ + +class ustring; + +} template class LUT; @@ -42,11 +54,22 @@ class DCPProfileApplyState; class FlatCurve; class FramesMetaData; class LensCorrection; +class LocCCmaskCurve; +class LocLLmaskCurve; +class LocHHmaskCurve; +class LocwavCurve; +class LocretigainCurve; +class LocretitransCurve; +class LocLHCurve; +class LocHHCurve; class NoiseCurve; class OpacityCurve; +class PipetteBuffer; class ToneCurve; class WavCurve; +class Wavblcurve; class WavOpacityCurveBY; +class WavOpacityCurveSH; class WavOpacityCurveRG; class WavOpacityCurveW; class WavOpacityCurveWL; @@ -56,15 +79,26 @@ class Image8; class Imagefloat; class LabImage; class wavelet_decomposition; +class ImageSource; +class ColorTemp; namespace procparams { class ProcParams; +struct SpotEntry; +struct DehazeParams; +struct FattalToneMappingParams; struct ColorManagementParams; struct DirPyrDenoiseParams; +struct FilmNegativeParams; +struct LocalContrastParams; +struct LocallabParams; struct SharpeningParams; +struct SoftLightParams; +struct ToneEqualizerParams; +struct VibranceParams; struct VignettingParams; struct WaveletParams; @@ -76,16 +110,18 @@ class ImProcFunctions { cmsHTRANSFORM monitorTransform; std::unique_ptr gamutWarning; + Cairo::RefPtr locImage; const procparams::ProcParams* params; double scale; bool multiThread; void calcVignettingParams(int oW, int oH, const procparams::VignettingParams& vignetting, double &w2, double &h2, double& maxRadius, double &v, double &b, double &mul); + static void rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings, bool multithread); 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 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, bool useOriginalBuffer); + void transformLCPCAOnly(Imagefloat *original, Imagefloat *transformed, int cx, int cy, const LensCorrection *pLCPMap, bool useOriginalBuffer); bool needsCA() const; bool needsDistortion() const; @@ -97,7 +133,6 @@ class ImProcFunctions bool needsLensfun() const; // static cmsUInt8Number* Mempro = NULL; - public: enum class Median { TYPE_3X3_SOFT, @@ -107,21 +142,32 @@ public: TYPE_7X7, TYPE_9X9 }; +enum class BlurType { + OFF, + BOX, + GAUSS +}; double lumimul[3]; explicit ImProcFunctions(const procparams::ProcParams* iparams, bool imultiThread = true) : monitorTransform(nullptr), params(iparams), scale(1), multiThread(imultiThread), lumimul{} {} ~ImProcFunctions(); - bool needsLuminanceOnly() + bool needsLuminanceOnly() const { return !(needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient()); } void setScale(double iscale); - bool needsTransform() const; + bool needsTransform(int oW, int oH, int rawRotationDeg, const FramesMetaData *metadata) const; bool needsPCVignetting() const; + bool filmNegativeProcess(rtengine::Imagefloat *input, rtengine::Imagefloat *output, procparams::FilmNegativeParams &fnp, + const procparams::RAWParams &rawParams, const rtengine::ImageSource* imgsrc, const rtengine::ColorTemp &currWB); + + void filmNegativeProcess(rtengine::Imagefloat *input, rtengine::Imagefloat *output, const procparams::FilmNegativeParams ¶ms); + + float calcGradientFactor (const struct grad_params& gp, int x, int y); 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, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, @@ -147,16 +193,22 @@ public: void moyeqt(Imagefloat* working, float &moyS, float &eqty); void luminanceCurve(LabImage* lold, LabImage* lnew, const LUTf &curve); + void ciecamloc_02float(const struct local_params& lp, int sp, LabImage* lab, int bfw, int bfh, int call, int sk, const LUTf& cielocalcurve, bool localcieutili, const LUTf& cielocalcurve2, bool localcieutili2, const LUTf& jzlocalcurve, bool localjzutili, const LUTf& czlocalcurve, bool localczutili, const LUTf& czjzlocalcurve, bool localczjzutili, const LocCHCurve& locchCurvejz, const LocHHCurve& lochhCurve, const LocLHCurve& loclhCurve, bool HHcurvejz, bool CHcurvejz, bool LHcurvejz, const LocwavCurve& locwavCurvejz, bool locwavutilijz); + void ciecam_02float(CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const procparams::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 clarimerge(const struct local_params& lp, float &mL, float &mC, bool &exec, LabImage *tmpresid, int wavelet_level, int sk, int numThreads); + void chromiLuminanceCurve(PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, const LUTf& acurve, const LUTf& bcurve, const LUTf& satcurve, const LUTf& satclcurve, const 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 vibrance(LabImage* lab, const procparams::VibranceParams &vibranceParams, bool highlight, const Glib::ustring &workingProfile); //Jacques' vibrance + void softprocess(const LabImage* bufcolorig, array2D &buflight, /* float ** bufchro, float ** buf_a, float ** buf_b, */ float rad, int bfh, int bfw, double epsilmax, double epsilmin, float thres, int sk, bool multiThread); + void softproc(const LabImage* bufcolorig, const LabImage* bufcolfin, float rad, int bfh, int bfw, float epsilmax, float epsilmin, float thres, int sk, bool multiThread, int flag); // void colorCurve (LabImage* lold, LabImage* lnew); 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); + 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, bool useOriginalBuffer = false); float resizeScale(const procparams::ProcParams* params, int fw, int fh, int &imw, int &imh); void lab2monitorRgb(LabImage* lab, Image8* image); void resize(Imagefloat* src, Imagefloat* dst, float dScale); @@ -164,6 +216,8 @@ public: void Lanczos(const Imagefloat* src, Imagefloat* dst, float scale); void deconvsharpening(float** luminance, float** buffer, const float* const * blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale); + void deconvsharpeningloc(float** luminance, float** buffer, int W, int H, float** loctemp, int damp, double radi, int ite, int amo, int contrast, double blurrad, int sk); + 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 @@ -178,46 +232,213 @@ public: 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); + void EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, const struct cont_params& cp, int W_L, int H_L, float max0); 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 Compresslevels(float **Source, int W_L, int H_L, float compression, float detailattenuator, float thres, float mean, float maxp, float meanN, float maxN, float madL); + void ContrastResid(float * WavCoeffs_L0, const struct cont_params &cp, int W_L, int H_L, float max0); void EPDToneMap(LabImage *lab, unsigned int Iterates = 0, int skip = 1); + void EPDToneMaplocal(int sp, LabImage *lab, LabImage *tmp1, unsigned int Iterates, int skip); 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); + 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*/); + //locallab Local adjustments + void maskcalccol(bool invmask, bool pde, int bfw, int bfh, int xstart, int ystart, int sk, int cx, int cy, LabImage* bufcolorig, LabImage* bufmaskblurcol, LabImage* originalmaskcol, LabImage* original, LabImage* reserved, int inv, struct local_params & lp, + float strumask, bool astool, + const LocCCmaskCurve & locccmasCurve, bool lcmasutili, + const LocLLmaskCurve & locllmasCurve, bool llmasutili, + const LocHHmaskCurve & lochhmasCurve, bool lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool lhhmasutili, + bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, float blendmab, int shado, int highl, float amountcd, float anchorcd, + const LUTf& lmasklocalcurve, bool localmaskutili, + const LocwavCurve & loclmasCurvecolwav, bool lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, + int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, bool fftt, float blu_ma, float cont_ma, int indic, float &fab); + void avoidcolshi(const struct local_params& lp, int sp, LabImage *transformed, LabImage *reserved, int cy, int cx, int sk); + + void deltaEforMask(float **rdE, int bfw, int bfh, LabImage* bufcolorig, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh); + void discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t); + void laplacian(const array2D &src, array2D &dst, int bfw, int bfh, float threshold, float ceiling, float factor, bool multiThread); + void detail_mask(const array2D &src, array2D &mask, int bfw, int bfh, float scaling, float threshold, float ceiling, float factor, BlurType blur_type, float blur, bool multithread); + void NLMeans(float **img, int strength, int detail_thresh, int patch, int radius, float gam, int bfw, int bfh, float scale, bool multithread); + void loccont(int bfw, int bfh, LabImage* tmp1, float rad, float stren, int sk); + + void rex_poisson_dct(float * data, size_t nx, size_t ny, double m); + void mean_dt(const float * data, size_t size, double& mean_p, double& dt_p); + float *cos_table(size_t size); + + void normalize_mean_dt(float *data, const float *ref, size_t size, float mod, float sigm, float mdef, float sdef, float mdef2, float sdef2); + void retinex_pde(const float *datain, float * dataout, int bfw, int bfh, float thresh, float multy, float *dE, int show, int dEenable, int normalize); + void exposure_pde(float *dataor, float *datain, float * dataout, int bfw, int bfh, float thresh, float mod); + void fftw_convol_blur(float *input, float *output, int bfw, int bfh, float radius, int fftkern, int algo); + void fftw_convol_blur2(float **input2, float **output2, int bfw, int bfh, float radius, int fftkern, int algo); + void fftw_tile_blur(int GW, int GH, int tilssize , int max_numblox_W, int min_numblox_W, float **tmp1, int numThreads, double radius); + + void maskforretinex(int sp, int before, float ** luminance, float ** out, int W_L, int H_L, int skip, + const LocCCmaskCurve & locccmasretiCurve, bool lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool lhmasretiutili, + int llretiMask, bool retiMasktmap, bool retiMask, float rad, float lap, bool pde, float gamm, float slop, float chro, float blend, + const LUTf & lmaskretilocalcurve, bool localmaskretiutili, + LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, LabImage * bufmaskorigreti, bool multiThread, + bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask); + + //3 functions from Alberto Griggio, adapted J.Desmis 2019 + void filmGrain(Imagefloat *rgb, int isogr, int strengr, int scalegr,float divgr, int bfw, int bfh, int call, int fw, int fh); + void log_encode(Imagefloat *rgb, struct local_params & lp, bool multiThread, int bfw, int bfh); + void getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE); + + void MSRLocal(int call, int sp, bool fftw, int lum, float** reducDE, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, LabImage * bufmaskorigreti, float** luminance, const float* const *originalLuminance, + const int width, const int height, int bfwr, int bfhr, const procparams::LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, + const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, + const LocCCmaskCurve & locccmasretiCurve, bool lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool lhmasretiutili, int llretiMask, + const LUTf & lmaskretilocalcurve, bool localmaskretiutili, + LabImage * transformed, bool retiMasktmap, bool retiMask, + bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask); + + void mean_sig (const float* const * const savenormL, float &meanf, float &stdf, int xStart, int xEnd, int yStart, int yEnd) const; + + void calc_ref(int sp, LabImage* original, LabImage* transformed, int cx, int cy, int oW, int oH, int sk, double &huerefblur, double &chromarefblur, double &lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, float &avg, const LocwavCurve & locwavCurveden, bool locwavdenutili); + void copy_ref(LabImage* spotbuffer, LabImage* original, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp, double &huerefspot, double &chromarefspot, double &lumarefspot); + void paste_ref(LabImage* spotbuffer, LabImage* transformed, int cx, int cy, int sk, const struct local_params & lp); + void Lab_Local(int call, int sp, float** shbuffer, LabImage* original, LabImage* transformed, LabImage* reserved, LabImage * savenormtm, LabImage * savenormreti, LabImage* lastorig, int fw, int fh, int cx, int cy, int oW, int oH, int sk, const LocretigainCurve& locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, + const LUTf& lllocalcurve, bool locallutili, + const LUTf& cllocalcurve, bool localclutili, + const LUTf& lclocalcurve, bool locallcutili, + const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, const LocCHCurve& locchCurve, + const LocHHCurve& lochhCurvejz, const LocCHCurve& locchCurvejz, const LocLHCurve& loclhCurvejz, + const LUTf& lmasklocalcurve, bool localmaskutili, + const LUTf& lmaskexplocalcurve, bool localmaskexputili, + const LUTf& lmaskSHlocalcurve, bool localmaskSHutili, + const LUTf& lmaskviblocalcurve, bool localmaskvibutili, + const LUTf& lmasktmlocalcurve, bool localmasktmutili, + LUTf& lmaskretilocalcurve, bool localmaskretiutili, + const LUTf& lmaskcblocalcurve, bool localmaskcbutili, + const LUTf& lmaskbllocalcurve, bool localmaskblutili, + const LUTf& lmasklclocalcurve, bool localmasklcutili, + const LUTf& lmaskloglocalcurve, bool localmasklogutili, + const LUTf& lmasklocal_curve, bool localmask_utili, + const LUTf& lmaskcielocalcurve, bool localmaskcieutili, + const LUTf& cielocalcurve, bool localcieutili, + const LUTf& cielocalcurve2, bool localcieutili2, + const LUTf& jzlocalcurve, bool localjzutili, + const LUTf& czlocalcurve, bool localczutili, + const LUTf& czjzlocalcurve, bool localczjzutili, + + const LocCCmaskCurve& locccmasCurve, bool lcmasutili, const LocLLmaskCurve& locllmasCurve, bool llmasutili, const LocHHmaskCurve& lochhmasCurve, bool lhmasutili, const LocHHmaskCurve& llochhhmasCurve, bool lhhmasutili, + const LocCCmaskCurve& locccmasexpCurve, bool lcmasexputili, const LocLLmaskCurve& locllmasexpCurve, bool llmasexputili, const LocHHmaskCurve& lochhmasexpCurve, bool lhmasexputili, + const LocCCmaskCurve& locccmasSHCurve, bool lcmasSHutili, const LocLLmaskCurve& locllmasSHCurve, bool llmasSHutili, const LocHHmaskCurve& lochhmasSHCurve, bool lhmasSHutili, + const LocCCmaskCurve& locccmasvibCurve, bool lcmasvibutili, const LocLLmaskCurve& locllmasvibCurve, bool llmasvibutili, const LocHHmaskCurve& lochhmasvibCurve, bool lhmasvibutili, + const LocCCmaskCurve& locccmascbCurve, bool lcmascbutili, const LocLLmaskCurve& locllmascbCurve, bool llmascbutili, const LocHHmaskCurve& lochhmascbCurve, bool lhmascbutili, + const LocCCmaskCurve& locccmasretiCurve, bool lcmasretiutili, const LocLLmaskCurve& locllmasretiCurve, bool llmasretiutili, const LocHHmaskCurve& lochhmasretiCurve, bool lhmasretiutili, + const LocCCmaskCurve& locccmastmCurve, bool lcmastmutili, const LocLLmaskCurve& locllmastmCurve, bool llmastmutili, const LocHHmaskCurve& lochhmastmCurve, bool lhmastmutili, + const LocCCmaskCurve& locccmasblCurve, bool lcmasblutili, const LocLLmaskCurve& locllmasblCurve, bool llmasblutili, const LocHHmaskCurve& lochhmasblCurve, bool lhmasblutili, + const LocCCmaskCurve& locccmaslcCurve, bool lcmaslcutili, const LocLLmaskCurve& locllmaslcCurve, bool llmaslcutili, const LocHHmaskCurve& lochhmaslcCurve, bool lhmaslcutili, + const LocCCmaskCurve& locccmaslogCurve, bool lcmaslogutili, const LocLLmaskCurve& locllmaslogCurve, bool llmaslogutili, const LocHHmaskCurve& lochhmaslogCurve, bool lhmaslogutili, + const LocCCmaskCurve& locccmas_Curve, bool lcmas_utili, const LocLLmaskCurve& locllmas_Curve, bool llmas_utili, const LocHHmaskCurve& lochhmas_Curve, bool lhmas_utili, + const LocCCmaskCurve& locccmascieCurve, bool lcmascieutili, const LocLLmaskCurve& locllmascieCurve, bool llmascieutili, const LocHHmaskCurve& lochhmascieCurve, bool lhmascieutili, + + const LocHHmaskCurve& lochhhmas_Curve, bool lhhmas_utili, + + const LocwavCurve& loclmasCurveblwav, bool lmasutiliblwav, + const LocwavCurve& loclmasCurvecolwav, bool lmasutilicolwav, + const LocwavCurve& locwavCurve, bool locwavutili, + const LocwavCurve& locwavCurvejz, bool locwavutilijz, + const LocwavCurve& loclevwavCurve, bool loclevwavutili, + const LocwavCurve& locconwavCurve, bool locconwavutili, + const LocwavCurve& loccompwavCurve, bool loccompwavutili, + const LocwavCurve& loccomprewavCurve, bool loccomprewavutili, + const LocwavCurve& locwavCurvehue, bool locwavhueutili, + const LocwavCurve& locwavCurveden, bool locwavdenutili, + const LocwavCurve& locedgwavCurve, bool locedgwavutili, + const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav, + bool LHutili, bool HHutili, bool CHutili, bool HHutilijz, bool CHutilijz, bool LHutilijz, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, + double& huerefblur, double &chromarefblur, double& lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int &lastsav, + bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, int llcieMask, + float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, + float& meantm, float& stdtm, float& meanreti, float& stdreti, float &fab, + float &highresi, float &nresi, float &highresi46, float &nresi46, float &Lhighresi, float &Lnresi, float &Lhighresi46, float &Lnresi46); + + void addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk); + void BlurNoise_Localold(int call, const struct local_params& lp, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy); + void InverseBlurNoise_Local(LabImage * originalmask, const struct local_params& lp, const float hueref, const float chromaref, const float lumaref, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy, int sk); + void InverseReti_Local(const struct local_params& lp, const float hueref, const float chromaref, const float lumaref, LabImage* original, LabImage* transformed, const LabImage* const tmp1, int cx, int cy, int chro, int sk); + void BlurNoise_Local(LabImage* tmp1, LabImage * originalmask, const float hueref, const float chromaref, const float lumaref, local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy, int sk); + static void strcurv_data(std::string retistr, int *s_datc, int &siz); + void blendstruc(int bfw, int bfh, LabImage* bufcolorig, float radius, float stru, array2D & blend2, int sk, bool multiThread); + + void wavcontrast4(struct local_params& lp, float ** tmp, float ** tmpa, float ** tmpb, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, int numThreads, const LocwavCurve & locwavCurve, bool locwavutili, bool wavcurve, + const LocwavCurve & loclevwavCurve, bool loclevwavutili, bool wavcurvelev, + const LocwavCurve & locconwavCurve, bool locconwavutili, bool wavcurvecon, + const LocwavCurve & loccompwavCurve, bool loccompwavutili, bool wavcurvecomp, + const LocwavCurve & loccomprewavCurve, bool loccomprewavutili, bool wavcurvecompre, + const LocwavCurve & locedgwavCurve, bool locedgwavutili, + float sigm, float offs,int & maxlvl, float sigmadc, float deltad, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres); + + void wavcont(const struct local_params& lp, float ** tmp, wavelet_decomposition &wdspot, int level_bl, int maxlvl, + const LocwavCurve & loclevwavCurve, bool loclevwavutili, + const LocwavCurve & loccompwavCurve, bool loccompwavutili, + const LocwavCurve & loccomprewavCurve, bool loccomprewavutili, + float radlevblur, int process, float chromablu, float thres, float sigmadc, float deltad); + + void wavlc(wavelet_decomposition& wdspot, int level_bl, int level_hl, int maxlvl, int level_hr, int level_br, float ahigh, float bhigh, float alow, float blow, float sigmalc, float strength, const LocwavCurve & locwavCurve, int numThreads); + + void wavcbd(wavelet_decomposition &wdspot, int level_bl, int maxlvl, + const LocwavCurve& locconwavCurve, bool locconwavutili, float sigm, float offs, float chromalev, int sk); + + void transit_shapedetect2(int sp, float meantm, float stdtm, int call, int senstype, const LabImage * bufexporig, const LabImage * bufexpfin, LabImage * originalmask, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); + + void transit_shapedetect_retinex(int call, int senstype, LabImage * bufexporig, LabImage * bufexpfin, LabImage * bufmask, LabImage * buforigmas, float **buflight, float **bufchro, const float hueref, const float chromaref, const float lumaref, struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); + void transit_shapedetect(int senstype, const LabImage *bufexporig, LabImage * originalmask, float **bufchro, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); + void exlabLocal(local_params& lp, float strlap, int bfh, int bfw, int bfhr, int bfwr, LabImage* bufexporig, LabImage* lab, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, const float hueref, const float lumaref, const float chromaref); + void Exclude_Local(float **deltaso, float hueref, float chromaref, float lumaref, float sobelref, float meansobel, const struct local_params & lp, const LabImage * original, LabImage * transformed, const LabImage * rsv, const LabImage * reserv, int cx, int cy, int sk); + + void DeNoise_Local(int call, const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk); + void DeNoise_Local2(const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk); + + void DeNoise(int call, int aut, bool noiscfactiv, const struct local_params& lp, LabImage* originalmaskbl, LabImage * bufmaskblurbl, int levred, float huerefblur, float lumarefblur, float chromarefblur, LabImage* original, LabImage* transformed, + int cx, int cy, int sk, const LocwavCurve& locwavCurvehue, bool locwavhueutili, float& highresi, float& nresi, float& highresi46, float& nresi46, float& Lhighresi, float& Lnresi, float& Lhighresi46, float& Lnresi46); + + + void fftw_denoise(int sk, int GW, int GH, int max_numblox_W, int min_numblox_W, float **tmp1, array2D *Lin, int numThreads, const struct local_params & lp, int chrom); + + void ColorLight_Local(float moddE, float powdE, int call, LabImage * bufcolorig, LabImage * originalmask, float **buflight, float **bufchro, float **bufchroslid, float ** bufhh, float ** buflightslid, bool &LHutili, bool &HHutili, const float hueplus, const float huemoins, const float hueref, const float dhue, const float chromaref, const float lumaref, float sobelref, float ** blend2, LUTf & lllocalcurve, const LocLHCurve & loclhCurve, const LocHHCurve & lochhCurve, LUTf & lightCurveloc, const local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy, int sk); + void InverseColorLight_Local(bool tonequ, bool tonecurv, int sp, int senstype, struct local_params& lp, LabImage * originalmask, const LUTf& lightCurveloc, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& exlocalcurve, const LUTf& cclocalcurve, float adjustr, bool localcutili, const LUTf& lllocalcurve, bool locallutili, LabImage* original, LabImage* transformed, int cx, int cy, const float hueref, const float chromaref, const float lumaref, int sk); + void Sharp_Local(int call, float **loctemp, int senstype, const float hueref, const float chromaref, const float lumaref, local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk); + + void InverseSharp_Local(float **loctemp, const float hueref, const float lumaref, const float chromaref, local_params& lp, LabImage* original, LabImage* transformed, int cx, int cy, int sk); + +//Wavelet and denoise 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 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 ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavCurve & wavdenoise, WavCurve & wavdenoiseh, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip); + void WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_L, const Wavblcurve & wavblcurve, + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); + void WaveletcontAllLfinal(wavelet_decomposition& WaveletCoeffs_L, const 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 Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, + struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab); + void WaveletAandBAllAB(wavelet_decomposition& WaveletCoeffs_a, wavelet_decomposition& WaveletCoeffs_b, + const cont_params &cp, FlatCurve* hhcurve, bool hhutili); + void ContAllL(float** koeLi, float maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, const float* const* varhue, const float* const* varchrom, float* const* 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, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili); + void finalContAllL(float* const* WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const 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* const* 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, float *meanab, float *sigmaab); + void Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, int numThreads); + void Eval2(const float* const* WavCoeffs_L, int level, int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, int numThreads); + void calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs); + std::unique_ptr buildMeaLut(const float inVals[11], const float mea[10], float& lutFactor); + void Aver(const float* HH_Coeffs, int datalen, float &averagePlus, float &averageNeg, float &max, float &min, int numThreads); + void Sigma(const float* HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg, int numThreads); + void calckoe(const float* WavCoeffs_LL, float gradw, float tloww, float *koeLi, int level, int W_L, int H_L, float edd, float &maxkoeLi, float **tmC, bool multiThread = false); 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); @@ -226,27 +447,35 @@ public: void RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, bool isRAW, const 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); //for DCT void RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top); - bool WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); - bool WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const 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, const wavelet_decomposition &WaveletCoeffs_a, const 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(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); - bool WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, - const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); - void ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); - void ShrinkAllAB(const wavelet_decomposition &WaveletCoeffs_L, const 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, + bool WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels); + bool WaveletDenoiseAllAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels); + + bool WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels); + bool WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels); + + 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 * variC, int local, float * madaab = nullptr, bool madCalculated = false); + + + void ShrinkAll_info(const float* const* WavCoeffs_a, const float* const* 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(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb); + void Noise_residualAB(const wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb, int beg, int end); 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 Mad(const float * DataList, int datalen); float MadRgb(const float * DataList, int datalen); + // spot removal tool + void removeSpots (rtengine::Imagefloat* img, rtengine::ImageSource* imgsrc, const std::vector &entries, const PreviewProps &pp, const rtengine::ColorTemp &currWB, const procparams::ColorManagementParams *cmp, int tr); + // pyramid wavelet + void cbdl_local_temp(float ** src, float ** loctemp, int srcwidth, int srcheight, const float * mult, float kchro, const double dirpyrThreshold, const float mergeL, const float contres, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scale, bool multiThread); void dirpyr_equalizer(const float * const * src, float ** dst, int srcwidth, int srcheight, const float * const * l_a, const float * const * l_b, const double * mult, double dirpyrThreshold, double skinprot, float b_l, float t_l, float t_r, int scale); //Emil's directional pyramid wavelet void dirpyr_equalizercam(const CieImage* ncie, float ** src, float ** dst, int srcwidth, int srcheight, const float * const * h_p, const float * const * C_p, 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 defringe(LabImage* lab); @@ -259,18 +488,25 @@ public: 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 dehaze(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams); + void dehazeloc(Imagefloat *rgb, const procparams::DehazeParams &dehazeParams); + void ToneMapFattal02(Imagefloat *rgb, const procparams::FattalToneMappingParams &fatParams, int detail_level, int Lalone, float **Lum, int WW, int HH, int algo); + void localContrast(LabImage *lab, float **destination, const procparams::LocalContrastParams &localContrastParams, bool fftwlc, double scale); void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); - void shadowsHighlights(LabImage *lab); - void softLight(LabImage *lab); + //void shadowsHighlights(LabImage *lab); + void shadowsHighlights(LabImage *lab, bool ena, int labmode, int hightli, int shado, int rad, int scal, int hltonal, int shtonal); + void toneEqualizer(Imagefloat *rgb); + void toneEqualizer(Imagefloat *rgb, const procparams::ToneEqualizerParams ¶ms, const Glib::ustring &workingProfile, double scale, bool multiThread); + void softLight(LabImage *lab, const procparams::SoftLightParams &softLightParams); void labColorCorrectionRegions(LabImage *lab); Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true); + void rgb2lab(const Image8 &src, int x, int y, int w, int h, float L[], float a[], float b[], const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true) const; + static void rgb2lab(std::uint8_t red, std::uint8_t green, std::uint8_t blue, float &L, float &a, float &b, 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; + void workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, Glib::ustring &profile, double gampos, double slpos, int &illum, int prim, cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false) const; + void preserv(LabImage *nprevl, LabImage *provis, int cw, int ch); 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) const; 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) const; diff --git a/rtengine/impulse_denoise.cc b/rtengine/impulse_denoise.cc index 20229e714..8e1143c09 100644 --- a/rtengine/impulse_denoise.cc +++ b/rtengine/impulse_denoise.cc @@ -322,7 +322,7 @@ void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh, float **buff hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); } - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + impish[i][j] = static_cast(hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); } #ifdef __SSE2__ @@ -353,7 +353,7 @@ void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh, float **buff hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); } - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + impish[i][j] = static_cast(hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); } for (; j < width; j++) { @@ -365,7 +365,7 @@ void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh, float **buff hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); } - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + impish[i][j] = static_cast(hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); } } } diff --git a/rtengine/init.cc b/rtengine/init.cc index 1a00f7ff6..0c1bd4f6b 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -17,7 +17,8 @@ * along with RawTherapee. If not, see . */ #include -#include "../rtgui/profilestorecombobox.h" +#include +#include #include "color.h" #include "rtengine.h" #include "iccstore.h" @@ -58,10 +59,20 @@ int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring& #pragma omp section #endif { + bool ok; + if (s->lensfunDbDirectory.empty() || Glib::path_is_absolute(s->lensfunDbDirectory)) { - LFDatabase::init(s->lensfunDbDirectory); + ok = LFDatabase::init(s->lensfunDbDirectory); } else { - LFDatabase::init(Glib::build_filename(baseDir, s->lensfunDbDirectory)); + ok = LFDatabase::init(Glib::build_filename(baseDir, s->lensfunDbDirectory)); + } + + if (!ok && !s->lensfunDbBundleDirectory.empty() && s->lensfunDbBundleDirectory != s->lensfunDbDirectory) { + if (Glib::path_is_absolute(s->lensfunDbBundleDirectory)) { + LFDatabase::init(s->lensfunDbBundleDirectory); + } else { + LFDatabase::init(Glib::build_filename(baseDir, s->lensfunDbBundleDirectory)); + } } } #ifdef _OPENMP @@ -92,7 +103,7 @@ int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring& #pragma omp section #endif { - dfm.init(s->darkFramesPath); + DFManager::getInstance().init(s->darkFramesPath); } #ifdef _OPENMP #pragma omp section diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc index 28a0f2d57..5ccec4a1e 100644 --- a/rtengine/ipdehaze.cc +++ b/rtengine/ipdehaze.cc @@ -32,6 +32,7 @@ #include #include +#include "array2D.h" #include "color.h" #include "guidedfilter.h" #include "iccstore.h" @@ -40,6 +41,8 @@ #include "procparams.h" #include "rescale.h" #include "rt_math.h" +//#define BENCHMARK +#include "StopWatch.h" #include "../rtgui/options.h" @@ -57,15 +60,18 @@ float normalize(Imagefloat *rgb, bool multithread) #ifdef _OPENMP #pragma omp parallel for reduction(max:maxval) schedule(dynamic, 16) if (multithread) #endif + for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { maxval = max(maxval, rgb->r(y, x), rgb->g(y, x), rgb->b(y, x)); } } + maxval = max(maxval * 2.f, 65535.f); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) if (multithread) #endif + for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { rgb->r(y, x) /= maxval; @@ -73,6 +79,7 @@ float normalize(Imagefloat *rgb, bool multithread) rgb->b(y, x) /= maxval; } } + return maxval; } @@ -80,10 +87,12 @@ void restore(Imagefloat *rgb, float maxval, bool multithread) { const int W = rgb->getWidth(); const int H = rgb->getHeight(); + if (maxval > 0.f && maxval != 1.f) { #ifdef _OPENMP -# pragma omp parallel for if (multithread) + # pragma omp parallel for if (multithread) #endif + for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { rgb->r(y, x) *= maxval; @@ -94,16 +103,18 @@ void restore(Imagefloat *rgb, float maxval, bool multithread) } } -int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, const array2D &dst, int patchsize, const float ambient[3], bool clip, bool multithread, float strength) +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, float strength) { - const int W = R.width(); - const int H = R.height(); + const int W = R.getWidth(); + const int H = R.getHeight(); #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 minR = RT_INFINITY_F; float minG = RT_INFINITY_F; @@ -114,21 +125,26 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr vfloat minBv = F2V(minB); #endif const int pW = min(x + patchsize, W); + for (int yy = y; yy < pH; ++yy) { int xx = x; #ifdef __SSE2__ + for (; xx < pW - 3; xx += 4) { minRv = vminf(minRv, LVFU(R[yy][xx])); minGv = vminf(minGv, LVFU(G[yy][xx])); minBv = vminf(minBv, LVFU(B[yy][xx])); } + #endif + for (; xx < pW; ++xx) { minR = min(minR, R[yy][xx]); minG = min(minG, G[yy][xx]); minB = min(minB, B[yy][xx]); } } + #ifdef __SSE2__ minR = min(minR, vhmin(minRv)); minG = min(minG, vhmin(minGv)); @@ -136,50 +152,56 @@ int get_dark_channel(const array2D &R, const array2D &G, const arr #endif float val = min(minR / ambient[0], minG / ambient[1], minB / ambient[2]); val = 1.f - strength * 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)); + return (W / patchsize + ((W % patchsize) > 0)) * (H / patchsize + ((H % patchsize) > 0)); } -int get_dark_channel_downsized(const array2D &R, const array2D &G, const array2D &B, const array2D &dst, int patchsize, bool multithread) +int get_dark_channel_downsized(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, bool multithread) { - const int W = R.width(); - const int H = R.height(); + const int W = R.getWidth(); + const int H = R.getHeight(); #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 xx = x; xx < pW; ++xx) { for (int yy = y; yy < pH; ++yy) { val = min(val, R[yy][xx], G[yy][xx], B[yy][xx]); } } + 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)); + 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 int W = R.getWidth(); + const int H = R.getHeight(); float darklim = RT_INFINITY_F; { std::vector 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)) { @@ -187,6 +209,11 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c } } } + + if (p.empty()) { + return 0.f; + } + const int pos = p.size() * 0.95; std::nth_element(p.begin(), p.begin() + pos, p.end()); darklim = p[pos]; @@ -212,17 +239,18 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c { std::vector l; l.reserve(patches.size() * patchsize * patchsize); - + for (auto &p : patches) { - const int pW = min(p.first+patchsize, W); - const int pH = min(p.second+patchsize, H); - + 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_back(R[y][x] + G[y][x] + B[y][x]); } } } + const int pos = l.size() * 0.95; std::nth_element(l.begin(), l.begin() + pos, l.end()); bright_lim = l[pos]; @@ -230,24 +258,27 @@ float estimate_ambient_light(const array2D &R, const array2D &G, c 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); - + 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; + rr += static_cast(r); + gg += static_cast(g); + bb += static_cast(b); ++n; } } } } + n = std::max(n, 1); ambient[0] = rr / n; ambient[1] = gg / n; @@ -274,9 +305,9 @@ void extract_channels(Imagefloat *img, array2D &r, array2D &g, arr } // namespace -void ImProcFunctions::dehaze(Imagefloat *img) +void ImProcFunctions::dehaze(Imagefloat *img, const DehazeParams &dehazeParams) { - if (!params->dehaze.enabled || params->dehaze.strength == 0.0) { + if (!dehazeParams.enabled || dehazeParams.strength == 0.0) { return; } @@ -284,11 +315,7 @@ void ImProcFunctions::dehaze(Imagefloat *img) const int W = img->getWidth(); const int H = img->getHeight(); - const float strength = LIM01(float(params->dehaze.strength) / 100.f * 0.9f); - - if (settings->verbose) { - std::cout << "dehaze: strength = " << strength << std::endl; - } + const float strength = LIM01(float(dehazeParams.strength) / 100.f * 0.9f); array2D dark(W, H); @@ -355,16 +382,17 @@ void ImProcFunctions::dehaze(Imagefloat *img) std::cout << "dehaze: max distance is " << maxDistance << std::endl; } - const float depth = -float(params->dehaze.depth) / 100.f; + const float depth = -float(dehazeParams.depth) / 100.f; const float t0 = max(1e-3f, std::exp(depth * maxDistance)); - const float teps = 1e-3f; + constexpr float teps = 1.f + 1e-3f; - const bool luminance = params->dehaze.luminance; + const float satBlend = dehazeParams.saturation / 100.f; const TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); #ifdef __SSE2__ const vfloat wsv[3] = {F2V(ws[1][0]), F2V(ws[1][1]),F2V(ws[1][2])}; #endif const float ambientY = Color::rgbLuminance(ambient[0], ambient[1], ambient[2], ws); + #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -380,30 +408,27 @@ void ImProcFunctions::dehaze(Imagefloat *img) const vfloat t0v = F2V(t0); const vfloat tepsv = F2V(teps); const vfloat cmaxChannelv = F2V(maxChannel); + const vfloat satBlendv = F2V(satBlend); for (; x < W - 3; x += 4) { // ensure that the transmission is such that to avoid clipping... const vfloat r = LVFU(img->r(y, x)); const vfloat g = LVFU(img->g(y, x)); const vfloat b = LVFU(img->b(y, x)); // ... t >= tl to avoid negative values - const vfloat tlv = onev - vminf(r / ambient0v, vminf(g / ambient1v, b / ambient2v)); - const vfloat mtv = vmaxf(LVFU(dark[y][x]), vmaxf(tlv + tepsv, t0v)); - if (params->dehaze.showDepthMap) { + const vfloat tlv = tepsv - vminf(r / ambient0v, vminf(g / ambient1v, b / ambient2v)); + const vfloat mtv = vmaxf(LVFU(dark[y][x]), vmaxf(tlv, t0v)); + if (dehazeParams.showDepthMap) { const vfloat valv = vclampf(onev - mtv, ZEROV, onev) * cmaxChannelv; STVFU(img->r(y, x), valv); STVFU(img->g(y, x), valv); STVFU(img->b(y, x), valv); - } else if (luminance) { + } else { const vfloat Yv = Color::rgbLuminance(r, g, b, wsv); const vfloat YYv = (Yv - ambientYv) / mtv + ambientYv; const vfloat fv = vself(vmaskf_gt(Yv, epsYv), cmaxChannelv * YYv / Yv, cmaxChannelv); - STVFU(img->r(y, x), r * fv); - STVFU(img->g(y, x), g * fv); - STVFU(img->b(y, x), b * fv); - } else { - STVFU(img->r(y, x), ((r - ambient0v) / mtv + ambient0v) * cmaxChannelv); - STVFU(img->g(y, x), ((g - ambient1v) / mtv + ambient1v) * cmaxChannelv); - STVFU(img->b(y, x), ((b - ambient2v) / mtv + ambient2v) * cmaxChannelv); + STVFU(img->r(y, x), vintpf(satBlendv, ((r - ambient0v) / mtv + ambient0v) * cmaxChannelv, r * fv)); + STVFU(img->g(y, x), vintpf(satBlendv, ((g - ambient1v) / mtv + ambient1v) * cmaxChannelv, g * fv)); + STVFU(img->b(y, x), vintpf(satBlendv, ((b - ambient2v) / mtv + ambient2v) * cmaxChannelv, b * fv)); } } #endif @@ -413,24 +438,163 @@ void ImProcFunctions::dehaze(Imagefloat *img) const float g = img->g(y, x); const float b = img->b(y, x); // ... t >= tl to avoid negative values - const float tl = 1.f - min(r / ambient[0], g / ambient[1], b / ambient[2]); - const float mt = max(dark[y][x], t0, tl + teps); - if (params->dehaze.showDepthMap) { + const float tl = teps - min(r / ambient[0], g / ambient[1], b / ambient[2]); + const float mt = max(dark[y][x], t0, tl); + if (dehazeParams.showDepthMap) { img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * maxChannel; - } else if (luminance) { + } else { const float Y = Color::rgbLuminance(img->r(y, x), img->g(y, x), img->b(y, x), ws); const float YY = (Y - ambientY) / mt + ambientY; const float f = Y > 1e-5f ? maxChannel * YY / Y : maxChannel; - img->r(y, x) *= f; - img->g(y, x) *= f; - img->b(y, x) *= f; - } else { - img->r(y, x) = ((r - ambient[0]) / mt + ambient[0]) * maxChannel; - img->g(y, x) = ((g - ambient[1]) / mt + ambient[1]) * maxChannel; - img->b(y, x) = ((b - ambient[2]) / mt + ambient[2]) * maxChannel; + img->r(y, x) = intp(satBlend, ((r - ambient[0]) / mt + ambient[0]) * maxChannel, r * f); + img->g(y, x) = intp(satBlend, ((g - ambient[1]) / mt + ambient[1]) * maxChannel, g * f); + img->b(y, x) = intp(satBlend, ((b - ambient[2]) / mt + ambient[2]) * maxChannel, b * f); } } } } +void ImProcFunctions::dehazeloc(Imagefloat *img, const DehazeParams &dehazeParams) +{ + //J.Desmis 12 2019 - this version derived from ART, is slower than the main from maximum 10% - probably use of SSE + //Probably Ingo could solved this problem in some times + + if (!dehazeParams.enabled || dehazeParams.strength == 0.0) { + return; + } + + const float maxChannel = normalize(img, multiThread); + + const int W = img->getWidth(); + const int H = img->getHeight(); + const float strength = LIM01(float(std::abs(dehazeParams.strength)) / 100.f * 0.9f); + const bool add_haze = dehazeParams.strength < 0; + + array2D dark(W, H); + + int patchsize = max(int(5 / scale), 2); + float ambient[3]; + float maxDistance = 0.f; + + { + array2D& R = dark; // R and dark can safely use the same buffer, which is faster and reduces memory allocations/deallocations + array2D G(W, H); + array2D B(W, H); + extract_channels(img, R, G, B, patchsize, 1e-1, multiThread); + + { + constexpr int sizecap = 200; + const float r = static_cast(W) / static_cast(H); + const int hh = r >= 1.f ? sizecap : sizecap / r; + const int ww = r >= 1.f ? sizecap * r : sizecap; + + if (W <= ww && H <= hh) { + // don't rescale small thumbs + array2D D(W, H); + const int npatches = get_dark_channel_downsized(R, G, B, D, 2, multiThread); + maxDistance = estimate_ambient_light(R, G, B, D, patchsize, npatches, ambient); + } else { + array2D RR(ww, hh); + array2D GG(ww, hh); + array2D BB(ww, hh); + rescaleNearest(R, RR, multiThread); + rescaleNearest(G, GG, multiThread); + rescaleNearest(B, BB, multiThread); + array2D D(ww, hh); + + const int npatches = get_dark_channel_downsized(RR, GG, BB, D, 2, multiThread); + maxDistance = estimate_ambient_light(RR, GG, BB, D, patchsize, npatches, ambient); + } + } + + if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { + if (settings->verbose) { + std::cout << "dehaze: no haze detected" << std::endl; + } + + restore(img, maxChannel, multiThread); + return; // probably no haze at all + } + + patchsize = max(max(W, H) / 600, 2); + + if (settings->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, strength); + } + + + const int radius = patchsize * 4; + constexpr float epsilon = 1e-5f; + + array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(guideB, dark, dark, radius, epsilon, multiThread); + + if (settings->verbose) { + std::cout << "dehaze: max distance is " << maxDistance << std::endl; + } + + const float depth = -float(dehazeParams.depth) / 100.f; + constexpr float teps = 1e-6f; + const float t0 = max(teps, std::exp(depth * maxDistance)); + + const float satBlend = dehazeParams.saturation / 100.f; + + const TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + + const float ambientY = Color::rgbLuminance(ambient[0], ambient[1], ambient[2], ws); +#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... + const float rIn = img->r(y, x); + const float gIn = img->g(y, x); + const float bIn = img->b(y, x); + // ... t >= tl to avoid negative values + const float tl = 1.f + teps - min(rIn / ambient[0], gIn / ambient[1], bIn / ambient[2]); + const float mt = max(dark[y][x], t0, tl); + + if (dehazeParams.showDepthMap) { + img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt) * maxChannel; + } else { + float f = 1.f; + const float Y = Color::rgbLuminance(rIn, gIn, bIn, ws); + if (Y > 1e-5f) { + float YY = (Y - ambientY) / mt + ambientY; + if (add_haze) { + YY = Y + Y - YY; + } + f = YY / Y; + } + const float r1 = rIn * f; + const float g1 = gIn * f; + const float b1 = bIn * f; + + float r2 = ((rIn - ambient[0]) / mt + ambient[0]); + float g2 = ((gIn - ambient[1]) / mt + ambient[1]); + float b2 = ((bIn - ambient[2]) / mt + ambient[2]); + + if (add_haze) { + r2 = rIn + rIn - r2; + g2 = gIn + gIn - g2; + b2 = bIn + bIn - b2; + } + img->r(y, x) = intp(satBlend, r2, r1); + img->g(y, x) = intp(satBlend, g2, g1); + img->b(y, x) = intp(satBlend, b2, b1); + } + } + } + + restore(img, maxChannel, multiThread); + +} + } // namespace rtengine diff --git a/rtengine/ipgrain.cc b/rtengine/ipgrain.cc new file mode 100644 index 000000000..648565036 --- /dev/null +++ b/rtengine/ipgrain.cc @@ -0,0 +1,390 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Alberto Griggio + * Small adaptation to Rawtherapee Locallab October 2019 + * 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 . + */ + +/* film grain emulation. + * Ported from darktable (src/iop/grain.c). Original copyright/license follows + */ +/* + This file is part of darktable, + copyright (c) 2010-2012 Henrik Andersson. + adaptation to Rawtherapee 2021 Jacques Desmis jdesmis@gmail.com + + darktable is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + darktable is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with darktable. If not, see . +*/ + +#include "imagefloat.h" +#include "improcfun.h" +#include "rt_math.h" + + +namespace rtengine { + +namespace { + +constexpr float GRAIN_LIGHTNESS_STRENGTH_SCALE = 0.15f; +constexpr float GRAIN_SCALE_FACTOR = 213.2f; + +constexpr int GRAIN_LUT_SIZE = 128; +constexpr float GRAIN_LUT_DELTA_MAX = 2.0f; +constexpr float GRAIN_LUT_DELTA_MIN = 0.0001f; +constexpr float GRAIN_LUT_PAPER_GAMMA = 1.0f; + + +const int grad3[12][3] = { { 1, 1, 0 }, + { -1, 1, 0 }, + { 1, -1, 0 }, + { -1, -1, 0 }, + { 1, 0, 1 }, + { -1, 0, 1 }, + { 1, 0, -1 }, + { -1, 0, -1 }, + { 0, 1, 1 }, + { 0, -1, 1 }, + { 0, 1, -1 }, + { 0, -1, -1 } }; + +const int permutation[] + = { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, + 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, + 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, + 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, + 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, + 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, + 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, + 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, + 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, + 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, + 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, + 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, + 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 }; + + +class GrainEvaluator { +public: + GrainEvaluator(int offset_x, int offset_y, int full_width, int full_height, double scale, float divgr, int call, int fww, int fhh): + ox(offset_x), + oy(offset_y), + fw(full_width), + fh(full_height), + scale(scale) + { + simplex_noise_init(); + constexpr float mb = 100.f;// * divgr; + evaluate_grain_lut(mb, divgr); + } + + void operator()(int isogr, int strengr, int scalegr, float divgr, Imagefloat *lab, bool multithread, int call, int fww, int fhh) + { + const double strength = (strengr / 100.0); + const double octaves = 3.; + const double wd = std::min(fw, fh); + const double wdf = std::min(fww, fhh); + + const double zoom = (1.0 + 8 * (double(isogr) / GRAIN_SCALE_FACTOR) / 100.0) / 800.0; + const double s = std::max(scale / 3.0, 1.0) / (double(std::max(scalegr, 1)) / 100.0); + const int W = lab->getWidth(); + const int H = lab->getHeight(); + float **lab_L = lab->g.ptrs; + double wddf = wd; + if (call == 1 || call == 3) { + wddf = wdf; + } + + +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int j = 0; j < H; ++j) { + double wy = oy + j; + double y = wy / wddf; + for (int i = 0; i < W; ++i) { + double wx = ox + i; + double x = wx / wddf; + double noise = simplex_2d_noise(x, y, octaves, zoom) / s; + lab_L[j][i] += lut_lookup(noise * strength * GRAIN_LIGHTNESS_STRENGTH_SCALE, lab_L[j][i] / 32768.f); + } + } + } + +private: + void simplex_noise_init() + { + for(int i = 0; i < 512; i++) perm[i] = permutation[i & 255]; + } + + double dot(const int *g, double x, double y, double z) + { + return g[0] * x + g[1] * y + g[2] * z; + } + + float FASTFLOOR(float x) + { + return (x > 0 ? (int)(x) : (int)(x)-1); + } + + double simplex_noise(double xin, double yin, double zin) + { + double n0, n1, n2, n3; // Noise contributions from the four corners + // Skew the input space to determine which simplex cell we're in + const double F3 = 1.0 / 3.0; + const double s = (xin + yin + zin) * F3; // Very nice and simple skew factor for 3D + const int i = FASTFLOOR(xin + s); + const int j = FASTFLOOR(yin + s); + const int k = FASTFLOOR(zin + s); + const double G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too + const double t = (i + j + k) * G3; + const double X0 = i - t; // Unskew the cell origin back to (x,y,z) space + const double Y0 = j - t; + const double Z0 = k - t; + const double x0 = xin - X0; // The x,y,z distances from the cell origin + const double y0 = yin - Y0; + const double z0 = zin - Z0; + // For the 3D case, the simplex shape is a slightly irregular tetrahedron. + // Determine which simplex we are in. + int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords + int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + if(x0 >= y0) + { + if(y0 >= z0) + { + i1 = 1; // X Y Z order + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + } + else if(x0 >= z0) + { + i1 = 1; // X Z Y order + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 0; + k2 = 1; + } + else + { + i1 = 0; // Z X Y order + j1 = 0; + k1 = 1; + i2 = 1; + j2 = 0; + k2 = 1; + } + } + else // x0 1.8f) { + dived = 1.f + (divgr - 1.8f); + } + const float delta = dived * GRAIN_LUT_DELTA_MAX * expf((mb / 100.0f) * logf(GRAIN_LUT_DELTA_MIN / dived)); + const float density = (1.0f + 2.0f * delta) / (1.0f + expf( (4.0f * gp * (0.5f - exposure)) / (1.0f + 2.0f * delta) )) - delta; + return density; + } + + float paper_resp_inverse(float density, float mb, float gp, float divgr) + { + float dived = 1.f; + if(divgr > 1.8f) { + dived = 1.f + (divgr - 1.8f); + } + const float delta = dived * GRAIN_LUT_DELTA_MAX * expf((mb / 100.0f) * logf(GRAIN_LUT_DELTA_MIN / dived)); + const float exposure = -logf((1.0f + 2.0f * delta) / (density + delta) - 1.0f) * (1.0f + 2.0f * delta) / (4.0f * gp) + 0.5f; + return exposure; + } + + void evaluate_grain_lut(const float mb, float divgr) + { + for(int i = 0; i < GRAIN_LUT_SIZE; i++) + { + for(int j = 0; j < GRAIN_LUT_SIZE; j++) + { + float gu = (float)i / (GRAIN_LUT_SIZE - 1) - 0.5; + float l = (float)j / (GRAIN_LUT_SIZE - 1); + float divg = divgr; //1.f + grain_lut[j * GRAIN_LUT_SIZE + i] = 32768.f * (paper_resp(gu + paper_resp_inverse(l, mb, divg * GRAIN_LUT_PAPER_GAMMA, divgr), mb, divg * GRAIN_LUT_PAPER_GAMMA, divgr) - l); + } + } + } + + float lut_lookup(const float x, const float y) + { + const float _x = LIM((x + 0.5f) * (GRAIN_LUT_SIZE - 1), 0.f, float(GRAIN_LUT_SIZE - 1)); + const float _y = LIM(y * (GRAIN_LUT_SIZE - 1), 0.f, float(GRAIN_LUT_SIZE - 1)); + + const int _x0 = _x < GRAIN_LUT_SIZE - 2 ? _x : GRAIN_LUT_SIZE - 2; + const int _y0 = _y < GRAIN_LUT_SIZE - 2 ? _y : GRAIN_LUT_SIZE - 2; + + const int _x1 = _x0 + 1; + const int _y1 = _y0 + 1; + + const float x_diff = _x - _x0; + const float y_diff = _y - _y0; + + const float l00 = grain_lut[_y0 * GRAIN_LUT_SIZE + _x0]; + const float l01 = grain_lut[_y0 * GRAIN_LUT_SIZE + _x1]; + const float l10 = grain_lut[_y1 * GRAIN_LUT_SIZE + _x0]; + const float l11 = grain_lut[_y1 * GRAIN_LUT_SIZE + _x1]; + + const float xy0 = (1.0 - y_diff) * l00 + l10 * y_diff; + const float xy1 = (1.0 - y_diff) * l01 + l11 * y_diff; + return xy0 * (1.0f - x_diff) + xy1 * x_diff; + } + + int ox; + int oy; + int fw; + int fh; + double scale; + int perm[512]; + float grain_lut[GRAIN_LUT_SIZE * GRAIN_LUT_SIZE]; +}; + +} // namespace + + +void ImProcFunctions::filmGrain(Imagefloat *rgb, int isogr, int strengr, int scalegr, float divgr, int bfw, int bfh, int call, int fw, int fh) +{ + if (settings->verbose) { + printf("iso=%i strength=%i scale=%i gamma=%f\n", isogr, strengr, scalegr, divgr); + } + + GrainEvaluator ge(0, 0, bfw, bfh, scale, divgr, call, fw, fh); + ge(isogr, strengr, scalegr, divgr, rgb, multiThread, call, fw, fh); +} + +} // namespace rtengine diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 1d3f2f494..dd02b8f0f 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -16,45 +16,56 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "rtengine.h" -#include "image8.h" -#include "imagefloat.h" -#include "labimage.h" -#include "improcfun.h" #include -#include "iccstore.h" -#include "iccmatrices.h" -#include "settings.h" + #include "alignedbuffer.h" #include "color.h" +#include "iccmatrices.h" +#include "iccstore.h" +#include "image8.h" +#include "imagefloat.h" +#include "improcfun.h" +#include "labimage.h" #include "procparams.h" +#include "rtengine.h" +#include "settings.h" +#include "utils.h" namespace rtengine { -extern void filmlike_clip(float *r, float *g, float *b); - 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; + for (int j = 0; j < W * 3; ++j) { + dst[j] = uint16ToUint8Rounded(CLIP(src[j] * MAXVALF)); } } 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; + const int W = src->W; + const int H = src->H; + float rgb_xyzf[3][3]; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + rgb_xyzf[i][j] = rgb_xyz[i][j]; + } + } + +#ifdef __SSE2__ + vfloat rgb_xyzv[3][3]; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + rgb_xyzv[i][j] = F2V(rgb_xyzf[i][j]); + } + } +#endif #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif @@ -64,22 +75,66 @@ inline void copyAndClamp(const LabImage *src, unsigned char *dst, const double r 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) { +#ifdef __SSE2__ + float rbuffer[W] ALIGNED16; + float gbuffer[W] ALIGNED16; + float bbuffer[W] ALIGNED16; + int j = 0; + for (; j < W - 3; j += 4) { + vfloat R, G, B; + vfloat x_, y_, z_; + Color::Lab2XYZ(LVFU(rL[j]), LVFU(ra[j]), LVFU(rb[j]), x_, y_, z_ ); + Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyzv); + STVF(rbuffer[j], Color::gamma2curve[R]); + STVF(gbuffer[j], Color::gamma2curve[G]); + STVF(bbuffer[j], Color::gamma2curve[B]); + } + for (; j < W; ++j) { + float R, G, B; + float x_, y_, z_; Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_ ); - Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyz); + Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyzf); + rbuffer[j] = Color::gamma2curve[R]; + gbuffer[j] = Color::gamma2curve[G]; + bbuffer[j] = Color::gamma2curve[B]; + } + + for (j = 0; j < W; ++j) { + dst[ix++] = uint16ToUint8Rounded(rbuffer[j]); + dst[ix++] = uint16ToUint8Rounded(gbuffer[j]); + dst[ix++] = uint16ToUint8Rounded(bbuffer[j]); + } + +#else + for (int j = 0; j < W; ++j) { + float R, G, B; + float x_, y_, z_; + Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_ ); + Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyzf); dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[R]); dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[G]); dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[B]); } +#endif } } } // namespace + +float gammalog(float x, float p, float s, float g3, float g4) +{ + return x <= g3 ? x * s : (1.f + g4) * xexpf(xlogf(x) / p) - g4;//continuous +} + +#ifdef __SSE2__ +vfloat gammalog(vfloat x, vfloat p, vfloat s, vfloat g3, vfloat g4) +{ + return vself(vmaskf_le(x, g3), x * s, (F2V(1.f) + g4) * xexpf(xlogf(x) / p) - g4);//continuous +} +#endif + // Used in ImProcCoordinator::updatePreviewImage (rtengine/improccoordinator.cc) // Crop::update (rtengine/dcrop.cc) // Thumbnail::processImage (rtengine/rtthumbnail.cc) @@ -90,8 +145,8 @@ void ImProcFunctions::lab2monitorRgb(LabImage* lab, Image8* image) { if (monitorTransform) { - int W = lab->W; - int H = lab->H; + const int W = lab->W; + const int H = lab->H; unsigned char * data = image->data; // cmsDoTransform is relatively expensive @@ -100,18 +155,19 @@ void ImProcFunctions::lab2monitorRgb(LabImage* lab, Image8* image) #endif { AlignedBuffer pBuf(3 * lab->W); - AlignedBuffer mBuf(3 * lab->W); + AlignedBuffer mBuf; AlignedBuffer gwBuf1; AlignedBuffer gwBuf2; if (gamutWarning) { gwBuf1.resize(3 * lab->W); gwBuf2.resize(3 * lab->W); + mBuf.resize(3 * lab->W); } float *buffer = pBuf.data; - float *outbuffer = mBuf.data; + float *outbuffer = gamutWarning ? mBuf.data : pBuf.data; // make in place transformations when gamutWarning is not needed #ifdef _OPENMP #pragma omp for schedule(dynamic,16) @@ -132,7 +188,7 @@ void ImProcFunctions::lab2monitorRgb(LabImage* lab, Image8* image) buffer[iy++] = rb[j] / 327.68f; } - cmsDoTransform (monitorTransform, buffer, outbuffer, W); + cmsDoTransform(monitorTransform, buffer, outbuffer, W); copyAndClampLine(outbuffer, data + ix, W); if (gamutWarning) { @@ -156,8 +212,6 @@ void ImProcFunctions::lab2monitorRgb(LabImage* lab, Image8* image) // 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, bool consider_histogram_settings) { - //gamutmap(lab); - if (cx < 0) { cx = 0; } @@ -177,11 +231,10 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, Image8* image = new Image8(cw, ch); Glib::ustring profile; - bool standard_gamma; + cmsHPROFILE oprof = nullptr; if (settings->HistogramWorking && consider_histogram_settings) { profile = icm.workingProfile; - standard_gamma = true; } else { profile = icm.outputProfile; @@ -189,27 +242,15 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, profile = "sRGB"; } - standard_gamma = false; + oprof = ICCStore::getInstance()->getProfile(profile); } - cmsHPROFILE oprof = ICCStore::getInstance()->getProfile(profile); - if (oprof) { - cmsHPROFILE oprofG = oprof; - - if (standard_gamma) { - oprofG = ICCStore::makeStdGammaProfile(oprof); - } - - cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; - - if (icm.outputBPC) { - flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; - } + const cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE | (icm.outputBPC ? cmsFLAGS_BLACKPOINTCOMPENSATION : 0); // NOCACHE is important for thread safety lcmsMutex->lock(); cmsHPROFILE LabIProf = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (LabIProf, TYPE_Lab_DBL, oprofG, TYPE_RGB_FLT, icm.outputIntent, flags); // NOCACHE is important for thread safety + cmsHTRANSFORM hTransform = cmsCreateTransform (LabIProf, TYPE_Lab_DBL, oprof, TYPE_RGB_FLT, icm.outputIntent, flags); cmsCloseProfile(LabIProf); lcmsMutex->unlock(); @@ -250,9 +291,6 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, cmsDeleteTransform(hTransform); - if (oprofG != oprof) { - cmsCloseProfile(oprofG); - } } else { const auto xyz_rgb = ICCStore::getInstance()->workingSpaceInverseMatrix(profile); copyAndClamp(lab, image->data, xyz_rgb, multiThread); @@ -350,11 +388,36 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i return image; } +void ImProcFunctions::preserv(LabImage *nprevl, LabImage *provis, int cw, int ch) +{//avoid too strong in middle values chroma when changing primaries + float pres = 0.01f * params->icm.preser; + float neutral = 2000000000.f;//if a2 + b2 < 200000000 scale 0..100 a and b about : 140 > a & b > -140 decrease effect + float medneutral = 10000000.f;//plein effect 10 > a & b > -10 + float aaneu = 1.f / (medneutral - neutral); + float bbneu = - aaneu * neutral; +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) nowait +#endif + for (int i = 0; i < ch; ++i) + for (int j = 0; j < cw; ++j) { + float neu = SQR(provis->a[i][j]) + SQR(provis->b[i][j]); + if (neu < medneutral) {//plein effect + nprevl->a[i][j] = intp(pres, provis->a[i][j], nprevl->a[i][j]); + nprevl->b[i][j] = intp(pres, provis->b[i][j], nprevl->b[i][j]); + } else if (neu < neutral) {//decrease effect + float presred = aaneu * neu + bbneu; + nprevl->a[i][j] = intp(pres * presred, provis->a[i][j], nprevl->a[i][j]); + nprevl->b[i][j] = intp(pres * presred, provis->b[i][j], nprevl->b[i][j]); + } + } +} -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 +void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, Glib::ustring &profile, double gampos, double slpos, int &illum, int prim, cmsHTRANSFORM &transform, bool normalizeIn, bool normalizeOut, bool keepTransForm) const { const TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + double wprofprim[3][3];//store primaries to XYZ + bool gamutcontrol = params->icm.gamut; const float toxyz[3][3] = { { static_cast(wprof[0][0] / ((normalizeIn ? 65535.0 : 1.0))), //I have suppressed / Color::D50x @@ -371,11 +434,207 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, } }; + if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1") { + if (settings->verbose) { + printf("Profile=%s\n", profile.c_str()); + } + } else { + if (settings->verbose) { + printf("profile not accepted\n"); + } + + return; + } + + if (mul == -5 && gampos == 2.4 && slpos == 12.92310) {//must be change if we change settings RT sRGB + //only in this case we can shortcut..all process..no gamut control..because we reduce...leads to very small differences, but big speedup +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) if (multiThread) +#endif + + for (int i = 0; i < ch; ++i) + for (int j = 0; j < cw; ++j) { + float r = src->r(i, j); + float g = src->g(i, j); + float b = src->b(i, j); + r = (Color::igammatab_srgb[r]) / 65535.f; + g = (Color::igammatab_srgb[g]) / 65535.f; + b = (Color::igammatab_srgb[b]) / 65535.f; + dst->r(i, j) = r; + dst->g(i, j) = g; + dst->b(i, j) = b; + } + + return; + + } + + if (mul == 1 || (params->icm.wprim == ColorManagementParams::Primaries::DEFAULT && params->icm.will == ColorManagementParams::Illuminant::DEFAULT)) { //shortcut and speedup when no call primaries and illuminant - no gamut control...in this case be careful + GammaValues g_a; //gamma parameters + double pwr = 1.0 / static_cast(gampos); + Color::calcGamma(pwr, slpos, g_a); // call to calcGamma with selected gamma and slope + +#ifdef _OPENMP + # pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int y = 0; y < ch; ++y) { + int x = 0; +#ifdef __SSE2__ + + for (; x < cw - 3; x += 4) { + STVFU(dst->r(y, x), F2V(65536.f) * gammalog(LVFU(src->r(y, x)), F2V(gampos), F2V(slpos), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(dst->g(y, x), F2V(65536.f) * gammalog(LVFU(src->g(y, x)), F2V(gampos), F2V(slpos), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(dst->b(y, x), F2V(65536.f) * gammalog(LVFU(src->b(y, x)), F2V(gampos), F2V(slpos), F2V(g_a[3]), F2V(g_a[4]))); + } + +#endif + + for (; x < cw; ++x) { + dst->r(y, x) = 65536.f * gammalog(src->r(y, x), gampos, slpos, g_a[3], g_a[4]); + dst->g(y, x) = 65536.f * gammalog(src->g(y, x), gampos, slpos, g_a[3], g_a[4]); + dst->b(y, x) = 65536.f * gammalog(src->b(y, x), gampos, slpos, g_a[3], g_a[4]); + } + } + + return; + } + + + float redxx = params->icm.redx; + float redyy = params->icm.redy; + float bluxx = params->icm.blux; + float bluyy = params->icm.bluy; + float grexx = params->icm.grex; + float greyy = params->icm.grey; + float epsil = 0.0001f; + + if (prim == 12) {//convert datas area to xy + float redgraphx = params->icm.labgridcieALow; + float redgraphy = params->icm.labgridcieBLow; + float blugraphx = params->icm.labgridcieAHigh; + float blugraphy = params->icm.labgridcieBHigh; + float gregraphx = params->icm.labgridcieGx; + float gregraphy = params->icm.labgridcieGy; + redxx = 0.55f * (redgraphx + 1.f) - 0.1f; + redxx = rtengine::LIM(redxx, 0.41f, 1.f);//limit values for xy (arbitrary) + redyy = 0.55f * (redgraphy + 1.f) - 0.1f; + redyy = rtengine::LIM(redyy, 0.f, 0.7f); + bluxx = 0.55f * (blugraphx + 1.f) - 0.1f; + bluxx = rtengine::LIM(bluxx, -0.1f, 0.5f); + bluyy = 0.55f * (blugraphy + 1.f) - 0.1f; + bluyy = rtengine::LIM(bluyy, -0.1f, 0.49f); + grexx = 0.55f * (gregraphx + 1.f) - 0.1f; + grexx = rtengine::LIM(grexx, -0.1f, 0.4f); + greyy = 0.55f * (gregraphy + 1.f) - 0.1f; + greyy = rtengine::LIM(greyy, 0.5f, 1.f); + } + + //fixed crash when there is no space or too small..just a line...Possible if bx, by aligned with Gx,Gy Rx,Ry + //fix crash if user select 0 for redyy, bluyy, greyy + if (redyy == 0.f) { + redyy = epsil; + } + + if (bluyy == 0.f) { + bluyy = epsil; + } + + if (greyy == 0.f) { + greyy = epsil; + } + + //fix crash if grexx - redxx = 0 + float grered = 1.f; + grered = grexx - redxx; + + if (grered == 0.f) { + grered = epsil; + } + + float ac = (greyy - redyy) / grered; + float bc = greyy - ac * grexx; + float yc = ac * bluxx + bc; + + if ((bluyy < yc + 0.0004f) && (bluyy > yc - 0.0004f)) { //under 0.0004 in some case crash because space too small + return; + } + + + switch (ColorManagementParams::Primaries(prim)) { + case ColorManagementParams::Primaries::DEFAULT: { + break; + } + + case ColorManagementParams::Primaries::SRGB: { + profile = "sRGB"; + break; + } + + case ColorManagementParams::Primaries::ADOBE_RGB: { + profile = "Adobe RGB"; + break; + } + + case ColorManagementParams::Primaries::PRO_PHOTO: { + profile = "ProPhoto"; + break; + } + + case ColorManagementParams::Primaries::REC2020: { + profile = "Rec2020"; + break; + } + + case ColorManagementParams::Primaries::ACES_P1: { + profile = "ACESp1"; + break; + } + + case ColorManagementParams::Primaries::WIDE_GAMUT: { + profile = "WideGamut"; + break; + } + + case ColorManagementParams::Primaries::ACES_P0: { + break; + } + + case ColorManagementParams::Primaries::BRUCE_RGB: { + profile = "BruceRGB"; + break; + } + + case ColorManagementParams::Primaries::BETA_RGB: { + profile = "Beta RGB"; + break; + } + + case ColorManagementParams::Primaries::BEST_RGB: { + profile = "BestRGB"; + break; + } + + case ColorManagementParams::Primaries::CUSTOM: { + profile = "Custom"; + break; + } + + case ColorManagementParams::Primaries::CUSTOM_GRID: { + profile = "Custom"; + break; + } + } + + if (settings->verbose && prim != 0) { + printf("prim=%i Profile Destination=%s\n", prim, profile.c_str()); + } + cmsHTRANSFORM hTransform = nullptr; + if (transform) { hTransform = transform; } else { - double pwr = 1.0 / gampos; double ts = slpos; int five = mul; @@ -396,9 +655,10 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, D60 = 6005 // for ACES AP0 and AP1 }; - ColorTemp temp = ColorTemp::D50; - - float p[6]; //primaries + double tempv4 = 5003.; + double p[6]; //primaries + double Wx = 1.0; + double Wz = 1.0; //primaries for 10 working profiles ==> output profiles if (profile == "WideGamut") { @@ -408,6 +668,10 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.8260; p[4] = 0.1570; p[5] = 0.0180; + illum = toUnderlying(ColorManagementParams::Illuminant::D50); + Wx = 0.964295676; + Wz = 0.825104603; + } else if (profile == "Adobe RGB") { p[0] = 0.6400; //Adobe primaries p[1] = 0.3300; @@ -415,7 +679,11 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.7100; p[4] = 0.1500; p[5] = 0.0600; - temp = ColorTemp::D65; + tempv4 = 6504.; + illum = toUnderlying(ColorManagementParams::Illuminant::D65); + Wx = 0.95045471; + Wz = 1.08905029; + } else if (profile == "sRGB") { p[0] = 0.6400; // sRGB primaries p[1] = 0.3300; @@ -423,7 +691,11 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.6000; p[4] = 0.1500; p[5] = 0.0600; - temp = ColorTemp::D65; + tempv4 = 6504.; + illum = toUnderlying(ColorManagementParams::Illuminant::D65); + Wx = 0.95045471; + Wz = 1.08905029; + } else if (profile == "BruceRGB") { p[0] = 0.6400; // Bruce primaries p[1] = 0.3300; @@ -431,7 +703,11 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.6500; p[4] = 0.1500; p[5] = 0.0600; - temp = ColorTemp::D65; + tempv4 = 6504.; + illum = toUnderlying(ColorManagementParams::Illuminant::D65); + Wx = 0.95045471; + Wz = 1.08905029; + } else if (profile == "Beta RGB") { p[0] = 0.6888; // Beta primaries p[1] = 0.3112; @@ -439,6 +715,10 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.7551; p[4] = 0.1265; p[5] = 0.0352; + illum = toUnderlying(ColorManagementParams::Illuminant::D50); + Wx = 0.964295676; + Wz = 0.825104603; + } else if (profile == "BestRGB") { p[0] = 0.7347; // Best primaries p[1] = 0.2653; @@ -446,6 +726,10 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.7750; p[4] = 0.1300; p[5] = 0.0350; + illum = toUnderlying(ColorManagementParams::Illuminant::D50); + Wx = 0.964295676; + Wz = 0.825104603; + } else if (profile == "Rec2020") { p[0] = 0.7080; // Rec2020 primaries p[1] = 0.2920; @@ -453,7 +737,11 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.7970; p[4] = 0.1310; p[5] = 0.0460; - temp = ColorTemp::D65; + tempv4 = 6504.; + illum = toUnderlying(ColorManagementParams::Illuminant::D65); + Wx = 0.95045471; + Wz = 1.08905029; + } else if (profile == "ACESp0") { p[0] = 0.7347; // ACES P0 primaries p[1] = 0.2653; @@ -461,7 +749,11 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 1.0; p[4] = 0.0001; p[5] = -0.0770; - temp = ColorTemp::D60; + tempv4 = 6004.; + illum = toUnderlying(ColorManagementParams::Illuminant::D60); + Wx = 0.952646075; + Wz = 1.008825184; + } else if (profile == "ACESp1") { p[0] = 0.713; // ACES P1 primaries p[1] = 0.293; @@ -469,7 +761,11 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.830; p[4] = 0.128; p[5] = 0.044; - temp = ColorTemp::D60; + tempv4 = 6004.; + illum = toUnderlying(ColorManagementParams::Illuminant::D60); + Wx = 0.952646075; + Wz = 1.008825184; + } else if (profile == "ProPhoto") { p[0] = 0.7347; //ProPhoto and default primaries p[1] = 0.2653; @@ -477,6 +773,17 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, p[3] = 0.8404; p[4] = 0.0366; p[5] = 0.0001; + illum = toUnderlying(ColorManagementParams::Illuminant::D50); + Wx = 0.964295676; + Wz = 0.825104603; + + } else if (profile == "Custom") { + p[0] = redxx; + p[1] = redyy; + p[2] = grexx; + p[3] = greyy; + p[4] = bluxx; + p[5] = bluyy; } else { p[0] = 0.7347; //default primaries always unused p[1] = 0.2653; @@ -491,8 +798,7 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, } 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 + Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 cmsFloat64Number gammaParams[7]; @@ -503,35 +809,199 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, 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); + // 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 + + Glib::ustring ills = "D50"; + + switch (ColorManagementParams::Illuminant(illum)) { + case ColorManagementParams::Illuminant::DEFAULT: + case ColorManagementParams::Illuminant::STDA: + case ColorManagementParams::Illuminant::TUNGSTEN_2000K: + case ColorManagementParams::Illuminant::TUNGSTEN_1500K: { + break; + } + + case ColorManagementParams::Illuminant::D41: { + tempv4 = 4100.; + ills = "D41"; + break; + } + + case ColorManagementParams::Illuminant::D50: { + tempv4 = 5003.; + ills = "D50"; + break; + } + + case ColorManagementParams::Illuminant::D55: { + tempv4 = 5500.; + ills = "D55"; + break; + } + + case ColorManagementParams::Illuminant::D60: { + tempv4 = 6004.; + ills = "D60"; + break; + } + + case ColorManagementParams::Illuminant::D65: { + tempv4 = 6504.; + ills = "D65"; + break; + } + + case ColorManagementParams::Illuminant::D80: { + tempv4 = 8000.; + ills = "D80"; + break; + } + + case ColorManagementParams::Illuminant::D120: { + tempv4 = 12000.; + ills = "D120"; + break; + } } + cmsWhitePointFromTemp(&xyD, tempv4); + + switch (ColorManagementParams::Illuminant(illum)) { + case ColorManagementParams::Illuminant::DEFAULT: { + break; + } + + case ColorManagementParams::Illuminant::D55: { + Wx = 0.956565934; + Wz = 0.920253249; + break; + } + + case ColorManagementParams::Illuminant::D80: { + Wx = 0.950095542; + Wz = 1.284213976; + break; + } + + case ColorManagementParams::Illuminant::D41: { + Wx = 0.991488263; + Wz = 0.631604625; + break; + } + + case ColorManagementParams::Illuminant::D50: { + xyD = {0.3457, 0.3585, 1.0}; // near LCMS values but not perfect... it's a compromise!! + Wx = 0.964295676; + Wz = 0.825104603; + break; + } + + case ColorManagementParams::Illuminant::D60: { + Wx = 0.952646075; + Wz = 1.008825184; + xyD = {0.32168, 0.33767, 1.0}; + break; + } + + case ColorManagementParams::Illuminant::D65: { + Wx = 0.95045471; + Wz = 1.08905029; + xyD = {0.312700492, 0.329000939, 1.0}; + break; + } + + case ColorManagementParams::Illuminant::D120: { + Wx = 0.979182; + Wz = 1.623623; + xyD = {0.269669, 0.28078, 1.0}; + break; + } + + case ColorManagementParams::Illuminant::STDA: { + Wx = 1.098500393; + Wz = 0.355848714; + xyD = {0.447573, 0.407440, 1.0}; + ills = "stdA 2875K"; + break; + } + + case ColorManagementParams::Illuminant::TUNGSTEN_2000K: { + Wx = 1.274335; + Wz = 0.145233; + xyD = {0.526591, 0.41331, 1.0}; + ills = "Tungsten 2000K"; + break; + } + + case ColorManagementParams::Illuminant::TUNGSTEN_1500K: { + Wx = 1.489921; + Wz = 0.053826; + xyD = {0.585703, 0.393157, 1.0}; + ills = "Tungsten 1500K"; + break; + } + } + + double wprofpri[9]; + + if (gamutcontrol) { + //xyz in functiuon primaries and illuminant + Color::primaries_to_xyz(p, Wx, Wz, wprofpri); + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + wprofprim[i][j] = (double) wprofpri[j * 3 + i]; + //xyz in TMatrix format + } + } + } + + //D41 0.377984 0.381229 + //D55 0.332424 0.347426 + //D80 0.293755 0.309185 + //D75 0.299021 0.314852 cmsToneCurve* GammaTRC[3]; GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, five, gammaParams);//5 = more smoother than 4 + cmsHPROFILE oprofdef = nullptr; 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); + oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); + cmsWriteTag(oprofdef, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(oprofdef, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(oprofdef, cmsSigBlueTRCTag, GammaTRC[2]); + + //to read XYZ values and illuminant + if (rtengine::settings->verbose) { + cmsCIEXYZ *redT = static_cast(cmsReadTag(oprofdef, cmsSigRedMatrixColumnTag)); + cmsCIEXYZ *greenT = static_cast(cmsReadTag(oprofdef, cmsSigGreenMatrixColumnTag)); + cmsCIEXYZ *blueT = static_cast(cmsReadTag(oprofdef, cmsSigBlueMatrixColumnTag)); + printf("Illuminant=%s\n", ills.c_str()); + printf("rX=%f gX=%f bX=%f\n", redT->X, greenT->X, blueT->X); + printf("rY=%f gY=%f bY=%f\n", redT->Y, greenT->Y, blueT->Y); + printf("rZ=%f gZ=%f bZ=%f\n", redT->Z, greenT->Z, blueT->Z); + } + cmsFreeToneCurve(GammaTRC[0]); if (oprofdef) { - constexpr cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; + constexpr cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE | cmsFLAGS_BLACKPOINTCOMPENSATION | cmsFLAGS_GAMUTCHECK; const cmsHPROFILE iprof = ICCStore::getInstance()->getXYZProfile(); lcmsMutex->lock(); - hTransform = cmsCreateTransform(iprof, TYPE_RGB_FLT, oprofdef, TYPE_RGB_FLT, params->icm.outputIntent, flags); + hTransform = cmsCreateTransform(iprof, TYPE_RGB_FLT, oprofdef, TYPE_RGB_FLT, params->icm.aRendIntent, flags); lcmsMutex->unlock(); } } + if (hTransform) { + + #ifdef _OPENMP #pragma omp parallel if (multiThread) #endif @@ -543,19 +1013,30 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, #pragma omp for schedule(dynamic, 16) nowait #endif - for (int i = 0; i < ch; ++i) { + 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); + float X = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b; + float Y = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; + float Z = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; - *(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; + if (gamutcontrol) { + Color::gamutmap(X, Y, Z, wprofprim);//gamut control + } + + *(p++) = X; + *(p++) = Y; + *(p++) = Z; } + 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; @@ -563,10 +1044,12 @@ void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, } } } + if (!keepTransForm) { cmsDeleteTransform(hTransform); hTransform = nullptr; } + transform = hTransform; } } diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc index 6526419f5..786d42e56 100644 --- a/rtengine/iplabregions.cc +++ b/rtengine/iplabregions.cc @@ -139,7 +139,7 @@ BENCHFUN 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)); + float blend = LIM01((hm ? hm->getVal(h) : 1.0) * (cm ? cm->getVal(c) : 1.0) * (lm ? lm->getVal(l) : 1.0)); Lmask[i][y][x] = abmask[i][y][x] = blend; } } @@ -147,8 +147,8 @@ BENCHFUN } 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; + double blur = params->colorToning.labregions[i].maskBlur; + blur = blur < 0.0 ? -1.0 / blur : 1.0 + 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); @@ -188,7 +188,7 @@ BENCHFUN 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); + rs[i] = 1.0 + r.saturation / (SGN(r.saturation) > 0 ? 50.0 : 100.0); slope[i] = r.slope; offset[i] = r.offset; power[i] = r.power; diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index daeb142dd..74d02d3fa 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -27,32 +27,51 @@ #include "labimage.h" #include "improcfun.h" #include "procparams.h" +#include "settings.h" namespace rtengine { -void ImProcFunctions::localContrast(LabImage *lab) +void ImProcFunctions::localContrast(LabImage *lab, float **destination, const rtengine::procparams::LocalContrastParams &localContrastParams, bool fftwlc, double scale) { - if (!params->localContrast.enabled) { + if (!localContrastParams.enabled) { return; } const int width = lab->W; const int height = lab->H; - const float a = params->localContrast.amount; - const float dark = params->localContrast.darkness; - const float light = params->localContrast.lightness; + const float a = localContrastParams.amount; + const float dark = localContrastParams.darkness; + const float light = localContrastParams.lightness; array2D buf(width, height); - const float sigma = params->localContrast.radius / scale; - + float sigma = localContrastParams.radius / scale; + //printf("wi%i he=%i am=%f da=%f li=%f si=%f\n", width, height, a, dark, light, sigma); + if(!fftwlc) { #ifdef _OPENMP - #pragma omp parallel if(multiThread) + #pragma omp parallel if(multiThread) #endif - gaussianBlur(lab->L, buf, width, height, sigma); - + gaussianBlur(lab->L, buf, width, height, sigma); + } else { + float kr = 1.f; + //emprical adjustment between FFTW radius and Gaussainblur + //under 50 ==> 10.f + //above 400 ==> 1.f + if(settings->fftwsigma == false) {//empirical formula + float ak = -9.f / 350.f; + float bk = 10.f - 50.f * ak; + kr = ak * sigma + bk; + if(sigma < 50.f) kr = 10.f; + if(sigma > 400.f) kr = 1.f; + } else {//sigma *= sigma + kr = sigma; + } + //OPENMP disabled + ImProcFunctions::fftw_convol_blur2(lab->L, buf, width, height, kr * sigma, 0, 0); + } #ifdef _OPENMP #pragma omp parallel for if(multiThread) #endif + for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { float bufval = (lab->L[y][x] - buf[y][x]) * a; @@ -61,7 +80,7 @@ void ImProcFunctions::localContrast(LabImage *lab) bufval *= (bufval > 0.f) ? light : dark; } - lab->L[y][x] = std::max(0.0001f, lab->L[y][x] + bufval); + destination[y][x] = LIM(lab->L[y][x] + bufval, 0.0001f, 32767.f); } } } diff --git a/rtengine/iplocallab.cc b/rtengine/iplocallab.cc new file mode 100644 index 000000000..6db6b7627 --- /dev/null +++ b/rtengine/iplocallab.cc @@ -0,0 +1,18959 @@ +/* + * 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 . + * 2016 - 2020 Jacques Desmis + * 2016 - 2020 Ingo Weyrich + + */ +#include +#include + +#include "improcfun.h" +#include "colortemp.h" +#include "curves.h" +#include "gauss.h" +#include "iccstore.h" +#include "imagefloat.h" +#include "labimage.h" +#include "color.h" +#include "rt_math.h" +#include "jaggedarray.h" +#include "rt_algo.h" +#include "settings.h" +#include "../rtgui/options.h" +#include "utils.h" +#include "iccmatrices.h" +#ifdef _OPENMP +#include +#endif +#include "../rtgui/thresholdselector.h" +#include "imagesource.h" + +#include "cplx_wavelet_dec.h" +#include "ciecam02.h" + +#define BENCHMARK +#include "StopWatch.h" +#include "guidedfilter.h" +#include "boxblur.h" +#include "rescale.h" + + + +#pragma GCC diagnostic warning "-Wall" +#pragma GCC diagnostic warning "-Wextra" +#pragma GCC diagnostic warning "-Wdouble-promotion" + +namespace +{ + +constexpr int limscope = 80; +constexpr int mSPsharp = 39; //minimum size Spot Sharp due to buildblendmask +constexpr int mSPwav = 32; //minimum size Spot Wavelet +constexpr int mDEN = 128; //minimum size Spot Denoise +constexpr int mSP = 5; //minimum size Spot +constexpr float MAXSCOPE = 1.25f; +constexpr float MINSCOPE = 0.025f; +constexpr int TS = 64; // Tile size +constexpr float epsilonw = 0.001f / (TS * TS); //tolerance +constexpr int offset = 25; // shift between tiles +constexpr double czlim = rtengine::RT_SQRT1_2;// 0.70710678118654752440; + +constexpr float clipLoc(float x) +{ + return rtengine::LIM(x, 0.f, 32767.f); +} + +constexpr float clipDE(float x) +{ + return rtengine::LIM(x, 0.3f, 1.f); +} + +constexpr float clipC(float x) +{ + return rtengine::LIM(x, -42000.f, 42000.f); +} + +constexpr float clipChro(float x) +{ + return rtengine::LIM(x, 0.f, 140.f); +} + +constexpr double clipazbz(double x) +{ + return rtengine::LIM(x, -0.5, 0.5); +} + +constexpr double clipcz(double x) +{ + return rtengine::LIM(x, 0., czlim); +} + + +constexpr double clipjz05(double x) +{ + return rtengine::LIM(x, 0.0006, 1.0); +} + +float softlig(float a, float b, float minc, float maxc) +{ + // as Photoshop + if (2.f * b <= maxc - minc) { + return a * (2.f * b + a * (maxc - 2.f * b)); + } else { + return 2.f * a * (maxc - b) + std::sqrt(rtengine::LIM(a, 0.f, 2.f)) * (2.f * b - maxc); + } +} + +float softlig3(float a, float b) +{ + // as w3C + if (2.f * b <= 1.f) { + return a - (1.f - 2.f * b) * a * (1.f - a); + } else { + if (4.f * a <= 1.f) { + return a + (2.f * b - 1.f) * (4.f * a * (4.f * a + 1.f) * (a - 1.f) + 7.f * a); + } else { + return a + (2.f * a - 1.f) * (std::sqrt(a) - a); + } + } +} + +float softlig2(float a, float b) +{ + // illusions.hu + return pow_F(b, pow_F(2.f, (2.f * (0.5f - a)))); +} + +constexpr float colburn(float a, float b) +{ + // w3C + return b == 0.f ? 0.f : 1.f - rtengine::min(1.f, (1.f - a) / b); +} + +constexpr float coldodge(float a, float b) +{ + // w3C + return b == 1.f ? 1.f : rtengine::min(1.f, a / (1.f - b)); +} + +float overlay(float a, float b, float minc, float maxc) +{ + if (2.f * b <= maxc - minc) { + return 2.f * b * a; + } else { + return maxc - 2.f * (1.f - a) * (maxc - b); + } +} + +constexpr float screen(float a, float b, float maxc) +{ + return 1.f - (1.f - a) * (maxc - b); +} + +constexpr float exclusion(float a, float b) +{ + return a + b - 2.f * a * b; +} + +void calcdif(float lmr, float &lmrc) +{ //approximative change between gamma sRGB g=2.4 s=12.92 and gamma LAB g=3.0 s=9.03 + //useful to calculate action with dark and light area mask + //differences in 3 parts linear...very small differences with real... + float a0 = 7.6f / 11.6f;//11.6 sRGB - 7.6 Lab...11.6 max difference + float a01 = 62.f - 7.6f; //60 sRGB 62 Lab 60 max difference + float a11 = 60.f - 11.6f; + float a1 = a01 / a11; + float b1 = 62.f - a1 * 60.f; + float a2 = (100.f - 62.f) / (100.f - 60.f); + float b2 = 100.f - a2 * 100.f; + if(lmr < 11.6f) { + lmrc = a0 * lmr; + } else if (lmr < 60.f) { + lmrc = a1 * lmr + b1; + } else { + lmrc = a2 * lmr + b2; + } +} + +void calcGammaLut(double gamma, double ts, LUTf &gammaLut) +{ + double pwr = 1.0 / gamma; + double gamm = gamma; + const double gamm2 = gamma; + rtengine::GammaValues g_a; + + if (gamm2 < 1.0) { + std::swap(pwr, gamm); + } + + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + const double start = gamm2 < 1. ? g_a[2] : g_a[3]; + const double add = g_a[4]; + const double mul = 1.0 + g_a[4]; + + if (gamm2 < 1.) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 1024) +#endif + for (int i = 0; i < 65536; i++) { + const double x = rtengine::Color::igammareti(i / 65535.0, gamm, start, ts, mul, add); + gammaLut[i] = 0.5 * rtengine::CLIP(x * 65535.0); // CLIP avoid in some case extra values + } + } else { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 1024) +#endif + for (int i = 0; i < 65536; i++) { + const double x = rtengine::Color::gammareti(i / 65535.0, gamm, start, ts, mul, add); + gammaLut[i] = 0.5 * rtengine::CLIP(x * 65535.0); // CLIP avoid in some case extra values + } + } +} + +float calcLocalFactor(const float lox, const float loy, const float lcx, const float dx, const float lcy, const float dy, const float ach, const float gradient) +{ + //ellipse x2/a2 + y2/b2=1 + //transition ellipsoidal + const float kelip = dx / dy; + const float belip = rtengine::max(0.0001f, std::sqrt((rtengine::SQR((lox - lcx) / kelip) + rtengine::SQR(loy - lcy)))); //determine position ellipse ==> a and b + + //gradient allows differentiation between transition x and y + const float rapy = std::fabs((loy - lcy) / belip); + const float aelip = belip * kelip; + const float degrad = aelip / dx; + const float gradreal = gradient * rapy + 1.f; + const float ap = rtengine::RT_PI_F / (1.f - ach); + const float bp = rtengine::RT_PI_F - ap; + return pow(0.5f * (1.f + xcosf(degrad * ap + bp)), rtengine::SQR(gradreal)); // trigo cos transition +} + +float calcLocalFactorrect(const float lox, const float loy, const float lcx, const float dx, const float lcy, const float dy, const float ach, const float gradient) +{ + constexpr float eps = 0.0001f; + const float krap = std::fabs(dx / dy); + const float kx = lox - lcx; + const float ky = loy - lcy; + + float ref; + //gradient allows differentiation between transition x and y + if (std::fabs(kx / (ky + eps)) < krap) { + ref = std::sqrt(rtengine::SQR(dy) * (1.f + rtengine::SQR(kx / (ky + eps)))); + } else { + ref = std::sqrt(rtengine::SQR(dx) * (1.f + rtengine::SQR(ky / (kx + eps)))); + } + + const float rad = rtengine::max(eps, std::sqrt(rtengine::SQR(kx) + rtengine::SQR(ky))); + const float rapy = std::fabs((loy - lcy) / rad); + const float gradreal = gradient * rapy + 1.f; + + const float coef = rad / ref; + const float fact = (coef - 1.f) / (ach - 1.f); + return pow(fact, rtengine::SQR(gradreal)); +} + +float calcreducdE(float dE, float maxdE, float mindE, float maxdElim, float mindElim, float iterat, int limscope, int scope) +{ + if (scope > limscope) {//80 arbitrary value, if we change we must change limscope + if (dE > maxdElim) { + return 0.f; + } else if (dE > mindElim) { + const float reducdElim = std::pow((dE - maxdElim) / (mindElim - maxdElim), iterat); + const float aalim = (1.f - reducdElim) / 20.f; + const float bblim = 1.f - 100.f * aalim; + return aalim * scope + bblim; + } else { + return 1.f; + } + } else { + if (dE > maxdE) { + return 0.f; + } else if (dE > mindE) { + return std::pow((dE - maxdE) / (mindE - maxdE), iterat); + } else { + return 1.f; + } + } +} + + + +void deltaEforLaplace(float *dE, const float lap, int bfw, int bfh, rtengine::LabImage* bufexporig, const float hueref, const float chromaref, const float lumaref) +{ + + const float refa = chromaref * std::cos(hueref); + const float refb = chromaref * std::sin(hueref); + const float refL = lumaref; + float maxdE = 5.f + MAXSCOPE * lap; + + float maxC = std::sqrt((rtengine::SQR(refa - bufexporig->a[0][0]) + rtengine::SQR(refb - bufexporig->b[0][0])) + rtengine::SQR(refL - bufexporig->L[0][0])) / 327.68f; +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxC) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + const float val = std::sqrt((rtengine::SQR(refa - bufexporig->a[y][x]) + rtengine::SQR(refb - bufexporig->b[y][x])) + rtengine::SQR(refL - bufexporig->L[y][x])) / 327.68f; + dE[y * bfw + x] = val; + maxC = rtengine::max(maxC, val); + } + } + + if (maxdE > maxC) { + maxdE = maxC - 1.f; + } + + const float ade = 1.f / (maxdE - maxC); + // const float bde = -ade * maxC; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + // dE[y * bfw + x] = dE[y * bfw + x] >= maxdE ? ade * dE[y * bfw + x] + bde : 1.f; + dE[y * bfw + x] = dE[y * bfw + x] >= maxdE ? ade * (dE[y * bfw + x] - maxC) : 1.f; + + } + } +} + +float calclight(float lum, const LUTf &lightCurveloc) +{ + return clipLoc(lightCurveloc[lum]); +} + +float calclightinv(float lum, float koef, const LUTf &lightCurveloc) +{ + return koef != -100.f ? clipLoc(lightCurveloc[lum]) : 0.f; +} + +float balancedeltaE(float kL) +{ + constexpr float mincurs = 0.3f; // minimum slider balan_ + constexpr float maxcurs = 1.7f; // maximum slider balan_ + constexpr float maxkab = 1.35; // 0.5 * (3 - 0.3) + constexpr float minkab = 0.65; // 0.5 * (3 - 1.7) + constexpr float abal = (maxkab - minkab) / (mincurs - maxcurs); + constexpr float bbal = maxkab - mincurs * abal; + return abal * kL + bbal; +} + +void SobelCannyLuma(float **sobelL, float **luma, int bfw, int bfh, float radius) +{ + // base of the process to detect shape in complement of deltaE + // use for calculate Spot reference + // and for structure of the shape + // actually , as the program don't use these function, I just create a simple "Canny" near of Sobel. This can be completed after with teta, etc. + array2D tmL(bfw, bfh); + + //inspired from Chen Guanghua Zhang Xiaolong + //Sobel Horizontal + constexpr float GX[3][3] = { + {1.f, 0.f, -1.f}, + {2.f, 0.f, -2.f}, + {1.f, 0.f, -1.f} + }; + + //Sobel Vertical + constexpr float GY[3][3] = { + {1.f, 2.f, 1.f}, + {0.f, 0.f, 0.f}, + {-1.f, -2.f, -1.f} + }; + + if (radius > 0.f) { + gaussianBlur(luma, tmL, bfw, bfh, rtengine::max(radius / 2.f, 0.5f)); + } else { + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw ; x++) { + tmL[y][x] = luma[y][x]; + } + } + } + + for (int x = 0; x < bfw; x++) { + sobelL[0][x] = 0.f; + } + for (int y = 1; y < bfh - 1; y++) { + sobelL[y][0] = 0.f; + for (int x = 1; x < bfw - 1; x++) { + float sumXL = 0.f; + float sumYL = 0.f; + for (int i = -1; i < 2; i += 2) { + for (int j = -1; j < 2; j += 1) { + sumXL += GX[j + 1][i + 1] * tmL[y + i][x + j]; + sumYL += GY[j + 1][i + 1] * tmL[y + i][x + j]; + } + } + //Edge strength + //we can add if need teta = atan2 (sumYr, sumXr) + sobelL[y][x] = rtengine::min(std::sqrt(rtengine::SQR(sumXL) + rtengine::SQR(sumYL)), 32767.f); + } + sobelL[y][bfw - 1] = 0.f; + } + for (int x = 0; x < bfw; x++) { + sobelL[bfh - 1][x] = 0.f; + } +} + + +float igammalog(float x, float p, float s, float g2, float g4) +{ + return x <= g2 ? x / s : pow_F((x + g4) / (1.f + g4), p);//continuous +} + +#ifdef __SSE2__ +vfloat igammalog(vfloat x, vfloat p, vfloat s, vfloat g2, vfloat g4) +{ + // return x <= g2 ? x / s : pow_F((x + g4) / (1.f + g4), p);//continuous + return vself(vmaskf_le(x, g2), x / s, pow_F((x + g4) / (F2V(1.f) + g4), p)); +} +#endif + +float gammalog(float x, float p, float s, float g3, float g4) +{ + return x <= g3 ? x * s : (1.f + g4) * xexpf(xlogf(x) / p) - g4;//used by Nlmeans +} + +#ifdef __SSE2__ +vfloat gammalog(vfloat x, vfloat p, vfloat s, vfloat g3, vfloat g4) +{ + // return x <= g3 ? x * s : (1.f + g4) * xexpf(xlogf(x) / p) - g4;//continuous + return vself(vmaskf_le(x, g3), x * s, (F2V(1.f) + g4) * xexpf(xlogf(x) / p) - g4);//improve by Ingo - used by Nlmeans + +} +#endif +} + +namespace rtengine + +{ +extern MyMutex *fftwMutex; + +using namespace procparams; + +struct local_params { + float yc, xc; + float lx, ly; + float lxL, lyT; + float transweak; + float transgrad; + float iterat; + float balance; + float balanceh; + int colorde; + int cir; + bool recur; + float thr; + float stru; + int chro, cont, sens, sensh, senscb, sensbn, senstm, sensex, sensexclu, sensden, senslc, senssf, senshs, senscolor; + float reparden; + float repartm; + float clarityml; + float contresid; + bool deltaem; + float struco; + float strengrid; + float struexc; + float blendmacol; + float radmacol; + float chromacol; + float gammacol; + float slomacol; + float blendmalc; + float radmalc; + float chromalc; + float radmaexp; + float chromaexp; + float gammaexp; + float slomaexp; + float strmaexp; + float angmaexp; + float str_mas; + float ang_mas; + float strexp; + float angexp; + float strSH; + float angSH; + float strcol; + float strcolab; + float strcolh; + float angcol; + float strvib; + float strvibab; + float strvibh; + float angvib; + float angwav; + float strwav; + float blendmaL; + float radmaL; + float chromaL; + + float strengthw; + float radiusw; + float detailw; + float gradw; + float tloww; + float thigw; + float edgw; + float basew; + + float anglog; + float strlog; + float softradiusexp; + float softradiuscol; + float softradiuscb; + float softradiusret; + float softradiustm; + float blendmaexp; + float radmaSH; + float blendmaSH; + float chromaSH; + float gammaSH; + float slomaSH; + float radmavib; + float blendmavib; + float chromavib; + float gammavib; + float slomavib; + float radmacb; + float blendmacb; + float chromacbm; + float gammacb; + float slomacb; + float radmatm; + float blendmatm; + float chromatm; + float gammatm; + float slomatm; + + float radmabl; + float blendmabl; + float chromabl; + float gammabl; + float slomabl; + + float struexp; + float blurexp; + float blurcol; + float blurcolmask; + float contcolmask; + float blurSH; + float ligh; + float gamc; + float gamlc; + float gamex; + float lowA, lowB, highA, highB; + float lowBmerg, highBmerg, lowAmerg, highAmerg; + int shamo, shdamp, shiter, senssha, sensv; + float neig; + float strng; + float lap; + float lcamount; + double shrad; + double shblurr; + double rad; + double stren; + int it; + int guidb; + float strbl; + float epsb; + float trans; + float feath; + int dehaze; + int dehazeSaturation; + int depth; + bool inv; + bool invex; + bool invsh; + bool curvact; + bool invrad; + bool invret; + bool equret; + bool equtm; + bool invshar; + bool actsp; + bool ftwlc; + bool ftwreti; + float str; + int qualmet; + int qualcurvemet; + int gridmet; + bool prevdE; + int showmaskcolmet; + int showmaskcolmetinv; + int showmaskexpmet; + int showmaskexpmetinv; + int showmaskSHmet; + int showmaskSHmetinv; + int showmaskvibmet; + int showmasklcmet; + int showmasksharmet; + int showmaskcbmet; + int showmaskretimet; + int showmasksoftmet; + int showmasktmmet; + int showmaskblmet; + int showmasklogmet; + int showmask_met; + int showmaskciemet; + bool fftbl; + float laplacexp; + float balanexp; + float linear; + int fullim; + int expmet; + int softmet; + int blurmet; + int blmet; + bool invmaskd; + bool invmask; + int smasktyp; + int chromet; + int quamet; + int shmeth; + int medmet; + int locmet; + float noiself; + float noiself0; + float noiself2; + float noiseldetail; + int detailthr; + float recothr; + float lowthr; + float higthr; + float recothrd; + float lowthrd; + float midthrd; + float midthrdch; + float higthrd; + float decayd; + float recothrc; + float lowthrc; + float higthrc; + float decayc; + float recothre; + float lowthre; + float higthre; + float decaye; + float recothrv; + float lowthrv; + float higthrv; + float decayv; + float recothrcb; + float lowthrcb; + float higthrcb; + float decaycb; + float recothrt; + float lowthrt; + float higthrt; + float decayt; + float recothrw; + float lowthrw; + float higthrw; + float decayw; + float recothrr; + float lowthrr; + float higthrr; + float decayr; + float recothrs; + float lowthrs; + float higthrs; + float decays; + float recothrl; + float lowthrl; + float higthrl; + float decayl; + float recothrcie; + float lowthrcie; + float higthrcie; + float decaycie; + + int noiselequal; + float noisechrodetail; + float bilat; + int nlstr; + int nldet; + int nlpat; + int nlrad; + float nlgam; + float noisegam; + float noiselc; + float noiselc4; + float noiselc5; + float noiselc6; + float noisecf; + float noisecc; + float mulloc[6]; + int mullocsh[5]; + int detailsh; + double tePivot; + float threshol; + float chromacb; + float strengt; + float gamm; + float esto; + float scalt; + float rewe; + float amo; + bool colorena; + bool blurena; + bool tonemapena; + bool retiena; + bool sharpena; + bool lcena; + bool sfena; + bool cbdlena; + bool denoiena; + bool wavcurvedenoi; + bool expvib; + bool exposena; + bool hsena; + bool vibena; + bool logena; + bool islocal; + bool maskena; + bool cieena; + bool cut_past; + float past; + float satur; + int blac; + int shcomp; + int shadex; + int hlcomp; + int hlcompthr; + float expcomp; + float expchroma; + int excmet; + int mergemet; + int mergecolMethod; + float opacol; + int war; + float adjch; + int shapmet; + int edgwmet; + int neiwmet; + bool enaColorMask; + bool fftColorMask; + bool enaColorMaskinv; + bool enaExpMask; + bool enaExpMaskinv; + bool enaSHMask; + bool enaSHMaskinv; + bool enavibMask; + bool enalcMask; + bool enasharMask; + bool enacbMask; + bool enaretiMask; + bool enaretiMasktmap; + bool enatmMask; + bool enablMask; + bool enaLMask; + bool ena_Mask; + bool enacieMask; + int highlihs; + int shadowhs; + int radiushs; + int hltonalhs; + int shtonalhs; + int scalereti; + float sourcegray; + float targetgray; + float blackev; + float whiteev; + float detail; + int sensilog; + int sensicie; + int sensimas; + bool Autogray; + bool autocompute; + float baselog; + bool wavgradl; + bool edgwena; + bool lip3; + int daubLen; + float sigmadr; + float sigmabl; + float sigmaed; + float sigmalc; + float sigmalc2; + float residsha; + float residshathr; + float residhi; + float residhithr; + float residgam; + float residslop; + bool blwh; + bool fftma; + float blurma; + float contma; + bool activspot; + float thrlow; + float thrhigh; + bool usemask; + float lnoiselow; + float radmacie; + float blendmacie; + float chromacie; + float denoichmask; + float mLjz; + float mCjz; + float softrjz; + +}; + +static void calcLocalParams(int sp, int oW, int oH, const LocallabParams& locallab, struct local_params& lp, bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, int llcieMask, const LocwavCurve & locwavCurveden, bool locwavdenutili) +{ + int w = oW; + int h = oH; + int circr = locallab.spots.at(sp).circrad; + bool recur = locallab.spots.at(sp).recurs; + float streng = ((float)locallab.spots.at(sp).stren); + float gam = ((float)locallab.spots.at(sp).gamma); + float est = ((float)locallab.spots.at(sp).estop); + float scal_tm = ((float)locallab.spots.at(sp).scaltm); + float rewe = ((float)locallab.spots.at(sp).rewei); + float amo = ((float)locallab.spots.at(sp).amount); + float strlight = ((float)locallab.spots.at(sp).streng); + float strucc = locallab.spots.at(sp).struc; + float laplac = ((float)locallab.spots.at(sp).laplace); + float thre = locallab.spots.at(sp).thresh; + +// if (thre > 8.f || thre < 0.f) {//to avoid artifacts if user does not clear cache with new settings. Can be suppressed after +// thre = 2.f; +// } + thre = LIM(thre, 0.f, 10.0f); + + double local_x = locallab.spots.at(sp).loc.at(0) / 2000.0; + double local_y = locallab.spots.at(sp).loc.at(2) / 2000.0; + double local_xL = locallab.spots.at(sp).loc.at(1) / 2000.0; + double local_yT = locallab.spots.at(sp).loc.at(3) / 2000.0; + double local_center_x = locallab.spots.at(sp).centerX / 2000.0 + 0.5; + double local_center_y = locallab.spots.at(sp).centerY / 2000.0 + 0.5; + float iterati = (float) locallab.spots.at(sp).iter; + float balanc = (float) locallab.spots.at(sp).balan; + float balanch = (float) locallab.spots.at(sp).balanh; + int colorde = (int) locallab.spots.at(sp).colorde; + +// if (iterati > 4.f || iterati < 0.2f) {//to avoid artifacts if user does not clear cache with new settings Can be suppressed after +// iterati = 2.f; +// } + iterati = LIM(iterati, 0.2f, 10.0f); + + float neigh = float (locallab.spots.at(sp).neigh); + float chromaPastel = float (locallab.spots.at(sp).pastels) / 100.0f; + float chromaSatur = float (locallab.spots.at(sp).saturated) / 100.0f; + int local_sensiv = locallab.spots.at(sp).sensiv; + int local_sensiex = locallab.spots.at(sp).sensiex; + + if (locallab.spots.at(sp).qualityMethod == "enh") { + lp.qualmet = 1; + } else if (locallab.spots.at(sp).qualityMethod == "enhden") { + lp.qualmet = 2; + } + + if (locallab.spots.at(sp).qualitycurveMethod == "none") { + lp.qualcurvemet = 0; + } else if (locallab.spots.at(sp).qualitycurveMethod == "std") { + lp.qualcurvemet = 1; + } + + if (locallab.spots.at(sp).gridMethod == "one") { + lp.gridmet = 0; + } else if (locallab.spots.at(sp).gridMethod == "two") { + lp.gridmet = 1; + } +/* + if (locallab.spots.at(sp).expMethod == "std") { + lp.expmet = 0; + } else if (locallab.spots.at(sp).expMethod == "pde") { + lp.expmet = 1; + } +*/ + lp.expmet = 1; + + if (locallab.spots.at(sp).localcontMethod == "loc") { + lp.locmet = 0; + } else if (locallab.spots.at(sp).localcontMethod == "wav") { + lp.locmet = 1; + } + + lp.laplacexp = locallab.spots.at(sp).laplacexp; + lp.balanexp = locallab.spots.at(sp).balanexp; + lp.linear = locallab.spots.at(sp).linear; + if (locallab.spots.at(sp).spotMethod == "norm") { + lp.fullim = 0; + } else if(locallab.spots.at(sp).spotMethod == "exc"){ + lp.fullim = 1; + } else if (locallab.spots.at(sp).spotMethod == "full"){ + lp.fullim = 2; + } + // printf("Lpfullim=%i\n", lp.fullim); + + lp.fftColorMask = locallab.spots.at(sp).fftColorMask; + lp.prevdE = prevDeltaE; + lp.showmaskcolmet = llColorMask; + lp.showmaskcolmetinv = llColorMaskinv; + lp.showmaskexpmet = llExpMask; + lp.showmaskexpmetinv = llExpMaskinv; + lp.showmaskSHmet = llSHMask; + lp.showmaskSHmetinv = llSHMaskinv; + lp.showmaskvibmet = llvibMask; + lp.showmasklcmet = lllcMask; + lp.showmasksharmet = llsharMask; + lp.showmaskcbmet = llcbMask; + lp.showmaskretimet = llretiMask; + lp.showmasksoftmet = llsoftMask; + + lp.showmasktmmet = lltmMask; + lp.showmaskblmet = llblMask; + lp.showmasklogmet = lllogMask; + lp.showmask_met = ll_Mask; + lp.showmaskciemet = llcieMask; +//printf("CIEmask=%i\n", lp.showmaskciemet); + lp.enaColorMask = locallab.spots.at(sp).enaColorMask && llsoftMask == 0 && llColorMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llExpMaskinv == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaColorMaskinv = locallab.spots.at(sp).enaColorMask && llColorMaskinv == 0 && llSHMaskinv == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaExpMask = locallab.spots.at(sp).enaExpMask && llExpMask == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llColorMaskinv == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaExpMaskinv = locallab.spots.at(sp).enaExpMask && llExpMaskinv == 0 && llColorMask == 0 && llSHMaskinv == 0 && llColorMaskinv == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enaSHMask = locallab.spots.at(sp).enaSHMask && llSHMask == 0 && llColorMask == 0 && llColorMaskinv == 0 && llSHMaskinv == 0 && llExpMaskinv == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enaSHMaskinv = locallab.spots.at(sp).enaSHMask && llColorMaskinv == 0 && llSHMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enacbMask = locallab.spots.at(sp).enacbMask && llColorMaskinv == 0 && llcbMask == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enaretiMask = locallab.spots.at(sp).enaretiMask && llColorMaskinv == 0 && lllcMask == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llsharMask == 0 && llsoftMask == 0 && llretiMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enatmMask = locallab.spots.at(sp).enatmMask && llColorMaskinv == 0 && lltmMask == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && llblMask == 0 && llvibMask == 0&& lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enablMask = locallab.spots.at(sp).enablMask && llColorMaskinv == 0 && llblMask == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enavibMask = locallab.spots.at(sp).enavibMask && llvibMask == 0 && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && lllcMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enalcMask = locallab.spots.at(sp).enalcMask && lllcMask == 0 && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llcbMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enasharMask = lllcMask == 0 && llcbMask == 0 && llsharMask == 0 && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llsoftMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.ena_Mask = locallab.spots.at(sp).enamask && lllcMask == 0 && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llcbMask == 0 && llsoftMask == 0 && llsharMask == 0 && llColorMask == 0 && llExpMask == 0 && llSHMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && lllogMask == 0 && llvibMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.enaLMask = locallab.spots.at(sp).enaLMask && lllogMask == 0 && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llSHMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && ll_Mask == 0 && llcieMask == 0;// Exposure mask is deactivated if Color & Light mask is visible + lp.enacieMask = locallab.spots.at(sp).enacieMask && llcieMask == 0 && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llSHMask == 0 && llsoftMask == 0 && lllcMask == 0 && llsharMask == 0 && llExpMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llblMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0; + + + lp.thrlow = locallab.spots.at(sp).levelthrlow; + lp.thrhigh = locallab.spots.at(sp).levelthr; + lp.usemask = locallab.spots.at(sp).usemask; + lp.lnoiselow = locallab.spots.at(sp).lnoiselow; + + // printf("llColorMask=%i lllcMask=%i llExpMask=%i llSHMask=%i llcbMask=%i llretiMask=%i lltmMask=%i llblMask=%i llvibMask=%i\n", llColorMask, lllcMask, llExpMask, llSHMask, llcbMask, llretiMask, lltmMask, llblMask, llvibMask); + if (locallab.spots.at(sp).softMethod == "soft") { + lp.softmet = 0; + } else if (locallab.spots.at(sp).softMethod == "reti") { + lp.softmet = 1; + } + + if (locallab.spots.at(sp).blMethod == "blur") { + lp.blmet = 0; + } else if (locallab.spots.at(sp).blMethod == "med") { + lp.blmet = 1; + } else if (locallab.spots.at(sp).blMethod == "guid") { + lp.blmet = 2; + } + + if (locallab.spots.at(sp).chroMethod == "lum") { + lp.chromet = 0; + } else if (locallab.spots.at(sp).chroMethod == "chr") { + lp.chromet = 1; + } else if (locallab.spots.at(sp).chroMethod == "all") { + lp.chromet = 2; + } + + + + + if (locallab.spots.at(sp).quamethod == "cons") { + lp.quamet = 0; + } else if (locallab.spots.at(sp).quamethod == "agre") { + lp.quamet = 1; + } else if (locallab.spots.at(sp).quamethod == "nlmean") { + lp.quamet = 2; + } else if (locallab.spots.at(sp).quamethod == "none") { + lp.quamet = 3; + } +// printf("lpqualmet=%i\n", lp.quamet); + + if (locallab.spots.at(sp).shMethod == "std") { + lp.shmeth = 0; + } else if (locallab.spots.at(sp).shMethod == "tone") { + lp.shmeth = 1; + } + + + if (locallab.spots.at(sp).medMethod == "none") { + lp.medmet = -1; + } else if (locallab.spots.at(sp).medMethod == "33") { + lp.medmet = 0; + } else if (locallab.spots.at(sp).medMethod == "55") { + lp.medmet = 1; + } else if (locallab.spots.at(sp).medMethod == "77") { + lp.medmet = 2; + } else if (locallab.spots.at(sp).medMethod == "99") { + lp.medmet = 3; + } +/* + if (locallab.spots.at(sp).blurMethod == "norm") { + lp.blurmet = 0; + } else if (locallab.spots.at(sp).blurMethod == "inv") { + lp.blurmet = 1; + } +*/ + if (locallab.spots.at(sp).invbl == false) { + lp.blurmet = 0; + } else if (locallab.spots.at(sp).invbl == true) { + lp.blurmet = 1; + } + + if (locallab.spots.at(sp).invmask == false) { + lp.invmask = false; + } else if (locallab.spots.at(sp).invmask == true) { + lp.invmask = true; + } + + if (locallab.spots.at(sp).invmaskd == false) { + lp.invmaskd = false; + } else if (locallab.spots.at(sp).invmaskd == true) { + lp.invmaskd = true; + } + + + if (locallab.spots.at(sp).showmaskblMethodtyp == "blur") { + lp.smasktyp = 0; + } else if (locallab.spots.at(sp).showmaskblMethodtyp == "nois") { + lp.smasktyp = 1; + } else if (locallab.spots.at(sp).showmaskblMethodtyp == "all") { + lp.smasktyp = 2; + } + + + if (locallab.spots.at(sp).spotMethod == "norm") { + lp.excmet = 0; + } else if (locallab.spots.at(sp).spotMethod == "exc") { + lp.excmet = 1; + } else if (locallab.spots.at(sp).spotMethod == "full") { + lp.excmet = 2; + } + + if (locallab.spots.at(sp).merMethod == "mone") { + lp.mergemet = 0; + } else if (locallab.spots.at(sp).merMethod == "mtwo") { + lp.mergemet = 1; + } else if (locallab.spots.at(sp).merMethod == "mthr") { + lp.mergemet = 2; + } else if (locallab.spots.at(sp).merMethod == "mfou") { + lp.mergemet = 3; + } else if (locallab.spots.at(sp).merMethod == "mfiv") { + lp.mergemet = 4; + } + + if (locallab.spots.at(sp).mergecolMethod == "one") { + lp.mergecolMethod = 0; + } else if (locallab.spots.at(sp).mergecolMethod == "two") { + lp.mergecolMethod = 1; + } else if (locallab.spots.at(sp).mergecolMethod == "thr") { + lp.mergecolMethod = 2; + } else if (locallab.spots.at(sp).mergecolMethod == "fou") { + lp.mergecolMethod = 3; + } else if (locallab.spots.at(sp).mergecolMethod == "fiv") { + lp.mergecolMethod = 4; + } else if (locallab.spots.at(sp).mergecolMethod == "six") { + lp.mergecolMethod = 5; + } else if (locallab.spots.at(sp).mergecolMethod == "sev") { + lp.mergecolMethod = 6; + } else if (locallab.spots.at(sp).mergecolMethod == "sev0") { + lp.mergecolMethod = 7; + } else if (locallab.spots.at(sp).mergecolMethod == "sev1") { + lp.mergecolMethod = 8; + } else if (locallab.spots.at(sp).mergecolMethod == "sev2") { + lp.mergecolMethod = 9; + } else if (locallab.spots.at(sp).mergecolMethod == "hei") { + lp.mergecolMethod = 10; + } else if (locallab.spots.at(sp).mergecolMethod == "nin") { + lp.mergecolMethod = 11; + } else if (locallab.spots.at(sp).mergecolMethod == "ten") { + lp.mergecolMethod = 12; + } else if (locallab.spots.at(sp).mergecolMethod == "ele") { + lp.mergecolMethod = 13; + } else if (locallab.spots.at(sp).mergecolMethod == "twe") { + lp.mergecolMethod = 14; + } else if (locallab.spots.at(sp).mergecolMethod == "thi") { + lp.mergecolMethod = 15; + } else if (locallab.spots.at(sp).mergecolMethod == "for") { + lp.mergecolMethod = 16; + } else if (locallab.spots.at(sp).mergecolMethod == "hue") { + lp.mergecolMethod = 17; + } else if (locallab.spots.at(sp).mergecolMethod == "sat") { + lp.mergecolMethod = 18; + } else if (locallab.spots.at(sp).mergecolMethod == "col") { + lp.mergecolMethod = 19; + } else if (locallab.spots.at(sp).mergecolMethod == "lum") { + lp.mergecolMethod = 20; + } + + if (locallab.spots.at(sp).localedgMethod == "fir") { + lp.edgwmet = 0; + } else if (locallab.spots.at(sp).localedgMethod == "sec") { + lp.edgwmet = 1; + } else if (locallab.spots.at(sp).localedgMethod == "thr") { + lp.edgwmet = 2; + } + + if (locallab.spots.at(sp).localneiMethod == "none") { + lp.neiwmet = -1; + lp.lip3 = false; + } else if (locallab.spots.at(sp).localneiMethod == "low") { + lp.neiwmet = 0; + lp.lip3 = true; + } else if (locallab.spots.at(sp).localneiMethod == "high") { + lp.lip3 = true; + lp.neiwmet = 1; + } + + + if (locallab.spots.at(sp).wavMethod == "D2") { + lp.daubLen = 4; + } else if (locallab.spots.at(sp).wavMethod == "D4") { + lp.daubLen = 6; + } else if (locallab.spots.at(sp).wavMethod == "D6") { + lp.daubLen = 8; + } else if (locallab.spots.at(sp).wavMethod == "D10") { + lp.daubLen = 12; + } else if (locallab.spots.at(sp).wavMethod == "D14") { + lp.daubLen = 16; + } + + + lp.edgwena = locallab.spots.at(sp).wavedg; + + lp.opacol = 0.01 * locallab.spots.at(sp).opacol; + + if (locallab.spots.at(sp).shape == "ELI") { + lp.shapmet = 0; + } else /*if (locallab.spots.at(sp).shape == "RECT")*/ { + lp.shapmet = 1; + } + + lp.denoiena = locallab.spots.at(sp).expblur; + + bool wavcurveden = false; + float local_noiself = 0.f; + float local_noiself0 = 0.f; + float local_noiself2 = 0.f; + float local_noiselc = 0.f; + float lnoiselc4 = 0.f; + float lnoiselc5 = 0.f; + float lnoiselc6 = 0.f; + + if (locwavCurveden && locwavdenutili) { + if (lp.denoiena) { + for (int i = 0; i < 500; i++) { + if (locwavCurveden[i] != 0.f) { + wavcurveden = true; + } + } + } + } + + if (wavcurveden) { + if (lp.denoiena) { + local_noiself0 = 250.f * locwavCurveden[0]; + local_noiself = 250.f * locwavCurveden[83]; + local_noiself2 = 250.f * locwavCurveden[166]; + local_noiselc = 200.f * locwavCurveden[250]; + lnoiselc4 = 250.f * locwavCurveden[333]; + lnoiselc5 = 250.f * locwavCurveden[416]; + lnoiselc6 = 250.f * locwavCurveden[500]; + } + } + lp.wavcurvedenoi = wavcurveden; + float local_noiseldetail = (float)locallab.spots.at(sp).noiselumdetail; + int local_noiselequal = locallab.spots.at(sp).noiselequal; + float local_noisechrodetail = (float)locallab.spots.at(sp).noisechrodetail; + int local_sensiden = locallab.spots.at(sp).sensiden; + float local_reparden = locallab.spots.at(sp).reparden; + float local_repartm = locallab.spots.at(sp).repartm; + float local_detailthr = (float)locallab.spots.at(sp).detailthr; + float local_recothr = (float)locallab.spots.at(sp).recothres; + float local_lowthr = (float)locallab.spots.at(sp).lowthres; + float local_higthr = (float)locallab.spots.at(sp).higthres; + float local_recothrd = (float)locallab.spots.at(sp).recothresd; + float local_lowthrd = (float)locallab.spots.at(sp).lowthresd; + float local_midthrd = (float)locallab.spots.at(sp).midthresd; + float local_midthrdch = (float)locallab.spots.at(sp).midthresdch; + float local_higthrd = (float)locallab.spots.at(sp).higthresd; + float local_decayd = (float)locallab.spots.at(sp).decayd; + float local_recothrc = (float)locallab.spots.at(sp).recothresc; + float local_lowthrc = (float)locallab.spots.at(sp).lowthresc; + float local_higthrc = (float)locallab.spots.at(sp).higthresc; + float local_decayc = (float)locallab.spots.at(sp).decayc; + + float local_recothre = (float)locallab.spots.at(sp).recothrese; + float local_lowthre = (float)locallab.spots.at(sp).lowthrese; + float local_higthre = (float)locallab.spots.at(sp).higthrese; + float local_decaye = (float)locallab.spots.at(sp).decaye; + + float local_recothrv = (float)locallab.spots.at(sp).recothresv; + float local_lowthrv = (float)locallab.spots.at(sp).lowthresv; + float local_higthrv = (float)locallab.spots.at(sp).higthresv; + float local_decayv = (float)locallab.spots.at(sp).decayv; + + float local_recothrcb = (float)locallab.spots.at(sp).recothrescb; + float local_lowthrcb = (float)locallab.spots.at(sp).lowthrescb; + float local_higthrcb = (float)locallab.spots.at(sp).higthrescb; + float local_decaycb = (float)locallab.spots.at(sp).decaycb; + + float local_recothrr = (float)locallab.spots.at(sp).recothresr; + float local_lowthrr = (float)locallab.spots.at(sp).lowthresr; + float local_higthrr = (float)locallab.spots.at(sp).higthresr; + float local_decayr = (float)locallab.spots.at(sp).decayr; + + float local_recothrt = (float)locallab.spots.at(sp).recothrest; + float local_lowthrt = (float)locallab.spots.at(sp).lowthrest; + float local_higthrt = (float)locallab.spots.at(sp).higthrest; + float local_decayt = (float)locallab.spots.at(sp).decayt; + + float local_recothrw = (float)locallab.spots.at(sp).recothresw; + float local_lowthrw = (float)locallab.spots.at(sp).lowthresw; + float local_higthrw = (float)locallab.spots.at(sp).higthresw; + float local_decayw = (float)locallab.spots.at(sp).decayw; + + float local_recothrs = (float)locallab.spots.at(sp).recothress; + float local_lowthrs = (float)locallab.spots.at(sp).lowthress; + float local_higthrs = (float)locallab.spots.at(sp).higthress; + float local_decays = (float)locallab.spots.at(sp).decays; + + float local_recothrcie = (float)locallab.spots.at(sp).recothrescie; + float local_lowthrcie = (float)locallab.spots.at(sp).lowthrescie; + float local_higthrcie = (float)locallab.spots.at(sp).higthrescie; + float local_decaycie = (float)locallab.spots.at(sp).decaycie; + + float local_recothrl = (float)locallab.spots.at(sp).recothresl; + float local_lowthrl = (float)locallab.spots.at(sp).lowthresl; + float local_higthrl = (float)locallab.spots.at(sp).higthresl; + float local_decayl = (float)locallab.spots.at(sp).decayl; + + float local_noisecf = ((float)locallab.spots.at(sp).noisechrof) / 10.f; + float local_noisecc = ((float)locallab.spots.at(sp).noisechroc) / 10.f; + float multi[6]; + + for (int y = 0; y < 6; y++) { + multi[y] = ((float) locallab.spots.at(sp).mult[y]); + } + + float multish[5]; + + for (int y = 0; y < 5; y++) { + multish[y] = ((float) locallab.spots.at(sp).multsh[y]); + } + + float thresho = ((float)locallab.spots.at(sp).threshold); + float chromcbdl = (float)locallab.spots.at(sp).chromacbdl; + + int local_chroma = locallab.spots.at(sp).chroma; + int local_sensi = locallab.spots.at(sp).sensi; + int local_sensibn = locallab.spots.at(sp).sensibn; + int local_sensitm = locallab.spots.at(sp).sensitm; + int local_sensiexclu = locallab.spots.at(sp).sensiexclu; + float structexclude = (float) locallab.spots.at(sp).structexclu; + int local_sensilc = locallab.spots.at(sp).sensilc; + int local_warm = locallab.spots.at(sp).warm; + int local_sensih = locallab.spots.at(sp).sensih; + int local_dehaze = locallab.spots.at(sp).dehaz; + int local_depth = locallab.spots.at(sp).depth; + int local_dehazeSaturation = locallab.spots.at(sp).dehazeSaturation; + int local_sensicb = locallab.spots.at(sp).sensicb; + float local_clarityml = (float) locallab.spots.at(sp).clarityml; + float local_contresid = (float) locallab.spots.at(sp).contresid; + int local_contrast = locallab.spots.at(sp).contrast; + float local_lightness = (float) locallab.spots.at(sp).lightness; + float labgridALowloc = locallab.spots.at(sp).labgridALow; + float labgridBLowloc = locallab.spots.at(sp).labgridBLow; + float labgridBHighloc = locallab.spots.at(sp).labgridBHigh; + float labgridAHighloc = locallab.spots.at(sp).labgridAHigh; + float strengthgrid = (float) locallab.spots.at(sp).strengthgrid; + float labgridBLowlocmerg = locallab.spots.at(sp).labgridBLowmerg; + float labgridBHighlocmerg = locallab.spots.at(sp).labgridBHighmerg; + float labgridALowlocmerg = locallab.spots.at(sp).labgridALowmerg; + float labgridAHighlocmerg = locallab.spots.at(sp).labgridAHighmerg; + float local_gamlc = (float) locallab.spots.at(sp).gamlc; + float local_gamc = (float) locallab.spots.at(sp).gamc; + float local_gamex = (float) locallab.spots.at(sp).gamex; + + float blendmasklc = ((float) locallab.spots.at(sp).blendmasklc) / 100.f ; + float radmasklc = ((float) locallab.spots.at(sp).radmasklc); + float chromasklc = ((float) locallab.spots.at(sp).chromasklc); + float structcolor = (float) locallab.spots.at(sp).structcol; + float blendmaskcolor = ((float) locallab.spots.at(sp).blendmaskcol) / 100.f ; + float radmaskcolor = ((float) locallab.spots.at(sp).radmaskcol); + float chromaskcolor = ((float) locallab.spots.at(sp).chromaskcol); + float gammaskcolor = ((float) locallab.spots.at(sp).gammaskcol); + float slomaskcolor = ((float) locallab.spots.at(sp).slomaskcol); + float blendmaskexpo = ((float) locallab.spots.at(sp).blendmaskexp) / 100.f ; + float radmaskexpo = ((float) locallab.spots.at(sp).radmaskexp); + float chromaskexpo = ((float) locallab.spots.at(sp).chromaskexp); + float gammaskexpo = ((float) locallab.spots.at(sp).gammaskexp); + float slomaskexpo = ((float) locallab.spots.at(sp).slomaskexp); + float strmaskexpo = ((float) locallab.spots.at(sp).strmaskexp); + float angmaskexpo = ((float) locallab.spots.at(sp).angmaskexp); + float strmask = ((float) locallab.spots.at(sp).str_mask); + float angmask = ((float) locallab.spots.at(sp).ang_mask); + float strexpo = ((float) locallab.spots.at(sp).strexp); + float angexpo = ((float) locallab.spots.at(sp).angexp); + float strSH = ((float) locallab.spots.at(sp).strSH); + float angSH = ((float) locallab.spots.at(sp).angSH); + float strcol = ((float) locallab.spots.at(sp).strcol); + float strcolab = ((float) locallab.spots.at(sp).strcolab); + float strcolh = ((float) locallab.spots.at(sp).strcolh); + float angcol = ((float) locallab.spots.at(sp).angcol); + float strvib = ((float) locallab.spots.at(sp).strvib); + float strvibab = ((float) locallab.spots.at(sp).strvibab); + float strvibh = ((float) locallab.spots.at(sp).strvibh); + float angvib = ((float) locallab.spots.at(sp).angvib); + float strwav = ((float) locallab.spots.at(sp).strwav); + float angwav = ((float) locallab.spots.at(sp).angwav); + float strlog = ((float) locallab.spots.at(sp).strlog); + float anglog = ((float) locallab.spots.at(sp).anglog); + float softradiusexpo = ((float) locallab.spots.at(sp).softradiusexp); + float softradiuscolor = ((float) locallab.spots.at(sp).softradiuscol); + float softradiusreti = ((float) locallab.spots.at(sp).softradiusret); + float softradiustma = ((float) locallab.spots.at(sp).softradiustm); + float softradiuscbdl = ((float) locallab.spots.at(sp).softradiuscb); + float blendmaskSH = ((float) locallab.spots.at(sp).blendmaskSH) / 100.f ; + float radmaskSH = ((float) locallab.spots.at(sp).radmaskSH); + float chromaskSH = ((float) locallab.spots.at(sp).chromaskSH); + float gammaskSH = ((float) locallab.spots.at(sp).gammaskSH); + float slomaskSH = ((float) locallab.spots.at(sp).slomaskSH); + float blendmaskvib = ((float) locallab.spots.at(sp).blendmaskvib) / 100.f ; + float radmaskvib = ((float) locallab.spots.at(sp).radmaskvib); + float chromaskvib = ((float) locallab.spots.at(sp).chromaskvib); + float gammaskvib = ((float) locallab.spots.at(sp).gammaskvib); + float slomaskvib = ((float) locallab.spots.at(sp).slomaskvib); + float structexpo = (float) locallab.spots.at(sp).structexp; + float blurexpo = (float) locallab.spots.at(sp).blurexpde; + float blurcolor = (float) locallab.spots.at(sp).blurcolde; + float blurcolmask = (float) locallab.spots.at(sp).blurcol; + float contcolmask = (float) locallab.spots.at(sp).contcol; + float blurSH = (float) locallab.spots.at(sp).blurSHde; + float local_transit = locallab.spots.at(sp).transit; + float local_feather = locallab.spots.at(sp).feather; + float local_transitweak = (float)locallab.spots.at(sp).transitweak; + float local_transitgrad = (float)locallab.spots.at(sp).transitgrad; + float radius = (float) locallab.spots.at(sp).radius; + int itera = locallab.spots.at(sp).itera; + int guidbl = locallab.spots.at(sp).guidbl; + float epsbl = (float) locallab.spots.at(sp).epsbl; + float sharradius = LIM(locallab.spots.at(sp).sharradius, 0.42, 3.5); + float lcamount = ((float) locallab.spots.at(sp).lcamount); + lcamount = LIM01(lcamount); //to prevent crash with old pp3 integer + float sharblurr = LIM(locallab.spots.at(sp).sharblur, 0.2, 3.); //to prevent crash with old pp3 integer + int local_sensisha = locallab.spots.at(sp).sensisha; + int local_sharamount = locallab.spots.at(sp).sharamount; + int local_shardamping = locallab.spots.at(sp).shardamping; + int local_shariter = locallab.spots.at(sp).shariter; + bool inverse = locallab.spots.at(sp).invers; + bool curvacti = locallab.spots.at(sp).curvactiv; + bool acti = locallab.spots.at(sp).activlum; + bool cupas = false; // Provision + int local_sensisf = locallab.spots.at(sp).sensisf; + bool inverseex = locallab.spots.at(sp).inversex; + bool inversesh = locallab.spots.at(sp).inverssh; + bool equiltm = locallab.spots.at(sp).equiltm; + bool fftwlc = locallab.spots.at(sp).fftwlc; + bool fftwreti = locallab.spots.at(sp).fftwreti; + + float blendmaskL = ((float) locallab.spots.at(sp).blendmaskL) / 100.f ; + float radmaskL = ((float) locallab.spots.at(sp).radmaskL); + float chromaskL = ((float) locallab.spots.at(sp).chromaskL); + + bool equilret = locallab.spots.at(sp).equilret; + bool inverserad = false; // Provision + bool inverseret = locallab.spots.at(sp).inversret; + bool inversesha = locallab.spots.at(sp).inverssha; + double strength = (double) locallab.spots.at(sp).strength; + float str = (float)locallab.spots.at(sp).str; + int scaleret = (float)locallab.spots.at(sp).scalereti; + + int local_sensihs = locallab.spots.at(sp).sensihs; + int highhs = locallab.spots.at(sp).highlights; + int hltonahs = locallab.spots.at(sp).h_tonalwidth; + int shadhs = locallab.spots.at(sp).shadows; + int shtonals = locallab.spots.at(sp).s_tonalwidth; + int radhs = locallab.spots.at(sp).sh_radius; + float blendmaskcb = ((float) locallab.spots.at(sp).blendmaskcb) / 100.f ; + float radmaskcb = ((float) locallab.spots.at(sp).radmaskcb); + float chromaskcb = ((float) locallab.spots.at(sp).chromaskcb); + float gammaskcb = ((float) locallab.spots.at(sp).gammaskcb); + float slomaskcb = ((float) locallab.spots.at(sp).slomaskcb); + bool enaretiMasktm = locallab.spots.at(sp).enaretiMasktmap; + lp.enaretiMasktmap = enaretiMasktm; + float blendmasktm = ((float) locallab.spots.at(sp).blendmasktm) / 100.f ; + float radmasktm = ((float) locallab.spots.at(sp).radmasktm); + float chromasktm = ((float) locallab.spots.at(sp).chromasktm); + float gammasktm = ((float) locallab.spots.at(sp).gammasktm); + float slomasktm = ((float) locallab.spots.at(sp).slomasktm); + bool wavgradl = locallab.spots.at(sp).wavgradl; + + float blendmaskbl = ((float) locallab.spots.at(sp).blendmaskbl) / 100.f ; + float radmaskbl = ((float) locallab.spots.at(sp).radmaskbl); + float chromaskbl = ((float) locallab.spots.at(sp).chromaskbl); + float gammaskbl = ((float) locallab.spots.at(sp).gammaskbl); + float slomaskbl = ((float) locallab.spots.at(sp).slomaskbl); + bool fftbl = locallab.spots.at(sp).fftwbl; + + + lp.sourcegray = (float) locallab.spots.at(sp).sourceGray; + lp.targetgray = (float) locallab.spots.at(sp).targetGray; + lp.blackev = (float) locallab.spots.at(sp).blackEv; + lp.whiteev = (float) locallab.spots.at(sp).whiteEv; + lp.detail = locallab.spots.at(sp).detail; + lp.sensilog = locallab.spots.at(sp).sensilog; + lp.Autogray = locallab.spots.at(sp).Autogray; + lp.autocompute = locallab.spots.at(sp).autocompute; + lp.baselog = (float) locallab.spots.at(sp).baselog; + lp.sensimas = locallab.spots.at(sp).sensimask; + lp.sensicie = locallab.spots.at(sp).sensicie; + float blendmaskcie = ((float) locallab.spots.at(sp).blendmaskcie) / 100.f ; + float radmaskcie = ((float) locallab.spots.at(sp).radmaskcie); + float chromaskcie = ((float) locallab.spots.at(sp).chromaskcie); + lp.deltaem = locallab.spots.at(sp).deltae; + lp.scalereti = scaleret; + lp.cir = circr; + lp.recur = recur; + lp.actsp = acti; + lp.xc = w * local_center_x; + lp.yc = h * local_center_y; + lp.lx = w * local_x; + lp.ly = h * local_y; + lp.lxL = w * local_xL; + lp.lyT = h * local_yT; + lp.chro = local_chroma; + lp.struco = structcolor; + lp.strengrid = strengthgrid; + lp.blendmalc = blendmasklc; + lp.radmalc = radmasklc; + lp.chromalc = chromasklc; + lp.blendmacol = blendmaskcolor; + lp.radmacol = radmaskcolor; + lp.chromacol = chromaskcolor; + lp.gammacol = gammaskcolor; + lp.slomacol = slomaskcolor; + lp.radmaexp = radmaskexpo; + lp.chromaexp = chromaskexpo; + lp.gammaexp = gammaskexpo; + lp.slomaexp = slomaskexpo; + lp.strmaexp = strmaskexpo; + lp.angmaexp = angmaskexpo; + lp.str_mas = strmask; + lp.ang_mas = angmask; + + lp.strexp = strexpo; + lp.angexp = angexpo; + lp.strSH = strSH; + lp.angSH = angSH; + lp.strcol = strcol; + lp.strcolab = strcolab; + lp.strcolh = strcolh; + lp.angcol = angcol; + lp.strvib = strvib; + lp.strvibab = strvibab; + lp.strvibh = strvibh; + lp.angvib = angvib; + lp.strwav = strwav; + lp.angwav = angwav; + lp.strlog = strlog; + lp.anglog = anglog; + lp.softradiusexp = softradiusexpo; + lp.softradiuscol = softradiuscolor; + lp.softradiusret = softradiusreti; + lp.softradiuscb = softradiuscbdl; + lp.softradiustm = softradiustma; + lp.struexc = structexclude; + lp.blendmaexp = blendmaskexpo; + lp.blendmaSH = blendmaskSH; + lp.radmaSH = radmaskSH; + lp.chromaSH = chromaskSH; + lp.gammaSH = gammaskSH; + lp.slomaSH = slomaskSH; + lp.blendmavib = blendmaskvib; + lp.radmavib = radmaskvib; + lp.chromavib = chromaskvib; + lp.gammavib = gammaskvib; + lp.slomavib = slomaskvib; + lp.blendmacb = blendmaskcb; + lp.radmacb = radmaskcb; + lp.chromacbm = chromaskcb; + lp.gammacb = gammaskcb; + lp.slomacb = slomaskcb; + lp.blendmatm = blendmasktm; + lp.radmatm = radmasktm; + lp.chromatm = chromasktm; + lp.gammatm = gammasktm; + lp.slomatm = slomasktm; + lp.wavgradl = wavgradl; + lp.blendmaL = blendmaskL; + lp.radmaL = radmaskL; + lp.chromaL = chromaskL; + + lp.strengthw = ((float) locallab.spots.at(sp).strengthw); + lp.radiusw = ((float) locallab.spots.at(sp).radiusw); + lp.detailw = ((float) locallab.spots.at(sp).detailw); + lp.gradw = ((float) locallab.spots.at(sp).gradw); + lp.tloww = ((float) locallab.spots.at(sp).tloww); + lp.thigw = ((float) locallab.spots.at(sp).thigw); + lp.edgw = ((float) locallab.spots.at(sp).edgw); + lp.basew = ((float) locallab.spots.at(sp).basew); + + lp.blendmabl = blendmaskbl; + lp.radmabl = radmaskbl; + lp.chromabl = chromaskbl; + lp.gammabl = gammaskbl; + lp.slomabl = slomaskbl; + lp.fftbl = fftbl; + lp.it = itera; + lp.guidb = guidbl; + lp.strbl = 0.01f * (float) locallab.spots.at(sp).strbl; + + lp.epsb = epsbl; + lp.struexp = structexpo; + lp.blurexp = blurexpo; + lp.blurcol = blurcolor; + lp.blurcolmask = blurcolmask; + lp.contcolmask = 0.01f * contcolmask; + lp.blurSH = blurSH; + lp.sens = local_sensi; + lp.sensh = local_sensih; + lp.dehaze = local_dehaze; + lp.dehazeSaturation = local_dehazeSaturation; + lp.depth = local_depth; + lp.senscb = local_sensicb; + lp.clarityml = local_clarityml; + lp.contresid = local_contresid; + lp.cont = local_contrast; + lp.ligh = local_lightness; + lp.lowA = labgridALowloc; + lp.lowB = labgridBLowloc; + lp.highB = labgridBHighloc; + lp.highA = labgridAHighloc; + lp.lowBmerg = labgridBLowlocmerg; + lp.highBmerg = labgridBHighlocmerg; + lp.lowAmerg = labgridALowlocmerg; + lp.highAmerg = labgridAHighlocmerg; + lp.gamlc = local_gamlc; + lp.gamc = local_gamc; + lp.gamex = local_gamex; + + lp.senssf = local_sensisf; + lp.strng = strlight; + lp.neig = neigh; + lp.lap = laplac; + + if (lp.ligh >= -2.f && lp.ligh <= 2.f) { + lp.ligh /= 5.f; + } + + lp.trans = local_transit; + lp.feath = local_feather; + lp.transweak = local_transitweak; + lp.transgrad = local_transitgrad; + lp.rad = radius; + lp.stren = strength; + lp.sensbn = local_sensibn; + lp.sensexclu = local_sensiexclu; + lp.senslc = local_sensilc; + lp.lcamount = lcamount; + lp.inv = inverse; + lp.invex = inverseex; + lp.invsh = inversesh; + lp.curvact = curvacti; + lp.invrad = inverserad; + lp.invret = inverseret; + lp.equret = equilret; + lp.equtm = equiltm; + lp.invshar = inversesha; + lp.str = str; + lp.shrad = sharradius; + lp.shblurr = sharblurr; + lp.senssha = local_sensisha; + lp.shamo = local_sharamount; + lp.shdamp = local_shardamping; + lp.shiter = local_shariter; + lp.iterat = iterati; + lp.balance = balanc; + lp.balanceh = balanch; + lp.colorde = colorde; + lp.thr = thre; + lp.stru = strucc; + lp.noiself = local_noiself; + lp.noiself0 = local_noiself0; + lp.noiself2 = local_noiself2; + lp.noiseldetail = local_noiseldetail; + lp.detailthr = local_detailthr; + lp.recothr = local_recothr; + lp.lowthr = local_lowthr; + lp.higthr = local_higthr; + lp.recothrd = local_recothrd; + lp.midthrd = local_midthrd; + lp.midthrdch = local_midthrdch; + lp.lowthrd = local_lowthrd; + lp.higthrd = local_higthrd; + lp.decayd = local_decayd; + lp.recothrc = local_recothrc; + lp.lowthrc = local_lowthrc; + lp.higthrc = local_higthrc; + lp.decayc = local_decayc; + lp.recothre = local_recothre; + lp.lowthre = local_lowthre; + lp.higthre = local_higthre; + lp.decaye = local_decaye; + lp.recothrs = local_recothrs; + lp.lowthrs = local_lowthrs; + lp.higthrs = local_higthrs; + lp.decays = local_decays; + + lp.recothrcie = local_recothrcie; + lp.lowthrcie = local_lowthrcie; + lp.higthrcie = local_higthrcie; + lp.decaycie = local_decaycie; + + lp.recothrv = local_recothrv; + lp.lowthrv = local_lowthrv; + lp.higthrv = local_higthrv; + lp.decayv = local_decayv; + lp.recothrw = local_recothrw; + lp.lowthrw = local_lowthrw; + lp.higthrw = local_higthrw; + lp.decayw = local_decayw; + lp.recothrt = local_recothrt; + lp.lowthrt = local_lowthrt; + lp.higthrt = local_higthrt; + lp.decayt = local_decayt; + lp.recothrcb = local_recothrcb; + lp.lowthrcb = local_lowthrcb; + lp.higthrcb = local_higthrcb; + lp.decaycb = local_decaycb; + lp.recothrr = local_recothrr; + lp.lowthrr = local_lowthrr; + lp.higthrr = local_higthrr; + lp.decayr = local_decayr; + + lp.recothrl = local_recothrl; + lp.lowthrl = local_lowthrl; + lp.higthrl = local_higthrl; + lp.decayl = local_decayl; + lp.noiselequal = local_noiselequal; + lp.noisechrodetail = local_noisechrodetail; + lp.noiselc = local_noiselc; + lp.noiselc4 = lnoiselc4; + lp.noiselc5 = lnoiselc5; + lp.noiselc6 = lnoiselc6; + + lp.noisecf = local_noisecf; + lp.noisecc = local_noisecc; + lp.sensden = local_sensiden; + lp.reparden = local_reparden; + lp.repartm = local_repartm; + lp.bilat = locallab.spots.at(sp).bilateral; + lp.nldet = locallab.spots.at(sp).nldet; + lp.nlstr = locallab.spots.at(sp).nlstr; + lp.nlpat = locallab.spots.at(sp).nlpat; + lp.nlrad = locallab.spots.at(sp).nlrad; + lp.nlgam = locallab.spots.at(sp).nlgam; + lp.noisegam = locallab.spots.at(sp).noisegam; + lp.adjch = (float) locallab.spots.at(sp).adjblur; + lp.strengt = streng; + lp.gamm = gam; + lp.esto = est; + lp.scalt = scal_tm; + lp.rewe = rewe; + lp.senstm = local_sensitm; + lp.amo = amo; + lp.blurma = (float) locallab.spots.at(sp).blurmask; + lp.fftma = locallab.spots.at(sp).fftmask; + lp.contma = (float) locallab.spots.at(sp).contmask; + + lp.blendmacie = blendmaskcie; + lp.radmacie = radmaskcie; + lp.chromacie = chromaskcie; + lp.denoichmask = locallab.spots.at(sp).denoichmask; + + for (int y = 0; y < 6; y++) { + lp.mulloc[y] = LIM(multi[y], 0.f, 4.f);//to prevent crash with old pp3 integer + } + + for (int y = 0; y < 5; y++) { + lp.mullocsh[y] = multish[y]; + } + lp.activspot = locallab.spots.at(sp).activ; + + + lp.detailsh = locallab.spots.at(sp).detailSH; + lp.tePivot = locallab.spots.at(sp).tePivot; + lp.threshol = thresho; + lp.chromacb = chromcbdl; + lp.expvib = locallab.spots.at(sp).expvibrance && lp.activspot ; + lp.colorena = locallab.spots.at(sp).expcolor && lp.activspot && llExpMaskinv == 0 && llSHMaskinv == 0 && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; // Color & Light tool is deactivated if Exposure mask is visible or SHMask + lp.blurena = locallab.spots.at(sp).expblur && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.tonemapena = locallab.spots.at(sp).exptonemap && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llColorMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.retiena = locallab.spots.at(sp).expreti && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.lcena = locallab.spots.at(sp).expcontrast && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llcbMask == 0 && llsharMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.cbdlena = locallab.spots.at(sp).expcbdl && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llExpMask == 0 && llsoftMask == 0 && llSHMask == 0 && llretiMask == 0 && lllcMask == 0 && llsharMask == 0 && lllcMask == 0 && llColorMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.exposena = locallab.spots.at(sp).expexpose && lp.activspot && llColorMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && llSHMask == 0 && lllcMask == 0 && llsharMask == 0 && llcbMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; // Exposure tool is deactivated if Color & Light mask SHmask is visible + lp.hsena = locallab.spots.at(sp).expshadhigh && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// Shadow Highlight tool is deactivated if Color & Light mask or SHmask is visible + lp.vibena = locallab.spots.at(sp).expvibrance && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible + lp.sharpena = locallab.spots.at(sp).expsharp && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.sfena = locallab.spots.at(sp).expsoft && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0 && llcieMask == 0; + lp.maskena = locallab.spots.at(sp).expmask && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && lllogMask == 0 && llSHMask == 0 && llcieMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible + lp.logena = locallab.spots.at(sp).explog && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && llcbMask == 0 && lltmMask == 0 && llSHMask == 0 && ll_Mask == 0 && llcieMask == 0;// vibrance tool is deactivated if Color & Light mask or SHmask is visible + lp.cieena = locallab.spots.at(sp).expcie && lp.activspot && llColorMaskinv == 0 && llExpMaskinv == 0 && llSHMaskinv == 0 && llColorMask == 0 && llsoftMask == 0 && llExpMask == 0 && llcbMask == 0 && lllcMask == 0 && llsharMask == 0 && llretiMask == 0 && lltmMask == 0 && llvibMask == 0 && lllogMask == 0 && ll_Mask == 0;// Shadow Highlight tool is deactivated if Color & Light mask or SHmask is visible + + + lp.islocal = (lp.expvib || lp.colorena || lp.blurena || lp.tonemapena || lp.retiena || lp.lcena || lp.cbdlena || lp.exposena || lp.hsena || lp.vibena || lp.sharpena || lp.sfena || lp.maskena || lp.logena || lp.cieena); + + lp.sensv = local_sensiv; + lp.past = chromaPastel; + lp.satur = chromaSatur; + + lp.cut_past = cupas; + lp.blac = locallab.spots.at(sp).black; + lp.shcomp = locallab.spots.at(sp).shcompr; + lp.shadex = locallab.spots.at(sp).shadex; + lp.hlcomp = locallab.spots.at(sp).hlcompr; + lp.hlcompthr = locallab.spots.at(sp).hlcomprthresh; + lp.expcomp = LIM(locallab.spots.at(sp).expcomp, -2.0, 4.0); //to prevent crash with Old pp3 with integer + lp.expchroma = locallab.spots.at(sp).expchroma / 100.; + lp.sensex = local_sensiex; + lp.war = local_warm; + lp.highlihs = highhs; + lp.shadowhs = shadhs; + lp.radiushs = radhs; + lp.hltonalhs = hltonahs; + lp.shtonalhs = shtonals; + lp.senshs = local_sensihs; + lp.ftwlc = fftwlc; + lp.ftwreti = fftwreti; + lp.sigmadr = locallab.spots.at(sp).sigmadr; + lp.sigmabl = locallab.spots.at(sp).sigmabl; + lp.sigmaed = locallab.spots.at(sp).sigmaed; + lp.sigmalc = locallab.spots.at(sp).sigmalc; + lp.sigmalc2 = locallab.spots.at(sp).sigmalc2; + lp.residsha = locallab.spots.at(sp).residsha; + lp.residshathr = locallab.spots.at(sp).residshathr; + lp.residhi = locallab.spots.at(sp).residhi; + lp.residhithr = locallab.spots.at(sp).residhithr; + lp.residgam = locallab.spots.at(sp).residgam; + lp.residslop = locallab.spots.at(sp).residslop; + lp.blwh = locallab.spots.at(sp).blwh; + lp.senscolor = (int) locallab.spots.at(sp).colorscope; + //replace scope color vibrance shadows + lp.sens = lp.senscolor; + lp.sensv = lp.senscolor; + lp.senshs = lp.senscolor; + + lp.mLjz = locallab.spots.at(sp).clarilresjz / 100.0; + lp.mCjz = locallab.spots.at(sp).claricresjz / 100.0; + lp.softrjz = locallab.spots.at(sp).clarisoftjz; + +} + +static void calcTransitionrect(const float lox, const float loy, const float ach, const local_params& lp, int &zone, float &localFactor) +{ + zone = 0; + + if (lox >= lp.xc && lox < lp.xc + lp.lx) { + if (loy >= lp.yc && loy < lp.yc + lp.ly) { + if (lox < lp.xc + lp.lx * ach && loy < lp.yc + lp.ly * ach) { + zone = 2; + } else { + zone = 1; + localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lx, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak); + } + } else if (loy < lp.yc && loy > lp.yc - lp.lyT) { + if (lox < lp.xc + lp.lx * ach && loy > lp.yc - lp.lyT * ach) { + zone = 2; + } else { + zone = 1; + localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lx, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak); + } + } + } else if (lox < lp.xc && lox > lp.xc - lp.lxL) { + if (loy <= lp.yc && loy > lp.yc - lp.lyT) { + if (lox > (lp.xc - lp.lxL * ach) && loy > (lp.yc - lp.lyT * ach)) { + zone = 2; + } else { + zone = 1; + localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lxL, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak); + } + } else if (loy > lp.yc && loy < lp.yc + lp.ly) { + if (lox > (lp.xc - lp.lxL * ach) && loy < (lp.yc + lp.ly * ach)) { + zone = 2; + } else { + zone = 1; + localFactor = pow_F(calcLocalFactorrect(lox, loy, lp.xc, lp.lxL, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak); + } + } + } +} + +static void calcTransition(const float lox, const float loy, const float ach, const local_params& lp, int &zone, float &localFactor) +{ + // returns the zone (0 = outside selection, 1 = transition zone between outside and inside selection, 2 = inside selection) + // and a factor to calculate the transition in case zone == 1 + + zone = 0; + + if (lox >= lp.xc && lox < lp.xc + lp.lx) { + if (loy >= lp.yc && loy < lp.yc + lp.ly) { + const float zoneVal = SQR((lox - lp.xc) / (ach * lp.lx)) + SQR((loy - lp.yc) / (ach * lp.ly)); + zone = zoneVal < 1.f ? 2 : 0; + + if (!zone) { + zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lx)) + SQR((loy - lp.yc) / (lp.ly))) < 1.f)) ? 1 : 0; + if (zone == 1) { + localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lx, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak); + } + } + } else if (loy < lp.yc && loy > lp.yc - lp.lyT) { + const float zoneVal = SQR((lox - lp.xc) / (ach * lp.lx)) + SQR((loy - lp.yc) / (ach * lp.lyT)); + zone = zoneVal < 1.f ? 2 : 0; + + if (!zone) { + zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lx)) + SQR((loy - lp.yc) / (lp.lyT))) < 1.f)) ? 1 : 0; + if (zone == 1) { + localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lx, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak); + } + } + } + } else if (lox < lp.xc && lox > lp.xc - lp.lxL) { + if (loy <= lp.yc && loy > lp.yc - lp.lyT) { + const float zoneVal = SQR((lox - lp.xc) / (ach * lp.lxL)) + SQR((loy - lp.yc) / (ach * lp.lyT)); + zone = zoneVal < 1.f ? 2 : 0; + + if (!zone) { + zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lxL)) + SQR((loy - lp.yc) / (lp.lyT))) < 1.f)) ? 1 : 0; + if (zone == 1) { + localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lxL, lp.yc, lp.lyT, ach, lp.transgrad), lp.transweak); + } + } + } else if (loy > lp.yc && loy < lp.yc + lp.ly) { + const float zoneVal = SQR((lox - lp.xc) / (ach * lp.lxL)) + SQR((loy - lp.yc) / (ach * lp.ly)); + zone = zoneVal < 1.f ? 2 : 0; + + if (!zone) { + zone = (zoneVal > 1.f && ((SQR((lox - lp.xc) / (lp.lxL)) + SQR((loy - lp.yc) / (lp.ly))) < 1.f)) ? 1 : 0; + if (zone == 1) { + localFactor = pow_F(calcLocalFactor(lox, loy, lp.xc, lp.lxL, lp.yc, lp.ly, ach, lp.transgrad), lp.transweak); + } + } + } + } +} + +// Copyright 2018 Alberto Griggio + +float find_gray(float source_gray, float target_gray) +{ + // find a base such that log2lin(base, source_gray) = target_gray + // log2lin is (base^source_gray - 1) / (base - 1), so we solve + // + // (base^source_gray - 1) / (base - 1) = target_gray, that is + // + // base^source_gray - 1 - base * target_gray + target_gray = 0 + // + // use a bisection method (maybe later change to Netwon) + + if (source_gray <= 0.f) { + return 0.f; + } + + const auto f = + [ = ](float x) -> float { + return std::pow(x, source_gray) - 1.f - target_gray * x + target_gray; + }; + + // first find the interval we are interested in + + float lo = 1.f; + + while (f(lo) <= 0.f) { + lo *= 2.f; + } + + float hi = lo * 2.f; + + while (f(hi) >= 0.f) { + hi *= 2.f; + } + + if (std::isinf(hi)) { + return 0.f; + } + + // now search for a zero + for (int iter = 0; iter < 100; ++iter) { + float mid = lo + (hi - lo) / 2.f; + float v = f(mid); + + if (std::abs(v) < 1e-4f || (hi - lo) / lo <= 1e-4f) { + return mid; + } + + if (v > 0.f) { + lo = mid; + } else { + hi = mid; + } + } + + return 0.f; // not found +} + +void ImProcFunctions::mean_sig (const float* const * const savenormL, float &meanf, float &stdf, int xStart, int xEnd, int yStart, int yEnd) const { + const int size = (yEnd - yStart) * (xEnd - xStart); + // use double precision for large accumulations + double meand = 0.0; + double stdd = 0.0; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:meand, stdd) if(multiThread) +#endif + for (int y = yStart; y < yEnd; ++y) { + for (int x = xStart; x < xEnd; ++x) { + meand += static_cast(savenormL[y][x]); + stdd += SQR(static_cast(savenormL[y][x])); + } + } + meand /= size; + stdd /= size; + stdd -= SQR(meand); + stdf = std::sqrt(stdd); + meanf = meand; +} +// taken from darktable +inline float power_norm(float r, float g, float b) +{ + r = std::abs(r); + g = std::abs(g); + b = std::abs(b); + + float r2 = SQR(r); + float g2 = SQR(g); + float b2 = SQR(b); + float d = r2 + g2 + b2; + float n = r*r2 + g*g2 + b*b2; + + return n / std::max(d, 1e-12f); +} + +inline float ev2gray(float ev) +{ + return std::pow(2.f, -ev + std::log2(0.18f)); +} + + +inline float gray2ev(float gray) +{ + return std::log2(0.18f / gray); +} + + +inline float norm2(float r, float g, float b, TMatrix ws) +{ + return (power_norm(r, g, b) + Color::rgbLuminance(r, g, b, ws)) / 2.f; +} + +inline float norm(float r, float g, float b, TMatrix ws) +{ + return (Color::rgbLuminance(r, g, b, ws)); +} + + +// basic log encoding taken from ACESutil.Lin_to_Log2, from +// https://github.com/ampas/aces-dev +// (as seen on pixls.us) +void ImProcFunctions::log_encode(Imagefloat *rgb, struct local_params & lp, bool multiThread, int bfw, int bfh) +{ + // BENCHFUN + const float gray = 0.01f * lp.sourcegray; + const float shadows_range = lp.blackev; + + float dynamic_range = max(lp.whiteev - lp.blackev, 0.5f); + const float noise = pow_F(2.f, -16.f); + const float log2 = xlogf(2.f); + const float base = lp.targetgray > 1 && lp.targetgray < 100 && dynamic_range > 0 ? find_gray(std::abs(lp.blackev) / dynamic_range, 0.01f * lp.targetgray) : 0.f; + const float linbase = rtengine::max(base, 2.f);//2 to avoid bad behavior + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + if (settings->verbose) { + printf("Base Log encoding std=%5.1f\n", (double) linbase); + } + + const auto apply = + [ = ](float x, bool scale = true) -> float { + if (scale) + { + x /= 65535.f; + } + + x = rtengine::max(x, noise); + x = rtengine::max(x / gray, noise); + x = rtengine::max((xlogf(x) / log2 - shadows_range) / dynamic_range, noise); + assert(x == x); + + if (linbase > 0.f) + { + x = xlog2lin(x, linbase); + } + + if (scale) + { + return x * 65535.f; + } else { + return x; + } + }; + + const float detail = lp.detail; + const int W = rgb->getWidth(), H = rgb->getHeight(); + + if (detail == 0.f) {//no local contrast +#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 = rgb->r(y, x); + float g = rgb->g(y, x); + float b = rgb->b(y, x); + float m = norm2(r, g, b, ws); + + if (m > noise) { + float mm = apply(m); + float f = mm / m; + f = min(f, 1000000.f); + + r *= f; + b *= f; + g *= f; + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); + } + + assert(r == r); + assert(g == g); + assert(b == b); + + rgb->r(y, x) = r; + rgb->g(y, x) = g; + rgb->b(y, x) = b; + } + } + } else {//local contrast + + array2D Y(W, H); + { + constexpr float base_posterization = 20.f; + array2D Y2(W, H); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + Y2[y][x] = norm2(rgb->r(y, x), rgb->g(y, x), rgb->b(y, x), ws) / 65535.f; + float l = xlogf(rtengine::max(Y2[y][x], 1e-9f)); + float ll = round(l * base_posterization) / base_posterization; + Y[y][x] = xexpf(ll); + assert(std::isfinite(Y[y][x])); + } + } + const float radius = rtengine::max(rtengine::max(bfw, W), rtengine::max(bfh, H)) / 30.f; + const float epsilon = 0.005f; + rtengine::guidedFilter(Y2, Y, Y, radius, epsilon, multiThread); + } + const float blend = detail; + +#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 = rgb->r(y, x); + float &g = rgb->g(y, x); + float &b = rgb->b(y, x); + float t = Y[y][x]; + float t2; + + if (t > noise && (t2 = norm2(r, g, b, ws)) > noise) { + float c = apply(t, false); + float f = c / t; + // float t2 = norm(r, g, b); + float f2 = apply(t2) / t2; + f = intp(blend, f, f2); + f = min(f, 1000000.f); + + // assert(std::isfinite(f)); + r *= f; + g *= f; + b *= f; + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); + // assert(std::isfinite(r)); + // assert(std::isfinite(g)); + // assert(std::isfinite(b)); + } + } + } + + } +} + +void ImProcFunctions::getAutoLogloc(int sp, ImageSource *imgsrc, float *sourceg, float *blackev, float *whiteev, bool *Autogr, float *sourceab, int fw, int fh, float xsta, float xend, float ysta, float yend, int SCALE) +{ + //BENCHFUN +//adpatation to local adjustments Jacques Desmis 12 2019 and 11 2021 (from ART) + const PreviewProps pp(0, 0, fw, fh, SCALE); + + Imagefloat img(int(fw / SCALE + 0.5), int(fh / SCALE + 0.5)); + const ProcParams neutral; + + imgsrc->getImage(imgsrc->getWB(), TR_NONE, &img, pp, params->toneCurve, neutral.raw, 0); + imgsrc->convertColorSpace(&img, params->icm, imgsrc->getWB()); + float minVal = RT_INFINITY; + float maxVal = -RT_INFINITY; + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + + constexpr float noise = 1e-5; + const int h = fh / SCALE; + const int w = fw / SCALE; + + const int hsta = ysta * h; + const int hend = yend * h; + + const int wsta = xsta * w; + const int wend = xend * w; + int www = int(fw / SCALE + 0.5); + int hhh = int(fh / SCALE + 0.5); + array2D YY(www, hhh); + + double mean = 0.0; + int nc = 0; + for (int y = hsta; y < hend; ++y) { + for (int x = wsta; x < wend; ++x) { + const float r = img.r(y, x), g = img.g(y, x), b = img.b(y, x); + YY[y][x] = norm2(r, g, b, ws) / 65535.f;//norm2 to find a best color luminance response in RGB + mean += static_cast((float) ws[1][0] * Color::gamma_srgb(r) + (float) ws[1][1] * Color::gamma_srgb(g) + (float) ws[1][2] * Color::gamma_srgb(b)); + //alternative to fing gray in case of above process does not works + nc++; + } + } + + for (int y = hsta; y < hend; ++y) { + for (int x = wsta; x < wend; ++x) { + float l = YY[y][x]; + if (l > noise) { + minVal = min(minVal, l); + maxVal = max(maxVal, l); + } + } + } + + maxVal *= 1.45f; //(or 1.5f...) slightly increase max to take into account illuminance incident light + minVal *= 0.55f; //(or 0.5f...) slightly decrease min to take into account illuminance incident light + //E = 2.5*2^EV => e=2.5 depends on the sensor type C=250 e=2.5 to C=330 e=3.3 + //repartition with 2.5 between 1.45 Light and shadows 0.58 => a little more 0.55... + // https://www.pixelsham.com/2020/12/26/exposure-value-measurements/ + // https://en.wikipedia.org/wiki/Light_meter + if (maxVal > minVal) { + const float log2 = std::log(2.f); + const float dynamic_range = -xlogf(minVal / maxVal) / log2; + + if (settings->verbose) { + std::cout << "AutoLog: min = " << minVal << ", max = " << maxVal + << ", Dynamic Range = " << dynamic_range << std::endl; + } + + if (Autogr[sp]) { + double tot = 0.0; + int n = 0; + //0.05 0.25 arbitrary values around gray point 0.18 to find a good value as "gray" for "gain" + const float gmax = rtengine::min(maxVal / 2.f, 0.25f); + const float gmin = rtengine::max(minVal * std::pow(2.f, rtengine::max((dynamic_range - 1.f) / 2.f, 1.f)), 0.05f); + + if (settings->verbose) { + std::cout << " gray boundaries: " << gmin << ", " << gmax << std::endl; + } + + for (int y = hsta; y < hend; ++y) { + for (int x = wsta; x < wend; ++x) { + const float l = img.g(y, x) / 65535.f; + + if (l >= gmin && l <= gmax) { + tot += static_cast(l); + ++n; + } + } + } + + if (n > 0) { + sourceg[sp] = tot / n * 100.0; + + if (settings->verbose) { + std::cout << " computed gray point from " << n << " samples: " << sourceg[sp] << std::endl; + } + } else {//I change slightly this part of algo - more progressivity...best response in very low exposure images + mean /= (nc * 65535.0); + float yb; + yb = 1.5f + 100.f * pow_F(mean, 1.8f);//empirical formula for Jz and log encode for low exposure images + + sourceg[sp] = yb; + if (settings->verbose) { + std::cout << " no samples found in range, resorting to Yb gray point value " << sourceg[sp] << std::endl; + } + } + } + + constexpr float MIN_WHITE = 2.f; + constexpr float MAX_BLACK = -3.5f; + + const float gray = sourceg[sp] / 100.f; + whiteev[sp] = rtengine::max(xlogf(maxVal / gray) / log2, MIN_WHITE); + blackev[sp] = rtengine::min(whiteev[sp] - dynamic_range, MAX_BLACK); + + + //calculate La - Absolute luminance shooting + + const FramesMetaData* metaData = imgsrc->getMetaData(); + int imgNum = 0; + + if (imgsrc->isRAW()) { + if (imgsrc->getSensorType() == ST_BAYER) { + imgNum = rtengine::LIM(params->raw.bayersensor.imageNum, 0, metaData->getFrameCount() - 1); + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { + //imgNum = rtengine::LIM(params->raw.xtranssensor.imageNum, 0, metaData->getFrameCount() - 1); + } + } + + float fnum = metaData->getFNumber(imgNum); // F number + float fiso = metaData->getISOSpeed(imgNum) ; // ISO + float fspeed = metaData->getShutterSpeed(imgNum) ; // Speed + double fcomp = metaData->getExpComp(imgNum); // Compensation +/- + double adap; + + if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong + adap = 2000.; + } else { + double E_V = fcomp + std::log2(double ((fnum * fnum) / fspeed / (fiso / 100.f))); + double kexp = 0.; + E_V += kexp * params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * std::log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = pow(2.0, E_V - 3.0); // cd / m2 ==> 3.0 = log2(8) =>fnum*fnum/speed = Luminance (average scene) * fiso / K (K is the reflected-light meter calibration constant according to the sensors about 12.5 or 14 + // end calculation adaptation scene luminosity + } + + sourceab[sp] = adap; + + } +} + +void tone_eq(ImProcFunctions *ipf, Imagefloat *rgb, const struct local_params &lp, const Glib::ustring &workingProfile, double scale, bool multithread) +{ + ToneEqualizerParams params; + params.enabled = true; + params.regularization = lp.detailsh; + params.pivot = lp.tePivot; + std::copy(lp.mullocsh, lp.mullocsh + params.bands.size(), params.bands.begin()); + ipf->toneEqualizer(rgb, params, workingProfile, scale, multithread); +} +void ImProcFunctions::loccont(int bfw, int bfh, LabImage* tmp1, float rad, float stren, int sk) +{ + if (rad > 0.f) { + array2D guide(bfw, bfh); + array2D LL(bfw, bfh); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + LL[y][x] = tmp1->L[y][x]; + float ll = LL[y][x] / 32768.f; + guide[y][x] = xlin2log(rtengine::max(ll, 0.f), 10.f); + } + } + array2D iL(bfw, bfh, LL, 0); + float gu = stren * rad; + int r = rtengine::max(int(gu / sk), 1); + const double epsil = 0.001 * std::pow(2.f, -10); + float st = 0.01f * rad; + rtengine::guidedFilterLog(guide, 10.f, LL, r, epsil, false); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + LL[y][x] = intp(st, LL[y][x] , iL[y][x]); + tmp1->L[y][x] = LL[y][x]; + } + } + } +} + +void sigmoidla (float &valj, float thresj, float lambda) +{ + //thres : shifts the action of sigmoid to darker tones or lights + //lambda : changes the "slope" of the sigmoid. Low values give a flat curve, high values a "rectangular / orthogonal" curve + valj = 1.f / (1.f + xexpf(lambda - (lambda / thresj) * valj)); +} + + +void gamutjz (double &Jz, double &az, double &bz, double pl, const double wip[3][3], const float higherCoef, const float lowerCoef) +{//Not used...bad results + constexpr float ClipLevel = 65535.0f; + bool inGamut; + // int nb = 0; + do { + inGamut = true; + double L_, M_, S_; + double xx, yy, zz; + bool zcam = false; + Ciecam02::jzczhzxyz (xx, yy, zz, Jz, az, bz, pl, L_, M_, S_, zcam); + double x, y, z; + x = 65535. * (d65_d50[0][0] * xx + d65_d50[0][1] * yy + d65_d50[0][2] * zz); + y = 65535. * (d65_d50[1][0] * xx + d65_d50[1][1] * yy + d65_d50[1][2] * zz); + z = 65535. * (d65_d50[2][0] * xx + d65_d50[2][1] * yy + d65_d50[2][2] * zz); + float R,G,B; + Color:: xyz2rgb(x, y, z, R, G, B, wip); + if (rtengine::min(R, G, B) < 0.f || rtengine::max(R, G, B) > ClipLevel) { + // nb++; + double hz = xatan2f(bz, az); + float2 sincosval = xsincosf(hz); + double Cz = sqrt(az * az + bz * bz); + // printf("cz=%f jz=%f" , (double) Cz, (double) Jz); + Cz *= (double) higherCoef; + if(Cz < 0.01 && Jz > 0.05) {//empirical values + Jz -= (double) lowerCoef; + } + az = clipazbz(Cz * (double) sincosval.y); + bz = clipazbz(Cz * (double) sincosval.x); + + inGamut = false; + } + } while (!inGamut); +} + +void ImProcFunctions::ciecamloc_02float(const struct local_params& lp, int sp, LabImage* lab, int bfw, int bfh, int call, int sk, const LUTf& cielocalcurve, bool localcieutili, const LUTf& cielocalcurve2, bool localcieutili2, const LUTf& jzlocalcurve, bool localjzutili, const LUTf& czlocalcurve, bool localczutili, const LUTf& czjzlocalcurve, bool localczjzutili, const LocCHCurve& locchCurvejz, const LocHHCurve& lochhCurvejz, const LocLHCurve& loclhCurvejz, bool HHcurvejz, bool CHcurvejz, bool LHcurvejz, const LocwavCurve& locwavCurvejz, bool locwavutilijz +) +{ +// BENCHFUN +//possibility to reenable Zcam + if(!params->locallab.spots.at(sp).activ) {//disable all ciecam functions + return; + } + bool ciec = false; + bool iscie = false; + if (params->locallab.spots.at(sp).ciecam && params->locallab.spots.at(sp).explog && call == 1) { + ciec = true; + iscie = false; + } + else if (params->locallab.spots.at(sp).expcie && call == 0) { + ciec = true; + iscie = true; + } + bool z_cam = false; //params->locallab.spots.at(sp).jabcie; //alaways use normal algorithm, Zcam giev often bad results + bool jabcie = false;//always disabled + bool islogjz = params->locallab.spots.at(sp).forcebw; + bool issigjz = params->locallab.spots.at(sp).sigjz; + bool issigq = params->locallab.spots.at(sp).sigq; + bool islogq = params->locallab.spots.at(sp).logcie; + + //sigmoid J Q variables + const float sigmoidlambda = params->locallab.spots.at(sp).sigmoidldacie; + const float sigmoidth = params->locallab.spots.at(sp).sigmoidthcie; + const float sigmoidbl = params->locallab.spots.at(sp).sigmoidblcie; + const bool sigmoidqj = params->locallab.spots.at(sp).sigmoidqjcie; + + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); + const double wip[3][3] = {//improve precision with double + {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]} + }; + float plum = (float) params->locallab.spots.at(sp).pqremapcam16; + + int mocam = 1; + if(params->locallab.spots.at(sp).modecam == "all") { + mocam = 10;//à remettre à 0 si modecam = "all" + } else if(params->locallab.spots.at(sp).modecam == "cam16") { + mocam = 1; + } else if(params->locallab.spots.at(sp).modecam == "jz") { + mocam = 2; +// } else if(params->locallab.spots.at(sp).modecam == "zcam") { +// mocam = 3; + } + + int mecamcurve = 0; + if(params->locallab.spots.at(sp).toneMethodcie == "one") { + mecamcurve = 0; + } else if(params->locallab.spots.at(sp).toneMethodcie == "two") { + mecamcurve = 1; + } + + int mecamcurve2 = 0; + if(params->locallab.spots.at(sp).toneMethodcie2 == "onec") { + mecamcurve2 = 0; + } else if(params->locallab.spots.at(sp).toneMethodcie2 == "twoc") { + mecamcurve2 = 1; + } else if(params->locallab.spots.at(sp).toneMethodcie2 == "thrc") { + mecamcurve2 = 2; + } + + float th = 1.f; + const float at = 1.f - sigmoidth; + const float bt = sigmoidth; + + const float ath = sigmoidth - 1.f; + const float bth = 1; + float sila = pow_F(sigmoidlambda, 0.5f); + const float sigm = 3.3f + 7.1f *(1.f - sila);//e^10.4 = 32860 => sigm vary from 3.3 to 10.4 + const float bl = sigmoidbl; + //end sigmoid + + int width = lab->W, height = lab->H; + float Yw; + Yw = 1.0f; + double Xw, Zw; + float f = 0.f, nc = 0.f, la, c = 0.f, xw, yw, zw, f2 = 1.f, c2 = 1.f, nc2 = 1.f, yb2; + float fl, n, nbb, ncb, aw; //d + float xwd, ywd, zwd, xws, yws, zws; + // int alg = 0; + double Xwout, Zwout; + double Xwsc, Zwsc; + + LUTu hist16J(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + LUTu hist16Q(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + //for J light and contrast + LUTf CAMBrightCurveJ(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); + LUTf CAMBrightCurveQ(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); + + +#ifdef _OPENMP + const int numThreads = min(max(width * height / 65536, 1), omp_get_max_threads()); + #pragma omp parallel num_threads(numThreads) if(numThreads>1) +#endif + { + LUTu hist16Jthr(hist16J.getSize(), LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + LUTu hist16Qthr(hist16Q.getSize(), LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + +#ifdef _OPENMP + #pragma omp for +#endif + + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { //rough correspondence between L and J + float currL = lab->L[i][j] / 327.68f; + float koef; //rough correspondence between L and J + + if (currL > 50.f) { + if (currL > 70.f) { + if (currL > 80.f) { + if (currL > 85.f) { + koef = 0.97f; + } else { + koef = 0.93f; + } + } else { + koef = 0.87f; + } + } else { + if (currL > 60.f) { + koef = 0.85f; + } else { + koef = 0.8f; + } + } + } else { + if (currL > 10.f) { + if (currL > 20.f) { + if (currL > 40.f) { + koef = 0.75f; + } else { + koef = 0.7f; + } + } else { + koef = 0.9f; + } + } else { + koef = 1.0; + } + } + + hist16Jthr[(int)((koef * lab->L[i][j]))]++; //evaluate histogram luminance L # J + hist16Qthr[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 + } + } + +#ifdef _OPENMP + #pragma omp critical +#endif + { + hist16J += hist16Jthr; + hist16Q += hist16Qthr; + } + } +#ifdef _OPENMP + static_cast(numThreads); // to silence cppcheck warning +#endif + + //evaluate lightness, contrast + + if (ciec) { + float contL = 0.f; + float lightL = 0.f; + float contQ = 0.f; + float lightQ = 0.f; + if(iscie) { + contL = 0.6 * params->locallab.spots.at(sp).contlcie; //0.6 less effect, no need 1. + lightL = 0.4 * params->locallab.spots.at(sp).lightlcie; //0.4 less effect, no need 1. + contQ = 0.5 * params->locallab.spots.at(sp).contqcie; //0.5 less effect, no need 1. + lightQ = 0.4 * params->locallab.spots.at(sp).lightqcie; //0.4 less effect, no need 1. + } else { + contL = 0.6 * params->locallab.spots.at(sp).contl; //0.6 less effect, no need 1. + lightL = 0.4 * params->locallab.spots.at(sp).lightl; //0.4 less effect, no need 1. + contQ = 0.5 * params->locallab.spots.at(sp).contq; //0.5 less effect, no need 1. + lightQ = 0.4 * params->locallab.spots.at(sp).lightq; //0.4 less effect, no need 1. + + } + float contthresL = 0.f; + + if(iscie) { + contthresL = params->locallab.spots.at(sp).contthrescie; + } else { + contthresL = params->locallab.spots.at(sp).contthres; + } + float contthresQ = contthresL; + if(contL < 0.f) { + contthresL *= -1; + } + float thL = 0.6f; + thL = 0.3f * contthresL + 0.6f; + + if(contQ < 0.f) { + contthresQ *= -1; + } + float thQ = 0.6f; + thQ = 0.3f * contthresQ + 0.6f; + Ciecam02::curveJfloat(lightL, contL, thL, hist16J, CAMBrightCurveJ); //lightness J and contrast J + CAMBrightCurveJ /= 327.68f; + + Ciecam02::curveJfloat(lightQ, contQ, thQ, hist16Q, CAMBrightCurveQ); //brightness Q and contrast Q + } + + + int tempo = 5000; + if(params->locallab.spots.at(sp).expvibrance && call == 2) { + if (params->locallab.spots.at(sp).warm > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).warm; + } else if (params->locallab.spots.at(sp).warm < 0){ + tempo = 5000 - 70 * params->locallab.spots.at(sp).warm; + } + } + + + if(ciec) { + if(iscie) { + if (params->locallab.spots.at(sp).catadcie > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).catadcie; + } else if (params->locallab.spots.at(sp).catadcie < 0){ + tempo = 5000 - 70 * params->locallab.spots.at(sp).catadcie; + } + } else { + if (params->locallab.spots.at(sp).catad > 0) { + tempo = 5000 - 30 * params->locallab.spots.at(sp).catad; + } else if (params->locallab.spots.at(sp).catad < 0){ + tempo = 5000 - 70 * params->locallab.spots.at(sp).catad; + } + } + } + + ColorTemp::temp2mulxyz(params->wb.temperature, params->wb.method, params->wb.observer, Xw, Zw); //compute white Xw Yw Zw : white current WB + ColorTemp::temp2mulxyz(tempo, "Custom", params->wb.observer, Xwout, Zwout); + ColorTemp::temp2mulxyz(5000, "Custom", params->wb.observer, Xwsc, Zwsc); + + //viewing condition for surrsrc + f = 1.00f; + c = 0.69f; + nc = 1.00f; + //viewing condition for surround + f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; + if(ciec) { + if(iscie) { + //surround source with only 2 choices (because Log encoding before) + if (params->locallab.spots.at(sp).sursourcie == "Average") { + f = 1.0f, c = 0.69f, nc = 1.0f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dim") { + f = 0.9f; + c = 0.59f; + nc = 0.9f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dark") { + f = 0.8f; + c = 0.525f; + nc = 0.8f; + } + } else { + if (params->locallab.spots.at(sp).sursour == "Average") { + f = 1.0f, c = 0.69f, nc = 1.0f; + } else if (params->locallab.spots.at(sp).sursour == "Dim") { + f = 0.9f; + c = 0.59f; + nc = 0.9f; + } else if (params->locallab.spots.at(sp).sursour == "Dark") { + f = 0.8f; + c = 0.525f; + nc = 0.8f; + } + } + + //viewing condition for surround + if(iscie) { + if (params->locallab.spots.at(sp).surroundcie == "Average") { + f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; + } else if (params->locallab.spots.at(sp).surroundcie == "Dim") { + f2 = 0.9f; + c2 = 0.59f; + nc2 = 0.9f; + } else if (params->locallab.spots.at(sp).surroundcie == "Dark") { + f2 = 0.8f; + c2 = 0.525f; + nc2 = 0.8f; + } else if (params->locallab.spots.at(sp).surroundcie == "ExtremelyDark") { + f2 = 0.8f; + c2 = 0.41f; + nc2 = 0.8f; + } + } else { + if (params->locallab.spots.at(sp).surround == "Average") { + f2 = 1.0f, c2 = 0.69f, nc2 = 1.0f; + } else if (params->locallab.spots.at(sp).surround == "Dim") { + f2 = 0.9f; + c2 = 0.59f; + nc2 = 0.9f; + } else if (params->locallab.spots.at(sp).surround == "Dark") { + f2 = 0.8f; + c2 = 0.525f; + nc2 = 0.8f; + } else if (params->locallab.spots.at(sp).surround == "ExtremelyDark") { + f2 = 0.8f; + c2 = 0.41f; + nc2 = 0.8f; + } + + } + } + + xwd = 100.0 * Xwout; + zwd = 100.0 * Zwout; + ywd = 100.f; + + xws = 100.0 * Xwsc; + zws = 100.0 * Zwsc; + yws = 100.f; + + + //La and la2 = ambiant luminosity scene and viewing + la = 400.f; + float la2 = 400.f; + if(ciec) { + if(iscie) { + la = params->locallab.spots.at(sp).sourceabscie; + la2 = params->locallab.spots.at(sp).targabscie; + } else { + la = params->locallab.spots.at(sp).sourceabs; + la2 = params->locallab.spots.at(sp).targabs; + } + } + + const float pilot = 2.f; + const float pilotout = 2.f; + double avgm = 0.; + //algoritm's params + float yb = 18.f; + yb2 = 18; + if(ciec) { + if(iscie) { + yb = params->locallab.spots.at(sp).sourceGraycie;// + avgm = (double) pow_F(0.01f * (yb - 1.f), 0.45f);; + yb2 = params->locallab.spots.at(sp).targetGraycie; + } else { + yb = params->locallab.spots.at(sp).targetGray;//target because we are after Log encoding + yb2 = params->locallab.spots.at(sp).targetGray; + } + } + if(params->locallab.spots.at(sp).expcie && call == 10 && params->locallab.spots.at(sp).modecam == "jz") { + yb = params->locallab.spots.at(sp).sourceGraycie;//for Jz calculate Yb and surround in Lab and cam16 before process Jz + la = params->locallab.spots.at(sp).sourceabscie; + + if (params->locallab.spots.at(sp).sursourcie == "Average") { + f = 1.0f, c = 0.69f, nc = 1.0f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dim") { + f = 0.9f; + c = 0.59f; + nc = 0.9f; + } else if (params->locallab.spots.at(sp).sursourcie == "Dark") { + f = 0.8f; + c = 0.525f; + nc = 0.8f; + } + } + + float schr = 0.f; + float mchr = 0.f; + float cchr = 0.f; + float rstprotection = 0.f; + float hue = 0.f; +/* + float mchrz = 0.f; + float schrz = 0.f; + float cchrz = 0.f; +*/ + if (ciec) { + if(iscie) { + rstprotection = params->locallab.spots.at(sp).rstprotectcie; + hue = params->locallab.spots.at(sp).huecie; + + cchr = params->locallab.spots.at(sp).chromlcie; + if (cchr == -100.0f) { + cchr = -99.8f; + } + + schr = params->locallab.spots.at(sp).saturlcie; + + if (schr > 0.f) { + schr = schr / 2.f; //divide sensibility for saturation + } + + if (schr == -100.f) { + schr = -99.8f; + } + + mchr = params->locallab.spots.at(sp).colorflcie; + + if (mchr == -100.0f) { + mchr = -99.8f ; + } + if (mchr == 100.0f) { + mchr = 99.9f; + } +/* + mchrz = 0.5f * (float) params->locallab.spots.at(sp).colorflzcam; + schrz = 0.5f * (float) params->locallab.spots.at(sp).saturzcam; + cchrz = 0.5f * (float) params->locallab.spots.at(sp).chromzcam; +*/ + } else { + cchr = params->locallab.spots.at(sp).chroml; + if (cchr == -100.0f) { + cchr = -99.8f; + } + + schr = params->locallab.spots.at(sp).saturl; + + if (schr > 0.f) { + schr = schr / 2.f; //divide sensibility for saturation + } + + if (schr == -100.f) { + schr = -99.8f; + } + + mchr = params->locallab.spots.at(sp).colorfl; + + if (mchr == -100.0f) { + mchr = -99.8f ; + } + if (mchr == 100.0f) { + mchr = 99.9f; + } + } + } + + float d, dj; + + // const int gamu = 0; //(params->colorappearance.gamut) ? 1 : 0; + xw = 100.0 * Xw; + yw = 100.f * Yw; + zw = 100.0 * Zw; + float xw1 = xws, yw1 = yws, zw1 = zws, xw2 = xwd, yw2 = ywd, zw2 = zwd; + float cz, wh, pfl; + int c16 = 16;//always cat16 + bool c20 = true; + if(c20 && plum > 100.f) { + c16 = 21;//I define 21...for 2021 :) + } + int level_bljz = params->locallab.spots.at(sp).csthresholdjz.getBottomLeft(); + int level_hljz = params->locallab.spots.at(sp).csthresholdjz.getTopLeft(); + int level_brjz = params->locallab.spots.at(sp).csthresholdjz.getBottomRight(); + int level_hrjz = params->locallab.spots.at(sp).csthresholdjz.getTopRight(); + + float alowjz = 1.f; + float blowjz = 0.f; + + if (level_hljz != level_bljz) { + alowjz = 1.f / (level_hljz - level_bljz); + blowjz = -alowjz * level_bljz; + } + + float ahighjz = 1.f; + float bhighjz = 0.f; + + if (level_hrjz != level_brjz) { + ahighjz = 1.f / (level_hrjz - level_brjz); + bhighjz = -ahighjz * level_brjz; + } + float sigmalcjz = params->locallab.spots.at(sp).sigmalcjz; + float jzamountchr = 0.01 * params->locallab.spots.at(sp).thrhjzcie; + bool jzch = params->locallab.spots.at(sp).chjzcie; + double jzamountchroma = 0.01 * settings->amchromajz; + if(jzamountchroma < 0.05) { + jzamountchroma = 0.05; + } + if(jzamountchroma > 2.) { + jzamountchroma = 2.; + } + + Ciecam02::initcam1float(yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c, c16, plum); + const float pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f); + float nj, nbbj, ncbj, czj, awj, flj; + Ciecam02::initcam2float(yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj, c16, plum); +#ifdef __SSE2__ + const float reccmcz = 1.f / (c2 * czj); +#endif + const float epsil = 0.0001f; + const float coefQ = 32767.f / wh; + const float coefq = 1 / wh; + const float pow1n = pow_F(1.64f - pow_F(0.29f, nj), 0.73f); + const float coe = pow_F(fl, 0.25f); + const float QproFactor = (0.4f / c) * (aw + 4.0f) ; + const double shadows_range = params->locallab.spots.at(sp).blackEvjz; + const double targetgray = params->locallab.spots.at(sp).targetjz; + double targetgraycor = 0.15; + double dynamic_range = std::max(params->locallab.spots.at(sp).whiteEvjz - shadows_range, 0.5); + const double noise = pow(2., -16.6);//16.6 instead of 16 a little less than others, but we work in double + const double log2 = xlog(2.); + const float log2f = xlogf(2.f); + + if((mocam == 0 || mocam ==2) && call == 0) {//Jz az bz ==> Jz Cz Hz before Ciecam16 + double mini = 1000.; + double maxi = -1000.; + double sum = 0.; + int nc = 0; + double epsiljz = 0.0001; + //Remapping see https://hal.inria.fr/hal-02131890/document I took some ideas in this text, and add my personal adaptation + // image quality assessment of HDR and WCG images https://tel.archives-ouvertes.fr/tel-02378332/document + double adapjz = params->locallab.spots.at(sp).adapjzcie; + double jz100 = params->locallab.spots.at(sp).jz100; + double pl = params->locallab.spots.at(sp).pqremap; + double jzw, azw, bzw; + jzw = 0.18;//Jz white + + bool Qtoj = params->locallab.spots.at(sp).qtoj;//betwwen lightness to brightness + const bool logjz = params->locallab.spots.at(sp).logjz;//log encoding + +//calculate min, max, mean for Jz +#ifdef _OPENMP + #pragma omp parallel for reduction(min:mini) reduction(max:maxi) reduction(+:sum) if(multiThread) +#endif + for (int i = 0; i < height; i+=1) { + for (int k = 0; k < width; k+=1) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double Jz, az, bz; + double xx, yy, zz; + //D50 ==> D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + + double L_p, M_p, S_p; + bool zcam = z_cam; + + Ciecam02::xyz2jzczhz (Jz, az, bz, xx, yy, zz, pl, L_p, M_p, S_p, zcam); + if(Jz > maxi) { + maxi = Jz; + } + if(Jz < mini) { + mini = Jz; + } + sum += Jz; + // I read bz, az values and Hz ==> with low chroma values Hz are very different from lab always around 1.4 radians ???? for blue... + } + } + nc = height * width; + sum = sum / nc; + maxi += epsiljz; + sum += epsiljz; + //remapping Jz + double ijz100 = 1./jz100; + double ajz = (ijz100 - 1.)/9.;//9 = sqrt(100) - 1 with a parabolic curve after jz100 - we can change for others curve ..log...(you must change also in locallabtool2) + double bjz = 1. - ajz; + //relation between adapjz and Absolute luminance source (La), adapjz =sqrt(La) - see locallabtool2 adapjzcie + double interm = jz100 * (adapjz * ajz + bjz); + double bj = (10. - maxi) / 9.; + double aj = maxi -bj; + double to_screen = (aj * interm + bj) / maxi; + //to screen - remapping of Jz in function real scene absolute luminance + +// if (settings->verbose) { +// printf("ajz=%f bjz=%f adapjz=%f jz100=%f interm=%f to-scrp=%f to_screen=%f\n", ajz, bjz, adapjz, jz100, interm ,to_screenp, to_screen); +// } + double to_one = 1.;//only for calculation in range 0..1 or 0..32768 + to_one = 1 / (maxi * to_screen); + if(adapjz == 10.) {//force original algorithm if La > 10000 + to_screen = 1.; + } + if(Qtoj) { + double xxw = (d50_d65[0][0] * (double) Xw + d50_d65[0][1] * (double) Yw + d50_d65[0][2] * (double) Zw); + double yyw = (d50_d65[1][0] * (double) Xw + d50_d65[1][1] * (double) Yw + d50_d65[1][2] * (double) Zw); + double zzw = (d50_d65[2][0] * (double) Xw + d50_d65[2][1] * (double) Yw + d50_d65[2][2] * (double) Zw); + double L_pa, M_pa, S_pa; + Ciecam02::xyz2jzczhz (jzw, azw, bzw, xxw, yyw, zzw, pl, L_pa, M_pa, S_pa, z_cam); + if (settings->verbose) { //calculate Jz white for use of lightness instead brightness + printf("Jzwhite=%f \n", jzw); + } + + } + const std::unique_ptr temp(new LabImage(width, height)); + const std::unique_ptr tempresid(new LabImage(width, height)); + const std::unique_ptr tempres(new LabImage(width, height)); + array2D JJz(width, height); + array2D Aaz(width, height); + array2D Bbz(width, height); + int highhs = params->locallab.spots.at(sp).hljzcie; + int hltonahs = params->locallab.spots.at(sp).hlthjzcie; + int shadhs = params->locallab.spots.at(sp).shjzcie; + int shtonals = params->locallab.spots.at(sp).shthjzcie; + int radhs = params->locallab.spots.at(sp).radjzcie; + float softjz = (float) params->locallab.spots.at(sp).softjzcie; + + avgm = 0.5 * (sum * to_screen * to_one + avgm);//empirical formula + double miny = 0.1; + double delta = 0.015 * (double) sqrt(std::max(100.f, la) / 100.f);//small adaptation in function La scene + double maxy = 0.65;//empirical value + double maxreal = maxi*to_screen; + double maxjzw = jzw*to_screen; + if (settings->verbose) { + printf("La=%4.1f PU_adap=%2.1f maxi=%f mini=%f mean=%f, avgm=%f to_screen=%f Max_real=%f to_one=%f\n", (double) la, adapjz, maxi, mini, sum, avgm, to_screen, maxreal, to_one); + } + + const float sigmoidlambdajz = params->locallab.spots.at(sp).sigmoidldajzcie; + const float sigmoidthjz = params->locallab.spots.at(sp).sigmoidthjzcie; + const float sigmoidbljz = params->locallab.spots.at(sp).sigmoidbljzcie; + + float thjz = 1.f; + const float atjz = 1.f - sigmoidthjz; + const float btjz = sigmoidthjz; + + const float athjz = sigmoidthjz - 1.f; + const float bthjz = 1.f; + float powsig = pow_F(sigmoidlambdajz, 0.5f); + const float sigmjz = 3.3f + 7.1f *(1.f - powsig);// e^10.4 = 32860 + const float bljz = sigmoidbljz; + + double contreal = 0.2 * params->locallab.spots.at(sp).contjzcie; + DiagonalCurve jz_contrast({ + DCT_NURBS, + 0, 0, + avgm - avgm * (0.6 - contreal / 250.0), avgm - avgm * (0.6 + contreal / 250.0), + avgm + (1. - avgm) * (0.6 - contreal / 250.0), avgm + (1. - avgm) * (0.6 + contreal / 250.0), + 1, 1 + }); + //all calculations in double for best results...but slow + double lightreal = 0.2 * params->locallab.spots.at(sp).lightjzcie; + double chromz = params->locallab.spots.at(sp).chromjzcie; + double saturz = params->locallab.spots.at(sp).saturjzcie; + double dhue = 0.0174 * params->locallab.spots.at(sp).huejzcie; + DiagonalCurve jz_light({ + DCT_NURBS, + 0, 0, + miny, miny + lightreal / 150., + maxy, min (1.0, maxy + delta + lightreal / 300.0), + 1, 1 + }); + DiagonalCurve jz_lightn({ + DCT_NURBS, + 0, 0, + max(0.0, miny - lightreal / 150.), miny , + maxy + delta - lightreal / 300.0, maxy + delta, + 1, 1 + }); + bool wavcurvejz = false; + if (locwavCurvejz && locwavutilijz) { + for (int i = 0; i < 500; i++) { + if (locwavCurvejz[i] != 0.5f) { + wavcurvejz = true; + break; + } + } + } + float mjjz = lp.mLjz; + if(wavcurvejz && lp.mLjz == 0.f) { + mjjz = 0.0f;//to enable clarity if need in some cases mjjz = 0.0001f + } + + //log encoding Jz + double gray = 0.15; + /* + const double shadows_range = params->locallab.spots.at(sp).blackEvjz; + const double targetgray = params->locallab.spots.at(sp).targetjz; + double targetgraycor = 0.15; + double dynamic_range = std::max(params->locallab.spots.at(sp).whiteEvjz - shadows_range, 0.5); + const double noise = pow(2., -16.6);//16.6 instead of 16 a little less than others, but we work in double + const double log2 = xlog(2.); + */ + double base = 10.; + double linbase = 10.; + if(logjz) {//with brightness Jz + gray = 0.01 * params->locallab.spots.at(sp).sourceGraycie;//acts as amplifier (gain) : needs same type of modifications than targetgraycor with pow + gray = pow(gray, 1.2);//or 1.15 => modification to increase sensitivity gain, only on defaults, of course we can change this value manually...take into account suuround and Yb Cam16 + targetgraycor = pow(0.01 * targetgray, 1.15);//or 1.2 small reduce effect -> take into account a part of surround (before it was at 1.2) + base = targetgray > 1. && targetgray < 100. && dynamic_range > 0. ? (double) find_gray(std::abs((float) shadows_range) / (float) dynamic_range, (float) (targetgraycor)) : 0.; + linbase = std::max(base, 2.);//2. minimal base log to avoid very bad results + if (settings->verbose) { + printf("Base logarithm encoding Jz=%5.1f\n", linbase); + } + } + + const auto applytojz = + [ = ](double x) -> double { + + x = std::max(x, noise); + x = std::max(x / gray, noise);//gray = gain - before log conversion + x = std::max((xlog(x) / log2 - shadows_range) / dynamic_range, noise);//x in range EV + assert(x == x); + + if (linbase > 0.)//apply log base in function of targetgray blackEvjz and Dynamic Range + { + x = xlog2lin(x, linbase); + } + return x; + }; + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double Jz, az, bz;//double need because matrix with const(1.6295499532821566e-11) and others + double xx, yy, zz; + //change WP to D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + + double L_p, M_p, S_p; + bool zcam = z_cam; + Ciecam02::xyz2jzczhz (Jz, az, bz, xx, yy, zz, pl, L_p, M_p, S_p, zcam); + //remapping Jz + Jz = Jz * to_screen; + az = az * to_screen; + bz = bz * to_screen; + JJz[i][k] = Jz; + Aaz[i][k] = az; + Bbz[i][k] = bz; + if(highhs > 0 || shadhs > 0 || wavcurvejz || mjjz != 0.f || lp.mCjz != 0.f || LHcurvejz || HHcurvejz || CHcurvejz) { + //here we work in float with usual functions SH / wavelets / curves H + temp->L[i][k] = tempresid->L[i][k] = tempres->L[i][k] = (float) to_one * 32768.f * (float) JJz[i][k]; + temp->a[i][k] = tempresid->a[i][k] = tempres->a[i][k] = (float) to_one * 32768.f * (float) Aaz[i][k]; + temp->b[i][k] = tempresid->b[i][k] = tempres->b[i][k] = (float) to_one * 32768.f * (float) Bbz[i][k]; + } + } + } + + if(highhs > 0 || shadhs > 0) { + ImProcFunctions::shadowsHighlights(temp.get(), true, 1, highhs, shadhs, radhs, sk, hltonahs * maxi * to_screen * to_one, shtonals * maxi * to_screen * to_one); +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) {//reinitialize datas after SH...: guide, etc. + tempresid->L[i][k] = tempres->L[i][k] = temp->L[i][k]; + tempresid->a[i][k] = tempres->a[i][k] = temp->a[i][k]; + tempresid->b[i][k] = tempres->b[i][k] = temp->b[i][k]; + } + } + } + //others "Lab" treatment...to adapt + + if(wavcurvejz || mjjz != 0.f || lp.mCjz != 0.f) {//local contrast wavelet and clarity +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + // adap maximum level wavelet to size of RT-spot + int wavelet_level = 1 + params->locallab.spots.at(sp).csthresholdjz.getBottomRight();//retrieve with +1 maximum wavelet_level + int minwin = rtengine::min(width, height); + int maxlevelspot = 10;//maximum possible + + // adapt maximum level wavelet to size of crop + while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { + --maxlevelspot ; + } + + + wavelet_level = rtengine::min(wavelet_level, maxlevelspot); + int maxlvl = wavelet_level; + //simple local contrast in function luminance + if (locwavCurvejz && locwavutilijz && wavcurvejz) { + float strengthjz = 1.2; + std::unique_ptr wdspot(new wavelet_decomposition(temp->L[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen));//lp.daubLen + if (wdspot->memory_allocation_failed()) { + return; + } + maxlvl = wdspot->maxlevel(); + wavlc(*wdspot, level_bljz, level_hljz, maxlvl, level_hrjz, level_brjz, ahighjz, bhighjz, alowjz, blowjz, sigmalcjz, strengthjz, locwavCurvejz, numThreads); + wdspot->reconstruct(temp->L[0], 1.f); + + } + float thr = 0.001f; + int flag = 2; + + // begin clarity wavelet jz + if(mjjz != 0.f || lp.mCjz != 0.f) { + float mL0 = 0.f; + float mC0 = 0.f; + bool exec = false; + float mL = mjjz; + float mC = lp.mCjz; + clarimerge(lp, mL, mC, exec, tempresid.get(), wavelet_level, sk, numThreads); + + if (maxlvl <= 4) { + mL0 = 0.f; + mC0 = 0.f; + mL = -1.5f * mL;//increase only for sharpen + mC = -mC; + thr = 1.f; + flag = 0; + + } else { + mL0 = mL; + mC0 = mC; + thr = 1.f; + flag = 2; + } + LabImage *mergfile = temp.get(); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int x = 0; x < height; x++) + for (int y = 0; y < width; y++) { + temp->L[x][y] = clipLoc((1.f + mL0) * mergfile->L[x][y] - mL * tempresid->L[x][y]); + temp->a[x][y] = clipC((1.f + mC0) * mergfile->a[x][y] - mC * tempresid->a[x][y]); + temp->b[x][y] = clipC((1.f + mC0) * mergfile->b[x][y] - mC * tempresid->b[x][y]); + } + } + + if (lp.softrjz >= 0.5f && (wavcurvejz || std::fabs(mjjz) > 0.001f)) {//guidedfilter + softproc(tempres.get(), temp.get(), lp.softrjz, height, width, 0.001, 0.00001, thr, sk, multiThread, flag); + } + } + +//new curves Hz +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + float j_z = temp->L[i][k]; + float C_z = sqrt(SQR(temp->a[i][k]) + SQR(temp->b[i][k])); + float c_z = C_z / 32768.f; + if (loclhCurvejz && LHcurvejz) {//Jz=f(Hz) curve + float kcz = (float) jzamountchr; + float Hz = xatan2f (temp->b[i][k], temp->a[i][k]); + float l_r = j_z / 32768.f; + float kcc = SQR(c_z / kcz); + jzch = true; + if(jzch == false) { + kcc = 1.f; + } else if(kcc > 1.f) { + kcc = 1.f; //cbrt(kcc); + } + float valparam = loclhCurvejz[500.f *static_cast(Color::huejz_to_huehsv2((float) Hz))] - 0.5f; + + float valparamneg; + valparamneg = valparam; + valparam *= 2.f * kcc; + valparamneg *= kcc; + if (valparam > 0.f) { + l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - min(l_r, 1.0f)))))); + } else + //for negative + { + float khue = 1.9f; //in reserve in case of! + l_r *= (1.f + khue * valparamneg); + } + temp->L[i][k] = l_r * 32768.f; + } + + if (locchCurvejz && CHcurvejz) {//Cz=f(Hz) curve + float Hz = xatan2f (temp->b[i][k], temp->a[i][k]); + const float valparam = 1.5f * (locchCurvejz[500.f * static_cast(Color::huejz_to_huehsv2((float)Hz))] - 0.5f); //get valp=f(H) + float chromaCzfactor = 1.0f + valparam; + temp->a[i][k] *= chromaCzfactor; + temp->b[i][k] *= chromaCzfactor; + } + + + if (lochhCurvejz && HHcurvejz) { // Hz=f(Hz) + float Hz = xatan2f (temp->b[i][k], temp->a[i][k]); + const float valparam = 1.4f * (lochhCurvejz[500.f * static_cast(Color::huejz_to_huehsv2((float)Hz))] - 0.5f) + static_cast(Hz); + Hz = valparam; + if ( Hz < 0.0f ) { + Hz += (2.f * rtengine::RT_PI_F); + } + + float2 sincosval = xsincosf(Hz); + temp->a[i][k] = C_z * sincosval.y; + temp->b[i][k] = C_z * sincosval.x; + } + } + } + + if (loclhCurvejz && LHcurvejz && softjz > 0.f) {//Guidedilter for artifacts curve J(H) + float thr = 0.00001f; + int flag = 2; + float softjzr = 0.05f * softjz; + softproc(tempres.get(), temp.get(), softjzr, height, width, 0.000001, 0.00000001, thr, sk, multiThread, flag); + } + + + if ((lochhCurvejz && HHcurvejz) || (locchCurvejz && CHcurvejz)) { //for artifacts curve H(H) + if(softjz > 0.f) { + array2D chro(width, height); + array2D hue(width, height); + array2D guid(width, height); + +#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++) { + hue[y][x] = xatan2f(temp->b[y][x], temp->a[y][x]); + chro[y][x] = sqrt(SQR(temp->b[y][x]) + SQR(temp->a[y][x]))/32768.f; + if ( hue[y][x] < 0.0f ) { + hue[y][x] += (2.f * rtengine::RT_PI_F); + } + hue[y][x] /= (2.f * rtengine::RT_PI_F); + guid[y][x] = tempres->L[y][x] / 32768.f; + } + } + float softr = softjz; + const float tmpblur = softr < 0.f ? -1.f / softr : 1.f + softr; + const int r2 = rtengine::max(10 / sk * tmpblur + 0.2f, 1); + const int r1 = rtengine::max(4 / sk * tmpblur + 0.5f, 1); + constexpr float epsilmax = 0.0005f; + constexpr float epsilmin = 0.0000001f; + constexpr float aepsil = (epsilmax - epsilmin) / 100.f; + constexpr float bepsil = epsilmin; + const float epsil = softr < 0.f ? 0.001f : aepsil * softr + bepsil; + if (lochhCurvejz && HHcurvejz) { + rtengine::guidedFilter(guid, hue, hue, r2, 0.5f * epsil, multiThread); + } + if (locchCurvejz && CHcurvejz) { + rtengine::guidedFilter(guid, chro, chro, r1, 0.4f * epsil, multiThread); + } + +#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++) { + hue[y][x] *= (2.f * rtengine::RT_PI_F); + chro[y][x] *= 32768.f; + float2 sincosval = xsincosf(hue[y][x]); + temp->a[y][x] = chro[y][x] * sincosval.y; + temp->b[y][x] = chro[y][x] * sincosval.x; + } + } + } + } + + +/////////////////// + + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + //reconvert to double + if(highhs > 0 || shadhs > 0 || wavcurvejz || mjjz != 0.f || lp.mCjz != 0.f || LHcurvejz || HHcurvejz || CHcurvejz) { + //now we work in double necessary for matrix conversion and when in range 0..1 with use of PQ + JJz[i][k] = (double) (temp->L[i][k] / (32768.f * (float) to_one)); + Aaz[i][k] = (double) (temp->a[i][k] / (32768.f * (float) to_one)); + Bbz[i][k] = (double) (temp->b[i][k] / (32768.f * (float) to_one)); + } + + double az = Aaz[i][k]; + double bz = Bbz[i][k]; + double Jz = LIM01(JJz[i][k]); + Jz *= to_one; + double Cz = sqrt(az * az + bz * bz); + //log encoding + if(logjz) { + double jmz = Jz; + if (jmz > noise) { + double mm = applytojz(jmz); + double f = mm / jmz; + Jz *= f; + //Cz *= f; + Jz = LIM01(Jz);//clip values + //Cz = clipcz(Cz); + } + } + //sigmoid + if(issigjz && iscie) {//sigmoid Jz + float val = Jz; + if(islogjz) { + val = std::max((xlog(Jz) / log2 - shadows_range) / (dynamic_range + 1.5), noise);//in range EV + } + if(sigmoidthjz >= 1.f) { + thjz = athjz * val + bthjz;//threshold + } else { + thjz = atjz * val + btjz; + } + sigmoidla (val, thjz, sigmjz);//sigmz "slope" of sigmoid + + + Jz = LIM01((double) bljz * Jz + (double) val); + } + + if(Qtoj == true) {//lightness instead of brightness + Jz /= to_one; + Jz /= maxjzw;//Jz white + Jz = SQR(Jz); + } + //contrast + Jz= LIM01(jz_contrast.getVal(LIM01(Jz))); + //brightness and lightness + if(lightreal > 0) { + Jz = LIM01(jz_light.getVal(Jz)); + } + if(lightreal < 0) { + Jz = LIM01(jz_lightn.getVal(Jz)); + } + //Jz (Jz) curve + double Jzold = Jz; + if(jzlocalcurve && localjzutili) { + Jz = (double) (jzlocalcurve[(float) Jz * 65535.f] / 65535.f); + Jz = 0.3 * (Jz - Jzold) + Jzold; + } + //reconvert from lightness or Brightness + if(Qtoj == false) { + Jz /= to_one; + } else { + Jz = sqrt(Jz); + Jz *= maxjzw; + } + + double Hz; + //remapping Cz + Hz = xatan2 ( bz, az ); + double Czold = Cz; + //Cz(Cz) curve + if(czlocalcurve && localczutili) { + Cz = (double) (czlocalcurve[(float) Cz * 92666.f * (float) to_one] / (92666.f * (float) to_one)); + Cz = 0.5 * (Cz - Czold) + Czold; + } + //Cz(Jz) curve + if(czjzlocalcurve && localczjzutili) { + double chromaCfactor = (double) (czjzlocalcurve[(float) Jz * 65535.f * (float) to_one]) / (Jz * 65535. * to_one); + Cz *= chromaCfactor; + } + //Hz in 0 2*PI + if ( Hz < 0.0 ) { + Hz += (2. * rtengine::RT_PI); + } + //Chroma slider + if(chromz < 0.) { + Cz = Cz * (1. + 0.01 * chromz); + } else { + double maxcz = czlim / to_one; + double fcz = Cz / maxcz; + double pocz = pow(fcz , 1. - 0.0024 * chromz);//increase value - before 0.0017 + Cz = maxcz * pocz; + // Cz = Cz * (1. + 0.005 * chromz);//linear + } + //saturation slider + if(saturz != 0.) { + double js = Jz/ maxjzw;//divide by Jz white + js = SQR(js); + if(js <= 0.) { + js = 0.0000001; + } + double Sz = Cz / (js); + if(saturz < 0.) { + Sz = Sz * (1. + 0.01 * saturz); + } else { + Sz = Sz * (1. + 0.003 * saturz);//not pow function because Sz is "open" - 0.003 empirical value to have results comparable to Cz + } + Cz = Sz * js; + } + + //rotation hue + Hz += dhue; + if ( Hz < 0.0 ) { + Hz += (2. * rtengine::RT_PI); + } + Cz = clipcz(Cz); + double2 sincosval = xsincos(Hz); + az = clipazbz(Cz * sincosval.y); + bz = clipazbz(Cz * sincosval.x); + Cz = sqrt(az * az + bz * bz); + + + bz = bz / (to_screen); + az = az / (to_screen); + + Jz = LIM01(Jz / (to_screen)); + if(jabcie) {//Not used does not work at all + Jz = clipjz05(Jz); + gamutjz (Jz, az, bz, pl, wip, 0.94, 0.004); + } + + double L_, M_, S_; + double xx, yy, zz; + bool zcam = z_cam; + //reconvert to XYZ in double + Ciecam02::jzczhzxyz (xx, yy, zz, Jz, az, bz, pl, L_, M_, S_, zcam); + //re enable D50 + double x, y, z; + x = 65535. * (d65_d50[0][0] * xx + d65_d50[0][1] * yy + d65_d50[0][2] * zz); + y = 65535. * (d65_d50[1][0] * xx + d65_d50[1][1] * yy + d65_d50[1][2] * zz); + z = 65535. * (d65_d50[2][0] * xx + d65_d50[2][1] * yy + d65_d50[2][2] * zz); + + float Ll, aa, bb; + Color::XYZ2Lab(x, y, z, Ll, aa, bb); + lab->L[i][k] = Ll; + lab->a[i][k] = aa; + lab->b[i][k] = bb; + } + } + } + +if(mocam == 0 || mocam == 1 || call == 1 || call == 2 || call == 10) {//call=2 vibrance warm-cool - call = 10 take into account "mean luminance Yb for Jz +//begin ciecam + if (settings->verbose && (mocam == 0 || mocam == 1 || call == 1)) {//display only if choice cam16 + //information on Cam16 scene conditions - allows user to see choices's incidences + float maxicam = -1000.f; + float maxicamq = -1000.f; + float maxisat = -1000.f; + float maxiM = -1000.f; + float minicam = 1000000.f; + float minicamq = 1000000.f; + float minisat = 1000000.f; + float miniM = 1000000.f; + int nccam = 0; + float sumcam = 0.f; + float sumcamq = 0.f; + float sumsat = 0.f; + float sumM = 0.f; + if(lp.logena && !(params->locallab.spots.at(sp).expcie && mocam == 1)) {//Log encoding only, but enable for log encoding if we use Cam16 module both with log encoding + plum = 100.f; + } + + + +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minicam) reduction(max:maxicam) reduction(min:minicamq) reduction(max:maxicamq) reduction(min:minisat) reduction(max:maxisat) reduction(min:miniM) reduction(max:maxiM) reduction(+:sumcam) reduction(+:sumcamq) reduction(+:sumsat) reduction(+:sumM)if(multiThread) +#endif + for (int i = 0; i < height; i+=1) { + for (int k = 0; k < width; k+=1) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 655.35f; + y = y / 655.35f; + z = z / 655.35f; + float J, C, h, Q, M, s; + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, aw, fl, wh, + x, y, z, + xw1, yw1, zw1, + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); + if(J > maxicam) { + maxicam = J; + } + if(J < minicam) { + minicam = J; + } + sumcam += J; + + if(Q > maxicamq) { + maxicamq = Q; + } + if(Q < minicamq) { + minicamq = Q; + } + sumcamq += Q; + + if(s > maxisat) { + maxisat = s; + } + if(s < minisat) { + minisat = s; + } + sumsat += s; + + if(M > maxiM) { + maxiM = M; + } + if(M < miniM) { + miniM = M; + } + sumM += M; + + } + } + nccam = height * width; + sumcam = sumcam / nccam; + sumcamq /= nccam; + sumsat /= nccam; + sumM /= nccam; + + printf("Cam16 Scene Lighness_J Brightness_Q- HDR-PQ=%5.1f minJ=%3.1f maxJ=%3.1f meanJ=%3.1f minQ=%3.1f maxQ=%4.1f meanQ=%4.1f\n", (double) plum, (double) minicam, (double) maxicam, (double) sumcam, (double) minicamq, (double) maxicamq, (double) sumcamq); + printf("Cam16 Scene Saturati-s Colorfulln_M- minSat=%3.1f maxSat=%3.1f meanSat=%3.1f minM=%3.1f maxM=%3.1f meanM=%3.1f\n", (double) minisat, (double) maxisat, (double) sumsat, (double) miniM, (double) maxiM, (double) sumM); +} + + float base = 10.; + float linbase = 10.; + float gray = 15.; + if(islogq) {//with brightness Jz + gray = 0.01f * (float) params->locallab.spots.at(sp).sourceGraycie; + gray = pow_F(gray, 1.2f);//or 1.15 => modification to increase sensitivity gain, only on defaults, of course we can change this value manually...take into account suuround and Yb Cam16 + const float targetgraycie = params->locallab.spots.at(sp).targetGraycie; + float targetgraycor = pow_F(0.01f * targetgraycie, 1.15f); + base = targetgraycie > 1.f && targetgraycie < 100.f && (float) dynamic_range > 0.f ? find_gray(std::abs((float) shadows_range) / (float) dynamic_range,(targetgraycor)) : 0.f; + linbase = std::max(base, 2.f);//2. minimal base log to avoid very bad results + if (settings->verbose) { + printf("Base logarithm encoding Q=%5.1f\n", (double) linbase); + } + } + + const auto applytoq = + [ = ](float x) -> float { + + x = rtengine::max(x, (float) noise); + x = rtengine::max(x / gray, (float) noise);//gray = gain - before log conversion + x = rtengine::max((xlogf(x) / log2f - (float) shadows_range) / (float) dynamic_range, (float) noise);//x in range EV + assert(x == x); + + if (linbase > 0.f)//apply log base in function of targetgray blackEvjz and Dynamic Range + { + x = xlog2lin(x, linbase); + } + return x; + }; + + + +//Ciecam "old" code not change except sigmoid added +#ifdef __SSE2__ + int bufferLength = ((width + 3) / 4) * 4; // bufferLength has to be a multiple of 4 +#endif +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + // one line buffer per channel and thread + float Jbuffer[bufferLength] ALIGNED16; + float Cbuffer[bufferLength] ALIGNED16; + float hbuffer[bufferLength] ALIGNED16; + float Qbuffer[bufferLength] ALIGNED16; + float Mbuffer[bufferLength] ALIGNED16; + float sbuffer[bufferLength] ALIGNED16; +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) +#endif + for (int i = 0; i < height; i++) { +#ifdef __SSE2__ + // vectorized conversion from Lab to jchqms + int k; + vfloat c655d35 = F2V(655.35f); + + for (k = 0; k < width - 3; k += 4) { + vfloat x, y, z; + Color::Lab2XYZ(LVFU(lab->L[i][k]), LVFU(lab->a[i][k]), LVFU(lab->b[i][k]), x, y, z); + x = x / c655d35; + y = y / c655d35; + z = z / c655d35; + vfloat J, C, h, Q, M, s; + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, F2V(aw), F2V(fl), F2V(wh), + x, y, z, + F2V(xw1), F2V(yw1), F2V(zw1), + F2V(c), F2V(nc), F2V(pow1), F2V(nbb), F2V(ncb), F2V(pfl), F2V(cz), F2V(d), c16, F2V(plum)); + STVF(Jbuffer[k], J); + STVF(Cbuffer[k], C); + STVF(hbuffer[k], h); + STVF(Qbuffer[k], Q); + STVF(Mbuffer[k], M); + STVF(sbuffer[k], s); + } + + for (; k < width; k++) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 655.35f; + y = y / 655.35f; + z = z / 655.35f; + float J, C, h, Q, M, s; + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, aw, fl, wh, + x, y, z, + xw1, yw1, zw1, + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); + Jbuffer[k] = J; + Cbuffer[k] = C; + hbuffer[k] = h; + Qbuffer[k] = Q; + Mbuffer[k] = M; + sbuffer[k] = s; + } + +#endif // __SSE2__ + + for (int j = 0; j < width; j++) { + float J, C, h, Q, M, s; + +#ifdef __SSE2__ + // use precomputed values from above + J = Jbuffer[j]; + C = Cbuffer[j]; + h = hbuffer[j]; + Q = Qbuffer[j]; + M = Mbuffer[j]; + s = sbuffer[j]; +#else + float x, y, z; + float L = lab->L[i][j]; + float a = lab->a[i][j]; + float b = lab->b[i][j]; + float x1, y1, z1; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x1, y1, z1); + x = x1 / 655.35f; + y = y1 / 655.35f; + z = z1 / 655.35f; + //process source==> normal + Ciecam02::xyz2jchqms_ciecam02float(J, C, h, + Q, M, s, aw, fl, wh, + x, y, z, + xw1, yw1, zw1, + c, nc, pow1, nbb, ncb, pfl, cz, d, c16, plum); +#endif + float Jpro, Cpro, hpro, Qpro, Mpro, spro; + Jpro = J; + Cpro = C; + hpro = h; + Qpro = Q; + Mpro = M; + spro = s; + /* + */ + if(ciec) { + bool jp = false; + if ((cielocalcurve && localcieutili) && mecamcurve == 1) { + jp = true; + float Qq = Qpro * coefQ; + float Qold = Qpro; + Qq = 0.5f * cielocalcurve[Qq * 2.f]; + Qq = Qq / coefQ; + Qpro = 0.2f * (Qq - Qold) + Qold; + if(jp) { + Jpro = SQR((10.f * Qpro) / wh); + } + } + + Qpro = CAMBrightCurveQ[(float)(Qpro * coefQ)] / coefQ; //brightness and contrast + + if(islogq && issigq) { + float val = Qpro * coefq;; + if (val > (float) noise) { + float mm = applytoq(val); + float f = mm / val; + Qpro *= f; + } + } + + + if(issigq && iscie && !islogq) {//sigmoid Q only with ciecam module + float val = Qpro * coefq; + if(sigmoidqj == true) { + val = std::max((xlog(val) / log2 - shadows_range) / (dynamic_range + 1.5), noise);//in range EV + } + if(sigmoidth >= 1.f) { + th = ath * val + bth; + } else { + th = at * val + bt; + } + sigmoidla (val, th, sigm); + float bl2 = 1.f; + Qpro = std::max(bl * Qpro + bl2 * val / coefq, 0.f); + } + + + float Mp, sres; + Mp = Mpro / 100.0f; + Ciecam02::curvecolorfloat(mchr, Mp, sres, 2.5f); + 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 + Color::skinredfloat(Jpro, hpro, sres, Mp, dred, protect_red, 0, rstprotection, 100.f, Mpro); + Jpro = SQR((10.f * Qpro) / wh); + Qpro = (Qpro == 0.f ? epsil : Qpro); // avoid division by zero + spro = 100.0f * sqrtf(Mpro / Qpro); + + if (Jpro > 99.9f) { + Jpro = 99.9f; + } + + Jpro = CAMBrightCurveJ[(float)(Jpro * 327.68f)]; //lightness CIECAM02 + contrast + float Sp = spro / 100.0f; + Ciecam02::curvecolorfloat(schr, Sp, sres, 1.5f); + dred = 100.f; // in C mode + protect_red = 80.0f; // in C mode + dred = 100.0f * sqrtf((dred * coe) / Q); + protect_red = 100.0f * sqrtf((protect_red * coe) / Q); + Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red, 0, rstprotection, 100.f, spro); + Qpro = QproFactor * sqrtf(Jpro); + float Cp = (spro * spro * Qpro) / (1000000.f); + Cpro = Cp * 100.f; + Ciecam02::curvecolorfloat(cchr, Cp, sres, 1.8f); + Color::skinredfloat(Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); + + hpro = hpro + hue; + + if (hpro < 0.0f) { + hpro += 360.0f; //hue + } + + if ((cielocalcurve && localcieutili) && mecamcurve == 0) { + float Jj = (float) Jpro * 327.68f; + float Jold = Jj; + Jj = 0.5f * cielocalcurve[Jj * 2.f]; + Jj = 0.3f * (Jj - Jold) + Jold; //divide sensibility + Jpro = (float)(Jj / 327.68f); + + if (Jpro < 1.f) { + Jpro = 1.f; + } + } + if (cielocalcurve2 && localcieutili2) { + if(mecamcurve2 == 0) { + float parsat = 0.8f; //0.68; + float coef = 327.68f / parsat; + float Cc = (float) Cpro * coef; + float Ccold = Cc; + Cc = 0.5f * cielocalcurve2[Cc * 2.f]; + float dred = 55.f; + float protect_red = 30.0f; + int sk1 = 1; + float ko = 1.f / coef; + Color::skinredfloat(Jpro, hpro, Cc, Ccold, dred, protect_red, sk1, rstprotection, ko, Cpro); + } else if (mecamcurve2 == 1) { + float parsat = 0.8f; //0.6 + float coef = 327.68f / parsat; + float Ss = (float) spro * coef; + float Sold = Ss; + Ss = 0.5f * cielocalcurve2[Ss * 2.f]; + Ss = 0.6f * (Ss - Sold) + Sold; //divide sensibility saturation + float dred = 100.f; // in C mode + float protect_red = 80.0f; // in C mode + dred = 100.0f * sqrtf((dred * coe) / Qpro); + protect_red = 100.0f * sqrtf((protect_red * coe) / Qpro); + float ko = 1.f / coef; + Color::skinredfloat(Jpro, hpro, Ss, Sold, dred, protect_red, 0, rstprotection, ko, spro); + Qpro = (4.0f / c) * sqrtf(Jpro / 100.0f) * (aw + 4.0f) ; + Cpro = (spro * spro * Qpro) / (10000.0f); + } else if (mecamcurve2 == 2) { + float parsat = 0.8f; //0.68; + float coef = 327.68f / parsat; + float Mm = (float) Mpro * coef; + float Mold = Mm; + Mm = 0.5f * cielocalcurve2[Mm * 2.f]; + float dred = 100.f; //in C mode + float protect_red = 80.0f; // in C mode + dred *= coe; //in M mode + protect_red *= coe; + float ko = 1.f / coef; + Color::skinredfloat(Jpro, hpro, Mm, Mold, dred, protect_red, 0, rstprotection, ko, Mpro); + Cpro = Mpro / coe; + } + } + + } + + //retrieve values C,J...s + C = Cpro; + J = Jpro; + Q = Qpro; + M = Mpro; + h = hpro; + s = spro; + +#ifdef __SSE2__ + // write to line buffers + Jbuffer[j] = J; + Cbuffer[j] = C; + hbuffer[j] = h; +#else + float xx, yy, zz; + //process normal==> viewing + + Ciecam02::jch2xyz_ciecam02float(xx, yy, zz, + J, C, h, + xw2, yw2, zw2, + c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj, c16, plum); + x = CLIP(xx * 655.35f); + y = CLIP(yy * 655.35f); + z = CLIP(zz * 655.35f); + 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; +#endif + } + +#ifdef __SSE2__ + // process line buffers + float *xbuffer = Qbuffer; + float *ybuffer = Mbuffer; + float *zbuffer = sbuffer; + + for (k = 0; k < bufferLength; k += 4) { + vfloat x, y, z; + Ciecam02::jch2xyz_ciecam02float(x, y, z, + LVF(Jbuffer[k]), LVF(Cbuffer[k]), LVF(hbuffer[k]), + F2V(xw2), F2V(yw2), F2V(zw2), + F2V(nc2), F2V(pow1n), F2V(nbbj), F2V(ncbj), F2V(flj), F2V(dj), F2V(awj), F2V(reccmcz), c16, F2V(plum)); + STVF(xbuffer[k], x * c655d35); + STVF(ybuffer[k], y * c655d35); + STVF(zbuffer[k], z * c655d35); + } + + // XYZ2Lab uses a lookup table. The function behind that lut is a cube root. + // SSE can't beat the speed of that lut, so it doesn't make sense to use SSE + for (int j = 0; j < width; j++) { + float Ll, aa, bb; + //convert xyz=>lab + xbuffer[j] = CLIP(xbuffer[j]); + ybuffer[j] = CLIP(ybuffer[j]); + zbuffer[j] = CLIP(zbuffer[j]); + + Color::XYZ2Lab(xbuffer[j], ybuffer[j], zbuffer[j], Ll, aa, bb); + + lab->L[i][j] = Ll; + lab->a[i][j] = aa; + lab->b[i][j] = bb; + } + +#endif + } + + } + } + +if(mocam == 3) {//Zcam not use but keep in case off +/* + double miniiz = 1000.; + double maxiiz = -1000.; + double sumiz = 0.; + int nciz = 0; + double epsilzcam = 0.0001; + double atten = 2700.; + double epsilzcam2 = 1.; + if(mocam == 3) {//Zcam + double pl = params->locallab.spots.at(sp).pqremap; +//calculate min, max, mean for Jz +#ifdef _OPENMP + #pragma omp parallel for reduction(min:miniiz) reduction(max:maxiiz) reduction(+:sumiz) if(multiThread) +#endif + for (int i = 0; i < height; i+=1) { + for (int k = 0; k < width; k+=1) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double Jz, az, bz; + double xx, yy, zz; + //D50 ==> D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + xx = LIM01(xx); + yy = LIM01(yy); + zz = LIM01(zz); + + double L_p, M_p, S_p; + bool zcam = true; + Ciecam02::xyz2jzczhz (Jz, az, bz, xx, yy, zz, pl, L_p, M_p, S_p, zcam); + if(Jz > maxiiz) { + maxiiz = Jz; + } + if(Jz < miniiz) { + miniiz = Jz; + } + + sumiz += Jz; + + } + } + nciz = height * width; + sumiz = sumiz / nciz; + sumiz += epsilzcam; + maxiiz += epsilzcam; + if (settings->verbose) { + printf("Zcam miniiz=%f maxiiz=%f meaniz=%f\n", miniiz, maxiiz, sumiz); + } + } + double avgmz = sumiz; + //calculate various parameter for Zcam - those with ** come from documentation Zcam + // ZCAM, a colour appearance model based on a high dynamic range uniform colour space + //Muhammad Safdar, Jon Yngve Hardeberg, and Ming Ronnier Luo + // https://www.osapublishing.org/oe/fulltext.cfm?uri=oe-29-4-6036&id=447640#e12 + double L_p, M_p, S_p; + double jzw, azw, bzw; + bool zcam = true; + double plz = params->locallab.spots.at(sp).pqremap;// to test or change to 10000 +// double po = 0.1 + params->locallab.spots.at(sp).contthreszcam; + float fb_source = sqrt(yb / 100.f); + float fb_dest = sqrt(yb2 / 100.f); + double flz = 0.171 * pow(la, 0.3333333)*(1. - exp(-(48. * (double) la / 9.))); + double fljz = 0.171 * pow(la2, 0.3333333)*(1. - exp(-(48. * (double) la2 / 9.))); + double cpow = 2.2;//empirical + double cpp = pow( (double) c, 0.5);//empirical + double cpp2 = pow( (double) c2, 0.5);//empirical + double pfl = pow(flz, 0.25); + double cmul_source = 1.26;//empirical + double cmul_source_ch = 1.1;//empirical + double achro_source = pow((double) c, cpow)*(pow((double) flz, - 0.004)* (double) sqrt(fb_source));//I think there is an error in formula documentation step 5 - all parameters are inversed or wrong + double achro_dest = pow((double) c2, cpow)*(pow((double) fljz, - 0.004) * (double) sqrt(fb_dest)); + double kk_source = (1.6 * (double) cpp) / pow((double) fb_source, 0.12); + double ikk_dest = pow((double) fb_dest, 0.12) /(1.6 * (double) cpp2); + Ciecam02::xyz2jzczhz (jzw, azw, bzw, Xw, Yw, Zw, plz, L_p, M_p, S_p, zcam); + double eff = 1.; + double kap = 2.7; + if(maxiiz > (kap * sumiz)) { + kap = 1.7; + } + double qzw = cmul_source * atten * pow(jzw, (double) kk_source) / achro_source;//I think there is an error in formula documentation step 5 - all parameters are inversed + double maxforq = kap * sumiz * eff + epsilzcam2; + if(maxforq > maxiiz) { + maxforq = maxiiz; + } else { + maxforq = 0.9 * maxforq + 0.1 * maxiiz; + } + double qzmax = cmul_source * atten * pow(maxforq, (double) kk_source) / achro_source; + double izw = jzw; + double coefm = pow(flz, 0.2) / (pow((double) fb_source, 0.1) * pow(izw, 0.78)); + if (settings->verbose) { + printf("qzw=%f PL=%f qzmax=%f\n", qzw, plz, qzmax);//huge change with PQ peak luminance + } + array2D Iiz(width, height); + array2D Aaz(width, height); + array2D Bbz(width, height); + +//curve to replace LUT , LUT leads to crash... + double contqz = 0.5 * params->locallab.spots.at(sp).contqzcam; + DiagonalCurve qz_contrast({ + DCT_NURBS, + 0, 0, + avgmz - avgmz * (0.6 - contqz / 250.0), avgmz - avgmz * (0.6 + contqz / 250.0), + avgmz + (1. - avgmz) * (0.6 - contqz / 250.0), avgmz + (1. - avgmz) * (0.6 + contqz / 250.0), + 1, 1 + }); + double contlz = 0.6 * params->locallab.spots.at(sp).contlzcam; + DiagonalCurve ljz_contrast({ + DCT_NURBS, + 0, 0, + avgmz - avgmz * (0.6 - contlz / 250.0), avgmz - avgmz * (0.6 + contlz / 250.0), + avgmz + (1. - avgmz) * (0.6 - contlz / 250.0), avgmz + (1. - avgmz) * (0.6 + contlz / 250.0), + 1, 1 + }); + + //all calculations in double for best results...but slow + double lqz = 0.4 * params->locallab.spots.at(sp).lightqzcam; + if(params->locallab.spots.at(sp).lightqzcam < 0) { + lqz = 0.2 * params->locallab.spots.at(sp).lightqzcam; //0.4 less effect, no need 1. + } + DiagonalCurve qz_light({ + DCT_NURBS, + 0, 0, + 0.1, 0.1 + lqz / 150., + 0.7, min (1.0, 0.7 + lqz / 300.0), + 1, 1 + }); + DiagonalCurve qz_lightn({ + DCT_NURBS, + 0, 0, + max(0.0, 0.1 - lqz / 150.), 0.1 , + 0.7 - lqz / 300.0, 0.7, + 1, 1 + }); + double ljz = 0.4 * params->locallab.spots.at(sp).lightlzcam; + if(params->locallab.spots.at(sp).lightlzcam < 0) { + ljz = 0.2 * params->locallab.spots.at(sp).lightlzcam; + } + DiagonalCurve ljz_light({ + DCT_NURBS, + 0, 0, + 0.1, 0.1 + ljz / 150., + 0.7, min (1.0, 0.7 + ljz / 300.0), + 1, 1 + }); + DiagonalCurve ljz_lightn({ + DCT_NURBS, + 0, 0, + max(0.0, 0.1 - ljz / 150.), 0.1 , + 0.7 - ljz / 300.0, 0.7, + 1, 1 + }); + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + float L = lab->L[i][k]; + float a = lab->a[i][k]; + float b = lab->b[i][k]; + float x, y, z; + //convert Lab => XYZ + Color::Lab2XYZ(L, a, b, x, y, z); + x = x / 65535.f; + y = y / 65535.f; + z = z / 65535.f; + double iz, az, bz; + double xx, yy, zz; + //change WP to D65 + xx = (d50_d65[0][0] * (double) x + d50_d65[0][1] * (double) y + d50_d65[0][2] * (double) z); + yy = (d50_d65[1][0] * (double) x + d50_d65[1][1] * (double) y + d50_d65[1][2] * (double) z); + zz = (d50_d65[2][0] * (double) x + d50_d65[2][1] * (double) y + d50_d65[2][2] * (double) z); + double L_p, M_p, S_p; + bool zcam = true; + Ciecam02::xyz2jzczhz (iz, az, bz, xx, yy, zz, plz, L_p, M_p, S_p, zcam); + Iiz[i][k] = LIM01(iz); + Aaz[i][k] = clipazbz(az); + Bbz[i][k] = clipazbz(bz); + } + } +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < height; i++) { + for (int k = 0; k < width; k++) { + + double az = Aaz[i][k]; + double bz = Bbz[i][k]; + double iz = Iiz[i][k]; + if(iz > kap * sumiz) { + iz = kap * sumiz * eff; + } + float coefqz = (float) qzmax; + float coefjz = 100.f ; + double qz = cmul_source * atten * pow(iz, (double) kk_source) / achro_source;//partial + az *= cmul_source_ch; + bz *= cmul_source_ch; + + qz= (double) coefqz * LIM01(qz_contrast.getVal((float)qz / coefqz)); + + if(lqz > 0) { + qz = (double) coefqz * LIM01(qz_light.getVal((float)qz / coefqz)); + } + if(lqz < 0) { + qz = (double) coefqz * LIM01(qz_lightn.getVal((float)qz / coefqz)); + } + // double jz = 100. * (qz / qzw); + double jz = SQR((10. * qz) / qzw);//formula CAM16 + jz= (double) coefjz * LIM01(ljz_contrast.getVal((float)jz / coefjz)); + if(ljz > 0) { + jz = (double) coefjz * LIM01(ljz_light.getVal((float)jz / coefjz)); + } + if(ljz < 0) { + jz = (double) coefjz * LIM01(ljz_lightn.getVal((float)jz / coefjz)); + } + if(jz > 100.) jz = 99.; + + + //qzpro = 0.01 * jzpro * qzw; + double qzpro = 0.1 * sqrt(jz) * qzw; + iz = LIM01(pow(qzpro / (atten / achro_dest), ikk_dest)); + double h = atan2(bz, az); + if ( h < 0.0 ) { + h += (double) (2.f * rtengine::RT_PI_F); + } + double hp = h * (360 / (double) (2.f * rtengine::RT_PI_F)); + double ez = 1.015 + cos(89.038 + hp); + if(mchrz != 0.f || schrz != 0.f || cchrz != 0.f){ + //colorfullness + double Mpz = 100. * pow(az * az + bz * bz, 0.37)* pow(ez, 0.068) * coefm; + Mpz *= (double) (1.f + 0.01f * mchrz); + float ccz = sqrt(pow((float) (Mpz / (100. * pow(ez, 0.068) * coefm)), (1.f / 0.37f))); + float2 sincosval = xsincosf(h); + az = (double)(ccz * sincosval.y); + bz = (double)(ccz * sincosval.x); + if(schrz != 0.f){ + //saturation + double Spz = 100. * pow(flz, 0.6) * (Mpz / qz); + Spz *= (double) (1.f + 0.01f * schrz); + Mpz = (Spz * qz) / (100.* pow(flz, 0.6)); + ccz = sqrt(pow((float) (Mpz / (100. * pow(ez, 0.068) * coefm)), (1.f / 0.37f))); + az = (double)(ccz * sincosval.y); + bz = (double)(ccz * sincosval.x); + } + if(cchrz != 0.f){ + // double Cpz = 100. * (Mpz / qzw); + double Cpz = 100. * (Mpz / pfl);//Cam16 formula + Cpz *= (double) (1.f + 0.01f * cchrz); + Mpz = (Cpz * pfl) / 100.; + // double Vpz = sqrt(SQR(jz - 58.) + 3.4 * SQR(Cpz));//vividness not working + // Vpz *= (double) (1.f + 0.01f * cchrz); + //Mpz = (Cpz * qzw) / 100.; + // Mpz = 0.01 * qzw * sqrt((SQR(Vpz) - SQR(jz - 58.)) / 3.4); + ccz = sqrt(pow((float) (Mpz / (100. * pow(ez, 0.068) * coefm)), (1.f / 0.37f))); + az = (double)(ccz * sincosval.y); + bz = (double)(ccz * sincosval.x); + } + + } + double L_, M_, S_; + double xx, yy, zz; + bool zcam = true; + iz=LIM01(iz); + az=clipazbz(az); + bz=clipazbz(bz); + + Ciecam02::jzczhzxyz (xx, yy, zz, iz, az, bz, plz, L_, M_, S_, zcam); + //re enable D50 + double x, y, z; + x = 65535. * (d65_d50[0][0] * xx + d65_d50[0][1] * yy + d65_d50[0][2] * zz); + y = 65535. * (d65_d50[1][0] * xx + d65_d50[1][1] * yy + d65_d50[1][2] * zz); + z = 65535. * (d65_d50[2][0] * xx + d65_d50[2][1] * yy + d65_d50[2][2] * zz); + + float Ll, aa, bb; + Color::XYZ2Lab(x, y, z, Ll, aa, bb); + lab->L[i][k] = Ll; + lab->a[i][k] = aa; + lab->b[i][k] = bb; + } + } +*/ +} + + +} + +void ImProcFunctions::softproc(const LabImage* bufcolorig, const LabImage* bufcolfin, float rad, int bfh, int bfw, float epsilmax, float epsilmin, float thres, int sk, bool multiThread, int flag) +{ + if (rad != 0.f) { + array2D ble(bfw, bfh); + array2D guid(bfw, bfh); + if (flag == 0) { + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + guid[ir][jr] = Color::L2Y(bufcolorig->L[ir][jr]) / 32768.f; + ble[ir][jr] = Color::L2Y(bufcolfin->L[ir][jr]) / 32768.f; + } + } + + const float aepsil = (epsilmax - epsilmin) / 100.f; + const float bepsil = epsilmin; //epsilmax - 100.f * aepsil; + // const float epsil = aepsil * 0.1f * rad + bepsil; + const float epsil = aepsil * rad + bepsil; + const float blur = 10.f / sk * (thres + 0.f * rad); + + rtengine::guidedFilter(guid, ble, ble, blur, epsil, multiThread, 4); + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufcolfin->L[ir][jr] = Color::computeXYZ2LabY(32768.f * ble[ir][jr]); + } + } + } else if (flag == 1) { + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + ble[ir][jr] = bufcolfin->L[ir][jr] / 32768.f; + guid[ir][jr] = bufcolorig->L[ir][jr] / 32768.f; + } + + const float aepsil = (epsilmax - epsilmin) / 1000.f; + const float bepsil = epsilmin; //epsilmax - 100.f * aepsil; + const float epsil = rad < 0.f ? 0.0001f : aepsil * rad + bepsil; + const float blur = rad < 0.f ? -1.f / rad : 1.f + rad; + const int r2 = rtengine::max(int(25 / sk * blur + 0.5f), 1); + + rtengine::guidedFilter(guid, ble, ble, r2, epsil, multiThread); + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufcolfin->L[ir][jr] = 32768.f * ble[ir][jr]; + } + } + } else if (flag == 2) { + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + ble[ir][jr] = bufcolfin->L[ir][jr] / 32768.f; + guid[ir][jr] = bufcolorig->L[ir][jr] / 32768.f; + } + + const float aepsil = (epsilmax - epsilmin) / 1000.f; + const float bepsil = epsilmin; //epsilmax - 100.f * aepsil; + const float epsil = rad < 0.f ? 0.0001f : aepsil * 10.f * rad + bepsil; + // const float epsil = bepsil; + const float blur = rad < 0.f ? -1.f / rad : 0.00001f + rad; + const int r2 = rtengine::max(int(20.f / sk * blur + 0.000001f), 1); + + rtengine::guidedFilter(guid, ble, ble, r2, epsil, multiThread); + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufcolfin->L[ir][jr] = 32768.f * ble[ir][jr]; + } + } + } + } +} + + +void ImProcFunctions::softprocess(const LabImage* bufcolorig, array2D &buflight, float rad, int bfh, int bfw, double epsilmax, double epsilmin, float thres, int sk, bool multiThread) +{ + float minlig = buflight[0][0]; + +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minlig) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + minlig = rtengine::min(buflight[ir][jr], minlig); + } + } + + array2D guidsoft(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + buflight[ir][jr] = LIM01((buflight[ir][jr] - minlig) / (100.f - minlig)); + guidsoft[ir][jr] = bufcolorig->L[ir][jr] / 32768.f; + } + } + + double aepsil = (epsilmax - epsilmin) / 90.0; + double bepsil = epsilmax - 100.0 * aepsil; + double epsil = aepsil * static_cast(rad) + bepsil; + float blur = 1.f / sk * (thres + 0.8f * rad); + guidedFilter(guidsoft, buflight, buflight, blur, epsil, multiThread, 4); + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + buflight[ir][jr] = (100.f - minlig) * buflight[ir][jr] + minlig; + } + } +} + +void ImProcFunctions::exlabLocal(local_params& lp, float strlap, int bfh, int bfw, int bfhr, int bfwr, LabImage* bufexporig, LabImage* lab, const LUTf& hltonecurve, const LUTf& shtonecurve, const LUTf& tonecurve, const float hueref, const float lumaref, const float chromaref) +{ + //BENCHFUN + //exposure local + + constexpr float maxran = 65536.f; + if(lp.laplacexp == 0.f) { + lp.linear = 0.f; + } + + const float linear = lp.linear; + int bw = bfw; + int bh = bfh; + if (linear > 0.f && lp.expcomp == 0.f) { + lp.expcomp = 0.001f; + } + const bool exec = (lp.expmet == 1 && linear > 0.f && lp.laplacexp > 0.1f); + + if(!exec) {//for standard exposure + + const float cexp_scale = std::pow(2.f, lp.expcomp); + const float ccomp = (rtengine::max(0.f, lp.expcomp) + 1.f) * lp.hlcomp / 100.f; + const float cshoulder = ((maxran / rtengine::max(1.0f, cexp_scale)) * (lp.hlcompthr / 200.f)) + 0.1f; + const float chlrange = maxran - cshoulder; + const float diffde = 100.f - lp.sensex;//the more scope, the less take into account dE for Laplace + if(!lp.invex) {// Laplacian not in inverse + bw = bfwr; + bh = bfhr; + + //Laplacian PDE before exposure to smooth L, algorithm exposure leads to increase L differences + const std::unique_ptr datain(new float[bfwr * bfhr]); + const std::unique_ptr dataout(new float[bfwr * bfhr]); + const std::unique_ptr dE(new float[bfwr * bfhr]); + + deltaEforLaplace(dE.get(), diffde, bfwr, bfhr, bufexporig, hueref, chromaref, lumaref); + + float alap = strlap * 600.f; + float blap = strlap * 100.f; + float aa = (alap - blap) / 50.f; + float bb = blap - 30.f * aa; + + float lap; + if (diffde > 80.f) { + lap = alap; + } else if (diffde < 30.f) { + lap = blap; + } else { + lap = aa * diffde + bb; + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + datain[y * bfwr + x] = bufexporig->L[y][x]; + } + } + + MyMutex::MyLock lock(*fftwMutex); + ImProcFunctions::retinex_pde(datain.get(), dataout.get(), bfwr, bfhr, lap, 1.f, dE.get(), 0, 1, 1);//350 arbitrary value about 45% strength Laplacian +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + bufexporig->L[y][x] = dataout[y * bfwr + x]; + } + } + + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bh; ir++) {//for standard with Laplacian in normal and without in inverse + for (int jr = 0; jr < bw; jr++) { + float L = bufexporig->L[ir][jr]; + //highlight + const float hlfactor = (2 * L < MAXVALF ? hltonecurve[2 * L] : CurveFactory::hlcurve(cexp_scale, ccomp, chlrange, 2 * L)); + L *= hlfactor;//approximation but pretty good with Laplacian and L < mean, hl aren't call + //shadow tone curve + L *= shtonecurve[2 * L]; + //tonecurve + lab->L[ir][jr] = 0.5f * tonecurve[2 * L]; + } + } + } else if(!lp.invex) {//for PDE algorithms + constexpr float kl = 1.f; + const float hlcompthr = lp.hlcompthr / 200.f; + const float hlcomp = lp.hlcomp / 100.f; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + float L = bufexporig->L[ir][jr]; + const float Llin = LIM01(L / 32768.f); + const float addcomp = linear * (-kl * Llin + kl);//maximum about 1 . IL + const float exp_scale = pow_F(2.f, lp.expcomp + addcomp); + const float shoulder = (maxran / rtengine::max(1.0f, exp_scale)) * hlcompthr + 0.1f; + const float comp = (rtengine::max(0.f, (lp.expcomp + addcomp)) + 1.f) * hlcomp; + const float hlrange = maxran - shoulder; + + //highlight + const float hlfactor = (2 * L < MAXVALF ? hltonecurve[2 * L] : CurveFactory::hlcurve(exp_scale, comp, hlrange, 2 * L)); + L *= hlfactor * pow_F(2.f, addcomp);//approximation but pretty good with Laplacian and L < mean, hl aren't call + //shadow tone curve + L *= shtonecurve[2 * L]; + //tonecurve + lab->L[ir][jr] = 0.5f * tonecurve[2 * L]; + } + } + } +} + +void ImProcFunctions::addGaNoise(LabImage *lab, LabImage *dst, const float mean, const float variance, const int sk) +{ +// BENCHFUN +//Box-Muller method. +// add luma noise to image + + srand(1); + + const float variaFactor = SQR(variance) / sk; + constexpr float randFactor1 = 1.f / RAND_MAX; + constexpr float randFactor2 = (2.f * rtengine::RT_PI_F) / RAND_MAX; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + float z0, z1; + bool generate = false; +#ifdef _OPENMP + #pragma omp for schedule(static) // static scheduling is important to avoid artefacts +#endif + for (int y = 0; y < lab->H; y++) { + for (int x = 0; x < lab->W; x++) { + generate = !generate; + float kvar = 1.f; + + if (lab->L[y][x] < 12000.f) { + constexpr float ah = -0.5f / 12000.f; + constexpr float bh = 1.5f; + kvar = ah * lab->L[y][x] + bh; //increase effect for low lights < 12000.f + } else if (lab->L[y][x] > 20000.f) { + constexpr float ah = -0.5f / 12768.f; + constexpr float bh = 1.f - 20000.f * ah; + kvar = ah * lab->L[y][x] + bh; //decrease effect for high lights > 20000.f + kvar = kvar < 0.5f ? 0.5f : kvar; + } + + float varia = SQR(kvar) * variaFactor; + + if (!generate) { + dst->L[y][x] = LIM(lab->L[y][x] + mean + varia * z1, 0.f, 32768.f); + continue; + } + + int u1 = 0; + int u2; + + while (u1 == 0) { + u1 = rand(); + u2 = rand(); + } + + float u1f = u1 * randFactor1; + float u2f = u2 * randFactor2; + + float2 sincosval = xsincosf(2.f * rtengine::RT_PI_F * u2f); + float factor = std::sqrt(-2.f * xlogf(u1f)); + z0 = factor * sincosval.y; + z1 = factor * sincosval.x; + + dst->L[y][x] = LIM(lab->L[y][x] + mean + varia * z0, 0.f, 32768.f); + + } + } + } +} + +void ImProcFunctions::DeNoise_Local(int call, const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk) +{ + //warning, but I hope used it next + // local denoise and impulse + //simple algo , perhaps we can improve as the others, but noise is here and not good for hue detection + // BENCHFUN + lumaref *= 327.68f; + const float ach = lp.trans / 100.f; + + const float factnoise1 = 1.f + (lp.noisecf) / 500.f; + const float factnoise2 = 1.f + (lp.noisecc) / 500.f; + const float factnoise = factnoise1 * factnoise2; + + const int GW = transformed->W; + const int GH = transformed->H; + + const float colorde = lp.colorde == 0 ? -1.f : lp.colorde; // -1.f to avoid black + const float amplabL = 2.f * colorde; + constexpr float darklim = 5000.f; + + const float refa = chromaref * std::cos(hueref) * 327.68f; + const float refb = chromaref * std::sin(hueref) * 327.68f; + const bool usemaskbl = lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 4; + const bool blshow = lp.showmaskblmet == 1 || lp.showmaskblmet == 2; + const bool previewbl = lp.showmaskblmet == 4; + + const std::unique_ptr origblur(new LabImage(GW, GH)); + const float radius = 3.f / sk; + + if (usemaskbl) { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(originalmask->L, origblur->L, GW, GH, radius); + gaussianBlur(originalmask->a, origblur->a, GW, GH, radius); + gaussianBlur(originalmask->b, origblur->b, GW, GH, radius); + } + } else { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + } + } + + const int begx = lp.xc - lp.lxL; + const int begy = lp.yc - lp.lyT; + constexpr float r327d68 = 1.f / 327.68f; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const LabImage* maskptr = origblur.get(); + const float mindE = 2.f + MINSCOPE * lp.sensden * lp.thr; + const float maxdE = 5.f + MAXSCOPE * lp.sensden * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < transformed->H; y++) { + const int loy = cy + y; + const bool isZone0 = loy > lp.yc + lp.ly || loy < lp.yc - lp.lyT; // whole line is zone 0 => we can skip a lot of processing + + if (isZone0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + for (int x = 0, lox = cx + x; x < transformed->W; x++, lox++) { + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + float reducdEL = 1.f; + float reducdEa = 1.f; + float reducdEb = 1.f; + + if (levred == 7) { + const float dEL = std::sqrt(0.9f * SQR(refa - maskptr->a[y][x]) + 0.9f * SQR(refb - maskptr->b[y][x]) + 1.2f * SQR(lumaref - maskptr->L[y][x])) * r327d68; + const float dEa = std::sqrt(1.2f * SQR(refa - maskptr->a[y][x]) + 1.f * SQR(refb - maskptr->b[y][x]) + 0.8f * SQR(lumaref - maskptr->L[y][x])) * r327d68; + const float dEb = std::sqrt(1.f * SQR(refa - maskptr->a[y][x]) + 1.2f * SQR(refb - maskptr->b[y][x]) + 0.8f * SQR(lumaref - maskptr->L[y][x])) * r327d68; + reducdEL = SQR(calcreducdE(dEL, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensden)); + reducdEa = SQR(calcreducdE(dEa, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensden)); + reducdEb = SQR(calcreducdE(dEb, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensden)); + } + float difL, difa, difb; + + if (call == 2 /*|| call == 1 || call == 3 */) { //simpleprocess + difL = tmp1.L[loy - begy][lox - begx] - original->L[y][x]; + difa = tmp1.a[loy - begy][lox - begx] - original->a[y][x]; + difb = tmp1.b[loy - begy][lox - begx] - original->b[y][x]; + } else { //dcrop + const float repart = 1.0f - 0.01f * lp.reparden; + tmp1.L[y][x] = intp(repart, original->L[y][x], tmp1.L[y][x]); + tmp1.a[y][x] = intp(repart, original->a[y][x], tmp1.a[y][x]); + tmp1.b[y][x] = intp(repart, original->b[y][x], tmp1.b[y][x]); + + difL = tmp1.L[y][x] - original->L[y][x]; + difa = tmp1.a[y][x] - original->a[y][x]; + difb = tmp1.b[y][x] - original->b[y][x]; + } + + difL *= localFactor * reducdEL; + difa *= localFactor * reducdEa; + difb *= localFactor * reducdEb; + transformed->L[y][x] = CLIP(original->L[y][x] + difL); + transformed->a[y][x] = clipC((original->a[y][x] + difa) * factnoise); + transformed->b[y][x] = clipC((original->b[y][x] + difb) * factnoise) ; + + if (blshow) { + transformed->L[y][x] = CLIP(12000.f + amplabL * difL);// * 10.f empirical to can visualize modifications + transformed->a[y][x] = clipC(amplabL * difa);// * 10.f empirical to can visualize modifications + transformed->b[y][x] = clipC(amplabL * difb);// * 10.f empirical to can visualize modifications + } else if (previewbl || lp.prevdE) { + const float difbdisp = (reducdEL + reducdEa + reducdEb) * 10000.f * colorde; + + if (transformed->L[y][x] < darklim) { //enhance dark luminance as user can see! + transformed->L[y][x] = darklim - transformed->L[y][x]; + } + + if (colorde <= 0) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = difbdisp; + } else { + transformed->a[y][x] = -difbdisp; + transformed->b[y][x] = 0.f; + } + } + } + } + } +} + +void ImProcFunctions::DeNoise_Local2(const struct local_params& lp, LabImage* originalmask, int levred, float hueref, float lumaref, float chromaref, LabImage* original, LabImage* transformed, const LabImage &tmp1, int cx, int cy, int sk) +{ + //warning, but I hope used it next + // local denoise and impulse + //simple algo , perhaps we can improve as the others, but noise is here and not good for hue detection + // BENCHFUN + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + + + lumaref *= 327.68f; + const float ach = lp.trans / 100.f; + + const float factnoise1 = 1.f + (lp.noisecf) / 500.f; + const float factnoise2 = 1.f + (lp.noisecc) / 500.f; + const float factnoise = factnoise1 * factnoise2; + + const int GW = transformed->W; + const int GH = transformed->H; + + const float colorde = lp.colorde == 0 ? -1.f : lp.colorde; // -1.f to avoid black + const float amplabL = 2.f * colorde; + constexpr float darklim = 5000.f; + + const float refa = chromaref * std::cos(hueref) * 327.68f; + const float refb = chromaref * std::sin(hueref) * 327.68f; + const bool usemaskbl = lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 4; + const bool blshow = lp.showmaskblmet == 1 || lp.showmaskblmet == 2; + const bool previewbl = lp.showmaskblmet == 4; + + const std::unique_ptr origblur(new LabImage(GW, GH)); + const float radius = 3.f / sk; + + if (usemaskbl) { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(originalmask->L, origblur->L, GW, GH, radius); + gaussianBlur(originalmask->a, origblur->a, GW, GH, radius); + gaussianBlur(originalmask->b, origblur->b, GW, GH, radius); + } + } else { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + } + } + + // const int begx = lp.xc - lp.lxL; + // const int begy = lp.yc - lp.lyT; + constexpr float r327d68 = 1.f / 327.68f; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const LabImage* maskptr = origblur.get(); + const float mindE = 2.f + MINSCOPE * lp.sensden * lp.thr; + const float maxdE = 5.f + MAXSCOPE * lp.sensden * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int y = ystart; y < yend; y++) { + const int loy = cy + y; +// const bool isZone0 = loy > lp.yc + lp.ly || loy < lp.yc - lp.lyT; // whole line is zone 0 => we can skip a lot of processing + +// if (isZone0) { // outside selection and outside transition zone => no effect, keep original values +// continue; + // } + + for (int x = xstart, lox = cx + x; x < xend; x++, lox++) { + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else { /*if (lp.shapmet == 1)*/ + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + float reducdEL = 1.f; + float reducdEa = 1.f; + float reducdEb = 1.f; + + if (levred == 7) { + const float dEL = std::sqrt(0.9f * SQR(refa - maskptr->a[y][x]) + 0.9f * SQR(refb - maskptr->b[y][x]) + 1.2f * SQR(lumaref - maskptr->L[y][x])) * r327d68; + const float dEa = std::sqrt(1.2f * SQR(refa - maskptr->a[y][x]) + 1.f * SQR(refb - maskptr->b[y][x]) + 0.8f * SQR(lumaref - maskptr->L[y][x])) * r327d68; + const float dEb = std::sqrt(1.f * SQR(refa - maskptr->a[y][x]) + 1.2f * SQR(refb - maskptr->b[y][x]) + 0.8f * SQR(lumaref - maskptr->L[y][x])) * r327d68; + reducdEL = SQR(calcreducdE(dEL, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensden)); + reducdEa = SQR(calcreducdE(dEa, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensden)); + reducdEb = SQR(calcreducdE(dEb, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensden)); + } + + float difL, difa, difb; + + const float repart = 1.0f - 0.01f * lp.reparden; + tmp1.L[y-ystart][x-xstart] = intp(repart, original->L[y][x], tmp1.L[y-ystart][x-xstart]); + tmp1.a[y-ystart][x-xstart] = intp(repart, original->a[y][x], tmp1.a[y-ystart][x-xstart]); + tmp1.b[y-ystart][x-xstart] = intp(repart, original->b[y][x], tmp1.b[y-ystart][x-xstart]); + + difL = tmp1.L[y-ystart][x-xstart] - original->L[y][x]; + difa = tmp1.a[y-ystart][x-xstart] - original->a[y][x]; + difb = tmp1.b[y-ystart][x-xstart] - original->b[y][x]; + + difL *= localFactor * reducdEL; + difa *= localFactor * reducdEa; + difb *= localFactor * reducdEb; + transformed->L[y][x] = CLIP(original->L[y][x] + difL); + transformed->a[y][x] = clipC((original->a[y][x] + difa) * factnoise); + transformed->b[y][x] = clipC((original->b[y][x] + difb) * factnoise) ; + + if (blshow) { + transformed->L[y][x] = CLIP(12000.f + amplabL * difL);// * 10.f empirical to can visualize modifications + transformed->a[y][x] = clipC(amplabL * difa);// * 10.f empirical to can visualize modifications + transformed->b[y][x] = clipC(amplabL * difb);// * 10.f empirical to can visualize modifications + } else if (previewbl || lp.prevdE) { + const float difbdisp = (reducdEL + reducdEa + reducdEb) * 10000.f * colorde; + + if (transformed->L[y][x] < darklim) { //enhance dark luminance as user can see! + transformed->L[y][x] = darklim - transformed->L[y][x]; + } + + if (colorde <= 0) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = difbdisp; + } else { + transformed->a[y][x] = -difbdisp; + transformed->b[y][x] = 0.f; + } + } + } + } + } +} + + +void ImProcFunctions::InverseReti_Local(const struct local_params & lp, const float hueref, const float chromaref, const float lumaref, LabImage * original, LabImage * transformed, const LabImage * const tmp1, int cx, int cy, int chro, int sk) +{ + // BENCHFUN +//inverse local retinex + float ach = lp.trans / 100.f; + int GW = transformed->W; + int GH = transformed->H; + float refa = chromaref * cos(hueref); + float refb = chromaref * sin(hueref); + + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + + const std::unique_ptr origblur(new LabImage(GW, GH)); + + float radius = 3.f / sk; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + + } +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const float mindE = 2.f + MINSCOPE * lp.sensh * lp.thr; + const float maxdE = 5.f + MAXSCOPE * lp.sensh * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < transformed->H; y++) { + int loy = cy + y; + + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + + int zone; + float localFactor; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + float rL = origblur->L[y][x] / 327.68f; + float dE = std::sqrt(kab * SQR(refa - origblur->a[y][x] / 327.68f) + kab * SQR(refb - origblur->b[y][x] / 327.68f) + kL * SQR(lumaref - rL)); + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensh); + + switch (zone) { + case 0: { // outside selection and outside transition zone => full effect, no transition + if (chro == 0) { + float difL = tmp1->L[y][x] - original->L[y][x]; + transformed->L[y][x] = CLIP(original->L[y][x] + difL * reducdE); + } + + if (chro == 1) { + float difa = tmp1->a[y][x] - original->a[y][x]; + float difb = tmp1->b[y][x] - original->b[y][x]; + + transformed->a[y][x] = clipC(original->a[y][x] + difa * reducdE); + transformed->b[y][x] = clipC(original->b[y][x] + difb * reducdE); + } + break; + } + + case 1: { // inside transition zone + float factorx = 1.f - localFactor; + + if (chro == 0) { + float difL = tmp1->L[y][x] - original->L[y][x]; + difL *= factorx; + transformed->L[y][x] = CLIP(original->L[y][x] + difL * reducdE); + } + + if (chro == 1) { + float difa = tmp1->a[y][x] - original->a[y][x]; + float difb = tmp1->b[y][x] - original->b[y][x]; + + difa *= factorx; + difb *= factorx; + + transformed->a[y][x] = clipC(original->a[y][x] + difa * reducdE); + transformed->b[y][x] = clipC(original->b[y][x] + difb * reducdE); + } + break; + } + + case 2: { // inside selection => no effect, keep original values + if (chro == 0) { + transformed->L[y][x] = original->L[y][x]; + } + + if (chro == 1) { + transformed->a[y][x] = original->a[y][x]; + transformed->b[y][x] = original->b[y][x]; + } + } + } + } + } + } +} + + + +void ImProcFunctions::InverseBlurNoise_Local(LabImage * originalmask, const struct local_params & lp, const float hueref, const float chromaref, const float lumaref, LabImage * original, LabImage * transformed, const LabImage * const tmp1, int cx, int cy, int sk) +{ + // BENCHFUN +//inverse local blur and noise + float ach = lp.trans / 100.f; + int GW = transformed->W; + int GH = transformed->H; + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + + + const bool blshow = (lp.showmaskblmet == 1 || lp.showmaskblmet == 2); + const bool previewbl = (lp.showmaskblmet == 4); + + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + + const std::unique_ptr origblur(new LabImage(GW, GH)); + std::unique_ptr origblurmask; + const bool usemaskbl = (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 4); + const bool usemaskall = usemaskbl; + + float radius = 3.f / sk; + + if (usemaskall) { + origblurmask.reset(new LabImage(GW, GH)); + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(originalmask->L, origblurmask->L, GW, GH, radius); + gaussianBlur(originalmask->a, origblurmask->a, GW, GH, radius); + gaussianBlur(originalmask->b, origblurmask->b, GW, GH, radius); + } + } + + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + + } +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const LabImage *maskptr = usemaskall ? origblurmask.get() : origblur.get(); + const float mindE = 2.f + MINSCOPE * lp.sensbn * lp.thr; + const float maxdE = 5.f + MAXSCOPE * lp.sensbn * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < transformed->H; y++) { + int loy = cy + y; + + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + + int zone; + float localFactor; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + float reducdE; + if (zone != 2) { + float abdelta2 = SQR(refa - maskptr->a[y][x]) + SQR(refb - maskptr->b[y][x]); + float chrodelta2 = SQR(std::sqrt(SQR(maskptr->a[y][x]) + SQR(maskptr->b[y][x])) - (chromaref * 327.68f)); + float huedelta2 = abdelta2 - chrodelta2; + float dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - maskptr->L[y][x])); + reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensbn); + } + + switch (zone) { + + case 0: { // outside selection and outside transition zone => full effect, no transition + const float diflc = (tmp1->L[y][x] - original->L[y][x]) * reducdE; + const float difa = (tmp1->a[y][x] - original->a[y][x]) * reducdE; + const float difb = (tmp1->b[y][x] - original->b[y][x]) * reducdE; + transformed->L[y][x] = CLIP(original->L[y][x] + diflc); + transformed->a[y][x] = clipC(original->a[y][x] + difa) ; + transformed->b[y][x] = clipC(original->b[y][x] + difb); + + if (blshow) { + transformed->L[y][x] = CLIP(12000.f + diflc); + transformed->a[y][x] = clipC(difa); + transformed->b[y][x] = clipC(difb); + } else if (previewbl || lp.prevdE) { + transformed->a[y][x] = 0.f; + transformed->b[y] [x] = (difb); + } + + break; + } + + case 1: { // inside transition zone + const float factorx = 1.f - localFactor; + + const float diflc = (tmp1->L[y][x] - original->L[y][x]) * (reducdE * factorx); + const float difa = (tmp1->a[y][x] - original->a[y][x]) * (reducdE * factorx); + const float difb = (tmp1->b[y][x] - original->b[y][x]) * (reducdE * factorx); + transformed->L[y][x] = CLIP(original->L[y][x] + diflc); + transformed->a[y][x] = clipC(original->a[y][x] + difa) ; + transformed->b[y][x] = clipC(original->b[y][x] + difb); + + if (blshow) { + transformed->L[y][x] = CLIP(12000.f + diflc); + transformed->a[y][x] = clipC(difa); + transformed->b[y][x] = clipC(difb); + } else if (previewbl) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = (difb); + } + + break; + } + + case 2: { // outside selection and outside transition zone => no effect, keep original values + transformed->L[y][x] = original->L[y][x]; + transformed->a[y][x] = original->a[y][x]; + transformed->b[y][x] = original->b[y][x]; + } + } + } + } + } +} + + + +static void mean_fab(int xstart, int ystart, int bfw, int bfh, LabImage* bufexporig, int flag, const LabImage* original, float &fab, float &meanfab, float &maxfab, float chrom, bool multiThread) +{ + const int nbfab = bfw * bfh; + + meanfab = 0.f; + fab = 50.f; + + if (nbfab > 0) { + double sumab = 0.0; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:sumab) if(multiThread) +#else + static_cast(multiThread); +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + if(flag == 0) { + bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; + bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; + } else { + bufexporig->a[y][x] = original->a[y][x]; + bufexporig->b[y][x] = original->b[y][x]; + } + sumab += static_cast(SQR(std::fabs(bufexporig->a[y][x])) + SQR(std::fabs(bufexporig->b[y][x]))); + + // sumab += static_cast(std::fabs(bufexporig->a[y][x])); + // sumab += static_cast(std::fabs(bufexporig->b[y][x])); + } + } + + meanfab = sqrt(sumab / (2.0 * nbfab)); + + double som = 0.0; + double maxm = 0.0; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:som) reduction(max:maxfab)if(multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + som += static_cast(SQR(std::fabs(bufexporig->a[y][x]) - meanfab) + SQR(std::fabs(bufexporig->b[y][x]) - meanfab)); + maxm = static_cast(SQR(std::fabs(bufexporig->a[y][x])) + SQR(std::fabs(bufexporig->b[y][x]))); + maxm = sqrt(maxm); + if(maxm > (double) maxfab) { + maxfab = (float) maxm; + } + + } + } + + const float multsigma = 3.f ;//(chrom >= 0.f ? 0.035f : 0.018f) * chrom + 1.f; //disabled an use 2 stddv + const float kf = 0.f; + const float multchrom = 1.f + kf * chrom; //small correction chrom here 0.f + + const float stddv = std::sqrt(som / nbfab); + float fabprov = meanfab + multsigma * stddv * multchrom;//with 3 sigma about 99% cases + if(fabprov > maxfab) { + fabprov = maxfab; + } + fab = max(fabprov, 0.90f* maxfab);//Find maxi between mean + 3 sigma and 90% max (90 arbitrary empirical value) + + if (fab <= 0.f) { + fab = 50.f; + } + } +} + +struct grad_params { + bool angle_is_zero, transpose, bright_top; + float ta, yc, xc; + float ys, ys_inv; + float scale, botmul, topmul; + float top_edge_0; + int h; +}; + +void calclocalGradientParams(const struct local_params& lp, struct grad_params& gp, float ystart, float xstart, int bfw, int bfh, int indic) +{ + int w = bfw; + int h = bfh; + float stops = 0.f; + float angs = 0.f; + + if (indic == 0) { + stops = -lp.strmaexp; + angs = lp.angmaexp; + } else if (indic == 1) { + stops = lp.strexp; + angs = lp.angexp; + } else if (indic == 2) { + stops = lp.strSH; + angs = lp.angSH; + } else if (indic == 3) { + stops = lp.strcol; + angs = lp.angcol; + } else if (indic == 4) { + float redu = 1.f; + + if (lp.strcolab > 0.f) { + redu = 0.6f; + } else { + redu = 0.15f; + } + + stops = redu * lp.strcolab; + angs = lp.angcol; + } else if (indic == 5) { + stops = lp.strcolab; + angs = lp.angcol; + } else if (indic == 6) { + stops = lp.strcolh; + angs = lp.angcol; + } else if (indic == 7) { + stops = lp.strvib; + angs = lp.angvib; + } else if (indic == 8) { + float redu = 1.f; + + if (lp.strvibab > 0.f) { + redu = 0.7f; + } else { + redu = 0.5f; + } + + stops = redu * lp.strvibab; + angs = lp.angvib; + } else if (indic == 9) { + stops = lp.strvibh; + angs = lp.angvib; + } else if (indic == 10) { + stops = std::fabs(lp.strwav); + angs = lp.angwav; + } else if (indic == 11) { + stops = lp.strlog; + angs = lp.anglog; + } else if (indic == 12) { + stops = -lp.str_mas; + angs = lp.ang_mas; + } + + + double gradient_stops = stops; + double gradient_center_x = LIM01((lp.xc - xstart) / bfw); + double gradient_center_y = LIM01((lp.yc - ystart) / bfh); + double gradient_angle = static_cast(angs) / 180.0 * rtengine::RT_PI; + double varfeath = 0.01f * lp.feath; + + //printf("xstart=%f ysta=%f lpxc=%f lpyc=%f stop=%f bb=%f cc=%f ang=%f ff=%d gg=%d\n", xstart, ystart, lp.xc, lp.yc, gradient_stops, gradient_center_x, gradient_center_y, gradient_angle, w, h); + + // make 0.0 <= gradient_angle < 2 * rtengine::RT_PI + gradient_angle = fmod(gradient_angle, 2 * rtengine::RT_PI); + + if (gradient_angle < 0.0) { + gradient_angle += 2.0 * rtengine::RT_PI; + } + + gp.bright_top = false; + gp.transpose = false; + gp.angle_is_zero = false; + gp.h = h; + double cosgrad = cos(gradient_angle); + + if (std::fabs(cosgrad) < 0.707) { + // we transpose to avoid division by zero at 90 degrees + // (actually we could transpose only for 90 degrees, but this way we avoid + // division with extremely small numbers + gp.transpose = true; + gradient_angle += 0.5 * rtengine::RT_PI; + double gxc = gradient_center_x; + gradient_center_x = 1.0 - gradient_center_y; + gradient_center_y = gxc; + } + + gradient_angle = fmod(gradient_angle, 2 * rtengine::RT_PI); + + if (gradient_angle > 0.5 * rtengine::RT_PI && gradient_angle < rtengine::RT_PI) { + gradient_angle += rtengine::RT_PI; + gp.bright_top = true; + } else if (gradient_angle >= rtengine::RT_PI && gradient_angle < 1.5 * rtengine::RT_PI) { + gradient_angle -= rtengine::RT_PI; + gp.bright_top = true; + } + + if (std::fabs(gradient_angle) < 0.001 || std::fabs(gradient_angle - 2 * rtengine::RT_PI) < 0.001) { + gradient_angle = 0; + gp.angle_is_zero = true; + } + + if (gp.transpose) { + gp.bright_top = !gp.bright_top; + std::swap(w, h); + } + + gp.scale = 1.0 / pow(2, gradient_stops); + + if (gp.bright_top) { + gp.topmul = 1.0; + gp.botmul = gp.scale; + } else { + gp.topmul = gp.scale; + gp.botmul = 1.0; + } + + gp.ta = tan(gradient_angle); + gp.xc = w * gradient_center_x; + gp.yc = h * gradient_center_y; + gp.ys = std::sqrt(h * h + w * w) * (varfeath / cos(gradient_angle)); + gp.ys_inv = 1.f / gp.ys; + gp.top_edge_0 = gp.yc - gp.ys / 2.f; + + if (gp.ys < 1.f / h) { + gp.ys_inv = 0; + gp.ys = 0; + } +} + +void ImProcFunctions::blendstruc(int bfw, int bfh, LabImage* bufcolorig, float radius, float stru, array2D & blend2, int sk, bool multiThread) +{ + SobelCannyLuma(blend2, bufcolorig->L, bfw, bfh, radius); + float rm = 20.f / sk; + + if (rm > 0) { + float **mb = blend2; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(mb, mb, bfw, bfh, rm); + } + } + + array2D ble(bfw, bfh); + array2D guid(bfw, bfh); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + float X, Y, Z; + float L = bufcolorig->L[ir][jr]; + float a = bufcolorig->a[ir][jr]; + float b = bufcolorig->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + + blend2[ir][jr] /= 32768.f; + } + } + + const float blur = 25 / sk * (10.f + 1.2f * stru); + + rtengine::guidedFilter(guid, blend2, ble, blur, 0.001, multiThread); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + blend2[ir][jr] = 32768.f * ble[ir][jr]; + } + } +} + + +static void blendmask(const local_params& lp, int xstart, int ystart, int cx, int cy, int bfw, int bfh, LabImage* bufexporig, LabImage* original, LabImage* bufmaskor, LabImage* originalmas, float bl, float blab, int inv) +{ +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh ; y++) { + const int loy = y + ystart + cy; + + for (int x = 0; x < bfw; x++) { + const int lox = x + xstart + cx; + int zone; + + float localFactor = 1.f; + const float achm = lp.trans / 100.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, achm, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, achm, lp, zone, localFactor); + } + + if (inv == 0) { + if (zone > 0) { + bufexporig->L[y][x] += (bl * bufmaskor->L[y][x]); + bufexporig->a[y][x] *= (1.f + blab * bufmaskor->a[y][x]); + bufexporig->b[y][x] *= (1.f + blab * bufmaskor->b[y][x]); + + bufexporig->L[y][x] = CLIP(bufexporig->L[y][x]); + bufexporig->a[y][x] = clipC(bufexporig->a[y][x]); + bufexporig->b[y][x] = clipC(bufexporig->b[y][x]); + + originalmas->L[y][x] = CLIP(bufexporig->L[y][x] - bufmaskor->L[y][x]); + originalmas->a[y][x] = clipC(bufexporig->a[y][x] * (1.f - bufmaskor->a[y][x])); + originalmas->b[y][x] = clipC(bufexporig->b[y][x] * (1.f - bufmaskor->b[y][x])); + + original->L[y + ystart][x + xstart] += (bl * localFactor * bufmaskor->L[y][x]); + original->a[y + ystart][x + xstart] *= (1.f + blab * localFactor * bufmaskor->a[y][x]); + original->b[y + ystart][x + xstart] *= (1.f + blab * localFactor * bufmaskor->b[y][x]); + original->L[y + ystart][x + xstart] = CLIP(original->L[y + ystart][x + xstart]); + original->a[y + ystart][x + xstart] = clipC(original->a[y + ystart][x + xstart]); + original->b[y + ystart][x + xstart] = clipC(original->b[y + ystart][x + xstart]); + + } + } else if (inv == 1) { + localFactor = 1.f - localFactor; + + if (zone < 2) { + bufexporig->L[y][x] += (bl * bufmaskor->L[y][x]); + bufexporig->a[y][x] *= (1.f + blab * bufmaskor->a[y][x]); + bufexporig->b[y][x] *= (1.f + blab * bufmaskor->b[y][x]); + + bufexporig->L[y][x] = CLIP(bufexporig->L[y][x]); + bufexporig->a[y][x] = clipC(bufexporig->a[y][x]); + bufexporig->b[y][x] = clipC(bufexporig->b[y][x]); + + originalmas->L[y][x] = CLIP(bufexporig->L[y][x] - bufmaskor->L[y][x]); + originalmas->a[y][x] = clipC(bufexporig->a[y][x] * (1.f - bufmaskor->a[y][x])); + originalmas->b[y][x] = clipC(bufexporig->b[y][x] * (1.f - bufmaskor->b[y][x])); + + switch (zone) { + case 0: { + original->L[y + ystart][x + xstart] += (bl * bufmaskor->L[y][x]); + original->a[y + ystart][x + xstart] *= (1.f + blab * bufmaskor->a[y][x]); + original->b[y + ystart][x + xstart] *= (1.f + blab * bufmaskor->b[y][x]); + original->L[y + ystart][x + xstart] = CLIP(original->L[y + ystart][x + xstart]); + original->a[y + ystart][x + xstart] = clipC(original->a[y + ystart][x + xstart]); + original->b[y + ystart][x + xstart] = clipC(original->b[y + ystart][x + xstart]); + break; + } + + case 1: { + original->L[y + ystart][x + xstart] += (bl * localFactor * bufmaskor->L[y][x]); + original->a[y + ystart][x + xstart] *= (1.f + blab * localFactor * bufmaskor->a[y][x]); + original->b[y + ystart][x + xstart] *= (1.f + blab * localFactor * bufmaskor->b[y][x]); + original->L[y + ystart][x + xstart] = CLIP(original->L[y + ystart][x + xstart]); + original->a[y + ystart][x + xstart] = clipC(original->a[y + ystart][x + xstart]); + original->b[y + ystart][x + xstart] = clipC(original->b[y + ystart][x + xstart]); + } + + } + } + + } + } + } +} + +void ImProcFunctions::deltaEforMask(float **rdE, int bfw, int bfh, LabImage* bufcolorig, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh) +{ + const float refa = chromaref * cos(hueref); + const float refb = chromaref * sin(hueref); + const float refL = lumaref; + + const float kL = balance; + const float kab = balancedeltaE(kL); + const float kH = balanceh; + const float kch = balancedeltaE(kH); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + const float abdelta2 = SQR(refa - bufcolorig->a[y][x] / 327.68f) + SQR(refb - bufcolorig->b[y][x] / 327.68f); + const float chrodelta2 = SQR(std::sqrt(SQR(bufcolorig->a[y][x]) + SQR(bufcolorig->b[y][x])) / 327.68f - chromaref); + const float huedelta2 = abdelta2 - chrodelta2; + const float tempdE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - bufcolorig->L[y][x] / 327.68f)); + + float reducdE; + if (tempdE > maxdE) { + reducdE = 0.f; + } else if (tempdE > mindE && tempdE <= maxdE) { + const float ar = 1.f / (mindE - maxdE); + const float br = - ar * maxdE; + reducdE = pow(ar * tempdE + br, iterat); + } else { + reducdE = 1.f; + } + + if (scope > limscope) { + if (tempdE > maxdElim) { + reducdE = 0.f; + } else if (tempdE > mindElim && tempdE <= maxdElim) { + const float arlim = 1.f / (mindElim - maxdElim); + const float brlim = - arlim * maxdElim; + const float reducdElim = pow(arlim * tempdE + brlim, iterat); + const float aalim = (1.f - reducdElim) / 20.f; + const float bblim = 1.f - 100.f * aalim; + reducdE = aalim * scope + bblim; + } else { + reducdE = 1.f; + } + } + + rdE[y][x] = reducdE ; + } + } +} + +static void showmask(int lumask, const local_params& lp, int xstart, int ystart, int cx, int cy, int bfw, int bfh, LabImage* bufexporig, LabImage* transformed, LabImage* bufmaskorigSH, int inv) +{ + float lum = fabs(lumask * 400.f); + float colo = 0.f; + if(lumask < 0.f) { + lum *= 1.4f; + colo = 30000.f + 12.f * lum; + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh; y++) { + const int loy = y + ystart + cy; + + for (int x = 0; x < bfw; x++) { + const int lox = x + xstart + cx; + int zone; + float localFactor = 1.f; + const float achm = lp.trans / 100.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, achm, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, achm, lp, zone, localFactor); + } + + if (inv == 0) { + if (zone > 0) {//normal + transformed->L[y + ystart][x + xstart] = (lum) + clipLoc(bufmaskorigSH->L[y][x]); + transformed->a[y + ystart][x + xstart] = bufexporig->a[y][x] * bufmaskorigSH->a[y][x]; + transformed->b[y + ystart][x + xstart] = (colo) + bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; + } + } else if (inv == 1) { //inverse + if (zone == 0) { + transformed->L[y + ystart][x + xstart] = (lum) + clipLoc(bufmaskorigSH->L[y][x]); + transformed->a[y + ystart][x + xstart] = bufexporig->a[y][x] * bufmaskorigSH->a[y][x]; + transformed->b[y + ystart][x + xstart] = (colo) + bufexporig->b[y][x] * bufmaskorigSH->b[y][x]; + } + } + + } + } +} +//from A.Griggio...very similar to discrete_laplacian_threhold...some differences with ceiling and data format +void ImProcFunctions::laplacian(const array2D &src, array2D &dst, int bfw, int bfh, float threshold, float ceiling, float factor, bool multiThread) +{ + const int W = bfw; + const int H = bfh; + + const auto X = + [W](int x) -> int + { + return x < 0 ? x+2 : (x >= W ? x-2 : x); + }; + + const auto Y = + [H](int y) -> int + { + return y < 0 ? y+2 : (y >= H ? y-2 : y); + }; + + const auto get = + [&src](int y, int x) -> float + { + return std::max(src[y][x], 0.f); + }; + + dst(W, H); + const float f = factor / ceiling; + +#ifdef _OPENMP +# pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + int n = Y(y-1), s = Y(y+1); + for (int x = 0; x < W; ++x) { + int w = X(x-1), e = X(x+1); + float v = -8.f * get(y, x) + get(n, x) + get(s, x) + get(y, w) + get(y, e) + get(n, w) + get(n, e) + get(s, w) + get(s, e); + dst[y][x] = LIM(std::abs(v) - threshold, 0.f, ceiling) * f; + } + } +} + + + + +void ImProcFunctions::discrete_laplacian_threshold(float * data_out, const float * data_in, size_t nx, size_t ny, float t) +{ + // BENCHFUN + + if (!data_in || !data_out) { + fprintf(stderr, "a pointer is NULL and should not be so\n"); + abort(); + } + + /* pointers to the data and neighbour values */ + /* + * y-1 + * x-1 ptr x+1 + * y+1 + * <---------------------nx-------> + */ + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (size_t j = 0; j < ny; j++) { + const float* ptr_in = &data_in[j * nx]; + float* ptr_out = &data_out[j * nx]; + for (size_t i = 0; i < nx; i++) { + float val = 0.f; + /* row differences */ + if (0 < i) { + const float diff = ptr_in[i] - ptr_in[i - 1]; + val += std::fabs(diff) > t ? diff : 0.f; + } + + if (nx - 1 > i) { + const float diff = ptr_in[i] - ptr_in[i + 1];; + val += std::fabs(diff) > t ? diff : 0.f; + } + + /* column differences */ + if (0 < j) { + const float diff = ptr_in[i] - ptr_in[i - nx];; + val += std::fabs(diff) > t ? diff : 0.f; + } + + if (ny - 1 > j) { + const float diff = ptr_in[i] - ptr_in[i + nx];; + val += std::fabs(diff) > t ? diff : 0.f; + } + + ptr_out[i] = val; + } + } + +} + +float *ImProcFunctions::cos_table(size_t size) +{ + float *table = NULL; + + /* allocate the cosinus table */ + if (NULL == (table = (float *) malloc(sizeof(*table) * size))) { + fprintf(stderr, "allocation error\n"); + abort(); + } + + /* + * fill the cosinus table, + * table[i] = cos(i Pi / n) for i in [0..n[ + */ + const double pi_size = rtengine::RT_PI / size; + + for (size_t i = 0; i < size; i++) { + table[i] = 1.0 - std::cos(pi_size * i); + } + + return table; +} + + +void ImProcFunctions::rex_poisson_dct(float * data, size_t nx, size_t ny, double m) +{ + /* + * Copyright 2009-2011 IPOL Image Processing On Line http://www.ipol.im/ + * + + * @file retinex_pde_lib.c discrete Poisson equation + * @brief laplacian, DFT and Poisson routines + * + * @author Nicolas Limare + * some adaptations for Rawtherapee + */ + // BENCHFUN + + /* + * get the cosinus tables + * cosx[i] = cos(i Pi / nx) for i in [0..nx[ + * cosy[i] = cos(i Pi / ny) for i in [0..ny[ + */ + + float* cosx = cos_table(nx); + float* cosy = cos_table(ny); + + /* + * we will now multiply data[i, j] by + * m / (4 - 2 * cosx[i] - 2 * cosy[j])) + * and set data[0, 0] to 0 + */ + float m2 = m / 2.; + /* + * after that, by construction, we always have + * cosx[] + cosy[] != 2. + */ + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (size_t i = 0; i < ny; ++i) { + for (size_t j = 0; j < nx; ++j) { + data[i * nx + j] *= m2 / (cosx[j] + cosy[i]); + } + } + // handle the first value, data[0, 0] = 0 + data[0] = 0.f; + + free(cosx); + free(cosy); + +} + +void ImProcFunctions::mean_dt(const float* data, size_t size, double& mean_p, double& dt_p) +{ + + double mean = 0.; + double dt = 0.; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:mean,dt) if(multiThread) +#endif + for (size_t i = 0; i < size; i++) { + mean += static_cast(data[i]); + dt += static_cast(SQR(data[i])); + } + + mean /= size; + dt /= size; + dt -= SQR(mean); + mean_p = mean; + dt_p = std::sqrt(dt); +} + +void ImProcFunctions::normalize_mean_dt(float * data, const float * ref, size_t size, float mod, float sigm, float mdef, float sdef, float mdef2, float sdef2) +{ + /* + * Copyright 2009-2011 IPOL Image Processing On Line http://www.ipol.im/ + * + + * @file retinex_pde_lib.c discrete Poisson equation + * @brief laplacian, DFT and Poisson routines + * + * @author Nicolas Limare + * adapted for Rawtherapee - jacques Desmis july 2019 - march 2021 + */ + + if (NULL == data || NULL == ref) { + fprintf(stderr, "a pointer is NULL and should not be so\n"); + abort(); + } + + double mean_ref, mean_data, dt_ref, dt_data; + + /* compute mean and variance of the two arrays */ + if(mdef!= 0.f && sdef != 0.f) { + mean_ref = mdef; + dt_ref = sdef; + } else { + mean_dt(ref, size, mean_ref, dt_ref); + } + if(mdef2!= 0.f && sdef2 != 0.f) { + // printf("OK shortcut\n"); + mean_data = mdef2; + dt_data = sdef2; + } else { + mean_dt(data, size, mean_data, dt_data); + } + + /* compute the normalization coefficients */ + const double a = dt_ref / dt_data; + const double b = mean_ref - a * mean_data; + + const float modma = static_cast(mod) * a; + const float sigmmmodmb = static_cast(sigm) * static_cast(mod) * b; + const float onesmod = 1.f - mod; + /* normalize the array */ + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (size_t i = 0; i < size; i++) { + data[i] = (modma * data[i] + sigmmmodmb) + onesmod * ref[i];//normalize mean and stdv and balance PDE + } + +} + +void ImProcFunctions::retinex_pde(const float * datain, float * dataout, int bfw, int bfh, float thresh, float multy, float * dE, int show, int dEenable, int normalize) +{ + /* + * Copyright 2009-2011 IPOL Image Processing On Line http://www.ipol.im/ + * + + * @file retinex_pde_lib.c discrete Poisson equation + * @brief laplacian, DFT and Poisson routines + * + * @author Nicolas Limare + * adapted for Rawtherapee by Jacques Desmis 6-2019 + */ + + // BENCHFUN + +#ifdef RT_FFTW3F_OMP + if (multiThread) { + fftwf_init_threads(); + fftwf_plan_with_nthreads(omp_get_max_threads()); + } +#endif + + float *datashow = nullptr; + if (show != 0) { + datashow = (float *) fftwf_malloc(sizeof(float) * bfw * bfh); + if (!datashow) { + fprintf(stderr, "allocation error\n"); + abort(); + } + } + + float *data_tmp = (float *) fftwf_malloc(sizeof(float) * bfw * bfh); + if (!data_tmp) { + fprintf(stderr, "allocation error\n"); + abort(); + } + + //first call to laplacian with plein strength + discrete_laplacian_threshold(data_tmp, datain, bfw, bfh, thresh); + + float *data_fft = (float *) fftwf_malloc(sizeof(float) * bfw * bfh); + if (!data_fft) { + fprintf(stderr, "allocation error\n"); + abort(); + } + + if (show == 1) { + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + datashow[y * bfw + x] = data_tmp[y * bfw + x]; + } + } + } + + //execute first + const auto dct_fw = fftwf_plan_r2r_2d(bfh, bfw, data_tmp, data_fft, FFTW_REDFT10, FFTW_REDFT10, FFTW_ESTIMATE | FFTW_DESTROY_INPUT); + fftwf_execute(dct_fw); + fftwf_destroy_plan(dct_fw); + + //execute second + if (dEenable == 1) { + float* data_fft04 = (float *)fftwf_malloc(sizeof(float) * bfw * bfh); + float* data_tmp04 = (float *)fftwf_malloc(sizeof(float) * bfw * bfh); + if (!data_fft04 || !data_tmp04) { + fprintf(stderr, "allocation error\n"); + abort(); + } + //second call to laplacian with 40% strength ==> reduce effect if we are far from ref (deltaE) + discrete_laplacian_threshold(data_tmp04, datain, bfw, bfh, 0.4f * thresh); + const auto dct_fw04 = fftwf_plan_r2r_2d(bfh, bfw, data_tmp04, data_fft04, FFTW_REDFT10, FFTW_REDFT10, FFTW_ESTIMATE | FFTW_DESTROY_INPUT); + fftwf_execute(dct_fw04); + fftwf_destroy_plan(dct_fw04); + constexpr float exponent = 4.5f; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + const vfloat exponentv = F2V(exponent); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + for (int y = 0; y < bfh ; y++) {//mix two fftw Laplacian : plein if dE near ref + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(data_fft[y * bfw + x], intp(pow_F(LVFU(dE[y * bfw + x]), exponentv), LVFU(data_fft[y * bfw + x]), LVFU(data_fft04[y * bfw + x]))); + } +#endif + for (; x < bfw; x++) { + data_fft[y * bfw + x] = intp(pow_F(dE[y * bfw + x], exponent), data_fft[y * bfw + x], data_fft04[y * bfw + x]); + } + } + } + fftwf_free(data_fft04); + fftwf_free(data_tmp04); + } + if (show == 2) { + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + datashow[y * bfw + x] = data_fft[y * bfw + x]; + } + } + } + + /* solve the Poisson PDE in Fourier space */ + /* 1. / (float) (bfw * bfh)) is the DCT normalisation term, see libfftw */ + rex_poisson_dct(data_fft, bfw, bfh, 1. / (double)(bfw * bfh)); + + if (show == 3) { + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + datashow[y * bfw + x] = data_fft[y * bfw + x]; + } + } + } + + const auto dct_bw = fftwf_plan_r2r_2d(bfh, bfw, data_fft, data_tmp, FFTW_REDFT01, FFTW_REDFT01, FFTW_ESTIMATE | FFTW_DESTROY_INPUT); + fftwf_execute(dct_bw); + fftwf_destroy_plan(dct_bw); + fftwf_free(data_fft); + + if (show != 4 && normalize == 1) { + normalize_mean_dt(data_tmp, datain, bfw * bfh, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f); + } + + if (show == 0 || show == 4) { + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + dataout[y * bfw + x] = clipLoc(multy * data_tmp[y * bfw + x]); + } + } + } else if (show == 1 || show == 2 || show == 3) { + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + dataout[y * bfw + x] = clipLoc(multy * datashow[y * bfw + x]); + } + } + } + + fftwf_free(data_tmp); + if (datashow) { + fftwf_free(datashow); + } + fftwf_cleanup(); + +#ifdef RT_FFTW3F_OMP + if (multiThread) { + fftwf_cleanup_threads(); + } +#endif +} + +void ImProcFunctions::maskcalccol(bool invmask, bool pde, int bfw, int bfh, int xstart, int ystart, int sk, int cx, int cy, LabImage* bufcolorig, LabImage* bufmaskblurcol, LabImage* originalmaskcol, LabImage* original, LabImage* reserved, int inv, struct local_params & lp, + float strumask, bool astool, + const LocCCmaskCurve & locccmasCurve, bool lcmasutili, + const LocLLmaskCurve & locllmasCurve, bool llmasutili, + const LocHHmaskCurve & lochhmasCurve, bool lhmasutili, const LocHHmaskCurve & lochhhmasCurve, bool lhhmasutili, + bool multiThread, bool enaMask, bool showmaske, bool deltaE, bool modmask, bool zero, bool modif, float chrom, float rad, float lap, float gamma, float slope, float blendm, float blendmab, int shado, int highl, float amountcd, float anchorcd, + const LUTf& lmasklocalcurve, bool localmaskutili, + const LocwavCurve & loclmasCurvecolwav, bool lmasutilicolwav, int level_bl, int level_hl, int level_br, int level_hr, + int shortcu, bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, + bool fftt, float blu_ma, float cont_ma, int indic, float &fab + ) + + +{ + array2D ble(bfw, bfh); + array2D blechro(bfw, bfh); + array2D hue(bfw, bfh); + array2D guid(bfw, bfh); + const std::unique_ptr bufreserv(new LabImage(bfw, bfh)); + float meanfab, corfab; + float maxfab = -1000.f; + float epsi = 0.001f; + mean_fab(xstart, ystart, bfw, bfh, bufcolorig, 0, original, fab, meanfab, maxfab, chrom, multiThread); + corfab = 0.7f * (65535.f) / (fab + epsi);//empirical values 0.7 link to chromult + + // printf("Fab=%f corfab=%f maxfab=%f\n", (double) fab, (double) corfab, (double) maxfab); + float chromult = 1.f; + if(chrom > 0.f){ + chromult = 1.f + 0.003f * chrom; + } else { + chromult = 1.f + 0.01f * chrom; + } + // chromult * corfab * kmaskC + float kinv = 1.f; + float kneg = 1.f; + + if (invmask) { + kinv = 0.f; + kneg = -1.f; + } + + if (deltaE || modmask || enaMask || showmaske) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufmaskblurcol->L[y][x] = original->L[y + ystart][x + xstart]; + bufmaskblurcol->a[y][x] = original->a[y + ystart][x + xstart]; + bufmaskblurcol->b[y][x] = original->b[y + ystart][x + xstart]; + bufreserv->L[y][x] = reserved->L[y + ystart][x + xstart]; + bufreserv->a[y][x] = reserved->a[y + ystart][x + xstart]; + bufreserv->b[y][x] = reserved->b[y + ystart][x + xstart]; + } + } + + JaggedArray blendstru(bfw, bfh); + + if (blu_ma >= 0.25f && strumask == 0.f) { + strumask = 0.1f; // to enable a small mask make FFT good ...why ?? + } + + if (strumask > 0.f) { + float delstrumask = 4.1f - strumask;//4.1 = 2 * max slider strumask + 0.1 + buildBlendMask(bufcolorig->L, blendstru, bfw, bfh, delstrumask); + float radblur = 0.02f * std::fabs(0.1f * rad);//empirical value + float rm = radblur / sk; + + if (rm > 0) { + float **mb = blendstru; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(mb, mb, bfw, bfh, rm); + } + } + + } + + JaggedArray blendblur(bfw, bfh); + + JaggedArray blur(bfw, bfh); + + if (cont_ma > 0.f) { + float contra = cont_ma; + buildBlendMask(bufcolorig->L, blendblur, bfw, bfh, contra); + + + float radblur = 0.25f + 0.002f * std::fabs(rad);//empirical value + float rm = radblur / sk; + + if (fftt) { + if (rm < 0.3f) { + rm = 0.3f; + } + } + + if (rm > 0) { + float **mb = blendblur; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(mb, mb, bfw, bfh, rm); + } + } + + if (blu_ma >= 0.25f) { + if (!fftt) { // || (lp.fftColorMask && call != 2)) { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(bufcolorig->L, blur, bfw, bfh, blu_ma / sk); + } + } else { + ImProcFunctions::fftw_convol_blur2(bufcolorig->L, blur, bfw, bfh, blu_ma / sk, 0, 0); + } + + for (int i = 0; i < bfh; i++) { + for (int j = 0; j < bfw; j++) { + blur[i][j] = intp(blendblur[i][j], bufcolorig->L[i][j], rtengine::max(blur[i][j], 0.0f)); + } + } + } + } + + bool HHmaskcurve = false; + + if (lochhhmasCurve && lhhmasutili) { + for (int i = 0; i < 500; i++) { + if (lochhhmasCurve[i] != 0.5f) { + HHmaskcurve = true; + break; + } + } + } + +//denoise mask chroma + + + LabImage tmpab(bfw, bfh); + tmpab.clear(true); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + tmpab.L[ir][jr] = bufcolorig->L[ir][jr]; + tmpab.a[ir][jr] = bufcolorig->a[ir][jr]; + tmpab.b[ir][jr] = bufcolorig->b[ir][jr]; + } + float noisevarab_r = SQR(lp.denoichmask / 10.f); + if(noisevarab_r > 0.f) { + int wavelet_leve = 6; + + int minwin1 = rtengine::min(bfw, bfh); + int maxlevelspot1 = 9; + + while ((1 << maxlevelspot1) >= (minwin1 * sk) && maxlevelspot1 > 1) { + --maxlevelspot1 ; + } + + wavelet_leve = rtengine::min(wavelet_leve, maxlevelspot1); + int maxlvl1 = wavelet_leve; +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + + wavelet_decomposition Ldecomp(tmpab.L[0],tmpab.W, tmpab.H, maxlvl1, 1, sk, numThreads, lp.daubLen); + wavelet_decomposition adecomp(tmpab.a[0],tmpab.W, tmpab.H, maxlvl1, 1, sk, numThreads, lp.daubLen); + wavelet_decomposition bdecomp(tmpab.b[0],tmpab.W, tmpab.H, maxlvl1, 1, sk, numThreads, lp.daubLen); + float* noisevarchrom; + noisevarchrom = new float[bfw*bfh]; + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; + int bfw2 = (bfw + 1) / 2; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float cN = std::sqrt(SQR(tmpab.a[ir][jr]) + SQR(tmpab.b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = nvcl; + } + } + + float madL[8][3]; + int levred = maxlvl1; + if (!Ldecomp.memory_allocation_failed()) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) if (multiThread) +#endif + for (int lvl = 0; lvl < levred; lvl++) { + for (int dir = 1; dir < 4; dir++) { + int Wlvl_L = Ldecomp.level_W(lvl); + int Hlvl_L = Ldecomp.level_H(lvl); + const float* const* WavCoeffs_L = Ldecomp.level_coeffs(lvl); + + madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); + } + } + } + + if (!adecomp.memory_allocation_failed() && !bdecomp.memory_allocation_failed()) { + WaveletDenoiseAll_BiShrinkAB(Ldecomp, adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, true, false, false, numThreads); + + WaveletDenoiseAll_BiShrinkAB(Ldecomp, bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, false, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, nullptr, 0, noisevarab_r, false, false, false, numThreads); + + } + + delete[] noisevarchrom; + + if (!Ldecomp.memory_allocation_failed()) { + Ldecomp.reconstruct(tmpab.L[0]); + } + if (!adecomp.memory_allocation_failed()) { + adecomp.reconstruct(tmpab.a[0]); + } + if (!bdecomp.memory_allocation_failed()) { + bdecomp.reconstruct(tmpab.b[0]); + } + + float meanfab1, fab1, maxfab1; + std::unique_ptr buforig; + buforig.reset(new LabImage(bfw, bfh)); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + buforig->L[ir][jr] = tmpab.L[ir][jr]; + buforig->a[ir][jr] = tmpab.a[ir][jr]; + buforig->b[ir][jr] = tmpab.b[ir][jr]; + } + + + mean_fab(xstart, ystart, bfw, bfh, buforig.get(), 1, buforig.get(), fab1, meanfab1, maxfab1, chrom, multiThread); + // printf("Fab den=%f \n", (double) fab1); + fab = fab1;//fab denoise + + } +// end code denoise mask chroma + + + + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + float atan2Buffer[bfw] ALIGNED64; +// float atan2BufferH[bfw] ALIGNED64; +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) +#endif + for (int ir = 0; ir < bfh; ir++) { +#ifdef __SSE2__ + + if (lochhmasCurve && lhmasutili) { + int i = 0; + + for (; i < bfw - 3; i += 4) { + // STVF(atan2Buffer[i], xatan2f(LVFU(bufcolorig->b[ir][i]), LVFU(bufcolorig->a[ir][i]))); + STVF(atan2Buffer[i], xatan2f(LVFU(tmpab.b[ir][i]), LVFU(tmpab.a[ir][i]))); + } + + for (; i < bfw; i++) { + // atan2Buffer[i] = xatan2f(bufcolorig->b[ir][i], bufcolorig->a[ir][i]); + atan2Buffer[i] = xatan2f(tmpab.b[ir][i], tmpab.a[ir][i]); + } + } + +#endif + + for (int jr = 0; jr < bfw; jr++) { + float kmaskL = 0.f; + float kmaskC = 0.f; + float kmaskHL = 0.f; + float kmaskH = 0.f; + float kmasstru = 0.f; + float kmasblur = 0.f; + + if (strumask > 0.f && !astool) { + kmasstru = bufcolorig->L[ir][jr] * blendstru[ir][jr]; + } + + if (cont_ma > 0.f) { + + if (blu_ma >= 0.25f) { + + float prov = intp(blendstru[ir][jr], bufcolorig->L[ir][jr], rtengine::max(blur[ir][jr], 0.0f)); + kmasblur = bufcolorig->L[ir][jr] - prov ; + + } + } + + if (locllmasCurve && llmasutili) { + // printf("s"); + kmaskL = 32768.f * LIM01(kinv - kneg * locllmasCurve[(500.f / 32768.f) * bufcolorig->L[ir][jr]]); + + } + + if (!deltaE && locccmasCurve && lcmasutili) { + // kmaskC = LIM01(kinv - kneg * locccmasCurve[500.f * (0.0001f + std::sqrt(SQR(bufcolorig->a[ir][jr]) + SQR(bufcolorig->b[ir][jr])) / (fab))]); + kmaskC = LIM01(kinv - kneg * locccmasCurve[500.f * (0.0001f + std::sqrt(SQR(tmpab.a[ir][jr]) + SQR(tmpab.b[ir][jr])) / fab)]); + } + + if (lochhmasCurve && lhmasutili) { +#ifdef __SSE2__ + const float huema = atan2Buffer[jr]; +#else + // const float huema = xatan2f(bufcolorig->b[ir][jr], bufcolorig->a[ir][jr]); + const float huema = xatan2f(tmpab.b[ir][jr], tmpab.a[ir][jr]); +#endif + float h = Color::huelab_to_huehsv2(huema); + h += 1.f / 6.f; + + if (h > 1.f) { + h -= 1.f; + } + + const float valHH = LIM01(kinv - kneg * lochhmasCurve[500.f * h]); + + if (!deltaE) { + kmaskH = valHH; + } + + kmaskHL = 32768.f * valHH; + } + + bufmaskblurcol->L[ir][jr] = clipLoc(kmaskL + kmaskHL + kmasstru + kmasblur); + bufmaskblurcol->a[ir][jr] = clipC((chromult * corfab * kmaskC + chromult * kmaskH)); + bufmaskblurcol->b[ir][jr] = clipC((chromult * corfab * kmaskC + chromult * kmaskH)); + + if (shortcu == 1) { //short circuit all L curve + bufmaskblurcol->L[ir][jr] = 32768.f - bufcolorig->L[ir][jr]; + } + + ble[ir][jr] = bufmaskblurcol->L[ir][jr] / 32768.f; + hue[ir][jr] = xatan2f(bufmaskblurcol->b[ir][jr], bufmaskblurcol->a[ir][jr]); + const float chromah = std::sqrt(SQR(bufmaskblurcol->b[ir][jr]) + SQR(bufmaskblurcol->a[ir][jr])); + + blechro[ir][jr] = chromah / 32768.f;//must be good perhaps more or less, only incidence on LIM blea bleb + guid[ir][jr] = Color::L2Y(bufcolorig->L[ir][jr]) / 32768.f; + + } + } + } + + if (lap > 0.f && pde) { + array2D mask; + mask(bfw, bfh); + float amount = LIM01(float(lap)/100.f); + array2D LL(bfw, bfh, bufcolorig->L, ARRAY2D_BYREFERENCE); + laplacian(LL, mask, bfw, bfh, 25.f, 20000.f, amount, false); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + mask[i][j] = LIM01(mask[i][j]); + } + } + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(mask), static_cast(mask), 5 / sk, bfw, bfh, false); + } +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + bufmaskblurcol->L[i][j] += clipLoc(100000.f * (mask[i][j]));//increase strongly result + } + } + } + + std::unique_ptr bufprov; + if (delt) { + bufprov.reset(new LabImage(bfw, bfh)); + bufprov->CopyFrom(bufmaskblurcol, multiThread); + } + + if (rad != 0.f) { + const float tmpblur = rad < 0.f ? -1.f / rad : 1.f + rad; + const int r1 = rtengine::max(4 / sk * tmpblur + 0.5f, 1); + const int r2 = rtengine::max(25 / sk * tmpblur + 0.5f, 1); + + constexpr float epsilmax = 0.005f; + constexpr float epsilmin = 0.00001f; + + constexpr float aepsil = (epsilmax - epsilmin) / 100.f; + constexpr float bepsil = epsilmin; //epsilmax - 100.f * aepsil; + const float epsil = rad < 0.f ? 0.001f : aepsil * rad + bepsil; + + rtengine::guidedFilter(guid, blechro, blechro, r1, epsil, multiThread); + rtengine::guidedFilter(guid, ble, ble, r2, 0.2f * epsil, multiThread); + } + + LUTf lutTonemaskexp(65536); + calcGammaLut(gamma, slope, lutTonemaskexp); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + float2 sincosval = xsincosf(hue[ir][jr]); + bufmaskblurcol->L[ir][jr] = lutTonemaskexp[ble[ir][jr] * 65536.f]; + bufmaskblurcol->a[ir][jr] = 32768.f * blechro[ir][jr] * sincosval.y; + bufmaskblurcol->b[ir][jr] = 32768.f * blechro[ir][jr] * sincosval.x; + } + } + + + if (strumask > 0.f && astool) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufmaskblurcol->L[ir][jr] *= (1.f + blendstru[ir][jr]); + } + } + } + + if (lmasklocalcurve && localmaskutili) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + bufmaskblurcol->L[ir][jr] = 0.5f * lmasklocalcurve[2.f * bufmaskblurcol->L[ir][jr]]; + } + } + + if (shado > 0) { + ImProcFunctions::shadowsHighlights(bufmaskblurcol, true, 1, 0, shado, 40, sk, 0, 60); + } + + if (highl > 0) { + ImProcFunctions::shadowsHighlights(bufmaskblurcol, true, 1, highl, 0, 40, sk, 50, 0); + } + + int wavelet_level = level_br; + + int minwin = rtengine::min(bfw, bfh); + int maxlevelspot = 9; + + while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { + --maxlevelspot ; + } + + wavelet_level = rtengine::min(wavelet_level, maxlevelspot); + int maxlvl = wavelet_level; +// float contrast = 0.f; + bool wavcurvemask = false; + + if (loclmasCurvecolwav && lmasutilicolwav) { + for (int i = 0; i < 500; i++) { + if (loclmasCurvecolwav[i] != 0.5f) { + wavcurvemask = true; + break; + } + } + } + + if (wavcurvemask) { +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + wavelet_decomposition *wdspot = new wavelet_decomposition(bufmaskblurcol->L[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen); + if (wdspot->memory_allocation_failed()) { + return; + } + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + Evaluate2(*wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); + float alow = 1.f; + float blow = 0.f; + if (level_hl != level_bl) { + alow = 1.f / (level_hl - level_bl); + blow = -alow * level_bl; + } + + float ahigh = 1.f; + float bhigh = 0.f; + + if (level_hr != level_br) { + ahigh = 1.f / (level_hr - level_br); + bhigh = -ahigh * level_br; + } + + for (int dir = 1; dir < 4; dir++) { + for (int level = level_bl; level < maxlvl; ++level) { + int W_L = wdspot->level_W(level); + int H_L = wdspot->level_H(level); + float* const* wav_L = wdspot->level_coeffs(level); + + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { + float insigma = 0.666f; //SD + float logmax = log(MaxP[level]); //log Max + float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max + float inx = log(insigma); + float iny = log(rapX); + float rap = inx / iny; //koef + float asig = 0.166f / (sigma[level]); + float bsig = 0.5f - asig * mean[level]; + float amean = 0.5f / mean[level]; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < W_L * H_L; i++) { + if(loclmasCurvecolwav && lmasutilicolwav) { + float absciss; + float &val = wav_L[dir][i]; + + if (fabsf(val) >= (mean[level] + sigma[level])) { //for max + float valcour = xlogf(fabsf(val)); + float valc = valcour - logmax; + float vald = valc * rap; + absciss = xexpf(vald); + } else if (fabsf(val) >= mean[level]) { + absciss = asig * fabsf(val) + bsig; + } else { + absciss = amean * fabsf(val); + } + + float klev = 1.f; + if (level >= level_hl && level <= level_hr) { + klev = 1.f; + } + + if (level_hl != level_bl) { + if (level >= level_bl && level < level_hl) { + klev = alow * level + blow; + } + } + + if (level_hr != level_br) { + if (level > level_hr && level <= level_br) { + klev = ahigh * level + bhigh; + } + } + + float kc = klev * (loclmasCurvecolwav[absciss * 500.f] - 0.5f); + float amplieffect = kc <= 0.f ? 1.f : 4.f; + + float kinterm = 1.f + amplieffect * kc; + kinterm = kinterm <= 0.f ? 0.01f : kinterm; + + val *= kinterm; + + } + } + } + + } + } + + wdspot->reconstruct(bufmaskblurcol->L[0], 1.f); + delete wdspot; + + } + + if (lochhhmasCurve && HHmaskcurve) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float huemah = xatan2f(bufmaskblurcol->b[ir][jr], bufmaskblurcol->a[ir][jr]); + float chromah = std::sqrt(SQR(bufmaskblurcol->b[ir][jr]) + SQR(bufmaskblurcol->a[ir][jr])); + + + float hh = Color::huelab_to_huehsv2(huemah); + hh += 1.f / 6.f; + + if (hh > 1.f) { + hh -= 1.f; + } + + const float val_HH = float ((0.5f - lochhhmasCurve[500.f * hh])); + const float hhro = 1.5f * val_HH; + float newhr = 0.f; + + if (hhro != 0) { + newhr = huemah + hhro;//we add radians and other dim between 0 1.. always radians but addition "false" + + if (newhr > rtengine::RT_PI_F) { + newhr -= 2 * rtengine::RT_PI_F; + } else if (newhr < -rtengine::RT_PI_F) { + newhr += 2 * rtengine::RT_PI_F; + } + } + + float2 sincosval = xsincosf(newhr); + bufmaskblurcol->a[ir][jr] = clipC(chromah * sincosval.y); + bufmaskblurcol->b[ir][jr] = clipC(chromah * sincosval.x); + + } + } + + if (amountcd > 1.f) { //dynamic range compression for Mask + FattalToneMappingParams fatParams; + fatParams.enabled = true; + fatParams.threshold = 100.f; + fatParams.amount = amountcd; + fatParams.anchor = anchorcd; + int nlev = 1; + Imagefloat *tmpImagefat = nullptr; + tmpImagefat = new Imagefloat(bfw, bfh); + lab2rgb(*bufmaskblurcol, *tmpImagefat, params->icm.workingProfile); + ToneMapFattal02(tmpImagefat, fatParams, nlev, 0, nullptr, 0, 0, 0); + rgb2lab(*tmpImagefat, *bufmaskblurcol, params->icm.workingProfile); + delete tmpImagefat; + } + + if (delt) { + const std::unique_ptr> rdEBuffer(new JaggedArray(bfw, bfh)); + float** rdE = *rdEBuffer; + + deltaEforMask(rdE, bfw, bfh, bufreserv.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, lp.balance, lp.balanceh); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + const float rdEval = rdE[ir][jr]; + bufmaskblurcol->L[ir][jr] = bufprov->L[ir][jr] + rdEval * (bufmaskblurcol->L[ir][jr] - bufprov->L[ir][jr]); + bufmaskblurcol->a[ir][jr] = bufprov->a[ir][jr] + rdEval * (bufmaskblurcol->a[ir][jr] - bufprov->a[ir][jr]); + bufmaskblurcol->b[ir][jr] = bufprov->b[ir][jr] + rdEval * (bufmaskblurcol->b[ir][jr] - bufprov->b[ir][jr]); + } + } + } + + struct grad_params gp; + + if ((indic == 0 && lp.strmaexp != 0.f) || (indic ==12 && lp.str_mas != 0.f)) { + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, indic); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufmaskblurcol->L[ir][jr] *= ImProcFunctions::calcGradientFactor(gp, jr, ir); + } + } + } +/* + if (lap > 0.f) { + const float *datain = bufmaskblurcol->L[0]; + const std::unique_ptr data_tmp(new float[bfh * bfw]); + + if (!pde) { + ImProcFunctions::discrete_laplacian_threshold(data_tmp.get(), datain, bfw, bfh, 200.f * lap); + } else { + ImProcFunctions::retinex_pde(datain, data_tmp.get(), bfw, bfh, 12.f * lap, 1.f, nullptr, 0, 0, 1); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufmaskblurcol->L[y][x] = data_tmp[y * bfw + x]; + } + } + } + */ + } + + const float radiusb = 1.f / sk; + + if (deltaE || modmask || enaMask || showmaske) { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(bufmaskblurcol->L, bufmaskblurcol->L, bfw, bfh, radiusb); + gaussianBlur(bufmaskblurcol->a, bufmaskblurcol->a, bfw, bfh, 1.f + (0.5f * rad) / sk); + gaussianBlur(bufmaskblurcol->b, bufmaskblurcol->b, bfw, bfh, 1.f + (0.5f * rad) / sk); + } + + if (zero || modif || modmask || deltaE || enaMask) { + originalmaskcol->CopyFrom(bufcolorig, multiThread); + blendmask(lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig, original, bufmaskblurcol, originalmaskcol, blendm, blendmab, inv); + } + } +} + +void ImProcFunctions::InverseSharp_Local(float **loctemp, const float hueref, const float lumaref, const float chromaref, local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) +{ +//local sharp + // BENCHFUN + const float ach = lp.trans / 100.f; + const int GW = transformed->W; + const int GH = transformed->H; + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + const bool sharshow = lp.showmasksharmet == 1; + const bool previewshar = lp.showmasksharmet == 2; + + if (lp.colorde == 0) { + lp.colorde = -1;//to avoid black + } + + float ampli = 1.0 + std::fabs(lp.colorde); + ampli = 2.f + 0.5f * (ampli - 2.f); + + constexpr float aadark = -1.f; + constexpr float bbdark = 5000.f; + + const std::unique_ptr origblur(new LabImage(GW, GH)); + + float radius = 3.f / sk; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const float mindE = 2.f + MINSCOPE * lp.senssha * lp.thr; + const float maxdE = 5.f + MAXSCOPE * lp.senssha * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < transformed->H; y++) { + int loy = cy + y; + + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + const float abdelta2 = SQR(refa - origblur->a[y][x]) + SQR(refb - origblur->b[y][x]); + const float chrodelta2 = SQR(std::sqrt(SQR(origblur->a[y][x]) + SQR(origblur->b[y][x])) - (chromaref * 327.68f)); + const float huedelta2 = abdelta2 - chrodelta2; + const float dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - origblur->L[y][x])); + + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.senssha); + + switch (zone) { + case 0: { // outside selection and outside transition zone => full effect, no transition + const float difL = loctemp[y][x] - original->L[y][x]; + transformed->L[y][x] = CLIP(original->L[y][x] + difL * reducdE); + + if (sharshow) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = ampli * 5.f * difL * reducdE; + } else if (previewshar) { + float difbdisp = reducdE * 10000.f * lp.colorde; + + if (transformed->L[y][x] < bbdark) { //enhance dark luminance as user can see! + float dark = transformed->L[y][x]; + transformed->L[y][x] = dark * aadark + bbdark; + } + + if (lp.colorde <= 0) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = difbdisp; + } else { + transformed->a[y][x] = -difbdisp; + transformed->b[y][x] = 0.f; + } + + } + + break; + } + + case 1: { // inside transition zone + const float difL = (loctemp[y][x] - original->L[y][x]) * (1.f - localFactor); + transformed->L[y][x] = CLIP(original->L[y][x] + difL * reducdE); + + if (sharshow) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = ampli * 5.f * difL * reducdE; + } else if (previewshar || lp.prevdE) { + const float difbdisp = reducdE * 10000.f * lp.colorde; + + if (transformed->L[y][x] < bbdark) { //enhance dark luminance as user can see! + const float dark = transformed->L[y][x]; + transformed->L[y][x] = dark * aadark + bbdark; + } + + if (lp.colorde <= 0) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = difbdisp; + } else { + transformed->a[y][x] = -difbdisp; + transformed->b[y][x] = 0.f; + } + } + break; + } + + case 2: { // inside selection => no effect, keep original values + transformed->L[y][x] = original->L[y][x]; + } + } + } + } + } +} + +void ImProcFunctions::Sharp_Local(int call, float **loctemp, int senstype, const float hueref, const float chromaref, const float lumaref, local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) +{ + //BENCHFUN + const float ach = lp.trans / 100.f; + const float varsens = senstype == 1 ? lp.senslc : lp.senssha; + const bool sharshow = (lp.showmasksharmet == 1); + const bool previewshar = (lp.showmasksharmet == 2); + + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + + if (lp.colorde == 0) { + lp.colorde = -1;//to avoid black + } + + float ampli = 1.0 + std::fabs(lp.colorde); + ampli = 2.f + 0.5f * (ampli - 2.f); + + float darklim = 5000.f; + float aadark = -1.f; + float bbdark = darklim; + + const int GW = transformed->W; + const int GH = transformed->H; + + const std::unique_ptr origblur(new LabImage(GW, GH)); + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + const float radius = 3.f / sk; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const int begy = int (lp.yc - lp.lyT); + const int begx = int (lp.xc - lp.lxL); + const float mindE = 2.f + MINSCOPE * varsens * lp.thr; + const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < transformed->H; y++) { + const int loy = cy + y; + const bool isZone0 = loy > lp.yc + lp.ly || loy < lp.yc - lp.lyT; // whole line is zone 0 => we can skip a lot of processing + + if (isZone0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + for (int x = 0; x < transformed->W; x++) { + const int lox = cx + x; + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + //deltaE + const float abdelta2 = SQR(refa - origblur->a[y][x]) + SQR(refb - origblur->b[y][x]); + const float chrodelta2 = SQR(std::sqrt(SQR(origblur->a[y][x]) + SQR(origblur->b[y][x])) - (chromaref * 327.68f)); + const float huedelta2 = abdelta2 - chrodelta2; + const float dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - origblur->L[y][x])); + + float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens); + const float reducview = reducdE; + reducdE *= localFactor; + + float difL; + + if (call == 2) { + difL = loctemp[loy - begy][lox - begx] - original->L[y][x]; + } else { + difL = loctemp[y][x] - original->L[y][x]; + } + + transformed->L[y][x] = CLIP(original->L[y][x] + difL * reducdE); + + if (sharshow) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = ampli * 5.f * difL * reducdE; + } else if (previewshar || lp.prevdE) { + float difbdisp = reducview * 10000.f * lp.colorde; + + if (transformed->L[y][x] < darklim) { //enhance dark luminance as user can see! + transformed->L[y][x] = transformed->L[y][x] * aadark + bbdark; + } + + if (lp.colorde <= 0) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = difbdisp; + } else { + transformed->a[y][x] = -difbdisp; + transformed->b[y][x] = 0.f; + } + } + } + } + } +} + +void ImProcFunctions::Exclude_Local(float **deltaso, float hueref, float chromaref, float lumaref, float sobelref, float meansobel, const struct local_params & lp, const LabImage * original, LabImage * transformed, const LabImage * rsv, const LabImage * reserv, int cx, int cy, int sk) +{ + + // BENCHFUN + { + const float ach = lp.trans / 100.f; + const float varsens = lp.sensexclu; + const float mindE = 2.f + MINSCOPE * varsens * lp.thr; + const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + + const int GW = transformed->W; + const int GH = transformed->H; + + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + // lumaref *= 327.68f; + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + //sobel + sobelref = rtengine::min(sobelref / 100.f, 60.f); + + const bool recip = sobelref < meansobel && sobelref < lp.stru; + + sobelref = log1p(sobelref); + + const std::unique_ptr origblur(new LabImage(GW, GH)); + + const float radius = 3.f / sk; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(reserv->L, origblur->L, GW, GH, radius); + gaussianBlur(reserv->a, origblur->a, GW, GH, radius); + gaussianBlur(reserv->b, origblur->b, GW, GH, radius); + + +#ifdef _OPENMP + #pragma omp barrier + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < transformed->H; y++) + { + const int loy = cy + y; + const bool isZone0 = loy > (lp.yc + lp.ly - 1) || loy < lp.yc - lp.lyT; // // -1 fix issue 5554 + + if (isZone0) { // outside selection and outside transition zone => no effect, keep original values + for (int x = 0; x < transformed->W; x++) { + transformed->L[y][x] = original->L[y][x]; + } + + continue; + } + + for (int x = 0; x < transformed->W; x++) { + const int lox = cx + x; + const bool isZone0x = lox > (lp.xc + lp.lx - 1) || lox < lp.xc - lp.lxL; // -1 fix issue 5554 + + if (isZone0x) { // outside selection and outside transition zone => no effect, keep original values + transformed->L[y][x] = original->L[y][x]; + continue; + } + + const int begx = int (lp.xc - lp.lxL); + const int begy = int (lp.yc - lp.lyT); + + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + transformed->L[y][x] = original->L[y][x]; + continue; + } + + float rs = 0.f; + + const float csob = xlogf(1.f + rtengine::min(deltaso[loy - begy][lox - begx] / 100.f, 60.f) + 0.001f); + + if (!recip) { + rs = sobelref / csob; + } else { + rs = csob / sobelref; + } + + float affsob = 1.f; + + if (lp.struexc > 0.f && rs > 0.f) { + const float rsob = 0.002f * lp.struexc * rs; + const float minrs = 1.3f + 0.05f * lp.stru; + + if (rs < minrs) { + affsob = 1.f; + } else { + affsob = 1.f / pow_F((1.f + rsob), SQR(SQR(rs - minrs))); + } + } + + float abdelta2 = SQR(refa - origblur->a[y][x]) + SQR(refb - origblur->b[y][x]); + float chrodelta2 = SQR(std::sqrt(SQR(origblur->a[y][x]) + SQR(origblur->b[y][x])) - (chromaref * 327.68f)); + float huedelta2 = abdelta2 - chrodelta2; + const float dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - origblur->L[y][x])); + const float rL = origblur->L[y][x]; + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens); + + if (rL > 32.768f) { //to avoid crash with very low gamut in rare cases ex : L=0.01 a=0.5 b=-0.9 + if (zone > 0) { + + const float difL = (rsv->L[loy - begy][lox - begx] - original->L[y][x]) * localFactor; + transformed->L[y][x] = CLIP(original->L[y][x] + difL * affsob * reducdE); + + const float difa = (rsv->a[loy - begy][lox - begx] - original->a[y][x]) * localFactor; + transformed->a[y][x] = clipC(original->a[y][x] + difa * affsob * reducdE); + + const float difb = (rsv->b[loy - begy][lox - begx] - original->b[y][x]) * localFactor; + transformed->b[y][x] = clipC(original->b[y][x] + difb * affsob * reducdE); + + } + } + } + } + } + } +} + + + + + +void ImProcFunctions::transit_shapedetect_retinex(int call, int senstype, LabImage * bufexporig, LabImage * bufexpfin, LabImage * bufmask, LabImage * buforigmas, float **buflight, float **bufchro, const float hueref, const float chromaref, const float lumaref, struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) +{ + + //BENCHFUN + { + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + + + const float ach = lp.trans / 100.f; + const float varsens = lp.sensh; + + int GW = transformed->W; + int GH = transformed->H; + + // const float refa = chromaref * cos(hueref); + // const float refb = chromaref * sin(hueref); + + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + + const bool retishow = ((lp.showmaskretimet == 1 || lp.showmaskretimet == 2)); + const bool previewreti = ((lp.showmaskretimet == 4)); + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + if (lp.colorde == 0) { + lp.colorde = -1;//to avoid black + } +/* + float ampli = 1.f + std::fabs(lp.colorde); + ampli = 2.f + 0.5f * (ampli - 2.f); + + float darklim = 5000.f; + float aadark = -1.f; + float bbdark = darklim; +*/ + const bool showmas = lp.showmaskretimet == 3 ; + + const std::unique_ptr origblur(new LabImage(GW, GH)); + const float radius = 3.f / sk; + const bool usemaskreti = lp.enaretiMask && senstype == 4 && !lp.enaretiMasktmap; + float strcli = 0.03f * lp.str; + + if (lp.scalereti == 1) { + strcli = 0.015f * lp.str; + } + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + } + + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const float mindE = 2.f + MINSCOPE * varsens * lp.thr; + const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float previewint = 0.f; //reducdE * 10000.f * lp.colorde; //settings->previewselection; + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = ystart; y < yend; y++) + { + const int loy = cy + y; + + for (int x = xstart; x < xend; x++) { + const int lox = cx + x; + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + float rL = origblur->L[y][x] / 327.68f; + float dE; + float abdelta2 = 0.f; + float chrodelta2 = 0.f; + float huedelta2 = 0.f; + + if (!usemaskreti) { + abdelta2 = SQR(refa - origblur->a[y][x]) + SQR(refb - origblur->b[y][x]); + chrodelta2 = SQR(std::sqrt(SQR(origblur->a[y][x]) + SQR(origblur->b[y][x])) - (chromaref * 327.68f)); + huedelta2 = abdelta2 - chrodelta2; + dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - origblur->L[y][x])); + } else { + if (call == 2) { + abdelta2 = SQR(refa - buforigmas->a[y - ystart][x - xstart]) + SQR(refb - buforigmas->b[y - ystart][x - xstart]); + chrodelta2 = SQR(std::sqrt(SQR(buforigmas->a[y - ystart][x - xstart]) + SQR(buforigmas->b[y - ystart][x - xstart])) - (chromaref * 327.68f)); + huedelta2 = abdelta2 - chrodelta2; + dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - buforigmas->L[y - ystart][x - xstart])); + + } else { + abdelta2 = SQR(refa - buforigmas->a[y][x]) + SQR(refb - buforigmas->b[y][x]); + chrodelta2 = SQR(std::sqrt(SQR(buforigmas->a[y][x]) + SQR(buforigmas->b[y][x])) - (chromaref * 327.68f)); + huedelta2 = abdelta2 - chrodelta2; + dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - buforigmas->L[y][x])); + } + } + + float cli, clc; + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens) / 100.f; + previewint = reducdE * 10000.f * lp.colorde; //settings->previewselection; + + if (call == 2) { + cli = buflight[y - ystart][x - xstart]; + clc = previewreti ? settings->previewselection * 100.f : bufchro[y - ystart][x - xstart]; + } else { + cli = buflight[y][x]; + // clc = previewreti ? settings->previewselection * 100.f : bufchro[y][x]; + clc = previewreti ? reducdE * 10000.f * lp.colorde: bufchro[y][x]; + + } + + + cli *= reducdE; + clc *= reducdE; + cli *= (1.f + strcli); + + if (rL > 0.1f) { //to avoid crash with very low gamut in rare cases ex : L=0.01 a=0.5 b=-0.9 + if (senstype == 4) {//all except color and light (TODO) and exposure + float lightc; + + if (call == 2) { + lightc = bufexporig->L[y - ystart][x - xstart]; + } else { + lightc = bufexporig->L[y][x]; + } + + float fli = 1.f + cli; + float diflc = lightc * fli - original->L[y][x]; + diflc *= localFactor; + + if (!showmas) { + transformed->L[y][x] = CLIP(original->L[y][x] + diflc); + } else { + if (call == 2) { + + transformed->L[y][x] = bufmask->L[y - ystart][x - xstart]; + } else { + transformed->L[y][x] = bufmask->L[y][x]; + } + } ; + + if (retishow) { + transformed->L[y][x] = CLIP(12000.f + diflc); + } + } + + float fliab = 1.f; + float chra, chrb; + + if (call == 2) { + chra = bufexporig->a[y - ystart][x - xstart]; + chrb = bufexporig->b[y - ystart][x - xstart]; + } else { + chra = bufexporig->a[y][x]; + chrb = bufexporig->b[y][x]; + + } + + if (senstype == 5) { + fliab = 1.f + clc; + } + + const float difa = (chra * fliab - original->a[y][x]) * localFactor; + float difb = (chrb * fliab - original->b[y][x]) * localFactor; + + transformed->a[y][x] = clipC(original->a[y][x] + difa); + transformed->b[y][x] = clipC(original->b[y][x] + difb); + + if (showmas) { + if (call == 2) { + transformed->a[y][x] = bufmask->a[y - ystart][x - xstart]; + transformed->b[y][x] = bufmask->b[y - ystart][x - xstart]; + } else { + transformed->a[y][x] = bufmask->a[y][x]; + transformed->b[y][x] = bufmask->b[y][x]; + + } + } + + if (retishow) { + transformed->a[y][x] = clipC(difa); + transformed->b[y][x] = clipC(difb); + } + + if (previewreti || lp.prevdE) { + difb = (bufexpfin->b[y][x] - original->b[y][x]) * localFactor; + transformed->a[y][x] = 0.f; + transformed->b[y][x] = previewint * difb; + } + } + } + } + } + + if (showmas || retishow || previewreti) + { + return; + } + + } +} + + +void ImProcFunctions::transit_shapedetect(int senstype, const LabImage * bufexporig, LabImage * originalmask, float **bufchro, bool HHutili, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, const struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) +{ + + // BENCHFUN + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + const int bfw = xend - xstart; + const int bfh = yend - ystart; +// printf("h=%f l=%f c=%f s=%f\n", hueref, lumaref, chromaref, sobelref); +// printf("bfh=%i bfw=%i\n", bfh, bfw); + const float ach = lp.trans / 100.f; + float varsens = lp.sensex; + + if (senstype == 6 || senstype == 7) //cbdl + { + varsens = lp.senscb; + } else if (senstype == 8) //TM + { + varsens = lp.senstm; + } else if (senstype == 10) //local contrast + { + varsens = lp.senslc; + } + + //sobel //keep in case of, not used + sobelref /= 100.f; + meansobel /= 100.f; + + sobelref = rtengine::min(sobelref, 60.f); + + const bool k = !(sobelref < meansobel && sobelref < lp.stru); //does not always work with noisy images + + sobelref = log1p(sobelref); + + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + const float previewint = settings->previewselection; + + const bool cbshow = ((lp.showmaskcbmet == 1 || lp.showmaskcbmet == 2) && senstype == 6); + const bool tmshow = ((lp.showmasktmmet == 1 || lp.showmasktmmet == 2) && senstype == 8); + const bool previewcb = ((lp.showmaskcbmet == 4) && senstype == 6); + const bool previewtm = ((lp.showmasktmmet == 4) && senstype == 8); + + const std::unique_ptr origblur(new LabImage(bfw, bfh)); + std::unique_ptr origblurmask; + + float radius = 3.f / sk; + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const bool usemaskcb = (lp.showmaskcbmet == 2 || lp.enacbMask || lp.showmaskcbmet == 4) && senstype == 6; + const bool usemasktm = (lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 4) && senstype == 8; + const bool usemaskall = (usemaskcb || usemasktm); + + if (usemaskall) + { + origblurmask.reset(new LabImage(bfw, bfh)); + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(originalmask->L, origblurmask->L, bfw, bfh, radius); + gaussianBlur(originalmask->a, origblurmask->a, bfw, bfh, radius); + gaussianBlur(originalmask->b, origblurmask->b, bfw, bfh, radius); + } + } + if (lp.equtm && senstype == 8) //normalize luminance for Tone mapping , at this place we can use for others senstype! + { + float *datain = new float[bfh * bfw]; + float *data = new float[bfh * bfw]; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + for (int y = ystart; y < yend; y++) + for (int x = xstart; x < xend; x++) { + datain[(y - ystart) * bfw + (x - xstart)] = original->L[y][x]; + data[(y - ystart)* bfw + (x - xstart)] = bufexporig->L[y - ystart][x - xstart]; + } + + normalize_mean_dt(data, datain, bfh * bfw, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = ystart; y < yend; y++) + for (int x = xstart; x < xend; x++) { + bufexporig->L[y - ystart][x - xstart] = data[(y - ystart) * bfw + x - xstart]; + } + + delete [] datain; + delete [] data; + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh; y++) + { + for (int x = 0; x < bfw; x++) { + origblur->L[y][x] = original->L[y + ystart][x + xstart]; + origblur->a[y][x] = original->a[y + ystart][x + xstart]; + origblur->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + gaussianBlur(origblur->L, origblur->L, bfw, bfh, radius); + gaussianBlur(origblur->a, origblur->a, bfw, bfh, radius); + gaussianBlur(origblur->b, origblur->b, bfw, bfh, radius); + + } + + const LabImage *maskptr = usemaskall ? origblurmask.get() : origblur.get(); + const float mindE = 2.f + MINSCOPE * varsens * lp.thr; + const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + float atan2Buffer[transformed->W] ALIGNED16; +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = ystart; y < yend; y++) + { + const int loy = cy + y; + +#ifdef __SSE2__ + + if (HHutili || senstype == 7) { + int i = xstart; + + for (; i < xend - 3; i += 4) { + vfloat av = LVFU(origblur->a[y - ystart][i - xstart]); + vfloat bv = LVFU(origblur->b[y - ystart][i - xstart]); + STVFU(atan2Buffer[i], xatan2f(bv, av)); + } + + for (; i < xend; i++) { + atan2Buffer[i] = xatan2f(origblur->b[y - ystart][i - xstart], origblur->a[y - ystart][i - xstart]); + } + } + +#endif + + for (int x = xstart; x < xend; x++) { + const int lox = cx + x; + + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + float rhue = 0; + + if (HHutili || senstype == 7) { +#ifdef __SSE2__ + rhue = atan2Buffer[x]; +#else + rhue = xatan2f(origblur->b[y - ystart][x - xstart], origblur->a[y - ystart][x - xstart]); +#endif + } + + const float rL = origblur->L[y - ystart][x - xstart] / 327.68f; + float rsob = 0.f; + + if (blend2 && ((senstype == 1 && lp.struexp > 0.f) || ((senstype == 0 || senstype == 100) && lp.struco > 0.f))) {//keep in case of, not used + const float csob = xlogf(1.f + rtengine::min(blend2[y - ystart][x - xstart] / 100.f, 60.f) + 0.001f); + + float rs; + + if (k) { + rs = sobelref / csob; + } else { + rs = csob / sobelref; + } + + if (rs > 0.f && senstype == 1) { + rsob = 1.1f * lp.struexp * rs; + } else if (rs > 0.f && (senstype == 0 || senstype == 100)) { + rsob = 1.1f * lp.struco * rs; + } + } + + const float dE = rsob + std::sqrt(kab * (SQR(refa - maskptr->a[y - ystart][x - xstart]) + SQR(refb - maskptr->b[y - ystart][x - xstart])) + kL * SQR(refL - maskptr->L[y - ystart][x - xstart])); + const float clc = (previewcb) ? settings->previewselection * 100.f : bufchro[y - ystart][x - xstart]; + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens); + const float realstrchdE = reducdE * clc; + + if (rL > 0.1f) { //to avoid crash with very low gamut in rare cases ex : L=0.01 a=0.5 b=-0.9 + if (zone > 0) { + float factorx = localFactor; + float difL = 0.f; + + if (senstype == 6 || senstype == 8 || senstype == 10) { + difL = (bufexporig->L[y - ystart][x - xstart] - original->L[y][x]) * localFactor * reducdE; + transformed->L[y][x] = CLIP(original->L[y][x] + difL); + } + + if (senstype == 7) { + float difab = bufexporig->L[y - ystart][x - xstart] - std::sqrt(SQR(original->a[y][x]) + SQR(original->b[y][x])); + float2 sincosval = xsincosf(rhue); + float difa = difab * sincosval.y; + float difb = difab * sincosval.x; + difa *= factorx * (100.f + realstrchdE) / 100.f; + difb *= factorx * (100.f + realstrchdE) / 100.f; + transformed->a[y][x] = clipC(original->a[y][x] + difa); + transformed->b[y][x] = clipC(original->b[y][x] + difb); + } else { + float flia = 1.f; + float flib = 1.f; + float chra = bufexporig->a[y - ystart][x - xstart]; + float chrb = bufexporig->b[y - ystart][x - xstart]; + + if (senstype == 3 || senstype == 30 || senstype == 8 || senstype == 6 || senstype == 10) { + flia = flib = ((100.f + realstrchdE) / 100.f); + } + + + float difa = chra * flia - original->a[y][x]; + float difb = chrb * flib - original->b[y][x]; + difa *= factorx; + difb *= factorx; + + transformed->a[y][x] = clipC(original->a[y][x] + difa); + transformed->b[y][x] = clipC(original->b[y][x] + difb); + + + if (cbshow || tmshow) { + transformed->L[y][x] = CLIP(12000.f + difL); + transformed->a[y][x] = clipC(difa); + transformed->b[y][x] = clipC(difb); + } else if (previewcb || previewtm || lp.prevdE) { + if (std::fabs(difb) < 500.f) { + difb += difL; + } + + transformed->a[y][x] = 0.f; + transformed->b[y][x] = previewint * difb; + } + } + } + } + } + } + } +} + +void ImProcFunctions::InverseColorLight_Local(bool tonequ, bool tonecurv, int sp, int senstype, struct local_params & lp, LabImage * originalmask, const LUTf& lightCurveloc, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& exlocalcurve, const LUTf& cclocalcurve, float adjustr, bool localcutili, const LUTf& lllocalcurve, bool locallutili, LabImage * original, LabImage * transformed, int cx, int cy, const float hueref, const float chromaref, const float lumaref, int sk) +{ + // BENCHFUN + const float ach = lp.trans / 100.f; + const float facc = (100.f + lp.chro) / 100.f; //chroma factor transition + float varsens = lp.sens; + + if (senstype == 0) { //Color and Light + varsens = lp.sens; + } else if (senstype == 1) { //exposure + varsens = lp.sensex; + } else if (senstype == 2) { //shadows highlight + varsens = lp.senshs; + } + + const int GW = transformed->W; + const int GH = transformed->H; + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + + const std::unique_ptr temp(new LabImage(GW, GH)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H; y++) { + for (int x = 0; x < transformed->W; x++) { + temp->L[y][x] = original->L[y][x]; + temp->a[y][x] = original->a[y][x]; + temp->b[y][x] = original->b[y][x]; + } + } + + if (senstype == 2) { // Shadows highlight + if (lp.shmeth == 0) { + ImProcFunctions::shadowsHighlights(temp.get(), lp.hsena, 1, lp.highlihs, lp.shadowhs, lp.radiushs, sk, lp.hltonalhs, lp.shtonalhs); + } else if (lp.shmeth == 1) { + const std::unique_ptr tmpImage(new Imagefloat(GW, GH)); + + lab2rgb(*temp, *tmpImage, params->icm.workingProfile); + Glib::ustring prof = params->icm.workingProfile; + if (tonecurv) { //Tone response curve : does nothing if gamma=2.4 and slope=12.92 ==> gamma sRGB + const float gamtone = params->locallab.spots.at(sp).gamSH; + const float slotone = params->locallab.spots.at(sp).sloSH; + int ill = 0; + cmsHTRANSFORM dummy = nullptr; + workingtrc(tmpImage.get(), tmpImage.get(), GW, GH, -5, prof, 2.4, 12.92310, ill, 0, dummy, true, false, false); + // workingtrc(tmpImage.get(), tmpImage.get(), GW, GH, 5, prof, gamtone, slotone, illum, 0, dummy, false, true, true);//to keep if we want improve with illuminant and primaries + workingtrc(tmpImage.get(), tmpImage.get(), GW, GH, 1, prof, gamtone, slotone, ill, 0, dummy, false, true, true);//be careful no gamut control + + } + + if (tonequ) { + tone_eq(this, tmpImage.get(), lp, params->icm.workingProfile, sk, multiThread); + } + + rgb2lab(*tmpImage, *temp, params->icm.workingProfile); + } + + } else if (senstype == 1) { //exposure + ImProcFunctions::exlabLocal(lp, 1.f, GH, GW, GW, GH, original, temp.get(), hltonecurveloc, shtonecurveloc, tonecurveloc, hueref, lumaref, chromaref); + + if (exlocalcurve) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < temp->H; y++) { + for (int x = 0; x < temp->W; x++) { + const float lh = 0.5f * exlocalcurve[2.f * temp->L[y][x]]; // / ((lighn) / 1.9f) / 3.61f; //lh between 0 and 0 50 or more + temp->L[y][x] = lh; + } + } + } + + if ((lp.expcomp != 0.f) || (exlocalcurve)) { + if (lp.shadex > 0) { + ImProcFunctions::shadowsHighlights(temp.get(), true, 1, 0, lp.shadex, 40, sk, 0, lp.shcomp); + } + } + + if (lp.expchroma != 0.f) { + const float ch = (1.f + 0.02f * lp.expchroma) ; + float chprosl; + + if (ch <= 1.f) {//convert data curve near values of slider -100 + 100, to be used after to detection shape + chprosl = 99.f * ch - 99.f; + } else { + constexpr float ampli = 70.f; + chprosl = clipChro(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H; y++) { + for (int x = 0; x < transformed->W; x++) { + const float epsi = original->L[y][x] == 0.f ? 0.001f : 0.f; + const float rapexp = temp->L[y][x] / (original->L[y][x] + epsi); + temp->a[y][x] *= (1.f + chprosl * rapexp); + temp->b[y][x] *= (1.f + chprosl * rapexp); + } + } + } + } else if (senstype == 0) { //Color and Light curves L C + if (cclocalcurve && localcutili) { // C=f(C) curve +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H; y++) { + for (int x = 0; x < transformed->W; x++) { + //same as in "normal" + const float chromat = std::sqrt(SQR(original->a[y][x]) + SQR(original->b[y][x])); + constexpr float ampli = 25.f; + const float ch = (cclocalcurve[chromat * adjustr ]) / ((chromat + 0.00001f) * adjustr); //ch between 0 and 0 50 or more + const float chprocu = clipChro(ampli * ch - ampli); //ampli = 25.f arbitrary empirical coefficient between 5 and 50 + temp->a[y][x] = original->a[y][x] * (1.f + 0.01f * chprocu); + temp->b[y][x] = original->b[y][x] * (1.f + 0.01f * chprocu); + + } + } + } + + if (lllocalcurve && locallutili) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H; y++) { + for (int x = 0; x < transformed->W; x++) { + temp->L[y][x] = 0.5f * lllocalcurve[2.f * original->L[y][x]]; + } + } + } + } + + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + + const std::unique_ptr origblur(new LabImage(GW, GH)); + std::unique_ptr origblurmask; + const bool usemaskcol = (lp.enaColorMaskinv) && senstype == 0; + const bool usemaskexp = (lp.enaExpMaskinv) && senstype == 1; + const bool usemasksh = (lp.enaSHMaskinv) && senstype == 2; + const bool usemaskall = (usemaskcol || usemaskexp || usemasksh); + + float radius = 3.f / sk; + + if (usemaskall) { + origblurmask.reset(new LabImage(GW, GH)); + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(originalmask->L, origblurmask->L, GW, GH, radius); + gaussianBlur(originalmask->a, origblurmask->a, GW, GH, radius); + gaussianBlur(originalmask->b, origblurmask->b, GW, GH, radius); + } + } + + if (senstype == 1) { + radius = (2.f + 0.2f * lp.blurexp) / sk; + } else if (senstype == 0) { + radius = (2.f + 0.2f * lp.blurcol) / sk; + } else if (senstype == 2) { + radius = (2.f + 0.2f * lp.blurSH) / sk; + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const LabImage *maskptr = usemaskall ? origblurmask.get() : origblur.get(); + const float mindE = 2.f + MINSCOPE * varsens * lp.thr; + const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < transformed->H; y++) { + const int loy = cy + y; + + for (int x = 0; x < transformed->W; x++) { + const float rL = origblur->L[y][x] / 327.68f; + + if (std::fabs(origblur->b[y][x]) < 0.01f) { + origblur->b[y][x] = 0.01f; + } + + constexpr float th_r = 0.01f; + + if (rL > th_r) { //to avoid crash with very low gamut in rare cases ex : L=0.01 a=0.5 b=-0.9 + const int lox = cx + x; + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor);//rect not good + } + + //deltaE + float reducdE; + if (zone != 2) { + const float abdelta2 = SQR(refa - maskptr->a[y][x]) + SQR(refb - maskptr->b[y][x]); + const float chrodelta2 = SQR(std::sqrt(SQR(maskptr->a[y][x]) + SQR(maskptr->b[y][x])) - (chromaref * 327.68f)); + const float huedelta2 = abdelta2 - chrodelta2; + const float dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - maskptr->L[y][x])); + reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens); + } + + switch (zone) { + case 2: { // outside selection and outside transition zone => no effect, keep original values + transformed->L[y][x] = original->L[y][x]; + transformed->a[y][x] = original->a[y][x]; + transformed->b[y][x] = original->b[y][x]; + break; + } + + case 1: { // inside transition zone + const float factorx = 1.f - localFactor; + + if (senstype == 0) { + const float epsia = original->a[y][x] == 0.f ? 0.0001f : 0.f; + const float epsib = original->b[y][x] == 0.f ? 0.0001f : 0.f; + float lumnew = original->L[y][x]; + const float difL = (temp->L[y][x] - original->L[y][x]) * (reducdE * factorx); + const float difa = (temp->a[y][x] - original->a[y][x]) * (reducdE * factorx); + const float difb = (temp->b[y][x] - original->b[y][x]) * (reducdE * factorx); + const float facCa = 1.f + (difa / (original->a[y][x] + epsia)); + const float facCb = 1.f + (difb / (original->b[y][x] + epsib)); + + if (lp.sens < 75.f) { + if ((lp.ligh != 0.f || lp.cont != 0)) { + lumnew = calclightinv(lumnew, lp.ligh, lightCurveloc); //replace L-curve + } + + const float fac = (100.f + factorx * lp.chro * reducdE) / 100.f; //chroma factor transition + const float diflc = (lumnew - original->L[y][x]) * (reducdE * factorx); + + transformed->L[y][x] = CLIP(1.f * (original->L[y][x] + diflc + difL)); + transformed->a[y][x] = clipC(original->a[y][x] * fac * facCa) ; + transformed->b[y][x] = clipC(original->b[y][x] * fac * facCb); + } else { + const float fac = (100.f + factorx * lp.chro) / 100.f; //chroma factor transition + + if ((lp.ligh != 0.f || lp.cont != 0)) { + lumnew = calclightinv(original->L[y][x], lp.ligh, lightCurveloc); + } + + const float diflc = (lumnew - original->L[y][x]) * factorx; + transformed->L[y][x] = CLIP(original->L[y][x] + diflc + difL); + transformed->a[y][x] = clipC(original->a[y][x] * fac * facCa); + transformed->b[y][x] = clipC(original->b[y][x] * fac * facCb); + } + } else if (senstype == 1 || senstype == 2) { + const float diflc = (temp->L[y][x] - original->L[y][x]) * (reducdE * factorx); + const float difa = (temp->a[y][x] - original->a[y][x]) * (reducdE * factorx); + const float difb = (temp->b[y][x] - original->b[y][x]) * (reducdE * factorx); + transformed->L[y][x] = CLIP(original->L[y][x] + diflc); + transformed->a[y][x] = clipC(original->a[y][x] + difa) ; + transformed->b[y][x] = clipC(original->b[y][x] + difb); + } + + break; + } + + case 0: { // inside selection => full effect, no transition + if (senstype == 0) { + const float epsia = original->a[y][x] == 0.f ? 0.0001f : 0.f; + const float epsib = original->b[y][x] == 0.f ? 0.0001f : 0.f; + float lumnew = original->L[y][x]; + const float difL = (temp->L[y][x] - original->L[y][x]) * reducdE; + const float difa = (temp->a[y][x] - original->a[y][x]) * reducdE; + const float difb = (temp->b[y][x] - original->b[y][x]) * reducdE; + const float facCa = 1.f + difa / (original->a[y][x] + epsia); + const float facCb = 1.f + difb / (original->b[y][x] + epsib); + + if (lp.sens < 75.f) { + if ((lp.ligh != 0.f || lp.cont != 0)) { + lumnew = calclightinv(lumnew, lp.ligh, lightCurveloc); //replace L-curve + } + + const float fac = (100.f + lp.chro * reducdE) / 100.f; //chroma factor transition + const float diflc = (lumnew - original->L[y][x]) * reducdE; + + transformed->L[y][x] = CLIP(original->L[y][x] + diflc + difL); + transformed->a[y][x] = clipC(original->a[y][x] * fac * facCa) ; + transformed->b[y][x] = clipC(original->b[y][x] * fac * facCb); + } else { + if ((lp.ligh != 0.f || lp.cont != 0)) { + lumnew = calclightinv(original->L[y][x], lp.ligh, lightCurveloc); + } + + transformed->L[y][x] = CLIP(lumnew + difL) ; + transformed->a[y][x] = clipC(original->a[y][x] * facc * facCa); + transformed->b[y][x] = clipC(original->b[y][x] * facc * facCb); + } + } else if (senstype == 1 || senstype == 2) { + const float diflc = (temp->L[y][x] - original->L[y][x]) * reducdE; + const float difa = (temp->a[y][x] - original->a[y][x]) * reducdE; + const float difb = (temp->b[y][x] - original->b[y][x]) * reducdE; + transformed->L[y][x] = CLIP(original->L[y][x] + diflc); + transformed->a[y][x] = clipC(original->a[y][x] + difa) ; + transformed->b[y][x] = clipC(original->b[y][x] + difb); + } + } + } + } + } + } + } +} + +void ImProcFunctions::calc_ref(int sp, LabImage * original, LabImage * transformed, int cx, int cy, int oW, int oH, int sk, double & huerefblur, double & chromarefblur, double & lumarefblur, double & hueref, double & chromaref, double & lumaref, double & sobelref, float & avg, const LocwavCurve & locwavCurveden, bool locwavdenutili) +{ + if (params->locallab.enabled) { + // always calculate hueref, chromaref, lumaref before others operations + // use in normal mode for all modules except denoise + struct local_params lp; + calcLocalParams(sp, oW, oH, params->locallab, lp, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, locwavCurveden, locwavdenutili); + int begy = lp.yc - lp.lyT; + int begx = lp.xc - lp.lxL; + int yEn = lp.yc + lp.ly; + int xEn = lp.xc + lp.lx; + float avg2 = 0.f; + int nc2 = 0; + + for (int y = 0; y < transformed->H ; y++) //{ + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + int loy = cy + y; + + if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + avg2 += original->L[y][x]; + nc2++; + } + } + + avg2 /= 32768.f; + avg = avg2 / nc2; +// double precision for large summations + double aveA = 0.; + double aveB = 0.; + double aveL = 0.; + double aveChro = 0.; + double aveAblur = 0.; + double aveBblur = 0.; + double aveLblur = 0.; + double aveChroblur = 0.; + + double avesobel = 0.; +// int precision for the counters + int nab = 0; + int nso = 0; + int nsb = 0; +// single precision for the result + float avA, avB, avL; + int spotSize = 0.88623f * rtengine::max(1, lp.cir / sk); //18 + //O.88623 = std::sqrt(PI / 4) ==> square equal to circle + int spotSise2; // = 0.88623f * max (1, lp.cir / sk); //18 + + // very small region, don't use omp here + LabImage *sobelL; + LabImage *deltasobelL; + LabImage *origsob; + LabImage *origblur = nullptr; + LabImage *blurorig = nullptr; + + int spotSi = 1 + 2 * rtengine::max(1, lp.cir / sk); + + if (spotSi < 5) { + spotSi = 5; + } + + spotSise2 = (spotSi - 1) / 2; + + JaggedArray blend3(spotSi, spotSi); + + origsob = new LabImage(spotSi, spotSi); + sobelL = new LabImage(spotSi, spotSi); + deltasobelL = new LabImage(spotSi, spotSi); + bool isdenoise = false; + + if ((lp.noiself > 0.f || lp.noiself0 > 0.f || lp.noiself2 > 0.f || lp.wavcurvedenoi || lp.nlstr > 0 || lp.noiselc > 0.f || lp.noisecf > 0.f || lp.noisecc > 0.f) && lp.denoiena) { + isdenoise = true; + } + + if (isdenoise) { + origblur = new LabImage(spotSi, spotSi); + blurorig = new LabImage(spotSi, spotSi); + + for (int y = rtengine::max(cy, (int)(lp.yc - spotSise2)); y < rtengine::min(transformed->H + cy, (int)(lp.yc + spotSise2 + 1)); y++) { + for (int x = rtengine::max(cx, (int)(lp.xc - spotSise2)); x < rtengine::min(transformed->W + cx, (int)(lp.xc + spotSise2 + 1)); x++) { + int yb = rtengine::max(cy, (int)(lp.yc - spotSise2)); + + int xb = rtengine::max(cx, (int)(lp.xc - spotSise2)); + + int z = y - yb; + int u = x - xb; + origblur->L[z][u] = original->L[y - cy][x - cx]; + origblur->a[z][u] = original->a[y - cy][x - cx]; + origblur->b[z][u] = original->b[y - cy][x - cx]; + + } + } + + float radius = 3.f / sk; + { + //No omp + gaussianBlur(origblur->L, blurorig->L, spotSi, spotSi, radius); + gaussianBlur(origblur->a, blurorig->a, spotSi, spotSi, radius); + gaussianBlur(origblur->b, blurorig->b, spotSi, spotSi, radius); + + } + + for (int y = 0; y < spotSi; y++) { + for (int x = 0; x < spotSi; x++) { + aveLblur += static_cast(blurorig->L[y][x]); + aveAblur += static_cast(blurorig->a[y][x]); + aveBblur += static_cast(blurorig->b[y][x]); + aveChroblur += static_cast(std::sqrt(SQR(blurorig->b[y - cy][x - cx]) + SQR(blurorig->a[y - cy][x - cx]))); + nsb++; + + } + } + } + + //ref for luma, chroma, hue + for (int y = rtengine::max(cy, (int)(lp.yc - spotSize)); y < rtengine::min(transformed->H + cy, (int)(lp.yc + spotSize + 1)); y++) { + for (int x = rtengine::max(cx, (int)(lp.xc - spotSize)); x < rtengine::min(transformed->W + cx, (int)(lp.xc + spotSize + 1)); x++) { + aveL += static_cast(original->L[y - cy][x - cx]); + aveA += static_cast(original->a[y - cy][x - cx]); + aveB += static_cast(original->b[y - cy][x - cx]); + aveChro += static_cast(std::sqrt(SQR(original->b[y - cy][x - cx]) + SQR(original->a[y - cy][x - cx]))); + nab++; + } + } + + //ref for sobel + for (int y = rtengine::max(cy, (int)(lp.yc - spotSise2)); y < rtengine::min(transformed->H + cy, (int)(lp.yc + spotSise2 + 1)); y++) { + for (int x = rtengine::max(cx, (int)(lp.xc - spotSise2)); x < rtengine::min(transformed->W + cx, (int)(lp.xc + spotSise2 + 1)); x++) { + int yb = rtengine::max(cy, (int)(lp.yc - spotSise2)); + + int xb = rtengine::max(cx, (int)(lp.xc - spotSise2)); + + int z = y - yb; + int u = x - xb; + origsob->L[z][u] = original->L[y - cy][x - cx]; + nso++; + } + } + + const float radius = 3.f / (sk * 1.4f); //0 to 70 ==> see skip + + SobelCannyLuma(sobelL->L, origsob->L, spotSi, spotSi, radius); + int nbs = 0; + + for (int y = 0; y < spotSi ; y ++) + for (int x = 0; x < spotSi ; x ++) { + avesobel += static_cast(sobelL->L[y][x]); + nbs++; + } + + sobelref = avesobel / nbs; + + delete sobelL; + + delete deltasobelL; + delete origsob; + aveL = aveL / nab; + aveA = aveA / nab; + aveB = aveB / nab; + aveChro = aveChro / nab; + aveChro /= 327.68; + avA = aveA / 327.68; + avB = aveB / 327.68; + avL = aveL / 327.68; + hueref = xatan2f(avB, avA); //mean hue + + if (isdenoise) { + aveLblur = aveLblur / nsb; + aveChroblur = aveChroblur / nsb; + aveChroblur /= 327.68; + aveAblur = aveAblur / nsb; + aveBblur = aveBblur / nsb; + float avAblur = aveAblur / 327.68; + float avBblur = aveBblur / 327.68; + float avLblur = aveLblur / 327.68; + huerefblur = xatan2f(avBblur, avAblur); + chromarefblur = aveChroblur; + lumarefblur = avLblur; + } else { + huerefblur = 0.f; + chromarefblur = 0.f; + lumarefblur = 0.f; + } + + chromaref = aveChro; + lumaref = avL; + + // printf("Calcref => sp=%i befend=%i huere=%2.1f chromare=%2.1f lumare=%2.1f sobelref=%2.1f\n", sp, befend, hueref, chromaref, lumaref, sobelref / 100.f); + + if (isdenoise) { + delete origblur; + delete blurorig; + } + + lumaref = rtengine::min(lumaref, 95.f); //to avoid crash + } +} +//doc fftw3 says optimum is with size 2^a * 3^b * 5^c * 7^d * 11^e * 13^f with e+f = 0 or 1 +//number for size between 18144 and 1 ==> 18000 pixels cover 99% all sensor +const int fftw_size[] = {18144, 18000, 17920, 17836, 17820, 17640, 17600, 17550, 17500, 17496, 17472, 17325, 17280, 17248, 17199, 17150, 17010, 16896, 16875, 16848, 16807, + 16800, 16640, 16632, 16500, 16464, 16384, 16380, 16250, 16200, 16170, 16128, 16038, 16000, 15925, 15876, 15840, 15795, 15750, 15680, 15625, 15600, 15552, 15435, 15400, + 15360, 15309, 15288, 15120, 15092, 15000, 14976, 14850, 14784, 14742, 14700, 14625, 14580, 14560, 14553, 14336, 14406, 14400, 14256, 14175, 14112, 14080, 14040, 14000, 13860, + 13824, 13750, 13720, 13650, 13608, 13500, 13475, 13440, 13377, 13365, 13312, 13230, 13200, 13125, 13122, 13104, 13000, 12960, 12936, 12800, 12740, 12672, 12636, 12600, + 12544, 12500, 12480, 12474, 12375, 12348, 12320, 12288, 12285, 12250, 12150, 12096, 12005, 12000, 11907, 11880, 11760, 11700, 11664, 11648, 11550, 11520, 11466, 11375, + 11340, 11319, 11264, 11250, 11232, 11200, 11088, 11025, 11000, 10976, 10935, 10920, 10800, 10780, 10752, 10692, 10584, 10560, 10530, 10400, 10395, 10368, 10290, 10240, + 10206, 10192, 10125, 10080, 10000, 9984, 9900, 9604, 9856, 9828, 9800, 9750, 9720, 9702, 9625, 9600, 9555, 9504, 9477, 9450, 9408, 9375, 9360, 9261, 9240, + 9216, 9100, 9072, 9000, 8960, 8918, 8910, 8820, 8800, 8775, 8750, 8748, 8736, 8640, 8624, 8575, 8505, 8448, 8424, 8400, 8320, 8316, 8250, 8232, 8192, 8190, 8125, + 8100, 8085, 8064, 8019, 8000, 7938, 7920, 7875, 7840, 7800, 7776, 7700, 7680, 7644, 7560, 7546, 7500, 7488, 7425, 7392, 7371, 7350, 7290, 7280, 7203, 7200, 7168, + 7128, 7056, 7040, 7020, 7000, 6930, 6912, 6875, 6860, 6825, 6804, 6750, 6720, 6656, 6615, 6600, 6561, 6552, 6500, 6480, 6468, 6400, 6370, 6336, 6318, 6300, + 6272, 6250, 6240, 6237, 6174, 6160, 6144, 6125, 6075, 6048, 6000, 5940, 5880, 5850, 5832, 5824, 5775, 5760, 5670, 5632, 5625, 5616, 5600, 5544, 5500, 5488, + 5460, 5400, 5390, 5376, 5346, 5292, 5280, 5265, 5250, 5200, 5184, 5145, 5120, 5103, 5096, 5040, 5000, 4992, 4950, 4928, 4914, 4900, 4875, 4860, 4851, 4802, + 4800, 4752, 4725, 4704, 4680, 4620, 4608, 4550, 4536, 4500, 4480, 4459, 4455, 4410, 4400, 4375, 4374, 4368, 4320, 4312, 4224, 4212, 4200, 4160, 4158, 4125, + 4116, 4096, 4095, 4050, 4032, 4000, 3969, 3960, 3920, 3900, 3888, 3850, 3840, 3822, 3780, 3773, 3750, 3744, 3696, 3675, 3645, 3640, 3600, 3584, 3564, 3528, + 3520, 3510, 3500, 3465, 3456, 3430, 3402, 3375, 3360, 3328, 3300, 3276, 3250, 3240, 3234, 3200, 3185, 3168, 3159, 3150, 3136, 3125, 3120, 3087, 3080, 3072, + 3024, 3000, 2970, 2940, 2925, 2916, 2912, 2880, 2835, 2816, 2808, 2800, 2772, 2750, 2744, 2730, 2700, 2695, 2688, 2673, 2646, 2640, 2625, 2600, 2592, 2560, + 2548, 2520, 2500, 2496, 2475, 2464, 2457, 2450, 2430, 2401, 2400, 2376, 2352, 2340, 2310, 2304, 2275, 2268, 2250, 2240, 2205, 2200, 2187, 2184, 2160, 2156, + 2112, 2106, 2100, 2080, 2079, 2058, 2048, 2025, 2016, 2000, 1980, 1960, 1950, 1944, 1936, 1925, 1920, 1911, 1890, 1875, 1872, 1848, 1820, 1800, 1792, 1782, + 1764, 1760, 1755, 1750, 1728, 1715, 1701, 1680, 1664, 1650, 1638, 1625, 1620, 1617, 1600, 1584, 1575, 1568, 1560, 1540, 1536, 1512, 1500, 1485, 1470, 1458, + 1456, 1440, 1408, 1404, 1400, 1386, 1375, 1372, 1365, 1350, 1344, 1323, 1320, 1300, 1296, 1280, 1274, 1260, 1250, 1248, 1232, 1225, 1215, 1200, 1188, 1176, + 1170, 1155, 1152, 1134, 1125, 1120, 1100, 1092, 1080, 1078, 1056, 1053, 1050, 1040, 1029, 1024, 1008, 1000, 990, 980, 975, 972, 960, 945, 936, 924, 910, 900, + 896, 891, 882, 880, 875, 864, 840, 832, 825, 819, 810, 800, 792, 784, 780, 770, 768, 756, 750, 735, 729, 728, 720, 704, 702, 700, 693, 686, 675, 672, 660, + 650, 648, 640, 637, 630, 625, 624, 616, 600, 594, 588, 585, 576, 567, 560, 550, 546, 540, 539, 528, 525, 520, 512, 504, 500, 495, 490, 486, 480, 468, 462, 455, + 450, 448, 441, 440, 432, 420, 416, 405, 400, 396, 392, 390, 385, 384, 378, 375, 364, 360, 352, 351, 350, 343, 336, 330, 325, 324, 320, 315, 312, 308, 300, 297, + 294, 288, 280, 275, 273, 270, 264, 260, 256, 252, 250, 245, 243, 240, 234, 231, 225, 224, 220, 216, 210, 208, 200, 198, 196, 195, 192, 189, 182, 180, 176, 175, + 168, 165, 162, 160, 156, 154, 150, 147, 144, 143, 140, 135, 132, 130, 128, 126, 125, 120, 117, 112, 110, 108, 105, 104, 100, 99, 98, 96, 91, 90, 88, 84, 81, + 80, 78, 77, 75, 72, 70, 66, 65, 64, 63, 60, 56, 55, 54, 52, 50, 49, 48, 45, 44, 42, 40, 39, 36, 35, 33, 32, 30, 28, 27, 26, 25, 24, 22, 21, 20, 18, 16, 15, + 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 + }; + +int N_fftwsize = sizeof(fftw_size) / sizeof(fftw_size[0]); + + +void optfft(int N_fftwsize, int &bfh, int &bfw, int &bfhr, int &bfwr, struct local_params& lp, int H, int W, int &xstart, int &ystart, int &xend, int ¥d, int cx, int cy, int fulima) +{ + int ftsizeH = 1; + int ftsizeW = 1; + int deltaw = 150; + int deltah = 150; + + if(W < 4000) { + deltaw = 80; + } + if(H < 4000) { + deltah = 80; + } + + + for (int ft = 0; ft < N_fftwsize; ft++) { //find best values + if (fftw_size[ft] <= bfh) { + ftsizeH = fftw_size[ft]; + break; + } + } + + for (int ft = 0; ft < N_fftwsize; ft++) { + if (fftw_size[ft] <= bfw) { + ftsizeW = fftw_size[ft]; + break; + } + } + + if(fulima == 2) {// if full image, the ftsizeH and ftsizeW is a bit larger (about 10 to 200 pixels) than the image dimensions so that it is fully processed (consumes a bit more resources) + for (int ftfu = 0; ftfu < N_fftwsize; ftfu++) { //find best values + if (fftw_size[ftfu] <= (H + deltah)) { + ftsizeH = fftw_size[ftfu]; + break; + } + } + for (int ftfu = 0; ftfu < N_fftwsize; ftfu++) { //find best values + if (fftw_size[ftfu] <= (W + deltaw)) { + ftsizeW = fftw_size[ftfu]; + break; + } + } + } + + if (settings->verbose) { + if(fulima == 2) { + printf("Full image: ftsizeWF=%i ftsizeH=%i\n", ftsizeW, ftsizeH); + + } else { + printf("ftsizeW=%i ftsizeH=%i\n", ftsizeW, ftsizeH); + } + } + + + //optimize with size fftw + bool reduW = false; + bool reduH = false; + bool exec = true; + if (ystart == 0 && yend < H) { + lp.ly -= (bfh - ftsizeH); + } else if (ystart != 0 && yend == H) { + lp.lyT -= (bfh - ftsizeH); + } else if (ystart != 0 && yend != H) { + if (lp.ly <= lp.lyT) { + lp.lyT -= (bfh - ftsizeH); + } else { + lp.ly -= (bfh - ftsizeH); + } + } else if (ystart == 0 && yend == H) { + // bfhr = ftsizeH; + bfhr = bfh; + reduH = true; + exec = false; + } + + if (xstart == 0 && xend < W) { + lp.lx -= (bfw - ftsizeW); + } else if (xstart != 0 && xend == W) { + lp.lxL -= (bfw - ftsizeW); + } else if (xstart != 0 && xend != W) { + if (lp.lx <= lp.lxL) { + lp.lxL -= (bfw - ftsizeW); + } else { + lp.lx -= (bfw - ftsizeW); + } + } else if (xstart == 0 && xend == W) { + // bfwr = ftsizeW; + bfwr = bfw; + reduW = true; + exec = false; + } + //new values optimized + ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, H); + xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, W); + bfh = bfhr = yend - ystart; + bfw = bfwr = xend - xstart; + + if (reduH && exec) { + bfhr = ftsizeH; + } else { + bfhr = bfh; + } + + if (reduW && exec) { + bfwr = ftsizeW; + } else { + bfwr = bfw; + } +} + +void ImProcFunctions::BlurNoise_Local(LabImage *tmp1, LabImage * originalmask, const float hueref, const float chromaref, const float lumaref, local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) +{ +//local BLUR + //BENCHFUN + + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + + const float ach = lp.trans / 100.f; + const int GW = transformed->W; + const int GH = transformed->H; + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + const bool blshow = lp.showmaskblmet == 1 || lp.showmaskblmet == 2; + const bool previewbl = lp.showmaskblmet == 4; + + //balance deltaE + const float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + + if (lp.colorde == 0) { + lp.colorde = -1;//to avoid black + } + + const float ampli = 1.5f + 0.5f * std::abs(lp.colorde); + + constexpr float darklim = 5000.f; + constexpr float aadark = -1.f; + + const bool usemaskbl = lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 4; + const bool usemaskall = usemaskbl; + const float radius = 3.f / sk; + std::unique_ptr origblurmask; + + const std::unique_ptr origblur(new LabImage(GW, GH)); + + if (usemaskall) { + origblurmask.reset(new LabImage(GW, GH)); + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(originalmask->L, origblurmask->L, GW, GH, radius); + gaussianBlur(originalmask->a, origblurmask->a, GW, GH, radius); + gaussianBlur(originalmask->b, origblurmask->b, GW, GH, radius); + } + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(original->L, origblur->L, GW, GH, radius); + gaussianBlur(original->a, origblur->a, GW, GH, radius); + gaussianBlur(original->b, origblur->b, GW, GH, radius); + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + const LabImage *maskptr = usemaskall ? origblurmask.get() : origblur.get(); + const float mindE = 4.f + MINSCOPE * lp.sensbn * lp.thr;//best usage ?? with blurnoise + const float maxdE = 5.f + MAXSCOPE * lp.sensbn * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = ystart; y < yend; y++) { + const int loy = cy + y; + + for (int x = xstart, lox = cx + x; x < xend; x++, lox++) { + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + const float abdelta2 = SQR(refa - maskptr->a[y][x]) + SQR(refb - maskptr->b[y][x]); + const float chrodelta2 = SQR(std::sqrt(SQR(maskptr->a[y][x]) + SQR(maskptr->b[y][x])) - chromaref * 327.68f); + const float huedelta2 = abdelta2 - chrodelta2; + const float dE = std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - maskptr->L[y][x])); + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, lp.sensbn); + + float difL = (tmp1->L[y - ystart][x - xstart] - original->L[y][x]) * localFactor * reducdE; + transformed->L[y][x] = CLIP(original->L[y][x] + difL); + const float difa = (tmp1->a[y - ystart][x - xstart] - original->a[y][x]) * localFactor * reducdE; + const float difb = (tmp1->b[y - ystart][x - xstart] - original->b[y][x]) * localFactor * reducdE; + + transformed->a[y][x] = clipC(original->a[y][x] + difa); + transformed->b[y][x] = clipC(original->b[y][x] + difb); + + const float maxdifab = rtengine::max(std::fabs(difa), std::fabs(difb)); + + if (blshow && lp.colorde < 0) { //show modifications with use "b" + // (origshow && lp.colorde < 0) { //original Retinex + transformed->a[y][x] = 0.f; + transformed->b[y][x] = ampli * 8.f * difL * reducdE; + transformed->L[y][x] = CLIP(12000.f + 0.5f * ampli * difL); + + } else if (blshow && lp.colorde > 0) {//show modifications without use "b" + if (difL < 1000.f) {//if too low to be view use ab + difL += 0.5f * maxdifab; + } + + transformed->L[y][x] = CLIP(12000.f + 0.5f * ampli * difL); + transformed->a[y][x] = clipC(ampli * difa); + transformed->b[y][x] = clipC(ampli * difb); + } else if (previewbl || lp.prevdE) {//show deltaE + const float difbdisp = reducdE * 10000.f * lp.colorde; + + if (transformed->L[y][x] < darklim) { //enhance dark luminance as user can see! + float dark = transformed->L[y][x]; + transformed->L[y][x] = dark * aadark + darklim; + } + + if (lp.colorde <= 0) { + transformed->a[y][x] = 0.f; + transformed->b[y][x] = difbdisp; + } else { + transformed->a[y][x] = -difbdisp; + transformed->b[y][x] = 0.f; + } + } + } + } + } +} + +void ImProcFunctions::transit_shapedetect2(int sp, float meantm, float stdtm, int call, int senstype, const LabImage * bufexporig, const LabImage * bufexpfin, LabImage * originalmask, const float hueref, const float chromaref, const float lumaref, float sobelref, float meansobel, float ** blend2, struct local_params & lp, LabImage * original, LabImage * transformed, int cx, int cy, int sk) +{ + //initialize coordinates + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfw = xend - xstart; + int bfh = yend - ystart; + + int bfhr = bfh; + int bfwr = bfw; + if (lp.blurcolmask >= 0.25f && lp.fftColorMask && call == 2) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + bfh = bfhr; + bfw = bfwr; + + //initialize scope + float varsens = lp.sensex;//exposure + + if (senstype == 0) { //Color and light + varsens = lp.sens; + } else if (senstype == 2) { //vibrance + varsens = lp.sensv; + } else if (senstype == 9) { //shadowshighlight + varsens = lp.senshs; + } else if (senstype == 3) { //softlight + varsens = lp.senssf; + } else if (senstype == 30) { //dehaze + varsens = lp.sensh; + } else if (senstype == 8) { //TM + varsens = lp.senstm; + } else if (senstype == 10) { //local contrast + varsens = lp.senslc; + } else if (senstype == 11) { //encoding log + varsens = lp.sensilog; + } else if (senstype == 20) { //common mask + varsens = lp.sensimas; + } else if (senstype == 31) { //ciecam + varsens = lp.sensicie; + } + bool delt = lp.deltaem; + //sobel + sobelref /= 100.f; + meansobel /= 100.f; + + sobelref = rtengine::min(sobelref, 60.f); + + const bool k = !(sobelref < meansobel && sobelref < lp.stru); //does not always work with noisy images + + sobelref = log1p(sobelref); + + //references Spot + const float refa = chromaref * cos(hueref) * 327.68f; + const float refb = chromaref * sin(hueref) * 327.68f; + const float refL = lumaref * 327.68f; + + //to preview modifications, scope, mask + const bool expshow = ((lp.showmaskexpmet == 1 || lp.showmaskexpmet == 2) && senstype == 1); + const bool vibshow = ((lp.showmaskvibmet == 1 || lp.showmaskvibmet == 2) && senstype == 2); + const bool colshow = ((lp.showmaskcolmet == 1 || lp.showmaskcolmet == 2) && senstype == 0); + const bool SHshow = ((lp.showmaskSHmet == 1 || lp.showmaskSHmet == 2) && senstype == 9); + const bool tmshow = ((lp.showmasktmmet == 1 || lp.showmasktmmet == 2) && senstype == 8); + const bool lcshow = ((lp.showmasklcmet == 1 || lp.showmasklcmet == 2) && senstype == 10); + const bool origshow = ((lp.showmasksoftmet == 5) && senstype == 3 && lp.softmet == 1); + const bool logshow = ((lp.showmasklogmet == 1 || lp.showmasklogmet == 2) && senstype == 11); + const bool cieshow = ((lp.showmaskciemet == 1 || lp.showmaskciemet == 2) && senstype == 31); + + const bool masshow = ((lp.showmask_met == 1) && senstype == 20); + + const bool previewvib = ((lp.showmaskvibmet == 4) && senstype == 2); + const bool previewexp = ((lp.showmaskexpmet == 5) && senstype == 1); + const bool previewcol = ((lp.showmaskcolmet == 5) && senstype == 0); + const bool previewSH = ((lp.showmaskSHmet == 4) && senstype == 9); + const bool previewtm = ((lp.showmasktmmet == 4) && senstype == 8); + const bool previewlc = ((lp.showmasklcmet == 4) && senstype == 10); + const bool previeworig = ((lp.showmasksoftmet == 6) && senstype == 3 && lp.softmet == 1); + const bool previewmas = ((lp.showmask_met == 3) && senstype == 20); + const bool previewlog = ((lp.showmasklogmet == 4) && senstype == 11); + const bool previewcie = ((lp.showmaskciemet == 4) && senstype == 31); + + float radius = 3.f / sk; + + if (senstype == 1) { + radius = (2.f + 0.2f * lp.blurexp) / sk; + } else if (senstype == 0) { + radius = (2.f + 0.2f * lp.blurcol) / sk; + } else if (senstype == 9) { + radius = (2.f + 0.2f * lp.blurSH) / sk; + } + + const std::unique_ptr origblur(new LabImage(bfw, bfh)); + std::unique_ptr origblurmask; + + //balance deltaE + float kL = lp.balance / SQR(327.68f); + const float kab = balancedeltaE(lp.balance) / SQR(327.68f); + const float kH = lp.balanceh; + const float kch = balancedeltaE(kH); + + if (lp.colorde == 0) { + lp.colorde = -1;//to avoid black + } + + float ampli = 1.f + std::abs(lp.colorde); + ampli = 2.f + 0.5f * (ampli - 2.f); + + float darklim = 5000.f; + float aadark = -1.f; + float bbdark = darklim; + bool usemask = true; + if(originalmask == nullptr) { + usemask = false; + } + const bool usemaskvib = (lp.showmaskvibmet == 2 || lp.enavibMask || lp.showmaskvibmet == 4) && senstype == 2; + const bool usemaskexp = (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 5) && senstype == 1; + const bool usemaskcol = (lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 5) && senstype == 0; + const bool usemaskSH = (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 4) && senstype == 9; + const bool usemasktm = (lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 4) && senstype == 8; + const bool usemasklc = (lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 4) && senstype == 10; + const bool usemaskmas = (lp.showmask_met == 1 || lp.ena_Mask || lp.showmask_met == 3) && senstype == 20; + const bool usemasklog = (lp.showmasklogmet == 2 || lp.enaLMask || lp.showmasklogmet == 4) && senstype == 11; + const bool usemaskcie = (lp.showmaskciemet == 2 || lp.enacieMask || lp.showmaskciemet == 4) && senstype == 31; + const bool usemaskall = usemask && (usemaskexp || usemaskvib || usemaskcol || usemaskSH || usemasktm || usemasklc || usemasklog || usemaskcie || usemaskmas); + //blur a little mask + if (usemaskall) { + origblurmask.reset(new LabImage(bfw, bfh)); + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(originalmask->L, origblurmask->L, bfw, bfh, radius); + gaussianBlur(originalmask->a, origblurmask->a, bfw, bfh, radius); + gaussianBlur(originalmask->b, origblurmask->b, bfw, bfh, radius); + } + } + + + + if (lp.equtm && senstype == 8) { //normalize luminance for Tone mapping , at this place we can use for others senstype! + float *datain = new float[bfh * bfw]; + float *data = new float[bfh * bfw]; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = ystart; y < yend; y++) + for (int x = xstart; x < xend; x++) { + datain[(y - ystart) * bfw + (x - xstart)] = original->L[y][x]; + data[(y - ystart)* bfw + (x - xstart)] = bufexpfin->L[y - ystart][x - xstart]; + } + if(call == 3 || call == 2) {//improccoordinator and simpleprocess + normalize_mean_dt(data, datain, bfw * bfh, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f); + } else if(call == 1) {//dcrop + float ma = meantm; + float sa = stdtm; + float ma2 = (float) params->locallab.spots.at(sp).noiselumc; + float sa2 = (float) params->locallab.spots.at(sp).softradiustm; + //printf("ma=%f sa=%f ma2=%f sa2=%f\n", (double) ma, (double) sa, (double) ma2, (double) sa2); + //use normalize with mean and stdv + normalize_mean_dt(data, datain, bfw * bfh, 1.f, 1.f, ma, sa, ma2, sa2); + } + + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = ystart; y < yend; y++) + for (int x = xstart; x < xend; x++) { + bufexpfin->L[y - ystart][x - xstart] = data[(y - ystart) * bfw + x - xstart]; + } + + delete [] datain; + delete [] data; + } + + + if (senstype == 8) {//strength Tone mapping + const float repart = 1.0f - 0.01f * lp.repartm; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + + for (int y = ystart; y < yend; y++){ + for (int x = xstart; x < xend; x++) { + bufexpfin->L[y - ystart][x - xstart]= intp(repart, original->L[y][x], bufexpfin->L[y - ystart][x - xstart]); + bufexpfin->a[y - ystart][x - xstart]= intp(repart, original->a[y][x], bufexpfin->a[y - ystart][x - xstart]); + bufexpfin->b[y - ystart][x - xstart]= intp(repart, original->b[y][x], bufexpfin->b[y - ystart][x - xstart]); + } + } + } + + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + origblur->L[y][x] = original->L[y + ystart][x + xstart]; + origblur->a[y][x] = original->a[y + ystart][x + xstart]; + origblur->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + gaussianBlur(origblur->L, origblur->L, bfw, bfh, radius); + gaussianBlur(origblur->a, origblur->a, bfw, bfh, radius); + gaussianBlur(origblur->b, origblur->b, bfw, bfh, radius); + + } + + + //choice between original and mask + const LabImage *maskptr = usemaskall ? origblurmask.get() : origblur.get(); + + //parameters deltaE + //increase a bit lp.thr and lp.iterat and kL if HDR only with log encoding and CAM16 Jz + if(senstype == 11 || senstype == 31) { + lp.thr *= 1.2f; + lp.iterat *= 1.2f; + kL *= 1.2f; + } + + const float mindE = 2.f + MINSCOPE * varsens * lp.thr; + const float maxdE = 5.f + MAXSCOPE * varsens * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ +// float atan2Buffer[transformed->W] ALIGNED16;//keep in case of +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < bfh; y++) { + + const int loy = y + ystart + cy; +#ifdef __SSE2__ + /* //keep in case of + int i = 0; + + for (; i < bfw - 3; i += 4) { + vfloat av = LVFU(maskptr->a[y][i]); + vfloat bv = LVFU(maskptr->b[y][i]); + STVFU(atan2Buffer[i], xatan2f(bv, av)); + } + + for (; i < bfw; i++) { + atan2Buffer[i] = xatan2f(maskptr->b[y][i], maskptr->a[y][i]); + } + */ +#endif + + for (int x = 0; x < bfw; x++) { + const int lox = x + xstart + cx; + int zone; + float localFactor = 1.f; + const float achm = lp.trans / 100.f; + + //calculate transition + if (lp.shapmet == 0) { + calcTransition(lox, loy, achm, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, achm, lp, zone, localFactor); + } + +// float hueh = 0; +#ifdef __SSE2__ +// hueh = atan2Buffer[x]; +#else +// hueh = xatan2f(maskptr->b[y][x], maskptr->a[y][x]); +#endif + + float rsob = 0.f; + + //calculate additive sobel to deltaE + if (blend2 && ((senstype == 1 && lp.struexp > 0.f) || ((senstype == 0) && lp.struco > 0.f))) { + const float csob = xlogf(1.f + rtengine::min(blend2[y][x] / 100.f, 60.f) + 0.001f); + + float rs; + + if (k) { + rs = sobelref / csob; + } else { + rs = csob / sobelref; + } + + if (rs > 0.f && senstype == 1) { + rsob = 1.1f * lp.struexp * rs; + } else if (rs > 0.f && (senstype == 0)) { + rsob = 1.1f * lp.struco * rs; + } + } + + + //deltaE + float abdelta2 = SQR(refa - maskptr->a[y][x]) + SQR(refb - maskptr->b[y][x]); + float chrodelta2 = SQR(std::sqrt(SQR(maskptr->a[y][x]) + SQR(maskptr->b[y][x])) - (chromaref * 327.68f)); + float huedelta2 = abdelta2 - chrodelta2; + + const float dE = rsob + std::sqrt(kab * (kch * chrodelta2 + kH * huedelta2) + kL * SQR(refL - maskptr->L[y][x])); + //reduction action with deltaE + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, varsens); + + float cli = (bufexpfin->L[y][x] - bufexporig->L[y][x]); + float cla = (bufexpfin->a[y][x] - bufexporig->a[y][x]); + float clb = (bufexpfin->b[y][x] - bufexporig->b[y][x]); + + if (delt) { + cli = bufexpfin->L[y][x] - original->L[y + ystart][x + xstart]; + cla = bufexpfin->a[y][x] - original->a[y + ystart][x + xstart]; + clb = bufexpfin->b[y][x] - original->b[y + ystart][x + xstart]; + } + if(lp.blwh) { + cla = 0.f; + clb = 0.f; + } + + // const float previewint = settings->previewselection; + + const float realstrdE = reducdE * cli; + const float realstradE = reducdE * cla; + const float realstrbdE = reducdE * clb; + + float factorx = localFactor; + + if (zone > 0) { + //simplified transformed with deltaE and transition + transformed->L[y + ystart][x + xstart] = clipLoc(original->L[y + ystart][x + xstart] + factorx * realstrdE); + float diflc = factorx * realstrdE; + transformed->a[y + ystart][x + xstart] = clipC(original->a[y + ystart][x + xstart] + factorx * realstradE); + const float difa = factorx * realstradE; + transformed->b[y + ystart][x + xstart] = clipC(original->b[y + ystart][x + xstart] + factorx * realstrbdE); + const float difb = factorx * realstrbdE; + float maxdifab = rtengine::max(std::fabs(difa), std::fabs(difb)); + + if ((expshow || vibshow || colshow || SHshow || tmshow || lcshow || logshow || cieshow || origshow || masshow) && lp.colorde < 0) { //show modifications with use "b" + // (origshow && lp.colorde < 0) { //original Retinex + transformed->a[y + ystart][x + xstart] = 0.f; + transformed->b[y + ystart][x + xstart] = ampli * 8.f * diflc * reducdE; + transformed->L[y + ystart][x + xstart] = CLIP(12000.f + 0.5f * ampli * diflc); + + } else if ((expshow || vibshow || colshow || SHshow || tmshow || lcshow || logshow || cieshow || origshow || masshow) && lp.colorde > 0) {//show modifications without use "b" + if (diflc < 1000.f) {//if too low to be view use ab + diflc += 0.5f * maxdifab; + } + + transformed->L[y + ystart][x + xstart] = CLIP(12000.f + 0.5f * ampli * diflc); + transformed->a[y + ystart][x + xstart] = clipC(ampli * difa); + transformed->b[y + ystart][x + xstart] = clipC(ampli * difb); + } else if (previewexp || previewvib || previewcol || previewSH || previewtm || previewlc || previewlog || previewcie || previeworig || previewmas || lp.prevdE) {//show deltaE + float difbdisp = reducdE * 10000.f * lp.colorde; + + if (transformed->L[y + ystart][x + xstart] < darklim) { //enhance dark luminance as user can see! + float dark = transformed->L[y + ystart][x + xstart]; + transformed->L[y + ystart][x + xstart] = dark * aadark + bbdark; + } + + if (lp.colorde <= 0) { + transformed->a[y + ystart][x + xstart] = 0.f; + transformed->b[y + ystart][x + xstart] = difbdisp; + } else { + transformed->a[y + ystart][x + xstart] = -difbdisp; + transformed->b[y + ystart][x + xstart] = 0.f; + } + } + } + } + } + } +} + + + + +void ImProcFunctions::exposure_pde(float * dataor, float * datain, float * dataout, int bfw, int bfh, float thresh, float mod) +/* Jacques Desmis July 2019 +** adapted from Ipol Copyright 2009-2011 IPOL Image Processing On Line http://www.ipol.im/ +*/ +{ + + //BENCHFUN +#ifdef RT_FFTW3F_OMP + if (multiThread) { + fftwf_init_threads(); + fftwf_plan_with_nthreads(omp_get_max_threads()); + } + +#endif + float *data_fft, *data_tmp, *data; + + if (NULL == (data_tmp = (float *) fftwf_malloc(sizeof(float) * bfw * bfh))) { + fprintf(stderr, "allocation error\n"); + abort(); + } + + ImProcFunctions::discrete_laplacian_threshold(data_tmp, datain, bfw, bfh, thresh); + + if (NULL == (data_fft = (float *) fftwf_malloc(sizeof(float) * bfw * bfh))) { + fprintf(stderr, "allocation error\n"); + abort(); + } + + if (NULL == (data = (float *) fftwf_malloc(sizeof(float) * bfw * bfh))) { + fprintf(stderr, "allocation error\n"); + abort(); + } + + const auto dct_fw = fftwf_plan_r2r_2d(bfh, bfw, data_tmp, data_fft, FFTW_REDFT10, FFTW_REDFT10, FFTW_ESTIMATE | FFTW_DESTROY_INPUT); + fftwf_execute(dct_fw); + + fftwf_free(data_tmp); + + /* solve the Poisson PDE in Fourier space */ + /* 1. / (float) (bfw * bfh)) is the DCT normalisation term, see libfftw */ + ImProcFunctions::rex_poisson_dct(data_fft, bfw, bfh, 1. / (double)(bfw * bfh)); + + const auto dct_bw = fftwf_plan_r2r_2d(bfh, bfw, data_fft, data, FFTW_REDFT01, FFTW_REDFT01, FFTW_ESTIMATE | FFTW_DESTROY_INPUT); + fftwf_execute(dct_bw); + fftwf_destroy_plan(dct_fw); + fftwf_destroy_plan(dct_bw); + fftwf_free(data_fft); + fftwf_cleanup(); + +#ifdef RT_FFTW3F_OMP + if (multiThread) { + fftwf_cleanup_threads(); + } +#endif + + normalize_mean_dt(data, dataor, bfw * bfh, mod, 1.f, 0.f, 0.f, 0.f, 0.f); + { + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + dataout[y * bfw + x] = clipLoc(data[y * bfw + x]); + } + } + } + + fftwf_free(data); +} + +void ImProcFunctions::fftw_convol_blur(float * input, float * output, int bfw, int bfh, float radius, int fftkern, int algo) +{ + /* + ** Jacques Desmis june 2019 - inspired by Copyright 2013 IPOL Image Processing On Line http://www.ipol.im/ + ** when I read documentation on various FFT blur we found 2 possibilities + ** 0) kernel gauss is used with "normal" data + ** 1) kernel gauss is used with FFT + ** fftkern allows to change 0) or 1) and test It seems the good solution is with 0, but I keep the code in case of ?? + + ** input real data to blur + ** output real data blurred with radius + ** bfw bfh width and high area + ** radius = sigma for kernel + ** n_x n_y relative width and high for kernel + ** Gaussian blur is given by G(x,y) = (1/2*PI*sigma) * exp(-(x2 + y2) / 2* sigma2) + ** its traduction in Fourier transform is G(x,y) = exp((-sigma)*(PI * x2 + PI * y2)), for some authors it is not sigma but sigma^2..I have tried...huge differences with Gaussianblur + ** after several test the only result that works very well is with fftkern = 0 and algo = 0, and as there is differences with Gaussianblur, I put an empirical correction in Ipretinex and Iplocalcontrast + ** you can enabled or disabled this function with rtsettings.fftwsigma in options. By default empirical formula is disabled + ** in fact no importance....if it is this function (for sigma) or another... we are not in research :) + */ + //BENCHFUN + +#ifdef RT_FFTW3F_OMP + if (multiThread) { + fftwf_init_threads(); + fftwf_plan_with_nthreads(omp_get_max_threads()); + } +#endif + + + float *out; //for FFT data + float *kern = nullptr;//for kernel gauss + float *outkern = nullptr;//for FFT kernel + fftwf_plan p; + fftwf_plan pkern;//plan for FFT + int image_size, image_sizechange; + float n_x = 1.f; + float n_y = 1.f;//relative coordinates for kernel Gauss + float radsig = 1.f; + + out = (float*) fftwf_malloc(sizeof(float) * (bfw * bfh));//allocate real data for FFT + + if (fftkern == 1) { //allocate memory FFT if kernel fft = 1 + // kern = new float[bfw * bfh]; + kern = (float*) fftwf_malloc(sizeof(float) * (bfw * bfh));//allocate real data for FFT + outkern = (float*) fftwf_malloc(sizeof(float) * (bfw * bfh));//allocate real data for FFT + } + + /*compute the Fourier transform of the input data*/ + + p = fftwf_plan_r2r_2d(bfh, bfw, input, out, FFTW_REDFT10, FFTW_REDFT10, FFTW_ESTIMATE);//FFT 2 dimensions forward FFTW_MEASURE FFTW_ESTIMATE + + fftwf_execute(p); + fftwf_destroy_plan(p); + + /*define the gaussian constants for the convolution kernel*/ + if (algo == 0) { + n_x = rtengine::RT_PI / (double) bfw; //ipol + n_y = rtengine::RT_PI / (double) bfh; + } else if (algo == 1) { + n_x = 1.f / bfw; //gauss + n_y = 1.f / bfh; + radsig = 1.f / (2.f * rtengine::RT_PI_F * radius * radius);//gauss + } + + n_x = n_x * n_x; + n_y = n_y * n_y; + + image_size = bfw * bfh; + image_sizechange = 4 * image_size; + + if (fftkern == 1) { //convolution with FFT kernel +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int j = 0; j < bfh; j++) { + int index = j * bfw; + + for (int i = 0; i < bfw; i++) + if (algo == 0) { + kern[ i + index] = exp((float)(-radius) * (n_x * i * i + n_y * j * j)); //calculate Gauss kernel Ipol formula + } else if (algo == 1) { + kern[ i + index] = radsig * exp((float)(-(n_x * i * i + n_y * j * j) / (2.f * radius * radius))); //calculate Gauss kernel with Gauss formula + } + } + + /*compute the Fourier transform of the kernel data*/ + pkern = fftwf_plan_r2r_2d(bfh, bfw, kern, outkern, FFTW_REDFT10, FFTW_REDFT10, FFTW_ESTIMATE); //FFT 2 dimensions forward + fftwf_execute(pkern); + fftwf_destroy_plan(pkern); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int j = 0; j < bfh; j++) { + int index = j * bfw; + + for (int i = 0; i < bfw; i++) { + out[i + index] *= outkern[i + index]; //apply Gauss kernel with FFT + } + } + + fftwf_free(outkern); + fftwf_free(kern); + + // delete [] kern; + + } else if (fftkern == 0) {//without FFT kernel + if (algo == 0) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int j = 0; j < bfh; j++) { + int index = j * bfw; + + for (int i = 0; i < bfw; i++) { + out[i + index] *= exp((float)(-radius) * (n_x * i * i + n_y * j * j)); //apply Gauss kernel without FFT - some authors says radius*radius but differences with Gaussianblur + } + } + } else if (algo == 1) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int j = 0; j < bfh; j++) { + int index = j * bfw; + + for (int i = 0; i < bfw; i++) { + out[i + index] *= radsig * exp((float)(-(n_x * i * i + n_y * j * j) / (2.f * radius * radius))); //calculate Gauss kernel with Gauss formula + } + } + } + } + + p = fftwf_plan_r2r_2d(bfh, bfw, out, output, FFTW_REDFT01, FFTW_REDFT01, FFTW_ESTIMATE);//FFT 2 dimensions backward + fftwf_execute(p); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int index = 0; index < image_size; index++) { //restore data + output[index] /= image_sizechange; + } + + fftwf_destroy_plan(p); + fftwf_free(out); + +#ifdef RT_FFTW3F_OMP + if (multiThread) { + fftwf_cleanup_threads(); + } +#endif +} + +void ImProcFunctions::fftw_convol_blur2(float **input2, float **output2, int bfw, int bfh, float radius, int fftkern, int algo) +{ + MyMutex::MyLock lock(*fftwMutex); + + float *input = nullptr; + + if (NULL == (input = (float *) fftwf_malloc(sizeof(float) * bfw * bfh))) { + fprintf(stderr, "allocation error\n"); + abort(); + } + + float *output = nullptr; + + if (NULL == (output = (float *) fftwf_malloc(sizeof(float) * bfw * bfh))) { + fprintf(stderr, "allocation error\n"); + abort(); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + input[y * bfw + x] = input2[y][x]; + } + } + + ImProcFunctions::fftw_convol_blur(input, output, bfw, bfh, radius, fftkern, algo); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + output2[y][x] = output[y * bfw + x]; + } + } + + fftwf_free(input); + fftwf_free(output); +} + + +void ImProcFunctions::fftw_tile_blur(int GW, int GH, int tilssize, int max_numblox_W, int min_numblox_W, float **tmp1, int numThreads, double radius) +{ + //BENCHFUN + float epsil = 0.001f / (tilssize * tilssize); + fftwf_plan plan_forward_blox[2]; + fftwf_plan plan_backward_blox[2]; + + array2D tilemask_in(tilssize, tilssize); + array2D tilemask_out(tilssize, tilssize); + + float *Lbloxtmp = reinterpret_cast(fftwf_malloc(max_numblox_W * tilssize * tilssize * sizeof(float))); + float *fLbloxtmp = reinterpret_cast(fftwf_malloc(max_numblox_W * tilssize * tilssize * sizeof(float))); + + int nfwd[2] = {tilssize, tilssize}; + + //for DCT: + fftw_r2r_kind fwdkind[2] = {FFTW_REDFT10, FFTW_REDFT10}; + fftw_r2r_kind bwdkind[2] = {FFTW_REDFT01, FFTW_REDFT01}; + + // Creating the plans with FFTW_MEASURE instead of FFTW_ESTIMATE speeds up the execute a bit + plan_forward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, Lbloxtmp, nullptr, 1, tilssize * tilssize, fLbloxtmp, nullptr, 1, tilssize * tilssize, fwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, nullptr, 1, tilssize * tilssize, Lbloxtmp, nullptr, 1, tilssize * tilssize, bwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, nullptr, 1, tilssize * tilssize, fLbloxtmp, nullptr, 1, tilssize * tilssize, fwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, nullptr, 1, tilssize * tilssize, Lbloxtmp, nullptr, 1, tilssize * tilssize, bwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + fftwf_free(Lbloxtmp); + fftwf_free(fLbloxtmp); + const int border = rtengine::max(2, tilssize / 16); + + for (int i = 0; i < tilssize; ++i) { + float i1 = abs((i > tilssize / 2 ? i - tilssize + 1 : i)); + float vmask = (i1 < border ? SQR(sin((rtengine::RT_PI_F * i1) / (2 * border))) : 1.0f); + float vmask2 = (i1 < 2 * border ? SQR(sin((rtengine::RT_PI_F * i1) / (2 * border))) : 1.0f); + + for (int j = 0; j < tilssize; ++j) { + float j1 = abs((j > tilssize / 2 ? j - tilssize + 1 : j)); + tilemask_in[i][j] = (vmask * (j1 < border ? SQR(sin((rtengine::RT_PI_F * j1) / (2 * border))) : 1.0f)) + epsil; + tilemask_out[i][j] = (vmask2 * (j1 < 2 * border ? SQR(sin((rtengine::RT_PI_F * j1) / (2 * border))) : 1.0f)) + epsil; + + } + } + + float *LbloxArray[numThreads]; + float *fLbloxArray[numThreads]; + + const int numblox_W = ceil((static_cast(GW)) / offset) + 2; + const int numblox_H = ceil((static_cast(GH)) / offset) + 2; + + array2D Lresult(GW, GH, ARRAY2D_CLEAR_DATA); + array2D totwt(GW, GH, ARRAY2D_CLEAR_DATA); //weight for combining DCT blocks + + for (int i = 0; i < numThreads; ++i) { + LbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * tilssize * tilssize * sizeof(float))); + fLbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * tilssize * tilssize * sizeof(float))); + } + +#ifdef _OPENMP + int masterThread = omp_get_thread_num(); +#endif +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef _OPENMP + int subThread = masterThread * 1 + omp_get_thread_num(); +#else + int subThread = 0; +#endif + float *Lblox = LbloxArray[subThread]; + float *fLblox = fLbloxArray[subThread]; + float pBuf[GW + tilssize + 2 * offset] ALIGNED16; +#ifdef _OPENMP + #pragma omp for +#endif + for (int vblk = 0; vblk < numblox_H; ++vblk) { + + int top = (vblk - 1) * offset; + float * datarow = pBuf + offset; + + for (int i = 0; i < tilssize; ++i) { + int row = top + i; + int rr = row; + + if (row < 0) { + rr = rtengine::min(-row, GH - 1); + } else if (row >= GH) { + rr = rtengine::max(0, 2 * GH - 2 - row); + } + + for (int j = 0; j < GW; ++j) { + datarow[j] = (tmp1[rr][j]); + } + + for (int j = -1 * offset; j < 0; ++j) { + datarow[j] = datarow[rtengine::min(-j, GW - 1)]; + } + + for (int j = GW; j < GW + tilssize + offset; ++j) { + datarow[j] = datarow[rtengine::max(0, 2 * GW - 2 - j)]; + }//now we have a padded data row + + for (int hblk = 0; hblk < numblox_W; ++hblk) { + int left = (hblk - 1) * offset; + int indx = (hblk) * tilssize; //index of block in malloc + + if (top + i >= 0 && top + i < GH) { + int j; + + for (j = 0; j < rtengine::min((-left), tilssize); ++j) { + Lblox[(indx + i)*tilssize + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + } + + for (; j < rtengine::min(tilssize, GW - left); ++j) { + Lblox[(indx + i)*tilssize + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + totwt[top + i][left + j] += tilemask_in[i][j] * tilemask_out[i][j]; + } + + for (; j < tilssize; ++j) { + Lblox[(indx + i)*tilssize + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + } + } else { + for (int j = 0; j < tilssize; ++j) { + Lblox[(indx + i)*tilssize + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + } + } + + } + + }//end of filling block row + + //fftwf_print_plan (plan_forward_blox); + if (numblox_W == max_numblox_W) { + fftwf_execute_r2r(plan_forward_blox[0], Lblox, fLblox); // DCT an entire row of tiles + } else { + fftwf_execute_r2r(plan_forward_blox[1], Lblox, fLblox); // DCT an entire row of tiles + } + + const float n_xy = rtengine::SQR(rtengine::RT_PI / tilssize); + + //radius = 30.f; + for (int hblk = 0; hblk < numblox_W; ++hblk) { + int blkstart = hblk * tilssize * tilssize; + + for (int j = 0; j < tilssize; j++) { + int index = j * tilssize; + + for (int i = 0; i < tilssize; i++) { + fLblox[blkstart + index + i] *= exp((float)(-radius) * (n_xy * rtengine::SQR(i) + n_xy * rtengine::SQR(j))); + } + } + }//end of horizontal block loop + + //now perform inverse FT of an entire row of blocks + if (numblox_W == max_numblox_W) { + fftwf_execute_r2r(plan_backward_blox[0], fLblox, Lblox); //for DCT + } else { + fftwf_execute_r2r(plan_backward_blox[1], fLblox, Lblox); //for DCT + } + + int topproc = (vblk - 1) * offset; + const int lnumblox_W = ceil((static_cast(GW)) / offset); + const float DCTnorm = 1.0f / (4 * tilssize * tilssize); //for DCT + + int imin = rtengine::max(0, - topproc); + int bottom = rtengine::min(topproc + tilssize, GH); + int imax = bottom - topproc; + + for (int i = imin; i < imax; ++i) { + for (int hblk = 0; hblk < lnumblox_W; ++hblk) { + int left = (hblk - 1) * offset; + int right = rtengine::min(left + tilssize, GW); + int jmin = rtengine::max(0, -left); + int jmax = right - left; + int indx = hblk * tilssize; + + for (int j = jmin; j < jmax; ++j) { + Lresult[topproc + i][left + j] += tilemask_out[i][j] * Lblox[(indx + i) * tilssize + j] * DCTnorm; //for DCT + } + } + } + }//end of vertical block loop + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + tmp1[i][j] = Lresult[i][j] / totwt[i][j]; + tmp1[i][j] = clipLoc(tmp1[i][j]); + } + } + + for (int i = 0; i < numThreads; ++i) { + fftwf_free(LbloxArray[i]); + fftwf_free(fLbloxArray[i]); + } + + fftwf_destroy_plan(plan_forward_blox[0]); + fftwf_destroy_plan(plan_backward_blox[0]); + fftwf_destroy_plan(plan_forward_blox[1]); + fftwf_destroy_plan(plan_backward_blox[1]); + fftwf_cleanup(); +} + +void ImProcFunctions::wavcbd(wavelet_decomposition &wdspot, int level_bl, int maxlvl, + const LocwavCurve& locconwavCurve, bool locconwavutili, float sigm, float offs, float chromalev, int sk) +{ + if (locconwavCurve && locconwavutili) { + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; +#endif + Evaluate2(wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) if (multiThread) +#endif + for (int dir = 1; dir < 4; dir++) { + for (int level = level_bl; level < maxlvl; ++level) { + const int W_L = wdspot.level_W(level); + const int H_L = wdspot.level_H(level); + float mea[9]; + + float* const* wav_L = wdspot.level_coeffs(level); + //offset + float rap = offs * mean[level] - 2.f * sigm * sigma[level]; + + if (rap > 0.f) { + mea[0] = rap; + } else { + mea[0] = mean[level] / 6.f; + } + + rap = offs * mean[level] - sigm * sigma[level]; + + if (rap > 0.f) { + mea[1] = rap; + } else { + mea[1] = mean[level] / 2.f; + } + + mea[2] = offs * mean[level]; // 50% data + mea[3] = offs * mean[level] + sigm * sigma[level] / 2.f; + mea[4] = offs * mean[level] + sigm * sigma[level]; //66% + mea[5] = offs * mean[level] + sigm * 1.2f * sigma[level]; + mea[6] = offs * mean[level] + sigm * 1.5f * sigma[level]; // + mea[7] = offs * mean[level] + sigm * 2.f * sigma[level]; //95% + mea[8] = offs * mean[level] + sigm * 2.5f * sigma[level]; //99% + + float cpMul = 200.f * (locconwavCurve[level * 55.5f] - 0.5f); + + if (cpMul > 0.f) { + cpMul *= 3.5f; + } + + cpMul /= sk; + + for (int i = 0; i < W_L * H_L; i++) { + const float WavCL = std::fabs(wav_L[dir][i]); + float beta; + + //reduction amplification: max action between mean / 2 and mean + sigma + // arbitrary coefficient, we can add a slider !! + if (WavCL < mea[0]) { + beta = 0.6f; //preserve very low contrast (sky...) + } else if (WavCL < mea[1]) { + beta = 0.8f; + } else if (WavCL < mea[2]) { + beta = 1.f; //standard + } else if (WavCL < mea[3]) { + beta = 1.f; + } else if (WavCL < mea[4]) { + beta = 0.8f; //+sigma + } else if (WavCL < mea[5]) { + beta = 0.6f; + } else if (WavCL < mea[6]) { + beta = 0.4f; + } else if (WavCL < mea[7]) { + beta = 0.2f; // + 2 sigma + } else if (WavCL < mea[8]) { + beta = 0.1f; + } else { + beta = 0.0f; + } + + const float alpha = rtengine::max((1024.f + 15.f * cpMul * beta) / 1024.f, 0.02f) ; + wav_L[dir][i] *= alpha * chromalev; + } + } + } + } +} + +void ImProcFunctions::Compresslevels(float **Source, int W_L, int H_L, float compression, float detailattenuator, float thres, float mean, float maxp, float meanN, float maxN, float madL) +{ + //J.Desmis 12-2019 + + float exponent; + + if (detailattenuator > 0.f && detailattenuator < 0.05f) { + const float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; //0.69315 = log(2) + exponent = 1.2f * xlogf(-betemp); + exponent /= 20.f; + } else if (detailattenuator >= 0.05f && detailattenuator < 0.25f) { + const float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; + exponent = 1.2f * xlogf(-betemp); + exponent /= (-75.f * detailattenuator + 23.75f); + } else if (detailattenuator >= 0.25f) { + const float betemp = expf(-(2.f - detailattenuator + 0.693147f)) - 1.f; + exponent = 1.2f * xlogf(-betemp); + exponent /= (-2.f * detailattenuator + 5.5f); + } else { + exponent = (compression - 1.0f) / 20.f; + } + + float ap = (thres - 1.f) / (maxp - mean); + float bp = 1.f - ap * mean; + ap *= exponent; + bp *= exponent; + + float a0 = (1.33f * thres - 1.f) / (1.f - mean); + float b0 = 1.f - a0 * mean; + a0 *= exponent; + b0 *= exponent; + + float apn = (thres - 1.f) / (maxN - meanN); + float bpn = 1.f - apn * meanN; + apn *= -exponent; + bpn *= exponent; + + float a0n = (1.33f * thres - 1.f) / (1.f - meanN); + float b0n = 1.f - a0n * meanN; + a0n *= -exponent; + b0n *= exponent; + + madL *= 0.05f; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + const vfloat apv = F2V(ap); + const vfloat bpv = F2V(bp); + const vfloat a0v = F2V(a0); + const vfloat b0v = F2V(b0); + const vfloat apnv = F2V(apn); + const vfloat bpnv = F2V(bpn); + const vfloat a0nv = F2V(a0n); + const vfloat b0nv = F2V(b0n); + const vfloat madLv = F2V(madL); + const vfloat meanv = F2V(mean); + const vfloat onev = F2V(1.f); +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = 0; y < H_L; y++) { + int x = 0; +#ifdef __SSE2__ + for (; x < W_L - 3; x += 4) { + vfloat exponev = onev; + vfloat valv = LVFU(Source[y][x]); + const vmask mask1v = vmaskf_ge(valv, ZEROV); + const vmask mask2v = vmaskf_gt(vself(mask1v, valv, -valv), meanv); + const vfloat av = vself(mask2v, vself(mask1v, apv, apnv), vself(mask1v, a0v, a0nv)); + const vfloat bv = vself(mask2v, vself(mask1v, bpv, bpnv), vself(mask1v, b0v, b0nv)); + exponev += av * valv + bv; + valv = vself(mask1v, valv, -valv); + const vfloat multv = vself(mask1v, onev, -onev); + const vfloat resultv = multv * xexpf(xlogf(valv + madLv) * exponev); + STVFU(Source[y][x], resultv); + } +#endif + for (; x < W_L; x++) { + float expone = 1.f; + + if (Source[y][x] >= 0.f) { + if (Source[y][x] > mean) { + expone += ap * Source[y][x] + bp; + } else { + expone += a0 * Source[y][x] + b0; + } + + Source[y][x] = xexpf(xlogf(Source[y][x] + madL) * expone); + } else { + if (-Source[y][x] > mean) { + expone += apn * Source[y][x] + bpn; + } else { + expone += a0n * Source[y][x] + b0n; + } + + Source[y][x] = -xexpf(xlogf(-Source[y][x] + madL) * expone); + } + } + } + } +} + +void ImProcFunctions::wavlc(wavelet_decomposition& wdspot, int level_bl, int level_hl, int maxlvl, int level_hr, int level_br, float ahigh, float bhigh, float alow, float blow, float sigmalc, float strength, const LocwavCurve & locwavCurve, int numThreads) +{ + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + + Evaluate2(wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); + for (int dir = 1; dir < 4; dir++) { + for (int level = level_bl; level < maxlvl; ++level) { + int W_L = wdspot.level_W(level); + int H_L = wdspot.level_H(level); + float klev = 1.f; + + if (level >= level_hl && level <= level_hr) { + klev = 1.f; + } + + if (level_hl != level_bl) { + if (level >= level_bl && level < level_hl) { + klev = alow * level + blow; + } + } + + if (level_hr != level_br) { + if (level > level_hr && level <= level_br) { + klev = ahigh * level + bhigh; + } + } + float* const* wav_L = wdspot.level_coeffs(level); + + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { + constexpr float insigma = 0.666f; //SD + const float logmax = log(MaxP[level]); //log Max + const float rapX = (mean[level] + sigmalc * sigma[level]) / MaxP[level]; //rapport between sD / max + const float inx = log(insigma); + const float iny = log(rapX); + const float rap = inx / iny; //koef + const float asig = 0.166f / (sigma[level] * sigmalc); + const float bsig = 0.5f - asig * mean[level]; + const float amean = 0.5f / mean[level]; + const float limit1 = mean[level] + sigmalc * sigma[level]; + const float limit2 = mean[level]; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16 * W_L) if (multiThread) +#endif + for (int i = 0; i < W_L * H_L; i++) { + const float val = std::fabs(wav_L[dir][i]); + + float absciss; + if (val >= limit1) { //for max + const float valcour = xlogf(val); + absciss = xexpf((valcour - logmax) * rap); + } else if (val >= limit2) { + absciss = asig * val + bsig; + } else { + absciss = amean * val; + } + + const float kc = klev * (locwavCurve[absciss * 500.f] - 0.5f); + const float reduceeffect = kc <= 0.f ? 1.f : strength; + + float kinterm = 1.f + reduceeffect * kc; + kinterm = kinterm <= 0.f ? 0.01f : kinterm; + + wav_L[dir][i] *= kinterm <= 0.f ? 0.01f : kinterm; + } + } + } + } + +} + +void ImProcFunctions::wavcont(const struct local_params& lp, float ** tmp, wavelet_decomposition& wdspot, int level_bl, int maxlvl, + const LocwavCurve & loclevwavCurve, bool loclevwavutili, + const LocwavCurve & loccompwavCurve, bool loccompwavutili, + const LocwavCurve & loccomprewavCurve, bool loccomprewavutili, + float radlevblur, int process, float chromablu, float thres, float sigmadc, float deltad) +{ + //BENCHFUN + const int W_L = wdspot.level_W(0); + const int H_L = wdspot.level_H(0); + +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; +#endif + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + Evaluate2(wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); + + if (process == 1 && loclevwavCurve && loclevwavutili) { //blur + array2D templevel(W_L, H_L); + for (int dir = 1; dir < 4; ++dir) { + for (int level = level_bl; level < maxlvl; ++level) { + const auto WavL = wdspot.level_coeffs(level)[dir]; + const float effect = lp.sigmabl; + constexpr float offs = 1.f; + float mea[10]; + calceffect(level, mean, sigma, mea, effect, offs); + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.5f, 0.3f, 0.2f, 0.1f, 0.05f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + + const float klev = 0.25f * loclevwavCurve[level * 55.5f]; + float* src[H_L]; + for (int i = 0; i < H_L; ++i) { + src[i] = &wdspot.level_coeffs(level)[dir][i * W_L]; + } +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(src, templevel, W_L, H_L, radlevblur * klev * chromablu); + } +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + const vfloat lutFactorv = F2V(lutFactor); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + for (int y = 0; y < H_L; y++) { + int x = 0; + int j = y * W_L; +#ifdef __SSE2__ + for (; x < W_L - 3; x += 4, j += 4) { + const vfloat valv = LVFU(WavL[j]); + STVFU(WavL[j], intp((*meaLut)[vabsf(valv) * lutFactorv], LVFU(templevel[y][x]), valv)); + } +#endif + for (; x < W_L; x++, j++) { + WavL[j] = intp((*meaLut)[std::fabs(WavL[j]) * lutFactor], templevel[y][x], WavL[j]); + } + } + } + } + } + } else if (process == 2 && loccompwavCurve && loccompwavutili) { //Directional contrast + for (int dir = 1; dir < 4; ++dir) { + for (int level = level_bl; level < maxlvl; ++level) { + const auto WavL = wdspot.level_coeffs(level)[dir]; + const float effect = sigmadc; + constexpr float offs = 1.f; + float mea[10]; + calceffect(level, mean, sigma, mea, effect, offs); + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.7f, 0.5f, 0.3f, 0.2f, 0.1f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + const int iteration = deltad; + const int itplus = 7 + iteration; + const int itmoins = 7 - iteration; + const int med = maxlvl / 2; + int it; + + if (level < med) { + it = itmoins; + } else if (level == med) { + it = 7; + } else { + it = itplus; + } + + const float itf = it; + const float factor = dir < 3 ? 0.3f : -0.6f; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + const vfloat c327d68v = F2V(327.68f); + const vfloat factorv = F2V(factor); + const vfloat sixv = F2V(6.f); + const vfloat zd5v = F2V(0.5f); + const vfloat onev = F2V(1.f); + const vfloat itfv = F2V(itf); + const vfloat lutFactorv = F2V(lutFactor); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H_L; ++i) { + int j = 0; +#ifdef __SSE2__ + for (; j < W_L - 3; j += 4) { + const vfloat LL100v = LC2VFU(tmp[i * 2][j * 2]) / c327d68v; + const vfloat kbav = factorv * (loccompwavCurve[sixv * LL100v] - zd5v); //k1 between 0 and 0.5 0.5==> 1/6=0.16 + const vfloat valv = LVFU(WavL[i * W_L + j]); + STVFU(WavL[i * W_L + j], valv * pow_F(onev + kbav * (*meaLut)[vabsf(valv) * lutFactorv], itfv)); + } +#endif + for (; j < W_L; ++j) { + const float LL100 = tmp[i * 2][j * 2] / 327.68f; + const float kba = factor * (loccompwavCurve[6.f * LL100] - 0.5f); //k1 between 0 and 0.5 0.5==> 1/6=0.16 + WavL[i * W_L + j] *= pow_F(1.f + kba * (*meaLut)[std::fabs(WavL[i * W_L + j]) * lutFactor], itf); + } + } + } + } + } + } else if (process == 3 && loccomprewavCurve && loccomprewavutili) { //Dynamic compression wavelet + float madL[10][3]; + array2D templevel(W_L, H_L); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) if (multiThread) +#endif + for (int dir = 1; dir < 4; dir++) { + for (int level = level_bl; level < maxlvl; ++level) { + madL[level][dir - 1] = Mad(wdspot.level_coeffs(level)[dir], wdspot.level_W(level) * wdspot.level_H(level)); //evaluate noise by level + } + } + + for (int dir = 1; dir < 4; ++dir) { + for (int level = level_bl; level < maxlvl; ++level) { + const float effect = lp.sigmadr; + constexpr float offs = 1.f; + float mea[10]; + calceffect(level, mean, sigma, mea, effect, offs); + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.65f, 0.5f, 0.4f, 0.25f, 0.1f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + const auto wav_L = wdspot.level_coeffs(level)[dir]; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + int j = y * W_L + x; + templevel[y][x] = wav_L[j]; + } + } + + float klev = (loccomprewavCurve[level * 55.5f] - 0.75f); + if (klev < 0.f) { + klev *= 2.6666f;//compression increase contraste + } else { + klev *= 4.f;//dilatation reduce contraste - detailattenuator + } + const float compression = expf(-klev); + const float detailattenuator = std::max(klev, 0.f); + + Compresslevels(templevel, W_L, H_L, compression, detailattenuator, thres, mean[level], MaxP[level], meanN[level], MaxN[level], madL[level][dir - 1]); +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + const vfloat lutFactorv = F2V(lutFactor); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + for (int y = 0; y < H_L; y++) { + int x = 0; + int j = y * W_L; +#ifdef __SSE2__ + for (; x < W_L - 3; x += 4, j += 4) { + const vfloat valv = LVFU(wav_L[j]); + STVFU(wav_L[j], intp((*meaLut)[vabsf(valv) * lutFactorv], LVFU(templevel[y][x]), valv)); + } +#endif + for (; x < W_L; x++, j++) { + wav_L[j] = intp((*meaLut)[std::fabs(wav_L[j]) * lutFactor], templevel[y][x], wav_L[j]); + } + } + } + } + } + } +} + + +void ImProcFunctions::wavcontrast4(struct local_params& lp, float ** tmp, float ** tmpa, float ** tmpb, float contrast, float radblur, float radlevblur, int bfw, int bfh, int level_bl, int level_hl, int level_br, int level_hr, int sk, int numThreads, + const LocwavCurve & locwavCurve, bool locwavutili, bool wavcurve, const LocwavCurve& loclevwavCurve, bool loclevwavutili, bool wavcurvelev, + const LocwavCurve & locconwavCurve, bool locconwavutili, bool wavcurvecon, + const LocwavCurve & loccompwavCurve, bool loccompwavutili, bool wavcurvecomp, + const LocwavCurve & loccomprewavCurve, bool loccomprewavutili, bool wavcurvecompre, + const LocwavCurve & locedgwavCurve, bool locedgwavutili, + float sigm, float offs, int & maxlvl, float sigmadc, float deltad, float chromalev, float chromablu, bool blurlc, bool blurena, bool levelena, bool comprena, bool compreena, float compress, float thres) +{ +//BENCHFUN + std::unique_ptr wdspot(new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + + //first decomposition for compress dynamic range positive values and other process + if (wdspot->memory_allocation_failed()) { + return; + } + + struct grad_params gpwav; + + maxlvl = wdspot->maxlevel(); + + int W_Lm = wdspot->level_W(maxlvl - 1); //I assume all decomposition have same W and H + + int H_Lm = wdspot->level_H(maxlvl - 1); + + if (lp.strwav != 0.f && lp.wavgradl) { + array2D factorwav(W_Lm, H_Lm); + calclocalGradientParams(lp, gpwav, 0, 0, W_Lm, H_Lm, 10); + const float mult = lp.strwav < 0.f ? -1.f : 1.f; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H_Lm; y++) { + for (int x = 0; x < W_Lm; x++) { + factorwav[y][x] = mult * (1.f - ImProcFunctions::calcGradientFactor(gpwav, x, y)); + } + } + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + Evaluate2(*wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); + float alowg = 1.f; + float blowg = 0.f; + + if (level_hl != level_bl) { + alowg = 1.f / (level_hl - level_bl); + blowg = -alowg * level_bl; + } + + float ahighg = 1.f; + float bhighg = 0.f; + + if (level_hr != level_br) { + ahighg = 1.f / (level_hr - level_br); + bhighg = -ahighg * level_br; + } + + for (int dir = 1; dir < 4; dir++) { + for (int level = level_bl; level < maxlvl; ++level) { + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { + const int W_L = wdspot->level_W(level); + const int H_L = wdspot->level_H(level); + auto wav_L = wdspot->level_coeffs(level)[dir]; + const float effect = lp.sigmalc2; + constexpr float offset = 1.f; + float mea[10]; + calceffect(level, mean, sigma, mea, effect, offset); + constexpr float insigma = 0.666f; //SD + const float logmax = std::log(MaxP[level]); //log Max + const float rapX = (mean[level] + lp.sigmalc2 * sigma[level]) / MaxP[level]; //rapport between sD / max + const float inx = std::log(insigma); + const float iny = std::log(rapX); + const float rap = inx / iny; //koef + const float asig = 0.166f / (sigma[level] * lp.sigmalc2); + const float bsig = 0.5f - asig * mean[level]; + const float amean = 0.5f / mean[level]; + float klev = 1.f; + + if (level_hl != level_bl) { + if (level >= level_bl && level < level_hl) { + klev = alowg * level + blowg; + } + } + + if (level_hr != level_br) { + if (level > level_hr && level <= level_br) { + klev = ahighg * level + bhighg; + } + } + klev *= 0.8f; + const float threshold = mean[level] + lp.sigmalc2 * sigma[level]; + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.6f, 0.5f, 0.4f, 0.3f, 0.1f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) if (multiThread) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + const float WavCL = std::fabs(wav_L[y * W_L + x]); + + float absciss; + if (WavCL >= threshold) { //for max + absciss = pow_F(WavCL - logmax, rap); + } else if (WavCL >= mean[level]) { + absciss = asig * WavCL + bsig; + } else { + absciss = amean * WavCL; + } + + const float kc = klev * factorwav[y][x] * absciss; + const float reduceeffect = kc <= 0.f ? 1.f : 1.5f; + + float kinterm = 1.f + reduceeffect * kc; + kinterm = kinterm <= 0.f ? 0.01f : kinterm; + wav_L[y * W_L + x] *= (1.f + (kinterm - 1.f) * (*meaLut)[WavCL * lutFactor]); + } + } + } + } + } + } + + int W_Level = wdspot->level_W(0); + int H_Level = wdspot->level_H(0); + float *wav_L0 = wdspot->get_coeff0(); + + if (radblur > 0.f && blurena) { + float* src[H_Level]; + for (int i = 0; i < H_Level; ++i) { + src[i] = &wav_L0[i * W_Level]; + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(src, src, W_Level, H_Level, radblur); + } + } + + if (compress != 0.f && compreena) { + const float Compression = expf(-compress); + const float DetailBoost = std::max(compress, 0.f); + + CompressDR(wav_L0, W_Level, H_Level, Compression, DetailBoost); + } + + if ((lp.residsha < 0.f || lp.residhi < 0.f)) { + float tran = 5.f;//transition shadow + + if (lp.residshathr > (100.f - tran)) { + tran = 100.f - lp.residshathr; + } + constexpr float alp = 3.f; + const float aalp = (1.f - alp) / lp.residshathr; + const float ath = -lp.residsha / tran; + const float bth = lp.residsha - ath * lp.residshathr; + + //highlight + const float tranh = rtengine::min(5.f, lp.residhithr); + const float athH = lp.residhi / tranh; + const float bthH = lp.residhi - athH * lp.residhithr; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < W_Level * H_Level; i++) { + const float LL100 = wav_L0[i] / 327.68f; + + if (LL100 < lp.residshathr) { + const float kk = aalp * LL100 + alp; + wav_L0[i] *= (1.f + kk * lp.residsha / 200.f); + } else if (LL100 < lp.residshathr + tran) { + wav_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); + } + + if (LL100 > lp.residhithr) { + wav_L0[i] *= (1.f + lp.residhi / 200.f); + } else if (LL100 > (lp.residhithr - tranh)) { + wav_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); + } + } + } + + if ((lp.residsha > 0.f || lp.residhi > 0.f)) { + const std::unique_ptr temp(new LabImage(W_Level, H_Level)); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + + for (int i = 0; i < H_Level; i++) { + for (int j = 0; j < W_Level; j++) { + temp->L[i][j] = wav_L0[i * W_Level + j]; + } + } + + ImProcFunctions::shadowsHighlights(temp.get(), true, 1, lp.residhi, lp.residsha , 40, sk, lp.residhithr, lp.residshathr); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + + for (int i = 0; i < H_Level; i++) { + for (int j = 0; j < W_Level; j++) { + wav_L0[i * W_Level + j] = temp->L[i][j]; + } + } + } + + if (contrast != 0.f) { + double avedbl = 0.0; // use double precision for large summations + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avedbl) if (multiThread) +#endif + for (int i = 0; i < W_Level * H_Level; i++) { + avedbl += static_cast(wav_L0[i]); + } + + const double avg = LIM01(avedbl / (32768.0 * W_Level * H_Level)); + double contreal = 0.6f * contrast; + DiagonalCurve resid_contrast({ + DCT_NURBS, + 0, 0, + avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), + avg + (1. - avg) * (0.6 - contreal / 250.0), avg + (1. - avg) * (0.6 + contreal / 250.0), + 1, 1 + }); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < W_Level * H_Level; i++) { + wav_L0[i] = resid_contrast.getVal(LIM01(wav_L0[i] / 32768.f)) * 32768.0; + } + } + + float alow = 1.f; + float blow = 0.f; + + if (level_hl != level_bl) { + alow = 1.f / (level_hl - level_bl); + blow = -alow * level_bl; + } + + float ahigh = 1.f; + float bhigh = 0.f; + + if (level_hr != level_br) { + ahigh = 1.f / (level_hr - level_br); + bhigh = -ahigh * level_br; + } + + if (wavcurvelev || wavcurvecomp || wavcurvecompre) {//compress dynamic and blur + if (wavcurvelev && radlevblur > 0.f && blurena) { + wavcont(lp, tmp, *wdspot, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, 1.f, 0.f, 0.f, 0.f); + } + + if (wavcurvecomp && comprena) { + wavcont(lp, tmp, *wdspot, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 2, 1.f, 0.f, sigmadc, deltad); + } + + if (wavcurvecompre && compreena) { + wavcont(lp, tmp, *wdspot, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 3, 1.f, thres, 0.f, 0.f); + } + } + + if (wavcurvecon && levelena) {//contrast by levels for luminance + wavcbd(*wdspot, level_bl, maxlvl, locconwavCurve, locconwavutili, sigm, offs, 1.f, sk); + } + +//edge sharpness begin + if (lp.edgwena && level_bl == 0 && level_br >= 3 && locedgwavCurve && locedgwavutili && lp.strengthw > 0) { //needs the first levels to work! + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + Evaluate2(*wdspot, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); + float edd = 3.f; + float eddlow = 15.f; + float eddlipinfl = 0.005f * lp.edgw + 0.4f; + float eddlipampl = 1.f + lp.basew / 50.f; + + float *koeLi[12]; + float maxkoeLi[12] = {0.f}; + + float *koeLibuffer = new float[12 * H_Level * W_Level]; //12 + + for (int i = 0; i < 12; i++) { + koeLi[i] = &koeLibuffer[i * W_Level * H_Level]; + } + + array2D tmC(W_Level, H_Level); + + float gradw = lp.gradw; + float tloww = lp.tloww; + for (int lvl = 0; lvl < 4; lvl++) { + for (int dir = 1; dir < 4; dir++) { + const int W_L = wdspot->level_W(lvl); + const int H_L = wdspot->level_H(lvl); + float* const* wav_L = wdspot->level_coeffs(lvl); + calckoe(wav_L[dir], gradw, tloww, koeLi[lvl * 3 + dir - 1], lvl, W_L, H_L, edd, maxkoeLi[lvl * 3 + dir - 1], tmC, true); + // return convolution KoeLi and maxkoeLi of level 0 1 2 3 and Dir Horiz, Vert, Diag + } + } + + tmC.free(); + float aamp = 1.f + lp.thigw / 100.f; + + const float alipinfl = (eddlipampl - 1.f) / (1.f - eddlipinfl); + const float blipinfl = eddlipampl - alipinfl; + + for (int lvl = 0; lvl < 4; lvl++) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + for (int i = 1; i < H_Level - 1; i++) { + for (int j = 1; j < W_Level - 1; j++) { + //treatment of koeLi and maxkoeLi + if (lp.lip3) {//Sobel Canny algo improve with parameters + // comparison between pixel and neighbors + const auto neigh = lp.neiwmet == 1; + const auto kneigh = neigh ? 28.f : 38.f; + const auto somm = neigh ? 40.f : 50.f; + + for (int dir = 1; dir < 4; dir++) { //neighbors proxi + koeLi[lvl * 3 + dir - 1][i * W_Level + j] = (kneigh * koeLi[lvl * 3 + dir - 1][i * W_Level + j] + + 2.f * koeLi[lvl * 3 + dir - 1][(i - 1) * W_Level + j] + 2.f * koeLi[lvl * 3 + dir - 1][(i + 1) * W_Level + j] + 2.f * koeLi[lvl * 3 + dir - 1][i * W_Level + j + 1] + 2.f * koeLi[lvl * 3 + dir - 1][i * W_Level + j - 1] + + koeLi[lvl * 3 + dir - 1][(i - 1) * W_Level + j - 1] + koeLi[lvl * 3 + dir - 1][(i - 1) * W_Level + j + 1] + koeLi[lvl * 3 + dir - 1][(i + 1) * W_Level + j - 1] + koeLi[lvl * 3 + dir - 1][(i + 1) * W_Level + j + 1]) / somm; + } + } + + float interm = 0.f; + for (int dir = 1; dir < 4; dir++) { + //here I evaluate combination of vert / diag / horiz...we are with multiplicators of the signal + interm += SQR(koeLi[lvl * 3 + dir - 1][i * W_Level + j]); + } + + interm = std::sqrt(interm) * 0.57736721f; + + constexpr float eps = 0.0001f; + // I think this double ratio (alph, beta) is better than arctg + + float alph = koeLi[lvl * 3][i * W_Level + j] / (koeLi[lvl * 3 + 1][i * W_Level + j] + eps); //ratio between horizontal and vertical + float beta = koeLi[lvl * 3 + 2][i * W_Level + j] / (koeLi[lvl * 3 + 1][i * W_Level + j] + eps); //ratio between diagonal and horizontal + + //alph evaluate the direction of the gradient regularity Lipschitz + // if = 1 we are on an edge + // if 0 we are not + // we can change and use log..or Arctg but why ?? we can change if need ... + //Liamp=1 for eddlipinfl + //liamp > 1 for alp >eddlipinfl and alph < 1 + //Liamp < 1 for alp < eddlipinfl and alph > 0 + if (alph > 1.f) { + alph = 1.f / alph; + } + + if (beta > 1.f) { + beta = 1.f / beta; + } + + //take into account diagonal + //if in same value OK + //if not no edge or reduction + float bet = 1.f; + + if (alph > eddlipinfl && beta < 0.85f * eddlipinfl) { //0.85 arbitrary value ==> eliminate from edge if H V D too different + bet = beta; + } + + float kampli; + if (alph > eddlipinfl) { + kampli = alipinfl * alph + blipinfl; //If beta low reduce kampli + kampli = SQR(bet) * kampli * aamp; + } else { + kampli = SQR(SQR(alph * bet)) / eddlipinfl; //Strong Reduce if beta low + kampli = kampli / aamp; + } + + + interm *= kampli; + + if (interm * eddlow < lp.tloww) { + interm = 0.01f; //eliminate too low values + } + + //we can change this part of algo==> not equal but ponderate + koeLi[lvl * 3][i * W_Level + j] = koeLi[lvl * 3 + 1][i * W_Level + j] = koeLi[lvl * 3 + 2][i * W_Level + j] = interm; //new value + //here KoeLi contains values where gradient is high and coef high, and eliminate low values... + } + } + } + + constexpr float scales[10] = {1.f, 2.f, 4.f, 8.f, 16.f, 32.f, 64.f, 128.f, 256.f, 512.f}; + float scaleskip[10]; + + for (int sc = 0; sc < 10; sc++) { + scaleskip[sc] = scales[sc] / sk; + } + + const float rad = lp.radiusw / 60.f; //radius ==> not too high value to avoid artifacts + float value = lp.strengthw / 8.f; //strength + + if (scaleskip[1] < 1.f) { + constexpr float atten01234 = 0.80f; + value *= atten01234 * scaleskip[1]; //for zoom < 100% reduce strength...I choose level 1...but!! + } + + constexpr float lim0 = 20.f; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi + float repart = lp.detailw; + + if (lp.edgwmet != 1) { + float brepart; + if (lp.edgwmet == 0) { + brepart = 3.f; + } else /*if (lp.edgwmet == 2)*/ { + brepart = 0.5f; //arbitrary value to increase / decrease repart, between 1 and 0 + } + if (rad < lim0 / 60.f) { + const float arepart = - (brepart - 1.f) / (lim0 / 60.f); + repart *= arepart * rad + brepart; //linear repartition of repart + } + } + + const float bk = 1.f + repart / 50.f; + constexpr float al10 = 1.0f; //arbitrary value ==> less = take into account high levels + const float ak = - (bk - al10) / 10.f; //10 = maximum levels + + for (int lvl = 0; lvl < maxlvl; lvl++) { + if (MaxP[lvl] > 0.f) { //curve + const int W_L = wdspot->level_W(lvl); + const int H_L = wdspot->level_H(lvl); + float* const* wav_L = wdspot->level_coeffs(lvl); + const float koef = ak * lvl + bk; //modulate for levels : more levels high, more koef low ==> concentrated action on low levels, without or near for high levels + float expkoef = -pow_F(std::fabs(rad - lvl), koef); //reduce effect for high levels + if (lp.edgwmet == 2) { + if (rad < lim0 / 60.f && lvl == 0) { + expkoef *= abs(repart); //reduce effect for low values of rad and level=0==> quasi only level 1 is effective + } + } else if (lp.edgwmet == 0) { + if (rad < lim0 / 60.f && lvl == 1) { + expkoef /= repart; //increase effect for low values of rad and level=1==> quasi only level 0 is effective + } + } + //take into account local contrast + const float refin = value * xexpf(expkoef); + const float edgePrecalc = 1.f + refin; //estimate edge "pseudo variance" + constexpr float insigma = 0.666f; //SD + const float logmax = xlogf(MaxP[lvl]); //log Max + const float rapX = (mean[lvl] + sigma[lvl]) / MaxP[lvl]; //rapport between sD / max + const float inx = xlogf(insigma); + const float iny = xlogf(rapX); + const float rap = inx / iny; //koef + const float asig = 0.166f / sigma[lvl]; + const float bsig = 0.5f - asig * mean[lvl]; + const float amean = 0.5f / mean[lvl]; + constexpr int borderL = 1; + constexpr float abssd = 4.f; //amplification reference + constexpr float bbssd = 2.f; //mini ampli + constexpr float maxamp = 2.5f; //maxi ampli at end + constexpr float maxampd = 10.f; //maxi ampli at end + constexpr float a_abssd = (maxamp - abssd) / 0.333f; + constexpr float b_abssd = maxamp - a_abssd; + constexpr float da_abssd = (maxampd - abssd) / 0.333f; + constexpr float db_abssd = maxampd - da_abssd; + constexpr float am = (abssd - bbssd) / 0.666f; + const float effect = lp.sigmaed; + constexpr float offset = 1.f; + float mea[10]; + calceffect(lvl, mean, sigma, mea, effect, offset); + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.5f, 0.3f, 0.2f, 0.1f, 0.05f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + + for (int dir = 1; dir < 4; dir++) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) if(multiThread) +#endif + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { + const int k = i * W_L + j; + + float edge; + if (lvl < 4) { + edge = 1.f + (edgePrecalc - 1.f) * (koeLi[lvl * 3][k]) / (1.f + 0.9f * maxkoeLi[lvl * 3 + dir - 1]); + } else { + edge = edgePrecalc; + } + + float absciss = 0.f; + if (std::fabs(wav_L[dir][k]) >= mean[lvl] + sigma[lvl]) { //for max + absciss = xexpf((xlogf(std::fabs(wav_L[dir][k])) - logmax) * rap); + } else if (std::fabs(wav_L[dir][k]) >= mean[lvl]) { + absciss = asig * std::fabs(wav_L[dir][k]) + bsig; + } else /*if (std::fabs(wav_L[dir][k]) < mean[lvl])*/ { + absciss = amean * std::fabs(wav_L[dir][k]); + } + + // Threshold adjuster settings==> approximative for curve + //kmul about average cbrt(3--40 / 10)==>1.5 to 2.5 + //kmul about SD 10--60 / 35 ==> 2 + // kmul about low cbrt((5.f+cp.edg_low)/5.f);==> 1.5 + // kmul about max ==> 9 + // we can change these values + // result is different not best or bad than threshold slider...but similar + float kmul; + float kmuld; + + if (absciss > 0.666f && absciss < 1.f) { + kmul = a_abssd * absciss + b_abssd; //about max ==> kinterm + kmuld = da_abssd * absciss + db_abssd; + } else { + kmul = kmuld = absciss * am + bbssd; + } + + const float kc = kmul * (locedgwavCurve[absciss * 500.f] - 0.5f); + + float kinterm; + if (kc >= 0.f) { + constexpr float reduceeffect = 0.6f; + kinterm = 1.f + reduceeffect * kc; //about 1 to 3 general and big amplification for max (under 0) + } else { + const float kcd = kmuld * (locedgwavCurve[absciss * 500.f] - 0.5f); + kinterm = 1.f - SQR(kcd) / 10.f; + } + + if (kinterm < 0.f) { + kinterm = 0.01f; + } + + edge = std::max(edge * kinterm, 1.f); + wav_L[dir][k] *= 1.f + (edge - 1.f) * (*meaLut)[std::fabs(wav_L[dir][k]) * lutFactor]; + } + } + } + } + } + + if (koeLibuffer) { + delete [] koeLibuffer; + } + } + +//edge sharpness end + + if (locwavCurve && locwavutili && wavcurve) {//simple local contrast in function luminance + float strengthlc = 1.5f; + wavlc(*wdspot, level_bl, level_hl, maxlvl, level_hr, level_br, ahigh, bhigh, alow, blow, lp.sigmalc, strengthlc, locwavCurve, numThreads); + } + //reconstruct all for L + wdspot->reconstruct(tmp[0], 1.f); + + bool reconstruct = false; + if (wavcurvecon && (chromalev != 1.f) && levelena) { // a if need ) {//contrast by levels for chroma a + // a + wdspot.reset(new wavelet_decomposition(tmpa[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspot->memory_allocation_failed()) { + return; + } + wavcbd(*wdspot, level_bl, maxlvl, locconwavCurve, locconwavutili, sigm, offs, chromalev, sk); + reconstruct = true; + } + if (wavcurvelev && radlevblur > 0.f && blurena && chromablu > 0.f && !blurlc) {//chroma blur if need + // a + if (!reconstruct) { + wdspot.reset(new wavelet_decomposition(tmpa[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspot->memory_allocation_failed()) { + return; + } + } + wavcont(lp, tmp, *wdspot, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, chromablu, 0.f, 0.f, 0.f); + reconstruct = true; + } + if (reconstruct) { + wdspot->reconstruct(tmpa[0], 1.f); + } + + reconstruct = false; + if (wavcurvecon && (chromalev != 1.f) && levelena) { // b if need ) {//contrast by levels for chroma b + //b + wdspot.reset(new wavelet_decomposition(tmpb[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspot->memory_allocation_failed()) { + return; + } + //b + wavcbd(*wdspot, level_bl, maxlvl, locconwavCurve, locconwavutili, sigm, offs, chromalev, sk); + reconstruct = true; + } + + if (wavcurvelev && radlevblur > 0.f && blurena && chromablu > 0.f && !blurlc) {//chroma blur if need + //b + if (!reconstruct) { + wdspot.reset(new wavelet_decomposition(tmpb[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspot->memory_allocation_failed()) { + return; + } + } + wavcont(lp, tmp, *wdspot, level_bl, maxlvl, loclevwavCurve, loclevwavutili, loccompwavCurve, loccompwavutili, loccomprewavCurve, loccomprewavutili, radlevblur, 1, chromablu, 0.f, 0.f, 0.f); + reconstruct = true; + } + if (reconstruct) { + wdspot->reconstruct(tmpb[0], 1.f); + } + + + //gamma and slope residual image - be careful memory + bool tonecur = false; + const Glib::ustring profile = params->icm.workingProfile; + bool isworking = (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1"); + + if (isworking && (lp.residgam != 2.4f || lp.residslop != 12.92f)) { + tonecur = true; + } + + if(tonecur) { + std::unique_ptr wdspotL(new wavelet_decomposition(tmp[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspotL->memory_allocation_failed()) { + return; + } + std::unique_ptr wdspota(new wavelet_decomposition(tmpa[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspota->memory_allocation_failed()) { + return; + } + std::unique_ptr wdspotb(new wavelet_decomposition(tmpb[0], bfw, bfh, maxlvl, 1, sk, numThreads, lp.daubLen)); + if (wdspotb->memory_allocation_failed()) { + return; + } + int W_Level = wdspotL->level_W(0); + int H_Level = wdspotL->level_H(0); + float *wav_L0 = wdspotL->get_coeff0(); + float *wav_a0 = wdspota->get_coeff0(); + float *wav_b0 = wdspotb->get_coeff0(); + + const std::unique_ptr labresid(new LabImage(W_Level, H_Level)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_Level; y++) { + for (int x = 0; x < W_Level; x++) { + labresid->L[y][x] = wav_L0[y * W_Level + x]; + labresid->a[y][x] = wav_a0[y * W_Level + x]; + labresid->b[y][x] = wav_b0[y * W_Level + x]; + } + } + + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(W_Level, H_Level); + lab2rgb(*labresid, *tmpImage, params->icm.workingProfile); + Glib::ustring prof = params->icm.workingProfile; + cmsHTRANSFORM dummy = nullptr; + int ill =0; + workingtrc(tmpImage, tmpImage, W_Level, H_Level, -5, prof, 2.4, 12.92310, ill, 0, dummy, true, false, false); + workingtrc(tmpImage, tmpImage, W_Level, H_Level, 1, prof, lp.residgam, lp.residslop, ill, 0, dummy, false, true, true);//be careful no gamut control + rgb2lab(*tmpImage, *labresid, params->icm.workingProfile); + delete tmpImage; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_Level; y++) { + for (int x = 0; x < W_Level; x++) { + wav_L0[y * W_Level + x] = labresid->L[y][x]; + wav_a0[y * W_Level + x] = labresid->a[y][x]; + wav_b0[y * W_Level + x] = labresid->b[y][x]; + } + } + + wdspotL->reconstruct(tmp[0], 1.f); + wdspota->reconstruct(tmpa[0], 1.f); + wdspotb->reconstruct(tmpb[0], 1.f); + } +} + + +void ImProcFunctions::fftw_denoise(int sk, int GW, int GH, int max_numblox_W, int min_numblox_W, float **tmp1, array2D *Lin, int numThreads, const struct local_params & lp, int chrom) +{ + // BENCHFUN + + fftwf_plan plan_forward_blox[2]; + fftwf_plan plan_backward_blox[2]; + + array2D tilemask_in(TS, TS); + array2D tilemask_out(TS, TS); + + float *Lbloxtmp = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + float *fLbloxtmp = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + float params_Ldetail = 0.f; + + int nfwd[2] = {TS, TS}; + + //for DCT: + fftw_r2r_kind fwdkind[2] = {FFTW_REDFT10, FFTW_REDFT10}; + fftw_r2r_kind bwdkind[2] = {FFTW_REDFT01, FFTW_REDFT01}; + + // Creating the plans with FFTW_MEASURE instead of FFTW_ESTIMATE speeds up the execute a bit + plan_forward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + fftwf_free(Lbloxtmp); + fftwf_free(fLbloxtmp); + const int border = rtengine::max(2, TS / 16); + + for (int i = 0; i < TS; ++i) { + float i1 = abs((i > TS / 2 ? i - TS + 1 : i)); + float vmask = (i1 < border ? SQR(sin((rtengine::RT_PI_F * i1) / (2 * border))) : 1.0f); + float vmask2 = (i1 < 2 * border ? SQR(sin((rtengine::RT_PI_F * i1) / (2 * border))) : 1.0f); + + for (int j = 0; j < TS; ++j) { + float j1 = abs((j > TS / 2 ? j - TS + 1 : j)); + tilemask_in[i][j] = (vmask * (j1 < border ? SQR(sin((rtengine::RT_PI_F * j1) / (2 * border))) : 1.0f)) + epsilonw; + tilemask_out[i][j] = (vmask2 * (j1 < 2 * border ? SQR(sin((rtengine::RT_PI_F * j1) / (2 * border))) : 1.0f)) + epsilonw; + + } + } + + + float *LbloxArray[numThreads]; + float *fLbloxArray[numThreads]; + + + + const int numblox_W = ceil((static_cast(GW)) / offset) + 2; + const int numblox_H = ceil((static_cast(GH)) / offset) + 2; + + + //residual between input and denoised L channel + array2D Ldetail(GW, GH, ARRAY2D_CLEAR_DATA); + array2D totwt(GW, GH, ARRAY2D_CLEAR_DATA); //weight for combining DCT blocks + array2D prov(GW, GH, ARRAY2D_CLEAR_DATA); + + for (int i = 0; i < numThreads; ++i) { + LbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + fLbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + } + +#ifdef _OPENMP + int masterThread = omp_get_thread_num(); +#endif +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef _OPENMP + int subThread = masterThread * 1 + omp_get_thread_num(); +#else + int subThread = 0; +#endif + float *Lblox = LbloxArray[subThread]; + float *fLblox = fLbloxArray[subThread]; + float pBuf[GW + TS + 2 * offset] ALIGNED16; +#ifdef _OPENMP + #pragma omp for +#endif + for (int vblk = 0; vblk < numblox_H; ++vblk) { + + int top = (vblk - 1) * offset; + float * datarow = pBuf + offset; + + for (int i = 0; i < TS; ++i) { + int row = top + i; + int rr = row; + + if (row < 0) { + rr = rtengine::min(-row, GH - 1); + } else if (row >= GH) { + rr = rtengine::max(0, 2 * GH - 2 - row); + } + + for (int j = 0; j < GW; ++j) { + datarow[j] = ((*Lin)[rr][j] - tmp1[rr][j]); + prov[rr][j] = std::fabs(tmp1[rr][j]); + + } + + for (int j = -1 * offset; j < 0; ++j) { + datarow[j] = datarow[rtengine::min(-j, GW - 1)]; + } + + for (int j = GW; j < GW + TS + offset; ++j) { + datarow[j] = datarow[rtengine::max(0, 2 * GW - 2 - j)]; + }//now we have a padded data row + + //now fill this row of the blocks with Lab high pass data + for (int hblk = 0; hblk < numblox_W; ++hblk) { + int left = (hblk - 1) * offset; + int indx = (hblk) * TS; //index of block in malloc + + if (top + i >= 0 && top + i < GH) { + int j; + + for (j = 0; j < rtengine::min((-left), TS); ++j) { + Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + } + + for (; j < rtengine::min(TS, GW - left); ++j) { + Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + totwt[top + i][left + j] += tilemask_in[i][j] * tilemask_out[i][j]; + } + + for (; j < TS; ++j) { + Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + } + } else { + for (int j = 0; j < TS; ++j) { + Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data + } + } + + } + + }//end of filling block row + + //fftwf_print_plan (plan_forward_blox); + if (numblox_W == max_numblox_W) { + fftwf_execute_r2r(plan_forward_blox[0], Lblox, fLblox); // DCT an entire row of tiles + } else { + fftwf_execute_r2r(plan_forward_blox[1], Lblox, fLblox); // DCT an entire row of tiles + } + + // now process the vblk row of blocks for noise reduction + + float noisevar_Ldetail = 1.f; + + if (chrom == 0) { + params_Ldetail = rtengine::min(float(lp.noiseldetail), 99.9f); // max out to avoid div by zero when using noisevar_Ldetail as divisor + noisevar_Ldetail = SQR(static_cast(SQR(100.f - params_Ldetail) + 50.f * (100.f - params_Ldetail)) * TS * 0.5f); + } else if (chrom == 1) { + params_Ldetail = rtengine::min(float(lp.noisechrodetail), 99.9f); + noisevar_Ldetail = 100.f * rtengine::SQR((static_cast(SQR(100.f - params_Ldetail)) * TS * 0.5f));//to test ??? + } + + for (int hblk = 0; hblk < numblox_W; ++hblk) { + ImProcFunctions::RGBtile_denoise(fLblox, hblk, noisevar_Ldetail); + + }//end of horizontal block loop + + //now perform inverse FT of an entire row of blocks + if (numblox_W == max_numblox_W) { + fftwf_execute_r2r(plan_backward_blox[0], fLblox, Lblox); //for DCT + } else { + fftwf_execute_r2r(plan_backward_blox[1], fLblox, Lblox); //for DCT + } + + int topproc = (vblk - 1) * offset; + + //add row of blocks to output image tile + ImProcFunctions::RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, GH, GW, topproc); + + }//end of vertical block loop + } + + //Threshold DCT from Alberto Grigio, adapted to Rawtherapee + const int detail_thresh = lp.detailthr; + array2D mask; + + if (detail_thresh > 0) { + mask(GW, GH); + if (lp.usemask) {//with Laplacian + float amount = LIM01(float(detail_thresh)/100.f); + float thr = (1.f - amount); + float alph = params_Ldetail / 100.f; + array2D LL(GW, GH, prov, ARRAY2D_BYREFERENCE); + laplacian(LL, mask, GW, GH, 25.f, 20000.f, amount, false); + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + mask[i][j] = LIM01(mask[i][j]+ thr); + } + } + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(mask), static_cast(mask), 10 / sk, GW, GH, false); + + } + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + float k = 1.f - mask[i][j] * alph; + mask[i][j] = 1.f - (k * k); + } + } + } else {//with blend mask + float thr = log2lin(float(detail_thresh) / 200.f, 100.f); + buildBlendMask(prov, mask, GW, GH, thr); +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(mask, mask, GW, GH, 20.0 / sk); + } + array2D m2(GW, GH); + constexpr float alfa = 0.856f; + const float beta = 1.f + std::sqrt(log2lin(thr, 100.f)); + buildGradientsMask(GW, GH, prov, m2, params_Ldetail / 100.f, 7, 3, alfa, beta, multiThread); + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + mask[i][j] *= m2[i][j]; + } + } + } + } + + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + float d = Ldetail[i][j] / totwt[i][j]; + + if (detail_thresh > 0) { + d *= mask[i][j]; + } + + //may want to include masking threshold for large hipass data to preserve edges/detail + tmp1[i][j] += d; + } + } + + mask.free(); +//end Threshold DCT + + + delete Lin; + + + for (int i = 0; i < numThreads; ++i) { + fftwf_free(LbloxArray[i]); + fftwf_free(fLbloxArray[i]); + } + + fftwf_destroy_plan(plan_forward_blox[0]); + fftwf_destroy_plan(plan_backward_blox[0]); + fftwf_destroy_plan(plan_forward_blox[1]); + fftwf_destroy_plan(plan_backward_blox[1]); + fftwf_cleanup(); + + +} + +void ImProcFunctions::DeNoise(int call, int aut, bool noiscfactiv, const struct local_params & lp, LabImage * originalmaskbl, LabImage * bufmaskblurbl, int levred, float huerefblur, float lumarefblur, float chromarefblur, LabImage * original, LabImage * transformed, + int cx, int cy, int sk, const LocwavCurve& locwavCurvehue, bool locwavhueutili, float& highresi, float& nresi, float& highresi46, float& nresi46, float& Lhighresi, float& Lnresi, float& Lhighresi46, float& Lnresi46) +{ + BENCHFUN +//local denoise + //all these variables are to prevent use of denoise when non necessary + // but with qualmet = 2 (default for best quality) we must denoise chroma with little values to prevent artifacts due to variations of Hue + // but if user select voluntary denoise, it is that choice the good (priority) + bool execcolor = (lp.chro != 0.f || lp.ligh != 0.f || lp.cont != 0); // only if one slider or more is engaged + bool execbdl = (lp.mulloc[0] != 1.f || lp.mulloc[1] != 1.f || lp.mulloc[2] != 1.f || lp.mulloc[3] != 1.f || lp.mulloc[4] != 1.f || lp.mulloc[5] != 1.f) ;//only if user want cbdl + bool execdenoi = noiscfactiv && ((lp.colorena && execcolor) || (lp.tonemapena && lp.strengt != 0.f) || (lp.cbdlena && execbdl) || (lp.sfena && lp.strng > 0.f) || (lp.lcena && lp.lcamount > 0.f) || (lp.sharpena && lp.shrad > 0.42) || (lp.retiena && lp.str > 0.f) || (lp.exposena && lp.expcomp != 0.f) || (lp.expvib && lp.past != 0.f)); + bool execmaskden = (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.smasktyp != 0; + +// const int ys = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); +// const int ye = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); +// const int xs = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); +// const int xe = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); +// const int hspot = ye - ys; +// const int wspot = xe - xs; + + if (((lp.noiself > 0.f || lp.noiself0 > 0.f || lp.noiself2 > 0.f || lp.nlstr > 0 || lp.wavcurvedenoi || lp.noiselc > 0.f || lp.noisecf > 0.f || lp.noisecc > 0.f + || execmaskden || aut == 1 || aut == 2) && lp.denoiena && lp.quamet != 3) || execdenoi) { // sk == 1 ?? + + StopWatch Stop1("locallab Denoise called"); + + if (aut == 0) { + MyMutex::MyLock lock(*fftwMutex); + } + + if (lp.noisecf >= 0.01f || lp.noisecc >= 0.01f || aut == 1 || aut == 2) { + noiscfactiv = false; + levred = 7; + } + + int GW = transformed->W; + int GH = transformed->H; + + bool HHhuecurve = false; + + if (locwavCurvehue && locwavhueutili) { + for (int i = 0; i < 500; i++) { + if (locwavCurvehue[i] != 0.5f) { + HHhuecurve = true; + break; + } + } + } + + + +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + int minwin = rtengine::min(GW, GH); + int maxlevelspot = 10;//maximum possible + bool isnois = true; + // adap maximum level wavelet to size of crop + while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { + --maxlevelspot ; + } + + levred = rtengine::min(levred, maxlevelspot); + if(levred < 7) {//If windows preview or detail window too small exit to avoid artifacts + isnois = false; + if(lp.quamet == 2) { + isnois = true; + } + } + + if (call == 1 && ((GW >= mDEN && GH >= mDEN && isnois) || lp.quamet == 2)) { + + + LabImage tmp1(transformed->W, transformed->H); + LabImage tmp2(transformed->W, transformed->H); + tmp2.clear(); + + array2D *Lin = nullptr; + array2D *Ain = nullptr; + array2D *Bin = nullptr; + + int max_numblox_W = ceil((static_cast(GW)) / offset) + 2; + // calculate min size of numblox_W. + int min_numblox_W = ceil((static_cast(GW)) / offset) + 2; + + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + tmp1.L[ir][jr] = original->L[ir][jr]; + tmp1.a[ir][jr] = original->a[ir][jr]; + tmp1.b[ir][jr] = original->b[ir][jr]; + } + if(lp.nlstr > 0) { + NLMeans(tmp1.L, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, GW, GH, float (sk), multiThread); + } + + float gamma = lp.noisegam; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.noisegam;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(tmp1.L[y][x], F2V(32768.f) * igammalog(LVFU(tmp1.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < GW; ++x) { + tmp1.L[y][x] = 32768.f * igammalog(tmp1.L[y][x] / 32768.f, gamma, ts, g_a[2], g_a[4]); + } + } + } + + // int DaubLen = 6; + + int levwavL = levred; + int skip = 1; + + wavelet_decomposition Ldecomp(tmp1.L[0], tmp1.W, tmp1.H, levwavL, 1, skip, numThreads, lp.daubLen); + wavelet_decomposition adecomp(tmp1.a[0], tmp1.W, tmp1.H, levwavL, 1, skip, numThreads, lp.daubLen); + wavelet_decomposition bdecomp(tmp1.b[0], tmp1.W, tmp1.H, levwavL, 1, skip, numThreads, lp.daubLen); + + float madL[10][3]; + int edge = 2; + + if (!Ldecomp.memory_allocation_failed()) { +#ifdef _OPENMP + // #pragma omp parallel for schedule(dynamic) collapse(2) if (multiThread) +#endif + for (int lvl = 0; lvl < levred; lvl++) { + for (int dir = 1; dir < 4; dir++) { + int Wlvl_L = Ldecomp.level_W(lvl); + int Hlvl_L = Ldecomp.level_H(lvl); + const float* const* WavCoeffs_L = Ldecomp.level_coeffs(lvl); + madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); + } + } + + float vari[levred]; + float mxsl = 0.f; + // float mxsfl = 0.f; + + edge = 2; + vari[0] = 0.8f * SQR((lp.noiself0 / 125.f) * (1.f + lp.noiself0 / 25.f)); + vari[1] = 0.8f * SQR((lp.noiself / 125.f) * (1.f + lp.noiself / 25.f)); + vari[2] = 0.8f * SQR((lp.noiself2 / 125.f) * (1.f + lp.noiself2 / 25.f)); + + vari[3] = 0.8f * SQR((lp.noiselc / 125.f) * (1.f + lp.noiselc / 25.f)); + vari[4] = 1.f * SQR((lp.noiselc4 / 125.f) * (1.f + lp.noiselc4 / 25.f)); + vari[5] = 1.5f * SQR((lp.noiselc5 / 125.f) * (1.f + lp.noiselc5 / 25.f)); + vari[6] = 2.5f * SQR((lp.noiselc6 / 125.f) * (1.f + lp.noiselc6 / 25.f)); + + { + float kr3 = 0.f; + + if (lp.noiselc < 30.f) { + kr3 = 0.f; + } else if (lp.noiselc < 50.f) { + kr3 = 0.5f; + } else if (lp.noiselc < 70.f) { + kr3 = 0.7f; + } else { + kr3 = 1.f; + } + + vari[0] = rtengine::max(0.000001f, vari[0]); + vari[1] = rtengine::max(0.000001f, vari[1]); + vari[2] = rtengine::max(0.000001f, vari[2]); + vari[3] = rtengine::max(0.000001f, kr3 * vari[3]); + vari[4] = rtengine::max(0.000001f, vari[4]); + vari[5] = rtengine::max(0.000001f, vari[5]); + vari[6] = rtengine::max(0.000001f, vari[6]); + + float* noisevarlum = new float[GH * GW]; + float* noisevarhue = new float[GH * GW]; + int GW2 = (GW + 1) / 2; + + float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value + float nvll[13] = {0.1f, 0.15f, 0.2f, 0.25f, 0.3f, 0.35f, 0.4f, 0.45f, 0.7f, 0.8f, 1.f, 1.f, 1.f}; //low value + + float seuillow = 3000.f;//low + float seuilhigh = 18000.f;//high + int i = 10 - lp.noiselequal; + float ac = (nvlh[i] - nvll[i]) / (seuillow - seuilhigh); + float bc = nvlh[i] - seuillow * ac; + //ac and bc for transition +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + float lN = tmp1.L[ir][jr]; + + if (lN < seuillow) { + noisevarlum[(ir >> 1)*GW2 + (jr >> 1)] = nvlh[i]; + } else if (lN < seuilhigh) { + noisevarlum[(ir >> 1)*GW2 + (jr >> 1)] = ac * lN + bc; + } else { + noisevarlum[(ir >> 1)*GW2 + (jr >> 1)] = nvll[i]; + } + } + + if(lp.enablMask && lp.lnoiselow !=1.f && lp.smasktyp != 0) { + //this code has been reviewed by Ingo in september 2020 PR5903 + float higc; + float hig = lp.thrhigh; + calcdif(hig, higc); + float low = lp.thrlow; + float lowc; + calcdif(low, lowc); + + if(higc < lowc) { + higc = lowc + 0.01f; + } + + float alow = -(lp.lnoiselow - 1.f) / lowc; + float blow = lp.lnoiselow; + float ahigh = 0.9999f / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + const float lM = bufmaskblurbl->L[ir][jr]; + const float lmr = lM / 327.68f; + + if (lM < 327.68f * lowc) { + noisevarlum[(ir >> 1) * GW2 + (jr >> 1)] *= alow * lmr + blow; + } else if (lM < 327.68f * higc) { + // do nothing - denoise not change + } else { + noisevarlum[(ir >> 1) * GW2 + (jr >> 1)] *= ahigh * lmr + bhigh; + } + } + } + + + if(HHhuecurve) { + //same code as in wavelet levels + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + float hueG = xatan2f(tmp1.b[ir][jr], tmp1.a[ir][jr]); + float valparam = 2.f * (locwavCurvehue[500.f * static_cast(Color::huelab_to_huehsv2(hueG))] - 0.5f); //get H=f(H) + noisevarhue[(ir >> 1)*GW2 + (jr >> 1)] = 1.f + valparam; + noisevarlum[(ir >> 1)*GW2 + (jr >> 1)] *= noisevarhue[(ir >> 1)*GW2 + (jr >> 1)]; + } + } + + + if ((lp.quamet == 0 && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) { + WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); + + } else if (lp.quamet == 1){ + + WaveletDenoiseAll_BiShrinkL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); + + WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); + + } + + delete[] noisevarlum; + delete[] noisevarhue; + + } + } + + + float variC[levred]; + float variCb[levred]; + + float noisecfr = lp.noisecf; + float noiseccr = lp.noisecc; + + if (lp.adjch > 0.f) { + noisecfr = lp.noisecf + 0.1f * lp.adjch; + noiseccr = lp.noisecc + 0.1f * lp.adjch; + } + + float noisecfb = lp.noisecf; + float noiseccb = lp.noisecc; + + if (lp.adjch < 0.f) { + noisecfb = lp.noisecf - 0.1f * lp.adjch; + noiseccb = lp.noisecc - 0.1f * lp.adjch; + } + + + if (noisecfr < 0.f) { + noisecfr = 0.00001f; + } + + if (noiseccr < 0.f) { + noiseccr = 0.00001f; + } + + if (noisecfb < 0.f) { + noisecfb = 0.00001f; + } + + if (noiseccb < 0.f) { + noiseccb = 0.00001f; + } + + if (!adecomp.memory_allocation_failed() && !bdecomp.memory_allocation_failed()) { + float maxccoarse = 0.f; + + edge = 2; + variC[0] = SQR(noisecfr); + variC[1] = SQR(noisecfr); + variC[2] = SQR(noisecfr); + variC[3] = SQR(1.2f * noisecfr); + variC[4] = SQR(noisecfr); + variC[5] = SQR(1.2f * noiseccr); + variC[6] = SQR(1.5f * noiseccr); + + variCb[0] = SQR(noisecfb); + variCb[1] = SQR(noisecfb); + variCb[2] = SQR(noisecfb); + variCb[3] = SQR(noisecfb); + variCb[4] = SQR(noisecfb); + variCb[5] = SQR(1.2f * noiseccb); + variCb[6] = SQR(1.5f * noiseccb); + + + { + float minic = 0.000001f; + + if (noiscfactiv) { + minic = 0.1f;//only for artifact shape detection + } + + float k1 = 0.f; + float k2 = 0.f; + float k3 = 0.f; + + if (lp.noisecf < 0.2f) { + k1 = 0.05f; + k2 = 0.f; + k3 = 0.f; + } else if (lp.noisecf < 0.3f) { + k1 = 0.1f; + k2 = 0.0f; + k3 = 0.f; + } else if (lp.noisecf < 0.5f) { + k1 = 0.2f; + k2 = 0.1f; + k3 = 0.f; + } else if (lp.noisecf < 0.8f) { + k1 = 0.3f; + k2 = 0.25f; + k3 = 0.f; + } else if (lp.noisecf < 1.f) { + k1 = 0.4f; + k2 = 0.25f; + k3 = 0.1f; + } else if (lp.noisecf < 2.f) { + k1 = 0.5f; + k2 = 0.3f; + k3 = 0.15f; + } else if (lp.noisecf < 3.f) { + k1 = 0.6f; + k2 = 0.45f; + k3 = 0.3f; + } else if (lp.noisecf < 4.f) { + k1 = 0.7f; + k2 = 0.5f; + k3 = 0.4f; + } else if (lp.noisecf < 5.f) { + k1 = 0.8f; + k2 = 0.6f; + k3 = 0.5f; + } else if (lp.noisecf < 6.f) { + k1 = 0.85f; + k2 = 0.7f; + k3 = 0.6f; + } else if (lp.noisecf < 8.f) { + k1 = 0.9f; + k2 = 0.8f; + k3 = 0.7f; + } else if (lp.noisecf < 10.f) { + k1 = 1.f; + k2 = 1.f; + k3 = 0.9f; + + } else { + k1 = 1.f; + k2 = 1.f; + k3 = 1.5f; + } + + variC[0] = rtengine::max(minic, variC[0]); + variC[1] = rtengine::max(minic, k1 * variC[1]); + variC[2] = rtengine::max(minic, k2 * variC[2]); + variC[3] = rtengine::max(minic, k3 * variC[3]); + + variCb[0] = rtengine::max(minic, variCb[0]); + variCb[1] = rtengine::max(minic, k1 * variCb[1]); + variCb[2] = rtengine::max(minic, k2 * variCb[2]); + variCb[3] = rtengine::max(minic, k3 * variCb[3]); + + float k4 = 0.f; + float k5 = 0.f; + float k6 = 0.f; + + if (lp.noisecc < 0.2f) { + k4 = 0.1f; + k5 = 0.02f; + } else if (lp.noisecc < 0.5f) { + k4 = 0.15f; + k5 = 0.05f; + } else if (lp.noisecc < 1.f) { + k4 = 0.15f; + k5 = 0.1f; + } else if (lp.noisecc < 3.f) { + k4 = 0.3f; + k5 = 0.15f; + } else if (lp.noisecc < 4.f) { + k4 = 0.6f; + k5 = 0.4f; + } else if (lp.noisecc < 6.f) { + k4 = 0.8f; + k5 = 0.6f; + } else { + k4 = 1.f; + k5 = 1.f; + } + + variC[4] = rtengine::max(0.000001f, k4 * variC[4]); + variC[5] = rtengine::max(0.000001f, k5 * variC[5]); + variCb[4] = rtengine::max(0.000001f, k4 * variCb[4]); + variCb[5] = rtengine::max(0.000001f, k5 * variCb[5]); + + if (lp.noisecc < 4.f) { + k6 = 0.f; + } else if (lp.noisecc < 5.f) { + k6 = 0.4f; + } else if (lp.noisecc < 6.f) { + k6 = 0.7f; + } else { + k6 = 1.f; + } + + variC[6] = rtengine::max(0.00001f, k6 * variC[6]); + variCb[6] = rtengine::max(0.00001f, k6 * variCb[6]); + + + float* noisevarchrom = new float[GH * GW]; + //noisevarchrom in function chroma + int GW2 = (GW + 1) / 2; + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + + if (lp.noisecf > 100.f) { + nvch = 0.8f; + nvcl = 0.4f; + } + + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + float cN = std::sqrt(SQR(tmp1.a[ir][jr]) + SQR(tmp1.b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvcl; + } + } + + + float noisevarab_r = 100.f; //SQR(lp.noisecc / 10.0); + + if ((lp.quamet == 0 && aut == 0) || (maxccoarse < 0.1f && (aut == 1 || aut == 2))) { + WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); + } else if (lp.quamet == 1){ + WaveletDenoiseAll_BiShrinkAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); + + WaveletDenoiseAll_BiShrinkAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); + } + + delete[] noisevarchrom; + + } + } + + if (!Ldecomp.memory_allocation_failed()) { + Lin = new array2D(GW, GH); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + (*Lin)[i][j] = tmp1.L[i][j]; + } + } + + Ldecomp.reconstruct(tmp1.L[0]); + } + + if (!Ldecomp.memory_allocation_failed() && aut == 0) { + if ((lp.noiself >= 0.01f || lp.noiself0 >= 0.01f || lp.noiself2 >= 0.01f || lp.wavcurvedenoi || lp.noiselc >= 0.01f) && levred == 7 && lp.noiseldetail != 100.f && lp.quamet < 2) { + fftw_denoise(sk, GW, GH, max_numblox_W, min_numblox_W, tmp1.L, Lin, numThreads, lp, 0); + } + } + + if (!adecomp.memory_allocation_failed()) { + Ain = new array2D(GW, GH); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + (*Ain)[i][j] = tmp1.a[i][j]; + } + } + + adecomp.reconstruct(tmp1.a[0]); + } + + + if (!adecomp.memory_allocation_failed() && aut == 0) { + if ((lp.noisecf >= 0.01f || lp.noisecc >= 0.01f) && levred == 7 && lp.noisechrodetail != 100.f) { + fftw_denoise(sk, GW, GH, max_numblox_W, min_numblox_W, tmp1.a, Ain, numThreads, lp, 1); + } + } + + + if (!bdecomp.memory_allocation_failed()) { + + Bin = new array2D(GW, GH); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + (*Bin)[i][j] = tmp1.b[i][j]; + } + } + + bdecomp.reconstruct(tmp1.b[0]); + } + + + if (!bdecomp.memory_allocation_failed() && aut == 0) { + if ((lp.noisecf >= 0.01f || lp.noisecc >= 0.01f) && levred == 7 && lp.noisechrodetail != 100.f) { + fftw_denoise(sk, GW, GH, max_numblox_W, min_numblox_W, tmp1.b, Bin, numThreads, lp, 1); + } + + } + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(tmp1.L[y][x], F2V(32768.f) * gammalog(LVFU(tmp1.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < GW; ++x) { + tmp1.L[y][x] = 32768.f * gammalog(tmp1.L[y][x] / 32768.f, gamma, ts, g_a[3], g_a[4]); + } + } + } + + if(lp.smasktyp != 0) { + if(lp.enablMask && lp.recothrd != 1.f) { + LabImage tmp3(GW, GH); + + for (int ir = 0; ir < GH; ir++){ + for (int jr = 0; jr < GW; jr++) { + tmp3.L[ir][jr] = original->L[ir][jr]; + tmp3.a[ir][jr] = original->a[ir][jr]; + tmp3.b[ir][jr] = original->b[ir][jr]; + } + } + + array2D masklum(GW, GH); + array2D masklumch(GW, GH); + + float hig = lp.higthrd; + float higc; + calcdif(hig, higc); + float low = lp.lowthrd; + float lowc; + calcdif(low, lowc); + float mid = 0.01f * lp.midthrd; + float midch = 0.01f * lp.midthrdch; + + if(higc < lowc) { + higc = lowc + 0.01f; + } + float th = (lp.recothrd - 1.f); + float ahigh = th / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + + float alow = th / lowc; + float blow = 1.f - th; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < GH; ir++) { + for (int jr = 0; jr < GW; jr++) { + const float lmr = bufmaskblurbl->L[ir][jr] / 327.68f; + float k; + float kch; + if (lmr < lowc) { + k = alow * lmr + blow; + kch = alow * lmr + blow; + } else if (lmr < higc) { + k = 1.f - mid; + kch = 1.f - midch; + } else { + k = ahigh * lmr + bhigh; + kch = ahigh * lmr + bhigh; + } + if(lp.invmaskd) { + masklum[ir][jr] = 1.f - pow_F(k, lp.decayd); + masklumch[ir][jr] = 1.f - pow_F(kch, lp.decayd); + } else { + masklum[ir][jr] = pow_F(k, lp.decayd); + masklumch[ir][jr] = pow_F(kch, lp.decayd); + } + } + } + + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, GW, GH, multiThread); + boxblur(static_cast(masklumch), static_cast(masklumch), 10 / sk, GW, GH, multiThread); + } +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < GH; ++i) { + for (int j = 0; j < GW; ++j) { + tmp1.L[i][j] = (tmp3.L[i][j] - tmp1.L[i][j]) * LIM01(masklum[i][j]) + tmp1.L[i][j]; + tmp1.a[i][j] = (tmp3.a[i][j] - tmp1.a[i][j]) * LIM01(masklumch[i][j]) + tmp1.a[i][j]; + tmp1.b[i][j] = (tmp3.b[i][j] - tmp1.b[i][j]) * LIM01(masklumch[i][j]) + tmp1.b[i][j]; + } + } + masklum.free(); + masklumch.free(); + } + +// re read wavelet decomposition to calaculate noise residual + float chresid = 0.f; + float chresidtemp = 0.f; + float chmaxresid = 0.f; + float chmaxresidtemp = 0.f; + float chresid46 = 0.f; + float chresidtemp46 = 0.f; + float chmaxresid46 = 0.f; + float chmaxresidtemp46 = 0.f; + float Lresid = 0.f; + float Lmaxresid = 0.f; + float Lresid46 = 0.f; + float Lmaxresid46 = 0.f; + + +//calculate and display residual noise luma and chroma +// various coefficient from 1 to 5 - tries to take into account the difference between calculate Noise and percepted noise + wavelet_decomposition Ldecompinf(tmp1.L[0], tmp1.W, tmp1.H, levwavL, 1, skip, numThreads, lp.daubLen); + wavelet_decomposition adecompinf(tmp1.a[0], tmp1.W, tmp1.H, levwavL, 1, skip, numThreads, lp.daubLen); + wavelet_decomposition bdecompinf(tmp1.b[0], tmp1.W, tmp1.H, levwavL, 1, skip, numThreads, lp.daubLen); + + Noise_residualAB(adecompinf, chresid, chmaxresid, false, 0, 3); + chresidtemp = chresid; + chmaxresidtemp = chmaxresid; + Noise_residualAB(bdecompinf, chresid, chmaxresid, false, 0, 3); + chresid += chresidtemp; + chmaxresid += chmaxresidtemp; + int nbmaddir = 4; + chresid = sqrt(chresid / ( 3 * nbmaddir * 2)); + highresi = chresid + 0.5f * (sqrt(chmaxresid) - chresid); //evaluate sigma + nresi = chresid; + highresi /= 1.4f;//arbitrary coefficient + nresi /= 1.4f; + + // printf("nresi03=%f highresi=%f \n", (double) nresi, (double) highresi); + + + Noise_residualAB(adecompinf, chresid46, chmaxresid46, false, 4, 6); + nbmaddir = 3; + chresidtemp46 = chresid46; + chmaxresidtemp46 = chmaxresid46; + Noise_residualAB(bdecompinf, chresid46, chmaxresid46, false, 4, 6); + chresid46 += chresidtemp46; + chmaxresid46 += chmaxresidtemp46; + chresid46 = sqrt(chresid46 / ( 3 * nbmaddir * 2)); + highresi46 = chresid46 + 0.5f * (sqrt(chmaxresid46) - chresid46); //evaluate sigma + nresi46 = chresid46; + highresi46 /= 2.f;//arbitrary coefficient + nresi46 /= 2.f; + + // printf("nresi46=%f highresi=%f \n", (double) nresi46, (double) highresi46); + + + Noise_residualAB(Ldecompinf, Lresid, Lmaxresid, false, 0, 3); + nbmaddir = 4; + Lresid = sqrt(Lresid / (3 * nbmaddir)); + Lhighresi = Lresid + 0.5f * (sqrt(Lmaxresid) - Lresid); //evaluate sigma + Lnresi = Lresid; + Lnresi /= 2.f;//arbitrary coefficient + Lhighresi /= 2.f; + // printf("Lresi03=%f Lhighresi=%f levwavL=%i\n", (double) Lnresi, (double) Lhighresi, levwavL); + + Noise_residualAB(Ldecompinf, Lresid46, Lmaxresid46, false, 4, 6); + nbmaddir = 3; + Lresid46 = sqrt(Lresid46 / (3 * nbmaddir)); + Lhighresi46 = Lresid46 + 0.5f * (sqrt(Lmaxresid46) - Lresid46); //evaluate sigma + Lnresi46 = Lresid46; + Lhighresi46 /= 5.f;//arbitrary coefficient + Lnresi46 /= 5.f; + // printf("Lresi46=%f Lhighresi=%f levwavL=%i\n", (double) Lnresi46, (double) Lhighresi46, levwavL); + +// end calculate + + DeNoise_Local(call, lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk); + + } else { + DeNoise_Local(call, lp, original, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, tmp1, cx, cy, sk); + } + } else if (call == 2) { //simpleprocess + + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + const int bfh = yend - ystart; + const int bfw = xend - xstart; + + if (bfh >= mDEN && bfw >= mDEN) { + LabImage bufwv(bfw, bfh); + bufwv.clear(true); + array2D *Lin = nullptr; + array2D *Ain = nullptr; + array2D *Bin = nullptr; + + int max_numblox_W = ceil((static_cast(bfw)) / offset) + 2; + // calculate min size of numblox_W. + int min_numblox_W = ceil((static_cast(bfw)) / offset) + 2; + // these are needed only for creation of the plans and will be freed before entering the parallel loop + + + int begy = ystart; //lp.yc - lp.lyT; + int begx = xstart; //lp.xc - lp.lxL; + int yEn = yend; //lp.yc + lp.ly; + int xEn = xend; //lp.xc + lp.lx; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H ; y++) //{ + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + int loy = cy + y; + + if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + bufwv.L[loy - begy][lox - begx] = original->L[y][x]; + bufwv.a[loy - begy][lox - begx] = original->a[y][x]; + bufwv.b[loy - begy][lox - begx] = original->b[y][x]; + } + + } + + float gamma = lp.noisegam; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.noisegam;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; + +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufwv.L[y][x], F2V(32768.f) * igammalog(LVFU(bufwv.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufwv.L[y][x] = 32768.f * igammalog(bufwv.L[y][x] / 32768.f, gamma, ts, g_a[2], g_a[4]); + } + } + } + + // int DaubLen = 6; + + int levwavL = levred; + int skip = 1; + wavelet_decomposition Ldecomp(bufwv.L[0], bufwv.W, bufwv.H, levwavL, 1, skip, numThreads, lp.daubLen); + wavelet_decomposition adecomp(bufwv.a[0], bufwv.W, bufwv.H, levwavL, 1, skip, numThreads, lp.daubLen); + wavelet_decomposition bdecomp(bufwv.b[0], bufwv.W, bufwv.H, levwavL, 1, skip, numThreads, lp.daubLen); + float madL[10][3]; + int edge = 2; + + if (!Ldecomp.memory_allocation_failed()) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) if (multiThread) +#endif + for (int lvl = 0; lvl < levred; lvl++) { + for (int dir = 1; dir < 4; dir++) { + int Wlvl_L = Ldecomp.level_W(lvl); + int Hlvl_L = Ldecomp.level_H(lvl); + + const float* const* WavCoeffs_L = Ldecomp.level_coeffs(lvl); + + madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); + } + } + + float vari[levred]; + float mxsl = 0.f; + + { + edge = 2; + vari[0] = 0.8f * SQR((lp.noiself0 / 125.f) * (1.f + lp.noiself0 / 25.f)); + vari[1] = 0.8f * SQR((lp.noiself / 125.f) * (1.f + lp.noiself / 25.f)); + vari[2] = 0.8f * SQR((lp.noiself2 / 125.f) * (1.f + lp.noiself2 / 25.f)); + vari[3] = 0.8f * SQR((lp.noiselc / 125.f) * (1.f + lp.noiselc / 25.f)); + vari[4] = 1.f * SQR((lp.noiselc4 / 125.f) * (1.f + lp.noiselc4 / 25.f)); + vari[5] = 1.5f * SQR((lp.noiselc5 / 125.f) * (1.f + lp.noiselc5 / 25.f)); + vari[6] = 2.5f * SQR((lp.noiselc6 / 125.f) * (1.f + lp.noiselc6 / 25.f)); + } + + { + float kr3 = 0.f; + + { + if (lp.noiselc < 30.f) { + kr3 = 0.f; + } else if (lp.noiselc < 50.f) { + kr3 = 0.5f; + } else if (lp.noiselc < 70.f) { + kr3 = 0.7f; + } else { + kr3 = 1.f; + } + } + + vari[0] = rtengine::max(0.000001f, vari[0]); + vari[1] = rtengine::max(0.000001f, vari[1]); + vari[2] = rtengine::max(0.000001f, vari[2]); + vari[3] = rtengine::max(0.000001f, kr3 * vari[3]); + vari[4] = rtengine::max(0.000001f, vari[4]); + vari[5] = rtengine::max(0.000001f, vari[5]); + vari[6] = rtengine::max(0.000001f, vari[6]); + + // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL + float* noisevarlum = new float[bfh * bfw]; + float* noisevarhue = new float[bfh * bfw]; + int bfw2 = (bfw + 1) / 2; + + float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value + float nvll[13] = {0.1f, 0.15f, 0.2f, 0.25f, 0.3f, 0.35f, 0.4f, 0.45f, 0.7f, 0.8f, 1.f, 1.f, 1.f}; //low value + + float seuillow = 3000.f;//low + float seuilhigh = 18000.f;//high + int i = 10 - lp.noiselequal; + float ac = (nvlh[i] - nvll[i]) / (seuillow - seuilhigh); + float bc = nvlh[i] - seuillow * ac; + //ac and bc for transition +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float lN = bufwv.L[ir][jr]; + + if (lN < seuillow) { + noisevarlum[(ir >> 1)*bfw2 + (jr >> 1)] = nvlh[i]; + } else if (lN < seuilhigh) { + noisevarlum[(ir >> 1)*bfw2 + (jr >> 1)] = ac * lN + bc; + } else { + noisevarlum[(ir >> 1)*bfw2 + (jr >> 1)] = nvll[i]; + } + } + + if(lp.enablMask && lp.lnoiselow != 1.f && lp.smasktyp != 0) { + //this code has been reviewed by Ingo in september 2020 PR5903 + //i just change parameters to better progressivity + float higc; + float hig = lp.thrhigh; + calcdif(hig, higc); + float low = lp.thrlow; + float lowc; + calcdif(low, lowc); + + if(higc < lowc) { + higc = lowc + 0.01f; + } + + float alow = -(lp.lnoiselow - 1.f) / lowc; + float blow = lp.lnoiselow; + float ahigh = 0.9999f / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + const float lM = bufmaskblurbl->L[ir + ystart][jr + xstart]; + const float lmr = lM / 327.68f; + if (lM < 327.68f * lowc) { + noisevarlum[(ir >> 1) * bfw2 + (jr >> 1)] *= alow * lmr + blow; + } else if (lM < 327.68f * higc) { + // do nothing + } else { + noisevarlum[(ir >> 1) * bfw2 + (jr >> 1)] *= ahigh * lmr + bhigh; + } + } + } + + + if(HHhuecurve) { + //same code as in wavelet levels +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float hueG = xatan2f(bufwv.b[ir][jr], bufwv.a[ir][jr]); + float valparam = 2.f * (locwavCurvehue[500.f * static_cast(Color::huelab_to_huehsv2(hueG))] - 0.5f); //get H=f(H) + noisevarhue[(ir >> 1)* bfw2 + (jr >> 1)] = 1.f + valparam; + noisevarlum[(ir >> 1)* bfw2 + (jr >> 1)] *= noisevarhue[(ir >> 1)* bfw2 + (jr >> 1)]; + } + } + + + if ((lp.quamet == 0 && aut == 0) || (mxsl < 1.f && (aut == 1 || aut == 2))) { + WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); + } else if (lp.quamet == 1) { + WaveletDenoiseAll_BiShrinkL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); + WaveletDenoiseAllL(Ldecomp, noisevarlum, madL, vari, edge, numThreads); + } + + delete [] noisevarlum; + delete [] noisevarhue; + + } + } + + + float variC[levred]; + float variCb[levred]; + + float noisecfr = lp.noisecf; + float noiseccr = lp.noisecc; + + if (lp.adjch > 0.f) { + noisecfr = lp.noisecf + 0.1f * lp.adjch; + noiseccr = lp.noisecc + 0.1f * lp.adjch; + } + + float noisecfb = lp.noisecf; + float noiseccb = lp.noisecc; + + if (lp.adjch < 0.f) { + noisecfb = lp.noisecf - 0.1f * lp.adjch; + noiseccb = lp.noisecc - 0.1f * lp.adjch; + } + + + if (noisecfr < 0.f) { + noisecfr = 0.00001f; + } + + if (noiseccr < 0.f) { + noiseccr = 0.00001f; + } + + if (noisecfb < 0.f) { + noisecfb = 0.00001f; + } + + if (noiseccb < 0.f) { + noiseccb = 0.00001f; + } + + + if (!adecomp.memory_allocation_failed() && !bdecomp.memory_allocation_failed()) { + float maxccoarse = 0.f; + + + { + edge = 2; + variC[0] = SQR(noisecfr); + variC[1] = SQR(noisecfr); + variC[2] = SQR(noisecfr); + variC[3] = SQR(1.2f * noisecfr); + variC[4] = SQR(noisecfr); + variC[5] = SQR(1.2f * noiseccr); + variC[6] = SQR(1.5f * noiseccr); + + variCb[0] = SQR(noisecfb); + variCb[1] = SQR(noisecfb); + variCb[2] = SQR(noisecfb); + variCb[3] = SQR(noisecfb); + variCb[4] = SQR(noisecfb); + variCb[5] = SQR(1.2f * noiseccb); + variCb[6] = SQR(1.5f * noiseccb); + + } + + { + float minic = 0.000001f; + + if (noiscfactiv) { + minic = 0.1f;//only for artifact shape detection + } + + float k1 = 0.f; + float k2 = 0.f; + float k3 = 0.f; + + if (lp.noisecf < 0.2f) { + k1 = 0.05f; + k2 = 0.f; + k3 = 0.f; + } else if (lp.noisecf < 0.3f) { + k1 = 0.1f; + k2 = 0.0f; + k3 = 0.f; + } else if (lp.noisecf < 0.5f) { + k1 = 0.2f; + k2 = 0.1f; + k3 = 0.f; + } else if (lp.noisecf < 0.8f) { + k1 = 0.3f; + k2 = 0.25f; + k3 = 0.f; + } else if (lp.noisecf < 1.f) { + k1 = 0.4f; + k2 = 0.25f; + k3 = 0.1f; + } else if (lp.noisecf < 2.f) { + k1 = 0.5f; + k2 = 0.3f; + k3 = 0.15f; + } else if (lp.noisecf < 3.f) { + k1 = 0.6f; + k2 = 0.45f; + k3 = 0.3f; + } else if (lp.noisecf < 4.f) { + k1 = 0.7f; + k2 = 0.5f; + k3 = 0.4f; + } else if (lp.noisecf < 5.f) { + k1 = 0.8f; + k2 = 0.6f; + k3 = 0.5f; + } else if (lp.noisecf < 6.f) { + k1 = 0.85f; + k2 = 0.7f; + k3 = 0.6f; + } else if (lp.noisecf < 8.f) { + k1 = 0.9f; + k2 = 0.8f; + k3 = 0.7f; + } else if (lp.noisecf < 10.f) { + k1 = 1.f; + k2 = 1.f; + k3 = 0.9f; + + } else { + k1 = 1.f; + k2 = 1.f; + k3 = 1.5f; + } + + variC[0] = rtengine::max(minic, variC[0]); + variC[1] = rtengine::max(minic, k1 * variC[1]); + variC[2] = rtengine::max(minic, k2 * variC[2]); + variC[3] = rtengine::max(minic, k3 * variC[3]); + + variCb[0] = rtengine::max(minic, variCb[0]); + variCb[1] = rtengine::max(minic, k1 * variCb[1]); + variCb[2] = rtengine::max(minic, k2 * variCb[2]); + variCb[3] = rtengine::max(minic, k3 * variCb[3]); + + { + float k4 = 0.f; + float k5 = 0.f; + float k6 = 0.f; + + if (lp.noisecc < 0.2f) { + k4 = 0.1f; + k5 = 0.02f; + } else if (lp.noisecc < 0.5f) { + k4 = 0.15f; + k5 = 0.05f; + } else if (lp.noisecc < 1.f) { + k4 = 0.15f; + k5 = 0.1f; + } else if (lp.noisecc < 3.f) { + k4 = 0.3f; + k5 = 0.15f; + } else if (lp.noisecc < 4.f) { + k4 = 0.6f; + k5 = 0.4f; + } else if (lp.noisecc < 6.f) { + k4 = 0.8f; + k5 = 0.6f; + } else { + k4 = 1.f; + k5 = 1.f; + } + + + variC[4] = rtengine::max(0.000001f, k4 * variC[4]); + variC[5] = rtengine::max(0.000001f, k5 * variC[5]); + variCb[4] = rtengine::max(0.000001f, k4 * variCb[4]); + variCb[5] = rtengine::max(0.000001f, k5 * variCb[5]); + + if (lp.noisecc < 4.f) { + k6 = 0.f; + } else if (lp.noisecc < 5.f) { + k6 = 0.4f; + } else if (lp.noisecc < 6.f) { + k6 = 0.7f; + } else { + k6 = 1.f; + } + + variC[6] = rtengine::max(0.00001f, k6 * variC[6]); + variCb[6] = rtengine::max(0.00001f, k6 * variCb[6]); + } + + float* noisevarchrom = new float[bfh * bfw]; + int bfw2 = (bfw + 1) / 2; + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + + if (lp.noisecf > 30.f) { + nvch = 0.8f; + nvcl = 0.4f; + } + + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float cN = std::sqrt(SQR(bufwv.a[ir][jr]) + SQR(bufwv.b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*bfw2 + (jr >> 1)] = nvcl; + } + } + + float noisevarab_r = 100.f; //SQR(lp.noisecc / 10.0); + + if ((lp.quamet == 0 && aut == 0) || (maxccoarse < 0.1f && (aut == 1 || aut == 2))) { + WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); + } else if (lp.quamet == 1){ + WaveletDenoiseAll_BiShrinkAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, numThreads); + + WaveletDenoiseAll_BiShrinkAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); + WaveletDenoiseAllAB(Ldecomp, bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, numThreads); + } + + delete[] noisevarchrom; + } + } + + if (!Ldecomp.memory_allocation_failed()) { + Lin = new array2D(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + (*Lin)[i][j] = bufwv.L[i][j]; + } + } + + Ldecomp.reconstruct(bufwv.L[0]); + } + + + if (!Ldecomp.memory_allocation_failed() && aut == 0) { + + + if ((lp.noiself >= 0.01f || lp.noiself0 >= 0.01f || lp.noiself2 >= 0.01f || lp.wavcurvedenoi || lp.noiselc >= 0.01f) && levred == 7 && lp.noiseldetail != 100.f && lp.quamet < 2) { + fftw_denoise(sk, bfw, bfh, max_numblox_W, min_numblox_W, bufwv.L, Lin, numThreads, lp, 0); + } + } + + + if (!adecomp.memory_allocation_failed()) { + Ain = new array2D(bfw, bfh); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + (*Ain)[i][j] = bufwv.a[i][j]; + } + } + + adecomp.reconstruct(bufwv.a[0]); + } + + if (!adecomp.memory_allocation_failed() && aut == 0) { + if ((lp.noisecf >= 0.001f || lp.noisecc >= 0.001f) && levred == 7 && lp.noisechrodetail != 100.f) { + fftw_denoise(sk, bfw, bfh, max_numblox_W, min_numblox_W, bufwv.a, Ain, numThreads, lp, 1); + } + } + + + if (!bdecomp.memory_allocation_failed()) { + Bin = new array2D(bfw, bfh); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + (*Bin)[i][j] = bufwv.b[i][j]; + } + } + + bdecomp.reconstruct(bufwv.b[0]); + } + + if (!bdecomp.memory_allocation_failed() && aut == 0) { + if ((lp.noisecf >= 0.001f || lp.noisecc >= 0.001f) && levred == 7 && lp.noisechrodetail != 100.f) { + fftw_denoise(sk, bfw, bfh, max_numblox_W, min_numblox_W, bufwv.b, Bin, numThreads, lp, 1); + } + } + + if(gamma > 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; + +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + + STVFU(bufwv.L[y][x], F2V(32768.f) * gammalog(LVFU(bufwv.L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw ; ++x) { + + bufwv.L[y][x] = 32768.f * gammalog(bufwv.L[y][x] / 32768.f, gamma, ts, g_a[3], g_a[4]); + } + } + } + + if(lp.nlstr > 0) { + NLMeans(bufwv.L, lp.nlstr, lp.nldet, lp.nlpat, lp.nlrad, lp.nlgam, bfw, bfh, 1.f, multiThread); + } + + + if (lp.smasktyp != 0) { + if(lp.enablMask && lp.recothrd != 1.f) { + LabImage tmp3(bfw, bfh); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H ; y++) { + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + int loy = cy + y; + + if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + tmp3.L[loy - begy][lox - begx] = original->L[y][x]; + tmp3.a[loy - begy][lox - begx] = original->a[y][x]; + tmp3.b[loy - begy][lox - begx] = original->b[y][x]; + } + + } + } + + array2D masklum; + array2D masklumch; + masklum(bfw, bfh); + masklumch(bfw, bfh); + for (int ir = 0; ir < bfh; ir++){ + for (int jr = 0; jr < bfw; jr++) { + masklum[ir][jr] = 1.f; + masklumch[ir][jr] = 1.f; + } + } + + float hig = lp.higthrd; + float higc; + calcdif(hig, higc); + float low = lp.lowthrd; + float lowc; + calcdif(low, lowc); + float mid = 0.01f * lp.midthrd; + float midch = 0.01f * lp.midthrdch; + + if(higc < lowc) { + higc = lowc + 0.01f; + } + float th = (lp.recothrd - 1.f); + float ahigh = th / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + + float alow = th / lowc; + float blow = 1.f - th; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart, lox = cx + x; x < xend; x++, lox++) { + + const float lM = bufmaskblurbl->L[y][x]; + const float lmr = lM / 327.68f; + if (lM < 327.68f * lowc) { + masklum[y-ystart][x-xstart] = alow * lmr + blow; + masklumch[y-ystart][x-xstart] = alow * lmr + blow; + } else if (lM < 327.68f * higc) { + masklum[y-ystart][x-xstart] = 1.f - mid; + masklumch[y-ystart][x-xstart] = 1.f - midch; + + } else { + masklum[y-ystart][x-xstart] = ahigh * lmr + bhigh; + masklumch[y-ystart][x-xstart] = ahigh * lmr + bhigh; + } + float k = masklum[y-ystart][x-xstart]; + float kch = masklumch[y-ystart][x-xstart]; + if(lp.invmaskd == true) { + masklum[y-ystart][x-xstart] = 1.f - pow(k, lp.decayd); + masklumch[y-ystart][x-xstart] = 1.f - pow(kch, lp.decayd); + } else { + masklum[y-ystart][x-xstart] = pow(k, lp.decayd); + masklumch[y-ystart][x-xstart] = pow(kch, lp.decayd); + } + } + } + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, bfw, bfh, false); + boxblur(static_cast(masklumch), static_cast(masklumch), 10 / sk, bfw, bfh, false); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufwv.L[y][x] = (tmp3.L[y][x] - bufwv.L[y][x]) * LIM01(masklum[y][x]) + bufwv.L[y][x]; + bufwv.a[y][x] = (tmp3.a[y][x] - bufwv.a[y][x]) * LIM01(masklumch[y][x]) + bufwv.a[y][x]; + bufwv.b[y][x] = (tmp3.b[y][x] - bufwv.b[y][x]) * LIM01(masklumch[y][x]) + bufwv.b[y][x]; + } + } + + masklum.free(); + masklumch.free(); + } + + DeNoise_Local2(lp, originalmaskbl, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk); + } else { + DeNoise_Local2(lp, original, levred, huerefblur, lumarefblur, chromarefblur, original, transformed, bufwv, cx, cy, sk); + } + } + } + + } + +} + +float triangle(float a, float a1, float b) +{ + if (a != b) { + float b1; + float a2 = a1 - a; + + if (b < a) { + b1 = b + a2 * b / a ; + } else { + b1 = b + a2 * (65535.f - b) / (65535.f - a); + } + + return b1; + } + + return a1; +} + +void rgbtone(float& maxval, float& medval, float& minval, const LUTf& lutToneCurve) +{ + float minvalold = minval, medvalold = medval, maxvalold = maxval; + + maxval = lutToneCurve[maxvalold]; + minval = lutToneCurve[minvalold]; + medval = minval + ((maxval - minval) * (medvalold - minvalold) / (maxvalold - minvalold)); +} + +void ImProcFunctions::clarimerge(const struct local_params& lp, float &mL, float &mC, bool &exec, LabImage *tmpresid, int wavelet_level, int sk, int numThreads) +{ + if (mL != 0.f && mC == 0.f) { + mC = 0.0001f; + exec = true; + } + + if (mC != 0.f && mL == 0.f) { + mL = 0.0001f; + exec = true; + } + + if (mL != 0.f && mC != 0.f) { + exec = true; + } + + if (mL != 0.f) { + + wavelet_decomposition *wdspotresid = new wavelet_decomposition(tmpresid->L[0], tmpresid->W, tmpresid->H, wavelet_level, 1, sk, numThreads, lp.daubLen); + + if (wdspotresid->memory_allocation_failed()) { + return; + } + + int maxlvlresid = wdspotresid->maxlevel(); + + if (maxlvlresid > 4) {//Clarity +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) +#endif + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < maxlvlresid; ++level) { + int W_L = wdspotresid->level_W(level); + int H_L = wdspotresid->level_H(level); + float* const* wav_Lresid = wdspotresid->level_coeffs(level); + + for (int i = 0; i < W_L * H_L; i++) { + wav_Lresid[dir][i] = 0.f; + } + } + } + } else {//Sharp + float *wav_L0resid = wdspotresid->get_coeff0(); + int W_L = wdspotresid->level_W(0); + int H_L = wdspotresid->level_H(0); + + for (int i = 0; i < W_L * H_L; i++) { + wav_L0resid[i] = 0.f; + } + } + + wdspotresid->reconstruct(tmpresid->L[0], 1.f); + delete wdspotresid; + } + + + if (mC != 0.f) { + + wavelet_decomposition *wdspotresida = new wavelet_decomposition(tmpresid->a[0], tmpresid->W, tmpresid->H, wavelet_level, 1, sk, numThreads, lp.daubLen); + + if (wdspotresida->memory_allocation_failed()) { + return; + } + + int maxlvlresid = wdspotresida->maxlevel(); + + if (maxlvlresid > 4) {//Clarity +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) +#endif + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < maxlvlresid; ++level) { + int W_L = wdspotresida->level_W(level); + int H_L = wdspotresida->level_H(level); + float* const* wav_Lresida = wdspotresida->level_coeffs(level); + + for (int i = 0; i < W_L * H_L; i++) { + wav_Lresida[dir][i] = 0.f; + } + } + } + } else {//Sharp + float *wav_L0resida = wdspotresida->get_coeff0(); + int W_L = wdspotresida->level_W(0); + int H_L = wdspotresida->level_H(0); + + for (int i = 0; i < W_L * H_L; i++) { + wav_L0resida[i] = 0.f; + } + } + + wdspotresida->reconstruct(tmpresid->a[0], 1.f); + delete wdspotresida; + + wavelet_decomposition *wdspotresidb = new wavelet_decomposition(tmpresid->b[0], tmpresid->W, tmpresid->H, wavelet_level, 1, sk, numThreads, lp.daubLen); + + if (wdspotresidb->memory_allocation_failed()) { + return; + } + + maxlvlresid = wdspotresidb->maxlevel(); + + if (maxlvlresid > 4) {//Clarity +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) collapse(2) +#endif + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < maxlvlresid; ++level) { + int W_L = wdspotresidb->level_W(level); + int H_L = wdspotresidb->level_H(level); + float* const* wav_Lresidb = wdspotresidb->level_coeffs(level); + + for (int i = 0; i < W_L * H_L; i++) { + wav_Lresidb[dir][i] = 0.f; + } + } + } + } else {//Sharp + float *wav_L0residb = wdspotresidb->get_coeff0(); + int W_L = wdspotresidb->level_W(0); + int H_L = wdspotresidb->level_H(0); + + for (int i = 0; i < W_L * H_L; i++) { + wav_L0residb[i] = 0.f; + } + } + + wdspotresidb->reconstruct(tmpresid->b[0], 1.f); + delete wdspotresidb; + } +} + +void ImProcFunctions::avoidcolshi(const struct local_params& lp, int sp, LabImage *transformed, LabImage *reserved, int cy, int cx, int sk) +{ + int avoidgamut = 0; + + if (params->locallab.spots.at(sp).avoidgamutMethod == "NONE") { + avoidgamut = 0; + } else if (params->locallab.spots.at(sp).avoidgamutMethod == "LAB") { + avoidgamut = 1; + } else if (params->locallab.spots.at(sp).avoidgamutMethod == "XYZ") { + avoidgamut = 2; + } else if (params->locallab.spots.at(sp).avoidgamutMethod == "XYZREL") { + avoidgamut = 3; + } else if (params->locallab.spots.at(sp).avoidgamutMethod == "MUNS") { + avoidgamut = 4; + } + + if (avoidgamut == 0) { + return; + } + + if (avoidgamut > 0 && lp.islocal) { + const float ach = lp.trans / 100.f; + bool execmunsell = true; + + if (params->locallab.spots.at(sp).expcie && (params->locallab.spots.at(sp).modecam == "all" || params->locallab.spots.at(sp).modecam == "jz" || params->locallab.spots.at(sp).modecam == "cam16")) { + execmunsell = false; + } + + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); + const double wip[3][3] = {//improve precision with double + {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.workingProfile); + const double wp[3][3] = {//improve precision with double + {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]} + }; + + const float softr = params->locallab.spots.at(sp).avoidrad;//max softr = 30 + // const bool muns = params->locallab.spots.at(sp).avoidmun;//Munsell control with 200 LUT + //improve precision with mint and maxt + const float tr = std::min(2.f, softr); + const float mint = 0.15f - 0.06f * tr;//between 0.15f and 0.03f + const float maxt = 0.98f + 0.008f * tr;//between 0.98f and 0.996f + + const bool highlight = params->toneCurve.hrenabled; + const bool needHH = true; //always Munsell to avoid bad behavior //(lp.chro != 0.f); +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + float atan2Buffer[transformed->W] ALIGNED16; + float sqrtBuffer[transformed->W] ALIGNED16; + float sincosyBuffer[transformed->W] ALIGNED16; + float sincosxBuffer[transformed->W] ALIGNED16; + vfloat c327d68v = F2V(327.68f); + vfloat onev = F2V(1.f); +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int y = 0; y < transformed->H; y++) { + const int loy = cy + y; + const bool isZone0 = loy > lp.yc + lp.ly || loy < lp.yc - lp.lyT; // whole line is zone 0 => we can skip a lot of processing + + if (isZone0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + +#ifdef __SSE2__ + int i = 0; + + for (; i < transformed->W - 3; i += 4) { + vfloat av = LVFU(transformed->a[y][i]); + vfloat bv = LVFU(transformed->b[y][i]); + + if (needHH) { // only do expensive atan2 calculation if needed + STVF(atan2Buffer[i], xatan2f(bv, av)); + } + + vfloat Chprov1v = vsqrtf(SQRV(bv) + SQRV(av)); + STVF(sqrtBuffer[i], Chprov1v / c327d68v); + vfloat sincosyv = av / Chprov1v; + vfloat sincosxv = bv / Chprov1v; + vmask selmask = vmaskf_eq(Chprov1v, ZEROV); + sincosyv = vself(selmask, onev, sincosyv); + sincosxv = vselfnotzero(selmask, sincosxv); + STVF(sincosyBuffer[i], sincosyv); + STVF(sincosxBuffer[i], sincosxv); + } + + for (; i < transformed->W; i++) { + float aa = transformed->a[y][i]; + float bb = transformed->b[y][i]; + + if (needHH) { // only do expensive atan2 calculation if needed + atan2Buffer[i] = xatan2f(bb, aa); + } + + float Chprov1 = std::sqrt(SQR(bb) + SQR(aa)); + sqrtBuffer[i] = Chprov1 / 327.68f; + + if (Chprov1 == 0.0f) { + sincosyBuffer[i] = 1.f; + sincosxBuffer[i] = 0.0f; + } else { + sincosyBuffer[i] = aa / Chprov1; + sincosxBuffer[i] = bb / Chprov1; + } + } + +#endif + + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, ach, lp, zone, localFactor); + } else { /*if (lp.shapmet == 1)*/ + calcTransitionrect(lox, loy, ach, lp, zone, localFactor); + } + + if (zone == 0) { // outside selection and outside transition zone => no effect, keep original values + continue; + } + + float Lprov1 = transformed->L[y][x] / 327.68f; + float2 sincosval; +#ifdef __SSE2__ + float HH = atan2Buffer[x]; // reading HH from line buffer even if line buffer is not filled is faster than branching + float Chprov1 = sqrtBuffer[x]; + sincosval.y = sincosyBuffer[x]; + sincosval.x = sincosxBuffer[x]; + float chr = 0.f; + +#else + const float aa = transformed->a[y][x]; + const float bb = transformed->b[y][x]; + float HH = 0.f, chr = 0.f; + + if (needHH) { // only do expensive atan2 calculation if needed + HH = xatan2f(bb, aa); + } + + float Chprov1 = std::sqrt(SQR(aa) + SQR(bb)) / 327.68f; + + if (Chprov1 == 0.0f) { + sincosval.y = 1.f; + sincosval.x = 0.0f; + } else { + sincosval.y = aa / (Chprov1 * 327.68f); + sincosval.x = bb / (Chprov1 * 327.68f); + } + +#endif + float lnew = transformed->L[y][x]; + float anew = transformed->a[y][x]; + float bnew = transformed->b[y][x]; + Lprov1 = lnew / 327.68f; + //HH = xatan2f(bnew, anew); + + if (avoidgamut == 1) { //Lab correction + + Color::pregamutlab(Lprov1, HH, chr); + Chprov1 = rtengine::min(Chprov1, chr); + + float R, G, B; + Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, mint, maxt);//replace for best results + lnew = Lprov1 * 327.68f; + anew = 327.68f * Chprov1 * sincosval.y; + bnew = 327.68f * Chprov1 * sincosval.x; + //HH = xatan2f(bnew, anew); + transformed->a[y][x] = anew; + transformed->b[y][x] = bnew; + + } else if (avoidgamut == 2 || avoidgamut == 3) { //XYZ correction + float xg, yg, zg; + const float aag = transformed->a[y][x];//anew + const float bbg = transformed->b[y][x];//bnew + float Lag = transformed->L[y][x]; + + Color::Lab2XYZ(Lag, aag, bbg, xg, yg, zg); + float x0 = xg; + float y0 = yg; + float z0 = zg; + + Color::gamutmap(xg, yg, zg, wp); + + if (avoidgamut == 3) {//0.5f arbitrary coeff + xg = xg + 0.5f * (x0 - xg); + yg = yg + 0.5f * (y0 - yg); + zg = zg + 0.5f * (z0 - zg); + } + + //Color::gamutmap(xg, yg, zg, wp);//Put XYZ in gamut wp + float aag2, bbg2; + Color::XYZ2Lab(xg, yg, zg, Lag, aag2, bbg2); + Lprov1 = Lag / 327.68f; + HH = xatan2f(bbg2, aag2);//rebuild HH in case of...absolute colorimetry + Chprov1 = std::sqrt(SQR(aag2) + SQR(bbg2)) / 327.68f; + + if (Chprov1 == 0.0f) { + sincosval.y = 1.f; + sincosval.x = 0.0f; + } else { + sincosval.y = aag2 / (Chprov1 * 327.68f); + sincosval.x = bbg2 / (Chprov1 * 327.68f); + } + + lnew = Lprov1 * 327.68f; + anew = 327.68f * Chprov1 * sincosval.y; + bnew = 327.68f * Chprov1 * sincosval.x; + transformed->a[y][x] = anew; + transformed->b[y][x] = bnew; + + } + + if (needHH && avoidgamut <= 4) {//Munsell + Lprov1 = lnew / 327.68f; + float Chprov = sqrt(SQR(anew) + SQR(bnew)) / 327.68f; + + const float Lprov2 = reserved->L[y][x] / 327.68f; + float correctionHue = 0.f; // Munsell's correction + float correctlum = 0.f; + const float memChprov = std::sqrt(SQR(reserved->a[y][x]) + SQR(reserved->b[y][x])) / 327.68f; + + if (execmunsell) { + Color::AllMunsellLch(true, Lprov1, Lprov2, HH, Chprov, memChprov, correctionHue, correctlum); + } + + if (correctionHue != 0.f || correctlum != 0.f) { + + if (std::fabs(correctionHue) < 0.015f) { + HH += correctlum; // correct only if correct Munsell chroma very small. + } + + sincosval = xsincosf(HH + correctionHue); + } + + anew = 327.68f * Chprov * sincosval.y; // apply Munsell + bnew = 327.68f * Chprov * sincosval.x; + transformed->a[y][x] = anew; // apply Munsell + transformed->b[y][x] = bnew; + } + } + } + } + + //Guidedfilter to reduce artifacts in transitions : case Lab + if (softr != 0.f && avoidgamut == 1) {//soft for L a b because we change color... + const float tmpblur = softr < 0.f ? -1.f / softr : 1.f + softr; + const int r1 = rtengine::max(6 / sk * tmpblur + 0.5f, 1); + const int r2 = rtengine::max(10 / sk * tmpblur + 0.5f, 1); + + constexpr float epsilmax = 0.005f; + constexpr float epsilmin = 0.00001f; + + constexpr float aepsil = (epsilmax - epsilmin) / 100.f; + constexpr float bepsil = epsilmin; + const float epsil = softr < 0.f ? 0.001f : aepsil * softr + bepsil; + + const int bw = transformed->W; + const int bh = transformed->H; + array2D ble(bw, bh); + array2D guid(bw, bh); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int y = 0; y < bh ; y++) { + for (int x = 0; x < bw; x++) { + ble[y][x] = transformed->L[y][x] / 32768.f; + guid[y][x] = reserved->L[y][x] / 32768.f; + } + } + + rtengine::guidedFilter(guid, ble, ble, r2, 0.2f * epsil, multiThread); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int y = 0; y < bh; y++) { + for (int x = 0; x < bw; x++) { + transformed->L[y][x] = 32768.f * ble[y][x]; + } + } + + array2D &blechro = ble; // reuse buffer +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int y = 0; y < bh ; y++) { + for (int x = 0; x < bw; x++) { + blechro[y][x] = std::sqrt(SQR(transformed->b[y][x]) + SQR(transformed->a[y][x])) / 32768.f; + } + } + + rtengine::guidedFilter(guid, blechro, blechro, r1, epsil, multiThread); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int y = 0; y < bh; y++) { + for (int x = 0; x < bw; x++) { + const float Chprov1 = std::sqrt(SQR(transformed->a[y][x]) + SQR(transformed->b[y][x])); + float2 sincosval; + + if (Chprov1 == 0.0f) { + sincosval.y = 1.f; + sincosval.x = 0.0f; + } else { + sincosval.y = transformed->a[y][x] / Chprov1; + sincosval.x = transformed->b[y][x] / Chprov1; + } + + transformed->a[y][x] = 32768.f * blechro[y][x] * sincosval.y; + transformed->b[y][x] = 32768.f * blechro[y][x] * sincosval.x; + } + } + } + } +} + +void maskrecov(const LabImage * bufcolfin, LabImage * original, LabImage * bufmaskblurcol, int bfh, int bfw, int ystart, int xstart, float hig, float low, float recoth, float decay, bool invmask, int sk, bool multiThread) +{ + LabImage tmp3(bfw, bfh); + for (int y = 0; y < bfh; y++){ + for (int x = 0; x < bfw; x++) { + tmp3.L[y][x] = original->L[y + ystart][x + xstart]; + tmp3.a[y][x] = original->a[y + ystart][x + xstart]; + tmp3.b[y][x] = original->b[y + ystart][x + xstart]; + } + } + array2D masklum; + masklum(bfw, bfh); + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + masklum[ir][jr] = 1.f; + } + + float higc; + calcdif(hig, higc); + float lowc; + calcdif(low, lowc); + + if(higc < lowc) { + higc = lowc + 0.01f; + } + float th = (recoth - 1.f); + float ahigh = th / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + + float alow = th / lowc; + float blow = 1.f - th; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + const float lM = bufmaskblurcol->L[ir][jr]; + const float lmr = lM / 327.68f; + if (lM < 327.68f * lowc) { + masklum[ir][jr] = alow * lmr + blow; + } else if (lM < 327.68f * higc) { + //nothing...but we can.. + } else { + masklum[ir][jr] = ahigh * lmr + bhigh; + } + float k = masklum[ir][jr]; + if(invmask == false) { + masklum[ir][jr] = 1 - pow(k, decay); + } else { + masklum[ir][jr] = pow(k, decay); + } + + } + } + + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, bfw, bfh, false); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + bufcolfin->L[i][j] = (tmp3.L[i][j] - bufcolfin->L[i][j]) * LIM01(masklum[i][j]) + bufcolfin->L[i][j]; + bufcolfin->a[i][j] = (tmp3.a[i][j] - bufcolfin->a[i][j]) * LIM01(masklum[i][j]) + bufcolfin->a[i][j]; + bufcolfin->b[i][j] = (tmp3.b[i][j] - bufcolfin->b[i][j]) * LIM01(masklum[i][j]) + bufcolfin->b[i][j]; + } + } + masklum.free(); +} + +//thanks to Alberto Griggio +void ImProcFunctions::detail_mask(const array2D &src, array2D &mask, int bfw, int bfh, float scaling, float threshold, float ceiling, float factor, BlurType blur_type, float blur, bool multithread) +{ + const int W = bfw; + const int H = bfh; + mask(W, H); + + array2D L2(W/4, H/4);//ARRAY2D_ALIGNED); + array2D m2(W/4, H/4);//ARRAY2D_ALIGNED) + rescaleBilinear(src, L2, multithread); +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H/4; ++y) { + for (int x = 0; x < W/4; ++x) { + L2[y][x] = xlin2log(L2[y][x]/scaling, 50.f); + } + } + + laplacian(L2, m2, W / 4, H / 4, threshold/scaling, ceiling/scaling, factor, multithread); + + rescaleBilinear(m2, mask, multithread); + + const auto scurve = + [](float x) -> float + { + constexpr float b = 101.f; + constexpr float a = 2.23f; + return xlin2log(pow_F(x, a), b); + }; + + const float thr = 1.f - factor; +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + mask[y][x] = scurve(LIM01(mask[y][x] + thr)); + } + } + + if (blur_type == BlurType::GAUSS) { + +#ifdef _OPENMP +# pragma omp parallel if (multithread) +#endif + { + gaussianBlur(mask, mask, W, H, blur); + } + } else if (blur_type == BlurType::BOX) { + if (int(blur) > 0) { + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(mask), static_cast(mask), blur, W, H, multithread); + } + } + } + +} + +// basic idea taken from Algorithm 3 in the paper: +// "Parameter-Free Fast Pixelwise Non-Local Means Denoising" http://www.ipol.im/pub/art/2014/120/ +// by Jacques Froment + +// thanks to Alberto Griggio for this wonderful code +// thanks to Ingo Weyrich for many speedup suggestions! +// adapted to Rawtherapee Local adjustments J.Desmis january 2021 +// + +void ImProcFunctions::NLMeans(float **img, int strength, int detail_thresh, int patch, int radius, float gam, int bfw, int bfh, float scale, bool multithread) +{ + if (!strength) { + return; + } + // printf("Scale=%f\n", scale); + if(scale > 5.f) {//avoid to small values - leads to crash - but enough to evaluate noise + return; + } + BENCHFUN + const int W = bfw; + const int H = bfh; +// printf("W=%i H=%i\n", W, H); + float gamma = gam; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / static_cast(gam);//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + //first change Lab L to pseudo linear with gamma = 3.f slope 9.032...and in range 0...65536, or with gamma slope Lab + +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multithread) +#endif + for (int y = 0; y < H; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < W - 3; x += 4) { + STVFU(img[y][x], F2V(65536.f) * igammalog(LVFU(img[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < W; ++x) { + img[y][x] = 65536.f * igammalog(img[y][x] / 32768.f, gamma, ts, g_a[2], g_a[4]); + } + } + // these two can be changed if needed. increasing max_patch_radius doesn't + // affect performance, whereas max_search_radius *really* does + // (the complexity is O(max_search_radius^2 * W * H)) +// constexpr int max_patch_radius = 2; +// constexpr int max_search_radius = 5; + int max_patch_radius = patch; + int max_search_radius = radius; + + const int search_radius = int(std::ceil(float(max_search_radius) / scale)); + const int patch_radius = int(std::ceil(float(max_patch_radius) / scale)); + + // the strength parameter controls the scaling of the weights + // (called h^2 in the papers) + float eps = 1e-6f;//to avoid too low values and divide near by zero...when scale > 1 + const float h2 = eps + SQR(std::pow(float(strength) / 100.f, 0.9f) / 30.f / scale); +// printf("h2=%f\n", h2); + // this is the main difference between our version and more conventional + // nl-means implementations: instead of varying the patch size, we control + // the detail preservation by using a varying weight scaling for the + // pixels, depending on our estimate of how much details there are in the + // pixel neighborhood. We do this by computing a "detail mask", using a + // laplacian filter with additional averaging and smoothing. The + // detail_thresh parameter controls the degree of detail preservation: the + // (averaged, smoothed) laplacian is first normalized to [0,1], and then + // modified by compression and offsetting depending on the detail_thresh + // parameter, i.e. mask[y][x] = mask[y][x] * (1 - f) + f, + // where f = detail_thresh / 100 + float amount = LIM(float(detail_thresh)/100.f, 0.f, 0.99f); + array2D mask(W, H);// ARRAY2D_ALIGNED); + + { + array2D LL(W, H, img, ARRAY2D_BYREFERENCE); + ImProcFunctions::detail_mask(LL, mask, W, H, 1.f, 1e-3f, 1.f, amount, BlurType::GAUSS, 2.f / scale, multithread); + + } + +//allocate dst - same type of datas as img + float** dst; + int wid = W; + int hei = H; + dst = new float*[hei]; + for (int i = 0; i < hei; ++i) { + dst[i] = new float[wid]; + } + const int border = search_radius + patch_radius; + const int WW = W + border * 2; + const int HH = H + border * 2; + + array2D src(WW, HH);//, ARRAY2D_ALIGNED); + +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < HH; ++y) { + int yy = y <= border ? 0 : y - border >= H ? H-1 : y - border; + for (int x = 0; x < WW; ++x) { + int xx = x <= border ? 0 : x - border >= W ? W-1 : x - border; + float Y = img[yy][xx] / 65536.f; + src[y][x] = Y; + } + } + +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + dst[y][x] = 0.f; + } + } + + constexpr int lutsz = 8192; + constexpr float lutfactor = 100.f / float(lutsz-1); + LUTf explut(lutsz); + for (int i = 0; i < lutsz; ++i) { + float x = float(i) * lutfactor; + explut[i] = xexpf(-x); + } + +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + mask[y][x] = (1.f / (mask[y][x] * h2)) / lutfactor; + } + } + + // process by tiles to avoid numerical accuracy errors in the computation + // of the integral image + const int tile_size = 150; + const int ntiles_x = int(std::ceil(float(WW) / (tile_size-2*border))); + const int ntiles_y = int(std::ceil(float(HH) / (tile_size-2*border))); + const int ntiles = ntiles_x * ntiles_y; + +#ifdef __SSE2__ + const vfloat zerov = F2V(0.0); + const vfloat v1e_5f = F2V(1e-5f); + const vfloat v65536f = F2V(65536.f); +#endif + +#ifdef _OPENMP + #pragma omp parallel if (multithread) +#endif + { + +#ifdef __SSE2__ + // flush denormals to zero to avoid performance penalty + const auto oldMode = _MM_GET_FLUSH_ZERO_MODE(); + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); +#endif + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 2) +#endif + for (int tile = 0; tile < ntiles; ++tile) { + const int tile_y = tile / ntiles_x; + const int tile_x = tile % ntiles_x; + + const int start_y = tile_y * (tile_size - 2*border); + const int end_y = std::min(start_y + tile_size, HH); + const int TH = end_y - start_y; + + const int start_x = tile_x * (tile_size - 2*border); + const int end_x = std::min(start_x + tile_size, WW); + const int TW = end_x - start_x; + + const auto Yf = [=](int y) -> int { return LIM(y+start_y, 0, HH-1); }; + const auto Xf = [=](int x) -> int { return LIM(x+start_x, 0, WW-1); }; + + const auto score = + [&](int tx, int ty, int zx, int zy) -> float + { + return SQR(src[Yf(zy)][Xf(zx)] - src[Yf(zy + ty)][Xf(zx + tx)]); + }; + + array2D St(TW, TH);//, ARRAY2D_ALIGNED); + array2D SW(TW, TH, ARRAY2D_CLEAR_DATA);//, ARRAY2D_ALIGNED|ARRAY2D_CLEAR_DATA); + + for (int ty = -search_radius; ty <= search_radius; ++ty) { + for (int tx = -search_radius; tx <= search_radius; ++tx) { + // Step 1 — Compute the integral image St + St[0][0] = 0.f; + for (int xx = 1; xx < TW; ++xx) { + St[0][xx] = St[0][xx-1] + score(tx, ty, xx, 0); + } + for (int yy = 1; yy < TH; ++yy) { + St[yy][0] = St[yy-1][0] + score(tx, ty, 0, yy); + } + for (int yy = 1; yy < TH; ++yy) { + for (int xx = 1; xx < TW; ++xx) { + // operation grouping tuned for performance (empirically) + St[yy][xx] = (St[yy][xx-1] + St[yy-1][xx]) - (St[yy-1][xx-1] - score(tx, ty, xx, yy)); + } + } + // Step 2 — Compute weight and estimate for patches + // V(x), V(y) with y = x + t + for (int yy = start_y+border; yy < end_y-border; ++yy) { + int y = yy - border; + int xx = start_x+border; +#ifdef __SSE2__ + for (; xx < end_x-border-3; xx += 4) { + int x = xx - border; + int sx = xx + tx; + int sy = yy + ty; + + int sty = yy - start_y; + int stx = xx - start_x; + + vfloat dist2 = LVFU(St[sty + patch_radius][stx + patch_radius]) + LVFU(St[sty - patch_radius][stx - patch_radius]) - LVFU(St[sty + patch_radius][stx - patch_radius]) - LVFU(St[sty - patch_radius][stx + patch_radius]); + dist2 = vmaxf(dist2, zerov); + vfloat d = dist2 * LVFU(mask[y][x]); + vfloat weight = explut[d]; + STVFU(SW[y-start_y][x-start_x], LVFU(SW[y-start_y][x-start_x]) + weight); + vfloat Y = weight * LVFU(src[sy][sx]); + STVFU(dst[y][x], LVFU(dst[y][x]) + Y); + } +#endif + for (; xx < end_x-border; ++xx) { + int x = xx - border; + int sx = xx + tx; + int sy = yy + ty; + + int sty = yy - start_y; + int stx = xx - start_x; + + float dist2 = St[sty + patch_radius][stx + patch_radius] + St[sty - patch_radius][stx - patch_radius] - St[sty + patch_radius][stx - patch_radius] - St[sty - patch_radius][stx + patch_radius]; + dist2 = std::max(dist2, 0.f); + float d = dist2 * mask[y][x]; + float weight = explut[d]; + SW[y-start_y][x-start_x] += weight; + float Y = weight * src[sy][sx]; + dst[y][x] += Y; + + assert(!xisinff(dst[y][x])); + assert(!xisnanf(dst[y][x])); + } + } + } + } +// printf("E\n"); + + // Compute final estimate at pixel x = (x1, x2) + for (int yy = start_y+border; yy < end_y-border; ++yy) { + int y = yy - border; + int xx = start_x+border; +#ifdef __SSE2__ + for (; xx < end_x-border-3; xx += 4) { + int x = xx - border; + + const vfloat Y = LVFU(dst[y][x]); + const vfloat f = (v1e_5f + LVFU(SW[y-start_y][x-start_x])); + STVFU(dst[y][x], (Y / f) * v65536f); + } +#endif + for (; xx < end_x-border; ++xx) { + int x = xx - border; + + const float Y = dst[y][x]; + const float f = (1e-5f + SW[y-start_y][x-start_x]); + dst[y][x] = (Y / f) * 65536.f; + + assert(!xisnanf(dst[y][x])); + } + } + } + +#ifdef __SSE2__ + _MM_SET_FLUSH_ZERO_MODE(oldMode); +#endif + + } // omp parallel + +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multithread) +#endif + for (int y = 0; y < H; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < W - 3; x += 4) { + STVFU(img[y][x], F2V(32768.f) * gammalog(LVFU(dst[y][x]) / F2V(65536.f), F2V(gamma), F2V(ts), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < W; ++x) { + img[y][x] = 32768.f * gammalog(dst[y][x] / 65536.f, gamma, ts, g_a[3], g_a[4]); + } + } + + for (int i = 0; i < hei; ++i) { + delete[] dst[i]; + } + delete[] dst; + +} + +void ImProcFunctions::Lab_Local( + int call, int sp, float** shbuffer, LabImage * original, LabImage * transformed, LabImage * reserved, LabImage * savenormtm, LabImage * savenormreti, LabImage * lastorig, int fw, int fh, int cx, int cy, int oW, int oH, int sk, + const LocretigainCurve& locRETgainCcurve, const LocretitransCurve& locRETtransCcurve, + const LUTf& lllocalcurve, bool locallutili, + const LUTf& cllocalcurve, bool localclutili, + const LUTf& lclocalcurve, bool locallcutili, + const LocLHCurve& loclhCurve, const LocHHCurve& lochhCurve, const LocCHCurve& locchCurve, + const LocHHCurve& lochhCurvejz, const LocCHCurve& locchCurvejz, const LocLHCurve& loclhCurvejz, + const LUTf& lmasklocalcurve, bool localmaskutili, + const LUTf& lmaskexplocalcurve, bool localmaskexputili, + const LUTf& lmaskSHlocalcurve, bool localmaskSHutili, + const LUTf& lmaskviblocalcurve, bool localmaskvibutili, + const LUTf& lmasktmlocalcurve, bool localmasktmutili, + LUTf& lmaskretilocalcurve, bool localmaskretiutili, + const LUTf& lmaskcblocalcurve, bool localmaskcbutili, + const LUTf& lmaskbllocalcurve, bool localmaskblutili, + const LUTf& lmasklclocalcurve, bool localmasklcutili, + const LUTf& lmaskloglocalcurve, bool localmasklogutili, + const LUTf& lmasklocal_curve, bool localmask_utili, + const LUTf& lmaskcielocalcurve, bool localmaskcieutili, + const LUTf& cielocalcurve, bool localcieutili, + const LUTf& cielocalcurve2, bool localcieutili2, + const LUTf& jzlocalcurve, bool localjzutili, + const LUTf& czlocalcurve, bool localczutili, + const LUTf& czjzlocalcurve, bool localczjzutili, + + const LocCCmaskCurve& locccmasCurve, bool lcmasutili, const LocLLmaskCurve& locllmasCurve, bool llmasutili, const LocHHmaskCurve& lochhmasCurve, bool lhmasutili, const LocHHmaskCurve& llochhhmasCurve, bool lhhmasutili, + const LocCCmaskCurve& locccmasexpCurve, bool lcmasexputili, const LocLLmaskCurve& locllmasexpCurve, bool llmasexputili, const LocHHmaskCurve& lochhmasexpCurve, bool lhmasexputili, + const LocCCmaskCurve& locccmasSHCurve, bool lcmasSHutili, const LocLLmaskCurve& locllmasSHCurve, bool llmasSHutili, const LocHHmaskCurve& lochhmasSHCurve, bool lhmasSHutili, + const LocCCmaskCurve& locccmasvibCurve, bool lcmasvibutili, const LocLLmaskCurve& locllmasvibCurve, bool llmasvibutili, const LocHHmaskCurve& lochhmasvibCurve, bool lhmasvibutili, + const LocCCmaskCurve& locccmascbCurve, bool lcmascbutili, const LocLLmaskCurve& locllmascbCurve, bool llmascbutili, const LocHHmaskCurve& lochhmascbCurve, bool lhmascbutili, + const LocCCmaskCurve& locccmasretiCurve, bool lcmasretiutili, const LocLLmaskCurve& locllmasretiCurve, bool llmasretiutili, const LocHHmaskCurve& lochhmasretiCurve, bool lhmasretiutili, + const LocCCmaskCurve& locccmastmCurve, bool lcmastmutili, const LocLLmaskCurve& locllmastmCurve, bool llmastmutili, const LocHHmaskCurve& lochhmastmCurve, bool lhmastmutili, + const LocCCmaskCurve& locccmasblCurve, bool lcmasblutili, const LocLLmaskCurve& locllmasblCurve, bool llmasblutili, const LocHHmaskCurve& lochhmasblCurve, bool lhmasblutili, + const LocCCmaskCurve& locccmaslcCurve, bool lcmaslcutili, const LocLLmaskCurve& locllmaslcCurve, bool llmaslcutili, const LocHHmaskCurve& lochhmaslcCurve, bool lhmaslcutili, + const LocCCmaskCurve& locccmaslogCurve, bool lcmaslogutili, const LocLLmaskCurve& locllmaslogCurve, bool llmaslogutili, const LocHHmaskCurve& lochhmaslogCurve, bool lhmaslogutili, + const LocCCmaskCurve& locccmas_Curve, bool lcmas_utili, const LocLLmaskCurve& locllmas_Curve, bool llmas_utili, const LocHHmaskCurve& lochhmas_Curve, bool lhmas_utili, + const LocCCmaskCurve& locccmascieCurve, bool lcmascieutili, const LocLLmaskCurve& locllmascieCurve, bool llmascieutili, const LocHHmaskCurve& lochhmascieCurve, bool lhmascieutili, + + const LocHHmaskCurve& lochhhmas_Curve, bool lhhmas_utili, + const LocwavCurve& loclmasCurveblwav, bool lmasutiliblwav, + const LocwavCurve& loclmasCurvecolwav, bool lmasutilicolwav, + const LocwavCurve& locwavCurve, bool locwavutili, + const LocwavCurve& locwavCurvejz, bool locwavutilijz, + const LocwavCurve& loclevwavCurve, bool loclevwavutili, + const LocwavCurve& locconwavCurve, bool locconwavutili, + const LocwavCurve& loccompwavCurve, bool loccompwavutili, + const LocwavCurve& loccomprewavCurve, bool loccomprewavutili, + const LocwavCurve& locwavCurvehue, bool locwavhueutili, + const LocwavCurve& locwavCurveden, bool locwavdenutili, + const LocwavCurve& locedgwavCurve, bool locedgwavutili, + const LocwavCurve& loclmasCurve_wav, bool lmasutili_wav, + + bool LHutili, bool HHutili, bool CHutili, bool HHutilijz, bool CHutilijz, bool LHutilijz, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, + double& huerefblur, double& chromarefblur, double& lumarefblur, double& hueref, double& chromaref, double& lumaref, double& sobelref, int &lastsav, + bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, int lllogMask, int ll_Mask, int llcieMask, + float& minCD, float& maxCD, float& mini, float& maxi, float& Tmean, float& Tsigma, float& Tmin, float& Tmax, + float& meantm, float& stdtm, float& meanreti, float& stdreti, float &fab, + float& highresi, float& nresi, float& highresi46, float& nresi46, float& Lhighresi, float& Lnresi, float& Lhighresi46, float& Lnresi46 + + ) +{ + //general call of others functions : important return hueref, chromaref, lumaref + if (!params->locallab.enabled) { + return; + } + + //BENCHFUN + + constexpr int del = 3; // to avoid crash with [loy - begy] and [lox - begx] and bfh bfw // with gtk2 [loy - begy-1] [lox - begx -1 ] and del = 1 + struct local_params lp; + calcLocalParams(sp, oW, oH, params->locallab, lp, prevDeltaE, llColorMask, llColorMaskinv, llExpMask, llExpMaskinv, llSHMask, llSHMaskinv, llvibMask, lllcMask, llsharMask, llcbMask, llretiMask, llsoftMask, lltmMask, llblMask, lllogMask, ll_Mask, llcieMask, locwavCurveden, locwavdenutili); + + //avoidcolshi(lp, sp, transformed, reserved, cy, cx, sk); + + const float radius = lp.rad / (sk * 1.4); //0 to 70 ==> see skip + int levred; + bool noiscfactiv; + + if (lp.qualmet == 2) { //suppress artifacts with quality enhanced + levred = 4; + noiscfactiv = true; + } else { + levred = 7; + noiscfactiv = false; + } + +//lastsav for save restore image + lastsav = 0; + + if (lp.excmet == 1 && call <= 3 && lp.activspot) {//exclude + const int bfh = int (lp.ly + lp.lyT) + del; //bfw bfh real size of square zone + const int bfw = int (lp.lx + lp.lxL) + del; + const int begy = lp.yc - lp.lyT; + const int begx = lp.xc - lp.lxL; + const int yEn = lp.yc + lp.ly; + const int xEn = lp.xc + lp.lx; + LabImage bufreserv(bfw, bfh); + array2D bufsob(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int y = rtengine::max(begy - cy, 0); y < rtengine::min(yEn - cy, original->H); y++) { + const int loy = cy + y; + + for (int x = rtengine::max(begx - cx, 0); x < rtengine::min(xEn - cx, original->W); x++) { + const int lox = cx + x; + + bufsob[loy - begy][lox - begx] = bufreserv.L[loy - begy][lox - begx] = reserved->L[y][x]; + bufreserv.a[loy - begy][lox - begx] = reserved->a[y][x]; + bufreserv.b[loy - begy][lox - begx] = reserved->b[y][x]; + } + } + + array2D ble(bfw, bfh); + const float radiussob = 1.f / (sk * 1.4f); + SobelCannyLuma(ble, bufsob, bfw, bfh, radiussob); + array2D &guid = bufsob; + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + ble[ir][jr] /= 32768.f; + guid[ir][jr] /= 32768.f; + } + + + const float blur = 25 / sk * (2.f + 2.5f * lp.struexp); + + rtengine::guidedFilter(guid, ble, ble, blur, 0.0001, multiThread); + +// const float blur = 25 / sk * (10.f + 0.8f * lp.struexp); + +// rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiThread); + + double sombel = 0.f; + const int ncsobel = bfh * bfw; + + array2D &deltasobelL = guid; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:sombel) if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + const float val = ble[ir][jr] * 32768.f; + sombel += static_cast(val); + deltasobelL[ir][jr] = val; + } + } + + const float meansob = sombel / ncsobel; + Exclude_Local(deltasobelL, hueref, chromaref, lumaref, sobelref, meansob, lp, original, transformed, &bufreserv, reserved, cx, cy, sk); + } + +//encoding lab at the beginning + if (lp.logena && (call <=3 || lp.prevdE || lp.showmasklogmet == 2 || lp.enaLMask || lp.showmasklogmet == 3 || lp.showmasklogmet == 4)) { + + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + const int bfh = yend - ystart; + const int bfw = xend - xstart; + + if (bfh >= mSP && bfw >= mSP) { + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); //buffer for data in zone limit + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); //buffer for data in zone limit + + std::unique_ptr bufmaskblurlog; + std::unique_ptr originalmasklog; + std::unique_ptr bufmaskoriglog; + + if (lp.showmasklogmet == 2 || lp.enaLMask || lp.showmasklogmet == 3 || lp.showmasklogmet == 4) { + bufmaskblurlog.reset(new LabImage(bfw, bfh)); + originalmasklog.reset(new LabImage(bfw, bfh)); + bufmaskoriglog.reset(new LabImage(bfw, bfh)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; + bufexporig->a[y - ystart][x - xstart] = original->a[y][x]; + bufexporig->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmasklogmet == 3) { + showmaske = true; + } + + if (lp.enaLMask) { + enaMask = true; + } + + if (lp.showmasklogmet == 4) { + deltaE = true; + } + + if (lp.showmasklogmet == 2) { + modmask = true; + } + + if (lp.showmasklogmet == 1) { + modif = true; + } + + if (lp.showmasklogmet == 0) { + zero = true; + } + float chrom = lp.chromaL; + float rad = lp.radmaL; + float blendm = lp.blendmaL; + float gamma = 1.f; + float slope = 0.f; + float lap = 0.f; //params->locallab.spots.at(sp).lapmaskexp; + bool pde = false; //params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + int shado = 0; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; + int lumask = params->locallab.spots.at(sp).lumask; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskoriglog.get(), originalmasklog.get(), original, reserved, inv, lp, + 0.f, false, + locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskloglocalcurve, localmasklogutili, dummy, false, 1, 1, 5, 5, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmasklogmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskoriglog.get(), 0); + + return; + } + if (lp.showmasklogmet == 0 || lp.showmasklogmet == 1 || lp.showmasklogmet == 2 || lp.showmasklogmet == 4 || lp.enaLMask) { + + bufexpfin->CopyFrom(bufexporig.get(), multiThread); + std::unique_ptr tmpImage(new Imagefloat(bfw, bfh)); + std::unique_ptr tmpImageorig(new Imagefloat(bfw, bfh)); + lab2rgb(*bufexpfin, *tmpImage, params->icm.workingProfile); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = tmpImage->r(y, x); + tmpImageorig->g(y, x) = tmpImage->g(y, x); + tmpImageorig->b(y, x) = tmpImage->b(y, x); + } + } + + log_encode(tmpImage.get(), lp, multiThread, bfw, bfh); + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).repar; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + tmpImage->r(y, x) = intp(repart, tmpImageorig->r(y, x), tmpImage->r(y, x)); + tmpImage->g(y, x) = intp(repart, tmpImageorig->g(y, x), tmpImage->g(y, x)); + tmpImage->b(y, x) = intp(repart, tmpImageorig->b(y, x), tmpImage->b(y, x)); + } + } + + rgb2lab(*tmpImage, *bufexpfin, params->icm.workingProfile); + + tmpImageorig.reset(); + tmpImage.reset(); + if (params->locallab.spots.at(sp).ciecam) { + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false;; + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 1, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "log") { + bool HHcurvejz = false; + bool CHcurvejz = false; + bool LHcurvejz = false; + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(),bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, bufexpfin.get(), rad, 15.f, sk); + } + + //here begin graduated filter + //first solution "easy" but we can do other with log_encode...to see the results + if (lp.strlog != 0.f) { + struct grad_params gplog; + calclocalGradientParams(lp, gplog, ystart, xstart, bfw, bfh, 11); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufexpfin->L[ir][jr] *= ImProcFunctions::calcGradientFactor(gplog, jr, ir); + } + } + } + //end graduated + + float recoth = lp.recothrl; + + if(lp.recothrl < 1.f) { + recoth = -1.f * recoth + 2.f; + } + + if(lp.enaLMask && lp.recothrl != 1.f) { + float hig = lp.higthrl; + float low = lp.lowthrl; + // float recoth = lp.recothrl; + float decay = lp.decayl; + bool invmask = false; + maskrecov(bufexpfin.get(), original, bufmaskoriglog.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + if(lp.recothrl >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 11, bufexporig.get(), bufexpfin.get(), originalmasklog.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 11, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + } + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + +//Prepare mask for Blur and noise and Denoise + bool denoiz = false; + + if ((lp.noiself > 0.f || lp.noiself0 > 0.f || lp.noiself2 > 0.f || lp.noiselc > 0.f || lp.wavcurvedenoi || lp.nlstr > 0 || lp.noisecf > 0.f || lp.noisecc > 0.f || lp.bilat > 0.f) && lp.denoiena) { + denoiz = true; + } + + bool blurz = false; + bool delt = params->locallab.spots.at(sp).deltae; + + if (((static_cast(radius) > 1.5 * GAUSS_SKIP) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 1 || lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.blurena) { + blurz = true; + } + + const int TW = transformed->W; + const int TH = transformed->H; + const std::unique_ptr bufblorig(new LabImage(TW, TH)); + + std::unique_ptr originalmaskbl; + std::unique_ptr bufmaskorigbl; + std::unique_ptr bufmaskblurbl; + std::unique_ptr bufprov(new LabImage(TW, TH)); + + if (denoiz || blurz || lp.denoiena || lp.blurena) { + if (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) { + bufmaskorigbl.reset(new LabImage(TW, TH)); + bufmaskblurbl.reset(new LabImage(TW, TH, true)); + originalmaskbl.reset (new LabImage(TW, TH)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH; y++) { + for (int x = 0; x < TW; x++) { + bufblorig->L[y][x] = original->L[y][x]; + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskblmet == 3) { + showmaske = true; + } + + if (lp.enablMask) { + enaMask = true; + } + + if (lp.showmaskblmet == 4) { + deltaE = true; + } + + if (lp.showmaskblmet == 2) { + modmask = true; + } + + if (lp.showmaskblmet == 1) { + modif = true; + } + + if (lp.showmaskblmet == 0) { + zero = true; + } + + float chrom = lp.chromabl; + float rad = lp.radmabl; + float gamma = lp.gammabl; + float slope = lp.slomabl; + float blendm = lp.blendmabl; + float lap = params->locallab.spots.at(sp).lapmaskbl; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + int lumask = params->locallab.spots.at(sp).lumask; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + const int shado = params->locallab.spots.at(sp).shadmaskblsha; + const int highl = params->locallab.spots.at(sp).shadmaskbl; + constexpr float amountcd = 0.f; + constexpr float anchorcd = 50.f; + LocHHmaskCurve lochhhmasCurve; + const float strumask = 0.02 * params->locallab.spots.at(sp).strumaskbl; + const bool astool = params->locallab.spots.at(sp).toolbl; + maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufblorig.get(), bufmaskblurbl.get(), originalmaskbl.get(), original, reserved, inv, lp, + strumask, astool, locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskbllocalcurve, + localmaskblutili, loclmasCurveblwav, lmasutiliblwav, 1, 1, 5, 5, shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0, fab + ); + + if (lp.showmaskblmet == 3) { + showmask(lumask, lp, 0, 0, cx, cy, TW, TH, bufblorig.get(), transformed, bufmaskblurbl.get(), inv); + return; + } + + } + + bool execmaskblur = (lp.showmaskblmet == 2 || lp.enablMask || lp.showmaskblmet == 3 || lp.showmaskblmet == 4) && lp.smasktyp != 1; + int strengr = params->locallab.spots.at(sp).strengr; + + if (((static_cast(radius) > 1.5 * GAUSS_SKIP && lp.rad > 1.6) || lp.stren > 0.1 || lp.blmet == 1 || lp.guidb > 0 || strengr > 0 || execmaskblur) && lp.blurena) { // radius < GAUSS_SKIP means no gauss, just copy of original image + std::unique_ptr tmp1; + std::unique_ptr tmp2; + std::unique_ptr tmp3; + std::unique_ptr maskk; + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + int bfhr = bfh; + int bfwr = bfw; + + bool fft = params->locallab.spots.at(sp).fftwbl; + int isogr = params->locallab.spots.at(sp).isogr; + int scalegr = params->locallab.spots.at(sp).scalegr; + float divgr = params->locallab.spots.at(sp).divgr; + + + if (bfw >= mSP && bfh >= mSP) { + if (lp.blurmet == 0 && (fft || lp.rad > 30.0)) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + const std::unique_ptr bufgbi(new LabImage(TW, TH)); + + //here mask is used with plain image for normal and inverse + //if it is possible to optimize with maskcalccol(), I don't to preserve visibility + if (lp.showmaskblmet == 0 || lp.showmaskblmet == 1 || lp.showmaskblmet == 2 || lp.showmaskblmet == 4 || lp.enablMask) { + + if (lp.blurmet == 0) { + if (bfw > 0 && bfh > 0) { + tmp1.reset(new LabImage(bfw, bfh)); + tmp3.reset(new LabImage(bfw, bfh)); + maskk.reset(new LabImage(bfw, bfh)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend ; y++) { + for (int x = xstart; x < xend; x++) { + tmp1->L[y - ystart][x - xstart] = original->L[y][x]; + tmp1->a[y - ystart][x - xstart] = original->a[y][x]; + tmp1->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + } + } else if (lp.blurmet == 1) { + tmp1.reset(new LabImage(transformed->W, transformed->H)); + tmp2.reset(new LabImage(transformed->W, transformed->H)); + tmp3.reset(new LabImage(transformed->W, transformed->H)); + + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + tmp2->L[y][x] = original->L[y][x]; + tmp2->a[y][x] = original->a[y][x]; + tmp2->b[y][x] = original->b[y][x]; + tmp3->L[y][x] = original->L[y][x]; + tmp3->a[y][x] = original->a[y][x]; + tmp3->b[y][x] = original->b[y][x]; + tmp1->L[y][x] = original->L[y][x]; + tmp1->a[y][x] = original->a[y][x]; + tmp1->b[y][x] = original->b[y][x]; + bufgbi->L[y][x] = original->L[y][x]; + bufgbi->a[y][x] = original->a[y][x]; + bufgbi->b[y][x] = original->b[y][x]; + } + } + + } + + + if (lp.blurmet == 0 && lp.blmet == 0 && static_cast(radius) > (1.5 * GAUSS_SKIP) && lp.rad > 1.6) { + if (fft || lp.rad > 30.0) { + if (lp.chromet == 0) { + ImProcFunctions::fftw_convol_blur2(tmp1->L, tmp1->L, bfwr, bfhr, radius, 0, 0); + } else if (lp.chromet == 1) { + ImProcFunctions::fftw_convol_blur2(tmp1->a, tmp1->a, bfwr, bfhr, radius, 0, 0); + ImProcFunctions::fftw_convol_blur2(tmp1->b, tmp1->b, bfwr, bfhr, radius, 0, 0); + } else if (lp.chromet == 2) { + ImProcFunctions::fftw_convol_blur2(tmp1->L, tmp1->L, bfwr, bfhr, radius, 0, 0); + ImProcFunctions::fftw_convol_blur2(tmp1->a, tmp1->a, bfwr, bfhr, radius, 0, 0); + ImProcFunctions::fftw_convol_blur2(tmp1->b, tmp1->b, bfwr, bfhr, radius, 0, 0); + } + } else { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + if (lp.chromet == 0) { + gaussianBlur(tmp1->L, tmp1->L, bfw, bfh, radius); + } else if (lp.chromet == 1) { + gaussianBlur(tmp1->a, tmp1->a, bfw, bfh, radius); + gaussianBlur(tmp1->b, tmp1->b, bfw, bfh, radius); + } else if (lp.chromet == 2) { + gaussianBlur(tmp1->L, tmp1->L, bfw, bfh, radius); + gaussianBlur(tmp1->a, tmp1->a, bfw, bfh, radius); + gaussianBlur(tmp1->b, tmp1->b, bfw, bfh, radius); + } + } + } + + } else if (lp.blurmet == 1 && lp.blmet == 0 && static_cast(radius) > (1.5 * GAUSS_SKIP) && lp.rad > 1.6) { + if (fft || lp.rad > 30.0) { + if (lp.chromet == 0) { + ImProcFunctions::fftw_convol_blur2(original->L, tmp1->L, TW, TH, radius, 0, 0); + } else if (lp.chromet == 1) { + ImProcFunctions::fftw_convol_blur2(original->a, tmp1->a, TW, TH, radius, 0, 0); + ImProcFunctions::fftw_convol_blur2(original->b, tmp1->b, TW, TH, radius, 0, 0); + } else if (lp.chromet == 2) { + ImProcFunctions::fftw_convol_blur2(original->L, tmp1->L, TW, TH, radius, 0, 0); + ImProcFunctions::fftw_convol_blur2(original->a, tmp1->a, TW, TH, radius, 0, 0); + ImProcFunctions::fftw_convol_blur2(original->b, tmp1->b, TW, TH, radius, 0, 0); + } + } else { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + if (lp.chromet == 0) { + gaussianBlur(original->L, tmp1->L, TW, TH, radius); + } else if (lp.chromet == 1) { + gaussianBlur(original->a, tmp1->a, TW, TH, radius); + gaussianBlur(original->b, tmp1->b, TW, TH, radius); + } else if (lp.chromet == 2) { + gaussianBlur(original->L, tmp1->L, TW, TH, radius); + gaussianBlur(original->a, tmp1->a, TW, TH, radius); + gaussianBlur(original->b, tmp1->b, TW, TH, radius); + } + } + } + } + + //add noise + if (tmp1.get() && lp.stren > 0.1 && lp.blmet == 0) { + float mean = 0.f;//0 best result + float variance = lp.stren ; + addGaNoise(tmp1.get(), tmp1.get(), mean, variance, sk) ; + } + + //add grain + if (lp.blmet == 0 && strengr > 0) { + int wi = bfw; + int he = bfh; + + if (lp.blurmet == 1) { + wi = TW; + he = TH; + } + + if (tmp1.get()) { + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(wi, he); + + for (int y = 0; y < he ; y++) { + for (int x = 0; x < wi; x++) { + tmpImage->g(y, x) = tmp1->L[y][x]; + tmpImage->r(y, x) = tmp1->a[y][x]; + tmpImage->b(y, x) = tmp1->b[y][x]; + } + } + + + filmGrain(tmpImage, isogr, strengr, scalegr, divgr, wi, he, call, fw, fh); + + for (int y = 0; y < he ; y++) { + for (int x = 0; x < wi; x++) { + tmp1->L[y][x] = tmpImage->g(y, x); + tmp1->a[y][x] = tmpImage->r(y, x); + tmp1->b[y][x] = tmpImage->b(y, x); + } + } + + delete tmpImage; + } + } + + Median medianTypeL = Median::TYPE_3X3_STRONG; + Median medianTypeAB = Median::TYPE_3X3_STRONG; + + if (lp.medmet == 0) { + medianTypeL = medianTypeAB = Median::TYPE_3X3_STRONG; + } else if (lp.medmet == 1) { + medianTypeL = medianTypeAB = Median::TYPE_5X5_STRONG; + } else if (lp.medmet == 2) { + medianTypeL = medianTypeAB = Median::TYPE_7X7; + } else if (lp.medmet == 3) { + medianTypeL = medianTypeAB = Median::TYPE_9X9; + } + + if (lp.blurmet == 0 && lp.blmet == 1 && lp.medmet != -1) { + float** tmL; + int wid = bfw; + int hei = bfh; + tmL = new float*[hei]; + + for (int i = 0; i < hei; ++i) { + tmL[i] = new float[wid]; + } + + if (lp.chromet == 0) { + Median_Denoise(tmp1->L, tmp1->L, bfw, bfh, medianTypeL, lp.it, multiThread, tmL); + } + + else if (lp.chromet == 1) { + Median_Denoise(tmp1->a, tmp1->a, bfw, bfh, medianTypeAB, lp.it, multiThread, tmL); + Median_Denoise(tmp1->b, tmp1->b, bfw, bfh, medianTypeAB, lp.it, multiThread, tmL); + } else if (lp.chromet == 2) { + Median_Denoise(tmp1->L, tmp1->L, bfw, bfh, medianTypeL, lp.it, multiThread, tmL); + Median_Denoise(tmp1->a, tmp1->a, bfw, bfh, medianTypeAB, lp.it, multiThread, tmL); + Median_Denoise(tmp1->b, tmp1->b, bfw, bfh, medianTypeAB, lp.it, multiThread, tmL); + } + + for (int i = 0; i < hei; ++i) { + delete[] tmL[i]; + } + + delete[] tmL; + + } else if (lp.blurmet == 1 && lp.blmet == 1) { + float** tmL; + int wid = TW; + int hei = TH; + tmL = new float*[hei]; + + for (int i = 0; i < hei; ++i) { + tmL[i] = new float[wid]; + } + + if (lp.chromet == 0) { + Median_Denoise(tmp2->L, tmp1->L, TW, TH, medianTypeL, lp.it, multiThread, tmL); + } else if (lp.chromet == 1) { + Median_Denoise(tmp2->a, tmp1->a, TW, TH, medianTypeAB, lp.it, multiThread, tmL); + Median_Denoise(tmp2->b, tmp1->b, TW, TH, medianTypeAB, lp.it, multiThread, tmL); + } else if (lp.chromet == 2) { + Median_Denoise(tmp2->L, tmp1->L, TW, TH, medianTypeL, lp.it, multiThread, tmL); + Median_Denoise(tmp2->a, tmp1->a, TW, TH, medianTypeAB, lp.it, multiThread, tmL); + Median_Denoise(tmp2->b, tmp1->b, TW, TH, medianTypeAB, lp.it, multiThread, tmL); + } + + for (int i = 0; i < hei; ++i) { + delete[] tmL[i]; + } + + delete[] tmL; + } + + if (lp.blurmet == 0 && lp.blmet == 2) { + + if (lp.guidb > 0) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend ; y++) { + for (int x = xstart; x < xend; x++) { + tmp1->L[y - ystart][x - xstart] = original->L[y][x]; + tmp1->a[y - ystart][x - xstart] = original->a[y][x]; + tmp1->b[y - ystart][x - xstart] = original->b[y][x]; + tmp3->L[y - ystart][x - xstart] = original->L[y][x]; + tmp3->a[y - ystart][x - xstart] = original->a[y][x]; + tmp3->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(bfw, bfh); + lab2rgb(*tmp1, *tmpImage, params->icm.workingProfile); + array2D LL(bfw, bfh); + array2D rr(bfw, bfh); + array2D gg(bfw, bfh); + array2D bb(bfw, bfh); + array2D guide(bfw, bfh); + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + LL[y][x] = tmp1->L[y][x]; + float ll = LL[y][x] / 32768.f; + guide[y][x] = xlin2log(rtengine::max(ll, 0.f), 10.f); + rr[y][x] = tmpImage->r(y, x); + gg[y][x] = tmpImage->g(y, x); + bb[y][x] = tmpImage->b(y, x); + + } + } + array2D iR(bfw, bfh, rr, 0); + array2D iG(bfw, bfh, gg, 0); + array2D iB(bfw, bfh, bb, 0); + array2D iL(bfw, bfh, LL, 0); + + int r = rtengine::max(int(lp.guidb / sk), 1); + + const float epsil = 0.001f * std::pow(2.f, -lp.epsb); + + if (lp.chromet == 0) { + rtengine::guidedFilterLog(guide, 10.f, LL, r, epsil, multiThread); + } else if (lp.chromet == 1) { + rtengine::guidedFilterLog(guide, 10.f, rr, r, epsil, multiThread); + rtengine::guidedFilterLog(guide, 10.f, bb, r, epsil, multiThread); + } else if (lp.chromet == 2) { + rtengine::guidedFilterLog(10.f, gg, r, epsil, multiThread); + rtengine::guidedFilterLog(10.f, rr, r, epsil, multiThread); + rtengine::guidedFilterLog(10.f, bb, r, epsil, multiThread); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + rr[y][x] = intp(lp.strbl, rr[y][x] , iR[y][x]); + gg[y][x] = intp(lp.strbl, gg[y][x] , iG[y][x]); + bb[y][x] = intp(lp.strbl, bb[y][x] , iB[y][x]); + tmpImage->r(y, x) = rr[y][x]; + tmpImage->g(y, x) = gg[y][x]; + tmpImage->b(y, x) = bb[y][x]; + + } + } + + rgb2lab(*tmpImage, *tmp1, params->icm.workingProfile); + + if (lp.chromet == 0) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + LL[y][x] = intp(lp.strbl, LL[y][x] , iL[y][x]); + tmp1->L[y][x] = LL[y][x]; + } + } + } + if(lp.enablMask && lp.recothr != 1.f && lp.smasktyp != 1) { + array2D masklum; + masklum(bfw, bfh); + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + masklum[ir][jr] = 1.f; + } + + float hig = lp.higthr; + float higc; + calcdif(hig, higc); + float low = lp.lowthr; + float lowc; + calcdif(low, lowc); + + if(higc < lowc) { + higc = lowc + 0.01f; + } + float th = (lp.recothr - 1.f); + float ahigh = th / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + + float alow = th / lowc; + float blow = 1.f - th; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + const float lM = bufmaskblurbl->L[ir + ystart][jr + xstart]; + const float lmr = lM / 327.68f; + if (lM < 327.68f * lowc) { + masklum[ir][jr] = alow * lmr + blow; + } else if (lM < 327.68f * higc) { + + } else { + masklum[ir][jr] = ahigh * lmr + bhigh; + } + if(lp.invmask == true) { + float k = masklum[ir][jr]; + masklum[ir][jr] = 1 - k*k; + } + } + + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, bfw, bfh, false); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < bfh; ++i) { + for (int j = 0; j < bfw; ++j) { + tmp1->L[i][j] = (tmp3->L[i][j] - tmp1->L[i][j]) * LIM01(masklum[i][j]) + tmp1->L[i][j]; + tmp1->a[i][j] = (tmp3->a[i][j] - tmp1->a[i][j]) * LIM01(masklum[i][j]) + tmp1->a[i][j]; + tmp1->b[i][j] = (tmp3->b[i][j] - tmp1->b[i][j]) * LIM01(masklum[i][j]) + tmp1->b[i][j]; + } + } + masklum.free(); + } + + delete tmpImage; + } + + } else if (lp.blurmet == 1 && lp.blmet == 2) { + + if (lp.guidb > 0) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + tmp1->L[y][x] = original->L[y][x]; + tmp1->a[y][x] = original->a[y][x]; + tmp1->b[y][x] = original->b[y][x]; + tmp2->L[y][x] = original->L[y][x]; + tmp3->L[y][x] = original->L[y][x]; + tmp3->a[y][x] = original->a[y][x]; + tmp3->b[y][x] = original->b[y][x]; + } + } + + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(TW, TH); + lab2rgb(*tmp1, *tmpImage, params->icm.workingProfile); + array2D LL(TW, TH); + array2D rr(TW, TH); + array2D gg(TW, TH); + array2D bb(TW, TH); + array2D guide(TW, TH); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + LL[y][x] = tmp1->L[y][x]; + float ll = LL[y][x] / 32768.f; + guide[y][x] = xlin2log(rtengine::max(ll, 0.f), 10.f); + rr[y][x] = tmpImage->r(y, x); + gg[y][x] = tmpImage->g(y, x); + bb[y][x] = tmpImage->b(y, x); + + } + } + + array2D iR(TW, TH, rr, 0); + array2D iG(TW, TH, gg, 0); + array2D iB(TW, TH, bb, 0); + array2D iL(TW, TH, LL, 0); + + int r = rtengine::max(int(lp.guidb / sk), 1); + + const float epsil = 0.001f * std::pow(2.f, - lp.epsb); + + if (lp.chromet == 0) { + rtengine::guidedFilterLog(guide, 10.f, LL, r, epsil, multiThread); + } else if (lp.chromet == 1) { + rtengine::guidedFilterLog(guide, 10.f, rr, r, epsil, multiThread); + rtengine::guidedFilterLog(guide, 10.f, bb, r, epsil, multiThread); + } else if (lp.chromet == 2) { + rtengine::guidedFilterLog(10.f, gg, r, epsil, multiThread); + rtengine::guidedFilterLog(10.f, rr, r, epsil, multiThread); + rtengine::guidedFilterLog(10.f, bb, r, epsil, multiThread); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + rr[y][x] = intp(lp.strbl, rr[y][x] , iR[y][x]); + gg[y][x] = intp(lp.strbl, gg[y][x] , iG[y][x]); + bb[y][x] = intp(lp.strbl, bb[y][x] , iB[y][x]); + tmpImage->r(y, x) = rr[y][x]; + tmpImage->g(y, x) = gg[y][x]; + tmpImage->b(y, x) = bb[y][x]; + + } + } + + rgb2lab(*tmpImage, *tmp1, params->icm.workingProfile); + + if (lp.chromet == 0) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + LL[y][x] = intp(lp.strbl, LL[y][x] , iL[y][x]); + tmp1->L[y][x] = LL[y][x]; + } + } + } + if(lp.enablMask && lp.recothr != 1.f && lp.smasktyp != 1) { + array2D masklum; + masklum(TW, TH); + for (int ir = 0; ir < TH; ir++) + for (int jr = 0; jr < TW; jr++) { + masklum[ir][jr] = 1.f; + } + + float hig = lp.higthr; + float higc; + calcdif(hig, higc); + float low = lp.lowthr; + float lowc; + calcdif(low, lowc); + + if(higc < lowc) { + higc = lowc + 0.01f; + } + float th = (lp.recothr - 1.f); + float ahigh = th / (higc - 100.f); + float bhigh = 1.f - higc * ahigh; + + float alow = th / lowc; + float blow = 1.f - th; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < TH; ir++) + for (int jr = 0; jr < TW; jr++) { + const float lM = bufmaskblurbl->L[ir][jr]; + const float lmr = lM / 327.68f; + if (lM < 327.68f * lowc) { + masklum[ir][jr] = alow * lmr + blow; + } else if (lM < 327.68f * higc) { + + } else { + masklum[ir][jr] = (ahigh * lmr + bhigh); + } + } + + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(masklum), static_cast(masklum), 10 / sk, TW, TH, false); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < TH; ++i) { + for (int j = 0; j < TW; ++j) { + tmp1->L[i][j] = (tmp3->L[i][j] - tmp1->L[i][j]) * LIM01(masklum[i][j]) + tmp1->L[i][j]; + tmp1->a[i][j] = (tmp3->a[i][j] - tmp1->a[i][j]) * LIM01(masklum[i][j]) + tmp1->a[i][j]; + tmp1->b[i][j] = (tmp3->b[i][j] - tmp1->b[i][j]) * LIM01(masklum[i][j]) + tmp1->b[i][j]; + } + } + masklum.free(); + + } + + delete tmpImage; + } + } + + if (tmp1.get()) { + if (lp.blurmet == 0) { //blur and noise (center) + + if(lp.smasktyp != 1) { + BlurNoise_Local(tmp1.get(), originalmaskbl.get(), hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + } else { + BlurNoise_Local(tmp1.get(), original, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + } + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } else if (lp.blurmet == 1) { + // InverseBlurNoise_Local(originalmaskbl, bufchro, lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); + if(lp.smasktyp != 1) { + InverseBlurNoise_Local(originalmaskbl.get(), lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); + } else { + InverseBlurNoise_Local(original, lp, hueref, chromaref, lumaref, original, transformed, tmp1.get(), cx, cy, sk); + } + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + } + } + } + + //local impulse + if ((lp.bilat > 0.f) && lp.denoiena) { + const int bfh = int (lp.ly + lp.lyT) + del; //bfw bfh real size of square zone + const int bfw = int (lp.lx + lp.lxL) + del; + + std::unique_ptr bufwv; + + if (call == 2) {//simpleprocess + bufwv.reset(new LabImage(bfw, bfh)); //buffer for data in zone limit + + const int begy = lp.yc - lp.lyT; + const int begx = lp.xc - lp.lxL; + const int yEn = lp.yc + lp.ly; + const int xEn = lp.xc + lp.lx; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = rtengine::max(0, begy - cy); y < rtengine::min(transformed->H, yEn - cy); y++) { + const int loy = cy + y; + + for (int x = rtengine::max(0, begx - cx); x < rtengine::min(transformed->W, xEn - cx); x++) { + const int lox = cx + x; + bufwv->L[loy - begy][lox - begx] = original->L[y][x]; + bufwv->a[loy - begy][lox - begx] = original->a[y][x]; + bufwv->b[loy - begy][lox - begx] = original->b[y][x]; + } + } + } else {//dcrop.cc + bufwv.reset(new LabImage(transformed->W, transformed->H)); + bufwv->CopyFrom(original, multiThread); + } //end dcrop + + const double threshold = lp.bilat / 20.f; + + if (bfh > 8 && bfw > 8) { + ImProcFunctions::impulse_nr(bufwv.get(), threshold); + } + + DeNoise_Local(call, lp, originalmaskbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, *bufwv, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + +//local denoise + if (lp.activspot && lp.denoiena && (lp.noiself > 0.f || lp.noiself0 > 0.f || lp.noiself2 > 0.f || lp.wavcurvedenoi ||lp.nlstr > 0 || lp.noiselc > 0.f || lp.noisecf > 0.f || lp.noisecc > 0.f )) {//disable denoise if not used + constexpr int aut = 0; + DeNoise(call, aut, noiscfactiv, lp, originalmaskbl.get(), bufmaskblurbl.get(), levred, huerefblur, lumarefblur, chromarefblur, original, transformed, cx, cy, sk, locwavCurvehue, locwavhueutili, + highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46); + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + +//Tone mapping + + if ((lp.strengt != 0.f || lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 3 || lp.showmasktmmet == 4 || lp.prevdE) && lp.tonemapena && !params->epd.enabled) { + if (call <= 3) { //simpleprocess dcrop improcc + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + const int bfh = yend - ystart; + const int bfw = xend - xstart; + + if (bfw >= mDEN && bfh >= mDEN) { + // printf("OK TM\n"); + array2D buflight(bfw, bfh); + JaggedArray bufchro(bfw, bfh); + std::unique_ptr bufgb(new LabImage(bfw, bfh)); + const std::unique_ptr tmp1(new LabImage(bfw, bfh)); + const std::unique_ptr bufgbm(new LabImage(bfw, bfh)); + const std::unique_ptr tmp1m(new LabImage(bfw, bfh)); + std::unique_ptr bufmaskorigtm; + std::unique_ptr bufmaskblurtm; + std::unique_ptr originalmasktm; + + // if (lp.showmasktmmet == 0 || lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 3 || lp.showmasktmmet == 4) { + if (lp.showmasktmmet == 2 || lp.enatmMask || lp.showmasktmmet == 3 || lp.showmasktmmet == 4) { + bufmaskorigtm.reset(new LabImage(bfw, bfh)); + bufmaskblurtm.reset(new LabImage(bfw, bfh)); + originalmasktm.reset(new LabImage(bfw, bfh)); + } + + // 3 loops to avoid performance penalty on machines with 4-way L1 cache +#ifdef _OPENMP + #pragma omp parallel if (multiThread) + { + #pragma omp for schedule(dynamic,16) nowait +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufgbm->L[y - ystart][x - xstart] = bufgb->L[y - ystart][x - xstart] = original->L[y][x]; + } + } + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) nowait +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufgbm->a[y - ystart][x - xstart] = bufgb->a[y - ystart][x - xstart] = original->a[y][x]; + } + } + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufgbm->b[y - ystart][x - xstart] = bufgb->b[y - ystart][x - xstart] = original->b[y][x]; + } + } +#ifdef _OPENMP + } +#endif + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmasktmmet == 3) { + showmaske = true; + } + + if (lp.enatmMask) { + enaMask = true; + } + + if (lp.showmasktmmet == 4) { + deltaE = true; + } + + if (lp.showmasktmmet == 2) { + modmask = true; + } + + if (lp.showmasktmmet == 1) { + modif = true; + } + + if (lp.showmasktmmet == 0) { + zero = true; + } + + float chrom = lp.chromatm;; + float rad = lp.radmatm; + float gamma = lp.gammatm; + float slope = lp.slomatm; + float blendm = lp.blendmatm; + float lap = params->locallab.spots.at(sp).lapmasktm; + bool pde = params->locallab.spots.at(sp).laplac; + int lumask = params->locallab.spots.at(sp).lumask; + + if (!params->locallab.spots.at(sp).enatmMaskaft) { + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0; //lp.mergemet;// params->locallab.spots.at(sp).shortc; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + int shado = 0; + float amountcd = 0.f; + float anchorcd = 50.f; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgbm.get(), bufmaskorigtm.get(), originalmasktm.get(), original, reserved, inv, lp, + 0.f, false, + locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, false, 1, 1, 5, 5, + shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmasktmmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufgbm.get(), transformed, bufmaskorigtm.get(), 0); + + return; + } + } + + if (lp.showmasktmmet == 0 || lp.showmasktmmet == 1 || lp.showmasktmmet == 2 || lp.showmasktmmet == 4 || lp.showmasktmmet == 3 || lp.enatmMask) { + constexpr int itera = 0; + ImProcFunctions::EPDToneMaplocal(sp, bufgb.get(), tmp1.get(), itera, sk);//iterate to 0 calculate with edgstopping, improve result, call=1 dcrop we can put iterate to 5 + + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "tm") { + bool HHcurvejz = false; + bool CHcurvejz = false; + bool LHcurvejz = false; + if (params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, tmp1.get(), rad, 15.f, sk); + } + + + + + tmp1m->CopyFrom(tmp1.get(), multiThread); //save current result7 + if(params->locallab.spots.at(sp).equiltm && params->locallab.spots.at(sp).exptonemap) { + if(call == 3) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + savenormtm->L[y][x] = tmp1->L[y - ystart][x - xstart]; + savenormtm->a[y][x] = tmp1->a[y - ystart][x - xstart]; + savenormtm->b[y][x] = tmp1->b[y - ystart][x - xstart]; + } + } + } + } + bool enatmMasktmap = params->locallab.spots.at(sp).enatmMaskaft; + + if (enatmMasktmap) { + //calculate new values for original, originalmasktm, bufmaskorigtm...in function of tmp1 + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + int shado = 0; + float amountcd = 0.f; + float anchorcd = 50.f; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, tmp1.get(), bufmaskorigtm.get(), originalmasktm.get(), original, reserved, inv, lp, + 0.f, false, + locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasktmlocalcurve, localmasktmutili, dummy, false, 1, 1, 5, 5, + shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmasktmmet == 3) {//display mask + showmask(params->locallab.spots.at(sp).lumask, lp, xstart, ystart, cx, cy, bfw, bfh, tmp1.get(), transformed, bufmaskorigtm.get(), 0); + return; + } + + } + + tmp1->CopyFrom(tmp1m.get(), multiThread); //restore current result + + + float minL = tmp1->L[0][0] - bufgb->L[0][0]; + float maxL = minL; + float minC = std::sqrt(SQR(tmp1->a[0][0]) + SQR(tmp1->b[0][0])) - std::sqrt(SQR(bufgb->a[0][0]) + SQR(bufgb->b[0][0])); + float maxC = minC; + +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxL) reduction(min:minL) reduction(max:maxC) reduction(min:minC) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + buflight[ir][jr] = tmp1->L[ir][jr] - bufgb->L[ir][jr]; + minL = rtengine::min(minL, buflight[ir][jr]); + maxL = rtengine::max(maxL, buflight[ir][jr]); + bufchro[ir][jr] = std::sqrt(SQR(tmp1->a[ir][jr]) + SQR(tmp1->b[ir][jr])) - std::sqrt(SQR(bufgb->a[ir][jr]) + SQR(bufgb->b[ir][jr])); + minC = rtengine::min(minC, bufchro[ir][jr]); + maxC = rtengine::max(maxC, bufchro[ir][jr]); + } + } + + float coef = 0.01f * rtengine::max(std::fabs(minL), std::fabs(maxL)); + float coefC = 0.01f * rtengine::max(std::fabs(minC), std::fabs(maxC)); + + if (coef == 0.f) { + coef = 1.f; + } else { + coef = 1.f / coef; + } + + if (coefC == 0.f) { + coefC = 1.f; + } else { + coefC = 1.f / coefC; + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + buflight[y][x] *= coef; + bufchro[y][x] *= coefC; + } + } + + if(lp.enatmMask && lp.recothrt != 1.f) { + float recoth = lp.recothrt; + + if(lp.recothrt < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthrt; + float low = lp.lowthrt; + // float recoth = lp.recothrt; + float decay = lp.decayt; + bool invmask = false; + maskrecov(tmp1.get(), original, bufmaskorigtm.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + // transit_shapedetect_retinex(call, 4, bufgb.get(),bufmaskorigtm.get(), originalmasktm.get(), buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + + if(lp.recothrt >= 1.f) { + transit_shapedetect2(sp, meantm, stdtm, call, 8, bufgb.get(), tmp1.get(), originalmasktm.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, meantm, stdtm, call, 8, bufgb.get(), tmp1.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + // transit_shapedetect(8, tmp1.get(), originalmasktm.get(), bufchro, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + bufgb.reset(); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + } + } + +//end TM + + + if ((lp.dehaze != 0 || lp.prevdE) && lp.retiena ) { + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + + if (bfh >= mSP && bfw >= mSP) { + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); //buffer for data in zone limit + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); //buffer for data in zone limit + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; + bufexporig->a[y - ystart][x - xstart] = original->a[y][x]; + bufexporig->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + + bufexpfin->CopyFrom(bufexporig.get(), multiThread); + //calc dehaze + const std::unique_ptr tmpImage(new Imagefloat(bfw, bfh)); + + DehazeParams dehazeParams; + dehazeParams.enabled = true; + dehazeParams.strength = lp.dehaze; + dehazeParams.showDepthMap = false; + dehazeParams.saturation = lp.dehazeSaturation; + dehazeParams.depth = lp.depth; + lab2rgb(*bufexpfin, *tmpImage.get(), params->icm.workingProfile); + dehazeloc(tmpImage.get(), dehazeParams); + rgb2lab(*tmpImage.get(), *bufexpfin, params->icm.workingProfile); + + transit_shapedetect2(sp, 0.f, 0.f, call, 30, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + + lp.invret = false;//always disabled inverse RETI too complex todo !! + + if (lp.str >= 0.2f && lp.retiena && call != 2) { + LabImage *bufreti = nullptr; + LabImage *bufmask = nullptr; + LabImage *buforig = nullptr; + LabImage *buforigmas = nullptr; + LabImage *bufmaskorigreti = nullptr; + + if (TW >= mSP && TH >= mSP) { + + array2D buflight(TW, TH); + JaggedArray bufchro(TW, TH); + + int Hd, Wd; + Hd = TH; + Wd = TW; + + bufreti = new LabImage(TW, TH); + bufmask = new LabImage(TW, TH); + bufmaskorigreti = new LabImage(TW, TH); + + if (!lp.enaretiMasktmap && lp.enaretiMask) { + buforig = new LabImage(TW, TH); + buforigmas = new LabImage(TW, TH); + // bufmaskorigreti = new LabImage(GW, GH); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < TH; ir++) //fill with 0 + for (int jr = 0; jr < TW; jr++) { + bufreti->L[ir][jr] = 0.f; + bufreti->a[ir][jr] = 0.f; + bufreti->b[ir][jr] = 0.f; + buflight[ir][jr] = 0.f; + bufchro[ir][jr] = 0.f; + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H ; y++) //{ + for (int x = 0; x < transformed->W; x++) { + bufreti->L[y][x] = original->L[y][x]; + bufreti->a[y][x] = original->a[y][x]; + bufreti->b[y][x] = original->b[y][x]; + bufmask->L[y][x] = original->L[y][x]; + bufmask->a[y][x] = original->a[y][x]; + bufmask->b[y][x] = original->b[y][x]; + + + + if (!lp.enaretiMasktmap && lp.enaretiMask) { + buforig->L[y][x] = original->L[y][x]; + buforig->a[y][x] = original->a[y][x]; + buforig->b[y][x] = original->b[y][x]; + + // bufmaskorigreti->L[y][x] = original->L[y][x]; + // bufmaskorigreti->a[y][x] = original->a[y][x]; + // bufmaskorigreti->b[y][x] = original->b[y][x]; + + + } + + } + float raddE = params->locallab.spots.at(sp).softradiusret; + + //calc dE and reduction to use in MSR to reduce artifacts + const float mindE = 4.f + MINSCOPE * lp.sensh * lp.thr; + const float maxdE = 5.f + MAXSCOPE * lp.sensh * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + const float refa = chromaref * cos(hueref); + const float refb = chromaref * sin(hueref); + + const std::unique_ptr> reducDEBuffer(new JaggedArray(Wd, Hd)); + float** reducDE = *reducDEBuffer; + + float ade = 0.01f * raddE; + float bde = 100.f - raddE; + float sensibefore = ade * lp.sensh + bde;//we can change sensitivity 0.1 90 or 0.3 70 or 0.4 60 +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H ; y++) + for (int x = 0; x < transformed->W; x++) { + float dE = std::sqrt(SQR(refa - bufreti->a[y][x] / 327.68f) + SQR(refb - bufreti->b[y][x] / 327.68f) + SQR(static_cast(lumaref) - bufreti->b[y][x] / 327.68f)); + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sensibefore); + reducDE[y][x] = clipDE(reducdE); + } + + const std::unique_ptr> origBuffer(new JaggedArray(Wd, Hd)); + float** orig = *origBuffer; + + const std::unique_ptr> origBuffer1(new JaggedArray(Wd, Hd)); + float** orig1 = *origBuffer1; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) + for (int jr = 0; jr < Wd; jr += 1) { + orig[ir][jr] = bufreti->L[ir][jr]; + orig1[ir][jr] = bufreti->L[ir][jr]; + } + + LabImage *tmpl = new LabImage(Wd, Hd); + + bool fftw = lp.ftwreti; + //for Retinex Mask are incorporated in MSR + int sco = params->locallab.spots.at(sp).scopemask; + float lumask = params->locallab.spots.at(sp).lumask; + + const float mindE2 = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE2 = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim2 = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim2 = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + ImProcFunctions::MSRLocal(call, sp, fftw, 1, reducDE, bufreti, bufmask, buforig, buforigmas, bufmaskorigreti, orig, orig1, + Wd, Hd, Wd, Hd, params->locallab, sk, locRETgainCcurve, locRETtransCcurve, 0, 4, 1.f, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, llretiMask, + lmaskretilocalcurve, localmaskretiutili, + transformed, lp.enaretiMasktmap, lp.enaretiMask, + params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope, sco, lp.balance, lp.balanceh, lumask); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) { + for (int jr = 0; jr < Wd; jr += 1) { + tmpl->L[ir][jr] = orig[ir][jr]; + if(params->locallab.spots.at(sp).equilret && params->locallab.spots.at(sp).expreti) { + if(call == 3) { + savenormreti->L[ir][jr] = tmpl->L[ir][jr]; + } + } + } + } + + if (lp.equret) { //equilibrate luminance before / after MSR + float *datain = new float[Hd * Wd]; + float *data = new float[Hd * Wd]; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) + for (int jr = 0; jr < Wd; jr += 1) { + datain[ir * Wd + jr] = orig1[ir][jr]; + data[ir * Wd + jr] = orig[ir][jr]; + } + + if(params->locallab.spots.at(sp).equilret){ + if(call == 3) {//improccoordinator + normalize_mean_dt(data, datain, Hd * Wd, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f); + } else if(call == 1) {//dcrop + float ma = meanreti; + float sa = stdreti; + float ma2 = (float) params->locallab.spots.at(sp).sensihs; + float sa2 = (float) params->locallab.spots.at(sp).sensiv; + //printf("ma=%f sa=%f ma2=%f sa2=%f\n", (double) ma, (double) sa, (double) ma2, (double) sa2); + //use normalize with mean and stdv + normalize_mean_dt(data, datain, Hd * Wd, 1.f, 1.f, ma, sa, ma2, sa2); + + } + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) + for (int jr = 0; jr < Wd; jr += 1) { + tmpl->L[ir][jr] = data[ir * Wd + jr]; + } + + delete [] datain; + delete [] data; + } + + if(lp.enaretiMask && lp.recothrr != 1.f) { + float hig = lp.higthrr; + float low = lp.lowthrr; + float recoth = lp.recothrr; + float decay = lp.decayr; + bool invmask = false; + maskrecov(tmpl, original, bufmaskorigreti, Hd, Wd, 0, 0, hig, low, recoth, decay, invmask, sk, multiThread); + } + + float minL = tmpl->L[0][0] - bufreti->L[0][0]; + float maxL = minL; +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minL) reduction(max:maxL) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + buflight[ir][jr] = tmpl->L[ir][jr] - bufreti->L[ir][jr]; + minL = rtengine::min(minL, buflight[ir][jr]); + maxL = rtengine::max(maxL, buflight[ir][jr]); + } + } + + const float coef = 0.01f * rtengine::max(std::fabs(minL), std::fabs(maxL)); + + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + buflight[ir][jr] /= coef; + } + } + + transit_shapedetect_retinex(call, 4, bufreti, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + + if (params->locallab.spots.at(sp).chrrt > 0) { + + if (call == 1) { + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) + for (int jr = 0; jr < Wd; jr += 1) { + + orig[ir][jr] = std::sqrt(SQR(bufreti->a[ir][jr]) + SQR(bufreti->b[ir][jr])); + orig1[ir][jr] = std::sqrt(SQR(bufreti->a[ir][jr]) + SQR(bufreti->b[ir][jr])); + } + + } + + float maxChro = orig1[0][0]; +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxChro) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + maxChro = rtengine::max(maxChro, orig1[ir][jr]); + } + } + + float divchro = maxChro; + + //first step change saturation without Retinex ==> gain of time and memory + float satreal = lp.str * static_cast(params->locallab.spots.at(sp).chrrt) / 100.f; + + if (params->locallab.spots.at(sp).chrrt <= 0.2) { + satreal /= 10.f; + } + + DiagonalCurve reti_satur({ + DCT_NURBS, + 0, 0, + 0.2, 0.2f + satreal / 250.f, + 0.6, rtengine::min(1.f, 0.6f + satreal / 250.f), + 1, 1 + }); + + if (call == 1) { + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) + for (int jr = 0; jr < Wd; jr += 1) { + const float Chprov = orig1[ir][jr]; + float2 sincosval; + sincosval.y = Chprov == 0.0f ? 1.f : bufreti->a[ir][jr] / Chprov; + sincosval.x = Chprov == 0.0f ? 0.f : bufreti->b[ir][jr] / Chprov; + + if (params->locallab.spots.at(sp).chrrt <= 100.0) { //first step + float buf = LIM01(orig[ir][jr] / divchro); + buf = reti_satur.getVal(buf); + buf *= divchro; + orig[ir][jr] = buf; + } + + tmpl->a[ir][jr] = orig[ir][jr] * sincosval.y; + tmpl->b[ir][jr] = orig[ir][jr] * sincosval.x; + } + + float minC = std::sqrt(SQR(tmpl->a[0][0]) + SQR(tmpl->b[0][0])) - orig1[0][0]; + float maxC = minC; +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minC) reduction(max:maxC) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + bufchro[ir][jr] = std::sqrt(SQR(tmpl->a[ir][jr]) + SQR(tmpl->b[ir][jr])) - orig1[ir][jr]; + minC = rtengine::min(minC, bufchro[ir][jr]); + maxC = rtengine::max(maxC, bufchro[ir][jr]); + } + } + + float coefC = 0.01f * rtengine::max(std::fabs(minC), std::fabs(maxC)); + + if (coefC > 0.f) { + coefC = 1.f / coefC; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + bufchro[ir][jr] *= coefC; + } + } + } + } + + transit_shapedetect_retinex(call, 5, tmpl, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + + delete tmpl; + delete bufmask; + delete bufmaskorigreti; + + if (!lp.enaretiMasktmap && lp.enaretiMask) { + if (buforig) { + delete buforig; + } + + if (buforigmas) { + delete buforigmas; + } + } + delete bufreti; + } + } + + + + if (lp.str >= 0.2f && lp.retiena && call == 2) { + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + + LabImage *bufreti = nullptr; + LabImage *bufmask = nullptr; + LabImage *buforig = nullptr; + LabImage *buforigmas = nullptr; + LabImage *bufmaskorigreti = nullptr; + int bfhr = bfh; + int bfwr = bfw; + + if (bfw >= mSP && bfh > mSP) { + if (lp.ftwreti) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + array2D buflight(bfw, bfh); + JaggedArray bufchro(bfw, bfh); + + int Hd, Wd; + Hd = TH; + Wd = TW; + + if (!lp.invret && call == 2) { + + Hd = bfh; + Wd = bfw; + bufreti = new LabImage(bfw, bfh); + bufmask = new LabImage(bfw, bfh); + bufmaskorigreti = new LabImage(bfw, bfh); + + if (!lp.enaretiMasktmap && lp.enaretiMask) { + buforig = new LabImage(bfw, bfh); + buforigmas = new LabImage(bfw, bfh); + } + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) //fill with 0 + for (int jr = 0; jr < bfw; jr++) { + bufreti->L[ir][jr] = 0.f; + bufreti->a[ir][jr] = 0.f; + bufreti->b[ir][jr] = 0.f; + buflight[ir][jr] = 0.f; + bufchro[ir][jr] = 0.f; + } + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufreti->L[y - ystart][x - xstart] = original->L[y][x]; + bufreti->a[y - ystart][x - xstart] = original->a[y][x]; + bufreti->b[y - ystart][x - xstart] = original->b[y][x]; + bufmask->L[y - ystart][x - xstart] = original->L[y][x]; + bufmask->a[y - ystart][x - xstart] = original->a[y][x]; + bufmask->b[y - ystart][x - xstart] = original->b[y][x]; + + if (!lp.enaretiMasktmap && lp.enaretiMask) { + buforig->L[y - ystart][x - xstart] = original->L[y][x]; + buforig->a[y - ystart][x - xstart] = original->a[y][x]; + buforig->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + } + } + + float raddE = params->locallab.spots.at(sp).softradiusret; + + //calc dE and reduction to use in MSR to reduce artifacts + const float mindE = 4.f + MINSCOPE * lp.sensh * lp.thr; + const float maxdE = 5.f + MAXSCOPE * lp.sensh * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + const float refa = chromaref * cos(hueref); + const float refb = chromaref * sin(hueref); + + const std::unique_ptr> reducDEBuffer(new JaggedArray(Wd, Hd)); + float** reducDE = *reducDEBuffer; + float ade = 0.01f * raddE; + float bde = 100.f - raddE; + float sensibefore = ade * lp.sensh + bde;//we can change sensitivity 0.1 90 or 0.3 70 or 0.4 60 +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend ; y++) { + for (int x = xstart; x < xend; x++) { + const float dE = std::sqrt(SQR(refa - bufreti->a[y - ystart][x - xstart] / 327.68f) + SQR(refb - bufreti->b[y - ystart][x - xstart] / 327.68f) + SQR(static_cast(lumaref) - bufreti->b[y - ystart][x - xstart] / 327.68f)); + const float reducdE = calcreducdE(dE, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sensibefore); + reducDE[y - ystart][x - xstart] = clipDE(reducdE); + } + } + + const std::unique_ptr> origBuffer(new JaggedArray(Wd, Hd)); + float** orig = *origBuffer; + + const std::unique_ptr> origBuffer1(new JaggedArray(Wd, Hd)); + float** orig1 = *origBuffer1; + + LabImage *tmpl = nullptr; + + if (!lp.invret && call == 2) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) { + for (int jr = 0; jr < Wd; jr += 1) { + orig[ir][jr] = bufreti->L[ir][jr]; + orig1[ir][jr] = bufreti->L[ir][jr]; + } + } + + tmpl = new LabImage(Wd, Hd); + } + + // float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax; + bool fftw = lp.ftwreti; + //for Retinex Mask are incorporated in MSR + int sco = params->locallab.spots.at(sp).scopemask; + float lumask = params->locallab.spots.at(sp).lumask; + + const float mindE2 = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE2 = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim2 = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim2 = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + + ImProcFunctions::MSRLocal(call, sp, fftw, 1, reducDE, bufreti, bufmask, buforig, buforigmas, bufmaskorigreti, orig, orig1, + Wd, Hd, bfwr, bfhr, params->locallab, sk, locRETgainCcurve, locRETtransCcurve, 0, 4, 1.f, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, llretiMask, + lmaskretilocalcurve, localmaskretiutili, + transformed, lp.enaretiMasktmap, lp.enaretiMask, + params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE2, mindE2, maxdElim2, mindElim2, lp.iterat, limscope, sco, lp.balance, lp.balanceh, lumask); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) + for (int jr = 0; jr < Wd; jr += 1) { + tmpl->L[ir][jr] = orig[ir][jr]; + } + + + if (lp.equret) { //equilibrate luminance before / after MSR + const std::unique_ptr datain(new float[Hd * Wd]); + const std::unique_ptr data(new float[Hd * Wd]); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) { + for (int jr = 0; jr < Wd; jr += 1) { + datain[ir * Wd + jr] = orig1[ir][jr]; + data[ir * Wd + jr] = orig[ir][jr]; + } + } + + normalize_mean_dt(data.get(), datain.get(), Hd * Wd, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f); +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) { + for (int jr = 0; jr < Wd; jr += 1) { + tmpl->L[ir][jr] = data[ir * Wd + jr]; + } + } + } + if(lp.enaretiMask && lp.recothrr != 1.f) { + float hig = lp.higthrr; + float low = lp.lowthrr; + float recoth = lp.recothrr; + float decay = lp.decayr; + bool invmask = false; + maskrecov(tmpl, original, bufmaskorigreti, Hd, Wd, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + if (!lp.invret) { + float minL = tmpl->L[0][0] - bufreti->L[0][0]; + float maxL = minL; +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minL) reduction(max:maxL) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + buflight[ir][jr] = tmpl->L[ir][jr] - bufreti->L[ir][jr]; + minL = rtengine::min(minL, buflight[ir][jr]); + maxL = rtengine::max(maxL, buflight[ir][jr]); + } + } + + float coef = 0.01f * rtengine::max(std::fabs(minL), std::fabs(maxL)); + + if (coef > 0.f) { + coef = 1.f / coef; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + buflight[ir][jr] *= coef; + } + } + } + + transit_shapedetect_retinex(call, 4, bufreti, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + + if (params->locallab.spots.at(sp).chrrt > 0) { + if (!lp.invret && call == 2) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) { + for (int jr = 0; jr < Wd; jr += 1) { + orig[ir][jr] = std::sqrt(SQR(bufreti->a[ir][jr]) + SQR(bufreti->b[ir][jr])); + orig1[ir][jr] = std::sqrt(SQR(bufreti->a[ir][jr]) + SQR(bufreti->b[ir][jr])); + } + } + } + + float maxChro = orig1[0][0]; +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxChro) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + maxChro = rtengine::max(maxChro, orig1[ir][jr]); + } + } + + //first step change saturation without Retinex ==> gain of time and memory + float satreal = lp.str * static_cast(params->locallab.spots.at(sp).chrrt) / 100.f; + + if (params->locallab.spots.at(sp).chrrt <= 0.2) { + satreal /= 10.f; + } + + DiagonalCurve reti_satur({ + DCT_NURBS, + 0, 0, + 0.2, 0.2f + satreal / 250.f, + 0.6, rtengine::min(1.f, 0.6f + satreal / 250.f), + 1, 1 + }); + + if (!lp.invret && call == 2) { + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir += 1) { + for (int jr = 0; jr < Wd; jr += 1) { + const float Chprov = orig1[ir][jr]; + float2 sincosval; + sincosval.y = Chprov == 0.0f ? 1.f : bufreti->a[ir][jr] / Chprov; + sincosval.x = Chprov == 0.0f ? 0.f : bufreti->b[ir][jr] / Chprov; + + if (params->locallab.spots.at(sp).chrrt <= 40.0) { //first step + orig[ir][jr] = static_cast(reti_satur.getVal(LIM01(orig[ir][jr] / maxChro))) * maxChro; + } + + tmpl->a[ir][jr] = orig[ir][jr] * sincosval.y; + tmpl->b[ir][jr] = orig[ir][jr] * sincosval.x; + } + } + + float minC = std::sqrt(SQR(tmpl->a[0][0]) + SQR(tmpl->b[0][0])) - orig1[0][0]; + float maxC = minC; +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minC) reduction(max:maxC) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + bufchro[ir][jr] = std::sqrt(SQR(tmpl->a[ir][jr]) + SQR(tmpl->b[ir][jr])) - orig1[ir][jr]; + minC = rtengine::min(minC, bufchro[ir][jr]); + maxC = rtengine::max(maxC, bufchro[ir][jr]); + } + } + + float coefC = 0.01f * rtengine::max(std::fabs(minC), std::fabs(maxC)); + + if (coefC > 0.f) { + coefC = 1.f / coefC; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int ir = 0; ir < Hd; ir++) { + for (int jr = 0; jr < Wd; jr++) { + bufchro[ir][jr] *= coefC; + } + } + } + } + + if (!lp.invret) { + transit_shapedetect_retinex(call, 5, tmpl, tmpl, bufmask, buforigmas, buflight, bufchro, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + + delete tmpl; + delete bufmask; + delete bufmaskorigreti; + + if (!lp.enaretiMasktmap && lp.enaretiMask) { + if (buforig) { + delete buforig; + } + + if (buforigmas) { + delete buforigmas; + } + } + delete bufreti; + } + } + + +//begin cbdl + if ((lp.mulloc[0] != 1.f || lp.mulloc[1] != 1.f || lp.mulloc[2] != 1.f || lp.mulloc[3] != 1.f || lp.mulloc[4] != 1.f || lp.mulloc[5] != 1.f || lp.clarityml != 0.f || lp.contresid != 0.f || lp.enacbMask || lp.showmaskcbmet == 2 || lp.showmaskcbmet == 3 || lp.showmaskcbmet == 4 || lp.prevdE) && lp.cbdlena) { + if (call <= 3) { //call from simpleprocess dcrop improcc + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + if (bfw > 65 && bfh > 65) { + array2D bufsh(bfw, bfh); + JaggedArray bufchrom(bfw, bfh, true); + const std::unique_ptr loctemp(new LabImage(bfw, bfh)); + const std::unique_ptr origcbdl(new LabImage(bfw, bfh)); + std::unique_ptr bufmaskorigcb; + std::unique_ptr bufmaskblurcb; + std::unique_ptr originalmaskcb; + + if (lp.showmaskcbmet == 2 || lp.enacbMask || lp.showmaskcbmet == 3 || lp.showmaskcbmet == 4) { + bufmaskorigcb.reset(new LabImage(bfw, bfh)); + bufmaskblurcb.reset(new LabImage(bfw, bfh)); + originalmaskcb.reset(new LabImage(bfw, bfh)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + loctemp->L[y - ystart][x - xstart] = original->L[y][x]; + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskcbmet == 3) { + showmaske = true; + } + + if (lp.enacbMask) { + enaMask = true; + } + + if (lp.showmaskcbmet == 4) { + deltaE = true; + } + + if (lp.showmaskcbmet == 2) { + modmask = true; + } + + if (lp.showmaskcbmet == 1) { + modif = true; + } + + if (lp.showmaskcbmet == 0) { + zero = true; + } + + float chrom = lp.chromacbm;; + float rad = lp.radmacb; + float gamma = lp.gammacb; + float slope = lp.slomacb; + float blendm = lp.blendmacb; + float lap = params->locallab.spots.at(sp).lapmaskcb; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int lumask = params->locallab.spots.at(sp).lumask; + int shado = 0; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; + int shortcu = 0; //lp.mergemet; //params->locallab.spots.at(sp).shortc; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, loctemp.get(), bufmaskorigcb.get(), originalmaskcb.get(), original, reserved, inv, lp, + 0.f, false, + locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskcblocalcurve, localmaskcbutili, dummy, false, 1, 1, 5, 5, + shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.0f, 0.f, -1, fab + ); + + if (lp.showmaskcbmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, loctemp.get(), transformed, bufmaskorigcb.get(), 0); + + return; + } + + constexpr float b_l = -5.f; + constexpr float t_l = 25.f; + constexpr float t_r = 120.f; + constexpr float b_r = 170.f; + constexpr double skinprot = 0.; + int choice = 0; + + if (lp.showmaskcbmet == 0 || lp.showmaskcbmet == 1 || lp.showmaskcbmet == 2 || lp.showmaskcbmet == 4 || lp.enacbMask) { + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufsh[y - ystart][x - xstart] = origcbdl->L[y - ystart][x - xstart] = original->L[y][x]; + loctemp->a[y - ystart][x - xstart] = origcbdl->a[y - ystart][x - xstart] = original->a[y][x]; + loctemp->b[y - ystart][x - xstart] = origcbdl->b[y - ystart][x - xstart] = original->b[y][x]; + loctemp->L[y - ystart][x - xstart] = origcbdl->b[y - ystart][x - xstart] = original->L[y][x]; + } + } + + if (lp.clarityml != 0.f && lp.mulloc[5] == 1.f) { //enabled last level to retrieve level 5 and residual image in case user not select level 5 + lp.mulloc[5] = 1.001f; + } + + if (lp.contresid != 0.f && lp.mulloc[5] == 1.f) { //enabled last level to retrieve level 5 and residual image in case user not select level 5 + lp.mulloc[5] = 1.001f; + } + + ImProcFunctions::cbdl_local_temp(bufsh, loctemp->L, bfw, bfh, lp.mulloc, 1.f, lp.threshol, lp.clarityml, lp.contresid, skinprot, false, b_l, t_l, t_r, b_r, choice, sk, multiThread); + + + if (lp.softradiuscb > 0.f) { + softproc(origcbdl.get(), loctemp.get(), lp.softradiuscb, bfh, bfw, 0.001, 0.00001, 0.5f, sk, multiThread, 1); + } + + if(lp.enacbMask && lp.recothrcb != 1.f) { + float hig = lp.higthrcb; + float low = lp.lowthrcb; + float recoth = lp.recothrcb; + float decay = lp.decaycb; + bool invmask = false; + maskrecov(loctemp.get(), original, bufmaskorigcb.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + } + + transit_shapedetect(6, loctemp.get(), originalmaskcb.get(), bufchrom, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + + const bool nochroma = (lp.showmaskcbmet == 2 || lp.showmaskcbmet == 1); + + //chroma CBDL begin here + if (lp.chromacb > 0.f && !nochroma) { + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufsh[ir][jr] = std::sqrt(SQR(loctemp->a[ir][jr]) + SQR(loctemp->b[ir][jr])); + } + } + + float multc[6]; + float clarich = 0.5f * lp.clarityml; + + if (clarich > 0.f && lp.mulloc[0] == 1.f) { //to enabled in case of user select only clarity + lp.mulloc[0] = 1.01f; + } + + if (lp.contresid != 0.f && lp.mulloc[0] == 1.f) { //to enabled in case of user select only clarity + lp.mulloc[0] = 1.01f; + } + + for (int lv = 0; lv < 6; lv++) { + multc[lv] = rtengine::max((lp.chromacb * (lp.mulloc[lv] - 1.f)) + 1.f, 0.01f); + } + + choice = 1; + ImProcFunctions::cbdl_local_temp(bufsh, loctemp->L, bfw, bfh, multc, rtengine::max(lp.chromacb, 1.f), lp.threshol, clarich, 0.f, skinprot, false, b_l, t_l, t_r, b_r, choice, sk, multiThread); + + float minC = loctemp->L[0][0] - std::sqrt(SQR(loctemp->a[0][0]) + SQR(loctemp->b[0][0])); + float maxC = minC; +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxC) reduction(min:minC) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufchrom[ir][jr] = (loctemp->L[ir][jr] - std::sqrt(SQR(loctemp->a[ir][jr]) + SQR(loctemp->b[ir][jr]))); + minC = rtengine::min(minC, bufchrom[ir][jr]); + maxC = rtengine::max(maxC, bufchrom[ir][jr]); + } + } + + float coefC = 0.01f * rtengine::max(std::fabs(minC), std::fabs(maxC)); + + if (coefC > 0.f) { + coefC = 1.f / coefC; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufchrom[ir][jr] *= coefC; + } + } + } + + transit_shapedetect(7, loctemp.get(), nullptr, bufchrom, false, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + bufsh.free(); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + + } + } + } + + +//end cbdl_Local + +//vibrance + float vibg = params->locallab.spots.at(sp).vibgam; + if (lp.expvib && (lp.past != 0.f || lp.satur != 0.f || lp.strvib != 0.f || vibg != 1.f || lp.war != 0 || lp.strvibab != 0.f || lp.strvibh != 0.f || lp.showmaskvibmet == 2 || lp.enavibMask || lp.showmaskvibmet == 3 || lp.showmaskvibmet == 4 || lp.prevdE) && lp.vibena) { //interior ellipse reinforced lightness and chroma //locallutili + if (call <= 3) { //simpleprocess, dcrop, improccoordinator + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + const int bfh = yend - ystart; + const int bfw = xend - xstart; + + if (bfw >= mSP && bfh >= mSP) { + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); + std::unique_ptr bufmaskorigvib; + std::unique_ptr bufmaskblurvib; + std::unique_ptr originalmaskvib; + + if (lp.showmaskvibmet == 2 || lp.enavibMask || lp.showmaskvibmet == 3 || lp.showmaskvibmet == 4) { + bufmaskorigvib.reset(new LabImage(bfw, bfh)); + bufmaskblurvib.reset(new LabImage(bfw, bfh)); + originalmaskvib.reset(new LabImage(bfw, bfh)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskvibmet == 3) { + showmaske = true; + } + + if (lp.enavibMask) { + enaMask = true; + } + + if (lp.showmaskvibmet == 4) { + deltaE = true; + } + + if (lp.showmaskvibmet == 2) { + modmask = true; + } + + if (lp.showmaskvibmet == 1) { + modif = true; + } + + if (lp.showmaskvibmet == 0) { + zero = true; + } + + float chrom = lp.chromavib; + float rad = lp.radmavib; + float gamma = lp.gammavib; + float slope = lp.slomavib; + float blendm = lp.blendmavib; + float lap = params->locallab.spots.at(sp).lapmaskvib; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + int shado = 0; + int lumask = params->locallab.spots.at(sp).lumask; + LocHHmaskCurve lochhhmasCurve; + float amountcd = 0.f; + float anchorcd = 50.f; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigvib.get(), originalmaskvib.get(), original, reserved, inv, lp, + 0.f, false, + locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskviblocalcurve, localmaskvibutili, dummy, false, 1, 1, 5, 5, + shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmaskvibmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigvib.get(), 0); + + return; + } + + if (lp.showmaskvibmet == 0 || lp.showmaskvibmet == 1 || lp.showmaskvibmet == 2 || lp.showmaskvibmet == 4 || lp.enavibMask) { + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + /* + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; + bufexporig->a[y - ystart][x - xstart] = original->a[y][x]; + bufexporig->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + */ + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + // bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; + bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + VibranceParams vibranceParams; + vibranceParams.enabled = params->locallab.spots.at(sp).expvibrance; + vibranceParams.pastels = params->locallab.spots.at(sp).pastels; + vibranceParams.saturated = params->locallab.spots.at(sp).saturated; + vibranceParams.psthreshold = params->locallab.spots.at(sp).psthreshold; + vibranceParams.protectskins = params->locallab.spots.at(sp).protectskins; + vibranceParams.avoidcolorshift = params->locallab.spots.at(sp).avoidcolorshift; + vibranceParams.pastsattog = params->locallab.spots.at(sp).pastsattog; + vibranceParams.skintonescurve = params->locallab.spots.at(sp).skintonescurve; + + + // bufexpfin->CopyFrom(bufexporig.get(), multiThread); + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufexpfin->L[y][x] = bufexporig->L[y][x]; + bufexpfin->a[y][x] = bufexporig->a[y][x]; + bufexpfin->b[y][x] = bufexporig->b[y][x]; + } + } + + if (lp.strvibh != 0.f) { + printf("a\n"); + struct grad_params gph; + calclocalGradientParams(lp, gph, ystart, xstart, bfw, bfh, 9); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + float factor = ImProcFunctions::calcGradientFactor(gph, jr, ir); + float aa = bufexpfin->a[ir][jr]; + float bb = bufexpfin->b[ir][jr]; + float chrm = std::sqrt(SQR(aa) + SQR(bb)); + float HH = xatan2f(bb, aa); + + float newhr = 0.f; + float cor = 0.f; + + if (factor < 1.f) { + cor = - 2.5f * (1.f - factor); + } else if (factor > 1.f) { + cor = 0.03f * (factor - 1.f); + } + + newhr = HH + cor; + + if (newhr > rtengine::RT_PI_F) { + newhr -= 2 * rtengine::RT_PI_F; + } else if (newhr < -rtengine::RT_PI_F) { + newhr += 2 * rtengine::RT_PI_F; + } + + float2 sincosval = xsincosf(newhr); + bufexpfin->a[ir][jr] = clipC(chrm * sincosval.y); + bufexpfin->b[ir][jr] = clipC(chrm * sincosval.x); + } + } + + if (lp.strvib != 0.f) { + printf("b\n"); + + struct grad_params gp; + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 7); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufexpfin->L[ir][jr] *= ImProcFunctions::calcGradientFactor(gp, jr, ir); + } + } + } + + if (lp.strvibab != 0.f) { + printf("c\n"); + + struct grad_params gpab; + calclocalGradientParams(lp, gpab, ystart, xstart, bfw, bfh, 8); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + const float factor = ImProcFunctions::calcGradientFactor(gpab, jr, ir); + bufexpfin->a[ir][jr] *= factor; + bufexpfin->b[ir][jr] *= factor; + } + } + float gamma1 = params->locallab.spots.at(sp).vibgam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexpfin->L[y][x], F2V(32768.f) * igammalog(LVFU(bufexpfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufexpfin->L[y][x] = 32768.f * igammalog(bufexpfin->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + + ImProcFunctions::vibrance(bufexpfin.get(), vibranceParams, params->toneCurve.hrenabled, params->icm.workingProfile); + + // float gamma = params->locallab.spots.at(sp).vibgam; + // rtengine::GammaValues g_a; //gamma parameters + // double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + // double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + // rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexpfin->L[y][x], F2V(32768.f) * gammalog(LVFU(bufexpfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufexpfin->L[y][x] = 32768.f * gammalog(bufexpfin->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + + if (params->locallab.spots.at(sp).warm != 0) { + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 2, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + if(lp.enavibMask && lp.recothrv != 1.f) { + float recoth = lp.recothrv; + + if(lp.recothrv < 1.f) { + recoth = -1.f * recoth + 2.f; + } + + float hig = lp.higthrv; + float low = lp.lowthrv; + // float recoth = lp.recothrv; + float decay = lp.decayv; + bool invmask = false; + maskrecov(bufexpfin.get(), original, bufmaskorigvib.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + if(lp.recothrv >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 2, bufexporig.get(), bufexpfin.get(), originalmaskvib.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 2, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + + } + + } + + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + } + + +//shadow highlight + bool tonequ = false; + + if (lp.mullocsh[0] != 0 || lp.mullocsh[1] != 0 || lp.mullocsh[2] != 0 || lp.mullocsh[3] != 0 || lp.mullocsh[4] != 0) { + tonequ = true; + } + + bool tonecurv = false; + const Glib::ustring profile = params->icm.workingProfile; + bool isworking = (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1"); + + if (isworking && (params->locallab.spots.at(sp).gamSH != 2.4 || params->locallab.spots.at(sp).sloSH != 12.92)) { + tonecurv = true; + } + + if (! lp.invsh && (lp.highlihs > 0.f || lp.shadowhs > 0.f || tonequ || tonecurv || lp.strSH != 0.f || lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4 || lp.prevdE) && call <= 3 && lp.hsena) { + const int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + const int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + const int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + const int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + const int bfh = yend - ystart; + const int bfw = xend - xstart; + + + if (bfw >= mSP && bfh >= mSP) { + + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); + std::unique_ptr bufmaskorigSH; + std::unique_ptr bufmaskblurSH; + std::unique_ptr originalmaskSH; + + if (lp.showmaskSHmet == 2 || lp.enaSHMask || lp.showmaskSHmet == 3 || lp.showmaskSHmet == 4) { + bufmaskorigSH.reset(new LabImage(bfw, bfh)); + bufmaskblurSH.reset(new LabImage(bfw, bfh)); + originalmaskSH.reset(new LabImage(bfw, bfh)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskSHmet == 3) { + showmaske = true; + } + + if (lp.enaSHMask) { + enaMask = true; + } + + if (lp.showmaskSHmet == 4) { + deltaE = true; + } + + if (lp.showmaskSHmet == 2) { + modmask = true; + } + + if (lp.showmaskSHmet == 1) { + modif = true; + } + + if (lp.showmaskSHmet == 0) { + zero = true; + } + + float chrom = lp.chromaSH; + float rad = lp.radmaSH; + float gamma = lp.gammaSH; + float slope = lp.slomaSH; + float blendm = lp.blendmaSH; + float lap = params->locallab.spots.at(sp).lapmaskSH; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + int shado = 0; + float amountcd = params->locallab.spots.at(sp).fatamountSH; + float anchorcd = params->locallab.spots.at(sp).fatanchorSH; + int lumask = params->locallab.spots.at(sp).lumask; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigSH.get(), originalmaskSH.get(), original, reserved, inv, lp, + 0.f, false, + locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, false, 1, 1, 5, 5, + shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmaskSHmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigSH.get(), 0); + + return; + } + + if (lp.showmaskSHmet == 0 || lp.showmaskSHmet == 1 || lp.showmaskSHmet == 2 || lp.showmaskSHmet == 4 || lp.enaSHMask) { + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; + bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; + bufexpfin->L[y][x] = original->L[y + ystart][x + xstart]; + bufexpfin->a[y][x] = original->a[y + ystart][x + xstart]; + bufexpfin->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + if (lp.shmeth == 0) { + ImProcFunctions::shadowsHighlights(bufexpfin.get(), lp.hsena, 1, lp.highlihs, lp.shadowhs, lp.radiushs, sk, lp.hltonalhs, lp.shtonalhs); + } + +//gradient + struct grad_params gp; + + if (lp.strSH != 0.f) { + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 2); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufexpfin->L[ir][jr] *= ImProcFunctions::calcGradientFactor(gp, jr, ir); + } + } + } + + if (lp.shmeth == 1) { + double scal = (double)(sk); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(bfw, bfh); + lab2rgb(*bufexpfin, *tmpImage, params->icm.workingProfile); + Glib::ustring prof = params->icm.workingProfile; + + if (tonecurv) { //Tone response curve : does nothing if gamma=2.4 and slope=12.92 ==> gamma sRGB + float gamtone = params->locallab.spots.at(sp).gamSH; + float slotone = params->locallab.spots.at(sp).sloSH; + cmsHTRANSFORM dummy = nullptr; + int ill =0; + workingtrc(tmpImage, tmpImage, bfw, bfh, -5, prof, 2.4, 12.92310, ill, 0, dummy, true, false, false); + // workingtrc(tmpImage, tmpImage, bfw, bfh, 5, prof, gamtone, slotone, 0, 0, dummy, false, true, true); //to keep if we want improve with illuminant and primaries + workingtrc(tmpImage, tmpImage, bfw, bfh, 1, prof, gamtone, slotone, ill, 0, dummy, false, true, true);//be careful no gamut control + } + + if (tonequ) { + tone_eq(this, tmpImage, lp, params->icm.workingProfile, scal, multiThread); + } + + rgb2lab(*tmpImage, *bufexpfin, params->icm.workingProfile); + + delete tmpImage; + } + } + + if(lp.enaSHMask && lp.recothrs != 1.f) { + float recoth = lp.recothrs; + + if(lp.recothrs < 1.f) { + recoth = -1.f * recoth + 2.f; + } + + float hig = lp.higthrs; + float low = lp.lowthrs; + // float recoth = lp.recothrs; + float decay = lp.decays; + bool invmask = false; + maskrecov(bufexpfin.get(), original, bufmaskorigSH.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).reparsh; + int bw = bufexporig->W; + int bh = bufexporig->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int x = 0; x < bh; x++) { + for (int y = 0; y < bw; y++) { + bufexpfin->L[x][y] = intp(repart, bufexporig->L[x][y], bufexpfin->L[x][y]); + bufexpfin->a[x][y] = intp(repart, bufexporig->a[x][y], bufexpfin->a[x][y]); + bufexpfin->b[x][y] = intp(repart, bufexporig->b[x][y], bufexpfin->b[x][y]); + } + } + + if(lp.recothrs >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 9, bufexporig.get(), bufexpfin.get(), originalmaskSH.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 9, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } else if (lp.invsh && (lp.highlihs > 0.f || lp.shadowhs > 0.f || tonequ || tonecurv || lp.showmaskSHmetinv == 1 || lp.enaSHMaskinv) && call < 3 && lp.hsena) { + std::unique_ptr bufmaskblurcol; + std::unique_ptr originalmaskSH; + const std::unique_ptr bufcolorig(new LabImage(TW, TH)); + + if (lp.enaSHMaskinv || lp.showmaskSHmetinv == 1) { + bufmaskblurcol.reset(new LabImage(TW, TH, true)); + originalmaskSH.reset(new LabImage(TW, TH)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + bufcolorig->L[y][x] = original->L[y][x]; + } + } + + int inv = 1; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskSHmetinv == 1) { + showmaske = true; + } + + if (lp.enaSHMaskinv) { + enaMask = true; + } + + if (lp.showmaskSHmetinv == 0) { + zero = true; + } + + float chrom = lp.chromaSH; + float rad = lp.radmaSH; + float gamma = lp.gammaSH; + float slope = lp.slomaSH; + float blendm = lp.blendmaSH; + float lap = params->locallab.spots.at(sp).lapmaskSH; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = params->locallab.spots.at(sp).shortc; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + int shado = 0; + float amountcd = params->locallab.spots.at(sp).fatamountSH; + float anchorcd = params->locallab.spots.at(sp).fatanchorSH; + int lumask = params->locallab.spots.at(sp).lumask; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskSH.get(), original, reserved, inv, lp, + 0.f, false, + locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskSHlocalcurve, localmaskSHutili, dummy, false, 1, 1, 5, 5, + shortcu, false, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + + if (lp.showmaskSHmetinv == 1) { + showmask(lumask, lp, 0, 0, cx, cy, TW, TH, bufcolorig.get(), transformed, bufmaskblurcol.get(), inv); + + return; + } + + float adjustr = 2.f; + InverseColorLight_Local(tonequ, tonecurv, sp, 2, lp, originalmaskSH.get(), lightCurveloc, hltonecurveloc, shtonecurveloc, tonecurveloc, exlocalcurve, cclocalcurve, adjustr, localcutili, lllocalcurve, locallutili, original, transformed, cx, cy, hueref, chromaref, lumaref, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + +// soft light and retinex_pde + if ((lp.strng > 1.f || lp.prevdE) && call <= 3 && lp.sfena) { + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + //variable for fast FFTW + int bfhr = bfh; + int bfwr = bfw; + + if (bfw >= mSP && bfh >= mSP) { + + if (lp.softmet == 1) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufexporig->L[y - ystart][x - xstart] = original->L[y][x]; + bufexporig->a[y - ystart][x - xstart] = original->a[y][x]; + bufexporig->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + + bufexpfin->CopyFrom(bufexporig.get(), multiThread); + SoftLightParams softLightParams; + softLightParams.enabled = true; + softLightParams.strength = lp.strng; + + if (lp.softmet == 0) { + ImProcFunctions::softLight(bufexpfin.get(), softLightParams); + } else if (lp.softmet == 1) { + const std::unique_ptr datain(new float[bfwr * bfhr]); + const std::unique_ptr dataout(new float[bfwr * bfhr]); + const std::unique_ptr dE(new float[bfwr * bfhr]); + + deltaEforLaplace(dE.get(), lp.lap, bfwr, bfhr, bufexpfin.get(), hueref, chromaref, lumaref); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + datain[y * bfwr + x] = bufexpfin->L[y][x]; + } + } + + const int showorig = lp.showmasksoftmet >= 5 ? 0 : lp.showmasksoftmet; + MyMutex::MyLock lock(*fftwMutex); + ImProcFunctions::retinex_pde(datain.get(), dataout.get(), bfwr, bfhr, 8.f * lp.strng, 1.f, dE.get(), showorig, 1, 1); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + bufexpfin->L[y][x] = dataout[y * bfwr + x]; + } + } + } + + transit_shapedetect2(sp, 0.f, 0.f, call, 3, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + + //local contrast + bool wavcurve = false; + bool wavcurvelev = false; + bool wavcurvecon = false; + bool wavcurvecomp = false; + bool wavcurvecompre = false; + + if (lp.locmet == 1) { + if (locwavCurve && locwavutili) { + for (int i = 0; i < 500; i++) { + if (locwavCurve[i] != 0.5f) { + wavcurve = true; + break; + } + } + } + if (loclevwavCurve && loclevwavutili) { + for (int i = 0; i < 500; i++) { + if (loclevwavCurve[i] != 0.f) { + wavcurvelev = true; + break; + } + } + } + if (locconwavCurve && locconwavutili) { + for (int i = 0; i < 500; i++) { + if (locconwavCurve[i] != 0.5f) { + wavcurvecon = true; + break; + } + } + } + if (loccompwavCurve && loccompwavutili) { + for (int i = 0; i < 500; i++) { + if (loccompwavCurve[i] != 0.f) { + wavcurvecomp = true; + break; + } + } + } + if (loccomprewavCurve && loccomprewavutili) { + for (int i = 0; i < 500; i++) { + if (loccomprewavCurve[i] != 0.75f) { + wavcurvecompre = true; + break; + } + } + } + } + + if ((lp.lcamount > 0.f || wavcurve || lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4 || lp.prevdE || lp.strwav != 0.f || wavcurvelev || wavcurvecon || wavcurvecomp || wavcurvecompre || lp.edgwena || params->locallab.spots.at(sp).residblur > 0.0 || params->locallab.spots.at(sp).levelblur > 0.0 || params->locallab.spots.at(sp).residcont != 0.0 || params->locallab.spots.at(sp).clarilres != 0.0 || params->locallab.spots.at(sp).claricres != 0.0) && call <= 3 && lp.lcena) { + + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + int bfhr = bfh; + int bfwr = bfw; + + if (bfw >= mSPwav && bfh >= mSPwav) {//avoid too small spot for wavelet + if (lp.ftwlc) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + std::unique_ptr bufmaskblurlc; + std::unique_ptr originalmasklc; + std::unique_ptr bufmaskoriglc; + + if (lp.showmasklcmet == 2 || lp.enalcMask || lp.showmasklcmet == 3 || lp.showmasklcmet == 4) { + bufmaskblurlc.reset(new LabImage(bfw, bfh)); + originalmasklc.reset(new LabImage(bfw, bfh)); + bufmaskoriglc.reset(new LabImage(bfw, bfh)); + } + + array2D buflight(bfw, bfh); + JaggedArray bufchro(bfw, bfh); + const std::unique_ptr bufgb(new LabImage(bfw, bfh)); + std::unique_ptr tmp1(new LabImage(bfw, bfh)); + const std::unique_ptr tmpresid(new LabImage(bfw, bfh)); + const std::unique_ptr tmpres(new LabImage(bfw, bfh)); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend; y++) { + for (int x = xstart; x < xend; x++) { + bufgb->L[y - ystart][x - xstart] = original->L[y][x]; + bufgb->a[y - ystart][x - xstart] = original->a[y][x]; + bufgb->b[y - ystart][x - xstart] = original->b[y][x]; + tmp1->L[y - ystart][x - xstart] = original->L[y][x]; + tmp1->a[y - ystart][x - xstart] = original->a[y][x]; + tmp1->b[y - ystart][x - xstart] = original->b[y][x]; + tmpresid->L[y - ystart][x - xstart] = original->L[y][x]; + tmpresid->a[y - ystart][x - xstart] = original->a[y][x]; + tmpresid->b[y - ystart][x - xstart] = original->b[y][x]; + tmpres->L[y - ystart][x - xstart] = original->L[y][x]; + tmpres->a[y - ystart][x - xstart] = original->a[y][x]; + tmpres->b[y - ystart][x - xstart] = original->b[y][x]; + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufgb->L[y][x] = original->L[y + ystart][x + xstart]; + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmasklcmet == 3) { + showmaske = true; + } + + if (lp.enalcMask) { + enaMask = true; + } + + if (lp.showmasklcmet == 4) { + deltaE = true; + } + + if (lp.showmasklcmet == 2) { + modmask = true; + } + + if (lp.showmasklcmet == 1) { + modif = true; + } + + if (lp.showmasklcmet == 0) { + zero = true; + } + + + float chrom = lp.chromalc; + float rad = lp.radmalc; + float blendm = lp.blendmalc; + float gamma = 1.f; + float slope = 0.f; + float lap = 0.f; //params->locallab.spots.at(sp).lapmaskexp; + bool pde = false; //params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int shado = 0; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; + int lumask = params->locallab.spots.at(sp).lumask; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufgb.get(), bufmaskoriglc.get(), originalmasklc.get(), original, reserved, inv, lp, + 0.f, false, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklclocalcurve, localmasklcutili, dummy, false, 1, 1, 5, 5, + shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmasklcmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufgb.get(), transformed, bufmaskoriglc.get(), 0); + + return; + } + + if (lp.showmasklcmet == 0 || lp.showmasklcmet == 1 || lp.showmasklcmet == 2 || lp.showmasklcmet == 4 || lp.enalcMask) { + + if (lp.locmet == 0) { + LocalContrastParams localContrastParams; + LocallabParams locallabparams; + localContrastParams.enabled = true; + localContrastParams.radius = params->locallab.spots.at(sp).lcradius; + localContrastParams.amount = params->locallab.spots.at(sp).lcamount; + localContrastParams.darkness = params->locallab.spots.at(sp).lcdarkness; + localContrastParams.lightness = params->locallab.spots.at(sp).lightness; + bool fftwlc = false; + + if (!lp.ftwlc) { // || (lp.ftwlc && call != 2)) { + ImProcFunctions::localContrast(tmp1.get(), tmp1->L, localContrastParams, fftwlc, sk); + } else { + const std::unique_ptr tmpfftw(new LabImage(bfwr, bfhr)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + tmpfftw->L[y][x] = tmp1->L[y][x]; + tmpfftw->a[y][x] = tmp1->a[y][x]; + tmpfftw->b[y][x] = tmp1->b[y][x]; + } + } + + fftwlc = true; + ImProcFunctions::localContrast(tmpfftw.get(), tmpfftw->L, localContrastParams, fftwlc, sk); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + tmp1->L[y][x] = tmpfftw->L[y][x]; + tmp1->a[y][x] = tmpfftw->a[y][x]; + tmp1->b[y][x] = tmpfftw->b[y][x]; + } + } + + } + } else if (lp.locmet == 1) { //wavelet && sk ==1 + int wavelet_level = 1 + params->locallab.spots.at(sp).csthreshold.getBottomRight();//retrieve with +1 maximum wavelet_level + float mL = params->locallab.spots.at(sp).clarilres / 100.0; + float mC = params->locallab.spots.at(sp).claricres / 100.0; + float softr = params->locallab.spots.at(sp).clarisoft; + float mL0 = 0.f; + float mC0 = 0.f; +#ifdef _OPENMP + const int numThreads = omp_get_max_threads(); +#else + const int numThreads = 1; + +#endif + // adap maximum level wavelet to size of RT-spot + int minwin = rtengine::min(bfw, bfh); + int maxlevelspot = 10;//maximum possible + + // adap maximum level wavelet to size of crop + while ((1 << maxlevelspot) >= (minwin * sk) && maxlevelspot > 1) { + --maxlevelspot ; + } + + // printf("minwin=%i maxlevelavant=%i maxlespot=%i\n", minwin, wavelet_level, maxlevelspot); + + wavelet_level = rtengine::min(wavelet_level, maxlevelspot); + // printf("maxlevel=%i\n", wavelet_level); + bool exec = false; + bool origlc = params->locallab.spots.at(sp).origlc; + + if (origlc) {//merge only with original + clarimerge(lp, mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); + } + + int maxlvl = wavelet_level; + const float contrast = params->locallab.spots.at(sp).residcont; + int level_bl = params->locallab.spots.at(sp).csthreshold.getBottomLeft(); + int level_hl = params->locallab.spots.at(sp).csthreshold.getTopLeft(); + int level_br = params->locallab.spots.at(sp).csthreshold.getBottomRight(); + int level_hr = params->locallab.spots.at(sp).csthreshold.getTopRight(); + const float radblur = (params->locallab.spots.at(sp).residblur) / sk; + const bool blurlc = params->locallab.spots.at(sp).blurlc; + const float radlevblur = (params->locallab.spots.at(sp).levelblur) / sk; + const float sigma = params->locallab.spots.at(sp).sigma; + const float offs = params->locallab.spots.at(sp).offset; + const float sigmadc = params->locallab.spots.at(sp).sigmadc; + const float deltad = params->locallab.spots.at(sp).deltad; + // const float fatres = params->locallab.spots.at(sp).fatres; + const float chrol = params->locallab.spots.at(sp).chromalev; + const float chrobl = params->locallab.spots.at(sp).chromablu; + const bool blurena = params->locallab.spots.at(sp).wavblur; + const bool levelena = params->locallab.spots.at(sp).wavcont; + const bool comprena = params->locallab.spots.at(sp).wavcomp; + const bool compreena = params->locallab.spots.at(sp).wavcompre; + const float compress = params->locallab.spots.at(sp).residcomp; + const float thres = params->locallab.spots.at(sp).threswav; + + float gamma = lp.gamlc; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.gamlc;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + if(gamma != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < tmp1->H; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < tmp1->W - 3; x += 4) { + STVFU(tmp1->L[y][x], F2V(32768.f) * igammalog(LVFU(tmp1->L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < tmp1->W; ++x) { + tmp1->L[y][x] = 32768.f * igammalog(tmp1->L[y][x] / 32768.f, gamma, ts, g_a[2], g_a[4]); + } + } + } + + wavcontrast4(lp, tmp1->L, tmp1->a, tmp1->b, contrast, radblur, radlevblur, tmp1->W, tmp1->H, level_bl, level_hl, level_br, level_hr, sk, numThreads, locwavCurve, locwavutili, wavcurve, loclevwavCurve, loclevwavutili, wavcurvelev, locconwavCurve, locconwavutili, wavcurvecon, loccompwavCurve, loccompwavutili, wavcurvecomp, loccomprewavCurve, loccomprewavutili, wavcurvecompre, locedgwavCurve, locedgwavutili, sigma, offs, maxlvl, sigmadc, deltad, chrol, chrobl, blurlc, blurena, levelena, comprena, compreena, compress, thres); + + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "wav") { + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + if (params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, tmp1.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, tmp1.get(), rad, 5.f, sk); + } + + + + if(gamma != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < tmp1->H; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < tmp1->W - 3; x += 4) { + STVFU(tmp1->L[y][x], F2V(32768.f) * gammalog(LVFU(tmp1->L[y][x]) / F2V(32768.f), F2V(gamma), F2V(ts), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < tmp1->W; ++x) { + tmp1->L[y][x] = 32768.f * gammalog(tmp1->L[y][x] / 32768.f, gamma, ts, g_a[3], g_a[4]); + } + } + } + + const float satur = params->locallab.spots.at(sp).residchro; + + + if (satur != 0.f || radblur > 0.f) {//blur residual a and satur + + wavelet_decomposition *wdspota = new wavelet_decomposition(tmp1->a[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, lp.daubLen); + + if (wdspota->memory_allocation_failed()) { + return; + } + + float *wav_ab0a = wdspota->get_coeff0(); + // int maxlvla = wdspota->maxlevel(); + int W_La = wdspota->level_W(0); + int H_La = wdspota->level_H(0); + + if (radblur > 0.f && !blurlc && blurena) { + array2D bufa(W_La, H_La); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_La; y++) { + for (int x = 0; x < W_La; x++) { + bufa[y][x] = wav_ab0a [y * W_La + x]; + } + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(bufa, bufa, W_La, H_La, radblur); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_La; y++) { + for (int x = 0; x < W_La; x++) { + wav_ab0a[y * W_La + x] = bufa[y][x]; + } + } + + } + + if (satur != 0.f) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < W_La * H_La; i++) { + wav_ab0a[i] *= (1.f + xsinf(rtengine::RT_PI_F * (satur / 200.f)));//more progressive than linear + wav_ab0a[i] = clipC(wav_ab0a[i]); + } + } + + wdspota->reconstruct(tmp1->a[0], 1.f); + delete wdspota; + + wavelet_decomposition *wdspotb = new wavelet_decomposition(tmp1->b[0], tmp1->W, tmp1->H, wavelet_level, 1, sk, numThreads, lp.daubLen); + + if (wdspotb->memory_allocation_failed()) { + return; + } + + float *wav_ab0b = wdspotb->get_coeff0(); + int W_Lb = wdspotb->level_W(0); + int H_Lb = wdspotb->level_H(0); + + if (radblur > 0.f && !blurlc && blurena) { + array2D bufb(W_Lb, H_Lb); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_Lb; y++) { + for (int x = 0; x < W_Lb; x++) { + bufb[y][x] = wav_ab0b [y * W_Lb + x]; + } + } + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(bufb, bufb, W_Lb, H_Lb, radblur); + } + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < H_Lb; y++) { + for (int x = 0; x < W_Lb; x++) { + wav_ab0b[y * W_Lb + x] = bufb[y][x]; + } + } + + } + + if (satur != 0.f) { + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int i = 0; i < W_Lb * H_Lb; i++) { + wav_ab0b[i] *= (1.f + xsinf(rtengine::RT_PI_F * (satur / 200.f))); + wav_ab0b[i] = clipC(wav_ab0b[i]); + } + } + + wdspotb->reconstruct(tmp1->b[0], 1.f); + delete wdspotb; + } + + if (!origlc) {//merge all files + exec = false; + //copy previous calculation in merge possibilities +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + tmpresid->L[y][x] = tmp1->L[y][x]; + tmpresid->a[y][x] = tmp1->a[y][x]; + tmpresid->b[y][x] = tmp1->b[y][x]; + } + } + clarimerge(lp, mL, mC, exec, tmpresid.get(), wavelet_level, sk, numThreads); + } + + float thr = 0.001f; + int flag = 0; + + if (maxlvl <= 4) { + mL0 = 0.f; + mC0 = 0.f; + mL = -1.5f * mL;//increase only for sharpen + mC = -mC; + thr = 1.f; + flag = 0; + + } else { + mL0 = mL; + mC0 = mC; + thr = 1.f; + flag = 1; + } + + if (exec || compreena || comprena || levelena || blurena || lp.wavgradl || locwavCurve || lp.edgwena) { + LabImage *mergfile = tmp1.get(); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int x = 0; x < bfh; x++) + for (int y = 0; y < bfw; y++) { + tmp1->L[x][y] = clipLoc((1.f + mL0) * mergfile->L[x][y] - mL * tmpresid->L[x][y]); + tmp1->a[x][y] = clipC((1.f + mC0) * mergfile->a[x][y] - mC * tmpresid->a[x][y]); + tmp1->b[x][y] = clipC((1.f + mC0) * mergfile->b[x][y] - mC * tmpresid->b[x][y]); + } + + if (softr != 0.f && (compreena || locwavCurve || comprena || blurena || levelena || lp.wavgradl || lp.edgwena || std::fabs(mL) > 0.001f)) { + softproc(tmpres.get(), tmp1.get(), softr, bfh, bfw, 0.001, 0.00001, thr, sk, multiThread, flag); + } + } + } + + if(lp.enalcMask && lp.recothrw != 1.f) { + float recoth = lp.recothrw; + + if(lp.recothrw < 1.f) { + recoth = -1.f * recoth + 2.f; + } + + float hig = lp.higthrw; + float low = lp.lowthrw; + //float recoth = lp.recothrw; + float decay = lp.decayw; + bool invmask = false; + maskrecov(tmp1.get(), original, bufmaskoriglc.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).reparw; + int bw = bufgb->W; + int bh = bufgb->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int x = 0; x < bh; x++) { + for (int y = 0; y < bw; y++) { + tmp1->L[x][y] = intp(repart, bufgb->L[x][y], tmp1->L[x][y]); + tmp1->a[x][y] = intp(repart, bufgb->a[x][y], tmp1->a[x][y]); + tmp1->b[x][y] = intp(repart, bufgb->b[x][y], tmp1->b[x][y]); + } + } + if(lp.recothrw >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 10, bufgb.get(), tmp1.get(), originalmasklc.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 10, bufgb.get(), tmp1.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + tmp1.reset(); + } + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + + if (!lp.invshar && lp.shrad > 0.42 && call < 3 && lp.sharpena && sk == 1) { //interior ellipse for sharpening, call = 1 and 2 only with Dcrop and simpleprocess + int bfh = call == 2 ? int (lp.ly + lp.lyT) + del : original->H; //bfw bfh real size of square zone + int bfw = call == 2 ? int (lp.lx + lp.lxL) + del : original->W; + + if (call == 2) { //call from simpleprocess + + if (bfw < mSPsharp || bfh < mSPsharp) { + printf("too small RT-spot - minimum size 39 * 39\n"); + return; + } + + int begy = lp.yc - lp.lyT; + int begx = lp.xc - lp.lxL; + int yEn = lp.yc + lp.ly; + int xEn = lp.xc + lp.lx; + + if(lp.fullim == 2) {//limit sharpening to image dimension...no more...to avoid a long treatment + begy = 0; + begx = 0; + yEn = original->H; + xEn = original->W; + lp.lxL = lp.xc; + lp.lyT = lp.yc; + lp.ly = yEn - lp.yc; + lp.lx = xEn - lp.xc; + bfh= yEn; + bfw = xEn; + } + //printf("begy=%i begx=%i yen=%i xen=%i\n", begy, begx, yEn, xEn); + JaggedArray bufsh(bfw, bfh, true); + JaggedArray hbuffer(bfw, bfh); + JaggedArray loctemp2(bfw, bfh); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < transformed->H ; y++) { + for (int x = 0; x < transformed->W; x++) { + int lox = cx + x; + int loy = cy + y; + + if (lox >= begx && lox < xEn && loy >= begy && loy < yEn) { + bufsh[loy - begy][lox - begx] = original->L[y][x]; + } + } + } + float gamma1 = params->locallab.spots.at(sp).shargam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufsh[y][x], F2V(32768.f) * igammalog(LVFU(bufsh[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufsh[y][x] = 32768.f * igammalog(bufsh[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + + //sharpen only square area instead of all image, but limited to image dimensions (full image) + ImProcFunctions::deconvsharpeningloc(bufsh, hbuffer, bfw, bfh, loctemp2, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, 1); + /* + float gamma = params->locallab.spots.at(sp).shargam; + double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufsh[y][x], F2V(32768.f) * gammalog(LVFU(bufsh[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(loctemp2[y][x], F2V(32768.f) * gammalog(LVFU(loctemp2[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufsh[y][x] = 32768.f * gammalog(bufsh[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + loctemp2[y][x] = 32768.f * gammalog(loctemp2[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + //sharpen simpleprocess + Sharp_Local(call, loctemp2, 0, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + } else { //call from dcrop.cc + JaggedArray loctemp(bfw, bfh); + + float gamma1 = params->locallab.spots.at(sp).shargam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * igammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + original->L[y][x] = 32768.f * igammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + + ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, bfw, bfh, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, sk); + /* + float gamma = params->locallab.spots.at(sp).shargam; + double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * gammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(loctemp[y][x], F2V(32768.f) * gammalog(LVFU(loctemp[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + original->L[y][x] = 32768.f * gammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + loctemp[y][x] = 32768.f * gammalog(loctemp[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + //sharpen dcrop + Sharp_Local(call, loctemp, 0, hueref, chromaref, lumaref, lp, original, transformed, cx, cy, sk); + } + + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + + } else if (lp.invshar && lp.shrad > 0.42 && call < 3 && lp.sharpena && sk == 1) { + int GW = original->W; + int GH = original->H; + JaggedArray loctemp(GW, GH); + + float gamma1 = params->locallab.spots.at(sp).shargam; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) gamma1;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * igammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < GW; ++x) { + original->L[y][x] = 32768.f * igammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + + ImProcFunctions::deconvsharpeningloc(original->L, shbuffer, GW, GH, loctemp, params->locallab.spots.at(sp).shardamping, (double)params->locallab.spots.at(sp).sharradius, params->locallab.spots.at(sp).shariter, params->locallab.spots.at(sp).sharamount, params->locallab.spots.at(sp).sharcontrast, (double)params->locallab.spots.at(sp).sharblur, sk); + /* + float gamma = params->locallab.spots.at(sp).shargam; + double pwr = 1.0 / (double) gamma;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < GH; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < GW - 3; x += 4) { + STVFU(original->L[y][x], F2V(32768.f) * gammalog(LVFU(original->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + STVFU(loctemp[y][x], F2V(32768.f) * igammalog(LVFU(loctemp[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < GW; ++x) { + original->L[y][x] = 32768.f * gammalog(original->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + loctemp[y][x] = 32768.f * igammalog(loctemp[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + + InverseSharp_Local(loctemp, hueref, lumaref, chromaref, lp, original, transformed, cx, cy, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + + bool enablefat = false; + + if (params->locallab.spots.at(sp).fatamount > 1.0) { + enablefat = true;; + } + + bool execex = (lp.exposena && (lp.expcomp != 0.f || lp.blac != 0 || lp.shadex > 0 || lp.hlcomp > 0.f || lp.laplacexp > 0.1f || lp.strexp != 0.f || enablefat || lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 4 || lp.showmaskexpmet == 5 || lp.prevdE || (exlocalcurve && localexutili))); + + if (!lp.invex && execex) { + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + //variable for fast FFTW + int bfhr = bfh; + int bfwr = bfw; + + + if (bfw >= mSP && bfh >= mSP) { + + if (lp.expmet == 1 || lp.expmet == 0) { + optfft(N_fftwsize, bfh, bfw, bfhr, bfwr, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); + const std::unique_ptr buforig(new LabImage(bfw, bfh)); + + std::unique_ptr bufmaskblurexp; + std::unique_ptr originalmaskexp; + + array2D blend2; + + if (call <= 3) { //simpleprocess, dcrop, improccoordinator + if (lp.showmaskexpmet == 2 || lp.enaExpMask || lp.showmaskexpmet == 3 || lp.showmaskexpmet == 5) { + bufmaskblurexp.reset(new LabImage(bfw, bfh)); + originalmaskexp.reset(new LabImage(bfw, bfh)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + buforig->a[y][x] = original->a[y + ystart][x + xstart]; + } + } + + float gamma1 = lp.gamex; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) lp.gamex;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexporig->L[y][x], F2V(32768.f) * igammalog(LVFU(bufexporig->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bfw; ++x) { + bufexporig->L[y][x] = 32768.f * igammalog(bufexporig->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + const int spotSi = rtengine::max(1 + 2 * rtengine::max(1, lp.cir / sk), 5); + + if (bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struexp > 0.f) { + blend2(bfw, bfh); + ImProcFunctions::blendstruc(bfw, bfh, bufexporig.get(), 3.f / (sk * 1.4f), 0.5f * lp.struexp, blend2, sk, multiThread); + + if (lp.showmaskexpmet == 4) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend ; y++) { + for (int x = xstart; x < xend; x++) { + const int lox = cx + x; + const int loy = cy + y; + int zone; + float localFactor = 1.f; + const float achm = lp.trans / 100.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, achm, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, achm, lp, zone, localFactor); + } + + if (zone > 0) { + transformed->L[y][x] = CLIP(blend2[y - ystart][x - xstart]); + transformed->a[y][x] = 0.f; + transformed->b[y][x] = 0.f; + } + } + } + + return; + } + } + + int inv = 0; + bool showmaske = false; + const bool enaMask = lp.enaExpMask; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskexpmet == 3) { + showmaske = true; + } else if (lp.showmaskexpmet == 5) { + deltaE = true; + } else if (lp.showmaskexpmet == 2) { + modmask = true; + } else if (lp.showmaskexpmet == 1) { + modif = true; + } else if (lp.showmaskexpmet == 0) { + zero = true; + } + + float chrom = lp.chromaexp; + float rad = lp.radmaexp; + float gamma = lp.gammaexp; + float slope = lp.slomaexp; + float blendm = lp.blendmaexp; + float lap = params->locallab.spots.at(sp).lapmaskexp; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + int sco = params->locallab.spots.at(sp).scopemask; + int shado = 0; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + float amountcd = 0.f; + float anchorcd = 50.f; + int lumask = params->locallab.spots.at(sp).lumask; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, reserved, inv, lp, + 0.f, false, + locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, false, 1, 1, 5, 5, + shortcu, params->locallab.spots.at(sp).deltae, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0, fab + ); + + if (lp.showmaskexpmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskblurexp.get(), 0); + + return; + } + + if (lp.showmaskexpmet == 4) { + return; + } + + if (lp.showmaskexpmet == 0 || lp.showmaskexpmet == 1 || lp.showmaskexpmet == 2 || lp.showmaskexpmet == 5 || lp.enaExpMask) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufexpfin->L[y][x] = original->L[y + ystart][x + xstart]; + bufexpfin->a[y][x] = original->a[y + ystart][x + xstart]; + bufexpfin->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + + + if (exlocalcurve && localexutili) {// L=f(L) curve enhanced + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + bufexpfin->L[ir][jr] = 0.6f * bufexporig->L[ir][jr] + 0.2f * exlocalcurve[2.f * bufexporig->L[ir][jr]]; + } + + if (lp.expcomp == 0.f) { + lp.expcomp = 0.001f;// to enabled + } + + ImProcFunctions::exlabLocal(lp, 0.5f, bfh, bfw, bfhr, bfwr, bufexpfin.get(), bufexpfin.get(), hltonecurveloc, shtonecurveloc, tonecurveloc, hueref, lumaref, chromaref); + + + + } else { + if (lp.expcomp == 0.f && (lp.linear > 0.01f && lp.laplacexp > 0.1f)) { + lp.expcomp = 0.001f;// to enabled + } + + if (lp.expcomp != 0.f ) { // || lp.laplacexp > 0.1f + if(lp.laplacexp <= 0.1f) { + lp.laplacexp = 0.2f; //force to use Laplacian with very small values + } + ImProcFunctions::exlabLocal(lp, 1.f, bfh, bfw, bfhr, bfwr, bufexporig.get(), bufexpfin.get(), hltonecurveloc, shtonecurveloc, tonecurveloc, hueref, lumaref, chromaref); + } + } + +//gradient + struct grad_params gp; + + if (lp.strexp != 0.f) { + + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 1); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + bufexpfin->L[ir][jr] *= ImProcFunctions::calcGradientFactor(gp, jr, ir); + } + } + } + +//exposure_pde + if (lp.expmet == 1) { + if (enablefat) { + + const std::unique_ptr datain(new float[bfwr * bfhr]); + const std::unique_ptr dataout(new float[bfwr * bfhr]); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + datain[y * bfwr + x] = bufexpfin->L[y][x]; + } + } + FattalToneMappingParams fatParams; + fatParams.enabled = true; + fatParams.threshold = params->locallab.spots.at(sp).fatdetail; + fatParams.amount = params->locallab.spots.at(sp).fatamount; + fatParams.anchor = params->locallab.spots.at(sp).fatanchor; + //const float sigm = 1.f; //params->locallab.spots.at(sp).fatlevel; + //const float mean = 1.f;// params->locallab.spots.at(sp).fatanchor; + const std::unique_ptr tmpImagefat(new Imagefloat(bfwr, bfhr)); + lab2rgb(*bufexpfin, *tmpImagefat, params->icm.workingProfile); + int alg = 0; + if(fatParams.anchor == 50.f) { + alg = 1; + } + ToneMapFattal02(tmpImagefat.get(), fatParams, 3, 0, nullptr, 0, 0, alg);//last parameter = 1 ==>ART algorithm + rgb2lab(*tmpImagefat, *bufexpfin, params->icm.workingProfile); + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "dr") { + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + if (params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + + float rad = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, bufexpfin.get(), rad, 15.f, sk); + } + + } + + if (lp.laplacexp > 0.1f) { + + MyMutex::MyLock lock(*fftwMutex); + std::unique_ptr datain(new float[bfwr * bfhr]); + std::unique_ptr dataout(new float[bfwr * bfhr]); + const float gam = params->locallab.spots.at(sp).gamm; + const float igam = 1.f / gam; + + if (params->locallab.spots.at(sp).exnoiseMethod == "med" || params->locallab.spots.at(sp).exnoiseMethod == "medhi") { + if (lp.blac < -100.f && lp.linear > 0.01f) { + float evnoise = lp.blac - lp.linear * 2000.f; + if (params->locallab.spots.at(sp).exnoiseMethod == "med") { + evnoise *= 0.4f; + } + + //soft denoise, user must use Local Denoise for best result + Median med; + if (evnoise < -18000.f) { + med = Median::TYPE_5X5_STRONG; + } else if (evnoise < -15000.f) { + med = Median::TYPE_5X5_SOFT; + } else if (evnoise < -10000.f) { + med = Median::TYPE_3X3_STRONG; + } else { + med = Median:: TYPE_3X3_SOFT; + } + + Median_Denoise(bufexpfin->L, bufexpfin->L, bfwr, bfhr, med, 1, multiThread); + Median_Denoise(bufexpfin->a, bufexpfin->a, bfwr, bfhr, Median::TYPE_3X3_SOFT, 1, multiThread); + Median_Denoise(bufexpfin->b, bufexpfin->b, bfwr, bfhr, Median::TYPE_3X3_SOFT, 1, multiThread); + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + float L = LIM01(bufexpfin->L[y][x] / 32768.f);//change gamma for Laplacian + datain[y * bfwr + x] = pow_F(L, gam) * 32768.f; + } + } + + //call PDE equation - with Laplacian threshold + ImProcFunctions::exposure_pde(datain.get(), datain.get(), dataout.get(), bfwr, bfhr, 12.f * lp.laplacexp, lp.balanexp); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfhr; y++) { + for (int x = 0; x < bfwr; x++) { + const float Y = dataout[y * bfwr + x] / 32768.f;//inverse Laplacian gamma + bufexpfin->L[y][x] = pow_F(Y, igam) * 32768.f; + } + } + } + } + if (lp.shadex > 0) { + + if (lp.expcomp == 0.f) { + lp.expcomp = 0.001f; // to enabled + } + } + + if (lp.hlcomp > 0.f) { + + if (lp.expcomp == 0.f) { + lp.expcomp = 0.001f; // to enabled + } + } + + //shadows with ipshadowshighlight + if ((lp.expcomp != 0.f) || (exlocalcurve && localexutili)) { + if (lp.shadex > 0) { + + ImProcFunctions::shadowsHighlights(bufexpfin.get(), true, 1, 0, lp.shadex, 40, sk, 0, lp.shcomp); + } + } + + if (lp.expchroma != 0.f) { + if ((lp.expcomp != 0.f && lp.expcomp != 0.001f) || (exlocalcurve && localexutili) || lp.laplacexp > 0.1f) { + + constexpr float ampli = 70.f; + const float ch = (1.f + 0.02f * lp.expchroma); + const float chprosl = ch <= 1.f ? 99.f * ch - 99.f : clipChro(ampli * ch - ampli); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + const float epsi = bufexporig->L[ir][jr] == 0.f ? 0.001f : 0.f; + const float rapexp = bufexpfin->L[ir][jr] / (bufexporig->L[ir][jr] + epsi); + bufexpfin->a[ir][jr] *= 1.f + chprosl * rapexp; + bufexpfin->b[ir][jr] *= 1.f + chprosl * rapexp; + } + } + } + } + /* + float gamma = lp.gamex; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.gamex;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + */ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufexpfin->L[y][x], F2V(32768.f) * gammalog(LVFU(bufexpfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufexpfin->L[y][x] = 32768.f * gammalog(bufexpfin->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + if (lp.softradiusexp > 0.f && lp.expmet == 0) { + softproc(buforig.get(), bufexpfin.get(), lp.softradiusexp, bfh, bfw, 0.1, 0.001, 0.5f, sk, multiThread, 1); + } + + if(lp.enaExpMask && lp.recothre != 1.f) { + float recoth = lp.recothre; + + if(lp.recothre < 1.f) { + recoth = -1.f * recoth + 2.f; + } + + float hig = lp.higthre; + float low = lp.lowthre; + // float recoth = lp.recothre; + float decay = lp.decaye; + bool invmask = false; + maskrecov(bufexpfin.get(), original, bufmaskblurexp.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + float meansob = 0.f; + + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).reparexp; + int bw = bufexporig->W; + int bh = bufexporig->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int x = 0; x < bh; x++) { + for (int y = 0; y < bw; y++) { + bufexpfin->L[x][y] = intp(repart, bufexporig->L[x][y], bufexpfin->L[x][y]); + bufexpfin->a[x][y] = intp(repart, bufexporig->a[x][y], bufexpfin->a[x][y]); + bufexpfin->b[x][y] = intp(repart, bufexporig->b[x][y], bufexpfin->b[x][y]); + } + } + + if(lp.recothre >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 1, bufexporig.get(), bufexpfin.get(), originalmaskexp.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 1, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } + } + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + } +//inverse + + else if (lp.invex && (lp.expcomp != 0.f || lp.laplacexp > 0.1f || lp.blac != 0 || lp.hlcomp > 0.f || lp.shadex > 0 || params->locallab.spots.at(sp).fatamount > 1.0 || (exlocalcurve && localexutili) || lp.enaExpMaskinv || lp.showmaskexpmetinv == 1) && lp.exposena) { + constexpr float adjustr = 2.f; + std::unique_ptr bufmaskblurexp; + std::unique_ptr originalmaskexp; + const std::unique_ptr bufexporig(new LabImage(TW, TH)); + + if (lp.enaExpMaskinv || lp.showmaskexpmetinv == 1) { + bufmaskblurexp.reset(new LabImage(TW, TH, true)); + originalmaskexp.reset(new LabImage(TW, TH)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + bufexporig->L[y][x] = original->L[y][x]; + } + } + + constexpr int inv = 1; + const bool showmaske = lp.showmaskexpmetinv == 1; + const bool enaMask = lp.enaExpMaskinv; + constexpr bool deltaE = false; + constexpr bool modmask = false; + const bool zero = lp.showmaskexpmetinv == 0; + constexpr bool modif = false; + const float chrom = lp.chromaexp; + const float rad = lp.radmaexp; + const float gamma = lp.gammaexp; + const float slope = lp.slomaexp; + const float blendm = lp.blendmaexp; + const float lap = params->locallab.spots.at(sp).lapmaskexp; + const bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + const int sco = params->locallab.spots.at(sp).scopemask; + constexpr int shado = 0; + constexpr int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + const int lumask = params->locallab.spots.at(sp).lumask; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + constexpr float amountcd = 0.f; + constexpr float anchorcd = 50.f; + LocHHmaskCurve lochhhmasCurve; + const int highl = 0; + maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufexporig.get(), bufmaskblurexp.get(), originalmaskexp.get(), original, reserved, inv, lp, + 0.f, false, + locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskexplocalcurve, localmaskexputili, dummy, false, 1, 1, 5, 5, + shortcu, false, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, 0, fab + ); + + if (lp.showmaskexpmetinv == 1) { + showmask(lumask, lp, 0, 0, cx, cy, TW, TH, bufexporig.get(), transformed, bufmaskblurexp.get(), inv); + return; + } + + if (lp.shadex > 0) { + if (lp.expcomp == 0.f) { + lp.expcomp = 0.001f; // to enabled + } + } + + if (lp.hlcomp > 0.f) { + if (lp.expcomp == 0.f) { + lp.expcomp = 0.001f; // to enabled + } + } + + InverseColorLight_Local(false, false, sp, 1, lp, originalmaskexp.get(), lightCurveloc, hltonecurveloc, shtonecurveloc, tonecurveloc, exlocalcurve, cclocalcurve, adjustr, localcutili, lllocalcurve, locallutili, original, transformed, cx, cy, hueref, chromaref, lumaref, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + +//local color and light + const float factor = LocallabParams::LABGRIDL_CORR_MAX * 3.276; + const float scaling = LocallabParams::LABGRIDL_CORR_SCALE; + const float scaledirect = LocallabParams::LABGRIDL_DIRECT_SCALE; + const float a_scale = (lp.highA - lp.lowA) / factor / scaling; + const float a_base = lp.lowA / scaling; + const float b_scale = (lp.highB - lp.lowB) / factor / scaling; + const float b_base = lp.lowB / scaling; + const bool ctoning = (a_scale != 0.f || b_scale != 0.f || a_base != 0.f || b_base != 0.f); + const float a_scalemerg = (lp.highAmerg - lp.lowAmerg) / factor / scaling; + const float b_scalemerg = (lp.highBmerg - lp.lowBmerg) / factor / scaling; + + if (!lp.inv && (lp.chro != 0 || lp.ligh != 0.f || lp.cont != 0 || ctoning || lp.mergemet > 0 || lp.strcol != 0.f || lp.strcolab != 0.f || lp.qualcurvemet != 0 || lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 3 || lp.showmaskcolmet == 4 || lp.showmaskcolmet == 5 || lp.prevdE) && lp.colorena) { // || lllocalcurve)) { //interior ellipse reinforced lightness and chroma //locallutili + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + const bool spez = params->locallab.spots.at(sp).special; + + if (bfw >= mSP && bfh >= mSP) { + + if (lp.blurcolmask >= 0.25f && lp.fftColorMask && call == 2) { + optfft(N_fftwsize, bfh, bfw, bfh, bfw, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + + std::unique_ptr bufcolorig; + std::unique_ptr bufcolfin; + std::unique_ptr bufmaskblurcol; + std::unique_ptr originalmaskcol; + std::unique_ptr bufcolreserv; + std::unique_ptr buftemp; + array2D blend2; + + float adjustr = 1.0f; + + //adapt chroma to working profile + 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.workingProfile == "Adobe RGB") { + adjustr = 1.8f; + } else if (params->icm.workingProfile == "sRGB") { + adjustr = 2.0f; + } else if (params->icm.workingProfile == "WideGamut") { + adjustr = 1.2f; + } else if (params->icm.workingProfile == "Beta RGB") { + adjustr = 1.4f; + } else if (params->icm.workingProfile == "BestRGB") { + adjustr = 1.4f; + } else if (params->icm.workingProfile == "BruceRGB") { + adjustr = 1.8f; + } + + if (call <= 3) { //simpleprocess, dcrop, improccoordinator + bufcolorig.reset(new LabImage(bfw, bfh)); + bufcolfin.reset(new LabImage(bfw, bfh)); + buftemp.reset(new LabImage(bfw, bfh)); + + if (lp.showmaskcolmet == 2 || lp.enaColorMask || lp.showmaskcolmet == 3 || lp.showmaskcolmet == 5) { + bufmaskblurcol.reset(new LabImage(bfw, bfh, true)); + originalmaskcol.reset(new LabImage(bfw, bfh)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufcolorig->L[y][x] = original->L[y + ystart][x + xstart]; + bufcolorig->a[y][x] = original->a[y + ystart][x + xstart]; + bufcolorig->b[y][x] = original->b[y + ystart][x + xstart]; + bufcolfin->L[y][x] = original->L[y + ystart][x + xstart]; + bufcolfin->a[y][x] = original->a[y + ystart][x + xstart]; + bufcolfin->b[y][x] = original->b[y + ystart][x + xstart]; + buftemp->L[y][x] = original->L[y + ystart][x + xstart]; + buftemp->a[y][x] = original->a[y + ystart][x + xstart]; + buftemp->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + float gamma1 = lp.gamc; + rtengine::GammaValues g_a; //gamma parameters + double pwr1 = 1.0 / (double) lp.gamc;//default 3.0 - gamma Lab + double ts1 = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr1, ts1, g_a); // call to calcGamma with selected gamma and slope + + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bufcolorig->H; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < bufcolorig->W - 3; x += 4) { + STVFU(bufcolorig->L[y][x], F2V(32768.f) * igammalog(LVFU(bufcolorig->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[2]), F2V(g_a[4]))); + } +#endif + for (;x < bufcolorig->W; ++x) { + bufcolorig->L[y][x] = 32768.f * igammalog(bufcolorig->L[y][x] / 32768.f, gamma1, ts1, g_a[2], g_a[4]); + } + } + } + + const int spotSi = rtengine::max(1 + 2 * rtengine::max(1, lp.cir / sk), 5); + const bool blends = bfw > 2 * spotSi && bfh > 2 * spotSi && lp.struco > 0.f; + + if (blends) { + blend2(bfw, bfh); + ImProcFunctions::blendstruc(bfw, bfh, bufcolorig.get(), 3.f / (sk * 1.4f), 0.5f * lp.struco, blend2, sk, multiThread); + + if (lp.showmaskcolmet == 4) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = ystart; y < yend ; y++) { + for (int x = xstart; x < xend; x++) { + const int lox = cx + x; + const int loy = cy + y; + int zone; + float localFactor = 1.f; + const float achm = lp.trans / 100.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, achm, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, achm, lp, zone, localFactor); + } + + if (zone > 0) { + transformed->L[y][x] = CLIP(blend2[y - ystart][x - xstart]); + transformed->a[y][x] = 0.f; + transformed->b[y][x] = 0.f; + } + } + } + return; + } + } + + const int inv = 0; + const bool showmaske = lp.showmaskcolmet == 3; + const bool enaMask = lp.enaColorMask; + const bool deltaE = lp.showmaskcolmet == 5; + const bool modmask = lp.showmaskcolmet == 2; + const bool zero = lp.showmaskcolmet == 0; + const bool modif = lp.showmaskcolmet == 1; + const float chrom = lp.chromacol; + const float rad = lp.radmacol; + const float gamma = lp.gammacol; + const float slope = lp.slomacol; + const float blendm = lp.blendmacol; + const float lap = params->locallab.spots.at(sp).lapmaskcol; + const bool pde = params->locallab.spots.at(sp).laplac; + const int shado = params->locallab.spots.at(sp).shadmaskcol; + const int sco = params->locallab.spots.at(sp).scopemask; + const int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); + const int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); + const int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); + const int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); + const int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; + const int lumask = params->locallab.spots.at(sp).lumask; + const float strumask = 0.02 * params->locallab.spots.at(sp).strumaskcol; + float conthr = 0.01 * params->locallab.spots.at(sp).conthrcol; + const float mercol = params->locallab.spots.at(sp).mercol; + const float merlucol = params->locallab.spots.at(sp).merlucol; + + int tonemod = 0; + if (params->locallab.spots.at(sp).toneMethod == "one") { + tonemod = 0; + } else if (params->locallab.spots.at(sp).toneMethod == "two") { + tonemod = 1; + } else if (params->locallab.spots.at(sp).toneMethod == "thr") { + tonemod = 2; + } else if (params->locallab.spots.at(sp).toneMethod == "fou") { + tonemod = 3; + } + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + const float amountcd = 0.f; + const float anchorcd = 50.f; + const int highl = 0; + bool astool = params->locallab.spots.at(sp).toolcol; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, + strumask, astool, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, llochhhmasCurve, lhhmasutili, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + level_bl, level_hl, level_br, level_hr, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1, fab + ); + + if (lp.showmaskcolmet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); + return; + } else if (lp.showmaskcolmet == 4) { + return; + } + + if (lp.showmaskcolmet == 0 || lp.showmaskcolmet == 1 || lp.showmaskcolmet == 2 || lp.showmaskcolmet == 5 || lp.enaColorMask) { + //RGB Curves + bool usergb = false; + + if (rgblocalcurve && localrgbutili && lp.qualcurvemet != 0) { + usergb = true; + const std::unique_ptr tmpImage(new Imagefloat(bfw, bfh)); + + lab2rgb(*buftemp, *tmpImage, params->icm.workingProfile); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) + for (int x = 0; x < bfw; x++) { + + //std + if (tonemod == 0) { + curves::setLutVal(rgblocalcurve, tmpImage->r(y, x), tmpImage->g(y, x), tmpImage->b(y, x)); + } else { + float r = CLIP(tmpImage->r(y, x)); + float g = CLIP(tmpImage->g(y, x)); + float b = CLIP(tmpImage->b(y, x)); + + if (tonemod == 1) { // weightstd + const float r1 = rgblocalcurve[r]; + const float g1 = triangle(r, r1, g); + const float b1 = triangle(r, r1, b); + + const float g2 = rgblocalcurve[g]; + const float r2 = triangle(g, g2, r); + const float b2 = triangle(g, g2, b); + + const float b3 = rgblocalcurve[b]; + const float r3 = triangle(b, b3, r); + const float g3 = triangle(b, b3, g); + 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); + } else if (tonemod == 2) { // Luminance + float currLuminance = r * 0.2126729f + g * 0.7151521f + b * 0.0721750f; + + const float newLuminance = rgblocalcurve[currLuminance]; + currLuminance = currLuminance == 0.f ? 0.00001f : currLuminance; + const float coef = newLuminance / currLuminance; + r = LIM(r * coef, 0.f, 65535.f); + g = LIM(g * coef, 0.f, 65535.f); + b = LIM(b * coef, 0.f, 65535.f); + } else if (tonemod == 3) { // Film like Adobe + if (r >= g) { + if (g > b) { + rgbtone(r, g, b, rgblocalcurve); // Case 1: r >= g > b + } else if (b > r) { + rgbtone(b, r, g, rgblocalcurve); // Case 2: b > r >= g + } else if (b > g) { + rgbtone(r, b, g, rgblocalcurve); // Case 3: r >= b > g + } else { // Case 4: r == g == b + r = rgblocalcurve[r]; + g = rgblocalcurve[g]; + b = g; + } + } else { + if (r >= b) { + rgbtone(g, r, b, rgblocalcurve); // Case 5: g > r >= b + } else if (b > g) { + rgbtone(b, g, r, rgblocalcurve); // Case 6: b > g > r + } else { + rgbtone(g, b, r, rgblocalcurve); // Case 7: g >= b > r + } + } + } + + setUnlessOOG(tmpImage->r(y, x), tmpImage->g(y, x), tmpImage->b(y, x), r, g, b); + } + } + + rgb2lab(*tmpImage, *buftemp, params->icm.workingProfile); + + // end rgb curves + } + + if (usergb && spez) {//special use of rgb curves ex : negative + const float achm = lp.trans / 100.f; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + const int loy = y + ystart + cy; + + for (int x = 0; x < bfw; x++) { + const int lox = x + xstart + cx; + int zone; + float localFactor = 1.f; + + if (lp.shapmet == 0) { + calcTransition(lox, loy, achm, lp, zone, localFactor); + } else /*if (lp.shapmet == 1)*/ { + calcTransitionrect(lox, loy, achm, lp, zone, localFactor); + } + + if (zone > 0) { + transformed->L[y + ystart][x + xstart] = buftemp->L[y][x] * localFactor + (1.f - localFactor) * original->L[y + ystart][x + xstart]; + transformed->a[y + ystart][x + xstart] = buftemp->a[y][x] * localFactor + (1.f - localFactor) * original->a[y + ystart][x + xstart]; + transformed->b[y + ystart][x + xstart] = buftemp->b[y][x] * localFactor + (1.f - localFactor) * original->b[y + ystart][x + xstart]; + } + } + } + } + + //others curves + + const LabImage *origptr = usergb ? buftemp.get() : bufcolorig.get(); + + bool execcolor = false; + + if (localcutili || HHutili || locallutili || lp.ligh != 0.f || lp.cont != 0 || lp.chro != 0 || LHutili || ctoning) { + execcolor = true; + } + + bool HHcurve = false; + if (lochhCurve && HHutili) { + for (int i = 0; i < 500; i++) { + if (lochhCurve[i] != 0.5f) { + HHcurve = true; + break; + } + } + } + + const float kd = 10.f * 0.01f * lp.strengrid;//correction to ctoning + + //chroma slider with curve instead of linear + const float satreal = lp.chro; + + DiagonalCurve color_satur({ + DCT_NURBS, + 0, 0, + 0.2, 0.2f + satreal / 250.f, + 0.6, rtengine::min(1.f, 0.6f + satreal / 250.f), + 1, 1 + }); + + DiagonalCurve color_saturmoins({ + DCT_NURBS, + 0, 0, + 0.1f - satreal / 150.f, 0.1f, + rtengine::min(1.f, 0.7f - satreal / 300.f), 0.7, + 1, 1 + }); + bool LHcurve = false; + if (loclhCurve && LHutili) { + for (int i = 0; i < 500; i++) { + if (loclhCurve[i] != 0.5f) { + LHcurve = true; + break; + } + } + } + bool CHcurve = false; + if (locchCurve && CHutili) { + for (int i = 0; i < 500; i++) { + if (locchCurve[i] != 0.5f) { + CHcurve = true; + break; + } + } + } + double amountchrom = 0.01 * settings->amchroma; + if(amountchrom < 0.05) { + amountchrom = 0.05; + } + if(amountchrom > 2.) { + amountchrom = 2.; + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + float bufcolcalca = origptr->a[ir][jr]; + float bufcolcalcb = origptr->b[ir][jr]; + float bufcolcalcL = origptr->L[ir][jr]; + + if (lp.chro != 0.f) {//slider chroma with curve DCT_NURBS + float Chprov = std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)); + float2 sincosval; + sincosval.y = Chprov == 0.0f ? 1.f : bufcolcalca / Chprov; + sincosval.x = Chprov == 0.0f ? 0.f : bufcolcalcb / Chprov; + + // 35000 must be globally good, more than 32768...and less than !! to avoid calculation min max + if (lp.chro > 0.f) { + Chprov = static_cast(color_satur.getVal(LIM01(Chprov / 35000.f))) * 35000.f; + } else { + Chprov = static_cast(color_saturmoins.getVal(LIM01(Chprov / 35000.f))) * 35000.f; + } + + if (lp.chro == -100.f) { + Chprov = 0.f; + } + + bufcolcalca = Chprov * sincosval.y; + bufcolcalcb = Chprov * sincosval.x; + } + + if (cclocalcurve && lp.qualcurvemet != 0 && localcutili) { // C=f(C) curve + const float chromat = std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)); + const float ch = cclocalcurve[chromat * adjustr] / ((chromat + 0.00001f) * adjustr); //ch between 0 and 0 50 or more + bufcolcalca *= ch; + bufcolcalcb *= ch; + } + + if (cllocalcurve && lp.qualcurvemet != 0 && localclutili) { // C=f(L) curve + float chromaCfactor = (cllocalcurve[bufcolcalcL * 2.f]) / (bufcolcalcL * 2.f); + bufcolcalca *= chromaCfactor; + bufcolcalcb *= chromaCfactor; + } + + if (lclocalcurve && lp.qualcurvemet != 0 && locallcutili) { // L=f(C) curve + const float chromat = std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)); + float Lc = lclocalcurve[chromat * adjustr] / ((chromat + 0.00001f) * adjustr); + + if (Lc > 1.f) { + Lc = (Lc - 1.0f) * 0.1f + 1.0f; //reduct action + } else { + Lc = (Lc - 1.0f) * 0.3f + 1.0f; + } + + bufcolcalcL *= Lc; + } + + if (lochhCurve && HHcurve && lp.qualcurvemet != 0 && !ctoning) { // H=f(H) + const float chromat = std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)); + const float hhforcurv = xatan2f(bufcolcalcb, bufcolcalca); + const float valparam = 2.f * (lochhCurve[500.f * static_cast(Color::huelab_to_huehsv2(hhforcurv))] - 0.5f) + hhforcurv; + float2 sincosval = xsincosf(valparam); + bufcolcalca = chromat * sincosval.y; + bufcolcalcb = chromat * sincosval.x; + } + + if (lp.ligh != 0.f || lp.cont != 0) {//slider luminance or slider contrast with curve + bufcolcalcL = calclight(bufcolcalcL, lightCurveloc); + } + + if (lllocalcurve && locallutili && lp.qualcurvemet != 0) {// L=f(L) curve + bufcolcalcL = 0.5f * lllocalcurve[bufcolcalcL * 2.f]; + } + + + if (loclhCurve && LHcurve && lp.qualcurvemet != 0) {//L=f(H) curve + const float rhue = xatan2f(bufcolcalcb, bufcolcalca); + //printf("rhu=%f", (double) rhue); + const float chromat = (std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)))/32768.f; + float l_r = LIM01(bufcolcalcL / 32768.f); //Luminance Lab in 0..1 + float valparam = loclhCurve[500.f *static_cast(Color::huelab_to_huehsv2(rhue))] - 0.5f; //get l_r=f(H) + // printf("rh=%f V=%f", (double) rhue, (double) valparam); + // float kc = 0.05f + 0.02f * params->locallab.spots.at(sp).lightjzcie; + float kc = amountchrom; + float valparamneg; + valparamneg = valparam; + float kcc = SQR(chromat / kc); //take Chroma into account...40 "middle low" of chromaticity (arbitrary and simple), one can imagine other algorithme + // printf("KC=%f", (double) kcc); + //reduce action for low chroma and increase action for high chroma + valparam *= 2.f * kcc; + valparamneg *= kcc; //slightly different for negative + + if (valparam > 0.f) { + l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(((SQR(1.f - min(l_r, 1.0f)))))); + } else + //for negative + { + float khue = 1.9f; //in reserve in case of! + l_r *= (1.f + khue * valparamneg); + } + + bufcolcalcL = l_r * 32768.f; + + } + if (locchCurve && CHcurve && lp.qualcurvemet != 0) {//C=f(H) curve + const float rhue = xatan2f(bufcolcalcb, bufcolcalca); + const float valparam = 2.f * locchCurve[500.f * static_cast(Color::huelab_to_huehsv2(rhue))] - 0.5f; //get valp=f(H) + float chromaChfactor = 1.0f + valparam; + bufcolcalca *= chromaChfactor;//apply C=f(H) + bufcolcalcb *= chromaChfactor; + } + + if (ctoning) {//color toning and direct change color + if (lp.gridmet == 0) { + bufcolcalca += kd * (bufcolcalcL * a_scale + a_base); + bufcolcalcb += kd * (bufcolcalcL * b_scale + b_base); + } else if (lp.gridmet == 1) { + bufcolcalca += kd * scaledirect * a_scale; + bufcolcalcb += kd * scaledirect * b_scale; + } + + bufcolcalca = clipC(bufcolcalca); + bufcolcalcb = clipC(bufcolcalcb); + + } + + bufcolfin->L[ir][jr] = bufcolcalcL; + bufcolfin->a[ir][jr] = bufcolcalca; + bufcolfin->b[ir][jr] = bufcolcalcb; + } + } + + if (!execcolor) {//if we don't use color and light sliders, curves except RGB +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + bufcolfin->L[ir][jr] = origptr->L[ir][jr]; + bufcolfin->a[ir][jr] = origptr->a[ir][jr]; + bufcolfin->b[ir][jr] = origptr->b[ir][jr]; + } + } + + bool nottransit = false; + if (lp.mergemet >= 2) { //merge result with original + nottransit = true; + bufcolreserv.reset(new LabImage(bfw, bfh)); + JaggedArray lumreserv(bfw, bfh); + const std::unique_ptr bufreser(new LabImage(bfw, bfh)); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + lumreserv[y][x] = 32768.f - reserved->L[y + ystart][x + xstart]; + bufreser->L[y][x] = reserved->L[y + ystart][x + xstart]; + bufreser->a[y][x] = reserved->a[y + ystart][x + xstart]; + bufreser->b[y][x] = reserved->b[y + ystart][x + xstart]; + + if (lp.mergemet == 2) { + bufcolreserv->L[y][x] = reserved->L[y + ystart][x + xstart]; + bufcolreserv->a[y][x] = reserved->a[y + ystart][x + xstart]; + bufcolreserv->b[y][x] = reserved->b[y + ystart][x + xstart]; + } else if (lp.mergemet == 3) { + bufcolreserv->L[y][x] = lastorig->L[y + ystart][x + xstart]; + bufcolreserv->a[y][x] = lastorig->a[y + ystart][x + xstart]; + bufcolreserv->b[y][x] = lastorig->b[y + ystart][x + xstart]; + } else if (lp.mergemet == 4) { + bufcolreserv->L[y][x] = merlucol * 327.68f; + bufcolreserv->a[y][x] = 9.f * scaledirect * a_scalemerg; + bufcolreserv->b[y][x] = 9.f * scaledirect * b_scalemerg; + } + } + } + + if (lp.strcol != 0.f) { + struct grad_params gp; + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 3); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + const float corrFactor = ImProcFunctions::calcGradientFactor(gp, jr, ir); + bufcolfin->L[ir][jr] *= corrFactor; + } + } + } + + if (lp.strcolab != 0.f) { + struct grad_params gpab; + calclocalGradientParams(lp, gpab, ystart, xstart, bfw, bfh, 4); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + const float corrFactor = ImProcFunctions::calcGradientFactor(gpab, jr, ir); + bufcolfin->a[ir][jr] *= corrFactor; + bufcolfin->b[ir][jr] *= corrFactor; + } + } + } + + if (lp.strcolh != 0.f) { + struct grad_params gph; + calclocalGradientParams(lp, gph, ystart, xstart, bfw, bfh, 6); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + const float corrFactor = ImProcFunctions::calcGradientFactor(gph, jr, ir); + const float aa = bufcolfin->a[ir][jr]; + const float bb = bufcolfin->b[ir][jr]; + const float chrm = std::sqrt(SQR(aa) + SQR(bb)); + const float HH = xatan2f(bb, aa); + + float cor = 0.f; + if (corrFactor < 1.f) { + cor = - 2.5f * (1.f - corrFactor); + } else if (corrFactor > 1.f) { + cor = 0.03f * (corrFactor - 1.f); + } + + float newhr = HH + cor; + if (newhr > rtengine::RT_PI_F) { + newhr -= 2 * rtengine::RT_PI_F; + } else if (newhr < -rtengine::RT_PI_F) { + newhr += 2 * rtengine::RT_PI_F; + } + + const float2 sincosval = xsincosf(newhr); + bufcolfin->a[ir][jr] = clipC(chrm * sincosval.y); + bufcolfin->b[ir][jr] = clipC(chrm * sincosval.x); + } + } + } + + JaggedArray blend(bfw, bfh); + buildBlendMask(lumreserv, blend, bfw, bfh, conthr); + const float rm = 20.f / sk; + + if (rm > 0) { + float **mb = blend; +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(mb, mb, bfw, bfh, rm); + } + } + + const std::unique_ptr> rdEBuffer(new JaggedArray(bfw, bfh)); + float** rdE = *rdEBuffer; + + deltaEforMask(rdE, bfw, bfh, bufreser.get(), hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, mercol, lp.balance, lp.balanceh); + + if (lp.mergecolMethod == 0) { //normal + + if (lp.mergemet == 4) { + bufprov.reset(new LabImage(bfw, bfh)); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + rdE[y][x] *= SQR(rdE[y][x]); + bufprov->L[y][x] = intp(rdE[y][x], bufcolreserv->L[y][x], bufcolfin->L[y][x]); + bufprov->a[y][x] = intp(rdE[y][x], bufcolreserv->a[y][x], bufcolfin->a[y][x]); + bufprov->b[y][x] = intp(rdE[y][x], bufcolreserv->b[y][x], bufcolfin->b[y][x]); + + bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolfin->L[y][x]); + bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolfin->a[y][x]); + bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolfin->b[y][x]); + } + } + } else { + bufprov.reset(new LabImage(bfw, bfh)); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufprov->L[y][x] = intp(rdE[y][x], bufcolfin->L[y][x], bufcolreserv->L[y][x]); + bufprov->a[y][x] = intp(rdE[y][x], bufcolfin->a[y][x], bufcolreserv->a[y][x]); + bufprov->b[y][x] = intp(rdE[y][x], bufcolfin->b[y][x], bufcolreserv->b[y][x]); + + bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolreserv->L[y][x]); + bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolreserv->a[y][x]); + bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolreserv->b[y][x]); + } + } + } + + if (conthr > 0.f && lp.mergemet != 4) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufcolfin->L[y][x] = intp(blend[y][x], bufcolfin->L[y][x], bufreser->L[y][x]); + bufcolfin->a[y][x] = intp(blend[y][x], bufcolfin->a[y][x], bufreser->a[y][x]); + bufcolfin->b[y][x] = intp(blend[y][x], bufcolfin->b[y][x], bufreser->b[y][x]); + } + } + } + } + + if (lp.mergecolMethod > 16) { //hue sat chroma luma + bufprov.reset(new LabImage(bfw, bfh)); + + if (lp.mergemet == 4) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + rdE[y][x] *= SQR(rdE[y][x]); + bufprov->L[y][x] = intp(rdE[y][x], bufcolreserv->L[y][x], bufcolfin->L[y][x]); + bufprov->a[y][x] = intp(rdE[y][x], bufcolreserv->a[y][x], bufcolfin->a[y][x]); + bufprov->b[y][x] = intp(rdE[y][x], bufcolreserv->b[y][x], bufcolfin->b[y][x]); + } + } + } else { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufprov->L[y][x] = intp(rdE[y][x], bufcolfin->L[y][x], bufcolreserv->L[y][x]); + bufprov->a[y][x] = intp(rdE[y][x], bufcolfin->a[y][x], bufcolreserv->a[y][x]); + bufprov->b[y][x] = intp(rdE[y][x], bufcolfin->b[y][x], bufcolreserv->b[y][x]); + } + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + if (lp.mergecolMethod == 17) { + const float huefin = xatan2f(bufprov->b[y][x], bufprov->a[y][x]); + const float2 sincosval1 = xsincosf(huefin); + const float chrores = std::sqrt(SQR(bufcolreserv->a[y][x]) + SQR(bufcolreserv->b[y][x])); + buftemp->a[y][x] = chrores * sincosval1.y; + buftemp->b[y][x] = chrores * sincosval1.x; + buftemp->L[y][x] = bufcolreserv->L[y][x]; + } else if (lp.mergecolMethod == 18) { + const float hueres = xatan2f(bufcolreserv->b[y][x], bufcolreserv->a[y][x]); + const float2 sincosval2 = xsincosf(hueres); + const float chrofin = std::sqrt(SQR(bufprov->a[y][x]) + SQR(bufprov->b[y][x])); + buftemp->a[y][x] = chrofin * sincosval2.y; + buftemp->b[y][x] = chrofin * sincosval2.x; + buftemp->L[y][x] = bufcolreserv->L[y][x]; + } else if (lp.mergecolMethod == 19) { + const float huefin = xatan2f(bufprov->b[y][x], bufprov->a[y][x]); + const float2 sincosval3 = xsincosf(huefin); + const float chrofin = std::sqrt(SQR(bufprov->a[y][x]) + SQR(bufprov->b[y][x])); + buftemp->a[y][x] = chrofin * sincosval3.y; + buftemp->b[y][x] = chrofin * sincosval3.x; + buftemp->L[y][x] = bufcolreserv->L[y][x]; + } else if (lp.mergecolMethod == 20) { + const float hueres = xatan2f(bufcolreserv->b[y][x], bufcolreserv->a[y][x]); + const float2 sincosval4 = xsincosf(hueres); + const float chrores = std::sqrt(SQR(bufcolreserv->a[y][x]) + SQR(bufcolreserv->b[y][x])); + buftemp->a[y][x] = chrores * sincosval4.y; + buftemp->b[y][x] = chrores * sincosval4.x; + buftemp->L[y][x] = bufprov->L[y][x]; + } + + if (lp.mergemet == 4) { + bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolfin->L[y][x]); + bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolfin->a[y][x]); + bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolfin->b[y][x]); + } else { + bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolreserv->L[y][x]); + bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolreserv->a[y][x]); + bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolreserv->b[y][x]); + } + } + } + + if (conthr > 0.f && lp.mergemet != 4) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufcolfin->L[y][x] = intp(blend[y][x], bufcolfin->L[y][x], bufcolreserv->L[y][x]); + bufcolfin->a[y][x] = intp(blend[y][x], bufcolfin->a[y][x], bufcolreserv->a[y][x]); + bufcolfin->b[y][x] = intp(blend[y][x], bufcolfin->b[y][x], bufcolreserv->b[y][x]); + } + } + } + } + + + if (lp.mergecolMethod > 0 && lp.mergecolMethod <= 16) { + //first deltaE +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufcolfin->L[y][x] = intp(rdE[y][x], bufcolfin->L[y][x], bufcolreserv->L[y][x]); + bufcolfin->a[y][x] = intp(rdE[y][x], bufcolfin->a[y][x], bufcolreserv->a[y][x]); + bufcolfin->b[y][x] = intp(rdE[y][x], bufcolfin->b[y][x], bufcolreserv->b[y][x]); + } + } + + //prepare RGB values in 0 1(or more)for current image and reserved + std::unique_ptr tmpImageorig(new Imagefloat(bfw, bfh)); + lab2rgb(*bufcolfin, *tmpImageorig, params->icm.workingProfile); + tmpImageorig->normalizeFloatTo1(); + + std::unique_ptr tmpImagereserv(new Imagefloat(bfw, bfh)); + lab2rgb(*bufcolreserv, *tmpImagereserv, params->icm.workingProfile); + tmpImagereserv->normalizeFloatTo1(); + + float minR = tmpImagereserv->r(0, 0); + float maxR = minR; + float minG = tmpImagereserv->g(0, 0); + float maxG = minG; + float minB = tmpImagereserv->b(0, 0); + float maxB = minB; + if (lp.mergecolMethod == 6 || lp.mergecolMethod == 9 || lp.mergecolMethod == 10 || lp.mergecolMethod == 11) { +#ifdef _OPENMP + #pragma omp parallel for reduction(max:maxR,maxG,maxB) reduction(min:minR,minG,minB) schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) { + for (int jr = 0; jr < bfw; jr++) { + minR = rtengine::min(minR, tmpImagereserv->r(ir, jr)); + maxR = rtengine::max(maxR, tmpImagereserv->r(ir, jr)); + minG = rtengine::min(minG, tmpImagereserv->g(ir, jr)); + maxG = rtengine::max(maxG, tmpImagereserv->g(ir, jr)); + minB = rtengine::min(minB, tmpImagereserv->b(ir, jr)); + maxB = rtengine::max(maxB, tmpImagereserv->b(ir, jr)); + } + } + } + + //various combinations subtract, multiply, difference, etc + if (lp.mergecolMethod == 1) { //subtract +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) {//LIM(x 0 2) 2 arbitrary value but limit... + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, tmpImageorig->r(y, x) - tmpImagereserv->r(y, x), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, tmpImageorig->g(y, x) - tmpImagereserv->g(y, x), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, tmpImageorig->b(y, x) - tmpImagereserv->b(y, x), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 2) { //difference +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, std::fabs(tmpImageorig->r(y, x) - tmpImagereserv->r(y, x)), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, std::fabs(tmpImageorig->g(y, x) - tmpImagereserv->g(y, x)), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, std::fabs(tmpImageorig->b(y, x) - tmpImagereserv->b(y, x)), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 3) { //multiply +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, tmpImageorig->r(y, x) * tmpImagereserv->r(y, x), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, tmpImageorig->g(y, x) * tmpImagereserv->g(y, x), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, tmpImageorig->b(y, x) * tmpImagereserv->b(y, x), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 4) { //addition +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, tmpImageorig->r(y, x) + tmpImagereserv->r(y, x), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, tmpImageorig->g(y, x) + tmpImagereserv->g(y, x), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, tmpImageorig->b(y, x) + tmpImagereserv->b(y, x), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 5) { //divide +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, tmpImageorig->r(y, x) / (tmpImagereserv->r(y, x) + 0.00001f), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, tmpImageorig->g(y, x) / (tmpImagereserv->g(y, x) + 0.00001f), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, tmpImageorig->b(y, x) / (tmpImagereserv->b(y, x) + 0.00001f), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 6) { //soft light as Photoshop +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, softlig(tmpImageorig->r(y, x), tmpImagereserv->r(y, x), minR, maxR), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, softlig(tmpImageorig->g(y, x), tmpImagereserv->g(y, x), minG, maxG), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, softlig(tmpImageorig->b(y, x), tmpImagereserv->b(y, x), minB, maxB), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 7) { //soft light as illusions.hu +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, softlig2(LIM01(tmpImageorig->r(y, x)), LIM01(tmpImageorig->r(y, x))), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, softlig2(LIM01(tmpImageorig->g(y, x)), LIM01(tmpImageorig->g(y, x))), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, softlig2(LIM01(tmpImageorig->b(y, x)), LIM01(tmpImageorig->b(y, x))), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 8) { //soft light as W3C +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, softlig3(LIM01(tmpImageorig->r(y, x)), tmpImagereserv->r(y, x)), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, softlig3(LIM01(tmpImageorig->g(y, x)), tmpImagereserv->g(y, x)), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, softlig3(LIM01(tmpImageorig->b(y, x)), tmpImagereserv->b(y, x)), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 9) { //hard light overlay (float &b, float &a) +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, overlay(tmpImagereserv->r(y, x), tmpImageorig->r(y, x), minR, maxR), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, overlay(tmpImagereserv->g(y, x), tmpImageorig->g(y, x), minG, maxG), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, overlay(tmpImagereserv->b(y, x), tmpImageorig->b(y, x), minB, maxB), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 10) { //overlay overlay(float &a, float &b) +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, overlay(tmpImageorig->r(y, x), tmpImagereserv->r(y, x), minR, maxR), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, overlay(tmpImageorig->g(y, x), tmpImagereserv->g(y, x), minG, maxG), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, overlay(tmpImageorig->b(y, x), tmpImagereserv->b(y, x), minB, maxB), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 11) { //screen screen (float &a, float &b) +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, screen(tmpImageorig->r(y, x), tmpImagereserv->r(y, x), 1.f), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, screen(tmpImageorig->g(y, x), tmpImagereserv->g(y, x), 1.f), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, screen(tmpImageorig->b(y, x), tmpImagereserv->b(y, x), 1.f), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 12) { //darken only +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, rtengine::min(tmpImageorig->r(y, x), tmpImagereserv->r(y, x)), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, rtengine::min(tmpImageorig->g(y, x), tmpImagereserv->g(y, x)), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, rtengine::min(tmpImageorig->b(y, x), tmpImagereserv->b(y, x)), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 13) { //lighten only +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, rtengine::max(tmpImageorig->r(y, x), tmpImagereserv->r(y, x)), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, rtengine::max(tmpImageorig->g(y, x), tmpImagereserv->g(y, x)), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, rtengine::max(tmpImageorig->b(y, x), tmpImagereserv->b(y, x)), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 14) { //exclusion exclusion (float &a, float &b) +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, exclusion(tmpImageorig->r(y, x), tmpImagereserv->r(y, x)), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, exclusion(tmpImageorig->g(y, x), tmpImagereserv->g(y, x)), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, exclusion(tmpImageorig->b(y, x), tmpImagereserv->b(y, x)), tmpImageorig->b(y, x)); + } + } + + } else if (lp.mergecolMethod == 15) { //Color burn +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, colburn(LIM01(tmpImageorig->r(y, x)), LIM01(tmpImagereserv->r(y, x))), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, colburn(LIM01(tmpImageorig->g(y, x)), LIM01(tmpImagereserv->g(y, x))), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, colburn(LIM01(tmpImageorig->b(y, x)), LIM01(tmpImagereserv->b(y, x))), tmpImageorig->b(y, x)); + } + } + } else if (lp.mergecolMethod == 16) { //Color dodge +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + tmpImageorig->r(y, x) = intp(lp.opacol, coldodge(LIM01(tmpImageorig->r(y, x)), LIM01(tmpImagereserv->r(y, x))), tmpImageorig->r(y, x)); + tmpImageorig->g(y, x) = intp(lp.opacol, coldodge(LIM01(tmpImageorig->g(y, x)), LIM01(tmpImagereserv->g(y, x))), tmpImageorig->g(y, x)); + tmpImageorig->b(y, x) = intp(lp.opacol, coldodge(LIM01(tmpImageorig->b(y, x)), LIM01(tmpImagereserv->b(y, x))), tmpImageorig->b(y, x)); + } + } + } + + tmpImageorig->normalizeFloatTo65535(); + rgb2lab(*tmpImageorig, *bufcolfin, params->icm.workingProfile); + + if (conthr > 0.f && lp.mergemet != 4) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufcolfin->L[y][x] = intp(blend[y][x], bufcolfin->L[y][x], bufcolreserv->L[y][x]); + bufcolfin->a[y][x] = intp(blend[y][x], bufcolfin->a[y][x], bufcolreserv->a[y][x]); + bufcolfin->b[y][x] = intp(blend[y][x], bufcolfin->b[y][x], bufcolreserv->b[y][x]); + } + } + } + } + + if (lp.softradiuscol > 0.f) { + softproc(bufcolreserv.get(), bufcolfin.get(), lp.softradiuscol, bfh, bfw, 0.001, 0.00001, 0.5f, sk, multiThread, 1); + } + float meansob = 0.f; + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).reparcol; + int bw = bufcolreserv->W; + int bh = bufcolreserv->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int x = 0; x < bh; x++) { + for (int y = 0; y < bw; y++) { + bufcolfin->L[x][y] = intp(repart, bufcolreserv->L[x][y], bufcolfin->L[x][y]); + bufcolfin->a[x][y] = intp(repart, bufcolreserv->a[x][y], bufcolfin->a[x][y]); + bufcolfin->b[x][y] = intp(repart, bufcolreserv->b[x][y], bufcolfin->b[x][y]); + } + } + + transit_shapedetect2(sp, 0.f, 0.f, call, 0, bufcolreserv.get(), bufcolfin.get(), originalmaskcol.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } + + if (!nottransit) { +//gradient + if (lp.strcol != 0.f) { + struct grad_params gp; + calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 3); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + const float corrFactor = ImProcFunctions::calcGradientFactor(gp, jr, ir); + bufcolfin->L[ir][jr] *= corrFactor; + } + } + + if (lp.strcolab != 0.f) { + struct grad_params gpab; + calclocalGradientParams(lp, gpab, ystart, xstart, bfw, bfh, 5); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + const float corrFactor = ImProcFunctions::calcGradientFactor(gpab, jr, ir); + bufcolfin->a[ir][jr] *= corrFactor; + bufcolfin->b[ir][jr] *= corrFactor; + } + } + + if (lp.strcolh != 0.f) { + struct grad_params gph; + calclocalGradientParams(lp, gph, ystart, xstart, bfw, bfh, 6); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int ir = 0; ir < bfh; ir++) + for (int jr = 0; jr < bfw; jr++) { + const float corrFactor = ImProcFunctions::calcGradientFactor(gph, jr, ir); + const float aa = bufcolfin->a[ir][jr]; + const float bb = bufcolfin->b[ir][jr]; + const float chrm = std::sqrt(SQR(aa) + SQR(bb)); + const float HH = xatan2f(bb, aa); + + float cor = 0.f; + + if (corrFactor < 1.f) { + cor = - 2.5f * (1.f - corrFactor); + } else if (corrFactor > 1.f) { + cor = 0.03f * (corrFactor - 1.f); + } + + float newhr = HH + cor; + + if (newhr > rtengine::RT_PI_F) { + newhr -= 2 * rtengine::RT_PI_F; + } else if (newhr < -rtengine::RT_PI_F) { + newhr += 2 * rtengine::RT_PI_F; + } + + const float2 sincosval = xsincosf(newhr); + bufcolfin->a[ir][jr] = clipC(chrm * sincosval.y); + bufcolfin->b[ir][jr] = clipC(chrm * sincosval.x); + } + } + + + +/* + float gamma = lp.gamc; + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / (double) lp.gamc;//default 3.0 - gamma Lab + double ts = 9.03296;//always the same 'slope' in the extreme shadows - slope Lab + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope +*/ + if(gamma1 != 1.f) { +#ifdef _OPENMP +# pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; ++y) {//apply inverse gamma 3.f and put result in range 32768.f + int x = 0; +#ifdef __SSE2__ + for (; x < bfw - 3; x += 4) { + STVFU(bufcolfin->L[y][x], F2V(32768.f) * gammalog(LVFU(bufcolfin->L[y][x]) / F2V(32768.f), F2V(gamma1), F2V(ts1), F2V(g_a[3]), F2V(g_a[4]))); + } +#endif + for (; x < bfw; ++x) { + bufcolfin->L[y][x] = 32768.f * gammalog(bufcolfin->L[y][x] / 32768.f, gamma1, ts1, g_a[3], g_a[4]); + } + } + } + + + if (lp.softradiuscol > 0.f) { + softproc(bufcolorig.get(), bufcolfin.get(), lp.softradiuscol, bfh, bfw, 0.001, 0.00001, 0.5f, sk, multiThread, 1); + } + //mask recovery + + if(lp.enaColorMask && lp.recothrc != 1.f) { + float recoth = lp.recothrc; + + if(lp.recothrc < 1.f) { + recoth = -1.f * recoth + 2.f; + } + + float hig = lp.higthrc; + float low = lp.lowthrc; + // float recoth = lp.recothrc; + float decay = lp.decayc; + bool invmask = false; + maskrecov(bufcolfin.get(), original, bufmaskblurcol.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).reparcol; + int bw = bufcolorig->W; + int bh = bufcolorig->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int x = 0; x < bh; x++) { + for (int y = 0; y < bw; y++) { + bufcolfin->L[x][y] = intp(repart, bufcolorig->L[x][y], bufcolfin->L[x][y]); + bufcolfin->a[x][y] = intp(repart, bufcolorig->a[x][y], bufcolfin->a[x][y]); + bufcolfin->b[x][y] = intp(repart, bufcolorig->b[x][y], bufcolfin->b[x][y]); + } + } + + float meansob = 0.f; + if(lp.recothrc >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 0, bufcolorig.get(), bufcolfin.get(), originalmaskcol.get(), hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 0, bufcolorig.get(), bufcolfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, meansob, blend2, lp, original, transformed, cx, cy, sk); + } + } + + } + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + + } + } + } + +//inverse + else if (lp.inv && (lp.chro != 0 || lp.ligh != 0 || exlocalcurve || lp.showmaskcolmetinv == 0 || lp.enaColorMaskinv) && lp.colorena) { + float adjustr = 1.0f; + +//adapt chroma to working profile + 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.workingProfile == "Adobe RGB") { + adjustr = 1.8f; + } else if (params->icm.workingProfile == "sRGB") { + adjustr = 2.0f; + } else if (params->icm.workingProfile == "WideGamut") { + adjustr = 1.2f; + } else if (params->icm.workingProfile == "Beta RGB") { + adjustr = 1.4f; + } else if (params->icm.workingProfile == "BestRGB") { + adjustr = 1.4f; + } else if (params->icm.workingProfile == "BruceRGB") { + adjustr = 1.8f; + } + + std::unique_ptr bufmaskblurcol; + std::unique_ptr originalmaskcol; + const std::unique_ptr bufcolorig(new LabImage(TW, TH)); + + if (lp.enaColorMaskinv || lp.showmaskcolmetinv == 1) { + bufmaskblurcol.reset(new LabImage(TW, TH, true)); + originalmaskcol.reset(new LabImage(TW, TH)); + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < TH ; y++) { + for (int x = 0; x < TW; x++) { + bufcolorig->L[y][x] = original->L[y][x]; + } + } + + constexpr int inv = 1; + const bool showmaske = lp.showmaskcolmetinv == 1; + const bool enaMask = lp.enaColorMaskinv; + constexpr bool deltaE = false; + constexpr bool modmask = false; + const bool zero = lp.showmaskcolmetinv == 0; + constexpr bool modif = false; + + const float chrom = lp.chromacol; + const float rad = lp.radmacol; + const float gamma = lp.gammacol; + const float slope = lp.slomacol; + const float blendm = lp.blendmacol; + const float lap = params->locallab.spots.at(sp).lapmaskcol; + const bool pde = params->locallab.spots.at(sp).laplac; + int shado = params->locallab.spots.at(sp).shadmaskcol; + int level_bl = params->locallab.spots.at(sp).csthresholdcol.getBottomLeft(); + int level_hl = params->locallab.spots.at(sp).csthresholdcol.getTopLeft(); + int level_br = params->locallab.spots.at(sp).csthresholdcol.getBottomRight(); + int level_hr = params->locallab.spots.at(sp).csthresholdcol.getTopRight(); + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; + int lumask = params->locallab.spots.at(sp).lumask; + float strumask = 0.02 * params->locallab.spots.at(sp).strumaskcol; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + constexpr float amountcd = 0.f; + constexpr float anchorcd = 50.f; + const int highl = 0; + maskcalccol(false, pde, TW, TH, 0, 0, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, + strumask, params->locallab.spots.at(sp).toolcol, + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, llochhhmasCurve, lhhmasutili, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmasklocalcurve, localmaskutili, loclmasCurvecolwav, lmasutilicolwav, + level_bl, level_hl, level_br, level_hr, + shortcu, false, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftColorMask, lp.blurcolmask, lp.contcolmask, -1, fab + ); + + if (lp.showmaskcolmetinv == 1) { + showmask(lumask, lp, 0, 0, cx, cy, TW, TH, bufcolorig.get(), transformed, bufmaskblurcol.get(), inv); + return; + } + + if (lp.showmaskcolmetinv == 0 || lp.enaColorMaskinv) { + InverseColorLight_Local(false, false, sp, 0, lp, originalmaskcol.get(), lightCurveloc, hltonecurveloc, shtonecurveloc, tonecurveloc, exlocalcurve, cclocalcurve, adjustr, localcutili, lllocalcurve, locallutili, original, transformed, cx, cy, hueref, chromaref, lumaref, sk); + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + } + +//begin common mask + if(lp.maskena) { + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + if (bfw >= mSP && bfh >= mSP) { + + if (lp.blurma >= 0.25f && lp.fftma && call == 2) { + optfft(N_fftwsize, bfh, bfw, bfh, bfw, lp, original->H, original->W, xstart, ystart, xend, yend, cx, cy, lp.fullim); + } + array2D blechro(bfw, bfh); + array2D ble(bfw, bfh); + array2D hue(bfw, bfh); + array2D guid(bfw, bfh); + + std::unique_ptr bufcolorigsav; + std::unique_ptr bufcolorig; + std::unique_ptr bufcolfin; + std::unique_ptr bufmaskblurcol; + std::unique_ptr originalmaskcol; + std::unique_ptr bufcolreserv; + + int wo = original->W; + int ho = original->H; + LabImage *origsav = nullptr; + origsav = new LabImage(wo, ho); + origsav->CopyFrom(original); + + if (call <= 3) { + bufcolorig.reset(new LabImage(bfw, bfh)); + bufcolfin.reset(new LabImage(bfw, bfh)); + bufcolorigsav.reset(new LabImage(bfw, bfh)); + + if (lp.showmask_met == 1 || lp.ena_Mask || lp.showmask_met == 2 || lp.showmask_met == 3) { + bufmaskblurcol.reset(new LabImage(bfw, bfh, true)); + originalmaskcol.reset(new LabImage(bfw, bfh)); + } +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufcolorig->L[y][x] = original->L[y + ystart][x + xstart]; + bufcolorig->a[y][x] = original->a[y + ystart][x + xstart]; + bufcolorig->b[y][x] = original->b[y + ystart][x + xstart]; + + bufcolorigsav->L[y][x] = original->L[y + ystart][x + xstart]; + bufcolorigsav->a[y][x] = original->a[y + ystart][x + xstart]; + bufcolorigsav->b[y][x] = original->b[y + ystart][x + xstart]; + + bufcolfin->L[y][x] = original->L[y + ystart][x + xstart]; + bufcolfin->a[y][x] = original->a[y + ystart][x + xstart]; + bufcolfin->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + const int inv = 0; + const bool showmaske = lp.showmask_met == 2; + const bool enaMask = lp.ena_Mask; + const bool deltaE = lp.showmask_met == 3; + const bool modmask = lp.showmask_met == 1; + const bool zero = lp.showmask_met == 0; + const bool modif = lp.showmask_met == 1; + const float chrom = params->locallab.spots.at(sp).chromask; + const float rad = params->locallab.spots.at(sp).radmask; + const float gamma = params->locallab.spots.at(sp).gammask; + const float slope = params->locallab.spots.at(sp).slopmask; + float blendm = params->locallab.spots.at(sp).blendmask; + float blendmab = params->locallab.spots.at(sp).blendmaskab; + if (lp.showmask_met == 2) { + blendm = 0.f;//normalize behavior mask with others no action of blend + blendmab = 0.f; + } + const float lap = params->locallab.spots.at(sp).lapmask; + const bool pde = params->locallab.spots.at(sp).laplac; + const int shado = params->locallab.spots.at(sp).shadmask; + const int sco = params->locallab.spots.at(sp).scopemask; + const int level_bl = params->locallab.spots.at(sp).csthresholdmask.getBottomLeft(); + const int level_hl = params->locallab.spots.at(sp).csthresholdmask.getTopLeft(); + const int level_br = params->locallab.spots.at(sp).csthresholdmask.getBottomRight(); + const int level_hr = params->locallab.spots.at(sp).csthresholdmask.getTopRight(); + const int shortcu = lp.mergemet; //params->locallab.spots.at(sp).shortc; + const int lumask = params->locallab.spots.at(sp).lumask; + const float strumask = 0.02 * params->locallab.spots.at(sp).strumaskmask; + const float softr = params->locallab.spots.at(sp).softradiusmask; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + const float amountcd = 0.f; + const float anchorcd = 50.f; + const int highl = 0; + bool astool = params->locallab.spots.at(sp).toolmask; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufcolorig.get(), bufmaskblurcol.get(), originalmaskcol.get(), original, reserved, inv, lp, + strumask, astool, + locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, lochhhmas_Curve, lhhmas_utili, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendmab, shado, highl, amountcd, anchorcd, lmasklocal_curve, localmask_utili, loclmasCurve_wav, lmasutili_wav, + level_bl, level_hl, level_br, level_hr, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, lp.fftma, lp.blurma, lp.contma, 12, fab + ); + + + if (lp.showmask_met == 2) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufcolorig.get(), transformed, bufmaskblurcol.get(), 0); + return; + } +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh ; y++) { + for (int x = 0; x < bfw; x++) { + bufcolfin->L[y][x] = bufcolorig->L[y][x]; + bufcolfin->a[y][x] = bufcolorig->a[y][x]; + bufcolfin->b[y][x] = bufcolorig->b[y][x]; + hue[y][x] = xatan2f(bufcolfin->b[y][x], bufcolfin->a[y][x]); + const float chromah = std::sqrt(SQR(bufcolfin->b[y][x]) + SQR(bufcolfin->a[y][x])); + ble[y][x] = bufcolfin->L[y][x] / 32768.f; + blechro[y][x] = chromah / 32768.f; + guid[y][x] = bufcolorigsav->L[y][x] / 32768.f; + } + } + if (softr != 0.f) {//soft for L a b because we change color... + const float tmpblur = softr < 0.f ? -1.f / softr : 1.f + softr; + const int r1 = rtengine::max(4 / sk * tmpblur + 0.5f, 1); + const int r2 = rtengine::max(25 / sk * tmpblur + 0.5f, 1); + + constexpr float epsilmax = 0.005f; + constexpr float epsilmin = 0.00001f; + + constexpr float aepsil = (epsilmax - epsilmin) / 100.f; + constexpr float bepsil = epsilmin; + const float epsil = softr < 0.f ? 0.001f : aepsil * softr + bepsil; + + rtengine::guidedFilter(guid, blechro, blechro, r1, epsil, multiThread); + rtengine::guidedFilter(guid, ble, ble, r2, 0.2f * epsil, multiThread); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + float2 sincosval = xsincosf(hue[y][x]); + bufcolfin->L[y][x] = 32768.f * ble[y][x]; + bufcolfin->a[y][x] = 32768.f * blechro[y][x] * sincosval.y; + bufcolfin->b[y][x] = 32768.f * blechro[y][x] * sincosval.x; + } + } + } + + + + float meansob = 0.f; + transit_shapedetect2(sp, 0.f, 0.f, call, 20, bufcolorigsav.get(), bufcolfin.get(), originalmaskcol.get(), hueref, chromaref, lumaref, sobelref, meansob, nullptr, lp, origsav, transformed, cx, cy, sk); + delete origsav; + origsav = NULL; + + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + + } + } + } +//end common mask + + if(params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecie == "com" && lp.activspot) {//ciecam + int ystart = rtengine::max(static_cast(lp.yc - lp.lyT) - cy, 0); + int yend = rtengine::min(static_cast(lp.yc + lp.ly) - cy, original->H); + int xstart = rtengine::max(static_cast(lp.xc - lp.lxL) - cx, 0); + int xend = rtengine::min(static_cast(lp.xc + lp.lx) - cx, original->W); + int bfh = yend - ystart; + int bfw = xend - xstart; + + if (bfh >= mSP && bfw >= mSP) { + const std::unique_ptr bufexporig(new LabImage(bfw, bfh)); //buffer for data in zone limit + const std::unique_ptr bufexpfin(new LabImage(bfw, bfh)); //buffer for data in zone limit + std::unique_ptr bufmaskorigcie; + std::unique_ptr bufmaskblurcie; + std::unique_ptr originalmaskcie; + + if (lp.showmaskciemet == 2 || lp.enacieMask || lp.showmaskciemet == 3 || lp.showmaskciemet == 4) { + bufmaskorigcie.reset(new LabImage(bfw, bfh)); + bufmaskblurcie.reset(new LabImage(bfw, bfh)); + originalmaskcie.reset(new LabImage(bfw, bfh)); + } + + + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + + for (int y = 0; y < bfh; y++) { + for (int x = 0; x < bfw; x++) { + bufexporig->L[y][x] = original->L[y + ystart][x + xstart]; + bufexporig->a[y][x] = original->a[y + ystart][x + xstart]; + bufexporig->b[y][x] = original->b[y + ystart][x + xstart]; + } + } + + bool HHcurvejz = false, CHcurvejz = false, LHcurvejz = false; + if (params->locallab.spots.at(sp).expcie && params->locallab.spots.at(sp).modecam == "jz") {//some cam16 elementsfor Jz + ImProcFunctions::ciecamloc_02float(lp, sp, bufexporig.get(), bfw, bfh, 10, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + if (lochhCurvejz && HHutilijz) { + for (int i = 0; i < 500; i++) { + if (lochhCurvejz[i] != 0.5f) { + HHcurvejz = true; + break; + } + } + } + + if (locchCurvejz && CHutilijz) { + for (int i = 0; i < 500; i++) { + if (locchCurvejz[i] != 0.5f) { + CHcurvejz = true; + break; + } + } + } + + if (loclhCurvejz && LHutilijz) { + for (int i = 0; i < 500; i++) { + if (loclhCurvejz[i] != 0.5f) { + LHcurvejz = true; + break; + } + } + } + + int inv = 0; + bool showmaske = false; + bool enaMask = false; + bool deltaE = false; + bool modmask = false; + bool zero = false; + bool modif = false; + + if (lp.showmaskciemet == 3) { + showmaske = true; + } + + if (lp.enacieMask) { + enaMask = true; + } + + if (lp.showmaskciemet == 4) { + deltaE = true; + } + + if (lp.showmaskciemet == 2) { + modmask = true; + } + + if (lp.showmaskciemet == 1) { + modif = true; + } + + if (lp.showmaskciemet == 0) { + zero = true; + } + + float chrom = lp.chromacie; + float rad = lp.radmacie; + float gamma = params->locallab.spots.at(sp).gammaskcie; + float slope = params->locallab.spots.at(sp).slomaskcie; + float blendm = lp.blendmacie; + float lap = params->locallab.spots.at(sp).lapmaskcie; + bool pde = params->locallab.spots.at(sp).laplac; + LocwavCurve dummy; + bool delt = params->locallab.spots.at(sp).deltae; + int sco = params->locallab.spots.at(sp).scopemask; + int shortcu = 0;//lp.mergemet; //params->locallab.spots.at(sp).shortc; + int shado = 0; + const int highl = 0; + + const float mindE = 2.f + MINSCOPE * sco * lp.thr; + const float maxdE = 5.f + MAXSCOPE * sco * (1 + 0.1f * lp.thr); + const float mindElim = 2.f + MINSCOPE * limscope * lp.thr; + const float maxdElim = 5.f + MAXSCOPE * limscope * (1 + 0.1f * lp.thr); + int lumask = params->locallab.spots.at(sp).lumask; + float amountcd = 0.f; + float anchorcd = 50.f; + LocHHmaskCurve lochhhmasCurve; + maskcalccol(false, pde, bfw, bfh, xstart, ystart, sk, cx, cy, bufexporig.get(), bufmaskorigcie.get(), originalmaskcie.get(), original, reserved, inv, lp, + 0.f, false, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, lochhhmasCurve, false, multiThread, + enaMask, showmaske, deltaE, modmask, zero, modif, chrom, rad, lap, gamma, slope, blendm, blendm, shado, highl, amountcd, anchorcd, lmaskcielocalcurve, localmaskcieutili, dummy, false, 1, 1, 5, 5, + shortcu, delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, lp.iterat, limscope, sco, false, 0.f, 0.f, -1, fab + ); + + if (lp.showmaskciemet == 3) { + showmask(lumask, lp, xstart, ystart, cx, cy, bfw, bfh, bufexporig.get(), transformed, bufmaskorigcie.get(), 0); + + return; + } + + + + if (lp.showmaskciemet == 0 || lp.showmaskciemet == 1 || lp.showmaskciemet == 2 || lp.showmaskciemet == 4 || lp.enacieMask) { + + bufexpfin->CopyFrom(bufexporig.get(), multiThread); + if (params->locallab.spots.at(sp).expcie) { + ImProcFunctions::ciecamloc_02float(lp, sp, bufexpfin.get(), bfw, bfh, 0, sk, cielocalcurve, localcieutili, cielocalcurve2, localcieutili2, jzlocalcurve, localjzutili, czlocalcurve, localczutili, czjzlocalcurve, localczjzutili, locchCurvejz, lochhCurvejz, loclhCurvejz, HHcurvejz, CHcurvejz, LHcurvejz, locwavCurvejz, locwavutilijz); + } + } + + if(lp.enacieMask && lp.recothrcie != 1.f) { + float recoth = lp.recothrcie; + + if(lp.recothrcie < 1.f) { + recoth = -1.f * recoth + 2.f; + } + float hig = lp.higthrcie; + float low = lp.lowthrcie; + //float recoth = lp.recothrcie; + float decay = lp.decaycie; + bool invmask = false; + maskrecov(bufexpfin.get(), original, bufmaskorigcie.get(), bfh, bfw, ystart, xstart, hig, low, recoth, decay, invmask, sk, multiThread); + } + + + float radcie = params->locallab.spots.at(sp).detailcie; + loccont(bfw, bfh, bufexpfin.get(), radcie, 15.f, sk); + + const float repart = 1.0 - 0.01 * params->locallab.spots.at(sp).reparcie; + int bw = bufexporig->W; + int bh = bufexporig->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int x = 0; x < bh; x++) { + for (int y = 0; y < bw; y++) { + bufexpfin->L[x][y] = intp(repart, bufexporig->L[x][y], bufexpfin->L[x][y]); + bufexpfin->a[x][y] = intp(repart, bufexporig->a[x][y], bufexpfin->a[x][y]); + bufexpfin->b[x][y] = intp(repart, bufexporig->b[x][y], bufexpfin->b[x][y]); + } + } + + if(lp.recothrcie >= 1.f) { + transit_shapedetect2(sp, 0.f, 0.f, call, 31, bufexporig.get(), bufexpfin.get(), originalmaskcie.get(), hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } else { + transit_shapedetect2(sp, 0.f, 0.f, call, 31, bufexporig.get(), bufexpfin.get(), nullptr, hueref, chromaref, lumaref, sobelref, 0.f, nullptr, lp, original, transformed, cx, cy, sk); + } + if (lp.recur) { + original->CopyFrom(transformed, multiThread); + float avge; + calc_ref(sp, original, transformed, 0, 0, original->W, original->H, sk, huerefblur, chromarefblur, lumarefblur, hueref, chromaref, lumaref, sobelref, avge, locwavCurveden, locwavdenutili); + } + } + + } + + +// Gamut and Munsell control - very important do not deactivated to avoid crash + avoidcolshi(lp, sp, transformed, reserved, cy, cx, sk); +} + +} diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index b9e234b63..b6bdc5ede 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -379,6 +379,26 @@ float ImProcFunctions::resizeScale (const ProcParams* params, int fw, int fh, in dScale = (dScale > 1.0 && !params->resize.allowUpscaling) ? 1.0 : dScale; break; + + case (4): + + // Long Edge + if (refw > refh) { + dScale = (double)params->resize.longedge / (double)refw; + } else { + dScale = (double)params->resize.longedge / (double)refh; + } + break; + + case (5): + + // Short Edge + if (refw > refh) { + dScale = (double)params->resize.shortedge / (double)refh; + } else { + dScale = (double)params->resize.shortedge / (double)refw; + } + break; default: // Scale diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 84f33482f..491e17cb9 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -45,21 +45,69 @@ #include "curves.h" #include "gauss.h" #include "improcfun.h" -#include "jaggedarray.h" +#include "labimage.h" #include "median.h" #include "opthelper.h" #include "procparams.h" #include "rawimagesource.h" #include "rtengine.h" #include "shmap.h" +#define BENCHMARK #include "StopWatch.h" +#include "guidedfilter.h" +#include "boxblur.h" + +#define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) +#define CLIPLOC(x) LIM(x,0.f,32767.f) +#define CLIPC(a) LIM(a, -42000.f, 42000.f) // limit a and b to 130 probably enough ? namespace { -void retinex_scales( float* scales, int nscales, int mode, int s, float high) + +void calcGammaLut(double gamma, double ts, LUTf &gammaLut) { - if ( nscales == 1 ) { - scales[0] = (float)s / 2.f; + double pwr = 1.0 / gamma; + double gamm = gamma; + const double gamm2 = gamma; + rtengine::GammaValues g_a; + + if (gamm2 < 1.0) { + std::swap(pwr, gamm); + } + + rtengine::Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope + + const double start = gamm2 < 1. ? g_a[2] : g_a[3]; + const double add = g_a[4]; + const double mul = 1.0 + g_a[4]; + + if (gamm2 < 1.) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 1024) +#endif + for (int i = 0; i < 65536; i++) { + const double x = rtengine::Color::igammareti(i / 65535.0, gamm, start, ts, mul, add); + gammaLut[i] = 0.5 * rtengine::CLIP(x * 65535.0); // CLIP avoid in some case extra values + } + } else { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 1024) +#endif + for (int i = 0; i < 65536; i++) { + const double x = rtengine::Color::gammareti(i / 65535.0, gamm, start, ts, mul, add); + gammaLut[i] = 0.5 * rtengine::CLIP(x * 65535.0); // CLIP avoid in some case extra values + } + } +} + +void retinex_scales(float* scales, int nscales, int mode, int s, float high) +{ + if (s < 3) { + s = 3; //to avoid crash in MSRlocal if nei small + } + + if (nscales == 1) { + scales[0] = (float)s / 2.f; } else if (nscales == 2) { scales[1] = (float) s / 2.f; scales[0] = (float) s; @@ -67,32 +115,32 @@ void retinex_scales( float* scales, int nscales, int mode, int s, float high) float size_step = (float) s / (float) nscales; if (mode == 0) { - for (int i = 0; i < nscales; ++i ) { + for (int i = 0; i < nscales; ++i) { scales[nscales - i - 1] = 2.0f + (float)i * size_step; } } else if (mode == 1) { size_step = (float)log(s - 2.0f) / (float) nscales; - for (int i = 0; i < nscales; ++i ) { - scales[nscales - i - 1] = 2.0f + (float)pow (10.f, (i * size_step) / log (10.f)); + for (int i = 0; i < nscales; ++i) { + scales[nscales - i - 1] = 2.0f + (float)pow(10.f, (i * size_step) / log(10.f)); } } else if (mode == 2) { size_step = (float) log(s - 2.0f) / (float) nscales; - for ( int i = 0; i < nscales; ++i ) { - scales[i] = s - (float)pow (10.f, (i * size_step) / log (10.f)); + for (int i = 0; i < nscales; ++i) { + scales[i] = s - (float)pow(10.f, (i * size_step) / log(10.f)); } } else if (mode == 3) { size_step = (float) log(s - 2.0f) / (float) nscales; - for ( int i = 0; i < nscales; ++i ) { - scales[i] = high * s - (float)pow (10.f, (i * size_step) / log (10.f)); + for (int i = 0; i < nscales; ++i) { + scales[i] = high * s - (float)pow(10.f, (i * size_step) / log(10.f)); } } } } -void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, float &maxtr, float &mintr) +void mean_stddv2(float **dst, float &mean, float &stddv, int W_L, int H_L, float &maxtr, float &mintr) { // summation using double precision to avoid too large summation error for large pictures double vsquared = 0.f; @@ -108,10 +156,10 @@ void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, floa #pragma omp for reduction(+:sum,vsquared) nowait // this leads to differences, but parallel summation is more accurate #endif - for (int i = 0; i < H_L; i++ ) + for (int i = 0; i < H_L; i++) for (int j = 0; j < W_L; j++) { - sum += dst[i][j]; - vsquared += (dst[i][j] * dst[i][j]); + sum += static_cast(dst[i][j]); + vsquared += rtengine::SQR(dst[i][j]); lmax = dst[i][j] > lmax ? dst[i][j] : lmax; lmin = dst[i][j] < lmin ? dst[i][j] : lmin; @@ -126,10 +174,10 @@ void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, floa } } - mean = sum / (double) (W_L * H_L); + mean = sum / (double)(W_L * H_L); vsquared /= (double) W_L * H_L; - stddv = ( vsquared - (mean * mean) ); - stddv = (float)sqrt(stddv); + stddv = vsquared - rtengine::SQR(mean); + stddv = std::sqrt(stddv); } } @@ -140,7 +188,8 @@ namespace rtengine void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const procparams::RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) { -BENCHFUN + BENCHFUN + if (!deh.enabled) { return; } @@ -184,7 +233,7 @@ BENCHFUN bool higplus = false ; int moderetinex = 2; // default to 2 ( deh.retinexMethod == "high" ) - if(deh.retinexMethod == "highliplus") { + if (deh.retinexMethod == "highliplus") { higplus = true; moderetinex = 3; } else if (deh.retinexMethod == "uni") { @@ -249,6 +298,7 @@ BENCHFUN //adjust sc in function of choice of scale by user if iterations if (scal < 3) { sc -= 1; + if (sc < 1.f) {//avoid 0 sc = 1.f; } @@ -324,11 +374,11 @@ BENCHFUN int mapmet = 0; - if(deh.mapMethod == "map") { + if (deh.mapMethod == "map") { mapmet = 2; - } else if(deh.mapMethod == "mapT") { + } else if (deh.mapMethod == "mapT") { mapmet = 3; - } else if(deh.mapMethod == "gaus") { + } else if (deh.mapMethod == "gaus") { mapmet = 4; } @@ -336,18 +386,18 @@ BENCHFUN int viewmet = 0; - if(deh.viewMethod == "mask") { + if (deh.viewMethod == "mask") { viewmet = 1; - } else if(deh.viewMethod == "tran") { + } else if (deh.viewMethod == "tran") { viewmet = 2; - } else if(deh.viewMethod == "tran2") { + } else if (deh.viewMethod == "tran2") { viewmet = 3; - } else if(deh.viewMethod == "unsharp") { + } else if (deh.viewMethod == "unsharp") { viewmet = 4; } std::unique_ptr> srcBuffer(new JaggedArray(W_L, H_L)); - float** src = *(srcBuffer.get()); + float** src = *srcBuffer; #ifdef _OPENMP #pragma omp parallel for @@ -365,16 +415,18 @@ BENCHFUN const float logBetaGain = xlogf(16384.f); float pond = logBetaGain / (float) scal; - if(!useHslLin) { + if (!useHslLin) { pond /= log(elogt); } std::unique_ptr shmap; + if (((mapmet == 2 || mapmet == 3 || mapmet == 4) && it == 1)) { shmap.reset(new SHMap(W_L, H_L)); } std::unique_ptr buffer; + if (mapmet > 0) { buffer.reset(new float[W_L * H_L]); } @@ -384,7 +436,7 @@ BENCHFUN gaussianBlur(src, out, W_L, H_L, RetinexScales[scale], true); } else { // reuse result of last iteration // out was modified in last iteration => restore it - if((((mapmet == 2 && scale > 1) || mapmet == 3 || mapmet == 4) || (mapmet > 0 && mapcontlutili)) && it == 1) { + if ((((mapmet == 2 && scale > 1) || mapmet == 3 || mapmet == 4) || (mapmet > 0 && mapcontlutili)) && it == 1) { #ifdef _OPENMP #pragma omp parallel for #endif @@ -411,8 +463,10 @@ BENCHFUN } } } + int h_th = 0; int s_th = 0; + if (((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) && it == 1) { shmap->updateL(out, shradius, true, 1); h_th = shmap->max_f - deh.htonalwidth * (shmap->max_f - shmap->avg) / 100; @@ -468,7 +522,8 @@ BENCHFUN const vfloat pondv = F2V(pond); const vfloat limMinv = F2V(ilimdx); const vfloat limMaxv = F2V(limdx); - if( useHslLin) { + + if (useHslLin) { for (; j < W_L - 3; j += 4) { STVFU(luminance[i][j], LVFU(luminance[i][j]) + pondv * vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv)); } @@ -480,7 +535,7 @@ BENCHFUN #endif - if(useHslLin) { + if (useHslLin) { for (; j < W_L; j++) { luminance[i][j] += pond * LIM(src[i][j] / out[i][j], ilimdx, limdx); } @@ -522,9 +577,10 @@ BENCHFUN #pragma omp parallel for schedule(dynamic,16) #endif - for (int i = 0; i < H_L; i++ ) { + for (int i = 0; i < H_L; i++) { for (int j = 0; j < W_L; j++) { //for mintr to maxtr evalate absciss in function of original transmission float absciss; + if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { absciss = asig * luminance[i][j] + bsig; } else if (luminance[i][j] >= mean) { @@ -536,7 +592,7 @@ BENCHFUN //TODO : move multiplication by 4.f and subtraction of 1.f inside the curve luminance[i][j] *= (-1.f + 4.f * dehatransmissionCurve[absciss]); //new transmission - if(viewmet == 3 || viewmet == 2) { + if (viewmet == 3 || viewmet == 2) { tran[i][j] = luminance[i][j]; } } @@ -561,7 +617,7 @@ BENCHFUN #pragma omp parallel for #endif - for (int i = borderL; i < H_L - borderL; i++ ) { + for (int i = borderL; i < H_L - borderL; i++) { for (int j = borderL; j < W_L - borderL; j++) { luminance[i][j] = tmL[i][j]; } @@ -590,7 +646,7 @@ BENCHFUN float delta = maxi - mini; //printf("maxi=%f mini=%f mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", maxi, mini, mean, stddv, delta, maxtr, mintr); - if ( !delta ) { + if (!delta) { delta = 1.0f; } @@ -642,7 +698,7 @@ BENCHFUN #pragma omp parallel for reduction(max:maxCD) reduction(min:minCD) schedule(dynamic, 16) #endif - for ( int i = 0; i < H_L; i ++ ) { + for (int i = 0; i < H_L; i ++) { for (int j = 0; j < W_L; j++) { float gan; @@ -677,10 +733,10 @@ BENCHFUN const float HH = exLuminance[i][j]; float valparam; - if(useHsl || useHslLin) { - valparam = shcurve->getVal(HH) - 0.5f; + if (useHsl || useHslLin) { + valparam = shcurve->getVal(HH) - 0.5; } else { - valparam = shcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f; + valparam = shcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5; } str *= (1.f + 2.f * valparam); @@ -698,7 +754,7 @@ BENCHFUN } else if (viewmet == 4) { luminance[i][j] = originalLuminance[i][j] + str * (originalLuminance[i][j] - out[i][j]);//unsharp } else if (viewmet == 2) { - if(tran[i][j] <= mean) { + if (tran[i][j] <= mean) { luminance[i][j] = azb + aza * tran[i][j]; //auto values } else { luminance[i][j] = bzb + bza * tran[i][j]; @@ -722,4 +778,880 @@ BENCHFUN } } + +void ImProcFunctions::maskforretinex(int sp, int before, float ** luminance, float ** out, int W_L, int H_L, int skip, + const LocCCmaskCurve & locccmasretiCurve, bool lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool lhmasretiutili, + int llretiMask, bool retiMasktmap, bool retiMask, float rad, float lap, bool pde, float gamm, float slop, float chro, float blend, + const LUTf & lmaskretilocalcurve, bool localmaskretiutili, + LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, LabImage * bufmaskorigreti, bool multiThread, + bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask) +{ + array2D loctemp(W_L, H_L); + array2D ble(W_L, H_L); + array2D blechro(W_L, H_L); + array2D hue(W_L, H_L); + array2D guid(W_L, H_L); + std::unique_ptr bufmaskblurreti; + bufmaskblurreti.reset(new LabImage(W_L, H_L)); +// std::unique_ptr bufmaskorigreti; +// bufmaskorigreti.reset(new LabImage(W_L, H_L)); + std::unique_ptr bufprov; + bufprov.reset(new LabImage(W_L, H_L)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + if (before == 1 && retiMasktmap) { + loctemp[y][x] = LIM(luminance[y][x], 0.f, 32768.f); + } else if (before == 0 && retiMasktmap) { + loctemp[y][x] = out[y][x]; + } else { + loctemp[y][x] = bufreti->L[y][x]; + } + } + } + + float chromult = 1.f - 0.01f * chro; +//fab + float fab = 50.f; + float meanfab = 0.f; + const int nbfab = W_L * H_L; + + double sumab = 0.0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:sumab) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + sumab += fabs(bufreti->a[y][x]); + sumab += fabs(bufreti->b[y][x]); + } + } + + meanfab = sumab / (2.f * nbfab); + double som = 0.0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:som) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + som += SQR(fabs(bufreti->a[y][x]) - meanfab) + SQR(fabs(bufreti->b[y][x]) - meanfab); + } + } + const float multsigma = (chro >= 0.f ? 0.035f : 0.018f) * chro + 1.f; + const float stddv = sqrt(som / nbfab); + fab = meanfab + multsigma * stddv; + + if (fab <= 0.f) { + fab = 50.f; + } +//end fab + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < H_L; ir++) { + for (int jr = 0; jr < W_L; jr++) { + float kmaskLexp = 0; + float kmaskCH = 0; + + if (locllmasretiCurve && llmasretiutili) { + float ligh = loctemp[ir][jr] / 32768.f; + kmaskLexp = 32768.f * LIM01(1.f - locllmasretiCurve[500.f * ligh]); + + } + + + if (locllmasretiCurve && llmasretiutili && retiMasktmap) { + } + + if (llretiMask != 4) { + if (locccmasretiCurve && lcmasretiutili) { + float chromask = 0.0001f + sqrt(SQR((bufreti->a[ir][jr]) / fab) + SQR((bufreti->b[ir][jr]) / fab)); + kmaskCH = LIM01(1.f - locccmasretiCurve[500.f * chromask]); + } + } + + if (lochhmasretiCurve && lhmasretiutili) { + float huema = xatan2f(bufreti->b[ir][jr], bufreti->a[ir][jr]); + float h = Color::huelab_to_huehsv2(huema); + h += 1.f / 6.f; + + if (h > 1.f) { + h -= 1.f; + } + + float valHH = LIM01(1.f - lochhmasretiCurve[500.f * h]); + + if (llretiMask != 4) { + kmaskCH += chromult * valHH; + } + + kmaskLexp += 32768.f * valHH; + } + + bufmaskblurreti->L[ir][jr] = kmaskLexp; + bufmaskblurreti->a[ir][jr] = kmaskCH; + bufmaskblurreti->b[ir][jr] = kmaskCH; + ble[ir][jr] = bufmaskblurreti->L[ir][jr] / 32768.f; + hue[ir][jr] = xatan2f(bufmaskblurreti->b[ir][jr], bufmaskblurreti->a[ir][jr]); + float chromah = sqrt(SQR(bufmaskblurreti->b[ir][jr]) + SQR(bufmaskblurreti->a[ir][jr])); + blechro[ir][jr] = chromah / 32768.f; + guid[ir][jr] = bufreti->L[ir][jr] / 32768.f; + bufprov->L[ir][jr] = bufmaskblurreti->L[ir][jr]; + bufprov->a[ir][jr] = bufmaskblurreti->a[ir][jr]; + bufprov->b[ir][jr] = bufmaskblurreti->b[ir][jr]; + + } + } + + if (rad != 0.f) { +// guidedFilter(guid, ble, ble, rad * 10.f / skip, 0.001, multiThread, 4); + float blur = rad; + blur = blur < 0.f ? -1.f / blur : 1.f + blur; + int r1 = max(int(4 / skip * blur + 0.5), 1); + int r2 = max(int(25 / skip * blur + 0.5), 1); + + double epsilmax = 0.005; + double epsilmin = 0.00001; + + double aepsil = (epsilmax - epsilmin) / 100.f; + double bepsil = epsilmin; //epsilmax - 100.f * aepsil; + double epsil = aepsil * rad + bepsil; + if (rad < 0.f) { + epsil = 0.001; + } + rtengine::guidedFilter(guid, blechro, blechro, r1, epsil, multiThread); + rtengine::guidedFilter(guid, ble, ble, r2, 0.2 * epsil, multiThread); + + } + + LUTf lutTonemaskreti(65536); + calcGammaLut(gamm, slop, lutTonemaskreti); + float radiusb = 1.f / skip; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < H_L; ir++) + for (int jr = 0; jr < W_L; jr++) { + float L_; + float2 sincosval = xsincosf(hue[ir][jr]); + bufmaskblurreti->L[ir][jr] = LIM01(ble[ir][jr]) * 32768.f; + L_ = 2.f * bufmaskblurreti->L[ir][jr]; + bufmaskblurreti->L[ir][jr] = lutTonemaskreti[L_]; + bufmaskblurreti->a[ir][jr] = 32768.f * sincosval.y * blechro[ir][jr]; + bufmaskblurreti->b[ir][jr] = 32768.f * sincosval.x * blechro[ir][jr]; + } + + if (lmaskretilocalcurve && localmaskretiutili) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < H_L; ir++) + for (int jr = 0; jr < W_L; jr++) { + bufmaskblurreti->L[ir][jr] = 0.5f * lmaskretilocalcurve[2.f * bufmaskblurreti->L[ir][jr]]; + } + } + + if (lap > 0.f && pde) { + array2D mask; + mask(W_L, H_L); + float amount = LIM01(float(lap)/100.f); + array2D LL(W_L, H_L, bufreti->L, ARRAY2D_BYREFERENCE); + ImProcFunctions::laplacian(LL, mask, W_L, H_L, 25.f, 20000.f, amount, false); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int i = 0; i < H_L; ++i) { + for (int j = 0; j < W_L; ++j) { + mask[i][j] = LIM01(mask[i][j]); + } + } + for (int i = 0; i < 3; ++i) { + boxblur(static_cast(mask), static_cast(mask), 5 / skip, W_L, H_L, false); + } +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int i = 0; i < H_L; ++i) { + for (int j = 0; j < W_L; ++j) { + bufmaskblurreti->L[i][j] += CLIPLOC(100000.f * (mask[i][j]));//increase strongly result + } + } + } + + + if (delt) { + float *rdE[H_L] ALIGNED16; + float *rdEBuffer = new float[H_L * W_L]; + + for (int i = 0; i < H_L; i++) { + rdE[i] = &rdEBuffer[i * W_L]; + } + + deltaEforMask(rdE, W_L, H_L, bufreti, hueref, chromaref, lumaref, maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance, balanceh); + // printf("rde1=%f rde2=%f\n", rdE[1][1], rdE[100][100]); + std::unique_ptr delta(new LabImage(W_L, H_L)); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int ir = 0; ir < H_L; ir++) + for (int jr = 0; jr < W_L; jr++) { + delta->L[ir][jr] = bufmaskblurreti->L[ir][jr] - bufprov->L[ir][jr]; + delta->a[ir][jr] = bufmaskblurreti->a[ir][jr] - bufprov->a[ir][jr]; + delta->b[ir][jr] = bufmaskblurreti->b[ir][jr] - bufprov->b[ir][jr]; + + bufmaskblurreti->L[ir][jr] = bufprov->L[ir][jr] + rdE[ir][jr] * delta->L[ir][jr]; + bufmaskblurreti->a[ir][jr] = bufprov->a[ir][jr] + rdE[ir][jr] * delta->a[ir][jr]; + bufmaskblurreti->b[ir][jr] = bufprov->b[ir][jr] + rdE[ir][jr] * delta->b[ir][jr]; + } + + delete [] rdEBuffer; + + } + +/* + if (lap > 0.f) { + float *datain = new float[H_L * W_L]; + float *data_tmp = new float[H_L * W_L]; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + datain[y * W_L + x] = bufmaskblurreti->L[y][x]; + } + } + + if (!pde) { + ImProcFunctions::discrete_laplacian_threshold(data_tmp, datain, W_L, H_L, 200.f * lap); + } else { + ImProcFunctions::retinex_pde(datain, data_tmp, W_L, H_L, 12.f * lap, 1.f, nullptr, 0, 0, 1); + } + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + bufmaskblurreti->L[y][x] = data_tmp[y * W_L + x]; + } + } + + delete [] datain; + delete [] data_tmp; + + } +*/ +//blend +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur(bufmaskblurreti->L, bufmaskorigreti->L, W_L, H_L, radiusb); + gaussianBlur(bufmaskblurreti->a, bufmaskorigreti->a, W_L, H_L, 1.f + (0.5f * rad) / skip); + gaussianBlur(bufmaskblurreti->b, bufmaskorigreti->b, W_L, H_L, 1.f + (0.5f * rad) / skip); + } + + float modr = 0.01f * (float) blend; + + if (llretiMask != 3 && retiMask) { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + if (before == 0 && retiMasktmap) { + out[y][x] += fabs(modr) * bufmaskorigreti->L[y][x]; + out[y][x] = LIM(out[y][x], 0.f, 100000.f); + } else { + bufreti->L[y][x] += bufmaskorigreti->L[y][x] * modr; + bufreti->L[y][x] = CLIPLOC(bufreti->L[y][x]); + + } + + bufreti->a[y][x] *= (1.f + bufmaskorigreti->a[y][x] * modr * (1.f + 0.01f * chro)); + bufreti->b[y][x] *= (1.f + bufmaskorigreti->b[y][x] * modr * (1.f + 0.01f * chro)); + bufreti->a[y][x] = CLIPC(bufreti->a[y][x]); + bufreti->b[y][x] = CLIPC(bufreti->b[y][x]); + } + } + + + } + + if (!retiMasktmap && retiMask) { //new original blur mask for deltaE +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + + buforig->L[y][x] += (modr * bufmaskorigreti->L[y][x]); + buforig->a[y][x] *= (1.f + modr * bufmaskorigreti->a[y][x]); + buforig->b[y][x] *= (1.f + modr * bufmaskorigreti->b[y][x]); + + buforig->L[y][x] = CLIP(buforig->L[y][x]); + buforig->a[y][x] = CLIPC(buforig->a[y][x]); + buforig->b[y][x] = CLIPC(buforig->b[y][x]); + + buforig->L[y][x] = CLIP(buforig->L[y][x] - bufmaskorigreti->L[y][x]); + buforig->a[y][x] = CLIPC(buforig->a[y][x] * (1.f - bufmaskorigreti->a[y][x])); + buforig->b[y][x] = CLIPC(buforig->b[y][x] * (1.f - bufmaskorigreti->b[y][x])); + } + } + + float radius = 3.f / skip; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + gaussianBlur(buforig->L, buforigmas->L, W_L, H_L, radius); + gaussianBlur(buforig->a, buforigmas->a, W_L, H_L, radius); + gaussianBlur(buforig->b, buforigmas->b, W_L, H_L, radius); + } + + } + + + if (llretiMask == 3) { + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int y = 0; y < H_L; y++) { + for (int x = 0; x < W_L; x++) { + bufmask->L[y][x] = (lumask * 400.f) + CLIPLOC(bufmaskorigreti->L[y][x]); + bufmask->a[y][x] = CLIPC(bufreti->a[y][x] * bufmaskorigreti->a[y][x]); + bufmask->b[y][x] = CLIPC(bufreti->b[y][x] * bufmaskorigreti->b[y][x]); + } + } + } + +} + + + +void ImProcFunctions::MSRLocal(int call, int sp, bool fftw, int lum, float** reducDE, LabImage * bufreti, LabImage * bufmask, LabImage * buforig, LabImage * buforigmas, LabImage * bufmaskorigreti, float** luminance, const float* const *originalLuminance, + const int width, const int height, int bfwr, int bfhr, const procparams::LocallabParams &loc, const int skip, const LocretigainCurve &locRETgainCcurve, const LocretitransCurve &locRETtransCcurve, + const int chrome, const int scall, const float krad, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, + const LocCCmaskCurve & locccmasretiCurve, bool lcmasretiutili, const LocLLmaskCurve & locllmasretiCurve, bool llmasretiutili, const LocHHmaskCurve & lochhmasretiCurve, bool lhmasretiutili, int llretiMask, + const LUTf & lmaskretilocalcurve, bool localmaskretiutili, + LabImage * transformed, bool retiMasktmap, bool retiMask, + bool delt, const float hueref, const float chromaref, const float lumaref, + float maxdE, float mindE, float maxdElim, float mindElim, float iterat, float limscope, int scope, float balance, float balanceh, float lumask) + +{ + BENCHFUN + + float mean, stddv, maxtr, mintr; + mean = 0.f; + stddv = 0.f; + maxtr = 0.f; + mintr = 0.f; + constexpr float eps = 2.f; + bool useHslLin = false; + const float offse = loc.spots.at(sp).offs; + const float chrT = (float)(loc.spots.at(sp).chrrt) / 100.f; + const int scal = (loc.spots.at(sp).scalereti); + float vart = loc.spots.at(sp).vart / 100.f;//variance + const float strength = loc.spots.at(sp).str / 100.f; // Blend with original L channel data + const float dar = loc.spots.at(sp).darkness; + const float lig = loc.spots.at(sp).lightnessreti; + float value = pow(strength, 0.4f); + float value_1 = pow(strength, 0.3f); + bool logli = loc.spots.at(sp).loglin; + float limD = loc.spots.at(sp).limd;//10.f + limD = pow(limD, 1.7f); //about 2500 enough + float ilimD = 1.f / limD; + float threslum = loc.spots.at(sp).limd; + const float elogt = 2.71828f; + + if (!logli) { + useHslLin = true; + } + + //empirical skip evaluation : very difficult because quasi all parameters interfere + //to test on several images + int nei = (int)(krad * loc.spots.at(sp).neigh); + // printf("neigh=%i\n", nei); + //several test to find good values ???!!! + //very difficult to do because 4 factor are correlate with skip and cannot been solved easily + // size of spots + // radius - neigh + // scal + // variance vart + //not too bad proposition + float divsca = 1.f; + + if (scal >= 3) { + divsca = sqrt(scal / 3.f); + } + + if (skip >= 4) { + //nei = (int)(0.1f * nei + 2.f); //not too bad + nei = (int)(nei / (1.5f * skip)) / divsca; + vart *= sqrt(skip); + } else if (skip > 1) { + //nei = (int)(0.3f * nei + 2.f); + nei = (int)(nei / skip) / divsca; + vart *= sqrt(skip); + } + + int moderetinex = 0; + + if (loc.spots.at(sp).retinexMethod == "uni") { + moderetinex = 0; + } else if (loc.spots.at(sp).retinexMethod == "low") { + moderetinex = 1; + } else if (loc.spots.at(sp).retinexMethod == "high") { + moderetinex = 2; + } + + const float high = 0.f; // Dummy to pass to retinex_scales(...) + + constexpr auto maxRetinexScales = 10; + float RetinexScales[maxRetinexScales]; + + retinex_scales(RetinexScales, scal, moderetinex, nei, high); + + + const int H_L = height; + const int W_L = width; + std::unique_ptr> srcBuffer(new JaggedArray(W_L, H_L)); + float** src = *srcBuffer; + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H_L; i++) + for (int j = 0; j < W_L; j++) { + src[i][j] = luminance[i][j] + eps; + luminance[i][j] = 0.f; + } + + JaggedArray out(W_L, H_L); + + float clipt = loc.spots.at(sp).cliptm; + + const float logBetaGain = xlogf(16384.f); + float pond = logBetaGain / (float) scal; + + if (!useHslLin) { + pond /= log(elogt); + } + + float kr;//on FFTW + float kg = 1.f;//on Gaussianblur + + for (int scale = scal - 1; scale >= 0; --scale) { + // printf("retscale=%f scale=%i \n", mulradiusfftw * RetinexScales[scale], scale); + //emprical adjustment between FFTW radius and Gaussainblur + //under 50 ==> 10.f + // 400 ==> 1.f + float sigm = 1.f; + + if (settings->fftwsigma == false) { //empirical formula + sigm = RetinexScales[scale]; + float ak = -9.f / 350.f; + float bk = 10.f - 50.f * ak; + kr = ak * sigm + bk; + + if (sigm < 50.f) { + kr = 10.f; + } + + //above 400 at 5000 ==> 20.f + if (sigm > 400.f) { //increase ==> 5000 + float ka = 19.f / 4600.f; + float kb = 1.f - 400 * ka; + kr = ka * sigm + kb; + float kga = -0.14f / 4600.f;//decrease + float kgb = 1.f - 400.f * kga; + kg = kga * sigm + kgb; + + if (sigm > 5000.f) { + kr = ka * 5000.f + kb; + kg = kga * 5000.f + kgb; + } + + } + } else {//sigma *= sigma + kg = 1.f; + kr = sigm; + } + + if (!fftw) { // || (fftw && call != 2)) { + if (scale == scal - 1) { + gaussianBlur(src, out, W_L, H_L, kg * RetinexScales[scale], true); + } else { // reuse result of last iteration + // out was modified in last iteration => restore it + gaussianBlur(out, out, W_L, H_L, sqrtf(SQR(kg * RetinexScales[scale]) - SQR(kg * RetinexScales[scale + 1])), true); + } + } else { + if (scale == scal - 1) { + if (settings->fftwsigma == false) { //empirical formula + ImProcFunctions::fftw_convol_blur2(src, out, bfwr, bfhr, (kr * RetinexScales[scale]), 0, 0); + } else { + ImProcFunctions::fftw_convol_blur2(src, out, bfwr, bfhr, (SQR(RetinexScales[scale])), 0, 0); + } + } else { // reuse result of last iteration + // out was modified in last iteration => restore it + if (settings->fftwsigma == false) { //empirical formula + ImProcFunctions::fftw_convol_blur2(out, out, bfwr, bfhr, sqrtf(SQR(kr * RetinexScales[scale]) - SQR(kr * RetinexScales[scale + 1])), 0, 0); + } else { + ImProcFunctions::fftw_convol_blur2(out, out, bfwr, bfhr, (SQR(RetinexScales[scale]) - SQR(RetinexScales[scale + 1])), 0, 0); + } + } + } + + if (scale == 1) { //equalize last scale with darkness and lightness of course acts on TM! + if (dar != 1.f || lig != 1.f) { + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; ++y) { + for (int x = 0; x < W_L; ++x) { + float buf = (src[y][x] - out[y][x]) * value; + buf *= (buf > 0.f) ? lig : dar; + out[y][x] = LIM(out[y][x] + buf, -100000.f, 100000.f); + } + } + } + } + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H_L; i++) { + int j = 0; + +#ifdef __SSE2__ + const vfloat pondv = F2V(pond); + const vfloat limMinv = F2V(ilimD); + const vfloat limMaxv = F2V(limD); + + if (useHslLin) { + for (; j < W_L - 3; j += 4) { + STVFU(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) { + STVFU(luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv))); + } + } + +#endif + + if (useHslLin) { + for (; j < W_L; j++) { + luminance[i][j] += pond * (LIM(src[i][j] / out[i][j], ilimD, limD)); + } + } else { + for (; j < W_L; j++) { + luminance[i][j] += pond * xlogf(LIM(src[i][j] / out[i][j], ilimD, limD)); + } + } + } + + } + + if (scal == 1) {//only if user select scal = 1 + const float threslow = threslum * 163.f; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < H_L; ++y) { + for (int x = 0; x < W_L; ++x) { + const float srcVal = src[y][x]; + const float kval = rtengine::min(srcVal / threslow, 1.f); + float buf = (srcVal - out[y][x]) * value_1; + buf *= (buf > 0.f) ? lig : dar; + luminance[y][x] = LIM(srcVal + (1.f + kval) * buf, -32768.f, 32768.f); + } + } + + double avg = 0.f; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg) +#endif + + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + avg += luminance[i][j]; + } + } + + avg /= H_L * W_L; + avg /= 32768.f; + avg = LIM01(avg); + float contreal = 0.5f * vart; + DiagonalCurve reti_contrast({ + DCT_NURBS, + 0, 0, + avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), + avg + (1 - avg) * (0.6 - contreal / 250.0), avg + (1 - avg) * (0.6 + contreal / 250.0), + 1, 1 + }); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + float buf = LIM01(luminance[i][j] / 32768.f); + buf = reti_contrast.getVal(buf); + buf *= 32768.f; + luminance[i][j] = buf; + } + } + } + + srcBuffer.reset(); + + float str = strength * (chrome == 0 ? 1.f : 0.8f * (chrT - 0.4f)); + const float maxclip = (chrome == 0 ? 32768.f : 50000.f); + + if (scal != 1) { + mean = 0.f; + stddv = 0.f; + + mean_stddv2(luminance, mean, stddv, W_L, H_L, maxtr, mintr); + + if (locRETtransCcurve && mean != 0.f && stddv != 0.f) { //if curve + float asig = 0.166666f / stddv; + float bsig = 0.5f - asig * mean; + float amax = 0.333333f / (maxtr - mean - stddv); + float bmax = 1.f - amax * maxtr; + float amin = 0.333333f / (mean - stddv - mintr); + float bmin = -amin * mintr; + + asig *= 500.f; + bsig *= 500.f; + amax *= 500.f; + bmax *= 500.f; + amin *= 500.f; + bmin *= 500.f; + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + float absciss; +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = 0; i < H_L; i++) + for (int j = 0; j < W_L; j++) { //for mintr to maxtr evalate absciss in function of original transmission + if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { + absciss = asig * luminance[i][j] + bsig; + } else if (luminance[i][j] >= mean) { + absciss = amax * luminance[i][j] + bmax; + } else { /*if(luminance[i][j] <= mean - stddv)*/ + absciss = amin * luminance[i][j] + bmin; + } + + //TODO : move multiplication by 4.f and subtraction of 1.f inside the curve + luminance[i][j] *= (-1.f + 4.f * locRETtransCcurve[absciss]); //new transmission + + } + } + } + + mean = 0.f; + stddv = 0.f; + mean_stddv2(luminance, mean, stddv, W_L, H_L, maxtr, mintr);//new calculation of mean... + + float epsil = 0.1f; + + mini = mean - vart * stddv; + + if (mini < mintr) { + mini = mintr + epsil; + } + + maxi = mean + vart * stddv; + + if (maxi > maxtr) { + maxi = maxtr - epsil; + } + + float delta = maxi - mini; + if (!delta) { + delta = 1.0f; + } + + + float *copylum[H_L] ALIGNED16; + float *copylumBuffer = new float[H_L * W_L]; + + for (int i = 0; i < H_L; i++) { + copylum[i] = ©lumBuffer[i * W_L]; + } + + float cdfactor = (clipt * 32768.f) / delta; + maxCD = -9999999.f; + minCD = 9999999.f; + //prepare work for curve gain +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + luminance[i][j] = luminance[i][j] - mini; + } + } + + mean = 0.f; + stddv = 0.f; + + mean_stddv2(luminance, mean, stddv, W_L, H_L, maxtr, mintr); +// printf("meanun=%f stdun=%f maxtr=%f mintr=%f\n", mean, stddv, maxtr, mintr); + + float asig = 0.f, bsig = 0.f, amax = 0.f, bmax = 0.f, amin = 0.f, bmin = 0.f; + const bool hasRetGainCurve = locRETgainCcurve && mean != 0.f && stddv != 0.f; + + if (hasRetGainCurve) { //if curve + asig = 0.166666f / stddv; + bsig = 0.5f - asig * mean; + amax = 0.333333f / (maxtr - mean - stddv); + bmax = 1.f - amax * maxtr; + amin = 0.333333f / (mean - stddv - mintr); + bmin = -amin * mintr; + + asig *= 500.f; + bsig *= 500.f; + amax *= 500.f; + bmax *= 500.f; + amin *= 500.f; + bmin *= 500.f; + cdfactor *= 2.f; + } + + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + // float absciss; + float cdmax = -999999.f, cdmin = 999999.f; + float gan = 0.5f; + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = 0; i < H_L; i ++) + for (int j = 0; j < W_L; j++) { + + if (hasRetGainCurve) { + float absciss; + + if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { + absciss = asig * luminance[i][j] + bsig; + } else if (luminance[i][j] >= mean) { + absciss = amax * luminance[i][j] + bmax; + } else { + absciss = amin * luminance[i][j] + bmin; + } + + gan = locRETgainCcurve[absciss]; //new gain function transmission + } + + //but we don't update mean stddv for display only... + copylum[i][j] = gan * luminance[i][j];//update data for display + float cd = gan * cdfactor * luminance[i][j] + offse; + + cdmax = cd > cdmax ? cd : cdmax; + cdmin = cd < cdmin ? cd : cdmin; + luminance[i][j] = intp(str * reducDE[i][j], clipretinex(cd, 0.f, maxclip), originalLuminance[i][j]); + } + + + +#ifdef _OPENMP + #pragma omp critical +#endif + { + maxCD = maxCD > cdmax ? maxCD : cdmax; + minCD = minCD < cdmin ? minCD : cdmin; + } + } + mean = 0.f; + stddv = 0.f; + + mean_stddv2(copylum, mean, stddv, W_L, H_L, maxtr, mintr); + delete [] copylumBuffer; + copylumBuffer = nullptr; + + } else { +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = 0; i < H_L; i ++) + for (int j = 0; j < W_L; j++) { + luminance[i][j] = LIM(luminance[i][j], 0.f, maxclip) * str + (1.f - str) * originalLuminance[i][j]; + + } + + } + + float rad = loc.spots.at(sp).radmaskreti; + float slop = loc.spots.at(sp).slomaskreti; + float gamm = loc.spots.at(sp).gammaskreti; + float blend = loc.spots.at(sp).blendmaskreti; + float chro = loc.spots.at(sp).chromaskreti; + float lap = loc.spots.at(sp).lapmaskreti; + bool pde = params->locallab.spots.at(sp).laplac; + + if (lum == 1 && (llretiMask == 3 || llretiMask == 0 || llretiMask == 2 || llretiMask == 4)) { //only mask with luminance on last scale + int before = 1; + maskforretinex(sp, before, luminance, nullptr, W_L, H_L, skip, + locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, llretiMask, retiMasktmap, retiMask, + rad, lap, pde, gamm, slop, chro, blend, + lmaskretilocalcurve, localmaskretiutili, + bufreti, bufmask, buforig, buforigmas, bufmaskorigreti, multiThread, + delt, hueref, chromaref, lumaref, + maxdE, mindE, maxdElim, mindElim, iterat, limscope, scope, balance, balanceh, lumask + ); + } + + //mask does not interfered with data displayed + + Tmean = mean; + Tsigma = stddv; + Tmin = mintr; + Tmax = maxtr; +} } diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc index 5c5b6b324..fd2ab3db4 100644 --- a/rtengine/ipshadowshighlights.cc +++ b/rtengine/ipshadowshighlights.cc @@ -31,22 +31,20 @@ #include "procparams.h" #include "sleef.h" -namespace rtengine +namespace rtengine { +//modifications to pass parameters needs by locallab, to avoid 2 functions - no change in process - J.Desmis march 2019 +void ImProcFunctions::shadowsHighlights(LabImage *lab, bool ena, int labmode, int hightli, int shado, int rad, int scal, int hltonal, int shtonal) { - -void ImProcFunctions::shadowsHighlights(LabImage *lab) -{ - if (!params->sh.enabled || (!params->sh.highlights && !params->sh.shadows)){ + if (!ena || (!hightli && !shado)){ return; } - const int width = lab->W; const int height = lab->H; - const bool lab_mode = params->sh.lab; + const bool lab_mode = labmode; array2D mask(width, height); array2D L(width, height); - const float radius = float(params->sh.radius) * 10 / scale; + const float radius = float(rad) * 10 / scal; LUTf f(lab_mode ? 32768 : 65536); TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); @@ -193,12 +191,12 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab) } }; - if (params->sh.highlights > 0) { - apply(params->sh.highlights * 0.7, params->sh.htonalwidth, true); + if (hightli > 0) { + apply(hightli * 0.7, hltonal, true); } - if (params->sh.shadows > 0) { - apply(params->sh.shadows * 0.6, params->sh.stonalwidth, false); + if (shado > 0) { + apply(shado * 0.6, shtonal, false); } } diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 7198b76c5..96d42e336 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -103,7 +103,7 @@ void sharpenHaloCtrl (float** luminance, float** blurmap, float** base, float** void dcdamping (float** aI, float** aO, float damping, int W, int H) { - const float dampingFac = -2.0 / (damping * damping); + const float dampingFac = -2.f / (damping * damping); #ifdef __SSE2__ vfloat Iv, Ov, Uv, zerov, onev, fourv, fivev, dampingFacv, Tv, Wv, Lv; @@ -163,7 +163,7 @@ namespace rtengine void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale) { - if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) { + if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25) { return; } BENCHFUN @@ -180,7 +180,7 @@ BENCHFUN JaggedArray* blurbuffer = nullptr; - if (sharpenParam.blurradius >= 0.25f) { + if (sharpenParam.blurradius >= 0.25) { blurbuffer = new JaggedArray(W, H); JaggedArray &blur = *blurbuffer; #ifdef _OPENMP @@ -229,7 +229,7 @@ BENCHFUN } } - if (sharpenParam.blurradius >= 0.25f) { + if (sharpenParam.blurradius >= 0.25) { JaggedArray &blur = *blurbuffer; #ifdef _OPENMP #pragma omp for @@ -244,6 +244,110 @@ BENCHFUN delete blurbuffer; } +void ImProcFunctions::deconvsharpeningloc (float** luminance, float** tmp, int W, int H, float** loctemp, int damp, double radi, int ite, int amo, int contrast, double blurrad, int sk) +{ + // BENCHFUN + + if (amo < 1) { + return; + } + JaggedArray blend(W, H); + float contras = contrast / 100.f; + buildBlendMask(luminance, blend, W, H, contras, 1.f); + + + JaggedArray tmpI(W, H); + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < H; i++) { + for (int j = 0; j < W; j++) { + tmpI[i][j] = max(luminance[i][j], 0.f); + } + } + + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + + JaggedArray* blurbuffer = nullptr; + + if (blurrad >= 0.25) { + blurbuffer = new JaggedArray(W, H); + JaggedArray &blur = *blurbuffer; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur(tmpI, blur, W, H, blurrad); +#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)); + } + } + } + } + + float damping = (float) damp / 5.0; + bool needdamp = damp > 0; + double sigma = radi / sk; + const float amount = (float) amo / 100.f; + + if (sigma < 0.26f) { + sigma = 0.26f; + } + + int itera = ite; + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + for (int k = 0; k < itera; 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, false, GAUSS_DIV, luminance); + } else { + // apply gaussian blur + damping + gaussianBlur (tmpI, tmp, W, H, sigma); + dcdamping (tmp, luminance, damping, W, H); + } + + gaussianBlur (tmp, tmpI, W, H, sigma, false, GAUSS_MULT); + } // end for + + +#ifdef _OPENMP + #pragma omp for +#endif + + for (int i = 0; i < H; i++) + for (int j = 0; j < W; j++) { + loctemp[i][j] = intp(blend[i][j] * amount, max(tmpI[i][j], 0.0f), luminance[i][j]); + } + + if (blurrad >= 0.25) { + JaggedArray &blur = *blurbuffer; +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + loctemp[i][j] = intp(blend[i][j], loctemp[i][j], max(blur[i][j], 0.0f)); + } + } + } + + } // end parallel + delete blurbuffer; + + +} + void ImProcFunctions::sharpening (LabImage* lab, const procparams::SharpeningParams &sharpenParam, bool showMask) { @@ -255,7 +359,7 @@ void ImProcFunctions::sharpening (LabImage* lab, const procparams::SharpeningPar // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); - float contrast = sharpenParam.contrast / 100.f; + float contrast = sharpenParam.contrast / 100.0; buildBlendMask(lab->L, blend, W, H, contrast); if(showMask) { @@ -292,7 +396,7 @@ BENCHFUN JaggedArray blur(W, H); - if (sharpenParam.blurradius >= 0.25f) { + if (sharpenParam.blurradius >= 0.25) { #ifdef _OPENMP #pragma omp parallel #endif @@ -372,7 +476,7 @@ BENCHFUN delete [] b3; } - if (sharpenParam.blurradius >= 0.25f) { + if (sharpenParam.blurradius >= 0.25) { #ifdef _OPENMP #pragma omp parallel for #endif @@ -385,241 +489,6 @@ BENCHFUN } -// To the extent possible under law, Manuel Llorens -// has waived all copyright and related or neighboring rights to this work. -// This work is published from: Spain. - -// 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 (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; - } - - MyTime t1e, t2e; - t1e.set(); - - int offset, c, i, j, p, width2; - int width = lab->W, height = lab->H; - float *L, lumH, lumV, lumD1, lumD2, v, contrast, s; - float difL, difR, difT, difB, difLT, difRB, difLB, difRT, wH, wV, wD1, wD2, chmax[3]; - float f1, f2, f3, f4; - float templab; - int iii, kkk; - width2 = 2 * width; - const float epsil = 0.01f; //prevent divide by zero - const float eps2 = 0.001f; //prevent divide by zero - float amount; - amount = params->sharpenEdge.amount / 100.0f; - - if (amount < 0.00001f) { - return; - } - - if (settings->verbose) { - printf ("SharpenEdge amount %f\n", amount); - } - - L = new float[width * height]; - - chmax[0] = 8.0f; - chmax[1] = 3.0f; - chmax[2] = 3.0f; - - int channels; - - if (params->sharpenEdge.threechannels) { - channels = 0; - } else { - channels = 2; - } - - if (settings->verbose) { - printf ("SharpenEdge channels %d\n", channels); - } - - int passes = params->sharpenEdge.passes; - - if (settings->verbose) { - printf ("SharpenEdge passes %d\n", passes); - } - - for (p = 0; p < passes; p++) - for (c = 0; c <= channels; c++) { // c=0 Luminance only - -#ifdef _OPENMP - #pragma omp parallel for private(offset) shared(L) -#endif - - for (offset = 0; offset < width * height; offset++) { - int ii = offset / width; - int kk = offset - ii * width; - - if (c == 0) { - L[offset] = lab->L[ii][kk] / 327.68f; // adjust to RT and to 0..100 - } else if (c == 1) { - L[offset] = lab->a[ii][kk] / 327.68f; - } else { /*if (c==2) */ - L[offset] = lab->b[ii][kk] / 327.68f; - } - } - -#ifdef _OPENMP - #pragma omp parallel for private(j,i,iii,kkk, templab,offset,wH,wV,wD1,wD2,s,lumH,lumV,lumD1,lumD2,v,contrast,f1,f2,f3,f4,difT,difB,difL,difR,difLT,difLB,difRT,difRB) shared(lab,L,amount) -#endif - - for(j = 2; j < height - 2; j++) - for(i = 2, offset = j * width + i; i < width - 2; i++, offset++) { - // weight functions - wH = eps2 + fabs(L[offset + 1] - L[offset - 1]); - wV = eps2 + fabs(L[offset + width] - L[offset - width]); - - s = 1.0f + fabs(wH - wV) / 2.0f; - wD1 = eps2 + fabs(L[offset + width + 1] - L[offset - width - 1]) / s; - wD2 = eps2 + fabs(L[offset + width - 1] - L[offset - width + 1]) / s; - s = wD1; - wD1 /= wD2; - wD2 /= s; - - // initial values - int ii = offset / width; - int kk = offset - ii * width; - - if (c == 0) { - lumH = lumV = lumD1 = lumD2 = v = lab->L[ii][kk] / 327.68f; - } else if (c == 1) { - lumH = lumV = lumD1 = lumD2 = v = lab->a[ii][kk] / 327.68f; - } else { /* if (c==2) */ - lumH = lumV = lumD1 = lumD2 = v = lab->b[ii][kk] / 327.68f; - } - - - // contrast detection - contrast = sqrt(fabs(L[offset + 1] - L[offset - 1]) * fabs(L[offset + 1] - L[offset - 1]) + fabs(L[offset + width] - L[offset - width]) * fabs(L[offset + width] - L[offset - width])) / chmax[c]; - - if (contrast > 1.0f) { - contrast = 1.0f; - } - - // new possible values - if (((L[offset] < L[offset - 1]) && (L[offset] > L[offset + 1])) || ((L[offset] > L[offset - 1]) && (L[offset] < L[offset + 1]))) { - f1 = fabs(L[offset - 2] - L[offset - 1]); - f2 = fabs(L[offset - 1] - L[offset]); - f3 = fabs(L[offset - 1] - L[offset - width]) * fabs(L[offset - 1] - L[offset + width]); - f4 = sqrt(fabs(L[offset - 1] - L[offset - width2]) * fabs(L[offset - 1] - L[offset + width2])); - difL = f1 * f2 * f2 * f3 * f3 * f4; - f1 = fabs(L[offset + 2] - L[offset + 1]); - f2 = fabs(L[offset + 1] - L[offset]); - f3 = fabs(L[offset + 1] - L[offset - width]) * fabs(L[offset + 1] - L[offset + width]); - f4 = sqrt(fabs(L[offset + 1] - L[offset - width2]) * fabs(L[offset + 1] - L[offset + width2])); - difR = f1 * f2 * f2 * f3 * f3 * f4; - - if ((difR > epsil) && (difL > epsil)) { - lumH = (L[offset - 1] * difR + L[offset + 1] * difL) / (difL + difR); - lumH = v * (1.f - contrast) + lumH * contrast; - } - } - - if (((L[offset] < L[offset - width]) && (L[offset] > L[offset + width])) || ((L[offset] > L[offset - width]) && (L[offset] < L[offset + width]))) { - f1 = fabs(L[offset - width2] - L[offset - width]); - f2 = fabs(L[offset - width] - L[offset]); - f3 = fabs(L[offset - width] - L[offset - 1]) * fabs(L[offset - width] - L[offset + 1]); - f4 = sqrt(fabs(L[offset - width] - L[offset - 2]) * fabs(L[offset - width] - L[offset + 2])); - difT = f1 * f2 * f2 * f3 * f3 * f4; - f1 = fabs(L[offset + width2] - L[offset + width]); - f2 = fabs(L[offset + width] - L[offset]); - f3 = fabs(L[offset + width] - L[offset - 1]) * fabs(L[offset + width] - L[offset + 1]); - f4 = sqrt(fabs(L[offset + width] - L[offset - 2]) * fabs(L[offset + width] - L[offset + 2])); - difB = f1 * f2 * f2 * f3 * f3 * f4; - - if ((difB > epsil) && (difT > epsil)) { - lumV = (L[offset - width] * difB + L[offset + width] * difT) / (difT + difB); - lumV = v * (1.f - contrast) + lumV * contrast; - } - } - - if (((L[offset] < L[offset - 1 - width]) && (L[offset] > L[offset + 1 + width])) || ((L[offset] > L[offset - 1 - width]) && (L[offset] < L[offset + 1 + width]))) { - f1 = fabs(L[offset - 2 - width2] - L[offset - 1 - width]); - f2 = fabs(L[offset - 1 - width] - L[offset]); - f3 = fabs(L[offset - 1 - width] - L[offset - width + 1]) * fabs(L[offset - 1 - width] - L[offset + width - 1]); - f4 = sqrt(fabs(L[offset - 1 - width] - L[offset - width2 + 2]) * fabs(L[offset - 1 - width] - L[offset + width2 - 2])); - difLT = f1 * f2 * f2 * f3 * f3 * f4; - f1 = fabs(L[offset + 2 + width2] - L[offset + 1 + width]); - f2 = fabs(L[offset + 1 + width] - L[offset]); - f3 = fabs(L[offset + 1 + width] - L[offset - width + 1]) * fabs(L[offset + 1 + width] - L[offset + width - 1]); - f4 = sqrt(fabs(L[offset + 1 + width] - L[offset - width2 + 2]) * fabs(L[offset + 1 + width] - L[offset + width2 - 2])); - difRB = f1 * f2 * f2 * f3 * f3 * f4; - - if ((difLT > epsil) && (difRB > epsil)) { - lumD1 = (L[offset - 1 - width] * difRB + L[offset + 1 + width] * difLT) / (difLT + difRB); - lumD1 = v * (1.f - contrast) + lumD1 * contrast; - } - } - - if (((L[offset] < L[offset + 1 - width]) && (L[offset] > L[offset - 1 + width])) || ((L[offset] > L[offset + 1 - width]) && (L[offset] < L[offset - 1 + width]))) { - f1 = fabs(L[offset - 2 + width2] - L[offset - 1 + width]); - f2 = fabs(L[offset - 1 + width] - L[offset]); - f3 = fabs(L[offset - 1 + width] - L[offset - width - 1]) * fabs(L[offset - 1 + width] - L[offset + width + 1]); - f4 = sqrt(fabs(L[offset - 1 + width] - L[offset - width2 - 2]) * fabs(L[offset - 1 + width] - L[offset + width2 + 2])); - difLB = f1 * f2 * f2 * f3 * f3 * f4; - f1 = fabs(L[offset + 2 - width2] - L[offset + 1 - width]); - f2 = fabs(L[offset + 1 - width] - L[offset]) * fabs(L[offset + 1 - width] - L[offset]); - f3 = fabs(L[offset + 1 - width] - L[offset + width + 1]) * fabs(L[offset + 1 - width] - L[offset - width - 1]); - f4 = sqrt(fabs(L[offset + 1 - width] - L[offset + width2 + 2]) * fabs(L[offset + 1 - width] - L[offset - width2 - 2])); - difRT = f1 * f2 * f2 * f3 * f3 * f4; - - if ((difLB > epsil) && (difRT > epsil)) { - lumD2 = (L[offset + 1 - width] * difLB + L[offset - 1 + width] * difRT) / (difLB + difRT); - lumD2 = v * (1.f - contrast) + lumD2 * contrast; - } - } - - s = amount; - - // avoid sharpening diagonals too much - if (((fabs(wH / wV) < 0.45f) && (fabs(wH / wV) > 0.05f)) || ((fabs(wV / wH) < 0.45f) && (fabs(wV / wH) > 0.05f))) { - s = amount / 3.0f; - } - - // final mix - if ((wH != 0.0f) && (wV != 0.0f) && (wD1 != 0.0f) && (wD2 != 0.0f)) { - iii = offset / width; - kkk = offset - iii * width; - float provL = lab->L[iii][kkk] / 327.68f; - - if(c == 0) { - if(provL < 92.f) { - templab = v * (1.f - s) + (lumH * wH + lumV * wV + lumD1 * wD1 + lumD2 * wD2) / (wH + wV + wD1 + wD2) * s; - } else { - templab = provL; - } - } else { - templab = v * (1.f - s) + (lumH * wH + lumV * wV + lumD1 * wD1 + lumD2 * wD2) / (wH + wV + wD1 + wD2) * s; - } - - if (c == 0) { - lab->L[iii][kkk] = fabs(327.68f * templab); // fabs because lab->L always >0 - } else if (c == 1) { - lab->a[iii][kkk] = 327.68f * templab ; - } else if (c == 2) { - lab->b[iii][kkk] = 327.68f * templab ; - } - } - - } - } - - delete [] L; - - t2e.set(); - - if (settings->verbose) { - printf("SharpenEdge gradient %d usec\n", t2e.etime(t1e)); - } -} - // To the extent possible under law, Manuel Llorens // has waived all copyright and related or neighboring rights to this work. // This code is licensed under CC0 v1.0, see license information at @@ -640,10 +509,10 @@ BENCHFUN // k=2 matrix 5x5 k=1 matrix 3x3 const int width = W, height = H; 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 + const float amount = (k == 1 ? 2.7 : 1.) * params->sharpenMicro.amount / 1500.0; //amount 2000.0 quasi no artifacts ==> 1500 = maximum, after artifacts, 25/9 if 3x3 if (settings->verbose) { - printf ("Micro-contrast amount %f\n", amount); + printf ("Micro-contrast amount %f\n", static_cast(amount)); printf ("Micro-contrast uniformity %i\n", unif); } @@ -674,8 +543,8 @@ BENCHFUN // 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); + float contrastThreshold = params->sharpenMicro.contrast / 100.0; + buildBlendMask(luminance, blend, W, H, contrastThreshold); #ifdef _OPENMP #pragma omp parallel @@ -883,7 +752,7 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask) // calculate contrast based blend factors to reduce sharpening in regions with low contrast JaggedArray blend(W, H); - float contrast = params->sharpening.contrast / 100.f; + float contrast = params->sharpening.contrast / 100.0; buildBlendMask(ncie->sh_p, blend, W, H, contrast); if(showMask) { #ifdef _OPENMP diff --git a/rtengine/ipsharpenedges.cc b/rtengine/ipsharpenedges.cc new file mode 100644 index 000000000..6a44ee40a --- /dev/null +++ b/rtengine/ipsharpenedges.cc @@ -0,0 +1,217 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2020 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 "improcfun.h" +#include "labimage.h" +#include "procparams.h" +#include "rt_math.h" + +namespace { +#ifdef __SSE2__ +bool inintervalLoRo(float a, float b, float c) +{ + return a < std::max(b, c) && a > std::min(b, c); +} + +float selectweight(float a, float b, float low, float high) +{ + const float minVal = std::min(a,b); + const float maxVal = std::max(a,b); + const float res = (minVal < 0.45f * maxVal) ? low : high; + return (minVal > 0.05f * maxVal) ? res : high; +} + +#else +bool inintervalLoRo(float a, float b, float c) +{ + return (a < b && a > c) || (a < c && a > b); +} + +float selectweight(float a, float b, float low, float high) +{ + if ((a < 0.45f * b && a > 0.05f * b) || (b < 0.45f * a && b > 0.05f * a)) { + return low; + } else { + return high; + } +} + +#endif +} +namespace rtengine +{ + +// To the extent possible under law, Manuel Llorens +// has waived all copyright and related or neighboring rights to this work. +// This work is published from: Spain. + +// 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 (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 || params->sharpenEdge.amount == 0) { + return; + } + + const int width = lab->W, height = lab->H; + constexpr float chmax[3] = {1.f / 8.f, 1.f / 3.f, 1.f / 3.f}; + const int width2 = 2 * width; + constexpr float eps2 = 0.001f; //prevent divide by zero + const float amount = params->sharpenEdge.amount / 100.0; + const float amountby3 = params->sharpenEdge.amount / 300.0; + + std::unique_ptr L(new float[width * height]); + + const int channels = params->sharpenEdge.threechannels ? 1 : 3; + const int passes = params->sharpenEdge.passes; + + for (int c = 0; c < channels; ++c) { // c=0 Luminance only + float** channel = c == 0 ? lab->L : c == 1 ? lab->a : lab->b; + for (int p = 0; p < passes; ++p) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < height; ++i) { + for (int j = 0; j < width; ++j) { + L[i * width + j] = channel[i][j] / 327.68f; + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int j = 2; j < height - 2; j++) { + for (int i = 2, offset = j * width + i; i < width - 2; i++, offset++) { + // weight functions + const float wH = eps2 + std::fabs(L[offset + 1] - L[offset - 1]); + const float wV = eps2 + std::fabs(L[offset + width] - L[offset - width]); + + float s = 2.f / (2.f + std::fabs(wH - wV)); + float wD1 = eps2 + std::fabs(L[offset + width + 1] - L[offset - width - 1]) * s; + float wD2 = eps2 + std::fabs(L[offset + width - 1] - L[offset - width + 1]) * s; + s = wD1; + wD1 /= wD2; + wD2 /= s; + + const float v = L[offset]; + float lumH, lumV, lumD1, lumD2; + lumH = lumV = lumD1 = lumD2 = v; + + // contrast detection + const float contrast = std::min(std::sqrt(SQR(L[offset + 1] - L[offset - 1]) + SQR(L[offset + width] - L[offset - width])) * chmax[c], 1.f); + + // new possible values + if (inintervalLoRo(v, L[offset - 1], L[offset + 1])) { + float f1 = std::fabs(L[offset - 2] - L[offset - 1]); + float f2 = L[offset - 1] - v; + float f3 = (L[offset - 1] - L[offset - width]) * (L[offset - 1] - L[offset + width]); + float f4 = std::sqrt(std::fabs((L[offset - 1] - L[offset - width2]) * (L[offset - 1] - L[offset + width2]))); + const float difL = f1 * SQR(f2 * f3) * f4; + if (difL > 0.f) { + f1 = std::fabs(L[offset + 2] - L[offset + 1]); + f2 = L[offset + 1] - v; + f3 = (L[offset + 1] - L[offset - width]) * (L[offset + 1] - L[offset + width]); + f4 = std::sqrt(std::fabs((L[offset + 1] - L[offset - width2]) * (L[offset + 1] - L[offset + width2]))); + const float difR = f1 * SQR(f2 * f3) * f4; + if (difR > 0.f) { + lumH = (L[offset - 1] * difR + L[offset + 1] * difL) / (difL + difR); + lumH = intp(contrast, lumH, v); + } + } + } + + if (inintervalLoRo(v, L[offset - width], L[offset + width])) { + float f1 = std::fabs(L[offset - width2] - L[offset - width]); + float f2 = L[offset - width] - v; + float f3 = (L[offset - width] - L[offset - 1]) * (L[offset - width] - L[offset + 1]); + float f4 = std::sqrt(std::fabs((L[offset - width] - L[offset - 2]) * (L[offset - width] - L[offset + 2]))); + const float difT = f1 * SQR(f2 * f3) * f4; + if (difT > 0.f) { + f1 = std::fabs(L[offset + width2] - L[offset + width]); + f2 = L[offset + width] - v; + f3 = (L[offset + width] - L[offset - 1]) * (L[offset + width] - L[offset + 1]); + f4 = std::sqrt(std::fabs((L[offset + width] - L[offset - 2]) * (L[offset + width] - L[offset + 2]))); + const float difB = f1 * SQR(f2 * f3) * f4; + if (difB > 0.f) { + lumV = (L[offset - width] * difB + L[offset + width] * difT) / (difT + difB); + lumV = intp(contrast, lumV, v); + } + } + } + + if (inintervalLoRo(v, L[offset - 1 - width], L[offset + 1 + width])) { + float f1 = std::fabs(L[offset - 2 - width2] - L[offset - 1 - width]); + float f2 = L[offset - 1 - width] - v; + float f3 = (L[offset - 1 - width] - L[offset - width + 1]) * (L[offset - 1 - width] - L[offset + width - 1]); + float f4 = std::sqrt(std::fabs((L[offset - 1 - width] - L[offset - width2 + 2]) * (L[offset - 1 - width] - L[offset + width2 - 2]))); + const float difLT = f1 * SQR(f2 * f3) * f4; + if (difLT > 0.f) { + f1 = std::fabs(L[offset + 2 + width2] - L[offset + 1 + width]); + f2 = L[offset + 1 + width] - v; + f3 = (L[offset + 1 + width] - L[offset - width + 1]) * (L[offset + 1 + width] - L[offset + width - 1]); + f4 = std::sqrt(std::fabs((L[offset + 1 + width] - L[offset - width2 + 2]) * (L[offset + 1 + width] - L[offset + width2 - 2]))); + const float difRB = f1 * SQR(f2 * f3) * f4; + if (difRB > 0.f) { + lumD1 = (L[offset - 1 - width] * difRB + L[offset + 1 + width] * difLT) / (difLT + difRB); + lumD1 = intp(contrast, lumD1, v); + } + } + } + + if (inintervalLoRo(v, L[offset + 1 - width], L[offset - 1 + width])) { + float f1 = std::fabs(L[offset - 2 + width2] - L[offset - 1 + width]); + float f2 = L[offset - 1 + width] - v; + float f3 = (L[offset - 1 + width] - L[offset - width - 1]) * (L[offset - 1 + width] - L[offset + width + 1]); + float f4 = std::sqrt(std::fabs((L[offset - 1 + width] - L[offset - width2 - 2]) * (L[offset - 1 + width] - L[offset + width2 + 2]))); + const float difLB = f1 * SQR(f2 * f3) * f4; + if (difLB > 0.f) { + f1 = std::fabs(L[offset + 2 - width2] - L[offset + 1 - width]); + f2 = L[offset + 1 - width] - v; + f3 = (L[offset + 1 - width] - L[offset + width + 1]) * (L[offset + 1 - width] - L[offset - width - 1]); + f4 = std::sqrt(std::fabs((L[offset + 1 - width] - L[offset + width2 + 2]) * (L[offset + 1 - width] - L[offset - width2 - 2]))); + const float difRT = f1 * SQR(f2 * f3) * f4; + if (difRT > 0.f) { + lumD2 = (L[offset + 1 - width] * difLB + L[offset - 1 + width] * difRT) / (difLB + difRT); + lumD2 = intp(contrast, lumD2, v); + } + } + } + + // final mix + // avoid sharpening diagonals too much + const float weight = selectweight(wH, wV, amountby3, amount); + + if (c == 0) { + if (v < 92.f) { + channel[j][i] = std::fabs(327.68f * intp(weight, (lumH * wH + lumV * wV + lumD1 * wD1 + lumD2 * wD2) / (wH + wV + wD1 + wD2), v)); // fabs because lab->L always > 0 + } + } else { + channel[j][i] = 327.68f * intp(weight, (lumH * wH + lumV * wV + lumD1 * wD1 + lumD2 * wD2) / (wH + wV + wD1 + wD2), v); + } + } + } + } + } +} + +} diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc index 41d0d48bf..7df44702e 100644 --- a/rtengine/ipsoftlight.cc +++ b/rtengine/ipsoftlight.cc @@ -26,7 +26,11 @@ #include "procparams.h" -namespace { +namespace rtengine +{ + +namespace +{ inline float sl(float blend, float x) { @@ -43,8 +47,10 @@ inline float sl(float blend, float x) // using optimized formula (heckflosse67@gmx.de) return rtengine::intp(blend, rtengine::Color::igamma_srgb(v * v * (3.f - 2.f * v) * rtengine::MAXVALF), x); } + return x; } +} // namespace #ifdef __SSE2__ inline vfloat sl(vfloat blend, vfloat x) @@ -54,11 +60,11 @@ inline vfloat sl(vfloat blend, vfloat x) } #endif -} // namespace +//} // namespace -void rtengine::ImProcFunctions::softLight(LabImage *lab) +void ImProcFunctions::softLight(LabImage *lab, const rtengine::procparams::SoftLightParams &softLightParams) { - if (!params->softlight.enabled || !params->softlight.strength) { + if (!softLightParams.enabled || !softLightParams.strength) { return; } @@ -94,30 +100,35 @@ void rtengine::ImProcFunctions::softLight(LabImage *lab) #pragma omp parallel #endif { - const float blend = params->softlight.strength / 100.f; + const float blend = softLightParams.strength / 100.f; #ifdef __SSE2__ const vfloat blendv = F2V(blend); #endif #ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif + for (int i = 0; i < lab->H; ++i) { int j = 0; #ifdef __SSE2__ + for (; j < lab->W - 3; j += 4) { vfloat Xv, Yv, Zv; vfloat Rv, Gv, Bv; - Color::Lab2XYZ(LVFU(lab->L[i][j]),LVFU (lab->a[i][j]),LVFU (lab->b[i][j]), Xv, Yv, Zv); + Color::Lab2XYZ(LVFU(lab->L[i][j]), LVFU(lab->a[i][j]), LVFU(lab->b[i][j]), Xv, Yv, Zv); Color::xyz2rgb(Xv, Yv, Zv, Rv, Gv, Bv, wipv); Rv = sl(blendv, Rv); Gv = sl(blendv, Gv); Bv = sl(blendv, Bv); Color::rgbxyz(Rv, Gv, Bv, Xv, Yv, Zv, wpv); + for (int k = 0; k < 4; ++k) { - Color::XYZ2Lab(Xv[k], Yv[k], Zv[k], lab->L[i][j + k], lab->a[i][j + k], lab->b[i][j+ k]); + Color::XYZ2Lab(Xv[k], Yv[k], Zv[k], lab->L[i][j + k], lab->a[i][j + k], lab->b[i][j + k]); } } + #endif + for (; j < lab->W; j++) { float X, Y, Z; float R, G, B; @@ -132,3 +143,4 @@ void rtengine::ImProcFunctions::softLight(LabImage *lab) } } } +} \ No newline at end of file diff --git a/rtengine/iptoneequalizer.cc b/rtengine/iptoneequalizer.cc new file mode 100644 index 000000000..7fb6c791f --- /dev/null +++ b/rtengine/iptoneequalizer.cc @@ -0,0 +1,373 @@ +#include "color.h" +#include "guidedfilter.h" +#include "iccstore.h" +#include "imagefloat.h" +#include "improcfun.h" +#include "sleef.h" +#include "StopWatch.h" + + +namespace +{ + +const std::vector> colormap = { + {0.5f, 0.f, 0.5f}, + {0.5f, 0.f, 0.5f}, + {0.5f, 0.f, 0.5f}, + {0.5f, 0.f, 0.5f}, + {0.5f, 0.f, 0.5f}, // blacks + {0.f, 0.f, 1.f}, // shadows + {0.5f, 0.5f, 0.5f}, // midtones + {1.f, 1.f, 0.f}, // highlights + {1.f, 0.f, 0.f}, // whites + {1.f, 0.f, 0.f}, + {1.f, 0.f, 0.f}, + {1.f, 0.f, 0.f} +}; + + +void toneEqualizer( + array2D &R, array2D &G, array2D &B, + const rtengine::ToneEqualizerParams ¶ms, + const Glib::ustring &workingProfile, + double scale, + bool multithread) +// adapted from the tone equalizer of darktable +/* + Copyright 2019 Alberto Griggio + Small adaptation to Local Adjustment 10 2019 Jacques Desmis + This file is part of darktable, + copyright (c) 2018 Aurelien Pierre. + + darktable is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + darktable is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with darktable. If not, see . +*/ + +{ + // BENCHFUN + + const int W = R.getWidth(); + const int H = R.getHeight(); + array2D Y(W, H); + + const auto log2 = + [](float x) -> float { + static const float l2 = xlogf(2); + return xlogf(x) / l2; + }; + + const auto exp2 = + [](float x) -> float { + return pow_F(2.f, x); + }; + // Build the luma channels: band-pass filters with gaussian windows of + // std 2 EV, spaced by 2 EV + const float centers[12] = { + -16.0f, -14.0f, -12.0f, -10.0f, -8.0f, -6.0f, + -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f + }; + + const auto conv = [&](int v, float lo, float hi) -> float { + const float f = v < 0 ? lo : hi; + return exp2(float(v) / 100.f * f); + }; + const float factors[12] = { + conv(params.bands[0], 2.f, 3.f), // -16 EV + conv(params.bands[0], 2.f, 3.f), // -14 EV + conv(params.bands[0], 2.f, 3.f), // -12 EV + conv(params.bands[0], 2.f, 3.f), // -10 EV + conv(params.bands[0], 2.f, 3.f), // -8 EV + conv(params.bands[1], 2.f, 3.f), // -6 EV + conv(params.bands[2], 2.5f, 2.5f), // -4 EV + conv(params.bands[3], 3.f, 2.f), // -2 EV + conv(params.bands[4], 3.f, 2.f), // 0 EV + conv(params.bands[4], 3.f, 2.f), // 2 EV + conv(params.bands[4], 3.f, 2.f), // 4 EV + conv(params.bands[4], 3.f, 2.f) // 6 EV + }; + + rtengine::TMatrix ws = rtengine::ICCStore::getInstance()->workingSpaceMatrix(workingProfile); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + Y[y][x] = rtengine::Color::rgbLuminance(R[y][x], G[y][x], B[y][x], ws); + } + } + + int detail = rtengine::LIM(params.regularization + 5, 0, 5); + int radius = detail / scale + 0.5; + float epsilon2 = 0.01f + 0.002f * rtengine::max(detail - 3, 0); + + if (radius > 0) { + rtengine::guidedFilterLog(10.f, Y, radius, epsilon2, multithread); + } + + if (params.regularization > 0) { + array2D Y2(W, H); + constexpr float base_epsilon = 0.02f; + constexpr float base_posterization = 5.f; + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + float l = rtengine::LIM(log2(rtengine::max(Y[y][x], 1e-9f)), centers[0], centers[11]); + float ll = round(l * base_posterization) / base_posterization; + Y2[y][x] = Y[y][x]; + Y[y][x] = exp2(ll); + } + } + + radius = 350.0 / scale; + epsilon2 = base_epsilon / float(6 - rtengine::min(params.regularization, 5)); + rtengine::guidedFilter(Y2, Y, Y, radius, epsilon2, multithread); + } + + const auto gauss = + [](float b, float x) -> float { + return xexpf((-rtengine::SQR(x - b) / 4.0f)); + }; + + // For every pixel luminance, the sum of the gaussian masks + float w_sum = 0.f; + + for (int i = 0; i < 12; ++i) { + w_sum += gauss(centers[i], 0.f); + } + + constexpr float luma_lo = -14.f; + constexpr float luma_hi = 4.f; + + const auto process_pixel = + [&](float y) -> float { + // convert to log space + const float luma = rtengine::LIM(log2(rtengine::max(y, 0.f)), luma_lo, luma_hi); + + // build the correction as the sum of the contribution of each + // luminance channel to current pixel + float correction = 0.0f; + + for (int c = 0; c < 12; ++c) + { + correction += gauss(centers[c], luma) * factors[c]; + } + + correction /= w_sum; + + return correction; + }; + + std::vector> cur_colormap; + if (params.show_colormap) { + rtengine::lcmsMutex->lock(); + cmsHPROFILE in = rtengine::ICCStore::getInstance()->getsRGBProfile(); + cmsHPROFILE out = rtengine::ICCStore::getInstance()->workingSpace(workingProfile); + cmsHTRANSFORM xform = cmsCreateTransform(in, TYPE_RGB_FLT, out, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); + rtengine::lcmsMutex->unlock(); + + for (auto &c : colormap) { + cur_colormap.push_back(c); + auto &cc = cur_colormap.back(); + cmsDoTransform(xform, &cc[0], &cc[0], 1); + } + + cmsDeleteTransform(xform); + } + + const auto process_colormap = + [&](float y) -> std::array + { + std::array ret = { 0.f, 0.f, 0.f }; + + // convert to log space + const float luma = rtengine::LIM(log2(rtengine::max(y, 0.f)), luma_lo, luma_hi); + + // build the correction as the sum of the contribution of each + // luminance channel to current pixel + for (int c = 0; c < 12; ++c) { + float w = gauss(centers[c], luma); + for (int i = 0; i < 3; ++i) { + ret[i] += w * cur_colormap[c][i]; + } + } + for (int i = 0; i < 3; ++i) { + ret[i] = rtengine::LIM01(ret[i] / w_sum); + } + + return ret; + }; + + +#ifdef __SSE2__ + vfloat vfactors[12]; + vfloat vcenters[12]; + + for (int i = 0; i < 12; ++i) { + vfactors[i] = F2V(factors[i]); + vcenters[i] = F2V(centers[i]); + } + + const auto vgauss = + [](vfloat b, vfloat x) -> vfloat { + static const vfloat fourv = F2V(4.f); + return xexpf((-rtengine::SQR(x - b) / fourv)); + }; + + vfloat zerov = F2V(0.f); + vfloat vw_sum = F2V(w_sum); + + const vfloat vluma_lo = F2V(luma_lo); + const vfloat vluma_hi = F2V(luma_hi); + const vfloat xlog2v = F2V(xlogf(2.f)); + + const auto vprocess_pixel = + [&](vfloat y) -> vfloat { + const vfloat luma = vminf(vmaxf(xlogf(vmaxf(y, zerov)) / xlog2v, vluma_lo), vluma_hi); + + vfloat correction = zerov; + + for (int c = 0; c < 12; ++c) + { + correction += vgauss(vcenters[c], luma) * vfactors[c]; + } + + correction /= vw_sum; + + return correction; + }; + + + vfloat v1 = F2V(1.f); + vfloat v65535 = F2V(65535.f); +#endif // __SSE2__ + + + if (params.show_colormap) { + LUTf lut_r(65537), lut_g(65537), lut_b(65537); + for (int i = 0; i < 65536; ++i) { + float y = float(i)/65535.f; + auto rgb = process_colormap(y); + lut_r[i] = rgb[0]; + lut_g[i] = rgb[1]; + lut_b[i] = rgb[2]; + } + lut_r[65536] = cur_colormap.back()[0]; + lut_g[65536] = cur_colormap.back()[1]; + lut_b[65536] = cur_colormap.back()[2]; + +#ifdef _OPENMP +# pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + float cY = Y[y][x] * 65535.f; + R[y][x] = lut_r[cY]; + G[y][x] = lut_g[cY]; + B[y][x] = lut_b[cY]; + } + } + return; + } + + + LUTf lut(65536); + + for (int i = 0; i < 65536; ++i) { + float y = float(i) / 65535.f; + float c = process_pixel(y); + lut[i] = c; + } + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; ++y) { + int x = 0; + + +#ifdef __SSE2__ + + for (; x < W - 3; x += 4) { + vfloat cY = LVFU(Y[y][x]); + vmask m = vmaskf_gt(cY, v1); + vfloat corr; + + if (_mm_movemask_ps((vfloat)m)) { + corr = vprocess_pixel(cY); + } else { + corr = lut[cY * v65535]; + } + + STVF(R[y][x], LVF(R[y][x]) * corr); + STVF(G[y][x], LVF(G[y][x]) * corr); + STVF(B[y][x], LVF(B[y][x]) * corr); + } + +#endif // __SSE2__ + + for (; x < W; ++x) { + float cY = Y[y][x]; + float corr = cY > 1.f ? process_pixel(cY) : lut[cY * 65535.f]; + R[y][x] *= corr; + G[y][x] *= corr; + B[y][x] *= corr; + } + } + +} + +} + + +namespace rtengine +{ + +void ImProcFunctions::toneEqualizer( + Imagefloat *rgb, + const ToneEqualizerParams ¶ms, + const Glib::ustring &workingProfile, + double scale, + bool multiThread) +{ + if (!params.enabled) { + return; + } + + BENCHFUN + + const float gain = 1.f / 65535.f * std::pow(2.f, -params.pivot); + + rgb->multiply(gain, multiThread); + + const int W = rgb->getWidth(); + const int H = rgb->getHeight(); + + array2D R(W, H, rgb->r.ptrs, ARRAY2D_BYREFERENCE); + array2D G(W, H, rgb->g.ptrs, ARRAY2D_BYREFERENCE); + array2D B(W, H, rgb->b.ptrs, ARRAY2D_BYREFERENCE); + + ::toneEqualizer(R, G, B, params, workingProfile, scale, multiThread); + + rgb->multiply(params.show_colormap ? 65535.f : 1.f/gain, multiThread); +} + +void ImProcFunctions::toneEqualizer(Imagefloat *rgb) +{ + toneEqualizer(rgb, params->toneEqualizer, params->icm.workingProfile, scale, multiThread); +} + +} diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index af513536e..3d384ee62 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -21,6 +21,7 @@ #include "imagefloat.h" #include "improcfun.h" +#include "homogeneouscoordinates.h" #include "procparams.h" #include "rt_math.h" #include "rtengine.h" @@ -86,6 +87,29 @@ float normn (float a, float b, int n) } } +void logEncode(rtengine::Imagefloat *src, rtengine::Imagefloat *dest, bool multiThread) { + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) if(multiThread) +#endif + + for (int y = 0; y < src->getHeight(); ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < src->getWidth() - 3; x += 4) { + STVFU(dest->r(y, x), xlogf1(LVFU(src->r(y, x)))); + STVFU(dest->g(y, x), xlogf1(LVFU(src->g(y, x)))); + STVFU(dest->b(y, x), xlogf1(LVFU(src->b(y, x)))); + } +#endif + for (; x < src->getWidth(); ++x) { + dest->r(y, x) = xlogf1(src->r(y, x)); + dest->g(y, x) = xlogf1(src->g(y, x)); + dest->b(y, x) = xlogf1(src->b(y, x)); + } + } +} + #ifdef __SSE2__ inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) { @@ -111,6 +135,33 @@ inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, g = vhadd(weight * gv); b = vhadd(weight * bv); } + +inline void interpolateTransformCubicLog(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const vfloat w3Vert = F2V(t1Vert * Dy); + const vfloat w2Vert = F2V(t1Vert * Dy - t1Vert + t2Vert); + const vfloat w1Vert = F2V(1.f - (t1Vert * Dy) - t2Vert); + const vfloat w0Vert = F2V(t1Vert - (t1Vert * Dy)); + + const vfloat rv = (w0Vert * LVFU(src->r(ys, xs)) + w1Vert * LVFU(src->r(ys + 1, xs))) + (w2Vert * LVFU(src->r(ys + 2, xs)) + w3Vert * LVFU(src->r(ys + 3, xs))); + const vfloat gv = (w0Vert * LVFU(src->g(ys, xs)) + w1Vert * LVFU(src->g(ys + 1, xs))) + (w2Vert * LVFU(src->g(ys + 2, xs)) + w3Vert * LVFU(src->g(ys + 3, xs))); + const vfloat bv = (w0Vert * LVFU(src->b(ys, xs)) + w1Vert * LVFU(src->b(ys + 1, xs))) + (w2Vert * LVFU(src->b(ys + 2, xs)) + w3Vert * LVFU(src->b(ys + 3, xs))); + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const vfloat weight = _mm_set_ps(t1Hor * Dx, t1Hor * Dx - t1Hor + t2Hor, 1.f - (t1Hor * Dx) - t2Hor, t1Hor - (t1Hor * Dx)); + const vfloat tempv = _mm_setr_ps(vhadd(weight * rv), vhadd(weight * gv), vhadd(weight * bv), 0.f); + const vfloat resultv = xexpf(tempv); + r = mul * resultv[0]; + g = mul * resultv[1]; + b = mul * resultv[2]; +} #else inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) { @@ -143,6 +194,38 @@ inline void interpolateTransformCubic(rtengine::Imagefloat* src, int xs, int ys, g = mul * (gv[0] * w0Hor + gv[1] * w1Hor + gv[2] * w2Hor + gv[3] * w3Hor); b = mul * (bv[0] * w0Hor + bv[1] * w1Hor + bv[2] * w2Hor + bv[3] * w3Hor); } + +inline void interpolateTransformCubicLog(rtengine::Imagefloat* src, int xs, int ys, float Dx, float Dy, float &r, float &g, float &b, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const float w3Vert = t1Vert * Dy; + const float w2Vert = t1Vert * Dy - t1Vert + t2Vert; + const float w1Vert = 1.f - (t1Vert * Dy) - t2Vert; + const float w0Vert = t1Vert - (t1Vert * Dy); + + float rv[4], gv[4], bv[4]; + for (int i = 0; i < 4; ++i) { + rv[i] = w0Vert * src->r(ys, xs + i) + w1Vert * src->r(ys + 1, xs + i) + w2Vert * src->r(ys + 2, xs + i) + w3Vert * src->r(ys + 3, xs + i); + gv[i] = w0Vert * src->g(ys, xs + i) + w1Vert * src->g(ys + 1, xs + i) + w2Vert * src->g(ys + 2, xs + i) + w3Vert * src->g(ys + 3, xs + i); + bv[i] = w0Vert * src->b(ys, xs + i) + w1Vert * src->b(ys + 1, xs + i) + w2Vert * src->b(ys + 2, xs + i) + w3Vert * src->b(ys + 3, xs + i); + } + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const float w3Hor = t1Hor * Dx; + const float w2Hor = t1Hor * Dx - t1Hor + t2Hor; + const float w1Hor = 1.f - (t1Hor * Dx) - t2Hor; + const float w0Hor = t1Hor - (t1Hor * Dx); + + r = mul * xexpf(rv[0] * w0Hor + rv[1] * w1Hor + rv[2] * w2Hor + rv[3] * w3Hor); + g = mul * xexpf(gv[0] * w0Hor + gv[1] * w1Hor + gv[2] * w2Hor + gv[3] * w3Hor); + b = mul * xexpf(bv[0] * w0Hor + bv[1] * w1Hor + bv[2] * w2Hor + bv[3] * w3Hor); +} #endif #ifdef __SSE2__ inline void interpolateTransformChannelsCubic(const float* const* src, int xs, int ys, float Dx, float Dy, float& dest, float mul) @@ -165,6 +248,27 @@ inline void interpolateTransformChannelsCubic(const float* const* src, int xs, i const vfloat weight = _mm_set_ps(t1Hor * Dx, t1Hor * Dx - t1Hor + t2Hor, 1.f - (t1Hor * Dx) - t2Hor, t1Hor - (t1Hor * Dx)); dest = mul * vhadd(weight * cv); } + +inline void interpolateTransformChannelsCubicLog(const float* const* src, int xs, int ys, float Dx, float Dy, float& dest, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const vfloat w3Vert = F2V(t1Vert * Dy); + const vfloat w2Vert = F2V(t1Vert * Dy - t1Vert + t2Vert); + const vfloat w1Vert = F2V(1.f - (t1Vert * Dy) - t2Vert); + const vfloat w0Vert = F2V(t1Vert - (t1Vert * Dy)); + + const vfloat cv = (w0Vert * LVFU(src[ys][xs]) + w1Vert * LVFU(src[ys + 1][xs])) + (w2Vert * LVFU(src[ys + 2][xs]) + w3Vert * LVFU(src[ys + 3][xs])); + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const vfloat weight = _mm_set_ps(t1Hor * Dx, t1Hor * Dx - t1Hor + t2Hor, 1.f - (t1Hor * Dx) - t2Hor, t1Hor - (t1Hor * Dx)); + dest = mul * xexpf(vhadd(weight * cv)); +} #else inline void interpolateTransformChannelsCubic(const float* const* src, int xs, int ys, float Dx, float Dy, float& dest, float mul) { @@ -193,6 +297,34 @@ inline void interpolateTransformChannelsCubic(const float* const* src, int xs, i dest = mul * (cv[0] * w0Hor + cv[1] * w1Hor + cv[2] * w2Hor + cv[3] * w3Hor); } + +inline void interpolateTransformChannelsCubicLog(const float* const* src, int xs, int ys, float Dx, float Dy, float& dest, float mul) +{ + constexpr float A = -0.85f; + + // Vertical + const float t1Vert = A * (Dy - Dy * Dy); + const float t2Vert = (3.f - 2.f * Dy) * Dy * Dy; + const float w3Vert = t1Vert * Dy; + const float w2Vert = t1Vert * Dy - t1Vert + t2Vert; + const float w1Vert = 1.f - (t1Vert * Dy) - t2Vert; + const float w0Vert = t1Vert - (t1Vert * Dy); + + float cv[4]; + for (int i = 0; i < 4; ++i) { + cv[i] = w0Vert * src[ys][xs + i] + w1Vert * src[ys + 1][xs + i] + w2Vert * src[ys + 2][xs + i] + w3Vert * src[ys + 3][xs + i]; + } + + // Horizontal + const float t1Hor = A * (Dx - Dx * Dx); + const float t2Hor = (3.f - 2.f * Dx) * Dx * Dx; + const float w3Hor = t1Hor * Dx; + const float w2Hor = t1Hor * Dx - t1Hor + t2Hor; + const float w1Hor = 1.f - (t1Hor * Dx) - t2Hor; + const float w0Hor = t1Hor - (t1Hor * Dx); + + dest = mul * xexpf(cv[0] * w0Hor + cv[1] * w1Hor + cv[2] * w2Hor + cv[3] * w3Hor); +} #endif } @@ -203,10 +335,96 @@ namespace rtengine #define CLIPTOC(a,b,c,d) ((a)>=(b)?((a)<=(c)?(a):(d=true,(c))):(d=true,(b))) +/** + * Creates an inverse transformation matrix for camera-geometry-based + * perspective correction. Unless otherwise specified, units are the same as the + * units of the vectors which the matrix will transform. The projection_* + * parameters are applied in the order they appear. + * @param camera_focal_length Camera's focal length. + * @param camera_shift_horiz Camera lens's shift to the right. + * @param camera_shift_vert Camera lens's shift upwards. + * @param camera_roll Camera's roll in radians. Counter-clockwise is positive. + * @param camera_pitch Camera's pitch in radians. Up is positive. + * @param camera_yaw Camera's yaw in radians. Right is positive. + * Up is positive. + * @param projection_shift_horiz Shift of perspective-corrected image to the + * right. + * @param projection_shift_vert Shift of perspective-corrected image upwards. + * @param projection_rotate Rotation of perspective-corrected image + * counter-clockwise in radians. + * @param projection_yaw Yaw in radians of simulated perspective distortion. + * Right is positive. + * @param projection_pitch Pitch in radians of simulated perspective distortion. + * Up is positive. + * @param projection_scale Scale factor of perspective-corrected image. + */ +homogeneous::Matrix perspectiveMatrix(double camera_focal_length, double + camera_shift_horiz, double camera_shift_vert, double camera_roll, double + camera_pitch, double camera_yaw, double projection_yaw, double + projection_pitch, double projection_rotate, double + projection_shift_horiz, double projection_shift_vert, double + projection_scale) +{ + const double projection_scale_inverse = 1.0 / projection_scale; + homogeneous::Vector center; + center[0] = 0; + center[1] = 0; + center[2] = camera_focal_length; + center[3] = 1; + + // Locations of image center after rotations. + const homogeneous::Vector camera_center_yaw_pitch = + homogeneous::rotationMatrix(camera_yaw, homogeneous::Axis::Y) * + homogeneous::rotationMatrix(camera_pitch, homogeneous::Axis::X) * + center; + const homogeneous::Vector projection_center_yaw_pitch = + homogeneous::rotationMatrix(-projection_yaw, homogeneous::Axis::Y) * + homogeneous::rotationMatrix(-projection_pitch, homogeneous::Axis::X) * + center; + + // The following comments refer to the forward transformation. + const homogeneous::Matrix matrix = + // Lens/sensor shift and move to z == camera_focal_length. + homogeneous::translationMatrix(-camera_shift_horiz, + -camera_shift_vert, -camera_focal_length) * + // Camera roll. + homogeneous::rotationMatrix(camera_roll, homogeneous::Axis::Z) * + // Perspective correction. + homogeneous::projectionMatrix(camera_focal_length, homogeneous::Axis::Z) * + homogeneous::rotationMatrix(-camera_pitch, homogeneous::Axis::X) * + homogeneous::rotationMatrix(-camera_yaw, homogeneous::Axis::Y) * + // Re-center after perspective rotation. + homogeneous::translationMatrix(camera_center_yaw_pitch[0], + camera_center_yaw_pitch[1], camera_center_yaw_pitch[2] - camera_focal_length) * + // Translate corrected image. + homogeneous::translationMatrix(-projection_shift_horiz, + -projection_shift_vert, 0) * + // Rotate corrected image. + homogeneous::rotationMatrix(projection_rotate, homogeneous::Axis::Z) * + // Un-center for perspective rotation. + homogeneous::translationMatrix(projection_center_yaw_pitch[0], + projection_center_yaw_pitch[1], camera_focal_length - projection_center_yaw_pitch[2]) * + // Simulate perspective transformation. + homogeneous::projectionMatrix(projection_center_yaw_pitch[2], homogeneous::Axis::Z) * + homogeneous::rotationMatrix(projection_yaw, homogeneous::Axis::Y) * + homogeneous::rotationMatrix(projection_pitch, homogeneous::Axis::X) * + // Move to z == 0. + homogeneous::translationMatrix(0, 0, camera_focal_length) * + // Scale corrected image. + homogeneous::scaleMatrix(projection_scale_inverse, + projection_scale_inverse, 1); + + return matrix; +} + bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, std::vector &red, std::vector &green, std::vector &blue, double ascaleDef, const LensCorrection *pLCPMap) const { + enum PerspType { NONE, SIMPLE, CAMERA_BASED }; + const PerspType perspectiveType = needsPerspective() ? ( + (params->perspective.method == "camera_based") ? + PerspType::CAMERA_BASED : PerspType::SIMPLE ) : PerspType::NONE; bool clipped = false; red.clear (); @@ -236,41 +454,69 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector &src, double cost = cos (params->rotate.degree * rtengine::RT_PI / 180.0); double sint = sin (params->rotate.degree * rtengine::RT_PI / 180.0); - // auxiliary variables for vertical perspective correction + double ascale = ascaleDef > 0 ? ascaleDef : (params->commonTrans.autofill && params->perspective.render ? getTransformAutoFill (oW, oH, pLCPMap) : 1.0); + + // auxiliary variables for perspective correction + // Simple. double vpdeg = params->perspective.vertical / 100.0 * 45.0; double vpalpha = (90.0 - vpdeg) / 180.0 * rtengine::RT_PI; double vpteta = fabs (vpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos ((vpdeg > 0 ? 1.0 : -1.0) * sqrt ((-oW * oW * tan (vpalpha) * tan (vpalpha) + (vpdeg > 0 ? 1.0 : -1.0) * oW * tan (vpalpha) * sqrt (16 * maxRadius * maxRadius + oW * oW * tan (vpalpha) * tan (vpalpha))) / (maxRadius * maxRadius * 8))); double vpcospt = (vpdeg >= 0 ? 1.0 : -1.0) * cos (vpteta), vptanpt = tan (vpteta); - - // auxiliary variables for horizontal perspective correction double hpdeg = params->perspective.horizontal / 100.0 * 45.0; double hpalpha = (90.0 - hpdeg) / 180.0 * rtengine::RT_PI; double hpteta = fabs (hpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos ((hpdeg > 0 ? 1.0 : -1.0) * sqrt ((-oH * oH * tan (hpalpha) * tan (hpalpha) + (hpdeg > 0 ? 1.0 : -1.0) * oH * tan (hpalpha) * sqrt (16 * maxRadius * maxRadius + oH * oH * tan (hpalpha) * tan (hpalpha))) / (maxRadius * maxRadius * 8))); double hpcospt = (hpdeg >= 0 ? 1.0 : -1.0) * cos (hpteta), hptanpt = tan (hpteta); - - double ascale = ascaleDef > 0 ? ascaleDef : (params->commonTrans.autofill ? getTransformAutoFill (oW, oH, pLCPMap) : 1.0); + // Camera-based. + const double f = + ((params->perspective.camera_focal_length > 0) ? params->perspective.camera_focal_length : PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH) + * ((params->perspective.camera_crop_factor > 0) ? params->perspective.camera_crop_factor : PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR) + * (maxRadius / sqrt(18.0*18.0 + 12.0*12.0)); + const double p_camera_yaw = params->perspective.camera_yaw / 180.0 * rtengine::RT_PI; + const double p_camera_pitch = params->perspective.camera_pitch / 180.0 * rtengine::RT_PI; + const double p_camera_roll = params->perspective.camera_roll * rtengine::RT_PI_180; + const double p_camera_shift_horiz = oW / 100.0 * params->perspective.camera_shift_horiz; + const double p_camera_shift_vert = oH / -100.0 * params->perspective.camera_shift_vert; + const double p_projection_shift_horiz = oW / 100.0 * params->perspective.projection_shift_horiz; + const double p_projection_shift_vert = oH / -100.0 * params->perspective.projection_shift_vert; + const double p_projection_rotate = params->perspective.projection_rotate * rtengine::RT_PI_180; + const double p_projection_yaw = -params->perspective.projection_yaw * rtengine::RT_PI_180; + const double p_projection_pitch = -params->perspective.projection_pitch * rtengine::RT_PI_180; + const double p_projection_scale = 1; + const homogeneous::Matrix p_matrix = perspectiveMatrix(f, + p_camera_shift_horiz, p_camera_shift_vert, p_camera_roll, + p_camera_pitch, p_camera_yaw, p_projection_yaw, p_projection_pitch, + p_projection_rotate, p_projection_shift_horiz, + p_projection_shift_vert, p_projection_scale); for (size_t i = 0; i < src.size(); i++) { double x_d = src[i].x, y_d = src[i].y; - if (pLCPMap && params->lensProf.useDist) { - pLCPMap->correctDistortion(x_d, y_d, 0, 0, ascale); - } else { - x_d *= ascale; - y_d *= ascale; + y_d = ascale * (y_d - h2); // centering x coord & scale + x_d = ascale * (x_d - w2); // centering x coord & scale + + switch (perspectiveType) { + case PerspType::NONE: + break; + case PerspType::SIMPLE: + // horizontal perspective transformation + y_d *= maxRadius / (maxRadius + x_d * hptanpt); + x_d *= maxRadius * hpcospt / (maxRadius + x_d * hptanpt); + + // vertical perspective transformation + x_d *= maxRadius / (maxRadius - y_d * vptanpt); + y_d *= maxRadius * vpcospt / (maxRadius - y_d * vptanpt); + break; + case PerspType::CAMERA_BASED: + const double w = p_matrix[3][0] * x_d + p_matrix[3][1] * y_d + p_matrix[3][3]; + const double xw = p_matrix[0][0] * x_d + p_matrix[0][1] * y_d + p_matrix[0][3]; + const double yw = p_matrix[1][0] * x_d + p_matrix[1][1] * y_d + p_matrix[1][3]; + x_d = xw / w; + y_d = yw / w; + break; } - x_d += ascale * (0 - w2); // centering x coord & scale - y_d += ascale * (0 - h2); // centering y coord & scale - - if (needsPerspective()) { - // horizontal perspective transformation - y_d *= maxRadius / (maxRadius + x_d * hptanpt); - x_d *= maxRadius * hpcospt / (maxRadius + x_d * hptanpt); - - // vertical perspective transformation - x_d *= maxRadius / (maxRadius - y_d * vptanpt); - y_d *= maxRadius * vpcospt / (maxRadius - y_d * vptanpt); + if (pLCPMap && params->lensProf.useDist) { + pLCPMap->correctDistortion(x_d, y_d, w2, h2); } // rotate @@ -405,7 +651,7 @@ bool ImProcFunctions::transCoord (int W, int H, int x, int y, int w, int h, int& void ImProcFunctions::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) + int rawRotationDeg, bool fullImage, bool useOriginalBuffer) { double focalLen = metadata->getFocalLen(); double focalLen35mm = metadata->getFocalLen35mm(); @@ -449,14 +695,14 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, // 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())); + tmpimg.reset(new Imagefloat(transformed->getWidth(), transformed->getHeight())); dest = tmpimg.get(); } } - transformGeneral(highQuality, original, dest, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get()); + transformGeneral(highQuality, original, dest, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get(), useOriginalBuffer); if (highQuality && dest != transformed) { - transformLCPCAOnly(dest, transformed, cx, cy, pLCPMap.get()); + transformLCPCAOnly(dest, transformed, cx, cy, pLCPMap.get(), useOriginalBuffer); } } } @@ -558,17 +804,17 @@ static void calcGradientParams (int oW, int oH, const GradientParams& gradient, gp.ta = tan (gradient_angle); gp.xc = w * gradient_center_x; gp.yc = h * gradient_center_y; - gp.ys = sqrt ((float)h * h + (float)w * w) * (gradient_span / cos (gradient_angle)); - gp.ys_inv = 1.0 / gp.ys; - gp.top_edge_0 = gp.yc - gp.ys / 2.0; + gp.ys = rtengine::norm2(static_cast(h), static_cast(w)) * (gradient_span / cos(gradient_angle)); + gp.ys_inv = 1.f / gp.ys; + gp.top_edge_0 = gp.yc - gp.ys / 2.f; - if (gp.ys < 1.0 / h) { + if (h * gp.ys < 1.f) { gp.ys_inv = 0; gp.ys = 0; } } -static float calcGradientFactor (const struct grad_params& gp, int x, int y) +float ImProcFunctions::calcGradientFactor (const struct grad_params& gp, int x, int y) { if (gp.angle_is_zero) { int gy = gp.transpose ? x : y; @@ -592,7 +838,7 @@ static float calcGradientFactor (const struct grad_params& gp, int x, int y) val = 1.f - pow3 (xcosf (val)); } - return gp.scale + val * (1.0 - gp.scale); + return gp.scale + val * (1.f - gp.scale); } } else { int gy = gp.transpose ? x : y; @@ -616,7 +862,7 @@ static float calcGradientFactor (const struct grad_params& gp, int x, int y) val = 1.f - pow3 (xcosf (val)); } - return gp.scale + val * (1.0 - gp.scale); + return gp.scale + val * (1.f - gp.scale); } } } @@ -635,7 +881,7 @@ static void calcPCVignetteParams (int fW, int fH, int oW, int oH, const PCVignet { // ellipse formula: (x/a)^2 + (y/b)^2 = 1 - double roundness = pcvignette.roundness / 100.0; + float roundness = pcvignette.roundness / 100.f; pcv.feather = pcvignette.feather / 100.0; if (crop.enabled) { @@ -652,42 +898,40 @@ static void calcPCVignetteParams (int fW, int fH, int oW, int oH, const PCVignet pcv.h = oH; } - pcv.fadeout_mul = 1.0 / (0.05 * sqrtf (oW * oW + oH * oH)); + pcv.fadeout_mul = 20.0 / rtengine::norm2(static_cast(oW), static_cast(oW)); float short_side = (pcv.w < pcv.h) ? pcv.w : pcv.h; float long_side = (pcv.w > pcv.h) ? pcv.w : pcv.h; pcv.sep = 2; pcv.sepmix = 0; - pcv.oe_a = sqrt (2.0) * long_side * 0.5; + pcv.oe_a = std::sqrt(2.f) * long_side * 0.5f; pcv.oe_b = pcv.oe_a * short_side / long_side; - pcv.ie_mul = (1.0 / sqrt (2.0)) * (1.0 - pcv.feather); + pcv.ie_mul = (1.f - pcv.feather) / std::sqrt(2.f); pcv.is_super_ellipse_mode = false; pcv.is_portrait = (pcv.w < pcv.h); - if (roundness < 0.5) { + if (roundness < 0.5f) { // make super-ellipse of higher and higher degree pcv.is_super_ellipse_mode = true; - float sepf = 2 + 4 * powf (1.0 - 2 * roundness, 1.3); // gamma 1.3 used to balance the effect in the 0.0...0.5 roundness range + float sepf = 2 + 4 * std::pow(1.f - 2 * roundness, 1.3f); // gamma 1.3 used to balance the effect in the 0.0...0.5 roundness range pcv.sep = ((int)sepf) & ~0x1; - pcv.sepmix = (sepf - pcv.sep) * 0.5; // 0.0 to 1.0 - pcv.oe1_a = powf (2.0, 1.0 / pcv.sep) * long_side * 0.5; + pcv.sepmix = (sepf - pcv.sep) * 0.5f; // 0.0 to 1.0 + pcv.oe1_a = std::pow(2.f, 1.f / pcv.sep) * long_side * 0.5f; pcv.oe1_b = pcv.oe1_a * short_side / long_side; - pcv.ie1_mul = (1.0 / powf (2.0, 1.0 / pcv.sep)) * (1.0 - pcv.feather); - pcv.oe2_a = powf (2.0, 1.0 / (pcv.sep + 2)) * long_side * 0.5; + pcv.ie1_mul = (1.f - pcv.feather) / std::pow(2.f, 1.f / pcv.sep); + pcv.oe2_a = std::pow(2.f, 1.f / (pcv.sep + 2)) * long_side * 0.5f; pcv.oe2_b = pcv.oe2_a * short_side / long_side; - pcv.ie2_mul = (1.0 / powf (2.0, 1.0 / (pcv.sep + 2))) * (1.0 - pcv.feather); - } - - if (roundness > 0.5) { + pcv.ie2_mul = (1.f - pcv.feather) / std::pow(2.f, 1.f / (pcv.sep + 2)); + } else if (roundness > 0.5f) { // scale from fitted ellipse towards circle - float rad = sqrtf (pcv.w * pcv.w + pcv.h * pcv.h) / 2.0; + float rad = rtengine::norm2(static_cast(pcv.w), static_cast(pcv.h)) / 2.f; float diff_a = rad - pcv.oe_a; float diff_b = rad - pcv.oe_b; - pcv.oe_a = pcv.oe_a + diff_a * 2 * (roundness - 0.5); - pcv.oe_b = pcv.oe_b + diff_b * 2 * (roundness - 0.5); + pcv.oe_a = pcv.oe_a + diff_a * 2 * (roundness - 0.5f); + pcv.oe_b = pcv.oe_b + diff_b * 2 * (roundness - 0.5f); } - pcv.scale = powf (2, -pcvignette.strength); + pcv.scale = std::pow(2, -pcvignette.strength); if (pcvignette.strength >= 6.0) { pcv.scale = 0.0; @@ -823,38 +1067,42 @@ void ImProcFunctions::transformLuminanceOnly (Imagefloat* original, Imagefloat* double r = sqrt (vig_x_d * vig_x_d + vig_y_d * vig_y_d); if (darkening) { - factor /= std::max (v + mul * tanh (b * (maxRadius - r) / maxRadius), 0.001); + factor /= std::max (v + mul * tanh(b * (maxRadius - r) / maxRadius), 0.001); } else { - factor = v + mul * tanh (b * (maxRadius - r) / maxRadius); + factor = v + mul * tanh(b * (maxRadius - r) / maxRadius); } } if (applyGradient) { - factor *= calcGradientFactor (gp, cx + x, cy + y); + factor *= static_cast(calcGradientFactor(gp, cx + x, cy + y)); } if (applyPCVignetting) { - factor *= calcPCVignetteFactor (pcv, cx + x, cy + y); + factor *= static_cast(calcPCVignetteFactor(pcv, cx + x, cy + y)); } - transformed->r (y, x) = original->r (y, x) * factor; - transformed->g (y, x) = original->g (y, x) * factor; - transformed->b (y, x) = original->b (y, x) * factor; + transformed->r(y, x) = static_cast(original->r(y, x)) * factor; + transformed->g(y, x) = static_cast(original->g(y, x)) * factor; + transformed->b(y, x) = static_cast(original->b(y, x)) * factor; } } } -void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap) +void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap, bool useOriginalBuffer) { + // set up stuff, depending on the mode we are + enum PerspType { NONE, SIMPLE, CAMERA_BASED }; const bool enableLCPDist = pLCPMap && params->lensProf.useDist; const bool enableCA = highQuality && needsCA(); const bool enableGradient = needsGradient(); const bool enablePCVignetting = needsPCVignetting(); const bool enableVignetting = needsVignetting(); - const bool enablePerspective = needsPerspective(); const bool enableDistortion = needsDistortion(); + const PerspType perspectiveType = needsPerspective() ? ( + (params->perspective.method == "camera_based") ? + PerspType::CAMERA_BASED : PerspType::SIMPLE ) : PerspType::NONE; const double w2 = static_cast(oW) / 2.0 - 0.5; const double h2 = static_cast(oH) / 2.0 - 0.5; @@ -874,11 +1122,6 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I calcPCVignetteParams(fW, fH, oW, oH, params->pcvignette, params->crop, pcv); } - const std::array chOrig = { - original->r.ptrs, - original->g.ptrs, - original->b.ptrs - }; const std::array chTrans = { transformed->r.ptrs, transformed->g.ptrs, @@ -903,28 +1146,66 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const double cost = cos(params->rotate.degree * rtengine::RT_PI / 180.0); const double sint = sin(params->rotate.degree * rtengine::RT_PI / 180.0); - // auxiliary variables for vertical perspective correction + // auxiliary variables for perspective correction + // Simple. const double vpdeg = params->perspective.vertical / 100.0 * 45.0; const double vpalpha = (90.0 - vpdeg) / 180.0 * rtengine::RT_PI; const double vpteta = fabs(vpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((vpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oW * tan(vpalpha)) + (vpdeg > 0 ? 1.0 : -1.0) * oW * tan(vpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oW * tan(vpalpha)))) / (SQR(maxRadius) * 8))); const double vpcospt = (vpdeg >= 0 ? 1.0 : -1.0) * cos(vpteta); const double vptanpt = tan(vpteta); - - // auxiliary variables for horizontal perspective correction const double hpdeg = params->perspective.horizontal / 100.0 * 45.0; const double hpalpha = (90.0 - hpdeg) / 180.0 * rtengine::RT_PI; const double hpteta = fabs(hpalpha - rtengine::RT_PI / 2) < 3e-4 ? 0.0 : acos((hpdeg > 0 ? 1.0 : -1.0) * sqrt((-SQR(oH * tan(hpalpha)) + (hpdeg > 0 ? 1.0 : -1.0) * oH * tan(hpalpha) * sqrt(SQR(4 * maxRadius) + SQR(oH * tan(hpalpha)))) / (SQR(maxRadius) * 8))); const double hpcospt = (hpdeg >= 0 ? 1.0 : -1.0) * cos(hpteta); const double hptanpt = tan(hpteta); + // Camera-based. + const double f = + ((params->perspective.camera_focal_length > 0) ? params->perspective.camera_focal_length : PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH) + * ((params->perspective.camera_crop_factor > 0) ? params->perspective.camera_crop_factor : PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR) + * (maxRadius / sqrt(18.0*18.0 + 12.0*12.0)); + const double p_camera_yaw = params->perspective.camera_yaw / 180.0 * rtengine::RT_PI; + const double p_camera_pitch = params->perspective.camera_pitch / 180.0 * rtengine::RT_PI; + const double p_camera_roll = params->perspective.camera_roll * rtengine::RT_PI_180; + const double p_camera_shift_horiz = oW / 100.0 * params->perspective.camera_shift_horiz; + const double p_camera_shift_vert = oH / -100.0 * params->perspective.camera_shift_vert; + const double p_projection_shift_horiz = oW / 100.0 * params->perspective.projection_shift_horiz; + const double p_projection_shift_vert = oH / -100.0 * params->perspective.projection_shift_vert; + const double p_projection_rotate = params->perspective.projection_rotate * rtengine::RT_PI_180; + const double p_projection_yaw = -params->perspective.projection_yaw * rtengine::RT_PI_180; + const double p_projection_pitch = -params->perspective.projection_pitch * rtengine::RT_PI_180; + const double p_projection_scale = 1; + const homogeneous::Matrix p_matrix = perspectiveMatrix(f, + p_camera_shift_horiz, p_camera_shift_vert, p_camera_roll, + p_camera_pitch, p_camera_yaw, p_projection_yaw, p_projection_pitch, + p_projection_rotate, p_projection_shift_horiz, + p_projection_shift_vert, p_projection_scale); - const double ascale = params->commonTrans.autofill ? getTransformAutoFill(oW, oH, pLCPMap) : 1.0; + const double ascale = params->commonTrans.autofill && params->perspective.render ? getTransformAutoFill(oW, oH, pLCPMap) : 1.0; const bool darkening = (params->vignetting.amount <= 0.0); + const bool useLog = params->commonTrans.method == "log" && highQuality; const double centerFactorx = cx - w2; const double centerFactory = cy - h2; + std::unique_ptr tempLog; + if (useLog) { + if (!useOriginalBuffer) { + tempLog.reset(new Imagefloat(original->getWidth(), original->getHeight())); + logEncode(original, tempLog.get(), multiThread); + original = tempLog.get(); + } else { + logEncode(original, original, multiThread); + } + } + + const std::array chOrig = { + original->r.ptrs, + original->g.ptrs, + original->b.ptrs + }; + // main cycle #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 16) if(multiThread) @@ -935,24 +1216,32 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I double x_d = x; double y_d = y; - if (enableLCPDist) { - pLCPMap->correctDistortion(x_d, y_d, cx, cy, ascale); // must be first transform - } else { - x_d *= ascale; - y_d *= ascale; + x_d = ascale * (x_d + centerFactorx); // centering x coord & scale + y_d = ascale * (y_d + centerFactory); // centering y coord & scale + + switch (perspectiveType) { + case PerspType::NONE: + break; + case PerspType::SIMPLE: + // horizontal perspective transformation + y_d *= maxRadius / (maxRadius + x_d * hptanpt); + x_d *= maxRadius * hpcospt / (maxRadius + x_d * hptanpt); + + // vertical perspective transformation + x_d *= maxRadius / (maxRadius - y_d * vptanpt); + y_d *= maxRadius * vpcospt / (maxRadius - y_d * vptanpt); + break; + case PerspType::CAMERA_BASED: + const double w = p_matrix[3][0] * x_d + p_matrix[3][1] * y_d + p_matrix[3][3]; + const double xw = p_matrix[0][0] * x_d + p_matrix[0][1] * y_d + p_matrix[0][3]; + const double yw = p_matrix[1][0] * x_d + p_matrix[1][1] * y_d + p_matrix[1][3]; + x_d = xw / w; + y_d = yw / w; + break; } - x_d += ascale * centerFactorx; // centering x coord & scale - y_d += ascale * centerFactory; // centering y coord & scale - - if (enablePerspective) { - // horizontal perspective transformation - y_d *= maxRadius / (maxRadius + x_d * hptanpt); - x_d *= maxRadius * hpcospt / (maxRadius + x_d * hptanpt); - - // vertical perspective transformation - x_d *= maxRadius / (maxRadius - y_d * vptanpt); - y_d *= maxRadius * vpcospt / (maxRadius - y_d * vptanpt); + if (enableLCPDist) { + pLCPMap->correctDistortion(x_d, y_d, w2, h2); } // rotate @@ -1002,23 +1291,31 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } if (enableGradient) { - vignmul *= calcGradientFactor(gp, cx + x, cy + y); + vignmul *= static_cast(calcGradientFactor(gp, cx + x, cy + y)); } if (enablePCVignetting) { - vignmul *= calcPCVignetteFactor(pcv, cx + x, cy + y); + vignmul *= static_cast(calcPCVignetteFactor(pcv, cx + x, cy + y)); } if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { // all interpolation pixels inside image - if (enableCA) { - interpolateTransformChannelsCubic(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); - } else if (!highQuality) { + if (!highQuality) { transformed->r(y, x) = vignmul * (original->r(yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->r(yc, xc + 1) * Dx * (1.0 - Dy) + original->r(yc + 1, xc) * (1.0 - Dx) * Dy + original->r(yc + 1, xc + 1) * Dx * Dy); transformed->g(y, x) = vignmul * (original->g(yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->g(yc, xc + 1) * Dx * (1.0 - Dy) + original->g(yc + 1, xc) * (1.0 - Dx) * Dy + original->g(yc + 1, xc + 1) * Dx * Dy); transformed->b(y, x) = vignmul * (original->b(yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->b(yc, xc + 1) * Dx * (1.0 - Dy) + original->b(yc + 1, xc) * (1.0 - Dx) * Dy + original->b(yc + 1, xc + 1) * Dx * Dy); + } else if (!useLog) { + if (enableCA) { + interpolateTransformChannelsCubic(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); + } else { + interpolateTransformCubic(original, xc - 1, yc - 1, Dx, Dy, transformed->r(y, x), transformed->g(y, x), transformed->b(y, x), vignmul); + } } else { - interpolateTransformCubic(original, xc - 1, yc - 1, Dx, Dy, transformed->r(y, x), transformed->g(y, x), transformed->b(y, x), vignmul); + if (enableCA) { + interpolateTransformChannelsCubicLog(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], vignmul); + } else { + interpolateTransformCubicLog(original, xc - 1, yc - 1, Dx, Dy, transformed->r(y, x), transformed->g(y, x), transformed->b(y, x), vignmul); + } } } else { // edge pixels @@ -1027,12 +1324,22 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I const int x1 = LIM(xc, 0, original->getWidth() - 1); const int x2 = LIM(xc + 1, 0, original->getWidth() - 1); - if (enableCA) { - chTrans[c][y][x] = vignmul * (chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); + if (useLog) { + if (enableCA) { + chTrans[c][y][x] = vignmul * xexpf(chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); + } else { + transformed->r(y, x) = vignmul * xexpf(original->r(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->r(y1, x2) * Dx * (1.0 - Dy) + original->r(y2, x1) * (1.0 - Dx) * Dy + original->r(y2, x2) * Dx * Dy); + transformed->g(y, x) = vignmul * xexpf(original->g(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->g(y1, x2) * Dx * (1.0 - Dy) + original->g(y2, x1) * (1.0 - Dx) * Dy + original->g(y2, x2) * Dx * Dy); + transformed->b(y, x) = vignmul * xexpf(original->b(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->b(y1, x2) * Dx * (1.0 - Dy) + original->b(y2, x1) * (1.0 - Dx) * Dy + original->b(y2, x2) * Dx * Dy); + } } else { - transformed->r(y, x) = vignmul * (original->r(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->r(y1, x2) * Dx * (1.0 - Dy) + original->r(y2, x1) * (1.0 - Dx) * Dy + original->r(y2, x2) * Dx * Dy); - transformed->g(y, x) = vignmul * (original->g(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->g(y1, x2) * Dx * (1.0 - Dy) + original->g(y2, x1) * (1.0 - Dx) * Dy + original->g(y2, x2) * Dx * Dy); - transformed->b(y, x) = vignmul * (original->b(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->b(y1, x2) * Dx * (1.0 - Dy) + original->b(y2, x1) * (1.0 - Dx) * Dy + original->b(y2, x2) * Dx * Dy); + if (enableCA) { + chTrans[c][y][x] = vignmul * (chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); + } else { + transformed->r(y, x) = vignmul * (original->r(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->r(y1, x2) * Dx * (1.0 - Dy) + original->r(y2, x1) * (1.0 - Dx) * Dy + original->r(y2, x2) * Dx * Dy); + transformed->g(y, x) = vignmul * (original->g(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->g(y1, x2) * Dx * (1.0 - Dy) + original->g(y2, x1) * (1.0 - Dx) * Dy + original->g(y2, x2) * Dx * Dy); + transformed->b(y, x) = vignmul * (original->b(y1, x1) * (1.0 - Dx) * (1.0 - Dy) + original->b(y1, x2) * Dx * (1.0 - Dy) + original->b(y2, x1) * (1.0 - Dx) * Dy + original->b(y2, x2) * Dx * Dy); + } } } } else { @@ -1051,19 +1358,24 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I } -void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *transformed, int cx, int cy, const LensCorrection *pLCPMap) +void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *transformed, int cx, int cy, const LensCorrection *pLCPMap, bool useOriginalBuffer) { assert(pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable()); + const bool useLog = params->commonTrans.method == "log"; - float** chOrig[3]; - chOrig[0] = original->r.ptrs; - chOrig[1] = original->g.ptrs; - chOrig[2] = original->b.ptrs; + float** chTrans[3] = {transformed->r.ptrs, transformed->g.ptrs, transformed->b.ptrs}; - float** chTrans[3]; - chTrans[0] = transformed->r.ptrs; - chTrans[1] = transformed->g.ptrs; - chTrans[2] = transformed->b.ptrs; + std::unique_ptr tempLog; + if (useLog) { + if (!useOriginalBuffer) { + tempLog.reset(new Imagefloat(original->getWidth(), original->getHeight())); + logEncode(original, tempLog.get(), multiThread); + original = tempLog.get(); + } else { + logEncode(original, original, multiThread); + } + } + float** chOrig[3] = {original->r.ptrs, original->g.ptrs, original->b.ptrs}; #ifdef _OPENMP #pragma omp parallel for if (multiThread) @@ -1089,15 +1401,22 @@ void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *trans // multiplier for vignetting correction if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { // all interpolation pixels inside image - interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], 1.0); + if (!useLog) { + interpolateTransformChannelsCubic(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], 1.0); + } else { + interpolateTransformChannelsCubicLog(chOrig[c], xc - 1, yc - 1, Dx, Dy, chTrans[c][y][x], 1.0); + } } else { // edge pixels int y1 = LIM (yc, 0, original->getHeight() - 1); int y2 = LIM (yc + 1, 0, original->getHeight() - 1); int x1 = LIM (xc, 0, original->getWidth() - 1); int x2 = LIM (xc + 1, 0, original->getWidth() - 1); - - chTrans[c][y][x] = (chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); + if (!useLog) { + chTrans[c][y][x] = (chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); + } else { + chTrans[c][y][x] = xexpf(chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); + } } } else { // not valid (source pixel x,y not inside source image, etc.) @@ -1150,7 +1469,20 @@ bool ImProcFunctions::needsRotation () const bool ImProcFunctions::needsPerspective () const { - return params->perspective.horizontal || params->perspective.vertical; + return ( (params->perspective.method == "simple") && + (params->perspective.horizontal || params->perspective.vertical) ) + || ( (params->perspective.method == "camera_based") && + params->perspective.render && ( + params->perspective.camera_pitch || + params->perspective.camera_roll || + params->perspective.camera_shift_horiz || + params->perspective.camera_shift_vert || + params->perspective.camera_yaw || + params->perspective.projection_pitch || + params->perspective.projection_rotate || + params->perspective.projection_shift_horiz || + params->perspective.projection_shift_vert || + params->perspective.projection_yaw) ); } bool ImProcFunctions::needsGradient () const @@ -1178,9 +1510,14 @@ bool ImProcFunctions::needsLensfun() const return params->lensProf.useLensfun(); } -bool ImProcFunctions::needsTransform () const +bool ImProcFunctions::needsTransform (int oW, int oH, int rawRotationDeg, const FramesMetaData *metadata) const { - return needsCA () || needsDistortion () || needsRotation () || needsPerspective () || needsGradient () || needsPCVignetting () || needsVignetting () || needsLCP() || needsLensfun(); + bool needsLf = needsLensfun(); + if (needsLf) { + std::unique_ptr pLCPMap = LFDatabase::getInstance()->findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg); + needsLf = pLCPMap.get(); + } + return needsCA () || needsDistortion () || needsRotation () || needsPerspective () || needsGradient () || needsPCVignetting () || needsVignetting () || needsLCP() || needsLf; } diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index 14e5f3c44..43002c2a3 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -48,7 +48,7 @@ void fillCurveArrayVib (DiagonalCurve* diagCurve, LUTf &outCurve) // change to [0,1] range // apply custom/parametric/NURBS curve, if any // and store result in a temporary array - outCurve[i] = 65535.f * diagCurve->getVal ( double (i) / 65535.0 ); + outCurve[i] = 65535.0 * diagCurve->getVal(i / 65535.0); } } else { outCurve.makeIdentity(); @@ -61,16 +61,16 @@ void fillCurveArrayVib (DiagonalCurve* diagCurve, LUTf &outCurve) * copyright (c)2011 Jacques Desmis and Jean-Christophe Frisch * */ -void ImProcFunctions::vibrance (LabImage* lab) +void ImProcFunctions::vibrance (LabImage* lab, const procparams::VibranceParams &vibranceParams, bool highlight, const Glib::ustring &workingProfile) { - if (!params->vibrance.enabled) { + if (!vibranceParams.enabled) { return; } BENCHFUN // int skip=1; //scale==1 ? 1 : 16; bool skinCurveIsSet = false; - DiagonalCurve* dcurve = new DiagonalCurve (params->vibrance.skintonescurve, CURVES_MIN_POLY_POINTS); + DiagonalCurve* dcurve = new DiagonalCurve (vibranceParams.skintonescurve, CURVES_MIN_POLY_POINTS); if (dcurve) { if (!dcurve->isIdentity()) { @@ -81,7 +81,7 @@ void ImProcFunctions::vibrance (LabImage* lab) } } - if (!skinCurveIsSet && !params->vibrance.pastels && !params->vibrance.saturated) { + if (!skinCurveIsSet && !vibranceParams.pastels && !vibranceParams.saturated) { if (dcurve) { delete dcurve; dcurve = nullptr; @@ -96,10 +96,10 @@ void ImProcFunctions::vibrance (LabImage* lab) // skin hue curve // I use diagonal because I think it's better - const float chromaPastel = params->vibrance.pastels / 100.f; - const float chromaSatur = params->vibrance.saturated / 100.f; + const float chromaPastel = vibranceParams.pastels / 100.f; + const float chromaSatur = vibranceParams.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 limitpastelsatur = (static_cast(vibranceParams.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; @@ -108,7 +108,7 @@ void ImProcFunctions::vibrance (LabImage* lab) const float s0 = limitpastelsatur + maxds; 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; + const float transitionweighting = static_cast(vibranceParams.psthreshold.getBottomLeft()) / 100.f; float chromamean = 0.f; if (chromaPastel != chromaSatur) { @@ -144,6 +144,7 @@ void ImProcFunctions::vibrance (LabImage* lab) if (skinCurveIsSet) { fillCurveArrayVib (dcurve, skin_curve); skin_curve /= ask; +// skin_curve *= 2.f; } if (dcurve) { @@ -151,12 +152,10 @@ void ImProcFunctions::vibrance (LabImage* lab) dcurve = nullptr; } + const bool protectskins = vibranceParams.protectskins; + const bool avoidcolorshift = vibranceParams.avoidcolorshift; - 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.workingProfile); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (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])}, @@ -606,7 +605,7 @@ void ImProcFunctions::vibrance (LabImage* lab) bool inGamut; const float fyy = Color::c1By116 * Lprov + Color::c16By116; - const float yy_ = (Lprov > Color::epskap) ? fyy * fyy*fyy : Lprov / Color::kappaf; + const float yy_ = (Lprov > static_cast(Color::epskap)) ? fyy * fyy*fyy : Lprov / Color::kappaf; float ChprovOld = std::numeric_limits::min(); do { inGamut = true; diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 7c0dc368b..18ee72b80 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -3,7 +3,7 @@ // // // -// code dated: December , 2014 +// code dated: 9 , 2019 // // Ipwaveletcc is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . -// * 2014 Jacques Desmis +// * 2014 - 2019 2020 - Jacques Desmis // * 2014 Ingo Weyrich // @@ -26,15 +26,16 @@ #include #include -#include "../rtgui/threadutils.h" - #include "array2D.h" #include "color.h" #include "curves.h" #include "EdgePreservingDecomposition.h" #include "iccstore.h" #include "improcfun.h" +#include "imagefloat.h" #include "labimage.h" +#include "gauss.h" +#include "boxblur.h" #include "LUT.h" #include "median.h" #include "opthelper.h" @@ -43,33 +44,35 @@ #include "rtengine.h" #include "sleef.h" #include "../rtgui/options.h" - +#include "guidedfilter.h" #ifdef _OPENMP #include #endif #include "cplx_wavelet_dec.h" - -#define TS 64 // Tile size -#define offset 25 // shift between tiles -#define fTS ((TS/2+1)) // second dimension of Fourier tiles -#define blkrad 1 // radius of block averaging - -#define epsilon 0.001f/(TS*TS) //tolerance +#define BENCHMARK +#include "StopWatch.h" namespace rtengine { struct cont_params { float mul[10]; + float sigm; int chrom; int chro; + float chrwav; int contrast; float th; float thH; float conres; float conresH; + float blurres; + float blurcres; + float bluwav; + float radius; float chrores; + bool oldsh; float hueres; float sky; float b_l, t_l, b_r, t_r; @@ -77,10 +80,11 @@ struct cont_params { float b_lsl, t_lsl, b_rsl, t_rsl; float b_lhl, t_lhl, b_rhl, t_rhl; float edg_low, edg_mean, edg_sd, edg_max; - float lev0s, lev0n, lev1s, lev1n, lev2s, lev2n, lev3s, lev3n; + float lev0s, lev0n, lev1s, lev1n, lev2s, lev2n, lev3s, lev3n, lev4n, lev4t; float b_lpast, t_lpast, b_rpast, t_rpast; float b_lsat, t_lsat, b_rsat, t_rsat; int rad; + float eff; int val; int til; int numlevH, numlevS; @@ -92,6 +96,8 @@ struct cont_params { bool opaRG; bool edgcurv; bool diagcurv; + bool denoicurv; + bool denoicurvh; int CHmet; int CHSLmet; int EDmet; @@ -108,9 +114,16 @@ struct cont_params { bool lip3; bool tonemap; bool diag; - int TMmeth; float tmstrength; float balan; + float sigmafin; + float sigmaton; + float sigmacol; + float sigmadir; + int denmet; + int mixmet; + int quamet; + int slimet; int ite; int contmet; bool opaW; @@ -130,56 +143,138 @@ struct cont_params { bool finena; bool toningena; bool noiseena; + bool blena; int maxilev; float edgsens; float edgampl; int neigh; bool lipp; + float ballum; + float balchrom; + float chromfi; + float chromco; + float factor; + float scaling; + float scaledirect; + float a_scale; + float a_base; + float b_scale; + float b_base; + float a_high; + float a_low; + float b_high; + float b_low; + float rangeab; + float protab; + float sigmm; + float sigmm14; + float sigmm56; + float levden; + float thrden; + float limden; + int complex; }; int wavNestedLevels = 1; +std::unique_ptr ImProcFunctions::buildMeaLut(const float inVals[11], const float mea[10], float& lutFactor) +{ + constexpr int lutSize = 100; -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) + const float lutMax = std::ceil(mea[9]); + const float lutDiff = lutMax / lutSize; + + std::vector lutVals(lutSize); + int jStart = 1; + for (int i = 0; i < lutSize; ++i) { + const float val = i * lutDiff; + if (val < mea[0]) { + // still < first value => no interpolation + lutVals[i] = inVals[0]; + } else { + for (int j = jStart; j < 10; ++j) { + if (val == mea[j]) { + // exact match => no interpolation + lutVals[i] = inVals[j]; + ++jStart; + break; + } + if (val < mea[j]) { + // interpolate + const float dist = (val - mea[j - 1]) / (mea[j] - mea[j - 1]); + lutVals[i] = rtengine::intp(dist, inVals[j], inVals[j - 1]); + break; + } + lutVals[i] = inVals[10]; + } + } + } + lutFactor = lutDiff == 0.f ? 0.f : 1.f / lutDiff; + return std::unique_ptr(new LUTf(lutVals)); +} + +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavCurve & wavdenoise, WavCurve & wavdenoiseh, const Wavblcurve & wavblcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveSH & waOpacityCurveSH, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, const LUTf &wavclCurve, int skip) { -#ifdef _DEBUG - // init variables to display Munsell corrections - MunsellDebugInfo* MunsDebugInfo = new MunsellDebugInfo(); -#endif - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); + 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]} }; - const short int imheight = lab->H, imwidth = lab->W; + const int imheight = lab->H, imwidth = lab->W; + int levwavL; + //Flat curve for H=f(H) in final touchup for guidedfilter + FlatCurve* wavguidCurve = new FlatCurve(params->wavelet.wavguidcurve); //curve H=f(H) + bool wavguidutili = false; + + if (!wavguidCurve || wavguidCurve->isIdentity()) { + if (wavguidCurve) { + delete wavguidCurve; + wavguidCurve = nullptr; + } + } else { + wavguidutili = true; + } +//flat curve for equalizer H + FlatCurve* wavhueCurve = new FlatCurve(params->wavelet.wavhuecurve); //curve H=f(H) + bool wavhueutili = false; + + if (!wavhueCurve || wavhueCurve->isIdentity()) { + if (wavhueCurve) { + delete wavhueCurve; + wavhueCurve = nullptr; + } + } else { + wavhueutili = true; + } + struct cont_params cp; + cp.avoi = params->wavelet.avoid; - if(params->wavelet.Medgreinf == "more") { + if (params->wavelet.complexmethod == "normal") { + cp.complex = 0; + } else if (params->wavelet.complexmethod == "expert") { + cp.complex = 1; + } + + + if (params->wavelet.Medgreinf == "more") { cp.reinforce = 1; - } - - if(params->wavelet.Medgreinf == "none") { + } else if (params->wavelet.Medgreinf == "none") { cp.reinforce = 2; - } - - if(params->wavelet.Medgreinf == "less") { + } else if (params->wavelet.Medgreinf == "less") { cp.reinforce = 3; } - if(params->wavelet.NPmethod == "none") { + if (params->wavelet.NPmethod == "none") { cp.lip3 = false; - } - - if(params->wavelet.NPmethod == "low") { + } else if (params->wavelet.NPmethod == "low") { cp.lip3 = true; cp.neigh = 0; - } - - if(params->wavelet.NPmethod == "high") { + } else if (params->wavelet.NPmethod == "high") { cp.lip3 = true; cp.neigh = 1; } @@ -188,35 +283,72 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.diag = params->wavelet.tmr; cp.balan = (float)params->wavelet.balance; cp.ite = params->wavelet.iter; - cp.tonemap = false; + cp.tonemap = params->wavelet.tmrs != 0; cp.bam = false; + cp.sigmafin = params->wavelet.sigmafin; + cp.sigmaton = params->wavelet.sigmaton; + cp.sigmacol = params->wavelet.sigmacol; + cp.sigmadir = params->wavelet.sigmadir; + cp.sigmm = params->wavelet.sigm; + cp.levden = params->wavelet.levden; + cp.thrden = 0.01f * params->wavelet.thrden; + cp.limden = params->wavelet.limden; - if(params->wavelet.tmrs == 0) { - cp.tonemap = false; - } else { - cp.tonemap = true; - } - - if(params->wavelet.TMmethod == "cont") { + if (params->wavelet.TMmethod == "cont") { cp.contmet = 1; - } else if(params->wavelet.TMmethod == "tm") { + } else if (params->wavelet.TMmethod == "tm") { cp.contmet = 2; } - if(params->wavelet.BAmethod != "none") { + + cp.denmet = 4; + //if (params->wavelet.denmethod == "equ") { + // cp.denmet = 0; + //} else if (params->wavelet.denmethod == "high") { + // cp.denmet = 1; + //} else if (params->wavelet.denmethod == "low") { + // cp.denmet = 2; + //} else if (params->wavelet.denmethod == "12high") { + // cp.denmet = 3; + //} else if (params->wavelet.denmethod == "12low") { + // cp.denmet = 4; + //} + + if (params->wavelet.mixmethod == "nois") { + cp.mixmet = 0; + } else if (params->wavelet.mixmethod == "mix") { + cp.mixmet = 1; + } else if (params->wavelet.mixmethod == "mix7") { + cp.mixmet = 2; + } else if (params->wavelet.mixmethod == "den") { + cp.mixmet = 3; + } + + if (params->wavelet.quamethod == "cons") { + cp.quamet = 0; + } else if (params->wavelet.quamethod == "agre") { + cp.quamet = 1; + } + + if (params->wavelet.slimethod == "sli") { + cp.slimet = 0; + } else if (params->wavelet.slimethod == "cur") { + cp.slimet = 1; + } + + if (params->wavelet.BAmethod != "none") { cp.bam = true; + + if (params->wavelet.BAmethod == "sli") { + cp.BAmet = 1; + } else if (params->wavelet.BAmethod == "cur") { + cp.BAmet = 2; + } } - if(params->wavelet.BAmethod == "sli") { - cp.BAmet = 1; - } - - if(params->wavelet.BAmethod == "cur") { - cp.BAmet = 2; - } + cp.sigm = params->wavelet.sigma; cp.tmstrength = params->wavelet.tmrs; - //cp.tonemap = params->wavelet.tmr; cp.contena = params->wavelet.expcontrast; cp.chromena = params->wavelet.expchroma; cp.edgeena = params->wavelet.expedge; @@ -224,16 +356,14 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.finena = params->wavelet.expfinal; cp.toningena = params->wavelet.exptoning; cp.noiseena = params->wavelet.expnoise; + cp.blena = params->wavelet.expbl; + cp.chrwav = 0.01f * params->wavelet.chrwav; - if(params->wavelet.Backmethod == "black") { + if (params->wavelet.Backmethod == "black") { cp.backm = 0; - } - - if(params->wavelet.Backmethod == "grey") { + } else if (params->wavelet.Backmethod == "grey") { cp.backm = 1; - } - - if(params->wavelet.Backmethod == "resid") { + } else if (params->wavelet.Backmethod == "resid") { cp.backm = 2; } @@ -245,60 +375,47 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.edgsens = 60.f; cp.edgampl = 10.f; - if(cp.lipp) { + if (cp.lipp) { cp.edgsens = (float) params->wavelet.edgesensi; cp.edgampl = (float) params->wavelet.edgeampli; } - //int N = imheight * imwidth; - int maxmul = params->wavelet.thres; + const int maxmul = params->wavelet.thres; cp.maxilev = maxmul; static const float scales[10] = {1.f, 2.f, 4.f, 8.f, 16.f, 32.f, 64.f, 128.f, 256.f, 512.f}; float scaleskip[10]; - for(int sc = 0; sc < 10; sc++) { + for (int sc = 0; sc < 10; sc++) { scaleskip[sc] = scales[sc] / skip; } - float atten0 = 0.40f; - float atten123 = 0.90f; + constexpr float atten0 = 0.40f; + constexpr float atten123 = 0.90f; //int DaubLen = settings->daubech ? 8 : 6; int DaubLen; - if(params->wavelet.daubcoeffmethod == "2_") { + if (params->wavelet.daubcoeffmethod == "2_") { DaubLen = 4; - } - - if(params->wavelet.daubcoeffmethod == "4_") { + } else if (params->wavelet.daubcoeffmethod == "4_") { DaubLen = 6; - } - - if(params->wavelet.daubcoeffmethod == "6_") { + } else if (params->wavelet.daubcoeffmethod == "6_") { DaubLen = 8; - } - - if(params->wavelet.daubcoeffmethod == "10_") { + } else if (params->wavelet.daubcoeffmethod == "10_") { DaubLen = 12; - } - - if(params->wavelet.daubcoeffmethod == "14_") { + } else { /* if (params->wavelet.daubcoeffmethod == "14_") */ DaubLen = 16; } cp.CHSLmet = 1; -// if(params->wavelet.CHSLmethod=="SL") cp.CHSLmet=1; -// if(params->wavelet.CHSLmethod=="CU") cp.CHSLmet=2; - cp.EDmet = 1; - - if(params->wavelet.EDmethod == "SL") { + cp.EDmet = 2; +/* + if (params->wavelet.EDmethod == "SL") { cp.EDmet = 1; - } - - if(params->wavelet.EDmethod == "CU") { + } else if (params->wavelet.EDmethod == "CU") { cp.EDmet = 2; } - +*/ cp.cbena = params->wavelet.cbenab; cp.blhigh = (float)params->wavelet.bluehigh; cp.grhigh = (float)params->wavelet.greenhigh; @@ -309,35 +426,53 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.curv = false; cp.edgcurv = false; cp.diagcurv = false; + cp.denoicurv = false; + cp.denoicurvh = false; cp.opaRG = false; cp.opaBY = false; cp.opaW = false; cp.CHmet = 0; cp.HSmet = false; - if(params->wavelet.CHmethod == "with") { + if (params->wavelet.CHmethod == "with") { cp.CHmet = 1; - } - - if(params->wavelet.CHmethod == "link") { + } else if (params->wavelet.CHmethod == "link") { cp.CHmet = 2; } - if(params->wavelet.HSmethod == "with") { + if (params->wavelet.HSmethod == "with") { cp.HSmet = true; } - cp.strength = min(1.f, max(0.f, ((float)params->wavelet.strength / 100.f))); + cp.strength = rtengine::min(1.f, rtengine::max(0.f, ((float)params->wavelet.strength / 100.f))); - for(int m = 0; m < maxmul; m++) { + for (int m = 0; m < maxmul; m++) { cp.mulC[m] = waparams.ch[m]; } + for (int m = maxmul; m < 9; m++) { + cp.mulC[m] = 0.f; + } + +//printf("maxmul=%i\n", maxmul); + cp.factor = WaveletParams::LABGRID_CORR_MAX * 3.276f; + cp.scaling = WaveletParams::LABGRID_CORR_SCALE; + cp.scaledirect = WaveletParams::LABGRIDL_DIRECT_SCALE; + cp.a_scale = (params->wavelet.labgridAHigh - params->wavelet.labgridALow) / cp.factor / cp.scaling; + cp.a_base = params->wavelet.labgridALow / cp.scaling; + cp.b_scale = (params->wavelet.labgridBHigh - params->wavelet.labgridBLow) / cp.factor / cp.scaling; + cp.b_base = params->wavelet.labgridBLow / cp.scaling; + cp.a_high = 3.276f * params->wavelet.labgridAHigh; + cp.a_low = 3.276f * params->wavelet.labgridALow; + cp.b_high = 3.276f * params->wavelet.labgridBHigh; + cp.b_low = 3.276f * params->wavelet.labgridBLow; + cp.rangeab = params->wavelet.rangeab; + cp.protab = params->wavelet.protab; - if(waOpacityCurveRG) { + if (waOpacityCurveRG) { cp.opaRG = true; } - if(cp.opaRG) { + if (cp.opaRG) { cp.mulopaRG[0] = 200.f * (waOpacityCurveRG[0] - 0.5f); cp.mulopaRG[1] = 200.f * (waOpacityCurveRG[62] - 0.5f); cp.mulopaRG[2] = 200.f * (waOpacityCurveRG[125] - 0.5f); @@ -348,16 +483,16 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.mulopaRG[7] = 200.f * (waOpacityCurveRG[438] - 0.5f); cp.mulopaRG[8] = 200.f * (waOpacityCurveRG[500] - 0.5f); } else { - for(int level = 0; level < 9; level++) { + for (int level = 0; level < 9; level++) { cp.mulopaRG[level] = 0.f; } } - if(waOpacityCurveBY) { + if (waOpacityCurveBY) { cp.opaBY = true; } - if(cp.opaBY) { + if (cp.opaBY) { cp.mulopaBY[0] = 200.f * (waOpacityCurveBY[0] - 0.5f); cp.mulopaBY[1] = 200.f * (waOpacityCurveBY[62] - 0.5f); cp.mulopaBY[2] = 200.f * (waOpacityCurveBY[125] - 0.5f); @@ -368,47 +503,71 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.mulopaBY[7] = 200.f * (waOpacityCurveBY[438] - 0.5f); cp.mulopaBY[8] = 200.f * (waOpacityCurveBY[500] - 0.5f); } else { - for(int level = 0; level < 9; level++) { + for (int level = 0; level < 9; level++) { cp.mulopaBY[level] = 0.f; } } - if(wavCLVCcurve) { + if (wavCLVCcurve) { cp.edgcurv = true; } - if(waOpacityCurveWL) { + if (waOpacityCurveWL) { cp.diagcurv = true; } - for(int m = 0; m < maxmul; m++) { + if (wavdenoise) { + for (int i = 0; i < 500; i++) { + if (wavdenoise[i] != 1.0) { + cp.denoicurv = true; + break; + } + } + } + + if(cp.complex == 0) { + wavdenoiseh = wavdenoise; + } + + if (wavdenoiseh) { + for (int i = 0; i < 500; i++) { + if (wavdenoiseh[i] != 1.0) { + cp.denoicurvh = true; + break; + } + } + } + + for (int m = 0; m < maxmul; m++) { cp.mul[m] = waparams.c[m]; } + for (int m = maxmul; m < 10; m++) { + cp.mul[m] = 0.f; + } cp.mul[9] = (float) waparams.sup; - for(int sc = 0; sc < 10; sc++) { //reduce strength if zoom < 100% for contrast - if(sc == 0) { - if(scaleskip[sc] < 1.f) { + for (int sc = 0; sc < 10; sc++) { //reduce strength if zoom < 100% for contrast + if (sc == 0) { + if (scaleskip[sc] < 1.f) { cp.mul[sc] *= (atten0 * scaleskip[sc]); } } else { - if(scaleskip[sc] < 1.f) { + if (scaleskip[sc] < 1.f) { cp.mul[sc] *= (atten123 * scaleskip[sc]); } } } -// if(settings->verbose) printf("Wav mul 0=%f 1=%f 2=%f 3=%f 4=%f 5=%f 6=%f 7=%f 8=%f 9=%f\n",cp.mul[0],cp.mul[1],cp.mul[2],cp.mul[3],cp.mul[4],cp.mul[5],cp.mul[6],cp.mul[7],cp.mul[8],cp.mul[9]); - for(int sc = 0; sc < 9; sc++) { //reduce strength if zoom < 100% for chroma and tuning - if(sc == 0) { - if(scaleskip[sc] < 1.f) { + for (int sc = 0; sc < 9; sc++) { //reduce strength if zoom < 100% for chroma and tuning + if (sc == 0) { + if (scaleskip[sc] < 1.f) { cp.mulC[sc] *= (atten0 * scaleskip[sc]); cp.mulopaRG[sc] *= (atten0 * scaleskip[sc]); cp.mulopaBY[sc] *= (atten0 * scaleskip[sc]); } } else { - if(scaleskip[sc] < 1.f) { + if (scaleskip[sc] < 1.f) { cp.mulC[sc] *= (atten123 * scaleskip[sc]); cp.mulopaRG[sc] *= (atten123 * scaleskip[sc]); cp.mulopaBY[sc] *= (atten123 * scaleskip[sc]); @@ -422,10 +581,19 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.rad = waparams.edgrad; cp.val = waparams.edgval; cp.til = waparams.edgthresh; - + cp.eff = waparams.edgeffect; + cp.balchrom = waparams.balchrom; + cp.chromfi = 0.1f * waparams.chromfi; + cp.chromco = 0.1f * waparams.chromco; + cp.ballum = waparams.ballum; cp.conres = waparams.rescon; cp.conresH = waparams.resconH; + cp.radius = waparams.radius; cp.chrores = waparams.reschro; + cp.oldsh = waparams.oldsh; + cp.blurres = waparams.resblur; + cp.blurcres = waparams.resblurc; + cp.bluwav = waparams.bluwav; //cp.hueres=waparams.reshue; cp.hueres = 2.f; cp.th = float(waparams.thr); @@ -441,23 +609,19 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.t_ly = static_cast(params->wavelet.hueskin2.getTopLeft()) / 100.0f; cp.b_ry = static_cast(params->wavelet.hueskin2.getBottomRight()) / 100.0f; cp.t_ry = static_cast(params->wavelet.hueskin2.getTopRight()) / 100.0f; - cp.numlevH = params->wavelet.threshold; + cp.numlevH = params->wavelet.threshold -1; //shadows cp.b_lsl = static_cast(params->wavelet.bllev.getBottomLeft()); cp.t_lsl = static_cast(params->wavelet.bllev.getTopLeft()); cp.b_rsl = static_cast(params->wavelet.bllev.getBottomRight()); cp.t_rsl = static_cast(params->wavelet.bllev.getTopRight()); - cp.numlevS = params->wavelet.threshold2; - int maxlevS = 9 - cp.numlevH; - cp.numlevS = MIN(cp.numlevS, maxlevS); - //printf("levHigh=%d levShad=%d\n",cp.numlevH,cp.numlevS); + cp.numlevS = params->wavelet.threshold2; //rtengine::max(cp.numlevS, maxlevS); //highlight cp.b_lhl = static_cast(params->wavelet.hllev.getBottomLeft()); cp.t_lhl = static_cast(params->wavelet.hllev.getTopLeft()); cp.b_rhl = static_cast(params->wavelet.hllev.getBottomRight()); cp.t_rhl = static_cast(params->wavelet.hllev.getTopRight()); - //printf("BL=%f TL=%f BR=%f TR=%f\n",cp.b_lhl,cp.t_lhl,cp.b_rhl,cp.t_rhl); //pastel cp.b_lpast = static_cast(params->wavelet.pastlev.getBottomLeft()); cp.t_lpast = static_cast(params->wavelet.pastlev.getTopLeft()); @@ -482,54 +646,57 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const cp.lev2n = static_cast(params->wavelet.level2noise.getTop()); cp.lev3s = static_cast(params->wavelet.level3noise.getBottom()); cp.lev3n = static_cast(params->wavelet.level3noise.getTop()); + cp.lev4n = static_cast(params->wavelet.leveldenoise.getTop()); + cp.lev4t = 0.01f * static_cast(params->wavelet.leveldenoise.getBottom()); + cp.sigmm14 = static_cast(params->wavelet.levelsigm.getTop()); + cp.sigmm56 = static_cast(params->wavelet.levelsigm.getBottom()); cp.detectedge = params->wavelet.medianlev; - //printf("low=%f mean=%f sd=%f max=%f\n",cp.edg_low,cp.edg_mean,cp.edg_sd,cp.edg_max); - int minwin = min(imwidth, imheight); + int minwin = rtengine::min(imwidth, imheight); int maxlevelcrop = 9; - if(cp.mul[9] != 0) { + if (cp.mul[9] != 0) { maxlevelcrop = 10; } - // adap maximum level wavelet to size of crop - if(minwin * skip < 1024) { + // adapt maximum level wavelet to size of crop + if (minwin * skip < 1024) { maxlevelcrop = 9; //sampling wavelet 512 } - if(minwin * skip < 512) { + if (minwin * skip < 512) { maxlevelcrop = 8; //sampling wavelet 256 } - if(minwin * skip < 256) { + if (minwin * skip < 256) { maxlevelcrop = 7; //sampling 128 } - if(minwin * skip < 128) { + if (minwin * skip < 128) { maxlevelcrop = 6; } - if(minwin < 64) { + if (minwin * skip < 64) { maxlevelcrop = 5; } - // printf("minwin=%d maxcrop=%d\n",minwin, maxlevelcrop); - + if (minwin * skip < 32) { + maxlevelcrop = 4; + } + int levwav = params->wavelet.thres; + if(params->wavelet.expnoise) { + levwav = 6; + } - if(levwav == 9 && cp.mul[9] != 0) { + if (levwav == 9 && cp.mul[9] != 0) { levwav = 10; } - levwav = min(maxlevelcrop, levwav); + levwav = rtengine::min(maxlevelcrop, levwav); - // determine number of levels to process. - // for(levwav=min(maxlevelcrop,levwav);levwav>0;levwav--) - // if(cp.mul[levwav-1]!=0.f || cp.curv) - // if(cp.mul[levwav-1]!=0.f) - // break; - // I suppress this fonctionality ==> crash for level < 3 - if(levwav < 1) { + // I suppress this functionality ==> crash for level < 3 + if (levwav < 1) { return; // nothing to do } @@ -539,28 +706,29 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //output buffer int realtile = 0; - if(params->wavelet.Tilesmethod == "big") { + if (params->wavelet.Tilesmethod == "big") { realtile = 22; } - if(params->wavelet.Tilesmethod == "lit") { - realtile = 12; - } - + /* + if (params->wavelet.Tilesmethod == "lit") { + realtile = 12; + } + */ int tilesize = 128 * realtile; int overlap = (int) tilesize * 0.125f; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; - if(params->wavelet.Tilesmethod == "full") { + if (params->wavelet.Tilesmethod == "full") { kall = 0; } - Tile_calc (tilesize, overlap, kall, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + Tile_calc(tilesize, overlap, kall, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); const int numtiles = numtiles_W * numtiles_H; LabImage * dsttmp; - if(numtiles == 1) { + if (numtiles == 1) { dsttmp = dst; } else { dsttmp = new LabImage(imwidth, imheight); @@ -572,97 +740,101 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const //now we have tile dimensions, overlaps //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - int minsizetile = min(tilewidth, tileheight); + int minsizetile = rtengine::min(tilewidth, tileheight); int maxlev2 = 10; - if(minsizetile < 1024 && levwav == 10) { + if (minsizetile < 1024 && levwav == 10) { maxlev2 = 9; } - if(minsizetile < 512) { + if (minsizetile < 512) { maxlev2 = 8; } - if(minsizetile < 256) { + if (minsizetile < 256) { maxlev2 = 7; } - if(minsizetile < 128) { + if (minsizetile < 128) { maxlev2 = 6; } - levwav = min(maxlev2, levwav); + if (minsizetile < 64) { + maxlev2 = 5; + } - //printf("levwav = %d\n",levwav); + if (minsizetile < 32) { + maxlev2 = 4; + } + + levwav = rtengine::min(maxlev2, levwav); #ifdef _OPENMP int numthreads = 1; int maxnumberofthreadsforwavelet = 0; //reduce memory for big tile size - if(kall != 0) { - if(realtile <= 22) { + if (kall != 0) { + if (realtile <= 22) { maxnumberofthreadsforwavelet = 2; } - if(realtile <= 20) { + if (realtile <= 20) { maxnumberofthreadsforwavelet = 3; } - if(realtile <= 18) { + if (realtile <= 18) { maxnumberofthreadsforwavelet = 4; } - if(realtile <= 16) { + if (realtile <= 16) { maxnumberofthreadsforwavelet = 6; } - if(realtile <= 14) { + if (realtile <= 14) { maxnumberofthreadsforwavelet = 8; } - //printf("maxNRT=%d\n",maxnumberofthreadsforwavelet); - if((maxnumberofthreadsforwavelet == 6 || maxnumberofthreadsforwavelet == 8) && levwav == 10) { + if ((maxnumberofthreadsforwavelet == 6 || maxnumberofthreadsforwavelet == 8) && levwav == 10) { maxnumberofthreadsforwavelet -= 2; } - if(levwav <= 7 && maxnumberofthreadsforwavelet == 8) { + if (levwav <= 7 && maxnumberofthreadsforwavelet == 8) { maxnumberofthreadsforwavelet = 0; } } - //printf("maxthre=%d\n",maxnumberofthreadsforwavelet); // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles - if( options.rgbDenoiseThreadLimit > 0) { - maxnumberofthreadsforwavelet = min(max(options.rgbDenoiseThreadLimit / 2, 1), maxnumberofthreadsforwavelet); + if (options.rgbDenoiseThreadLimit > 0) { + maxnumberofthreadsforwavelet = rtengine::LIM(options.rgbDenoiseThreadLimit / 2, 1, maxnumberofthreadsforwavelet); } - numthreads = MIN(numtiles, omp_get_max_threads()); + numthreads = rtengine::min(numtiles, omp_get_max_threads()); - if(maxnumberofthreadsforwavelet > 0) { - numthreads = MIN(numthreads, maxnumberofthreadsforwavelet); + if (maxnumberofthreadsforwavelet > 0) { + numthreads = rtengine::min(numthreads, maxnumberofthreadsforwavelet); } #ifdef _OPENMP wavNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); - if(wavNestedLevels < 2) { + if (wavNestedLevels < 2) { wavNestedLevels = 1; } else { omp_set_nested(true); } - if(maxnumberofthreadsforwavelet > 0) - while(wavNestedLevels * numthreads > maxnumberofthreadsforwavelet) { + if (maxnumberofthreadsforwavelet > 0) + while (wavNestedLevels * numthreads > maxnumberofthreadsforwavelet) { wavNestedLevels--; } #endif - if(settings->verbose) { + if (settings->verbose) { printf("Ip Wavelet uses %d main thread(s) and up to %d nested thread(s) for each main thread\n", numthreads, wavNestedLevels); } @@ -675,6 +847,21 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float sigmaN[10]; float MaxP[10]; float MaxN[10]; + float meand[10]; + float meanNd[10]; + float sigmad[10]; + float sigmaNd[10]; + float MaxPd[10]; + float MaxNd[10]; + + float meanab[10]; + float meanNab[10]; + float sigmaab[10]; + float sigmaNab[10]; + float MaxPab[10]; + float MaxNab[10]; + + array2D varchro(tilewidth, tileheight); float** varhue = new float*[tileheight]; @@ -682,11 +869,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const varhue[i] = new float[tilewidth]; } - float** varchro = new float*[tileheight]; - for (int i = 0; i < tileheight; i++) { - varchro[i] = new float[tilewidth]; - } #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) @@ -694,18 +877,18 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const for (int tiletop = 0; tiletop < imheight; tiletop += tileHskip) { for (int tileleft = 0; tileleft < imwidth ; tileleft += tileWskip) { - int tileright = MIN(imwidth, tileleft + tilewidth); - int tilebottom = MIN(imheight, tiletop + tileheight); + int tileright = rtengine::min(imwidth, tileleft + tilewidth); + int tilebottom = rtengine::min(imheight, tiletop + tileheight); int width = tileright - tileleft; int height = tilebottom - tiletop; LabImage * labco; float **Lold = nullptr; float *LoldBuffer = nullptr; - if(numtiles == 1) { // untiled processing => we can use output buffer for labco + if (numtiles == 1) { // untiled processing => we can use output buffer for labco labco = dst; - if(cp.avoi) { // we need a buffer to hold a copy of the L channel + if (cp.avoi) { // we need a buffer to hold a copy of the L channel Lold = new float*[tileheight]; LoldBuffer = new float[tilewidth * tileheight]; memcpy(LoldBuffer, lab->L[0], tilewidth * tileheight * sizeof(float)); @@ -721,44 +904,39 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } #ifdef _OPENMP - #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = tiletop; i < tilebottom; i++) { - int i1 = i - tiletop; - int j; + const int i1 = i - tiletop; + int j = tileleft; #ifdef __SSE2__ - __m128 c327d68v = _mm_set1_ps(327.68f); - __m128 av, bv, huev, chrov; + const vfloat c327d68v = F2V(327.68f); - for (j = tileleft; j < tileright - 3; j += 4) { - int j1 = j - tileleft; - av = LVFU(lab->a[i][j]); - bv = LVFU(lab->b[i][j]); - huev = xatan2f(bv, av); - chrov = vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v; - _mm_storeu_ps(&varhue[i1][j1], huev); - _mm_storeu_ps(&varchro[i1][j1], chrov); + for (; j < tileright - 3; j += 4) { + const int j1 = j - tileleft; + const vfloat av = LVFU(lab->a[i][j]); + const vfloat bv = LVFU(lab->b[i][j]); + STVFU(varhue[i1][j1], xatan2f(bv, av)); + STVFU(varchro[i1][j1], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); - if(labco != lab) { - _mm_storeu_ps(&(labco->L[i1][j1]), LVFU(lab->L[i][j])); - _mm_storeu_ps(&(labco->a[i1][j1]), av); - _mm_storeu_ps(&(labco->b[i1][j1]), bv); + if (labco != lab) { + STVFU((labco->L[i1][j1]), LVFU(lab->L[i][j])); + STVFU((labco->a[i1][j1]), av); + STVFU((labco->b[i1][j1]), bv); } } -#else - j = tileleft; #endif for (; j < tileright; j++) { - int j1 = j - tileleft; - float a = lab->a[i][j]; - float b = lab->b[i][j]; + const int j1 = j - tileleft; + const float a = lab->a[i][j]; + const float b = lab->b[i][j]; varhue[i1][j1] = xatan2f(b, a); varchro[i1][j1] = (sqrtf(a * a + b * b)) / 327.68f; - if(labco != lab) { + if (labco != lab) { labco->L[i1][j1] = lab->L[i][j]; labco->a[i1][j1] = a; labco->b[i1][j1] = b; @@ -767,7 +945,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } //to avoid artifacts in blue sky - if(params->wavelet.median) { + if (params->wavelet.median) { float** tmL; int wid = labco->W; int hei = labco->H; @@ -778,26 +956,26 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const tmL[i] = new float[wid]; } - for(int i = borderL; i < hei - borderL; i++ ) { - for(int j = borderL; j < wid - borderL; j++) { + for (int i = borderL; i < hei - borderL; i++) { + for (int j = borderL; j < wid - borderL; j++) { tmL[i][j] = labco->L[i][j]; } } #ifdef _OPENMP - #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = 1; i < hei - 1; i++) { for (int j = 1; j < wid - 1; j++) { - if((varhue[i][j] < -1.3f && varhue[i][j] > - 2.5f) && (varchro[i][j] > 15.f && varchro[i][j] < 55.f) && labco->L[i][j] > 6000.f) { //blue sky + med3x3 ==> after for more effect use denoise - tmL[i][j] = median(labco->L[i][j] , labco->L[i - 1][j], labco->L[i + 1][j] , labco->L[i][j + 1], labco->L[i][j - 1], labco->L[i - 1][j - 1], labco->L[i - 1][j + 1], labco->L[i + 1][j - 1], labco->L[i + 1][j + 1]); //3x3 + if ((varhue[i][j] < -1.3f && varhue[i][j] > - 2.5f) && (varchro[i][j] > 15.f && varchro[i][j] < 55.f) && labco->L[i][j] > 6000.f) { //blue sky + med3x3 ==> after for more effect use denoise + tmL[i][j] = median(labco->L[i][j], labco->L[i - 1][j], labco->L[i + 1][j], labco->L[i][j + 1], labco->L[i][j - 1], labco->L[i - 1][j - 1], labco->L[i - 1][j + 1], labco->L[i + 1][j - 1], labco->L[i + 1][j + 1]); //3x3 } } } - for(int i = borderL; i < hei - borderL; i++ ) { - for(int j = borderL; j < wid - borderL; j++) { + for (int i = borderL; i < hei - borderL; i++) { + for (int j = borderL; j < wid - borderL; j++) { labco->L[i][j] = tmL[i][j]; } } @@ -810,7 +988,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const // end blue sky } - if(numtiles == 1) { + if (numtiles == 1) { // reduce the varhue array to get faster access in following processing and reduce peak memory usage float temphue[(tilewidth + 1) / 2] ALIGNED64; @@ -824,7 +1002,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const memcpy(varhue[i], temphue, ((tilewidth + 1) / 2) * sizeof(float)); } - for(int i = (tileheight + 1) / 2; i < tileheight; i++) { + for (int i = (tileheight + 1) / 2; i < tileheight; i++) { delete [] varhue[i]; varhue[i] = nullptr; } @@ -838,88 +1016,460 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const int datalen = labco->W * labco->H; - int levwavL = levwav; + levwavL = levwav; bool ref0 = false; - if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { + if ((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { ref0 = true; } - // printf("LevwavL before: %d\n",levwavL); - if(cp.contrast == 0.f && !cp.tonemap && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels - while(levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level - levwavL--; + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + } } } - // printf("LevwavL after: %d\n",levwavL); - // if(cp.noiseena){ - if(levwavL < 4 ) { - levwavL = 4; //to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! + bool exblurL = cp.blena && wavcurvecomp; + + if (exblurL) { + if (cp.mul[0] == 0.f) { + cp.mul[0] = 0.01f;//to always enable WaveletcontAllL if no contrast is needed + } + } + + if (cp.BAmet != 0) { + if (cp.mul[0] == 0.f) { + cp.mul[0] = 0.01f; + } + } + // printf("cp4=%f cpmul5=%f cp6=%f cp7=%f cp8=%f\n", (double)cp.mul[4], (double)cp.mul[5],(double)cp.mul[6],(double)cp.mul[7],(double)cp.mul[8]); + + if (levwavL == 6 && cp.noiseena && cp.chromfi == 0.f) { + cp.chromfi = 0.01f; } - // } - // else { - // if(levwavL < 3) levwavL=3;//to allow edge => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! - // } - if(levwavL > 0) { - wavelet_decomposition* Ldecomp = new wavelet_decomposition (labco->data, labco->W, labco->H, levwavL, 1, skip, max(1, wavNestedLevels), DaubLen ); + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwavL < 7) { + levwavL = 7; + } + } + if (levwavL < 5 && cp.noiseena) { + levwavL = 6; //to allow edge and denoise => I always allocate 3 (4) levels..because if user select wavelet it is to do something !! + } + + if (!exblurL && cp.contrast == 0.f && cp.blurres == 0.f && !cp.noiseena && !cp.tonemap && !cp.resena && !cp.chromena && !cp.toningena && !cp.finena && !cp.edgeena && cp.conres == 0.f && cp.conresH == 0.f && cp.val == 0 && !ref0 && params->wavelet.CLmethod == "all") { // no processing of residual L or edge=> we probably can reduce the number of levels + while (levwavL > 0 && cp.mul[levwavL - 1] == 0.f) { // cp.mul[level] == 0.f means no changes to level + levwavL--; + } + } + bool isdenoisL = (cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f || cp.lev4n > 0.1f); - if(!Ldecomp->memoryAllocationFailed) { + +/* + if(cp.denoicurvh || cp.levdenhigh > 0.01f) { + levwavL = levwav; + } +*/ + float th = 0.01f * (float) waparams.thrend; + if(th > 0.f) { + levwavL = levwav; + } - float madL[8][3]; + + bool usechrom = cp.chromfi > 0.f || cp.chromco > 0.f; + levwavL = rtengine::min(maxlevelcrop, levwavL); + levwavL = rtengine::min(maxlev2, levwavL); + + if (settings->verbose) { + printf("Level decomp L=%i\n", levwavL); + } + + if (levwavL > 0) { + const std::unique_ptr Ldecomp(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + // const std::unique_ptr Ldecomp2(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + + if (!Ldecomp->memory_allocation_failed()) { + float madL[10][3]; + + // float madL[8][3]; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif - for (int lvl = 0; lvl < 4; lvl++) { + for (int lvl = 0; lvl < levwavL; lvl++) { for (int dir = 1; dir < 4; dir++) { int Wlvl_L = Ldecomp->level_W(lvl); int Hlvl_L = Ldecomp->level_H(lvl); - float ** WavCoeffs_L = Ldecomp->level_coeffs(lvl); + const float* const* WavCoeffs_L = Ldecomp->level_coeffs(lvl); madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); + + if (settings->verbose) { + // printf("Luminance noise estimate (sqr) madL=%.0f lvl=%i dir=%i\n", madL[lvl][dir - 1], lvl, dir - 1); + } } } bool ref = false; - if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { + if ((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { ref = true; + } bool contr = false; - for(int f = 0; f < levwavL; f++) { - if(cp.mul[f] != 0.f) { + for (int f = 0; f < levwavL; f++) { + if (cp.mul[f] != 0.f) { contr = true; } } - if(cp.val > 0 || ref || contr) {//edge - Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); + // if (cp.val > 0 || ref || contr || cp.denoicurv || cp.denoicurvh || cp.noiseena || cp.levdenlow > 0.f || cp.thrden > 0.f ) { //edge + if (cp.val > 0 || ref || contr || cp.denoicurv || cp.denoicurvh || cp.noiseena || cp.thrden > 0.f ) { //edge + Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavNestedLevels); } //init for edge and denoise - float vari[4]; + float vari[6]; - vari[0] = 8.f * SQR((cp.lev0n / 125.0) * (1.0 + cp.lev0n / 25.0)); - vari[1] = 8.f * SQR((cp.lev1n / 125.0) * (1.0 + cp.lev1n / 25.0)); - vari[2] = 8.f * SQR((cp.lev2n / 125.0) * (1.0 + cp.lev2n / 25.0)); - vari[3] = 8.f * SQR((cp.lev3n / 125.0) * (1.0 + cp.lev3n / 25.0)); + vari[0] = 0.8f * SQR((cp.lev0n / 125.f) * (1.f + cp.lev0n / 25.f)); + vari[1] = 0.8f * SQR((cp.lev1n / 125.f) * (1.f + cp.lev1n / 25.f)); + vari[2] = 0.8f * SQR((cp.lev2n / 125.f) * (1.f + cp.lev2n / 25.f)); + vari[3] = 0.8f * SQR((cp.lev3n / 125.f) * (1.f + cp.lev3n / 25.f)); + vari[4] = 0.8f * SQR((cp.lev4n / 125.f) * (1.f + cp.lev4n / 25.f)); + vari[5] = 0.8f * SQR((cp.lev4n / 125.f) * (1.f + cp.lev4n / 25.f)); + float kr3 = 1.f; - if((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f) && cp.noiseena) { - int edge = 1; - vari[0] = max(0.0001f, vari[0]); - vari[1] = max(0.0001f, vari[1]); - vari[2] = max(0.0001f, vari[2]); - vari[3] = max(0.0001f, vari[3]); - float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL - - WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge); + if (cp.lev3n < 10.f) { + kr3 = 0.3f; + } else if (cp.lev3n < 30.f) { + kr3 = 0.6f; + } else if (cp.lev3n < 70.f) { + kr3 = 0.8f; + } else { + kr3 = 1.f; } + float kr4 = 1.f; + + if (cp.lev4n < 10.f) { + kr4 = 0.6f; + } else if (cp.lev4n < 30.f) { + kr4 = 0.8f; + } else if (cp.lev4n < 70.f) { + kr4 = 0.9f; + } else { + kr4 = 1.f; + } + if ((cp.lev0n > 0.1f || cp.lev1n > 0.1f || cp.lev2n > 0.1f || cp.lev3n > 0.1f || cp.lev4n > 0.1f) && cp.noiseena) { + int edge = 6; + vari[0] = rtengine::max(0.000001f, vari[0]); + vari[1] = rtengine::max(0.000001f, vari[1]); + vari[2] = rtengine::max(0.000001f, vari[2]); + vari[3] = rtengine::max(0.000001f, kr3 * vari[3]); + vari[4] = rtengine::max(0.000001f, kr4 * vari[4]); + vari[5] = rtengine::max(0.000001f, kr4 * vari[5]); + + const std::unique_ptr Ldecomp2(new wavelet_decomposition(labco->data, labco->W, labco->H, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + if(!Ldecomp2->memory_allocation_failed()){ + if (settings->verbose) { + printf("LUM var0=%f var1=%f var2=%f var3=%f var4=%f\n", vari[0], vari[1], vari[2], vari[3], vari[4]); + } + + // float* noisevarlum = nullptr; // we need a dummy to pass it to WaveletDenoiseAllL + int GWL = labco->W; + int GHL = labco->H; + float* noisevarlum = new float[GHL * GWL]; + float* noisevarhue = new float[GHL * GWL]; + int GW2L = (GWL + 1) / 2; + + constexpr float nvlh[13] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.7f, 0.5f}; //high value + constexpr float nvll[13] = {0.1f, 0.15f, 0.2f, 0.25f, 0.3f, 0.35f, 0.4f, 0.45f, 0.7f, 0.8f, 1.f, 1.f, 1.f}; //low value + + constexpr float seuillow = 3000.f;//low + constexpr float seuilhigh = 18000.f;//high + const int index = 10 - cp.ballum; + const float ac = (nvlh[index] - nvll[index]) / (seuillow - seuilhigh); + const float bc = nvlh[index] - seuillow * ac; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int ir = 0; ir < GHL; ir++) + for (int jr = 0; jr < GWL; jr++) { + float lN = labco->L[ir][jr]; + + if (lN < seuillow) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvlh[index]; + } else if (lN < seuilhigh) { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = ac * lN + bc; + } else { + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] = nvll[index]; + } + } + + if(wavhueutili) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int ir = 0; ir < GHL; ir++) + for (int jr = 0; jr < GWL; jr++) { + float hueG = xatan2f(labco->b[ir][jr], labco->a[ir][jr]); + noisevarhue[(ir >> 1)*GW2L + (jr >> 1)] = 1.f + 2.f * (static_cast(wavhueCurve->getVal(Color::huelab_to_huehsv2(hueG))) - 0.5f); + noisevarlum[(ir >> 1)*GW2L + (jr >> 1)] *= noisevarhue[(ir >> 1)*GW2L + (jr >> 1)]; + } + } + + + + + if(cp.quamet == 0) { + if (settings->verbose) { + printf("denoise standard L\n"); + } + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + } else { + if (settings->verbose) { + printf("denoise bishrink L\n"); + } + WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + + WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge, 1); + } + delete[] noisevarlum; + + //evaluate after denoise + bool exitifzero = true; + Evaluate2(*Ldecomp, meand, meanNd, sigmad, sigmaNd, MaxPd, MaxNd, wavNestedLevels); + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levwavL; level++) { + if(mean[level] < 0.1f || meand[level] < 0.1f || sigma[level] < 0.1f || sigmad[level] < 0.1f) { + printf("near zero - exit\n"); + exitifzero = false; + } + } + } + + //for level 0 1 2 3 + float thr = 0.f; + float thrend = cp.thrden; //cp.levdenlow; + if(thrend < 0.01f) thr = 0.95f; + else if(thrend < 0.02f) thr = 0.9f; + else if(thrend < 0.04f) thr = 0.8f; + else if(thrend < 0.06f) thr = 0.7f; + else if(thrend < 0.08f) thr = 0.6f; + else if(thrend < 0.1f) thr = 0.5f; + else if(thrend < 0.2f) thr = 0.2f; + else thr = 0.f; + + FlatCurve wavlow({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,thrend, 1.0, 0.35, 0.35, thrend + 0.01f, thr, 0.35, 0.35, 1, thr, 0.35, 0.35 + }); + //for level 4 + float thrhigh = 0.f; + float threndhigh = cp.lev4t; //cp.levdenlow; + if(threndhigh < 0.01f) thrhigh = 0.95f; + else if(threndhigh < 0.02f) thrhigh = 0.9f; + else if(threndhigh < 0.04f) thrhigh = 0.8f; + else if(threndhigh < 0.06f) thrhigh = 0.7f; + else if(threndhigh < 0.08f) thrhigh = 0.6f; + else if(threndhigh < 0.1f) thrhigh = 0.5f; + else thrhigh = 0.f; + + FlatCurve wavhigh({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,threndhigh, 1.0, 0.35, 0.35, threndhigh + 0.01f, thrhigh, 0.35, 0.35, 1, thrhigh, 0.35, 0.35 + }); + + float thrmed = 0.f; + float threndmed = 1.f - cp.limden; + if(threndmed < 0.02f) thrmed = 0.5f; + else if(threndmed < 0.05f) thrmed = 0.2f; + else thrmed = 0.f; + + FlatCurve wavmed({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,threndmed, 1.0, 0.35, 0.35, threndmed + 0.01f, thrmed, 0.35, 0.35, 1, thrmed, 0.35, 0.35 + }); + + float siglh[10]; + float levref = 6; + //levref = levwavL-1; + if(cp.complex == 1){ + for (int level = 0; level < levref; level++) { + if(level > 3) { + siglh[level] = cp.sigmm56; + } else { + siglh[level] = cp.sigmm14; + } + } + } else { + levref = 4; + for (int level = 0; level < levref; level++) { + siglh[level] = cp.sigmm; + } + } + +// printf("sig0=%f sig1=%f sig2=%f sig3=%f sig4=%f sig5=%f\n", siglh[0], siglh[1],siglh[2],siglh[3],siglh[4],siglh[5]); + + + bool execut = false; + + if(cp.slimet == 0) { + // if(cp.levdenlow > 0.f) { + if(cp.thrden > 0.f) { + execut = true; + } + } else { + if(cp.denoicurv) { + execut = true; + } + } + // } + if (execut && exitifzero) { + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levref; level++) { + const int Wlvl_L = Ldecomp->level_W(level); + const int Hlvl_L = Ldecomp->level_H(level); + const float* const WavCoeffs_L = Ldecomp->level_coeffs(level)[dir];//first decomp denoised + const float* const WavCoeffs_L2 = Ldecomp2->level_coeffs(level)[dir];//second decomp before denoise + const int k4 = cp.complex == 1 ? 4 : 3; + const int k5 = cp.complex == 1 ? 5 : 3; + + auto WavL0 = Ldecomp->level_coeffs(0)[dir]; + auto WavL1 = Ldecomp->level_coeffs(1)[dir]; + auto WavL2 = Ldecomp->level_coeffs(2)[dir]; + auto WavL3 = Ldecomp->level_coeffs(3)[dir]; + auto WavL4 = Ldecomp->level_coeffs(k4)[dir]; + auto WavL5 = Ldecomp->level_coeffs(k5)[dir]; + //not denoise + const auto WavL02 = Ldecomp2->level_coeffs(0)[dir]; + const auto WavL12 = Ldecomp2->level_coeffs(1)[dir]; + const auto WavL22 = Ldecomp2->level_coeffs(2)[dir]; + const auto WavL32 = Ldecomp2->level_coeffs(3)[dir]; + const auto WavL42 = Ldecomp2->level_coeffs(k4)[dir]; + const auto WavL52 = Ldecomp2->level_coeffs(k5)[dir]; + if (settings->verbose) { + printf("level=%i mean=%.0f meanden=%.0f sigma=%.0f sigmaden=%.0f Max=%.0f Maxden=%.0f\n", level, mean[level], meand[level], sigma[level], sigmad[level],MaxP[level], MaxPd[level]); + } + + //find local contrast + constexpr float weights[4] = {0.f, 0.5f, 0.7f, 1.f}; + const float weightL = weights[rtengine::LIM(cp.mixmet, 0, 3)]; + const float tempmean = intp(weightL, meand[level], mean[level]); + const float tempsig = intp(weightL, sigmad[level], sigma[level]); + const float tempmax = intp(weightL, MaxPd[level], MaxP[level]); + + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve + constexpr float insigma = 0.666f; //SD + const float logmax = log(tempmax); //log Max + //cp.sigmm change the "wider" of sigma + const float rapX = (tempmean + siglh[level] * tempsig) / tempmax; //rapport between sD / max + const float inx = log(insigma); + const float iny = log(rapX); + const float rap = inx / iny; //koef + const float asig = 0.166f / (tempsig * siglh[level]); + const float bsig = 0.5f - asig * tempmean; + const float amean = 1.f / tempmean; + + //equalizer for levels 0 1 and 3... 1.33 and 0.75 arbitrary values + float kcFactor = 1.f; + if(cp.denmet == 1) { + if(level == 0 || level == 3) { + kcFactor = 1.7f; + } + } else if(cp.denmet == 2) { + if(level == 0 || level == 3) { + kcFactor = 0.3f; + } + } else if(cp.denmet == 3) { + if(level == 0 || level == 1) { + kcFactor = 1.7f; + } + } else if(cp.denmet == 4) { + if(level == 0 || level == 1) { + kcFactor = 0.3f; + } + } + const float k = 1.f / (siglh[level] > 1.f ? SQR(siglh[level]) : siglh[level]); + const float maxVal = tempmean + siglh[level] * tempsig; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, Wlvl_L * 16) num_threads(wavNestedLevels) if (wavNestedLevels>1) +#endif + for (int i = 0; i < Wlvl_L * Hlvl_L; i++) { + float absciss; + const float tempwav = std::fabs(intp(weightL, WavCoeffs_L[i], WavCoeffs_L2[i])); + + if (tempwav >= maxVal) { //for max + absciss = xexpf((xlogf(tempwav) - logmax) * rap); + } else if (tempwav >= tempmean) { + absciss = asig * tempwav + bsig; + } else { + absciss = 0.5f * pow_F(amean * tempwav, k); + } + + float kc; + if (cp.slimet == 0) { + kc = wavlow.getVal(absciss) - 1.f; + } else { + kc = wavdenoise[absciss * 500.f] - 1.f; + } + if (kc < 0) { + kc = -SQR(kc); //approximation to simulate sliders denoise + } + kc *= kcFactor; + + const float reduceeffect = kc <= 0.f ? 1.f : 1.2f; //1.2 allows to increase denoise (not used) + + if (level < 4) { + float kintermlow = 1.f + reduceeffect * kc; + kintermlow = kintermlow <= 0.f ? 0.01f : kintermlow; + WavL0[i] = WavL02[i] + (WavL0[i] - WavL02[i]) * kintermlow; + WavL1[i] = WavL12[i] + (WavL1[i] - WavL12[i]) * kintermlow; + WavL2[i] = WavL22[i] + (WavL2[i] - WavL22[i]) * kintermlow; + WavL3[i] = WavL32[i] + (WavL3[i] - WavL32[i]) * kintermlow; + } + if (cp.complex == 1){ + if (cp.limden > 0.f) { + const float kcmed = -SQR(wavmed.getVal(absciss) - 1.f); + float kintermed = 1.f + reduceeffect * kcmed; + kintermed = kintermed <= 0.f ? 0.01f : kintermed; + WavL0[i] = WavL02[i] + (WavL0[i] - WavL02[i]) * kintermed; + WavL1[i] = WavL12[i] + (WavL1[i] - WavL12[i]) * kintermed; + WavL2[i] = WavL22[i] + (WavL2[i] - WavL22[i]) * kintermed; + WavL3[i] = WavL32[i] + (WavL3[i] - WavL32[i]) * kintermed; + } + const float kchigh = -SQR(wavhigh.getVal(absciss) - 1.f); + float kintermhigh = 1.f + reduceeffect * kchigh; + kintermhigh = kintermhigh <= 0.f ? 0.01f : kintermhigh; + WavL4[i] = WavL42[i] + (WavL4[i] - WavL42[i]) * kintermhigh; + WavL5[i] = WavL52[i] + (WavL5[i] - WavL52[i]) * kintermhigh; + } + } + } + } + } + if (settings->verbose) { + Evaluate2(*Ldecomp, meand, meanNd, sigmad, sigmaNd, MaxPd, MaxNd, wavNestedLevels); + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levref; level++) { + printf("AFTER LC level=%i mean=%.0f meanden=%.0f sigma=%.0f sigmaden=%.0f Max=%.0f Maxden=%.0f\n", level, mean[level], meand[level], sigma[level], sigmad[level],MaxP[level], MaxPd[level]); + } + } + } + + } + delete[] noisevarhue; + } + } //Flat curve for Contrast=f(H) in levels FlatCurve* ChCurve = new FlatCurve(params->wavelet.Chcurve); //curve C=f(H) bool Chutili = false; @@ -933,118 +1483,423 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const Chutili = true; } + WaveletcontAllL(labco, varhue, varchro, *Ldecomp, wavblcurve, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveSH, ChCurve, Chutili); - WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); - - if(cp.val > 0 || ref || contr || cp.diagcurv) {//edge - Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); + if (cp.val > 0 || ref || contr || cp.diagcurv) { //edge + Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavNestedLevels); } WaveletcontAllLfinal(*Ldecomp, cp, mean, sigma, MaxP, waOpacityCurveWL); + //Evaluate2(*Ldecomp, cp, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL); - - Ldecomp->reconstruct(labco->data, cp.strength); - } - - delete Ldecomp; - } - - //Flat curve for H=f(H) in residual image - FlatCurve* hhCurve = new FlatCurve(params->wavelet.hhcurve); //curve H=f(H) - bool hhutili = false; - - if (!hhCurve || hhCurve->isIdentity()) { - if (hhCurve) { - delete hhCurve; - hhCurve = nullptr; - } - } else { - hhutili = true; - } - - - if(!hhutili) {//always a or b - int levwava = levwav; - - // printf("Levwava before: %d\n",levwava); - if(cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels - while(levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f )) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { - levwava--; - } - } - - //printf("Levwava after: %d\n",levwava); - if(levwava > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition (labco->data + datalen, labco->W, labco->H, levwava, 1, skip, max(1, wavNestedLevels), DaubLen ); - - if(!adecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); - adecomp->reconstruct(labco->data + datalen, cp.strength); + /* + Ldecomp->reconstruct(labco->data, cp.strength); + } + } + */ + if (!usechrom) { + Ldecomp->reconstruct(labco->data, cp.strength); } - delete adecomp; - } + float variC[7]; + float variCb[7]; - int levwavb = levwav; + float noisecfr = cp.chromfi; + float noiseccr = cp.chromco; - //printf("Levwavb before: %d\n",levwavb); - if(cp.chrores == 0.f && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels - while(levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f )) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { - levwavb--; - } - } - - // printf("Levwavb after: %d\n",levwavb); - if(levwavb > 0) { - wavelet_decomposition* bdecomp = new wavelet_decomposition (labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, max(1, wavNestedLevels), DaubLen ); - - if(!bdecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); - bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); + if (cp.balchrom > 0.f) { + noisecfr = cp.chromfi + 0.1f * cp.balchrom; + noiseccr = cp.chromco + 0.1f * cp.balchrom; } - delete bdecomp; - } - } else {// a and b - int levwavab = levwav; - - // printf("Levwavab before: %d\n",levwavab); - if(cp.chrores == 0.f && !hhutili && params->wavelet.CLmethod == "all") { // no processing of residual ab => we probably can reduce the number of levels - while(levwavab > 0 && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavab - 1] == 0.f )) || (cp.CHmet != 2 && (levwavab == 10 || (!cp.curv || cp.mulC[levwavab - 1] == 0.f))))) && (!cp.opaRG || levwavab == 10 || (cp.opaRG && cp.mulopaRG[levwavab - 1] == 0.f)) && ((levwavab == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavab - 1] == 0.f)))) { - levwavab--; - } - } - - // printf("Levwavab after: %d\n",levwavab); - if(levwavab > 0) { - wavelet_decomposition* adecomp = new wavelet_decomposition (labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen ); - wavelet_decomposition* bdecomp = new wavelet_decomposition (labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, max(1, wavNestedLevels), DaubLen ); - - if(!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { - WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); - WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); - WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili ); - - adecomp->reconstruct(labco->data + datalen, cp.strength); - bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); + float noisecfb = cp.chromfi; + float noiseccb = cp.chromco; + if (cp.balchrom < 0.f) { + noisecfb = cp.chromfi - 0.1f * cp.balchrom; + noiseccb = cp.chromco - 0.1f * cp.balchrom; } - delete adecomp; - delete bdecomp; + + if (noisecfr < 0.f) { + noisecfr = 0.00001f; + } + + if (noiseccr < 0.f) { + noiseccr = 0.00001f; + } + + if (noisecfb < 0.f) { + noisecfb = 0.00001f; + } + + if (noiseccb < 0.f) { + noiseccb = 0.0001f; + } + int edge = 2; + variC[0] = SQR(noisecfr); + variC[1] = SQR(noisecfr); + variC[2] = SQR(noisecfr); + + variC[3] = SQR(noisecfr); + variC[4] = SQR(noisecfr); + variC[5] = SQR(noiseccr); + variC[6] = SQR(noiseccr); + + variCb[0] = SQR(noisecfb); + variCb[1] = SQR(noisecfb); + variCb[2] = SQR(noisecfb); + + variCb[3] = SQR(noisecfb); + variCb[4] = SQR(noisecfb); + variCb[5] = SQR(noiseccb); + variCb[6] = SQR(noiseccb); + + float k1 = 0.f; + float k2 = 0.f; + float k3 = 0.f; + + if (cp.chromfi < 0.2f) { + k1 = 0.05f; + k2 = 0.f; + k3 = 0.f; + } else if (cp.chromfi < 0.3f) { + k1 = 0.1f; + k2 = 0.0f; + k3 = 0.f; + } else if (cp.chromfi < 0.5f) { + k1 = 0.2f; + k2 = 0.1f; + k3 = 0.f; + } else if (cp.chromfi < 0.8f) { + k1 = 0.3f; + k2 = 0.25f; + k3 = 0.f; + } else if (cp.chromfi < 1.f) { + k1 = 0.4f; + k2 = 0.25f; + k3 = 0.1f; + } else if (cp.chromfi < 2.f) { + k1 = 0.5f; + k2 = 0.3f; + k3 = 0.15f; + } else if (cp.chromfi < 3.f) { + k1 = 0.6f; + k2 = 0.45f; + k3 = 0.3f; + } else if (cp.chromfi < 4.f) { + k1 = 0.7f; + k2 = 0.5f; + k3 = 0.4f; + } else if (cp.chromfi < 5.f) { + k1 = 0.8f; + k2 = 0.6f; + k3 = 0.5f; + } else if (cp.chromfi < 6.f) { + k1 = 0.85f; + k2 = 0.7f; + k3 = 0.6f; + } else if (cp.chromfi < 8.f) { + k1 = 0.9f; + k2 = 0.8f; + k3 = 0.7f; + } else if (cp.chromfi < 10.f) { + k1 = 1.f; + k2 = 1.f; + k3 = 0.9f; + + } else { + k1 = 1.f; + k2 = 1.f; + k3 = 1.f; + } + + float minic = 0.000001f; + variC[0] = max(minic, variC[0]); + variC[1] = max(minic, k1 * variC[1]); + variC[2] = max(minic, k2 * variC[2]); + variC[3] = max(minic, k3 * variC[3]); + + variCb[0] = max(minic, variCb[0]); + variCb[1] = max(minic, k1 * variCb[1]); + variCb[2] = max(minic, k2 * variCb[2]); + variCb[3] = max(minic, k3 * variCb[3]); + + float k4 = 0.f; + float k5 = 0.f; + float k6 = 0.f; + + if (cp.chromco < 0.2f) { + k4 = 0.1f; + k5 = 0.02f; + } else if (cp.chromco < 0.5f) { + k4 = 0.15f; + k5 = 0.05f; + } else if (cp.chromco < 1.f) { + k4 = 0.15f; + k5 = 0.1f; + } else if (cp.chromco < 3.f) { + k4 = 0.3f; + k5 = 0.15f; + } else if (cp.chromco < 4.f) { + k4 = 0.6f; + k5 = 0.4f; + } else if (cp.chromco < 6.f) { + k4 = 0.8f; + k5 = 0.6f; + } else { + k4 = 1.f; + k5 = 1.f; + } + + variC[4] = max(0.000001f, k4 * variC[4]); + variC[5] = max(0.000001f, k5 * variC[5]); + variCb[4] = max(0.000001f, k4 * variCb[4]); + variCb[5] = max(0.000001f, k5 * variCb[5]); + + if (cp.chromco < 4.f) { + k6 = 0.f; + } else if (cp.chromco < 5.f) { + k6 = 0.4f; + } else if (cp.chromco < 6.f) { + k6 = 0.7f; + } else { + k6 = 1.f; + } + + variC[6] = max(0.00001f, k6 * variC[6]); + variCb[6] = max(0.00001f, k6 * variCb[6]); + + if (settings->verbose) { + printf("CHRO var0=%f va1=%f va2=%f va3=%f va4=%f val5=%f va6=%f\n", variC[0], variC[1], variC[2], variC[3], variC[4], variC[5], variC[6]); + } + + /* + for (int y = 0; y < 7; y++) { + printf("y=%i madL=%f varia=%f variab=%f\n", y, madL[y][1], variC[y], variCb[y]); + } + */ + float nvch = 0.6f;//high value + float nvcl = 0.1f;//low value + + if (cp.chromco > 30.f) { + nvch = 0.8f; + nvcl = 0.4f; + } + + float seuil = 4000.f;//low + float seuil2 = 15000.f;//high + //ac and bc for transition + float ac = (nvch - nvcl) / (seuil - seuil2); + float bc = nvch - seuil * ac; + int GW = labco->W; + int GH = labco->H; + float* noisevarchrom = new float[GH * GW]; + //noisevarchrom in function chroma + int GW2 = (GW + 1) / 2; + float noisevarab_r = 100.f; + + for (int ir = 0; ir < GH; ir++) + for (int jr = 0; jr < GW; jr++) { + float cN = sqrt(SQR(labco->a[ir][jr]) + SQR(labco->b[ir][jr])); + + if (cN < seuil) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvch; + } else if (cN < seuil2) { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = ac * cN + bc; + } else { + noisevarchrom[(ir >> 1)*GW2 + (jr >> 1)] = nvcl; + } + } + + + //Flat curve for H=f(H) in residual image + FlatCurve* hhCurve = new FlatCurve(params->wavelet.hhcurve); //curve H=f(H) + bool hhutili = false; + + if (!hhCurve || hhCurve->isIdentity()) { + if (hhCurve) { + delete hhCurve; + hhCurve = nullptr; + } + } else { + hhutili = true; + } + + bool exblurab = cp.chrwav > 0.f && exblurL; + + if (!hhutili) { //always a or b + int levwava = levwav; + + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.noiseena && !cp.tonemap && !cp.resena && !cp.chromena && !cp.toningena && !cp.finena && !cp.edgeena && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + while (levwava > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwava - 1] == 0.f)) || (cp.CHmet != 2 && (levwava == 10 || (!cp.curv || cp.mulC[levwava - 1] == 0.f))))) && (!cp.opaRG || levwava == 10 || (cp.opaRG && cp.mulopaRG[levwava - 1] == 0.f)) && ((levwava == 10 || (cp.CHSLmet == 1 && cp.mulC[levwava - 1] == 0.f)))) { + levwava--; + } + } + + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwava < 7) { + levwava = 7; + } + } + + levwava = rtengine::min(maxlevelcrop, levwava); + levwava = rtengine::min(maxlev2, levwava); + levwava = rtengine::min(levwav, levwava); + if (settings->verbose) { + printf("Leval decomp a=%i\n", levwava); + } + + if (levwava > 0) { + const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwava, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + if (!adecomp->memory_allocation_failed()) { + if(levwava == 6) { + edge = 1; + } + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0 && isdenoisL)) { + if (settings->verbose) { + printf("denoise standard a \n"); + } + + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + + } else if (cp.noiseena && ((cp.chromfi > 0.f && cp.chromco >= 0.f) && cp.quamet == 1 && isdenoisL)){ + if (settings->verbose) { + printf("denoise bishrink a \n"); + } + + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + + } + + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab, wavNestedLevels); + + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + + adecomp->reconstruct(labco->data + datalen, cp.strength); + + } + } + + int levwavb = levwav; + + if (!exblurab && cp.chrores == 0.f && cp.blurcres == 0.f && !cp.noiseena && !cp.tonemap && !cp.resena && !cp.chromena && !cp.toningena && !cp.finena && !cp.edgeena && params->wavelet.CLmethod == "all" && !cp.cbena) { // no processing of residual ab => we probably can reduce the number of levels + while (levwavb > 0 && !cp.diag && (((cp.CHmet == 2 && (cp.chro == 0.f || cp.mul[levwavb - 1] == 0.f)) || (cp.CHmet != 2 && (levwavb == 10 || (!cp.curv || cp.mulC[levwavb - 1] == 0.f))))) && (!cp.opaBY || levwavb == 10 || (cp.opaBY && cp.mulopaBY[levwavb - 1] == 0.f)) && ((levwavb == 10 || (cp.CHSLmet == 1 && cp.mulC[levwavb - 1] == 0.f)))) { + levwavb--; + } + } + + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwavb < 7) { + levwavb = 7; + } + } + + + levwavb = rtengine::min(maxlevelcrop, levwavb); + levwavb = rtengine::min(maxlev2, levwavb); + levwavb = rtengine::min(levwav, levwavb); + + if (settings->verbose) { + printf("Leval decomp b=%i\n", levwavb); + } + + if (levwavb > 0) { + const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavb, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + if(levwavb == 6) { + edge = 1; + } + + if (!bdecomp->memory_allocation_failed()) { + // if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.chromco < 2.f )) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0 && isdenoisL)) { + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + if (settings->verbose) { + printf("Denoise standard b\n"); + } + } else if (cp.noiseena && ((cp.chromfi > 0.f && cp.chromco >= 0.f) && cp.quamet == 1 && isdenoisL)){ + + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + if (settings->verbose) { + printf("Denoise bishrink b\n"); + } + + } + + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab, wavNestedLevels); + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); + bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); + } + } + } else {// a and b + int levwavab = levwav; + + if (cp.chromfi > 0.f || cp.chromco > 0.f) { + if (levwavab < 7) { + levwavab = 7; + } + } + + if (levwavab > 0) { + const std::unique_ptr adecomp(new wavelet_decomposition(labco->data + datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + const std::unique_ptr bdecomp(new wavelet_decomposition(labco->data + 2 * datalen, labco->W, labco->H, levwavab, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + + if (!adecomp->memory_allocation_failed() && !bdecomp->memory_allocation_failed()) { + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0 && isdenoisL)) { + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + if (settings->verbose) { + printf("Denoise standard ab\n"); + } + } else if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 1 && isdenoisL)) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, variC, edge, noisevarab_r, true, false, false, 1); + if (settings->verbose) { + printf("Denoise bishrink ab\n"); + } + } + + Evaluate2(*adecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab, wavNestedLevels); + WaveletcontAllAB(labco, varhue, varchro, *adecomp, wavblcurve, waOpacityCurveW, cp, true, skip, meanab, sigmaab); + if (cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 0 && isdenoisL)) { + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + } else if(cp.noiseena && ((cp.chromfi > 0.f || cp.chromco > 0.f) && cp.quamet == 1 && isdenoisL)) { + WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, variCb, edge, noisevarab_r, true, false, false, 1); + } + + Evaluate2(*bdecomp, meanab, meanNab, sigmaab, sigmaNab, MaxPab, MaxNab, wavNestedLevels); + + WaveletcontAllAB(labco, varhue, varchro, *bdecomp, wavblcurve, waOpacityCurveW, cp, false, skip, meanab, sigmaab); + WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili); + + adecomp->reconstruct(labco->data + datalen, cp.strength); + bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); + + } + } + } + + delete[] noisevarchrom; + + if (hhCurve) { + delete hhCurve; + } + + if (usechrom) { + Ldecomp->reconstruct(labco->data, cp.strength); + } + } } - if (hhCurve) { - delete hhCurve; - } - - if(numtiles > 1 || (numtiles == 1 /*&& cp.avoi*/)) {//in all case since I add contrast curve + if (numtiles > 1 || (numtiles == 1 /*&& cp.avoi*/)) { //in all case since I add contrast curve //calculate mask for feathering output tile overlaps float Vmask[height + overlap] ALIGNED16; float Hmask[width + overlap] ALIGNED16; - if(numtiles > 1) { + if (numtiles > 1) { for (int i = 0; i < height; i++) { Vmask[i] = 1; } @@ -1077,62 +1932,58 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const bool highlight = params->toneCurve.hrenabled; #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for schedule(dynamic,16) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = tiletop; i < tilebottom; i++) { - int i1 = i - tiletop; + const int i1 = i - tiletop; float L, a, b; #ifdef __SSE2__ - int rowWidth = tileright - tileleft; + const int rowWidth = tileright - tileleft; float atan2Buffer[rowWidth] ALIGNED64; float chprovBuffer[rowWidth] ALIGNED64; float xBuffer[rowWidth] ALIGNED64; float yBuffer[rowWidth] ALIGNED64; - if(cp.avoi) { - int col; - __m128 av, bv; - __m128 cv, yv, xv; - __m128 zerov = _mm_setzero_ps(); - __m128 onev = _mm_set1_ps(1.f); - __m128 c327d68v = _mm_set1_ps(327.68f); - vmask xyMask; + if (cp.avoi) { + int col = 0; + const vfloat onev = F2V(1.f); + const vfloat c327d68v = F2V(327.68f); - for(col = 0; col < rowWidth - 3; col += 4) { - av = LVFU(labco->a[i1][col]); - bv = LVFU(labco->b[i1][col]); + for (; col < rowWidth - 3; col += 4) { + const vfloat av = LVFU(labco->a[i1][col]); + const vfloat bv = LVFU(labco->b[i1][col]); STVF(atan2Buffer[col], xatan2f(bv, av)); - cv = vsqrtf(SQRV(av) + SQRV(bv)); - yv = av / cv; - xv = bv / cv; - xyMask = vmaskf_eq(zerov, cv); + const vfloat cv = vsqrtf(SQRV(av) + SQRV(bv)); + vfloat yv = av / cv; + vfloat xv = bv / cv; + const vmask xyMask = vmaskf_eq(ZEROV, cv); yv = vself(xyMask, onev, yv); - xv = vself(xyMask, zerov, xv); + xv = vselfnotzero(xyMask, xv); STVF(yBuffer[col], yv); STVF(xBuffer[col], xv); STVF(chprovBuffer[col], cv / c327d68v); } - for(; col < rowWidth; col++) { - float a = labco->a[i1][col]; - float b = labco->b[i1][col]; - atan2Buffer[col] = xatan2f(b, a); - float Chprov1 = sqrtf(SQR(a) + SQR(b)); - yBuffer[col] = (Chprov1 == 0.f) ? 1.f : a / Chprov1; - xBuffer[col] = (Chprov1 == 0.f) ? 0.f : b / Chprov1; - chprovBuffer[col] = Chprov1 / 327.68; + for (; col < rowWidth; col++) { + const float la = labco->a[i1][col]; + const float lb = labco->b[i1][col]; + atan2Buffer[col] = xatan2f(lb, la); + const float Chprov1 = sqrtf(SQR(la) + SQR(lb)); + yBuffer[col] = (Chprov1 == 0.f) ? 1.f : la / Chprov1; + xBuffer[col] = (Chprov1 == 0.f) ? 0.f : lb / Chprov1; + chprovBuffer[col] = Chprov1 / 327.68f; } } #endif for (int j = tileleft; j < tileright; j++) { - int j1 = j - tileleft; + const int j1 = j - tileleft; - if(cp.avoi) { //Gamut and Munsell + if (cp.avoi) { //Gamut and Munsell #ifdef __SSE2__ float HH = atan2Buffer[j1]; float Chprov1 = chprovBuffer[j1]; @@ -1149,10 +2000,9 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const sincosv.x = (Chprov1 == 0.0f) ? 0.f : b / (Chprov1); Chprov1 /= 327.68f; #endif - L = labco->L[i1][j1]; const float Lin = labco->L[i1][j1]; - if(wavclCurve && cp.finena) { + if (wavclCurve && cp.finena) { labco->L[i1][j1] = (0.5f * Lin + 1.5f * wavclCurve[Lin]) / 2.f; //apply contrast curve } @@ -1162,13 +2012,7 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float Lprov2 = Lold[i][j] / 327.68f; float memChprov = varchro[i1][j1]; float R, G, B; -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; - Color::gamutLchonly(HH, sincosv, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f, neg, more_rgb); -#else Color::gamutLchonly(HH, sincosv, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f); -#endif L = Lprov1 * 327.68f; a = 327.68f * Chprov1 * sincosv.y; //gamut @@ -1176,15 +2020,11 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const float correctionHue = 0.0f; // Munsell's correction float correctlum = 0.0f; Lprov1 = L / 327.68f; - float Chprov = sqrtf(SQR(a) + SQR(b)) / 327.68f; -#ifdef _DEBUG - Color::AllMunsellLch(true, Lprov1, Lprov2, HH, Chprov, memChprov, correctionHue, correctlum, MunsDebugInfo); -#else + const float Chprov = sqrtf(SQR(a) + SQR(b)) / 327.68f; Color::AllMunsellLch(true, Lprov1, Lprov2, HH, Chprov, memChprov, correctionHue, correctlum); -#endif - if(correctionHue != 0.f || correctlum != 0.f) { // only calculate sin and cos if HH changed - if(fabs(correctionHue) < 0.015f) { + if (correctionHue != 0.f || correctlum != 0.f) { // only calculate sin and cos if HH changed + if (std::fabs(correctionHue) < 0.015f) { HH += correctlum; // correct only if correct Munsell chroma very little. } @@ -1192,12 +2032,12 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } a = 327.68f * Chprov * sincosv.y; // apply Munsell - b = 327.68f * Chprov * sincosv.x; //aply Munsell + b = 327.68f * Chprov * sincosv.x; // apply Munsell } else {//general case L = labco->L[i1][j1]; const float Lin = std::max(0.f, L); - if(wavclCurve && cp.finena) { + if (wavclCurve && cp.finena) { labco->L[i1][j1] = (0.5f * Lin + 1.5f * wavclCurve[Lin]) / 2.f; //apply contrast curve } @@ -1206,12 +2046,18 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const b = labco->b[i1][j1]; } - if(numtiles > 1) { + if (numtiles > 1) { float factor = Vmask[i1] * Hmask[j1]; + if(L <= 0.f) { + L= 1.f; + } dsttmp->L[i][j] += factor * L; dsttmp->a[i][j] += factor * a; dsttmp->b[i][j] += factor * b; } else { + if(L <= 0.f) { + L= 1.f; + } dsttmp->L[i][j] = L; dsttmp->a[i][j] = a; dsttmp->b[i][j] = b; @@ -1221,63 +2067,214 @@ void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const } } - if(LoldBuffer != nullptr) { + if (LoldBuffer != nullptr) { delete [] LoldBuffer; delete [] Lold; } - if(numtiles > 1) { + if (numtiles > 1) { delete labco; } } } for (int i = 0; i < tileheight; i++) - if(varhue[i] != nullptr) { + if (varhue[i] != nullptr) { delete [] varhue[i]; } delete [] varhue; - - for (int i = 0; i < tileheight; i++) { - delete [] varchro[i]; - } - - delete [] varchro; - } #ifdef _OPENMP omp_set_nested(oldNested); #endif - if(numtiles != 1) { + if (numtiles != 1) { dst->CopyFrom(dsttmp); delete dsttmp; } -#ifdef _DEBUG - delete MunsDebugInfo; + if (waparams.softradend > 0.f && cp.finena) { + float guid = waparams.softradend; + float strend = waparams.strend; + float detend = (float) waparams.detend; + float thrend = 0.01f * (float) waparams.thrend; + int ww = lab->W; + int hh = lab->H; + array2D LL(ww, hh); + array2D LLbef(ww, hh); + array2D LAbef(ww, hh); + array2D LBbef(ww, hh); + array2D guide(ww, hh); + const float blend = LIM01(float(strend) / 100.f); + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; + float meang[10]; + float meanNg[10]; + float sigmag[10]; + float sigmaNg[10]; + float MaxPg[10]; + float MaxNg[10]; + + bool multiTh = false; + +#ifdef _OPENMP + + if (numthreads > 1) { + multiTh = true; + } + + #pragma omp parallel for +#endif + for (int y = 0; y < hh; y++) { + for (int x = 0; x < ww; x++) { + LL[y][x] = dst->L[y][x]; + LLbef[y][x] = dst->L[y][x]; + LAbef[y][x] = dst->a[y][x]; + LBbef[y][x] = dst->b[y][x]; + float ll = LL[y][x] / 32768.f; + guide[y][x] = xlin2log(rtengine::max(ll, 0.f), 10.f); + } + } + array2D iL(ww, hh, LL, 0); + int r = rtengine::max(int(guid / skip), 1); + + const float epsil = 0.001f * std::pow(2, - detend); + rtengine::guidedFilterLog(guide, 10.f, LL, r, epsil, multiTh); + //take Hue to modulate LL + //LL in function of LLbef and Labef Lbbef + if(wavguidutili) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < hh ; y++) { + for (int x = 0; x < ww; x++) { + float hueG = xatan2f(LBbef[y][x], LAbef[y][x]); + float valparam = 1.f * (static_cast(wavguidCurve->getVal(Color::huelab_to_huehsv2(hueG))) - 0.5f); + LL[y][x] = LLbef[y][x] + (LL[y][x] - LLbef[y][x]) * (1.f + valparam); + } + } + } + //end hue + + + if (thrend > 0.f) { + //2 decomposition LL after guidefilter and dst before (perhaps dst no need) + const std::unique_ptr LdecompLL(new wavelet_decomposition(LL[0], ww, hh, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + const std::unique_ptr Ldecompdst(new wavelet_decomposition(dst->L[0], ww, hh, levwavL, 1, skip, rtengine::max(1, wavNestedLevels), DaubLen)); + if (!LdecompLL->memory_allocation_failed() && !Ldecompdst->memory_allocation_failed()) { + Evaluate2(*LdecompLL, meang, meanNg, sigmag, sigmaNg, MaxPg, MaxNg, wavNestedLevels); + Evaluate2(*Ldecompdst, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavNestedLevels); + constexpr float sig = 2.f; + + // original code for variable sig + float k = sig; + // cppcheck-suppress knownConditionTrueFalse + if (sig > 1.f) { + k = SQR(sig); + } + + float thr = 0.f; + if (thrend < 0.02f) thr = 0.5f; + else if (thrend < 0.1f) thr = 0.2f; + else thr = 0.f; + + FlatCurve wavguid({ + FCT_MinMaxCPoints, + 0, 1, 0.35, 0.35,thrend, 1.0, 0.35, 0.35, thrend + 0.01f, thr, 0.35, 0.35, 1, thr, 0.35, 0.35 + }); + + for (int dir = 1; dir < 4; dir++) { + for (int level = 0; level < levwavL-1; level++) { + const int Wlvl_L = LdecompLL->level_W(level); + const int Hlvl_L = LdecompLL->level_H(level); + float* const* WavCoeffs_L = LdecompLL->level_coeffs(level);//first decomp denoised + float* const* WavCoeffs_L2 = Ldecompdst->level_coeffs(level);//second decomp before denoise + if (settings->verbose) { + printf("level=%i mean=%.0f meanden=%.0f sigma=%.0f sigmaden=%.0f Max=%.0f Maxden=%.0f\n", level, mean[level], meang[level], sigma[level], sigmag[level],MaxP[level], MaxPg[level]); + } + + //find local contrast + const float tempmean = 0.3f * mean[level] + 0.7f * meang[level]; + const float tempsig = 0.3f * sigma[level] + 0.7f * sigmag[level]; + const float tempmax = 0.3f * MaxP[level] + 0.7f * MaxPg[level]; + + if (MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve + constexpr float insigma = 0.666f; //SD + const float logmax = log(tempmax); //log Max + const float rapX = (tempmean + sig * tempsig) / tempmax; //rapport between sD / max + const float inx = log(insigma); + const float iny = log(rapX); + const float rap = inx / iny; //koef + const float asig = 0.166f / (tempsig * sig); + const float bsig = 0.5f - asig * tempmean; + const float amean = 1.f / tempmean; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, Wlvl_L * 16) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif + for (int i = 0; i < Wlvl_L * Hlvl_L; i++) { + float absciss; + const float tempwav = std::fabs(0.7f * WavCoeffs_L[dir][i] + 0.3f * WavCoeffs_L2[dir][i]); + + if (tempwav >= tempmean + sig * tempsig) { //for max + const float vald = (xlogf(tempwav) - logmax) * rap; + absciss = xexpf(vald); + } else if (tempwav >= tempmean) { + absciss = asig * tempwav + bsig; + } else { + absciss = amean * tempwav; + if (sig == 2.f) { // for sig = 2.f we can use a faster calculation because the exponent in this case is 0.25 + absciss = 0.5f * std::sqrt(std::sqrt(absciss)); + } else { // original code for variable sig + absciss = 0.5f * pow_F(absciss, 1.f / k); + } + } + float kc = wavguid.getVal(absciss) - 1.f; + kc = kc < 0.f ? -SQR(kc) : kc; // approximation to simulate sliders denoise + + const float reduceeffect = kc <= 0.f ? 1.f : 1.2f;//1.2 allows to increase denoise (not used) + const float kinterm = rtengine::max(1.f + reduceeffect * kc, 0.f); + WavCoeffs_L[dir][i] = intp(kinterm, WavCoeffs_L[dir][i], WavCoeffs_L2[dir][i]); // interpolate using kinterm + } + } + } + } + LdecompLL->reconstruct(LL[0], cp.strength); + } + } + + //end local contrast +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < hh ; y++) { + for (int x = 0; x < ww; x++) { + LL[y][x] = intp(blend, LL[y][x] , iL[y][x]); + dst->L[y][x] = LL[y][x]; + } + } + } } -#undef TS -#undef fTS -#undef offset -#undef epsilon -void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &averagePlus, float &averageNeg, float &max, float &min) +void ImProcFunctions::Aver(const float* RESTRICT DataList, int datalen, float &averagePlus, float &averageNeg, float &max, float &min, int numThreads) { //find absolute mean int countP = 0, countN = 0; 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 + constexpr float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 very low value max = 0.f; - min = 0.f; + min = RT_INFINITY_F; #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(numThreads) if (numThreads>1) #endif { float lmax = 0.f, lmin = 0.f; @@ -1285,22 +2282,14 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver #pragma omp for reduction(+:averaP,averaN,countP,countN) nowait #endif - for(int i = 0; i < datalen; i++) { - if(DataList[i] >= thres) { - averaP += DataList[i]; - - if(DataList[i] > lmax) { - lmax = DataList[i]; - } - + for (int i = 0; i < datalen; i++) { + if (DataList[i] >= thres) { + averaP += static_cast(DataList[i]); + lmax = rtengine::max(lmax, DataList[i]); countP++; - } else if(DataList[i] < -thres) { - averaN += DataList[i]; - - if(DataList[i] < lmin) { - lmin = DataList[i]; - } - + } else if (DataList[i] < -thres) { + averaN += static_cast(DataList[i]); + lmin = rtengine::min(lmin, DataList[i]); countN++; } } @@ -1309,18 +2298,18 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver #pragma omp critical #endif { - max = max > lmax ? max : lmax; - min = min < lmin ? min : lmin; + max = rtengine::max(max, lmax); + min = rtengine::min(min, lmin); } } - if(countP > 0) { + if (countP > 0) { averagePlus = averaP / countP; } else { averagePlus = 0; } - if(countN > 0) { + if (countN > 0) { averageNeg = averaN / countN; } else { averageNeg = 0; @@ -1329,33 +2318,33 @@ 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) +void ImProcFunctions::Sigma(const float* RESTRICT DataList, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg, int numThreads) { int countP = 0, countN = 0; 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 + float thres = 32.7f;//different fom zero to take into account only data large enough 32.7 = 0.1 in range 0..100 #ifdef _OPENMP - #pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(numThreads) if (numThreads>1) #endif - for(int i = 0; i < datalen; i++) { - if(DataList[i] >= thres) { - variP += SQR(DataList[i] - averagePlus); + for (int i = 0; i < datalen; i++) { + if (DataList[i] >= thres) { + variP += static_cast(SQR(DataList[i] - averagePlus)); countP++; - } else if(DataList[i] <= -thres) { - variN += SQR(DataList[i] - averageNeg); + } else if (DataList[i] <= -thres) { + variN += static_cast(SQR(DataList[i] - averageNeg)); countN++; } } - if(countP > 0) { + if (countP > 0) { sigmaPlus = sqrt(variP / countP); } else { sigmaPlus = 0; } - if(countN > 0) { + if (countN > 0) { sigmaNeg = sqrt(variN / countN); } else { sigmaNeg = 0; @@ -1363,8 +2352,7 @@ void ImProcFunctions::Sigma( float * RESTRICT DataList, int datalen, float aver } -void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L, - float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) +void ImProcFunctions::Evaluate2(const wavelet_decomposition &WaveletCoeffs_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, int numThreads) { //StopWatch Stop1("Evaluate2"); int maxlvl = WaveletCoeffs_L.maxlevel(); @@ -1374,14 +2362,66 @@ void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L, int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); + const float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - Eval2 (WavCoeffs_L, lvl, Wlvl_L, Hlvl_L, mean, meanN, sigma, sigmaN, MaxP, MaxN); + Eval2(WavCoeffs_L, lvl, Wlvl_L, Hlvl_L, mean, meanN, sigma, sigmaN, MaxP, MaxN, numThreads); } } -void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, - int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) + +void ImProcFunctions::calceffect(int level, float *mean, float *sigma, float *mea, float effect, float offs) +{ + float rap = 0.f; + float sig = 1.f; + + if (effect < 1.f) { + sig = effect; + } + + if (effect <= 1.f) { + rap = offs * mean[level] - sig * sigma[level]; + } + + if (rap > 0.f) { + mea[0] = rap; + } else { + mea[0] = mean[level] / 6.f; + } + + rap = 0.f; + + if (effect <= 1.f) { + rap = offs * mean[level] - 0.5f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[1] = rap; + } else { + mea[1] = mean[level] / 4.f; + } + + rap = 0.f; + + if (effect <= 1.f) { + rap = offs * mean[level] - 0.2f * sig * sigma[level]; + } + + if (rap > 0.f) { + mea[2] = rap; + } else { + mea[2] = mean[level] / 2.f; + } + + mea[3] = offs * mean[level]; // 50% data + mea[4] = offs * mean[level] + effect * sigma[level] / 2.f; + mea[5] = offs * mean[level] + effect * sigma[level]; //66% + mea[6] = offs * mean[level] + effect * 1.2f * sigma[level]; + mea[7] = offs * mean[level] + effect * 1.5f * sigma[level]; // + mea[8] = offs * mean[level] + effect * 2.f * sigma[level]; //95% + mea[9] = offs * mean[level] + effect * 2.5f * sigma[level]; //99% +} + +void ImProcFunctions::Eval2(const float* const* WavCoeffs_L, int level, int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, int numThreads) { float avLP[4], avLN[4]; @@ -1390,8 +2430,8 @@ void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, float AvL, AvN, SL, SN, maxLP, maxLN; for (int dir = 1; dir < 4; dir++) { - Aver(WavCoeffs_L[dir], W_L * H_L, avLP[dir], avLN[dir], maxL[dir], minL[dir]); - Sigma(WavCoeffs_L[dir], W_L * H_L, avLP[dir], avLN[dir], sigP[dir], sigN[dir]); + Aver(WavCoeffs_L[dir], W_L * H_L, avLP[dir], avLN[dir], maxL[dir], minL[dir], numThreads); + Sigma(WavCoeffs_L[dir], W_L * H_L, avLP[dir], avLN[dir], sigP[dir], sigN[dir], numThreads); } AvL = 0.f; @@ -1431,17 +2471,17 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress float exponent; - if(DetailBoost > 0.f && DetailBoost < 0.05f ) { + if (DetailBoost > 0.f && DetailBoost < 0.05f) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - exponent = 1.2f * xlogf( -betemp); + exponent = 1.2f * xlogf(-betemp); exponent /= 20.f; - } else if(DetailBoost >= 0.05f && DetailBoost < 0.25f ) { + } else if (DetailBoost >= 0.05f && DetailBoost < 0.25f) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - exponent = 1.2f * xlogf( -betemp); + exponent = 1.2f * xlogf(-betemp); exponent /= (-75.f * DetailBoost + 23.75f); - } else if(DetailBoost >= 0.25f) { + } else if (DetailBoost >= 0.25f) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - exponent = 1.2f * xlogf( -betemp); + exponent = 1.2f * xlogf(-betemp); exponent /= (-2.f * DetailBoost + 5.5f); } else { exponent = (Compression - 1.0f) / 20.f; @@ -1455,17 +2495,17 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress #pragma omp parallel #endif { - vfloat exponentv = F2V(exponent); + const vfloat exponentv = F2V(exponent); #ifdef _OPENMP #pragma omp for #endif - for(int i = 0; i < n - 3; i += 4) { + for (int i = 0; i < n - 3; i += 4) { STVFU(Source[i], xexpf(xlogf(LVFU(Source[i])) * exponentv)); } } - for(int i = n - (n % 4); i < n; i++) { + for (int i = n - (n % 4); i < n; i++) { Source[i] = xexpf(xlogf(Source[i]) * exponent); } @@ -1474,7 +2514,7 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress #pragma omp parallel for #endif - for(int i = 0; i < n; i++) { + for (int i = 0; i < n; i++) { Source[i] = xexpf(xlogf(Source[i]) * exponent); } @@ -1482,336 +2522,285 @@ void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compress } -void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0) +void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, const cont_params &cp, int W_L, int H_L, float max0) { - float stren = cp.tmstrength; - float gamm = params->wavelet.gamma; - cp.TMmeth = 2; //default after testing - - if(cp.TMmeth == 1) { - min0 = 0.0f; - max0 = 32768.f; - } else if (cp.TMmeth == 2) { - min0 = 0.0f; - } + const float stren = cp.tmstrength; + const float gamm = params->wavelet.gamma; #ifdef _OPENMP #pragma omp parallel for #endif - for(int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L0[i] = (WavCoeffs_L0[i] - min0) / max0; - WavCoeffs_L0[i] *= gamm; - } - - float Compression = expf(-stren); //This modification turns numbers symmetric around 0 into exponents. - float DetailBoost = stren; - - if(stren < 0.0f) { - DetailBoost = 0.0f; //Go with effect of exponent only if uncompressing. + for (int i = 0; i < W_L * H_L; i++) { + WavCoeffs_L0[i] *= (gamm / max0); } + const float Compression = std::exp(-stren); //This modification turns numbers symmetric around 0 into exponents. + const float DetailBoost = std::max(stren, 0.f); //Go with effect of exponent only if uncompressing. CompressDR(WavCoeffs_L0, W_L, H_L, Compression, DetailBoost); - + max0 /= gamm; #ifdef _OPENMP #pragma omp parallel for // removed schedule(dynamic,10) #endif - for(int ii = 0; ii < W_L * H_L; ii++) { - WavCoeffs_L0[ii] = WavCoeffs_L0[ii] * max0 * (1.f / gamm) + min0; + for (int ii = 0; ii < W_L * H_L; ii++) { + WavCoeffs_L0[ii] *= max0; } } - - - -void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0) +void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, const cont_params& cp, int W_L, int H_L, float max0) { - float stren = cp.tmstrength; - float edgest = params->epd.edgeStopping; - float sca = params->epd.scale; - float gamm = params->wavelet.gamma; - float rew = params->epd.reweightingIterates; + const float stren = cp.tmstrength; + const float edgest = params->wavelet.edgs; + const float sca = params->wavelet.scale; + const float gamm = params->wavelet.gamma; + constexpr int rew = 0; //params->epd.reweightingIterates; + EdgePreservingDecomposition epd2(W_L, H_L); - cp.TMmeth = 2; //default after testing - if(cp.TMmeth == 1) { - min0 = 0.0f; - max0 = 32768.f; - } else if (cp.TMmeth == 2) { - min0 = 0.0f; - } - - // max0=32768.f; #ifdef _OPENMP #pragma omp parallel for #endif - for(int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L0[i] = (WavCoeffs_L0[i] - min0) / max0; - WavCoeffs_L0[i] *= gamm; + for (int i = 0; i < W_L * H_L; i++) { + WavCoeffs_L0[i] *= (gamm / max0); } - float Compression = expf(-stren); //This modification turns numbers symmetric around 0 into exponents. - float DetailBoost = stren; - - if(stren < 0.0f) { - DetailBoost = 0.0f; //Go with effect of exponent only if uncompressing. - } + const float Compression = std::exp(-stren); //This modification turns numbers symmetric around 0 into exponents. + const float DetailBoost = std::max(stren, 0.f); //Go with effect of exponent only if uncompressing. //Auto select number of iterates. Note that p->EdgeStopping = 0 makes a Gaussian blur. - if(Iterates == 0) { + if (Iterates == 0) { Iterates = (unsigned int)(edgest * 15.0f); } + epd2.CompressDynamicRange(WavCoeffs_L0, sca / skip, edgest, Compression, DetailBoost, Iterates, rew); - epd2.CompressDynamicRange(WavCoeffs_L0, (float)sca / skip, edgest, Compression, DetailBoost, Iterates, rew); - + max0 /= gamm; //Restore past range, also desaturate a bit per Mantiuk's Color correction for tone mapping. #ifdef _OPENMP #pragma omp parallel for // removed schedule(dynamic,10) #endif - for(int ii = 0; ii < W_L * H_L; ii++) { - WavCoeffs_L0[ii] = WavCoeffs_L0[ii] * max0 * (1.f / gamm) + min0; + for (int ii = 0; ii < W_L * H_L; ii++) { + WavCoeffs_L0[ii] *= max0; } } -void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) +void ImProcFunctions::WaveletcontAllLfinal(wavelet_decomposition& WaveletCoeffs_L, const cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) { int maxlvl = WaveletCoeffs_L.maxlevel(); - float * WavCoeffs_L0 = WaveletCoeffs_L.coeff0; + float* WavCoeffs_L0 = WaveletCoeffs_L.get_coeff0(); for (int dir = 1; dir < 4; dir++) { for (int lvl = 0; lvl < maxlvl; lvl++) { int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - finalContAllL (WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, mean, sigma, MaxP, waOpacityCurveWL); + float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); + finalContAllL(WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, mean, sigma, MaxP, waOpacityCurveWL); } } } -void ImProcFunctions::WaveletcontAllL(LabImage * labco, 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 ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_L, const Wavblcurve & wavblcurve, + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { - int maxlvl = WaveletCoeffs_L.maxlevel(); - int W_L = WaveletCoeffs_L.level_W(0); - int H_L = WaveletCoeffs_L.level_H(0); - float * WavCoeffs_L0 = WaveletCoeffs_L.coeff0; +// BENCHFUN + const int maxlvl = WaveletCoeffs_L.maxlevel(); + const int W_L = WaveletCoeffs_L.level_W(0); + const int H_L = WaveletCoeffs_L.level_H(0); + float* WavCoeffs_L0 = WaveletCoeffs_L.get_coeff0(); - float maxh = 2.5f; //amplification contrast above mean - float maxl = 2.5f; //reduction contrast under mean - 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; + const float contrast = cp.contrast; 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 + 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 _OPENMP - #pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for reduction(+:avedbl) reduction(max:max0) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = 0; i < W_L * H_L; i++) { - avedbl += WavCoeffs_L0[i]; + avedbl += static_cast(WavCoeffs_L0[i]); + max0 = std::max(WavCoeffs_L0[i], max0); } - -#ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) -#endif - { - float lminL = FLT_MAX; - float lmaxL = 0.f; - -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < W_L * H_L; i++) { - if(WavCoeffs_L0[i] < lminL) { - lminL = WavCoeffs_L0[i]; - } - - if(WavCoeffs_L0[i] > lmaxL) { - lmaxL = WavCoeffs_L0[i]; - } - - } - -#ifdef _OPENMP - #pragma omp critical -#endif - { - if(lminL < min0) { - min0 = lminL; - } - - if(lmaxL > max0) { - max0 = lmaxL; - } - } - - } - } - // printf("MAXmax0=%f MINmin0=%f\n",max0,min0); - //tone mapping - if(cp.tonemap && cp.contmet == 2 && cp.resena) { + if (cp.tonemap && cp.contmet == 2 && cp.resena) { //iterate = 5 - EPDToneMapResid(WavCoeffs_L0, 0, skip, cp, W_L, H_L, max0, min0); - + EPDToneMapResid(WavCoeffs_L0, 0, skip, cp, W_L, H_L, max0); } //end tonemapping max0 /= 327.68f; - min0 /= 327.68f; - float ave = avedbl / (double)(W_L * H_L); - float av = ave / 327.68f; - float ah = (multH - 1.f) / (av - max0); // - float bh = 1.f - max0 * ah; - float al = (multL - 1.f) / (av - min0); - float bl = 1.f - min0 * al; - float factorx = 1.f; -// float *koeLi[9]; -// float maxkoeLi[9]; - float *koeLi[12]; - float maxkoeLi[12]; + const float ave = avedbl / (W_L * H_L); + const float avg = LIM01(ave / 32768.f); - float *koeLibuffer = nullptr; + const double contreal = 0.6 * contrast; + DiagonalCurve resid_contrast({ + DCT_NURBS, + 0, 0, + avg - avg * (0.6 - contreal / 250.0), avg - avg * (0.6 + contreal / 250.0), + avg + (1. - avg) * (0.6 - contreal / 250.0), avg + (1. - avg) * (0.6 + contreal / 250.0), + 1, 1 + }); - for(int y = 0; y < 12; y++) { - maxkoeLi[y] = 0.f; //9 + if (contrast != 0.f && cp.resena && max0 > 0.f) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step + +#ifdef _OPENMP + #pragma omp parallel for num_threads(wavNestedLevels) if (wavNestedLevels>1) +#endif + + for (int i = 0; i < W_L * H_L; i++) { + float buf = LIM01(WavCoeffs_L0[i] / 32768.f); + buf = resid_contrast.getVal(buf); + buf *= 32768.f; + WavCoeffs_L0[i] = buf; + } } - koeLibuffer = new float[12 * H_L * W_L]; //12 + if (cp.tonemap && cp.contmet == 1 && cp.resena) { + const float maxp = max0 * 256.f; + ContrastResid(WavCoeffs_L0, cp, W_L, H_L, maxp); + } - for (int i = 0; i < 12; i++) { //9 + // if ((cp.conres >= 0.f || cp.conresH >= 0.f) && cp.resena && !cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + 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 + const std::unique_ptr temp(new LabImage(W_L, H_L)); +#ifdef _OPENMP + #pragma omp parallel for num_threads(wavNestedLevels) if (wavNestedLevels>1) +#endif + + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + temp->L[i][j] = WavCoeffs_L0[i * W_L + j]; + } + } + + ImProcFunctions::shadowsHighlights(temp.get(), true, 1, cp.conresH, cp.conres, cp.radius, skip, cp.thH, cp.th); + +#ifdef _OPENMP + #pragma omp parallel for num_threads(wavNestedLevels) if (wavNestedLevels>1) +#endif + + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + WavCoeffs_L0[i * W_L + j] = temp->L[i][j]; + } + } + } + + // if ((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena && cp.oldsh) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step + 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 _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < W_L * H_L; i++) { + float LL = WavCoeffs_L0[i]; + float LL100 = LL / 327.68f; + float tran = 5.f;//transition + //shadow + + if (cp.th > (100.f - tran)) { + tran = 100.f - cp.th; + } + + if (LL100 < cp.th) { + constexpr float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? + float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th + float kk = aalp * LL100 + alp; + WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); + } else if (LL100 < cp.th + tran) { + float ath = -cp.conres / tran; + float bth = cp.conres - ath * cp.th; + WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); + } + + //highlight + tran = 5.f; + + if (cp.thH < (tran)) { + tran = cp.thH; + } + + if (LL100 > cp.thH) { + WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); + } else if (LL100 > (cp.thH - tran)) { + float athH = cp.conresH / tran; + float bthH = cp.conresH - athH * cp.thH; + WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); + } + } + } + +//Blur luma + if (cp.blurres != 0.f && cp.resena) { + int minWL = min(W_L, H_L); + + //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); + if (minWL > 140) { //disabled if too low windows + constexpr float k = 0.5f; + float rad = k * cp.blurres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; + + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_L0[i]; + } + + boxblur(bef, aft, rad, W_L, H_L, false); + + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_L0[i] = aft[i]; + } + + delete[] bef; + delete[] aft; + } + } + + float *koeLi[12]; + + const std::unique_ptr koeLibuffer(new float[12 * H_L * W_L]()); + + for (int i = 0; i < 12; i++) { koeLi[i] = &koeLibuffer[i * W_L * H_L]; } - for(int j = 0; j < 12; j++) //9 - for (int i = 0; i < W_L * H_L; i++) { - koeLi[j][i] = 0.f; - } - + float maxkoeLi[12] = {0.f}; #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { - 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 _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < W_L * H_L; i++) { //contrast - if(WavCoeffs_L0[i] < 32768.f) { - float prov; - - if( WavCoeffs_L0[i] > ave) { - float kh = ah * (WavCoeffs_L0[i] / 327.68f) + bh; - prov = WavCoeffs_L0[i]; - WavCoeffs_L0[i] = ave + kh * (WavCoeffs_L0[i] - ave); - } else { - float kl = al * (WavCoeffs_L0[i] / 327.68f) + bl; - prov = WavCoeffs_L0[i]; - WavCoeffs_L0[i] = ave - kl * (ave - WavCoeffs_L0[i]); - } - - float diflc = WavCoeffs_L0[i] - prov; - diflc *= factorx; - WavCoeffs_L0[i] = prov + diflc; - } - } - } - } - - if(cp.tonemap && cp.contmet == 1 && cp.resena) { - float maxp = max0 * 256.f; - float minp = min0 * 256.f; -#ifdef _OPENMP - #pragma omp single -#endif - ContrastResid(WavCoeffs_L0, cp, W_L, H_L, maxp, minp); - } - -#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 _OPENMP - #pragma omp for nowait -#endif - - for (int i = 0; i < W_L * H_L; i++) { - float LL = WavCoeffs_L0[i]; - float LL100 = LL / 327.68f; - float tran = 5.f;//transition - //shadow - float alp = 3.f; //increase contrast sahdow in lowlights between 1 and ?? - - if(cp.th > (100.f - tran)) { - tran = 100.f - cp.th; - } - - if(LL100 < cp.th) { - float aalp = (1.f - alp) / cp.th; //no changes for LL100 = cp.th - float kk = aalp * LL100 + alp; - WavCoeffs_L0[i] *= (1.f + kk * cp.conres / 200.f); - } else if(LL100 < cp.th + tran) { - float ath = -cp.conres / tran; - float bth = cp.conres - ath * cp.th; - WavCoeffs_L0[i] *= (1.f + (LL100 * ath + bth) / 200.f); - } - - //highlight - tran = 5.f; - - if(cp.thH < (tran)) { - tran = cp.thH; - } - - if(LL100 > cp.thH) { - WavCoeffs_L0[i] *= (1.f + cp.conresH / 200.f); - } else if(LL100 > (cp.thH - tran)) { - float athH = cp.conresH / tran; - float bthH = cp.conresH - athH * cp.thH; - WavCoeffs_L0[i] *= (1.f + (LL100 * athH + bthH) / 200.f); - } - } - } - //enabled Lipschitz..replace simple by complex edge detection // I found this concept on the web (doctoral thesis on medical Imaging) // 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 change in calckoe - float edd = 3.f; - float eddlow = 15.f; + constexpr float edd = 3.f; + constexpr float eddlow = 15.f; float eddlipinfl = 0.005f * cp.edgsens + 0.4f; float eddlipampl = 1.f + cp.edgampl / 50.f; - - if(cp.detectedge) { //enabled Lipschitz control...more memory..more time... - float *tmCBuffer = new float[H_L * W_L]; + if (cp.detectedge && cp.val > 0) { //enabled Lipschitz control...more memory..more time... + const std::unique_ptr tmCBuffer(new float[H_L * W_L]); float *tmC[H_L]; for (int i = 0; i < H_L; i++) { tmC[i] = &tmCBuffer[i * W_L]; } + float gradw = cp.eddet; + float tloww = cp.eddetthr; #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) @@ -1819,17 +2808,14 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * for (int lvl = 0; lvl < 4; lvl++) { for (int dir = 1; dir < 4; dir++) { - int W_L = WaveletCoeffs_L.level_W(lvl); - int H_L = WaveletCoeffs_L.level_H(lvl); - - float ** WavCoeffs_LL = WaveletCoeffs_L.level_coeffs(lvl); - calckoe(WavCoeffs_LL, cp, koeLi, lvl , dir, W_L, H_L, edd, maxkoeLi, tmC); + const float* const* WavCoeffs_LL = WaveletCoeffs_L.level_coeffs(lvl); + float tempkoeli = 0.f; + calckoe (WavCoeffs_LL[dir], gradw, tloww, koeLi[lvl * 3 + dir - 1], lvl, W_L, H_L, edd, tempkoeli, tmC); + maxkoeLi[lvl * 3 + dir - 1] = tempkoeli ; // return convolution KoeLi and maxkoeLi of level 0 1 2 3 and Dir Horiz, Vert, Diag } } - delete [] tmCBuffer; - float aamp = 1.f + cp.eddetthrHi / 100.f; for (int lvl = 0; lvl < 4; lvl++) { @@ -1842,7 +2828,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //treatment of koeLi and maxkoeLi float interm = 0.f; - if(cp.lip3 && cp.lipp) { + if (cp.lip3 && cp.lipp) { // comparison between pixel and neighbours const auto neigh = cp.neigh == 1; const auto kneigh = neigh ? 28.f : 38.f; @@ -1881,11 +2867,11 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //Liamp=1 for eddlipinfl //liamp > 1 for alp >eddlipinfl and alph < 1 //Liamp < 1 for alp < eddlipinfl and alph > 0 - if(alph > 1.f) { + if (alph > 1.f) { alph = 1.f / alph; } - if(beta > 1.f) { + if (beta > 1.f) { beta = 1.f / beta; } @@ -1894,15 +2880,13 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //if not no edge or reduction float bet = 1.f; - //if(cp.lip3) {//enhance algorithm - if(alph > eddlipinfl && beta < 0.85f * eddlipinfl) { //0.85 arbitrary value ==> eliminate from edge if H V D too different + if (alph > eddlipinfl && beta < 0.85f * eddlipinfl) { //0.85 arbitrary value ==> eliminate from edge if H V D too different bet = beta; } - //} float AmpLip = 1.f; - if(alph > eddlipinfl) { + if (alph > eddlipinfl) { AmpLip = alipinfl * alph + blipinfl; //If beta low reduce kampli kampli = SQR(bet) * AmpLip * aamp; } else { @@ -1910,19 +2894,9 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * kampli = AmpLip / aamp; } - // 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] - + koeLi[lvl*3][(i-1)*W_L + j+1] +koeLi[lvl*3][(i+1)*W_L + j-1] +koeLi[lvl*3][(i+1)*W_L + j+1])/9.f; - } - */ - // apply to each direction Wavelet level : horizontal / vertiacle / diagonal - //interm += SQR(koeLi[lvl*3 + dir-1][i*W_L + j]); - interm *= kampli; - if(interm < cp.eddetthr / eddlow) { + if (interm < cp.eddetthr / eddlow) { interm = 0.01f; //eliminate too low values } @@ -1936,6 +2910,18 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // end } + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + break; + } + } + } + + std::unique_ptr aft; #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -1946,33 +2932,59 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); + float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - ContAllL (koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); + ContAllL(koeLi, maxkoeLi[lvl * 3 + dir - 1], true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveSH, ChCurve, Chutili); + if (std::min(Wlvl_L, Hlvl_L) > 180) { + if (wavblcurve && wavcurvecomp && cp.blena) { + // printf("Blur level L\n"); + float mea[10]; + const float effect = cp.bluwav; + constexpr float offs = 1.f; + calceffect(lvl, mean, sigma, mea, effect, offs); + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.6f, 0.4f, 0.2f, 0.1f, 0.01f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + if (!aft.get()) { + aft.reset(new float[Wlvl_L * Hlvl_L]); + } + //blur level + const float klev = wavblcurve[lvl * 55.5f] * 80.f / skip; + auto WavL = WavCoeffs_L[dir]; + boxblur(WavL, aft.get(), klev, Wlvl_L, Hlvl_L, false); + + int co = 0; +#ifdef __SSE2__ + const vfloat lutFactorv = F2V(lutFactor); + for (; co < Hlvl_L * Wlvl_L - 3; co += 4) { + const vfloat valv = LVFU(WavL[co]); + STVFU(WavL[co], intp((*meaLut)[vabsf(valv) * lutFactorv], LVFU(aft[co]), valv)); + } +#endif + for (; co < Hlvl_L * Wlvl_L; co++) { + WavL[co] = intp((*meaLut)[std::fabs(WavL[co]) * lutFactor], aft[co], WavL[co]); + } + } + } } } } - - //delete edge detection - if(koeLibuffer) { - delete [] koeLibuffer; - } } -void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, - struct cont_params &cp, FlatCurve* hhCurve, bool hhutili) +void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition& WaveletCoeffs_a, wavelet_decomposition& WaveletCoeffs_b, + const cont_params &cp, FlatCurve* hhCurve, bool hhutili) { // StopWatch Stop1("WaveletAandBAllAB"); if (hhutili && cp.resena) { // H=f(H) int W_L = WaveletCoeffs_a.level_W(0); int H_L = WaveletCoeffs_a.level_H(0); - float * WavCoeffs_a0 = WaveletCoeffs_a.coeff0; - float * WavCoeffs_b0 = WaveletCoeffs_b.coeff0; + float* WavCoeffs_a0 = WaveletCoeffs_a.get_coeff0(); + float* WavCoeffs_b0 = WaveletCoeffs_b.get_coeff0(); #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif { #ifdef __SSE2__ @@ -1989,15 +3001,13 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, int k; for (k = 0; k < W_L - 3; k += 4) { - __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 = vsqrtf(SQRV(av) + SQRV(bv)); - STVF(huebuffer[k], huev); - STVF(chrbuffer[k], chrv); + const vfloat av = LVFU(WavCoeffs_a0[i * W_L + k]); + const vfloat bv = LVFU(WavCoeffs_b0[i * W_L + k]); + STVF(huebuffer[k], xatan2f(bv, av)); + STVF(chrbuffer[k], vsqrtf(SQRV(av) + SQRV(bv))); } - for(; k < W_L; k++) { + for (; k < W_L; k++) { huebuffer[k] = xatan2f(WavCoeffs_b0[i * W_L + k], WavCoeffs_a0[i * W_L + k]); chrbuffer[k] = sqrtf(SQR(WavCoeffs_b0[i * W_L + k]) + SQR(WavCoeffs_a0[i * W_L + k])) / 327.68f; } @@ -2018,7 +3028,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, editWhatever->v(i,j) = valpar; } */ - float valparam = float((hhCurve->getVal(Color::huelab_to_huehsv2(hueR)) - 0.5f) * 1.7f) + hueR; //get H=f(H) 1.7 optimisation ! + float valparam = (static_cast(hhCurve->getVal(Color::huelab_to_huehsv2(hueR))) - 0.5f) * 1.7f + hueR; //get H=f(H) 1.7 optimisation ! float2 sincosval = xsincosf(valparam); WavCoeffs_a0[i * W_L + j] = chR * sincosval.y; WavCoeffs_b0[i * W_L + j] = chR * sincosval.x; @@ -2029,21 +3039,21 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, } -void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_ab, const WavOpacityCurveW & waOpacityCurveW, - struct cont_params &cp, const bool useChannelA) +void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition& WaveletCoeffs_ab, const Wavblcurve & wavblcurve, const WavOpacityCurveW & waOpacityCurveW, + struct cont_params &cp, const bool useChannelA, int skip, float *meanab, float *sigmaab) { - +//BENCHFUN int maxlvl = WaveletCoeffs_ab.maxlevel(); int W_L = WaveletCoeffs_ab.level_W(0); int H_L = WaveletCoeffs_ab.level_H(0); - float * WavCoeffs_ab0 = WaveletCoeffs_ab.coeff0; + float* WavCoeffs_ab0 = WaveletCoeffs_ab.get_coeff0(); #ifdef _OPENMP - #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) + #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 + 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 _OPENMP #pragma omp for nowait @@ -2057,38 +3067,24 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float modhue = varhue[ii][jj]; float scale = 1.f; - if(skyprot > 0.f) { - if((modhue < cp.t_ry && modhue > cp.t_ly)) { + if (skyprot > 0.f) { + if ((modhue < cp.t_ry && modhue > cp.t_ly)) { scale = (100.f - cp.sky) / 100.1f; - } else if((modhue >= cp.t_ry && modhue < cp.b_ry)) { + } else if ((modhue >= cp.t_ry && modhue < cp.b_ry)) { scale = (100.f - cp.sky) / 100.1f; float ar = (scale - 1.f) / (cp.t_ry - cp.b_ry); float br = scale - cp.t_ry * ar; scale = ar * modhue + br; - } else if((modhue > cp.b_ly && modhue < cp.t_ly)) { + } else if ((modhue > cp.b_ly && modhue < cp.t_ly)) { scale = (100.f - cp.sky) / 100.1f; float al = (scale - 1.f) / (-cp.b_ly + cp.t_ly); float bl = scale - cp.t_ly * al; scale = al * modhue + bl; } - } else if(skyprot < 0.f) { - if((modhue > cp.t_ry || modhue < cp.t_ly)) { + } else if (skyprot < 0.f) { + if ((modhue > cp.t_ry || modhue < cp.t_ly)) { scale = (100.f + cp.sky) / 100.1f; } - - /* else if((modhue >= cp.t_ry && modhue < cp.b_ry)) { - scale=(100.f+cp.sky)/100.1f; - float ar=(scale-1.f)/(cp.t_ry- cp.b_ry); - float br=scale-cp.t_ry*ar; - scale=ar*modhue+br; - } - else if((modhue > cp.b_ly && modhue < cp.t_ly)) { - scale=(100.f+cp.sky)/100.1f; - float al=(scale-1.f)/(-cp.b_ly + cp.t_ly); - float bl=scale-cp.t_ly*al; - scale=al*modhue+bl; - } - */ } WavCoeffs_ab0[i] *= (1.f + cp.chrores * (scale) / 100.f); @@ -2096,7 +3092,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } } - if(cp.cbena && cp.resena) {//if user select Toning and color balance + if (cp.cbena && cp.resena) { //if user select Toning and color balance #ifdef _OPENMP #pragma omp for nowait @@ -2107,26 +3103,26 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float int jj = i - ii * W_L; float LL = (labco->L[ii * 2][jj * 2]) / 327.68f; //I use labco but I can use also WavCoeffs_L0 (more exact but more memory) - float sca = 1.f; //amplifer - reducter...about 1, but perhaps 0.6 or 1.3 + float sca = 1.f; //amplifier - reducter...about 1, but perhaps 0.6 or 1.3 - if(useChannelA) {//green red (little magenta) + if (useChannelA) { //green red (little magenta) //transition to avoid artifacts with 6 between 30 to 36 and 63 to 69 float aa = (cp.grmed - cp.grlow) / 6.f; float bb = cp.grlow - 30.f * aa; float aaa = (cp.grhigh - cp.grmed) / 6.f; float bbb = cp.grmed - 63.f * aaa; - if(LL < 30.f) { //shadows + if (LL < 30.f) { //shadows WavCoeffs_ab0[i] += cp.grlow * (sca) * 300.f; - } else if(LL >= 30.f && LL < 36.f) { //transition + } else if (LL >= 30.f && LL < 36.f) { //transition float tr = aa * LL + bb; WavCoeffs_ab0[i] += tr * (sca) * 300.f; - } else if(LL >= 36.f && LL < 63.f) { //midtones + } else if (LL >= 36.f && LL < 63.f) { //midtones WavCoeffs_ab0[i] += cp.grmed * (sca) * 300.f; - } else if(LL >= 63.f && LL < 69.f) { //transition + } else if (LL >= 63.f && LL < 69.f) { //transition float trh = aaa * LL + bbb; WavCoeffs_ab0[i] += trh * (sca) * 300.f; - } else if(LL >= 69.f) { //highlights + } else if (LL >= 69.f) { //highlights WavCoeffs_ab0[i] += cp.grhigh * (sca) * 300.f; } } else { //blue yellow @@ -2136,23 +3132,62 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float float aaa1 = (cp.blhigh - cp.blmed) / 6.f; float bbb1 = cp.blmed - 63.f * aaa1; - if(LL < 30.f) { + if (LL < 30.f) { WavCoeffs_ab0[i] += cp.bllow * (sca) * 300.f; - } else if(LL >= 30.f && LL < 36.f) { + } else if (LL >= 30.f && LL < 36.f) { float tr1 = aa1 * LL + bb1; WavCoeffs_ab0[i] += tr1 * (sca) * 300.f; - } else if(LL >= 36.f && LL < 63.f) { + } else if (LL >= 36.f && LL < 63.f) { WavCoeffs_ab0[i] += cp.blmed * (sca) * 300.f; - } else if(LL >= 63.f && LL < 69.f) { + } else if (LL >= 63.f && LL < 69.f) { float trh1 = aaa1 * LL + bbb1; WavCoeffs_ab0[i] += trh1 * (sca) * 300.f; - } else if(LL >= 69.f) { + } else if (LL >= 69.f) { WavCoeffs_ab0[i] += cp.blhigh * (sca) * 300.f; } } } } +//Blur chroma + if (cp.blurcres != 0.f && cp.resena) { + int minWL = min(W_L, H_L); + + //printf("skip=%i WL=%i HL=%i min=%i\n", skip, W_L, H_L, minWL); + if (minWL > 140) { //disabled if too low windows + constexpr float k = 0.5f; + float rad = k * cp.blurcres / skip; + float * bef = new float[W_L * H_L]; + float * aft = new float[W_L * H_L]; + + for (int i = 0; i < H_L * W_L; i++) { + bef[i] = WavCoeffs_ab0[i]; + } + + boxblur(bef, aft, rad, W_L, H_L, false); + + for (int i = 0; i < H_L * W_L; i++) { + WavCoeffs_ab0[i] = aft[i]; + } + + delete[] bef; + delete[] aft; + } + } + + + bool wavcurvecomp = false;//not enable if 0.75 + + if (wavblcurve) { + for (int i = 0; i < 500; i++) { + if (wavblcurve[i] != 0.) { + wavcurvecomp = true; + break; + } + } + } + + std::unique_ptr aft; #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2163,207 +3198,232 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); - float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - ContAllAB (labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA); + float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); + ContAllAB(labco, maxlvl, varhue, varchrom, WavCoeffs_ab, WavCoeffs_ab0, lvl, dir, waOpacityCurveW, cp, Wlvl_ab, Hlvl_ab, useChannelA, meanab, sigmaab); + + if(std::min(Wlvl_ab, Hlvl_ab) > 180) { + if (wavblcurve && wavcurvecomp && cp.blena && cp.chrwav > 0.f) { + float mea[10]; + const float effect = cp.bluwav; + constexpr float offs = 1.f; + calceffect(lvl, meanab, sigmaab, mea, effect, offs); + float lutFactor; + const float inVals[] = {0.05f, 0.2f, 0.7f, 1.f, 1.f, 0.8f, 0.6f, 0.4f, 0.2f, 0.1f, 0.00f}; + const auto meaLut = buildMeaLut(inVals, mea, lutFactor); + + if (!aft.get()) { + aft.reset(new float[Wlvl_ab * Hlvl_ab]); + } + + //blur level + const float klev = wavblcurve[lvl * 55.5f] * 80.f / skip; + boxblur(WavCoeffs_ab[dir], aft.get(), klev, Wlvl_ab, Hlvl_ab, false); + + auto WavAb = WavCoeffs_ab[dir]; + int co = 0; +#ifdef __SSE2__ + const vfloat lutFactorv = F2V(lutFactor); + for (; co < Hlvl_ab * Wlvl_ab - 3; co += 4) { + const vfloat valv = LVFU(WavAb[co]); + STVFU(WavAb[co], intp((*meaLut)[vabsf(valv) * lutFactorv], LVFU(aft[co]), valv)); + } +#endif + for (; co < Hlvl_ab * Wlvl_ab; co++) { + WavAb[co] = intp((*meaLut)[std::fabs(WavAb[co]) * lutFactor], aft[co], WavAb[co]); + } + } + } } } - - } } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void ImProcFunctions::calckoe(float ** WavCoeffs_LL, const struct cont_params& cp, float *koeLi[12], int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC) +void ImProcFunctions::calckoe (const float* WavCoeffs, float gradw, float tloww, float *koeLi, int level, int W_L, int H_L, float edd, float &maxkoeLi, float **tmC, bool multiThread) { - int borderL = 2; - -// printf("cpedth=%f\n",cp.eddetthr); - if(cp.eddetthr < 30.f) { - borderL = 1; + const int borderL = tloww < 75.f ? 1 : 2; + if (tloww < 75.f) { // I calculate coefficients with r size matrix 3x3 r=1 ; 5x5 r=2; 7x7 r=3 /* float k[2*r][2*r]; - for(int i=1;i<=(2*r+1);i++) { - for(int j=1;j<=(2*r+1);j++) { + for (int i=1;i<=(2*r+1);i++) { + for (int j=1;j<=(2*r+1);j++) { k[i][j]=(1.f/6.283*sigma*sigma)*exp(-SQR(i-r-1)+SQR(j-r-1)/2.f*SQR(sigma)); } } //I could also use Gauss.h for 3x3 // If necessary I can put a 7x7 matrix */ - for (int i = 1; i < H_L - 1; i++) { //sigma=0.55 - for (int j = 1; j < W_L - 1; j++) { - tmC[i][j] = (8.94f * WavCoeffs_LL[dir][i * W_L + j] + 1.71f * (WavCoeffs_LL[dir][(i - 1) * W_L + j] + 1.71f * WavCoeffs_LL[dir][(i + 1) * W_L + j] - + 1.71f * WavCoeffs_LL[dir][i * W_L + j + 1] + 1.71f * WavCoeffs_LL[dir][i * W_L + j - 1]) + 0.33f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 1] - + 0.33f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 1] + 0.33f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 1] + 0.33f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 1]) * 0.0584795f; - // apply to each direction Wavelet level : horizontal / vertiacle / diagonal - - - } + float c0, c1, c2, mult; + if (tloww < 30.f) { //sigma=0.55 + c0 = 8.94f; + c1 = 1.71f; + c2 = 0.33f; + mult = 0.0584795f; + } else if (tloww < 50.f) { //sigma=0.85 + c0 = 4.0091f; + c1 = 2.0068f; + c2 = 1.0045f; + mult = 0.062288f; + } else { //sigma=1.1 + c0 = 3.025f; + c1 = 2.001f; + c2 = 1.323f; + mult = 0.06127f; } - } else if(cp.eddetthr >= 30.f && cp.eddetthr < 50.f) { - borderL = 1; - - for (int i = 1; i < H_L - 1; i++) { //sigma=0.85 - for (int j = 1; j < W_L - 1; j++) { - tmC[i][j] = (4.0091f * WavCoeffs_LL[dir][i * W_L + j] + 2.0068f * (WavCoeffs_LL[dir][(i - 1) * W_L + j] + 2.0068f * WavCoeffs_LL[dir][(i + 1) * W_L + j] - + 2.0068f * WavCoeffs_LL[dir][i * W_L + j + 1] + 2.0068f * WavCoeffs_LL[dir][i * W_L + j - 1]) + 1.0045f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 1] - + 1.0045f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 1] + 1.0045f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 1] + 1.0045f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 1]) * 0.062288f; - // apply to each direction Wavelet level : horizontal / vertiacle / diagonal - - - } - } - } - - - else if(cp.eddetthr >= 50.f && cp.eddetthr < 75.f) { - borderL = 1; - + c0 *= mult; + c1 *= mult; + c2 *= mult; +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif for (int i = 1; i < H_L - 1; i++) { - for (int j = 1; j < W_L - 1; j++) { //sigma=1.1 - tmC[i][j] = (3.025f * WavCoeffs_LL[dir][i * W_L + j] + 2.001f * (WavCoeffs_LL[dir][(i - 1) * W_L + j] + 2.001f * WavCoeffs_LL[dir][(i + 1) * W_L + j] - + 2.001f * WavCoeffs_LL[dir][i * W_L + j + 1] + 2.001f * WavCoeffs_LL[dir][i * W_L + j - 1]) + 1.323f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 1] - + 1.323f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 1] + 1.323f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 1] + 1.323f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 1]) * 0.06127f; + for (int j = 1; j < W_L - 1; j++) { + tmC[i][j] = c0 * WavCoeffs[i * W_L + j] + + c1 * ((WavCoeffs[(i - 1) * W_L + j] + WavCoeffs[(i + 1) * W_L + j]) + (WavCoeffs[i * W_L + j + 1] + WavCoeffs[i * W_L + j - 1])) + + c2 * ((WavCoeffs[(i - 1) * W_L + j - 1] + WavCoeffs[(i - 1) * W_L + j + 1]) + (WavCoeffs[(i + 1) * W_L + j - 1] + WavCoeffs[(i + 1) * W_L + j + 1])); } } - } - - else if(cp.eddetthr >= 75.f) { - borderL = 2; - - //if(cp.lip3 && level > 1) { - if(level > 1) {// do not activate 5x5 if level 0 or 1 - + } else { + if (level > 1) { // do not activate 5x5 if level 0 or 1 + // Gaussian 1.1 + // 0.5 2 3 2 0.5 + // 2 7 10 7 2 + // 3 10 15 10 3 + // 2 7 10 7 2 + // 0.5 2 3 2 0.5 + // divi 113 + //Gaussian 1.4 + // 2 4 5 4 2 + // 4 9 12 9 4 + // 5 12 15 12 5 + // 4 9 12 9 4 + // 2 4 5 4 2 + // divi 159 + float c0, c1, c2, c3, c4, c5, mult; + if (tloww < 85.f) { //sigma=1.1 + c0 = 15.f; + c1 = 10.f; + c2 = 7.f; + c3 = 3.f; + c4 = 2.f; + c5 = 0.5f; + mult = 0.0088495f; + } else { //sigma=1.4 + c0 = 15.f; + c1 = 12.f; + c2 = 9.f; + c3 = 5.f; + c4 = 4.f; + c5 = 2.f; + mult = 0.0062893f; + } + c0 *= mult; + c1 *= mult; + c2 *= mult; + c3 *= mult; + c4 *= mult; + c5 *= mult; +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif for (int i = 2; i < H_L - 2; i++) { for (int j = 2; j < W_L - 2; j++) { - // Gaussian 1.1 - // 0.5 2 3 2 0.5 - // 2 7 10 7 2 - // 3 10 15 10 3 - // 2 7 10 7 2 - // 0.5 2 3 2 0.5 - // divi 113 - //Gaussian 1.4 - // 2 4 5 4 2 - // 4 9 12 9 4 - // 5 12 15 12 5 - // 4 9 12 9 4 - // 2 4 5 4 2 - // divi 159 - if(cp.eddetthr < 85.f) { //sigma=1.1 - tmC[i][j] = (15.f * WavCoeffs_LL[dir][i * W_L + j] + 10.f * WavCoeffs_LL[dir][(i - 1) * W_L + j] + 10.f * WavCoeffs_LL[dir][(i + 1) * W_L + j] - + 10.f * WavCoeffs_LL[dir][i * W_L + j + 1] + 10.f * WavCoeffs_LL[dir][i * W_L + j - 1] + 7.f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 1] - + 7.f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 1] + 7.f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 1] + 7.f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 1] - + 3.f * WavCoeffs_LL[dir][(i - 2) * W_L + j] + 3.f * WavCoeffs_LL[dir][(i + 2) * W_L + j] + 3.f * WavCoeffs_LL[dir][i * W_L + j - 2] + 3.f * WavCoeffs_LL[dir][i * W_L + j + 2] - + 2.f * WavCoeffs_LL[dir][(i - 2) * W_L + j - 1] + 2.f * WavCoeffs_LL[dir][(i - 2) * W_L + j + 1] + 2.f * WavCoeffs_LL[dir][(i + 2) * W_L + j + 1] + 2.f * WavCoeffs_LL[dir][(i + 2) * W_L + j - 1] - + 2.f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 2] + 2.f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 2] + 2.f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 2] + 2.f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 2] - + 0.5f * WavCoeffs_LL[dir][(i - 2) * W_L + j - 2] + 0.5f * WavCoeffs_LL[dir][(i - 2) * W_L + j + 2] + 0.5f * WavCoeffs_LL[dir][(i + 2) * W_L + j - 2] + 0.5f * WavCoeffs_LL[dir][(i + 2) * W_L + j + 2] - ) * 0.0088495f; - - } - - else {//sigma=1.4 - tmC[i][j] = (15.f * WavCoeffs_LL[dir][i * W_L + j] + 12.f * WavCoeffs_LL[dir][(i - 1) * W_L + j] + 12.f * WavCoeffs_LL[dir][(i + 1) * W_L + j] - + 12.f * WavCoeffs_LL[dir][i * W_L + j + 1] + 12.f * WavCoeffs_LL[dir][i * W_L + j - 1] + 9.f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 1] - + 9.f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 1] + 9.f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 1] + 9.f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 1] - + 5.f * WavCoeffs_LL[dir][(i - 2) * W_L + j] + 5.f * WavCoeffs_LL[dir][(i + 2) * W_L + j] + 5.f * WavCoeffs_LL[dir][i * W_L + j - 2] + 5.f * WavCoeffs_LL[dir][i * W_L + j + 2] - + 4.f * WavCoeffs_LL[dir][(i - 2) * W_L + j - 1] + 4.f * WavCoeffs_LL[dir][(i - 2) * W_L + j + 1] + 4.f * WavCoeffs_LL[dir][(i + 2) * W_L + j + 1] + 4.f * WavCoeffs_LL[dir][(i + 2) * W_L + j - 1] - + 4.f * WavCoeffs_LL[dir][(i - 1) * W_L + j - 2] + 4.f * WavCoeffs_LL[dir][(i - 1) * W_L + j + 2] + 4.f * WavCoeffs_LL[dir][(i + 1) * W_L + j + 2] + 4.f * WavCoeffs_LL[dir][(i + 1) * W_L + j - 2] - + 2.f * WavCoeffs_LL[dir][(i - 2) * W_L + j - 2] + 2.f * WavCoeffs_LL[dir][(i - 2) * W_L + j + 2] + 2.f * WavCoeffs_LL[dir][(i + 2) * W_L + j - 2] + 2.f * WavCoeffs_LL[dir][(i + 2) * W_L + j + 2] - ) * 0.0062893f; - } - - - // apply to each direction Wavelet level : horizontal / vertiacle / diagonal + tmC[i][j] = c0 * WavCoeffs[i * W_L + j] + + c1 * ((WavCoeffs[(i - 1) * W_L + j] + WavCoeffs[(i + 1) * W_L + j]) + (WavCoeffs[i * W_L + j + 1] + WavCoeffs[i * W_L + j - 1])) + + c2 * ((WavCoeffs[(i - 1) * W_L + j - 1] + WavCoeffs[(i - 1) * W_L + j + 1]) + (WavCoeffs[(i + 1) * W_L + j - 1] + WavCoeffs[(i + 1) * W_L + j + 1])) + + c3 * ((WavCoeffs[(i - 2) * W_L + j] + WavCoeffs[(i + 2) * W_L + j]) + (WavCoeffs[i * W_L + j - 2] + WavCoeffs[i * W_L + j + 2])) + + c4 * ((WavCoeffs[(i - 2) * W_L + j - 1] + WavCoeffs[(i - 2) * W_L + j + 1]) + (WavCoeffs[(i + 2) * W_L + j + 1] + WavCoeffs[(i + 2) * W_L + j - 1]) + + (WavCoeffs[(i - 1) * W_L + j - 2] + WavCoeffs[(i - 1) * W_L + j + 2]) + (WavCoeffs[(i + 1) * W_L + j + 2] + WavCoeffs[(i + 1) * W_L + j - 2])) + + c5 * ((WavCoeffs[(i - 2) * W_L + j - 2] + WavCoeffs[(i - 2) * W_L + j + 2]) + (WavCoeffs[(i + 2) * W_L + j - 2] + WavCoeffs[(i + 2) * W_L + j + 2])); } } - } - - } - - - /* - // I suppress these 2 convolutions ==> lees good results==> probably because structure data different and also I compare to original value which have + and - - for(int i = borderL; i < H_L-borderL; i++ ) {//[-1 0 1] x==>j - for(int j = borderL; j < W_L-borderL; j++) { - tmC[i][j]=- WavCoeffs_LL[dir][(i)*W_L + j-1] + WavCoeffs_LL[dir][(i)*W_L + j+1]; + } else { +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + koeLi[i * W_L + j] = 0.f; + } } - } - for(int i = borderL; i < H_L-borderL; i++ ) {//[1 0 -1] y==>i - for(int j = borderL; j < W_L-borderL; j++) { - tmC[i][j]= - WavCoeffs_LL[dir][(i-1)*W_L + j] + WavCoeffs_LL[dir][(i+1)*W_L + j]; - } - } - */ - - float thr = 40.f; //avoid artifact eg. noise...to test - float thr2 = 1.5f * edd; //edd can be modified in option ed_detect - thr2 += cp.eddet / 30.f; //to test - float diffFactor = (cp.eddet / 100.f); - - for(int i = 0; i < H_L; i++ ) { - for(int j = 0; j < W_L; j++) { - koeLi[level * 3 + dir - 1][i * W_L + j] = 1.f; + return; } } - for(int i = borderL; i < H_L - borderL; i++ ) { - for(int j = borderL; j < W_L - borderL; j++) { + // fill borders with 1.f + int ii = 0; + for (; ii < borderL; ii++) { + for (int j = 0; j < W_L; j++) { + koeLi[ii * W_L + j] = 1.f; + } + } + for (; ii < H_L - borderL; ii++) { + for (int j = 0; j < borderL; j++) { + koeLi[ii * W_L + j] = 1.f; + } + for (int j = W_L - borderL; j < W_L; j++) { + koeLi[ii * W_L + j] = 1.f; + } + } + for (; ii < H_L; ii++) { + for (int j = 0; j < W_L; j++) { + koeLi[ii * W_L + j] = 1.f; + } + } + + constexpr float thr = 40.f; //avoid artifact eg. noise...to test + const float thr2 = 1.5f * edd + gradw / 30.f; //edd can be modified in option ed_detect + const float diffFactor = gradw / 100.f; + + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { // my own algo : probably a little false, but simpler as Lipschitz ! // Thr2 = maximum of the function ==> Lipsitch says = probably edge -// float temp = WavCoeffs_LL[dir][i*W_L + j]; -// if(temp>=0.f && temp < thr) temp = thr; -// if(temp < 0.f && temp > -thr) temp = -thr; - float temp = max(fabsf(WavCoeffs_LL[dir][i * W_L + j]), thr ); - koeLi[level * 3 + dir - 1][i * W_L + j] = min(thr2, fabs(tmC[i][j] / temp)); // limit maxi + float temp = rtengine::max(std::fabs(WavCoeffs[i * W_L + j]), thr); + koeLi[i * W_L + j] = rtengine::min(thr2, std::fabs(tmC[i][j] / temp)); // limit maxi //it will be more complicated to calculate both Wh and Wv, but we have also Wd==> pseudo Lipschitz - if(koeLi[level * 3 + dir - 1][i * W_L + j] > maxkoeLi[level * 3 + dir - 1]) { - maxkoeLi[level * 3 + dir - 1] = koeLi[level * 3 + dir - 1][i * W_L + j]; + if (koeLi[i * W_L + j] > maxkoeLi) { + maxkoeLi = koeLi[i * W_L + j]; } - - float diff = maxkoeLi[level * 3 + dir - 1] - koeLi[level * 3 + dir - 1][i * W_L + j]; + float diff = maxkoeLi - koeLi[i * W_L + j]; diff *= diffFactor; - koeLi[level * 3 + dir - 1][i * W_L + j] = maxkoeLi[level * 3 + dir - 1] - diff; + koeLi[i * W_L + j] = maxkoeLi - diff; } } - } -void ImProcFunctions::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 ImProcFunctions::finalContAllL(float* const* WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, const cont_params &cp, + int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL) { - if(cp.diagcurv && cp.finena && MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f ) { //curve + if (cp.diagcurv && cp.finena && MaxP[level] > 0.f && mean[level] != 0.f && sigma[level] != 0.f) { //curve float insigma = 0.666f; //SD float logmax = log(MaxP[level]); //log Max - float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max + float rapX = (mean[level] + cp.sigmafin * sigma[level]) / (MaxP[level]); //rapport between sD / max float inx = log(insigma); float iny = log(rapX); float rap = inx / iny; //koef - float asig = 0.166f / sigma[level]; + float asig = 0.166f / (sigma[level] * cp.sigmafin); float bsig = 0.5f - asig * mean[level]; - float amean = 0.5f / mean[level]; + float amean = 0.5f / (mean[level]); #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, W_L * 16) num_threads(wavNestedLevels) if(wavNestedLevels>1) + #pragma omp parallel for schedule(dynamic, W_L * 16) num_threads(wavNestedLevels) if (wavNestedLevels>1) #endif for (int i = 0; i < W_L * H_L; i++) { float absciss; - if(fabsf(WavCoeffs_L[dir][i]) >= (mean[level] + sigma[level])) { //for max - float valcour = xlogf(fabsf(WavCoeffs_L[dir][i])); + if (std::fabs(WavCoeffs_L[dir][i]) >= (mean[level] + cp.sigmafin * sigma[level])) { //for max + float valcour = xlogf(std::fabs(WavCoeffs_L[dir][i])); float valc = valcour - logmax; float vald = valc * rap; absciss = xexpf(vald); - } else if(fabsf(WavCoeffs_L[dir][i]) >= mean[level]) { - absciss = asig * fabsf(WavCoeffs_L[dir][i]) + bsig; + } else if (std::fabs(WavCoeffs_L[dir][i]) >= mean[level]) { + absciss = asig * std::fabs(WavCoeffs_L[dir][i]) + bsig; } else { - absciss = amean * fabsf(WavCoeffs_L[dir][i]); + absciss = amean * std::fabs(WavCoeffs_L[dir][i]); } float kc = waOpacityCurveWL[absciss * 500.f] - 0.5f; @@ -2381,34 +3441,34 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, int choiceClevel = 0; - if(params->wavelet.CLmethod == "one") { + if (params->wavelet.CLmethod == "one") { choiceClevel = 0; - } else if(params->wavelet.CLmethod == "inf") { + } else if (params->wavelet.CLmethod == "inf") { choiceClevel = 1; - } else if(params->wavelet.CLmethod == "sup") { + } else if (params->wavelet.CLmethod == "sup") { choiceClevel = 2; - } else if(params->wavelet.CLmethod == "all") { + } else if (params->wavelet.CLmethod == "all") { choiceClevel = 3; } int choiceDir = 0; - if(params->wavelet.Dirmethod == "one") { + if (params->wavelet.Dirmethod == "one") { choiceDir = 1; - } else if(params->wavelet.Dirmethod == "two") { + } else if (params->wavelet.Dirmethod == "two") { choiceDir = 2; - } else if(params->wavelet.Dirmethod == "thr") { + } else if (params->wavelet.Dirmethod == "thr") { choiceDir = 3; - } else if(params->wavelet.Dirmethod == "all") { + } else if (params->wavelet.Dirmethod == "all") { choiceDir = 0; } int dir1 = (choiceDir == 2) ? 1 : 2; int dir2 = (choiceDir == 3) ? 1 : 3; - if(choiceClevel < 3) { // not all levels visible, paint residual - if(level == 0) { - if(cp.backm != 2) { // nothing to change when residual is used as background + if (choiceClevel < 3) { // not all levels visible, paint residual + if (level == 0) { + if (cp.backm != 2) { // nothing to change when residual is used as background float backGroundColor = (cp.backm == 1) ? 12000.f : 0.f; for (int i = 0; i < W_L * H_L; i++) { @@ -2418,66 +3478,66 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } } - if(choiceClevel == 0) { // Only one level + if (choiceClevel == 0) { // Only one level - if(choiceDir == 0) { // All directions - if(level != choicelevel) { // zero all for the levels != choicelevel - for (int dir = 1; dir < 4; dir++) { + if (choiceDir == 0) { // All directions + if (level != choicelevel) { // zero all for the levels != choicelevel + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } } else { // zero the unwanted directions for level == choicelevel - if(choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + if (choicelevel >= cp.maxilev) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } - } else if(level != choicelevel) { // zero all for the levels != choicelevel + } else if (level != choicelevel) { // zero all for the levels != choicelevel for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir1][i] = WavCoeffs_L[dir2][i] = 0.f; } } } - } else if(choiceClevel == 1) { // Only below level - if(choiceDir == 0) { // All directions - if(level > choicelevel) { - for (int dir = 1; dir < 4; dir++) { + } else if (choiceClevel == 1) { // Only below level + if (choiceDir == 0) { // All directions + if (level > choicelevel) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } } else { // zero the unwanted directions for level >= choicelevel - if(level > choicelevel) { + if (level > choicelevel) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir1][i] = WavCoeffs_L[dir2][i] = 0.f; } } } - } else if(choiceClevel == 2) { // Only above level - if(choiceDir == 0) { // All directions - if(level <= choicelevel) { - for (int dir = 1; dir < 4; dir++) { + } else if (choiceClevel == 2) { // Only above level + if (choiceDir == 0) { // All directions + if (level <= choicelevel) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } } else { // zero the unwanted directions for level >= choicelevel - if(choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + if (choicelevel >= cp.maxilev) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_L * H_L; i++) { - WavCoeffs_L[dir][i] = 0.f; + WavCoeffs_L[d][i] = 0.f; } } } - else if(level <= choicelevel) { + else if (level <= choicelevel) { for (int i = 0; i < W_L * H_L; i++) { WavCoeffs_L[dir1][i] = WavCoeffs_L[dir2][i] = 0.f; } @@ -2488,32 +3548,82 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } -void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) +void ImProcFunctions::ContAllL(float *koeLi[12], float maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, const float* const* varhue, const float* const* varchrom, float* const* 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, const WavOpacityCurveSH & waOpacityCurveSH, FlatCurve* ChCurve, bool Chutili) { - assert (level >= 0); - assert (maxlvl > level); + assert(level >= 0); + assert(maxlvl > level); static const float scales[10] = {1.f, 2.f, 4.f, 8.f, 16.f, 32.f, 64.f, 128.f, 256.f, 512.f}; float scaleskip[10]; - for(int sc = 0; sc < 10; sc++) { + for (int sc = 0; sc < 10; sc++) { scaleskip[sc] = scales[sc] / skip; } +/* + if (settings->verbose) { + printf("level=%i mean=%f sigma=%f maxp=%f\n", level, mean[level], sigma[level], MaxP[level]); + } +*/ + constexpr float t_r = 40.f; + constexpr float t_l = 10.f; + constexpr float b_r = 75.f; + constexpr float edd = 3.f; + constexpr float eddstrength = 1.3f; + constexpr float aedstr = (eddstrength - 1.f) / 90.f; + constexpr float bedstr = 1.f - 10.f * aedstr; + + std::unique_ptr beta(new float[W_L * H_L]); + + for (int co = 0; co < H_L * W_L; co++) { + beta[co] = 1.f; + } + + if (cp.eff < 2.5f) { + float effect = cp.eff; + float offs = 1.f; + float mea[10]; + + calceffect(level, mean, sigma, mea, effect, offs); + + for (int co = 0; co < H_L * W_L; co++) { + float WavCL = std::fabs(WavCoeffs_L[dir][co]); + + if (WavCL < mea[0]) { + beta[co] = 0.05f; + } else if (WavCL < mea[1]) { + beta[co] = 0.2f; + } else if (WavCL < mea[2]) { + beta[co] = 0.7f; + } else if (WavCL < mea[3]) { + beta[co] = 1.f; //standard + } else if (WavCL < mea[4]) { + beta[co] = 1.f; + } else if (WavCL < mea[5]) { + beta[co] = 0.8f; //+sigma + } else if (WavCL < mea[6]) { + beta[co] = 0.6f; + } else if (WavCL < mea[7]) { + beta[co] = 0.4f; + } else if (WavCL < mea[8]) { + beta[co] = 0.2f; // + 2 sigma + } else if (WavCL < mea[9]) { + beta[co] = 0.1f; + } else { + beta[co] = 0.0f; + } + + } + } + + + if (cp.val > 0 && cp.edgeena) { - float t_r = 40.f; - float t_l = 10.f; - float b_r = 75.f; - float edd = 3.f; - float eddstrength = 1.3f; - float aedstr = (eddstrength - 1.f) / 90.f; - float bedstr = 1.f - 10.f * aedstr; - if(cp.val > 0 && cp.edgeena) { float * koe = nullptr; float maxkoe = 0.f; - if(!lipschitz) { + if (!lipschitz) { koe = new float [H_L * W_L]; for (int i = 0; i < W_L * H_L; i++) { @@ -2522,7 +3632,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit maxkoe = 0.f; - if(cp.detectedge) { + if (cp.detectedge) { float** tmC; int borderL = 1; tmC = new float*[H_L]; @@ -2548,33 +3658,30 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit - for(int i = borderL; i < H_L - borderL; i++ ) { - for(int j = borderL; j < W_L - borderL; j++) { + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { // my own algo : probably a little false, but simpler as Lipschitz ! float thr = 40.f; //avoid artifact eg. noise...to test float thr2 = edd; //edd can be modified in option ed_detect thr2 += cp.eddet / 30.f; //to test float temp = WavCoeffs_L[dir][i * W_L + j]; - if(temp >= 0.f && temp < thr) { + if (temp >= 0.f && temp < thr) { temp = thr; } - if(temp < 0.f && temp > -thr) { + if (temp < 0.f && temp > -thr) { temp = -thr; } - koe[i * W_L + j] = min(thr2, fabs(tmC[i][j] / temp)); - - if(koe[i * W_L + j] > maxkoe) { - maxkoe = koe[i * W_L + j]; - } + koe[i * W_L + j] = rtengine::min(thr2, std::fabs(tmC[i][j] / temp)); + maxkoe = rtengine::max(maxkoe, koe[i * W_L + j]); float diff = maxkoe - koe[i * W_L + j]; diff *= (cp.eddet / 100.f); float interm = maxkoe - diff; - if(interm < cp.eddetthr / 30.f) { + if (interm < cp.eddetthr / 30.f) { interm = 0.01f; } @@ -2600,67 +3707,67 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float atten01234 = 0.80f; value *= (atten01234 * scaleskip[1]); //for zoom < 100% reduce strength...I choose level 1...but!! } - + float edghig = settings->edghi;//increase or reduce "reinforce" + float edglow = settings->edglo;//increase or reduce "reduce" + float limrad = settings->limrad;//threshold action in function radius (rad) + // printf("edghi=%f edglo=%f limrad=%f\n", edghig, edglow, limrad); + // value *= beta; float edge = 1.f; - float lim0 = 20.f; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi + float lim0 = limrad; //arbitrary limit for low radius and level between 2 or 3 to 30 maxi float lev = float (level); float repart = (float)cp.til; - float brepart; - if(cp.reinforce == 1) { - brepart = 3.f; - } - - if(cp.reinforce == 3) { - brepart = 0.5f; //arbitrary value to increase / decrease repart, between 1 and 0 - } - - float arepart = -(brepart - 1.f) / (lim0 / 60.f); if (cp.reinforce != 2) { - if(rad < lim0 / 60.f) { + const float brepart = + cp.reinforce == 1 + ? edghig + : edglow; + const float arepart = -(brepart - 1.f) / (lim0 / 60.f); + + if (rad < (lim0 / 60.f)) { repart *= (arepart * rad + brepart); //linear repartition of repart } } - float al0 = 1.f + (repart) / 50.f; float al10 = 1.0f; //arbitrary value ==> less = take into account high levels // float ak =-(al0-al10)/10.f;//10 = maximum levels float ak = -(al0 - al10) / 10.f; //10 = maximum levels float bk = al0; float koef = ak * level + bk; //modulate for levels : more levels high, more koef low ==> concentrated action on low levels, without or near for high levels - float expkoef = -pow(fabs(rad - lev), koef); //reduce effect for high levels + float expkoef = -std::pow(std::fabs(rad - lev), koef); //reduce effect for high levels + // printf("repart=%f\n", repart); if (cp.reinforce == 3) { - if(rad < lim0 / 60.f && level == 0) { + if (rad < (lim0 / 60.f) && level == 0) { expkoef *= abs(repart); //reduce effect for low values of rad and level=0==> quasi only level 1 is effective } } if (cp.reinforce == 1) { - if(rad < lim0 / 60.f && level == 1) { + if (rad < (lim0 / 60.f) && level == 1) { expkoef /= repart; //increase effect for low values of rad and level=1==> quasi only level 0 is effective } } //take into account local contrast - float refin = value * exp (expkoef); + float refin = value * exp(expkoef); - if(cp.link && cp.noiseena) { //combi + if (cp.link && cp.noiseena) { //combi { - if(level == 0) { + if (level == 0) { refin *= (1.f + cp.lev0s / 50.f); // we can change this sensibility! } - if(level == 1) { + if (level == 1) { refin *= (1.f + cp.lev1s / 50.f); } - if(level == 2) { + if (level == 2) { refin *= (1.f + cp.lev2s / 50.f); } - if(level == 3) { + if (level == 3) { refin *= (1.f + cp.lev3s / 50.f); } } @@ -2668,38 +3775,38 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float edgePrecalc = 1.f + refin; //estimate edge "pseudo variance" - if(cp.EDmet == 2 && MaxP[level] > 0.f) { //curve - // if(exa) {//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 - float rapX = (mean[level] + sigma[level]) / MaxP[level]; //rapport between sD / max + float rapX = (mean[level] + sigma[level]) / (MaxP[level]); //rapport between sD / max float inx = log(insigma); float iny = log(rapX); float rap = inx / iny; //koef - float asig = 0.166f / sigma[level]; + float asig = 0.166f / (sigma[level]); float bsig = 0.5f - asig * mean[level]; - float amean = 0.5f / mean[level]; + float amean = 0.5f / (mean[level]); float absciss = 0.f; float kinterm; float kmul; int borderL = 1; - for(int i = borderL; i < H_L - borderL; i++ ) { - for(int j = borderL; j < W_L - borderL; j++) { + for (int i = borderL; i < H_L - borderL; i++) { + for (int j = borderL; j < W_L - borderL; j++) { int k = i * W_L + j; - if(cp.detectedge) { - if(!lipschitz) { - if(cp.eddet > 10.f) { + if (cp.detectedge) { + if (!lipschitz) { + if (cp.eddet > 10.f) { edge = (aedstr * cp.eddet + bedstr) * (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } else { edge = (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } } - if(lipschitz) { - if(level < 4) { - edge = 1.f + (edgePrecalc - 1.f) * (koeLi[level * 3][k]) / (1.f + 0.9f * maxkoeLi[level * 3 + dir - 1]); + if (lipschitz) { + if (level < 4) { + edge = 1.f + (edgePrecalc - 1.f) * (koeLi[level * 3][k]) / (1.f + 0.9f * maxkoeLi); } else { edge = edgePrecalc; } @@ -2708,17 +3815,17 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit edge = edgePrecalc; } - if(cp.edgcurv) { - if(fabs(WavCoeffs_L[dir][k]) >= (mean[level] + sigma[level])) { //for max - float valcour = log(fabs(WavCoeffs_L[dir][k])); + if (cp.edgcurv) { + if (std::fabs(WavCoeffs_L[dir][k]) >= (mean[level] + sigma[level])) { //for max + float valcour = xlogf(std::fabs(WavCoeffs_L[dir][k])); float valc = valcour - logmax; float vald = valc * rap; absciss = exp(vald); - } else if(fabs(WavCoeffs_L[dir][k]) >= mean[level] && fabs(WavCoeffs_L[dir][k]) < (mean[level] + sigma[level])) { - absciss = asig * fabs(WavCoeffs_L[dir][k]) + bsig; - } else if(fabs(WavCoeffs_L[dir][k]) < mean[level]) { - absciss = amean * fabs(WavCoeffs_L[dir][k]); + } else if (std::fabs(WavCoeffs_L[dir][k]) >= mean[level] && std::fabs(WavCoeffs_L[dir][k]) < (mean[level] + sigma[level])) { + absciss = asig * std::fabs(WavCoeffs_L[dir][k]) + bsig; + } else if (std::fabs(WavCoeffs_L[dir][k]) < mean[level]) { + absciss = amean * std::fabs(WavCoeffs_L[dir][k]); } // Threshold adjuster settings==> approximative for curve @@ -2728,50 +3835,46 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit // kmul about max ==> 9 // we can change these values // result is different not best or bad than threshold slider...but similar - float abssd = 4.f; //amplification reference - float bbssd = 2.f; //mini ampli - float maxamp = 2.5f; //maxi ampli at end - float maxampd = 10.f; //maxi ampli at end - float a_abssd = (maxamp - abssd) / 0.333f; - float b_abssd = maxamp - a_abssd; - float da_abssd = (maxampd - abssd) / 0.333f; - float db_abssd = maxampd - da_abssd; - float am = (abssd - bbssd) / 0.666f; + constexpr float abssd = 4.f; //amplification reference + constexpr float bbssd = 2.f; //mini ampli float kmuld = 0.f; - if(absciss > 0.666f && absciss < 1.f) { + if (absciss > 0.666f && absciss < 1.f) { + constexpr float maxamp = 2.5f; //maxi ampli at end + constexpr float maxampd = 10.f; //maxi ampli at end + constexpr float a_abssd = (maxamp - abssd) / 0.333f; + constexpr float b_abssd = maxamp - a_abssd; + constexpr float da_abssd = (maxampd - abssd) / 0.333f; + constexpr float db_abssd = maxampd - da_abssd; kmul = a_abssd * absciss + b_abssd; //about max ==> kinterm kmuld = da_abssd * absciss + db_abssd; } else { + constexpr float am = (abssd - bbssd) / 0.666f; kmul = kmuld = absciss * am + bbssd; } - kinterm = 1.f; - float kc = kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); - float kcd = kmuld * (wavCLVCcurve[absciss * 500.f] - 0.5f); + const float kc = kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); - if(kc >= 0.f) { + if (kc >= 0.f) { float reduceeffect = 0.6f; kinterm = 1.f + reduceeffect * kmul * (wavCLVCcurve[absciss * 500.f] - 0.5f); //about 1 to 3 general and big amplification for max (under 0) } else { + const float kcd = kmuld * (wavCLVCcurve[absciss * 500.f] - 0.5f); kinterm = 1.f - (SQR(kcd)) / 10.f; } - if(kinterm < 0.f) { + if (kinterm < 0.f) { kinterm = 0.01f; } edge *= kinterm; - - if(edge < 1.f) { - edge = 1.f; - } + edge = rtengine::max(edge, 1.f); } - WavCoeffs_L[dir][k] *= edge; + WavCoeffs_L[dir][k] *= (1.f + (edge - 1.f) * beta[k]); } } - } else if(cp.EDmet == 1) { //threshold adjuster + } 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 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% @@ -2780,7 +3883,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float edgeMeanFactor = cbrt(cp.edg_mean / t_l); float interm; - if(cp.edg_low < 10.f) { + if (cp.edg_low < 10.f) { interm = cbrt((5.f + cp.edg_low) / 5.f); } else { interm = 1.437f; //cbrt(3); @@ -2794,22 +3897,22 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit //for (int i=0; i 10.f) { + if (cp.detectedge) { + if (!lipschitz) { + if (cp.eddet > 10.f) { edge = (aedstr * cp.eddet + bedstr) * (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } else { edge = (edgePrecalc * (1.f + koe[k])) / (1.f + 0.9f * maxkoe); } } - if(lipschitz) { - if(level < 4) { - edge = 1.f + (edgePrecalc - 1.f) * (koeLi[level * 3][k]) / (1.f + 0.9f * maxkoeLi[level * 3 + dir - 1]); + if (lipschitz) { + if (level < 4) { + edge = 1.f + (edgePrecalc - 1.f) * (koeLi[level * 3][k]) / (1.f + 0.9f * maxkoeLi); } else { edge = edgePrecalc; } @@ -2828,17 +3931,18 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit // If we move sliders to the left, local contrast is reduced // if we move sliders to the right local contrast is increased // MaxP, MaxN, mean, sigma are calculated if necessary (val > 0) by evaluate2(), eval2(), aver() , sigma() - if(b_r < 100.f && cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right +// if (b_r < 100.f && cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right + if (cp.edg_max / b_r > 1.f) { //in case of b_r < 100 and slider move to right if (WavCoeffs_L[dir][k] > MaxPCompare * cp.edg_max / b_r) { edge *= edgMaxFsup; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } else if (WavCoeffs_L[dir][k] < MaxNCompare * cp.edg_max / b_r) { edge *= edgMaxFsup; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } @@ -2847,135 +3951,133 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if (WavCoeffs_L[dir][k] > MaxPCompare) { edge *= edgeMaxFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } }//reduce edge if > new max else if (WavCoeffs_L[dir][k] < MaxNCompare) { edge *= edgeMaxFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } - if (fabs(WavCoeffs_L[dir][k]) >= edgeMeanCompare && fabs(WavCoeffs_L[dir][k]) < edgeSdCompare) { - //if (fabs(WavCoeffs_L[dir][i]) > edgeSdCompare) { + if (std::fabs(WavCoeffs_L[dir][k]) >= edgeMeanCompare && std::fabs(WavCoeffs_L[dir][k]) < edgeSdCompare) { + //if (std::fabs(WavCoeffs_L[dir][i]) > edgeSdCompare) { edge *= edgeSdFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } }//modify effect if sd change - if (fabs(WavCoeffs_L[dir][k]) < edgeMeanCompare) { + if (std::fabs(WavCoeffs_L[dir][k]) < edgeMeanCompare) { edge *= edgeMeanFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } // modify effect if mean change - if (fabs(WavCoeffs_L[dir][k]) < edgeLowCompare) { + if (std::fabs(WavCoeffs_L[dir][k]) < edgeLowCompare) { edge *= edgeLowFactor; - if(edge < 1.f) { + if (edge < 1.f) { edge = 1.f; } } - WavCoeffs_L[dir][k] *= edge; + WavCoeffs_L[dir][k] *= (1.f + (edge - 1.f) * beta[k]); } } } - if(!lipschitz) { + if (!lipschitz) { delete [] koe; } - } - - - if(!cp.link && cp.noiseena) { //used both with denoise 1 2 3 - float refine = 0.f; - - for (int i = 0; i < W_L * H_L; i++) { - if(level == 0) { - refine = cp.lev0s / 40.f; - } - - if(level == 1) { - refine = cp.lev1s / 40.f; - } - - if(level == 2) { - refine = cp.lev2s / 40.f; - } - - if(level == 3) { - refine = cp.lev3s / 40.f; - } - - WavCoeffs_L[dir][i] *= (1.f + refine); + if (!(cp.bam && cp.finena)) { + beta.reset(); } } + if (!cp.link && cp.noiseena) { //used both with denoise 1 2 3 + float refine = 0.f; + if (level == 0) { + refine = cp.lev0s / 40.f; + } else if (level == 1) { + refine = cp.lev1s / 40.f; + } else if (level == 2) { + refine = cp.lev2s / 40.f; + } else if (level == 3) { + refine = cp.lev3s / 40.f; + } + + if (refine != 0.f) { + refine += 1.f; + for (int i = 0; i < W_L * H_L; i++) { + WavCoeffs_L[dir][i] *= refine; + } + } + } float cpMul = cp.mul[level]; - if(cpMul != 0.f && cp.contena) { // cpMul == 0.f means all will be multiplied by 1.f, so we can skip this + if (cpMul != 0.f && cp.contena) { // cpMul == 0.f means all will be multiplied by 1.f, so we can skip this const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); + const float offs = params->wavelet.offset; + const float lowthr = params->wavelet.lowthr; + float mea[10]; + float effect = cp.sigm; + float lbeta; - //to adjust increase contrast with local contrast - - //for each pixel and each level - float beta; - float mea[9]; - mea[0] = mean[level] / 6.f; - mea[1] = mean[level] / 2.f; - mea[2] = mean[level]; // 50% data - mea[3] = mean[level] + sigma[level] / 2.f; - mea[4] = mean[level] + sigma[level]; //66% - mea[5] = mean[level] + 1.2f * sigma[level]; - mea[6] = mean[level] + 1.5f * sigma[level]; // - mea[7] = mean[level] + 2.f * sigma[level]; //95% - mea[8] = mean[level] + 2.5f * sigma[level]; //99% + calceffect(level, mean, sigma, mea, effect, offs); bool useChromAndHue = (skinprot != 0.f || cp.HSmet); float modchro; + float red0 = 0.005f * (110.f - lowthr); + float red1 = 0.008f * (110.f - lowthr); + float red2 = 0.011f * (110.f - lowthr); +// int n = 0; +// int m = 0; +// int p = 0; +// int q = 0; for (int i = 0; i < W_L * H_L; i++) { float kLlev = 1.f; - if(cpMul < 0.f) { - beta = 1.f; // disabled for negatives values "less contrast" + if (cpMul < 0.f) { + lbeta = 1.f; // disabled for negatives values "less contrast" } else { - float WavCL = fabsf(WavCoeffs_L[dir][i]); + float WavCL = std::fabs(WavCoeffs_L[dir][i]); //reduction amplification: max action between mean / 2 and mean + sigma // arbitrary coefficient, we can add a slider !! - if(WavCL < mea[0]) { - beta = 0.6f; //preserve very low contrast (sky...) - } else if(WavCL < mea[1]) { - beta = 0.8f; - } else if(WavCL < mea[2]) { - beta = 1.f; //standard - } else if(WavCL < mea[3]) { - beta = 1.f; - } else if(WavCL < mea[4]) { - beta = 0.8f; //+sigma - } else if(WavCL < mea[5]) { - beta = 0.6f; - } else if(WavCL < mea[6]) { - beta = 0.4f; - } else if(WavCL < mea[7]) { - beta = 0.2f; // + 2 sigma - } else if(WavCL < mea[8]) { - beta = 0.1f; + if (WavCL < mea[0]) { + lbeta = 0.4f * red0;//preserve very low contrast (sky...) + } else if (WavCL < mea[1]) { + lbeta = 0.5f * red1; + } else if (WavCL < mea[2]) { + lbeta = 0.7f * red2; + } else if (WavCL < mea[3]) { + lbeta = 1.f; //standard + } else if (WavCL < mea[4]) { + lbeta = 1.f; + } else if (WavCL < mea[5]) { + lbeta = 0.8f; //+sigma + } else if (WavCL < mea[6]) { + lbeta = 0.6f; + } else if (WavCL < mea[7]) { + lbeta = 0.4f; + } else if (WavCL < mea[8]) { + lbeta = 0.2f; // + 2 sigma + } else if (WavCL < mea[9]) { + lbeta = 0.1f; } else { - beta = 0.0f; + lbeta = 0.0f; } } @@ -2989,10 +4091,10 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float LL = labco->L[ii * 2][jj * 2]; LL100 = LL100init = LL / 327.68f; LL100res = WavCoeffs_L0[i] / 327.68f; - float delta = fabs(LL100init - LL100res) / (maxlvl / 2); + float delta = std::fabs(LL100init - LL100res) / (maxlvl / 2); - for(int ml = 0; ml < maxlvl; ml++) { - if(ml < maxlvl / 2) { + for (int ml = 0; ml < maxlvl; ml++) { + if (ml < maxlvl / 2) { kH[ml] = (LL100res + ml * delta) / LL100res; // fixed a priori max to level middle } else { kH[ml] = (LL100init - ml * delta) / LL100res; @@ -3000,16 +4102,16 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } - if(useChromAndHue) { + if (useChromAndHue) { float modhue = varhue[ii][jj]; modchro = varchrom[ii * 2][jj * 2]; // hue chroma skin with initial lab data scale = 1.f; - if(skinprot > 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand - } else if(skinprot < 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); + if (skinprot > 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand + } else if (skinprot < 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); if (scale == 1.f) { scale = factorHard; @@ -3020,14 +4122,13 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } - if(Chutili) { + if (Chutili) { int i_i = i / W_L; int j_j = i - i_i * W_L; - double lr; float modhue2 = varhue[i_i][j_j]; - float valparam = float((ChCurve->getVal(lr = Color::huelab_to_huehsv2(modhue2)) - 0.5f)); //get valparam=f(H) + float valparam = static_cast(ChCurve->getVal(Color::huelab_to_huehsv2(modhue2))) - 0.5f; //get valparam=f(H) - if(valparam > 0.f) { + if (valparam > 0.f) { scale2 = 1.f + 3.f * valparam; //arbitrary value } else { scale2 = 1.f + 1.9f * valparam; //near 0 but not zero if curve # 0 @@ -3036,9 +4137,10 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit //linear transition HL float diagacc = 1.f; - float alpha = (1024.f + 15.f * (float) cpMul * scale * scale2 * beta * diagacc) / 1024.f ; + float alpha = (1024.f + 15.f * (float) cpMul * scale * scale2 * lbeta * diagacc) / 1024.f ; - if(cp.HSmet && cp.contena) { + // if (cp.HSmet && cp.contena) { + if (cp.HSmet && cp.contena && waOpacityCurveSH) { float aaal = (1.f - alpha) / ((cp.b_lhl - cp.t_lhl) * kH[level]); float bbal = 1.f - aaal * cp.b_lhl * kH[level]; float aaar = (alpha - 1.f) / (cp.t_rhl - cp.b_rhl) * kH[level]; @@ -3049,27 +4151,32 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float aaarS = (alpha - 1.f) / (cp.t_rsl - cp.b_rsl); float bbbrS = 1.f - cp.b_rsl * aaarS; - if(level <= cp.numlevH) { //in function of levels - if((LL100 > cp.t_lhl * kH[level] && LL100 < cp.t_rhl * kH[level])) { + if (level <= cp.numlevH) { //in function of levels + if ((LL100 > cp.t_lhl * kH[level] && LL100 < cp.t_rhl * kH[level])) { kLlev = alpha; - } else if((LL100 > cp.b_lhl * kH[level] && LL100 <= cp.t_lhl * kH[level])) { + } else if ((LL100 > cp.b_lhl * kH[level] && LL100 <= cp.t_lhl * kH[level])) { kLlev = aaal * LL100 + bbal; - } else if((LL100 > cp.t_rhl * kH[level] && LL100 <= cp.b_rhl * kH[level])) { + } else if ((LL100 > cp.t_rhl * kH[level] && LL100 <= cp.b_rhl * kH[level])) { kLlev = aaar * LL100 + bbbr; } else { kLlev = 1.f; } } - if(level >= (9 - cp.numlevS)) { - if((LL100 > cp.t_lsl && LL100 < cp.t_rsl)) { + if (level >= cp.numlevS - 1) { + // if(klevred < 0.f && level >= 3) {//level > 3 to avoid bad use of the curve if user put positives values negatives + if ((LL100 > cp.t_lsl && LL100 < cp.t_rsl)) { kLlev = alpha; - } else if((LL100 > cp.b_lsl && LL100 <= cp.t_lsl)) { + // n++; + } else if ((LL100 > cp.b_lsl && LL100 <= cp.t_lsl)) { kLlev = aaalS * LL100 + bbalS; - } else if((LL100 > cp.t_rsl && LL100 <= cp.b_rsl)) { + // m++; + } else if ((LL100 > cp.t_rsl && LL100 <= cp.b_rsl)) { kLlev = aaarS * LL100 + bbbrS; + // p++; } else { kLlev = 1.f; + // q++; } } @@ -3079,34 +4186,70 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit WavCoeffs_L[dir][i] *= (kLlev); } + + // printf("lev=%i n=%i m=%i p=%i q=%i\n", level, n, m, p, q); } - if(waOpacityCurveW) { + if (waOpacityCurveW) { cp.opaW = true; } - if(cp.bam && cp.finena) { - if(cp.opaW && cp.BAmet == 2) { + if (cp.bam && cp.finena) { + const float effect = cp.sigmadir; + constexpr float offs = 1.f; + float mea[10]; + + calceffect(level, mean, sigma, mea, effect, offs); + + for (int co = 0; co < H_L * W_L; co++) { + float WavCL = std::fabs(WavCoeffs_L[dir][co]); + + if (WavCL < mea[0]) { + beta[co] = 0.05f; + } else if (WavCL < mea[1]) { + beta[co] = 0.2f; + } else if (WavCL < mea[2]) { + beta[co] = 0.7f; + } else if (WavCL < mea[3]) { + beta[co] = 1.f; //standard + } else if (WavCL < mea[4]) { + beta[co] = 1.f; + } else if (WavCL < mea[5]) { + beta[co] = 0.8f; //+sigma + } else if (WavCL < mea[6]) { + beta[co] = 0.6f; + } else if (WavCL < mea[7]) { + beta[co] = 0.4f; + } else if (WavCL < mea[8]) { + beta[co] = 0.2f; // + 2 sigma + } else if (WavCL < mea[9]) { + beta[co] = 0.1f; + } else { + beta[co] = 0.01f; + } + } + + if (cp.opaW && cp.BAmet == 2) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if (level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { //float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_L * H_L; i++) { int ii = i / W_L; int jj = i - ii * W_L; @@ -3114,57 +4257,57 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit float k1 = 0.3f * (waOpacityCurveW[6.f * LL100] - 0.5f); //k1 between 0 and 0.5 0.5==> 1/6=0.16 float k2 = k1 * 2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - k2; } - WavCoeffs_L[dir][i] *= (kba); + WavCoeffs_L[dir][i] *= (1.f + (kba - 1.f) * beta[i]); } } } - if(cp.BAmet == 1) { + if (cp.BAmet == 1) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if (level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_L * H_L; i++) { int ii = i / W_L; int jj = i - ii * W_L; float k1 = 600.f; float k2 = 300.f; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; - float aa = 4970.f; - float bb = -397000.f; - float b0 = 100000.f; - float a0 = -4970.f; + constexpr float aa = 4970.f; + constexpr float bb = -397000.f; + constexpr float b0 = 100000.f; + constexpr float a0 = -4970.f; - if(LL100 > 80.f) { + if (LL100 > 80.f) { k1 = aa * LL100 + bb; k2 = 0.5f * k1; } - if(LL100 < 20.f) { + if (LL100 < 20.f) { k1 = a0 * LL100 + b0; k2 = 0.5f * k1; } @@ -3173,32 +4316,31 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit //k2=300.f; //k1=0.3f*(waOpacityCurveW[6.f*LL100]-0.5f);//k1 between 0 and 0.5 0.5==> 1/6=0.16 //k2=k1*2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + bal / k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - bal / k2; } - WavCoeffs_L[dir][i] *= (kba); + WavCoeffs_L[dir][i] *= (1.f + (kba - 1.f) * beta[i]); } } } - } // to see each level of wavelet ...level from 0 to 8 - int choicelevel = params->wavelet.Lmethod - 1; - choicelevel = choicelevel == -1 ? 4 : choicelevel; +// int choicelevel = params->wavelet.Lmethod - 1; +// choicelevel = choicelevel == -1 ? 4 : choicelevel; } -void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float **varchrom, float ** WavCoeffs_ab, float * WavCoeffs_ab0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, - int W_ab, int H_ab, const bool useChannelA) +void ImProcFunctions::ContAllAB(LabImage * labco, int maxlvl, float ** varhue, float **varchrom, float* const* WavCoeffs_ab, float * WavCoeffs_ab0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, + int W_ab, int H_ab, const bool useChannelA, float *meanab, float *sigmaab) { float cpMul = cp.mul[level]; - if(cpMul != 0.f && cp.CHmet == 2 && cp.chro != 0.f && cp.chromena) { // cpMul == 0.f or cp.chro = 0.f means all will be multiplied by 1.f, so we can skip this + if (cpMul != 0.f && cp.CHmet == 2 && cp.chro != 0.f && cp.chromena) { // cpMul == 0.f or cp.chro = 0.f means all will be multiplied by 1.f, so we can skip this const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); @@ -3206,28 +4348,62 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, //to adjust increase contrast with local contrast bool useSkinControl = (skinprot != 0.f); - float alphaC = (1024.f + 15.f * cpMul * cpChrom / 50.f) / 1024.f ; + + float mea[10]; + float effect = cp.sigmacol; + float betaab; + float offs = 1.f; + + calceffect(level, meanab, sigmaab, mea, effect, offs); for (int i = 0; i < W_ab * H_ab; i++) { - if(useSkinControl) { + float WavCab = std::fabs(WavCoeffs_ab[dir][i]); + + if (WavCab < mea[0]) { + betaab = 0.05f; + } else if (WavCab < mea[1]) { + betaab = 0.2f; + } else if (WavCab < mea[2]) { + betaab = 0.7f; + } else if (WavCab < mea[3]) { + betaab = 1.f; //standard + } else if (WavCab < mea[4]) { + betaab = 1.f; + } else if (WavCab < mea[5]) { + betaab = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + betaab = 0.6f; + } else if (WavCab < mea[7]) { + betaab = 0.4f; + } else if (WavCab < mea[8]) { + betaab = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + betaab = 0.1f; + } else { + betaab = 0.0f; + } + + float scale = 1.f; + + if (useSkinControl) { int ii = i / W_ab; int jj = i - ii * W_ab; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; float modhue = varhue[ii][jj]; float modchro = varchrom[ii * 2][jj * 2]; // hue chroma skin with initial lab data - float scale = 1.f; - if(skinprot > 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand - } else if(skinprot < 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); + if (skinprot > 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); //0 for skin and extand + } else if (skinprot < 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 0); scale = (scale == 1.f) ? factorHard : 1.f; } - alphaC = (1024.f + 15.f * cpMul * cpChrom * scale / 50.f) / 1024.f ; } + const float alphaC = (1024.f + 15.f * cpMul * cpChrom * betaab * scale / 50.f) / 1024.f ; + WavCoeffs_ab[dir][i] *= alphaC; } } @@ -3236,51 +4412,85 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float cpMulC = cp.mulC[level]; - // if( (cp.curv || cp.CHSLmet==1) && cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip - if( cp.CHmet != 2 && level < 9 && cpMulC != 0.f && cp.chromena) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip + // if ( (cp.curv || cp.CHSLmet==1) && cp.CHmet!=2 && level < 9 && cpMulC != 0.f) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip + if (cp.CHmet != 2 && level < 9 && cpMulC != 0.f && cp.chromena) { // cpMulC == 0.f means all will be multiplied by 1.f, so we can skip const float skinprot = params->wavelet.skinprotect; const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); bool useSkinControl = (skinprot != 0.f); + + float mea[10]; + float effect = cp.sigmacol; + float betaab; + float offs = 1.f; + + calceffect(level, meanab, sigmaab, mea, effect, offs); + for (int i = 0; i < W_ab * H_ab; i++) { + float WavCab = std::fabs(WavCoeffs_ab[dir][i]); + + if (WavCab < mea[0]) { + betaab = 0.05f; + } else if (WavCab < mea[1]) { + betaab = 0.2f; + } else if (WavCab < mea[2]) { + betaab = 0.7f; + } else if (WavCab < mea[3]) { + betaab = 1.f; //standard + } else if (WavCab < mea[4]) { + betaab = 1.f; + } else if (WavCab < mea[5]) { + betaab = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + betaab = 0.6f; + } else if (WavCab < mea[7]) { + betaab = 0.4f; + } else if (WavCab < mea[8]) { + betaab = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + betaab = 0.1f; + } else { + betaab = 0.0f; + } + int ii = i / W_ab; int jj = i - ii * W_ab; //WL and W_ab are identical float scale = 1.f; float modchro = varchrom[ii * 2][jj * 2]; - if(useSkinControl) { + if (useSkinControl) { // hue chroma skin with initial lab data float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; float modhue = varhue[ii][jj]; - if(skinprot > 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); //1 for curve - } else if(skinprot < 0.f) { - Color::SkinSatCbdl2 (LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); + if (skinprot > 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprot, scale, true, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); //1 for curve + } else if (skinprot < 0.f) { + Color::SkinSatCbdl2(LL100, modhue, modchro, skinprotneg, scale, false, cp.b_l, cp.t_l, cp.t_r, cp.b_r, 1); scale = (scale == 1.f) ? factorHard : 1.f; } } - float beta = (1024.f + 20.f * cpMulC * scale) / 1024.f ; + float beta = (1024.f + 20.f * cpMulC * scale * betaab) / 1024.f ; - if(beta < 0.02f) { + if (beta < 0.02f) { beta = 0.02f; } float kClev = beta; - if(cp.CHmet == 1) { - if(level < cp.chrom) { + if (cp.CHmet == 1) { + if (level < cp.chrom) { //linear for saturated - if((modchro > cp.t_lsat && modchro < cp.t_rsat)) { + if ((modchro > cp.t_lsat && modchro < cp.t_rsat)) { kClev = beta; - } else if((modchro > cp.b_lsat && modchro <= cp.t_lsat)) { + } else if ((modchro > cp.b_lsat && modchro <= cp.t_lsat)) { float aaal = (1.f - beta) / (cp.b_lsat - cp.t_lsat); float bbal = 1.f - aaal * cp.b_lsat; kClev = aaal * modchro + bbal; - } else if((modchro > cp.t_rsat && modchro <= cp.b_rsat)) { + } else if ((modchro > cp.t_rsat && modchro <= cp.b_rsat)) { float aaar = (beta - 1.f) / (cp.t_rsat - cp.b_rsat); float bbbr = 1.f - cp.b_rsat * aaar; kClev = aaar * modchro + bbbr; @@ -3289,13 +4499,13 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } else { //linear for pastel - if((modchro > cp.t_lpast && modchro < cp.t_rpast)) { + if ((modchro > cp.t_lpast && modchro < cp.t_rpast)) { kClev = beta; - } else if((modchro > cp.b_lpast && modchro <= cp.t_lpast)) { + } else if ((modchro > cp.b_lpast && modchro <= cp.t_lpast)) { float aaalS = (1.f - beta) / (cp.b_lpast - cp.t_lpast); float bbalS = 1.f - aaalS * cp.b_lpast; kClev = aaalS * modchro + bbalS; - } else if((modchro > cp.t_rpast && modchro <= cp.b_rpast)) { + } else if ((modchro > cp.t_rpast && modchro <= cp.b_rpast)) { float aaarS = (beta - 1.f) / (cp.t_rpast - cp.b_rpast); float bbbrS = 1.f - cp.b_rpast * aaarS; kClev = aaarS * modchro + bbbrS; @@ -3303,7 +4513,7 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, kClev = 1.f; } } - } else if(cp.CHmet == 0) { + } else if (cp.CHmet == 0) { kClev = beta; } @@ -3314,57 +4524,159 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, bool useOpacity; float mulOpacity = 0.f; - if(useChannelA) { + if (useChannelA) { useOpacity = cp.opaRG; - if(level < 9) { + + if (level < 9) { mulOpacity = cp.mulopaRG[level]; } } else { useOpacity = cp.opaBY; - if(level < 9) { + + if (level < 9) { mulOpacity = cp.mulopaBY[level]; } } - if((useOpacity && level < 9 && mulOpacity != 0.f) && cp.toningena) { //toning + if ((useOpacity && level < 9 && mulOpacity != 0.f) && cp.toningena) { //toning + // if (settings->verbose) { + // printf("Toning enabled\n"); + // } - float beta = (1024.f + 20.f * mulOpacity) / 1024.f ; + float mea[10]; + float effect = cp.sigmaton; + float betaab; + float offs = 1.f; + float protec = 0.01f * (100.f - cp.protab); + float aref1 = cp.a_high; + float bref1 = cp.b_high; + float aref2 = cp.a_low; + float bref2 = cp.b_low; - //float beta = (1000.f * mulOpacity); - for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] *= beta; + float kk = 100.f; + float arefplus1 = aref1 + cp.rangeab * kk; + float arefmoins1 = aref1 - cp.rangeab * kk; + float brefplus1 = bref1 + cp.rangeab * kk; + float brefmoins1 = bref1 - cp.rangeab * kk; + + float arefplus2 = aref2 + cp.rangeab * kk; + float arefmoins2 = aref2 - cp.rangeab * kk; + float brefplus2 = bref2 + cp.rangeab * kk; + float brefmoins2 = bref2 - cp.rangeab * kk; + + calceffect(level, meanab, sigmaab, mea, effect, offs); + + for (int co = 0; co < W_ab * H_ab; co++) { + float WavCab = std::fabs(WavCoeffs_ab[dir][co]); + + if (WavCab < mea[0]) { + betaab = 0.05f; + } else if (WavCab < mea[1]) { + betaab = 0.2f; + } else if (WavCab < mea[2]) { + betaab = 0.7f; + } else if (WavCab < mea[3]) { + betaab = 1.f; //standard + } else if (WavCab < mea[4]) { + betaab = 1.f; + } else if (WavCab < mea[5]) { + betaab = 0.8f; //+sigma + } else if (WavCab < mea[6]) { + betaab = 0.6f; + } else if (WavCab < mea[7]) { + betaab = 0.4f; + } else if (WavCab < mea[8]) { + betaab = 0.2f; // + 2 sigma + } else if (WavCab < mea[9]) { + betaab = 0.1f; + } else { + betaab = 0.0f; + } + + float kreduc1 = 1.f; + float kreduc2 = 1.f; + int ii = co / W_ab; + int jj = co - ii * W_ab; + + // cp.protab = 0.f;// always disabled provisory... + if (cp.protab > 0.f) { + if (useChannelA) { + if ((labco->a[ii * 2][jj * 2] > arefmoins1) && (labco->a[ii * 2][jj * 2] < arefplus1)) { + kreduc1 = 0.5f * protec; + + if ((labco->a[ii * 2][jj * 2] > 0.8f * arefmoins1) && (labco->a[ii * 2][jj * 2] < 0.8f * arefplus1)) { + kreduc1 = protec; + } + } + + } else { + if ((labco->b[ii * 2][jj * 2] > brefmoins1) && (labco->b[ii * 2][jj * 2] < brefplus1)) { + kreduc1 = 0.5f * protec; + + if ((labco->b[ii * 2][jj * 2] > 0.8f * brefmoins1) && (labco->b[ii * 2][jj * 2] < 0.8f * brefplus1)) { + kreduc1 = protec; + } + } + } + + if (useChannelA) { + if ((labco->a[ii * 2][jj * 2] > arefmoins2) && (labco->a[ii * 2][jj * 2] < arefplus2)) { + kreduc2 = 0.5f * protec; + + if ((labco->a[ii * 2][jj * 2] > 0.8f * arefmoins2) && (labco->a[ii * 2][jj * 2] < 0.8f * arefplus2)) { + kreduc2 = protec; + } + + } + } else { + if ((labco->b[ii * 2][jj * 2] > brefmoins2) && (labco->b[ii * 2][jj * 2] < brefplus2)) { + kreduc2 = 0.5f * protec; + + if ((labco->b[ii * 2][jj * 2] > brefmoins2) && (labco->b[ii * 2][jj * 2] < brefplus2)) { + kreduc2 = protec; + } + } + } + + } + + + // printf("pa1=%f pa2=%f\n", kreduc1, kredu2); + + + float beta = (1024.f + 50.f * mulOpacity * betaab * kreduc1 * kreduc2) / 1024.f ; + + WavCoeffs_ab[dir][co] *= beta; } - // WavCoeffs_ab[dir][i] += beta; } - if(waOpacityCurveW) { + if (waOpacityCurveW) { cp.opaW = true; } - if(cp.bam && cp.diag) { -//printf("OK Chroma\n"); - if(cp.opaW && cp.BAmet == 2) { + if (cp.bam && cp.diag) { + if (cp.opaW && cp.BAmet == 2) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if (level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { //float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_ab * H_ab; i++) { int ii = i / W_ab; int jj = i - ii * W_ab; @@ -3372,11 +4684,11 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float k1 = 0.3f * (waOpacityCurveW[6.f * LL100] - 0.5f); //k1 between 0 and 0.5 0.5==> 1/6=0.16 float k2 = k1 * 2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - k2; } @@ -3385,44 +4697,44 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } - if(cp.BAmet == 1) { + if (cp.BAmet == 1) { int iteration = cp.ite; int itplus = 7 + iteration; int itmoins = 7 - iteration; int med = maxlvl / 2; int it; - if(level < med) { + if (level < med) { it = itmoins; - } else if(level == med) { + } else if (level == med) { it = 7; - } else /*if(level > med)*/ { + } else { /*if (level > med)*/ it = itplus; } - for(int j = 0; j < it; j++) { + for (int j = 0; j < it; j++) { float bal = cp.balan;//-100 +100 float kba = 1.f; - // if(dir <3) kba= 1.f + bal/600.f; - // if(dir==3) kba = 1.f - bal/300.f; + // if (dir <3) kba= 1.f + bal/600.f; + // if (dir==3) kba = 1.f - bal/300.f; for (int i = 0; i < W_ab * H_ab; i++) { int ii = i / W_ab; int jj = i - ii * W_ab; float k1 = 600.f; float k2 = 300.f; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; - float aa = 4970.f; - float bb = -397000.f; - float b0 = 100000.f; - float a0 = -4970.f; + constexpr float aa = 4970.f; + constexpr float bb = -397000.f; + constexpr float b0 = 100000.f; + constexpr float a0 = -4970.f; - if(LL100 > 80.f) { + if (LL100 > 80.f) { k1 = aa * LL100 + bb; k2 = 0.5f * k1; } - if(LL100 < 20.f) { + if (LL100 < 20.f) { k1 = a0 * LL100 + b0; k2 = 0.5f * k1; } @@ -3431,11 +4743,11 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, //k2=300.f; //k1=0.3f*(waOpacityCurveW[6.f*LL100]-0.5f);//k1 between 0 and 0.5 0.5==> 1/6=0.16 //k2=k1*2.f; - if(dir < 3) { + if (dir < 3) { kba = 1.f + bal / k1; } - if(dir == 3) { + if (dir == 3) { kba = 1.f - bal / k2; } @@ -3451,34 +4763,34 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, choicelevel = choicelevel == -1 ? 4 : choicelevel; int choiceClevel = 0; - if(params->wavelet.CLmethod == "one") { + if (params->wavelet.CLmethod == "one") { choiceClevel = 0; - } else if(params->wavelet.CLmethod == "inf") { + } else if (params->wavelet.CLmethod == "inf") { choiceClevel = 1; - } else if(params->wavelet.CLmethod == "sup") { + } else if (params->wavelet.CLmethod == "sup") { choiceClevel = 2; - } else if(params->wavelet.CLmethod == "all") { + } else if (params->wavelet.CLmethod == "all") { choiceClevel = 3; } int choiceDir = 0; - if(params->wavelet.Dirmethod == "one") { + if (params->wavelet.Dirmethod == "one") { choiceDir = 1; - } else if(params->wavelet.Dirmethod == "two") { + } else if (params->wavelet.Dirmethod == "two") { choiceDir = 2; - } else if(params->wavelet.Dirmethod == "thr") { + } else if (params->wavelet.Dirmethod == "thr") { choiceDir = 3; - } else if(params->wavelet.Dirmethod == "all") { + } else if (params->wavelet.Dirmethod == "all") { choiceDir = 0; } int dir1 = (choiceDir == 2) ? 1 : 2; int dir2 = (choiceDir == 3) ? 1 : 3; - if(choiceClevel < 3) { // not all levels visible, paint residual - if(level == 0) { - if(cp.backm != 2) { // nothing to change when residual is used as background + if (choiceClevel < 3) { // not all levels visible, paint residual + if (level == 0) { + if (cp.backm != 2) { // nothing to change when residual is used as background for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab0[i] = 0.f; } @@ -3486,61 +4798,61 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } - if(choiceClevel == 0) { // Only one level - if(choiceDir == 0) { // All directions - if(level != choicelevel) { // zero all for the levels != choicelevel - for (int dir = 1; dir < 4; dir++) { + if (choiceClevel == 0) { // Only one level + if (choiceDir == 0) { // All directions + if (level != choicelevel) { // zero all for the levels != choicelevel + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } } else { // zero the unwanted directions for level == choicelevel - if(choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + if (choicelevel >= cp.maxilev) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } - } else if(level != choicelevel) { // zero all for the levels != choicelevel + } else if (level != choicelevel) { // zero all for the levels != choicelevel for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir1][i] = WavCoeffs_ab[dir2][i] = 0.f; } } } - } else if(choiceClevel == 1) { // Only below level - if(choiceDir == 0) { // All directions - if(level > choicelevel) { - for (int dir = 1; dir < 4; dir++) { + } else if (choiceClevel == 1) { // Only below level + if (choiceDir == 0) { // All directions + if (level > choicelevel) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } } else { // zero the unwanted directions for level >= choicelevel - if(level > choicelevel) { + if (level > choicelevel) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir1][i] = WavCoeffs_ab[dir2][i] = 0.f; } } } - } else if(choiceClevel == 2) { // Only above level - if(choiceDir == 0) { // All directions - if(level <= choicelevel) { - for (int dir = 1; dir < 4; dir++) { + } else if (choiceClevel == 2) { // Only above level + if (choiceDir == 0) { // All directions + if (level <= choicelevel) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } } } else { // zero the unwanted directions for level >= choicelevel - if(choicelevel >= cp.maxilev) { - for (int dir = 1; dir < 4; dir++) { + if (choicelevel >= cp.maxilev) { + for (int d = 1; d < 4; d++) { for (int i = 0; i < W_ab * H_ab; i++) { - WavCoeffs_ab[dir][i] = 0.f; + WavCoeffs_ab[d][i] = 0.f; } } - } else if(level <= choicelevel) { + } else if (level <= choicelevel) { for (int i = 0; i < W_ab * H_ab; i++) { WavCoeffs_ab[dir1][i] = WavCoeffs_ab[dir2][i] = 0.f; } @@ -3548,4 +4860,5 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } } } + } diff --git a/rtengine/jdatasrc.cc b/rtengine/jdatasrc.cc index 8c04a14a2..f9256899d 100644 --- a/rtengine/jdatasrc.cc +++ b/rtengine/jdatasrc.cc @@ -25,11 +25,6 @@ #define JFREAD(file,buf,sizeofbuf) \ ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) -#define JFWRITE(file,buf,sizeofbuf) \ - ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) - - - /* Expanded data source object for stdio input */ namespace @@ -253,12 +248,18 @@ my_error_exit (j_common_ptr cinfo) } -//const char * const jpeg_std_message_table[] = { -//#include "jerror.h" -// NULL -//}; -extern const char * const jpeg_std_message_table[]; +#ifdef WIN32 +#define JVERSION "6b 27-Mar-1998" +#define JCOPYRIGHT_SHORT "(C) 1998, Thomas G. Lane" +#define JMESSAGE(code,string) string , +const char * const jpeg_std_message_table[] = { +#include "jerror.h" + NULL +}; +#else +extern const char * const jpeg_std_message_table[]; +#endif /* * Actual output of an error or trace message. @@ -378,9 +379,9 @@ format_message (j_common_ptr cinfo, char * buffer) /* Format the message into the passed buffer */ if (isstring) { - sprintf(buffer, msgtext, err->msg_parm.s); + snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.s); } else - sprintf(buffer, msgtext, + snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.i[0], err->msg_parm.i[1], err->msg_parm.i[2], err->msg_parm.i[3], err->msg_parm.i[4], err->msg_parm.i[5], diff --git a/rtengine/klt/selectGoodFeatures.cc b/rtengine/klt/selectGoodFeatures.cc index 20e67fb2e..ccd7681db 100644 --- a/rtengine/klt/selectGoodFeatures.cc +++ b/rtengine/klt/selectGoodFeatures.cc @@ -9,7 +9,6 @@ #include /* fflush() */ #include /* memset() */ #include /* fsqrt() */ -#define fsqrt(X) sqrt(X) /* Our includes */ #include "base.h" diff --git a/rtengine/klt/trackFeatures.cc b/rtengine/klt/trackFeatures.cc index a99225543..b4f13c53c 100644 --- a/rtengine/klt/trackFeatures.cc +++ b/rtengine/klt/trackFeatures.cc @@ -460,7 +460,7 @@ static int _trackFeature( /* Check whether window is out of bounds */ if (*x2-hw < 0.0f || nc-(*x2+hw) < one_plus_eps || - *y2-hh < 0.0f || nr-(*y2+hh) < one_plus_eps) + *y2-hh < 0.0f || nr-(*y2+hh) < one_plus_eps || std::isnan(*x2) || std::isnan(*y2)) status = KLT_OOB; /* Check whether residue is too large */ @@ -1044,7 +1044,7 @@ static int _am_trackFeatureAffine( #ifdef DEBUG_AFFINE_MAPPING aff_diff_win->data = imgdiff; - sprintf(fname, "./debug/kltimg_trans_diff_win%03d.%03d.pgm", glob_index, counter); + snprintf(fname, sizeof(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)); @@ -1095,13 +1095,13 @@ static int _am_trackFeatureAffine( counter++; _am_computeAffineMappedImage(img1, x1, y1, 1.0, 0.0 , 0.0, 1.0, width, height, imgdiff); aff_diff_win->data = imgdiff; - sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_1.pgm", glob_index, counter); + snprintf(fname, sizeof(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); + snprintf(fname, sizeof(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 @@ -1110,7 +1110,7 @@ static int _am_trackFeatureAffine( width, height, imgdiff); #ifdef DEBUG_AFFINE_MAPPING aff_diff_win->data = imgdiff; - sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_3.pgm", glob_index,counter); + snprintf(fname, sizeof(fname), "./debug/kltimg_aff_diff_win%03d.%03d_3.pgm", glob_index,counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); @@ -1335,17 +1335,17 @@ void KLTTrackFeatures( if (tc->writeInternalImages) { char fname[80]; for (i = 0 ; i < tc->nPyramidLevels ; i++) { - sprintf(fname, "kltimg_tf_i%d.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_i%d.pgm", i); _KLTWriteFloatImageToPGM(pyramid1->img[i], fname); - sprintf(fname, "kltimg_tf_i%d_gx.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_i%d_gx.pgm", i); _KLTWriteFloatImageToPGM(pyramid1_gradx->img[i], fname); - sprintf(fname, "kltimg_tf_i%d_gy.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_i%d_gy.pgm", i); _KLTWriteFloatImageToPGM(pyramid1_grady->img[i], fname); - sprintf(fname, "kltimg_tf_j%d.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_j%d.pgm", i); _KLTWriteFloatImageToPGM(pyramid2->img[i], fname); - sprintf(fname, "kltimg_tf_j%d_gx.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_j%d_gx.pgm", i); _KLTWriteFloatImageToPGM(pyramid2_gradx->img[i], fname); - sprintf(fname, "kltimg_tf_j%d_gy.pgm", i); + snprintf(fname, sizeof(fname), "kltimg_tf_j%d_gy.pgm", i); _KLTWriteFloatImageToPGM(pyramid2_grady->img[i], fname); } } diff --git a/rtengine/klt/writeFeatures.cc b/rtengine/klt/writeFeatures.cc index 1bfe3f20f..d3ec627ed 100644 --- a/rtengine/klt/writeFeatures.cc +++ b/rtengine/klt/writeFeatures.cc @@ -97,6 +97,7 @@ static FILE* _printSetupTxt( const char *fname, /* Input: filename, or NULL for stderr */ const char *fmt, /* Input: format (e.g., %5.1f or %3d) */ char *format, /* Output: format (e.g., (%5.1f,%5.1f)=%3d) */ + std::size_t format_size, char *type) /* Output: either 'f' or 'd', based on input format */ { FILE *fp; @@ -124,7 +125,7 @@ static FILE* _printSetupTxt( } /* Construct feature format */ - sprintf(format, "(%s,%s)=%%%dd ", fmt, fmt, val_width); + snprintf(format, format_size, "(%s,%s)=%%%dd ", fmt, fmt, val_width); return fp; } @@ -163,7 +164,7 @@ static void _printInteger( int width) { char fmt[80]; - sprintf(fmt, "%%%dd", width); + snprintf(fmt, sizeof(fmt), "%%%dd", width); fprintf(fp, fmt, integer); } @@ -358,7 +359,7 @@ void KLTWriteFeatureList( } if (fmt != nullptr) { /* text file or stderr */ - fp = _printSetupTxt(fname, fmt, format, &type); + fp = _printSetupTxt(fname, fmt, format, sizeof(format), &type); _printHeader(fp, format, FEATURE_LIST, 0, fl->nFeatures); for (i = 0 ; i < fl->nFeatures ; i++) { @@ -396,7 +397,7 @@ void KLTWriteFeatureHistory( } if (fmt != nullptr) { /* text file or stderr */ - fp = _printSetupTxt(fname, fmt, format, &type); + fp = _printSetupTxt(fname, fmt, format, sizeof(format), &type); _printHeader(fp, format, FEATURE_HISTORY, fh->nFrames, 0); for (i = 0 ; i < fh->nFrames ; i++) { @@ -435,7 +436,7 @@ void KLTWriteFeatureTable( } if (fmt != nullptr) { /* text file or stderr */ - fp = _printSetupTxt(fname, fmt, format, &type); + fp = _printSetupTxt(fname, fmt, format, sizeof(format), &type); _printHeader(fp, format, FEATURE_TABLE, ft->nFrames, ft->nFeatures); for (j = 0 ; j < ft->nFeatures ; j++) { @@ -558,19 +559,19 @@ static structureType _readHeader( if (id == FEATURE_TABLE) { fscanf(fp, "%s", line); if (strcmp(line, ",") != 0) { - KLTError("(_readFeatures) File '%s' is corrupted -- " + KLTError("(_readFeatures) File is corrupted -- " "(Expected 'comma', found '%s' instead)", line); exit(1); } fscanf(fp, "%s", line); if (strcmp(line, "nFeatures") != 0) { - KLTError("(_readFeatures) File '%s' is corrupted -- " + KLTError("(_readFeatures) File is corrupted -- " "(2 Expected 'nFeatures ', found '%s' instead)", line); exit(1); } fscanf(fp, "%s", line); if (strcmp(line, "=") != 0) { - KLTError("(_readFeatures) File '%s' is corrupted -- " + KLTError("(_readFeatures) File is corrupted -- " "(2 Expected '= ', found '%s' instead)", line); exit(1); } diff --git a/rtengine/labimage.cc b/rtengine/labimage.cc index 153af4c75..68d3857e5 100644 --- a/rtengine/labimage.cc +++ b/rtengine/labimage.cc @@ -24,9 +24,18 @@ namespace rtengine { -LabImage::LabImage (int w, int h) : W(w), H(h) +LabImage::LabImage (int w, int h, bool initZero, bool multiThread) : W(w), H(h) { allocLab(w, h); + if (initZero) { + clear(multiThread); + } +} + +LabImage::LabImage (const LabImage& source, bool multiThread) : W(source.W), H(source.H) +{ + allocLab(W, H); + CopyFrom(&source, multiThread); } LabImage::~LabImage () @@ -34,12 +43,24 @@ LabImage::~LabImage () deleteLab(); } -void LabImage::CopyFrom(LabImage *Img) +void LabImage::CopyFrom(const LabImage *Img, bool multiThread) { - memcpy(data, Img->data, W * H * 3 * sizeof(float)); +#ifdef _OPENMP + #pragma omp parallel sections if(multiThread) + { + #pragma omp section + memcpy(L[0], Img->L[0], static_cast(W) * H * sizeof(float)); + #pragma omp section + memcpy(a[0], Img->a[0], static_cast(W) * H * sizeof(float)); + #pragma omp section + memcpy(b[0], Img->b[0], static_cast(W) * H * sizeof(float)); + } +#else + memcpy(data, Img->data, static_cast(W) * H * 3 * sizeof(float)); +#endif } -void LabImage::getPipetteData (float &v1, float &v2, float &v3, int posX, int posY, int squareSize) +void LabImage::getPipetteData (float &v1, float &v2, float &v3, int posX, int posY, int squareSize) const { float accumulator_L = 0.f; float accumulator_a = 0.f; @@ -102,4 +123,12 @@ void LabImage::reallocLab() allocLab(W, H); } +void LabImage::clear(bool multiThread) { +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for(size_t i = 0; i < static_cast(H) * W * 3; ++i) { + data[i] = 0.f; + } + } } diff --git a/rtengine/labimage.h b/rtengine/labimage.h index 79f003b07..4d1c05aed 100644 --- a/rtengine/labimage.h +++ b/rtengine/labimage.h @@ -23,7 +23,7 @@ namespace rtengine { -class LabImage +class LabImage final { private: void allocLab(size_t w, size_t h); @@ -35,14 +35,16 @@ public: float** a; float** b; - LabImage (int w, int h); + LabImage (int w, int h, bool initZero = false, bool multiThread = true); + LabImage (const LabImage& source, bool multiThread); ~LabImage (); //Copies image data in Img into this instance. - void CopyFrom(LabImage *Img); - void getPipetteData (float &L, float &a, float &b, int posX, int posY, int squareSize); + void CopyFrom(const LabImage *Img, bool multiThread = true); + void getPipetteData (float &L, float &a, float &b, int posX, int posY, int squareSize) const; void deleteLab(); void reallocLab(); + void clear(bool multiThread = false); }; } diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index c80a126f5..7fd22d1f8 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -42,7 +42,6 @@ class rtengine::LCPProfile::LCPPersModel public: LCPPersModel(); bool hasModeData(LCPCorrectionMode mode) const; - void print() const; float focLen; float focDist; @@ -82,27 +81,18 @@ bool rtengine::LCPModelCommon::empty() const && param[2] == 0.0f; } -void rtengine::LCPModelCommon::print() const -{ - std::printf("focLen %g/%g; imgCenter %g/%g; scale %g; err %g\n", foc_len_x, foc_len_y, img_center_x, img_center_y, scale_factor, mean_error); - std::printf("xy0 %g/%g fxy %g/%g\n", x0, y0, fx, fy); - std::printf("param: %g/%g/%g/%g/%g\n", param[0], param[1], param[2], param[3], param[4]); -} - // weighted merge two parameters void rtengine::LCPModelCommon::merge(const LCPModelCommon& a, const LCPModelCommon& b, float facA) { - const float facB = 1.0f - facA; - - foc_len_x = facA * a.foc_len_x + facB * b.foc_len_x; - foc_len_y = facA * a.foc_len_y + facB * b.foc_len_y; - img_center_x = facA * a.img_center_x + facB * b.img_center_x; - img_center_y = facA * a.img_center_y + facB * b.img_center_y; - scale_factor = facA * a.scale_factor + facB * b.scale_factor; - mean_error = facA * a.mean_error + facB * b.mean_error; + foc_len_x = rtengine::intp(facA, a.foc_len_x, b.foc_len_x); + foc_len_y = rtengine::intp(facA, a.foc_len_y, b.foc_len_y); + img_center_x = rtengine::intp(facA, a.img_center_x, b.img_center_x); + img_center_y = rtengine::intp(facA, a.img_center_y, b.img_center_y); + scale_factor = rtengine::intp(facA, a.scale_factor, b.scale_factor); + mean_error = rtengine::intp(facA, a.mean_error, b.mean_error); for (int i = 0; i < 5; ++i) { - param[i] = facA * a.param[i] + facB * b.param[i]; + param[i] = rtengine::intp(facA, a.param[i], b.param[i]); } const float param0Sqr = param[0] * param[0]; @@ -152,7 +142,6 @@ void rtengine::LCPModelCommon::prepareParams( rfx = 1.0f / fx; rfy = 1.0f / fy; - //std::printf("FW %i /X0 %g FH %i /Y0 %g %g\n",fullWidth,x0,fullHeight,y0, imgYCenter); } rtengine::LCPProfile::LCPPersModel::LCPPersModel() : @@ -188,35 +177,6 @@ bool rtengine::LCPProfile::LCPPersModel::hasModeData(LCPCorrectionMode mode) con return false; } -void rtengine::LCPProfile::LCPPersModel::print() const -{ - std::printf("--- PersModel focLen %g; focDist %g; aperture %g\n", focLen, focDist, aperture); - std::printf("Base:\n"); - base.print(); - - if (!chromRG.empty()) { - std::printf("ChromRG:\n"); - chromRG.print(); - } - - if (!chromG.empty()) { - std::printf("ChromG:\n"); - chromG.print(); - } - - if (!chromBG.empty()) { - std::printf("ChromBG:\n"); - chromBG.print(); - } - - if (!vignette.empty()) { - std::printf("Vignette:\n"); - vignette.print(); - } - - std::printf("\n"); -} - rtengine::LCPProfile::LCPProfile(const Glib::ustring& fname) : isFisheye(false), sensorFormatFactor(1.f), @@ -236,7 +196,7 @@ rtengine::LCPProfile::LCPProfile(const Glib::ustring& fname) : XML_Parser parser = XML_ParserCreate(nullptr); if (!parser) { - throw "Couldn't allocate memory for XML parser"; + throw std::runtime_error("Couldn't allocate memory for XML parser"); } XML_SetElementHandler(parser, XmlStartHandler, XmlEndHandler); @@ -256,7 +216,7 @@ rtengine::LCPProfile::LCPProfile(const Glib::ustring& fname) : if (XML_Parse(parser, buf, bytesRead, done) == XML_STATUS_ERROR) { XML_ParserFree(parser); - throw "Invalid XML in LCP file"; + throw std::runtime_error("Invalid XML in LCP file"); } } while (!done); @@ -522,7 +482,7 @@ void rtengine::LCPProfile::calcParams( ) { // Mix in aperture const float facAperLow = (pHigh->aperture - aperture) / (pHigh->aperture - pLow->aperture); - facLow = focLenOnSpot ? facAperLow : (0.5 * facLow + 0.5 * facAperLow); + facLow = focLenOnSpot ? facAperLow : (0.5f * (facLow + facAperLow)); } else if ( mode != LCPCorrectionMode::VIGNETTE @@ -532,7 +492,7 @@ void rtengine::LCPProfile::calcParams( ) { // focus distance for all else (if focus distance is given) const float facDistLow = (std::log(pHigh->focDist) + euler - focusDistLog) / (std::log(pHigh->focDist) - std::log(pLow->focDist)); - facLow = focLenOnSpot ? facDistLow : (0.8 * facLow + 0.2 * facDistLow); + facLow = focLenOnSpot ? facDistLow : (0.8f * facLow + 0.2f * facDistLow); } switch (mode) { @@ -555,7 +515,16 @@ void rtengine::LCPProfile::calcParams( } if (settings->verbose) { - std::printf("LCP mode=%i, dist: %g found frames: Fno %g-%g; FocLen %g-%g; Dist %g-%g with weight %g\n", toUnderlying(mode), focusDist, pLow->aperture, pHigh->aperture, pLow->focLen, pHigh->focLen, pLow->focDist, pHigh->focDist, facLow); + std::printf("LCP mode=%i, dist: %g found frames: Fno %g-%g; FocLen %g-%g; Dist %g-%g with weight %g\n", + toUnderlying(mode), + static_cast(focusDist), + static_cast(pLow->aperture), + static_cast(pHigh->aperture), + static_cast(pLow->focLen), + static_cast(pHigh->focLen), + static_cast(pLow->focDist), + static_cast(pHigh->focDist), + static_cast(facLow)); } } else { if (settings->verbose) { @@ -564,15 +533,6 @@ void rtengine::LCPProfile::calcParams( } } -void rtengine::LCPProfile::print() const -{ - std::printf("=== Profile %s\n", profileName.c_str()); - std::printf("Frames: %i, RAW: %i; Fisheye: %i; Sensorformat: %f\n", persModelCount, isRaw, isFisheye, sensorFormatFactor); - - for (int pm = 0; pm < persModelCount; ++pm) { - aPersModel[pm]->print(); - } -} // from all frames not marked as bad already, take average and filter out frames with higher deviation than this if there are enough values int rtengine::LCPProfile::filterBadFrames(LCPCorrectionMode mode, double maxAvgDevFac, int minFramesLeft) @@ -649,7 +609,7 @@ int rtengine::LCPProfile::filterBadFrames(LCPCorrectionMode mode, double maxAvgD } if (settings->verbose && count) { - std::printf("Filtered %.1f%% frames for maxAvgDevFac %g leaving %i\n", filtered * 100.f / count, maxAvgDevFac, count - filtered); + std::printf("Filtered %.1f%% frames for maxAvgDevFac %g leaving %i\n", filtered * 100.0 / count, maxAvgDevFac, count - filtered); } } @@ -1007,7 +967,7 @@ rtengine::LCPMapper::LCPMapper( const bool mirrorX = (rot == 90 || rot == 180); const bool mirrorY = (rot == 180 || rot == 270); if (settings->verbose) { - std::printf("Vign: %i, fullWidth: %i/%i, focLen %g SwapXY: %i / MirX/Y %i / %i on rot:%i from %i\n",vignette, fullWidth, fullHeight, focalLength, swapXY, mirrorX, mirrorY, rot, rawRotationDeg); + std::printf("Vign: %i, fullWidth: %i/%i, focLen %g SwapXY: %i / MirX/Y %i / %i on rot:%i from %i\n",vignette, fullWidth, fullHeight, static_cast(focalLength), swapXY, mirrorX, mirrorY, rot, rawRotationDeg); } pProf->calcParams(vignette ? LCPCorrectionMode::VIGNETTE : LCPCorrectionMode::DISTORTION, focalLength, focusDist, aperture, &mc, nullptr, nullptr); @@ -1030,16 +990,16 @@ bool rtengine::LCPMapper::isCACorrectionAvailable() const return enableCA; } -void rtengine::LCPMapper::correctDistortion(double &x, double &y, int cx, int cy, double scale) const +void rtengine::LCPMapper::correctDistortion(double &x, double &y, int cx, int cy) const { x += cx; y += cy; if (isFisheye) { - const double u = x * scale; - const double v = y * scale; - const double u0 = mc.x0 * scale; - const double v0 = mc.y0 * scale; + const double u = x; + const double v = y; + const double u0 = static_cast(mc.x0); + const double v0 = static_cast(mc.y0); const double du = (u - u0); const double dv = (v - v0); const double fx = mc.fx; @@ -1047,7 +1007,7 @@ void rtengine::LCPMapper::correctDistortion(double &x, double &y, int cx, int cy const double k1 = mc.param[0]; const double k2 = mc.param[1]; const double r = sqrt(du * du + dv * dv); - const double f = sqrt(fx*fy / (scale * scale)); + const double f = sqrt(fx*fy); const double th = atan2(r, f); const double th2 = th * th; const double cfact = (((k2 * th2 + k1) * th2 + 1) * th) / r; @@ -1057,28 +1017,26 @@ void rtengine::LCPMapper::correctDistortion(double &x, double &y, int cx, int cy x = ud; y = vd; } else { - x *= scale; - y *= scale; - const double x0 = mc.x0 * scale; - const double y0 = mc.y0 * scale; - const double xd = (x - x0) / mc.fx, yd = (y - y0) / mc.fy; + const double x0 = static_cast(mc.x0); + const double y0 = static_cast(mc.y0); + const double xd = (x - x0) / static_cast(mc.fx), yd = (y - y0) / static_cast(mc.fy); - const LCPModelCommon::Param aDist = mc.param; + const auto& aDist = mc.param; const double rsqr = xd * xd + yd * yd; - const double xfac = aDist[swapXY ? 3 : 4], yfac = aDist[swapXY ? 4 : 3]; + const double xfac = static_cast(aDist[swapXY ? 3 : 4]), yfac = static_cast(aDist[swapXY ? 4 : 3]); - const double commonFac = (((aDist[2] * rsqr + aDist[1]) * rsqr + aDist[0]) * rsqr + 1.) + const double commonFac = (((static_cast(aDist[2]) * rsqr + static_cast(aDist[1])) * rsqr + static_cast(aDist[0])) * rsqr + 1.) + 2. * (yfac * yd + xfac * xd); const double xnew = xd * commonFac + xfac * rsqr; const double ynew = yd * commonFac + yfac * rsqr; - x = xnew * mc.fx + x0; - y = ynew * mc.fy + y0; + x = xnew * static_cast(mc.fx) + x0; + y = ynew * static_cast(mc.fy) + y0; } - x -= cx * scale; - y -= cy * scale; + x -= cx; + y -= cy; } void rtengine::LCPMapper::correctCA(double& x, double& y, int cx, int cy, int channel) const @@ -1094,20 +1052,20 @@ void rtengine::LCPMapper::correctCA(double& x, double& y, int cx, int cy, int ch // First calc the green channel like normal distortion // the other are just deviations from it - double xd = (x - chrom[1].x0) / chrom[1].fx; - double yd = (y - chrom[1].y0) / chrom[1].fy; + double xd = (x - static_cast(chrom[1].x0)) / static_cast(chrom[1].fx); + double yd = (y - static_cast(chrom[1].y0)) / static_cast(chrom[1].fy); // Green contains main distortion, just like base if (useCADist) { - const LCPModelCommon::Param aDist = chrom[1].param; - double rsqr = xd * xd + yd * yd; - double xfac = aDist[swapXY ? 3 : 4], yfac = aDist[swapXY ? 4 : 3]; + const auto& aDist = chrom[1].param; + double rsqr = xd * xd + yd * yd; + double xfac = static_cast(aDist[swapXY ? 3 : 4]), yfac = static_cast(aDist[swapXY ? 4 : 3]); - double commonFac = (((aDist[2] * rsqr + aDist[1]) * rsqr + aDist[0]) * rsqr + 1.) + double commonFac = (((static_cast(aDist[2]) * rsqr + static_cast(aDist[1])) * rsqr + static_cast(aDist[0])) * rsqr + 1.) + 2. * (yfac * yd + xfac * xd); - xgreen = xd * commonFac + aDist[4] * rsqr; - ygreen = yd * commonFac + aDist[3] * rsqr; + xgreen = xd * commonFac + static_cast(aDist[4]) * rsqr; + ygreen = yd * commonFac + static_cast(aDist[3]) * rsqr; } else { xgreen = xd; ygreen = yd; @@ -1115,20 +1073,20 @@ void rtengine::LCPMapper::correctCA(double& x, double& y, int cx, int cy, int ch if (channel == 1) { // green goes directly - x = xgreen * chrom[1].fx + chrom[1].x0; - y = ygreen * chrom[1].fy + chrom[1].y0; + x = xgreen * static_cast(chrom[1].fx) + static_cast(chrom[1].x0); + y = ygreen * static_cast(chrom[1].fy) + static_cast(chrom[1].y0); } else { // others are diffs from green xd = xgreen; yd = ygreen; const double rsqr = xd * xd + yd * yd; - const LCPModelCommon::Param aCA = chrom[channel].param; - const double xfac = aCA[swapXY ? 3 : 4], yfac = aCA[swapXY ? 4 : 3]; - const double commonSum = 1. + rsqr * (aCA[0] + rsqr * (aCA[1] + aCA[2] * rsqr)) + 2. * (yfac * yd + xfac * xd); + const auto& aCA = chrom[channel].param; + const double xfac = static_cast(aCA[swapXY ? 3 : 4]), yfac = static_cast(aCA[swapXY ? 4 : 3]); + const double commonSum = 1. + rsqr * (static_cast(aCA[0]) + rsqr * (static_cast(aCA[1]) + static_cast(aCA[2] )* rsqr)) + 2. * (yfac * yd + xfac * xd); - x = (chrom[channel].scale_factor * ( xd * commonSum + xfac * rsqr )) * chrom[channel].fx + chrom[channel].x0; - y = (chrom[channel].scale_factor * ( yd * commonSum + yfac * rsqr )) * chrom[channel].fy + chrom[channel].y0; + x = (static_cast(chrom[channel].scale_factor) * ( xd * commonSum + xfac * rsqr )) * static_cast(chrom[channel].fx) + static_cast(chrom[channel].x0); + y = (static_cast(chrom[channel].scale_factor) * ( yd * commonSum + yfac * rsqr )) * static_cast(chrom[channel].fy) + static_cast(chrom[channel].y0); } x -= cx; diff --git a/rtengine/lcp.h b/rtengine/lcp.h index 2e36fe113..b59cc84c6 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -54,7 +54,6 @@ public: LCPModelCommon(); bool empty() const; // is it empty - void print() const; // printf all values void merge(const LCPModelCommon& a, const LCPModelCommon& b, float facA); void prepareParams( int fullWidth, @@ -106,7 +105,6 @@ public: LCPModelCommon *pCorr3 ) const; // Interpolates between the persModels frames - void print() const; //private: // Common data @@ -168,7 +166,7 @@ private: class LensCorrection { public: virtual ~LensCorrection() {} - virtual void correctDistortion(double &x, double &y, int cx, int cy, double scale) const = 0; + virtual void correctDistortion(double &x, double &y, int cx, int cy) const = 0; virtual bool isCACorrectionAvailable() const = 0; virtual void correctCA(double &x, double &y, int cx, int cy, int channel) const = 0; virtual void processVignette(int width, int height, float** rawData) const = 0; @@ -196,7 +194,7 @@ public: ); - void correctDistortion(double &x, double &y, int cx, int cy, double scale) const override; // MUST be the first stage + void correctDistortion(double &x, double &y, int cx, int cy) const override; bool isCACorrectionAvailable() const override; void correctCA(double& x, double& y, int cx, int cy, int channel) const override; void processVignette(int width, int height, float** rawData) const override; diff --git a/rtengine/linalgebra.h b/rtengine/linalgebra.h new file mode 100644 index 000000000..32e44e147 --- /dev/null +++ b/rtengine/linalgebra.h @@ -0,0 +1,275 @@ +/* -*- C++ -*- + * This file is part of ART + * + * Copyright (c) 2022 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 + +namespace rtengine { + +template +class Vec3 { +public: + Vec3() { data_[0] = data_[1] = data_[2] = T(); } + Vec3(T a, T b, T c) { data_[0] = a; data_[1] = b; data_[2] = c; } + + template + Vec3(T2 const a[3]) { data_[0] = a[0]; data_[1] = a[1]; data_[2] = a[2]; } + + Vec3 &operator=(const Vec3 &a) = default; + + template + Vec3 &operator=(T2 const a[3]) + { + data_[0] = a[0]; data_[1] = a[1]; data_[2] = a[2]; + return *this; + } + + T operator[](int i) const { return data_[i]; } + T &operator[](int i) { return data_[i]; } + operator const T *() const { return data_; } + operator T *() { return data_; } + +private: + T data_[3]; +}; + +typedef Vec3 Vec3f; + + +template +class Mat33 { +public: + Mat33() + { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + data_[i][j] = T(); + } + } + } + + Mat33(T a00, T a01, T a02, + T a10, T a11, T a12, + T a20, T a21, T a22) + { + data_[0][0] = a00; data_[0][1] = a01; data_[0][2] = a02; + data_[1][0] = a10; data_[1][1] = a11; data_[1][2] = a12; + data_[2][0] = a20; data_[2][1] = a21; data_[2][2] = a22; + } + + template + Mat33(const T2 m[3][3]) + { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + data_[i][j] = m[i][j]; + } + } + } + + Mat33 &operator=(const Mat33 &m) = default; + + template + Mat33 &operator=(const T2 m[3][3]) + { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + data_[i][j] = m[i][j]; + } + } + return *this; + } + + T const *operator[](int i) const { return data_[i]; } + T *operator[](int i) { return data_[i]; } + typedef const T(*Data)[3]; + operator Data() const { return data_; } + +private: + T data_[3][3]; +}; + + +typedef Mat33 Mat33f; + + +template +Mat33 identity() +{ + return Mat33(1, 0, 0, 0, 1, 0, 0, 0, 1); +} + + +template +Mat33 diagonal(T a, T b, T c) +{ + return Mat33(a, 0, 0, 0, b, 0, 0, 0, c); +} + + +template +Mat33 transpose(T const m[3][3]) +{ + return Mat33(m[0][0], m[1][0], m[2][0], + m[0][1], m[1][1], m[2][1], + m[0][2], m[1][2], m[2][2]); +} + +template +Mat33 transpose(const Mat33 &m) +{ + return transpose(static_cast::Data>(m)); +} + + +template +bool inverse(T const m[3][3], Mat33 &out) +{ + const T res00 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + const T res10 = m[2][0] * m[1][2] - m[1][0] * m[2][2]; + const T res20 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + const T det = m[0][0] * res00 + m[0][1] * res10 + m[0][2] * res20; + + if (std::abs(det) >= 1.0e-10) { + out[0][0] = res00 / det; + out[0][1] = (m[2][1] * m[0][2] - m[0][1] * m[2][2]) / det; + out[0][2] = (m[0][1] * m[1][2] - m[1][1] * m[0][2]) / det; + out[1][0] = res10 / det; + out[1][1] = (m[0][0] * m[2][2] - m[2][0] * m[0][2]) / det; + out[1][2] = (m[1][0] * m[0][2] - m[0][0] * m[1][2]) / det; + out[2][0] = res20 / det; + out[2][1] = (m[2][0] * m[0][1] - m[0][0] * m[2][1]) / det; + out[2][2] = (m[0][0] * m[1][1] - m[1][0] * m[0][1]) / det; + return true; + } else { + return false; + } +} + +template +Mat33 inverse(const Mat33 &m) +{ + Mat33 res; + inverse(static_cast::Data>(m), res); + return res; +} + +template +Mat33 inverse(T const m[3][3]) +{ + Mat33 res; + inverse(m, res); + return res; +} + +template +bool inverse(const Mat33 &m, Mat33 &out) +{ + return inverse(static_cast::Data>(m), out); +} + + +template +Mat33 dot_product(T const a[3][3], T const b[3][3]) +{ + Mat33 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 +Mat33 dot_product(const Mat33 &a, T const b[3][3]) +{ + return dot_product(static_cast::Data>(a), b); +} + +template +Mat33 dot_product(T const a[3][3], const Mat33 &b) +{ + return dot_product(a, static_cast::Data>(b)); +} + +template +Mat33 dot_product(const Mat33 &a, const Mat33 &b) +{ + return dot_product(static_cast::Data>(a), static_cast::Data>(b)); +} + + +template +Vec3 dot_product(T const a[3][3], T const b[3]) +{ + Vec3 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 +Vec3 dot_product(const Mat33 &a, T const b[3]) +{ + return dot_product(static_cast::Data>(a), b); +} + +template +Vec3 dot_product(T const a[3][3], const Vec3 &b) +{ + return dot_product(a, static_cast(b)); +} + +template +Vec3 dot_product(const Mat33 &a, const Vec3 &b) +{ + return dot_product(static_cast::Data>(a), static_cast(b)); +} + + +template +Mat33 operator*(const Mat33 &m, T v) +{ + return Mat33(m[0][0] * v, m[0][1] * v, m[0][2] * v, + m[1][0] * v, m[1][1] * v, m[1][2] * v, + m[2][0] * v, m[2][1] * v, m[2][2] * v); +} + +template +Vec3 operator*(const Vec3 &a, T v) +{ + return Vec3(a[0] * v, a[1] * v, a[2] * v); +} + +} // namespace rtengine diff --git a/rtengine/lj92.c b/rtengine/lj92.c deleted file mode 100644 index d72075a62..000000000 --- a/rtengine/lj92.c +++ /dev/null @@ -1,698 +0,0 @@ -/* -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 deleted file mode 100644 index bc8bf7604..000000000 --- a/rtengine/lj92.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -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/lmmse_demosaic.cc b/rtengine/lmmse_demosaic.cc index f4af1b801..c2d5bffbf 100644 --- a/rtengine/lmmse_demosaic.cc +++ b/rtengine/lmmse_demosaic.cc @@ -41,6 +41,18 @@ namespace rtengine // TODO Tiles to reduce memory consumption void RawImageSource::lmmse_interpolate_omp(int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations) { + // Test for RGB cfa + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + if (FC(i, j) == 3) { + // avoid crash + std::cout << "lmmse_interpolate_omp supports only RGB Colour filter arrays. Falling back to igv_interpolate" << std::endl; + igv_interpolate(winw, winh); + return; + } + } + } + const int width = winw, height = winh; const int ba = 10; const int rr1 = height + 2 * ba; @@ -334,7 +346,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, const array2D +* +* 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 "color.h" + +using namespace std; + +namespace rtengine +{ + +/* + * MunsellLch correction + * Copyright (c) 2012 Jacques Desmis + * Copyright (c) 2020 Ingo Weyrich + * + * Find the right LUT and calculate the correction + */ +void Color::MunsellLch (float lum, float hue, float chrom, float memChprov, float &correction, int zone, float &lbe, bool &correctL) +{ + + const int x = memChprov; + int y = chrom; + + //begin PB correction + sky + if (zone == 1) { + if (lum > 5.f) { + if (lum < 15.f) { + if (x <= 45 && (hue >= (_15PB10[x] - 0.035f)) && (hue < (_15PB10[x] + 0.052f))) { + if (y > 49) { + y = 49; + } + correction = _15PB10[y] - _15PB10[x] ; + lbe = _15PB10[y]; + correctL = true; + } else if (x <= 85 && (hue >= ( _3PB10[x] - 0.052f)) && (hue < (_45PB10[x] + _3PB10[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _3PB10[y] - _3PB10[x]; + lbe = _3PB10[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_45PB10[x] + _3PB10[x]) * 0.5f) && (hue < (_45PB10[x] + 0.052f))) { + if (y > 89) { + y = 89; + } + correction = _45PB10[y] - _45PB10[x] ; + lbe = _45PB10[y]; + correctL = true; + } else if ((hue >= (_6PB10[x] - 0.052f) && (hue < (_6PB10[x] + _75PB10[x]) * 0.5f))) { + correction = _6PB10[y] - _6PB10[x] ; + lbe = _6PB10[y]; + correctL = true; + } else if ((hue >= (_6PB10[x] + _75PB10[x]) * 0.5f) && (hue < (_9PB10[x] + _75PB10[x]) * 0.5f)) { + correction = _75PB10[y] - _75PB10[x] ; + lbe = _75PB10[y]; + correctL = true; + } else if ((hue >= (_9PB10[x] + _75PB10[x]) * 0.5f) && (hue < (_9PB10[x] + _10PB10[x]) * 0.5f)) { + correction = _9PB10[y] - _9PB10[x] ; + lbe = _9PB10[y]; + correctL = true; + } else if ((hue >= (_10PB10[x] + _9PB10[x]) * 0.5f) && (hue < (_1P10[x] + _10PB10[x]) * 0.5f)) { + correction = _10PB10[y] - _10PB10[x] ; + lbe = _10PB10[y]; + correctL = true; + } else if ((hue >= (_10PB10[x] + _1P10[x]) * 0.5f) && (hue < (_1P10[x] + _4P10[x]) * 0.5f)) { + correction = _1P10[y] - _1P10[x]; + lbe = _1P10[y]; + correctL = true; + } else if ((hue >= (_1P10[x] + _4P10[x]) * 0.5f) && (hue < (0.035f + _4P10[x]) * 0.5f)) { + correction = _4P10[y] - _4P10[x] ; + lbe = _4P10[y]; + correctL = true; + } + } else if (lum < 25.f) { + if (x <= 85 && (hue >= (_15PB20[x] - 0.035f)) && (hue < (_15PB20[x] + _3PB20[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _15PB20[y] - _15PB20[x] ; + lbe = _15PB20[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB20[x] + _3PB20[x]) * 0.5f) && (hue < (_45PB20[x] + _3PB20[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _3PB20[y] - _3PB20[x] ; + lbe = _3PB20[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_45PB20[x] + _3PB20[x]) * 0.5f) && (hue < ( _45PB20[x] + 0.052f))) { + if (y > 89) { + y = 89; + } + correction = _45PB20[y] - _45PB20[x] ; + lbe = _45PB20[y]; + correctL = true; + } else if ((hue >= (_45PB20[x] + 0.052f)) && (hue < (_6PB20[x] + _75PB20[x]) * 0.5f)) { + correction = _6PB20[y] - _6PB20[x]; + lbe = _6PB20[y]; + correctL = true; + } else if ((hue >= (_6PB20[x] + _75PB20[x]) * 0.5f) && (hue < (_9PB20[x] + _75PB20[x]) * 0.5f)) { + correction = _75PB20[y] - _75PB20[x] ; + lbe = _75PB20[y]; + correctL = true; + } else if ((hue >= (_9PB20[x] + _75PB20[x]) * 0.5f) && (hue < (_9PB20[x] + _10PB20[x]) * 0.5f)) { + correction = _9PB20[y] - _9PB20[x] ; + lbe = _9PB20[y]; + correctL = true; + } else if ((hue >= (_10PB20[x] + _9PB20[x]) * 0.5f) && (hue < (_1P20[x] + _10PB20[x]) * 0.5f)) { + correction = _10PB20[y] - _10PB20[x] ; + lbe = _10PB20[y]; + correctL = true; + } else if ((hue >= (_10PB20[x] + _1P20[x]) * 0.5f) && (hue < (_1P20[x] + _4P20[x]) * 0.5f)) { + correction = _1P20[y] - _1P20[x] ; + lbe = _1P20[y]; + correctL = true; + } else if ((hue >= (_1P20[x] + _4P20[x]) * 0.5f) && (hue < (0.035f + _4P20[x]) * 0.5f)) { + correction = _4P20[y] - _4P20[x] ; + lbe = _4P20[y]; + correctL = true; + } + } else if (lum < 35.f) { + if (x <= 85 && (hue >= (_15PB30[x] - 0.035f)) && (hue < (_15PB30[x] + _3PB30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _15PB30[y] - _15PB30[x] ; + lbe = _15PB30[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB30[x] + _3PB30[x]) * 0.5f) && (hue < (_45PB30[x] + _3PB30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _3PB30[y] - _3PB30[x] ; + lbe = _3PB30[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_45PB30[x] + _3PB30[x]) * 0.5f) && (hue < (_45PB30[x] + 0.052f))) { + if (y > 89) { + y = 89; + } + correction = _45PB30[y] - _45PB30[x] ; + lbe = _45PB30[y]; + correctL = true; + } else if ((hue >= ( _45PB30[x] + 0.052f)) && (hue < (_6PB30[x] + _75PB30[x]) * 0.5f)) { + correction = _6PB30[y] - _6PB30[x] ; + lbe = _6PB30[y]; + correctL = true; + } else if ((hue >= (_6PB30[x] + _75PB30[x]) * 0.5f) && (hue < (_9PB30[x] + _75PB30[x]) * 0.5f)) { + correction = _75PB30[y] - _75PB30[x] ; + lbe = _75PB30[y] ; + correctL = true; + } else if ((hue >= (_9PB30[x] + _75PB30[x]) * 0.5f) && (hue < (_9PB30[x] + _10PB30[x]) * 0.5f)) { + correction = _9PB30[y] - _9PB30[x] ; + lbe = _9PB30[y]; + correctL = true; + } else if ((hue >= (_10PB30[x] + _9PB30[x]) * 0.5f) && (hue < (_1P30[x] + _10PB30[x]) * 0.5f)) { + correction = _10PB30[y] - _10PB30[x] ; + lbe = _10PB30[y]; + correctL = true; + } else if ((hue >= (_10PB30[x] + _1P30[x]) * 0.5f) && (hue < (_1P30[x] + _4P30[x]) * 0.5f)) { + correction = _1P30[y] - _1P30[x] ; + lbe = _1P30[y]; + correctL = true; + } else if ((hue >= (_1P30[x] + _4P30[x]) * 0.5f) && (hue < (0.035f + _4P30[x]) * 0.5f)) { + correction = _4P30[y] - _4P30[x] ; + lbe = _4P30[y]; + correctL = true; + } + } else if (lum < 45.f) { + if (x < 75 && (hue <= (_05PB40[x] + _15PB40[x]) * 0.5f) && (hue > (_05PB40[x] + _10B40[x]) * 0.5f)) { + if (y > 75) { + y = 75; + } + correction = _05PB40[y] - _05PB40[x] ; + lbe = _05PB40[y]; + correctL = true; + } else if (x < 70 && (hue <= (_05PB40[x] + _10B40[x]) * 0.5f) && (hue > (_10B40[x] + _9B40[x]) * 0.5f)) { + if (y > 70) { + y = 70; + } + correction = _10B40[y] - _10B40[x] ; + lbe = _10B40[y]; + correctL = true; + } else if (x < 70 && (hue <= (_10B40[x] + _9B40[x]) * 0.5f) && (hue > (_9B40[x] + _7B40[x]) * 0.5f)) { + if (y > 70) { + y = 70; + } + correction = _9B40[y] - _9B40[x] ; + lbe = _9B40[y]; + correctL = true; + } else if (x < 70 && (hue <= (_9B40[x] + _7B40[x]) * 0.5f) && (hue > (_5B40[x] + _7B40[x]) * 0.5f)) { + if (y > 70) { + y = 70; + } + correction = _7B40[y] - _7B40[x] ; + lbe = _7B40[y]; + correctL = true; + } else if (x < 70 && (hue <= (_5B40[x] + _7B40[x]) * 0.5f) && (hue > (_5B40[x] - 0.035f))) { + if (y > 70) { + y = 70; // + } + correction = _5B40[y] - _5B40[x] ; + lbe = _5B40[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB40[x] - 0.035f)) && (hue < (_15PB40[x] + _3PB40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _15PB40[y] - _15PB40[x] ; + lbe = _15PB40[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB40[x] + _3PB40[x]) * 0.5f) && (hue < (_45PB40[x] + _3PB40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _3PB40[y] - _3PB40[x] ; + lbe = _3PB40[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_45PB40[x] + _3PB40[x]) * 0.5f) && (hue < (_45PB40[x] + 0.052f))) { + if (y > 89) { + y = 89; + } + correction = _45PB40[y] - _45PB40[x] ; + lbe = _45PB40[y] ; + correctL = true; + } else if ((hue >= (_45PB40[x] + 0.052f)) && (hue < (_6PB40[x] + _75PB40[x]) * 0.5f)) { + correction = _6PB40[y] - _6PB40[x] ; + lbe = _6PB40[y]; + correctL = true; + } else if ((hue >= (_6PB40[x] + _75PB40[x]) * 0.5f) && (hue < (_9PB40[x] + _75PB40[x]) * 0.5f)) { + correction = _75PB40[y] - _75PB40[x] ; + lbe = _75PB40[y]; + correctL = true; + } else if ((hue >= (_9PB40[x] + _75PB40[x]) * 0.5f) && (hue < (_9PB40[x] + _10PB40[x]) * 0.5f)) { + correction = _9PB40[y] - _9PB40[x] ; + lbe = _9PB40[y]; + correctL = true; + } else if ((hue >= (_10PB40[x] + _9PB40[x]) * 0.5f) && (hue < (_1P40[x] + _10PB40[x]) * 0.5f)) { + correction = _10PB40[y] - _10PB40[x] ; + lbe = _10PB40[y]; + correctL = true; + } else if ((hue >= (_10PB40[x] + _1P40[x]) * 0.5f) && (hue < (_1P40[x] + _4P40[x]) * 0.5f)) { + correction = _1P40[y] - _1P40[x] ; + lbe = _1P40[y]; + correctL = true; + } else if ((hue >= (_1P40[x] + _4P40[x]) * 0.5f) && (hue < (0.035f + _4P40[x]) * 0.5f)) { + correction = _4P40[y] - _4P40[x] ; + lbe = _4P40[y]; + correctL = true; + } + } else if (lum < 55.f) { + if (x < 79 && (hue <= (_05PB50[x] + _15PB50[x]) * 0.5f) && (hue > (_05PB50[x] + _10B50[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _05PB50[y] - _05PB50[x] ; + lbe = _05PB50[y]; + correctL = true; + } else if (x < 79 && (hue <= (_05PB50[x] + _10B50[x]) * 0.5f) && (hue > (_10B50[x] + _9B50[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _10B50[y] - _10B50[x] ; + lbe = _10B50[y]; + correctL = true; + } else if (x < 79 && (hue <= (_10B50[x] + _9B50[x]) * 0.5f) && (hue > (_9B50[x] + _7B50[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _9B50[y] - _9B50[x] ; + lbe = _9B50[y]; + correctL = true; + } else if (x < 79 && (hue <= (_9B50[x] + _7B50[x]) * 0.5f) && (hue > (_5B50[x] + _7B50[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _7B50[y] - _7B50[x] ; + lbe = _7B50[y]; + correctL = true; + } else if (x < 79 && (hue <= (_5B50[x] + _7B50[x]) * 0.5f) && (hue > (_5B50[x] - 0.035f))) { + if (y > 79) { + y = 79; // + } + correction = _5B50[y] - _5B50[x] ; + lbe = _5B50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB50[x] - 0.035f)) && (hue < (_15PB50[x] + _3PB50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _15PB50[y] - _15PB50[x] ; + lbe = _15PB50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB50[x] + _3PB50[x]) * 0.5f) && (hue < (_45PB50[x] + _3PB50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _3PB50[y] - _3PB50[x] ; + lbe = _3PB50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_45PB50[x] + _3PB50[x]) * 0.5f) && (hue < (_6PB50[x] + _45PB50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _45PB50[y] - _45PB50[x] ; + lbe = _45PB50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_6PB50[x] + _45PB50[x]) * 0.5f) && (hue < (_6PB50[x] + _75PB50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _6PB50[y] - _6PB50[x] ; + lbe = _6PB50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_6PB50[x] + _75PB50[x]) * 0.5f) && (hue < (_9PB50[x] + _75PB50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _75PB50[y] - _75PB50[x] ; + lbe = _75PB50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_9PB50[x] + _75PB50[x]) * 0.5f) && (hue < (_9PB50[x] + _10PB50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _9PB50[y] - _9PB50[x] ; + lbe = _9PB50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_10PB50[x] + _9PB50[x]) * 0.5f) && (hue < (_1P50[x] + _10PB50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10PB50[y] - _10PB50[x] ; + lbe = _10PB50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_10PB50[x] + _1P50[x]) * 0.5f) && (hue < (_1P50[x] + _4P50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _1P50[y] - _1P50[x] ; + lbe = _1P50[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_1P50[x] + _4P50[x]) * 0.5f) && (hue < (0.035f + _4P50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _4P50[y] - _4P50[x] ; + lbe = _4P50[y]; + correctL = true; + } + } else if (lum < 65.f) { + if (x < 79 && (hue <= (_05PB60[x] + _15PB60[x]) * 0.5f) && (hue > (_05PB60[x] + _10B60[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _05PB60[y] - _05PB60[x] ; + lbe = _05PB60[y]; + correctL = true; + } else if (x < 79 && (hue <= (_05PB60[x] + _10B60[x]) * 0.5f) && (hue > (_10B60[x] + _9B60[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _10B60[y] - _10B60[x] ; + lbe = _10B60[y]; + correctL = true; + } else if (x < 79 && (hue <= (_10B60[x] + _9B60[x]) * 0.5f) && (hue > (_9B60[x] + _7B60[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _9B60[y] - _9B60[x] ; + lbe = _9B60[y]; + correctL = true; + } else if (x < 79 && (hue <= (_9B60[x] + _7B60[x]) * 0.5f) && (hue > (_5B60[x] + _7B60[x]) * 0.5f)) { + if (y > 79) { + y = 79; + } + correction = _7B60[y] - _7B60[x] ; + lbe = _7B60[y]; + correctL = true; + } else if (x < 79 && (hue <= (_5B60[x] + _7B60[x]) * 0.5f) && (hue > (_5B60[x] - 0.035f))) { + if (y > 79) { + y = 79; // + } + correction = _5B60[y] - _5B60[x] ; + lbe = _5B60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB60[x] - 0.035f)) && (hue < (_15PB60[x] + _3PB60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _15PB60[y] - _15PB60[x] ; + lbe = _15PB60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_15PB60[x] + _3PB60[x]) * 0.5f) && (hue < (_45PB60[x] + _3PB60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _3PB60[y] - _3PB60[x] ; + lbe = _3PB60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_45PB60[x] + _3PB60[x]) * 0.5f) && (hue < (_6PB60[x] + _45PB60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _45PB60[y] - _45PB60[x] ; + lbe = _45PB60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_6PB60[x] + _45PB60[x]) * 0.5f) && (hue < (_6PB60[x] + _75PB60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _6PB60[y] - _6PB60[x] ; + lbe = _6PB60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_6PB60[x] + _75PB60[x]) * 0.5f) && (hue < (_9PB60[x] + _75PB60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _75PB60[y] - _75PB60[x] ; + lbe = _75PB60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_9PB60[x] + _75PB60[x]) * 0.5f) && (hue < (_9PB60[x] + _10PB60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _9PB60[y] - _9PB60[x] ; + lbe = _9PB60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_10PB60[x] + _9PB60[x]) * 0.5f) && (hue < (_1P60[x] + _10PB60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10PB60[y] - _10PB60[x] ; + lbe = _10PB60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_10PB60[x] + _1P60[x]) * 0.5f) && (hue < (_1P60[x] + _4P60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _1P60[y] - _1P60[x] ; + lbe = _1P60[y]; + correctL = true; + } else if (x <= 85 && (hue >= (_1P60[x] + _4P60[x]) * 0.5f) && (hue < (0.035f + _4P60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _4P60[y] - _4P60[x] ; + lbe = _4P60[y]; + correctL = true; + } + } else if (lum < 75.f) { + if (x < 50 && (hue <= (_05PB70[x] + _15PB70[x]) * 0.5f) && (hue > (_05PB70[x] + _10B70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _05PB70[y] - _05PB70[x] ; + lbe = _05PB70[y]; + correctL = true; + } else if (x < 50 && (hue <= (_05PB70[x] + _10B70[x]) * 0.5f) && (hue > (_10B70[x] + _9B70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _10B70[y] - _10B70[x] ; + lbe = _10B70[y]; + correctL = true; + } else if (x < 50 && (hue <= (_10B70[x] + _9B70[x]) * 0.5f) && (hue > (_9B70[x] + _7B70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _9B70[y] - _9B70[x] ; + lbe = _9B70[y]; + correctL = true; + } else if (x < 50 && (hue <= (_9B70[x] + _7B70[x]) * 0.5f) && (hue > (_5B70[x] + _7B70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _7B70[y] - _7B70[x] ; + lbe = _7B70[y]; + correctL = true; + } else if (x < 50 && (hue <= (_5B70[x] + _7B70[x]) * 0.5f) && (hue > (_5B70[x] - 0.035f))) { + if (y > 49) { + y = 49; // + } + correction = _5B70[y] - _5B70[x] ; + lbe = _5B70[y]; + correctL = true; + } else if (x < 50 && (hue >= (_15PB70[x] - 0.035f)) && (hue < (_15PB70[x] + _3PB70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _15PB70[y] - _15PB70[x] ; + lbe = _15PB70[y]; + correctL = true; + } else if (x < 50 && (hue >= (_45PB70[x] + _3PB70[x]) * 0.5f) && (hue < (_6PB70[x] + _45PB70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _45PB70[y] - _45PB70[x] ; + lbe = _45PB70[y]; + correctL = true; + } else if (x < 50 && (hue >= (_6PB70[x] + _45PB70[x]) * 0.5f) && (hue < (_6PB70[x] + _75PB70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _6PB70[y] - _6PB70[x] ; + lbe = _6PB70[y]; + correctL = true; + } else if (x < 50 && (hue >= (_6PB70[x] + _75PB70[x]) * 0.5f) && (hue < (_9PB70[x] + _75PB70[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _75PB70[y] - _75PB70[x] ; + lbe = _75PB70[y]; + correctL = true; + } else if (x < 50 && (hue >= (_9PB70[x] + _75PB70[x]) * 0.5f) && (hue < (_9PB70[x] + 0.035f))) { + if (y > 49) { + y = 49; + } + correction = _9PB70[y] - _9PB70[x] ; + lbe = _9PB70[y]; + correctL = true; + } + } else if (lum < 85.f) { + if (x < 40 && (hue <= (_05PB80[x] + _15PB80[x]) * 0.5f) && (hue > (_05PB80[x] + _10B80[x]) * 0.5f)) { + if (y > 39) { + y = 39; + } + correction = _05PB80[y] - _05PB80[x] ; + lbe = _05PB80[y] ; + correctL = true; + } else if (x < 40 && (hue <= (_05PB80[x] + _10B80[x]) * 0.5f) && (hue > (_10B80[x] + _9B80[x]) * 0.5f)) { + if (y > 39) { + y = 39; + } + correction = _10B80[y] - _10B80[x] ; + lbe = _10B80[y]; + correctL = true; + } else if (x < 40 && (hue <= (_10B80[x] + _9B80[x]) * 0.5f) && (hue > (_9B80[x] + _7B80[x]) * 0.5f)) { + if (y > 39) { + y = 39; + } + correction = _9B80[y] - _9B80[x] ; + lbe = _9B80[y]; + correctL = true; + } else if (x < 50 &&(hue <= (_9B80[x] + _7B80[x]) * 0.5f) && (hue > (_5B80[x] + _7B80[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _7B80[y] - _7B80[x] ; + lbe = _7B80[y]; + correctL = true; + } else if (x < 50 && (hue <= (_5B80[x] + _7B80[x]) * 0.5f) && (hue > (_5B80[x] - 0.035f))) { + if (y > 49) { + y = 49; // + } + correction = _5B80[y] - _5B80[x] ; + lbe = _5B80[y]; + correctL = true; + } else if (x < 50 && (hue >= (_15PB80[x] - 0.035f)) && (hue < (_15PB80[x] + _3PB80[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _15PB80[y] - _15PB80[x] ; + lbe = _15PB80[y]; + correctL = true; + } else if (x < 50 && (hue >= (_45PB80[x] + _3PB80[x]) * 0.5f) && (hue < (_6PB80[x] + _45PB80[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _45PB80[y] - _45PB80[x] ; + lbe = _45PB80[y]; + correctL = true; + } else if (x < 50 && (hue >= (_6PB80[x] + _45PB80[x]) * 0.5f) && (hue < (_6PB80[x] + _75PB80[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _6PB80[y] - _6PB80[x] ; + lbe = _6PB80[y]; + correctL = true; + } else if (x < 50 && (hue >= (_6PB80[x] + _75PB80[x]) * 0.5f) && (hue < (_9PB80[x] + _75PB80[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _75PB80[y] - _75PB80[x] ; + lbe = _75PB80[y]; + correctL = true; + } else if (x < 50 && (hue >= (_9PB80[x] + _75PB80[x]) * 0.5f) && (hue < (_9PB80[x] + 0.035f))) { + if (y > 49) { + y = 49; + } + correction = _9PB80[y] - _9PB80[x] ; + lbe = _9PB80[y]; + correctL = true; + } + } + } + } else if (zone == 2) { //red yellow correction + if (lum > 15.f) { + if (lum < 25.f) { + if (x <= 45 && (hue <= (_10YR20[x] + 0.035f)) && (hue > (_10YR20[x] + _85YR20[x]) * 0.5f)) { + if (y > 49) { + y = 49; + } + correction = _10YR20[y] - _10YR20[x] ; + lbe = _10YR20[y]; + correctL = true; + } else if (x <= 45 && (hue <= (_85YR20[x] + _10YR20[x]) * 0.5f) && (hue > (_85YR20[x] + 0.035f))) { + if (y > 49) { + y = 49; + } + correction = _85YR20[y] - _85YR20[x] ; + lbe = _85YR20[y]; + correctL = true; + } + } else if (lum < 35.f) { + if (x < 85 && (hue <= (_10YR30[x] + 0.035f)) && (hue > (_10YR30[x] + _85YR30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10YR30[y] - _10YR30[x] ; + lbe = _10YR30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10YR30[x] + _85YR30[x]) * 0.5f) && (hue > (_85YR30[x] + _7YR30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _85YR30[y] - _85YR30[x] ; + lbe = _85YR30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_85YR30[x] + _7YR30[x]) * 0.5f) && (hue > (_7YR30[x] + _55YR30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _7YR30[y] - _7YR30[x] ; + lbe = _7YR30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_7YR30[x] + _55YR30[x]) * 0.5f) && (hue > (_55YR30[x] + _4YR30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _55YR30[y] - _55YR30[x] ; + lbe = _55YR30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_55YR30[x] + _4YR30[x]) * 0.5f) && (hue > (_4YR30[x] + _25YR30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _4YR30[y] - _4YR30[x] ; + lbe = _4YR30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_4YR30[x] + _25YR30[x]) * 0.5f) && (hue > (_25YR30[x] + _10R30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _25YR30[y] - _25YR30[x] ; + lbe = _25YR30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_25YR30[x] + _10R30[x]) * 0.5f) && (hue > (_10R30[x] + _9R30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10R30[y] - _10R30[x] ; + lbe = _10R30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10R30[x] + _9R30[x]) * 0.5f) && (hue > (_9R30[x] + _7R30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _9R30[y] - _9R30[x] ; + lbe = _9R30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_9R30[x] + _7R30[x]) * 0.5f) && (hue > (_7R30[x] - 0.035f))) { + if (y > 89) { + y = 89; + } + + correction = _7R30[y] - _7R30[x] ; + lbe = _7R30[y] ; + correctL = true; + } + } else if (lum < 45.f) { + if (x < 85 && (hue <= (_10YR40[x] + 0.035f)) && (hue > (_10YR40[x] + _85YR40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10YR40[y] - _10YR40[x] ; + lbe = _10YR40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10YR40[x] + _85YR40[x]) * 0.5f) && (hue > (_85YR40[x] + _7YR40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _85YR40[y] - _85YR40[x] ; + lbe = _85YR40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_85YR40[x] + _7YR40[x]) * 0.5f) && (hue > (_7YR40[x] + _55YR40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _7YR40[y] - _7YR40[x] ; + lbe = _7YR40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_7YR40[x] + _55YR40[x]) * 0.5f) && (hue > (_55YR40[x] + _4YR40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _55YR40[y] - _55YR40[x] ; + lbe = _55YR40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_55YR40[x] + _4YR40[x]) * 0.5f) && (hue > (_4YR40[x] + _25YR40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _4YR40[y] - _4YR40[x] ; + lbe = _4YR40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_4YR40[x] + _25YR40[x]) * 0.5f) && (hue > (_25YR40[x] + _10R40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _25YR40[y] - _25YR40[x] ; + lbe = _25YR40[y] ; + correctL = true; + } else if (x < 85 && (hue <= (_25YR40[x] + _10R40[x]) * 0.5f) && (hue > (_10R40[x] + _9R40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10R40[y] - _10R40[x] ; + lbe = _10R40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10R40[x] + _9R40[x]) * 0.5f) && (hue > (_9R40[x] + _7R40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _9R40[y] - _9R40[x] ; + lbe = _9R40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_9R40[x] + _7R40[x]) * 0.5f) && (hue > (_7R40[x] - 0.035f))) { + if (y > 89) { + y = 89; + } + correction = _7R40[y] - _7R40[x] ; + lbe = _7R40[y]; + correctL = true; + } + } else if (lum < 55.f) { + if (x < 85 && (hue <= (_10YR50[x] + 0.035f)) && (hue > (_10YR50[x] + _85YR50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10YR50[y] - _10YR50[x] ; + lbe = _10YR50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10YR50[x] + _85YR50[x]) * 0.5f) && (hue > (_85YR50[x] + _7YR50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _85YR50[y] - _85YR50[x] ; + lbe = _85YR50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_85YR50[x] + _7YR50[x]) * 0.5f) && (hue > (_7YR50[x] + _55YR50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _7YR50[y] - _7YR50[x] ; + lbe = _7YR50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_7YR50[x] + _55YR50[x]) * 0.5f) && (hue > (_55YR50[x] + _4YR50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _55YR50[y] - _55YR50[x] ; + lbe = _55YR50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_55YR50[x] + _4YR50[x]) * 0.5f) && (hue > (_4YR50[x] + _25YR50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _4YR50[y] - _4YR50[x] ; + lbe = _4YR50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_4YR50[x] + _25YR50[x]) * 0.5f) && (hue > (_25YR50[x] + _10R50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _25YR50[y] - _25YR50[x] ; + lbe = _25YR50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_25YR50[x] + _10R50[x]) * 0.5f) && (hue > (_10R50[x] + _9R50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10R50[y] - _10R50[x] ; + lbe = _10R50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10R50[x] + _9R50[x]) * 0.5f) && (hue > (_9R50[x] + _7R50[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _9R50[y] - _9R50[x] ; + lbe = _9R50[y]; + correctL = true; + } else if (x < 85 && (hue <= (_9R50[x] + _7R50[x]) * 0.5f) && (hue > (_7R50[x] - 0.035f))) { + if (y > 89) { + y = 89; + } + correction = _7R50[y] - _7R50[x] ; + lbe = _7R50[y]; + correctL = true; + } + } else if (lum < 65.f) { + if ((hue <= (_10YR60[x] + 0.035f)) && (hue > (_10YR60[x] + _85YR60[x]) * 0.5f)) { + correction = _10YR60[y] - _10YR60[x] ; + lbe = _10YR60[y]; + correctL = true; + } else if ((hue <= (_10YR60[x] + _85YR60[x]) * 0.5f) && (hue > (_85YR60[x] + _7YR60[x]) * 0.5f)) { + correction = _85YR60[y] - _85YR60[x] ; + lbe = _85YR60[y]; + correctL = true; + } else if ((hue <= (_85YR60[x] + _7YR60[x]) * 0.5f) && (hue > (_7YR60[x] + _55YR60[x]) * 0.5f)) { + correction = _7YR60[y] - _7YR60[x] ; + lbe = _7YR60[y]; + correctL = true; + } else if ((hue <= (_7YR60[x] + _55YR60[x]) * 0.5f) && (hue > (_55YR60[x] + _4YR60[x]) * 0.5f)) { + correction = _55YR60[y] - _55YR60[x] ; + lbe = _55YR60[y]; + correctL = true; + } else if ((hue <= (_55YR60[x] + _4YR60[x]) * 0.5f) && (hue > (_4YR60[x] + _25YR60[x]) * 0.5f)) { + correction = _4YR60[y] - _4YR60[x] ; + lbe = _4YR60[y]; + correctL = true; + } else if (x < 85 && (hue <= (_4YR60[x] + _25YR60[x]) * 0.5f) && (hue > (_25YR60[x] + _10R60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _25YR60[y] - _25YR60[x] ; + lbe = _25YR60[y]; + correctL = true; + } else if (x < 85 && (hue <= (_25YR60[x] + _10R60[x]) * 0.5f) && (hue > (_10R60[x] + _9R60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10R60[y] - _10R60[x] ; + lbe = _10R60[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10R60[x] + _9R60[x]) * 0.5f) && (hue > (_9R60[x] + _7R60[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _9R60[y] - _9R60[x] ; + lbe = _9R60[y]; + correctL = true; + } else if (x < 85 && (hue <= (_9R60[x] + _7R60[x]) * 0.5f) && (hue > (_7R60[x] - 0.035f))) { + if (y > 89) { + y = 89; + } + correction = _7R60[y] - _7R60[x] ; + lbe = _7R60[y]; + correctL = true; + } + } else if (lum < 75.f) { + if ((hue <= (_10YR70[x] + 0.035f)) && (hue > (_10YR70[x] + _85YR70[x]) * 0.5f)) { + correction = _10YR70[y] - _10YR70[x] ; + lbe = _10YR70[y]; + correctL = true; + } else if ((hue <= (_10YR70[x] + _85YR70[x]) * 0.5f) && (hue > (_85YR70[x] + _7YR70[x]) * 0.5f)) { + correction = _85YR70[y] - _85YR70[x] ; + lbe = _85YR70[y]; + correctL = true; + } else if ((hue <= (_85YR70[x] + _7YR70[x]) * 0.5f) && (hue > (_7YR70[x] + _55YR70[x]) * 0.5f)) { + correction = _7YR70[y] - _7YR70[x] ; + lbe = _7YR70[y]; + correctL = true; + } else if ((hue <= (_7YR70[x] + _55YR70[x]) * 0.5f) && (hue > (_55YR70[x] + _4YR70[x]) * 0.5f)) { + correction = _55YR70[y] - _55YR70[x] ; + lbe = _55YR70[y]; + correctL = true; + } else if ((hue <= (_55YR70[x] + _4YR70[x]) * 0.5f) && (hue > (_4YR70[x] + _25YR70[x]) * 0.5f)) { + correction = _4YR70[y] - _4YR70[x] ; + lbe = _4YR70[y]; + correctL = true; + } else if (x < 85 && (hue <= (_4YR70[x] + _25YR70[x]) * 0.5f) && (hue > (_25YR70[x] + _10R70[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _25YR70[y] - _25YR70[x] ; + lbe = _25YR70[y]; + correctL = true; + } else if (x < 85 && (hue <= (_25YR70[x] + _10R70[x]) * 0.5f) && (hue > (_10R70[x] + _9R70[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10R70[y] - _10R70[x] ; + lbe = _10R70[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10R70[x] + _9R70[x]) * 0.5f) && (hue > (_9R70[x] + _7R70[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _9R70[y] - _9R70[x] ; + lbe = _9R70[y] ; + correctL = true; + } else if (x < 85 && (hue <= (_9R70[x] + _7R70[x]) * 0.5f) && (hue > (_7R70[x] - 0.035f))) { + if (y > 89) { + y = 89; + } + correction = _7R70[y] - _7R70[x] ; + lbe = _7R70[y]; + correctL = true; + } + } else if (lum < 85.f) { + if ((hue <= (_10YR80[x] + 0.035f)) && (hue > (_10YR80[x] + _85YR80[x]) * 0.5f)) { + correction = _10YR80[y] - _10YR80[x] ; + lbe = _10YR80[y]; + correctL = true; + } else if ((hue <= (_10YR80[x] + _85YR80[x]) * 0.5f) && (hue > (_85YR80[x] + _7YR80[x]) * 0.5f)) { + correction = _85YR80[y] - _85YR80[x] ; + lbe = _85YR80[y]; + } else if (x < 85 && (hue <= (_85YR80[x] + _7YR80[x]) * 0.5f) && (hue > (_7YR80[x] + _55YR80[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _7YR80[y] - _7YR80[x] ; + lbe = _7YR80[y]; + correctL = true; + } else if (x < 45 && (hue <= (_7YR80[x] + _55YR80[x]) * 0.5f) && (hue > (_55YR80[x] + _4YR80[x]) * 0.5f)) { + correction = _55YR80[y] - _55YR80[x] ; + lbe = _55YR80[y]; + correctL = true; + } else if (x < 45 && (hue <= (_55YR80[x] + _4YR80[x]) * 0.5f) && (hue > (_4YR80[x] - 0.035f))) { + if (y > 49) { + y = 49; + } + correction = _4YR80[y] - _4YR80[x] ; + lbe = _4YR80[y] ; + correctL = true; + } + } else if (lum < 95.f) { + if (x < 85 && (hue <= (_10YR90[x] + 0.035f)) && (hue > (_10YR90[x] - 0.035f))) { + if (y > 89) { + y = 89; + } + correction = _10YR90[y] - _10YR90[x] ; + lbe = _10YR90[y]; + correctL = true; + } else if (x < 85 && hue <= (_85YR90[x] + 0.035f) && hue > (_85YR90[x] - 0.035f)) { + if (y > 89) { + y = 89; + } + correction = _85YR90[y] - _85YR90[x] ; + lbe = _85YR90[y]; + correctL = true; + } else if (x < 45 && (hue <= (_55YR90[x] + 0.035f) && (hue > (_55YR90[x] - 0.035f)))) { + if (y > 49) { + y = 49; + } + correction = _55YR90[y] - _55YR90[x] ; + lbe = _55YR90[y]; + correctL = true; + } + } + } + } else if (zone == 3) { // //Green yellow correction + if (lum >= 25.f) { + if (lum < 35.f) { + if ((hue <= (_7G30[x] + 0.035f)) && (hue > (_7G30[x] + _5G30[x]) * 0.5f)) { + correction = _7G30[y] - _7G30[x] ; + lbe = _7G30[y]; + correctL = true; + } else if ((hue <= (_7G30[x] + _5G30[x]) * 0.5f) && (hue > (_5G30[x] + _25G30[x]) * 0.5f)) { + correction = _5G30[y] - _5G30[x] ; + lbe = _5G30[y]; + correctL = true; + } else if ((hue <= (_25G30[x] + _5G30[x]) * 0.5f) && (hue > (_25G30[x] + _1G30[x]) * 0.5f)) { + correction = _25G30[y] - _25G30[x] ; + lbe = _25G30[y]; + correctL = true; + } else if ((hue <= (_1G30[x] + _25G30[x]) * 0.5f) && (hue > (_1G30[x] + _10GY30[x]) * 0.5f)) { + correction = _1G30[y] - _1G30[x] ; + lbe = _1G30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_1G30[x] + _10GY30[x]) * 0.5f) && (hue > (_10GY30[x] + _75GY30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10GY30[y] - _10GY30[x] ; + lbe = _10GY30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10GY30[x] + _75GY30[x]) * 0.5f) && (hue > (_75GY30[x] + _5GY30[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _75GY30[y] - _75GY30[x] ; + lbe = _75GY30[y]; + correctL = true; + } else if (x < 85 && (hue <= (_5GY30[x] + _75GY30[x]) * 0.5f) && (hue > (_5GY30[x] - 0.035f))) { + if (y > 89) { + y = 89; + } + correction = _5GY30[y] - _5GY30[x] ; + lbe = _5GY30[y] ; + correctL = true; + } + } else if (lum < 45.f) { + if ((hue <= (_7G40[x] + 0.035f)) && (hue > (_7G40[x] + _5G40[x]) * 0.5f)) { + correction = _7G40[y] - _7G40[x] ; + lbe = _7G40[y]; + correctL = true; + } else if ((hue <= (_7G40[x] + _5G40[x]) * 0.5f) && (hue > (_5G40[x] + _25G40[x]) * 0.5f)) { + correction = _5G40[y] - _5G40[x] ; + lbe = _5G40[y]; + correctL = true; + } else if ((hue <= (_25G40[x] + _5G40[x]) * 0.5f) && (hue > (_25G40[x] + _1G40[x]) * 0.5f)) { + correction = _25G40[y] - _25G40[x] ; + lbe = _25G40[y]; + correctL = true; + } else if ((hue <= (_1G40[x] + _25G40[x]) * 0.5f) && (hue > (_1G40[x] + _10GY40[x]) * 0.5f)) { + correction = _1G40[y] - _1G40[x] ; + lbe = _1G40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_1G40[x] + _10GY40[x]) * 0.5f) && (hue > (_10GY40[x] + _75GY40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _10GY40[y] - _10GY40[x] ; + lbe = _10GY40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_10GY40[x] + _75GY40[x]) * 0.5f) && (hue > (_75GY40[x] + _5GY40[x]) * 0.5f)) { + if (y > 89) { + y = 89; + } + correction = _75GY40[y] - _75GY40[x] ; + lbe = _75GY40[y]; + correctL = true; + } else if (x < 85 && (hue <= (_5GY40[x] + _75GY40[x]) * 0.5f) && (hue > (_5GY40[x] - 0.035f))) { + if (y > 89) { + y = 89; // + } + correction = _5GY40[y] - _5GY40[x] ; + lbe = _5GY40[y]; + correctL = true; + } + } else if (lum < 55.f) { + if ((hue <= (_7G50[x] + 0.035f)) && (hue > (_7G50[x] + _5G50[x]) * 0.5f)) { + correction = _7G50[y] - _7G50[x] ; + lbe = _7G50[y]; + correctL = true; + } else if ((hue <= (_7G50[x] + _5G50[x]) * 0.5f) && (hue > (_5G50[x] + _25G50[x]) * 0.5f)) { + correction = _5G50[y] - _5G50[x] ; + lbe = _5G50[y]; + correctL = true; + } else if ((hue <= (_25G50[x] + _5G50[x]) * 0.5f) && (hue > (_25G50[x] + _1G50[x]) * 0.5f)) { + correction = _25G50[y] - _25G50[x] ; + lbe = _25G50[y]; + correctL = true; + } else if ((hue <= (_1G50[x] + _25G50[x]) * 0.5f) && (hue > (_1G50[x] + _10GY50[x]) * 0.5f)) { + correction = _1G50[y] - _1G50[x] ; + lbe = _1G50[y]; + correctL = true; + } else if ((hue <= (_1G50[x] + _10GY50[x]) * 0.5f) && (hue > (_10GY50[x] + _75GY50[x]) * 0.5f)) { + correction = _10GY50[y] - _10GY50[x] ; + lbe = _10GY50[y]; + correctL = true; + } else if ((hue <= (_10GY50[x] + _75GY50[x]) * 0.5f) && (hue > (_75GY50[x] + _5GY50[x]) * 0.5f)) { + correction = _75GY50[y] - _75GY50[x] ; + lbe = _75GY50[y]; + correctL = true; + } else if ((hue <= (_5GY50[x] + _75GY50[x]) * 0.5f) && (hue > (_5GY50[x] - 0.035f))) { + correction = _5GY50[y] - _5GY50[x] ; + lbe = _5GY50[y]; + correctL = true; + } + } else if (lum < 65.f) { + if ((hue <= (_7G60[x] + 0.035f)) && (hue > (_7G60[x] + _5G60[x]) * 0.5f)) { + correction = _7G60[y] - _7G60[x] ; + lbe = _7G60[y]; + correctL = true; + } else if ((hue <= (_7G60[x] + _5G60[x]) * 0.5f) && (hue > (_5G60[x] + _25G60[x]) * 0.5f)) { + correction = _5G60[y] - _5G60[x] ; + lbe = _5G60[y]; + correctL = true; + } else if ((hue <= (_25G60[x] + _5G60[x]) * 0.5f) && (hue > (_25G60[x] + _1G60[x]) * 0.5f)) { + correction = _25G60[y] - _25G60[x] ; + lbe = _25G60[y]; + correctL = true; + } else if ((hue <= (_1G60[x] + _25G60[x]) * 0.5f) && (hue > (_1G60[x] + _10GY60[x]) * 0.5f)) { + correction = _1G60[y] - _1G60[x] ; + lbe = _1G60[y]; + correctL = true; + } else if ((hue <= (_1G60[x] + _10GY60[x]) * 0.5f) && (hue > (_10GY60[x] + _75GY60[x]) * 0.5f)) { + correction = _10GY60[y] - _10GY60[x] ; + lbe = _10GY60[y]; + correctL = true; + } else if ((hue <= (_10GY60[x] + _75GY60[x]) * 0.5f) && (hue > (_75GY60[x] + _5GY60[x]) * 0.5f)) { + correction = _75GY60[y] - _75GY60[x] ; + lbe = _75GY60[y] ; + correctL = true; + } else if ((hue <= (_5GY60[x] + _75GY60[x]) * 0.5f) && (hue > (_5GY60[x] - 0.035f))) { + correction = _5GY60[y] - _5GY60[x] ; + lbe = _5GY60[y]; + correctL = true; + } + } else if (lum < 75.f) { + if ((hue <= (_7G70[x] + 0.035f)) && (hue > (_7G70[x] + _5G70[x]) * 0.5f)) { + correction = _7G70[y] - _7G70[x] ; + lbe = _7G70[y]; + correctL = true; + } else if ((hue <= (_7G70[x] + _5G70[x]) * 0.5f) && (hue > (_5G70[x] + _25G70[x]) * 0.5f)) { + correction = _5G70[y] - _5G70[x] ; + lbe = _5G70[y]; + correctL = true; + } else if ((hue <= (_25G70[x] + _5G70[x]) * 0.5f) && (hue > (_25G70[x] + _1G70[x]) * 0.5f)) { + correction = _25G70[y] - _25G70[x] ; + lbe = _25G70[y]; + correctL = true; + } else if ((hue <= (_1G70[x] + _25G70[x]) * 0.5f) && (hue > (_1G70[x] + _10GY70[x]) * 0.5f)) { + correction = _1G70[y] - _1G70[x] ; + lbe = _1G70[y] ; + correctL = true; + } else if ((hue <= (_1G70[x] + _10GY70[x]) * 0.5f) && (hue > (_10GY70[x] + _75GY70[x]) * 0.5f)) { + correction = _10GY70[y] - _10GY70[x] ; + lbe = _10GY70[y]; + correctL = true; + } else if ((hue <= (_10GY70[x] + _75GY70[x]) * 0.5f) && (hue > (_75GY70[x] + _5GY70[x]) * 0.5f)) { + correction = _75GY70[y] - _75GY70[x] ; + lbe = _75GY70[y]; + correctL = true; + } else if ((hue <= (_5GY70[x] + _75GY70[x]) * 0.5f) && (hue > (_5GY70[x] - 0.035f))) { + correction = _5GY70[y] - _5GY70[x] ; + lbe = _5GY70[y]; + correctL = true; + } + } else if (lum < 85.f) { + if ((hue <= (_7G80[x] + 0.035f)) && (hue > (_7G80[x] + _5G80[x]) * 0.5f)) { + correction = _7G80[y] - _7G80[x] ; + lbe = _7G80[y]; + correctL = true; + } else if ((hue <= (_7G80[x] + _5G80[x]) * 0.5f) && (hue > (_5G80[x] + _25G80[x]) * 0.5f)) { + correction = _5G80[y] - _5G80[x] ; + lbe = _5G80[y]; + correctL = true; + } else if ((hue <= (_25G80[x] + _5G80[x]) * 0.5f) && (hue > (_25G80[x] + _1G80[x]) * 0.5f)) { + correction = _25G80[y] - _25G80[x] ; + lbe = _25G80[y]; + correctL = true; + } else if ((hue <= (_1G80[x] + _25G80[x]) * 0.5f) && (hue > (_1G80[x] + _10GY80[x]) * 0.5f)) { + correction = _1G80[y] - _1G80[x] ; + lbe = _1G80[y]; + correctL = true; + } else if ((hue <= (_1G80[x] + _10GY80[x]) * 0.5f) && (hue > (_10GY80[x] + _75GY80[x]) * 0.5f)) { + correction = _10GY80[y] - _10GY80[x] ; + lbe = _10GY80[y]; + correctL = true; + } else if ((hue <= (_10GY80[x] + _75GY80[x]) * 0.5f) && (hue > (_75GY80[x] + _5GY80[x]) * 0.5f)) { + correction = _75GY80[y] - _75GY80[x] ; + lbe = _75GY80[y]; + correctL = true; + } else if ((hue <= (_5GY80[x] + _75GY80[x]) * 0.5f) && (hue > (_5GY80[x] - 0.035f))) { + correction = _5GY80[y] - _5GY80[x] ; + lbe = _5GY80[y]; + correctL = true; + } + } + } + } else if (zone == 4) { //Red purple correction : only for L < 30 + if (lum > 5.f) { + if (lum < 15.f && x < 45) { + y = std::min(y, 44); + if ((hue <= (_5R10[x] + 0.035f)) && (hue > (_5R10[x] - 0.043f))) { + correction = _5R10[y] - _5R10[x] ; + lbe = _5R10[y]; + correctL = true; + } else if ((hue <= (_25R10[x] + 0.043f)) && (hue > (_25R10[x] + _10RP10[x]) * 0.5f)) { + correction = _25R10[y] - _25R10[x] ; + lbe = _25R10[y]; + correctL = true; + } else if ((hue <= (_25R10[x] + _10RP10[x]) * 0.5f) && (hue > (_10RP10[x] - 0.035f))) { + correction = _10RP10[y] - _10RP10[x] ; + lbe = _10RP10[y]; + correctL = true; + } + } else if (lum < 25.f && x < 70) { + y = std::min(y, 70); + if ((hue <= (_5R20[x] + 0.035f)) && (hue > (_5R20[x] + _25R20[x]) * 0.5f)) { + correction = _5R20[y] - _5R20[x] ; + lbe = _5R20[y]; + correctL = true; + } else if ((hue <= (_5R20[x] + _25R20[x]) * 0.5f) && (hue > (_10RP20[x] + _25R20[x]) * 0.5f)) { + correction = _25R20[y] - _25R20[x] ; + lbe = _25R20[y]; + correctL = true; + } else if ( (hue <= (_10RP20[x] + _25R20[x]) * 0.5f) && (hue > (_10RP20[x] - 0.035f))) { + correction = _10RP20[y] - _10RP20[x] ; + lbe = _10RP20[y]; + correctL = true; + } + } else if (lum < 35.f && x < 85) { + y = rtengine::min(y, 85); + if ((hue <= (_5R30[x] + 0.035f)) && (hue > (_5R30[x] + _25R30[x]) * 0.5f)) { + correction = _5R30[y] - _5R30[x] ; + lbe = _5R30[y]; + correctL = true; + } else if ((hue <= (_5R30[x] + _25R30[x]) * 0.5f) && (hue > (_10RP30[x] + _25R30[x]) * 0.5f)) { + correction = _25R30[y] - _25R30[x] ; + lbe = _25R30[y]; + correctL = true; + } else if ((hue <= (_10RP30[x] + _25R30[x]) * 0.5f) && (hue > (_10RP30[x] - 0.035f))) { + correction = _10RP30[y] - _10RP30[x] ; + lbe = _10RP30[y]; + correctL = true; + } + } + } + } + //end red purple +} +} diff --git a/rtengine/myfile.cc b/rtengine/myfile.cc index 842766dcf..2321d18bb 100644 --- a/rtengine/myfile.cc +++ b/rtengine/myfile.cc @@ -70,7 +70,7 @@ int munmap(void *start, size_t length) #ifdef MYFILE_MMAP -IMFILE* fopen (const char* fname) +rtengine::IMFILE* rtengine::fopen (const char* fname) { int fd; @@ -123,13 +123,13 @@ IMFILE* fopen (const char* fname) return mf; } -IMFILE* gfopen (const char* fname) +rtengine::IMFILE* rtengine::gfopen (const char* fname) { return fopen(fname); } #else -IMFILE* fopen (const char* fname) +rtengine::IMFILE* rtengine::fopen (const char* fname) { FILE* f = g_fopen (fname, "rb"); @@ -152,7 +152,7 @@ IMFILE* fopen (const char* fname) return mf; } -IMFILE* gfopen (const char* fname) +rtengine::IMFILE* rtengine::gfopen (const char* fname) { FILE* f = g_fopen (fname, "rb"); @@ -176,7 +176,7 @@ IMFILE* gfopen (const char* fname) } #endif //MYFILE_MMAP -IMFILE* fopen (unsigned* buf, int size) +rtengine::IMFILE* rtengine::fopen (unsigned* buf, int size) { IMFILE* mf = new IMFILE; @@ -190,7 +190,7 @@ IMFILE* fopen (unsigned* buf, int size) return mf; } -void fclose (IMFILE* f) +void rtengine::fclose (IMFILE* f) { #ifdef MYFILE_MMAP @@ -207,7 +207,7 @@ void fclose (IMFILE* f) delete f; } -int fscanf (IMFILE* f, const char* s ...) +int rtengine::fscanf (IMFILE* f, const char* s ...) { // fscanf not easily wrapped since we have no terminating \0 at end // of file data and vsscanf() won't tell us how many characters that @@ -253,7 +253,7 @@ int fscanf (IMFILE* f, const char* s ...) } -char* fgets (char* s, int n, IMFILE* f) +char* rtengine::fgets (char* s, int n, IMFILE* f) { if (f->pos >= f->size) { @@ -270,7 +270,7 @@ char* fgets (char* s, int n, IMFILE* f) return s; } -void imfile_set_plistener(IMFILE *f, rtengine::ProgressListener *plistener, double progress_range) +void rtengine::imfile_set_plistener(IMFILE *f, rtengine::ProgressListener *plistener, double progress_range) { f->plistener = plistener; f->progress_range = progress_range; @@ -278,7 +278,7 @@ void imfile_set_plistener(IMFILE *f, rtengine::ProgressListener *plistener, doub f->progress_current = 0; } -void imfile_update_progress(IMFILE *f) +void rtengine::imfile_update_progress(IMFILE *f) { if (!f->plistener || f->progress_current < f->progress_next) { return; diff --git a/rtengine/myfile.h b/rtengine/myfile.h index 423edea9a..ae14ce31a 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -30,8 +30,6 @@ namespace rtengine class ProgressListener; -} - struct IMFILE { int fd; ssize_t pos; @@ -107,13 +105,13 @@ inline int getc (IMFILE* f) return fgetc(f); } -inline int fread (void* dst, int es, int count, IMFILE* f) +inline int fread (void* dst, size_t es, size_t count, IMFILE* f) { - int s = es * count; - int avail = f->size - f->pos; + size_t s = es * count; + size_t avail = static_cast(f->size) - static_cast(f->pos); - if (s <= avail) { + if (static_cast(s) <= static_cast(avail)) { memcpy (dst, f->data + f->pos, s); f->pos += s; @@ -141,3 +139,5 @@ inline unsigned char* fdata(int offset, IMFILE* f) int fscanf (IMFILE* f, const char* s ...); char* fgets (char* s, int n, IMFILE* f); + +} diff --git a/rtengine/opthelper.h b/rtengine/opthelper.h index b65ede227..8de3b781b 100644 --- a/rtengine/opthelper.h +++ b/rtengine/opthelper.h @@ -18,27 +18,24 @@ // along with this program. If not, see . // //////////////////////////////////////////////////////////////// +#pragma once -#ifndef OPTHELPER_H - #define OPTHELPER_H +#define pow_F(a,b) (xexpf((b)*xlogf(a))) - #define pow_F(a,b) (xexpf(b*xlogf(a))) - - #ifdef __SSE2__ - #include "sleefsseavx.c" - #endif - - #ifdef __GNUC__ - #define RESTRICT __restrict__ - #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) - #define UNLIKELY(x) (x) - #define ALIGNED64 - #define ALIGNED16 - #endif +#ifdef __SSE2__ + #include "sleefsseavx.h" +#endif + +#ifdef __GNUC__ + #define RESTRICT __restrict__ + #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) + #define UNLIKELY(x) (x) + #define ALIGNED64 + #define ALIGNED16 #endif diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc index 1eddbc1ea..60f2abcb6 100644 --- a/rtengine/pdaflinesfilter.cc +++ b/rtengine/pdaflinesfilter.cc @@ -177,7 +177,7 @@ PDAFLinesFilter::PDAFLinesFilter(RawImage *ri): gthresh_ = new PDAFGreenEqulibrateThreshold(W_, H_); CameraConstantsStore* ccs = CameraConstantsStore::getInstance(); - CameraConst *cc = ccs->get(ri_->get_maker().c_str(), ri_->get_model().c_str()); + const CameraConst *cc = ccs->get(ri_->get_maker().c_str(), ri_->get_model().c_str()); if (cc) { pattern_ = cc->get_pdafPattern(); @@ -275,7 +275,11 @@ int PDAFLinesFilter::mark(const array2D &rawData, PixelsMap &bpMap) 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); + int n = 0; + n += markLine(rawData, bpMap, y); + n += (y-1 <= 0 ) ? 0 : markLine(rawData, bpMap, y-1); + n += (y+1 >= H_-1) ? 0 : markLine(rawData, bpMap, y+1); + if (n) { found += n; if (settings->verbose) { diff --git a/rtengine/perspectivecorrection.cc b/rtengine/perspectivecorrection.cc new file mode 100644 index 000000000..f4428faf2 --- /dev/null +++ b/rtengine/perspectivecorrection.cc @@ -0,0 +1,411 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2019 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 . + */ + +// taken from darktable (src/iop/ashift.c) +/* + This file is part of darktable, + copyright (c) 2016 Ulrich Pegelow. + + darktable is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + darktable is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with darktable. If not, see . +*/ +// Inspiration to this module comes from the program ShiftN (http://www.shiftn.de) by +// Marcus Hebel. + +// Thanks to Marcus for his support when implementing part of the ShiftN functionality +// to darktable. + + +#include "perspectivecorrection.h" +#include "improcfun.h" +#include "procparams.h" +#include "rt_math.h" +#include +#include +#include +#include +#include +#include +#include + +#include "../rtgui/threadutils.h" +#include "colortemp.h" +#include "imagefloat.h" +#include "settings.h" + +namespace rtengine { extern const Settings *settings; } + +#define _(msg) (msg) +#define dt_control_log(msg) \ + if (settings->verbose) { \ + printf("%s\n", msg); \ + fflush(stdout); \ + } + + +namespace rtengine { + +namespace { + +inline int mat3inv(float *const dst, const float *const src) +{ + std::array, 3> tmpsrc; + std::array, 3> tmpdst; + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + tmpsrc[i][j] = src[3 * i + j]; + } + } + if (invertMatrix(tmpsrc, tmpdst)) { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + dst[3 * i + j] = tmpdst[i][j]; + } + } + return 0; + } else { + return 1; + } +} + + +// the darktable ashift iop (adapted to RT), which does most of the work +#include "ashift_dt.c" + + +} // namespace + + +namespace { + +/* +std::vector get_corners(int w, int h) +{ + int x1 = 0, y1 = 0; + int x2 = w, y2 = h; + + std::vector corners = { + Coord2D(x1, y1), + Coord2D(x1, y2), + Coord2D(x2, y2), + Coord2D(x2, y1) + }; + return corners; +} +*/ + +void init_dt_structures(dt_iop_ashift_params_t *p, dt_iop_ashift_gui_data_t *g, + const procparams::PerspectiveParams *params) +{ + dt_iop_ashift_params_t dp = { + 0.0f, + 0.0f, + 0.0f, + 0.0f, + DEFAULT_F_LENGTH, + 1.f, + 0.0f, + 1.0f, + ASHIFT_MODE_SPECIFIC, + 0, + ASHIFT_CROP_OFF, + 0.0f, + 1.0f, + 0.0f, + 1.0f, + 0.0f, + 0.0f + }; + *p = dp; + + g->buf = NULL; + g->buf_width = 0; + g->buf_height = 0; + g->buf_x_off = 0; + g->buf_y_off = 0; + g->buf_scale = 1.0f; + g->buf_hash = 0; + g->isflipped = 0; + g->lastfit = ASHIFT_FIT_NONE; + g->fitting = 0; + g->lines = NULL; + g->lines_count =0; + g->horizontal_count = 0; + g->vertical_count = 0; + g->grid_hash = 0; + g->lines_hash = 0; + g->rotation_range = ROTATION_RANGE_SOFT; + g->lensshift_v_range = LENSSHIFT_RANGE_SOFT; + g->lensshift_h_range = LENSSHIFT_RANGE_SOFT; + g->shear_range = SHEAR_RANGE_SOFT; + g->camera_pitch_range = CAMERA_ANGLE_RANGE_SOFT; + g->camera_yaw_range = CAMERA_ANGLE_RANGE_SOFT; + g->lines_suppressed = 0; + g->lines_version = 0; + g->show_guides = 0; + g->isselecting = 0; + g->isdeselecting = 0; + g->isbounding = ASHIFT_BOUNDING_OFF; + g->near_delta = 0; + g->selecting_lines_version = 0; + g->points = NULL; + g->points_idx = NULL; + g->points_lines_count = 0; + g->points_version = 0; + g->jobcode = ASHIFT_JOBCODE_NONE; + g->jobparams = 0; + g->adjust_crop = FALSE; + g->lastx = g->lasty = -1.0f; + g->crop_cx = g->crop_cy = 1.0f; + + if (params) { + p->rotation = params->camera_roll; + p->lensshift_v = params->camera_shift_vert; + p->lensshift_h = params->camera_shift_horiz; + p->f_length = params->camera_focal_length; + p->crop_factor = params->camera_crop_factor; + p->camera_pitch = params->camera_pitch; + p->camera_yaw = params->camera_yaw; + } +} + + +/* +void get_view_size(int w, int h, const procparams::PerspectiveParams ¶ms, double &cw, double &ch) +{ + double min_x = RT_INFINITY, max_x = -RT_INFINITY; + double min_y = RT_INFINITY, max_y = -RT_INFINITY; + + auto corners = get_corners(w, h); + + float homo[3][3]; + homography((float *)homo, params.angle, params.vertical / 100.0, -params.horizontal / 100.0, params.shear / 100.0, params.flength * params.cropfactor, 100.f, params.aspect, w, h, ASHIFT_HOMOGRAPH_FORWARD); + + for (auto &c : corners) { + float pin[3] = { float(c.x), float(c.y), 1.f }; + float pout[3]; + mat3mulv(pout, (float *)homo, pin); + double x = pout[0] / pout[2]; + double y = pout[1] / pout[2]; + min_x = min(min_x, x); + max_x = max(max_x, x); + min_y = min(min_y, y); + max_y = max(max_y, y); + } + + cw = max_x - min_x; + ch = max_y - min_y; +} +*/ + +/** + * Allocates a new array and populates it with ashift lines corresponding to the + * provided control lines. + */ +std::unique_ptr toAshiftLines(const std::vector *lines) +{ + std::unique_ptr retval(new dt_iop_ashift_line_t[lines->size()]); + + for (size_t i = 0; i < lines->size(); i++) { + const float x1 = (*lines)[i].x1; + const float y1 = (*lines)[i].y1; + const float x2 = (*lines)[i].x2; + const float y2 = (*lines)[i].y2; + retval[i].p1[0] = x1; + retval[i].p1[1] = y1; + retval[i].p1[2] = 1.0f; + retval[i].p2[0] = x2; + retval[i].p2[1] = y2; + retval[i].p2[2] = 1.0f; + retval[i].length = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + retval[i].width = 1.0f; + retval[i].weight = retval[i].length; + if ((*lines)[i].type == ControlLine::HORIZONTAL) { + retval[i].type = ASHIFT_LINE_HORIZONTAL_SELECTED; + } else if ((*lines)[i].type == ControlLine::VERTICAL) { + retval[i].type = ASHIFT_LINE_VERTICAL_SELECTED; + } else { + retval[i].type = ASHIFT_LINE_IRRELEVANT; + } + } + + return retval; +} + +} // namespace + + +PerspectiveCorrection::Params PerspectiveCorrection::autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const std::vector *control_lines) +{ + auto pcp = procparams::PerspectiveParams(pparams->perspective); + procparams::PerspectiveParams dflt; + /* + pcp.horizontal = dflt.horizontal; + pcp.vertical = dflt.vertical; + pcp.angle = dflt.angle; + pcp.shear = dflt.shear; + */ + pcp.camera_pitch = dflt.camera_pitch; + pcp.camera_roll = dflt.camera_roll; + pcp.camera_yaw = dflt.camera_yaw; + + dt_iop_ashift_params_t p; + dt_iop_ashift_gui_data_t g; + init_dt_structures(&p, &g, &pparams->perspective); + dt_iop_module_t module; + module.gui_data = &g; + module.is_raw = src->isRAW(); + + int tr = getCoarseBitMask(pparams->coarse); + int fw, fh; + src->getFullSize(fw, fh, tr); + if (control_lines == nullptr) { + int skip = max(float(max(fw, fh)) / 900.f + 0.5f, 1.f); + PreviewProps pp(0, 0, fw, fh, skip); + int w, h; + src->getSize(pp, w, h); + std::unique_ptr img(new Imagefloat(w, h)); + + 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.outputProfile = ColorManagementParams::NoICMString; + src->getImage(src->getWB(), tr, img.get(), pp, neutral.toneCurve, neutral.raw, 0); + src->convertColorSpace(img.get(), pparams->icm, src->getWB()); + + neutral.commonTrans.autofill = false; // Ensures crop factor is correct. + // TODO: Ensure image borders of rotated image do not get detected as lines. + neutral.rotate = pparams->rotate; + neutral.distortion = pparams->distortion; + neutral.lensProf = pparams->lensProf; + ImProcFunctions ipf(&neutral, true); + if (ipf.needsTransform(w, h, src->getRotateDegree(), src->getMetaData())) { + Imagefloat *tmp = new Imagefloat(w, h); + ipf.transform(img.get(), tmp, 0, 0, 0, 0, w, h, w, h, + src->getMetaData(), src->getRotateDegree(), false); + img.reset(tmp); + } + + // allocate the gui buffer + g.buf = static_cast(malloc(sizeof(float) * w * h * 4)); + g.buf_width = w; + g.buf_height = h; + + img->normalizeFloatTo1(); + +#ifdef _OPENMP +# pragma omp parallel for +#endif + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + int i = (y * w + x) * 4; + g.buf[i] = img->r(y, x); + g.buf[i+1] = img->g(y, x); + g.buf[i+2] = img->b(y, x); + g.buf[i+3] = 1.f; + } + } + } + + dt_iop_ashift_fitaxis_t fitaxis = ASHIFT_FIT_NONE; + if (corr_pitch && corr_yaw) { + fitaxis = ASHIFT_FIT_BOTH_SHEAR; + } else if (corr_pitch) { + fitaxis = ASHIFT_FIT_VERTICALLY; + } else if (corr_yaw) { + fitaxis = ASHIFT_FIT_HORIZONTALLY; + } + + // reset the pseudo-random seed for repeatability -- ashift_dt uses rand() + // internally! + srand(1); + + bool res; + if (control_lines == nullptr) { + res = do_get_structure(&module, &p, ASHIFT_ENHANCE_EDGES) && do_fit(&module, &p, fitaxis); + } else { + std::unique_ptr ashift_lines = toAshiftLines(control_lines); + dt_iop_ashift_gui_data_t *g = module.gui_data; + g->lines_count = control_lines->size(); + g->lines = ashift_lines.get(); + g->lines_in_height = fh; + g->lines_in_width = fw; + update_lines_count(g->lines, g->lines_count, &(g->vertical_count), &(g->horizontal_count)); + res = do_fit(&module, &p, fitaxis, 2); + g->lines = nullptr; + } + Params retval = { + .angle = p.rotation, + .pitch = p.camera_pitch, + .yaw = p.camera_yaw + }; + + // cleanup the gui + if (g.lines) free(g.lines); + if (g.points) free(g.points); + if (g.points_idx) free(g.points_idx); + if (g.buf) free(g.buf); + + if (!res) { + retval.angle = pparams->perspective.camera_roll; + retval.pitch = pparams->perspective.camera_pitch; + retval.yaw = pparams->perspective.camera_yaw; + } + return retval; +} + + +/* +void PerspectiveCorrection::autocrop(int width, int height, bool fixratio, const procparams::PerspectiveParams ¶ms, const FramesMetaData *metadata, int &x, int &y, int &w, int &h) +{ + auto pp = import_meta(params, metadata); + double cw, ch; + get_view_size(width, height, params, cw, ch); + double s = min(double(width)/cw, double(height)/ch); + dt_iop_ashift_params_t p; + dt_iop_ashift_gui_data_t g; + init_dt_structures(&p, &g, &pp); + dt_iop_module_t module = { &g, false }; + g.buf_width = width; + g.buf_height = height; + p.cropmode = fixratio ? ASHIFT_CROP_ASPECT : ASHIFT_CROP_LARGEST; + do_crop(&module, &p); + cw *= s; + ch *= s; + double ox = p.cl * cw; + double oy = p.ct * ch; + x = ox - (cw - width)/2.0 + 0.5; + y = oy - (ch - height)/2.0 + 0.5; + w = (p.cr - p.cl) * cw; + h = (p.cb - p.ct) * ch; +} +*/ + +} // namespace rtengine diff --git a/rtengine/perspectivecorrection.h b/rtengine/perspectivecorrection.h new file mode 100644 index 000000000..f092f2c8c --- /dev/null +++ b/rtengine/perspectivecorrection.h @@ -0,0 +1,63 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2019 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 + +namespace rtengine { + +namespace procparams +{ + +class ProcParams; + +} + +class ImageSource; +class FramesMetaData; + +class ControlLine +{ +public: + enum Type + { + HORIZONTAL, + VERTICAL + }; + float x1, y1, x2, y2; + Type type; +}; + +class PerspectiveCorrection { +public: + struct Params + { + double angle; + double pitch; + double yaw; + }; + + static Params autocompute(ImageSource *src, bool corr_pitch, bool corr_yaw, const procparams::ProcParams *pparams, const FramesMetaData *metadata, const std::vector *control_lines = nullptr); + + //static void autocrop(int width, int height, bool fixratio, const procparams::PerspectiveParams ¶ms, const FramesMetaData *metadata, int &x, int &y, int &w, int &h); +}; + +} // namespace rtengine diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h index 6f017a196..3c541cb31 100644 --- a/rtengine/pipettebuffer.h +++ b/rtengine/pipettebuffer.h @@ -58,7 +58,7 @@ public: ~PipetteBuffer(); /** @brief Getter to know if the pipette buffer is correctly filled */ - bool isReady() + bool isReady() const { return ready; } diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 2e98b7b22..8088e2e9c 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -283,20 +283,20 @@ void calcFrameBrightnessFactor(unsigned int frame, uint32_t datalen, LUTu *histo { float medians[4]; - for(int i = 0; i < 4; ++i) { + for (int i = 0; i < 4; ++i) { //find median of histogram - uint32_t median = 0, count = 0; + uint32_t lmedian = 0, count = 0; - while(count < datalen / 2) { - count += (*histo[i])[median]; - ++median; + while (count < datalen / 2) { + count += (*histo[i])[lmedian]; + ++lmedian; } - const float weight = (count - datalen / 2.f) / (*histo[i])[median - 1]; - medians[i] = rtengine::intp(weight, (float)(median - 2), (float)(median - 1)); + const float weight = (count - datalen / 2.f) / (*histo[i])[lmedian - 1]; + medians[i] = rtengine::intp(weight, (float)(lmedian - 2), (float)(lmedian - 1)); } - for(int i = 0; i < 4; ++i) { + for (int i = 0; i < 4; ++i) { brightnessFactor[i] = medians[frame] / medians[i]; } @@ -334,7 +334,7 @@ BENCHFUN if(motionDetection) { if(!showOnlyMask) { - if(bayerParams.pixelShiftMedian) { // We need the demosaiced frames for motion correction + if(bayerParams.pixelShiftMedian || bayerParams.pixelShiftAverage) { // We need the demosaiced frames for motion correction if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, *(rawDataFrames[0]), red, green, blue, bayerParams.lmmse_iterations); } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(procparams::RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { @@ -359,22 +359,42 @@ BENCHFUN amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], options.chunkSizeAMAZE, options.measure); } } + if(bayerParams.pixelShiftMedian) { #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = winy + border; i < winh - border; i++) { - for(int j = winx + border; j < winw - border; j++) { - red[i][j] = median(red[i][j], redTmp[0][i + 1][j], redTmp[1][i + 1][j + 1], redTmp[2][i][j + 1]); - } + for(int i = winy + border; i < winh - border; i++) { + for(int j = winx + border; j < winw - border; j++) { + red[i][j] = median(red[i][j], redTmp[0][i + 1][j], redTmp[1][i + 1][j + 1], redTmp[2][i][j + 1]); + } - for(int j = winx + border; j < winw - border; j++) { - green[i][j] = median(green[i][j], greenTmp[0][i + 1][j], greenTmp[1][i + 1][j + 1], greenTmp[2][i][j + 1]); - } + for(int j = winx + border; j < winw - border; j++) { + green[i][j] = median(green[i][j], greenTmp[0][i + 1][j], greenTmp[1][i + 1][j + 1], greenTmp[2][i][j + 1]); + } - for(int j = winx + border; j < winw - border; j++) { - blue[i][j] = median(blue[i][j], blueTmp[0][i + 1][j], blueTmp[1][i + 1][j + 1], blueTmp[2][i][j + 1]); + for(int j = winx + border; j < winw - border; j++) { + blue[i][j] = median(blue[i][j], blueTmp[0][i + 1][j], blueTmp[1][i + 1][j + 1], blueTmp[2][i][j + 1]); + } + } + } else { +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for(int i = winy + border; i < winh - border; i++) { + for(int j = winx + border; j < winw - border; j++) { + red[i][j] = 0.25f * ((red[i][j] + redTmp[0][i + 1][j]) + (redTmp[1][i + 1][j + 1] + redTmp[2][i][j + 1])); + } + + for(int j = winx + border; j < winw - border; j++) { + green[i][j] = 0.25f * ((green[i][j] + greenTmp[0][i + 1][j]) + (greenTmp[1][i + 1][j + 1] + greenTmp[2][i][j + 1])); + } + + for(int j = winx + border; j < winw - border; j++) { + blue[i][j] = 0.25f * ((blue[i][j] + blueTmp[0][i + 1][j]) + (blueTmp[1][i + 1][j + 1] + blueTmp[2][i][j + 1])); + } } } } else { diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index de1603f1c..afaf0cbca 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -42,20 +42,20 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg") { // int deg = infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, width, height, 1, 1., true); + tpp = rtengine::Thumbnail::loadFromImage (fname, width, height, 1, 1., ColorTemp::DEFAULT_OBSERVER, true); if (tpp) { data = tpp->getImage8Data(); } } else if (ext.lowercase() == "png") { - tpp = rtengine::Thumbnail::loadFromImage (fname, width, height, 1, 1., true); + tpp = rtengine::Thumbnail::loadFromImage (fname, width, height, 1, 1., ColorTemp::DEFAULT_OBSERVER, true); if (tpp) { data = tpp->getImage8Data(); } } else if (ext.lowercase() == "tif" || ext.lowercase() == "tiff") { // int deg = infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, width, height, 1, 1., true); + tpp = rtengine::Thumbnail::loadFromImage (fname, width, height, 1, 1., ColorTemp::DEFAULT_OBSERVER, true); if (tpp) { data = tpp->getImage8Data(); @@ -121,7 +121,7 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext 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); + rawImage.getImage (wb, TR_NONE, &image, pp, params.toneCurve, params.raw, 0); rtengine::Image8 output(fw, fh); rawImage.convertColorSpace(&image, params.icm, wb); #ifdef _OPENMP diff --git a/rtengine/previewimage.h b/rtengine/previewimage.h index e6c3ea070..2143509a3 100644 --- a/rtengine/previewimage.h +++ b/rtengine/previewimage.h @@ -18,10 +18,16 @@ */ #pragma once -#include #include +namespace Glib +{ + +class ustring; + +} + namespace rtengine { diff --git a/rtengine/processingjob.h b/rtengine/processingjob.h index 6cdc6bd7c..9c3846958 100644 --- a/rtengine/processingjob.h +++ b/rtengine/processingjob.h @@ -24,7 +24,7 @@ namespace rtengine { -class ProcessingJobImpl : public ProcessingJob +class ProcessingJobImpl final : public ProcessingJob { public: diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 1b00d4218..13df614dc 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -21,10 +21,14 @@ namespace rtengine { + + + + // Aligned so the first entry starts on line 30 enum ProcEventCode { EvPhotoLoaded = 0, - EvProfileLoaded = 1, + obsolete_1 = 1, EvProfileChanged = 2, EvHistoryBrowsed = 3, EvBrightness = 4, @@ -38,9 +42,9 @@ enum ProcEventCode { EvClip = 12, EvLBrightness = 13, EvLContrast = 14, - EvLBlack = 15, - EvLHLCompr = 16, - EvLSHCompr = 17, + obsolete_15 = 15, // obsolete + obsolete_16 = 16, // obsolete + obsolete_17 = 17, // obsolete EvLLCurve = 18, EvShrEnabled = 19, EvShrRadius = 20, @@ -77,7 +81,7 @@ enum ProcEventCode { EvSHShadows = 51, EvSHHLTonalW = 52, EvSHSHTonalW = 53, - EvSHLContrast = 54, + obsolete_54 = 54, // obsolete EvSHRadius = 55, EvCTRotate = 56, EvCTHFlip = 57, @@ -89,7 +93,7 @@ enum ProcEventCode { EvCrop = 63, EvCACorr = 64, EvHREnabled = 65, - obsolete_66 = 66, //obsolete + obsolete_66 = 66, // obsolete EvHRMethod = 67, EvWProfile = 68, EvOProfile = 69, @@ -100,12 +104,12 @@ enum ProcEventCode { EvResizeMethod = 74, EvExif = 75, EvIPTC = 76, - EvResizeSpec = 77, + obsolete_77 = 77, // obsolete EvResizeWidth = 78, EvResizeHeight = 79, EvResizeEnabled = 80, EvProfileChangeNotification = 81, - EvSHHighQuality = 82, + obsolete_82 = 82, // obsolete EvPerspCorr = 83, EvLCPFile = 84, EvRGBrCurveLumamode = 85, @@ -133,7 +137,7 @@ enum ProcEventCode { EvHLComprThreshold = 107, EvResizeBoundingBox = 108, EvResizeAppliesTo = 109, - EvLAvoidColorShift = 110, + //EvLAvoidColorShift = 110, obsolete_111 = 111, // obsolete EvLRSTProtection = 112, EvDemosaicDCBIter = 113, @@ -153,12 +157,12 @@ enum ProcEventCode { EvFlatFieldBlurRadius = 127, EvFlatFieldBlurType = 128, EvAutoDIST = 129, - EvDPDNLumCurve = 130, - EvDPDNChromCurve = 131, - EvGAMMA = 132, - EvGAMPOS = 133, - EvGAMFREE = 134, - EvSLPOS = 135, + obsolete_130 = 130, // obsolete + obsolete_131 = 131, // obsolete + obsolete_132 = 132, // obsolete + obsolete_133 = 133, // obsolete + obsolete_134 = 134, // obsolete + obsolete_135 = 135, // obsolete EvPreProcessExpBlackzero = 136, EvPreProcessExpBlackone = 137, EvPreProcessExpBlacktwo = 138, @@ -231,7 +235,7 @@ enum ProcEventCode { EvCATAutoAdap = 205, EvPFCurve = 206, EvWBequal = 207, - EvWBequalbo = 208, + obsolete_208 = 208, EvGradientDegree = 209, EvGradientEnabled = 210, EvPCVignetteStrength = 211, @@ -272,7 +276,7 @@ enum ProcEventCode { EvLLHCurve = 246, EvLHHCurve = 247, EvDirPyrEqualizerThreshold = 248, - EvDPDNenhance = 249, + obsolete_249 = 249, EvBWMethodalg = 250, EvDirPyrEqualizerSkin = 251, EvDirPyrEqlgamutlab = 252, @@ -296,8 +300,8 @@ enum ProcEventCode { EvColorToningbluehigh = 270, EvColorToningbalance = 271, EvColorToningNeutral = 272, - EvColorToningsatlow = 273, - EvColorToningsathigh = 274, + obsolete_273 = 273, + obsolete_274 = 274, EvColorToningTwocolor = 275, EvColorToningNeutralcur = 276, EvColorToningLumamode = 277, @@ -322,7 +326,7 @@ enum ProcEventCode { EvDPDNsmet = 296, EvPreProcessDeadPixel = 297, EvDPDNCCCurve = 298, - EvDPDNautochroma = 299, + obsolete_299 = 299, EvDPDNLmet = 300, EvDPDNCmet = 301, EvDPDNC2met = 302, @@ -431,7 +435,7 @@ enum ProcEventCode { EvWavNPmet = 405, EvretinexMethod = 406, EvLneigh = 407, - EvLgain = 408, + obsolete_408 = 408, EvLoffs = 409, EvLstr = 410, EvLscal = 411, @@ -495,7 +499,7 @@ enum ProcEventCode { // EvPixelShiftMedian3 = 469, EvPixelShiftMotionMethod = 470, EvPixelShiftSmooth = 471, - EvPixelShiftLmmse = 472, + obsolete_472 = 472, EvPixelShiftEqualBright = 473, EvPixelShiftEqualBrightChannel = 474, EvCATtempout = 475, @@ -518,29 +522,706 @@ enum ProcEventCode { EvLEnabled = 492, EvPdShrEnabled = 493, EvPdShrMaskToggled = 494, - + EvLocallabSpotDeleted = 495, + EvLocallabSpotSelected = 496, + EvLocallabSpotName = 497, + EvLocallabSpotVisibility = 498, + EvLocallabSpotShape = 499, + EvLocallabSpotSpotMethod = 500, + EvLocallabSpotShapeMethod = 501, + EvLocallabSpotLocX = 502, + EvLocallabSpotLocXL = 503, + EvLocallabSpotLocY = 504, + EvLocallabSpotLocYT = 505, + EvLocallabSpotCenter = 506, + EvLocallabSpotCircrad = 507, + EvLocallabSpotQualityMethod = 508, + EvLocallabSpotTransit = 509, + EvLocallabSpotThresh = 510, + EvLocallabSpotIter = 511, + EvLocallabSpotSensiexclu = 512, + EvLocallabSpotStruc = 513, + EvlocallabEnabled = 514, + EvLocenacolor = 515, + Evlocallabcurvactiv = 516, + Evlocallablightness = 517, + Evlocallabcontrast = 518, + Evlocallabchroma = 519, + Evlocallabsensi = 520, + EvlocallabqualitycurveMethod = 521, + Evlocallabllshape = 522, + Evlocallabccshape = 523, + EvlocallabLHshape = 524, + EvlocallabHHshape = 525, + Evlocallabinvers = 526, + EvLocenaexpose = 527, + Evlocallabexpcomp = 528, + Evlocallabhlcompr = 529, + Evlocallabhlcomprthresh = 530, + Evlocallabblack = 531, + Evlocallabshcompr = 532, + Evlocallabwarm = 533, + Evlocallabsensiex = 534, + Evlocallabshapeexpos = 535, + EvLocenavibrance = 536, + EvlocallabSaturated = 537, + EvlocallabPastels = 538, + EvlocallabPastSatThreshold = 539, + EvlocallabProtectSkins = 540, + EvlocallabAvoidColorShift = 541, + EvlocallabPastSatTog = 542, + Evlocallabsensiv = 543, + EvlocallabSkinTonesCurve = 544, + EvLocenablur = 545, + Evlocallabradius = 546, + Evlocallabstrength = 547, + Evlocallabsensibn = 548, + EvlocallabblurMethod = 549, + Evlocallabactivlum = 550, + EvLocenatonemap = 551, + Evlocallabstren = 552, + Evlocallabgamma = 553, + Evlocallabestop = 554, + Evlocallabscaltm = 555, + Evlocallabrewei = 556, + Evlocallabsensitm = 557, + EvLocenareti = 558, + EvlocallabretinexMethod = 559, + Evlocallabstr = 560, + Evlocallabchrrt = 561, + Evlocallabneigh = 562, + Evlocallabvart = 563, + Evlocallabsensih = 564, + EvlocallabCTgainCurve = 565, + Evlocallabinversret = 566, + EvLocenasharp = 567, + Evlocallabsharradius = 568, + Evlocallabsharamount = 569, + Evlocallabshardamping = 570, + Evlocallabshariter = 571, + Evlocallabsensis = 572, + Evlocallabinverssha = 573, + EvLocenacbdl = 574, + EvlocallabEqualizer = 575, + Evlocallabchromacbdl = 576, + EvlocallabThresho = 577, + Evlocallabsensicb = 578, + // EvLocenadenoi = 579, + Evlocallabnoiselumf = 580, + Evlocallabnoiselumc = 581, + Evlocallabnoiselumdetail = 582, + Evlocallabnoiselequal = 583, + Evlocallabnoisechrof = 584, + Evlocallabnoisechroc = 585, + Evlocallabnoisechrodetail = 586, + Evlocallabadjblur = 587, + Evlocallabbilateral = 588, + Evlocallabsensiden = 589, + // Evlocallabavoid = 590, + Evlocallabsharcontrast = 591, + EvLocenacontrast = 592, + Evlocallablcradius = 593, + Evlocallablcamount = 594, + Evlocallablcdarkness = 595, + Evlocallablclightness = 596, + Evlocallabsensilc = 597, + Evlocallabdehaz = 598, + EvLocenasoft = 599, + Evlocallabstreng = 600, + Evlocallabsensisf = 601, + Evlocallabsharblur = 602, + obsolete_603 = 603, + EvlocallabshowmaskMethod = 604, + EvLocallabSpotSelectedWithMask = 605, + EvlocallabCCmaskshape = 606, + EvlocallabLLmaskshape = 607, + EvlocallabCCmaskexpshape = 608, + EvlocallabLLmaskexpshape = 609, + EvlocallabHHmaskshape = 610, + Evlocallabstructcol = 611, + Evlocallabstructexp = 612, + EvlocallabHHmaskexpshape = 613, + Evlocallabblendmaskcol = 614, + Evlocallabblendmaskexp = 615, + Evlocallabblurexpde = 616, + EvLocallabEnaColorMask = 617, + EvLocallabEnaExpMask = 618, + Evlocallabblurcolde = 619, + Evlocallabinversex = 620, + Evlocallabstructexlu = 621, + Evlocallabexpchroma = 622, + EvLocallabLabGridValue = 623, + EvLocallabLabstrengthgrid = 624, + EvLocallabgridMethod = 625, + EvLocenashadhigh = 626, + Evlocallabhighlights = 627, + Evlocallabh_tonalwidth = 628, + Evlocallabshadows = 629, + Evlocallabs_tonalwidth = 630, + Evlocallabsh_radius = 631, + Evlocallabsensihs = 632, + Evlocallabradmaskcol = 633, + Evlocallabradmaskexp = 634, + EvlocallabToolAdded = 635, + EvlocallabCCmaskSHshape = 636, + EvlocallabLLmaskSHshape = 637, + EvlocallabHHmaskSHshape = 638, + EvlocallabblendmaskSH = 639, + EvLocallabEnaSHMask = 640, + EvlocallabradmaskSH = 641, + EvlocallabblurSHde = 642, + Evlocallabinverssh = 643, + EvLocallabSpotbalan = 644, + Evlocallabchromaskexp = 645, + Evlocallabgammaskexp = 646, + Evlocallabslomaskexp = 647, + Evlocallabsoftradiusexp = 648, + Evlocallabchromaskcol = 649, + Evlocallabgammaskcol = 650, + Evlocallabslomaskcol = 651, + EvlocallabchromaskSH = 652, + EvlocallabgammaskSH = 653, + EvlocallabslomaskSH = 654, + Evlocallabsoftradiuscol = 655, + Evlocallabsoftradiusret = 656, + Evlocallabsoftradiuscb = 657, + EvLocallabSpotTransitweak = 658, + EvLocallabclarityml = 659, + EvLocallabcontresid = 660, + Evlocallabnoiselumf0 = 661, + Evlocallabnoiselumf2 = 662, + //EvLocallabblurcbdl = 663, + Evlocallabblendmaskcb = 664, + Evlocallabradmaskcb = 665, + Evlocallabchromaskcb = 666, + Evlocallabgammaskcb = 667, + Evlocallabslomaskcb = 668, + EvlocallabCCmaskcbshape = 669, + EvlocallabLLmaskcbshape = 670, + EvlocallabHHmaskcbshape = 671, + EvLocallabEnacbMask = 672, + EvlocallabToolRemovedWithoutRefresh = 673, + Evlocallabsoftradiustm = 674, + EvLocallabSpotTransitgrad = 675, + Evlocallabamount = 676, + Evlocallabsatur = 677, + EvlocallabCCmaskretishape = 678, + EvlocallabLLmaskretishape = 679, + EvlocallabHHmaskretishape = 680, + EvLocallabEnaretiMask = 681, + Evlocallabblendmaskreti = 682, + Evlocallabradmaskreti = 683, + Evlocallabchromaskreti = 684, + Evlocallabgammaskreti = 685, + Evlocallabslomaskreti = 686, + EvlocallabToolRemovedWithRefresh = 687, + EvLocallabEnaretiMasktmap = 688, + Evlocallabscalereti = 689, + Evlocallabdarkness = 690, + Evlocallablightnessreti = 691, + Evlocallablimd = 692, + Evlocallablaplace = 693, + EvlocallabsoftMethod = 694, + Evlocallabequilret = 695, + Evlocallabequiltm = 696, + Evlocallabfftwlc = 697, + Evlocallabfftwreti = 698, + // EvlocallabshowmasksoftMethod = 699, + Evlocallabshadex = 700, + EvlocallabexpMethod = 701, + Evlocallablaplacexp = 702, + Evlocallabbalanexp = 703, + Evlocallablinear = 704, + EvlocallabCCmasktmshape = 705, + EvlocallabLLmasktmshape = 706, + EvlocallabHHmasktmshape = 707, + EvLocallabEnatmMask = 708, + Evlocallabblendmasktm = 709, + Evlocallabradmasktm = 710, + Evlocallabchromasktm = 711, + Evlocallabgammasktm = 712, + Evlocallabslomasktm = 713, + // EvlocallabshowmasktmMethod = 714, + EvlocallablocalcontMethod = 715, + EvlocallabwavCurve = 716, + Evlocallablevelwav = 717, + Evlocallabresidcont = 718, + EvlocallabCCmaskblshape = 719, + EvlocallabLLmaskblshape = 720, + EvlocallabHHmaskblshape = 721, + EvLocallabEnablMask = 722, + // EvlocallabshowmaskblMethod = 723, + Evlocallabblendmaskbl = 724, + Evlocallabradmaskbl = 725, + Evlocallabchromaskbl = 726, + Evlocallabgammaskbl = 727, + Evlocallabslomaskbl = 728, + EvlocallabblMethod = 729, + EvlocallabmedMethod = 730, + Evlocallabitera = 731, + Evlocallabguidbl = 732, + Evlocallabepsbl = 733, + // EvlocallabshowmaskcolMethodinv = 734, + // EvlocallabshowmaskexpMethodinv = 735, + // EvlocallabshowmaskSHMethodinv = 736, + Evlocallabclarilres = 737, + Evlocallabclarisoft = 738, + Evlocallabclaricres = 739, + Evlocallabresidchro = 740, + Evlocallabgamm = 741, + Evlocallabfatamount = 742, + Evlocallabfatdetail = 743, + Evlocallabfatanchor = 744, + Evlocallabfatlevel = 745, + EvLocallabSpotCreated = 746, + EvlocallabexnoiseMethod = 747, + Evlocallabdepth = 748, + Evlocallabloglin = 749, + EvlocallabdehazeSaturation = 750, + Evlocallaboffs = 751, + EvlocallabCTtransCurve = 752, + Evlocallabcliptm = 753, + EvLocallabEnatmMaskaft = 754, + EvLocallabEnaExpMaskaft = 755, + Evlocallablapmasktm = 756, + Evlocallablapmaskreti = 757, + Evlocallablapmaskexp = 758, + Evlocallablapmaskcol = 759, + EvlocallablapmaskSH = 760, + Evlocallablapmaskcb = 761, + Evlocallablapmaskbl = 762, + Evlocallablaplac = 763, + Evlocallabdetailthr = 764, + Evlocallabfftwbl = 765, + Evlocallabisogr = 766, + Evlocallabstrengr = 767, + Evlocallabscalegr = 768, + EvlocallabLmaskshape = 769, + EvlocallabLmaskexpshape = 770, + EvlocallabLmaskSHshape = 771, + EvlocallabLmasktmshape = 772, + EvlocallabLmaskretishape = 773, + EvlocallabLmaskcbshape = 774, + EvlocallabLmaskblshape = 775, + EvlocallabLLmaskblshapewav = 776, + Evlocallabshadmaskbl = 777, + EvlocallabLLmaskcolshapewav = 778, + Evlocallabshadmaskcol = 779, + EvlocallabcsThreshold = 780, + EvlocallabcsThresholdblur = 781, + EvlocallabcsThresholdcol = 782, + Evlocallabdeltae = 783, + EvLocallabSpotscopemask = 784, + EvlocallabshMethod = 785, + EvlocallabEqualizersh = 786, + EvlocallabdetailSH = 787, + EvlocallabfatamountSH = 788, + EvlocallabfatanchorSH = 789, + Evlocallabshortc = 790, + EvLocallabSpotlumask = 791, + EvlocallabgamSH = 792, + EvlocallabsloSH = 793, + Evlocallabsavrest = 794, + Evlocallabrecurs = 795, + EvLocallabmergecolMethod = 796, + Evlocallabopacol = 797, + Evlocallabrgbshape = 798, + EvLocallabtoneMethod = 799, + EvLocallabspecial = 800, + Evlocallabconthrcol = 801, + EvLocallabmerMethod = 802, + Evlocallabstrumaskcol = 803, + Evlocallabstrumaskbl = 804, + EvLocallabtoolcol = 805, + Evlocallabtoolbl = 806, + EvlocallabHHhmaskshape = 807, + EvlocallabCCmaskvibshape = 808, + EvlocallabLLmaskvibshape = 809, + EvlocallabHHmaskvibshape = 810, + // EvlocallabshowmaskvibMethod = 811, + EvLocallabEnavibMask = 812, + Evlocallabblendmaskvi = 813, + Evlocallabradmaskvib = 814, + Evlocallabchromaskvib = 815, + Evlocallabgammaskvib = 816, + Evlocallabslomaskvib = 817, + Evlocallablapmaskvib = 818, + EvlocallabLmaskvibshape = 819, + EvLocallabLabGridmergValue = 820, + Evlocallabmercol = 821, + Evlocallabmerlucol = 822, + Evlocallabstrmaskexp = 823, + Evlocallabangmaskexp = 824, + Evlocallabstrexp = 825, + Evlocallabangexp = 826, + EvlocallabstrSH = 827, + EvlocallabangSH = 828, + Evlocallabstrcol = 829, + Evlocallabangcol = 830, + Evlocallabstrcolab = 831, + EvLocallabSpotfeather = 832, + Evlocallabstrcolh = 833, + Evlocallabstrvib = 834, + Evlocallabangvib = 835, + Evlocallabstrvibab = 836, + Evlocallabstrvibh = 837, + EvLocallabSpotcomplexMethod = 838, + Evlocallabclshape = 839, + Evlocallablcshape = 840, + Evlocallabblurcol = 841, + Evlocallabcontcol = 842, + EvLocallabfftColorMask = 843, + EvLocenalog = 844, + EvLocallabAuto = 845, + EvlocallabsourceGray = 846, + obsolete_847 = 847, + EvlocallabAutogray = 848, + EvlocallabblackEv = 849, + EvlocallabwhiteEv = 850, + EvlocallabtargetGray = 851, + Evlocallabdetail = 852, + Evlocallabsensilog = 853, + Evlocallabfullimage = 854, + Evlocallabbaselog = 855, + Evlocallabresidblur = 856, + Evlocallabblurlc = 857, + Evlocallablevelblur = 858, + EvlocallabwavCurvelev = 859, + EvlocallabwavCurvecon = 860, + Evlocallabsigma = 861, + Evlocallaboriglc = 862, + Evlocallabsigmadc = 863, + Evlocallabdeltad = 864, + EvlocallabwavCurvecomp = 865, + //Evlocallabfatres = 866, + EvLocallabSpotbalanh = 867, + EvlocallabwavCurveden = 868, + EvlocallabHHmasklcshape = 869, + EvlocallabCCmasklcshape = 870, + EvlocallabLLmasklcshape = 871, + EvLocallabEnalcMask = 872, + // EvlocallabshowmasklcMethod = 873, + Evlocallabblendmasklc = 874, + Evlocallabradmasklc = 875, + Evlocallabchromasklc = 876, + EvlocallabLmasklcshape = 877, + Evlocallabchromalev = 878, + Evlocallabchromablu = 879, + Evlocallaboffset = 880, + Evlocallabwavblur = 881, + Evlocallabwavcont = 882, + Evlocallabwavcomp = 883, + Evlocallabwavcompre = 884, + EvlocallabwavCurvecompre = 885, + Evlocallabresidcomp = 886, + Evlocallabthreswav = 887, + Evlocallabstrwav = 888, + Evlocallabangwav = 889, + Evlocallabwavgradl = 890, + Evlocallabstrlog = 891, + Evlocallabanglog = 892, + EvLocallabSpotcolorde = 893, + // EvlocallabshowmasksharMethod = 894, + //Evlocallabshowreset = 895, + Evlocallabstrengthw = 896, + Evlocallabradiusw = 897, + Evlocallabdetailw = 898, + Evlocallabgradw = 899, + Evlocallabtloww = 900, + Evlocallabthigw = 901, + EvlocallabwavCurveedg = 902, + EvlocallablocaledgMethod = 903, + Evlocallabwavedg = 904, + Evlocallabedgw = 905, + Evlocallabbasew = 906, + EvlocallablocalneiMethod = 907, + Evlocallabwaveshow = 908, + EvLocallabSpotwavMethod = 909, + EvlocallabchroMethod = 910, + Evlocallabstrbl = 911, + Evlocallabsigmadr = 912, + Evlocallabsigmabl = 913, + Evlocallabsigmaed = 914, + Evlocallabresidsha = 915, + Evlocallabresidshathr = 916, + Evlocallabresidhi = 917, + Evlocallabresidhithr = 918, + Evlocallabsigmalc = 919, + Evlocallabsigmalc2 = 920, + Evlocallabblwh = 921, + EvlocallabcomplexityWithRefresh = 922, + // EvlocallabcomplexityWithoutRefresh = 923, + EvLocallabSpotcolorscope = 924, + EvlocallabshowmasktypMethod = 925, + Evlocallabshadmaskblsha = 926, + EvLocena_mask = 927, + Evlocallabsensimask = 928, + Evlocallabblendmask = 929, + EvLocallabEnaMask = 930, + Evlocallabradmask = 931, + Evlocallablapmask = 932, + Evlocallabchromask = 933, + Evlocallabgammask = 934, + Evlocallabslopmask = 935, + EvlocallabCCmask_shape = 936, + EvlocallabLLmask_shape = 937, + EvlocallabHHmask_shape = 938, + EvLocallabtoolmask = 939, + Evlocallabstrumaskmask = 940, + EvlocallabHHhmask_shape = 941, + EvLocallabfftmask = 942, + Evlocallabblurmask = 943, + Evlocallabcontmask = 944, + Evlocallabshadmask = 945, + EvlocallabLmask_shape = 946, + EvlocallabLLmask_shapewav = 947, + EvlocallabcsThresholdmask = 948, + Evlocallabstr_mask = 949, + Evlocallabang_mask = 950, + Evlocallabsoftradiusmask = 951, + Evlocallabblendmaskab = 952, + EvLocallabSpotprevMethod = 953, + Evlocallabactiv = 954, + EvlocallabCHshape = 955, + EvlocallabquaMethod = 956, + Evlocallabhishow = 957, + Evlocallabinvbl = 958, + Evlocallabcatad = 959, + Evlocallabciecam = 960, + Evlocallabsourceabs = 961, + Evlocallabtargabs = 962, + Evlocallabsurround = 963, + Evlocallabsaturl = 964, + Evlocallabcontl = 965, + EvlocallabCCmaskshapeL = 966, + EvlocallabLLmaskshapeL = 967, + EvlocallabHHmaskshapeL = 968, + EvLocallabEnaLMask = 969, + EvLocallabblendmaskL = 970, + EvLocallabradmaskL = 971, + EvLocallabchromaskL = 972, + EvlocallabLmaskshapeL = 973, + Evlocallablightl = 974, + //EvlocallabLshapeL = 975, + Evlocallabcontq = 976, + Evlocallabsursour = 977, + Evlocallablightq = 978, + Evlocallabcolorfl = 979, + Evlocallabrepar = 980, + EvlocallabwavCurvehue = 981, + Evlocallablevelthr = 982, + Evlocallablevelthrlow = 983, + Evlocallabusemask1 = 984, + Evlocallablnoiselow = 985, + Evlocallabrecothres = 986, + Evlocallablowthres = 987, + Evlocallabhigthres = 988, + Evlocallabrecothresd = 989, + Evlocallablowthresd = 990, + Evlocallabhigthresd = 991, + Evlocallabinvmaskd = 992, + Evlocallabinvmask = 993, + Evlocallabdecayd = 994, + Evlocallabrecothresc = 995, + Evlocallablowthresc = 996, + Evlocallabhigthresc = 997, + Evlocallabdecayc = 998, + Evlocallabmidthresd = 999, + Evlocallabrecothresl = 1000, + Evlocallablowthresl = 1001, + Evlocallabhigthresl = 1002, + Evlocallabdecayl = 1003, + Evlocallabrecothrese = 1004, + Evlocallablowthrese = 1005, + Evlocallabhigthrese = 1006, + Evlocallabdecaye = 1007, + Evlocallabrecothress = 1008, + Evlocallablowthress = 1009, + Evlocallabhigthress = 1010, + Evlocallabdecays = 1011, + Evlocallabrecothresv = 1012, + Evlocallablowthresv = 1013, + Evlocallabhigthresv = 1014, + Evlocallabdecayv = 1015, + Evlocallabrecothresw = 1016, + Evlocallablowthresw = 1017, + Evlocallabhigthresw = 1018, + Evlocallabdecayw = 1019, + Evlocallabmidthresdch = 1020, + Evlocallabrecothrest = 1021, + Evlocallablowthrest = 1022, + Evlocallabhigthrest = 1023, + Evlocallabdecayt = 1024, + Evlocallabrecothrescb = 1025, + Evlocallablowthrescb = 1026, + Evlocallabhigthrescb = 1027, + Evlocallabdecaycb = 1028, + Evlocallabrecothresr = 1029, + Evlocallablowthresr = 1030, + Evlocallabhigthresr = 1031, + Evlocallabdecayr = 1032, + Evlocallabnlstr = 1033, + Evlocallabnldet = 1034, + Evlocallabnlpat = 1035, + Evlocallabnlrad = 1036, + Evlocallabnlgam = 1037, + Evlocallabdivgr = 1038, + EvLocallabSpotavoidrad = 1039, + //EvLocallabSpotavoidmun = 1040, + Evlocallabcontthres = 1041, + Evlocallabnorm = 1042, + Evlocallabreparw = 1043, + Evlocallabreparcol = 1044, + Evlocallabreparden = 1045, + Evlocallabreparsh = 1046, + Evlocallabreparexp = 1047, + Evlocallabrepartm = 1048, + Evlocallabchroml = 1049, + Evlocallabresidgam = 1050, + Evlocallabresidslop = 1051, + Evlocallabnoisegam = 1052, + Evlocallabgamlc = 1053, + Evlocallabgamc = 1054, + Evlocallabgamex = 1055, + EvLocenacie = 1056, + Evlocallabreparcie = 1057, + EvlocallabAutograycie = 1058, + EvlocallabsourceGraycie = 1059, + Evlocallabsourceabscie = 1060, + Evlocallabsursourcie = 1061, + Evlocallabsaturlcie = 1062, + Evlocallabchromlcie = 1063, + Evlocallablightlcie = 1064, + Evlocallablightqcie = 1065, + Evlocallabcontlcie = 1066, + Evlocallabcontthrescie = 1067, + Evlocallabcontqcie = 1068, + Evlocallabcolorflcie = 1069, + Evlocallabtargabscie = 1070, + EvlocallabtargetGraycie = 1071, + Evlocallabcatadcie = 1072, + Evlocallabdetailcie = 1073, + Evlocallabsurroundcie = 1074, + Evlocallabsensicie = 1075, + Evlocallabmodecie = 1076, + Evlocallabrstprotectcie = 1077, + Evlocallabsigmoidldacie = 1078, + Evlocallabsigmoidthcie = 1079, + Evlocallabsigmoidblcie = 1080, + Evlocallabsigmoidqjcie = 1081, + Evlocallabhuecie = 1082, + Evlocallabjabcie = 1083, + Evlocallablightjzcie = 1084, + Evlocallabcontjzcie = 1085, + Evlocallabchromjzcie = 1086, + Evlocallabhuejzcie = 1087, + Evlocallabsigmoidldajzcie = 1088, + Evlocallabsigmoidthjzcie = 1089, + Evlocallabsigmoidbljzcie = 1090, + Evlocallabadapjzcie = 1091, + Evlocallabmodecam = 1092, + Evlocallabhljzcie = 1093, + Evlocallabhlthjzcie = 1094, + Evlocallabshjzcie = 1095, + Evlocallabshthjzcie = 1096, + Evlocallabradjzcie = 1097, + EvlocallabCHshapejz = 1098, + Evlocallabjz100 = 1099, + Evlocallabpqremap = 1100, + EvlocallabLHshapejz = 1101, + Evlocallabshargam = 1102, + Evlocallabvibgam = 1103, + EvLocallabtoneMethodcie = 1104, + Evlocallabshapecie = 1105, + EvLocallabtoneMethodcie2 = 1106, + Evlocallabshapecie2 = 1107, + Evlocallabshapejz = 1108, + Evlocallabshapecz = 1109, + Evlocallabshapeczjz = 1110, + Evlocallabforcejz = 1111, + Evlocallabpqremapcam16 = 1112, + EvLocallabEnacieMask = 1113, + EvlocallabCCmaskcieshape = 1114, + EvlocallabLLmaskcieshape = 1115, + EvlocallabHHmaskcieshape = 1116, + Evlocallabblendmaskcie = 1117, + Evlocallabradmaskcie = 1118, + Evlocallabchromaskcie = 1119, + EvlocallabLmaskcieshape = 1120, + Evlocallabrecothrescie = 1121, + Evlocallablowthrescie = 1122, + Evlocallabhigthrescie = 1123, + Evlocallabdecaycie = 1124, + Evlocallablapmaskcie = 1125, + Evlocallabgammaskcie = 1126, + Evlocallabslomaskcie = 1127, + Evlocallabqtoj = 1128, + Evlocallabsaturjzcie = 1129, + EvLocallabSpotdenoichmask = 1130, + Evlocallabsigmalcjz = 1131, + EvlocallabcsThresholdjz = 1132, + EvlocallabwavCurvejz = 1133, + Evlocallabclarilresjz = 1134, + Evlocallabclaricresjz = 1135, + Evlocallabclarisoftjz = 1136, + EvlocallabHHshapejz = 1137, + Evlocallabsoftjzcie = 1138, + Evlocallabthrhjzcie = 1139, + Evlocallabchjzcie = 1140, + Evlocallabstrsoftjzcie = 1141, + EvlocallabblackEvjz = 1142, + EvlocallabwhiteEvjz = 1143, + Evlocallablogjz = 1144, + Evlocallabtargetjz = 1145, + Evlocallabforcebw = 1146, + Evlocallabsigjz = 1147, + Evlocallabsigq = 1148, + Evlocallablogcie = 1149, NUMOFEVENTS - }; -class ProcEvent { + + +class ProcEvent +{ public: ProcEvent(): code_(0) {} ProcEvent(ProcEventCode code): code_(code) {} explicit ProcEvent(int code): code_(code) {} - operator int() const { return code_; } + operator int() const + { + return code_; + } private: int code_; }; -inline bool operator ==(ProcEvent a, ProcEvent b) { return int(a) == int(b); } -inline bool operator ==(ProcEvent a, ProcEventCode b) { return int(a) == int(b); } -inline bool operator ==(ProcEventCode a, ProcEvent b) { return int(a) == int(b); } -inline bool operator !=(ProcEvent a, ProcEvent b) { return int(a) != int(b); } -inline bool operator !=(ProcEvent a, ProcEventCode b) { return int(a) != int(b); } -inline bool operator !=(ProcEventCode a, ProcEvent b) { return int(a) != int(b); } +inline bool operator ==(ProcEvent a, ProcEvent b) +{ + return int(a) == int(b); +} +inline bool operator ==(ProcEvent a, ProcEventCode b) +{ + return int(a) == int(b); +} +inline bool operator ==(ProcEventCode a, ProcEvent b) +{ + return int(a) == int(b); +} +inline bool operator !=(ProcEvent a, ProcEvent b) +{ + return int(a) != int(b); +} +inline bool operator !=(ProcEvent a, ProcEventCode b) +{ + return int(a) != int(b); +} +inline bool operator !=(ProcEventCode a, ProcEvent b) +{ + return int(a) != int(b); +} } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ba6fc237b..a421be9b3 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -27,6 +27,7 @@ #include #include "color.h" +#include "colortemp.h" #include "curves.h" #include "procparams.h" #include "utils.h" @@ -64,6 +65,40 @@ Glib::ustring expandRelativePath(const Glib::ustring &procparams_fname, const Gl return absPath; } +Glib::ustring expandRelativePath2(const Glib::ustring &procparams_fname, const Glib::ustring &procparams_fname2, const Glib::ustring &prefix, Glib::ustring embedded_fname) +{ + #if defined (WIN32) + // if this is Windows, replace any "/" in the filename with "\\" + size_t pos = embedded_fname.find("/"); + while (pos != string::npos) { + embedded_fname.replace(pos, 1, "\\"); + pos = embedded_fname.find("/", pos); + } + #endif + #if !defined (WIN32) + // if this is not Windows, replace any "\\" in the filename with "/" + size_t pos = embedded_fname.find("\\"); + while (pos != string::npos) { + embedded_fname.replace(pos, 1, "/"); + pos = embedded_fname.find("\\", pos); + } + #endif + + // if embedded_fname is not already an absolute path, + // try to convert it using procparams_fname (the directory of the raw file) as prefix + Glib::ustring rPath = expandRelativePath(procparams_fname, prefix, embedded_fname); + if (rPath.length() >= prefix.length() + && !Glib::file_test(rPath.substr(prefix.length()), Glib::FILE_TEST_IS_REGULAR) + && !procparams_fname2.empty() + && Glib::path_is_absolute(procparams_fname2)) { + // embedded_fname is not a valid path; + // try with procparams_fname2 (the path defined in Preferences) as a prefix + rPath = expandRelativePath(procparams_fname2 + G_DIR_SEPARATOR_S, prefix, embedded_fname); + } + return(rPath); +} + + Glib::ustring relativePathIfInside(const Glib::ustring &procparams_fname, bool fnameAbsolute, Glib::ustring embedded_fname) { if (fnameAbsolute || embedded_fname.empty() || !Glib::path_is_absolute(procparams_fname)) { @@ -92,6 +127,25 @@ Glib::ustring relativePathIfInside(const Glib::ustring &procparams_fname, bool f return prefix + embedded_fname.substr(dir1.length()); } +Glib::ustring relativePathIfInside2(const Glib::ustring &procparams_fname, const Glib::ustring &procparams_fname2, bool fnameAbsolute, Glib::ustring embedded_fname) +{ + // try to convert embedded_fname to a path relative to procparams_fname + // (the directory of the raw file) + // (note: fnameAbsolute seems to be always true, so this will never return a relative path) + Glib::ustring rPath = relativePathIfInside(procparams_fname, fnameAbsolute, embedded_fname); + if ((Glib::path_is_absolute(rPath) + || (rPath.length() >= 5 && rPath.substr(0, 5) == "file:" && Glib::path_is_absolute(rPath.substr(5)))) + && !procparams_fname2.empty() + && Glib::path_is_absolute(procparams_fname2)) { + // if path is not relative to the directory of the raw file, + // try to convert embedded_fname to a path relative to procparams_fname2 + // (the path defined in Preferences) + rPath = relativePathIfInside(procparams_fname2 + G_DIR_SEPARATOR_S, false, embedded_fname); + } + return(rPath); +} + + void getFromKeyfile( const Glib::KeyFile& keyfile, const Glib::ustring& group_name, @@ -112,6 +166,16 @@ void getFromKeyfile( value = keyfile.get_double(group_name, key); } +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + float& value +) +{ + value = static_cast(keyfile.get_double(group_name, key)); +} + void getFromKeyfile( const Glib::KeyFile& keyfile, const Glib::ustring& group_name, @@ -132,6 +196,16 @@ void getFromKeyfile( value = keyfile.get_string(group_name, key); } +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + std::vector& value +) +{ + value = keyfile.get_integer_list(group_name, key); +} + void getFromKeyfile( const Glib::KeyFile& keyfile, const Glib::ustring& group_name, @@ -143,6 +217,21 @@ void getFromKeyfile( rtengine::sanitizeCurve(value); } +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + rtengine::procparams::FilmNegativeParams::RGB& value +) +{ + const std::vector v = keyfile.get_double_list(group_name, key); + if(v.size() >= 3) { + value.r = v[0]; + value.g = v[1]; + value.b = v[2]; + } +} + template bool assignFromKeyfile( const Glib::KeyFile& keyfile, @@ -209,6 +298,16 @@ void putToKeyfile( keyfile.set_integer(group_name, key, value); } +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + float value, + Glib::KeyFile& keyfile +) +{ + keyfile.set_double(group_name, key, static_cast(value)); +} + void putToKeyfile( const Glib::ustring& group_name, const Glib::ustring& key, @@ -261,6 +360,18 @@ void putToKeyfile( keyfile.set_double_list(group_name, key, list); } +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + const rtengine::procparams::FilmNegativeParams::RGB& value, + Glib::KeyFile& keyfile +) +{ + const std::vector vec = { value.r, value.g, value.b }; + keyfile.set_double_list(group_name, key, vec); +} + + template bool saveToKeyfile( bool save, @@ -308,11 +419,15 @@ namespace rtengine namespace procparams { +const short SpotParams::minRadius = 1; +const short SpotParams::maxRadius = 400; + + ToneCurveParams::ToneCurveParams() : autoexp(false), clip(0.02), hrenabled(false), - method("Blend"), + method("Coloropp"), expcomp(0), curve{ DCT_Linear @@ -328,6 +443,8 @@ ToneCurveParams::ToneCurveParams() : saturation(0), shcompr(50), hlcompr(0), + hlbl(0), + hlth(1.0), hlcomprthresh(0), histmatching(false), fromHistMatching(false), @@ -353,6 +470,8 @@ bool ToneCurveParams::isPanningRelatedChange(const ToneCurveParams& other) const && saturation == other.saturation && shcompr == other.shcompr && hlcompr == other.hlcompr + && hlbl == other.hlbl + && hlth == other.hlth && hlcomprthresh == other.hlcomprthresh && histmatching == other.histmatching && clampOOG == other.clampOOG); @@ -376,6 +495,8 @@ bool ToneCurveParams::operator ==(const ToneCurveParams& other) const && saturation == other.saturation && shcompr == other.shcompr && hlcompr == other.hlcompr + && hlbl == other.hlbl + && hlth == other.hlth && hlcomprthresh == other.hlcomprthresh && histmatching == other.histmatching && fromHistMatching == other.fromHistMatching @@ -449,6 +570,7 @@ RetinexParams::RetinexParams() : shadows(0), stonalwidth(80), radius(40), + complexmethod("normal"), retinexMethod("high"), retinexcolorspace("Lab"), gammaretinex("none"), @@ -486,6 +608,7 @@ bool RetinexParams::operator ==(const RetinexParams& other) const && shadows == other.shadows && stonalwidth == other.stonalwidth && radius == other.radius + && complexmethod == other.complexmethod && retinexMethod == other.retinexMethod && retinexcolorspace == other.retinexcolorspace && gammaretinex == other.gammaretinex @@ -542,7 +665,7 @@ LCurveParams::LCurveParams() : brightness(0), contrast(0), chromaticity(0), - avoidcolorshift(false), + gamutmunselmethod("MUN"), rstprotection(0), lcredsk(true) { @@ -564,7 +687,7 @@ bool LCurveParams::operator ==(const LCurveParams& other) const && brightness == other.brightness && contrast == other.contrast && chromaticity == other.chromaticity - && avoidcolorshift == other.avoidcolorshift + && gamutmunselmethod == other.gamutmunselmethod && rstprotection == other.rstprotection && lcredsk == other.lcredsk; } @@ -604,7 +727,6 @@ bool RGBCurvesParams::operator !=(const RGBCurvesParams& other) const return !(*this == other); } - LocalContrastParams::LocalContrastParams(): enabled(false), radius(80), @@ -614,7 +736,6 @@ LocalContrastParams::LocalContrastParams(): { } - bool LocalContrastParams::operator==(const LocalContrastParams &other) const { return @@ -625,13 +746,11 @@ bool LocalContrastParams::operator==(const LocalContrastParams &other) const && lightness == other.lightness; } - bool LocalContrastParams::operator!=(const LocalContrastParams &other) const { return !(*this == other); } - const double ColorToningParams::LABGRID_CORR_MAX = 12000.f; const double ColorToningParams::LABGRID_CORR_SCALE = 3.f; @@ -644,46 +763,46 @@ ColorToningParams::LabCorrectionRegion::LabCorrectionRegion(): power(1), hueMask{ FCT_MinMaxCPoints, - 0.166666667, - 1., - 0.35, - 0.35, - 0.8287775246, - 1., - 0.35, - 0.35 + 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 - }, + 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 - }, + 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 + return + a == other.a && b == other.b && saturation == other.saturation && slope == other.slope @@ -696,13 +815,11 @@ bool ColorToningParams::LabCorrectionRegion::operator==(const LabCorrectionRegio && channel == other.channel; } - bool ColorToningParams::LabCorrectionRegion::operator!=(const LabCorrectionRegion &other) const { return !(*this == other); } - ColorToningParams::ColorToningParams() : enabled(false), autosat(true), @@ -741,7 +858,7 @@ ColorToningParams::ColorToningParams() : strength(50), balance(0), hlColSat(60, 80, false), - shadowsColSat (80, 208, false), + shadowsColSat(80, 208, false), clcurve{ DCT_NURBS, 0.00, @@ -844,7 +961,7 @@ void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vecto float highSat = 0.f; float minTmp, maxTmp; -// Fill the shadow mixer values of the Color TOning tool + // Fill the shadow mixer values of the Color TOning tool low[0] = float (redlow) / 100.f; // [-1. ; +1.] low[1] = float (greenlow) / 100.f; // [-1. ; +1.] low[2] = float (bluelow) / 100.f; // [-1. ; +1.] @@ -886,7 +1003,7 @@ void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vecto low[0] = low[1] = low[2] = 1.f; } -// Fill the mid-tones mixer values of the Color TOning tool + // Fill the mid-tones mixer values of the Color TOning tool med[0] = float (redmed) / 100.f; // [-1. ; +1.] med[1] = float (greenmed) / 100.f; // [-1. ; +1.] med[2] = float (bluemed) / 100.f; // [-1. ; +1.] @@ -1268,23 +1385,42 @@ WBParams::WBParams() : temperature(6504), green(1.0), equal(1.0), - tempBias(0.0) + tempBias(0.0), + observer(ColorTemp::DEFAULT_OBSERVER), + itcwb_thres(34), + itcwb_precis(3), + itcwb_size(3), + itcwb_delta(2), + itcwb_fgreen(5), + itcwb_rgreen(1), + itcwb_nopurple(true), + itcwb_sorted(false), + itcwb_forceextra(false), + itcwb_sampling(false) + { } bool WBParams::isPanningRelatedChange(const WBParams& other) const { - return ! - (enabled == other.enabled - && ((method == "Camera" && other.method == "Camera") - || - (method == other.method - && temperature == other.temperature - && green == other.green - && equal == other.equal - && tempBias == other.tempBias) + return + !( + enabled == other.enabled + && ( + ( + method == "Camera" + && other.method == "Camera" + ) + || ( + method == other.method + && temperature == other.temperature + && green == other.green + && equal == other.equal + && tempBias == other.tempBias + && observer == other.observer + ) ) - ); + ); } bool WBParams::operator ==(const WBParams& other) const @@ -1295,7 +1431,19 @@ bool WBParams::operator ==(const WBParams& other) const && temperature == other.temperature && green == other.green && equal == other.equal - && tempBias == other.tempBias; + && tempBias == other.tempBias + && observer == other.observer + && itcwb_thres == other.itcwb_thres + && itcwb_precis == other.itcwb_precis + && itcwb_size == other.itcwb_size + && itcwb_delta == other.itcwb_delta + && itcwb_fgreen == other.itcwb_fgreen + && itcwb_rgreen == other.itcwb_rgreen + && itcwb_nopurple == other.itcwb_nopurple + && itcwb_sorted == other.itcwb_sorted + && itcwb_forceextra == other.itcwb_forceextra + && itcwb_sampling == other.itcwb_sampling; + } bool WBParams::operator !=(const WBParams& other) const @@ -1307,7 +1455,8 @@ const std::vector& WBParams::getWbEntries() { static const std::vector wb_entries = { {"Camera", WBEntry::Type::CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f}, - {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, + {"autitcgreen", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOITCGREEN"), 0, 1.f, 1.f, 0.f}, + {"autold", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTOOLD"), 0, 1.f, 1.f, 0.f}, {"Daylight", WBEntry::Type::DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f}, {"Cloudy", WBEntry::Type::CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f}, {"Shade", WBEntry::Type::SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f}, @@ -1341,7 +1490,6 @@ const std::vector& WBParams::getWbEntries() // Should remain the last one {"Custom", WBEntry::Type::CUSTOM, M("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f, 0.f} }; - return wb_entries; } @@ -1361,8 +1509,11 @@ ColorAppearanceParams::ColorAppearanceParams() : DCT_Linear }, curveMode(TcMode::LIGHT), - curveMode2(TcMode::LIGHT), + curveMode2(TcMode::BRIGHT), curveMode3(CtcMode::CHROMA), + complexmethod("normal"), + modelmethod("16"), + catmethod("clas"), surround("Average"), surrsrc("Average"), adapscen(2000.0), @@ -1372,6 +1523,7 @@ ColorAppearanceParams::ColorAppearanceParams() : adaplum(16), badpixsl(0), wbmodel("RawT"), + illum("i50"), algo("No"), contrast(0.0), qcontrast(0.0), @@ -1386,10 +1538,11 @@ ColorAppearanceParams::ColorAppearanceParams() : gamut(true), datacie(false), tonecie(false), - tempout(5000), + tempout(5003), + autotempout(true), ybout(18), greenout(1.0), - tempsc(5000), + tempsc(5003), greensc(1.0) { } @@ -1408,6 +1561,9 @@ bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) cons && curveMode == other.curveMode && curveMode2 == other.curveMode2 && curveMode3 == other.curveMode3 + && complexmethod == other.complexmethod + && modelmethod == other.modelmethod + && catmethod == other.catmethod && surround == other.surround && surrsrc == other.surrsrc && adapscen == other.adapscen @@ -1417,6 +1573,7 @@ bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) cons && adaplum == other.adaplum && badpixsl == other.badpixsl && wbmodel == other.wbmodel + && illum == other.illum && algo == other.algo && contrast == other.contrast && qcontrast == other.qcontrast @@ -1432,6 +1589,7 @@ bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) cons && datacie == other.datacie && tonecie == other.tonecie && tempout == other.tempout + && autotempout == other.autotempout && ybout == other.ybout && greenout == other.greenout && tempsc == other.tempsc @@ -1617,6 +1775,47 @@ bool EPDParams::operator !=(const EPDParams& other) const return !(*this == other); } +SpotEntry::SpotEntry() : + radius(25), + feather(1.f), + opacity(1.f) +{ +} + +float SpotEntry::getFeatherRadius() const +{ + return radius * (1.f + feather); +} + +bool SpotEntry::operator ==(const SpotEntry& other) const +{ + return other.sourcePos == sourcePos && other.targetPos == targetPos && + other.radius == radius && other.feather == feather && other.opacity == opacity; +} + +bool SpotEntry::operator !=(const SpotEntry& other) const +{ + return other.sourcePos != sourcePos || other.targetPos != targetPos || + other.radius != radius || other.feather != feather || other.opacity != opacity; +} + +SpotParams::SpotParams() : + enabled(false) +{ + entries.clear (); +} + +bool SpotParams::operator ==(const SpotParams& other) const +{ + return enabled == other.enabled && entries == other.entries; +} + +bool SpotParams::operator !=(const SpotParams& other) const +{ + return !(*this == other); +} + + FattalToneMappingParams::FattalToneMappingParams() : enabled(false), threshold(30), @@ -1667,6 +1866,30 @@ bool SHParams::operator !=(const SHParams& other) const return !(*this == other); } +ToneEqualizerParams::ToneEqualizerParams() : + enabled(false), + bands{0, 0, 0, 0, 0}, + regularization(0), + show_colormap(false), + pivot(0) +{ +} + +bool ToneEqualizerParams::operator ==(const ToneEqualizerParams &other) const +{ + return + enabled == other.enabled + && bands == other.bands + && regularization == other.regularization + && show_colormap == other.show_colormap + && pivot == other.pivot; +} + +bool ToneEqualizerParams::operator !=(const ToneEqualizerParams &other) const +{ + return !(*this == other); +} + CropParams::CropParams() : enabled(false), x(-1), @@ -1676,7 +1899,7 @@ CropParams::CropParams() : fixratio(true), ratio("As Image"), orientation("As Image"), - guide("Frame") + guide(Guide::FRAME) { } @@ -1732,13 +1955,14 @@ bool CoarseTransformParams::operator !=(const CoarseTransformParams& other) cons } CommonTransformParams::CommonTransformParams() : + method("log"), autofill(true) { } bool CommonTransformParams::operator ==(const CommonTransformParams& other) const { - return autofill == other.autofill; + return method == other.method && autofill == other.autofill; } bool CommonTransformParams::operator !=(const CommonTransformParams& other) const @@ -1850,16 +2074,49 @@ LensProfParams::LcMode LensProfParams::getMethodNumber(const Glib::ustring& mode } PerspectiveParams::PerspectiveParams() : + method("simple"), + render(true), horizontal(0.0), - vertical(0.0) + vertical(0.0), + camera_crop_factor(0.0), + camera_focal_length(0.0), + camera_pitch(0.0), + camera_roll(0.0), + camera_shift_horiz(0.0), + camera_shift_vert(0.0), + camera_yaw(0.0), + projection_pitch(0.0), + projection_rotate(0.0), + projection_shift_horiz(0.0), + projection_shift_vert(0.0), + projection_yaw(0.0) { } bool PerspectiveParams::operator ==(const PerspectiveParams& other) const { return - horizontal == other.horizontal - && vertical == other.vertical; + method == other.method + && render == other.render + && horizontal == other.horizontal + && vertical == other.vertical + && camera_focal_length == other.camera_focal_length + && camera_crop_factor == other.camera_crop_factor + && camera_pitch == other.camera_pitch + && camera_roll == other.camera_roll + && camera_shift_horiz == other.camera_shift_horiz + && camera_shift_vert == other.camera_shift_vert + && camera_yaw == other.camera_yaw + && projection_shift_horiz == other.projection_shift_horiz + && projection_shift_vert == other.projection_shift_vert + && projection_rotate == other.projection_rotate + && projection_pitch == other.projection_pitch + && projection_yaw == other.projection_yaw + // Lines could still be equivalent if the vectors aren't, but this is + // rare and a small issue. Besides, a proper comparison requires lots + // more code which introduces clutter. + && control_line_values == other.control_line_values + && control_line_types == other.control_line_types; } bool PerspectiveParams::operator !=(const PerspectiveParams& other) const @@ -2075,6 +2332,8 @@ ResizeParams::ResizeParams() : dataspec(3), width(900), height(900), + longedge(900), + shortedge(900), allowUpscaling(false) { } @@ -2089,6 +2348,8 @@ bool ResizeParams::operator ==(const ResizeParams& other) const && dataspec == other.dataspec && width == other.width && height == other.height + && longedge == other.longedge + && shortedge == other.shortedge && allowUpscaling == other.allowUpscaling; } @@ -2098,6 +2359,7 @@ bool ResizeParams::operator !=(const ResizeParams& other) const } const Glib::ustring ColorManagementParams::NoICMString = Glib::ustring("No ICM: sRGB output"); +const Glib::ustring ColorManagementParams::NoProfileString = Glib::ustring("(none)"); ColorManagementParams::ColorManagementParams() : inputProfile("(cameraICC)"), @@ -2107,9 +2369,29 @@ ColorManagementParams::ColorManagementParams() : applyHueSatMap(true), dcpIlluminant(0), workingProfile("ProPhoto"), - workingTRC("none"), - workingTRCGamma(2.4), - workingTRCSlope(12.92310), + workingTRC(WorkingTrc::NONE), + will(Illuminant::DEFAULT), + wprim(Primaries::DEFAULT), + workingTRCGamma(2.4),//gamma sRGB + workingTRCSlope(12.92), + redx(0.7347), + redy(0.2653), + grex(0.1596), + grey(0.8404), + blux(0.0366), + bluy(0.0001), + preser(0.), + fbw(false), + gamut(false), + labgridcieALow(0.51763),//Prophoto red = (0.7347+0.1) * 1.81818 - 1 + labgridcieBLow(-0.33582), + labgridcieAHigh(-0.75163),//Prophoto blue + labgridcieBHigh(-0.8180), + labgridcieGx(-0.69164),//Prophoto green 0.1596 + labgridcieGy(-0.70909),//0.84 + labgridcieWx(-0.18964),//D50 0.3457, 0.3585, + labgridcieWy(-0.16636),// + aRendIntent(RI_RELATIVE), outputProfile(options.rtSettings.srgb), outputIntent(RI_RELATIVE), outputBPC(true) @@ -2127,8 +2409,28 @@ bool ColorManagementParams::operator ==(const ColorManagementParams& other) cons && dcpIlluminant == other.dcpIlluminant && workingProfile == other.workingProfile && workingTRC == other.workingTRC + && will == other.will + && wprim == other.wprim && workingTRCGamma == other.workingTRCGamma && workingTRCSlope == other.workingTRCSlope + && redx == other.redx + && redy == other.redy + && grex == other.grex + && grey == other.grey + && blux == other.blux + && bluy == other.bluy + && labgridcieALow == other.labgridcieALow + && labgridcieBLow == other.labgridcieBLow + && labgridcieAHigh == other.labgridcieAHigh + && labgridcieBHigh == other.labgridcieBHigh + && labgridcieGx == other.labgridcieGx + && labgridcieGy == other.labgridcieGy + && labgridcieWx == other.labgridcieWx + && labgridcieWy == other.labgridcieWy + && preser == other.preser + && fbw == other.fbw + && gamut == other.gamut + && aRendIntent == other.aRendIntent && outputProfile == other.outputProfile && outputIntent == other.outputIntent && outputBPC == other.outputBPC; @@ -2139,6 +2441,10 @@ bool ColorManagementParams::operator !=(const ColorManagementParams& other) cons return !(*this == other); } +const double WaveletParams::LABGRID_CORR_MAX = 12800.f; +const double WaveletParams::LABGRID_CORR_SCALE = 3.276f; +const double WaveletParams::LABGRIDL_DIRECT_SCALE = 41950.; + WaveletParams::WaveletParams() : ccwcurve{ static_cast(FCT_MinMaxCPoints), @@ -2155,6 +2461,60 @@ WaveletParams::WaveletParams() : 0.35, 0.35 }, + wavdenoise{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + wavdenoiseh{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + blcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.0, + 0.0, + 0.35, + 0.5, + 0., + 0.35, + 0.35, + 1.0, + 0.0, + 0.35, + 0.35 +/* + 0.0, + 0.35, + 0.35, + 1.0, + 0.0, + 0.35, + 0.35 +*/ + }, opacityCurveRG{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -2166,6 +2526,62 @@ WaveletParams::WaveletParams() : 0.35, 0.35 }, + //opacityCurveSH{ + // static_cast(FCT_MinMaxCPoints), + // 0., + // 1., + // 0.35, + // 0.35, + // 0.15, + // 0.9, + // 0.35, + // 0.35, + // 0.4, + // 0.8, + // 0.35, + // 0.35, + // 0.4, + // 0.5, + // 0.35, + // 0.35, + // 0.5, + // 0.5, + // 0.35, + // 0.35, + // 0.5, + // 0.2, + // 0.35, + // 0.35, + // 0.8, + // 0.1, + // 0.35, + // 0.35, + // 1.0, + // 0., + // 0.35, + // 0.35 + //}, +/* + opacityCurveSH{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1., + 0.35, + 0.35, + 0.4, + 0.5, + 0.35, + 0.35, + 0.5, + 0.5, + 0.35, + 0.35, + 1., + 0., + 0.35, + 0.35 + }, +*/ opacityCurveBY{ static_cast(FCT_MinMaxCPoints), 0.0, @@ -2210,6 +2626,12 @@ WaveletParams::WaveletParams() : hhcurve{ FCT_Linear }, + wavguidcurve{ + FCT_Linear + }, + wavhuecurve{ + FCT_Linear + }, Chcurve{ FCT_Linear }, @@ -2219,7 +2641,7 @@ WaveletParams::WaveletParams() : enabled(false), median(false), medianlev(false), - linkedg(true), + linkedg(false), cbenab(false), greenlow(0), bluelow(0), @@ -2227,28 +2649,63 @@ WaveletParams::WaveletParams() : bluemed(0), greenhigh(0), bluehigh(0), + ballum(7.), + sigm(1.0), + levden(0.), + thrden(0.), + limden(0.), + balchrom(0.), + chromfi(0.), + chromco(0.), + mergeL(20.), + mergeC(20.), + softrad(0.), + softradend(0.), + strend(50.), + detend(0), + thrend(0), lipst(false), avoid(false), + showmask(false), + oldsh(true), tmr(false), strength(100), balance(0), + sigmafin(1.0), + sigmaton(1.0), + sigmacol(1.0), + sigmadir(1.0), + rangeab(20.0), + protab(0.0), iter(0), expcontrast(false), expchroma(false), c{}, ch{}, expedge(false), + expbl(false), expresid(false), expfinal(false), exptoning(false), expnoise(false), + expclari(false), + labgridALow(0.0), + labgridBLow(0.0), + labgridAHigh(0.0), + labgridBHigh(0.0), Lmethod(4), CLmethod("all"), Backmethod("grey"), Tilesmethod("full"), + complexmethod("normal"), + //denmethod("12low"), + mixmethod("mix"), + slimethod("sli"), + quamethod("cons"), daubcoeffmethod("4_"), CHmethod("without"), Medgreinf("less"), + ushamethod("clari"), CHSLmethod("SL"), EDmethod("CU"), NPmethod("none"), @@ -2256,18 +2713,25 @@ WaveletParams::WaveletParams() : TMmethod("cont"), Dirmethod("all"), HSmethod("with"), + sigma(1.0), + offset(1.0), + lowthr(40.0), rescon(0), resconH(0), reschro(0), + resblur(0), + resblurc(0), tmrs(0), + edgs(1.4), + scale(1.), gamma(1), sup(0), sky(0.0), thres(7), chroma(5), chro(0), - threshold(5), - threshold2(4), + threshold(4), + threshold2(5), edgedetect(90), edgedetectthr(20), edgedetectthr2(0), @@ -2275,11 +2739,15 @@ WaveletParams::WaveletParams() : edgeampli(10), contrast(0), edgrad(15), + edgeffect(1.0), edgval(0), edgthresh(10), - thr(35), - thrH(65), + thr(30), + thrH(70), + radius(40), skinprotect(0.0), + chrwav(0.), + bluwav(1.0), hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), hllev(50, 75, 100, 98, false), @@ -2290,7 +2758,9 @@ WaveletParams::WaveletParams() : level0noise(0, 0, false), level1noise(0, 0, false), level2noise(0, 0, false), - level3noise(0, 0, false) + level3noise(0, 0, false), + leveldenoise(0, 0, false), + levelsigm(1, 1, false) { } @@ -2298,11 +2768,17 @@ bool WaveletParams::operator ==(const WaveletParams& other) const { return ccwcurve == other.ccwcurve + && wavdenoise == other.wavdenoise + && wavdenoiseh == other.wavdenoiseh + && blcurve == other.blcurve && opacityCurveRG == other.opacityCurveRG + //&& opacityCurveSH == other.opacityCurveSH && opacityCurveBY == other.opacityCurveBY && opacityCurveW == other.opacityCurveW && opacityCurveWL == other.opacityCurveWL && hhcurve == other.hhcurve + && wavguidcurve == other.wavguidcurve + && wavhuecurve == other.wavhuecurve && Chcurve == other.Chcurve && wavclCurve == other.wavclCurve && enabled == other.enabled @@ -2316,12 +2792,39 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && bluemed == other.bluemed && greenhigh == other.greenhigh && bluehigh == other.bluehigh + && ballum == other.ballum + && sigm == other.sigm + && levden == other.levden + && thrden == other.thrden + && limden == other.limden + && balchrom == other.balchrom + && chromfi == other.chromfi + && chromco == other.chromco + && mergeL == other.mergeL + && mergeC == other.mergeC + && softrad == other.softrad + && softradend == other.softradend + && strend == other.strend + && detend == other.detend + && thrend == other.thrend && lipst == other.lipst && avoid == other.avoid + && showmask == other.showmask + && oldsh == other.oldsh && tmr == other.tmr && strength == other.strength && balance == other.balance + && sigmafin == other.sigmafin + && sigmaton == other.sigmaton + && sigmacol == other.sigmacol + && sigmadir == other.sigmadir + && rangeab == other.rangeab + && protab == other.protab && iter == other.iter + && labgridALow == other.labgridALow + && labgridBLow == other.labgridBLow + && labgridAHigh == other.labgridAHigh + && labgridBHigh == other.labgridBHigh && expcontrast == other.expcontrast && expchroma == other.expchroma && [this, &other]() -> bool @@ -2334,17 +2837,25 @@ bool WaveletParams::operator ==(const WaveletParams& other) const return true; }() && expedge == other.expedge + && expbl == other.expbl && expresid == other.expresid && expfinal == other.expfinal + && expclari == other.expclari && exptoning == other.exptoning && expnoise == other.expnoise && Lmethod == other.Lmethod && CLmethod == other.CLmethod && Backmethod == other.Backmethod && Tilesmethod == other.Tilesmethod + && complexmethod == other.complexmethod + //&& denmethod == other.denmethod + && mixmethod == other.mixmethod + && slimethod == other.slimethod + && quamethod == other.quamethod && daubcoeffmethod == other.daubcoeffmethod && CHmethod == other.CHmethod && Medgreinf == other.Medgreinf + && ushamethod == other.ushamethod && CHSLmethod == other.CHSLmethod && EDmethod == other.EDmethod && NPmethod == other.NPmethod @@ -2352,10 +2863,17 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && TMmethod == other.TMmethod && Dirmethod == other.Dirmethod && HSmethod == other.HSmethod + && sigma == other.sigma + && offset == other.offset + && lowthr == other.lowthr && rescon == other.rescon && resconH == other.resconH && reschro == other.reschro + && resblur == other.resblur + && resblurc == other.resblurc && tmrs == other.tmrs + && edgs == other.edgs + && scale == other.scale && gamma == other.gamma && sup == other.sup && sky == other.sky @@ -2371,11 +2889,15 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && edgeampli == other.edgeampli && contrast == other.contrast && edgrad == other.edgrad + && edgeffect == other.edgeffect && edgval == other.edgval && edgthresh == other.edgthresh && thr == other.thr && thrH == other.thrH + && radius == other.radius && skinprotect == other.skinprotect + && chrwav == other.chrwav + && bluwav == other.bluwav && hueskin == other.hueskin && hueskin2 == other.hueskin2 && hllev == other.hllev @@ -2386,7 +2908,9 @@ bool WaveletParams::operator ==(const WaveletParams& other) const && level0noise == other.level0noise && level1noise == other.level1noise && level2noise == other.level2noise - && level3noise == other.level3noise; + && level3noise == other.level3noise + && leveldenoise == other.leveldenoise + && levelsigm == other.levelsigm; } bool WaveletParams::operator !=(const WaveletParams& other) const @@ -2396,20 +2920,2477 @@ bool WaveletParams::operator !=(const WaveletParams& other) const void WaveletParams::getCurves( WavCurve& cCurve, + WavCurve& wavdenoise, + WavCurve& wavdenoiseh, + Wavblcurve& tCurve, WavOpacityCurveRG& opacityCurveLUTRG, + WavOpacityCurveSH& opacityCurveLUTSH, WavOpacityCurveBY& opacityCurveLUTBY, WavOpacityCurveW& opacityCurveLUTW, WavOpacityCurveWL& opacityCurveLUTWL ) const { cCurve.Set(this->ccwcurve); + wavdenoise.Set(this->wavdenoise); + wavdenoiseh.Set(this->wavdenoiseh); + tCurve.Set(this->blcurve); opacityCurveLUTRG.Set(this->opacityCurveRG); + //opacityCurveLUTSH.Set(this->opacityCurveSH); opacityCurveLUTBY.Set(this->opacityCurveBY); opacityCurveLUTW.Set(this->opacityCurveW); opacityCurveLUTWL.Set(this->opacityCurveWL); } +LocallabParams::LocallabSpot::LocallabSpot() : + // Control spot settings + name(""), + isvisible(true), + prevMethod("hide"), + shape("ELI"), + spotMethod("norm"), + wavMethod("D4"), + sensiexclu(12), + structexclu(0), + struc(4.0), + shapeMethod("IND"), + avoidgamutMethod("MUNS"), + loc{150, 150, 150, 150}, + centerX(0), + centerY(0), + circrad(18), + qualityMethod("enh"), + complexMethod("mod"), + transit(60.), + feather(25.), + thresh(2.0), + iter(2.0), + balan(1.0), + balanh(1.0), + colorde(5.0), + colorscope(30.0), + avoidrad(0.), + transitweak(1.0), + transitgrad(0.0), + hishow(false), + activ(true), + blwh(false), + recurs(false), + laplac(true), + deltae(true), + shortc(false), + savrest(false), + scopemask(60), + denoichmask(0.), + lumask(10), + // Color & Light + visicolor(false), + expcolor(false), + complexcolor(2), + curvactiv(false), + lightness(0), + reparcol(100.), + gamc(1.), + contrast(0), + chroma(0), + labgridALow(0.0), + labgridBLow(0.0), + labgridAHigh(0.0), + labgridBHigh(0.0), + labgridALowmerg(0.0), + labgridBLowmerg(0.0), + labgridAHighmerg(-3500.0), + labgridBHighmerg(-4600.0), + strengthgrid(30), + sensi(15), + structcol(0), + strcol(0.), + strcolab(0.), + strcolh(0.), + angcol(0.), + blurcolde(5), + blurcol(0.2), + contcol(0.), + blendmaskcol(0), + radmaskcol(0.0), + chromaskcol(0.0), + gammaskcol(1.0), + slomaskcol(0.0), + shadmaskcol(0), + strumaskcol(0.), + lapmaskcol(0.0), + qualitycurveMethod("none"), + gridMethod("one"), + merMethod("mone"), + toneMethod("fou"), + mergecolMethod("one"), + llcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + lccurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + cccurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + clcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + rgbcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + LHcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + HHcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + CHcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + invers(false), + special(false), + toolcol(false), + enaColorMask(false), + fftColorMask(true), + CCmaskcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + LLmaskcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + HHmaskcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + HHhmaskcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 0.50, + 0.5, + 0.35, + 0.35, + 1.00, + 0.5, + 0.35, + 0.35 + }, + softradiuscol(0.0), + opacol(60.0), + mercol(18.0), + merlucol(32.0), + conthrcol(0.0), + Lmaskcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + LLmaskcolcurvewav{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + csthresholdcol(0, 0, 6, 5, false), + recothresc(1.), + lowthresc(12.), + higthresc(85.), + decayc(2.), + // Exposure + visiexpose(false), + expexpose(false), + complexexpose(0), + expcomp(0.0), + hlcompr(0), + hlcomprthresh(0), + black(0), + shadex(0), + shcompr(50), + expchroma(5), + sensiex(60), + structexp(0), + blurexpde(5), + gamex(1.), + strexp(0.), + angexp(0.), + excurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + norm(true), + inversex(false), + enaExpMask(false), + enaExpMaskaft(false), + CCmaskexpcurve{ + static_cast(FCT_MinMaxCPoints),0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskexpcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskexpcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + blendmaskexp(0), + radmaskexp(0.0), + chromaskexp(0.0), + gammaskexp(1.0), + slomaskexp(0.0), + lapmaskexp(0.0), + strmaskexp(0.0), + angmaskexp(0.0), + softradiusexp(0.0), + Lmaskexpcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + expMethod("std"), + exnoiseMethod("none"), + laplacexp(0.0), + reparexp(100.0), + balanexp(1.0), + linear(0.05), + gamm(0.4), + fatamount(1.0), + fatdetail(40.0), + fatanchor(50.0), + fatlevel(1.), + recothrese(1.), + lowthrese(12.), + higthrese(85.), + decaye(2.), + // Shadow highlight + visishadhigh(false), + expshadhigh(false), + complexshadhigh(0), + shMethod("tone"), + multsh{0, 0, 0, 0, 0}, + highlights(0), + h_tonalwidth(70), + shadows(0), + s_tonalwidth(30), + sh_radius(40), + sensihs(15), + enaSHMask(false), + CCmaskSHcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskSHcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskSHcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + blendmaskSH(0), + radmaskSH(0.0), + blurSHde(5), + strSH(0.), + angSH(0.), + inverssh(false), + chromaskSH(0.0), + gammaskSH(1.0), + slomaskSH(0.0), + lapmaskSH(0.0), + detailSH(0), + tePivot(0.), + reparsh(100.), + LmaskSHcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + fatamountSH(1.0), + fatanchorSH(50.0), + gamSH(2.4), + sloSH(12.92), + recothress(1.), + lowthress(12.), + higthress(85.), + decays(2.), + // Vibrance + visivibrance(false), + expvibrance(false), + complexvibrance(0), + saturated(0), + pastels(0), + vibgam(1.0), + warm(0), + psthreshold({0, 75, false}), + protectskins(false), + avoidcolorshift(true), + pastsattog(true), + sensiv(15), + skintonescurve{ + static_cast(DCT_Linear) + }, + CCmaskvibcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskvibcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskvibcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + enavibMask(false), + blendmaskvib(0), + radmaskvib(0.0), + chromaskvib(0.0), + gammaskvib(1.0), + slomaskvib(0.0), + lapmaskvib(0.0), + strvib(0.0), + strvibab(0.0), + strvibh(0.0), + angvib(0.0), + Lmaskvibcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothresv(1.), + lowthresv(12.), + higthresv(85.), + decayv(2.), + // Soft Light + visisoft(false), + expsoft(false), + complexsoft(0), + streng(0), + sensisf(30), + laplace(25.), + softMethod("soft"), + // Blur & Noise + visiblur(false), + expblur(false), + complexblur(0), + radius(1.5), + strength(0), + sensibn(40), + itera(1), + guidbl(0), + strbl(50), + recothres(1.), + lowthres(12.), + higthres(85.), + recothresd(1.), + lowthresd(12.), + midthresd(0.), + midthresdch(0.), + higthresd(85.), + decayd(2.), + isogr(400), + strengr(0), + scalegr(100), + divgr(1.), + epsbl(0), + blMethod("blur"), + chroMethod("lum"), + quamethod("none"), + blurMethod("norm"), + medMethod("33"), + usemask(false), + invmaskd(false), + invmask(false), + levelthr(85.), + lnoiselow(1.), + levelthrlow(12.), + activlum(true), + noiselumf(0.), + noiselumf0(0.), + noiselumf2(0.), + noiselumc(0.), + noiselumdetail(50.), + noiselequal(7), + noisegam(1.), + noisechrof(0.), + noisechroc(0.), + noisechrodetail(50.), + adjblur(0), + bilateral(0), + nlstr(0), + nldet(50), + nlpat(2), + nlrad(5), + nlgam(3.), + sensiden(60), + reparden(100.), + detailthr(50), + locwavcurveden{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.09, + 0.35, + 0., + 0.33, + 0.17, + 0.33, + 0.35, + 1.0, + 0.03, + 0.35, + 0.35 + }, + locwavcurvehue{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + showmaskblMethodtyp("nois"), + CCmaskblcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskblcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskblcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + enablMask(false), + fftwbl(false), + invbl(false), + toolbl(false), + blendmaskbl(0), + radmaskbl(0.0), + chromaskbl(0.0), + gammaskbl(1.0), + slomaskbl(0.0), + lapmaskbl(0.0), + shadmaskbl(0), + shadmaskblsha(0), + strumaskbl(0.), + Lmaskblcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + LLmaskblcurvewav{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + csthresholdblur(0, 0, 6, 5, false), + // Tone Mapping + visitonemap(false), + exptonemap(false), + complextonemap(0), + stren(0.5), + gamma(1.0), + estop(1.4), + scaltm(1.0), + repartm(100.0), + rewei(0), + satur(0.), + sensitm(60), + softradiustm(0.0), + amount(95.), + equiltm(true), + CCmasktmcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmasktmcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmasktmcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + enatmMask(false), + enatmMaskaft(false), + blendmasktm(0), + radmasktm(0.0), + chromasktm(0.0), + gammasktm(1.0), + slomasktm(0.0), + lapmasktm(0.0), + Lmasktmcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothrest(1.), + lowthrest(12.), + higthrest(85.), + decayt(2.), + // Retinex + visireti(false), + expreti(false), + complexreti(0), + retinexMethod("high"), + str(0.), + chrrt(0.0), + neigh(50.0), + vart(150.0), + offs(0.0), + dehaz(0), + depth(25), + sensih(60), + localTgaincurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.12, + 0.35, + 0.35, + 0.70, + 0.50, + 0.35, + 0.35, + 1.00, + 0.12, + 0.35, + 0.35 + }, + localTtranscurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.5, + 0.5, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + inversret(false), + equilret(false), + loglin(true), + dehazeSaturation(50.0), + softradiusret(40.0), + CCmaskreticurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskreticurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskreticurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + enaretiMask(false), + enaretiMasktmap(true), + blendmaskreti(0), + radmaskreti(0.0), + chromaskreti(0.0), + gammaskreti(1.0), + slomaskreti(0.0), + lapmaskreti(0.0), + scalereti(2.0), + darkness(2.0), + lightnessreti(1.0), + limd(8.0), + cliptm(1.0), + fftwreti(false), + Lmaskreticurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothresr(1.), + lowthresr(12.), + higthresr(85.), + decayr(2.), + // Sharpening + visisharp(false), + expsharp(false), + complexsharp(0), + sharcontrast(20), + sharradius(0.75), + sharamount(100), + shardamping(0), + shariter(30), + sharblur(0.2), + shargam(1.0), + sensisha(40), + inverssha(false), + // Local Contrast + visicontrast(false), + expcontrast(false), + complexcontrast(0), + lcradius(80), + lcamount(0.0), + lcdarkness(1.0), + lclightness(1.0), + sigmalc(1.0), + levelwav(4), + residcont(0.0), + residsha(0.0), + residshathr(30.0), + residhi(0.0), + residhithr(70.0), + gamlc(1.0), + residgam(2.40), + residslop(12.94), + residblur(0.0), + levelblur(0.0), + sigmabl(1.0), + residchro(0.0), + residcomp(0.0), + sigma(1.0), + offset(1.0), + sigmadr(1.0), + threswav(1.4), + chromalev(1.0), + chromablu(0.0), + sigmadc(1.0), + deltad(0.0), + fatres(0.0), + clarilres(0.0), + claricres(0.0), + clarisoft(1.0), + sigmalc2(1.0), + strwav(0.0), + angwav(0.0), + strengthw(0.0), + sigmaed(1.0), + radiusw(15.0), + detailw(10.0), + gradw(90.0), + tloww(20.0), + thigw(0.0), + edgw(60.0), + basew(10.0), + sensilc(60), + reparw(100.), + fftwlc(false), + blurlc(true), + wavblur(false), + wavedg(false), + waveshow(false), + wavcont(false), + wavcomp(false), + wavgradl(false), + wavcompre(false), + origlc(false), + localcontMethod("loc"), + localedgMethod("thr"), + localneiMethod("low"), + locwavcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + csthreshold(0, 0, 6, 6, false), + loclevwavcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.0, + 0.0, + 0.35, + 0.5, + 0., + 0.35, + 0.35, + 1.0, + 0.0, + 0.35, + 0.35 + }, + locconwavcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + loccompwavcurve{ + static_cast(FCT_MinMaxCPoints), + 0.00, + 0.35, + 0.35, + 0.00, + 0.35, + 0.75, + 0.35, + 0.35, + 0.60, + 0.75, + 0.35, + 0.35, + 1.00, + 0.35, + 0.00, + 0.00 + }, + loccomprewavcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.75, + 0.35, + 0.35, + 1., + 0.75, + 0.35, + 0.35 + }, + locedgwavcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.25, + 0.35, + 0.35, + 0.50, + 0.75, + 0.35, + 0.35, + 0.90, + 0.0, + 0.35, + 0.35 + }, + CCmasklccurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmasklccurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmasklccurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + enalcMask(false), + blendmasklc(0), + radmasklc(0.0), + chromasklc(0.0), + Lmasklccurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothresw(1.), + lowthresw(12.), + higthresw(85.), + decayw(2.), + // Contrast by detail levels + visicbdl(false), + expcbdl(false), + complexcbdl(0), + mult{1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, + chromacbdl(0.), + threshold(0.2), + sensicb(60), + clarityml(0.1), + contresid(0), + softradiuscb(0.0), + enacbMask(false), + CCmaskcbcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskcbcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskcbcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + blendmaskcb(0), + radmaskcb(0.0), + chromaskcb(0.0), + gammaskcb(1.0), + slomaskcb(0.0), + lapmaskcb(0.0), + Lmaskcbcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothrescb(1.), + lowthrescb(12.), + higthrescb(85.), + decaycb(2.), + // Log encoding + visilog(false), + explog(false), + complexlog(0), + autocompute(false), + sourceGray(10.), + sourceabs(2000.), + targabs(16.), + targetGray(18.), + catad(0.), + saturl(0.), + chroml(0.), + lightl(0.), + lightq(0.), + contl(0.), + contthres(0.), + contq(0.), + colorfl(0.), + LcurveL{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + Autogray(true), + fullimage(true), + repar(100.0), + ciecam(false), + blackEv(-5.0), + whiteEv(10.0), + detail(0.6), + sensilog(60), + sursour("Average"), + surround("Average"), + baselog(2.), + strlog(0.0), + anglog(0.0), + CCmaskcurveL{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + LLmaskcurveL{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + HHmaskcurveL{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + enaLMask(false), + blendmaskL(0), + radmaskL(0.), + chromaskL(0.), + LmaskcurveL{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothresl(1.), + lowthresl(12.), + higthresl(85.), + decayl(2.), + // mask + visimask(false), + complexmask(0), + expmask(false), + sensimask(60), + blendmask(-10.), + blendmaskab(-10.), + softradiusmask(1.0), + enamask(false), + fftmask(true), + blurmask(0.2), + contmask(0.), + CCmask_curve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + LLmask_curve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + HHmask_curve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.00, + 1.0, + 0.35, + 0.35 + }, + strumaskmask(0.), + toolmask(false), + radmask(0.0), + lapmask(0.0), + chromask(0.0), + gammask(1.0), + slopmask(0.0), + shadmask(0.0), + str_mask(0), + ang_mask(0), + HHhmask_curve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 0.50, + 0.5, + 0.35, + 0.35, + 1.00, + 0.5, + 0.35, + 0.35 + }, + Lmask_curve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + LLmask_curvewav{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + csthresholdmask(0, 0, 6, 5, false), + // ciecam + visicie(false), + expcie(false), + complexcie(0), + reparcie(100.), + sensicie(60), + Autograycie(true), + forcejz(true), + forcebw(true), + qtoj(false), + jabcie(true), + sigmoidqjcie(false), + logcie(false), + logjz(false), + sigjz(false), + sigq(false), + chjzcie(true), + sourceGraycie(18.), + sourceabscie(2000.), + sursourcie("Average"), + modecie("com"), + modecam("cam16"), + saturlcie(0.), + rstprotectcie(0.), + chromlcie(0.), + huecie(0.), + toneMethodcie("one"), + ciecurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + toneMethodcie2("onec"), + ciecurve2{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + chromjzcie(0.), + saturjzcie(0.), + huejzcie(0.), + softjzcie(0.), + strsoftjzcie(100.), + thrhjzcie(60.), + jzcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + czcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + czjzcurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + HHcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + CHcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + LHcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 0.166, + 0.50, + 0.35, + 0.35, + 0.333, + 0.50, + 0.35, + 0.35, + 0.50, + 0.50, + 0.35, + 0.35, + 0.666, + 0.50, + 0.35, + 0.35, + 0.833, + 0.50, + 0.35, + 0.35 + }, + lightlcie(0.), + lightjzcie(0.), + lightqcie(0.), + contlcie(0.), + contjzcie(0.), + adapjzcie(4.0), + jz100(0.25), + pqremap(120.), + pqremapcam16(100.), + hljzcie(0.0), + hlthjzcie(70.0), + shjzcie(0.0), + shthjzcie(40.0), + radjzcie(40.0), + sigmalcjz(1.), + clarilresjz(0.), + claricresjz(0.), + clarisoftjz(0.), + locwavcurvejz{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.5, + 0.35, + 0.35, + 1., + 0.5, + 0.35, + 0.35 + }, + csthresholdjz(0, 0, 7, 4, false), + contthrescie(0.), + blackEvjz(-5.0), + whiteEvjz(10.0), + targetjz(18.0), + sigmoidldacie(0.5), + sigmoidthcie(1.), + sigmoidblcie(1.), + sigmoidldajzcie(0.5), + sigmoidthjzcie(1.), + sigmoidbljzcie(1.), + contqcie(0.), + colorflcie(0.), +/* + lightlzcam(0.), + lightqzcam(0.), + contlzcam(0.), + contqzcam(0.), + contthreszcam(0.), + colorflzcam(0.), + saturzcam(0.), + chromzcam(0.), +*/ + targabscie(16.), + targetGraycie(18.), + catadcie(0.), + detailcie(0.), + surroundcie("Average"), + enacieMask(false), + CCmaskciecurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + LLmaskciecurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + HHmaskciecurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 1.0, + 0.35, + 0.35, + 0.50, + 1.0, + 0.35, + 0.35, + 1.0, + 1.0, + 0.35, + 0.35 + }, + blendmaskcie(0), + radmaskcie(0.0), + chromaskcie(0.0), + lapmaskcie(0.0), + gammaskcie(1.0), + slomaskcie(0.0), + Lmaskciecurve{ + static_cast(DCT_NURBS), + 0.0, + 0.0, + 1.0, + 1.0 + }, + recothrescie(1.), + lowthrescie(12.), + higthrescie(85.), + decaycie(2.) + + +{ +} + +bool LocallabParams::LocallabSpot::operator ==(const LocallabSpot& other) const +{ + return + // Control spot settings + name == other.name + && isvisible == other.isvisible + && prevMethod == other.prevMethod + && shape == other.shape + && spotMethod == other.spotMethod + && wavMethod == other.wavMethod + && sensiexclu == other.sensiexclu + && structexclu == other.structexclu + && struc == other.struc + && shapeMethod == other.shapeMethod + && avoidgamutMethod == other.avoidgamutMethod + && loc == other.loc + && centerX == other.centerX + && centerY == other.centerY + && circrad == other.circrad + && qualityMethod == other.qualityMethod + && complexMethod == other.complexMethod + && transit == other.transit + && feather == other.feather + && thresh == other.thresh + && iter == other.iter + && balan == other.balan + && balanh == other.balanh + && colorde == other.colorde + && colorscope == other.colorscope + && avoidrad == other.avoidrad + && transitweak == other.transitweak + && transitgrad == other.transitgrad + && hishow == other.hishow + && activ == other.activ + && blwh == other.blwh + && recurs == other.recurs + && laplac == other.laplac + && deltae == other.deltae + && shortc == other.shortc + && savrest == other.savrest + && scopemask == other.scopemask + && denoichmask == other.denoichmask + && lumask == other.lumask + // Color & Light + && visicolor == other.visicolor + && expcolor == other.expcolor + && complexcolor == other.complexcolor + && curvactiv == other.curvactiv + && lightness == other.lightness + && reparcol == other.reparcol + && gamc == other.gamc + && contrast == other.contrast + && chroma == other.chroma + && labgridALow == other.labgridALow + && labgridBLow == other.labgridBLow + && labgridAHigh == other.labgridAHigh + && labgridBHigh == other.labgridBHigh + && labgridALowmerg == other.labgridALowmerg + && labgridBLowmerg == other.labgridBLowmerg + && labgridAHighmerg == other.labgridAHighmerg + && labgridBHighmerg == other.labgridBHighmerg + && strengthgrid == other.strengthgrid + && sensi == other.sensi + && structcol == other.structcol + && strcol == other.strcol + && strcolab == other.strcolab + && strcolh == other.strcolh + && angcol == other.angcol + && blurcolde == other.blurcolde + && blurcol == other.blurcol + && contcol == other.contcol + && blendmaskcol == other.blendmaskcol + && radmaskcol == other.radmaskcol + && chromaskcol == other.chromaskcol + && gammaskcol == other.gammaskcol + && slomaskcol == other.slomaskcol + && shadmaskcol == other.shadmaskcol + && strumaskcol == other.strumaskcol + && lapmaskcol == other.lapmaskcol + && qualitycurveMethod == other.qualitycurveMethod + && gridMethod == other.gridMethod + && merMethod == other.merMethod + && toneMethod == other.toneMethod + && mergecolMethod == other.mergecolMethod + && llcurve == other.llcurve + && lccurve == other.lccurve + && cccurve == other.cccurve + && clcurve == other.clcurve + && rgbcurve == other.rgbcurve + && LHcurve == other.LHcurve + && HHcurve == other.HHcurve + && CHcurve == other.CHcurve + && invers == other.invers + && special == other.special + && toolcol == other.toolcol + && enaColorMask == other.enaColorMask + && fftColorMask == other.fftColorMask + && CCmaskcurve == other.CCmaskcurve + && LLmaskcurve == other.LLmaskcurve + && HHmaskcurve == other.HHmaskcurve + && HHhmaskcurve == other.HHhmaskcurve + && softradiuscol == other.softradiuscol + && opacol == other.opacol + && mercol == other.mercol + && merlucol == other.merlucol + && conthrcol == other.conthrcol + && Lmaskcurve == other.Lmaskcurve + && LLmaskcolcurvewav == other.LLmaskcolcurvewav + && csthresholdcol == other.csthresholdcol + && recothresc == other.recothresc + && lowthresc == other.lowthresc + && higthresc == other.higthresc + && decayc == other.decayc + // Exposure + && visiexpose == other.visiexpose + && expexpose == other.expexpose + && complexexpose == other.complexexpose + && expcomp == other.expcomp + && hlcompr == other.hlcompr + && hlcomprthresh == other.hlcomprthresh + && black == other.black + && shadex == other.shadex + && shcompr == other.shcompr + && expchroma == other.expchroma + && sensiex == other.sensiex + && structexp == other.structexp + && blurexpde == other.blurexpde + && gamex == other.gamex + && strexp == other.strexp + && angexp == other.angexp + && excurve == other.excurve + && norm == other.norm + && inversex == other.inversex + && enaExpMask == other.enaExpMask + && enaExpMaskaft == other.enaExpMaskaft + && CCmaskexpcurve == other.CCmaskexpcurve + && LLmaskexpcurve == other.LLmaskexpcurve + && HHmaskexpcurve == other.HHmaskexpcurve + && blendmaskexp == other.blendmaskexp + && radmaskexp == other.radmaskexp + && chromaskexp == other.chromaskexp + && gammaskexp == other.gammaskexp + && slomaskexp == other.slomaskexp + && lapmaskexp == other.lapmaskexp + && strmaskexp == other.strmaskexp + && angmaskexp == other.angmaskexp + && softradiusexp == other.softradiusexp + && Lmaskexpcurve == other.Lmaskexpcurve + && expMethod == other.expMethod + && exnoiseMethod == other.exnoiseMethod + && laplacexp == other.laplacexp + && reparexp == other.reparexp + && balanexp == other.balanexp + && linear == other.linear + && gamm == other.gamm + && fatamount == other.fatamount + && fatdetail == other.fatdetail + && fatanchor == other.fatanchor + && fatlevel == other.fatlevel + && recothrese == other.recothrese + && lowthrese == other.lowthrese + && higthrese == other.higthrese + && decaye == other.decaye + // Shadow highlight + && visishadhigh == other.visishadhigh + && expshadhigh == other.expshadhigh + && complexshadhigh == other.complexshadhigh + && shMethod == other.shMethod + && [this, &other]() -> bool + { + for (int i = 0; i < 5; ++i) { + if (multsh[i] != other.multsh[i]) { + return false; + } + } + return true; + }() + && highlights == other.highlights + && h_tonalwidth == other.h_tonalwidth + && shadows == other.shadows + && s_tonalwidth == other.s_tonalwidth + && sh_radius == other.sh_radius + && sensihs == other.sensihs + && enaSHMask == other.enaSHMask + && CCmaskSHcurve == other.CCmaskSHcurve + && LLmaskSHcurve == other.LLmaskSHcurve + && HHmaskSHcurve == other.HHmaskSHcurve + && blendmaskSH == other.blendmaskSH + && radmaskSH == other.radmaskSH + && blurSHde == other.blurSHde + && strSH == other.strSH + && angSH == other.angSH + && inverssh == other.inverssh + && chromaskSH == other.chromaskSH + && gammaskSH == other.gammaskSH + && slomaskSH == other.slomaskSH + && lapmaskSH == other.lapmaskSH + && detailSH == other.detailSH + && tePivot == other.tePivot + && reparsh == other.reparsh + && LmaskSHcurve == other.LmaskSHcurve + && fatamountSH == other.fatamountSH + && fatanchorSH == other.fatanchorSH + && gamSH == other.gamSH + && sloSH == other.sloSH + && recothress == other.recothress + && lowthress == other.lowthress + && higthress == other.higthress + && decays == other.decays + // Vibrance + && visivibrance == other.visivibrance + && expvibrance == other.expvibrance + && complexvibrance == other.complexvibrance + && saturated == other.saturated + && pastels == other.pastels + && vibgam == other.vibgam + && warm == other.warm + && psthreshold == other.psthreshold + && protectskins == other.protectskins + && avoidcolorshift == other.avoidcolorshift + && pastsattog == other.pastsattog + && sensiv == other.sensiv + && skintonescurve == other.skintonescurve + && CCmaskvibcurve == other.CCmaskvibcurve + && LLmaskvibcurve == other.LLmaskvibcurve + && HHmaskvibcurve == other.HHmaskvibcurve + && enavibMask == other.enavibMask + && blendmaskvib == other.blendmaskvib + && radmaskvib == other.radmaskvib + && chromaskvib == other.chromaskvib + && gammaskvib == other.gammaskvib + && slomaskvib == other.slomaskvib + && lapmaskvib == other.lapmaskvib + && strvib == other.strvib + && strvibab == other.strvibab + && strvibh == other.strvibh + && angvib == other.angvib + && Lmaskvibcurve == other.Lmaskvibcurve + && recothresv == other.recothresv + && lowthresv == other.lowthresv + && higthresv == other.higthresv + && decayv == other.decayv + // Soft Light + && visisoft == other.visisoft + && expsoft == other.expsoft + && complexsoft == other.complexsoft + && streng == other.streng + && sensisf == other.sensisf + && laplace == other.laplace + && softMethod == other.softMethod + // Blur & Noise + && visiblur == other.visiblur + && expblur == other.expblur + && complexblur == other.complexblur + && radius == other.radius + && strength == other.strength + && sensibn == other.sensibn + && itera == other.itera + && guidbl == other.guidbl + && strbl == other.strbl + && recothres == other.recothres + && lowthres == other.lowthres + && higthres == other.higthres + && recothresd == other.recothresd + && lowthresd == other.lowthresd + && midthresd == other.midthresd + && midthresdch == other.midthresdch + && higthresd == other.higthresd + && decayd == other.decayd + && isogr == other.isogr + && strengr == other.strengr + && scalegr == other.scalegr + && divgr == other.divgr + && epsbl == other.epsbl + && blMethod == other.blMethod + && chroMethod == other.chroMethod + && quamethod == other.quamethod + && blurMethod == other.blurMethod + && usemask == other.usemask + && invmaskd == other.invmaskd + && invmask == other.invmask + && levelthr == other.levelthr + && lnoiselow == other.lnoiselow + && levelthrlow == other.levelthrlow + && medMethod == other.medMethod + && activlum == other.activlum + && noiselumf == other.noiselumf + && noiselumf0 == other.noiselumf0 + && noiselumf2 == other.noiselumf2 + && noiselumc == other.noiselumc + && noiselumdetail == other.noiselumdetail + && noiselequal == other.noiselequal + && noisegam == other.noisegam + && noisechrof == other.noisechrof + && noisechroc == other.noisechroc + && noisechrodetail == other.noisechrodetail + && adjblur == other.adjblur + && bilateral == other.bilateral + && nlstr == other.nlstr + && nldet == other.nldet + && nlpat == other.nlpat + && nlrad == other.nlrad + && nlgam == other.nlgam + && sensiden == other.sensiden + && reparden == other.reparden + && detailthr == other.detailthr + && locwavcurveden == other.locwavcurveden + && locwavcurvehue == other.locwavcurvehue + && showmaskblMethodtyp == other.showmaskblMethodtyp + && CCmaskblcurve == other.CCmaskblcurve + && LLmaskblcurve == other.LLmaskblcurve + && HHmaskblcurve == other.HHmaskblcurve + && enablMask == other.enablMask + && fftwbl == other.fftwbl + && invbl == other.invbl + && toolbl == other.toolbl + && blendmaskbl == other.blendmaskbl + && radmaskbl == other.radmaskbl + && chromaskbl == other.chromaskbl + && gammaskbl == other.gammaskbl + && slomaskbl == other.slomaskbl + && lapmaskbl == other.lapmaskbl + && shadmaskbl == other.shadmaskbl + && shadmaskblsha == other.shadmaskblsha + && strumaskbl == other.strumaskbl + && Lmaskblcurve == other.Lmaskblcurve + && LLmaskblcurvewav == other.LLmaskblcurvewav + && csthresholdblur == other.csthresholdblur + // Tone Mapping + && visitonemap == other.visitonemap + && exptonemap == other.exptonemap + && complextonemap == other.complextonemap + && stren == other.stren + && gamma == other.gamma + && estop == other.estop + && scaltm == other.scaltm + && repartm == other.repartm + && rewei == other.rewei + && satur == other.satur + && sensitm == other.sensitm + && softradiustm == other.softradiustm + && amount == other.amount + && equiltm == other.equiltm + && CCmasktmcurve == other.CCmasktmcurve + && LLmasktmcurve == other.LLmasktmcurve + && HHmasktmcurve == other.HHmasktmcurve + && enatmMask == other.enatmMask + && enatmMaskaft == other.enatmMaskaft + && blendmasktm == other.blendmasktm + && radmasktm == other.radmasktm + && chromasktm == other.chromasktm + && gammasktm == other.gammasktm + && slomasktm == other.slomasktm + && lapmasktm == other.lapmasktm + && Lmasktmcurve == other.Lmasktmcurve + && recothrest == other.recothrest + && lowthrest == other.lowthrest + && higthrest == other.higthrest + && decayt == other.decayt + // Retinex + && visireti == other.visireti + && expreti == other.expreti + && complexreti == other.complexreti + && retinexMethod == other.retinexMethod + && str == other.str + && chrrt == other.chrrt + && neigh == other.neigh + && vart == other.vart + && offs == other.offs + && dehaz == other.dehaz + && depth == other.depth + && sensih == other.sensih + && localTgaincurve == other.localTgaincurve + && localTtranscurve == other.localTtranscurve + && inversret == other.inversret + && equilret == other.equilret + && loglin == other.loglin + && dehazeSaturation == other.dehazeSaturation + && softradiusret == other.softradiusret + && CCmaskreticurve == other.CCmaskreticurve + && LLmaskreticurve == other.LLmaskreticurve + && HHmaskreticurve == other.HHmaskreticurve + && enaretiMask == other.enaretiMask + && enaretiMasktmap == other.enaretiMasktmap + && blendmaskreti == other.blendmaskreti + && radmaskreti == other.radmaskreti + && chromaskreti == other.chromaskreti + && gammaskreti == other.gammaskreti + && slomaskreti == other.slomaskreti + && lapmaskreti == other.lapmaskreti + && scalereti == other.scalereti + && darkness == other.darkness + && lightnessreti == other.lightnessreti + && limd == other.limd + && cliptm == other.cliptm + && fftwreti == other.fftwreti + && Lmaskreticurve == other.Lmaskreticurve + && recothresr == other.recothresr + && lowthresr == other.lowthresr + && higthresr == other.higthresr + && decayr == other.decayr + // Sharpening + && visisharp == other.visisharp + && expsharp == other.expsharp + && complexsharp == other.complexsharp + && sharcontrast == other.sharcontrast + && sharradius == other.sharradius + && sharamount == other.sharamount + && shardamping == other.shardamping + && shariter == other.shariter + && sharblur == other.sharblur + && shargam == other.shargam + && sensisha == other.sensisha + && inverssha == other.inverssha + // Local contrast + && visicontrast == other.visicontrast + && expcontrast == other.expcontrast + && complexcontrast == other.complexcontrast + && lcradius == other.lcradius + && lcamount == other.lcamount + && lcdarkness == other.lcdarkness + && lclightness == other.lclightness + && sigmalc == other.sigmalc + && levelwav == other.levelwav + && residcont == other.residcont + && residsha == other.residsha + && residshathr == other.residshathr + && residhi == other.residhi + && residhithr == other.residhithr + && gamlc == other.gamlc + && residgam == other.residgam + && residslop == other.residslop + && residblur == other.residblur + && levelblur == other.levelblur + && sigmabl == other.sigmabl + && residchro == other.residchro + && residcomp == other.residcomp + && sigma == other.sigma + && offset == other.offset + && sigmadr == other.sigmadr + && threswav == other.threswav + && chromalev == other.chromalev + && chromablu == other.chromablu + && sigmadc == other.sigmadc + && deltad == other.deltad + && fatres == other.fatres + && clarilres == other.clarilres + && claricres == other.claricres + && clarisoft == other.clarisoft + && sigmalc2 == other.sigmalc2 + && strwav == other.strwav + && angwav == other.angwav + && strengthw == other.strengthw + && sigmaed == other.sigmaed + && radiusw == other.radiusw + && detailw == other.detailw + && gradw == other.gradw + && tloww == other.tloww + && thigw == other.thigw + && edgw == other.edgw + && basew == other.basew + && sensilc == other.sensilc + && reparw == other.reparw + && fftwlc == other.fftwlc + && blurlc == other.blurlc + && wavblur == other.wavblur + && wavedg == other.wavedg + && waveshow == other.waveshow + && wavcont == other.wavcont + && wavcomp == other.wavcomp + && wavgradl == other.wavgradl + && wavcompre == other.wavcompre + && origlc == other.origlc + && localcontMethod == other.localcontMethod + && localedgMethod == other.localedgMethod + && localneiMethod == other.localneiMethod + && locwavcurve == other.locwavcurve + && csthreshold == other.csthreshold + && loclevwavcurve == other.loclevwavcurve + && locconwavcurve == other.locconwavcurve + && loccompwavcurve == other.loccompwavcurve + && loccomprewavcurve == other.loccomprewavcurve + && locedgwavcurve == other.locedgwavcurve + && CCmasklccurve == other.CCmasklccurve + && LLmasklccurve == other.LLmasklccurve + && HHmasklccurve == other.HHmasklccurve + && enalcMask == other.enalcMask + && blendmasklc == other.blendmasklc + && radmasklc == other.radmasklc + && chromasklc == other.chromasklc + && Lmasklccurve == other.Lmasklccurve + && recothresw == other.recothresw + && lowthresw == other.lowthresw + && higthresw == other.higthresw + && decayw == other.decayw + // Contrast by detail levels + && visicbdl == other.visicbdl + && expcbdl == other.expcbdl + && complexcbdl == other.complexcbdl + && [this, &other]() -> bool + { + for (int i = 0; i < 6; ++i) { + if (mult[i] != other.mult[i]) { + return false; + } + } + return true; + }() + && chromacbdl == other.chromacbdl + && threshold == other.threshold + && sensicb == other.sensicb + && clarityml == other.clarityml + && contresid == other.contresid + && softradiuscb == other.softradiuscb + && enacbMask == other.enacbMask + && CCmaskcbcurve == other.CCmaskcbcurve + && LLmaskcbcurve == other.LLmaskcbcurve + && HHmaskcbcurve == other.HHmaskcbcurve + && blendmaskcb == other.blendmaskcb + && radmaskcb == other.radmaskcb + && chromaskcb == other.chromaskcb + && gammaskcb == other.gammaskcb + && slomaskcb == other.slomaskcb + && lapmaskcb == other.lapmaskcb + && Lmaskcbcurve == other.Lmaskcbcurve + && recothrescb == other.recothrescb + && lowthrescb == other.lowthrescb + && higthrescb == other.higthrescb + && decaycb == other.decaycb + // Log encoding + && visilog == other.visilog + && explog == other.explog + && complexlog == other.complexlog + && autocompute == other.autocompute + && sourceGray == other.sourceGray + && sourceabs == other.sourceabs + && targabs == other.targabs + && targetGray == other.targetGray + && catad == other.catad + && saturl == other.saturl + && chroml == other.chroml + && lightl == other.lightl + && lightq == other.lightq + && contl == other.contl + && contthres == other.contthres + && contq == other.contq + && colorfl == other.colorfl + && LcurveL == other.LcurveL + && Autogray == other.Autogray + && fullimage == other.fullimage + && repar == other.repar + && ciecam == other.ciecam + && blackEv == other.blackEv + && whiteEv == other.whiteEv + && detail == other.detail + && sensilog == other.sensilog + && baselog == other.baselog + && sursour == other.sursour + && surround == other.surround + && strlog == other.strlog + && anglog == other.anglog + && CCmaskcurveL == other.CCmaskcurveL + && LLmaskcurveL == other.LLmaskcurveL + && HHmaskcurveL == other.HHmaskcurveL + && enaLMask == other.enaLMask + && blendmaskL == other.blendmaskL + && radmaskL == other.radmaskL + && chromaskL == other.chromaskL + && LmaskcurveL == other.LmaskcurveL + && recothresl == other.recothresl + && lowthresl == other.lowthresl + && higthresl == other.higthresl + && decayl == other.decayl + + // mask + && visimask == other.visimask + && complexmask == other.complexmask + && expmask == other.expmask + && sensimask == other.sensimask + && blendmask == other.blendmask + && blendmaskab == other.blendmaskab + && softradiusmask == other.softradiusmask + && enamask == other.enamask + && fftmask == other.fftmask + && blurmask == other.blurmask + && contmask == other.contmask + && CCmask_curve == other.CCmask_curve + && LLmask_curve == other.LLmask_curve + && HHmask_curve == other.HHmask_curve + && strumaskmask == other.strumaskmask + && toolmask == other.toolmask + && radmask == other.radmask + && lapmask == other.lapmask + && chromask == other.chromask + && gammask == other.gammask + && slopmask == other.slopmask + && shadmask == other.shadmask + && str_mask == other.str_mask + && ang_mask == other.ang_mask + && HHhmask_curve == other.HHhmask_curve + && Lmask_curve == other.Lmask_curve + && LLmask_curvewav == other.LLmask_curvewav + && csthresholdmask == other.csthresholdmask + //ciecam + && visicie == other.visicie + && expcie == other.expcie + && complexcie == other.complexcie + && reparcie == other.reparcie + && sensicie == other.sensicie + && Autograycie == other.Autograycie + && forcejz == other.forcejz + && forcebw == other.forcebw + && qtoj == other.qtoj + && jabcie == other.jabcie + && sigmoidqjcie == other.sigmoidqjcie + && logcie == other.logcie + && logjz == other.logjz + && sigjz == other.sigjz + && sigq == other.sigq + && chjzcie == other.chjzcie + && sourceGraycie == other.sourceGraycie + && sourceabscie == other.sourceabscie + && sursourcie == other.sursourcie + && modecie == other.modecie + && modecam == other.modecam + && saturlcie == other.saturlcie + && rstprotectcie == other.rstprotectcie + && chromlcie == other.chromlcie + && huecie == other.huecie + && toneMethodcie == other.toneMethodcie + && ciecurve == other.ciecurve + && toneMethodcie2 == other.toneMethodcie2 + && ciecurve2 == other.ciecurve2 + && chromjzcie == other.chromjzcie + && saturjzcie == other.saturjzcie + && huejzcie == other.huejzcie + && softjzcie == other.softjzcie + && strsoftjzcie == other.strsoftjzcie + && thrhjzcie == other.thrhjzcie + && jzcurve == other.jzcurve + && czcurve == other.czcurve + && czjzcurve == other.czjzcurve + && HHcurvejz == other.HHcurvejz + && CHcurvejz == other.CHcurvejz + && LHcurvejz == other.LHcurvejz + && lightlcie == other.lightlcie + && lightjzcie == other.lightjzcie + && lightqcie == other.lightqcie + && contlcie == other.contlcie + && contjzcie == other.contjzcie + && adapjzcie == other.adapjzcie + && jz100 == other.jz100 + && pqremap == other.pqremap + && pqremapcam16 == other.pqremapcam16 + && hljzcie == other.hljzcie + && hlthjzcie == other.hlthjzcie + && shjzcie == other.shjzcie + && shthjzcie == other.shthjzcie + && radjzcie == other.radjzcie + && sigmalcjz == other.sigmalcjz + && clarilresjz == other.clarilresjz + && claricresjz == other.claricresjz + && clarisoftjz == other.clarisoftjz + && locwavcurvejz == other.locwavcurvejz + && csthresholdjz == other.csthresholdjz + && contthrescie == other.contthrescie + && blackEvjz == other.blackEvjz + && whiteEvjz == other.whiteEvjz + && targetjz == other.targetjz + && sigmoidldacie == other.sigmoidldacie + && sigmoidthcie == other.sigmoidthcie + && sigmoidblcie == other.sigmoidblcie + && sigmoidldajzcie == other.sigmoidldajzcie + && sigmoidthjzcie == other.sigmoidthjzcie + && sigmoidbljzcie == other.sigmoidbljzcie + && contqcie == other.contqcie + && colorflcie == other.colorflcie +/* && lightlzcam == other.lightlzcam + && lightqzcam == other.lightqzcam + && contlzcam == other.contlzcam + && contqzcam == other.contqzcam + && contthreszcam == other.contthreszcam + && colorflzcam == other.colorflzcam + && saturzcam == other.saturzcam + && chromzcam == other.chromzcam +*/ + && targabscie == other.targabscie + && targetGraycie == other.targetGraycie + && catadcie == other.catadcie + && detailcie == other.detailcie + && surroundcie == other.surroundcie + && enacieMask == other.enacieMask + && CCmaskciecurve == other.CCmaskciecurve + && LLmaskciecurve == other.LLmaskciecurve + && HHmaskciecurve == other.HHmaskciecurve + && blendmaskcie == other.blendmaskcie + && radmaskcie == other.radmaskcie + && chromaskcie == other.chromaskcie + && lapmaskcie == other.lapmaskcie + && gammaskcie == other.gammaskcie + && slomaskcie == other.slomaskcie + && Lmaskciecurve == other.Lmaskciecurve + && recothrescie == other.recothrescie + && lowthrescie == other.lowthrescie + && higthrescie == other.higthrescie + && decaycie == other.decaycie; + + +} + +bool LocallabParams::LocallabSpot::operator !=(const LocallabSpot& other) const +{ + return !(*this == other); +} + +const double LocallabParams::LABGRIDL_CORR_MAX = 12800.; +const double LocallabParams::LABGRIDL_CORR_SCALE = 3.276; +const double LocallabParams::LABGRIDL_DIRECT_SCALE = 41950.; + +LocallabParams::LocallabParams() : + enabled(false), + selspot(0), + spots() +{ +} + +bool LocallabParams::operator ==(const LocallabParams& other) const +{ + return + enabled == other.enabled + && selspot == other.selspot + && spots == other.spots; +} + +bool LocallabParams::operator !=(const LocallabParams& other) const +{ + return !(*this == other); +} + DirPyrEqualizerParams::DirPyrEqualizerParams() : enabled(false), gamutlab(false), @@ -2423,7 +5404,7 @@ DirPyrEqualizerParams::DirPyrEqualizerParams() : }, threshold(0.2), skinprotect(0.0), - hueskin (-5, 25, 170, 120, false), + hueskin(-5, 25, 170, 120, false), cbdlMethod("bef") { } @@ -2523,9 +5504,9 @@ bool SoftLightParams::operator !=(const SoftLightParams& other) const DehazeParams::DehazeParams() : enabled(false), strength(50), + saturation(50), showDepthMap(false), - depth(25), - luminance(false) + depth(25) { } @@ -2536,7 +5517,7 @@ bool DehazeParams::operator ==(const DehazeParams& other) const && strength == other.strength && showDepthMap == other.showDepthMap && depth == other.depth - && luminance == other.luminance; + && saturation == other.saturation; } bool DehazeParams::operator !=(const DehazeParams& other) const @@ -2569,6 +5550,7 @@ RAWParams::BayerSensor::BayerSensor() : pixelShiftShowMotionMaskOnly(false), pixelShiftHoleFill(true), pixelShiftMedian(false), + pixelShiftAverage(false), pixelShiftGreen(true), pixelShiftBlur(true), pixelShiftSmoothFactor(0.7), @@ -2607,6 +5589,7 @@ bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const && pixelShiftShowMotionMaskOnly == other.pixelShiftShowMotionMaskOnly && pixelShiftHoleFill == other.pixelShiftHoleFill && pixelShiftMedian == other.pixelShiftMedian + && pixelShiftAverage == other.pixelShiftAverage && pixelShiftGreen == other.pixelShiftGreen && pixelShiftBlur == other.pixelShiftBlur && pixelShiftSmoothFactor == other.pixelShiftSmoothFactor @@ -2630,6 +5613,7 @@ void RAWParams::BayerSensor::setPixelShiftDefaults() pixelShiftSigma = 1.0; pixelShiftHoleFill = true; pixelShiftMedian = false; + pixelShiftAverage = false; pixelShiftGreen = true; pixelShiftBlur = true; pixelShiftSmoothFactor = 0.7; @@ -2643,10 +5627,13 @@ const std::vector& RAWParams::BayerSensor::getMethodStrings() { static const std::vector method_strings { "amaze", + "amazebilinear", "amazevng4", "rcd", + "rcdbilinear", "rcdvng4", "dcb", + "dcbbilinear", "dcbvng4", "lmmse", "igv", @@ -2683,8 +5670,6 @@ Glib::ustring RAWParams::BayerSensor::getPSDemosaicMethodString(PSDemosaicMethod return getPSDemosaicMethodStrings()[toUnderlying(method)]; } - - RAWParams::XTransSensor::XTransSensor() : method(getMethodString(Method::THREE_PASS)), dualDemosaicAutoContrast(true), @@ -2734,9 +5719,27 @@ Glib::ustring RAWParams::XTransSensor::getMethodString(Method method) return getMethodStrings()[toUnderlying(method)]; } + +RAWParams::PreprocessWB::PreprocessWB() : + mode(Mode::AUTO) +{ +} + +bool RAWParams::PreprocessWB::operator ==(const PreprocessWB& other) const +{ + return mode == other.mode; +} + +bool RAWParams::PreprocessWB::operator !=(const PreprocessWB& other) const +{ + return !(*this == other); +} + + RAWParams::RAWParams() : df_autoselect(false), ff_AutoSelect(false), + ff_FromMetaData(false), ff_BlurRadius(32), ff_BlurType(getFlatFieldBlurTypeString(FlatFieldBlurType::AREA)), ff_AutoClipControl(false), @@ -2762,6 +5765,7 @@ bool RAWParams::operator ==(const RAWParams& other) const && df_autoselect == other.df_autoselect && ff_file == other.ff_file && ff_AutoSelect == other.ff_AutoSelect + && ff_FromMetaData == other.ff_FromMetaData && ff_BlurRadius == other.ff_BlurRadius && ff_BlurType == other.ff_BlurType && ff_AutoClipControl == other.ff_AutoClipControl @@ -2772,6 +5776,7 @@ bool RAWParams::operator ==(const RAWParams& other) const && cared == other.cared && cablue == other.cablue && expos == other.expos + && preprocessWB == other.preprocessWB && hotPixelFilter == other.hotPixelFilter && deadPixelFilter == other.deadPixelFilter && hotdeadpix_thresh == other.hotdeadpix_thresh; @@ -2818,17 +5823,47 @@ FilmNegativeParams::FilmNegativeParams() : enabled(false), redRatio(1.36), greenExp(1.5), - blueRatio(0.86) + blueRatio(0.86), + refInput({0.0, 0.0, 0.0}), + refOutput({0.0, 0.0, 0.0}), + colorSpace(ColorSpace::WORKING), + backCompat(BackCompat::CURRENT) { } +bool FilmNegativeParams::RGB::operator ==(const FilmNegativeParams::RGB& other) const +{ + return + r == other.r + && g == other.g + && b == other.b; +} + +bool FilmNegativeParams::RGB::operator !=(const FilmNegativeParams::RGB& other) const +{ + return !(*this == other); +} + +FilmNegativeParams::RGB FilmNegativeParams::RGB::operator *(const FilmNegativeParams::RGB& other) const +{ + return { + (*this).r * other.r, + (*this).g * other.g, + (*this).b * other.b + }; +} + bool FilmNegativeParams::operator ==(const FilmNegativeParams& other) const { return enabled == other.enabled - && redRatio == other.redRatio + && redRatio == other.redRatio && greenExp == other.greenExp - && blueRatio == other.blueRatio; + && blueRatio == other.blueRatio + && refInput == other.refInput + && refOutput == other.refOutput + && colorSpace == other.colorSpace + && backCompat == other.backCompat; } bool FilmNegativeParams::operator !=(const FilmNegativeParams& other) const @@ -2887,6 +5922,8 @@ void ProcParams::setDefaults() sh = {}; + toneEqualizer = {}; + crop = {}; coarse = {}; @@ -2907,6 +5944,8 @@ void ProcParams::setDefaults() vignetting = {}; + locallab = {}; + chmixer = {}; blackwhite = {}; @@ -2982,6 +6021,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // Highlight recovery saveToKeyfile(!pedited || pedited->toneCurve.hrenabled, "HLRecovery", "Enabled", toneCurve.hrenabled, keyFile); saveToKeyfile(!pedited || pedited->toneCurve.method, "HLRecovery", "Method", toneCurve.method, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.hlbl, "HLRecovery", "Hlbl", toneCurve.hlbl, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.hlth, "HLRecovery", "Hlth", toneCurve.hlth, keyFile); const std::map tc_mapping = { {ToneCurveMode::STD, "Standard"}, @@ -3015,6 +6056,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->retinex.limd, "Retinex", "Limd", retinex.limd, keyFile); saveToKeyfile(!pedited || pedited->retinex.highl, "Retinex", "highl", retinex.highl, keyFile); saveToKeyfile(!pedited || pedited->retinex.skal, "Retinex", "skal", retinex.skal, keyFile); + saveToKeyfile(!pedited || pedited->retinex.complexmethod, "Retinex", "complexMethod", retinex.complexmethod, keyFile); saveToKeyfile(!pedited || pedited->retinex.retinexMethod, "Retinex", "RetinexMethod", retinex.retinexMethod, keyFile); saveToKeyfile(!pedited || pedited->retinex.mapMethod, "Retinex", "mapMethod", retinex.mapMethod, keyFile); saveToKeyfile(!pedited || pedited->retinex.viewMethod, "Retinex", "viewMethod", retinex.viewMethod, keyFile); @@ -3112,7 +6154,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->labCurve.brightness, "Luminance Curve", "Brightness", labCurve.brightness, keyFile); saveToKeyfile(!pedited || pedited->labCurve.contrast, "Luminance Curve", "Contrast", labCurve.contrast, keyFile); saveToKeyfile(!pedited || pedited->labCurve.chromaticity, "Luminance Curve", "Chromaticity", labCurve.chromaticity, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.avoidcolorshift, "Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.gamutmunselmethod, "Luminance Curve", "Gamutmunse", labCurve.gamutmunselmethod, keyFile); saveToKeyfile(!pedited || pedited->labCurve.rstprotection, "Luminance Curve", "RedAndSkinTonesProtection", labCurve.rstprotection, keyFile); saveToKeyfile(!pedited || pedited->labCurve.lcredsk, "Luminance Curve", "LCredsk", labCurve.lcredsk, keyFile); saveToKeyfile(!pedited || pedited->labCurve.lcurve, "Luminance Curve", "LCurve", labCurve.lcurve, keyFile); @@ -3173,6 +6215,17 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wb.green, "White Balance", "Green", wb.green, keyFile); saveToKeyfile(!pedited || pedited->wb.equal, "White Balance", "Equal", wb.equal, keyFile); saveToKeyfile(!pedited || pedited->wb.tempBias, "White Balance", "TemperatureBias", wb.tempBias, keyFile); + saveToKeyfile(!pedited || pedited->wb.observer, "White Balance", "StandardObserver", Glib::ustring(wb.observer == StandardObserver::TWO_DEGREES ? "TWO_DEGREES" : "TEN_DEGREES"), keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_thres, "White Balance", "Itcwb_thres", wb.itcwb_thres, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_precis, "White Balance", "Itcwb_precis", wb.itcwb_precis, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_size, "White Balance", "Itcwb_size", wb.itcwb_size, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_delta, "White Balance", "Itcwb_delta", wb.itcwb_delta, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_fgreen, "White Balance", "Itcwb_findgreen", wb.itcwb_fgreen, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_rgreen, "White Balance", "Itcwb_rangegreen", wb.itcwb_rgreen, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_nopurple, "White Balance", "Itcwb_nopurple", wb.itcwb_nopurple, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_sorted, "White Balance", "Itcwb_sorted", wb.itcwb_sorted, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_forceextra, "White Balance", "Itcwb_forceextra", wb.itcwb_forceextra, keyFile); + saveToKeyfile(!pedited || pedited->wb.itcwb_sampling, "White Balance", "Itcwb_sampling", wb.itcwb_sampling, keyFile); // Colorappearance saveToKeyfile(!pedited || pedited->colorappearance.enabled, "Color appearance", "Enabled", colorappearance.enabled, keyFile); @@ -3181,10 +6234,14 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorappearance.degreeout, "Color appearance", "Degreeout", colorappearance.degreeout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.autodegreeout, "Color appearance", "AutoDegreeout", colorappearance.autodegreeout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.surround, "Color appearance", "Surround", colorappearance.surround, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.complexmethod, "Color appearance", "complex", colorappearance.complexmethod, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.modelmethod, "Color appearance", "ModelCat", colorappearance.modelmethod, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.catmethod, "Color appearance", "CatCat", colorappearance.catmethod, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.surrsrc, "Color appearance", "Surrsrc", colorappearance.surrsrc, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.adaplum, "Color appearance", "AdaptLum", colorappearance.adaplum, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.badpixsl, "Color appearance", "Badpixsl", colorappearance.badpixsl, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.wbmodel, "Color appearance", "Model", colorappearance.wbmodel, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.illum, "Color appearance", "Illum", colorappearance.illum, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.algo, "Color appearance", "Algorithm", colorappearance.algo, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.jlight, "Color appearance", "J-Light", colorappearance.jlight, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.qbright, "Color appearance", "Q-Bright", colorappearance.qbright, keyFile); @@ -3202,6 +6259,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorappearance.surrsource, "Color appearance", "SurrSource", colorappearance.surrsource, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.gamut, "Color appearance", "Gamut", colorappearance.gamut, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.tempout, "Color appearance", "Tempout", colorappearance.tempout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autotempout, "Color appearance", "Autotempout", colorappearance.autotempout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.greenout, "Color appearance", "Greenout", colorappearance.greenout, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.tempsc, "Color appearance", "Tempsc", colorappearance.tempsc, keyFile); saveToKeyfile(!pedited || pedited->colorappearance.greensc, "Color appearance", "Greensc", colorappearance.greensc, keyFile); @@ -3224,7 +6282,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo {ColorAppearanceParams::CtcMode::CHROMA, "Chroma"}, {ColorAppearanceParams::CtcMode::SATUR, "Saturation"}, {ColorAppearanceParams::CtcMode::COLORF, "Colorfullness"} - }, colorappearance.curveMode3, keyFile @@ -3248,7 +6305,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); - saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Luminance", dehaze.luminance, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Saturation", dehaze.saturation, keyFile); // Directional pyramid denoising saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); @@ -3305,6 +6362,14 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile); saveToKeyfile(!pedited || pedited->sh.lab, "Shadows & Highlights", "Lab", sh.lab, keyFile); +// Tone equalizer + saveToKeyfile(!pedited || pedited->toneEqualizer.enabled, "ToneEqualizer", "Enabled", toneEqualizer.enabled, keyFile); + for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) { + saveToKeyfile(!pedited || pedited->toneEqualizer.bands[i], "ToneEqualizer", "Band" + std::to_string(i), toneEqualizer.bands[i], keyFile); + } + saveToKeyfile(!pedited || pedited->toneEqualizer.regularization, "ToneEqualizer", "Regularization", toneEqualizer.regularization, keyFile); + saveToKeyfile(!pedited || pedited->toneEqualizer.pivot, "ToneEqualizer", "Pivot", toneEqualizer.pivot, keyFile); + // Crop saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile); saveToKeyfile(!pedited || pedited->crop.x, "Crop", "X", crop.x, keyFile); @@ -3314,7 +6379,25 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->crop.fixratio, "Crop", "FixedRatio", crop.fixratio, keyFile); saveToKeyfile(!pedited || pedited->crop.ratio, "Crop", "Ratio", crop.ratio, keyFile); saveToKeyfile(!pedited || pedited->crop.orientation, "Crop", "Orientation", crop.orientation, keyFile); - saveToKeyfile(!pedited || pedited->crop.guide, "Crop", "Guide", crop.guide, keyFile); + saveToKeyfile( + !pedited || pedited->crop.guide, + "Crop", + "Guide", + { + {CropParams::Guide::NONE, "None"}, + {CropParams::Guide::FRAME, "Frame"}, + {CropParams::Guide::RULE_OF_THIRDS, "Rule of thirds"}, + {CropParams::Guide::RULE_OF_DIAGONALS, "Rule of diagonals"}, + {CropParams::Guide::HARMONIC_MEANS, "Harmonic means"}, + {CropParams::Guide::GRID, "Grid"}, + {CropParams::Guide::GOLDEN_TRIANGLE_1, "Golden Triangle 1"}, + {CropParams::Guide::GOLDEN_TRIANGLE_2, "Golden Triangle 2"}, + {CropParams::Guide::EPASSPORT, "ePassport"}, + {CropParams::Guide::CENTERED_SQUARE, "Centered square"}, + }, + crop.guide, + keyFile + ); // Coarse transformation saveToKeyfile(!pedited || pedited->coarse.rotate, "Coarse Transformation", "Rotate", coarse.rotate, keyFile); @@ -3322,6 +6405,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->coarse.vflip, "Coarse Transformation", "VerticalFlip", coarse.vflip, keyFile); // Common properties for transformations + saveToKeyfile(!pedited || pedited->commonTrans.method, "Common Properties for Transformations", "Method", commonTrans.method, keyFile); saveToKeyfile(!pedited || pedited->commonTrans.autofill, "Common Properties for Transformations", "AutoFill", commonTrans.autofill, keyFile); // Rotation @@ -3332,7 +6416,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // 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.lcpFile, "LensProfile", "LCPFile", relativePathIfInside2(fname, options.rtSettings.lensProfilesPath, 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); @@ -3341,8 +6425,24 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->lensProf.lfLens, "LensProfile", "LFLens", lensProf.lfLens, keyFile); // Perspective correction + saveToKeyfile(!pedited || pedited->perspective.method, "Perspective", "Method", perspective.method, keyFile); saveToKeyfile(!pedited || pedited->perspective.horizontal, "Perspective", "Horizontal", perspective.horizontal, keyFile); saveToKeyfile(!pedited || pedited->perspective.vertical, "Perspective", "Vertical", perspective.vertical, keyFile); + saveToKeyfile(!pedited || pedited->perspective.camera_crop_factor, "Perspective", "CameraCropFactor", perspective.camera_crop_factor, keyFile); + saveToKeyfile(!pedited || pedited->perspective.camera_focal_length, "Perspective", "CameraFocalLength", perspective.camera_focal_length, keyFile); + saveToKeyfile(!pedited || pedited->perspective.camera_pitch, "Perspective", "CameraPitch", perspective.camera_pitch, keyFile); + saveToKeyfile(!pedited || pedited->perspective.camera_roll, "Perspective", "CameraRoll", perspective.camera_roll, keyFile); + saveToKeyfile(!pedited || pedited->perspective.camera_shift_horiz, "Perspective", "CameraShiftHorizontal", perspective.camera_shift_horiz, keyFile); + saveToKeyfile(!pedited || pedited->perspective.camera_shift_vert, "Perspective", "CameraShiftVertical", perspective.camera_shift_vert, keyFile); + saveToKeyfile(!pedited || pedited->perspective.camera_yaw, "Perspective", "CameraYaw", perspective.camera_yaw, keyFile); + saveToKeyfile(!pedited || pedited->perspective.projection_shift_horiz, "Perspective", "ProjectionShiftHorizontal", perspective.projection_shift_horiz, keyFile); + saveToKeyfile(!pedited || pedited->perspective.projection_pitch, "Perspective", "ProjectionPitch", perspective.projection_pitch, keyFile); + saveToKeyfile(!pedited || pedited->perspective.projection_rotate, "Perspective", "ProjectionRotate", perspective.projection_rotate, keyFile); + saveToKeyfile(!pedited || pedited->perspective.projection_shift_horiz, "Perspective", "ProjectionShiftHorizontal", perspective.projection_shift_horiz, keyFile); + saveToKeyfile(!pedited || pedited->perspective.projection_shift_vert, "Perspective", "ProjectionShiftVertical", perspective.projection_shift_vert, keyFile); + saveToKeyfile(!pedited || pedited->perspective.projection_yaw, "Perspective", "ProjectionYaw", perspective.projection_yaw, keyFile); + saveToKeyfile(!pedited || pedited->perspective.control_lines, "Perspective", "ControlLineValues", perspective.control_line_values, keyFile); + saveToKeyfile(!pedited || pedited->perspective.control_lines, "Perspective", "ControlLineTypes", perspective.control_line_types, keyFile); // Gradient saveToKeyfile(!pedited || pedited->gradient.enabled, "Gradient", "Enabled", gradient.enabled, keyFile); @@ -3352,6 +6452,734 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->gradient.centerX, "Gradient", "CenterX", gradient.centerX, keyFile); saveToKeyfile(!pedited || pedited->gradient.centerY, "Gradient", "CenterY", gradient.centerY, keyFile); +// Locallab + saveToKeyfile(!pedited || pedited->locallab.enabled, "Locallab", "Enabled", locallab.enabled, keyFile); + saveToKeyfile(!pedited || pedited->locallab.selspot, "Locallab", "Selspot", locallab.selspot, keyFile); + + for (size_t i = 0; i < locallab.spots.size(); ++i) { + if (!pedited || i < pedited->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = locallab.spots.at(i); + const LocallabParamsEdited::LocallabSpotEdited* const spot_edited = + pedited + ? &pedited->locallab.spots.at(i) + : nullptr; + const std::string index_str = std::to_string(i); + // Control spot settings + saveToKeyfile(!pedited || spot_edited->name, "Locallab", "Name_" + index_str, spot.name, keyFile); + saveToKeyfile(!pedited || spot_edited->isvisible, "Locallab", "Isvisible_" + index_str, spot.isvisible, keyFile); + saveToKeyfile(!pedited || spot_edited->prevMethod, "Locallab", "PrevMethod_" + index_str, spot.prevMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->shape, "Locallab", "Shape_" + index_str, spot.shape, keyFile); + saveToKeyfile(!pedited || spot_edited->spotMethod, "Locallab", "SpotMethod_" + index_str, spot.spotMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->wavMethod, "Locallab", "WavMethod_" + index_str, spot.wavMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->sensiexclu, "Locallab", "SensiExclu_" + index_str, spot.sensiexclu, keyFile); + saveToKeyfile(!pedited || spot_edited->structexclu, "Locallab", "StructExclu_" + index_str, spot.structexclu, keyFile); + saveToKeyfile(!pedited || spot_edited->struc, "Locallab", "Struc_" + index_str, spot.struc, keyFile); + saveToKeyfile(!pedited || spot_edited->shapeMethod, "Locallab", "ShapeMethod_" + index_str, spot.shapeMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->avoidgamutMethod, "Locallab", "AvoidgamutMethod_" + index_str, spot.avoidgamutMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->loc, "Locallab", "Loc_" + index_str, spot.loc, keyFile); + saveToKeyfile(!pedited || spot_edited->centerX, "Locallab", "CenterX_" + index_str, spot.centerX, keyFile); + saveToKeyfile(!pedited || spot_edited->centerY, "Locallab", "CenterY_" + index_str, spot.centerY, keyFile); + saveToKeyfile(!pedited || spot_edited->circrad, "Locallab", "Circrad_" + index_str, spot.circrad, keyFile); + saveToKeyfile(!pedited || spot_edited->qualityMethod, "Locallab", "QualityMethod_" + index_str, spot.qualityMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->complexMethod, "Locallab", "ComplexMethod_" + index_str, spot.complexMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->transit, "Locallab", "Transit_" + index_str, spot.transit, keyFile); + saveToKeyfile(!pedited || spot_edited->feather, "Locallab", "Feather_" + index_str, spot.feather, keyFile); + saveToKeyfile(!pedited || spot_edited->thresh, "Locallab", "Thresh_" + index_str, spot.thresh, keyFile); + saveToKeyfile(!pedited || spot_edited->iter, "Locallab", "Iter_" + index_str, spot.iter, keyFile); + saveToKeyfile(!pedited || spot_edited->balan, "Locallab", "Balan_" + index_str, spot.balan, keyFile); + saveToKeyfile(!pedited || spot_edited->balanh, "Locallab", "Balanh_" + index_str, spot.balanh, keyFile); + saveToKeyfile(!pedited || spot_edited->colorde, "Locallab", "Colorde_" + index_str, spot.colorde, keyFile); + saveToKeyfile(!pedited || spot_edited->colorscope, "Locallab", "Colorscope_" + index_str, spot.colorscope, keyFile); + saveToKeyfile(!pedited || spot_edited->avoidrad, "Locallab", "Avoidrad_" + index_str, spot.avoidrad, keyFile); + saveToKeyfile(!pedited || spot_edited->transitweak, "Locallab", "Transitweak_" + index_str, spot.transitweak, keyFile); + saveToKeyfile(!pedited || spot_edited->transitgrad, "Locallab", "Transitgrad_" + index_str, spot.transitgrad, keyFile); + saveToKeyfile(!pedited || spot_edited->hishow, "Locallab", "Hishow_" + index_str, spot.hishow, keyFile); + saveToKeyfile(!pedited || spot_edited->activ, "Locallab", "Activ_" + index_str, spot.activ, keyFile); + saveToKeyfile(!pedited || spot_edited->blwh, "Locallab", "Blwh_" + index_str, spot.blwh, keyFile); + saveToKeyfile(!pedited || spot_edited->recurs, "Locallab", "Recurs_" + index_str, spot.recurs, keyFile); + saveToKeyfile(!pedited || spot_edited->laplac, "Locallab", "Laplac_" + index_str, spot.laplac, keyFile); + saveToKeyfile(!pedited || spot_edited->deltae, "Locallab", "Deltae_" + index_str, spot.deltae, keyFile); + saveToKeyfile(!pedited || spot_edited->shortc, "Locallab", "Shortc_" + index_str, spot.shortc, keyFile); + saveToKeyfile(!pedited || spot_edited->savrest, "Locallab", "Savrest_" + index_str, spot.savrest, keyFile); + saveToKeyfile(!pedited || spot_edited->scopemask, "Locallab", "Scopemask_" + index_str, spot.scopemask, keyFile); + saveToKeyfile(!pedited || spot_edited->denoichmask, "Locallab", "Denoichmask_" + index_str, spot.denoichmask, keyFile); + saveToKeyfile(!pedited || spot_edited->lumask, "Locallab", "Lumask_" + index_str, spot.lumask, keyFile); + // Color & Light + if ((!pedited || spot_edited->visicolor) && spot.visicolor) { + saveToKeyfile(!pedited || spot_edited->expcolor, "Locallab", "Expcolor_" + index_str, spot.expcolor, keyFile); + saveToKeyfile(!pedited || spot_edited->complexcolor, "Locallab", "Complexcolor_" + index_str, spot.complexcolor, keyFile); + saveToKeyfile(!pedited || spot_edited->curvactiv, "Locallab", "Curvactiv_" + index_str, spot.curvactiv, keyFile); + saveToKeyfile(!pedited || spot_edited->lightness, "Locallab", "Lightness_" + index_str, spot.lightness, keyFile); + saveToKeyfile(!pedited || spot_edited->reparcol, "Locallab", "Reparcol_" + index_str, spot.reparcol, keyFile); + saveToKeyfile(!pedited || spot_edited->gamc, "Locallab", "Gamc_" + index_str, spot.gamc, keyFile); + saveToKeyfile(!pedited || spot_edited->contrast, "Locallab", "Contrast_" + index_str, spot.contrast, keyFile); + saveToKeyfile(!pedited || spot_edited->chroma, "Locallab", "Chroma_" + index_str, spot.chroma, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridALow, "Locallab", "labgridALow_" + index_str, spot.labgridALow, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridBLow, "Locallab", "labgridBLow_" + index_str, spot.labgridBLow, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridAHigh, "Locallab", "labgridAHigh_" + index_str, spot.labgridAHigh, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridBHigh, "Locallab", "labgridBHigh_" + index_str, spot.labgridBHigh, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridALowmerg, "Locallab", "labgridALowmerg_" + index_str, spot.labgridALowmerg, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridBLowmerg, "Locallab", "labgridBLowmerg_" + index_str, spot.labgridBLowmerg, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridAHighmerg, "Locallab", "labgridAHighmerg_" + index_str, spot.labgridAHighmerg, keyFile); + saveToKeyfile(!pedited || spot_edited->labgridBHighmerg, "Locallab", "labgridBHighmerg_" + index_str, spot.labgridBHighmerg, keyFile); + saveToKeyfile(!pedited || spot_edited->strengthgrid, "Locallab", "Strengthgrid_" + index_str, spot.strengthgrid, keyFile); + saveToKeyfile(!pedited || spot_edited->sensi, "Locallab", "Sensi_" + index_str, spot.sensi, keyFile); + saveToKeyfile(!pedited || spot_edited->structcol, "Locallab", "Structcol_" + index_str, spot.structcol, keyFile); + saveToKeyfile(!pedited || spot_edited->strcol, "Locallab", "Strcol_" + index_str, spot.strcol, keyFile); + saveToKeyfile(!pedited || spot_edited->strcolab, "Locallab", "Strcolab_" + index_str, spot.strcolab, keyFile); + saveToKeyfile(!pedited || spot_edited->strcolh, "Locallab", "Strcolh_" + index_str, spot.strcolh, keyFile); + saveToKeyfile(!pedited || spot_edited->angcol, "Locallab", "Angcol_" + index_str, spot.angcol, keyFile); + saveToKeyfile(!pedited || spot_edited->blurcolde, "Locallab", "Blurcolde_" + index_str, spot.blurcolde, keyFile); + saveToKeyfile(!pedited || spot_edited->blurcol, "Locallab", "Blurcol_" + index_str, spot.blurcol, keyFile); + saveToKeyfile(!pedited || spot_edited->contcol, "Locallab", "Contcol_" + index_str, spot.contcol, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskcol, "Locallab", "Blendmaskcol_" + index_str, spot.blendmaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskcol, "Locallab", "Radmaskcol_" + index_str, spot.radmaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskcol, "Locallab", "Chromaskcol_" + index_str, spot.chromaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskcol, "Locallab", "Gammaskcol_" + index_str, spot.gammaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskcol, "Locallab", "Slomaskcol_" + index_str, spot.slomaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->shadmaskcol, "Locallab", "shadmaskcol_" + index_str, spot.shadmaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->strumaskcol, "Locallab", "strumaskcol_" + index_str, spot.strumaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskcol, "Locallab", "Lapmaskcol_" + index_str, spot.lapmaskcol, keyFile); + saveToKeyfile(!pedited || spot_edited->qualitycurveMethod, "Locallab", "QualityCurveMethod_" + index_str, spot.qualitycurveMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->gridMethod, "Locallab", "gridMethod_" + index_str, spot.gridMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->merMethod, "Locallab", "Merg_Method_" + index_str, spot.merMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->toneMethod, "Locallab", "ToneMethod_" + index_str, spot.toneMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->mergecolMethod, "Locallab", "mergecolMethod_" + index_str, spot.mergecolMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->llcurve, "Locallab", "LLCurve_" + index_str, spot.llcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->lccurve, "Locallab", "LCCurve_" + index_str, spot.lccurve, keyFile); + saveToKeyfile(!pedited || spot_edited->cccurve, "Locallab", "CCCurve_" + index_str, spot.cccurve, keyFile); + saveToKeyfile(!pedited || spot_edited->clcurve, "Locallab", "CLCurve_" + index_str, spot.clcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->rgbcurve, "Locallab", "RGBCurve_" + index_str, spot.rgbcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LHcurve, "Locallab", "LHCurve_" + index_str, spot.LHcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHcurve, "Locallab", "HHCurve_" + index_str, spot.HHcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurve, "Locallab", "CHCurve_" + index_str, spot.CHcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->invers, "Locallab", "Invers_" + index_str, spot.invers, keyFile); + saveToKeyfile(!pedited || spot_edited->special, "Locallab", "Special_" + index_str, spot.special, keyFile); + saveToKeyfile(!pedited || spot_edited->toolcol, "Locallab", "Toolcol_" + index_str, spot.toolcol, keyFile); + saveToKeyfile(!pedited || spot_edited->enaColorMask, "Locallab", "EnaColorMask_" + index_str, spot.enaColorMask, keyFile); + saveToKeyfile(!pedited || spot_edited->fftColorMask, "Locallab", "FftColorMask_" + index_str, spot.fftColorMask, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskcurve, "Locallab", "CCmaskCurve_" + index_str, spot.CCmaskcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskcurve, "Locallab", "LLmaskCurve_" + index_str, spot.LLmaskcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskcurve, "Locallab", "HHmaskCurve_" + index_str, spot.HHmaskcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHhmaskcurve, "Locallab", "HHhmaskCurve_" + index_str, spot.HHhmaskcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->softradiuscol, "Locallab", "Softradiuscol_" + index_str, spot.softradiuscol, keyFile); + saveToKeyfile(!pedited || spot_edited->opacol, "Locallab", "Opacol_" + index_str, spot.opacol, keyFile); + saveToKeyfile(!pedited || spot_edited->mercol, "Locallab", "Mercol_" + index_str, spot.mercol, keyFile); + saveToKeyfile(!pedited || spot_edited->merlucol, "Locallab", "Merlucol_" + index_str, spot.merlucol, keyFile); + saveToKeyfile(!pedited || spot_edited->conthrcol, "Locallab", "Conthrcol_" + index_str, spot.conthrcol, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskcurve, "Locallab", "LmaskCurve_" + index_str, spot.Lmaskcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskcolcurvewav, "Locallab", "LLmaskcolCurvewav_" + index_str, spot.LLmaskcolcurvewav, keyFile); + saveToKeyfile(!pedited || spot_edited->csthresholdcol, "Locallab", "CSThresholdcol_" + index_str, spot.csthresholdcol.toVector(), keyFile); + saveToKeyfile(!pedited || spot_edited->recothresc, "Locallab", "Recothresc_" + index_str, spot.recothresc, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthresc, "Locallab", "Lowthresc_" + index_str, spot.lowthresc, keyFile); + saveToKeyfile(!pedited || spot_edited->higthresc, "Locallab", "Higthresc_" + index_str, spot.higthresc, keyFile); + saveToKeyfile(!pedited || spot_edited->decayc, "Locallab", "Decayc_" + index_str, spot.decayc, keyFile); + } + // Exposure + if ((!pedited || spot_edited->visiexpose) && spot.visiexpose) { + saveToKeyfile(!pedited || spot_edited->expexpose, "Locallab", "Expexpose_" + index_str, spot.expexpose, keyFile); + saveToKeyfile(!pedited || spot_edited->complexexpose, "Locallab", "Complexexpose_" + index_str, spot.complexexpose, keyFile); + saveToKeyfile(!pedited || spot_edited->expcomp, "Locallab", "Expcomp_" + index_str, spot.expcomp, keyFile); + saveToKeyfile(!pedited || spot_edited->hlcompr, "Locallab", "Hlcompr_" + index_str, spot.hlcompr, keyFile); + saveToKeyfile(!pedited || spot_edited->hlcomprthresh, "Locallab", "Hlcomprthresh_" + index_str, spot.hlcomprthresh, keyFile); + saveToKeyfile(!pedited || spot_edited->black, "Locallab", "Black_" + index_str, spot.black, keyFile); + saveToKeyfile(!pedited || spot_edited->shadex, "Locallab", "Shadex_" + index_str, spot.shadex, keyFile); + saveToKeyfile(!pedited || spot_edited->shcompr, "Locallab", "Shcompr_" + index_str, spot.shcompr, keyFile); + saveToKeyfile(!pedited || spot_edited->expchroma, "Locallab", "Expchroma_" + index_str, spot.expchroma, keyFile); + saveToKeyfile(!pedited || spot_edited->sensiex, "Locallab", "Sensiex_" + index_str, spot.sensiex, keyFile); + saveToKeyfile(!pedited || spot_edited->structexp, "Locallab", "Structexp_" + index_str, spot.structexp, keyFile); + saveToKeyfile(!pedited || spot_edited->blurexpde, "Locallab", "Blurexpde_" + index_str, spot.blurexpde, keyFile); + saveToKeyfile(!pedited || spot_edited->gamex, "Locallab", "Gamex_" + index_str, spot.gamex, keyFile); + saveToKeyfile(!pedited || spot_edited->strexp, "Locallab", "Strexp_" + index_str, spot.strexp, keyFile); + saveToKeyfile(!pedited || spot_edited->angexp, "Locallab", "Angexp_" + index_str, spot.angexp, keyFile); + saveToKeyfile(!pedited || spot_edited->excurve, "Locallab", "ExCurve_" + index_str, spot.excurve, keyFile); + saveToKeyfile(!pedited || spot_edited->norm, "Locallab", "Norm_" + index_str, spot.norm, keyFile); + saveToKeyfile(!pedited || spot_edited->inversex, "Locallab", "Inversex_" + index_str, spot.inversex, keyFile); + saveToKeyfile(!pedited || spot_edited->enaExpMask, "Locallab", "EnaExpMask_" + index_str, spot.enaExpMask, keyFile); + saveToKeyfile(!pedited || spot_edited->enaExpMaskaft, "Locallab", "EnaExpMaskaft_" + index_str, spot.enaExpMaskaft, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskexpcurve, "Locallab", "CCmaskexpCurve_" + index_str, spot.CCmaskexpcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskexpcurve, "Locallab", "LLmaskexpCurve_" + index_str, spot.LLmaskexpcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskexpcurve, "Locallab", "HHmaskexpCurve_" + index_str, spot.HHmaskexpcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskexp, "Locallab", "Blendmaskexp_" + index_str, spot.blendmaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskexp, "Locallab", "Radmaskexp_" + index_str, spot.radmaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskexp, "Locallab", "Chromaskexp_" + index_str, spot.chromaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskexp, "Locallab", "Gammaskexp_" + index_str, spot.gammaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskexp, "Locallab", "Slomaskexp_" + index_str, spot.slomaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskexp, "Locallab", "Lapmaskexp_" + index_str, spot.lapmaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->strmaskexp, "Locallab", "Strmaskexp_" + index_str, spot.strmaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->angmaskexp, "Locallab", "Angmaskexp_" + index_str, spot.angmaskexp, keyFile); + saveToKeyfile(!pedited || spot_edited->softradiusexp, "Locallab", "Softradiusexp_" + index_str, spot.softradiusexp, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskexpcurve, "Locallab", "LmaskexpCurve_" + index_str, spot.Lmaskexpcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->expMethod, "Locallab", "ExpMethod_" + index_str, spot.expMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->exnoiseMethod, "Locallab", "ExnoiseMethod_" + index_str, spot.exnoiseMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->laplacexp, "Locallab", "Laplacexp_" + index_str, spot.laplacexp, keyFile); + saveToKeyfile(!pedited || spot_edited->reparexp, "Locallab", "Reparexp_" + index_str, spot.reparexp, keyFile); + saveToKeyfile(!pedited || spot_edited->balanexp, "Locallab", "Balanexp_" + index_str, spot.balanexp, keyFile); + saveToKeyfile(!pedited || spot_edited->linear, "Locallab", "Linearexp_" + index_str, spot.linear, keyFile); + saveToKeyfile(!pedited || spot_edited->gamm, "Locallab", "Gamm_" + index_str, spot.gamm, keyFile); + saveToKeyfile(!pedited || spot_edited->fatamount, "Locallab", "Fatamount_" + index_str, spot.fatamount, keyFile); + saveToKeyfile(!pedited || spot_edited->fatdetail, "Locallab", "Fatdetail_" + index_str, spot.fatdetail, keyFile); + saveToKeyfile(!pedited || spot_edited->fatanchor, "Locallab", "Fatanchor_" + index_str, spot.fatanchor, keyFile); + saveToKeyfile(!pedited || spot_edited->fatlevel, "Locallab", "Fatlevel_" + index_str, spot.fatlevel, keyFile); + saveToKeyfile(!pedited || spot_edited->recothrese, "Locallab", "Recothrese_" + index_str, spot.recothrese, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthrese, "Locallab", "Lowthrese_" + index_str, spot.lowthrese, keyFile); + saveToKeyfile(!pedited || spot_edited->higthrese, "Locallab", "Higthrese_" + index_str, spot.higthrese, keyFile); + saveToKeyfile(!pedited || spot_edited->decaye, "Locallab", "Decaye_" + index_str, spot.decaye, keyFile); + } + // Shadow highlight + if ((!pedited || spot_edited->visishadhigh) && spot.visishadhigh) { + saveToKeyfile(!pedited || spot_edited->expshadhigh, "Locallab", "Expshadhigh_" + index_str, spot.expshadhigh, keyFile); + saveToKeyfile(!pedited || spot_edited->complexshadhigh, "Locallab", "Complexshadhigh_" + index_str, spot.complexshadhigh, keyFile); + saveToKeyfile(!pedited || spot_edited->shMethod, "Locallab", "ShMethod_" + index_str, spot.shMethod, keyFile); + + for (int j = 0; j < 5; j++) { + saveToKeyfile(!pedited || spot_edited->multsh[j], "Locallab", "Multsh" + std::to_string(j) + "_" + index_str, spot.multsh[j], keyFile); + } + + saveToKeyfile(!pedited || spot_edited->highlights, "Locallab", "highlights_" + index_str, spot.highlights, keyFile); + saveToKeyfile(!pedited || spot_edited->h_tonalwidth, "Locallab", "h_tonalwidth_" + index_str, spot.h_tonalwidth, keyFile); + saveToKeyfile(!pedited || spot_edited->shadows, "Locallab", "shadows_" + index_str, spot.shadows, keyFile); + saveToKeyfile(!pedited || spot_edited->s_tonalwidth, "Locallab", "s_tonalwidth_" + index_str, spot.s_tonalwidth, keyFile); + saveToKeyfile(!pedited || spot_edited->sh_radius, "Locallab", "sh_radius_" + index_str, spot.sh_radius, keyFile); + saveToKeyfile(!pedited || spot_edited->sensihs, "Locallab", "sensihs_" + index_str, spot.sensihs, keyFile); + saveToKeyfile(!pedited || spot_edited->enaSHMask, "Locallab", "EnaSHMask_" + index_str, spot.enaSHMask, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskSHcurve, "Locallab", "CCmaskSHCurve_" + index_str, spot.CCmaskSHcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskSHcurve, "Locallab", "LLmaskSHCurve_" + index_str, spot.LLmaskSHcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskSHcurve, "Locallab", "HHmaskSHCurve_" + index_str, spot.HHmaskSHcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskSH, "Locallab", "BlendmaskSH_" + index_str, spot.blendmaskSH, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskSH, "Locallab", "RadmaskSH_" + index_str, spot.radmaskSH, keyFile); + saveToKeyfile(!pedited || spot_edited->blurSHde, "Locallab", "BlurSHde_" + index_str, spot.blurSHde, keyFile); + saveToKeyfile(!pedited || spot_edited->strSH, "Locallab", "StrSH_" + index_str, spot.strSH, keyFile); + saveToKeyfile(!pedited || spot_edited->angSH, "Locallab", "AngSH_" + index_str, spot.angSH, keyFile); + saveToKeyfile(!pedited || spot_edited->inverssh, "Locallab", "Inverssh_" + index_str, spot.inverssh, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskSH, "Locallab", "ChromaskSH_" + index_str, spot.chromaskSH, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskSH, "Locallab", "GammaskSH_" + index_str, spot.gammaskSH, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskSH, "Locallab", "SlomaskSH_" + index_str, spot.slomaskSH, keyFile); + saveToKeyfile(!pedited || spot_edited->detailSH, "Locallab", "DetailSH_" + index_str, spot.detailSH, keyFile); + saveToKeyfile(!pedited || spot_edited->tePivot, "Locallab", "TePivot_" + index_str, spot.tePivot, keyFile); + saveToKeyfile(!pedited || spot_edited->reparsh, "Locallab", "Reparsh_" + index_str, spot.reparsh, keyFile); + saveToKeyfile(!pedited || spot_edited->LmaskSHcurve, "Locallab", "LmaskSHCurve_" + index_str, spot.LmaskSHcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->fatamountSH, "Locallab", "FatamountSH_" + index_str, spot.fatamountSH, keyFile); + saveToKeyfile(!pedited || spot_edited->fatanchorSH, "Locallab", "FatanchorSH_" + index_str, spot.fatanchorSH, keyFile); + saveToKeyfile(!pedited || spot_edited->gamSH, "Locallab", "GamSH_" + index_str, spot.gamSH, keyFile); + saveToKeyfile(!pedited || spot_edited->sloSH, "Locallab", "SloSH_" + index_str, spot.sloSH, keyFile); + saveToKeyfile(!pedited || spot_edited->recothress, "Locallab", "Recothress_" + index_str, spot.recothress, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthress, "Locallab", "Lowthress_" + index_str, spot.lowthress, keyFile); + saveToKeyfile(!pedited || spot_edited->higthress, "Locallab", "Higthress_" + index_str, spot.higthress, keyFile); + saveToKeyfile(!pedited || spot_edited->decays, "Locallab", "Decays_" + index_str, spot.decays, keyFile); + } + // Vibrance + if ((!pedited || spot_edited->visivibrance) && spot.visivibrance) { + saveToKeyfile(!pedited || spot_edited->expvibrance, "Locallab", "Expvibrance_" + index_str, spot.expvibrance, keyFile); + saveToKeyfile(!pedited || spot_edited->complexvibrance, "Locallab", "Complexvibrance_" + index_str, spot.complexvibrance, keyFile); + saveToKeyfile(!pedited || spot_edited->saturated, "Locallab", "Saturated_" + index_str, spot.saturated, keyFile); + saveToKeyfile(!pedited || spot_edited->pastels, "Locallab", "Pastels_" + index_str, spot.pastels, keyFile); + saveToKeyfile(!pedited || spot_edited->vibgam, "Locallab", "Vibgam_" + index_str, spot.vibgam, keyFile); + saveToKeyfile(!pedited || spot_edited->warm, "Locallab", "Warm_" + index_str, spot.warm, keyFile); + saveToKeyfile(!pedited || spot_edited->psthreshold, "Locallab", "PSThreshold_" + index_str, spot.psthreshold.toVector(), keyFile); + saveToKeyfile(!pedited || spot_edited->protectskins, "Locallab", "ProtectSkins_" + index_str, spot.protectskins, keyFile); + saveToKeyfile(!pedited || spot_edited->avoidcolorshift, "Locallab", "AvoidColorShift_" + index_str, spot.avoidcolorshift, keyFile); + saveToKeyfile(!pedited || spot_edited->pastsattog, "Locallab", "PastSatTog_" + index_str, spot.pastsattog, keyFile); + saveToKeyfile(!pedited || spot_edited->sensiv, "Locallab", "Sensiv_" + index_str, spot.sensiv, keyFile); + saveToKeyfile(!pedited || spot_edited->skintonescurve, "Locallab", "SkinTonesCurve_" + index_str, spot.skintonescurve, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskvibcurve, "Locallab", "CCmaskvibCurve_" + index_str, spot.CCmaskvibcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskvibcurve, "Locallab", "LLmaskvibCurve_" + index_str, spot.LLmaskvibcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskvibcurve, "Locallab", "HHmaskvibCurve_" + index_str, spot.HHmaskvibcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->enavibMask, "Locallab", "EnavibMask_" + index_str, spot.enavibMask, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskvib, "Locallab", "Blendmaskvib_" + index_str, spot.blendmaskvib, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskvib, "Locallab", "Radmaskvib_" + index_str, spot.radmaskvib, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskvib, "Locallab", "Chromaskvib_" + index_str, spot.chromaskvib, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskvib, "Locallab", "Gammaskvib_" + index_str, spot.gammaskvib, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskvib, "Locallab", "Slomaskvib_" + index_str, spot.slomaskvib, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskvib, "Locallab", "Lapmaskvib_" + index_str, spot.lapmaskvib, keyFile); + saveToKeyfile(!pedited || spot_edited->strvib, "Locallab", "Strvib_" + index_str, spot.strvib, keyFile); + saveToKeyfile(!pedited || spot_edited->strvibab, "Locallab", "Strvibab_" + index_str, spot.strvibab, keyFile); + saveToKeyfile(!pedited || spot_edited->strvibh, "Locallab", "Strvibh_" + index_str, spot.strvibh, keyFile); + saveToKeyfile(!pedited || spot_edited->angvib, "Locallab", "Angvib_" + index_str, spot.angvib, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskvibcurve, "Locallab", "LmaskvibCurve_" + index_str, spot.Lmaskvibcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->recothresv, "Locallab", "Recothresv_" + index_str, spot.recothresv, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthresv, "Locallab", "Lowthresv_" + index_str, spot.lowthresv, keyFile); + saveToKeyfile(!pedited || spot_edited->higthresv, "Locallab", "Higthresv_" + index_str, spot.higthresv, keyFile); + saveToKeyfile(!pedited || spot_edited->decayv, "Locallab", "Decayv_" + index_str, spot.decayv, keyFile); + } + // Soft Light + if ((!pedited || spot_edited->visisoft) && spot.visisoft) { + saveToKeyfile(!pedited || spot_edited->expsoft, "Locallab", "Expsoft_" + index_str, spot.expsoft, keyFile); + saveToKeyfile(!pedited || spot_edited->complexsoft, "Locallab", "Complexsoft_" + index_str, spot.complexsoft, keyFile); + saveToKeyfile(!pedited || spot_edited->streng, "Locallab", "Streng_" + index_str, spot.streng, keyFile); + saveToKeyfile(!pedited || spot_edited->sensisf, "Locallab", "Sensisf_" + index_str, spot.sensisf, keyFile); + saveToKeyfile(!pedited || spot_edited->laplace, "Locallab", "Laplace_" + index_str, spot.laplace, keyFile); + saveToKeyfile(!pedited || spot_edited->softMethod, "Locallab", "SoftMethod_" + index_str, spot.softMethod, keyFile); + } + // Blur & Noise + if ((!pedited || spot_edited->visiblur) && spot.visiblur) { + saveToKeyfile(!pedited || spot_edited->expblur, "Locallab", "Expblur_" + index_str, spot.expblur, keyFile); + saveToKeyfile(!pedited || spot_edited->complexblur, "Locallab", "Complexblur_" + index_str, spot.complexblur, keyFile); + saveToKeyfile(!pedited || spot_edited->radius, "Locallab", "Radius_" + index_str, spot.radius, keyFile); + saveToKeyfile(!pedited || spot_edited->strength, "Locallab", "Strength_" + index_str, spot.strength, keyFile); + saveToKeyfile(!pedited || spot_edited->sensibn, "Locallab", "Sensibn_" + index_str, spot.sensibn, keyFile); + saveToKeyfile(!pedited || spot_edited->itera, "Locallab", "Iteramed_" + index_str, spot.itera, keyFile); + saveToKeyfile(!pedited || spot_edited->guidbl, "Locallab", "Guidbl_" + index_str, spot.guidbl, keyFile); + saveToKeyfile(!pedited || spot_edited->strbl, "Locallab", "Strbl_" + index_str, spot.strbl, keyFile); + saveToKeyfile(!pedited || spot_edited->recothres, "Locallab", "Recothres_" + index_str, spot.recothres, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthres, "Locallab", "Lowthres_" + index_str, spot.lowthres, keyFile); + saveToKeyfile(!pedited || spot_edited->higthres, "Locallab", "Higthres_" + index_str, spot.higthres, keyFile); + saveToKeyfile(!pedited || spot_edited->recothresd, "Locallab", "Recothresd_" + index_str, spot.recothresd, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthresd, "Locallab", "Lowthresd_" + index_str, spot.lowthresd, keyFile); + saveToKeyfile(!pedited || spot_edited->midthresd, "Locallab", "Midthresd_" + index_str, spot.midthresd, keyFile); + saveToKeyfile(!pedited || spot_edited->midthresdch, "Locallab", "Midthresdch_" + index_str, spot.midthresdch, keyFile); + saveToKeyfile(!pedited || spot_edited->higthresd, "Locallab", "Higthresd_" + index_str, spot.higthresd, keyFile); + saveToKeyfile(!pedited || spot_edited->decayd, "Locallab", "Decayd_" + index_str, spot.decayd, keyFile); + saveToKeyfile(!pedited || spot_edited->isogr, "Locallab", "Isogr_" + index_str, spot.isogr, keyFile); + saveToKeyfile(!pedited || spot_edited->strengr, "Locallab", "Strengr_" + index_str, spot.strengr, keyFile); + saveToKeyfile(!pedited || spot_edited->scalegr, "Locallab", "Scalegr_" + index_str, spot.scalegr, keyFile); + saveToKeyfile(!pedited || spot_edited->divgr, "Locallab", "Divgr_" + index_str, spot.divgr, keyFile); + saveToKeyfile(!pedited || spot_edited->epsbl, "Locallab", "Epsbl_" + index_str, spot.epsbl, keyFile); + saveToKeyfile(!pedited || spot_edited->blMethod, "Locallab", "BlMethod_" + index_str, spot.blMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->chroMethod, "Locallab", "ChroMethod_" + index_str, spot.chroMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->quamethod, "Locallab", "QuaMethod_" + index_str, spot.quamethod, keyFile); + saveToKeyfile(!pedited || spot_edited->blurMethod, "Locallab", "BlurMethod_" + index_str, spot.blurMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->usemask, "Locallab", "Usemaskb_" + index_str, spot.usemask, keyFile); + saveToKeyfile(!pedited || spot_edited->invmaskd, "Locallab", "Invmaskd_" + index_str, spot.invmaskd, keyFile); + saveToKeyfile(!pedited || spot_edited->invmask, "Locallab", "Invmask_" + index_str, spot.invmask, keyFile); + saveToKeyfile(!pedited || spot_edited->levelthr, "Locallab", "Levelthr_" + index_str, spot.levelthr, keyFile); + saveToKeyfile(!pedited || spot_edited->lnoiselow, "Locallab", "Lnoiselow_" + index_str, spot.lnoiselow, keyFile); + saveToKeyfile(!pedited || spot_edited->levelthrlow, "Locallab", "Levelthrlow_" + index_str, spot.levelthrlow, keyFile); + saveToKeyfile(!pedited || spot_edited->medMethod, "Locallab", "MedMethod_" + index_str, spot.medMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->activlum, "Locallab", "activlum_" + index_str, spot.activlum, keyFile); + saveToKeyfile(!pedited || spot_edited->noiselumf, "Locallab", "noiselumf_" + index_str, spot.noiselumf, keyFile); + saveToKeyfile(!pedited || spot_edited->noiselumf0, "Locallab", "noiselumf0_" + index_str, spot.noiselumf0, keyFile); + saveToKeyfile(!pedited || spot_edited->noiselumf2, "Locallab", "noiselumf2_" + index_str, spot.noiselumf2, keyFile); + saveToKeyfile(!pedited || spot_edited->noiselumc, "Locallab", "noiselumc_" + index_str, spot.noiselumc, keyFile); + saveToKeyfile(!pedited || spot_edited->noiselumdetail, "Locallab", "noiselumdetail_" + index_str, spot.noiselumdetail, keyFile); + saveToKeyfile(!pedited || spot_edited->noiselequal, "Locallab", "noiselequal_" + index_str, spot.noiselequal, keyFile); + saveToKeyfile(!pedited || spot_edited->noisegam, "Locallab", "noisegam_" + index_str, spot.noisegam, keyFile); + saveToKeyfile(!pedited || spot_edited->noisechrof, "Locallab", "noisechrof_" + index_str, spot.noisechrof, keyFile); + saveToKeyfile(!pedited || spot_edited->noisechroc, "Locallab", "noisechroc_" + index_str, spot.noisechroc, keyFile); + saveToKeyfile(!pedited || spot_edited->noisechrodetail, "Locallab", "noisechrodetail_" + index_str, spot.noisechrodetail, keyFile); + saveToKeyfile(!pedited || spot_edited->adjblur, "Locallab", "Adjblur_" + index_str, spot.adjblur, keyFile); + saveToKeyfile(!pedited || spot_edited->bilateral, "Locallab", "Bilateral_" + index_str, spot.bilateral, keyFile); + saveToKeyfile(!pedited || spot_edited->nlstr, "Locallab", "Nlstr_" + index_str, spot.nlstr, keyFile); + saveToKeyfile(!pedited || spot_edited->nldet, "Locallab", "Nldet_" + index_str, spot.nldet, keyFile); + saveToKeyfile(!pedited || spot_edited->nlpat, "Locallab", "Nlpat_" + index_str, spot.nlpat, keyFile); + saveToKeyfile(!pedited || spot_edited->nlrad, "Locallab", "Nlrad_" + index_str, spot.nlrad, keyFile); + saveToKeyfile(!pedited || spot_edited->nlgam, "Locallab", "Nlgam_" + index_str, spot.nlgam, keyFile); + saveToKeyfile(!pedited || spot_edited->sensiden, "Locallab", "Sensiden_" + index_str, spot.sensiden, keyFile); + saveToKeyfile(!pedited || spot_edited->reparden, "Locallab", "Reparden_" + index_str, spot.reparden, keyFile); + saveToKeyfile(!pedited || spot_edited->detailthr, "Locallab", "Detailthr_" + index_str, spot.detailthr, keyFile); + saveToKeyfile(!pedited || spot_edited->locwavcurveden, "Locallab", "LocwavCurveden_" + index_str, spot.locwavcurveden, keyFile); + saveToKeyfile(!pedited || spot_edited->locwavcurvehue, "Locallab", "LocwavCurvehue_" + index_str, spot.locwavcurvehue, keyFile); + saveToKeyfile(!pedited || spot_edited->showmaskblMethodtyp, "Locallab", "Showmasktyp_" + index_str, spot.showmaskblMethodtyp, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskblcurve, "Locallab", "CCmaskblCurve_" + index_str, spot.CCmaskblcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskblcurve, "Locallab", "LLmaskblCurve_" + index_str, spot.LLmaskblcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskblcurve, "Locallab", "HHmaskblCurve_" + index_str, spot.HHmaskblcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->enablMask, "Locallab", "EnablMask_" + index_str, spot.enablMask, keyFile); + saveToKeyfile(!pedited || spot_edited->fftwbl, "Locallab", "Fftwbl_" + index_str, spot.fftwbl, keyFile); + saveToKeyfile(!pedited || spot_edited->invbl, "Locallab", "Invbl_" + index_str, spot.invbl, keyFile); + saveToKeyfile(!pedited || spot_edited->toolbl, "Locallab", "Toolbl_" + index_str, spot.toolbl, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskbl, "Locallab", "Blendmaskbl_" + index_str, spot.blendmaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskbl, "Locallab", "Radmaskbl_" + index_str, spot.radmaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskbl, "Locallab", "Chromaskbl_" + index_str, spot.chromaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskbl, "Locallab", "Gammaskbl_" + index_str, spot.gammaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskbl, "Locallab", "Slomaskbl_" + index_str, spot.slomaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskbl, "Locallab", "Lapmaskbl_" + index_str, spot.lapmaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->shadmaskbl, "Locallab", "shadmaskbl_" + index_str, spot.shadmaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->shadmaskblsha, "Locallab", "shadmaskblsha_" + index_str, spot.shadmaskblsha, keyFile); + saveToKeyfile(!pedited || spot_edited->strumaskbl, "Locallab", "strumaskbl_" + index_str, spot.strumaskbl, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskblcurve, "Locallab", "LmaskblCurve_" + index_str, spot.Lmaskblcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskblcurvewav, "Locallab", "LLmaskblCurvewav_" + index_str, spot.LLmaskblcurvewav, keyFile); + saveToKeyfile(!pedited || spot_edited->csthresholdblur, "Locallab", "CSThresholdblur_" + index_str, spot.csthresholdblur.toVector(), keyFile); + } + // Tone Mapping + if ((!pedited || spot_edited->visitonemap) && spot.visitonemap) { + saveToKeyfile(!pedited || spot_edited->exptonemap, "Locallab", "Exptonemap_" + index_str, spot.exptonemap, keyFile); + saveToKeyfile(!pedited || spot_edited->complextonemap, "Locallab", "Complextonemap_" + index_str, spot.complextonemap, keyFile); + saveToKeyfile(!pedited || spot_edited->stren, "Locallab", "Stren_" + index_str, spot.stren, keyFile); + saveToKeyfile(!pedited || spot_edited->gamma, "Locallab", "Gamma_" + index_str, spot.gamma, keyFile); + saveToKeyfile(!pedited || spot_edited->estop, "Locallab", "Estop_" + index_str, spot.estop, keyFile); + saveToKeyfile(!pedited || spot_edited->scaltm, "Locallab", "Scaltm_" + index_str, spot.scaltm, keyFile); + saveToKeyfile(!pedited || spot_edited->repartm, "Locallab", "Repartm_" + index_str, spot.repartm, keyFile); + saveToKeyfile(!pedited || spot_edited->rewei, "Locallab", "Rewei_" + index_str, spot.rewei, keyFile); + saveToKeyfile(!pedited || spot_edited->satur, "Locallab", "Satur_" + index_str, spot.satur, keyFile); + saveToKeyfile(!pedited || spot_edited->sensitm, "Locallab", "Sensitm_" + index_str, spot.sensitm, keyFile); + saveToKeyfile(!pedited || spot_edited->softradiustm, "Locallab", "Softradiustm_" + index_str, spot.softradiustm, keyFile); + saveToKeyfile(!pedited || spot_edited->amount, "Locallab", "Amount_" + index_str, spot.amount, keyFile); + saveToKeyfile(!pedited || spot_edited->equiltm, "Locallab", "Equiltm_" + index_str, spot.equiltm, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmasktmcurve, "Locallab", "CCmasktmCurve_" + index_str, spot.CCmasktmcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmasktmcurve, "Locallab", "LLmasktmCurve_" + index_str, spot.LLmasktmcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmasktmcurve, "Locallab", "HHmasktmCurve_" + index_str, spot.HHmasktmcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->enatmMask, "Locallab", "EnatmMask_" + index_str, spot.enatmMask, keyFile); + saveToKeyfile(!pedited || spot_edited->enatmMaskaft, "Locallab", "EnatmMaskaft_" + index_str, spot.enatmMaskaft, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmasktm, "Locallab", "Blendmasktm_" + index_str, spot.blendmasktm, keyFile); + saveToKeyfile(!pedited || spot_edited->radmasktm, "Locallab", "Radmasktm_" + index_str, spot.radmasktm, keyFile); + saveToKeyfile(!pedited || spot_edited->chromasktm, "Locallab", "Chromasktm_" + index_str, spot.chromasktm, keyFile); + saveToKeyfile(!pedited || spot_edited->gammasktm, "Locallab", "Gammasktm_" + index_str, spot.gammasktm, keyFile); + saveToKeyfile(!pedited || spot_edited->slomasktm, "Locallab", "Slomasktm_" + index_str, spot.slomasktm, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmasktm, "Locallab", "Lapmasktm_" + index_str, spot.lapmasktm, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmasktmcurve, "Locallab", "LmasktmCurve_" + index_str, spot.Lmasktmcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->recothrest, "Locallab", "Recothrest_" + index_str, spot.recothrest, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthrest, "Locallab", "Lowthrest_" + index_str, spot.lowthrest, keyFile); + saveToKeyfile(!pedited || spot_edited->higthrest, "Locallab", "Higthrest_" + index_str, spot.higthrest, keyFile); + saveToKeyfile(!pedited || spot_edited->decayt, "Locallab", "Decayt_" + index_str, spot.decayt, keyFile); + } + // Retinex + if ((!pedited || spot_edited->visireti) && spot.visireti) { + saveToKeyfile(!pedited || spot_edited->expreti, "Locallab", "Expreti_" + index_str, spot.expreti, keyFile); + saveToKeyfile(!pedited || spot_edited->complexreti, "Locallab", "Complexreti_" + index_str, spot.complexreti, keyFile); + saveToKeyfile(!pedited || spot_edited->retinexMethod, "Locallab", "retinexMethod_" + index_str, spot.retinexMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->str, "Locallab", "Str_" + index_str, spot.str, keyFile); + saveToKeyfile(!pedited || spot_edited->chrrt, "Locallab", "Chrrt_" + index_str, spot.chrrt, keyFile); + saveToKeyfile(!pedited || spot_edited->neigh, "Locallab", "Neigh_" + index_str, spot.neigh, keyFile); + saveToKeyfile(!pedited || spot_edited->vart, "Locallab", "Vart_" + index_str, spot.vart, keyFile); + saveToKeyfile(!pedited || spot_edited->offs, "Locallab", "Offs_" + index_str, spot.offs, keyFile); + saveToKeyfile(!pedited || spot_edited->dehaz, "Locallab", "Dehaz_" + index_str, spot.dehaz, keyFile); + saveToKeyfile(!pedited || spot_edited->depth, "Locallab", "Depth_" + index_str, spot.depth, keyFile); + saveToKeyfile(!pedited || spot_edited->sensih, "Locallab", "Sensih_" + index_str, spot.sensih, keyFile); + saveToKeyfile(!pedited || spot_edited->localTgaincurve, "Locallab", "TgainCurve_" + index_str, spot.localTgaincurve, keyFile); + saveToKeyfile(!pedited || spot_edited->localTtranscurve, "Locallab", "TtransCurve_" + index_str, spot.localTtranscurve, keyFile); + saveToKeyfile(!pedited || spot_edited->inversret, "Locallab", "Inversret_" + index_str, spot.inversret, keyFile); + saveToKeyfile(!pedited || spot_edited->equilret, "Locallab", "Equilret_" + index_str, spot.equilret, keyFile); + saveToKeyfile(!pedited || spot_edited->loglin, "Locallab", "Loglin_" + index_str, spot.loglin, keyFile); + saveToKeyfile(!pedited || spot_edited->dehazeSaturation, "Locallab", "dehazeSaturation_" + index_str, spot.dehazeSaturation, keyFile); + saveToKeyfile(!pedited || spot_edited->softradiusret, "Locallab", "Softradiusret_" + index_str, spot.softradiusret, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskreticurve, "Locallab", "CCmaskretiCurve_" + index_str, spot.CCmaskreticurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskreticurve, "Locallab", "LLmaskretiCurve_" + index_str, spot.LLmaskreticurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskreticurve, "Locallab", "HHmaskretiCurve_" + index_str, spot.HHmaskreticurve, keyFile); + saveToKeyfile(!pedited || spot_edited->enaretiMask, "Locallab", "EnaretiMask_" + index_str, spot.enaretiMask, keyFile); + saveToKeyfile(!pedited || spot_edited->enaretiMasktmap, "Locallab", "EnaretiMasktmap_" + index_str, spot.enaretiMasktmap, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskreti, "Locallab", "Blendmaskreti_" + index_str, spot.blendmaskreti, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskreti, "Locallab", "Radmaskreti_" + index_str, spot.radmaskreti, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskreti, "Locallab", "Chromaskreti_" + index_str, spot.chromaskreti, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskreti, "Locallab", "Gammaskreti_" + index_str, spot.gammaskreti, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskreti, "Locallab", "Slomaskreti_" + index_str, spot.slomaskreti, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskreti, "Locallab", "Lapmaskreti_" + index_str, spot.lapmaskreti, keyFile); + saveToKeyfile(!pedited || spot_edited->scalereti, "Locallab", "Scalereti_" + index_str, spot.scalereti, keyFile); + saveToKeyfile(!pedited || spot_edited->darkness, "Locallab", "Darkness_" + index_str, spot.darkness, keyFile); + saveToKeyfile(!pedited || spot_edited->lightnessreti, "Locallab", "Lightnessreti_" + index_str, spot.lightnessreti, keyFile); + saveToKeyfile(!pedited || spot_edited->limd, "Locallab", "Limd_" + index_str, spot.limd, keyFile); + saveToKeyfile(!pedited || spot_edited->cliptm, "Locallab", "Cliptm_" + index_str, spot.cliptm, keyFile); + saveToKeyfile(!pedited || spot_edited->fftwreti, "Locallab", "Fftwreti_" + index_str, spot.fftwreti, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskreticurve, "Locallab", "LmaskretiCurve_" + index_str, spot.Lmaskreticurve, keyFile); + saveToKeyfile(!pedited || spot_edited->recothresr, "Locallab", "Recothresr_" + index_str, spot.recothresr, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthresr, "Locallab", "Lowthresr_" + index_str, spot.lowthresr, keyFile); + saveToKeyfile(!pedited || spot_edited->higthresr, "Locallab", "Higthresr_" + index_str, spot.higthresr, keyFile); + saveToKeyfile(!pedited || spot_edited->decayr, "Locallab", "Decayr_" + index_str, spot.decayr, keyFile); + } + // Sharpening + if ((!pedited || spot_edited->visisharp) && spot.visisharp) { + saveToKeyfile(!pedited || spot_edited->expsharp, "Locallab", "Expsharp_" + index_str, spot.expsharp, keyFile); + saveToKeyfile(!pedited || spot_edited->complexsharp, "Locallab", "Complexsharp_" + index_str, spot.complexsharp, keyFile); + saveToKeyfile(!pedited || spot_edited->sharcontrast, "Locallab", "Sharcontrast_" + index_str, spot.sharcontrast, keyFile); + saveToKeyfile(!pedited || spot_edited->sharradius, "Locallab", "Sharradius_" + index_str, spot.sharradius, keyFile); + saveToKeyfile(!pedited || spot_edited->sharamount, "Locallab", "Sharamount_" + index_str, spot.sharamount, keyFile); + saveToKeyfile(!pedited || spot_edited->shardamping, "Locallab", "Shardamping_" + index_str, spot.shardamping, keyFile); + saveToKeyfile(!pedited || spot_edited->shariter, "Locallab", "Shariter_" + index_str, spot.shariter, keyFile); + saveToKeyfile(!pedited || spot_edited->sharblur, "Locallab", "Sharblur_" + index_str, spot.sharblur, keyFile); + saveToKeyfile(!pedited || spot_edited->shargam, "Locallab", "Shargam_" + index_str, spot.shargam, keyFile); + saveToKeyfile(!pedited || spot_edited->sensisha, "Locallab", "Sensisha_" + index_str, spot.sensisha, keyFile); + saveToKeyfile(!pedited || spot_edited->inverssha, "Locallab", "Inverssha_" + index_str, spot.inverssha, keyFile); + } + // Local Contrast + if ((!pedited || spot_edited->visicontrast) && spot.visicontrast) { + saveToKeyfile(!pedited || spot_edited->expcontrast, "Locallab", "Expcontrast_" + index_str, spot.expcontrast, keyFile); + saveToKeyfile(!pedited || spot_edited->complexcontrast, "Locallab", "Complexcontrast_" + index_str, spot.complexcontrast, keyFile); + saveToKeyfile(!pedited || spot_edited->lcradius, "Locallab", "Lcradius_" + index_str, spot.lcradius, keyFile); + saveToKeyfile(!pedited || spot_edited->lcamount, "Locallab", "Lcamount_" + index_str, spot.lcamount, keyFile); + saveToKeyfile(!pedited || spot_edited->lcdarkness, "Locallab", "Lcdarkness_" + index_str, spot.lcdarkness, keyFile); + saveToKeyfile(!pedited || spot_edited->lclightness, "Locallab", "Lclightness_" + index_str, spot.lclightness, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmalc, "Locallab", "Sigmalc_" + index_str, spot.sigmalc, keyFile); + saveToKeyfile(!pedited || spot_edited->levelwav, "Locallab", "Levelwav_" + index_str, spot.levelwav, keyFile); + saveToKeyfile(!pedited || spot_edited->residcont, "Locallab", "Residcont_" + index_str, spot.residcont, keyFile); + saveToKeyfile(!pedited || spot_edited->residsha, "Locallab", "Residsha_" + index_str, spot.residsha, keyFile); + saveToKeyfile(!pedited || spot_edited->residshathr, "Locallab", "Residshathr_" + index_str, spot.residshathr, keyFile); + saveToKeyfile(!pedited || spot_edited->residhi, "Locallab", "Residhi_" + index_str, spot.residhi, keyFile); + saveToKeyfile(!pedited || spot_edited->residhithr, "Locallab", "Residhithr_" + index_str, spot.residhithr, keyFile); + saveToKeyfile(!pedited || spot_edited->gamlc, "Locallab", "Gamlc_" + index_str, spot.gamlc, keyFile); + saveToKeyfile(!pedited || spot_edited->residgam, "Locallab", "Residgam_" + index_str, spot.residgam, keyFile); + saveToKeyfile(!pedited || spot_edited->residslop, "Locallab", "Residslop_" + index_str, spot.residslop, keyFile); + saveToKeyfile(!pedited || spot_edited->residblur, "Locallab", "Residblur_" + index_str, spot.residblur, keyFile); + saveToKeyfile(!pedited || spot_edited->levelblur, "Locallab", "Levelblur_" + index_str, spot.levelblur, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmabl, "Locallab", "Sigmabl_" + index_str, spot.sigmabl, keyFile); + saveToKeyfile(!pedited || spot_edited->residchro, "Locallab", "Residchro_" + index_str, spot.residchro, keyFile); + saveToKeyfile(!pedited || spot_edited->residcomp, "Locallab", "Residcomp_" + index_str, spot.residcomp, keyFile); + saveToKeyfile(!pedited || spot_edited->sigma, "Locallab", "Sigma_" + index_str, spot.sigma, keyFile); + saveToKeyfile(!pedited || spot_edited->offset, "Locallab", "Offset_" + index_str, spot.offset, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmadr, "Locallab", "Sigmadr_" + index_str, spot.sigmadr, keyFile); + saveToKeyfile(!pedited || spot_edited->threswav, "Locallab", "Threswav_" + index_str, spot.threswav, keyFile); + saveToKeyfile(!pedited || spot_edited->chromalev, "Locallab", "Chromalev_" + index_str, spot.chromalev, keyFile); + saveToKeyfile(!pedited || spot_edited->chromablu, "Locallab", "Chromablu_" + index_str, spot.chromablu, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmadc, "Locallab", "sigmadc_" + index_str, spot.sigmadc, keyFile); + saveToKeyfile(!pedited || spot_edited->deltad, "Locallab", "deltad_" + index_str, spot.deltad, keyFile); + saveToKeyfile(!pedited || spot_edited->fatres, "Locallab", "Fatres_" + index_str, spot.fatres, keyFile); + saveToKeyfile(!pedited || spot_edited->clarilres, "Locallab", "ClariLres_" + index_str, spot.clarilres, keyFile); + saveToKeyfile(!pedited || spot_edited->claricres, "Locallab", "ClariCres_" + index_str, spot.claricres, keyFile); + saveToKeyfile(!pedited || spot_edited->clarisoft, "Locallab", "Clarisoft_" + index_str, spot.clarisoft, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmalc2, "Locallab", "Sigmalc2_" + index_str, spot.sigmalc2, keyFile); + saveToKeyfile(!pedited || spot_edited->strwav, "Locallab", "Strwav_" + index_str, spot.strwav, keyFile); + saveToKeyfile(!pedited || spot_edited->angwav, "Locallab", "Angwav_" + index_str, spot.angwav, keyFile); + saveToKeyfile(!pedited || spot_edited->strengthw, "Locallab", "Strengthw_" + index_str, spot.strengthw, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmaed, "Locallab", "Sigmaed_" + index_str, spot.sigmaed, keyFile); + saveToKeyfile(!pedited || spot_edited->radiusw, "Locallab", "Radiusw_" + index_str, spot.radiusw, keyFile); + saveToKeyfile(!pedited || spot_edited->detailw, "Locallab", "Detailw_" + index_str, spot.detailw, keyFile); + saveToKeyfile(!pedited || spot_edited->gradw, "Locallab", "Gradw_" + index_str, spot.gradw, keyFile); + saveToKeyfile(!pedited || spot_edited->tloww, "Locallab", "Tloww_" + index_str, spot.tloww, keyFile); + saveToKeyfile(!pedited || spot_edited->thigw, "Locallab", "Thigw_" + index_str, spot.thigw, keyFile); + saveToKeyfile(!pedited || spot_edited->edgw, "Locallab", "Edgw_" + index_str, spot.edgw, keyFile); + saveToKeyfile(!pedited || spot_edited->basew, "Locallab", "Basew_" + index_str, spot.basew, keyFile); + saveToKeyfile(!pedited || spot_edited->sensilc, "Locallab", "Sensilc_" + index_str, spot.sensilc, keyFile); + saveToKeyfile(!pedited || spot_edited->reparw, "Locallab", "Reparw_" + index_str, spot.reparw, keyFile); + saveToKeyfile(!pedited || spot_edited->fftwlc, "Locallab", "Fftwlc_" + index_str, spot.fftwlc, keyFile); + saveToKeyfile(!pedited || spot_edited->blurlc, "Locallab", "Blurlc_" + index_str, spot.blurlc, keyFile); + saveToKeyfile(!pedited || spot_edited->wavblur, "Locallab", "Wavblur_" + index_str, spot.wavblur, keyFile); + saveToKeyfile(!pedited || spot_edited->wavedg, "Locallab", "Wavedg_" + index_str, spot.wavedg, keyFile); + saveToKeyfile(!pedited || spot_edited->waveshow, "Locallab", "Waveshow_" + index_str, spot.waveshow, keyFile); + saveToKeyfile(!pedited || spot_edited->wavcont, "Locallab", "Wavcont_" + index_str, spot.wavcont, keyFile); + saveToKeyfile(!pedited || spot_edited->wavcomp, "Locallab", "Wavcomp_" + index_str, spot.wavcomp, keyFile); + saveToKeyfile(!pedited || spot_edited->wavgradl, "Locallab", "Wavgradl_" + index_str, spot.wavgradl, keyFile); + saveToKeyfile(!pedited || spot_edited->wavcompre, "Locallab", "Wavcompre_" + index_str, spot.wavcompre, keyFile); + saveToKeyfile(!pedited || spot_edited->origlc, "Locallab", "Origlc_" + index_str, spot.origlc, keyFile); + saveToKeyfile(!pedited || spot_edited->localcontMethod, "Locallab", "localcontMethod_" + index_str, spot.localcontMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->localedgMethod, "Locallab", "localedgMethod_" + index_str, spot.localedgMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->localneiMethod, "Locallab", "localneiMethod_" + index_str, spot.localneiMethod, keyFile); + saveToKeyfile(!pedited || spot_edited->locwavcurve, "Locallab", "LocwavCurve_" + index_str, spot.locwavcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->csthreshold, "Locallab", "CSThreshold_" + index_str, spot.csthreshold.toVector(), keyFile); + saveToKeyfile(!pedited || spot_edited->loclevwavcurve, "Locallab", "LoclevwavCurve_" + index_str, spot.loclevwavcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->locconwavcurve, "Locallab", "LocconwavCurve_" + index_str, spot.locconwavcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->loccompwavcurve, "Locallab", "LoccompwavCurve_" + index_str, spot.loccompwavcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->loccomprewavcurve, "Locallab", "LoccomprewavCurve_" + index_str, spot.loccomprewavcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->locedgwavcurve, "Locallab", "LocedgwavCurve_" + index_str, spot.locedgwavcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmasklccurve, "Locallab", "CCmasklcCurve_" + index_str, spot.CCmasklccurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmasklccurve, "Locallab", "LLmasklcCurve_" + index_str, spot.LLmasklccurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmasklccurve, "Locallab", "HHmasklcCurve_" + index_str, spot.HHmasklccurve, keyFile); + saveToKeyfile(!pedited || spot_edited->enalcMask, "Locallab", "EnalcMask_" + index_str, spot.enalcMask, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmasklc, "Locallab", "Blendmasklc_" + index_str, spot.blendmasklc, keyFile); + saveToKeyfile(!pedited || spot_edited->radmasklc, "Locallab", "Radmasklc_" + index_str, spot.radmasklc, keyFile); + saveToKeyfile(!pedited || spot_edited->chromasklc, "Locallab", "Chromasklc_" + index_str, spot.chromasklc, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmasklccurve, "Locallab", "LmasklcCurve_" + index_str, spot.Lmasklccurve, keyFile); + saveToKeyfile(!pedited || spot_edited->recothresw, "Locallab", "Recothresw_" + index_str, spot.recothresw, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthresw, "Locallab", "Lowthresw_" + index_str, spot.lowthresw, keyFile); + saveToKeyfile(!pedited || spot_edited->higthresw, "Locallab", "Higthresw_" + index_str, spot.higthresw, keyFile); + saveToKeyfile(!pedited || spot_edited->decayw, "Locallab", "Decayw_" + index_str, spot.decayw, keyFile); + } + // Contrast by detail levels + if ((!pedited || spot_edited->visicbdl) && spot.visicbdl) { + saveToKeyfile(!pedited || spot_edited->expcbdl, "Locallab", "Expcbdl_" + index_str, spot.expcbdl, keyFile); + saveToKeyfile(!pedited || spot_edited->complexcbdl, "Locallab", "Complexcbdl_" + index_str, spot.complexcbdl, keyFile); + + for (int j = 0; j < 6; j++) { + saveToKeyfile(!pedited || spot_edited->mult[j], "Locallab", "Mult" + std::to_string(j) + "_" + index_str, spot.mult[j], keyFile); + } + + saveToKeyfile(!pedited || spot_edited->chromacbdl, "Locallab", "Chromacbdl_" + index_str, spot.chromacbdl, keyFile); + saveToKeyfile(!pedited || spot_edited->threshold, "Locallab", "Threshold_" + index_str, spot.threshold, keyFile); + saveToKeyfile(!pedited || spot_edited->sensicb, "Locallab", "Sensicb_" + index_str, spot.sensicb, keyFile); + saveToKeyfile(!pedited || spot_edited->clarityml, "Locallab", "Clarityml_" + index_str, spot.clarityml, keyFile); + saveToKeyfile(!pedited || spot_edited->contresid, "Locallab", "Contresid_" + index_str, spot.contresid, keyFile); + saveToKeyfile(!pedited || spot_edited->softradiuscb, "Locallab", "Softradiuscb_" + index_str, spot.softradiuscb, keyFile); + saveToKeyfile(!pedited || spot_edited->enacbMask, "Locallab", "EnacbMask_" + index_str, spot.enacbMask, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskcbcurve, "Locallab", "CCmaskcbCurve_" + index_str, spot.CCmaskcbcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskcbcurve, "Locallab", "LLmaskcbCurve_" + index_str, spot.LLmaskcbcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskcbcurve, "Locallab", "HHmaskcbCurve_" + index_str, spot.HHmaskcbcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskcb, "Locallab", "Blendmaskcb_" + index_str, spot.blendmaskcb, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskcb, "Locallab", "Radmaskcb_" + index_str, spot.radmaskcb, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskcb, "Locallab", "Chromaskcb_" + index_str, spot.chromaskcb, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskcb, "Locallab", "Gammaskcb_" + index_str, spot.gammaskcb, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskcb, "Locallab", "Slomaskcb_" + index_str, spot.slomaskcb, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskcb, "Locallab", "Lapmaskcb_" + index_str, spot.lapmaskcb, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskcbcurve, "Locallab", "LmaskcbCurve_" + index_str, spot.Lmaskcbcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->recothrescb, "Locallab", "Recothrescb_" + index_str, spot.recothrescb, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthrescb, "Locallab", "Lowthrescb_" + index_str, spot.lowthrescb, keyFile); + saveToKeyfile(!pedited || spot_edited->higthrescb, "Locallab", "Higthrescb_" + index_str, spot.higthrescb, keyFile); + saveToKeyfile(!pedited || spot_edited->decaycb, "Locallab", "Decaycb_" + index_str, spot.decaycb, keyFile); + } + // Log encoding + if ((!pedited || spot_edited->visilog) && spot.visilog) { + saveToKeyfile(!pedited || spot_edited->explog, "Locallab", "Explog_" + index_str, spot.explog, keyFile); + saveToKeyfile(!pedited || spot_edited->complexlog, "Locallab", "Complexlog_" + index_str, spot.complexlog, keyFile); + saveToKeyfile(!pedited || spot_edited->autocompute, "Locallab", "Autocompute_" + index_str, spot.autocompute, keyFile); + saveToKeyfile(!pedited || spot_edited->sourceGray, "Locallab", "SourceGray_" + index_str, spot.sourceGray, keyFile); + saveToKeyfile(!pedited || spot_edited->sourceabs, "Locallab", "Sourceabs_" + index_str, spot.sourceabs, keyFile); + saveToKeyfile(!pedited || spot_edited->targabs, "Locallab", "Targabs_" + index_str, spot.targabs, keyFile); + saveToKeyfile(!pedited || spot_edited->targetGray, "Locallab", "TargetGray_" + index_str, spot.targetGray, keyFile); + saveToKeyfile(!pedited || spot_edited->catad, "Locallab", "Catad_" + index_str, spot.catad, keyFile); + saveToKeyfile(!pedited || spot_edited->saturl, "Locallab", "Saturl_" + index_str, spot.saturl, keyFile); + saveToKeyfile(!pedited || spot_edited->chroml, "Locallab", "Chroml_" + index_str, spot.chroml, keyFile); + saveToKeyfile(!pedited || spot_edited->LcurveL, "Locallab", "LCurveL_" + index_str, spot.LcurveL, keyFile); + saveToKeyfile(!pedited || spot_edited->lightl, "Locallab", "Lightl_" + index_str, spot.lightl, keyFile); + saveToKeyfile(!pedited || spot_edited->lightq, "Locallab", "Brightq_" + index_str, spot.lightq, keyFile); + saveToKeyfile(!pedited || spot_edited->contl, "Locallab", "Contl_" + index_str, spot.contl, keyFile); + saveToKeyfile(!pedited || spot_edited->contthres, "Locallab", "Contthres_" + index_str, spot.contthres, keyFile); + saveToKeyfile(!pedited || spot_edited->contq, "Locallab", "Contq_" + index_str, spot.contq, keyFile); + saveToKeyfile(!pedited || spot_edited->colorfl, "Locallab", "Colorfl_" + index_str, spot.colorfl, keyFile); + saveToKeyfile(!pedited || spot_edited->Autogray, "Locallab", "AutoGray_" + index_str, spot.Autogray, keyFile); + saveToKeyfile(!pedited || spot_edited->fullimage, "Locallab", "Fullimage_" + index_str, spot.fullimage, keyFile); + saveToKeyfile(!pedited || spot_edited->repar, "Locallab", "Repart_" + index_str, spot.repar, keyFile); + saveToKeyfile(!pedited || spot_edited->ciecam, "Locallab", "Ciecam_" + index_str, spot.ciecam, keyFile); + saveToKeyfile(!pedited || spot_edited->blackEv, "Locallab", "BlackEv_" + index_str, spot.blackEv, keyFile); + saveToKeyfile(!pedited || spot_edited->whiteEv, "Locallab", "WhiteEv_" + index_str, spot.whiteEv, keyFile); + saveToKeyfile(!pedited || spot_edited->detail, "Locallab", "Detail_" + index_str, spot.detail, keyFile); + saveToKeyfile(!pedited || spot_edited->sensilog, "Locallab", "Sensilog_" + index_str, spot.sensilog, keyFile); + saveToKeyfile(!pedited || spot_edited->baselog, "Locallab", "Baselog_" + index_str, spot.baselog, keyFile); + saveToKeyfile(!pedited || spot_edited->sursour, "Locallab", "Sursour_" + index_str, spot.sursour, keyFile); + saveToKeyfile(!pedited || spot_edited->surround, "Locallab", "Surround_" + index_str, spot.surround, keyFile); + saveToKeyfile(!pedited || spot_edited->strlog, "Locallab", "Strlog_" + index_str, spot.strlog, keyFile); + saveToKeyfile(!pedited || spot_edited->anglog, "Locallab", "Anglog_" + index_str, spot.anglog, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskcurveL, "Locallab", "CCmaskCurveL_" + index_str, spot.CCmaskcurveL, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskcurveL, "Locallab", "LLmaskCurveL_" + index_str, spot.LLmaskcurveL, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskcurveL, "Locallab", "HHmaskCurveL_" + index_str, spot.HHmaskcurveL, keyFile); + saveToKeyfile(!pedited || spot_edited->enaLMask, "Locallab", "EnaLMask_" + index_str, spot.enaLMask, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskL, "Locallab", "blendmaskL_" + index_str, spot.blendmaskL, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskL, "Locallab", "radmaskL_" + index_str, spot.radmaskL, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskL, "Locallab", "chromaskL_" + index_str, spot.chromaskL, keyFile); + saveToKeyfile(!pedited || spot_edited->LmaskcurveL, "Locallab", "LmaskCurveL_" + index_str, spot.LmaskcurveL, keyFile); + saveToKeyfile(!pedited || spot_edited->recothresl, "Locallab", "Recothresl_" + index_str, spot.recothresl, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthresl, "Locallab", "Lowthresl_" + index_str, spot.lowthresl, keyFile); + saveToKeyfile(!pedited || spot_edited->higthresl, "Locallab", "Higthresl_" + index_str, spot.higthresl, keyFile); + saveToKeyfile(!pedited || spot_edited->decayl, "Locallab", "Decayl_" + index_str, spot.decayl, keyFile); + + } + //mask + if ((!pedited || spot_edited->visimask) && spot.visimask) { + saveToKeyfile(!pedited || spot_edited->expmask, "Locallab", "Expmask_" + index_str, spot.expmask, keyFile); + saveToKeyfile(!pedited || spot_edited->complexmask, "Locallab", "Complexmask_" + index_str, spot.complexmask, keyFile); + saveToKeyfile(!pedited || spot_edited->sensimask, "Locallab", "Sensimask_" + index_str, spot.sensimask, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmask, "Locallab", "Blendmaskmask_" + index_str, spot.blendmask, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskab, "Locallab", "Blendmaskmaskab_" + index_str, spot.blendmaskab, keyFile); + saveToKeyfile(!pedited || spot_edited->softradiusmask, "Locallab", "Softradiusmask_" + index_str, spot.softradiusmask, keyFile); + saveToKeyfile(!pedited || spot_edited->enamask, "Locallab", "Enamask_" + index_str, spot.enamask, keyFile); + saveToKeyfile(!pedited || spot_edited->fftmask, "Locallab", "Fftmask_" + index_str, spot.fftmask, keyFile); + saveToKeyfile(!pedited || spot_edited->blurmask, "Locallab", "Blurmask_" + index_str, spot.blurmask, keyFile); + saveToKeyfile(!pedited || spot_edited->contmask, "Locallab", "Contmask_" + index_str, spot.contmask, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmask_curve, "Locallab", "CCmask_Curve_" + index_str, spot.CCmask_curve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmask_curve, "Locallab", "LLmask_Curve_" + index_str, spot.LLmask_curve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmask_curve, "Locallab", "HHmask_Curve_" + index_str, spot.HHmask_curve, keyFile); + saveToKeyfile(!pedited || spot_edited->strumaskmask, "Locallab", "Strumaskmask_" + index_str, spot.strumaskmask, keyFile); + saveToKeyfile(!pedited || spot_edited->toolmask, "Locallab", "Toolmask_" + index_str, spot.toolmask, keyFile); + saveToKeyfile(!pedited || spot_edited->radmask, "Locallab", "Radmask_" + index_str, spot.radmask, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmask, "Locallab", "Lapmask_" + index_str, spot.lapmask, keyFile); + saveToKeyfile(!pedited || spot_edited->chromask, "Locallab", "Chromask_" + index_str, spot.chromask, keyFile); + saveToKeyfile(!pedited || spot_edited->gammask, "Locallab", "Gammask_" + index_str, spot.gammask, keyFile); + saveToKeyfile(!pedited || spot_edited->slopmask, "Locallab", "Slopmask_" + index_str, spot.slopmask, keyFile); + saveToKeyfile(!pedited || spot_edited->shadmask, "Locallab", "Shadmask_" + index_str, spot.shadmask, keyFile); + saveToKeyfile(!pedited || spot_edited->str_mask, "Locallab", "Str_mask_" + index_str, spot.str_mask, keyFile); + saveToKeyfile(!pedited || spot_edited->ang_mask, "Locallab", "Ang_mask_" + index_str, spot.ang_mask, keyFile); + saveToKeyfile(!pedited || spot_edited->HHhmask_curve, "Locallab", "HHhmask_Curve_" + index_str, spot.HHhmask_curve, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmask_curve, "Locallab", "Lmask_Curve_" + index_str, spot.Lmask_curve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmask_curvewav, "Locallab", "LLmask_Curvewav_" + index_str, spot.LLmask_curvewav, keyFile); + saveToKeyfile(!pedited || spot_edited->csthresholdmask, "Locallab", "CSThresholdmask_" + index_str, spot.csthresholdmask.toVector(), keyFile); + } + //ciecam + if ((!pedited || spot_edited->visicie) && spot.visicie) { + saveToKeyfile(!pedited || spot_edited->expcie, "Locallab", "Expcie_" + index_str, spot.expcie, keyFile); + saveToKeyfile(!pedited || spot_edited->complexcie, "Locallab", "Complexcie_" + index_str, spot.complexcie, keyFile); + saveToKeyfile(!pedited || spot_edited->reparcie, "Locallab", "Reparcie_" + index_str, spot.reparcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sensicie, "Locallab", "Sensicie_" + index_str, spot.sensicie, keyFile); + saveToKeyfile(!pedited || spot_edited->Autograycie, "Locallab", "AutoGraycie_" + index_str, spot.Autograycie, keyFile); + saveToKeyfile(!pedited || spot_edited->forcejz, "Locallab", "Forcejz_" + index_str, spot.forcejz, keyFile); + saveToKeyfile(!pedited || spot_edited->forcebw, "Locallab", "Forcebw_" + index_str, spot.forcebw, keyFile); + saveToKeyfile(!pedited || spot_edited->qtoj, "Locallab", "Qtoj_" + index_str, spot.qtoj, keyFile); + saveToKeyfile(!pedited || spot_edited->jabcie, "Locallab", "jabcie_" + index_str, spot.jabcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidqjcie, "Locallab", "sigmoidqjcie_" + index_str, spot.sigmoidqjcie, keyFile); + saveToKeyfile(!pedited || spot_edited->logcie, "Locallab", "logcie_" + index_str, spot.logcie, keyFile); + saveToKeyfile(!pedited || spot_edited->logjz, "Locallab", "Logjz_" + index_str, spot.logjz, keyFile); + saveToKeyfile(!pedited || spot_edited->sigjz, "Locallab", "Sigjz_" + index_str, spot.sigjz, keyFile); + saveToKeyfile(!pedited || spot_edited->sigq, "Locallab", "Sigq_" + index_str, spot.sigq, keyFile); + saveToKeyfile(!pedited || spot_edited->chjzcie, "Locallab", "chjzcie_" + index_str, spot.chjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sourceGraycie, "Locallab", "SourceGraycie_" + index_str, spot.sourceGraycie, keyFile); + saveToKeyfile(!pedited || spot_edited->sourceabscie, "Locallab", "Sourceabscie_" + index_str, spot.sourceabscie, keyFile); + saveToKeyfile(!pedited || spot_edited->sursourcie, "Locallab", "Sursourcie_" + index_str, spot.sursourcie, keyFile); + saveToKeyfile(!pedited || spot_edited->modecie, "Locallab", "Modecie_" + index_str, spot.modecie, keyFile); + saveToKeyfile(!pedited || spot_edited->modecam, "Locallab", "Modecam_" + index_str, spot.modecam, keyFile); + saveToKeyfile(!pedited || spot_edited->saturlcie, "Locallab", "Saturlcie_" + index_str, spot.saturlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->rstprotectcie, "Locallab", "Rstprotectcie_" + index_str, spot.rstprotectcie, keyFile); + saveToKeyfile(!pedited || spot_edited->chromlcie, "Locallab", "Chromlcie_" + index_str, spot.chromlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->huecie, "Locallab", "Huecie_" + index_str, spot.huecie, keyFile); + saveToKeyfile(!pedited || spot_edited->toneMethodcie, "Locallab", "ToneMethodcie_" + index_str, spot.toneMethodcie, keyFile); + saveToKeyfile(!pedited || spot_edited->ciecurve, "Locallab", "Ciecurve_" + index_str, spot.ciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->toneMethodcie2, "Locallab", "ToneMethodcie2_" + index_str, spot.toneMethodcie2, keyFile); + saveToKeyfile(!pedited || spot_edited->ciecurve2, "Locallab", "Ciecurve2_" + index_str, spot.ciecurve2, keyFile); + saveToKeyfile(!pedited || spot_edited->chromjzcie, "Locallab", "Chromjzcie_" + index_str, spot.chromjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->saturjzcie, "Locallab", "Saturjzcie_" + index_str, spot.saturjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->huejzcie, "Locallab", "Huejzcie_" + index_str, spot.huejzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->softjzcie, "Locallab", "Softjzcie_" + index_str, spot.softjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->strsoftjzcie, "Locallab", "strSoftjzcie_" + index_str, spot.strsoftjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->thrhjzcie, "Locallab", "Thrhjzcie_" + index_str, spot.thrhjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "JzCurve_" + index_str, spot.jzcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "CzCurve_" + index_str, spot.czcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "CzJzCurve_" + index_str, spot.czjzcurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHcurvejz, "Locallab", "HHCurvejz_" + index_str, spot.HHcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "CHCurvejz_" + index_str, spot.CHcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->CHcurvejz, "Locallab", "LHCurvejz_" + index_str, spot.LHcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->lightlcie, "Locallab", "Lightlcie_" + index_str, spot.lightlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->lightjzcie, "Locallab", "Lightjzcie_" + index_str, spot.lightjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->lightqcie, "Locallab", "Brightqcie_" + index_str, spot.lightqcie, keyFile); + saveToKeyfile(!pedited || spot_edited->contlcie, "Locallab", "Contlcie_" + index_str, spot.contlcie, keyFile); + saveToKeyfile(!pedited || spot_edited->contjzcie, "Locallab", "Contjzcie_" + index_str, spot.contjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->adapjzcie, "Locallab", "Adapjzcie_" + index_str, spot.adapjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->jz100, "Locallab", "Jz100_" + index_str, spot.jz100, keyFile); + saveToKeyfile(!pedited || spot_edited->pqremap, "Locallab", "PQremap_" + index_str, spot.pqremap, keyFile); + saveToKeyfile(!pedited || spot_edited->pqremapcam16, "Locallab", "PQremapcam16_" + index_str, spot.pqremapcam16, keyFile); + saveToKeyfile(!pedited || spot_edited->hljzcie, "Locallab", "Hljzcie_" + index_str, spot.hljzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->hlthjzcie, "Locallab", "Hlthjzcie_" + index_str, spot.hlthjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->shjzcie, "Locallab", "Shjzcie_" + index_str, spot.shjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->shthjzcie, "Locallab", "Shthjzcie_" + index_str, spot.shthjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->radjzcie, "Locallab", "Radjzcie_" + index_str, spot.radjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmalcjz, "Locallab", "Sigmalcjz_" + index_str, spot.sigmalcjz, keyFile); + saveToKeyfile(!pedited || spot_edited->clarilresjz, "Locallab", "Clarilresjz_" + index_str, spot.clarilresjz, keyFile); + saveToKeyfile(!pedited || spot_edited->claricresjz, "Locallab", "Claricresjz_" + index_str, spot.claricresjz, keyFile); + saveToKeyfile(!pedited || spot_edited->clarisoftjz, "Locallab", "Clarisoftjz_" + index_str, spot.clarisoftjz, keyFile); + saveToKeyfile(!pedited || spot_edited->locwavcurvejz, "Locallab", "LocwavCurvejz_" + index_str, spot.locwavcurvejz, keyFile); + saveToKeyfile(!pedited || spot_edited->csthresholdjz, "Locallab", "CSThresholdjz_" + index_str, spot.csthresholdjz.toVector(), keyFile); + saveToKeyfile(!pedited || spot_edited->contthrescie, "Locallab", "Contthrescie_" + index_str, spot.contthrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->blackEvjz, "Locallab", "BlackEvjz_" + index_str, spot.blackEvjz, keyFile); + saveToKeyfile(!pedited || spot_edited->whiteEvjz, "Locallab", "WhiteEvjz_" + index_str, spot.whiteEvjz, keyFile); + saveToKeyfile(!pedited || spot_edited->targetjz, "Locallab", "Targetjz_" + index_str, spot.targetjz, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidldacie, "Locallab", "Sigmoidldacie_" + index_str, spot.sigmoidldacie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidthcie, "Locallab", "Sigmoidthcie_" + index_str, spot.sigmoidthcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidblcie, "Locallab", "Sigmoidblcie_" + index_str, spot.sigmoidblcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidldajzcie, "Locallab", "Sigmoidldajzcie_" + index_str, spot.sigmoidldajzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidthjzcie, "Locallab", "Sigmoidthjzcie_" + index_str, spot.sigmoidthjzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->sigmoidbljzcie, "Locallab", "Sigmoidbljzcie_" + index_str, spot.sigmoidbljzcie, keyFile); + saveToKeyfile(!pedited || spot_edited->contqcie, "Locallab", "Contqcie_" + index_str, spot.contqcie, keyFile); + saveToKeyfile(!pedited || spot_edited->colorflcie, "Locallab", "Colorflcie_" + index_str, spot.colorflcie, keyFile); +/* + saveToKeyfile(!pedited || spot_edited->lightlzcam, "Locallab", "Lightlzcam_" + index_str, spot.lightlzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->lightqzcam, "Locallab", "Lightqzcam_" + index_str, spot.lightqzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->contlzcam, "Locallab", "Contlzcam_" + index_str, spot.contlzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->contqzcam, "Locallab", "Contqzcam_" + index_str, spot.contqzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->contthreszcam, "Locallab", "Contthreszcam_" + index_str, spot.contthreszcam, keyFile); + saveToKeyfile(!pedited || spot_edited->colorflzcam, "Locallab", "Colorflzcam_" + index_str, spot.colorflzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->saturzcam, "Locallab", "Saturzcam_" + index_str, spot.saturzcam, keyFile); + saveToKeyfile(!pedited || spot_edited->chromzcam, "Locallab", "Chromzcam_" + index_str, spot.chromzcam, keyFile); +*/ + saveToKeyfile(!pedited || spot_edited->targabscie, "Locallab", "Targabscie_" + index_str, spot.targabscie, keyFile); + saveToKeyfile(!pedited || spot_edited->targetGraycie, "Locallab", "TargetGraycie_" + index_str, spot.targetGraycie, keyFile); + saveToKeyfile(!pedited || spot_edited->catadcie, "Locallab", "Catadcie_" + index_str, spot.catadcie, keyFile); + saveToKeyfile(!pedited || spot_edited->detailcie, "Locallab", "Detailcie_" + index_str, spot.detailcie, keyFile); + saveToKeyfile(!pedited || spot_edited->surroundcie, "Locallab", "Surroundcie_" + index_str, spot.surroundcie, keyFile); + saveToKeyfile(!pedited || spot_edited->enacieMask, "Locallab", "EnacieMask_" + index_str, spot.enacieMask, keyFile); + saveToKeyfile(!pedited || spot_edited->CCmaskciecurve, "Locallab", "CCmaskcieCurve_" + index_str, spot.CCmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->LLmaskciecurve, "Locallab", "LLmaskcieCurve_" + index_str, spot.LLmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->HHmaskciecurve, "Locallab", "HHmaskcieCurve_" + index_str, spot.HHmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->blendmaskcie, "Locallab", "Blendmaskcie_" + index_str, spot.blendmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->radmaskcie, "Locallab", "Radmaskcie_" + index_str, spot.radmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->chromaskcie, "Locallab", "Chromaskcie_" + index_str, spot.chromaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->lapmaskcie, "Locallab", "Lapmaskcie_" + index_str, spot.lapmaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->gammaskcie, "Locallab", "Gammaskcie_" + index_str, spot.gammaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->slomaskcie, "Locallab", "Slomaskcie_" + index_str, spot.slomaskcie, keyFile); + saveToKeyfile(!pedited || spot_edited->Lmaskciecurve, "Locallab", "LmaskcieCurve_" + index_str, spot.Lmaskciecurve, keyFile); + saveToKeyfile(!pedited || spot_edited->recothrescie, "Locallab", "Recothrescie_" + index_str, spot.recothrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->lowthrescie, "Locallab", "Lowthrescie_" + index_str, spot.lowthrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->higthrescie, "Locallab", "Higthrescie_" + index_str, spot.higthrescie, keyFile); + saveToKeyfile(!pedited || spot_edited->decaycie, "Locallab", "Decaycie_" + index_str, spot.decaycie, keyFile); + + + + } + + } + } + // Post-crop vignette saveToKeyfile(!pedited || pedited->pcvignette.enabled, "PCVignette", "Enabled", pcvignette.enabled, keyFile); saveToKeyfile(!pedited || pedited->pcvignette.strength, "PCVignette", "Strength", pcvignette.strength, keyFile); @@ -3377,6 +7205,8 @@ 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.longedge, "Resize", "LongEdge", resize.longedge, keyFile); + saveToKeyfile(!pedited || pedited->resize.shortedge, "Resize", "ShortEdge", resize.shortedge, keyFile); saveToKeyfile(!pedited || pedited->resize.allowUpscaling, "Resize", "AllowUpscaling", resize.allowUpscaling, keyFile); // Post demosaic sharpening @@ -3407,17 +7237,105 @@ 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.inputProfile, "Color Management", "InputProfile", relativePathIfInside(fname, fnameAbsolute, icm.inputProfile), keyFile); + saveToKeyfile(!pedited || pedited->icm.inputProfile, "Color Management", "InputProfile", relativePathIfInside2(fname, options.rtSettings.cameraProfilesPath, 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.workingProfile, "Color Management", "WorkingProfile", icm.workingProfile, keyFile); - saveToKeyfile(!pedited || pedited->icm.workingTRC, "Color Management", "WorkingTRC", icm.workingTRC, keyFile); + saveToKeyfile( + !pedited || pedited->icm.workingTRC, + "Color Management", + "WorkingTRC", + { + {ColorManagementParams::WorkingTrc::NONE, "none"}, + {ColorManagementParams::WorkingTrc::CUSTOM, "Custom"}, + {ColorManagementParams::WorkingTrc::BT709, "bt709"}, + {ColorManagementParams::WorkingTrc::SRGB, "srgb"}, + {ColorManagementParams::WorkingTrc::GAMMA_2_2, "22"}, + {ColorManagementParams::WorkingTrc::GAMMA_1_8, "18"}, + {ColorManagementParams::WorkingTrc::LINEAR, "lin"} + }, + icm.workingTRC, + keyFile + ); + saveToKeyfile( + !pedited || pedited->icm.will, + "Color Management", + "Will", + { + {ColorManagementParams::Illuminant::DEFAULT, "def"}, + {ColorManagementParams::Illuminant::D41, "D41"}, + {ColorManagementParams::Illuminant::D50, "D50"}, + {ColorManagementParams::Illuminant::D55, "D55"}, + {ColorManagementParams::Illuminant::D60, "D60"}, + {ColorManagementParams::Illuminant::D65, "D65"}, + {ColorManagementParams::Illuminant::D80, "D80"}, + {ColorManagementParams::Illuminant::D120, "D120"}, + {ColorManagementParams::Illuminant::STDA, "stda"}, + {ColorManagementParams::Illuminant::TUNGSTEN_2000K, "2000"}, + {ColorManagementParams::Illuminant::TUNGSTEN_1500K, "1500"} + }, + icm.will, + keyFile + ); + saveToKeyfile( + !pedited || pedited->icm.wprim, + "Color Management", + "Wprim", + { + {ColorManagementParams::Primaries::DEFAULT, "def"}, + {ColorManagementParams::Primaries::SRGB, "srgb"}, + {ColorManagementParams::Primaries::ADOBE_RGB, "adob"}, + {ColorManagementParams::Primaries::PRO_PHOTO, "prop"}, + {ColorManagementParams::Primaries::REC2020, "rec"}, + {ColorManagementParams::Primaries::ACES_P1, "aces"}, + {ColorManagementParams::Primaries::WIDE_GAMUT, "wid"}, + {ColorManagementParams::Primaries::ACES_P0, "ac0"}, + {ColorManagementParams::Primaries::BRUCE_RGB, "bru"}, + {ColorManagementParams::Primaries::BETA_RGB, "bet"}, + {ColorManagementParams::Primaries::BEST_RGB, "bst"}, + {ColorManagementParams::Primaries::CUSTOM, "cus"}, + {ColorManagementParams::Primaries::CUSTOM_GRID, "cusgr"} + }, + icm.wprim, + 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.redx, "Color Management", "Redx", icm.redx, keyFile); + saveToKeyfile(!pedited || pedited->icm.redy, "Color Management", "Redy", icm.redy, keyFile); + saveToKeyfile(!pedited || pedited->icm.grex, "Color Management", "Grex", icm.grex, keyFile); + saveToKeyfile(!pedited || pedited->icm.grey, "Color Management", "Grey", icm.grey, keyFile); + saveToKeyfile(!pedited || pedited->icm.blux, "Color Management", "Blux", icm.blux, keyFile); + saveToKeyfile(!pedited || pedited->icm.bluy, "Color Management", "Bluy", icm.bluy, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieALow, "Color Management", "LabGridcieALow", icm.labgridcieALow, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieBLow, "Color Management", "LabGridcieBLow", icm.labgridcieBLow, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieAHigh, "Color Management", "LabGridcieAHigh", icm.labgridcieAHigh, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieBHigh, "Color Management", "LabGridcieBHigh", icm.labgridcieBHigh, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieGx, "Color Management", "LabGridcieGx", icm.labgridcieGx, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieGy, "Color Management", "LabGridcieGy", icm.labgridcieGy, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieWx, "Color Management", "LabGridcieWx", icm.labgridcieWx, keyFile); + saveToKeyfile(!pedited || pedited->icm.labgridcieWy, "Color Management", "LabGridcieWy", icm.labgridcieWy, keyFile); + saveToKeyfile(!pedited || pedited->icm.preser, "Color Management", "Preser", icm.preser, keyFile); + saveToKeyfile(!pedited || pedited->icm.fbw, "Color Management", "Fbw", icm.fbw, keyFile); + saveToKeyfile(!pedited || pedited->icm.gamut, "Color Management", "Gamut", icm.gamut, keyFile); saveToKeyfile(!pedited || pedited->icm.outputProfile, "Color Management", "OutputProfile", icm.outputProfile, keyFile); + saveToKeyfile( + !pedited || pedited->icm.aRendIntent, + "Color Management", + "aIntent", + { + {RI_PERCEPTUAL, "Perceptual"}, + {RI_RELATIVE, "Relative"}, + {RI_SATURATION, "Saturation"}, + {RI_ABSOLUTE, "Absolute"} + }, + icm.aRendIntent, + keyFile + ); + saveToKeyfile( !pedited || pedited->icm.outputIntent, "Color Management", @@ -3427,7 +7345,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo {RI_RELATIVE, "Relative"}, {RI_SATURATION, "Saturation"}, {RI_ABSOLUTE, "Absolute"} - }, icm.outputIntent, keyFile @@ -3438,9 +7355,20 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.enabled, "Wavelet", "Enabled", wavelet.enabled, keyFile); saveToKeyfile(!pedited || pedited->wavelet.strength, "Wavelet", "Strength", wavelet.strength, keyFile); saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmafin, "Wavelet", "Sigmafin", wavelet.sigmafin, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmaton, "Wavelet", "Sigmaton", wavelet.sigmaton, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmacol, "Wavelet", "Sigmacol", wavelet.sigmacol, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigmadir, "Wavelet", "Sigmadir", wavelet.sigmadir, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.rangeab, "Wavelet", "Rangeab", wavelet.rangeab, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.protab, "Wavelet", "Protab", wavelet.protab, keyFile); saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.complexmethod, "Wavelet", "complexMethod", wavelet.complexmethod, keyFile); + //saveToKeyfile(!pedited || pedited->wavelet.denmethod, "Wavelet", "denMethod", wavelet.denmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.mixmethod, "Wavelet", "mixMethod", wavelet.mixmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.slimethod, "Wavelet", "sliMethod", wavelet.slimethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.quamethod, "Wavelet", "quaMethod", wavelet.quamethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.daubcoeffmethod, "Wavelet", "DaubMethod", wavelet.daubcoeffmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.CLmethod, "Wavelet", "ChoiceLevMethod", wavelet.CLmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Backmethod, "Wavelet", "BackMethod", wavelet.Backmethod, keyFile); @@ -3452,13 +7380,34 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.bluehigh, "Wavelet", "CBbluehigh", wavelet.bluehigh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.ballum, "Wavelet", "Ballum", wavelet.ballum, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigm, "Wavelet", "Sigm", wavelet.sigm, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.levden, "Wavelet", "Levden", wavelet.levden, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thrden, "Wavelet", "Thrden", wavelet.thrden, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.limden, "Wavelet", "Limden", wavelet.limden, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.balchrom, "Wavelet", "Balchrom", wavelet.balchrom, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chromfi, "Wavelet", "Chromfine", wavelet.chromfi, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chromco, "Wavelet", "Chromcoarse", wavelet.chromco, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.mergeL, "Wavelet", "MergeL", wavelet.mergeL, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.mergeC, "Wavelet", "MergeC", wavelet.mergeC, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.softrad, "Wavelet", "Softrad", wavelet.softrad, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.softradend, "Wavelet", "Softradend", wavelet.softradend, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.strend, "Wavelet", "Strend", wavelet.strend, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.detend, "Wavelet", "Detend", wavelet.detend, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thrend, "Wavelet", "Thrend", wavelet.thrend, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expbl, "Wavelet", "expbl", wavelet.expbl, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expresid, "Wavelet", "Expresid", wavelet.expresid, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile); saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); saveToKeyfile(!pedited || pedited->wavelet.expnoise, "Wavelet", "Expnoise", wavelet.expnoise, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expclari, "Wavelet", "Expclari", wavelet.expclari, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridALow, "Wavelet", "LabGridALow", wavelet.labgridALow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridBLow, "Wavelet", "LabGridBLow", wavelet.labgridBLow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridAHigh, "Wavelet", "LabGridAHigh", wavelet.labgridAHigh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.labgridBHigh, "Wavelet", "LabGridBHigh", wavelet.labgridBHigh, keyFile); for (int i = 0; i < 9; i++) { std::stringstream ss; @@ -3483,6 +7432,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.level1noise, "Wavelet", "Level1noise", wavelet.level1noise.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.level2noise, "Wavelet", "Level2noise", wavelet.level2noise.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.level3noise, "Wavelet", "Level3noise", wavelet.level3noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.leveldenoise, "Wavelet", "Leveldenoise", wavelet.leveldenoise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.levelsigm, "Wavelet", "Levelsigm", wavelet.levelsigm.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.threshold, "Wavelet", "ThresholdHighlight", wavelet.threshold, keyFile); saveToKeyfile(!pedited || pedited->wavelet.threshold2, "Wavelet", "ThresholdShadow", wavelet.threshold2, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgedetect, "Wavelet", "Edgedetect", wavelet.edgedetect, keyFile); @@ -3493,6 +7444,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.chroma, "Wavelet", "ThresholdChroma", wavelet.chroma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.CHmethod, "Wavelet", "CHromaMethod", wavelet.CHmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Medgreinf, "Wavelet", "Medgreinf", wavelet.Medgreinf, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.ushamethod, "Wavelet", "Ushamethod", wavelet.ushamethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.CHSLmethod, "Wavelet", "CHSLromaMethod", wavelet.CHSLmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.EDmethod, "Wavelet", "EDMethod", wavelet.EDmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.NPmethod, "Wavelet", "NPMethod", wavelet.NPmethod, keyFile); @@ -3500,13 +7452,19 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.TMmethod, "Wavelet", "TMMethod", wavelet.TMmethod, keyFile); saveToKeyfile(!pedited || pedited->wavelet.chro, "Wavelet", "ChromaLink", wavelet.chro, keyFile); saveToKeyfile(!pedited || pedited->wavelet.ccwcurve, "Wavelet", "ContrastCurve", wavelet.ccwcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.blcurve, "Wavelet", "blcurve", wavelet.blcurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); + //saveToKeyfile(!pedited || pedited->wavelet.opacityCurveSH, "Wavelet", "Levalshc", wavelet.opacityCurveSH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveBY, "Wavelet", "OpacityCurveBY", wavelet.opacityCurveBY, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavdenoise, "Wavelet", "wavdenoise", wavelet.wavdenoise, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavdenoiseh, "Wavelet", "wavdenoiseh", wavelet.wavdenoiseh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveW, "Wavelet", "OpacityCurveW", wavelet.opacityCurveW, keyFile); saveToKeyfile(!pedited || pedited->wavelet.opacityCurveWL, "Wavelet", "OpacityCurveWL", wavelet.opacityCurveWL, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hhcurve, "Wavelet", "HHcurve", wavelet.hhcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavguidcurve, "Wavelet", "Wavguidcurve", wavelet.wavguidcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavhuecurve, "Wavelet", "Wavhuecurve", wavelet.wavhuecurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.Chcurve, "Wavelet", "CHcurve", wavelet.Chcurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.wavclCurve, "Wavelet", "WavclCurve", wavelet.wavclCurve, keyFile); saveToKeyfile(!pedited || pedited->wavelet.median, "Wavelet", "Median", wavelet.median, keyFile); @@ -3515,23 +7473,55 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->wavelet.cbenab, "Wavelet", "CBenab", wavelet.cbenab, keyFile); saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chrwav, "Wavelet", "chrwav", wavelet.chrwav, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluwav, "Wavelet", "bluwav", wavelet.bluwav, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgeffect, "Wavelet", "Edgeffect", wavelet.edgeffect, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.showmask, "Wavelet", "Showmask", wavelet.showmask, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.oldsh, "Wavelet", "Oldsh", wavelet.oldsh, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sigma, "Wavelet", "Sigma", wavelet.sigma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.offset, "Wavelet", "Offset", wavelet.offset, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.lowthr, "Wavelet", "Lowthr", wavelet.lowthr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); saveToKeyfile(!pedited || pedited->wavelet.thrH, "Wavelet", "ThresholdResidHighLight", wavelet.thrH, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.radius, "Wavelet", "Residualradius", wavelet.radius, keyFile); saveToKeyfile(!pedited || pedited->wavelet.reschro, "Wavelet", "Residualchroma", wavelet.reschro, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.resblur, "Wavelet", "Residualblur", wavelet.resblur, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.resblurc, "Wavelet", "Residualblurc", wavelet.resblurc, keyFile); saveToKeyfile(!pedited || pedited->wavelet.tmrs, "Wavelet", "ResidualTM", wavelet.tmrs, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgs, "Wavelet", "ResidualEDGS", wavelet.edgs, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.scale, "Wavelet", "ResidualSCALE", wavelet.scale, keyFile); saveToKeyfile(!pedited || pedited->wavelet.gamma, "Wavelet", "Residualgamma", wavelet.gamma, keyFile); saveToKeyfile(!pedited || pedited->wavelet.sky, "Wavelet", "HueRangeResidual", wavelet.sky, keyFile); saveToKeyfile(!pedited || pedited->wavelet.hueskin2, "Wavelet", "HueRange", wavelet.hueskin2.toVector(), keyFile); saveToKeyfile(!pedited || pedited->wavelet.contrast, "Wavelet", "Contrast", wavelet.contrast, keyFile); +//Spot removal + saveToKeyfile(!pedited || pedited->spot.enabled, "Spot removal", "Enabled", spot.enabled, keyFile); + for (size_t i = 0; i < spot.entries.size (); ++i) { + std::vector entry(7); + + entry[0] = double (spot.entries.at (i).sourcePos.x); + entry[1] = double (spot.entries.at (i).sourcePos.y); + entry[2] = double (spot.entries.at (i).targetPos.x); + entry[3] = double (spot.entries.at (i).targetPos.y); + entry[4] = double (spot.entries.at (i).radius); + entry[5] = double (spot.entries.at (i).feather); + entry[6] = double (spot.entries.at (i).opacity); + + std::stringstream ss; + ss << "Spot" << (i + 1); + + saveToKeyfile(!pedited || pedited->spot.entries, "Spot removal", ss.str(), entry, keyFile); + } + // Directional pyramid equalizer saveToKeyfile(!pedited || pedited->dirpyrequalizer.enabled, "Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled, keyFile); saveToKeyfile(!pedited || pedited->dirpyrequalizer.gamutlab, "Directional Pyramid Equalizer", "Gamutlab", dirpyrequalizer.gamutlab, keyFile); @@ -3620,10 +7610,11 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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", relativePathIfInside2(fname, options.rtSettings.darkFramesPath, 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", relativePathIfInside2(fname, options.rtSettings.flatFieldsPath, fnameAbsolute, raw.ff_file), keyFile); saveToKeyfile(!pedited || pedited->raw.ff_AutoSelect, "RAW", "FlatFieldAutoSelect", raw.ff_AutoSelect, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_FromMetaData, "RAW", "FlatFieldFromMetaData", raw.ff_FromMetaData, 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); @@ -3659,6 +7650,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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.pixelShiftHoleFill, "RAW Bayer", "pixelShiftHoleFill", raw.bayersensor.pixelShiftHoleFill, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftAverage, "RAW Bayer", "pixelShiftAverage", raw.bayersensor.pixelShiftAverage, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMedian, "RAW Bayer", "pixelShiftMedian", raw.bayersensor.pixelShiftMedian, 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); @@ -3689,6 +7681,24 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->filmNegative.greenExp, "Film Negative", "GreenExponent", filmNegative.greenExp, keyFile); saveToKeyfile(!pedited || pedited->filmNegative.blueRatio, "Film Negative", "BlueRatio", filmNegative.blueRatio, keyFile); + // FIXME to be removed: only for backwards compatibility with an intermediate dev version + if (filmNegative.backCompat == FilmNegativeParams::BackCompat::V2) { + saveToKeyfile(!pedited || pedited->filmNegative.refInput, "Film Negative", "RedBase", filmNegative.refInput.r, keyFile); + saveToKeyfile(!pedited || pedited->filmNegative.refInput, "Film Negative", "GreenBase", filmNegative.refInput.g, keyFile); + saveToKeyfile(!pedited || pedited->filmNegative.refInput, "Film Negative", "BlueBase", filmNegative.refInput.b, keyFile); + } + + saveToKeyfile(!pedited || pedited->filmNegative.colorSpace, "Film Negative", "ColorSpace", toUnderlying(filmNegative.colorSpace), keyFile); + saveToKeyfile(!pedited || pedited->filmNegative.refInput, "Film Negative", "RefInput", filmNegative.refInput, keyFile); + saveToKeyfile(!pedited || pedited->filmNegative.refOutput, "Film Negative", "RefOutput", filmNegative.refOutput, keyFile); + // Only save the "backCompat" key if the filmneg params are not already upgraded to CURRENT. + // Also, avoid saving backCompat if the "enabled" key was not saved (most probably the entire key group is excluded). + saveToKeyfile(filmNegative.backCompat != FilmNegativeParams::BackCompat::CURRENT && + (!pedited || pedited->filmNegative.enabled), "Film Negative", "BackCompat", toUnderlying(filmNegative.backCompat), keyFile); + +// Preprocess WB + saveToKeyfile(!pedited || pedited->raw.preprocessWB.mode, "RAW Preprocess WB", "Mode", toUnderlying(raw.preprocessWB.mode), keyFile); + // EXIF change list if (!pedited || pedited->exif) { for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); ++i) { @@ -3817,6 +7827,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + assignFromKeyfile(keyFile, "HLRecovery", "Hlbl", pedited, toneCurve.hlbl, pedited->toneCurve.hlbl); + assignFromKeyfile(keyFile, "HLRecovery", "Hlth", pedited, toneCurve.hlth, pedited->toneCurve.hlth); } if (keyFile.has_group("Channel Mixer")) { @@ -3911,6 +7923,16 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_group("Retinex")) { assignFromKeyfile(keyFile, "Retinex", "Median", pedited, retinex.medianmap, pedited->retinex.medianmap); + + if (keyFile.has_key("Retinex", "complexMethod")) { + assignFromKeyfile(keyFile, "Retinex", "complexMethod", pedited, retinex.complexmethod, pedited->retinex.complexmethod); + } else if (retinex.enabled) { + retinex.complexmethod = "expert"; + if (pedited) { + pedited->retinex.complexmethod = true; + } + } + assignFromKeyfile(keyFile, "Retinex", "RetinexMethod", pedited, retinex.retinexMethod, pedited->retinex.retinexMethod); assignFromKeyfile(keyFile, "Retinex", "mapMethod", pedited, retinex.mapMethod, pedited->retinex.mapMethod); assignFromKeyfile(keyFile, "Retinex", "viewMethod", pedited, retinex.viewMethod, pedited->retinex.viewMethod); @@ -3978,7 +8000,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) // if Saturation == 0, should we set BWToning on? assignFromKeyfile(keyFile, "Luminance Curve", "Saturation", pedited, labCurve.chromaticity, pedited->labCurve.chromaticity); // transform AvoidColorClipping into AvoidColorShift - assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorClipping", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); +// 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"); @@ -3992,7 +8014,6 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorShift", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); assignFromKeyfile(keyFile, "Luminance Curve", "RedAndSkinTonesProtection", pedited, labCurve.rstprotection, pedited->labCurve.rstprotection); } @@ -4021,18 +8042,40 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Luminance Curve", "hhCurve", pedited, labCurve.hhcurve, pedited->labCurve.hhcurve); assignFromKeyfile(keyFile, "Luminance Curve", "LcCurve", pedited, labCurve.lccurve, pedited->labCurve.lccurve); assignFromKeyfile(keyFile, "Luminance Curve", "ClCurve", pedited, labCurve.clcurve, pedited->labCurve.clcurve); + if (keyFile.has_key("Luminance Curve", "Gamutmunse")) { + assignFromKeyfile(keyFile, "Luminance Curve", "Gamutmunse", pedited, labCurve.gamutmunselmethod, pedited->labCurve.gamutmunselmethod); + } else { + if (ppVersion < 303) { + if (keyFile.has_key("Luminance Curve", "AvoidColorClipping")) { + labCurve.gamutmunselmethod = + keyFile.get_boolean("Luminance Curve", "AvoidColorClipping") ? "LAB" : "NONE"; + if (pedited) { + pedited->labCurve.gamutmunselmethod = true; + } + } + } else if (keyFile.has_key("Luminance Curve", "AvoidColorShift")) { + labCurve.gamutmunselmethod = + keyFile.get_boolean("Luminance Curve", "AvoidColorShift") ? "LAB" : "NONE"; + if (pedited) { + pedited->labCurve.gamutmunselmethod = true; + } + } + } } 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); @@ -4077,10 +8120,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + if (ppVersion >= 334) { assignFromKeyfile(keyFile, "SharpenMicro", "Contrast", pedited, sharpenMicro.contrast, pedited->sharpenMicro.contrast); } else { sharpenMicro.contrast = 0; + if (pedited) { pedited->sharpenMicro.contrast = true; } @@ -4121,14 +8166,50 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Vibrance", "PastSatTog", pedited, vibrance.pastsattog, pedited->vibrance.pastsattog); assignFromKeyfile(keyFile, "Vibrance", "SkinTonesCurve", pedited, vibrance.skintonescurve, pedited->vibrance.skintonescurve); } - + if (ppVersion <= 346) { // 5.8 and earlier. + wb.observer = StandardObserver::TWO_DEGREES; + if (pedited) { + pedited->wb.observer = true; + } + } else if (ppVersion <= 349) { // 5.9 + wb.observer = StandardObserver::TEN_DEGREES; + if (pedited) { + pedited->wb.observer = true; + } + } 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); + if (wb.method == "Auto") { + wb.method = "autold"; + } assignFromKeyfile(keyFile, "White Balance", "Temperature", pedited, wb.temperature, pedited->wb.temperature); assignFromKeyfile(keyFile, "White Balance", "Green", pedited, wb.green, pedited->wb.green); assignFromKeyfile(keyFile, "White Balance", "Equal", pedited, wb.equal, pedited->wb.equal); assignFromKeyfile(keyFile, "White Balance", "TemperatureBias", pedited, wb.tempBias, pedited->wb.tempBias); + Glib::ustring standard_observer; + assignFromKeyfile(keyFile, "White Balance", "StandardObserver", pedited, standard_observer, pedited->wb.observer); + if (standard_observer == "TEN_DEGREES") { + wb.observer = StandardObserver::TEN_DEGREES; + } else if (standard_observer == "TWO_DEGREES") { + wb.observer = StandardObserver::TWO_DEGREES; + } + assignFromKeyfile(keyFile, "White Balance", "Itcwb_thres", pedited, wb.itcwb_thres, pedited->wb.itcwb_thres); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_precis", pedited, wb.itcwb_precis, pedited->wb.itcwb_precis); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_size", pedited, wb.itcwb_size, pedited->wb.itcwb_size); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_delta", pedited, wb.itcwb_delta, pedited->wb.itcwb_delta); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_findgreen", pedited, wb.itcwb_fgreen, pedited->wb.itcwb_fgreen); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_rangegreen", pedited, wb.itcwb_rgreen, pedited->wb.itcwb_rgreen); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_nopurple", pedited, wb.itcwb_nopurple, pedited->wb.itcwb_nopurple); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_sorted", pedited, wb.itcwb_sorted, pedited->wb.itcwb_sorted); + assignFromKeyfile(keyFile, "White Balance", "Itcwb_forceextra", pedited, wb.itcwb_forceextra, pedited->wb.itcwb_forceextra); + if (ppVersion <= 349) { // 5.9 and earlier. + wb.itcwb_sampling = true; + if (pedited) { + pedited->wb.itcwb_sampling = true; + } + } + assignFromKeyfile(keyFile, "White Balance", "Itcwb_sampling", pedited, wb.itcwb_sampling, pedited->wb.itcwb_sampling); } if (keyFile.has_group("Defringing")) { @@ -4158,11 +8239,31 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color appearance", "AutoDegreeout", pedited, colorappearance.autodegreeout, pedited->colorappearance.autodegreeout); + if (keyFile.has_key("Color appearance", "complex")) { + assignFromKeyfile(keyFile, "Color appearance", "complex", pedited, colorappearance.complexmethod, pedited->colorappearance.complexmethod); + } else if (colorappearance.enabled) { + colorappearance.complexmethod = "expert"; + if (pedited) { + pedited->colorappearance.complexmethod = true; + } + } + + if (keyFile.has_key("Color appearance", "ModelCat")) { + assignFromKeyfile(keyFile, "Color appearance", "ModelCat", pedited, colorappearance.modelmethod, pedited->colorappearance.modelmethod); + } else if (colorappearance.enabled) { + colorappearance.modelmethod = "02"; + if (pedited) { + pedited->colorappearance.modelmethod = true; + } + } + assignFromKeyfile(keyFile, "Color appearance", "CatCat", pedited, colorappearance.catmethod, pedited->colorappearance.catmethod); + assignFromKeyfile(keyFile, "Color appearance", "Surround", pedited, colorappearance.surround, pedited->colorappearance.surround); assignFromKeyfile(keyFile, "Color appearance", "Surrsrc", pedited, colorappearance.surrsrc, pedited->colorappearance.surrsrc); assignFromKeyfile(keyFile, "Color appearance", "AdaptLum", pedited, colorappearance.adaplum, pedited->colorappearance.adaplum); assignFromKeyfile(keyFile, "Color appearance", "Badpixsl", pedited, colorappearance.badpixsl, pedited->colorappearance.badpixsl); assignFromKeyfile(keyFile, "Color appearance", "Model", pedited, colorappearance.wbmodel, pedited->colorappearance.wbmodel); + assignFromKeyfile(keyFile, "Color appearance", "Illum", pedited, colorappearance.illum, pedited->colorappearance.illum); assignFromKeyfile(keyFile, "Color appearance", "Algorithm", pedited, colorappearance.algo, pedited->colorappearance.algo); assignFromKeyfile(keyFile, "Color appearance", "J-Light", pedited, colorappearance.jlight, pedited->colorappearance.jlight); assignFromKeyfile(keyFile, "Color appearance", "Q-Bright", pedited, colorappearance.qbright, pedited->colorappearance.qbright); @@ -4180,6 +8281,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Color appearance", "SurrSource", pedited, colorappearance.surrsource, pedited->colorappearance.surrsource); assignFromKeyfile(keyFile, "Color appearance", "Gamut", pedited, colorappearance.gamut, pedited->colorappearance.gamut); assignFromKeyfile(keyFile, "Color appearance", "Tempout", pedited, colorappearance.tempout, pedited->colorappearance.tempout); + assignFromKeyfile(keyFile, "Color appearance", "Autotempout", pedited, colorappearance.autotempout, pedited->colorappearance.autotempout); assignFromKeyfile(keyFile, "Color appearance", "Greenout", pedited, colorappearance.greenout, pedited->colorappearance.greenout); assignFromKeyfile(keyFile, "Color appearance", "Tempsc", pedited, colorappearance.tempsc, pedited->colorappearance.tempsc); assignFromKeyfile(keyFile, "Color appearance", "Greensc", pedited, colorappearance.greensc, pedited->colorappearance.greensc); @@ -4272,7 +8374,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "FattalToneMapping", "Anchor", pedited, fattal.anchor, pedited->fattal.anchor); } - if (keyFile.has_group ("Shadows & Highlights") && ppVersion >= 333) { + if (keyFile.has_group("Shadows & Highlights") && ppVersion >= 333) { assignFromKeyfile(keyFile, "Shadows & Highlights", "Enabled", pedited, sh.enabled, pedited->sh.enabled); assignFromKeyfile(keyFile, "Shadows & Highlights", "Highlights", pedited, sh.highlights, pedited->sh.highlights); assignFromKeyfile(keyFile, "Shadows & Highlights", "HighlightTonalWidth", pedited, sh.htonalwidth, pedited->sh.htonalwidth); @@ -4287,7 +8389,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_key("Shadows & Highlights", "LocalContrast") && ppVersion < 329) { int lc = keyFile.get_integer("Shadows & Highlights", "LocalContrast"); - localContrast.amount = float(lc) / 30.; + localContrast.amount = float(lc) / 30.f; if (pedited) { pedited->localContrast.amount = true; @@ -4307,6 +8409,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } + if (keyFile.has_group("ToneEqualizer")) { + assignFromKeyfile(keyFile, "ToneEqualizer", "Enabled", pedited, toneEqualizer.enabled, pedited->toneEqualizer.enabled); + for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) { + assignFromKeyfile(keyFile, "ToneEqualizer", "Band" + std::to_string(i), pedited, toneEqualizer.bands[i], pedited->toneEqualizer.bands[i]); + } + assignFromKeyfile(keyFile, "ToneEqualizer", "Regularization", pedited, toneEqualizer.regularization, pedited->toneEqualizer.regularization); + assignFromKeyfile(keyFile, "ToneEqualizer", "Pivot", pedited, toneEqualizer.pivot, pedited->toneEqualizer.pivot); + } + 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); @@ -4346,7 +8457,26 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Crop", "Orientation", pedited, crop.orientation, pedited->crop.orientation); - assignFromKeyfile(keyFile, "Crop", "Guide", pedited, crop.guide, pedited->crop.guide); + assignFromKeyfile( + keyFile, + "Crop", + "Guide", + pedited, + { + {"None", CropParams::Guide::NONE}, + {"Frame", CropParams::Guide::FRAME}, + {"Rule of thirds", CropParams::Guide::RULE_OF_THIRDS}, + {"Rule of diagonals", CropParams::Guide::RULE_OF_DIAGONALS}, + {"Harmonic means", CropParams::Guide::HARMONIC_MEANS}, + {"Grid", CropParams::Guide::GRID}, + {"Golden Triangle 1", CropParams::Guide::GOLDEN_TRIANGLE_1}, + {"Golden Triangle 2", CropParams::Guide::GOLDEN_TRIANGLE_2}, + {"ePassport", CropParams::Guide::EPASSPORT}, + {"Centered square", CropParams::Guide::CENTERED_SQUARE} + }, + crop.guide, + pedited->crop.guide + ); } if (keyFile.has_group("Coarse Transformation")) { @@ -4360,6 +8490,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group("Common Properties for Transformations")) { + if (keyFile.has_key("Common Properties for Transformations", "Method")) { + assignFromKeyfile(keyFile, "Common Properties for Transformations", "Method", pedited, commonTrans.method, pedited->commonTrans.method); + } else { + commonTrans.method = "lin"; + } assignFromKeyfile(keyFile, "Common Properties for Transformations", "AutoFill", pedited, commonTrans.autofill, pedited->commonTrans.autofill); } @@ -4377,7 +8512,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_key("LensProfile", "LCPFile")) { - lensProf.lcpFile = expandRelativePath(fname, "", keyFile.get_string("LensProfile", "LCPFile")); + lensProf.lcpFile = expandRelativePath2(fname, options.rtSettings.lensProfilesPath, "", keyFile.get_string("LensProfile", "LCPFile")); if (pedited) { pedited->lensProf.lcpFile = true; @@ -4418,8 +8553,28 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group("Perspective")) { + assignFromKeyfile(keyFile, "Perspective", "Method", pedited, perspective.method, pedited->perspective.method); assignFromKeyfile(keyFile, "Perspective", "Horizontal", pedited, perspective.horizontal, pedited->perspective.horizontal); assignFromKeyfile(keyFile, "Perspective", "Vertical", pedited, perspective.vertical, pedited->perspective.vertical); + assignFromKeyfile(keyFile, "Perspective", "CameraShiftHorizontal", pedited, perspective.camera_shift_horiz, pedited->perspective.camera_shift_horiz); + assignFromKeyfile(keyFile, "Perspective", "CameraShiftVertical", pedited, perspective.camera_shift_vert, pedited->perspective.camera_shift_vert); + assignFromKeyfile(keyFile, "Perspective", "CameraPitch", pedited, perspective.camera_pitch, pedited->perspective.camera_pitch); + assignFromKeyfile(keyFile, "Perspective", "CameraRoll", pedited, perspective.camera_roll, pedited->perspective.camera_roll); + assignFromKeyfile(keyFile, "Perspective", "CameraCropFactor", pedited, perspective.camera_crop_factor, pedited->perspective.camera_crop_factor); + assignFromKeyfile(keyFile, "Perspective", "CameraFocalLength", pedited, perspective.camera_focal_length, pedited->perspective.camera_focal_length); + assignFromKeyfile(keyFile, "Perspective", "CameraYaw", pedited, perspective.camera_yaw, pedited->perspective.camera_yaw); + assignFromKeyfile(keyFile, "Perspective", "ProjectionPitch", pedited, perspective.projection_pitch, pedited->perspective.projection_pitch); + assignFromKeyfile(keyFile, "Perspective", "ProjectionRotate", pedited, perspective.projection_rotate, pedited->perspective.projection_rotate); + assignFromKeyfile(keyFile, "Perspective", "ProjectionShiftHorizontal", pedited, perspective.projection_shift_horiz, pedited->perspective.projection_shift_horiz); + assignFromKeyfile(keyFile, "Perspective", "ProjectionShiftVertical", pedited, perspective.projection_shift_vert, pedited->perspective.projection_shift_vert); + assignFromKeyfile(keyFile, "Perspective", "ProjectionYaw", pedited, perspective.projection_yaw, pedited->perspective.projection_yaw); + if (keyFile.has_key("Perspective", "ControlLineValues") && keyFile.has_key("Perspective", "ControlLineTypes")) { + perspective.control_line_values = keyFile.get_integer_list("Perspective", "ControlLineValues"); + perspective.control_line_types = keyFile.get_integer_list("Perspective", "ControlLineTypes"); + if (pedited) { + pedited->perspective.control_lines = true; + } + } } if (keyFile.has_group("Gradient")) { @@ -4431,6 +8586,855 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Gradient", "CenterY", pedited, gradient.centerY, pedited->gradient.centerY); } + if (keyFile.has_group("Locallab")) { + assignFromKeyfile(keyFile, "Locallab", "Enabled", pedited, locallab.enabled, pedited->locallab.enabled); + assignFromKeyfile(keyFile, "Locallab", "Selspot", pedited, locallab.selspot, pedited->locallab.selspot); + + Glib::ustring ppName; + bool peName; + int i = 0; + + while (assignFromKeyfile(keyFile, "Locallab", "Name_" + std::to_string(i), pedited, ppName, peName)) { + const std::string index_str = std::to_string(i); + + // Create new LocallabSpot and LocallabParamsEdited + LocallabParams::LocallabSpot spot; + spot.name = ppName; + LocallabParamsEdited::LocallabSpotEdited spotEdited(false); + spotEdited.name = peName; + + // Control spot settings + assignFromKeyfile(keyFile, "Locallab", "Isvisible_" + index_str, pedited, spot.isvisible, spotEdited.isvisible); + assignFromKeyfile(keyFile, "Locallab", "PrevMethod_" + index_str, pedited, spot.prevMethod, spotEdited.prevMethod); + assignFromKeyfile(keyFile, "Locallab", "Shape_" + index_str, pedited, spot.shape, spotEdited.shape); + assignFromKeyfile(keyFile, "Locallab", "SpotMethod_" + index_str, pedited, spot.spotMethod, spotEdited.spotMethod); + assignFromKeyfile(keyFile, "Locallab", "wavMethod_" + index_str, pedited, spot.wavMethod, spotEdited.wavMethod); + assignFromKeyfile(keyFile, "Locallab", "SensiExclu_" + index_str, pedited, spot.sensiexclu, spotEdited.sensiexclu); + assignFromKeyfile(keyFile, "Locallab", "StructExclu_" + index_str, pedited, spot.structexclu, spotEdited.structexclu); + assignFromKeyfile(keyFile, "Locallab", "Struc_" + index_str, pedited, spot.struc, spotEdited.struc); + assignFromKeyfile(keyFile, "Locallab", "ShapeMethod_" + index_str, pedited, spot.shapeMethod, spotEdited.shapeMethod); + if (keyFile.has_key("Locallab", "AvoidgamutMethod_" + index_str)) { + assignFromKeyfile(keyFile, "Locallab", "AvoidgamutMethod_" + index_str, pedited, spot.avoidgamutMethod, spotEdited.avoidgamutMethod); + } else if (keyFile.has_key("Locallab", "Avoid_" + index_str)) { + const bool avoid = keyFile.get_boolean("Locallab", "Avoid_" + index_str); + const bool munsell = keyFile.has_key("Locallab", "Avoidmun_" + index_str) && keyFile.get_boolean("Locallab", "Avoidmun_" + index_str); + spot.avoidgamutMethod = avoid ? (munsell ? "MUNS" : "LAB") : "NONE"; + if (pedited) { + spotEdited.avoidgamutMethod = true; + } + } + assignFromKeyfile(keyFile, "Locallab", "Loc_" + index_str, pedited, spot.loc, spotEdited.loc); + assignFromKeyfile(keyFile, "Locallab", "CenterX_" + index_str, pedited, spot.centerX, spotEdited.centerX); + assignFromKeyfile(keyFile, "Locallab", "CenterY_" + index_str, pedited, spot.centerY, spotEdited.centerY); + assignFromKeyfile(keyFile, "Locallab", "Circrad_" + index_str, pedited, spot.circrad, spotEdited.circrad); + assignFromKeyfile(keyFile, "Locallab", "QualityMethod_" + index_str, pedited, spot.qualityMethod, spotEdited.qualityMethod); + assignFromKeyfile(keyFile, "Locallab", "ComplexMethod_" + index_str, pedited, spot.complexMethod, spotEdited.complexMethod); + assignFromKeyfile(keyFile, "Locallab", "Transit_" + index_str, pedited, spot.transit, spotEdited.transit); + assignFromKeyfile(keyFile, "Locallab", "Feather_" + index_str, pedited, spot.feather, spotEdited.feather); + assignFromKeyfile(keyFile, "Locallab", "Thresh_" + index_str, pedited, spot.thresh, spotEdited.thresh); + assignFromKeyfile(keyFile, "Locallab", "Iter_" + index_str, pedited, spot.iter, spotEdited.iter); + assignFromKeyfile(keyFile, "Locallab", "Balan_" + index_str, pedited, spot.balan, spotEdited.balan); + assignFromKeyfile(keyFile, "Locallab", "Balanh_" + index_str, pedited, spot.balanh, spotEdited.balanh); + assignFromKeyfile(keyFile, "Locallab", "Colorde_" + index_str, pedited, spot.colorde, spotEdited.colorde); + assignFromKeyfile(keyFile, "Locallab", "Colorscope_" + index_str, pedited, spot.colorscope, spotEdited.colorscope); + assignFromKeyfile(keyFile, "Locallab", "Avoidrad_" + index_str, pedited, spot.avoidrad, spotEdited.avoidrad); + assignFromKeyfile(keyFile, "Locallab", "Transitweak_" + index_str, pedited, spot.transitweak, spotEdited.transitweak); + assignFromKeyfile(keyFile, "Locallab", "Transitgrad_" + index_str, pedited, spot.transitgrad, spotEdited.transitgrad); + assignFromKeyfile(keyFile, "Locallab", "Hishow_" + index_str, pedited, spot.hishow, spotEdited.hishow); + assignFromKeyfile(keyFile, "Locallab", "Activ_" + index_str, pedited, spot.activ, spotEdited.activ); + assignFromKeyfile(keyFile, "Locallab", "Blwh_" + index_str, pedited, spot.blwh, spotEdited.blwh); + assignFromKeyfile(keyFile, "Locallab", "Recurs_" + index_str, pedited, spot.recurs, spotEdited.recurs); + assignFromKeyfile(keyFile, "Locallab", "Laplac_" + index_str, pedited, spot.laplac, spotEdited.laplac); + assignFromKeyfile(keyFile, "Locallab", "Deltae_" + index_str, pedited, spot.deltae, spotEdited.deltae); + assignFromKeyfile(keyFile, "Locallab", "Shortc_" + index_str, pedited, spot.shortc, spotEdited.shortc); + assignFromKeyfile(keyFile, "Locallab", "Savrest_" + index_str, pedited, spot.savrest, spotEdited.savrest); + assignFromKeyfile(keyFile, "Locallab", "Scopemask_" + index_str, pedited, spot.scopemask, spotEdited.scopemask); + assignFromKeyfile(keyFile, "Locallab", "Denoichmask_" + index_str, pedited, spot.denoichmask, spotEdited.denoichmask); + assignFromKeyfile(keyFile, "Locallab", "Lumask_" + index_str, pedited, spot.lumask, spotEdited.lumask); + // Color & Light + spot.visicolor = assignFromKeyfile(keyFile, "Locallab", "Expcolor_" + index_str, pedited, spot.expcolor, spotEdited.expcolor); + + if (spot.visicolor) { + spotEdited.visicolor = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexcolor_" + index_str, pedited, spot.complexcolor, spotEdited.complexcolor); + assignFromKeyfile(keyFile, "Locallab", "Curvactiv_" + index_str, pedited, spot.curvactiv, spotEdited.curvactiv); + assignFromKeyfile(keyFile, "Locallab", "Lightness_" + index_str, pedited, spot.lightness, spotEdited.lightness); + assignFromKeyfile(keyFile, "Locallab", "Reparcol_" + index_str, pedited, spot.reparcol, spotEdited.reparcol); + assignFromKeyfile(keyFile, "Locallab", "Gamc_" + index_str, pedited, spot.gamc, spotEdited.gamc); + assignFromKeyfile(keyFile, "Locallab", "Contrast_" + index_str, pedited, spot.contrast, spotEdited.contrast); + assignFromKeyfile(keyFile, "Locallab", "Chroma_" + index_str, pedited, spot.chroma, spotEdited.chroma); + assignFromKeyfile(keyFile, "Locallab", "labgridALow_" + index_str, pedited, spot.labgridALow, spotEdited.labgridALow); + assignFromKeyfile(keyFile, "Locallab", "labgridBLow_" + index_str, pedited, spot.labgridBLow, spotEdited.labgridBLow); + assignFromKeyfile(keyFile, "Locallab", "labgridAHigh_" + index_str, pedited, spot.labgridAHigh, spotEdited.labgridAHigh); + assignFromKeyfile(keyFile, "Locallab", "labgridBHigh_" + index_str, pedited, spot.labgridBHigh, spotEdited.labgridBHigh); + assignFromKeyfile(keyFile, "Locallab", "labgridALowmerg_" + index_str, pedited, spot.labgridALowmerg, spotEdited.labgridALowmerg); + assignFromKeyfile(keyFile, "Locallab", "labgridBLowmerg_" + index_str, pedited, spot.labgridBLowmerg, spotEdited.labgridBLowmerg); + assignFromKeyfile(keyFile, "Locallab", "labgridAHighmerg_" + index_str, pedited, spot.labgridAHighmerg, spotEdited.labgridAHighmerg); + assignFromKeyfile(keyFile, "Locallab", "labgridBHighmerg_" + index_str, pedited, spot.labgridBHighmerg, spotEdited.labgridBHighmerg); + assignFromKeyfile(keyFile, "Locallab", "Strengthgrid_" + index_str, pedited, spot.strengthgrid, spotEdited.strengthgrid); + assignFromKeyfile(keyFile, "Locallab", "Sensi_" + index_str, pedited, spot.sensi, spotEdited.sensi); + assignFromKeyfile(keyFile, "Locallab", "Structcol_" + index_str, pedited, spot.structcol, spotEdited.structcol); + assignFromKeyfile(keyFile, "Locallab", "Strcol_" + index_str, pedited, spot.strcol, spotEdited.strcol); + assignFromKeyfile(keyFile, "Locallab", "Strcolab_" + index_str, pedited, spot.strcolab, spotEdited.strcolab); + assignFromKeyfile(keyFile, "Locallab", "Strcolh_" + index_str, pedited, spot.strcolh, spotEdited.strcolh); + assignFromKeyfile(keyFile, "Locallab", "Angcol_" + index_str, pedited, spot.angcol, spotEdited.angcol); + assignFromKeyfile(keyFile, "Locallab", "Blurcolde_" + index_str, pedited, spot.blurcolde, spotEdited.blurcolde); + assignFromKeyfile(keyFile, "Locallab", "Blurcol_" + index_str, pedited, spot.blurcol, spotEdited.blurcol); + assignFromKeyfile(keyFile, "Locallab", "Contcol_" + index_str, pedited, spot.contcol, spotEdited.contcol); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskcol_" + index_str, pedited, spot.blendmaskcol, spotEdited.blendmaskcol); + assignFromKeyfile(keyFile, "Locallab", "Radmaskcol_" + index_str, pedited, spot.radmaskcol, spotEdited.radmaskcol); + assignFromKeyfile(keyFile, "Locallab", "Chromaskcol_" + index_str, pedited, spot.chromaskcol, spotEdited.chromaskcol); + assignFromKeyfile(keyFile, "Locallab", "Gammaskcol_" + index_str, pedited, spot.gammaskcol, spotEdited.gammaskcol); + assignFromKeyfile(keyFile, "Locallab", "Slomaskcol_" + index_str, pedited, spot.slomaskcol, spotEdited.slomaskcol); + assignFromKeyfile(keyFile, "Locallab", "shadmaskcol_" + index_str, pedited, spot.shadmaskcol, spotEdited.shadmaskcol); + assignFromKeyfile(keyFile, "Locallab", "strumaskcol_" + index_str, pedited, spot.strumaskcol, spotEdited.strumaskcol); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskcol_" + index_str, pedited, spot.lapmaskcol, spotEdited.lapmaskcol); + assignFromKeyfile(keyFile, "Locallab", "QualityCurveMethod_" + index_str, pedited, spot.qualitycurveMethod, spotEdited.qualitycurveMethod); + assignFromKeyfile(keyFile, "Locallab", "gridMethod_" + index_str, pedited, spot.gridMethod, spotEdited.gridMethod); + assignFromKeyfile(keyFile, "Locallab", "Merg_Method_" + index_str, pedited, spot.merMethod, spotEdited.merMethod); + assignFromKeyfile(keyFile, "Locallab", "ToneMethod_" + index_str, pedited, spot.toneMethod, spotEdited.toneMethod); + assignFromKeyfile(keyFile, "Locallab", "mergecolMethod_" + index_str, pedited, spot.mergecolMethod, spotEdited.mergecolMethod); + assignFromKeyfile(keyFile, "Locallab", "LLCurve_" + index_str, pedited, spot.llcurve, spotEdited.llcurve); + assignFromKeyfile(keyFile, "Locallab", "LCCurve_" + index_str, pedited, spot.lccurve, spotEdited.lccurve); + assignFromKeyfile(keyFile, "Locallab", "CCCurve_" + index_str, pedited, spot.cccurve, spotEdited.cccurve); + assignFromKeyfile(keyFile, "Locallab", "CLCurve_" + index_str, pedited, spot.clcurve, spotEdited.clcurve); + assignFromKeyfile(keyFile, "Locallab", "RGBCurve_" + index_str, pedited, spot.rgbcurve, spotEdited.rgbcurve); + assignFromKeyfile(keyFile, "Locallab", "LHCurve_" + index_str, pedited, spot.LHcurve, spotEdited.LHcurve); + assignFromKeyfile(keyFile, "Locallab", "HHCurve_" + index_str, pedited, spot.HHcurve, spotEdited.HHcurve); + assignFromKeyfile(keyFile, "Locallab", "CHCurve_" + index_str, pedited, spot.CHcurve, spotEdited.CHcurve); + assignFromKeyfile(keyFile, "Locallab", "Invers_" + index_str, pedited, spot.invers, spotEdited.invers); + assignFromKeyfile(keyFile, "Locallab", "Special_" + index_str, pedited, spot.special, spotEdited.special); + assignFromKeyfile(keyFile, "Locallab", "Toolcol_" + index_str, pedited, spot.toolcol, spotEdited.toolcol); + assignFromKeyfile(keyFile, "Locallab", "EnaColorMask_" + index_str, pedited, spot.enaColorMask, spotEdited.enaColorMask); + assignFromKeyfile(keyFile, "Locallab", "FftColorMask_" + index_str, pedited, spot.fftColorMask, spotEdited.fftColorMask); + assignFromKeyfile(keyFile, "Locallab", "CCmaskCurve_" + index_str, pedited, spot.CCmaskcurve, spotEdited.CCmaskcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskCurve_" + index_str, pedited, spot.LLmaskcurve, spotEdited.LLmaskcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskCurve_" + index_str, pedited, spot.HHmaskcurve, spotEdited.HHmaskcurve); + assignFromKeyfile(keyFile, "Locallab", "HHhmaskCurve_" + index_str, pedited, spot.HHhmaskcurve, spotEdited.HHhmaskcurve); + assignFromKeyfile(keyFile, "Locallab", "Softradiuscol_" + index_str, pedited, spot.softradiuscol, spotEdited.softradiuscol); + assignFromKeyfile(keyFile, "Locallab", "Opacol_" + index_str, pedited, spot.opacol, spotEdited.opacol); + assignFromKeyfile(keyFile, "Locallab", "Mercol_" + index_str, pedited, spot.mercol, spotEdited.mercol); + assignFromKeyfile(keyFile, "Locallab", "Merlucol_" + index_str, pedited, spot.merlucol, spotEdited.merlucol); + assignFromKeyfile(keyFile, "Locallab", "Conthrcol_" + index_str, pedited, spot.conthrcol, spotEdited.conthrcol); + assignFromKeyfile(keyFile, "Locallab", "LmaskCurve_" + index_str, pedited, spot.Lmaskcurve, spotEdited.Lmaskcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskcolCurvewav_" + index_str, pedited, spot.LLmaskcolcurvewav, spotEdited.LLmaskcolcurvewav); + + if (keyFile.has_key("Locallab", "CSThresholdcol_" + index_str)) { + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThresholdcol_" + index_str); + + if (thresh.size() >= 4) { + spot.csthresholdcol.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + spotEdited.csthresholdcol = true; + } + assignFromKeyfile(keyFile, "Locallab", "Recothresc_" + index_str, pedited, spot.recothresc, spotEdited.recothresc); + assignFromKeyfile(keyFile, "Locallab", "Lowthresc_" + index_str, pedited, spot.lowthresc, spotEdited.lowthresc); + assignFromKeyfile(keyFile, "Locallab", "Higthresc_" + index_str, pedited, spot.higthresc, spotEdited.higthresc); + assignFromKeyfile(keyFile, "Locallab", "Decayc_" + index_str, pedited, spot.decayc, spotEdited.decayc); + + // Exposure + spot.visiexpose = assignFromKeyfile(keyFile, "Locallab", "Expexpose_" + index_str, pedited, spot.expexpose, spotEdited.expexpose); + + if (spot.visiexpose) { + spotEdited.visiexpose = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexexpose_" + index_str, pedited, spot.complexexpose, spotEdited.complexexpose); + assignFromKeyfile(keyFile, "Locallab", "Expcomp_" + index_str, pedited, spot.expcomp, spotEdited.expcomp); + assignFromKeyfile(keyFile, "Locallab", "Hlcompr_" + index_str, pedited, spot.hlcompr, spotEdited.hlcompr); + assignFromKeyfile(keyFile, "Locallab", "Hlcomprthresh_" + index_str, pedited, spot.hlcomprthresh, spotEdited.hlcomprthresh); + assignFromKeyfile(keyFile, "Locallab", "Black_" + index_str, pedited, spot.black, spotEdited.black); + assignFromKeyfile(keyFile, "Locallab", "Shadex_" + index_str, pedited, spot.shadex, spotEdited.shadex); + assignFromKeyfile(keyFile, "Locallab", "Shcompr_" + index_str, pedited, spot.shcompr, spotEdited.shcompr); + assignFromKeyfile(keyFile, "Locallab", "Expchroma_" + index_str, pedited, spot.expchroma, spotEdited.expchroma); + assignFromKeyfile(keyFile, "Locallab", "Sensiex_" + index_str, pedited, spot.sensiex, spotEdited.sensiex); + assignFromKeyfile(keyFile, "Locallab", "Structexp_" + index_str, pedited, spot.structexp, spotEdited.structexp); + assignFromKeyfile(keyFile, "Locallab", "Blurexpde_" + index_str, pedited, spot.blurexpde, spotEdited.blurexpde); + assignFromKeyfile(keyFile, "Locallab", "Gamex_" + index_str, pedited, spot.gamex, spotEdited.gamex); + assignFromKeyfile(keyFile, "Locallab", "Strexp_" + index_str, pedited, spot.strexp, spotEdited.strexp); + assignFromKeyfile(keyFile, "Locallab", "Angexp_" + index_str, pedited, spot.angexp, spotEdited.angexp); + assignFromKeyfile(keyFile, "Locallab", "ExCurve_" + index_str, pedited, spot.excurve, spotEdited.excurve); + assignFromKeyfile(keyFile, "Locallab", "Norm_" + index_str, pedited, spot.norm, spotEdited.norm); + assignFromKeyfile(keyFile, "Locallab", "Inversex_" + index_str, pedited, spot.inversex, spotEdited.inversex); + assignFromKeyfile(keyFile, "Locallab", "EnaExpMask_" + index_str, pedited, spot.enaExpMask, spotEdited.enaExpMask); + assignFromKeyfile(keyFile, "Locallab", "EnaExpMaskaft_" + index_str, pedited, spot.enaExpMaskaft, spotEdited.enaExpMaskaft); + assignFromKeyfile(keyFile, "Locallab", "CCmaskexpCurve_" + index_str, pedited, spot.CCmaskexpcurve, spotEdited.CCmaskexpcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskexpCurve_" + index_str, pedited, spot.LLmaskexpcurve, spotEdited.LLmaskexpcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskexpCurve_" + index_str, pedited, spot.HHmaskexpcurve, spotEdited.HHmaskexpcurve); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskexp_" + index_str, pedited, spot.blendmaskexp, spotEdited.blendmaskexp); + assignFromKeyfile(keyFile, "Locallab", "Radmaskexp_" + index_str, pedited, spot.radmaskexp, spotEdited.radmaskexp); + assignFromKeyfile(keyFile, "Locallab", "Chromaskexp_" + index_str, pedited, spot.chromaskexp, spotEdited.chromaskexp); + assignFromKeyfile(keyFile, "Locallab", "Gammaskexp_" + index_str, pedited, spot.gammaskexp, spotEdited.gammaskexp); + assignFromKeyfile(keyFile, "Locallab", "Slomaskexp_" + index_str, pedited, spot.slomaskexp, spotEdited.slomaskexp); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskexp_" + index_str, pedited, spot.lapmaskexp, spotEdited.lapmaskexp); + assignFromKeyfile(keyFile, "Locallab", "Strmaskexp_" + index_str, pedited, spot.strmaskexp, spotEdited.strmaskexp); + assignFromKeyfile(keyFile, "Locallab", "Angmaskexp_" + index_str, pedited, spot.angmaskexp, spotEdited.angmaskexp); + assignFromKeyfile(keyFile, "Locallab", "Softradiusexp_" + index_str, pedited, spot.softradiusexp, spotEdited.softradiusexp); + assignFromKeyfile(keyFile, "Locallab", "LmaskexpCurve_" + index_str, pedited, spot.Lmaskexpcurve, spotEdited.Lmaskexpcurve); + assignFromKeyfile(keyFile, "Locallab", "ExpMethod_" + index_str, pedited, spot.expMethod, spotEdited.expMethod); + assignFromKeyfile(keyFile, "Locallab", "ExnoiseMethod_" + index_str, pedited, spot.exnoiseMethod, spotEdited.exnoiseMethod); + assignFromKeyfile(keyFile, "Locallab", "Laplacexp_" + index_str, pedited, spot.laplacexp, spotEdited.laplacexp); + assignFromKeyfile(keyFile, "Locallab", "Reparexp_" + index_str, pedited, spot.reparexp, spotEdited.reparexp); + assignFromKeyfile(keyFile, "Locallab", "Balanexp_" + index_str, pedited, spot.balanexp, spotEdited.balanexp); + assignFromKeyfile(keyFile, "Locallab", "Linearexp_" + index_str, pedited, spot.linear, spotEdited.linear); + assignFromKeyfile(keyFile, "Locallab", "Gamm_" + index_str, pedited, spot.gamm, spotEdited.gamm); + assignFromKeyfile(keyFile, "Locallab", "Fatamount_" + index_str, pedited, spot.fatamount, spotEdited.fatamount); + assignFromKeyfile(keyFile, "Locallab", "Fatdetail_" + index_str, pedited, spot.fatdetail, spotEdited.fatdetail); + assignFromKeyfile(keyFile, "Locallab", "Fatanchor_" + index_str, pedited, spot.fatanchor, spotEdited.fatanchor); + assignFromKeyfile(keyFile, "Locallab", "Fatlevel_" + index_str, pedited, spot.fatlevel, spotEdited.fatlevel); + assignFromKeyfile(keyFile, "Locallab", "Recothrese_" + index_str, pedited, spot.recothrese, spotEdited.recothrese); + assignFromKeyfile(keyFile, "Locallab", "Lowthrese_" + index_str, pedited, spot.lowthrese, spotEdited.lowthrese); + assignFromKeyfile(keyFile, "Locallab", "Higthrese_" + index_str, pedited, spot.higthrese, spotEdited.higthrese); + assignFromKeyfile(keyFile, "Locallab", "Decaye_" + index_str, pedited, spot.decaye, spotEdited.decaye); + // Shadow highlight + spot.visishadhigh = assignFromKeyfile(keyFile, "Locallab", "Expshadhigh_" + index_str, pedited, spot.expshadhigh, spotEdited.expshadhigh); + + if (spot.visishadhigh) { + spotEdited.visishadhigh = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexshadhigh_" + index_str, pedited, spot.complexshadhigh, spotEdited.complexshadhigh); + assignFromKeyfile(keyFile, "Locallab", "ShMethod_" + index_str, pedited, spot.shMethod, spotEdited.shMethod); + + for (int j = 0; j < 5; j ++) { + assignFromKeyfile(keyFile, "Locallab", "Multsh" + std::to_string(j) + "_" + index_str, pedited, spot.multsh[j], spotEdited.multsh[j]); + } + + assignFromKeyfile(keyFile, "Locallab", "Expshadhigh_" + index_str, pedited, spot.expshadhigh, spotEdited.expshadhigh); + assignFromKeyfile(keyFile, "Locallab", "highlights_" + index_str, pedited, spot.highlights, spotEdited.highlights); + assignFromKeyfile(keyFile, "Locallab", "h_tonalwidth_" + index_str, pedited, spot.h_tonalwidth, spotEdited.h_tonalwidth); + assignFromKeyfile(keyFile, "Locallab", "shadows_" + index_str, pedited, spot.shadows, spotEdited.shadows); + assignFromKeyfile(keyFile, "Locallab", "s_tonalwidth_" + index_str, pedited, spot.s_tonalwidth, spotEdited.s_tonalwidth); + assignFromKeyfile(keyFile, "Locallab", "sh_radius_" + index_str, pedited, spot.sh_radius, spotEdited.sh_radius); + assignFromKeyfile(keyFile, "Locallab", "sensihs_" + index_str, pedited, spot.sensihs, spotEdited.sensihs); + assignFromKeyfile(keyFile, "Locallab", "EnaSHMask_" + index_str, pedited, spot.enaSHMask, spotEdited.enaSHMask); + assignFromKeyfile(keyFile, "Locallab", "CCmaskSHCurve_" + index_str, pedited, spot.CCmaskSHcurve, spotEdited.CCmaskSHcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskSHCurve_" + index_str, pedited, spot.LLmaskSHcurve, spotEdited.LLmaskSHcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskSHCurve_" + index_str, pedited, spot.HHmaskSHcurve, spotEdited.HHmaskSHcurve); + assignFromKeyfile(keyFile, "Locallab", "BlendmaskSH_" + index_str, pedited, spot.blendmaskSH, spotEdited.blendmaskSH); + assignFromKeyfile(keyFile, "Locallab", "RadmaskSH_" + index_str, pedited, spot.radmaskSH, spotEdited.radmaskSH); + assignFromKeyfile(keyFile, "Locallab", "BlurSHde_" + index_str, pedited, spot.blurSHde, spotEdited.blurSHde); + assignFromKeyfile(keyFile, "Locallab", "StrSH_" + index_str, pedited, spot.strSH, spotEdited.strSH); + assignFromKeyfile(keyFile, "Locallab", "AngSH_" + index_str, pedited, spot.angSH, spotEdited.angSH); + assignFromKeyfile(keyFile, "Locallab", "Inverssh_" + index_str, pedited, spot.inverssh, spotEdited.inverssh); + assignFromKeyfile(keyFile, "Locallab", "ChromaskSH_" + index_str, pedited, spot.chromaskSH, spotEdited.chromaskSH); + assignFromKeyfile(keyFile, "Locallab", "GammaskSH_" + index_str, pedited, spot.gammaskSH, spotEdited.gammaskSH); + assignFromKeyfile(keyFile, "Locallab", "SlomaskSH_" + index_str, pedited, spot.slomaskSH, spotEdited.slomaskSH); + assignFromKeyfile(keyFile, "Locallab", "LapmaskSH_" + index_str, pedited, spot.lapmaskSH, spotEdited.lapmaskSH); + assignFromKeyfile(keyFile, "Locallab", "DetailSH_" + index_str, pedited, spot.detailSH, spotEdited.detailSH); + assignFromKeyfile(keyFile, "Locallab", "TePivot_" + index_str, pedited, spot.tePivot, spotEdited.tePivot); + assignFromKeyfile(keyFile, "Locallab", "Reparsh_" + index_str, pedited, spot.reparsh, spotEdited.reparsh); + assignFromKeyfile(keyFile, "Locallab", "LmaskSHCurve_" + index_str, pedited, spot.LmaskSHcurve, spotEdited.LmaskSHcurve); + assignFromKeyfile(keyFile, "Locallab", "FatamountSH_" + index_str, pedited, spot.fatamountSH, spotEdited.fatamountSH); + assignFromKeyfile(keyFile, "Locallab", "FatanchorSH_" + index_str, pedited, spot.fatanchorSH, spotEdited.fatanchorSH); + assignFromKeyfile(keyFile, "Locallab", "GamSH_" + index_str, pedited, spot.gamSH, spotEdited.gamSH); + assignFromKeyfile(keyFile, "Locallab", "SloSH_" + index_str, pedited, spot.sloSH, spotEdited.sloSH); + assignFromKeyfile(keyFile, "Locallab", "Recothress_" + index_str, pedited, spot.recothress, spotEdited.recothress); + assignFromKeyfile(keyFile, "Locallab", "Lowthress_" + index_str, pedited, spot.lowthress, spotEdited.lowthress); + assignFromKeyfile(keyFile, "Locallab", "Higthress_" + index_str, pedited, spot.higthress, spotEdited.higthress); + assignFromKeyfile(keyFile, "Locallab", "Decays_" + index_str, pedited, spot.decays, spotEdited.decays); + // Vibrance + spot.visivibrance = assignFromKeyfile(keyFile, "Locallab", "Expvibrance_" + index_str, pedited, spot.expvibrance, spotEdited.expvibrance); + + if (spot.visivibrance) { + spotEdited.visivibrance = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexvibrance_" + index_str, pedited, spot.complexvibrance, spotEdited.complexvibrance); + assignFromKeyfile(keyFile, "Locallab", "Saturated_" + index_str, pedited, spot.saturated, spotEdited.saturated); + assignFromKeyfile(keyFile, "Locallab", "Pastels_" + index_str, pedited, spot.pastels, spotEdited.pastels); + assignFromKeyfile(keyFile, "Locallab", "Vibgam_" + index_str, pedited, spot.vibgam, spotEdited.vibgam); + assignFromKeyfile(keyFile, "Locallab", "Warm_" + index_str, pedited, spot.warm, spotEdited.warm); + + if (keyFile.has_key("Locallab", "PSThreshold_" + index_str)) { + const std::vector thresh = keyFile.get_integer_list("Locallab", "PSThreshold_" + index_str); + + if (thresh.size() >= 2) { + spot.psthreshold.setValues(thresh[0], thresh[1]); + } + + spotEdited.psthreshold = true; + } + + assignFromKeyfile(keyFile, "Locallab", "ProtectSkins_" + index_str, pedited, spot.protectskins, spotEdited.protectskins); + assignFromKeyfile(keyFile, "Locallab", "AvoidColorShift_" + index_str, pedited, spot.avoidcolorshift, spotEdited.avoidcolorshift); + assignFromKeyfile(keyFile, "Locallab", "PastSatTog_" + index_str, pedited, spot.pastsattog, spotEdited.pastsattog); + assignFromKeyfile(keyFile, "Locallab", "Sensiv_" + index_str, pedited, spot.sensiv, spotEdited.sensiv); + assignFromKeyfile(keyFile, "Locallab", "SkinTonesCurve_" + index_str, pedited, spot.skintonescurve, spotEdited.skintonescurve); + assignFromKeyfile(keyFile, "Locallab", "CCmaskvibCurve_" + index_str, pedited, spot.CCmaskvibcurve, spotEdited.CCmaskvibcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskvibCurve_" + index_str, pedited, spot.LLmaskvibcurve, spotEdited.LLmaskvibcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskvibCurve_" + index_str, pedited, spot.HHmaskvibcurve, spotEdited.HHmaskvibcurve); + assignFromKeyfile(keyFile, "Locallab", "EnavibMask_" + index_str, pedited, spot.enavibMask, spotEdited.enavibMask); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskvib_" + index_str, pedited, spot.blendmaskvib, spotEdited.blendmaskvib); + assignFromKeyfile(keyFile, "Locallab", "Radmaskvib_" + index_str, pedited, spot.radmaskvib, spotEdited.radmaskvib); + assignFromKeyfile(keyFile, "Locallab", "Chromaskvib_" + index_str, pedited, spot.chromaskvib, spotEdited.chromaskvib); + assignFromKeyfile(keyFile, "Locallab", "Gammaskvib_" + index_str, pedited, spot.gammaskvib, spotEdited.gammaskvib); + assignFromKeyfile(keyFile, "Locallab", "Slomaskvib_" + index_str, pedited, spot.slomaskvib, spotEdited.slomaskvib); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskvib_" + index_str, pedited, spot.lapmaskvib, spotEdited.lapmaskvib); + assignFromKeyfile(keyFile, "Locallab", "Strvib_" + index_str, pedited, spot.strvib, spotEdited.strvib); + assignFromKeyfile(keyFile, "Locallab", "Strvibab_" + index_str, pedited, spot.strvibab, spotEdited.strvibab); + assignFromKeyfile(keyFile, "Locallab", "Strvibh_" + index_str, pedited, spot.strvibh, spotEdited.strvibh); + assignFromKeyfile(keyFile, "Locallab", "Angvib_" + index_str, pedited, spot.angvib, spotEdited.angvib); + assignFromKeyfile(keyFile, "Locallab", "LmaskvibCurve_" + index_str, pedited, spot.Lmaskvibcurve, spotEdited.Lmaskvibcurve); + assignFromKeyfile(keyFile, "Locallab", "Recothresv_" + index_str, pedited, spot.recothresv, spotEdited.recothresv); + assignFromKeyfile(keyFile, "Locallab", "Lowthresv_" + index_str, pedited, spot.lowthresv, spotEdited.lowthresv); + assignFromKeyfile(keyFile, "Locallab", "Higthresv_" + index_str, pedited, spot.higthresv, spotEdited.higthresv); + assignFromKeyfile(keyFile, "Locallab", "Decayv_" + index_str, pedited, spot.decayv, spotEdited.decayv); + // Soft Light + spot.visisoft = assignFromKeyfile(keyFile, "Locallab", "Expsoft_" + index_str, pedited, spot.expsoft, spotEdited.expsoft); + + if (spot.visisoft) { + spotEdited.visisoft = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexsoft_" + index_str, pedited, spot.complexsoft, spotEdited.complexsoft); + assignFromKeyfile(keyFile, "Locallab", "Streng_" + index_str, pedited, spot.streng, spotEdited.streng); + assignFromKeyfile(keyFile, "Locallab", "Sensisf_" + index_str, pedited, spot.sensisf, spotEdited.sensisf); + assignFromKeyfile(keyFile, "Locallab", "Laplace_" + index_str, pedited, spot.laplace, spotEdited.laplace); + assignFromKeyfile(keyFile, "Locallab", "SoftMethod_" + index_str, pedited, spot.softMethod, spotEdited.softMethod); + // Blur & Noise + spot.visiblur = assignFromKeyfile(keyFile, "Locallab", "Expblur_" + index_str, pedited, spot.expblur, spotEdited.expblur); + + if (spot.visiblur) { + spotEdited.visiblur = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexblur_" + index_str, pedited, spot.complexblur, spotEdited.complexblur); + assignFromKeyfile(keyFile, "Locallab", "Radius_" + index_str, pedited, spot.radius, spotEdited.radius); + assignFromKeyfile(keyFile, "Locallab", "Strength_" + index_str, pedited, spot.strength, spotEdited.strength); + assignFromKeyfile(keyFile, "Locallab", "Sensibn_" + index_str, pedited, spot.sensibn, spotEdited.sensibn); + assignFromKeyfile(keyFile, "Locallab", "Iteramed_" + index_str, pedited, spot.itera, spotEdited.itera); + assignFromKeyfile(keyFile, "Locallab", "Guidbl_" + index_str, pedited, spot.guidbl, spotEdited.guidbl); + assignFromKeyfile(keyFile, "Locallab", "Strbl_" + index_str, pedited, spot.strbl, spotEdited.strbl); + assignFromKeyfile(keyFile, "Locallab", "Recothres_" + index_str, pedited, spot.recothres, spotEdited.recothres); + assignFromKeyfile(keyFile, "Locallab", "Lowthres_" + index_str, pedited, spot.lowthres, spotEdited.lowthres); + assignFromKeyfile(keyFile, "Locallab", "Higthres_" + index_str, pedited, spot.higthres, spotEdited.higthres); + assignFromKeyfile(keyFile, "Locallab", "Recothresd_" + index_str, pedited, spot.recothresd, spotEdited.recothresd); + assignFromKeyfile(keyFile, "Locallab", "Lowthresd_" + index_str, pedited, spot.lowthresd, spotEdited.lowthresd); + assignFromKeyfile(keyFile, "Locallab", "Midthresd_" + index_str, pedited, spot.midthresd, spotEdited.midthresd); + assignFromKeyfile(keyFile, "Locallab", "Midthresdch_" + index_str, pedited, spot.midthresdch, spotEdited.midthresdch); + assignFromKeyfile(keyFile, "Locallab", "Higthresd_" + index_str, pedited, spot.higthresd, spotEdited.higthresd); + assignFromKeyfile(keyFile, "Locallab", "Decayd_" + index_str, pedited, spot.decayd, spotEdited.decayd); + assignFromKeyfile(keyFile, "Locallab", "Isogr_" + index_str, pedited, spot.isogr, spotEdited.isogr); + assignFromKeyfile(keyFile, "Locallab", "Strengr_" + index_str, pedited, spot.strengr, spotEdited.strengr); + assignFromKeyfile(keyFile, "Locallab", "Scalegr_" + index_str, pedited, spot.scalegr, spotEdited.scalegr); + assignFromKeyfile(keyFile, "Locallab", "Divgr_" + index_str, pedited, spot.divgr, spotEdited.divgr); + assignFromKeyfile(keyFile, "Locallab", "Epsbl_" + index_str, pedited, spot.epsbl, spotEdited.epsbl); + assignFromKeyfile(keyFile, "Locallab", "BlMethod_" + index_str, pedited, spot.blMethod, spotEdited.blMethod); + assignFromKeyfile(keyFile, "Locallab", "ChroMethod_" + index_str, pedited, spot.chroMethod, spotEdited.chroMethod); + assignFromKeyfile(keyFile, "Locallab", "QuaMethod_" + index_str, pedited, spot.quamethod, spotEdited.quamethod); + assignFromKeyfile(keyFile, "Locallab", "BlurMethod_" + index_str, pedited, spot.blurMethod, spotEdited.blurMethod); + assignFromKeyfile(keyFile, "Locallab", "Usemaskb_" + index_str, pedited, spot.usemask, spotEdited.usemask); + assignFromKeyfile(keyFile, "Locallab", "Invmaskd_" + index_str, pedited, spot.invmaskd, spotEdited.invmaskd); + assignFromKeyfile(keyFile, "Locallab", "Invmask_" + index_str, pedited, spot.invmask, spotEdited.invmask); + assignFromKeyfile(keyFile, "Locallab", "Levelthr_" + index_str, pedited, spot.levelthr, spotEdited.levelthr); + assignFromKeyfile(keyFile, "Locallab", "Lnoiselow_" + index_str, pedited, spot.lnoiselow, spotEdited.lnoiselow); + assignFromKeyfile(keyFile, "Locallab", "Levelthrlow_" + index_str, pedited, spot.levelthrlow, spotEdited.levelthrlow); + assignFromKeyfile(keyFile, "Locallab", "MedMethod_" + index_str, pedited, spot.medMethod, spotEdited.medMethod); + assignFromKeyfile(keyFile, "Locallab", "activlum_" + index_str, pedited, spot.activlum, spotEdited.activlum); + assignFromKeyfile(keyFile, "Locallab", "noiselumf_" + index_str, pedited, spot.noiselumf, spotEdited.noiselumf); + assignFromKeyfile(keyFile, "Locallab", "noiselumf0_" + index_str, pedited, spot.noiselumf0, spotEdited.noiselumf0); + assignFromKeyfile(keyFile, "Locallab", "noiselumf2_" + index_str, pedited, spot.noiselumf2, spotEdited.noiselumf2); + assignFromKeyfile(keyFile, "Locallab", "noiselumc_" + index_str, pedited, spot.noiselumc, spotEdited.noiselumc); + assignFromKeyfile(keyFile, "Locallab", "noiselumdetail_" + index_str, pedited, spot.noiselumdetail, spotEdited.noiselumdetail); + assignFromKeyfile(keyFile, "Locallab", "noiselequal_" + index_str, pedited, spot.noiselequal, spotEdited.noiselequal); + assignFromKeyfile(keyFile, "Locallab", "noisegam_" + index_str, pedited, spot.noisegam, spotEdited.noisegam); + assignFromKeyfile(keyFile, "Locallab", "noisechrof_" + index_str, pedited, spot.noisechrof, spotEdited.noisechrof); + assignFromKeyfile(keyFile, "Locallab", "noisechroc_" + index_str, pedited, spot.noisechroc, spotEdited.noisechroc); + assignFromKeyfile(keyFile, "Locallab", "noisechrodetail_" + index_str, pedited, spot.noisechrodetail, spotEdited.noisechrodetail); + assignFromKeyfile(keyFile, "Locallab", "Adjblur_" + index_str, pedited, spot.adjblur, spotEdited.adjblur); + assignFromKeyfile(keyFile, "Locallab", "Bilateral_" + index_str, pedited, spot.bilateral, spotEdited.bilateral); + assignFromKeyfile(keyFile, "Locallab", "Nlstr_" + index_str, pedited, spot.nlstr, spotEdited.nlstr); + assignFromKeyfile(keyFile, "Locallab", "Nldet_" + index_str, pedited, spot.nldet, spotEdited.nldet); + assignFromKeyfile(keyFile, "Locallab", "Nlpat_" + index_str, pedited, spot.nlpat, spotEdited.nlpat); + assignFromKeyfile(keyFile, "Locallab", "Nlrad_" + index_str, pedited, spot.nlrad, spotEdited.nlrad); + assignFromKeyfile(keyFile, "Locallab", "Nlgam_" + index_str, pedited, spot.nlgam, spotEdited.nlgam); + assignFromKeyfile(keyFile, "Locallab", "Sensiden_" + index_str, pedited, spot.sensiden, spotEdited.sensiden); + assignFromKeyfile(keyFile, "Locallab", "Reparden_" + index_str, pedited, spot.reparden, spotEdited.reparden); + assignFromKeyfile(keyFile, "Locallab", "Detailthr_" + index_str, pedited, spot.detailthr, spotEdited.detailthr); + assignFromKeyfile(keyFile, "Locallab", "LocwavCurveden_" + index_str, pedited, spot.locwavcurveden, spotEdited.locwavcurveden); + assignFromKeyfile(keyFile, "Locallab", "LocwavCurvehue_" + index_str, pedited, spot.locwavcurvehue, spotEdited.locwavcurvehue); + assignFromKeyfile(keyFile, "Locallab", "Showmasktyp_" + index_str, pedited, spot.showmaskblMethodtyp, spotEdited.showmaskblMethodtyp); + assignFromKeyfile(keyFile, "Locallab", "CCmaskblCurve_" + index_str, pedited, spot.CCmaskblcurve, spotEdited.CCmaskblcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskblCurve_" + index_str, pedited, spot.LLmaskblcurve, spotEdited.LLmaskblcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskblCurve_" + index_str, pedited, spot.HHmaskblcurve, spotEdited.HHmaskblcurve); + assignFromKeyfile(keyFile, "Locallab", "EnablMask_" + index_str, pedited, spot.enablMask, spotEdited.enablMask); + assignFromKeyfile(keyFile, "Locallab", "Fftwbl_" + index_str, pedited, spot.fftwbl, spotEdited.fftwbl); + assignFromKeyfile(keyFile, "Locallab", "Invbl_" + index_str, pedited, spot.invbl, spotEdited.invbl); + assignFromKeyfile(keyFile, "Locallab", "Toolbl_" + index_str, pedited, spot.toolbl, spotEdited.toolbl); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskbl_" + index_str, pedited, spot.blendmaskbl, spotEdited.blendmaskbl); + assignFromKeyfile(keyFile, "Locallab", "Radmaskbl_" + index_str, pedited, spot.radmaskbl, spotEdited.radmaskbl); + assignFromKeyfile(keyFile, "Locallab", "Chromaskbl_" + index_str, pedited, spot.chromaskbl, spotEdited.chromaskbl); + assignFromKeyfile(keyFile, "Locallab", "Gammaskbl_" + index_str, pedited, spot.gammaskbl, spotEdited.gammaskbl); + assignFromKeyfile(keyFile, "Locallab", "Slomaskbl_" + index_str, pedited, spot.slomaskbl, spotEdited.slomaskbl); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskbl_" + index_str, pedited, spot.lapmaskbl, spotEdited.lapmaskbl); + assignFromKeyfile(keyFile, "Locallab", "shadmaskbl_" + index_str, pedited, spot.shadmaskbl, spotEdited.shadmaskbl); + assignFromKeyfile(keyFile, "Locallab", "shadmaskblsha_" + index_str, pedited, spot.shadmaskblsha, spotEdited.shadmaskblsha); + assignFromKeyfile(keyFile, "Locallab", "strumaskbl_" + index_str, pedited, spot.strumaskbl, spotEdited.strumaskbl); + assignFromKeyfile(keyFile, "Locallab", "LmaskblCurve_" + index_str, pedited, spot.Lmaskblcurve, spotEdited.Lmaskblcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskblCurvewav_" + index_str, pedited, spot.LLmaskblcurvewav, spotEdited.LLmaskblcurvewav); + + if (keyFile.has_key("Locallab", "CSThresholdblur_" + index_str)) { + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThresholdblur_" + index_str); + + if (thresh.size() >= 4) { + spot.csthresholdblur.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + spotEdited.csthresholdblur = true; + } + // Tone Mapping + spot.visitonemap = assignFromKeyfile(keyFile, "Locallab", "Exptonemap_" + index_str, pedited, spot.exptonemap, spotEdited.exptonemap); + + if (spot.visitonemap) { + spotEdited.visitonemap = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complextonemap_" + index_str, pedited, spot.complextonemap, spotEdited.complextonemap); + assignFromKeyfile(keyFile, "Locallab", "Stren_" + index_str, pedited, spot.stren, spotEdited.stren); + assignFromKeyfile(keyFile, "Locallab", "Gamma_" + index_str, pedited, spot.gamma, spotEdited.gamma); + assignFromKeyfile(keyFile, "Locallab", "Estop_" + index_str, pedited, spot.estop, spotEdited.estop); + assignFromKeyfile(keyFile, "Locallab", "Scaltm_" + index_str, pedited, spot.scaltm, spotEdited.scaltm); + assignFromKeyfile(keyFile, "Locallab", "Repartm_" + index_str, pedited, spot.repartm, spotEdited.repartm); + assignFromKeyfile(keyFile, "Locallab", "Rewei_" + index_str, pedited, spot.rewei, spotEdited.rewei); + assignFromKeyfile(keyFile, "Locallab", "Satur_" + index_str, pedited, spot.satur, spotEdited.satur); + assignFromKeyfile(keyFile, "Locallab", "Sensitm_" + index_str, pedited, spot.sensitm, spotEdited.sensitm); + assignFromKeyfile(keyFile, "Locallab", "Softradiustm_" + index_str, pedited, spot.softradiustm, spotEdited.softradiustm); + assignFromKeyfile(keyFile, "Locallab", "Amount_" + index_str, pedited, spot.amount, spotEdited.amount); + assignFromKeyfile(keyFile, "Locallab", "Equiltm_" + index_str, pedited, spot.equiltm, spotEdited.equiltm); + assignFromKeyfile(keyFile, "Locallab", "CCmasktmCurve_" + index_str, pedited, spot.CCmasktmcurve, spotEdited.CCmasktmcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmasktmCurve_" + index_str, pedited, spot.LLmasktmcurve, spotEdited.LLmasktmcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmasktmCurve_" + index_str, pedited, spot.HHmasktmcurve, spotEdited.HHmasktmcurve); + assignFromKeyfile(keyFile, "Locallab", "EnatmMask_" + index_str, pedited, spot.enatmMask, spotEdited.enatmMask); + assignFromKeyfile(keyFile, "Locallab", "EnatmMaskaft_" + index_str, pedited, spot.enatmMaskaft, spotEdited.enatmMaskaft); + assignFromKeyfile(keyFile, "Locallab", "Blendmasktm_" + index_str, pedited, spot.blendmasktm, spotEdited.blendmasktm); + assignFromKeyfile(keyFile, "Locallab", "Radmasktm_" + index_str, pedited, spot.radmasktm, spotEdited.radmasktm); + assignFromKeyfile(keyFile, "Locallab", "Chromasktm_" + index_str, pedited, spot.chromasktm, spotEdited.chromasktm); + assignFromKeyfile(keyFile, "Locallab", "Gammasktm_" + index_str, pedited, spot.gammasktm, spotEdited.gammasktm); + assignFromKeyfile(keyFile, "Locallab", "Slomasktm_" + index_str, pedited, spot.slomasktm, spotEdited.slomasktm); + assignFromKeyfile(keyFile, "Locallab", "Lapmasktm_" + index_str, pedited, spot.lapmasktm, spotEdited.lapmasktm); + assignFromKeyfile(keyFile, "Locallab", "LmasktmCurve_" + index_str, pedited, spot.Lmasktmcurve, spotEdited.Lmasktmcurve); + assignFromKeyfile(keyFile, "Locallab", "Recothrest_" + index_str, pedited, spot.recothrest, spotEdited.recothrest); + assignFromKeyfile(keyFile, "Locallab", "Lowthrest_" + index_str, pedited, spot.lowthrest, spotEdited.lowthrest); + assignFromKeyfile(keyFile, "Locallab", "Higthrest_" + index_str, pedited, spot.higthrest, spotEdited.higthrest); + assignFromKeyfile(keyFile, "Locallab", "Decayt_" + index_str, pedited, spot.decayt, spotEdited.decayt); + // Retinex + spot.visireti = assignFromKeyfile(keyFile, "Locallab", "Expreti_" + index_str, pedited, spot.expreti, spotEdited.expreti); + + if (spot.visireti) { + spotEdited.visireti = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexreti_" + index_str, pedited, spot.complexreti, spotEdited.complexreti); + assignFromKeyfile(keyFile, "Locallab", "retinexMethod_" + index_str, pedited, spot.retinexMethod, spotEdited.retinexMethod); + assignFromKeyfile(keyFile, "Locallab", "Str_" + index_str, pedited, spot.str, spotEdited.str); + assignFromKeyfile(keyFile, "Locallab", "Chrrt_" + index_str, pedited, spot.chrrt, spotEdited.chrrt); + assignFromKeyfile(keyFile, "Locallab", "Neigh_" + index_str, pedited, spot.neigh, spotEdited.neigh); + assignFromKeyfile(keyFile, "Locallab", "Vart_" + index_str, pedited, spot.vart, spotEdited.vart); + assignFromKeyfile(keyFile, "Locallab", "Offs_" + index_str, pedited, spot.offs, spotEdited.offs); + assignFromKeyfile(keyFile, "Locallab", "Dehaz_" + index_str, pedited, spot.dehaz, spotEdited.dehaz); + assignFromKeyfile(keyFile, "Locallab", "Depth_" + index_str, pedited, spot.depth, spotEdited.depth); + assignFromKeyfile(keyFile, "Locallab", "Sensih_" + index_str, pedited, spot.sensih, spotEdited.sensih); + assignFromKeyfile(keyFile, "Locallab", "TgainCurve_" + index_str, pedited, spot.localTgaincurve, spotEdited.localTgaincurve); + assignFromKeyfile(keyFile, "Locallab", "TtransCurve_" + index_str, pedited, spot.localTtranscurve, spotEdited.localTtranscurve); + assignFromKeyfile(keyFile, "Locallab", "Inversret_" + index_str, pedited, spot.inversret, spotEdited.inversret); + assignFromKeyfile(keyFile, "Locallab", "Equilret_" + index_str, pedited, spot.equilret, spotEdited.equilret); + assignFromKeyfile(keyFile, "Locallab", "Loglin_" + index_str, pedited, spot.loglin, spotEdited.loglin); + assignFromKeyfile(keyFile, "Locallab", "dehazeSaturation" + index_str, pedited, spot.dehazeSaturation, spotEdited.dehazeSaturation); + assignFromKeyfile(keyFile, "Locallab", "Softradiusret_" + index_str, pedited, spot.softradiusret, spotEdited.softradiusret); + assignFromKeyfile(keyFile, "Locallab", "CCmaskretiCurve_" + index_str, pedited, spot.CCmaskreticurve, spotEdited.CCmaskreticurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskretiCurve_" + index_str, pedited, spot.LLmaskreticurve, spotEdited.LLmaskreticurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskretiCurve_" + index_str, pedited, spot.HHmaskreticurve, spotEdited.HHmaskreticurve); + assignFromKeyfile(keyFile, "Locallab", "EnaretiMask_" + index_str, pedited, spot.enaretiMask, spotEdited.enaretiMask); + assignFromKeyfile(keyFile, "Locallab", "EnaretiMasktmap_" + index_str, pedited, spot.enaretiMasktmap, spotEdited.enaretiMasktmap); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskreti_" + index_str, pedited, spot.blendmaskreti, spotEdited.blendmaskreti); + assignFromKeyfile(keyFile, "Locallab", "Radmaskreti_" + index_str, pedited, spot.radmaskreti, spotEdited.radmaskreti); + assignFromKeyfile(keyFile, "Locallab", "Chromaskreti_" + index_str, pedited, spot.chromaskreti, spotEdited.chromaskreti); + assignFromKeyfile(keyFile, "Locallab", "Gammaskreti_" + index_str, pedited, spot.gammaskreti, spotEdited.gammaskreti); + assignFromKeyfile(keyFile, "Locallab", "Slomaskreti_" + index_str, pedited, spot.slomaskreti, spotEdited.slomaskreti); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskreti_" + index_str, pedited, spot.lapmaskreti, spotEdited.lapmaskreti); + assignFromKeyfile(keyFile, "Locallab", "Scalereti_" + index_str, pedited, spot.scalereti, spotEdited.scalereti); + assignFromKeyfile(keyFile, "Locallab", "Darkness_" + index_str, pedited, spot.darkness, spotEdited.darkness); + assignFromKeyfile(keyFile, "Locallab", "Lightnessreti_" + index_str, pedited, spot.lightnessreti, spotEdited.lightnessreti); + assignFromKeyfile(keyFile, "Locallab", "Limd_" + index_str, pedited, spot.limd, spotEdited.limd); + assignFromKeyfile(keyFile, "Locallab", "Cliptm_" + index_str, pedited, spot.cliptm, spotEdited.cliptm); + assignFromKeyfile(keyFile, "Locallab", "Fftwreti_" + index_str, pedited, spot.fftwreti, spotEdited.fftwreti); + assignFromKeyfile(keyFile, "Locallab", "LmaskretiCurve_" + index_str, pedited, spot.Lmaskreticurve, spotEdited.Lmaskreticurve); + assignFromKeyfile(keyFile, "Locallab", "Recothresr_" + index_str, pedited, spot.recothresr, spotEdited.recothresr); + assignFromKeyfile(keyFile, "Locallab", "Lowthresr_" + index_str, pedited, spot.lowthresr, spotEdited.lowthresr); + assignFromKeyfile(keyFile, "Locallab", "Higthresr_" + index_str, pedited, spot.higthresr, spotEdited.higthresr); + assignFromKeyfile(keyFile, "Locallab", "Decayr_" + index_str, pedited, spot.decayr, spotEdited.decayr); + // Sharpening + spot.visisharp = assignFromKeyfile(keyFile, "Locallab", "Expsharp_" + index_str, pedited, spot.expsharp, spotEdited.expsharp); + + if (spot.visisharp) { + spotEdited.visisharp = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexsharp_" + index_str, pedited, spot.complexsharp, spotEdited.complexsharp); + assignFromKeyfile(keyFile, "Locallab", "Sharcontrast_" + index_str, pedited, spot.sharcontrast, spotEdited.sharcontrast); + assignFromKeyfile(keyFile, "Locallab", "Sharradius_" + index_str, pedited, spot.sharradius, spotEdited.sharradius); + assignFromKeyfile(keyFile, "Locallab", "Sharamount_" + index_str, pedited, spot.sharamount, spotEdited.sharamount); + assignFromKeyfile(keyFile, "Locallab", "Shardamping_" + index_str, pedited, spot.shardamping, spotEdited.shardamping); + assignFromKeyfile(keyFile, "Locallab", "Shariter_" + index_str, pedited, spot.shariter, spotEdited.shariter); + assignFromKeyfile(keyFile, "Locallab", "Sharblur_" + index_str, pedited, spot.sharblur, spotEdited.sharblur); + assignFromKeyfile(keyFile, "Locallab", "Shargam_" + index_str, pedited, spot.shargam, spotEdited.shargam); + assignFromKeyfile(keyFile, "Locallab", "Sensisha_" + index_str, pedited, spot.sensisha, spotEdited.sensisha); + assignFromKeyfile(keyFile, "Locallab", "Inverssha_" + index_str, pedited, spot.inverssha, spotEdited.inverssha); + // Local Contrast + spot.visicontrast = assignFromKeyfile(keyFile, "Locallab", "Expcontrast_" + index_str, pedited, spot.expcontrast, spotEdited.expcontrast); + + if (spot.visicontrast) { + spotEdited.visicontrast = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexcontrast_" + index_str, pedited, spot.complexcontrast, spotEdited.complexcontrast); + assignFromKeyfile(keyFile, "Locallab", "Lcradius_" + index_str, pedited, spot.lcradius, spotEdited.lcradius); + assignFromKeyfile(keyFile, "Locallab", "Lcamount_" + index_str, pedited, spot.lcamount, spotEdited.lcamount); + assignFromKeyfile(keyFile, "Locallab", "Lcdarkness_" + index_str, pedited, spot.lcdarkness, spotEdited.lcdarkness); + assignFromKeyfile(keyFile, "Locallab", "Lclightness_" + index_str, pedited, spot.lclightness, spotEdited.lclightness); + assignFromKeyfile(keyFile, "Locallab", "Sigmalc_" + index_str, pedited, spot.sigmalc, spotEdited.sigmalc); + assignFromKeyfile(keyFile, "Locallab", "Levelwav_" + index_str, pedited, spot.levelwav, spotEdited.levelwav); + assignFromKeyfile(keyFile, "Locallab", "Residcont_" + index_str, pedited, spot.residcont, spotEdited.residcont); + assignFromKeyfile(keyFile, "Locallab", "Residsha_" + index_str, pedited, spot.residsha, spotEdited.residsha); + assignFromKeyfile(keyFile, "Locallab", "Residshathr_" + index_str, pedited, spot.residshathr, spotEdited.residshathr); + assignFromKeyfile(keyFile, "Locallab", "Residhi_" + index_str, pedited, spot.residhi, spotEdited.residhi); + assignFromKeyfile(keyFile, "Locallab", "Gamlc_" + index_str, pedited, spot.gamlc, spotEdited.gamlc); + assignFromKeyfile(keyFile, "Locallab", "Residhithr_" + index_str, pedited, spot.residhithr, spotEdited.residhithr); + assignFromKeyfile(keyFile, "Locallab", "Residgam_" + index_str, pedited, spot.residgam, spotEdited.residgam); + assignFromKeyfile(keyFile, "Locallab", "Residslop_" + index_str, pedited, spot.residslop, spotEdited.residslop); + assignFromKeyfile(keyFile, "Locallab", "Residblur_" + index_str, pedited, spot.residblur, spotEdited.residblur); + assignFromKeyfile(keyFile, "Locallab", "Levelblur_" + index_str, pedited, spot.levelblur, spotEdited.levelblur); + assignFromKeyfile(keyFile, "Locallab", "Sigmabl_" + index_str, pedited, spot.sigmabl, spotEdited.sigmabl); + assignFromKeyfile(keyFile, "Locallab", "Residchro_" + index_str, pedited, spot.residchro, spotEdited.residchro); + assignFromKeyfile(keyFile, "Locallab", "Residcomp_" + index_str, pedited, spot.residcomp, spotEdited.residcomp); + assignFromKeyfile(keyFile, "Locallab", "Sigma_" + index_str, pedited, spot.sigma, spotEdited.sigma); + assignFromKeyfile(keyFile, "Locallab", "Offset_" + index_str, pedited, spot.offset, spotEdited.offset); + assignFromKeyfile(keyFile, "Locallab", "Sigmadr_" + index_str, pedited, spot.sigmadr, spotEdited.sigmadr); + assignFromKeyfile(keyFile, "Locallab", "Threswav_" + index_str, pedited, spot.threswav, spotEdited.threswav); + assignFromKeyfile(keyFile, "Locallab", "Chromalev_" + index_str, pedited, spot.chromalev, spotEdited.chromalev); + assignFromKeyfile(keyFile, "Locallab", "Chromablu_" + index_str, pedited, spot.chromablu, spotEdited.chromablu); + assignFromKeyfile(keyFile, "Locallab", "sigmadc_" + index_str, pedited, spot.sigmadc, spotEdited.sigmadc); + assignFromKeyfile(keyFile, "Locallab", "deltad_" + index_str, pedited, spot.deltad, spotEdited.deltad); + assignFromKeyfile(keyFile, "Locallab", "Fatres_" + index_str, pedited, spot.fatres, spotEdited.fatres); + assignFromKeyfile(keyFile, "Locallab", "ClariLres_" + index_str, pedited, spot.clarilres, spotEdited.clarilres); + assignFromKeyfile(keyFile, "Locallab", "ClariCres_" + index_str, pedited, spot.claricres, spotEdited.claricres); + assignFromKeyfile(keyFile, "Locallab", "Clarisoft_" + index_str, pedited, spot.clarisoft, spotEdited.clarisoft); + assignFromKeyfile(keyFile, "Locallab", "Sigmalc2_" + index_str, pedited, spot.sigmalc2, spotEdited.sigmalc2); + assignFromKeyfile(keyFile, "Locallab", "Strwav_" + index_str, pedited, spot.strwav, spotEdited.strwav); + assignFromKeyfile(keyFile, "Locallab", "Angwav_" + index_str, pedited, spot.angwav, spotEdited.angwav); + assignFromKeyfile(keyFile, "Locallab", "Strengthw_" + index_str, pedited, spot.strengthw, spotEdited.strengthw); + assignFromKeyfile(keyFile, "Locallab", "Sigmaed_" + index_str, pedited, spot.sigmaed, spotEdited.sigmaed); + assignFromKeyfile(keyFile, "Locallab", "Radiusw_" + index_str, pedited, spot.radiusw, spotEdited.radiusw); + assignFromKeyfile(keyFile, "Locallab", "Detailw_" + index_str, pedited, spot.detailw, spotEdited.detailw); + assignFromKeyfile(keyFile, "Locallab", "Gradw_" + index_str, pedited, spot.gradw, spotEdited.gradw); + assignFromKeyfile(keyFile, "Locallab", "Tloww_" + index_str, pedited, spot.tloww, spotEdited.tloww); + assignFromKeyfile(keyFile, "Locallab", "Thigw_" + index_str, pedited, spot.thigw, spotEdited.thigw); + assignFromKeyfile(keyFile, "Locallab", "Edgw_" + index_str, pedited, spot.edgw, spotEdited.edgw); + assignFromKeyfile(keyFile, "Locallab", "Basew_" + index_str, pedited, spot.basew, spotEdited.basew); + assignFromKeyfile(keyFile, "Locallab", "Sensilc_" + index_str, pedited, spot.sensilc, spotEdited.sensilc); + assignFromKeyfile(keyFile, "Locallab", "Reparw_" + index_str, pedited, spot.reparw, spotEdited.reparw); + assignFromKeyfile(keyFile, "Locallab", "Fftwlc_" + index_str, pedited, spot.fftwlc, spotEdited.fftwlc); + assignFromKeyfile(keyFile, "Locallab", "Blurlc_" + index_str, pedited, spot.blurlc, spotEdited.blurlc); + assignFromKeyfile(keyFile, "Locallab", "Wavblur_" + index_str, pedited, spot.wavblur, spotEdited.wavblur); + assignFromKeyfile(keyFile, "Locallab", "Wavedg_" + index_str, pedited, spot.wavedg, spotEdited.wavedg); + assignFromKeyfile(keyFile, "Locallab", "Waveshow_" + index_str, pedited, spot.waveshow, spotEdited.waveshow); + assignFromKeyfile(keyFile, "Locallab", "Wavcont_" + index_str, pedited, spot.wavcont, spotEdited.wavcont); + assignFromKeyfile(keyFile, "Locallab", "Wavcomp_" + index_str, pedited, spot.wavcomp, spotEdited.wavcomp); + assignFromKeyfile(keyFile, "Locallab", "Wavgradl_" + index_str, pedited, spot.wavgradl, spotEdited.wavgradl); + assignFromKeyfile(keyFile, "Locallab", "Wavcompre_" + index_str, pedited, spot.wavcompre, spotEdited.wavcompre); + assignFromKeyfile(keyFile, "Locallab", "Origlc_" + index_str, pedited, spot.origlc, spotEdited.origlc); + assignFromKeyfile(keyFile, "Locallab", "localcontMethod_" + index_str, pedited, spot.localcontMethod, spotEdited.localcontMethod); + assignFromKeyfile(keyFile, "Locallab", "localedgMethod_" + index_str, pedited, spot.localedgMethod, spotEdited.localedgMethod); + assignFromKeyfile(keyFile, "Locallab", "localneiMethod_" + index_str, pedited, spot.localneiMethod, spotEdited.localneiMethod); + assignFromKeyfile(keyFile, "Locallab", "LocwavCurve_" + index_str, pedited, spot.locwavcurve, spotEdited.locwavcurve); + assignFromKeyfile(keyFile, "Locallab", "LoclevwavCurve_" + index_str, pedited, spot.loclevwavcurve, spotEdited.loclevwavcurve); + assignFromKeyfile(keyFile, "Locallab", "LocconwavCurve_" + index_str, pedited, spot.locconwavcurve, spotEdited.locconwavcurve); + assignFromKeyfile(keyFile, "Locallab", "LoccompwavCurve_" + index_str, pedited, spot.loccompwavcurve, spotEdited.loccompwavcurve); + assignFromKeyfile(keyFile, "Locallab", "LoccomprewavCurve_" + index_str, pedited, spot.loccomprewavcurve, spotEdited.loccomprewavcurve); + assignFromKeyfile(keyFile, "Locallab", "LocedgwavCurve_" + index_str, pedited, spot.locedgwavcurve, spotEdited.locedgwavcurve); + + if (keyFile.has_key("Locallab", "CSThreshold_" + index_str)) { + + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThreshold_" + index_str); + + if (thresh.size() >= 4) { + spot.csthreshold.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + spotEdited.csthreshold = true; + } + + assignFromKeyfile(keyFile, "Locallab", "CCmasklcCurve_" + index_str, pedited, spot.CCmasklccurve, spotEdited.CCmasklccurve); + assignFromKeyfile(keyFile, "Locallab", "LLmasklcCurve_" + index_str, pedited, spot.LLmasklccurve, spotEdited.LLmasklccurve); + assignFromKeyfile(keyFile, "Locallab", "HHmasklcCurve_" + index_str, pedited, spot.HHmasklccurve, spotEdited.HHmasklccurve); + assignFromKeyfile(keyFile, "Locallab", "EnalcMask_" + index_str, pedited, spot.enalcMask, spotEdited.enalcMask); + assignFromKeyfile(keyFile, "Locallab", "Blendmasklc_" + index_str, pedited, spot.blendmasklc, spotEdited.blendmasklc); + assignFromKeyfile(keyFile, "Locallab", "Radmasklc_" + index_str, pedited, spot.radmasklc, spotEdited.radmasklc); + assignFromKeyfile(keyFile, "Locallab", "Chromasklc_" + index_str, pedited, spot.chromasklc, spotEdited.chromasklc); + assignFromKeyfile(keyFile, "Locallab", "LmasklcCurve_" + index_str, pedited, spot.Lmasklccurve, spotEdited.Lmasklccurve); + assignFromKeyfile(keyFile, "Locallab", "Recothresw_" + index_str, pedited, spot.recothresw, spotEdited.recothresw); + assignFromKeyfile(keyFile, "Locallab", "Lowthresw_" + index_str, pedited, spot.lowthresw, spotEdited.lowthresw); + assignFromKeyfile(keyFile, "Locallab", "Higthresw_" + index_str, pedited, spot.higthresw, spotEdited.higthresw); + assignFromKeyfile(keyFile, "Locallab", "Decayw_" + index_str, pedited, spot.decayw, spotEdited.decayw); + // Contrast by detail levels + spot.visicbdl = assignFromKeyfile(keyFile, "Locallab", "Expcbdl_" + index_str, pedited, spot.expcbdl, spotEdited.expcbdl); + + if (spot.visicbdl) { + spotEdited.visicbdl = true; + } + + assignFromKeyfile(keyFile, "Locallab", "Complexcbdl_" + index_str, pedited, spot.complexcbdl, spotEdited.complexcbdl); + + for (int j = 0; j < 6; j ++) { + assignFromKeyfile(keyFile, "Locallab", "Mult" + std::to_string(j) + "_" + index_str, pedited, spot.mult[j], spotEdited.mult[j]); + } + + assignFromKeyfile(keyFile, "Locallab", "Chromacbdl_" + index_str, pedited, spot.chromacbdl, spotEdited.chromacbdl); + assignFromKeyfile(keyFile, "Locallab", "Threshold_" + index_str, pedited, spot.threshold, spotEdited.threshold); + assignFromKeyfile(keyFile, "Locallab", "Sensicb_" + index_str, pedited, spot.sensicb, spotEdited.sensicb); + assignFromKeyfile(keyFile, "Locallab", "Clarityml_" + index_str, pedited, spot.clarityml, spotEdited.clarityml); + assignFromKeyfile(keyFile, "Locallab", "Contresid_" + index_str, pedited, spot.contresid, spotEdited.contresid); + assignFromKeyfile(keyFile, "Locallab", "Softradiuscb_" + index_str, pedited, spot.softradiuscb, spotEdited.softradiuscb); + assignFromKeyfile(keyFile, "Locallab", "EnacbMask_" + index_str, pedited, spot.enacbMask, spotEdited.enacbMask); + assignFromKeyfile(keyFile, "Locallab", "CCmaskcbCurve_" + index_str, pedited, spot.CCmaskcbcurve, spotEdited.CCmaskcbcurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskcbCurve_" + index_str, pedited, spot.LLmaskcbcurve, spotEdited.LLmaskcbcurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskcbCurve_" + index_str, pedited, spot.HHmaskcbcurve, spotEdited.HHmaskcbcurve); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskcb_" + index_str, pedited, spot.blendmaskcb, spotEdited.blendmaskcb); + assignFromKeyfile(keyFile, "Locallab", "Radmaskcb_" + index_str, pedited, spot.radmaskcb, spotEdited.radmaskcb); + assignFromKeyfile(keyFile, "Locallab", "Chromaskcb_" + index_str, pedited, spot.chromaskcb, spotEdited.chromaskcb); + assignFromKeyfile(keyFile, "Locallab", "Gammaskcb_" + index_str, pedited, spot.gammaskcb, spotEdited.gammaskcb); + assignFromKeyfile(keyFile, "Locallab", "Slomaskcb_" + index_str, pedited, spot.slomaskcb, spotEdited.slomaskcb); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskcb_" + index_str, pedited, spot.lapmaskcb, spotEdited.lapmaskcb); + assignFromKeyfile(keyFile, "Locallab", "LmaskcbCurve_" + index_str, pedited, spot.Lmaskcbcurve, spotEdited.Lmaskcbcurve); + assignFromKeyfile(keyFile, "Locallab", "Recothrescb_" + index_str, pedited, spot.recothrescb, spotEdited.recothrescb); + assignFromKeyfile(keyFile, "Locallab", "Lowthrescb_" + index_str, pedited, spot.lowthrescb, spotEdited.lowthrescb); + assignFromKeyfile(keyFile, "Locallab", "Higthrescb_" + index_str, pedited, spot.higthrescb, spotEdited.higthrescb); + assignFromKeyfile(keyFile, "Locallab", "Decaycb_" + index_str, pedited, spot.decaycb, spotEdited.decaycb); + // Log encoding + spot.visilog = assignFromKeyfile(keyFile, "Locallab", "Explog_" + index_str, pedited, spot.explog, spotEdited.explog); + + if (spot.visilog) { + spotEdited.visilog = true; + } + assignFromKeyfile(keyFile, "Locallab", "Complexlog_" + index_str, pedited, spot.complexlog, spotEdited.complexlog); + + assignFromKeyfile(keyFile, "Locallab", "Autocompute_" + index_str, pedited, spot.autocompute, spotEdited.autocompute); + assignFromKeyfile(keyFile, "Locallab", "SourceGray_" + index_str, pedited, spot.sourceGray, spotEdited.sourceGray); + assignFromKeyfile(keyFile, "Locallab", "Sourceabs_" + index_str, pedited, spot.sourceabs, spotEdited.sourceabs); + assignFromKeyfile(keyFile, "Locallab", "Targabs_" + index_str, pedited, spot.targabs, spotEdited.targabs); + assignFromKeyfile(keyFile, "Locallab", "TargetGray_" + index_str, pedited, spot.targetGray, spotEdited.targetGray); + assignFromKeyfile(keyFile, "Locallab", "Catad_" + index_str, pedited, spot.catad, spotEdited.catad); + assignFromKeyfile(keyFile, "Locallab", "Saturl_" + index_str, pedited, spot.saturl, spotEdited.saturl); + assignFromKeyfile(keyFile, "Locallab", "Chroml_" + index_str, pedited, spot.chroml, spotEdited.chroml); + assignFromKeyfile(keyFile, "Locallab", "Lightl_" + index_str, pedited, spot.lightl, spotEdited.lightl); + assignFromKeyfile(keyFile, "Locallab", "Brightq_" + index_str, pedited, spot.lightq, spotEdited.lightq); + assignFromKeyfile(keyFile, "Locallab", "Contl_" + index_str, pedited, spot.contl, spotEdited.contl); + assignFromKeyfile(keyFile, "Locallab", "Contthres_" + index_str, pedited, spot.contthres, spotEdited.contthres); + assignFromKeyfile(keyFile, "Locallab", "Contq_" + index_str, pedited, spot.contq, spotEdited.contq); + assignFromKeyfile(keyFile, "Locallab", "Colorfl_" + index_str, pedited, spot.colorfl, spotEdited.colorfl); + assignFromKeyfile(keyFile, "Locallab", "LCurveL_" + index_str, pedited, spot.LcurveL, spotEdited.LcurveL); + assignFromKeyfile(keyFile, "Locallab", "AutoGray_" + index_str, pedited, spot.Autogray, spotEdited.Autogray); + assignFromKeyfile(keyFile, "Locallab", "Fullimage_" + index_str, pedited, spot.fullimage, spotEdited.fullimage); + assignFromKeyfile(keyFile, "Locallab", "Repart_" + index_str, pedited, spot.repar, spotEdited.repar); + assignFromKeyfile(keyFile, "Locallab", "Ciecam_" + index_str, pedited, spot.ciecam, spotEdited.ciecam); + assignFromKeyfile(keyFile, "Locallab", "BlackEv_" + index_str, pedited, spot.blackEv, spotEdited.blackEv); + assignFromKeyfile(keyFile, "Locallab", "WhiteEv_" + index_str, pedited, spot.whiteEv, spotEdited.whiteEv); + assignFromKeyfile(keyFile, "Locallab", "Detail_" + index_str, pedited, spot.detail, spotEdited.detail); + assignFromKeyfile(keyFile, "Locallab", "Sensilog_" + index_str, pedited, spot.sensilog, spotEdited.sensilog); + assignFromKeyfile(keyFile, "Locallab", "Baselog_" + index_str, pedited, spot.baselog, spotEdited.baselog); + assignFromKeyfile(keyFile, "Locallab", "Sursour_" + index_str, pedited, spot.sursour, spotEdited.sursour); + assignFromKeyfile(keyFile, "Locallab", "Surround_" + index_str, pedited, spot.surround, spotEdited.surround); + assignFromKeyfile(keyFile, "Locallab", "Strlog_" + index_str, pedited, spot.strlog, spotEdited.strlog); + assignFromKeyfile(keyFile, "Locallab", "Anglog_" + index_str, pedited, spot.anglog, spotEdited.anglog); + assignFromKeyfile(keyFile, "Locallab", "CCmaskCurveL_" + index_str, pedited, spot.CCmaskcurveL, spotEdited.CCmaskcurveL); + assignFromKeyfile(keyFile, "Locallab", "LLmaskCurveL_" + index_str, pedited, spot.LLmaskcurveL, spotEdited.LLmaskcurveL); + assignFromKeyfile(keyFile, "Locallab", "HHmaskCurveL_" + index_str, pedited, spot.HHmaskcurveL, spotEdited.HHmaskcurveL); + assignFromKeyfile(keyFile, "Locallab", "EnaLMask_" + index_str, pedited, spot.enaLMask, spotEdited.enaLMask); + assignFromKeyfile(keyFile, "Locallab", "blendmaskL_" + index_str, pedited, spot.blendmaskL, spotEdited.blendmaskL); + assignFromKeyfile(keyFile, "Locallab", "radmaskL_" + index_str, pedited, spot.radmaskL, spotEdited.radmaskL); + assignFromKeyfile(keyFile, "Locallab", "chromaskL_" + index_str, pedited, spot.chromaskL, spotEdited.chromaskL); + assignFromKeyfile(keyFile, "Locallab", "LmaskCurveL_" + index_str, pedited, spot.LmaskcurveL, spotEdited.LmaskcurveL); + assignFromKeyfile(keyFile, "Locallab", "Recothresl_" + index_str, pedited, spot.recothresl, spotEdited.recothresl); + assignFromKeyfile(keyFile, "Locallab", "Lowthresl_" + index_str, pedited, spot.lowthresl, spotEdited.lowthresl); + assignFromKeyfile(keyFile, "Locallab", "Higthresl_" + index_str, pedited, spot.higthresl, spotEdited.higthresl); + assignFromKeyfile(keyFile, "Locallab", "Decayl_" + index_str, pedited, spot.decayl, spotEdited.decayl); + + // mask + spot.visimask = assignFromKeyfile(keyFile, "Locallab", "Expmask_" + index_str, pedited, spot.expmask, spotEdited.expmask); + assignFromKeyfile(keyFile, "Locallab", "Complexmask_" + index_str, pedited, spot.complexmask, spotEdited.complexmask); + assignFromKeyfile(keyFile, "Locallab", "Sensimask_" + index_str, pedited, spot.sensimask, spotEdited.sensimask); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskmask_" + index_str, pedited, spot.blendmask, spotEdited.blendmask); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskmaskab_" + index_str, pedited, spot.blendmaskab, spotEdited.blendmaskab); + assignFromKeyfile(keyFile, "Locallab", "Softradiusmask_" + index_str, pedited, spot.softradiusmask, spotEdited.softradiusmask); + assignFromKeyfile(keyFile, "Locallab", "Enamask_" + index_str, pedited, spot.enamask, spotEdited.enamask); + assignFromKeyfile(keyFile, "Locallab", "Fftmask_" + index_str, pedited, spot.fftmask, spotEdited.fftmask); + assignFromKeyfile(keyFile, "Locallab", "Blurmask_" + index_str, pedited, spot.blurmask, spotEdited.blurmask); + assignFromKeyfile(keyFile, "Locallab", "Contmask_" + index_str, pedited, spot.contmask, spotEdited.contmask); + assignFromKeyfile(keyFile, "Locallab", "CCmask_Curve_" + index_str, pedited, spot.CCmask_curve, spotEdited.CCmask_curve); + assignFromKeyfile(keyFile, "Locallab", "LLmask_Curve_" + index_str, pedited, spot.LLmask_curve, spotEdited.LLmask_curve); + assignFromKeyfile(keyFile, "Locallab", "HHmask_Curve_" + index_str, pedited, spot.HHmask_curve, spotEdited.HHmask_curve); + assignFromKeyfile(keyFile, "Locallab", "Strumaskmask_" + index_str, pedited, spot.strumaskmask, spotEdited.strumaskmask); + assignFromKeyfile(keyFile, "Locallab", "Toolmask_" + index_str, pedited, spot.toolmask, spotEdited.toolmask); + assignFromKeyfile(keyFile, "Locallab", "Radmask_" + index_str, pedited, spot.radmask, spotEdited.radmask); + assignFromKeyfile(keyFile, "Locallab", "Lapmask_" + index_str, pedited, spot.lapmask, spotEdited.lapmask); + assignFromKeyfile(keyFile, "Locallab", "Chromask_" + index_str, pedited, spot.chromask, spotEdited.chromask); + assignFromKeyfile(keyFile, "Locallab", "Gammask_" + index_str, pedited, spot.gammask, spotEdited.gammask); + assignFromKeyfile(keyFile, "Locallab", "Slopmask_" + index_str, pedited, spot.slopmask, spotEdited.slopmask); + assignFromKeyfile(keyFile, "Locallab", "Shadmask_" + index_str, pedited, spot.shadmask, spotEdited.shadmask); + assignFromKeyfile(keyFile, "Locallab", "Str_mask_" + index_str, pedited, spot.str_mask, spotEdited.str_mask); + assignFromKeyfile(keyFile, "Locallab", "Ang_mask_" + index_str, pedited, spot.ang_mask, spotEdited.ang_mask); + assignFromKeyfile(keyFile, "Locallab", "HHhmask_Curve_" + index_str, pedited, spot.HHhmask_curve, spotEdited.HHhmask_curve); + assignFromKeyfile(keyFile, "Locallab", "Lmask_Curve_" + index_str, pedited, spot.Lmask_curve, spotEdited.Lmask_curve); + assignFromKeyfile(keyFile, "Locallab", "LLmask_Curvewav_" + index_str, pedited, spot.LLmask_curvewav, spotEdited.LLmask_curvewav); + + if (keyFile.has_key("Locallab", "CSThresholdmask_" + index_str)) { + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThresholdmask_" + index_str); + + if (thresh.size() >= 4) { + spot.csthresholdmask.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + spotEdited.csthresholdmask = true; + } + + if (spot.visimask) { + spotEdited.visimask = true; + } + + // ciecam + spot.visicie = assignFromKeyfile(keyFile, "Locallab", "Expcie_" + index_str, pedited, spot.expcie, spotEdited.expcie); + + if (spot.visicie) { + spotEdited.visicie = true; + } + assignFromKeyfile(keyFile, "Locallab", "Complexcie_" + index_str, pedited, spot.complexcie, spotEdited.complexcie); + assignFromKeyfile(keyFile, "Locallab", "Reparcie_" + index_str, pedited, spot.reparcie, spotEdited.reparcie); + assignFromKeyfile(keyFile, "Locallab", "Sensicie_" + index_str, pedited, spot.sensicie, spotEdited.sensicie); + assignFromKeyfile(keyFile, "Locallab", "AutoGraycie_" + index_str, pedited, spot.Autograycie, spotEdited.Autograycie); + assignFromKeyfile(keyFile, "Locallab", "Forcejz_" + index_str, pedited, spot.forcejz, spotEdited.forcejz); + assignFromKeyfile(keyFile, "Locallab", "Forcebw_" + index_str, pedited, spot.forcebw, spotEdited.forcebw); + assignFromKeyfile(keyFile, "Locallab", "Qtoj_" + index_str, pedited, spot.qtoj, spotEdited.qtoj); + assignFromKeyfile(keyFile, "Locallab", "jabcie_" + index_str, pedited, spot.jabcie, spotEdited.jabcie); + assignFromKeyfile(keyFile, "Locallab", "sigmoidqjcie_" + index_str, pedited, spot.sigmoidqjcie, spotEdited.sigmoidqjcie); + assignFromKeyfile(keyFile, "Locallab", "logcie_" + index_str, pedited, spot.logcie, spotEdited.logcie); + assignFromKeyfile(keyFile, "Locallab", "Logjz_" + index_str, pedited, spot.logjz, spotEdited.logjz); + assignFromKeyfile(keyFile, "Locallab", "Sigjz_" + index_str, pedited, spot.sigjz, spotEdited.sigjz); + assignFromKeyfile(keyFile, "Locallab", "Sigq_" + index_str, pedited, spot.sigq, spotEdited.sigq); + assignFromKeyfile(keyFile, "Locallab", "chjzcie_" + index_str, pedited, spot.chjzcie, spotEdited.chjzcie); + assignFromKeyfile(keyFile, "Locallab", "SourceGraycie_" + index_str, pedited, spot.sourceGraycie, spotEdited.sourceGraycie); + assignFromKeyfile(keyFile, "Locallab", "Sourceabscie_" + index_str, pedited, spot.sourceabscie, spotEdited.sourceabscie); + assignFromKeyfile(keyFile, "Locallab", "Sursourcie_" + index_str, pedited, spot.sursourcie, spotEdited.sursourcie); + assignFromKeyfile(keyFile, "Locallab", "Modecie_" + index_str, pedited, spot.modecie, spotEdited.modecie); + assignFromKeyfile(keyFile, "Locallab", "Modecam_" + index_str, pedited, spot.modecam, spotEdited.modecam); + assignFromKeyfile(keyFile, "Locallab", "Saturlcie_" + index_str, pedited, spot.saturlcie, spotEdited.saturlcie); + assignFromKeyfile(keyFile, "Locallab", "Rstprotectcie_" + index_str, pedited, spot.rstprotectcie, spotEdited.rstprotectcie); + assignFromKeyfile(keyFile, "Locallab", "Chromlcie_" + index_str, pedited, spot.chromlcie, spotEdited.chromlcie); + assignFromKeyfile(keyFile, "Locallab", "Huecie_" + index_str, pedited, spot.huecie, spotEdited.huecie); + assignFromKeyfile(keyFile, "Locallab", "ToneMethodcie_" + index_str, pedited, spot.toneMethodcie, spotEdited.toneMethodcie); + assignFromKeyfile(keyFile, "Locallab", "Ciecurve_" + index_str, pedited, spot.ciecurve, spotEdited.ciecurve); + assignFromKeyfile(keyFile, "Locallab", "ToneMethodcie2_" + index_str, pedited, spot.toneMethodcie2, spotEdited.toneMethodcie2); + assignFromKeyfile(keyFile, "Locallab", "Ciecurve2_" + index_str, pedited, spot.ciecurve2, spotEdited.ciecurve2); + assignFromKeyfile(keyFile, "Locallab", "Chromjzcie_" + index_str, pedited, spot.chromjzcie, spotEdited.chromjzcie); + assignFromKeyfile(keyFile, "Locallab", "Saturjzcie_" + index_str, pedited, spot.saturjzcie, spotEdited.saturjzcie); + assignFromKeyfile(keyFile, "Locallab", "Huejzcie_" + index_str, pedited, spot.huejzcie, spotEdited.huejzcie); + assignFromKeyfile(keyFile, "Locallab", "Softjzcie_" + index_str, pedited, spot.softjzcie, spotEdited.softjzcie); + assignFromKeyfile(keyFile, "Locallab", "strSoftjzcie_" + index_str, pedited, spot.strsoftjzcie, spotEdited.strsoftjzcie); + assignFromKeyfile(keyFile, "Locallab", "Thrhjzcie_" + index_str, pedited, spot.thrhjzcie, spotEdited.thrhjzcie); + assignFromKeyfile(keyFile, "Locallab", "JzCurve_" + index_str, pedited, spot.jzcurve, spotEdited.jzcurve); + assignFromKeyfile(keyFile, "Locallab", "CzCurve_" + index_str, pedited, spot.czcurve, spotEdited.czcurve); + assignFromKeyfile(keyFile, "Locallab", "CzJzCurve_" + index_str, pedited, spot.czjzcurve, spotEdited.czjzcurve); + assignFromKeyfile(keyFile, "Locallab", "HHCurvejz_" + index_str, pedited, spot.HHcurvejz, spotEdited.HHcurvejz); + assignFromKeyfile(keyFile, "Locallab", "CHCurvejz_" + index_str, pedited, spot.CHcurvejz, spotEdited.CHcurvejz); + assignFromKeyfile(keyFile, "Locallab", "LHCurvejz_" + index_str, pedited, spot.LHcurvejz, spotEdited.LHcurvejz); + assignFromKeyfile(keyFile, "Locallab", "Lightlcie_" + index_str, pedited, spot.lightlcie, spotEdited.lightlcie); + assignFromKeyfile(keyFile, "Locallab", "Lightjzcie_" + index_str, pedited, spot.lightjzcie, spotEdited.lightjzcie); + assignFromKeyfile(keyFile, "Locallab", "Brightqcie_" + index_str, pedited, spot.lightqcie, spotEdited.lightqcie); + assignFromKeyfile(keyFile, "Locallab", "Contlcie_" + index_str, pedited, spot.contlcie, spotEdited.contlcie); + assignFromKeyfile(keyFile, "Locallab", "Contjzcie_" + index_str, pedited, spot.contjzcie, spotEdited.contjzcie); + assignFromKeyfile(keyFile, "Locallab", "Adapjzcie_" + index_str, pedited, spot.adapjzcie, spotEdited.adapjzcie); + assignFromKeyfile(keyFile, "Locallab", "Jz100_" + index_str, pedited, spot.jz100, spotEdited.jz100); + assignFromKeyfile(keyFile, "Locallab", "PQremap_" + index_str, pedited, spot.pqremap, spotEdited.pqremap); + assignFromKeyfile(keyFile, "Locallab", "PQremapcam16_" + index_str, pedited, spot.pqremapcam16, spotEdited.pqremapcam16); + assignFromKeyfile(keyFile, "Locallab", "Hljzcie_" + index_str, pedited, spot.hljzcie, spotEdited.hljzcie); + assignFromKeyfile(keyFile, "Locallab", "Hlthjzcie_" + index_str, pedited, spot.hlthjzcie, spotEdited.hlthjzcie); + assignFromKeyfile(keyFile, "Locallab", "Shjzcie_" + index_str, pedited, spot.shjzcie, spotEdited.shjzcie); + assignFromKeyfile(keyFile, "Locallab", "Shthjzcie_" + index_str, pedited, spot.shthjzcie, spotEdited.shthjzcie); + assignFromKeyfile(keyFile, "Locallab", "Radjzcie_" + index_str, pedited, spot.radjzcie, spotEdited.radjzcie); + if (keyFile.has_key("Locallab", "CSThresholdjz_" + index_str)) { + + const std::vector thresh = keyFile.get_integer_list("Locallab", "CSThresholdjz_" + index_str); + + if (thresh.size() >= 4) { + spot.csthresholdjz.setValues(thresh[0], thresh[1], min(thresh[2], 10), min(thresh[3], 10)); + } + + spotEdited.csthresholdjz = true; + } + assignFromKeyfile(keyFile, "Locallab", "Sigmalcjz_" + index_str, pedited, spot.sigmalcjz, spotEdited.sigmalcjz); + assignFromKeyfile(keyFile, "Locallab", "Clarilresjz_" + index_str, pedited, spot.clarilresjz, spotEdited.clarilresjz); + assignFromKeyfile(keyFile, "Locallab", "Claricresjz_" + index_str, pedited, spot.claricresjz, spotEdited.claricresjz); + assignFromKeyfile(keyFile, "Locallab", "Clarisoftjz_" + index_str, pedited, spot.clarisoftjz, spotEdited.clarisoftjz); + assignFromKeyfile(keyFile, "Locallab", "LocwavCurvejz_" + index_str, pedited, spot.locwavcurvejz, spotEdited.locwavcurvejz); + assignFromKeyfile(keyFile, "Locallab", "Contthrescie_" + index_str, pedited, spot.contthrescie, spotEdited.contthrescie); + assignFromKeyfile(keyFile, "Locallab", "Contthrescie_" + index_str, pedited, spot.contthrescie, spotEdited.contthrescie); + assignFromKeyfile(keyFile, "Locallab", "BlackEvjz_" + index_str, pedited, spot.blackEvjz, spotEdited.blackEvjz); + assignFromKeyfile(keyFile, "Locallab", "WhiteEvjz_" + index_str, pedited, spot.whiteEvjz, spotEdited.whiteEvjz); + assignFromKeyfile(keyFile, "Locallab", "Targetjz_" + index_str, pedited, spot.targetjz, spotEdited.targetjz); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidthcie_" + index_str, pedited, spot.sigmoidthcie, spotEdited.sigmoidthcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidblcie_" + index_str, pedited, spot.sigmoidblcie, spotEdited.sigmoidblcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidldajzcie_" + index_str, pedited, spot.sigmoidldajzcie, spotEdited.sigmoidldajzcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidthjzcie_" + index_str, pedited, spot.sigmoidthjzcie, spotEdited.sigmoidthjzcie); + assignFromKeyfile(keyFile, "Locallab", "Sigmoidbljzcie_" + index_str, pedited, spot.sigmoidbljzcie, spotEdited.sigmoidbljzcie); + assignFromKeyfile(keyFile, "Locallab", "Contqcie_" + index_str, pedited, spot.contqcie, spotEdited.contqcie); + assignFromKeyfile(keyFile, "Locallab", "Colorflcie_" + index_str, pedited, spot.colorflcie, spotEdited.colorflcie); +/* + assignFromKeyfile(keyFile, "Locallab", "Lightlzcam_" + index_str, pedited, spot.lightlzcam, spotEdited.lightlzcam); + assignFromKeyfile(keyFile, "Locallab", "Lightqzcam_" + index_str, pedited, spot.lightqzcam, spotEdited.lightqzcam); + assignFromKeyfile(keyFile, "Locallab", "Contlzcam_" + index_str, pedited, spot.contlzcam, spotEdited.contlzcam); + assignFromKeyfile(keyFile, "Locallab", "Contqzcam_" + index_str, pedited, spot.contqzcam, spotEdited.contqzcam); + assignFromKeyfile(keyFile, "Locallab", "Contthreszcam_" + index_str, pedited, spot.contthreszcam, spotEdited.contthreszcam); +*/ + assignFromKeyfile(keyFile, "Locallab", "Targabscie_" + index_str, pedited, spot.targabscie, spotEdited.targabscie); + assignFromKeyfile(keyFile, "Locallab", "TargetGraycie_" + index_str, pedited, spot.targetGraycie, spotEdited.targetGraycie); + assignFromKeyfile(keyFile, "Locallab", "Catadcie_" + index_str, pedited, spot.catadcie, spotEdited.catadcie); + assignFromKeyfile(keyFile, "Locallab", "Detailcie_" + index_str, pedited, spot.detailcie, spotEdited.detailcie); +/* + assignFromKeyfile(keyFile, "Locallab", "Colorflzcam_" + index_str, pedited, spot.colorflzcam, spotEdited.colorflzcam); + assignFromKeyfile(keyFile, "Locallab", "Saturzcam_" + index_str, pedited, spot.saturzcam, spotEdited.saturzcam); + assignFromKeyfile(keyFile, "Locallab", "Chromzcam_" + index_str, pedited, spot.chromzcam, spotEdited.chromzcam); +*/ + assignFromKeyfile(keyFile, "Locallab", "EnacieMask_" + index_str, pedited, spot.enacieMask, spotEdited.enacieMask); + assignFromKeyfile(keyFile, "Locallab", "CCmaskcieCurve_" + index_str, pedited, spot.CCmaskciecurve, spotEdited.CCmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "LLmaskcieCurve_" + index_str, pedited, spot.LLmaskciecurve, spotEdited.LLmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "HHmaskcieCurve_" + index_str, pedited, spot.HHmaskciecurve, spotEdited.HHmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "Blendmaskcie_" + index_str, pedited, spot.blendmaskcie, spotEdited.blendmaskcie); + assignFromKeyfile(keyFile, "Locallab", "Radmaskcie_" + index_str, pedited, spot.radmaskcie, spotEdited.radmaskcie); + assignFromKeyfile(keyFile, "Locallab", "Chromaskcie_" + index_str, pedited, spot.chromaskcie, spotEdited.chromaskcie); + assignFromKeyfile(keyFile, "Locallab", "Lapmaskcie_" + index_str, pedited, spot.lapmaskcie, spotEdited.lapmaskcie); + assignFromKeyfile(keyFile, "Locallab", "Gammaskcie_" + index_str, pedited, spot.gammaskcie, spotEdited.gammaskcie); + assignFromKeyfile(keyFile, "Locallab", "Slomaskcie_" + index_str, pedited, spot.slomaskcie, spotEdited.slomaskcie); + assignFromKeyfile(keyFile, "Locallab", "LmaskcieCurve_" + index_str, pedited, spot.Lmaskciecurve, spotEdited.Lmaskciecurve); + assignFromKeyfile(keyFile, "Locallab", "Recothrescie_" + index_str, pedited, spot.recothrescie, spotEdited.recothrescie); + assignFromKeyfile(keyFile, "Locallab", "Lowthrescie_" + index_str, pedited, spot.lowthrescie, spotEdited.lowthrescie); + assignFromKeyfile(keyFile, "Locallab", "Higthrescie_" + index_str, pedited, spot.higthrescie, spotEdited.higthrescie); + assignFromKeyfile(keyFile, "Locallab", "Decaycie_" + index_str, pedited, spot.decaycie, spotEdited.decaycie); + + // Append LocallabSpot and LocallabParamsEdited + locallab.spots.push_back(spot); + + if (pedited) { + pedited->locallab.spots.push_back(spotEdited); + } + + // Update increment + ++i; + } + } + 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); @@ -4459,6 +9463,8 @@ 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); + assignFromKeyfile(keyFile, "Resize", "LongEdge", pedited, resize.longedge, pedited->resize.longedge); + assignFromKeyfile(keyFile, "Resize", "ShortEdge", pedited, resize.shortedge, pedited->resize.shortedge); if (ppVersion >= 339) { assignFromKeyfile(keyFile, "Resize", "AllowUpscaling", pedited, resize.allowUpscaling, pedited->resize.allowUpscaling); } else { @@ -4469,6 +9475,34 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } + if (keyFile.has_group ("Spot removal")) { + assignFromKeyfile(keyFile, "Spot removal", "Enabled", pedited, spot.enabled, pedited->spot.enabled); + int i = 0; + do { + std::stringstream ss; + ss << "Spot" << (i++ + 1); + + if (keyFile.has_key ("Spot removal", ss.str())) { + Glib::ArrayHandle entry = keyFile.get_double_list ("Spot removal", ss.str()); + const double epsilon = 0.001; // to circumvent rounding of integer saved as double + SpotEntry se; + + se.sourcePos.set(int(entry.data()[0] + epsilon), int(entry.data()[1] + epsilon)); + se.targetPos.set(int(entry.data()[2] + epsilon), int(entry.data()[3] + epsilon)); + se.radius = LIM(int (entry.data()[4] + epsilon), SpotParams::minRadius, SpotParams::maxRadius); + se.feather = float(entry.data()[5]); + se.opacity = float(entry.data()[6]); + spot.entries.push_back(se); + + if (pedited) { + pedited->spot.entries = true; + } + } else { + break; + } + } while (1); + } + if (keyFile.has_group("PostDemosaicSharpening")) { assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Enabled", pedited, pdsharpening.enabled, pedited->pdsharpening.enabled); assignFromKeyfile(keyFile, "PostDemosaicSharpening", "Contrast", pedited, pdsharpening.contrast, pedited->pdsharpening.contrast); @@ -4517,23 +9551,138 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_group("Color Management")) { if (keyFile.has_key("Color Management", "InputProfile")) { - icm.inputProfile = expandRelativePath(fname, "file:", keyFile.get_string("Color Management", "InputProfile")); + icm.inputProfile = expandRelativePath2(fname, options.rtSettings.cameraProfilesPath, "file:", keyFile.get_string("Color Management", "InputProfile")); if (pedited) { pedited->icm.inputProfile = true; } - } - + } assignFromKeyfile(keyFile, "Color Management", "ToneCurve", pedited, icm.toneCurve, pedited->icm.toneCurve); assignFromKeyfile(keyFile, "Color Management", "ApplyLookTable", pedited, icm.applyLookTable, pedited->icm.applyLookTable); assignFromKeyfile(keyFile, "Color Management", "ApplyBaselineExposureOffset", pedited, icm.applyBaselineExposureOffset, pedited->icm.applyBaselineExposureOffset); assignFromKeyfile(keyFile, "Color Management", "ApplyHueSatMap", pedited, icm.applyHueSatMap, pedited->icm.applyHueSatMap); assignFromKeyfile(keyFile, "Color Management", "DCPIlluminant", pedited, icm.dcpIlluminant, pedited->icm.dcpIlluminant); assignFromKeyfile(keyFile, "Color Management", "WorkingProfile", pedited, icm.workingProfile, pedited->icm.workingProfile); - assignFromKeyfile(keyFile, "Color Management", "WorkingTRC", pedited, icm.workingTRC, pedited->icm.workingTRC); + if ( + !assignFromKeyfile( + keyFile, + "Color Management", + "WorkingTRC", + pedited, + { + {"none", ColorManagementParams::WorkingTrc::NONE}, + {"Custom", ColorManagementParams::WorkingTrc::CUSTOM}, + {"bt709", ColorManagementParams::WorkingTrc::BT709}, + {"srgb", ColorManagementParams::WorkingTrc::SRGB}, + {"22", ColorManagementParams::WorkingTrc::GAMMA_2_2}, + {"18", ColorManagementParams::WorkingTrc::GAMMA_1_8}, + {"lin", ColorManagementParams::WorkingTrc::LINEAR} + }, + icm.workingTRC, + pedited->icm.workingTRC + ) + ) { + icm.workingTRC = ColorManagementParams::WorkingTrc::NONE; + if (pedited) { + pedited->icm.workingTRC = true; + } + } + if ( + !assignFromKeyfile( + keyFile, + "Color Management", + "Will", + pedited, + { + {"def", ColorManagementParams::Illuminant::DEFAULT}, + {"D41", ColorManagementParams::Illuminant::D41}, + {"D50", ColorManagementParams::Illuminant::D50}, + {"D55", ColorManagementParams::Illuminant::D55}, + {"D60", ColorManagementParams::Illuminant::D60}, + {"D65", ColorManagementParams::Illuminant::D65}, + {"D80", ColorManagementParams::Illuminant::D80}, + {"D120", ColorManagementParams::Illuminant::D120}, + {"stda", ColorManagementParams::Illuminant::STDA}, + {"2000", ColorManagementParams::Illuminant::TUNGSTEN_2000K}, + {"1500", ColorManagementParams::Illuminant::TUNGSTEN_1500K} + }, + icm.will, + pedited->icm.will + ) + ) { + icm.will = ColorManagementParams::Illuminant::DEFAULT; + if (pedited) { + pedited->icm.will = true; + } + } + if ( + !assignFromKeyfile( + keyFile, + "Color Management", + "Wprim", + pedited, + { + {"def", ColorManagementParams::Primaries::DEFAULT}, + {"srgb", ColorManagementParams::Primaries::SRGB}, + {"adob", ColorManagementParams::Primaries::ADOBE_RGB}, + {"prop", ColorManagementParams::Primaries::PRO_PHOTO}, + {"rec", ColorManagementParams::Primaries::REC2020}, + {"aces", ColorManagementParams::Primaries::ACES_P1}, + {"wid", ColorManagementParams::Primaries::WIDE_GAMUT}, + {"ac0", ColorManagementParams::Primaries::ACES_P0}, + {"bru", ColorManagementParams::Primaries::BRUCE_RGB}, + {"bet", ColorManagementParams::Primaries::BETA_RGB}, + {"bst", ColorManagementParams::Primaries::BEST_RGB}, + {"cus", ColorManagementParams::Primaries::CUSTOM}, + {"cusgr", ColorManagementParams::Primaries::CUSTOM_GRID} + }, + icm.wprim, + pedited->icm.wprim + ) + ) { + icm.wprim = ColorManagementParams::Primaries::DEFAULT; + if (pedited) { + pedited->icm.wprim = true; + } + } assignFromKeyfile(keyFile, "Color Management", "WorkingTRCGamma", pedited, icm.workingTRCGamma, pedited->icm.workingTRCGamma); assignFromKeyfile(keyFile, "Color Management", "WorkingTRCSlope", pedited, icm.workingTRCSlope, pedited->icm.workingTRCSlope); + assignFromKeyfile(keyFile, "Color Management", "Redx", pedited, icm.redx, pedited->icm.redx); + assignFromKeyfile(keyFile, "Color Management", "Redy", pedited, icm.redy, pedited->icm.redy); + assignFromKeyfile(keyFile, "Color Management", "Grex", pedited, icm.grex, pedited->icm.grex); + assignFromKeyfile(keyFile, "Color Management", "Grey", pedited, icm.grey, pedited->icm.grey); + assignFromKeyfile(keyFile, "Color Management", "Blux", pedited, icm.blux, pedited->icm.blux); + assignFromKeyfile(keyFile, "Color Management", "Bluy", pedited, icm.bluy, pedited->icm.bluy); + assignFromKeyfile(keyFile, "Color Management", "Preser", pedited, icm.preser, pedited->icm.preser); + assignFromKeyfile(keyFile, "Color Management", "Fbw", pedited, icm.fbw, pedited->icm.fbw); + assignFromKeyfile(keyFile, "Color Management", "Gamut", pedited, icm.gamut, pedited->icm.gamut); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieALow", pedited, icm.labgridcieALow, pedited->icm.labgridcieALow); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieBLow", pedited, icm.labgridcieBLow, pedited->icm.labgridcieBLow); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieAHigh", pedited, icm.labgridcieAHigh, pedited->icm.labgridcieAHigh); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieBHigh", pedited, icm.labgridcieBHigh, pedited->icm.labgridcieBHigh); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieGx", pedited, icm.labgridcieGx, pedited->icm.labgridcieGx); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieGy", pedited, icm.labgridcieGy, pedited->icm.labgridcieGy); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieWx", pedited, icm.labgridcieWx, pedited->icm.labgridcieWx); + assignFromKeyfile(keyFile, "Color Management", "LabGridcieWy", pedited, icm.labgridcieWy, pedited->icm.labgridcieWy); + if (keyFile.has_key("Color Management", "aIntent")) { + Glib::ustring intent = keyFile.get_string("Color Management", "aIntent"); + + if (intent == "Perceptual") { + icm.aRendIntent = RI_PERCEPTUAL; + } else if (intent == "Relative") { + icm.aRendIntent = RI_RELATIVE; + } else if (intent == "Saturation") { + icm.aRendIntent = RI_SATURATION; + } else if (intent == "Absolute") { + icm.aRendIntent = RI_ABSOLUTE; + } + + if (pedited) { + pedited->icm.aRendIntent = true; + } + } + assignFromKeyfile(keyFile, "Color Management", "OutputProfile", pedited, icm.outputProfile, pedited->icm.outputProfile); if (ppVersion < 341) { if (icm.outputProfile == "RT_Medium_gsRGB") { @@ -4580,6 +9729,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Enabled", pedited, wavelet.enabled, pedited->wavelet.enabled); assignFromKeyfile(keyFile, "Wavelet", "Strength", pedited, wavelet.strength, pedited->wavelet.strength); assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); + assignFromKeyfile(keyFile, "Wavelet", "Sigmafin", pedited, wavelet.sigmafin, pedited->wavelet.sigmafin); + assignFromKeyfile(keyFile, "Wavelet", "Sigmaton", pedited, wavelet.sigmaton, pedited->wavelet.sigmaton); + assignFromKeyfile(keyFile, "Wavelet", "Sigmacol", pedited, wavelet.sigmacol, pedited->wavelet.sigmacol); + assignFromKeyfile(keyFile, "Wavelet", "Sigmadir", pedited, wavelet.sigmadir, pedited->wavelet.sigmadir); + assignFromKeyfile(keyFile, "Wavelet", "Rangeab", pedited, wavelet.rangeab, pedited->wavelet.rangeab); + assignFromKeyfile(keyFile, "Wavelet", "Protab", pedited, wavelet.protab, pedited->wavelet.protab); assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); @@ -4591,16 +9746,38 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "CBbluehigh", pedited, wavelet.bluehigh, pedited->wavelet.bluehigh); assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); + assignFromKeyfile(keyFile, "Wavelet", "Ballum", pedited, wavelet.ballum, pedited->wavelet.ballum); + assignFromKeyfile(keyFile, "Wavelet", "Sigm", pedited, wavelet.sigm, pedited->wavelet.sigm); + assignFromKeyfile(keyFile, "Wavelet", "Levden", pedited, wavelet.levden, pedited->wavelet.levden); + assignFromKeyfile(keyFile, "Wavelet", "Thrden", pedited, wavelet.thrden, pedited->wavelet.thrden); + assignFromKeyfile(keyFile, "Wavelet", "Limden", pedited, wavelet.limden, pedited->wavelet.limden); + assignFromKeyfile(keyFile, "Wavelet", "Balchrom", pedited, wavelet.balchrom, pedited->wavelet.balchrom); + assignFromKeyfile(keyFile, "Wavelet", "Chromfine", pedited, wavelet.chromfi, pedited->wavelet.chromfi); + assignFromKeyfile(keyFile, "Wavelet", "Chromcoarse", pedited, wavelet.chromco, pedited->wavelet.chromco); + assignFromKeyfile(keyFile, "Wavelet", "MergeL", pedited, wavelet.mergeL, pedited->wavelet.mergeL); + assignFromKeyfile(keyFile, "Wavelet", "MergeC", pedited, wavelet.mergeC, pedited->wavelet.mergeC); + assignFromKeyfile(keyFile, "Wavelet", "Softrad", pedited, wavelet.softrad, pedited->wavelet.softrad); + assignFromKeyfile(keyFile, "Wavelet", "Softradend", pedited, wavelet.softradend, pedited->wavelet.softradend); + assignFromKeyfile(keyFile, "Wavelet", "Strend", pedited, wavelet.strend, pedited->wavelet.strend); + assignFromKeyfile(keyFile, "Wavelet", "Detend", pedited, wavelet.detend, pedited->wavelet.detend); + assignFromKeyfile(keyFile, "Wavelet", "Thrend", pedited, wavelet.thrend, pedited->wavelet.thrend); assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); + assignFromKeyfile(keyFile, "Wavelet", "Showmask", pedited, wavelet.showmask, pedited->wavelet.showmask); + assignFromKeyfile(keyFile, "Wavelet", "Oldsh", pedited, wavelet.oldsh, pedited->wavelet.oldsh); assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); + assignFromKeyfile(keyFile, "Wavelet", "LabGridALow", pedited, wavelet.labgridALow, pedited->wavelet.labgridALow); + assignFromKeyfile(keyFile, "Wavelet", "LabGridBLow", pedited, wavelet.labgridBLow, pedited->wavelet.labgridBLow); + assignFromKeyfile(keyFile, "Wavelet", "LabGridAHigh", pedited, wavelet.labgridAHigh, pedited->wavelet.labgridAHigh); + assignFromKeyfile(keyFile, "Wavelet", "LabGridBHigh", pedited, wavelet.labgridBHigh, pedited->wavelet.labgridBHigh); 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()) { + try { wavelet.Lmethod = std::stoi(temp); + } catch (...) { } } else { assignFromKeyfile(keyFile, "Wavelet", "LevMethod", pedited, wavelet.Lmethod, pedited->wavelet.Lmethod); @@ -4609,9 +9786,24 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + + if (keyFile.has_key("Wavelet", "complexMethod")) { + assignFromKeyfile(keyFile, "Wavelet", "complexMethod", pedited, wavelet.complexmethod, pedited->wavelet.complexmethod); + } else if (wavelet.enabled) { + wavelet.complexmethod = "expert"; + if (pedited) { + pedited->wavelet.complexmethod = true; + } + } + + //assignFromKeyfile(keyFile, "Wavelet", "denMethod", pedited, wavelet.denmethod, pedited->wavelet.denmethod); + assignFromKeyfile(keyFile, "Wavelet", "mixMethod", pedited, wavelet.mixmethod, pedited->wavelet.mixmethod); + assignFromKeyfile(keyFile, "Wavelet", "sliMethod", pedited, wavelet.slimethod, pedited->wavelet.slimethod); + assignFromKeyfile(keyFile, "Wavelet", "quaMethod", pedited, wavelet.quamethod, pedited->wavelet.quamethod); assignFromKeyfile(keyFile, "Wavelet", "DaubMethod", pedited, wavelet.daubcoeffmethod, pedited->wavelet.daubcoeffmethod); assignFromKeyfile(keyFile, "Wavelet", "CHromaMethod", pedited, wavelet.CHmethod, pedited->wavelet.CHmethod); assignFromKeyfile(keyFile, "Wavelet", "Medgreinf", pedited, wavelet.Medgreinf, pedited->wavelet.Medgreinf); + assignFromKeyfile(keyFile, "Wavelet", "Ushamethod", pedited, wavelet.ushamethod, pedited->wavelet.ushamethod); assignFromKeyfile(keyFile, "Wavelet", "CHSLromaMethod", pedited, wavelet.CHSLmethod, pedited->wavelet.CHSLmethod); assignFromKeyfile(keyFile, "Wavelet", "EDMethod", pedited, wavelet.EDmethod, pedited->wavelet.EDmethod); assignFromKeyfile(keyFile, "Wavelet", "NPMethod", pedited, wavelet.NPmethod, pedited->wavelet.NPmethod); @@ -4619,10 +9811,17 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "TMMethod", pedited, wavelet.TMmethod, pedited->wavelet.TMmethod); assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); + assignFromKeyfile(keyFile, "Wavelet", "Sigma", pedited, wavelet.sigma, pedited->wavelet.sigma); + assignFromKeyfile(keyFile, "Wavelet", "Offset", pedited, wavelet.offset, pedited->wavelet.offset); + assignFromKeyfile(keyFile, "Wavelet", "Lowthr", pedited, wavelet.lowthr, pedited->wavelet.lowthr); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); + assignFromKeyfile(keyFile, "Wavelet", "Residualblur", pedited, wavelet.resblur, pedited->wavelet.resblur); + assignFromKeyfile(keyFile, "Wavelet", "Residualblurc", pedited, wavelet.resblurc, pedited->wavelet.resblurc); assignFromKeyfile(keyFile, "Wavelet", "ResidualTM", pedited, wavelet.tmrs, pedited->wavelet.tmrs); + assignFromKeyfile(keyFile, "Wavelet", "ResidualEDGS", pedited, wavelet.edgs, pedited->wavelet.edgs); + assignFromKeyfile(keyFile, "Wavelet", "ResidualSCALE", pedited, wavelet.scale, pedited->wavelet.scale); assignFromKeyfile(keyFile, "Wavelet", "Residualgamma", pedited, wavelet.gamma, pedited->wavelet.gamma); assignFromKeyfile(keyFile, "Wavelet", "ContExtra", pedited, wavelet.sup, pedited->wavelet.sup); assignFromKeyfile(keyFile, "Wavelet", "HueRangeResidual", pedited, wavelet.sky, pedited->wavelet.sky); @@ -4638,16 +9837,24 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "ChromaLink", pedited, wavelet.chro, pedited->wavelet.chro); assignFromKeyfile(keyFile, "Wavelet", "Contrast", pedited, wavelet.contrast, pedited->wavelet.contrast); assignFromKeyfile(keyFile, "Wavelet", "Edgrad", pedited, wavelet.edgrad, pedited->wavelet.edgrad); + assignFromKeyfile(keyFile, "Wavelet", "Edgeffect", pedited, wavelet.edgeffect, pedited->wavelet.edgeffect); assignFromKeyfile(keyFile, "Wavelet", "Edgval", pedited, wavelet.edgval, pedited->wavelet.edgval); assignFromKeyfile(keyFile, "Wavelet", "ThrEdg", pedited, wavelet.edgthresh, pedited->wavelet.edgthresh); assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidShadow", pedited, wavelet.thr, pedited->wavelet.thr); assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH); + assignFromKeyfile(keyFile, "Wavelet", "Residualradius", pedited, wavelet.radius, pedited->wavelet.radius); assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); + assignFromKeyfile(keyFile, "Wavelet", "blcurve", pedited, wavelet.blcurve, pedited->wavelet.blcurve); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); + //assignFromKeyfile(keyFile, "Wavelet", "Levalshc", pedited, wavelet.opacityCurveSH, pedited->wavelet.opacityCurveSH); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); + assignFromKeyfile(keyFile, "Wavelet", "wavdenoise", pedited, wavelet.wavdenoise, pedited->wavelet.wavdenoise); + assignFromKeyfile(keyFile, "Wavelet", "wavdenoiseh", pedited, wavelet.wavdenoiseh, pedited->wavelet.wavdenoiseh); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveWL", pedited, wavelet.opacityCurveWL, pedited->wavelet.opacityCurveWL); assignFromKeyfile(keyFile, "Wavelet", "HHcurve", pedited, wavelet.hhcurve, pedited->wavelet.hhcurve); + assignFromKeyfile(keyFile, "Wavelet", "Wavguidcurve", pedited, wavelet.wavguidcurve, pedited->wavelet.wavguidcurve); + assignFromKeyfile(keyFile, "Wavelet", "Wavhuecurve", pedited, wavelet.wavhuecurve, pedited->wavelet.wavhuecurve); assignFromKeyfile(keyFile, "Wavelet", "CHcurve", pedited, wavelet.Chcurve, pedited->wavelet.Chcurve); assignFromKeyfile(keyFile, "Wavelet", "WavclCurve", pedited, wavelet.wavclCurve, pedited->wavelet.wavclCurve); @@ -4759,6 +9966,30 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } + if (keyFile.has_key("Wavelet", "Leveldenoise")) { + const std::vector thresh = keyFile.get_double_list("Wavelet", "Leveldenoise"); + + if (thresh.size() >= 2) { + wavelet.leveldenoise.setValues(thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.leveldenoise = true; + } + } + + if (keyFile.has_key("Wavelet", "Levelsigm")) { + const std::vector thresh = keyFile.get_double_list("Wavelet", "Levelsigm"); + + if (thresh.size() >= 2) { + wavelet.levelsigm.setValues(thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.levelsigm = true; + } + } + if (keyFile.has_key("Wavelet", "Pastlev")) { const std::vector thresh = keyFile.get_integer_list("Wavelet", "Pastlev"); @@ -4784,6 +10015,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); + assignFromKeyfile(keyFile, "Wavelet", "chrwav", pedited, wavelet.chrwav, pedited->wavelet.chrwav); + assignFromKeyfile(keyFile, "Wavelet", "bluwav", pedited, wavelet.bluwav, pedited->wavelet.bluwav); assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); @@ -4814,10 +10047,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Wavelet", "Expedge", pedited, wavelet.expedge, pedited->wavelet.expedge); + assignFromKeyfile(keyFile, "Wavelet", "expbl", pedited, wavelet.expbl, pedited->wavelet.expbl); assignFromKeyfile(keyFile, "Wavelet", "Expresid", pedited, wavelet.expresid, pedited->wavelet.expresid); assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal); assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning); assignFromKeyfile(keyFile, "Wavelet", "Expnoise", pedited, wavelet.expnoise, pedited->wavelet.expnoise); + assignFromKeyfile(keyFile, "Wavelet", "Expclari", pedited, wavelet.expclari, pedited->wavelet.expclari); } if (keyFile.has_group("Directional Pyramid Equalizer")) { @@ -4890,12 +10125,36 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); - assignFromKeyfile(keyFile, "Dehaze", "Luminance", pedited, dehaze.luminance, pedited->dehaze.luminance); + if (ppVersion < 349 && dehaze.enabled && keyFile.has_key("Dehaze", "Luminance")) { + const bool luminance = keyFile.get_boolean("Dehaze", "Luminance"); + dehaze.saturation = luminance ? 0 : 100; + if (pedited) { + pedited->dehaze.saturation = true; + } + } else { + assignFromKeyfile(keyFile, "Dehaze", "Saturation", pedited, dehaze.saturation, pedited->dehaze.saturation); + } } 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); + assignFromKeyfile(keyFile, "Film Simulation", "ClutFilename", pedited, filmSimulation.clutFilename, pedited->filmSimulation.clutFilename); + #if defined (WIN32) + // if this is Windows, replace any "/" in the filename with "\\" + size_t pos = filmSimulation.clutFilename.find("/"); + while (pos != string::npos) { + filmSimulation.clutFilename.replace(pos, 1, "\\"); + pos = filmSimulation.clutFilename.find("/", pos); + } + #endif + #if !defined (WIN32) + // if this is not Windows, replace any "\\" in the filename with "/" + size_t pos = filmSimulation.clutFilename.find("\\"); + while (pos != string::npos) { + filmSimulation.clutFilename.replace(pos, 1, "/"); + pos = filmSimulation.clutFilename.find("\\", pos); + } + #endif if (keyFile.has_key("Film Simulation", "Strength")) { if (ppVersion < 321) { @@ -5070,24 +10329,22 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_group("RAW")) { if (keyFile.has_key("RAW", "DarkFrame")) { - raw.dark_frame = expandRelativePath(fname, "", keyFile.get_string("RAW", "DarkFrame")); + raw.dark_frame = expandRelativePath2(fname, options.rtSettings.darkFramesPath, "", keyFile.get_string("RAW", "DarkFrame")); if (pedited) { pedited->raw.darkFrame = true; } } - 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")); + raw.ff_file = expandRelativePath2(fname, options.rtSettings.flatFieldsPath, "", keyFile.get_string("RAW", "FlatFieldFile")); if (pedited) { pedited->raw.ff_file = true; } } - assignFromKeyfile(keyFile, "RAW", "FlatFieldAutoSelect", pedited, raw.ff_AutoSelect, pedited->raw.ff_AutoSelect); + assignFromKeyfile(keyFile, "RAW", "FlatFieldFromMetaData", pedited, raw.ff_FromMetaData, pedited->raw.ff_FromMetaData); 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); @@ -5193,14 +10450,17 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftEperIso", pedited, raw.bayersensor.pixelShiftEperIso, pedited->raw.bayersensor.pixelShiftEperIso); + 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", "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", "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", "pixelShiftAverage", pedited, raw.bayersensor.pixelShiftAverage, pedited->raw.bayersensor.pixelShiftAverage); 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); @@ -5210,12 +10470,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (ppVersion < 336) { if (keyFile.has_key("RAW Bayer", "pixelShiftLmmse")) { - bool useLmmse = keyFile.get_boolean ("RAW Bayer", "pixelShiftLmmse"); + const 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; } @@ -5249,6 +10511,59 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Film Negative", "RedRatio", pedited, filmNegative.redRatio, pedited->filmNegative.redRatio); assignFromKeyfile(keyFile, "Film Negative", "GreenExponent", pedited, filmNegative.greenExp, pedited->filmNegative.greenExp); assignFromKeyfile(keyFile, "Film Negative", "BlueRatio", pedited, filmNegative.blueRatio, pedited->filmNegative.blueRatio); + + if (ppVersion < 347) { + // Backwards compatibility with RT v5.8 + filmNegative.colorSpace = FilmNegativeParams::ColorSpace::INPUT; + filmNegative.backCompat = FilmNegativeParams::BackCompat::V1; + if (pedited) { + pedited->filmNegative.refInput = true; + pedited->filmNegative.refOutput = true; + pedited->filmNegative.colorSpace = true; + } + + } else if (!keyFile.has_key("Film Negative", "RefInput")) { + // Backwards compatibility with intermediate dev version (after v5.8) using film base values + bool r, g, b; + assignFromKeyfile(keyFile, "Film Negative", "RedBase", pedited, filmNegative.refInput.r, r); + assignFromKeyfile(keyFile, "Film Negative", "GreenBase", pedited, filmNegative.refInput.g, g); + assignFromKeyfile(keyFile, "Film Negative", "BlueBase", pedited, filmNegative.refInput.b, b); + if (pedited) { + pedited->filmNegative.refInput = r || g || b; + pedited->filmNegative.refOutput = r || g || b; + pedited->filmNegative.colorSpace = true; + } + + filmNegative.colorSpace = FilmNegativeParams::ColorSpace::INPUT; + // Special value -1 used to mean that this should be treated as a v5.8 profile + filmNegative.backCompat = (filmNegative.refInput.r == -1.f) + ? FilmNegativeParams::BackCompat::V1 + : FilmNegativeParams::BackCompat::V2; + + } else { // current version + + assignFromKeyfile(keyFile, "Film Negative", "RefInput", pedited, filmNegative.refInput, pedited->filmNegative.refInput); + assignFromKeyfile(keyFile, "Film Negative", "RefOutput", pedited, filmNegative.refOutput, pedited->filmNegative.refOutput); + + int cs = toUnderlying(filmNegative.colorSpace); + assignFromKeyfile(keyFile, "Film Negative", "ColorSpace", pedited, cs, pedited->filmNegative.colorSpace); + filmNegative.colorSpace = static_cast(cs); + + if (keyFile.has_key("Film Negative", "BackCompat")) { + filmNegative.backCompat = FilmNegativeParams::BackCompat(keyFile.get_integer("Film Negative", "BackCompat")); + } + + } + } + + if (keyFile.has_group("RAW Preprocess WB")) { + if (keyFile.has_key("RAW Preprocess WB", "Mode")) { + raw.preprocessWB.mode = RAWParams::PreprocessWB::Mode(keyFile.get_integer("RAW Preprocess WB", "Mode")); + + if (pedited) { + pedited->raw.preprocessWB.mode = true; + } + } } if (keyFile.has_group("MetaData")) { @@ -5347,6 +10662,7 @@ bool ProcParams::operator ==(const ProcParams& other) const && fattal == other.fattal && defringe == other.defringe && sh == other.sh + && toneEqualizer == other.toneEqualizer && crop == other.crop && coarse == other.coarse && rotate == other.rotate @@ -5355,12 +10671,14 @@ bool ProcParams::operator ==(const ProcParams& other) const && lensProf == other.lensProf && perspective == other.perspective && gradient == other.gradient + && locallab == other.locallab && pcvignette == other.pcvignette && cacorrection == other.cacorrection && vignetting == other.vignetting && chmixer == other.chmixer && blackwhite == other.blackwhite && resize == other.resize + && spot == other.spot && raw == other.raw && icm == other.icm && wavelet == other.wavelet diff --git a/rtengine/procparams.h b/rtengine/procparams.h index c41e55872..6be2be54c 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -18,6 +18,7 @@ */ #pragma once +#include #include #include #include @@ -27,6 +28,7 @@ #include #include +#include "coord.h" #include "noncopyable.h" struct ParamsEdited; @@ -40,10 +42,25 @@ class OpacityCurve; class RetinexgaintransmissionCurve; class RetinextransmissionCurve; class WavCurve; +class Wavblcurve; class WavOpacityCurveBY; +class WavOpacityCurveSH; class WavOpacityCurveRG; class WavOpacityCurveW; class WavOpacityCurveWL; +class LocretigainCurve; +class LocretigainCurverab; +class LocLHCurve; +class LocHHCurve; +class LocCHCurve; +class LocLLmaskCurve; +class LocCCmaskCurve; +class LocHHmaskCurve; +class LocLLmaskexpCurve; +class LocCCmaskexpCurve; +class LocHHmaskexpCurve; + +enum class StandardObserver; enum RenderingIntent : int { RI_PERCEPTUAL = INTENT_PERCEPTUAL, @@ -102,6 +119,12 @@ public: } } + template + typename std::enable_if::value, bool>::type operator !=(const Threshold& rhs) const + { + return !(*this == rhs); + } + T getBottom() const { return bottom_left; @@ -278,6 +301,8 @@ struct ToneCurveParams { int saturation; int shcompr; int hlcompr; // Highlight Recovery's compression + int hlbl; // Highlight Recovery's compression + double hlth; // Highlight Recovery's threshold int hlcomprthresh; // Highlight Recovery's threshold bool histmatching; // histogram matching bool fromHistMatching; @@ -317,6 +342,7 @@ struct RetinexParams { int stonalwidth; int radius; + Glib::ustring complexmethod; Glib::ustring retinexMethod; Glib::ustring retinexcolorspace; Glib::ustring gammaretinex; @@ -354,7 +380,7 @@ struct LCurveParams { int brightness; int contrast; int chromaticity; - bool avoidcolorshift; + Glib::ustring gamutmunselmethod; double rstprotection; bool lcredsk; @@ -401,7 +427,6 @@ struct RGBCurvesParams { /** * Parameters of the Color Toning */ - struct ColorToningParams { bool enabled; bool autosat; @@ -489,6 +514,7 @@ struct ColorToningParams { void getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurve& opacityCurveLUT, const double xyz_rgb[3][3], bool& opautili) const; }; + /** * Parameters of the sharpening */ @@ -528,8 +554,10 @@ struct SharpenEdgeParams { bool operator ==(const SharpenEdgeParams& other) const; bool operator !=(const SharpenEdgeParams& other) const; + }; + struct SharpenMicroParams { bool enabled; bool matrix; @@ -609,11 +637,22 @@ struct WBEntry { struct WBParams { bool enabled; - Glib::ustring method; - int temperature; - double green; - double equal; - double tempBias; + Glib::ustring method; + int temperature; + double green; + double equal; + double tempBias; + StandardObserver observer; + int itcwb_thres; + int itcwb_precis; + int itcwb_size; + int itcwb_delta; + int itcwb_fgreen; + int itcwb_rgreen; + bool itcwb_nopurple; + bool itcwb_sorted; + bool itcwb_forceextra; + bool itcwb_sampling; WBParams(); @@ -650,6 +689,9 @@ struct ColorAppearanceParams { TcMode curveMode; TcMode curveMode2; CtcMode curveMode3; + Glib::ustring complexmethod; + Glib::ustring modelmethod; + Glib::ustring catmethod; Glib::ustring surround; Glib::ustring surrsrc; @@ -661,6 +703,7 @@ struct ColorAppearanceParams { double adaplum; int badpixsl; Glib::ustring wbmodel; + Glib::ustring illum; Glib::ustring algo; double contrast; double qcontrast; @@ -676,6 +719,7 @@ struct ColorAppearanceParams { bool datacie; bool tonecie; int tempout; + bool autotempout; int ybout; double greenout; int tempsc; @@ -797,19 +841,48 @@ struct SHParams { bool operator !=(const SHParams& other) const; }; +/** + * Tone equalizer parameters. + */ +struct ToneEqualizerParams { + bool enabled; + std::array bands; + int regularization; + bool show_colormap; + double pivot; + + ToneEqualizerParams(); + + bool operator ==(const ToneEqualizerParams &other) const; + bool operator !=(const ToneEqualizerParams &other) const; +}; + /** * Parameters of the cropping */ struct CropParams { - bool enabled; - int x; - int y; - int w; - int h; - bool fixratio; - Glib::ustring ratio; - Glib::ustring orientation; - Glib::ustring guide; + enum class Guide { + NONE, + FRAME, + RULE_OF_THIRDS, + RULE_OF_DIAGONALS, + HARMONIC_MEANS, + GRID, + GOLDEN_TRIANGLE_1, + GOLDEN_TRIANGLE_2, + EPASSPORT, + CENTERED_SQUARE + }; + + bool enabled; + int x; + int y; + int w; + int h; + bool fixratio; + Glib::ustring ratio; + Glib::ustring orientation; + Guide guide; CropParams(); @@ -837,6 +910,7 @@ struct CoarseTransformParams { * Common transformation parameters */ struct CommonTransformParams { + Glib::ustring method; bool autofill; CommonTransformParams(); @@ -905,8 +979,37 @@ struct LensProfParams { * Parameters of the perspective correction */ struct PerspectiveParams { + static constexpr double DEFAULT_CAMERA_CROP_FACTOR = 1; + static constexpr double DEFAULT_CAMERA_FOCAL_LENGTH = 24; + + Glib::ustring method; + bool render; double horizontal; double vertical; + /** + * Negative and zero values indicate an unspecified crop factor and should + * be interpreted with {@link #DEFAULT_CAMERA_CROP_FACTOR}. + */ + double camera_crop_factor; + /** + * Negative and zero values indicate an unspecified focal length and should + * be interpreted with {@link #DEFAULT_CAMERA_FOCAL_LENGTH}. + */ + double camera_focal_length; + double camera_pitch; + double camera_roll; + double camera_shift_horiz; + double camera_shift_vert; + double camera_yaw; + double projection_pitch; + double projection_rotate; + double projection_shift_horiz; + double projection_shift_vert; + double projection_yaw; + /** A line is stored as 4 integers in this order: x1, y1, x2, y2 */ + std::vector control_line_values; + /** 0 is vertical, 1 is horizontal, undefined otherwise. */ + std::vector control_line_types; PerspectiveParams(); @@ -931,6 +1034,721 @@ struct GradientParams { bool operator !=(const GradientParams& other) const; }; +/** + * Parameters of the Local Lab + */ +struct LocallabParams { + struct LocallabSpot { + // Control spot settings + Glib::ustring name; + bool isvisible; + Glib::ustring prevMethod; // show, hide + Glib::ustring shape; // ELI, RECT + Glib::ustring spotMethod; // norm, exc + Glib::ustring wavMethod; // D2, D4, D6, D10, D14 + int sensiexclu; + int structexclu; + double struc; + Glib::ustring shapeMethod; // IND, SYM, INDSL, SYMSL + Glib::ustring avoidgamutMethod; // NONE, LAB, XYZ + + std::vector loc; // For ellipse/rectangle: {locX, locXL, locY, locYT} + int centerX; + int centerY; + int circrad; + Glib::ustring qualityMethod; // none, std, enh, enhsup, contr, sob2 + Glib::ustring complexMethod; // sim, mod, all + double transit; + double feather; + double thresh; + double iter; + double balan; + double balanh; + double colorde; + double colorscope; + double avoidrad; + double transitweak; + double transitgrad; + bool hishow; + bool activ; + bool blwh; + bool recurs; + bool laplac; + bool deltae; + bool shortc; + bool savrest; + int scopemask; + double denoichmask; + int lumask; + // Color & Light + bool visicolor; + bool expcolor; + int complexcolor; + bool curvactiv; + int lightness; + double reparcol; + double gamc; + int contrast; + int chroma; + double labgridALow; + double labgridBLow; + double labgridAHigh; + double labgridBHigh; + double labgridALowmerg; + double labgridBLowmerg; + double labgridAHighmerg; + double labgridBHighmerg; + int strengthgrid; + int sensi; + int structcol; + double strcol; + double strcolab; + double strcolh; + double angcol; + int blurcolde; + double blurcol; + double contcol; + int blendmaskcol; + double radmaskcol; + double chromaskcol; + double gammaskcol; + double slomaskcol; + int shadmaskcol; + double strumaskcol; + double lapmaskcol; + Glib::ustring qualitycurveMethod; // none, std + Glib::ustring gridMethod; // one, two + Glib::ustring merMethod; // mone, mtwo, mthr, mfou, mfiv + Glib::ustring toneMethod; // one, two, thr, fou + Glib::ustring mergecolMethod; // one, two, thr, fou, fiv, six, sev, sev0, sev1, sev2, hei, nin, ten, ele, twe, thi, for, hue, sat, col, lum + std::vector llcurve; + std::vector lccurve; + std::vector cccurve; + std::vector clcurve; + std::vector rgbcurve; + std::vector LHcurve; + std::vector HHcurve; + std::vector CHcurve; + bool invers; + bool special; + bool toolcol; + bool enaColorMask; + bool fftColorMask; + std::vector CCmaskcurve; + std::vector LLmaskcurve; + std::vector HHmaskcurve; + std::vector HHhmaskcurve; + double softradiuscol; + double opacol; + double mercol; + double merlucol; + double conthrcol; + std::vector Lmaskcurve; + std::vector LLmaskcolcurvewav; + Threshold csthresholdcol; + double recothresc; + double lowthresc; + double higthresc; + double decayc; + // Exposure + bool visiexpose; + bool expexpose; + int complexexpose; + double expcomp; + int hlcompr; + int hlcomprthresh; + int black; + int shadex; + int shcompr; + int expchroma; + int sensiex; + int structexp; + int blurexpde; + double gamex; + double strexp; + double angexp; + std::vector excurve; + bool norm; + bool inversex; + bool enaExpMask; + bool enaExpMaskaft; + std::vector CCmaskexpcurve; + std::vector LLmaskexpcurve; + std::vector HHmaskexpcurve; + int blendmaskexp; + double radmaskexp; + double chromaskexp; + double gammaskexp; + double slomaskexp; + double lapmaskexp; + double strmaskexp; + double angmaskexp; + double softradiusexp; + std::vector Lmaskexpcurve; + Glib::ustring expMethod; // std, pde + Glib::ustring exnoiseMethod; // none, med, medhi + double laplacexp; + double reparexp; + double balanexp; + double linear; + double gamm; + double fatamount; + double fatdetail; + double fatanchor; + double fatlevel; + double recothrese; + double lowthrese; + double higthrese; + double decaye; + // Shadow highlight + bool visishadhigh; + bool expshadhigh; + int complexshadhigh; + Glib::ustring shMethod; // std, tone + int multsh[5]; + int highlights; + int h_tonalwidth; + int shadows; + int s_tonalwidth; + int sh_radius; + int sensihs; + bool enaSHMask; + std::vector CCmaskSHcurve; + std::vector LLmaskSHcurve; + std::vector HHmaskSHcurve; + int blendmaskSH; + double radmaskSH; + int blurSHde; + double strSH; + double angSH; + bool inverssh; + double chromaskSH; + double gammaskSH; + double slomaskSH; + double lapmaskSH; + int detailSH; + double tePivot; + double reparsh; + std::vector LmaskSHcurve; + double fatamountSH; + double fatanchorSH; + double gamSH; + double sloSH; + double recothress; + double lowthress; + double higthress; + double decays; + // Vibrance + bool visivibrance; + bool expvibrance; + int complexvibrance; + int saturated; + int pastels; + double vibgam; + int warm; + Threshold psthreshold; + bool protectskins; + bool avoidcolorshift; + bool pastsattog; + int sensiv; + std::vector skintonescurve; + std::vector CCmaskvibcurve; + std::vector LLmaskvibcurve; + std::vector HHmaskvibcurve; + bool enavibMask; + int blendmaskvib; + double radmaskvib; + double chromaskvib; + double gammaskvib; + double slomaskvib; + double lapmaskvib; + double strvib; + double strvibab; + double strvibh; + double angvib; + std::vector Lmaskvibcurve; + double recothresv; + double lowthresv; + double higthresv; + double decayv; + // Soft Light + bool visisoft; + bool expsoft; + int complexsoft; + int streng; + int sensisf; + double laplace; + Glib::ustring softMethod; // soft, reti + // Blur & Noise + bool visiblur; + bool expblur; + int complexblur; + double radius; + int strength; + int sensibn; + int itera; + int guidbl; + int strbl; + double recothres; + double lowthres; + double higthres; + double recothresd; + double lowthresd; + double midthresd; + double midthresdch; + double higthresd; + double decayd; + int isogr; + int strengr; + int scalegr; + double divgr; + int epsbl; + Glib::ustring blMethod; // blur, med, guid + Glib::ustring chroMethod; // lum, chr, all + Glib::ustring quamethod; // cons agre + Glib::ustring blurMethod; // norm, inv + Glib::ustring medMethod; // none, 33, 55, 77, 99 + bool usemask; + bool invmaskd; + bool invmask; + double levelthr; + double lnoiselow; + double levelthrlow; + bool activlum; + double noiselumf; + double noiselumf0; + double noiselumf2; + double noiselumc; + double noiselumdetail; + int noiselequal; + double noisegam; + double noisechrof; + double noisechroc; + double noisechrodetail; + int adjblur; + int bilateral; + int nlstr; + int nldet; + int nlpat; + int nlrad; + double nlgam; + int sensiden; + double reparden; + int detailthr; + std::vector locwavcurveden; + std::vector locwavcurvehue; + Glib::ustring showmaskblMethodtyp; + std::vector CCmaskblcurve; + std::vector LLmaskblcurve; + std::vector HHmaskblcurve; + bool enablMask; + bool fftwbl; + bool invbl; + bool toolbl; + int blendmaskbl; + double radmaskbl; + double chromaskbl; + double gammaskbl; + double slomaskbl; + double lapmaskbl; + int shadmaskbl; + int shadmaskblsha; + double strumaskbl; + std::vector Lmaskblcurve; + std::vector LLmaskblcurvewav; + Threshold csthresholdblur; + // Tone Mapping + bool visitonemap; + bool exptonemap; + int complextonemap; + double stren; + double gamma; + double estop; + double scaltm; + double repartm; + int rewei; + double satur; + int sensitm; + double softradiustm; + double amount; + bool equiltm; + std::vector CCmasktmcurve; + std::vector LLmasktmcurve; + std::vector HHmasktmcurve; + bool enatmMask; + bool enatmMaskaft; + int blendmasktm; + double radmasktm; + double chromasktm; + double gammasktm; + double slomasktm; + double lapmasktm; + std::vector Lmasktmcurve; + double recothrest; + double lowthrest; + double higthrest; + double decayt; + // Retinex + bool visireti; + bool expreti; + int complexreti; + Glib::ustring retinexMethod; // low, uni, high + double str; + double chrrt; + double neigh; + double vart; + double offs; + int dehaz; + int depth; + int sensih; + std::vector localTgaincurve; + std::vector localTtranscurve; + bool inversret; + bool equilret; + bool loglin; + double dehazeSaturation; + double softradiusret; + std::vector CCmaskreticurve; + std::vector LLmaskreticurve; + std::vector HHmaskreticurve; + bool enaretiMask; + bool enaretiMasktmap; + int blendmaskreti; + double radmaskreti; + double chromaskreti; + double gammaskreti; + double slomaskreti; + double lapmaskreti; + double scalereti; + double darkness; + double lightnessreti; + double limd; + double cliptm; + bool fftwreti; + std::vector Lmaskreticurve; + double recothresr; + double lowthresr; + double higthresr; + double decayr; + // Sharpening + bool visisharp; + bool expsharp; + int complexsharp; + int sharcontrast; + double sharradius; + int sharamount; + int shardamping; + int shariter; + double sharblur; + double shargam; + int sensisha; + bool inverssha; + // Local Contrast + bool visicontrast; + bool expcontrast; + int complexcontrast; + int lcradius; + double lcamount; + double lcdarkness; + double lclightness; + double sigmalc; + int levelwav; + double residcont; + double residsha; + double residshathr; + double residhi; + double residhithr; + double gamlc; + double residgam; + double residslop; + double residblur; + double levelblur; + double sigmabl; + double residchro; + double residcomp; + double sigma; + double offset; + double sigmadr; + double threswav; + double chromalev; + double chromablu; + double sigmadc; + double deltad; + double fatres; + double clarilres; + double claricres; + double clarisoft; + double sigmalc2; + double strwav; + double angwav; + double strengthw; + double sigmaed; + double radiusw; + double detailw; + double gradw; + double tloww; + double thigw; + double edgw; + double basew; + int sensilc; + double reparw; + bool fftwlc; + bool blurlc; + bool wavblur; + bool wavedg; + bool waveshow; + bool wavcont; + bool wavcomp; + bool wavgradl; + bool wavcompre; + bool origlc; + Glib::ustring localcontMethod; // loc, wav + Glib::ustring localedgMethod; // fir, sec, thr + Glib::ustring localneiMethod; // none, low, high + std::vector locwavcurve; + Threshold csthreshold; + std::vector loclevwavcurve; + std::vector locconwavcurve; + std::vector loccompwavcurve; + std::vector loccomprewavcurve; + std::vector locedgwavcurve; + std::vector CCmasklccurve; + std::vector LLmasklccurve; + std::vector HHmasklccurve; + bool enalcMask; + int blendmasklc; + double radmasklc; + double chromasklc; + std::vector Lmasklccurve; + double recothresw; + double lowthresw; + double higthresw; + double decayw; + // Contrast by detail levels + bool visicbdl; + bool expcbdl; + int complexcbdl; + double mult[6]; + double chromacbdl; + double threshold; + int sensicb; + double clarityml; + int contresid; + double softradiuscb; + bool enacbMask; + std::vector CCmaskcbcurve; + std::vector LLmaskcbcurve; + std::vector HHmaskcbcurve; + int blendmaskcb; + double radmaskcb; + double chromaskcb; + double gammaskcb; + double slomaskcb; + double lapmaskcb; + std::vector Lmaskcbcurve; + double recothrescb; + double lowthrescb; + double higthrescb; + double decaycb; + // Log encoding + bool visilog; + bool explog; + int complexlog; + bool autocompute; + double sourceGray; + double sourceabs; + double targabs; + double targetGray; + double catad; + double saturl; + double chroml; + double lightl; + double lightq; + double contl; + double contthres; + double contq; + double colorfl; + std::vector LcurveL; + bool Autogray; + bool fullimage; + double repar; + bool ciecam; + double blackEv; + double whiteEv; + double detail; + int sensilog; + Glib::ustring sursour; + Glib::ustring surround; + double baselog; + double strlog; + double anglog; + std::vector CCmaskcurveL; + std::vector LLmaskcurveL; + std::vector HHmaskcurveL; + bool enaLMask; + double blendmaskL; + double radmaskL; + double chromaskL; + std::vector LmaskcurveL; + double recothresl; + double lowthresl; + double higthresl; + double decayl; + + // mask + bool visimask; + int complexmask; + bool expmask; + int sensimask; + double blendmask; + double blendmaskab; + double softradiusmask; + bool enamask; + bool fftmask; + double blurmask; + double contmask; + std::vector CCmask_curve; + std::vector LLmask_curve; + std::vector HHmask_curve; + double strumaskmask; + bool toolmask; + double radmask; + double lapmask; + double chromask; + double gammask; + double slopmask; + double shadmask; + int str_mask; + int ang_mask; + std::vector HHhmask_curve; + std::vector Lmask_curve; + std::vector LLmask_curvewav; + Threshold csthresholdmask; + //ciecam + bool visicie; + bool expcie; + int complexcie; + double reparcie; + int sensicie; + bool Autograycie; + bool forcejz; + bool forcebw; + bool qtoj; + bool jabcie; + bool sigmoidqjcie; + bool logcie; + bool logjz; + bool sigjz; + bool sigq; + bool chjzcie; + double sourceGraycie; + double sourceabscie; + Glib::ustring sursourcie; + Glib::ustring modecie; + Glib::ustring modecam; + double saturlcie; + double rstprotectcie; + double chromlcie; + double huecie; + Glib::ustring toneMethodcie; + std::vector ciecurve; + Glib::ustring toneMethodcie2; + std::vector ciecurve2; + double chromjzcie; + double saturjzcie; + double huejzcie; + double softjzcie; + double strsoftjzcie; + double thrhjzcie; + std::vector jzcurve; + std::vector czcurve; + std::vector czjzcurve; + std::vector HHcurvejz; + std::vector CHcurvejz; + std::vector LHcurvejz; + double lightlcie; + double lightjzcie; + double lightqcie; + double contlcie; + double contjzcie; + double adapjzcie; + double jz100; + double pqremap; + double pqremapcam16; + double hljzcie; + double hlthjzcie; + double shjzcie; + double shthjzcie; + double radjzcie; + double sigmalcjz; + double clarilresjz; + double claricresjz; + double clarisoftjz; + std::vector locwavcurvejz; + Threshold csthresholdjz; + double contthrescie; + double blackEvjz; + double whiteEvjz; + double targetjz; + double sigmoidldacie; + double sigmoidthcie; + double sigmoidblcie; + double sigmoidldajzcie; + double sigmoidthjzcie; + double sigmoidbljzcie; + double contqcie; + double colorflcie; +/* + double lightlzcam; + double lightqzcam; + double contlzcam; + double contqzcam; + double contthreszcam; + double colorflzcam; + double saturzcam; + double chromzcam; +*/ + double targabscie; + double targetGraycie; + double catadcie; + double detailcie; + Glib::ustring surroundcie; + bool enacieMask; + std::vector CCmaskciecurve; + std::vector LLmaskciecurve; + std::vector HHmaskciecurve; + int blendmaskcie; + double radmaskcie; + double chromaskcie; + double lapmaskcie; + double gammaskcie; + double slomaskcie; + std::vector Lmaskciecurve; + double recothrescie; + double lowthrescie; + double higthrescie; + double decaycie; + + LocallabSpot(); + + bool operator ==(const LocallabSpot& other) const; + bool operator !=(const LocallabSpot& other) const; + }; + + static const double LABGRIDL_CORR_MAX; + static const double LABGRIDL_CORR_SCALE; + static const double LABGRIDL_DIRECT_SCALE; + + bool enabled; + int selspot; + std::vector spots; + + LocallabParams(); + + bool operator ==(const LocallabParams& other) const; + bool operator !=(const LocallabParams& other) const; +}; + /** * Parameters of the post-crop vignette filter */ @@ -1040,6 +1858,8 @@ struct ResizeParams { int dataspec; int width; int height; + int longedge; + int shortedge; bool allowUpscaling; ResizeParams(); @@ -1048,10 +1868,85 @@ struct ResizeParams { bool operator !=(const ResizeParams& other) const; }; +/** + * Parameters entry + */ +struct SpotEntry { + Coord sourcePos; + Coord targetPos; + int radius; + float feather; + float opacity; + + SpotEntry(); + float getFeatherRadius() const; + + bool operator ==(const SpotEntry& other) const; + bool operator !=(const SpotEntry& other) const; +}; + +/** + * Parameters of the dust removal tool + */ +struct SpotParams { + bool enabled; + std::vector entries; + + // the following constant can be used for experimentation before the final merge + static const short minRadius; + static const short maxRadius; + + SpotParams(); + + bool operator ==(const SpotParams& other) const; + bool operator !=(const SpotParams& other) const; +}; + + /** * Parameters of the color spaces used during the processing */ struct ColorManagementParams { + enum class WorkingTrc { + NONE, + CUSTOM, + BT709, + SRGB, + GAMMA_2_2, + GAMMA_1_8, + LINEAR + }; + + enum class Illuminant { + DEFAULT, + D41, + D50, + D55, + D60, + D65, + D80, + D120, + STDA, + TUNGSTEN_2000K, + TUNGSTEN_1500K + }; + + enum class Primaries { + DEFAULT, + SRGB, + ADOBE_RGB, + PRO_PHOTO, + REC2020, + ACES_P1, + WIDE_GAMUT, + ACES_P0, + BRUCE_RGB, + BETA_RGB, + BEST_RGB, + CUSTOM, + CUSTOM_GRID + }; + Glib::ustring inputProfile; bool toneCurve; bool applyLookTable; @@ -1060,15 +1955,36 @@ struct ColorManagementParams { int dcpIlluminant; Glib::ustring workingProfile; - Glib::ustring workingTRC; + WorkingTrc workingTRC; + Illuminant will; + Primaries wprim; double workingTRCGamma; double workingTRCSlope; + double redx; + double redy; + double grex; + double grey; + double blux; + double bluy; + double preser; + bool fbw; + bool gamut; + double labgridcieALow; + double labgridcieBLow; + double labgridcieAHigh; + double labgridcieBHigh; + double labgridcieGx; + double labgridcieGy; + double labgridcieWx; + double labgridcieWy; + RenderingIntent aRendIntent; Glib::ustring outputProfile; RenderingIntent outputIntent; bool outputBPC; static const Glib::ustring NoICMString; + static const Glib::ustring NoProfileString; ColorManagementParams(); @@ -1181,11 +2097,18 @@ private: struct WaveletParams { std::vector ccwcurve; + std::vector wavdenoise; + std::vector wavdenoiseh; + std::vector blcurve; + std::vector levelshc; std::vector opacityCurveRG; + //std::vector opacityCurveSH; std::vector opacityCurveBY; std::vector opacityCurveW; std::vector opacityCurveWL; std::vector hhcurve; + std::vector wavguidcurve; + std::vector wavhuecurve; std::vector Chcurve; std::vector wavclCurve; bool enabled; @@ -1199,30 +2122,67 @@ struct WaveletParams { int bluemed; int greenhigh; int bluehigh; + double ballum; + double sigm; + double levden; + double thrden; + double limden; + double balchrom; + double chromfi; + double chromco; + double mergeL; + double mergeC; + double softrad; + double softradend; + double strend; + int detend; + double thrend; bool lipst; bool avoid; + bool showmask; + bool oldsh; bool tmr; int strength; int balance; + double sigmafin; + double sigmaton; + double sigmacol; + double sigmadir; + double rangeab; + double protab; int iter; bool expcontrast; bool expchroma; int c[9]; int ch[9]; bool expedge; + bool expbl; bool expresid; bool expfinal; bool exptoning; bool expnoise; - + bool expclari; + double labgridALow; + double labgridBLow; + double labgridAHigh; + double labgridBHigh; + static const double LABGRID_CORR_MAX; + static const double LABGRID_CORR_SCALE; + static const double LABGRIDL_DIRECT_SCALE; int Lmethod; Glib::ustring CLmethod; Glib::ustring Backmethod; Glib::ustring Tilesmethod; + Glib::ustring complexmethod; + //Glib::ustring denmethod; + Glib::ustring mixmethod; + Glib::ustring slimethod; + Glib::ustring quamethod; Glib::ustring daubcoeffmethod; Glib::ustring CHmethod; Glib::ustring Medgreinf; + Glib::ustring ushamethod; Glib::ustring CHSLmethod; Glib::ustring EDmethod; Glib::ustring NPmethod; @@ -1230,10 +2190,17 @@ struct WaveletParams { Glib::ustring TMmethod; Glib::ustring Dirmethod; Glib::ustring HSmethod; + double sigma; + double offset; + double lowthr; int rescon; int resconH; int reschro; + int resblur; + int resblurc; double tmrs; + double edgs; + double scale; double gamma; int sup; double sky; @@ -1249,11 +2216,15 @@ struct WaveletParams { int edgeampli; int contrast; int edgrad; + double edgeffect; int edgval; int edgthresh; int thr; int thrH; + int radius; double skinprotect; + double chrwav; + double bluwav; Threshold hueskin; Threshold hueskin2; Threshold hllev; @@ -1265,6 +2236,8 @@ struct WaveletParams { Threshold level1noise; Threshold level2noise; Threshold level3noise; + Threshold leveldenoise; + Threshold levelsigm; WaveletParams(); @@ -1273,8 +2246,11 @@ struct WaveletParams { void getCurves( WavCurve& cCurve, - WavOpacityCurveRG& - opacityCurveLUTRG, + WavCurve& wavdenoise, + WavCurve& wavdenoiseh, + Wavblcurve& tCurve, + WavOpacityCurveRG& opacityCurveLUTRG, + WavOpacityCurveSH& opacityCurveLUTSH, WavOpacityCurveBY& opacityCurveLUTBY, WavOpacityCurveW& opacityCurveLUTW, WavOpacityCurveWL& opacityCurveLUTWL @@ -1315,7 +2291,7 @@ struct HSVEqualizerParams { }; /** - * Film simualtion params + * Film simulation params */ struct FilmSimulationParams { bool enabled; @@ -1342,9 +2318,9 @@ struct SoftLightParams { struct DehazeParams { bool enabled; int strength; + int saturation; bool showDepthMap; int depth; - bool luminance; DehazeParams(); @@ -1362,10 +2338,13 @@ struct RAWParams { struct BayerSensor { enum class Method { AMAZE, + AMAZEBILINEAR, AMAZEVNG4, RCD, + RCDBILINEAR, RCDVNG4, DCB, + DCBBILINEAR, DCBVNG4, LMMSE, IGV, @@ -1421,6 +2400,7 @@ struct RAWParams { bool pixelShiftShowMotionMaskOnly; bool pixelShiftHoleFill; bool pixelShiftMedian; + bool pixelShiftAverage; bool pixelShiftGreen; bool pixelShiftBlur; double pixelShiftSmoothFactor; @@ -1492,6 +2472,7 @@ struct RAWParams { Glib::ustring ff_file; bool ff_AutoSelect; + bool ff_FromMetaData; int ff_BlurRadius; Glib::ustring ff_BlurType; bool ff_AutoClipControl; @@ -1506,6 +2487,22 @@ struct RAWParams { // exposure before interpolation double expos; + struct PreprocessWB { + enum class Mode { + CAMERA = 0, + AUTO + }; + + Mode mode; + + PreprocessWB(); + + bool operator ==(const PreprocessWB& other) const; + bool operator !=(const PreprocessWB& other) const; + }; + + PreprocessWB preprocessWB; + bool hotPixelFilter; bool deadPixelFilter; int hotdeadpix_thresh; @@ -1528,6 +2525,28 @@ struct FilmNegativeParams { double greenExp; double blueRatio; + struct RGB { + float r, g, b; + + bool operator ==(const RGB& other) const; + bool operator !=(const RGB& other) const; + RGB operator *(const RGB& other) const; + }; + + RGB refInput; + RGB refOutput; + + enum class ColorSpace { + INPUT = 0, + WORKING + // TODO : add support for custom color profile + }; + + ColorSpace colorSpace; + + enum class BackCompat { CURRENT = 0, V1, V2 }; + BackCompat backCompat; + FilmNegativeParams(); bool operator ==(const FilmNegativeParams& other) const; @@ -1561,6 +2580,7 @@ public: EPDParams epd; ///< Edge Preserving Decomposition parameters FattalToneMappingParams fattal; ///< Fattal02 tone mapping SHParams sh; ///< Shadow/highlight enhancement parameters + ToneEqualizerParams toneEqualizer; ///< Tone equalizer parameters CropParams crop; ///< Crop parameters CoarseTransformParams coarse; ///< Coarse transformation (90, 180, 270 deg rotation, h/v flipping) parameters CommonTransformParams commonTrans; ///< Common transformation parameters (autofill) @@ -1569,12 +2589,14 @@ public: LensProfParams lensProf; ///< Lens correction profile parameters PerspectiveParams perspective; ///< Perspective correction parameters GradientParams gradient; ///< Gradient filter parameters + LocallabParams locallab; ///< Local lab parameters PCVignetteParams pcvignette; ///< Post-crop vignette filter parameters CACorrParams cacorrection; ///< Lens c/a correction parameters VignettingParams vignetting; ///< Lens vignetting correction parameters ChannelMixerParams chmixer; ///< Channel mixer parameters BlackWhiteParams blackwhite; ///< Black& White parameters ResizeParams resize; ///< Resize parameters + SpotParams spot; ///< Spot removal tool ColorManagementParams icm; ///< profiles/color spaces used during the image processing RAWParams raw; ///< RAW parameters before demosaicing WaveletParams wavelet; ///< Wavelet parameters diff --git a/rtengine/profilestore.cc b/rtengine/profilestore.cc index 7d937e736..5cc039187 100644 --- a/rtengine/profilestore.cc +++ b/rtengine/profilestore.cc @@ -17,6 +17,9 @@ * along with RawTherapee. If not, see . */ +#include +#include + #include #include @@ -508,7 +511,7 @@ void ProfileStore::dumpFolderList() printf ("\n"); } -PartialProfile *ProfileStore::loadDynamicProfile (const FramesMetaData *im) +PartialProfile *ProfileStore::loadDynamicProfile (const FramesMetaData *im, const Glib::ustring& filename) { if (storeState == STORESTATE_NOTINITIALIZED) { parseProfilesOnce(); @@ -521,7 +524,7 @@ PartialProfile *ProfileStore::loadDynamicProfile (const FramesMetaData *im) } for (auto rule : dynamicRules) { - if (rule.matches (im)) { + if (rule.matches (im, filename)) { if (settings->verbose) { printf ("found matching profile %s\n", rule.profilepath.c_str()); } diff --git a/rtengine/profilestore.h b/rtengine/profilestore.h index 8cd5d2608..d65c01751 100644 --- a/rtengine/profilestore.h +++ b/rtengine/profilestore.h @@ -210,7 +210,7 @@ public: void addListener (ProfileStoreListener *listener); void removeListener (ProfileStoreListener *listener); - rtengine::procparams::PartialProfile* loadDynamicProfile (const rtengine::FramesMetaData *im); + rtengine::procparams::PartialProfile* loadDynamicProfile (const rtengine::FramesMetaData *im, const Glib::ustring& filename); void dumpFolderList(); }; diff --git a/rtengine/rawflatfield.cc b/rtengine/rawflatfield.cc index cbc5e6bd6..22dbca852 100644 --- a/rtengine/rawflatfield.cc +++ b/rtengine/rawflatfield.cc @@ -263,7 +263,7 @@ void cfaboxblur(const float* const * riFlatFile, float* cfablur, int boxH, int b namespace rtengine { -void RawImageSource::processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, const float black[4]) +void RawImageSource::processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, array2D &rawData, const float black[4]) { // BENCHFUN std::unique_ptr cfablur(new float[H * W]); diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 4421e4af4..8478d56ab 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -20,7 +20,7 @@ namespace rtengine { -RawImage::RawImage( const Glib::ustring &name ) +RawImage::RawImage(const Glib::ustring &name) : data(nullptr) , prefilters(0) , filename(name) @@ -36,31 +36,31 @@ RawImage::RawImage( const Glib::ustring &name ) RawImage::~RawImage() { - if(ifp) { + if (ifp) { fclose(ifp); ifp = nullptr; } - if( image ) { + if (image) { free(image); } - if(allocation) { + if (allocation) { delete [] allocation; allocation = nullptr; } - if(float_raw_image) { + if (float_raw_image) { delete [] float_raw_image; float_raw_image = nullptr; } - if(data) { + if (data) { delete [] data; data = nullptr; } - if(profile_data) { + if (profile_data) { delete [] profile_data; profile_data = nullptr; } @@ -82,15 +82,38 @@ eSensorType RawImage::getSensorType() const /* Similar to dcraw scale_colors for coeff. calculation, but without actual pixels scaling. * need pixels in data[][] available */ -void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblack_, bool forceAutoWB) +void RawImage::get_colorsCoeff(float *pre_mul_, float *scale_mul_, float *cblack_, bool forceAutoWB) { + if (!pre_mul_ && !scale_mul_ && !forceAutoWB) { + // only black levels + if (isXtrans()) { + // for xtrans files dcraw stores black levels in cblack[6] .. cblack[41], but all are equal, so we just use cblack[6] + for (int c = 0; c < 4; c++) { + cblack_[c] = (float) this->get_cblack(6); + } + } else if ((this->get_cblack(4) + 1) / 2 == 1 && (this->get_cblack(5) + 1) / 2 == 1) { + for (int c = 0; c < 4; c++) { + cblack_[c] = this->get_cblack(c); + } + + for (int c = 0; c < 4; c++) { + cblack_[FC(c / 2, c % 2)] = this->get_cblack(6 + c / 2 % this->get_cblack(4) * this->get_cblack(5) + c % 2 % this->get_cblack(5)); + } + } else { + for (int c = 0; c < 4; c++) { + cblack_[c] = (float) this->get_cblack(c); + } + } + return; + } + unsigned sum[8], c; unsigned W = this->get_width(); unsigned H = this->get_height(); float val; double dsum[8], dmin, dmax; - if(isXtrans()) { + if (isXtrans()) { // for xtrans files dcraw stores black levels in cblack[6] .. cblack[41], but all are equal, so we just use cblack[6] for (int c = 0; c < 4; c++) { cblack_[c] = (float) this->get_cblack(6); @@ -100,6 +123,7 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac for (int c = 0; c < 4; c++) { cblack_[c] = this->get_cblack(c); } + for (int c = 0; c < 4; c++) { cblack_[FC(c / 2, c % 2)] = this->get_cblack(6 + c / 2 % this->get_cblack(4) * this->get_cblack(5) + c % 2 % this->get_cblack(5)); pre_mul_[c] = this->get_pre_mul(c); @@ -112,9 +136,10 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac } if (this->get_cam_mul(0) == -1 || forceAutoWB) { - if(!data) { // this happens only for thumbnail creation when get_cam_mul(0) == -1 + if (!data) { // this happens only for thumbnail creation when get_cam_mul(0) == -1 compress_image(0, false); } + memset(dsum, 0, sizeof dsum); constexpr float blackThreshold = 8.f; @@ -171,7 +196,7 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac } for (int c = 0; c < 4; c++) { - dsumthr[c] += sum[c]; + dsumthr[c] += static_cast(sum[c]); } skip_block2: @@ -194,11 +219,11 @@ skip_block2: } } - for(int c = 0; c < 4; c++) { - dsum[c] -= cblack_[c] * dsum[c + 4]; + for (int c = 0; c < 4; c++) { + dsum[c] -= static_cast(cblack_[c]) * dsum[c + 4]; } - } else if(isXtrans()) { + } else if (isXtrans()) { #ifdef _OPENMP #pragma omp parallel #endif @@ -241,7 +266,7 @@ skip_block2: } for (int c = 0; c < 8; c++) { - dsumthr[c] += sum[c]; + dsumthr[c] += static_cast(sum[c]); } skip_block3: @@ -313,8 +338,7 @@ skip_block: if (sum[0] && sum[1] && sum[2] && sum[3]) for (int c = 0; c < 4; c++) { pre_mul_[c] = (float) sum[c + 4] / sum[c]; - } - else if (this->get_cam_mul(0) && this->get_cam_mul(2)) { + } else if (this->get_cam_mul(0) && this->get_cam_mul(2)) { pre_mul_[0] = this->get_cam_mul(0); pre_mul_[1] = this->get_cam_mul(1); pre_mul_[2] = this->get_cam_mul(2); @@ -365,18 +389,14 @@ skip_block: } for (dmin = DBL_MAX, dmax = c = 0; c < 4; c++) { - if (dmin > pre_mul_[c]) { - dmin = pre_mul_[c]; - } - - if (dmax < pre_mul_[c]) { - dmax = pre_mul_[c]; - } + dmin = rtengine::min(dmin, pre_mul_[c]); + dmax = rtengine::max(dmax, pre_mul_[c]); } for (c = 0; c < 4; c++) { int sat = this->get_white(c) - cblack_[c]; - scale_mul_[c] = (pre_mul_[c] /= dmax) * 65535.0 / sat; + pre_mul_[c] /= static_cast(dmax); + scale_mul_[c] = pre_mul_[c] * 65535.f / sat; } if (settings->verbose) { @@ -387,41 +407,46 @@ skip_block: asn[c] = 0; } - if (asn[c] > dmax) { + if (asn[c] > static_cast(dmax)) { dmax = asn[c]; } } for (c = 0; c < 4; c++) { - asn[c] /= dmax; + asn[c] /= static_cast(dmax); } printf("cam_mul:[%f %f %f %f], AsShotNeutral:[%f %f %f %f]\n", - cam_mul[0], cam_mul[1], cam_mul[2], cam_mul[3], asn[0], asn[1], asn[2], asn[3]); + static_cast(cam_mul[0]), static_cast(cam_mul[1]), + static_cast(cam_mul[2]), static_cast(cam_mul[3]), + static_cast(asn[0]), static_cast(asn[1]), static_cast(asn[2]), static_cast(asn[3])); printf("pre_mul:[%f %f %f %f], scale_mul:[%f %f %f %f], cblack:[%f %f %f %f]\n", - pre_mul_[0], pre_mul_[1], pre_mul_[2], pre_mul_[3], - scale_mul_[0], scale_mul_[1], scale_mul_[2], scale_mul_[3], - cblack_[0], cblack_[1], cblack_[2], cblack_[3]); + static_cast(pre_mul_[0]), static_cast(pre_mul_[1]), + static_cast(pre_mul_[2]), static_cast(pre_mul_[3]), + static_cast(scale_mul_[0]), static_cast(scale_mul_[1]), + static_cast(scale_mul_[2]), static_cast(scale_mul_[3]), + static_cast(cblack_[0]), static_cast(cblack_[1]), + static_cast(cblack_[2]), static_cast(cblack_[3])); printf("rgb_cam:[ [ %f %f %f], [%f %f %f], [%f %f %f] ]%s\n", - rgb_cam[0][0], rgb_cam[1][0], rgb_cam[2][0], - rgb_cam[0][1], rgb_cam[1][1], rgb_cam[2][1], - rgb_cam[0][2], rgb_cam[1][2], rgb_cam[2][2], + static_cast(rgb_cam[0][0]), static_cast(rgb_cam[1][0]), static_cast(rgb_cam[2][0]), + static_cast(rgb_cam[0][1]), static_cast(rgb_cam[1][1]), static_cast(rgb_cam[2][1]), + static_cast(rgb_cam[0][2]), static_cast(rgb_cam[1][2]), static_cast(rgb_cam[2][2]), (!this->isBayer()) ? " (not bayer)" : ""); } } -int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, ProgressListener *plistener, double progressRange) +int RawImage::loadRaw(bool loadData, unsigned int imageNum, bool closeFile, ProgressListener *plistener, double progressRange) { ifname = filename.c_str(); image = nullptr; verbose = settings->verbose; oprof = nullptr; - if(!ifp) { - ifp = gfopen (ifname); // Maps to either file map or direct fopen + if (!ifp) { + ifp = gfopen(ifname); // Maps to either file map or direct fopen } else { - fseek (ifp, 0, SEEK_SET); + fseek(ifp, 0, SEEK_SET); } if (!ifp) { @@ -457,7 +482,7 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro return 2; } - if(!strcmp(make,"Fujifilm") && raw_height * raw_width * 2u != raw_size) { + if (!strcmp(make, "Fujifilm") && raw_height * raw_width * 2u != raw_size) { if (raw_width * raw_height * 7u / 4u == raw_size) { load_raw = &RawImage::fuji_14bit_load_raw; } else { @@ -477,13 +502,13 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro this->rotate_deg = 0; } - if( loadData ) { + if (loadData) { use_camera_wb = 1; shrink = 0; if (settings->verbose) { - printf ("Loading %s %s image from %s...\n", make, model, filename.c_str()); + printf("Loading %s %s image from %s...\n", make, model, filename.c_str()); } iheight = height; @@ -491,16 +516,15 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro if (filters || colors == 1) { raw_image = (ushort *) calloc ((static_cast(raw_height) + 7u) * static_cast(raw_width), 2); - merror (raw_image, "main()"); + merror(raw_image, "main()"); } // dcraw needs this global variable to hold pixel data 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; } + meta_data = (char *) (image + static_cast(height) * static_cast(width)); /* Issue 2467 if (setjmp (failure)) { @@ -511,7 +535,7 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro } */ // Load raw pixels data - fseek (ifp, data_offset, SEEK_SET); + fseek(ifp, data_offset, SEEK_SET); (this->*load_raw)(); if (!float_raw_image) { // apply baseline exposure only for float DNGs @@ -523,19 +547,28 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro } CameraConstantsStore* ccs = CameraConstantsStore::getInstance(); - CameraConst *cc = ccs->get(make, model); + const CameraConst *cc = ccs->get(make, model); + bool raw_crop_cc = false; + int orig_raw_width = width; + int orig_raw_height = height; if (raw_image) { - if (cc && cc->has_rawCrop()) { + orig_raw_width = raw_width; + orig_raw_height = raw_height; + + if (cc && cc->has_rawCrop(raw_width, raw_height)) { + raw_crop_cc = true; int lm, tm, w, h; - cc->get_rawCrop(lm, tm, w, h); - if(isXtrans()) { - shiftXtransMatrix(6 - ((top_margin - tm)%6), 6 - ((left_margin - lm)%6)); + cc->get_rawCrop(raw_width, raw_height, lm, tm, w, h); + + if (isXtrans()) { + shiftXtransMatrix(6 - ((top_margin - tm) % 6), 6 - ((left_margin - lm) % 6)); } else { - if(((int)top_margin - tm) & 1) { // we have an odd border difference + if (((int)top_margin - tm) & 1) { // we have an odd border difference filters = (filters << 4) | (filters >> 28); // left rotate filters by 4 bits } } + left_margin = lm; top_margin = tm; @@ -558,19 +591,20 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro } } - if (cc && cc->has_rawMask(0)) { - for (int i = 0; i < 8 && cc->has_rawMask(i); i++) { - cc->get_rawMask(i, mask[i][0], mask[i][1], mask[i][2], mask[i][3]); + if (cc && cc->has_rawMask(orig_raw_width, orig_raw_height, 0)) { + for (int i = 0; i < 2 && cc->has_rawMask(orig_raw_width, orig_raw_height, i); i++) { + cc->get_rawMask(orig_raw_width, orig_raw_height, i, mask[i][0], mask[i][1], mask[i][2], mask[i][3]); } } crop_masked_pixels(); - free (raw_image); + free(raw_image); raw_image = nullptr; } else { - if (get_maker() == "Sigma" && cc && cc->has_rawCrop()) { // foveon images + if (get_maker() == "Sigma" && cc && cc->has_rawCrop(width, height)) { // foveon images + raw_crop_cc = true; int lm, tm, w, h; - cc->get_rawCrop(lm, tm, w, h); + cc->get_rawCrop(width, height, lm, tm, w, h); left_margin = lm; top_margin = tm; @@ -593,8 +627,8 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro // Load embedded profile if (profile_length) { profile_data = new char[profile_length]; - fseek ( ifp, profile_offset, SEEK_SET); - fread ( profile_data, 1, profile_length, ifp); + fseek(ifp, profile_offset, SEEK_SET); + fread(profile_data, 1, profile_length, ifp); } /* @@ -624,10 +658,10 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro 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()) { + if (tiff_bps > 0 && maximum_c4[i] > 0 && !isFoveon()) { unsigned compare = ((uint64_t)1 << tiff_bps) - 1; // use uint64_t to avoid overflow if tiff_bps == 32 - while(static_cast(maximum_c4[i]) > compare) { + while (static_cast(maximum_c4[i]) > compare) { maximum_c4[i] >>= 1; } } @@ -636,11 +670,10 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro } if (black_c4[0] == -1) { - if(isXtrans()) + if (isXtrans()) for (int c = 0; c < 4; c++) { black_c4[c] = cblack[6]; - } - else + } else // RT constants not set, bring in the DCRAW single channel black constant for (int c = 0; c < 4; c++) { @@ -667,16 +700,17 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro printf("no constants in camconst.json exists for \"%s %s\" (relying only on dcraw defaults)\n", make, model); } + printf("raw dimensions: %d x %d\n", orig_raw_width, orig_raw_height); printf("black levels: R:%d G1:%d B:%d G2:%d (%s)\n", get_cblack(0), get_cblack(1), get_cblack(2), get_cblack(3), black_from_cc ? "provided by camconst.json" : "provided by dcraw"); printf("white levels: R:%d G1:%d B:%d G2:%d (%s)\n", get_white(0), get_white(1), get_white(2), get_white(3), white_from_cc ? "provided by camconst.json" : "provided by dcraw"); - printf("raw crop: %d %d %d %d (provided by %s)\n", left_margin, top_margin, iwidth, iheight, (cc && cc->has_rawCrop()) ? "camconst.json" : "dcraw"); + printf("raw crop: %d %d %d %d (provided by %s)\n", left_margin, top_margin, iwidth, iheight, raw_crop_cc ? "camconst.json" : "dcraw"); printf("color matrix provided by %s\n", (cc && cc->has_dcrawMatrix()) ? "camconst.json" : "dcraw"); } } - if ( closeFile ) { + if (closeFile) { fclose(ifp); ifp = nullptr; } @@ -690,7 +724,7 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro float** RawImage::compress_image(unsigned int frameNum, bool freeImage) { - if( !image ) { + if (!image) { return nullptr; } @@ -726,7 +760,7 @@ float** RawImage::compress_image(unsigned int frameNum, bool freeImage) } // copy pixel raw data: the compressed format earns space - if( float_raw_image ) { + if (float_raw_image) { #ifdef _OPENMP #pragma omp parallel for #endif @@ -782,50 +816,51 @@ float** RawImage::compress_image(unsigned int frameNum, bool freeImage) } } - if(freeImage) { + if (freeImage) { free(image); // we don't need this anymore image = nullptr; } + return data; } bool RawImage::is_supportedThumb() const { - return ( (thumb_width * thumb_height) > 0 && - ( write_thumb == &rtengine::RawImage::jpeg_thumb || - write_thumb == &rtengine::RawImage::ppm_thumb) && - !thumb_load_raw ); + return ((thumb_width * thumb_height) > 0 && + (write_thumb == &rtengine::RawImage::jpeg_thumb || + write_thumb == &rtengine::RawImage::ppm_thumb) && + !thumb_load_raw); } bool RawImage::is_jpegThumb() const { - return ( (thumb_width * thumb_height) > 0 && - write_thumb == &rtengine::RawImage::jpeg_thumb && - !thumb_load_raw ); + return ((thumb_width * thumb_height) > 0 && + write_thumb == &rtengine::RawImage::jpeg_thumb && + !thumb_load_raw); } bool RawImage::is_ppmThumb() const { - return ( (thumb_width * thumb_height) > 0 && - write_thumb == &rtengine::RawImage::ppm_thumb && - !thumb_load_raw ); + return ((thumb_width * thumb_height) > 0 && + write_thumb == &rtengine::RawImage::ppm_thumb && + !thumb_load_raw); } -void RawImage::getXtransMatrix( int XtransMatrix[6][6]) +void RawImage::getXtransMatrix(int XtransMatrix[6][6]) { - for(int row = 0; row < 6; row++) - for(int col = 0; col < 6; col++) { + for (int row = 0; row < 6; row++) + for (int col = 0; col < 6; col++) { XtransMatrix[row][col] = xtrans[row][col]; } } -void RawImage::getRgbCam (float rgbcam[3][4]) +void RawImage::getRgbCam(float rgbcam[3][4]) { - for(int row = 0; row < 3; row++) - for(int col = 0; col < 4; col++) { + for (int row = 0; row < 3; row++) + for (int col = 0; col < 4; col++) { rgbcam[row][col] = rgb_cam[row][col]; } @@ -849,42 +884,18 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is short trans[12]; // set first value to 0 for no change } table[] = { - { - "Canon EOS 5D Mark III", -1, 0x3a98, /* RT */ - { 6722, -635, -963, -4287, 12460, 2028, -908, 2162, 5668 } - }, { "Canon EOS 5D", -1, 0xe6c, /* RT */ { 6319, -793, -614, -5809, 13342, 2738, -1132, 1559, 7971 } }, - { - "Canon EOS 6D", -1, 0x3c82, - { 7034, -804, -1014, -4420, 12564, 2058, -851, 1994, 5758 } - }, - { - "Canon EOS 7D", -1, 0x3510, /* RT - Colin Walker */ - { 5962, -171, -732, -4189, 12307, 2099, -911, 1981, 6304 } - }, { "Canon EOS 20D", -1, 0xfff, /* RT */ { 7590, -1646, -673, -4697, 12411, 2568, -627, 1118, 7295 } }, - { - "Canon EOS 40D", -1, 0x3f60, /* RT */ - { 6070, -531, -883, -5763, 13647, 2315, -1533, 2582, 6801 } - }, - { - "Canon EOS 60D", -1, 0x2ff7, /* RT - Colin Walker */ - { 5678, -179, -718, -4389, 12381, 2243, -869, 1819, 6380 } - }, { "Canon EOS 450D", -1, 0x390d, /* RT */ { 6246, -1272, -523, -5075, 12357, 3075, -1035, 1825, 7333 } }, - { - "Canon EOS 550D", -1, 0x3dd7, /* RT - Lebedev*/ - { 6519, -772, -703, -4994, 12737, 2519, -1387, 2492, 6175 } - }, { "Canon EOS-1D Mark III", 0, 0x3bb0, /* RT */ { 7406, -1592, -646, -4856, 12457, 2698, -432, 726, 7921 } @@ -893,18 +904,10 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is "Canon PowerShot G10", -1, -1, /* RT */ { 12535, -5030, -796, -2711, 10134, 3006, -413, 1605, 5264 } }, - { - "Canon PowerShot G12", -1, -1, /* RT */ - { 12222, -4097, -1380, -2876, 11016, 2130, -888, 1630, 4434 } - }, - - { "Fujifilm X100", -1, -1, /* RT - Colin Walker */ { 10841, -3288, -807, -4652, 12552, 2344, -642, 1355, 7206 } }, - - { "Nikon D200", -1, 0xfbc, /* RT */ { 8498, -2633, -295, -5423, 12869, 2860, -777, 1077, 8124 } @@ -917,32 +920,14 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is "Nikon D3100", -1, -1, /* RT */ { 7729, -2212, -481, -5709, 13148, 2858, -1295, 1908, 8936 } }, - { - "Nikon D3S", -1, -1, /* RT */ - { 8792, -2663, -344, -5221, 12764, 2752, -1491, 2165, 8121 } - }, { "Nikon D5200", -1, -1, // color matrix copied from D5200 DNG D65 matrix { 8322, -3112, -1047, -6367, 14342, 2179, -988, 1638, 6394 } }, - { - "Nikon D7000", -1, -1, /* RT - Tanveer(tsk1979) */ - { 7530, -1942, -255, -4318, 11390, 3362, -926, 1694, 7649 } - }, { "Nikon D7100", -1, -1, // color matrix and WP copied from D7100 DNG D65 matrix { 8322, -3112, -1047, -6367, 14342, 2179, -988, 1638, 6394 } }, - { - "Nikon D700", -1, -1, /* RT */ - { 8364, -2503, -352, -6307, 14026, 2492, -1134, 1512, 8156 } - }, - { - "Nikon COOLPIX A", -1, 0x3e00, // color matrix and WP copied from "COOLPIX A" DNG D65 matrix - { 8198, -2239, -724, -4871, 12389, 2798, -1043, 205, 7181 } - }, - - { "Olympus E-30", -1, 0xfbc, /* RT - Colin Walker */ { 8510, -2355, -693, -4819, 12520, 2578, -1029, 2067, 7752 } @@ -983,69 +968,14 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is "Olympus XZ-1", -1, -1, /* RT - Colin Walker */ { 8665, -2247, -762, -2424, 10372, 2382, -1011, 2286, 5189 } }, - - - /* since Dcraw_v9.21 Panasonic BlackLevel is read from exif (tags 0x001c BlackLevelRed, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue - and we define here the needed offset of around 15. The total BL is BL + BLoffset (cblack + black) */ - - { - "Panasonic DMC-FZ150", 15, 0xfd2, /* RT */ - { 10435, -3208, -72, -2293, 10506, 2067, -486, 1725, 4682 } - }, - { - "Panasonic DMC-G10", 15, 0xf50, /* RT - Colin Walker - variable WL 3920 - 4080 */ - { 8310, -1811, -960, -4941, 12990, 2151, -1378, 2468, 6860 } - }, - { - "Panasonic DMC-G1", 15, 0xf50, /* RT - Colin Walker - variable WL 3920 - 4080 */ - { 7477, -1615, -651, -5016, 12769, 2506, -1380, 2475, 7240 } - }, - { - "Panasonic DMC-G2", 15, 0xf50, /* RT - Colin Walker - variable WL 3920 - 4080 */ - { 8310, -1811, -960, -4941, 12990, 2151, -1378, 2468, 6860 } - }, - { - "Panasonic DMC-G3", 15, 0xfdc, /* RT - Colin Walker - WL 4060 */ - { 6051, -1406, -671, -4015, 11505, 2868, -1654, 2667, 6219 } - }, - { - "Panasonic DMC-G5", 15, 0xfdc, /* RT - WL 4060 */ - { 7122, -2092, -419, -4643, 11769, 3283, -1363, 2413, 5944 } - }, - { - "Panasonic DMC-GF1", 15, 0xf50, /* RT - Colin Walker - Variable WL 3920 - 4080 */ - { 7863, -2080, -668, -4623, 12331, 2578, -1020, 2066, 7266 } - }, - { - "Panasonic DMC-GF2", 15, 0xfd2, /* RT - Colin Walker - WL 4050 */ - { 7694, -1791, -745, -4917, 12818, 2332, -1221, 2322, 7197 } - }, - { - "Panasonic DMC-GF3", 15, 0xfd2, /* RT - Colin Walker - WL 4050 */ - { 8074, -1846, -861, -5026, 12999, 2239, -1320, 2375, 7422 } - }, - { - "Panasonic DMC-GH1", 15, 0xf5a, /* RT - Colin Walker - variable WL 3930 - 4080 */ - { 6360, -1557, -375, -4201, 11504, 3086, -1378, 2518, 5843 } - }, - { - "Panasonic DMC-GH2", 15, 0xf5a, /* RT - Colin Walker - variable WL 3930 - 4080 */ -// { 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 } }, disabled due to problems with underwater WB - { 7780, -2410, -806, -3913, 11724, 2484, -1018, 2390, 5298 } - }, // dcraw original - { "Pentax K200D", -1, -1, /* RT */ { 10962, -4428, -542, -5486, 13023, 2748, -569, 842, 8390 } }, - - { "Leica Camera AG M9 Digital Camera", -1, -1, /* RT */ { 7181, -1706, -55, -3557, 11409, 2450, -621, 2072, 7533 } }, - - { "SONY NEX-3", 128 << dcraw_arw2_scaling_bugfix_shift, -1, /* RT - Colin Walker */ { 5145, -741, -123, -4915, 12310, 2945, -794, 1489, 6906 } @@ -1103,7 +1033,7 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is { // test if we have any information in the camera constants store, if so we take that. rtengine::CameraConstantsStore* ccs = rtengine::CameraConstantsStore::getInstance(); - rtengine::CameraConst *cc = ccs->get(make, model); + const rtengine::CameraConst *cc = ccs->get(make, model); if (cc) { if (RT_blacklevel_from_constant == ThreeValBool::T) { @@ -1125,8 +1055,10 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is } } - char name[strlen(make) + strlen(model) + 32]; - sprintf(name, "%s %s", make, model); + const std::size_t name_size = strlen(make) + strlen(model) + 32; + + char name[name_size]; + snprintf(name, name_size, "%s %s", make, model); for (size_t i = 0; i < sizeof table / sizeof(table[0]); i++) { if (strcasecmp(name, table[i].prefix) == 0) { diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 09aaed7ad..2b1cd2156 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -33,11 +33,11 @@ class RawImage: public DCraw { public: - explicit RawImage( const Glib::ustring &name ); + explicit RawImage(const Glib::ustring &name); ~RawImage(); - int loadRaw (bool loadData, unsigned int imageNum = 0, bool closeFile = true, ProgressListener *plistener = nullptr, double progressRange = 1.0); - void get_colorsCoeff( float* pre_mul_, float* scale_mul_, float* cblack_, bool forceAutoWB ); + int loadRaw(bool loadData, unsigned int imageNum = 0, bool closeFile = true, ProgressListener *plistener = nullptr, double progressRange = 1.0); + void get_colorsCoeff(float* pre_mul_, float* scale_mul_, float* cblack_, bool forceAutoWB); void set_prefilters() { if (isBayer() && get_colors() == 3) { @@ -55,6 +55,7 @@ public: 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 @@ -115,8 +116,8 @@ public: eSensorType getSensorType() const; - void getRgbCam (float rgbcam[3][4]); - void getXtransMatrix ( int xtransMatrix[6][6]); + void getRgbCam(float rgbcam[3][4]); + void getXtransMatrix(int xtransMatrix[6][6]); unsigned get_filters() const { return filters; @@ -137,7 +138,7 @@ public: return maximum; } } - unsigned short get_whiteSample( int r, int c ) const + unsigned short get_whiteSample(int r, int c) const { return white[r][c]; } @@ -171,13 +172,13 @@ public: return std::string(model); } - float get_cam_mul(int c )const + float get_cam_mul(int c)const { return cam_mul[c]; } - float get_pre_mul(int c )const + float get_pre_mul(int c)const { - if(std::isfinite(pre_mul[c])) { + if (std::isfinite(pre_mul[c])) { return pre_mul[c]; } else { std::cout << "Failure decoding '" << filename << "', please file a bug report including the raw file and the line below:" << std::endl; @@ -185,7 +186,7 @@ public: return 1.f; } } - float get_rgb_cam( int r, int c) const + float get_rgb_cam(int r, int c) const { return rgb_cam[r][c]; } @@ -244,11 +245,6 @@ public: return zero_is_bad == 1; } - bool isBayer() const - { - return (filters != 0 && filters != 9); - } - bool isXtrans() const { return filters == 9; @@ -258,6 +254,10 @@ public: { return float_raw_image; } + void set_filters(unsigned f) + { + filters = f; + } public: // dcraw functions @@ -267,7 +267,7 @@ public: } public: - bool ISRED (unsigned row, unsigned col) const + bool ISRED(unsigned row, unsigned col) const { return ((filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) == 0); } @@ -275,15 +275,15 @@ public: { return ((filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) == 1); } - bool ISBLUE (unsigned row, unsigned col) const + bool ISBLUE(unsigned row, unsigned col) const { return ((filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) == 2); } - unsigned FC (unsigned row, unsigned col) const + unsigned FC(unsigned row, unsigned col) const { return (filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3); } - bool ISXTRANSRED (unsigned row, unsigned col) const + bool ISXTRANSRED(unsigned row, unsigned col) const { return ((xtrans[(row) % 6][(col) % 6]) == 0); } @@ -291,16 +291,16 @@ public: { return ((xtrans[(row) % 6][(col) % 6]) == 1); } - bool ISXTRANSBLUE (unsigned row, unsigned col) const + bool ISXTRANSBLUE(unsigned row, unsigned col) const { return ((xtrans[(row) % 6][(col) % 6]) == 2); } - unsigned XTRANSFC (unsigned row, unsigned col) const + unsigned XTRANSFC(unsigned row, unsigned col) const { return (xtrans[(row) % 6][(col) % 6]); } - unsigned DNGVERSION ( ) const + unsigned DNGVERSION() const { return dng_version; } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 18fc18f58..06aa701e8 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ #include +#include #include #include "camconst.h" @@ -25,6 +26,7 @@ #include "dcp.h" #include "dfmanager.h" #include "ffmanager.h" +#include "iccmatrices.h" #include "iccstore.h" #include "imagefloat.h" #include "improcfun.h" @@ -32,16 +34,19 @@ #include "median.h" #include "mytime.h" #include "pdaflinesfilter.h" +#include "pixelsmap.h" #include "procparams.h" #include "rawimage.h" #include "rawimagesource_i.h" #include "rawimagesource.h" +#include "rescale.h" #include "rt_math.h" #include "rtengine.h" #include "rtlensfun.h" + #include "../rtgui/options.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP @@ -49,10 +54,6 @@ #endif #include "opthelper.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) namespace { @@ -101,7 +102,7 @@ void transLineFuji (const float* const red, const float* const green, const floa { // Fuji SuperCCD rotation + coarse rotation - int start = ABS(fw - i); + int start = std::abs(fw - i); int w = fw * 2 + 1; int h = (imheight - fw) * 2 + 1; int end = min(h + fw - i, w - fw + i); @@ -197,8 +198,8 @@ void transLineD1x (const float* const red, const float* const green, const float image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; } - if(i == 2 && oddHeight) { - int row = 2 * imheight; + if (i == 2 && oddHeight) { + row = 2 * imheight; for (int j = 0; j < imwidth; j++) { int col = imwidth - 1 - j; @@ -234,7 +235,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(row, col) = MAX(0.f, -0.0625f * (green[j] + image->g(row + 3, col)) + 0.5625f * (image->g(row - 1, col) + image->g(row + 1, col))); image->b(row, col) = MAX(0.f, -0.0625f * (blue[j] + image->b(row + 3, col)) + 0.5625f * (image->b(row - 1, col) + image->b(row + 1, col))); - if(clip) { + if (clip) { image->r(row, col) = MIN(image->r(row, col), rtengine::MAXVALF); image->g(row, col) = MIN(image->g(row, col), rtengine::MAXVALF); image->b(row, col) = MIN(image->b(row, col), rtengine::MAXVALF); @@ -245,7 +246,7 @@ void transLineD1x (const float* const red, const float* const green, const float break; case TR_R90: // rotate right - if( i == 0) { + if (i == 0) { for (int j = 0; j < imwidth; j++) { image->r(j, 2 * imheight - 1) = red[j]; image->g(j, 2 * imheight - 1) = green[j]; @@ -267,7 +268,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(j, col) = (green[j] + image->g(j, col + 1)) / 2; image->b(j, col) = (blue[j] + image->b(j, col + 1)) / 2; - if(oddHeight && i == 2) { + if (oddHeight && i == 2) { image->r(j, 2 * imheight) = (red[j] + image->r(j, 2 * imheight - 2)) / 2; image->g(j, 2 * imheight) = (green[j] + image->g(j, 2 * imheight - 2)) / 2; image->b(j, 2 * imheight) = (blue[j] + image->b(j, 2 * imheight - 2)) / 2; @@ -297,7 +298,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(j, col) = MAX(0.f, -0.0625f * (green[j] + image->g(j, col + 3)) + 0.5625f * (image->g(j, col - 1) + image->g(j, col + 1))); image->b(j, col) = MAX(0.f, -0.0625f * (blue[j] + image->b(j, col + 3)) + 0.5625f * (image->b(j, col - 1) + image->b(j, col + 1))); - if(clip) { + if (clip) { image->r(j, col) = MIN(image->r(j, col), rtengine::MAXVALF); image->g(j, col) = MIN(image->g(j, col), rtengine::MAXVALF); image->b(j, col) = MIN(image->b(j, col), rtengine::MAXVALF); @@ -329,7 +330,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(row, 2 * i - 3) = MAX(0.f, -0.0625f * (green[j] + image->g(row, 2 * i - 6)) + 0.5625f * (image->g(row, 2 * i - 2) + image->g(row, 2 * i - 4))); image->b(row, 2 * i - 3) = MAX(0.f, -0.0625f * (blue[j] + image->b(row, 2 * i - 6)) + 0.5625f * (image->b(row, 2 * i - 2) + image->b(row, 2 * i - 4))); - if(clip) { + if (clip) { image->r(row, 2 * i - 3) = MIN(image->r(row, 2 * i - 3), rtengine::MAXVALF); image->g(row, 2 * i - 3) = MIN(image->g(row, 2 * i - 3), rtengine::MAXVALF); image->b(row, 2 * i - 3) = MIN(image->b(row, 2 * i - 3), rtengine::MAXVALF); @@ -347,7 +348,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(row, 2 * i - 1) = MAX(0.f, -0.0625f * (green[j] + image->g(row, 2 * i - 4)) + 0.5625f * (image->g(row, 2 * i) + image->g(row, 2 * i - 2))); image->b(row, 2 * i - 1) = MAX(0.f, -0.0625f * (blue[j] + image->b(row, 2 * i - 4)) + 0.5625f * (image->b(row, 2 * i) + image->b(row, 2 * i - 2))); - if(clip) { + if (clip) { image->r(j, 2 * i - 1) = MIN(image->r(j, 2 * i - 1), rtengine::MAXVALF); image->g(j, 2 * i - 1) = MIN(image->g(j, 2 * i - 1), rtengine::MAXVALF); image->b(j, 2 * i - 1) = MIN(image->b(j, 2 * i - 1), rtengine::MAXVALF); @@ -385,7 +386,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(2 * i - 3, j) = MAX(0.f, -0.0625f * (green[j] + image->g(2 * i - 6, j)) + 0.5625f * (image->g(2 * i - 2, j) + image->g(2 * i - 4, j))); image->b(2 * i - 3, j) = MAX(0.f, -0.0625f * (blue[j] + image->b(2 * i - 6, j)) + 0.5625f * (image->b(2 * i - 2, j) + image->b(2 * i - 4, j))); - if(clip) { + if (clip) { image->r(2 * i - 3, j) = MIN(image->r(2 * i - 3, j), rtengine::MAXVALF); image->g(2 * i - 3, j) = MIN(image->g(2 * i - 3, j), rtengine::MAXVALF); image->b(2 * i - 3, j) = MIN(image->b(2 * i - 3, j), rtengine::MAXVALF); @@ -399,7 +400,7 @@ void transLineD1x (const float* const red, const float* const green, const float image->g(2 * i - 1, j) = MAX(0.f, -0.0625f * (green[j] + image->g(2 * i - 4, j)) + 0.5625f * (image->g(2 * i, j) + image->g(2 * i - 2, j))); image->b(2 * i - 1, j) = MAX(0.f, -0.0625f * (blue[j] + image->b(2 * i - 4, j)) + 0.5625f * (image->b(2 * i, j) + image->b(2 * i - 2, j))); - if(clip) { + if (clip) { image->r(2 * i - 1, j) = MIN(image->r(2 * i - 1, j), rtengine::MAXVALF); image->g(2 * i - 1, j) = MIN(image->g(2 * i - 1, j), rtengine::MAXVALF); image->b(2 * i - 1, j) = MIN(image->b(2 * i - 1, j), rtengine::MAXVALF); @@ -425,12 +426,6 @@ void transLineD1x (const float* const red, const float* const green, const float namespace rtengine { -#undef ABS -#undef DIST - -#define ABS(a) ((a)<0?-(a):(a)) -#define DIST(a,b) (ABS(a-b)) - RawImageSource::RawImageSource () : ImageSource() , W(0), H(0) @@ -456,21 +451,25 @@ RawImageSource::RawImageSource () , initialGain(0.0) , camInitialGain(0.0) , defGain(0.0) + , camProfile(nullptr) , ri(nullptr) , rawData(0, 0) , green(0, 0) + , greenloc(0, 0) , red(0, 0) + , redloc(0, 0) , blue(0, 0) + , blueloc(0, 0) , greenCache(nullptr) , redCache(nullptr) , blueCache(nullptr) , rawDirty(true) , histMatchingParams(new procparams::ColorManagementParams) { - camProfile = nullptr; embProfile = nullptr; rgbSourceModified = false; - for(int i = 0; i < 4; ++i) { + + for (int i = 0; i < 4; ++i) { psRedBrightness[i] = psGreenBrightness[i] = psBlueBrightness[i] = 1.f; } } @@ -485,17 +484,14 @@ RawImageSource::~RawImageSource () delete greenCache; delete blueCache; - for(size_t i = 0; i < numFrames; ++i) { + for (size_t i = 0; i < numFrames; ++i) { delete riFrames[i]; } - for(size_t i = 0; i + 1 < numFrames; ++i) { + for (size_t i = 0; i + 1 < numFrames; ++i) { delete rawDataBuffer[i]; } - flushRGB(); - flushRawData(); - if (camProfile) { cmsCloseProfile (camProfile); } @@ -558,11 +554,11 @@ void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, sh = w; } - if( pp_width > sw - 2 * border) { + if (pp_width > sw - 2 * border) { pp_width = sw - 2 * border; } - if( pp_height > sh - 2 * border) { + if (pp_height > sh - 2 * border) { pp_height = sh - 2 * border; } @@ -602,16 +598,16 @@ void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, // atszamoljuk a koordinatakat fuji-ra: // recalculate the coordinates fuji-ra: ssx1 = (sx1 + sy1) / 2; - ssy1 = (sy1 - sx2 ) / 2 + ri->get_FujiWidth(); + ssy1 = (sy1 - sx2) / 2 + ri->get_FujiWidth(); int ssx2 = (sx2 + sy2) / 2 + 1; int ssy2 = (sy2 - sx1) / 2 + ri->get_FujiWidth(); - fw = (sx2 - sx1) / 2 / pp.getSkip(); - width = (ssx2 - ssx1) / pp.getSkip() + ((ssx2 - ssx1) % pp.getSkip() > 0); + fw = (sx2 - sx1) / 2 / pp.getSkip(); + width = (ssx2 - ssx1) / pp.getSkip() + ((ssx2 - ssx1) % pp.getSkip() > 0); height = (ssy2 - ssy1) / pp.getSkip() + ((ssy2 - ssy1) % pp.getSkip() > 0); } else { ssx1 = sx1; ssy1 = sy1; - width = (sx2 + 1 - sx1) / pp.getSkip() + ((sx2 + 1 - sx1) % 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); } } @@ -620,7 +616,7 @@ float calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const flo { if (isMono || colors == 1) { for (int c = 0; c < 4; c++) { - scale_mul[c] = 65535.0 / (c_white[c] - c_black[c]); + scale_mul[c] = 65535.f / (c_white[c] - c_black[c]); } } else { float pre_mul[4]; @@ -636,7 +632,7 @@ float calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const flo float maxpremul = max(pre_mul[0], pre_mul[1], pre_mul[2], pre_mul[3]); for (int c = 0; c < 4; c++) { - scale_mul[c] = (pre_mul[c] / maxpremul) * 65535.0 / (c_white[c] - c_black[c]); + scale_mul[c] = (pre_mul[c] / maxpremul) * 65535.f / (c_white[c] - c_black[c]); } } @@ -644,10 +640,110 @@ float calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const flo return gain; } -void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw ) +void RawImageSource::wbMul2Camera(double &rm, double &gm, double &bm) { - MyMutex::MyLock lock(getImageMutex); + double r = rm; + double g = gm; + double b = bm; + auto imatrices = getImageMatrices(); + + if (imatrices) { + double rr = imatrices->cam_rgb[0][0] * r + imatrices->cam_rgb[0][1] * g + imatrices->cam_rgb[0][2] * b; + double gg = imatrices->cam_rgb[1][0] * r + imatrices->cam_rgb[1][1] * g + imatrices->cam_rgb[1][2] * b; + double bb = imatrices->cam_rgb[2][0] * r + imatrices->cam_rgb[2][1] * g + imatrices->cam_rgb[2][2] * b; + r = rr; + g = gg; + b = bb; + } + + rm = ri->get_pre_mul(0) / r; + gm = ri->get_pre_mul(1) / g; + bm = ri->get_pre_mul(2) / b; + + rm /= gm; + bm /= gm; + gm = 1.0; +} + + +void RawImageSource::wbCamera2Mul(double &rm, double &gm, double &bm) +{ + auto imatrices = getImageMatrices(); + + double r = ri->get_pre_mul(0) / rm; + double g = ri->get_pre_mul(1) / gm; + double b = ri->get_pre_mul(2) / bm; + + if (imatrices) { + double rr = imatrices->rgb_cam[0][0] * r + imatrices->rgb_cam[0][1] * g + imatrices->rgb_cam[0][2] * b; + double gg = imatrices->rgb_cam[1][0] * r + imatrices->rgb_cam[1][1] * g + imatrices->rgb_cam[1][2] * b; + double bb = imatrices->rgb_cam[2][0] * r + imatrices->rgb_cam[2][1] * g + imatrices->rgb_cam[2][2] * b; + r = rr; + g = gg; + b = bb; + } + + rm = r / g; + bm = b / g; + gm = 1.0; +} + + + + +void RawImageSource::getWBMults (const ColorTemp &ctemp, const RAWParams &raw, std::array& out_scale_mul, float &autoGainComp, float &rm, float &gm, float &bm) const +{ + // compute channel multipliers + double r, g, b; + //float rm, gm, bm; + + if (ctemp.getTemp() < 0) { + // no white balance, ie revert the pre-process white balance to restore original unbalanced raw camera color + rm = ri->get_pre_mul(0); + gm = ri->get_pre_mul(1); + bm = ri->get_pre_mul(2); + } else { + ctemp.getMultipliers (r, g, b); + rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; + gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; + bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + } + + // adjust gain so the maximum raw value of the least scaled channel just hits max + const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; + float new_scale_mul[4]; + + bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) + || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); + + float c_white[4]; + for (int i = 0; i < 4; ++i) { + c_white[i] = (ri->get_white(i) - cblacksom[i]) / static_cast(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; + bm = new_scale_mul[2] / scale_mul[2] * gain; + //fprintf(stderr, "camera gain: %f, current wb gain: %f, diff in stops %f\n", camInitialGain, gain, log2(camInitialGain) - log2(gain)); + + const float expcomp = std::pow(2, ri->getBaselineExposure()); + rm *= expcomp; + gm *= expcomp; + bm *= expcomp; + + out_scale_mul[0] = scale_mul[0]; + out_scale_mul[1] = scale_mul[1]; + out_scale_mul[2] = scale_mul[2]; + out_scale_mul[3] = scale_mul[3]; + + autoGainComp = camInitialGain / initialGain; +} + +void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw, int opposed) +{// added int opposed to force getimage to use inpaint-opposed if enable, only once + MyMutex::MyLock lock(getImageMutex); tran = defTransform (tran); // compute channel multipliers @@ -660,7 +756,9 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima gm = ri->get_pre_mul(1); bm = ri->get_pre_mul(2); } else { - ctemp.getMultipliers (r, g, b); + // ctemp.getMultipliers (r, g, b); + r = g = b = 1; + wbCamera2Mul(r, g, b); rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; @@ -675,7 +773,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima || (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]; + c_white[i] = (ri->get_white(i) - cblacksom[i]) / static_cast(raw.expos) + cblacksom[i]; } float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); @@ -684,21 +782,21 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima bm = new_scale_mul[2] / scale_mul[2] * gain; //fprintf(stderr, "camera gain: %f, current wb gain: %f, diff in stops %f\n", camInitialGain, gain, log2(camInitialGain) - log2(gain)); } else { - // old scaling: used a fixed reference gain based on camera (as-shot) white balance - - // how much we need to scale each channel to get our new white balance - rm = refwb_red / rm; - gm = refwb_green / gm; - bm = refwb_blue / bm; - // normalize so larger multiplier becomes 1.0 - float minval = min(rm, gm, bm); - rm /= minval; - gm /= minval; - bm /= minval; - // multiply with reference gain, ie as-shot WB - rm *= camInitialGain; - gm *= camInitialGain; - bm *= camInitialGain; +// // old scaling: used a fixed reference gain based on camera (as-shot) white balance +// +// // how much we need to scale each channel to get our new white balance +// rm = refwb_red / rm; +// gm = refwb_green / gm; +// bm = refwb_blue / bm; +// // normalize so larger multiplier becomes 1.0 +// float minval = min(rm, gm, bm); +// rm /= minval; +// gm /= minval; +// bm /= minval; +// // multiply with reference gain, ie as-shot WB +// rm *= camInitialGain; +// gm *= camInitialGain; +// bm *= camInitialGain; } defGain = 0.0; @@ -745,22 +843,51 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima int maxx = this->W, maxy = this->H, skip = pp.getSkip(); - // raw clip levels after white balance + bool iscolor = (hrp.method == "Color" || hrp.method == "Coloropp"); + const bool doClip = (chmax[0] >= clmax[0] || chmax[1] >= clmax[1] || chmax[2] >= clmax[2]) && !hrp.hrenabled && hrp.clampOOG; + bool doHr = (hrp.hrenabled && !iscolor); + if (hrp.hrenabled && iscolor) { + if(hrp.method == "Coloropp" && opposed == 1) {//force Inpaint opposed if WB change, and opposed limited tne number to 1 + rgbSourceModified = false; + } + if (!rgbSourceModified) { + if(hrp.method == "Color") { + if (settings->verbose) { + printf ("Applying Highlight Recovery: Color propagation.\n"); + } + HLRecovery_inpaint (red, green, blue, hrp.hlbl); + } else if(hrp.method == "Coloropp" && ctemp.getTemp() >= 0) { + float s[3] = { rm, gm, bm }; + highlight_recovery_opposed(s, ctemp, hrp.hlth); + } + rgbSourceModified = true; + } + } + + // now apply the wb coefficients + if (ctemp.getTemp() >= 0) { + double r, g, b; + ctemp.getMultipliers(r, g, b); + wbMul2Camera(r, g, b); + + rm *= r; + gm *= g; + bm *= b; + } hlmax[0] = clmax[0] * rm; 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 && hrp.clampOOG; + const float expcomp = std::pow(2, ri->getBaselineExposure()); + rm *= expcomp; + gm *= expcomp; + bm *= expcomp; 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) @@ -779,7 +906,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima int i = sy1 + skip * ix; i = std::min(i, maxy - skip); // avoid trouble - if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) { + if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1 || ri->get_colors() == 3) { for (int j = 0, jx = sx1; j < imwidth; j++, jx += skip) { jx = std::min(jx, maxx - skip); // avoid trouble @@ -849,9 +976,9 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima hlRecovery (hrp.method, line_red, line_grn, line_blue, imwidth, hlmax); } - if(d1x) { + if (d1x) { transLineD1x (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight, d1xHeightOdd, doClip); - } else if(fuji) { + } else if (fuji) { transLineFuji (line_red, line_grn, line_blue, ix, image, tran, imheight, fw); } else { transLineStandard (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight); @@ -877,13 +1004,13 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima for (int i = 1; i < image->getHeight() - 1; i++) { for (int j = 2 - (a + i + 1) % 2; j < image->getWidth() - 1; j += 2) { // edge-adaptive interpolation - double dh = (ABS(image->r(i, j + 1) - image->r(i, j - 1)) + ABS(image->g(i, j + 1) - image->g(i, j - 1)) + ABS(image->b(i, j + 1) - image->b(i, j - 1))) / 1.0; - double dv = (ABS(image->r(i + 1, j) - image->r(i - 1, j)) + ABS(image->g(i + 1, j) - image->g(i - 1, j)) + ABS(image->b(i + 1, j) - image->b(i - 1, j))) / 1.0; - double eh = 1.0 / (1.0 + dh); - double ev = 1.0 / (1.0 + dv); - image->r(i, j) = (eh * (image->r(i, j + 1) + image->r(i, j - 1)) + ev * (image->r(i + 1, j) + image->r(i - 1, j))) / (2.0 * (eh + ev)); - image->g(i, j) = (eh * (image->g(i, j + 1) + image->g(i, j - 1)) + ev * (image->g(i + 1, j) + image->g(i - 1, j))) / (2.0 * (eh + ev)); - image->b(i, j) = (eh * (image->b(i, j + 1) + image->b(i, j - 1)) + ev * (image->b(i + 1, j) + image->b(i - 1, j))) / (2.0 * (eh + ev)); + float dh = (std::fabs(image->r(i, j + 1) - image->r(i, j - 1)) + std::fabs(image->g(i, j + 1) - image->g(i, j - 1)) + std::fabs(image->b(i, j + 1) - image->b(i, j - 1))); + float dv = (std::fabs(image->r(i + 1, j) - image->r(i - 1, j)) + std::fabs(image->g(i + 1, j) - image->g(i - 1, j)) + std::fabs(image->b(i + 1, j) - image->b(i - 1, j))); + float eh = 1.f / (1.f + dh); + float ev = 1.f / (1.f + dv); + image->r(i, j) = (eh * (image->r(i, j + 1) + image->r(i, j - 1)) + ev * (image->r(i + 1, j) + image->r(i - 1, j))) / (2.f * (eh + ev)); + image->g(i, j) = (eh * (image->g(i, j + 1) + image->g(i, j - 1)) + ev * (image->g(i + 1, j) + image->g(i - 1, j))) / (2.f * (eh + ev)); + image->b(i, j) = (eh * (image->b(i, j + 1) + image->b(i, j - 1)) + ev * (image->b(i + 1, j) + image->b(i - 1, j))) / (2.f * (eh + ev)); } // first pixel @@ -902,9 +1029,9 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } // last row - int b = (a == 1 && image->getHeight() % 2) || (a == 0 && image->getHeight() % 2 == 0); + int offset = (a == 1 && image->getHeight() % 2) || (a == 0 && image->getHeight() % 2 == 0); - for (int j = 1 + b; j < image->getWidth() - 1; j += 2) { + for (int j = 1 + offset; j < image->getWidth() - 1; j += 2) { image->r(image->getHeight() - 1, j) = (image->r(image->getHeight() - 2, j) + image->r(image->getHeight() - 1, j + 1) + image->r(image->getHeight() - 1, j - 1)) / 3; image->g(image->getHeight() - 1, j) = (image->g(image->getHeight() - 2, j) + image->g(image->getHeight() - 1, j + 1) + image->g(image->getHeight() - 1, j - 1)) / 3; image->b(image->getHeight() - 1, j) = (image->b(image->getHeight() - 2, j) + image->b(image->getHeight() - 1, j + 1) + image->b(image->getHeight() - 1, j - 1)) / 3; @@ -921,7 +1048,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } // Colour correction (only when running on full resolution) - if(pp.getSkip() == 1) { + if (pp.getSkip() == 1) { switch(ri->getSensorType()) { case ST_BAYER: processFalseColorCorrection (image, raw.bayersensor.ccSteps); @@ -1037,7 +1164,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) errCode = 0; - if(numFrames >= 7) { + if (numFrames >= 7) { // special case to avoid crash when loading Hasselblad H6D-100cMS pixelshift files // limit to 6 frames and skip first frame, as first frame is not bayer if (firstFrameOnly) { @@ -1053,8 +1180,8 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) #ifdef _OPENMP #pragma omp for nowait #endif - for(unsigned int i = 0; i < numFrames; ++i) { - if(i == 0) { + for (unsigned int i = 0; i < numFrames; ++i) { + if (i == 0) { riFrames[i] = ri; errCodeThr = riFrames[i]->loadRaw (true, i + 1, true, plistener, 0.8); } else { @@ -1069,7 +1196,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) errCode = errCodeThr ? errCodeThr : errCode; } } - } else if(numFrames > 1) { + } else if (numFrames > 1) { #ifdef _OPENMP #pragma omp parallel #endif @@ -1078,8 +1205,8 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) #ifdef _OPENMP #pragma omp for nowait #endif - for(unsigned int i = 0; i < numFrames; ++i) { - if(i == 0) { + for (unsigned int i = 0; i < numFrames; ++i) { + if (i == 0) { riFrames[i] = ri; errCodeThr = riFrames[i]->loadRaw (true, i, true, plistener, 0.8); } else { @@ -1099,16 +1226,16 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) errCode = riFrames[0]->loadRaw (true, 0, true, plistener, 0.8); } - if(!errCode) { - for(unsigned int i = 0; i < numFrames; ++i) { + if (!errCode) { + for (unsigned int i = 0; i < numFrames; ++i) { riFrames[i]->compress_image(i); } } else { return errCode; } - if(numFrames > 1 ) { // this disables multi frame support for Fuji S5 until I found a solution to handle different dimensions - if(riFrames[0]->get_width() != riFrames[1]->get_width() || riFrames[0]->get_height() != riFrames[1]->get_height()) { + if (numFrames > 1) { // this disables multi frame support for Fuji S5 until I found a solution to handle different dimensions + if (riFrames[0]->get_width() != riFrames[1]->get_width() || riFrames[0]->get_height() != riFrames[1]->get_height()) { numFrames = 1; } } @@ -1131,15 +1258,17 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) // first arg is matrix, second arg is inverse inverse33 (imatrices.rgb_cam, imatrices.cam_rgb); - d1x = ! ri->get_model().compare("D1X"); + d1x = ! ri->get_model().compare("D1X"); - if(ri->getSensorType() == ST_FUJI_XTRANS) { + if (ri->getSensorType() == ST_BAYER) { + border = 4; + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { border = 7; - } else if(ri->getSensorType() == ST_FOVEON) { + } else { border = 0; } - if ( ri->get_profile() ) { + if (ri->get_profile()) { embProfile = cmsOpenProfileFromMem (ri->get_profile(), ri->get_profileLen()); } @@ -1158,7 +1287,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) // 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 - ri->get_colorsCoeff( pre_mul, scale_mul, c_black, false);//modify for black level + ri->get_colorsCoeff(pre_mul, scale_mul, c_black, false);//modify for black level camInitialGain = 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]); double camwb_red = ri->get_pre_mul(0) / pre_mul[0]; @@ -1167,27 +1296,10 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) double cam_r = imatrices.rgb_cam[0][0] * camwb_red + imatrices.rgb_cam[0][1] * camwb_green + imatrices.rgb_cam[0][2] * camwb_blue; double cam_g = imatrices.rgb_cam[1][0] * camwb_red + imatrices.rgb_cam[1][1] * camwb_green + imatrices.rgb_cam[1][2] * camwb_blue; double cam_b = imatrices.rgb_cam[2][0] * camwb_red + imatrices.rgb_cam[2][1] * camwb_green + imatrices.rgb_cam[2][2] * camwb_blue; - camera_wb = ColorTemp (cam_r, cam_g, cam_b, 1.); // as shot WB - - ColorTemp ReferenceWB; - double ref_r, ref_g, ref_b; - { - // ...then we re-get the constants but now with auto which gives us better demosaicing and CA auto-correct - // performance for strange white balance settings (such as UniWB) - ri->get_colorsCoeff( ref_pre_mul, scale_mul, c_black, true); - refwb_red = ri->get_pre_mul(0) / ref_pre_mul[0]; - refwb_green = ri->get_pre_mul(1) / ref_pre_mul[1]; - refwb_blue = ri->get_pre_mul(2) / ref_pre_mul[2]; - initialGain = 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]); - ref_r = imatrices.rgb_cam[0][0] * refwb_red + imatrices.rgb_cam[0][1] * refwb_green + imatrices.rgb_cam[0][2] * refwb_blue; - ref_g = imatrices.rgb_cam[1][0] * refwb_red + imatrices.rgb_cam[1][1] * refwb_green + imatrices.rgb_cam[1][2] * refwb_blue; - ref_b = imatrices.rgb_cam[2][0] * refwb_red + imatrices.rgb_cam[2][1] * refwb_green + imatrices.rgb_cam[2][2] * refwb_blue; - ReferenceWB = ColorTemp (ref_r, ref_g, ref_b, 1.); - } + camera_wb = ColorTemp (cam_r, cam_g, cam_b, 1., ColorTemp::DEFAULT_OBSERVER); // as shot WB if (settings->verbose) { printf("Raw As Shot White balance: temp %f, tint %f\n", camera_wb.getTemp(), camera_wb.getGreen()); - printf("Raw Reference (auto) white balance: temp %f, tint %f, multipliers [%f %f %f | %f %f %f]\n", ReferenceWB.getTemp(), ReferenceWB.getGreen(), ref_r, ref_g, ref_b, refwb_red, refwb_blue, refwb_green); } /*{ @@ -1195,9 +1307,9 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) ColorTemp d50wb = ColorTemp(5000.0, 1.0, 1.0, "Custom"); double rm,gm,bm,r,g,b; d50wb.getMultipliers(r, g, b); - camwb_red = imatrices.cam_rgb[0][0]*r + imatrices.cam_rgb[0][1]*g + imatrices.cam_rgb[0][2]*b; + camwb_red = imatrices.cam_rgb[0][0]*r + imatrices.cam_rgb[0][1]*g + imatrices.cam_rgb[0][2]*b; camwb_green = imatrices.cam_rgb[1][0]*r + imatrices.cam_rgb[1][1]*g + imatrices.cam_rgb[1][2]*b; - camwb_blue = imatrices.cam_rgb[2][0]*r + imatrices.cam_rgb[2][1]*g + imatrices.cam_rgb[2][2]*b; + camwb_blue = imatrices.cam_rgb[2][0]*r + imatrices.cam_rgb[2][1]*g + imatrices.cam_rgb[2][2]*b; double pre_mul[3], dmax = 0; pre_mul[0] = ri->get_pre_mul(0) / camwb_red; pre_mul[1] = ri->get_pre_mul(1) / camwb_green; @@ -1220,7 +1332,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) initialGain = 1.0 / min(pre_mul[0], pre_mul[1], pre_mul[2]); }*/ - for(unsigned int i = 0;i < numFrames; ++i) { + for (unsigned int i = 0;i < numFrames; ++i) { riFrames[i]->set_prefilters(); } @@ -1242,7 +1354,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) plistener = nullptr; // This must be reset, because only load() is called through progressConnector t2.set(); - if( settings->verbose ) { + if (settings->verbose) { printf("Load %s: %d usec\n", fname.c_str(), t2.etime(t1)); } @@ -1257,31 +1369,53 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le MyTime t1, t2; t1.set(); - Glib::ustring newDF = raw.dark_frame; - RawImage *rid = nullptr; + { + // Recalculate the scaling coefficients, using auto WB if selected in the Preprocess WB param. + // Auto WB gives us better demosaicing and CA auto-correct performance for strange white balance settings (such as UniWB) + float dummy_cblk[4] = { 0.f }; // Avoid overwriting c_black, see issue #5676 + ri->get_colorsCoeff( ref_pre_mul, scale_mul, dummy_cblk, raw.preprocessWB.mode == RAWParams::PreprocessWB::Mode::AUTO); - if (!raw.df_autoselect) { - if( !raw.dark_frame.empty()) { - rid = dfm.searchDarkFrame( raw.dark_frame ); + refwb_red = ri->get_pre_mul(0) / ref_pre_mul[0]; + refwb_green = ri->get_pre_mul(1) / ref_pre_mul[1]; + refwb_blue = ri->get_pre_mul(2) / ref_pre_mul[2]; + initialGain = 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]); + + const double ref_r = imatrices.rgb_cam[0][0] * refwb_red + imatrices.rgb_cam[0][1] * refwb_green + imatrices.rgb_cam[0][2] * refwb_blue; + const double ref_g = imatrices.rgb_cam[1][0] * refwb_red + imatrices.rgb_cam[1][1] * refwb_green + imatrices.rgb_cam[1][2] * refwb_blue; + const double ref_b = imatrices.rgb_cam[2][0] * refwb_red + imatrices.rgb_cam[2][1] * refwb_green + imatrices.rgb_cam[2][2] * refwb_blue; + const ColorTemp ReferenceWB = ColorTemp (ref_r, ref_g, ref_b, 1., ColorTemp::DEFAULT_OBSERVER); + + if (settings->verbose) { + printf("Raw Reference white balance: temp %f, tint %f, multipliers [%f %f %f | %f %f %f]\n", ReferenceWB.getTemp(), ReferenceWB.getGreen(), ref_r, ref_g, ref_b, refwb_red, refwb_blue, refwb_green); } - } else { - rid = dfm.searchDarkFrame(idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); } - if( rid && settings->verbose) { - printf( "Subtracting Darkframe:%s\n", rid->get_filename().c_str()); + + Glib::ustring newDF = raw.dark_frame; + const RawImage* rid = nullptr; + + if (!raw.df_autoselect) { + if (!raw.dark_frame.empty()) { + rid = DFManager::getInstance().searchDarkFrame(raw.dark_frame); + } + } else { + rid = DFManager::getInstance().searchDarkFrame(idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); + } + + if (rid && settings->verbose) { + printf("Subtracting Darkframe:%s\n", rid->get_filename().c_str()); } std::unique_ptr bitmapBads; int totBP = 0; // Hold count of bad pixels to correct - if(ri->zeroIsBad()) { // mark all pixels with value zero as bad, has to be called before FF and DF. dcraw sets this flag only for some cameras (mainly Panasonic and Leica) + if (ri->zeroIsBad()) { // mark all pixels with value zero as bad, has to be called before FF and DF. dcraw sets this flag only for some cameras (mainly Panasonic and Leica) bitmapBads.reset(new PixelsMap(W, H)); - totBP = findZeroPixels(*(bitmapBads.get())); + totBP = findZeroPixels(*bitmapBads); - if( settings->verbose) { - printf( "%d pixels with value zero marked as bad pixels\n", totBP); + if (settings->verbose) { + printf("%d pixels with value zero marked as bad pixels\n", totBP); } } @@ -1289,28 +1423,27 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le RawImage *rif = nullptr; if (!raw.ff_AutoSelect) { - if( !raw.ff_file.empty()) { - rif = ffm.searchFlatField( raw.ff_file ); + if (!raw.ff_file.empty()) { + rif = ffm.searchFlatField(raw.ff_file); } } else { - rif = ffm.searchFlatField( idata->getMake(), idata->getModel(), idata->getLens(), idata->getFocalLen(), idata->getFNumber(), idata->getDateTimeAsTS()); + rif = ffm.searchFlatField(idata->getMake(), idata->getModel(), idata->getLens(), idata->getFocalLen(), idata->getFNumber(), idata->getDateTimeAsTS()); } - bool hasFlatField = (rif != nullptr); - if( hasFlatField && settings->verbose) { - printf( "Flat Field Correction:%s\n", rif->get_filename().c_str()); + if (hasFlatField && settings->verbose) { + printf("Flat Field Correction:%s\n", rif->get_filename().c_str()); } - if(numFrames == 4) { + if (numFrames == 4) { int bufferNumber = 0; - for(unsigned int i=0; i<4; ++i) { - if(i==currFrame) { + for (unsigned int i=0; i<4; ++i) { + if (i==currFrame) { copyOriginalPixels(raw, ri, rid, rif, rawData); rawDataFrames[i] = &rawData; } else { - if(!rawDataBuffer[bufferNumber]) { + if (!rawDataBuffer[bufferNumber]) { rawDataBuffer[bufferNumber] = new array2D; } rawDataFrames[i] = rawDataBuffer[bufferNumber]; @@ -1319,7 +1452,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } } } else if (numFrames == 2 && currFrame == 2) { // average the frames - if(!rawDataBuffer[0]) { + if (!rawDataBuffer[0]) { rawDataBuffer[0] = new array2D; } rawDataFrames[1] = rawDataBuffer[0]; @@ -1336,18 +1469,21 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } //FLATFIELD end + if (raw.ff_FromMetaData && isGainMapSupported()) { + applyDngGainMap(c_black, ri->getGainMaps()); + } // Always correct camera badpixels from .badpixels file - std::vector *bp = dfm.getBadPixels( ri->get_maker(), ri->get_model(), idata->getSerialNumber() ); + const std::vector *bp = DFManager::getInstance().getBadPixels(ri->get_maker(), ri->get_model(), idata->getSerialNumber()); - if( bp ) { - if(!bitmapBads) { + if (bp) { + if (!bitmapBads) { bitmapBads.reset(new PixelsMap(W, H)); } totBP += bitmapBads->set(*bp); - if( settings->verbose ) { + if (settings->verbose) { std::cout << "Correcting " << bp->size() << " pixels from .badpixels" << std::endl; } } @@ -1355,30 +1491,30 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le // If darkframe selected, correct hotpixels found on darkframe bp = nullptr; - if( raw.df_autoselect ) { - bp = dfm.getHotPixels(idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); - } else if( !raw.dark_frame.empty() ) { - bp = dfm.getHotPixels( raw.dark_frame ); + if (raw.df_autoselect) { + bp = DFManager::getInstance().getHotPixels(idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); + } else if (!raw.dark_frame.empty()) { + bp = DFManager::getInstance().getHotPixels(raw.dark_frame); } - if(bp) { - if(!bitmapBads) { + if (bp) { + if (!bitmapBads) { bitmapBads.reset(new PixelsMap(W, H)); } totBP += bitmapBads->set(*bp); - if( settings->verbose && !bp->empty()) { + if (settings->verbose && !bp->empty()) { std::cout << "Correcting " << bp->size() << " hotpixels from darkframe" << std::endl; } } - if(numFrames == 4) { - for(int i=0; i<4; ++i) { - scaleColors( 0, 0, W, H, raw, *rawDataFrames[i]); + if (numFrames == 4) { + for (int i=0; i<4; ++i) { + scaleColors(0, 0, W, H, raw, *rawDataFrames[i]); } } else { - scaleColors( 0, 0, W, H, raw, rawData); //+ + raw parameters for black level(raw.blackxx) + scaleColors(0, 0, W, H, raw, rawData); //+ + raw parameters for black level(raw.blackxx) } // Correct vignetting of lens profile @@ -1397,14 +1533,14 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if (pmap) { LensCorrection &map = *pmap; if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) { - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { map.processVignette(W, H, *rawDataFrames[i]); } } else { map.processVignette(W, H, rawData); } - } else if(ri->get_colors() == 3) { + } else if (ri->get_colors() == 3) { map.processVignette3Channels(W, H, rawData); } } @@ -1412,21 +1548,21 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le defGain = 0.0;//log(initialGain) / log(2.0); - if ( ri->getSensorType() == ST_BAYER && (raw.hotPixelFilter > 0 || raw.deadPixelFilter > 0)) { + if (ri->getSensorType() == ST_BAYER && (raw.hotPixelFilter > 0 || raw.deadPixelFilter > 0)) { if (plistener) { plistener->setProgressStr ("PROGRESSBAR_HOTDEADPIXELFILTER"); plistener->setProgress (0.0); } - if(!bitmapBads) { + if (!bitmapBads) { bitmapBads.reset(new PixelsMap(W, H)); } - int nFound = findHotDeadPixels(*(bitmapBads.get()), raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter ); + int nFound = findHotDeadPixels(*bitmapBads, raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter); totBP += nFound; - if( settings->verbose && nFound > 0) { - printf( "Correcting %d hot/dead pixels found inside image\n", nFound ); + if (settings->verbose && nFound > 0) { + printf("Correcting %d hot/dead pixels found inside image\n", nFound); } } @@ -1437,7 +1573,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le bitmapBads.reset(new PixelsMap(W, H)); } - int n = f.mark(rawData, *(bitmapBads.get())); + int n = f.mark(rawData, *bitmapBads); totBP += n; if (n > 0) { @@ -1461,17 +1597,17 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le [&]() -> bool { CameraConstantsStore *ccs = CameraConstantsStore::getInstance(); - CameraConst *cc = ccs->get(ri->get_maker().c_str(), ri->get_model().c_str()); + const 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 (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) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { green_equilibrate_global(*rawDataFrames[i]); } } else { @@ -1479,7 +1615,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } } - if ( ri->getSensorType() == ST_BAYER && raw.bayersensor.greenthresh > 0) { + if (ri->getSensorType() == ST_BAYER && raw.bayersensor.greenthresh > 0) { if (plistener) { plistener->setProgressStr ("PROGRESSBAR_GREENEQUIL"); plistener->setProgress (0.0); @@ -1487,8 +1623,8 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le GreenEqulibrateThreshold thresh(0.01 * raw.bayersensor.greenthresh); - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { green_equilibrate(thresh, *rawDataFrames[i]); } } else { @@ -1497,23 +1633,23 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } - if( totBP ) { - if ( ri->getSensorType() == ST_BAYER ) { - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { - interpolateBadPixelsBayer(*(bitmapBads.get()), *rawDataFrames[i]); + if (totBP) { + if (ri->getSensorType() == ST_BAYER) { + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { + interpolateBadPixelsBayer(*bitmapBads, *rawDataFrames[i]); } } else { - interpolateBadPixelsBayer(*(bitmapBads.get()), rawData); + interpolateBadPixelsBayer(*bitmapBads, rawData); } - } else if ( ri->getSensorType() == ST_FUJI_XTRANS ) { - interpolateBadPixelsXtrans(*(bitmapBads.get())); + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { + interpolateBadPixelsXtrans(*bitmapBads); } else { - interpolateBadPixelsNColours(*(bitmapBads.get()), ri->get_colors()); + interpolateBadPixelsNColours(*bitmapBads, ri->get_colors()); } } - if ( ri->getSensorType() == ST_BAYER && raw.bayersensor.linenoise > 0 ) { + if (ri->getSensorType() == ST_BAYER && raw.bayersensor.linenoise > 0) { if (plistener) { plistener->setProgressStr ("PROGRESSBAR_LINEDENOISE"); plistener->setProgress (0.0); @@ -1530,15 +1666,15 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le 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... + if ((raw.ca_autocorrect || std::fabs(raw.cared) > 0.001 || std::fabs(raw.cablue) > 0.001) && ri->getSensorType() == ST_BAYER) { // Auto CA correction disabled for X-Trans, for now... if (plistener) { plistener->setProgressStr ("PROGRESSBAR_RAWCACORR"); plistener->setProgress (0.0); } - if(numFrames == 4) { + if (numFrames == 4) { 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) { + 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); @@ -1547,7 +1683,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } } - if(prepareDenoise && dirpyrdenoiseExpComp == INFINITY) { + if (prepareDenoise && dirpyrdenoiseExpComp == RT_INFINITY) { LUTu aehist; int aehistcompr; double clip = 0; @@ -1558,7 +1694,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le t2.set(); - if( settings->verbose ) { + if (settings->verbose) { printf("Preprocessing: %d usec\n", t2.etime(t1)); } @@ -1573,16 +1709,19 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c t1.set(); if (ri->getSensorType() == ST_BAYER) { - if ( raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD) ) { + 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) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4)) { vng4_demosaic (rawData, red, green, blue); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AHD) ) { + } 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) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZE)) { 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) + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEBILINEAR) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBBILINEAR) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDBILINEAR) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4)) { if (!autoContrast) { double threshold = raw.bayersensor.dualDemosaicContrast; @@ -1590,9 +1729,9 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c } 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) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { 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) ) { + } 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)) { eahd_demosaic (); @@ -1600,21 +1739,21 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c igv_interpolate(W, H); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::LMMSE)) { lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST)) { fast_demosaic(); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO) ) { + } 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) ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCD)) { rcd_demosaic(options.chunkSizeRCD, options.measure); } else { nodemosaic(false); } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { - if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST) ) { + if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST)) { fast_xtrans_interpolate(rawData, red, green, blue); } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::ONE_PASS)) { xtrans_interpolate(1, false, options.chunkSizeXT, options.measure); - } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::THREE_PASS) ) { + } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::THREE_PASS)) { 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) { @@ -1623,7 +1762,7 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c } 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) ) { + } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) { nodemosaic(true); } else { nodemosaic(false); @@ -1631,13 +1770,15 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c } else if (ri->get_colors() == 1) { // Monochrome nodemosaic(true); + } else { + // RGB + nodemosaic(false); } t2.set(); rgbSourceModified = false; - if (cache) { if (!redCache) { redCache = new array2D(W, H); @@ -1681,7 +1822,7 @@ void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &c delete blueCache; blueCache = nullptr; } - if( settings->verbose ) { + if (settings->verbose) { if (getSensorType() == ST_BAYER) { printf("Demosaicing Bayer data: %s - %d usec\n", raw.bayersensor.method.c_str(), t2.etime(t1)); } else if (getSensorType() == ST_FUJI_XTRANS) { @@ -1703,31 +1844,29 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con LUTf *retinexgamtab = nullptr;//gamma before and after Retinex to restore tones LUTf lutTonereti; - if(retinexParams.gammaretinex == "low") { + if (retinexParams.gammaretinex == "low") { retinexgamtab = &(Color::gammatab_115_2); - } else if(retinexParams.gammaretinex == "mid") { + } else if (retinexParams.gammaretinex == "mid") { retinexgamtab = &(Color::gammatab_13_2); - } else if(retinexParams.gammaretinex == "hig") { + } else if (retinexParams.gammaretinex == "hig") { retinexgamtab = &(Color::gammatab_145_3); - } else if(retinexParams.gammaretinex == "fre") { + } else if (retinexParams.gammaretinex == "fre") { GammaValues g_a; double pwr = 1.0 / retinexParams.gam; double gamm = retinexParams.gam; double ts = retinexParams.slope; double gamm2 = retinexParams.gam; - if(gamm2 < 1.) { + if (gamm2 < 1.) { std::swap(pwr, gamm); } - int mode = 0; - Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope + Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope - // printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4); double start; double add; - if(gamm2 < 1.) { + if (gamm2 < 1.) { start = g_a[2]; add = g_a[4]; } else { @@ -1743,7 +1882,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con double val = (i) / 65535.; double x; - if(gamm2 < 1.) { + if (gamm2 < 1.) { x = Color::igammareti (val, gamm, start, ts, mul , add); } else { x = Color::gammareti (val, gamm, start, ts, mul , add); @@ -1772,15 +1911,15 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con printf("rr2=%f gg2=%f bb2=%f \n",rr,gg,bb); */ /* - if(retinexParams.highlig < 100 && retinexParams.retinexMethod == "highliplus") {//try to recover magenta...very difficult ! + if (retinexParams.highlig < 100 && retinexParams.retinexMethod == "highliplus") {//try to recover magenta...very difficult ! float hig = ((float)retinexParams.highlig)/100.f; float higgb = ((float)retinexParams.grbl)/100.f; #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { - for (int j = border; j < W - border; j++ ) { + for (int i = border; i < H - border; i++) { + for (int j = border; j < W - border; j++) { float R_,G_,B_; R_=red[i][j]; G_=green[i][j]; @@ -1788,20 +1927,20 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con //empirical method to find highlight magenta with no conversion RGB and no white balance //red = master Gr and Bl default higgb=0.5 - // if(R_>65535.f*hig && G_ > 65535.f*higgb && B_ > 65535.f*higgb) conversionBuffer[3][i - border][j - border] = R_; + // if (R_>65535.f*hig && G_ > 65535.f*higgb && B_ > 65535.f*higgb) conversionBuffer[3][i - border][j - border] = R_; // else conversionBuffer[3][i - border][j - border] = 0.f; } } } */ - if(retinexParams.gammaretinex != "none" && retinexParams.str != 0 && retinexgamtab) {//gamma + if (retinexParams.gammaretinex != "none" && retinexParams.str != 0 && retinexgamtab) {//gamma #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { - for (int j = border; j < W - border; j++ ) { + for (int i = border; i < H - border; i++) { + for (int j = border; j < W - border; j++) { float R_, G_, B_; R_ = red[i][j]; G_ = green[i][j]; @@ -1814,7 +1953,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con } } - if(useHsl) { + if (useHsl) { #ifdef _OPENMP #pragma omp parallel #endif @@ -1822,7 +1961,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con // one LUT per thread LUTu lhist16RETIThr; - if(lhist16RETI) + if (lhist16RETI) { lhist16RETIThr(lhist16RETI.getSize()); lhist16RETIThr.clear(); @@ -1835,7 +1974,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #pragma omp for #endif - for (int i = border; i < H - border; i++ ) + for (int i = border; i < H - border; i++) { int j = border; #ifdef __SSE2__ @@ -1849,9 +1988,9 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con STVFU(conversionBuffer[2][i - border][j - border], L); STVFU(conversionBuffer[3][i - border][j - border], H); - if(lhist16RETI) { - for(int p = 0; p < 4; p++) { - int pos = ( conversionBuffer[2][i - border][j - border + p]);//histogram in curve HSL + if (lhist16RETI) { + for (int p = 0; p < 4; p++) { + int pos = (conversionBuffer[2][i - border][j - border + p]);//histogram in curve HSL lhist16RETIThr[pos]++; } } @@ -1866,7 +2005,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con L *= 32768.f; conversionBuffer[2][i - border][j - border] = L; - if(lhist16RETI) { + if (lhist16RETI) { int pos = L; lhist16RETIThr[pos]++; } @@ -1876,7 +2015,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #ifdef _OPENMP #pragma omp critical { - if(lhist16RETI) + if (lhist16RETI) { lhist16RETI += lhist16RETIThr; // Add per Thread LUT to global LUT } @@ -1901,7 +2040,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con // one LUT per thread LUTu lhist16RETIThr; - if(lhist16RETI) { + if (lhist16RETI) { lhist16RETIThr(lhist16RETI.getSize()); lhist16RETIThr.clear(); } @@ -1910,7 +2049,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #pragma omp for schedule(dynamic,16) #endif - for (int i = border; i < H - border; i++ ) + for (int i = border; i < H - border; i++) for (int j = border; j < W - border; j++) { float X, Y, Z, L, aa, bb; //rgb=>lab @@ -1922,9 +2061,9 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con conversionBuffer[2][i - border][j - border] = L; conversionBuffer[3][i - border][j - border] = xatan2f(bb, aa); -// if(R_>40000.f && G_ > 30000.f && B_ > 30000.f) conversionBuffer[3][i - border][j - border] = R_; +// if (R_>40000.f && G_ > 30000.f && B_ > 30000.f) conversionBuffer[3][i - border][j - border] = R_; // else conversionBuffer[3][i - border][j - border] = 0.f; - if(lhist16RETI) { + if (lhist16RETI) { int pos = L; lhist16RETIThr[pos]++;//histogram in Curve Lab } @@ -1933,7 +2072,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con #ifdef _OPENMP #pragma omp critical { - if(lhist16RETI) { + if (lhist16RETI) { lhist16RETI += lhist16RETIThr; // Add per Thread LUT to global LUT } } @@ -1950,13 +2089,13 @@ void RawImageSource::retinexPrepareCurves(const RetinexParams &retinexParams, LU { useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN"); - if(useHsl) { - CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdHcurve, cdcurve, 1, lhist16RETI, histLRETI); + if (useHsl) { + retinexcontlutili = CurveFactory::diagonalCurve2Lut(retinexParams.cdHcurve, cdcurve, 1, lhist16RETI, histLRETI); } else { - CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdcurve, cdcurve, 1, lhist16RETI, histLRETI); + retinexcontlutili = CurveFactory::diagonalCurve2Lut(retinexParams.cdcurve, cdcurve, 1, lhist16RETI, histLRETI); } - CurveFactory::mapcurve(mapcontlutili, retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); + mapcontlutili = CurveFactory::diagonalCurve2Lut(retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); mapcurve *= 0.5f; retinexParams.getCurves(retinextransmissionCurve, retinexgaintransmissionCurve); } @@ -1975,31 +2114,30 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara LUTf *retinexigamtab = nullptr;//gamma before and after Retinex to restore tones - if(deh.gammaretinex == "low") { + if (deh.gammaretinex == "low") { retinexigamtab = &(Color::igammatab_115_2); - } else if(deh.gammaretinex == "mid") { + } else if (deh.gammaretinex == "mid") { retinexigamtab = &(Color::igammatab_13_2); - } else if(deh.gammaretinex == "hig") { + } else if (deh.gammaretinex == "hig") { retinexigamtab = &(Color::igammatab_145_3); - } else if(deh.gammaretinex == "fre") { + } else if (deh.gammaretinex == "fre") { GammaValues g_a; double pwr = 1.0 / deh.gam; double gamm = deh.gam; double gamm2 = gamm; double ts = deh.slope; - int mode = 0; - if(gamm2 < 1.) { + if (gamm2 < 1.) { std::swap(pwr, gamm); } - Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope + Color::calcGamma(pwr, ts, g_a); // call to calcGamma with selected gamma and slope double mul = 1. + g_a[4]; double add; double start; - if(gamm2 < 1.) { + if (gamm2 < 1.) { start = g_a[3]; add = g_a[3]; } else { @@ -2012,7 +2150,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara double val = (i) / 65535.; double x; - if(gamm2 < 1.) { + if (gamm2 < 1.) { x = Color::gammareti (val, gamm, start, ts, mul , add); } else { x = Color::igammareti (val, gamm, start, ts, mul , add); @@ -2034,7 +2172,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara LUTf dLcurve; LUTu hist16RET; - if(dehacontlutili && histLRETI) { + if (dehacontlutili && histLRETI) { hist16RET(32768); hist16RET.clear(); histLRETI.clear(); @@ -2066,7 +2204,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara // one LUT per thread LUTu hist16RETThr; - if(hist16RET) { + if (hist16RET) { hist16RETThr(hist16RET.getSize()); hist16RETThr.clear(); } @@ -2075,12 +2213,12 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp for #endif - for (int i = 0; i < H - 2 * border; i++ ) - if(dehacontlutili) + for (int i = 0; i < H - 2 * border; i++) + if (dehacontlutili) for (int j = 0; j < W - 2 * border; j++) { LBuffer[i][j] = cdcurve[2.f * temp[i][j]] / 2.f; - if(histLRETI) { + if (histLRETI) { int pos = LBuffer[i][j]; hist16RETThr[pos]++; //histogram in Curve } @@ -2094,13 +2232,13 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp critical #endif { - if(hist16RET) { + if (hist16RET) { hist16RET += hist16RETThr; // Add per Thread LUT to global LUT } } } - if(hist16RET) {//update histogram + if (hist16RET) {//update histogram // TODO : When rgbcurvesspeedup branch is merged into master, replace this by the following 1-liner // hist16RET.compressTo(histLRETI); // also remove declaration and init of dLcurve some lines above then and finally remove this comment :) @@ -2118,13 +2256,13 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara MSR(LBuffer, conversionBuffer[2], conversionBuffer[3], mapcurve, mapcontlutili, WNew, HNew, deh, dehatransmissionCurve, dehagaintransmissionCurve, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); - if(useHsl) { - if(chutili) { + if (useHsl) { + if (chutili) { #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { int j = border; for (; j < W - border; j++) { @@ -2140,7 +2278,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { int j = border; #ifdef __SSE2__ vfloat c32768 = F2V(32768.f); @@ -2188,7 +2326,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { #ifdef __SSE2__ // vectorized precalculation { @@ -2213,12 +2351,12 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara { float aa = conversionBuffer[0][i - border][j - border]; float bb = conversionBuffer[1][i - border][j - border]; - float Chprov1 = sqrt(SQR(aa) + SQR(bb)) / 327.68f; + float Chprov1 = std::sqrt(SQR(aa) + SQR(bb)) / 327.68f; sqrtBuffer[j - border] = Chprov1; float HH = xatan2f(bb, aa); atan2Buffer[j - border] = HH; - if(Chprov1 == 0.0f) { + if (Chprov1 == 0.0f) { sincosyBuffer[j - border] = 1.f; sincosxBuffer[j - border] = 0.0f; } else { @@ -2241,11 +2379,11 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #else float aa = conversionBuffer[0][i - border][j - border]; float bb = conversionBuffer[1][i - border][j - border]; - float Chprov1 = sqrt(SQR(aa) + SQR(bb)) / 327.68f; + float Chprov1 = std::sqrt(SQR(aa) + SQR(bb)) / 327.68f; float HH = xatan2f(bb, aa); float2 sincosval;// = xsincosf(HH); - if(Chprov1 == 0.0f) { + if (Chprov1 == 0.0f) { sincosval.y = 1.f; sincosval.x = 0.0f; } else { @@ -2255,21 +2393,14 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #endif - if(chutili) { // c=f(H) + if (chutili) { // c=f(H) float valp = float((chcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f)); Chprov1 *= (1.f + 2.f * valp); } float R, G, B; -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly(HH, sincosval, 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, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f); -#endif @@ -2283,8 +2414,8 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #ifdef __SSE2__ vfloat wipv[3][3]; - for(int i = 0; i < 3; i++) - for(int j = 0; j < 3; j++) { + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) { wipv[i][j] = F2V(wiprof[i][j]); } @@ -2293,7 +2424,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { + for (int i = border; i < H - border; i++) { int j = border; #ifdef __SSE2__ @@ -2327,13 +2458,13 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara delete chcurve; } - if(deh.gammaretinex != "none" && deh.str != 0) { //inverse gamma + if (deh.gammaretinex != "none" && deh.str != 0) { //inverse gamma #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = border; i < H - border; i++ ) { - for (int j = border; j < W - border; j++ ) { + for (int i = border; i < H - border; i++) { + for (int j = border; j < W - border; j++) { float R_, G_, B_; R_ = red[i][j]; G_ = green[i][j]; @@ -2346,24 +2477,24 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara } rgbSourceModified = false; // tricky handling for Color propagation - t5.set(); - if( settings->verbose ) { + if (settings->verbose) { printf("Retinex=%d usec\n", t5.etime(t4)); } } -void RawImageSource::flushRawData() +void RawImageSource::flush() { + for (size_t i = 0; i + 1 < numFrames; ++i) { + delete rawDataBuffer[i]; + rawDataBuffer[i] = nullptr; + } + if (rawData) { rawData(0, 0); } -} - -void RawImageSource::flushRGB() -{ if (green) { green(0, 0); } @@ -2375,32 +2506,46 @@ void RawImageSource::flushRGB() if (blue) { blue(0, 0); } + + if (greenloc) { + greenloc(0, 0); + } + + if (redloc) { + redloc(0, 0); + } + + if (blueloc) { + blueloc(0, 0); + } } void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) { - if (hrp.hrenabled && hrp.method == "Color") { - if(!rgbSourceModified) { - if (settings->verbose) { - printf ("Applying Highlight Recovery: Color propagation...\n"); - } - - HLRecovery_inpaint (red, green, blue); - rgbSourceModified = true; - } - } + // if (hrp.hrenabled && hrp.method == "Color") { + // if (!rgbSourceModified) { + // if (settings->verbose) { + // printf ("Applying Highlight Recovery: Color propagation...\n"); + // } +// + // HLRecovery_inpaint (red, green, blue, hrp.hlbl); +// +// rgbSourceModified = true; + // } +// } } /* Copy original pixel data and * subtract dark frame (if present) from current image and apply flat field correction (if present) */ -void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ) +void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, const RawImage *riDark, RawImage *riFlatFile, array2D &rawData) { - const float black[4] = { - static_cast(ri->get_cblack(0)), static_cast(ri->get_cblack(1)), - static_cast(ri->get_cblack(2)), static_cast(ri->get_cblack(3)) - }; + const auto tmpfilters = ri->get_filters(); + ri->set_filters(ri->prefilters); // we need 4 blacks for bayer processing + float black[4]; + ri->get_colorsCoeff(nullptr, nullptr, black, false); + ri->set_filters(tmpfilters); if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) { if (!rawData) { @@ -2414,9 +2559,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw #endif for (int row = 0; row < H; row++) { const int c0 = FC(row, 0); - const float black0 = black[(c0 == 1 && !(row & 1) ) ? 3 : c0]; + const float black0 = black[(c0 == 1 && !(row & 1)) ? 3 : c0]; const int c1 = FC(row, 1); - const float black1 = black[(c1 == 1 && !(row & 1) ) ? 3 : c1]; + const float black1 = black[(c1 == 1 && !(row & 1)) ? 3 : c1]; int col; for (col = 0; col < W - 1; col += 2) { rawData[row][col] = max(src->data[row][col] + black0 - riDark->data[row][col], 0.0f); @@ -2427,6 +2572,7 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } } else { + #ifdef _OPENMP #pragma omp parallel for #endif @@ -2440,7 +2586,7 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw if (riFlatFile && W == riFlatFile->get_width() && H == riFlatFile->get_height()) { - processFlatField(raw, riFlatFile, black); + processFlatField(raw, riFlatFile, rawData, black); } // flatfield } else if (ri->get_colors() == 1) { // Monochrome @@ -2462,7 +2608,7 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } if (riFlatFile && W == riFlatFile->get_width() && H == riFlatFile->get_height()) { - processFlatField(raw, riFlatFile, black); + processFlatField(raw, riFlatFile, rawData, black); } // flatfield } else { // No bayer pattern @@ -2474,8 +2620,8 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw if (riDark && W == riDark->get_width() && H == riDark->get_height()) { for (int row = 0; row < H; row++) { for (int col = 0; col < W; col++) { - int c = FC(row, col); - int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; + int c = FC(row, col); + int c4 = (c == 1 && !(row & 1)) ? 3 : c; rawData[row][3 * col + 0] = max(src->data[row][3 * col + 0] + black[c4] - riDark->data[row][3 * col + 0], 0.0f); rawData[row][3 * col + 1] = max(src->data[row][3 * col + 1] + black[c4] - riDark->data[row][3 * col + 1], 0.0f); rawData[row][3 * col + 2] = max(src->data[row][3 * col + 2] + black[c4] - riDark->data[row][3 * col + 2], 0.0f); @@ -2502,7 +2648,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R //adjust black level (eg Canon) bool isMono = false; - if (getSensorType() == ST_BAYER || getSensorType() == ST_FOVEON ) { + if (getSensorType() == ST_BAYER || getSensorType() == ST_FOVEON) { black_lev[0] = raw.bayersensor.black1; //R black_lev[1] = raw.bayersensor.black0; //G1 @@ -2520,8 +2666,8 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R isMono = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO) == raw.xtranssensor.method; } - for(int i = 0; i < 4 ; i++) { - cblacksom[i] = max( c_black[i] + black_lev[i], 0.0f ); // adjust black level + for (int i = 0; i < 4 ; i++) { + cblacksom[i] = max(c_black[i] + black_lev[i], 0.0f); // adjust black level } for (int i = 0; i < 4; ++i) { @@ -2531,7 +2677,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R 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]); - for(int i = 0; i < 4 ; i++) { + for (int i = 0; i < 4 ; i++) { clmax[i] = (c_white[i] - cblacksom[i]) * scale_mul[i]; // raw clip level } @@ -2539,7 +2685,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R // scale image colors - if( ri->getSensorType() == ST_BAYER) { + if (ri->getSensorType() == ST_BAYER) { #ifdef _OPENMP #pragma omp parallel #endif @@ -2553,8 +2699,8 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R for (int row = winy; row < winy + winh; row ++) { for (int col = winx; col < winx + winw; col++) { - const int c = FC(row, col); // three colors, 0=R, 1=G, 2=B - const int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; // four colors, 0=R, 1=G1, 2=B, 3=G2 + const int c = FC(row, col); // three colors, 0=R, 1=G, 2=B + const int c4 = (c == 1 && !(row & 1)) ? 3 : c; // four colors, 0=R, 1=G1, 2=B, 3=G2 const float val = max(0.f, rawData[row][col] - cblacksom[c4]) * scale_mul[c4]; rawData[row][col] = val; tmpchmax[c] = max(tmpchmax[c], val); @@ -2570,7 +2716,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R chmax[2] = max(tmpchmax[2], chmax[2]); } } - } else if ( ri->get_colors() == 1 ) { + } else if (ri->get_colors() == 1) { #ifdef _OPENMP #pragma omp parallel #endif @@ -2596,7 +2742,7 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R chmax[0] = chmax[1] = chmax[2] = chmax[3] = max(tmpchmax, chmax[0]); } } - } else if(ri->getSensorType() == ST_FUJI_XTRANS) { + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { #ifdef _OPENMP #pragma omp parallel #endif @@ -2916,7 +3062,7 @@ lab2ProphotoRgbD50(float L, float A, float B, float& r, float& g, float& b) float X; float Y; float Z; -#define CLIP01(a) ((a)>0?((a)<1?(a):1):0) + { // convert from Lab to XYZ float x, y, z, fx, fy, fz; @@ -2951,9 +3097,6 @@ 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); } // Converts raw image including ICC input profile to working space - floating point version @@ -3122,7 +3265,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen transform_via_pcs_lab = true; separate_pcs_lab_highlights = true; // We transform to Lab because we can and that we avoid getting an unnecessary unmatched gamma conversion which we would need to revert. - hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, nullptr, TYPE_Lab_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); + hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, nullptr, TYPE_Lab_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { @@ -3140,7 +3283,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen case CAMERA_ICC_TYPE_NIKON: case CAMERA_ICC_TYPE_GENERIC: default: - hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety + hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety break; } @@ -3149,7 +3292,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen if (hTransform == nullptr) { // Fallback: create transform from camera profile. Should not happen normally. lcmsMutex->lock (); - hTransform = cmsCreateTransform (camprofile, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); + hTransform = cmsCreateTransform (camprofile, TYPE_RGB_FLT, prophoto, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); lcmsMutex->unlock (); } @@ -3171,11 +3314,11 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen #pragma omp for schedule(static) #endif - for ( int h = 0; h < im->getHeight(); ++h ) { + for (int h = 0; h < im->getHeight(); ++h) { float *p = buffer.data, *pR = im->r(h), *pG = im->g(h), *pB = im->b(h); // Apply pre-processing - for ( int w = 0; w < im->getWidth(); ++w ) { + for (int w = 0; w < im->getWidth(); ++w) { float r = *(pR++); float g = *(pG++); float b = *(pB++); @@ -3258,7 +3401,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen pG = im->g(h); pB = im->b(h); - for ( int w = 0; w < im->getWidth(); ++w ) { + for (int w = 0; w < im->getWidth(); ++w) { float r, g, b, hr = 0.f, hg = 0.f, hb = 0.f; @@ -3325,9 +3468,9 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen // to a small space such as sRGB we may end up with negative values and values larger than max. if (!working_space_is_prophoto) { //convert from Prophoto to XYZ - float x = (toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b ) ; - float y = (toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b ) ; - float z = (toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b ) ; + float x = (toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b) ; + float y = (toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b) ; + float z = (toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b) ; //convert from XYZ to cmp.working (sRGB...Adobe...Wide..) r = ((torgb[0][0] * x + torgb[0][1] * y + torgb[0][2] * z)) ; g = ((torgb[1][0] * x + torgb[1][1] * y + torgb[1][2] * z)) ; @@ -3398,15 +3541,14 @@ 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) { + constexpr int ColorCount = 3; // Transform matrixes rgb>lab and back 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++) - - float minpt = min(hlmax[0], hlmax[1], hlmax[2]); //min of the raw clip points + float minpt = rtengine::min(hlmax[0], hlmax[1], hlmax[2]); //min of the raw clip points //float maxpt=max(hlmax[0],hlmax[1],hlmax[2]);//max of the raw clip points //float medpt=hlmax[0]+hlmax[1]+hlmax[2]-minpt-maxpt;//median of the raw clip points float maxave = (hlmax[0] + hlmax[1] + hlmax[2]) / 3; //ave of the raw clip points @@ -3416,7 +3558,9 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi const float satthresh = 0.5; float clip[3]; - FOREACHCOLOR clip[c] = min(maxave, hlmax[c]); + for (int c = 0; c < ColorCount; ++c) { + clip[c] = rtengine::min(maxave, hlmax[c]); + } // Determine the maximum level (clip) of all channels const float clippt = clipthresh * maxval; @@ -3433,20 +3577,20 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi rgb[2] = bin[col]; // If no channel is clipped, do nothing on pixel - int c; + int cc; - for (c = 0; c < ColorCount; c++) { - if (rgb[c] > clippt) { + for (cc = 0; cc < ColorCount; ++cc) { + if (rgb[cc] > clippt) { break; } } - if (c == ColorCount) { + if (cc == ColorCount) { continue; } // Initialize cam with raw input [0] and potentially clipped input [1] - FOREACHCOLOR { + for (int c = 0; c < ColorCount; ++c) { lratio += min(rgb[c], clip[c]); cam[0][c] = rgb[c]; cam[1][c] = min(cam[0][c], maxval); @@ -3454,7 +3598,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi // Calculate the lightness correction ratio (chratio) for (int i = 0; i < 2; i++) { - FOREACHCOLOR { + for (int c = 0; c < ColorCount; ++c) { lab[i][c] = 0; for (int j = 0; j < ColorCount; j++) @@ -3470,7 +3614,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi } } - chratio = (sqrt(sum[1] / sum[0])); + chratio = std::sqrt(sum[1] / sum[0]); // Apply ratio to lightness in LCH space for (int c = 1; c < ColorCount; c++) { @@ -3478,7 +3622,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi } // Transform back from LCH to RGB - FOREACHCOLOR { + for (int c = 0; c < ColorCount; ++c) { cam[0][c] = 0; for (int j = 0; j < ColorCount; j++) @@ -3486,7 +3630,9 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi cam[0][c] += itrans[c][j] * lab[0][j]; } } - FOREACHCOLOR rgb[c] = cam[0][c] / ColorCount; + for (int c = 0; c < ColorCount; ++c) { + rgb[c] = cam[0][c] / ColorCount; + } // Copy converted pixel back if (rin[col] > fixpt) { @@ -3540,7 +3686,7 @@ void RawImageSource::HLRecovery_Luminance (float* rin, float* gin, float* bin, f double Ho = 2 * bo - ro - go; if (r != g && g != b) { - double ratio = sqrt ((Co * Co + Ho * Ho) / (C * C + H * H)); + double ratio = std::sqrt ((Co * Co + Ho * Ho) / (C * C + H * H)); C *= ratio; H *= ratio; } @@ -3618,8 +3764,9 @@ void RawImageSource::HLRecovery_CIELab (float* rin, float* gin, float* bin, floa //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::hlRecovery (const std::string &method, float* red, float* green, float* blue, int width, float* hlmax ) +void RawImageSource::hlRecovery (const std::string &method, float* red, float* green, float* blue, int width, float* hlmax) { +// BENCHFUN if (method == "Luminance") { HLRecovery_Luminance (red, green, blue, red, green, blue, width, 65535.0); @@ -3659,8 +3806,8 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) if (ri->getSensorType() == ST_BAYER) { // precalculate factors to avoid expensive per pixel calculations - float refwb0 = refwb[ri->FC(i, start)]; - float refwb1 = refwb[ri->FC(i, start + 1)]; + float refwb0 = refwb[ri->FC(i, start)]; + float refwb1 = refwb[ri->FC(i, start + 1)]; int j; for (j = start; j < end - 1; j += 2) { @@ -3668,17 +3815,17 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) tmphistogram[(int)(refwb1 * rawData[i][j + 1])] += 4; } - if(j < end) { + if (j < end) { tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { // precalculate factors to avoid expensive per pixel calculations - float refwb0 = refwb[ri->XTRANSFC(i, start)]; - float refwb1 = refwb[ri->XTRANSFC(i, start + 1)]; - float refwb2 = refwb[ri->XTRANSFC(i, start + 2)]; - float refwb3 = refwb[ri->XTRANSFC(i, start + 3)]; - float refwb4 = refwb[ri->XTRANSFC(i, start + 4)]; - float refwb5 = refwb[ri->XTRANSFC(i, start + 5)]; + float refwb0 = refwb[ri->XTRANSFC(i, start)]; + float refwb1 = refwb[ri->XTRANSFC(i, start + 1)]; + float refwb2 = refwb[ri->XTRANSFC(i, start + 2)]; + float refwb3 = refwb[ri->XTRANSFC(i, start + 3)]; + float refwb4 = refwb[ri->XTRANSFC(i, start + 4)]; + float refwb5 = refwb[ri->XTRANSFC(i, start + 5)]; int j; for (j = start; j < end - 5; j += 6) { @@ -3754,7 +3901,7 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU #ifdef _OPENMP int numThreads; // reduce the number of threads under certain conditions to avoid overhead of too many critical regions - numThreads = sqrt((((H - 2 * border) * (W - 2 * border)) / 262144.f)); + numThreads = std::sqrt((((H - 2 * border) * (W - 2 * border)) / 262144.f)); numThreads = std::min(std::max(numThreads, 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) @@ -3788,23 +3935,23 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU if (ri->getSensorType() == ST_BAYER) { int j; int c1 = FC(i, start); - c1 = ( fourColours && c1 == 1 && !(i & 1) ) ? 3 : c1; + c1 = (fourColours && c1 == 1 && !(i & 1)) ? 3 : c1; int c2 = FC(i, start + 1); - c2 = ( fourColours && c2 == 1 && !(i & 1) ) ? 3 : c2; + c2 = (fourColours && c2 == 1 && !(i & 1)) ? 3 : c2; for (j = start; j < end - 1; j += 2) { 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 + if (j < end) { // last pixel of row if width is odd 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] * scale)]++; } - } else if(ri->getSensorType() == ST_FUJI_XTRANS) { + } 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] * scale)]++; @@ -3842,7 +3989,7 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU return f > 0.f ? (f < 1.f ? 1 : std::min(int(f), 255)) : 0; }; - for(int i = 0; i < histoSize; i++) { + for (int i = 0; i < histoSize; i++) { int idx = getidx(0, i); histRedRaw[idx] += hist[0][i]; @@ -3864,11 +4011,11 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU for (int i = 0; i < 256; i++) { histGreenRaw[i] >>= 1; } - else if(ri->getSensorType() == ST_FUJI_XTRANS) // since Xtrans has 2.5 as many greens, correct for it + else if (ri->getSensorType() == ST_FUJI_XTRANS) // since Xtrans has 2.5 as many greens, correct for it for (int i = 0; i < 256; i++) { histGreenRaw[i] = (histGreenRaw[i] * 2) / 5; } - else if(ri->get_colors() == 1) { // monochrome sensor => set all histograms equal + else if (ri->get_colors() == 1) { // monochrome sensor => set all histograms equal histGreenRaw += histRedRaw; histBlueRaw += histRedRaw; } @@ -3881,7 +4028,7 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) { if (fuji) { int fw = ri->get_FujiWidth(); - start = ABS(fw - x) + border; + start = std::abs(fw - x) + border; end = min(H + W - fw - x, fw + x) - border; } else { start = border; @@ -3889,8 +4036,2360 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) } } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) + +static void histoxyY_low(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, LUTf &xxx, LUTf &yyy, LUTf &YYY, LUTu &histxy) +{ + //calculate histogram x y in a range of 190 colors + //this "choice" are guided by generally colors who are in nature skin, sky, etc. in those cases "steps" are small + // of course we can change to be more precise +#ifdef _OPENMP + #pragma omp parallel +#endif + { + LUTu histxythr(histxy.getSize()); + histxythr.clear(); + LUTf xxxthr(xxx.getSize()); + xxxthr.clear(); + LUTf yyythr(yyy.getSize()); + yyythr.clear(); + LUTf YYYthr(YYY.getSize()); + YYYthr.clear(); +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 4) nowait +#endif + for (int y = 0; y < bfhitc ; y++) { + for (int x = 0; x < bfwitc ; x++) { + int nh = -1; + if (xc[y][x] < 0.12f && xc[y][x] > 0.03f && yc[y][x] > 0.1f) { // near Prophoto + if (yc[y][x] < 0.2f) { + nh = 0; + //blue hard + } else if (yc[y][x] < 0.3f) { + nh = 1; + //blue + } else if (yc[y][x] < 0.4f) { + nh = 2; + + } else if (yc[y][x] < 0.5f) { + //blue green + nh = 3; + } else if (yc[y][x] < 0.6f) { + nh = 4; + } else if (yc[y][x] < 0.82f) { + //green + nh = 5; + } + } else if (xc[y][x] < 0.24f && yc[y][x] > 0.05f) { + if (yc[y][x] < 0.2f) { + nh = 6; + } else if (yc[y][x] < 0.3f) { + nh = 7; + } else if (yc[y][x] < 0.4f) { + nh = 8; + } else if (yc[y][x] < 0.5f) { + nh = 9; + } else if (yc[y][x] < 0.6f) { + nh = 10; + } else if (yc[y][x] < 0.75f) { + nh = 11; + } + } else if (xc[y][x] < 0.28f && yc[y][x] > 0.1f) {//blue sky and other + if (yc[y][x] < 0.2f) { + nh = 12; + } else if (yc[y][x] < 0.25f) { + nh = 13; + } else if (yc[y][x] < 0.29f) { + nh = 14; + } else if (yc[y][x] < 0.33f) { + nh = 15; + } else if (yc[y][x] < 0.37f) { + nh = 16; + } else if (yc[y][x] < 0.4f) { + nh = 17; + } else if (yc[y][x] < 0.45f) { + nh = 18; + } else if (yc[y][x] < 0.5f) { + nh = 19; + } else if (yc[y][x] < 0.6f) { + nh = 20; + } else if (yc[y][x] < 0.75f) { + nh = 21; + } + } else if (xc[y][x] < 0.31f && yc[y][x] > 0.1f) {//near neutral others + if (yc[y][x] < 0.2f) { + nh = 22; + } else if (yc[y][x] < 0.24f) { + nh = 23; + } else if (yc[y][x] < 0.29f) { + nh = 24; + } else if (yc[y][x] < 0.32f) { + nh = 25; + } else if (yc[y][x] < 0.36f) { + nh = 26; + } else if (yc[y][x] < 0.4f) { + nh = 27; + } else if (yc[y][x] < 0.5f) { + nh = 28; + } else if (yc[y][x] < 0.7f) { + nh = 29; + } + } else if (xc[y][x] < 0.325f && yc[y][x] > 0.1f) {//neutral 34 + if (yc[y][x] < 0.2f) { + nh = 30; + } else if (yc[y][x] < 0.24f) { + nh = 31; + } else if (yc[y][x] < 0.29f) { + nh = 32; + } else if (yc[y][x] < 0.32f) { + nh = 33; + } else if (yc[y][x] < 0.33f) { + nh = 34; + } else if (yc[y][x] < 0.335f) { + nh = 35; + } else if (yc[y][x] < 0.34f) { + nh = 36; + } else if (yc[y][x] < 0.35f) { + nh = 37; + } else if (yc[y][x] < 0.37f) { + nh = 38; + } else if (yc[y][x] < 0.4f) { + nh = 39; + } else if (yc[y][x] < 0.45f) { + nh = 40; + } else if (yc[y][x] < 0.5f) { + nh = 41; + } else if (yc[y][x] < 0.55f) { + nh = 42; + } else if (yc[y][x] < 0.7f) { + nh = 43; + } + } else if (xc[y][x] < 0.335f && yc[y][x] > 0.1f) {//neutral + if (yc[y][x] < 0.2f) { + nh = 44; + } else if (yc[y][x] < 0.24f) { + nh = 45; + } else if (yc[y][x] < 0.29f) { + nh = 46; + } else if (yc[y][x] < 0.32f) { + nh = 47; + } else if (yc[y][x] < 0.33f) { + nh = 48; + } else if (yc[y][x] < 0.335f) { + nh = 49; + } else if (yc[y][x] < 0.34f) { + nh = 50; + } else if (yc[y][x] < 0.345f) { + nh = 51; + } else if (yc[y][x] < 0.35f) { + nh = 52; + } else if (yc[y][x] < 0.355f) { + nh = 53; + } else if (yc[y][x] < 0.36f) { + nh = 54; + } else if (yc[y][x] < 0.37f) { + nh = 55; + } else if (yc[y][x] < 0.38f) { + nh = 56; + } else if (yc[y][x] < 0.4f) { + nh = 57; + } else if (yc[y][x] < 0.45f) { + nh = 58; + } else if (yc[y][x] < 0.5f) { + nh = 59; + } else if (yc[y][x] < 0.55f) { + nh = 60; + } else if (yc[y][x] < 0.7f) { + nh = 61; + } + } else if (xc[y][x] < 0.340f && yc[y][x] > 0.1f) {//neutral + if (yc[y][x] < 0.2f) { + nh = 62; + } else if (yc[y][x] < 0.24f) { + nh = 63; + } else if (yc[y][x] < 0.29f) { + nh = 64; + } else if (yc[y][x] < 0.32f) { + nh = 65; + } else if (yc[y][x] < 0.325f) { + nh = 66; + } else if (yc[y][x] < 0.33f) { + nh = 67; + } else if (yc[y][x] < 0.335f) { + nh = 68; + } else if (yc[y][x] < 0.34f) { + nh = 69; + } else if (yc[y][x] < 0.345f) { + nh = 70; + } else if (yc[y][x] < 0.35f) { + nh = 71; + } else if (yc[y][x] < 0.355f) { + nh = 72; + } else if (yc[y][x] < 0.36f) { + nh = 73; + } else if (yc[y][x] < 0.37f) { + nh = 74; + } else if (yc[y][x] < 0.38f) { + nh = 75; + } else if (yc[y][x] < 0.4f) { + nh = 76; + } else if (yc[y][x] < 0.45f) { + nh = 77; + } else if (yc[y][x] < 0.5f) { + nh = 78; + } else if (yc[y][x] < 0.55f) { + nh = 79; + } else if (yc[y][x] < 0.7f) { + nh = 80; + } + } else if (xc[y][x] < 0.345f && yc[y][x] > 0.1f) {//neutral 37 + if (yc[y][x] < 0.2f) { + nh = 81; + } else if (yc[y][x] < 0.24f) { + nh = 82; + } else if (yc[y][x] < 0.29f) { + nh = 83; + } else if (yc[y][x] < 0.32f) { + nh = 84; + } else if (yc[y][x] < 0.33f) { + nh = 85; + } else if (yc[y][x] < 0.335f) { + nh = 86; + } else if (yc[y][x] < 0.34f) { + nh = 87; + } else if (yc[y][x] < 0.345f) { + nh = 88; + } else if (yc[y][x] < 0.35f) { + nh = 89; + } else if (yc[y][x] < 0.355f) { + nh = 90; + } else if (yc[y][x] < 0.36f) { + nh = 91; + } else if (yc[y][x] < 0.37f) { + nh = 92; + } else if (yc[y][x] < 0.38f) { + nh = 93; + } else if (yc[y][x] < 0.39f) { + nh = 94; + } else if (yc[y][x] < 0.4f) { + nh = 95; + } else if (yc[y][x] < 0.42f) { + nh = 96; + } else if (yc[y][x] < 0.45f) { + nh = 97; + } else if (yc[y][x] < 0.48f) { + nh = 98; + } else if (yc[y][x] < 0.5f) { + nh = 99; + } else if (yc[y][x] < 0.55f) { + nh = 100; + } else if (yc[y][x] < 0.65f) { + nh = 101; + } + } else if (xc[y][x] < 0.355f && yc[y][x] > 0.1f) {//neutral 37 + if (yc[y][x] < 0.2f) { + nh = 102; + } else if (yc[y][x] < 0.24f) { + nh = 103; + } else if (yc[y][x] < 0.29f) { + nh = 104; + } else if (yc[y][x] < 0.32f) { + nh = 105; + } else if (yc[y][x] < 0.33f) { + nh = 106; + } else if (yc[y][x] < 0.335f) { + nh = 107; + } else if (yc[y][x] < 0.34f) { + nh = 108; + } else if (yc[y][x] < 0.345f) { + nh = 109; + } else if (yc[y][x] < 0.35f) { + nh = 110; + } else if (yc[y][x] < 0.355f) { + nh = 111; + } else if (yc[y][x] < 0.36f) { + nh = 112; + } else if (yc[y][x] < 0.37f) { + nh = 113; + } else if (yc[y][x] < 0.38f) { + nh = 114; + } else if (yc[y][x] < 0.39f) { + nh = 115; + } else if (yc[y][x] < 0.4f) { + nh = 116; + } else if (yc[y][x] < 0.42f) { + nh = 117; + } else if (yc[y][x] < 0.45f) { + nh = 118; + } else if (yc[y][x] < 0.48f) { + nh = 119; + } else if (yc[y][x] < 0.5f) { + nh = 120; + } else if (yc[y][x] < 0.55f) { + nh = 121; + } else if (yc[y][x] < 0.65f) { + nh = 122; + } + } else if (xc[y][x] < 0.365f && yc[y][x] > 0.15f) { //0.4 + if (yc[y][x] < 0.2f) { + nh = 123; + } else if (yc[y][x] < 0.24f) { + nh = 124; + } else if (yc[y][x] < 0.29f) { + nh = 125; + } else if (yc[y][x] < 0.32f) { + nh = 126; + } else if (yc[y][x] < 0.33f) { + nh = 127; + } else if (yc[y][x] < 0.34f) { + nh = 128; + } else if (yc[y][x] < 0.35f) { + nh = 129; + } else if (yc[y][x] < 0.36f) { + nh = 130; + } else if (yc[y][x] < 0.37f) { + nh = 131; + } else if (yc[y][x] < 0.38f) { + nh = 132; + } else if (yc[y][x] < 0.39f) { + nh = 133; + } else if (yc[y][x] < 0.4f) { + nh = 134; + } else if (yc[y][x] < 0.42f) { + nh = 135; + } else if (yc[y][x] < 0.45f) { + nh = 136; + } else if (yc[y][x] < 0.5f) { + nh = 137; + } else if (yc[y][x] < 0.55f) { + nh = 138; + } else if (yc[y][x] < 0.63f) { + nh = 139; + } + } else if (xc[y][x] < 0.405f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f) { + nh = 140; + } else if (yc[y][x] < 0.24f) { + nh = 141; + } else if (yc[y][x] < 0.29f) { + nh = 142; + } else if (yc[y][x] < 0.32f) { + nh = 143; + } else if (yc[y][x] < 0.34f) { + nh = 144; + } else if (yc[y][x] < 0.37f) { + nh = 145; + } else if (yc[y][x] < 0.4f) { + nh = 146; + } else if (yc[y][x] < 0.45f) { + nh = 147; + } else if (yc[y][x] < 0.5f) { + nh = 148; + } else if (yc[y][x] < 0.55f) { + nh = 149; + } else if (yc[y][x] < 0.6f) { + nh = 150; + } + } else if (xc[y][x] < 0.445f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f) { + nh = 151; + } else if (yc[y][x] < 0.24f) { + nh = 152; + } else if (yc[y][x] < 0.29f) { + nh = 153; + } else if (yc[y][x] < 0.32f) { + nh = 154; + } else if (yc[y][x] < 0.34f) { + nh = 155; + } else if (yc[y][x] < 0.37f) { + nh = 156; + } else if (yc[y][x] < 0.4f) { + nh = 157; + } else if (yc[y][x] < 0.45f) { + nh = 158; + } else if (yc[y][x] < 0.5f) { + nh = 159; + } else if (yc[y][x] < 0.55f) { + nh = 160; + } else if (yc[y][x] < 0.58f) { + nh = 161; + } + } else if (xc[y][x] < 0.495f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.2f) { + nh = 162; + } else if (yc[y][x] < 0.24f) { + nh = 163; + } else if (yc[y][x] < 0.29f) { + nh = 164; + } else if (yc[y][x] < 0.32f) { + nh = 165; + } else if (yc[y][x] < 0.34f) { + nh = 166; + } else if (yc[y][x] < 0.37f) { + nh = 167; + } else if (yc[y][x] < 0.4f) { + nh = 168; + } else if (yc[y][x] < 0.45f) { + nh = 169; + } else if (yc[y][x] < 0.5f) { + nh = 170; + } else if (yc[y][x] < 0.55f) { + nh = 171; + } + } else if (xc[y][x] < 0.545f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.2f) { + nh = 172; + } else if (yc[y][x] < 0.24f) { + nh = 173; + } else if (yc[y][x] < 0.29f) { + nh = 174; + } else if (yc[y][x] < 0.32f) { + nh = 175; + } else if (yc[y][x] < 0.34f) { + nh = 176; + } else if (yc[y][x] < 0.37f) { + nh = 177; + } else if (yc[y][x] < 0.4f) { + nh = 178; + } else if (yc[y][x] < 0.45f) { + nh = 179; + } else if (yc[y][x] < 0.5f) { + nh = 180; + } + } else if (xc[y][x] < 0.595f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.22f) { + nh = 181; + } else if (yc[y][x] < 0.25f) { + nh = 182; + } else if (yc[y][x] < 0.3f) { + nh = 183; + } else if (yc[y][x] < 0.35f) { + nh = 184; + } else if (yc[y][x] < 0.4f) { + nh = 185; + } else if (yc[y][x] < 0.45f) { + nh = 186; + } + } else if (xc[y][x] < 0.65f && yc[y][x] > 0.12f) { + if (yc[y][x] < 0.25f) { + nh = 187; + } else if (yc[y][x] < 0.3f) { + nh = 188; + } else if (yc[y][x] < 0.35f) { + nh = 189; + } else if (yc[y][x] < 0.45f) { + nh = 190; + } + } else if (xc[y][x] < 0.75f && yc[y][x] > 0.1f) { + nh = 191; + } + if (nh >= 0) { + histxythr[nh]++; + xxxthr[nh] += xc[y][x]; + yyythr[nh] += yc[y][x]; + YYYthr[nh] += Yc[y][x]; + } + } + } +#ifdef _OPENMP + #pragma omp critical +#endif + { + histxy += histxythr; + xxx += xxxthr; + yyy += yyythr; + YYY += YYYthr; + } + } +} + + + + +static void histoxyY(int bfhitc, int bfwitc, const array2D & xc, const array2D & yc, const array2D & Yc, LUTf &xxx, LUTf &yyy, LUTf &YYY, LUTu &histxy, bool purp) +{ + // calculate histogram x y in a range of 236 colors + // this "choice" are guided by generally colors who are in nature skin, sky, etc. in those cases "steps" are small + // of course we can change to be more precise + // purp enable or not purple color in xyY - approximation... +#ifdef _OPENMP + #pragma omp parallel +#endif + { + LUTu histxythr(histxy.getSize()); + histxythr.clear(); + LUTf xxxthr(xxx.getSize()); + xxxthr.clear(); + LUTf yyythr(yyy.getSize()); + yyythr.clear(); + LUTf YYYthr(YYY.getSize()); + YYYthr.clear(); + // bool purp = false; +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 4) nowait +#endif + + for (int y = 0; y < bfhitc ; y++) + { + for (int x = 0; x < bfwitc ; x++) { + int nh = -1; + + if (xc[y][x] < 0.12f && xc[y][x] > 0.03f && yc[y][x] > 0.1f) { // near Prophoto + if (yc[y][x] < 0.2f) { + nh = 0; + //blue hard + } else if (yc[y][x] < 0.25f) { + nh = 1; + } else if (yc[y][x] < 0.3f) { + nh = 2; + //blue + } else if (yc[y][x] < 0.35f) { + nh = 3; + } else if (yc[y][x] < 0.4f) { + nh = 4; + } else if (yc[y][x] < 0.45f) { + nh = 5; + } else if (yc[y][x] < 0.5f) { + //blue green + nh = 6; + } else if (yc[y][x] < 0.55f) { + nh = 7; + } else if (yc[y][x] < 0.6f) { + nh = 8; + } else if (yc[y][x] < 0.7f) { + nh = 9; + } else if (yc[y][x] < 0.82f) { + //green + nh = 10; + } + } else if (xc[y][x] < 0.24f && yc[y][x] > 0.05f) { + if (yc[y][x] < 0.2f) { + nh = 11; + } else if (yc[y][x] < 0.25f) { + nh = 12; + } else if (yc[y][x] < 0.3f) { + nh = 13; + } else if (yc[y][x] < 0.35f) { + nh = 14; + } else if (yc[y][x] < 0.4f) { + nh = 15; + } else if (yc[y][x] < 0.45f) { + nh = 16; + } else if (yc[y][x] < 0.5f) { + nh = 17; + } else if (yc[y][x] < 0.55f) { + nh = 18; + } else if (yc[y][x] < 0.6f) { + nh = 19; + } else if (yc[y][x] < 0.67f) { + nh = 20; + } else if (yc[y][x] < 0.75f) { + nh = 21; + } + } else if (xc[y][x] < 0.28f && yc[y][x] > 0.1f) {//blue sky and other + if (yc[y][x] < 0.2f) { + nh = 22; + } else if (yc[y][x] < 0.23f) { + nh = 23; + } else if (yc[y][x] < 0.25f) { + nh = 24; + } else if (yc[y][x] < 0.27f) { + nh = 25; + } else if (yc[y][x] < 0.29f) { + nh = 26; + } else if (yc[y][x] < 0.31f) { + nh = 27; + } else if (yc[y][x] < 0.33f) { + nh = 28; + } else if (yc[y][x] < 0.35f) { + nh = 29; + } else if (yc[y][x] < 0.37f) { + nh = 30; + } else if (yc[y][x] < 0.4f) { + nh = 31; + } else if (yc[y][x] < 0.45f) { + nh = 32; + } else if (yc[y][x] < 0.5f) { + nh = 33; + } else if (yc[y][x] < 0.55f) { + nh = 34; + } else if (yc[y][x] < 0.6f) { + nh = 35; + } else if (yc[y][x] < 0.67f) { + nh = 36; + } else if (yc[y][x] < 0.75f) { + nh = 37; + } + } else if (xc[y][x] < 0.31f && yc[y][x] > 0.1f) {//near neutral others + if (yc[y][x] < 0.2f) { + nh = 38; + } else if (yc[y][x] < 0.22f) { + nh = 39; + } else if (yc[y][x] < 0.24f) { + nh = 40; + } else if (yc[y][x] < 0.26f) { + nh = 41; + } else if (yc[y][x] < 0.29f) { + nh = 42; + } else if (yc[y][x] < 0.32f) { + nh = 43; + } else if (yc[y][x] < 0.36f) { + nh = 44; + } else if (yc[y][x] < 0.4f) { + nh = 45; + } else if (yc[y][x] < 0.45f) { + nh = 46; + } else if (yc[y][x] < 0.5f) { + nh = 47; + } else if (yc[y][x] < 0.6f) { + nh = 48; + } else if (yc[y][x] < 0.7f) { + nh = 49; + } + } else if (xc[y][x] < 0.325f && yc[y][x] > 0.1f) {//neutral 34 + if (yc[y][x] < 0.2f) { + nh = 50; + } else if (yc[y][x] < 0.22f) { + nh = 51; + } else if (yc[y][x] < 0.24f) { + nh = 52; + } else if (yc[y][x] < 0.29f) { + nh = 53; + } else if (yc[y][x] < 0.32f) { + nh = 54; + } else if (yc[y][x] < 0.33f) { + nh = 55; + } else if (yc[y][x] < 0.335f) { + nh = 56; + } else if (yc[y][x] < 0.34f) { + nh = 57; + } else if (yc[y][x] < 0.35f) { + nh = 58; + } else if (yc[y][x] < 0.37f) { + nh = 59; + } else if (yc[y][x] < 0.4f) { + nh = 60; + } else if (yc[y][x] < 0.45f) { + nh = 61; + } else if (yc[y][x] < 0.5f) { + nh = 62; + } else if (yc[y][x] < 0.55f) { + nh = 63; + } else if (yc[y][x] < 0.6f) { + nh = 64; + } else if (yc[y][x] < 0.65f) { + nh = 65; + } else if (yc[y][x] < 0.7f) { + nh = 66; + } + } else if (xc[y][x] < 0.335f && yc[y][x] > 0.1f) {//neutral + if (yc[y][x] < 0.2f) { + nh = 67; + } else if (yc[y][x] < 0.22f) { + nh = 68; + } else if (yc[y][x] < 0.24f) { + nh = 69; + } else if (yc[y][x] < 0.27f) { + nh = 70; + } else if (yc[y][x] < 0.29f) { + nh = 71; + } else if (yc[y][x] < 0.32f) { + nh = 72; + } else if (yc[y][x] < 0.33f) { + nh = 73; + } else if (yc[y][x] < 0.335f) { + nh = 74; + } else if (yc[y][x] < 0.34f) { + nh = 75; + } else if (yc[y][x] < 0.345f) { + nh = 76; + } else if (yc[y][x] < 0.35f) { + nh = 77; + } else if (yc[y][x] < 0.355f) { + nh = 78; + } else if (yc[y][x] < 0.36f) { + nh = 79; + } else if (yc[y][x] < 0.37f) { + nh = 80; + } else if (yc[y][x] < 0.38f) { + nh = 81; + } else if (yc[y][x] < 0.4f) { + nh = 82; + } else if (yc[y][x] < 0.45f) { + nh = 83; + } else if (yc[y][x] < 0.5f) { + nh = 84; + } else if (yc[y][x] < 0.55f) { + nh = 85; + } else if (yc[y][x] < 0.6f) { + nh = 86; + } else if (yc[y][x] < 0.65f) { + nh = 87; + } else if (yc[y][x] < 0.7f) { + nh = 88; + } + } else if (xc[y][x] < 0.340f && yc[y][x] > 0.1f) {//neutral + if (yc[y][x] < 0.2f) { + nh = 89; + } else if (yc[y][x] < 0.22f) { + nh = 90; + } else if (yc[y][x] < 0.24f) { + nh = 91; + } else if (yc[y][x] < 0.29f) { + nh = 92; + } else if (yc[y][x] < 0.32f) { + nh = 93; + } else if (yc[y][x] < 0.325f) { + nh = 94; + } else if (yc[y][x] < 0.33f) { + nh = 95; + } else if (yc[y][x] < 0.335f) { + nh = 96; + } else if (yc[y][x] < 0.34f) { + nh = 97; + } else if (yc[y][x] < 0.345f) { + nh = 98; + } else if (yc[y][x] < 0.35f) { + nh = 99; + } else if (yc[y][x] < 0.355f) { + nh = 100; + } else if (yc[y][x] < 0.36f) { + nh = 101; + } else if (yc[y][x] < 0.37f) { + nh = 102; + } else if (yc[y][x] < 0.38f) { + nh = 103; + } else if (yc[y][x] < 0.4f) { + nh = 104; + } else if (yc[y][x] < 0.45f) { + nh = 105; + } else if (yc[y][x] < 0.5f) { + nh = 106; + } else if (yc[y][x] < 0.55f) { + nh = 107; + } else if (yc[y][x] < 0.6f) { + nh = 108; + } else if (yc[y][x] < 0.65f) { + nh = 109; + } else if (yc[y][x] < 0.7f) { + nh = 110; + } + } else if (xc[y][x] < 0.345f && yc[y][x] > 0.1f) {//neutral 37 + if (yc[y][x] < 0.2f) { + nh = 111; + } else if (yc[y][x] < 0.22f) { + nh = 112; + } else if (yc[y][x] < 0.24f) { + nh = 113; + } else if (yc[y][x] < 0.26f) { + nh = 114; + } else if (yc[y][x] < 0.29f) { + nh = 115; + } else if (yc[y][x] < 0.32f) { + nh = 116; + } else if (yc[y][x] < 0.33f) { + nh = 117; + } else if (yc[y][x] < 0.335f) { + nh = 118; + } else if (yc[y][x] < 0.34f) { + nh = 119; + } else if (yc[y][x] < 0.345f) { + nh = 120; + } else if (yc[y][x] < 0.35f) { + nh = 121; + } else if (yc[y][x] < 0.355f) { + nh = 122; + } else if (yc[y][x] < 0.36f) { + nh = 123; + } else if (yc[y][x] < 0.37f) { + nh = 124; + } else if (yc[y][x] < 0.38f) { + nh = 125; + } else if (yc[y][x] < 0.39f) { + nh = 126; + } else if (yc[y][x] < 0.4f) { + nh = 127; + } else if (yc[y][x] < 0.42f) { + nh = 128; + } else if (yc[y][x] < 0.45f) { + nh = 129; + } else if (yc[y][x] < 0.48f) { + nh = 130; + } else if (yc[y][x] < 0.5f) { + nh = 131; + } else if (yc[y][x] < 0.55f) { + nh = 132; + } else if (yc[y][x] < 0.65f) { + nh = 133; + } + } else if (xc[y][x] < 0.355f && yc[y][x] > 0.1f) {//neutral 37 + if (yc[y][x] < 0.2f) { + nh = 134; + } else if (yc[y][x] < 0.22f) { + nh = 135; + } else if (yc[y][x] < 0.24f) { + nh = 136; + } else if (yc[y][x] < 0.26f) { + nh = 137; + } else if (yc[y][x] < 0.29f) { + nh = 138; + } else if (yc[y][x] < 0.32f) { + nh = 139; + } else if (yc[y][x] < 0.33f) { + nh = 140; + } else if (yc[y][x] < 0.335f) { + nh = 141; + } else if (yc[y][x] < 0.34f) { + nh = 142; + } else if (yc[y][x] < 0.345f) { + nh = 143; + } else if (yc[y][x] < 0.35f) { + nh = 144; + } else if (yc[y][x] < 0.355f) { + nh = 145; + } else if (yc[y][x] < 0.36f) { + nh = 146; + } else if (yc[y][x] < 0.37f) { + nh = 147; + } else if (yc[y][x] < 0.38f) { + nh = 148; + } else if (yc[y][x] < 0.39f) { + nh = 149; + } else if (yc[y][x] < 0.4f) { + nh = 150; + } else if (yc[y][x] < 0.42f) { + nh = 151; + } else if (yc[y][x] < 0.45f) { + nh = 152; + } else if (yc[y][x] < 0.48f) { + nh = 153; + } else if (yc[y][x] < 0.5f) { + nh = 154; + } else if (yc[y][x] < 0.55f) { + nh = 155; + } else if (yc[y][x] < 0.6f) { + nh = 156; + } else if (yc[y][x] < 0.65f) { + nh = 157; + } + } else if (xc[y][x] < 0.365f && yc[y][x] > 0.15f) { //0.4 + if (yc[y][x] < 0.2f) { + nh = 158; + } else if (yc[y][x] < 0.22f) { + nh = 159; + } else if (yc[y][x] < 0.24f) { + nh = 160; + } else if (yc[y][x] < 0.26f) { + nh = 161; + } else if (yc[y][x] < 0.29f) { + nh = 162; + } else if (yc[y][x] < 0.32f) { + nh = 163; + } else if (yc[y][x] < 0.33f) { + nh = 164; + } else if (yc[y][x] < 0.34f) { + nh = 165; + } else if (yc[y][x] < 0.35f) { + nh = 166; + } else if (yc[y][x] < 0.36f) { + nh = 167; + } else if (yc[y][x] < 0.37f) { + nh = 168; + } else if (yc[y][x] < 0.38f) { + nh = 169; + } else if (yc[y][x] < 0.39f) { + nh = 170; + } else if (yc[y][x] < 0.4f) { + nh = 171; + } else if (yc[y][x] < 0.42f) { + nh = 172; + } else if (yc[y][x] < 0.45f) { + nh = 173; + } else if (yc[y][x] < 0.5f) { + nh = 174; + } else if (yc[y][x] < 0.55f) { + nh = 175; + } else if (yc[y][x] < 0.63f) { + nh = 176; + } + } else if (xc[y][x] < 0.405f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f && purp) {//no take into account if purp = false + nh = 177; + } else if (yc[y][x] < 0.22f && purp) { + nh = 178; + } else if (yc[y][x] < 0.24f && purp) { + nh = 179; + } else if (yc[y][x] < 0.26f && purp) { + nh = 180; + } else if (yc[y][x] < 0.29f && purp) { + nh = 181; + } else if (yc[y][x] < 0.32f) { + nh = 182; + } else if (yc[y][x] < 0.34f) { + nh = 183; + } else if (yc[y][x] < 0.37f) { + nh = 184; + } else if (yc[y][x] < 0.4f) { + nh = 185; + } else if (yc[y][x] < 0.45f) { + nh = 186; + } else if (yc[y][x] < 0.5f) { + nh = 187; + } else if (yc[y][x] < 0.55f) { + nh = 188; + } else if (yc[y][x] < 0.6f) { + nh = 189; + } + } else if (xc[y][x] < 0.445f && yc[y][x] > 0.15f) {//45 + if (yc[y][x] < 0.2f && purp) { + nh = 190; + } else if (yc[y][x] < 0.22f && purp) { + nh = 191; + } else if (yc[y][x] < 0.24f && purp) { + nh = 192; + } else if (yc[y][x] < 0.26f && purp) { + nh = 193; + } else if (yc[y][x] < 0.29f && purp) { + nh = 194; + } else if (yc[y][x] < 0.32f && purp) { + nh = 195; + } else if (yc[y][x] < 0.34f && purp) { + nh = 196; + } else if (yc[y][x] < 0.37f) { + nh = 197; + } else if (yc[y][x] < 0.4f) { + nh = 198; + } else if (yc[y][x] < 0.45f) { + nh = 199; + } else if (yc[y][x] < 0.5f) { + nh = 200; + } else if (yc[y][x] < 0.55f) { + nh = 201; + } else if (yc[y][x] < 0.58f) { + nh = 202; + } + } else if (xc[y][x] < 0.495f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.2f && purp) { + nh = 203; + } else if (yc[y][x] < 0.22f && purp) { + nh = 204; + } else if (yc[y][x] < 0.24f && purp) { + nh = 205; + } else if (yc[y][x] < 0.26f && purp) { + nh = 206; + } else if (yc[y][x] < 0.29f && purp) { + nh = 207; + } else if (yc[y][x] < 0.32f && purp) { + nh = 208; + } else if (yc[y][x] < 0.34f && purp) { + nh = 209; + } else if (yc[y][x] < 0.37f) { + nh = 210; + } else if (yc[y][x] < 0.4f) { + nh = 211; + } else if (yc[y][x] < 0.45f) { + nh = 212; + } else if (yc[y][x] < 0.5f) { + nh = 213; + } else if (yc[y][x] < 0.55f) { + nh = 214; + } + } else if (xc[y][x] < 0.545f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.2f && purp) { + nh = 215; + } else if (yc[y][x] < 0.22f && purp) { + nh = 216; + } else if (yc[y][x] < 0.24f && purp) { + nh = 217; + } else if (yc[y][x] < 0.26f && purp) { + nh = 218; + } else if (yc[y][x] < 0.29f && purp) { + nh = 219; + } else if (yc[y][x] < 0.32f && purp) { + nh = 220; + } else if (yc[y][x] < 0.34f && purp) { + nh = 221; + } else if (yc[y][x] < 0.37f) { + nh = 222; + } else if (yc[y][x] < 0.4f) { + nh = 223; + } else if (yc[y][x] < 0.45f) { + nh = 224; + } else if (yc[y][x] < 0.5f) { + nh = 225; + } + } else if (xc[y][x] < 0.595f && yc[y][x] > 0.15f) { + if (yc[y][x] < 0.22f) { + nh = 226; + } else if (yc[y][x] < 0.25f) { + nh = 227; + } else if (yc[y][x] < 0.3f) { + nh = 228; + } else if (yc[y][x] < 0.35f) { + nh = 229; + } else if (yc[y][x] < 0.4f) { + nh = 230; + } else if (yc[y][x] < 0.45f) { + nh = 231; + } + } else if (xc[y][x] < 0.65f && yc[y][x] > 0.12f) { + if (yc[y][x] < 0.25f) { + nh = 232; + } else if (yc[y][x] < 0.3f) { + nh = 233; + } else if (yc[y][x] < 0.35f) { + nh = 234; + } else if (yc[y][x] < 0.45f) { + nh = 235; + } + } else if (xc[y][x] < 0.75f && yc[y][x] > 0.1f) { + nh = 236; //191 + } + + if (nh >= 0) { + histxythr[nh]++; + xxxthr[nh] += xc[y][x]; + yyythr[nh] += yc[y][x]; + YYYthr[nh] += Yc[y][x]; + } + } + } + +#ifdef _OPENMP + #pragma omp critical +#endif + { + histxy += histxythr; + xxx += xxxthr; + yyy += yyythr; + YYY += YYYthr; + } + } +} + +float static studentXY(const array2D & YYcurr, const array2D & reffYY, int sizcurr, int Nc, int tt) +{ + //calculate Student coeff YY + float somcurrY = 0.f; + float somreffY = 0.f; + float somcurr2Y = 0.f; + float somreff2Y = 0.f; + + for (int i = 0; i < sizcurr; i++) { + somcurrY += YYcurr[i][tt]; + //sum observations first group + } + + somcurrY *= 100.f; + + for (int i = 0; i < Nc; i++) { + somreffY += reffYY[i][tt]; + //sum observations second group + } + + somreffY *= 100.f; + + for (int i = 0; i < sizcurr; i++) { + somcurr2Y += SQR(YYcurr[i][tt]); + //sum sqr observations first group + } + + somcurr2Y *= SQR(100.f); + + for (int i = 0; i < Nc; i++) { + somreff2Y += SQR(reffYY[i][tt]); + //sum sqr observations second group + } + + somreff2Y *= SQR(100.f); + + const float somsqueccurrY = somcurr2Y - SQR(somcurrY) / sizcurr; + //sum sqr differences first + const float somsquecreffY = somreff2Y - SQR(somreffY) / Nc; + //sum sqr differences second + + const float diviY = std::sqrt(((somsqueccurrY + somsquecreffY) * (1.f / sizcurr + 1.f / Nc)) / (sizcurr + Nc - 2)); + //divisor student + const float numerY = somcurrY / sizcurr - somreffY / Nc; + //numerator student + + return numerY / diviY ; + //student coeeficient +} + + + + +void RawImageSource::ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const ColorManagementParams &cmp, const RAWParams &raw, const WBParams & wbpar, const ToneCurveParams &hrp) +{ + /* + Copyright (c) Jacques Desmis 6 - 2018 jdesmis@gmail.com, update 2 - 2023 + Copyright (c) Ingo Weyrich 3 - 2020 (heckflosse67@gmx.de) + + This algorithm try to find temperature correlation between 20 to 80 colors between 201 spectral color and about 20 to 55 color found in the image between 236, I just found the idea in the web "correlate with chroma" instead of RGB grey point,but I don't use any algo found on the web. + + I have test many many algorithms to find the first one that work :) + Probably (sure) there are improvement to do... + + I have create a table temperature with temp and white point with 118 values between 2000K and 12000K we can obviously change these values, more...with different steps + I have create a table for tint (green)with 134 values between 0.4 to 4. + I have create or recuparate and transformed 201 spectral colors from Colorchecker24, others color and my 468 colors target, or from web flowers, etc. with a step of 5nm, I think it is large enough. + I think this value of 201 is now complete: I tested correlation with 60, 90, 100, 120, 155...better student increase with number of color, but now it seems stabilized + Of course we can increase this number :) + + 1) for the current raw file we create a table for each temp of RGB multipliers + 2) then, I choose the "camera temp" to initialize calculation (why not) + 3) for this temp, I calculated XYZ values for the 201 spectral data + 4) then I create for the image an "histogram", but for xyY (CIE 1931 color space or CIE 1964 (default)) + 5) for each pixel (in fact to accelerate only 1/5 for and 1/5 for y), I determine for each couple xy, the number of occurrences, can be change by Itcwb_precis to 3 or 9 + 6) I sort this result in ascending order + 7) in option we can sort in another manner to take into account chroma : chromax = x - white point x, chromay = y - white point y + 8) then I compare this result, with spectral data found above in 3) with deltaE (limited to chroma) + 9) at this point we have xyY values that match Camera temp, and spectral data associated + 10) then I recalculate RGB values from xyY histogram + 11) after, I vary temp, between 2000K to 12000K + 12) RGB values are recalculated from 10) with RGB multipliers, and then xyY are calculated for each temp + 13) spectral data choose are recalculated with temp between 2000K to 12000K with matrix spectral calculation, that leads to xyY values + 14) I calculated for each couple xy, Student correlation (without Snedecor test) + 15) the good result, is the best correlation + 16) we have found the best temperature where color image and color references are correlate + 17) after we pass this value to improccoordinator + + 18) in a second part if camera green is out, I used an "extra" algorithm + 19) we make vary green between 2 limits (settings in option) + 20) between these green limits, we make slightly vary temp (settings in options) and recalculated RGB multipliers + 21) with this multipliers for the RGB color find in histogram we recalculate xyY + 22) we re-adjust references color for these xyY from 20) + 23) then find all Student correlation for each couple green / temp + 24) sort these Student values, and choose the minimum + 25) then for the 5 better couple "temp / green" choose the one where green is nearest from 1. + + Some variables or function are not used, keep in case of + I have test with cat02 but result are not stable enough ! why ??, therefore cat02 neutralized + This operation is done (actually) 100 times and compare Student coefficient, and keep the absolute minimum, We can probably optimize.... + But actually the goal is to find the good algorithm ! + + I think, this algo is very good in most cases :) ...to verify of course. + You can used it in images :flowers, landscape, portrait, skin, where illuminants are "normal" (daylight, blackbody) + You must avoid when illuminant is non standard (fluorescent, LED...) and also, when the subject is lost in the image (some target to generate profiles). + + You can change parameters in White Balance - Frame adapted to Itcwb + Itcwb_thres : 34 by default ==> number of color used in final algorithm - between 10 and max 55 + Itcwb_sorted : true by default, can improve algorithm if true, ==> sort value in something near chroma order, instead of histogram number + Itcwb_greenrange : 0 amplitude of green variation - between 0 to 2 + Itcwb_greendelta : 1 - delta temp in green iterate loop for "extra" - between 0 to 4 + Itcwb_forceextra : false by default - Use all Ciexy diagram instead of sRGB + //Itcwb_sizereference : repalce by int maxnb 3 by default, can be set to 5 ==> size of reference color compare to size of histogram real color + itcwb_delta : 1 by default can be set between 0 to 5 ==> delta temp to build histogram xy - if camera temp is not probably good + //itcwb_precis : replace by int precision = 3 by default - can be set to 3 or 9 - 3 best sampling but more time...9 "old" settings - but low differences in times with 3 instead of 9 about twice time 160ms instead of 80ms for a big raw file + itcwb_nopurple : true default - allow to bypass highlight recovery and inpait opposed when need flowers and not purple due to highlights... + itcwb_fgreen : 5 by default - between 3 to 6 - find the compromise student / green to reach green near of 1 + + In file options. + use standard observer 10°, false = standard observer 2° + */ + // BENCHFUN + + Glib::ustring profuse; + profuse = "sRGB";//or "Adobe RGB" + if( wbpar.itcwb_forceextra && wbpar.itcwb_sampling == false) {//Adobe RGB + profuse = "ACESp0";//cover all CIE xy diagram + } + + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(profuse); //ACESp0 or sRGB + 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])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} + }; + + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(profuse);//ACESp0 or sRGB + //inverse matrix user select + 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])} + }; + + const int bfwitc = bfw; + const int bfhitc = bfh; + + typedef struct WbGreen { + double green; + float snedecor;//1. actually but put in case of confiance interval + } WbGreen; + //green (tint) values between 0.4 to 4.0 + constexpr WbGreen gree[134] = {//symmetric coefficient between 0.717 and 1.40 + {0.400, 1.f}, + {0.420, 1.f}, + {0.440, 1.f}, + {0.460, 1.f}, + {0.480, 1.f}, + {0.500, 1.f}, + {0.520, 1.f}, + {0.540, 1.f}, + {0.550, 1.f}, + {0.560, 1.f}, + {0.570, 1.f}, + {0.580, 1.f}, + {0.590, 1.f}, + {0.600, 1.f}, + {0.610, 1.f}, + {0.620, 1.f},//extended range + {0.630, 1.f}, + {0.640, 1.f}, + {0.650, 1.f}, + {0.660, 1.f}, + {0.670, 1.f}, + {0.680, 1.f}, + {0.690, 1.f}, + {0.700, 1.f}, + {0.714, 1.f},//usual 2 range + {0.727, 1.f}, + {0.741, 1.f}, + {0.755, 1.f}, + {0.769, 1.f}, + {0.784, 1.f}, + {0.800, 1.f}, + {0.806, 1.f}, + {0.813, 1.f}, + {0.820, 1.f},//usual range + {0.826, 1.f}, + {0.833, 1.f}, + {0.840, 1.f}, + {0.847, 1.f}, + {0.855, 1.f}, + {0.862, 1.f}, + {0.870, 1.f}, + {0.877, 1.f}, + {0.885, 1.f}, + {0.893, 1.f}, + {0.901, 1.f}, + {0.909, 1.f}, + {0.917, 1.f}, + {0.926, 1.f}, + {0.935, 1.f}, + {0.943, 1.f}, + {0.952, 1.f}, + {0.962, 1.f}, + {0.971, 1.f}, + {0.980, 1.f}, + {0.990, 1.f}, + {1.000, 1.f},//55 reference + {1.010, 1.f}, + {1.020, 1.f}, + {1.030, 1.f}, + {1.040, 1.f}, + {1.050, 1.f}, + {1.060, 1.f}, + {1.070, 1.f}, + {1.080, 1.f}, + {1.090, 1.f}, + {1.100, 1.f}, + {1.110, 1.f}, + {1.120, 1.f}, + {1.130, 1.f}, + {1.140, 1.f}, + {1.150, 1.f}, + {1.160, 1.f}, + {1.170, 1.f}, + {1.180, 1.f}, + {1.190, 1.f}, + {1.200, 1.f}, + {1.210, 1.f}, + {1.220, 1.f}, + {1.230, 1.f}, + {1.240, 1.f}, + {1.250, 1.f},// usual range + {1.275, 1.f}, + {1.300, 1.f}, + {1.325, 1.f}, + {1.350, 1.f}, + {1.375, 1.f}, + {1.400, 1.f},//usual 2 range + {1.425, 1.f}, + {1.450, 1.f}, + {1.475, 1.f}, + {1.500, 1.f}, + {1.525, 1.f}, + {1.550, 1.f}, + {1.575, 1.f},//extended range + {1.600, 1.f}, + {1.633, 1.f}, + {1.666, 1.f}, + {1.700, 1.f}, + {1.733, 1.f}, + {1.766, 1.f}, + {1.800, 1.f}, + {1.833, 1.f}, + {1.866, 1.f}, + {1.900, 1.f}, + {1.933, 1.f}, + {1.966, 1.f}, + {2.000, 1.f}, + {2.033, 1.f}, + {2.066, 1.f}, + {2.100, 1.f}, + {2.133, 1.f}, + {2.166, 1.f}, + {2.200, 1.f}, + {2.250, 1.f}, + {2.300, 1.f}, + {2.350, 1.f}, + {2.400, 1.f}, + {2.450, 1.f}, + {2.500, 1.f}, + {2.550, 1.f}, + {2.600, 1.f}, + {2.650, 1.f}, + {2.700, 1.f}, + {2.750, 1.f}, + {2.800, 1.f}, + {2.850, 1.f}, + {2.900, 1.f}, + {2.950, 1.f}, + {3.000, 1.f}, + {3.200, 1.f}, + {3.400, 1.f}, + {3.600, 1.f}, + {3.800, 1.f}, + {4.000, 1.f} + }; + const int N_g = sizeof(gree) / sizeof(gree[0]); //number of green + + typedef struct RangeGreen { + int begin; + int end; + } RangeGreen; + + constexpr RangeGreen Rangestandard = {33, 80};//usual green range + constexpr RangeGreen Rangestandard2 = {24, 86};//usual 2 green range + constexpr RangeGreen Rangeextended = {15, 93}; + const RangeGreen Rangemax = {0, N_g}; + + RangeGreen Rangegreenused; + + if (wbpar.itcwb_rgreen == 0) { + Rangegreenused = Rangestandard; + } else if (wbpar.itcwb_rgreen == 1) { + Rangegreenused = Rangestandard2; + } else if (wbpar.itcwb_rgreen == 2) { + Rangegreenused = Rangeextended; + } else { + Rangegreenused = Rangemax; + } + if(wbpar.itcwb_sampling == true) { + Rangegreenused = Rangestandard2; + } + typedef struct WbTxyz { + double Tem; + double XX; + double ZZ; + } WbTxyz; + //we can change step to increase precision if need - also in Colortemp.cc with same changes + //I don't know how to pass this structure to Colortemp ! + // X and Z values calculate for each temp between 2000K to 12000K, so no result after 12000K ! + //of course we can change the step between each temp if need + constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values x wb and y wb are calculated after, Xwb and Ywb calculated with a spreadsheet + {2001., 1.273842, 0.145295}, + {2101., 1.244008, 0.167533}, + {2201., 1.217338, 0.190697}, + {2301., 1.193444, 0.214632}, + {2401., 1.171996, 0.239195}, + {2501., 1.152883, 0.264539}, + {2605., 1.134667, 0.290722}, + {2655., 1.126659, 0.303556}, + {2705., 1.119049, 0.316446}, + {2755., 1.111814, 0.329381}, + {2803., 1.105381, 0.342193}, + {2856., 1.098258, 0.355599}, + {2910., 1.091550, 0.369645}, + {2960., 1.085649, 0.382655}, + {3003., 1.080982, 0.394258}, + {3050., 1.075727, 0.406057}, + {3103., 1.070277, 0.419815}, + {3153., 1.065384, 0.432769}, + {3203., 1.060906, 0.446161}, + {3250., 1.056535, 0.457806}, + {3303., 1.052034, 0.471422}, + {3353., 1.047990, 0.484218}, + {3400., 1.044547, 0.496719}, + {3450., 1.040667, 0.508891}, + {3500., 1.037145, 0.521523}, + {3550., 1.033783, 0.534090}, + {3600., 1.030574, 0.546590}, + {3650., 1.027510, 0.559020}, + {3699., 1.024834, 0.571722}, + {3801., 1.019072, 0.596102}, + {3851., 1.016527, 0.608221}, + {3902., 1.014244, 0.621136}, + {3952., 1.011729, 0.632447}, + {4002., 0.996153, 0.609518}, + {4052., 0.993720, 0.620805}, + {4102., 0.993908, 0.631520}, + {4152., 0.989179, 0.643262}, + {4202., 0.989283, 0.653999}, + {4252., 0.985039, 0.665536}, + {4302., 0.985067, 0.676288}, + {4352., 0.981271, 0.687599}, + {4402., 0.981228, 0.698349}, + {4452., 0.977843, 0.709425}, + {4502., 0.977736, 0.720159}, + {4552., 0.974728, 0.730993}, + {4602., 0.974562, 0.741698}, + {4652., 0.971899, 0.752284}, + {4702., 0.971681, 0.762949}, + {4752., 0.969335, 0.773285}, + {4802., 0.969069, 0.783899}, + {4827., 0.967570, 0.788836}, + {4852., 0.967011, 0.793982}, + {4877., 0.966465, 0.799108}, + {4902., 0.965933, 0.804214}, + {4927., 0.965414, 0.809229}, + {4952., 0.964908, 0.814366}, + {4977., 0.964415, 0.819412}, + {5002., 0.963934, 0.824438},//57 reference + {5027., 0.963465, 0.829444}, + {5052., 0.963008, 0.834429}, + {5077., 0.962563, 0.839395}, + {5102., 0.962129, 0.844339}, + {5127., 0.961706, 0.849263}, + {5152., 0.961294, 0.854166}, + {5177., 0.960893, 0.859049}, + {5202., 0.960501, 0.863911}, + {5252., 0.959749, 0.873572}, + {5302., 0.959313, 0.883815}, + {5352., 0.958361, 0.892644}, + {5402., 0.957903, 0.902793}, + {5452., 0.957116, 0.911379}, + {5502., 0.956639, 0.921431}, + {5552., 0.956002, 0.929779}, + {5602., 0.955509, 0.939728}, + {5652., 0.955008, 0.947842}, + {5702., 0.954502, 0.957685}, + {5752., 0.954124, 0.965569}, + {5802., 0.953608, 0.975303}, + {5852., 0.953342, 0.982963}, + {5902., 0.952818, 0.992584}, + {5952., 0.952652, 1.000025}, + {6002., 0.952122, 1.009532}, + {6052., 0.952047, 1.016759}, + {6102., 0.951514, 1.026149}, + {6152., 0.951520, 1.033168}, + {6202., 0.950985, 1.042439}, + {6252., 0.951064, 1.049256}, + {6302., 0.950530, 1.058406}, + {6352., 0.950674, 1.065027}, + {6402., 0.950143, 1.074055}, + {6452., 0.950345, 1.080484}, + {6502., 0.950201, 1.088097}, + {6552., 0.950070, 1.095633}, + {6602., 0.949952, 1.103094}, + {6652., 0.949846, 1.110479}, + {6702., 0.949752, 1.119138}, + {6752., 0.949668, 1.125027}, + {6802., 0.949596, 1.132190}, + {6902., 0.949033, 1.147691}, + {7002., 0.949402, 1.160129}, + {7152., 0.949348, 1.180429}, + {7301., 0.948896, 1.201432}, + {7451., 0.949434, 1.219076}, + {7601., 0.949099, 1.239061}, + {7751., 0.949729, 1.255559}, + {7901., 0.949498, 1.274460}, + {8151., 0.950361, 1.300912}, + {8301., 0.950253, 1.318464}, + {8451., 0.950966, 1.332651}, + {8601., 0.950941, 1.349261}, + {8801., 0.951772, 1.367421}, + {9001., 0.951969, 1.387639}, + {9201., 0.952784, 1.404422}, + {9401., 0.953081, 1.423213}, + {9901., 0.954537, 1.464134}, + {10501., 0.956321, 1.508623}, + {11001., 0.957747, 1.541281}, + {12001., 0.960440, 1.601019} + }; + const int N_t = sizeof(Txyz) / sizeof(Txyz[0]); //number of temperature White point + constexpr int Nc = 201 + 1;//201 number of reference spectral colors, I think it is enough to retrieve good values + array2D Tx(N_t, Nc); + array2D Ty(N_t, Nc); + array2D Tz(N_t, Nc); + array2D Ta(N_t, Nc); + array2D Tb(N_t, Nc); + array2D TL(N_t, Nc); + double TX[Nc]; + double TY[Nc]; + double TZ[Nc]; + std::vector good_spectral(Nc, false); + + float rmm[N_t]; + float gmm[N_t]; + float bmm[N_t]; + + int siza = 237; //192 untill 01/2023 size of histogram + if(wbpar.itcwb_sampling == true) { + siza = 192;//old sampling 5.9 and before... + } + // tempref and greenref are camera wb values. + // I used them by default to select good spectral values !! but they are changed after + tempref = rtengine::min(tempref, 12000.0); + + int repref = 0; + + for (int tt = 0; tt < N_t; tt++) { + if (Txyz[tt].Tem > tempref) { + repref = tt;//show the select temp + break; + } + } + + //calculate R G B multiplier in function illuminant and temperature + const 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 tt = 0; tt < N_t; ++tt) { + double r, g, b; + float rm, gm, bm; + ColorTemp WBiter = ColorTemp(Txyz[tt].Tem, greenitc, 1.f, "Custom", wbpar.observer); + WBiter.getMultipliers(r, g, b); + + rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; + gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; + bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + + const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; + float new_scale_mul[4]; + const 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; + bm = new_scale_mul[2] / scale_mul[2] * gain; + rmm[tt] = rm / gm; + gmm[tt] = 1.f; + bmm[tt] = bm / gm; + //return rmm, gmm, bmm in function of temp + } + + struct hiss { + int histnum; + int index; + bool operator()(const hiss& lhis, const hiss& rhis) + { + return lhis.histnum < rhis.histnum; + } + + } ; + + //intermediate structure + struct chrom { + float chroxy_number; + float chroxy; + float chrox; + float chroy; + float Y; + int index; + int interest; + bool operator()(const chrom& lchro, const chrom& rchro) + { + return lchro.chroxy_number < rchro.chroxy_number; + } + + } ; + + LUTu histxy(siza); //number of values for each pair xy + + histxy.clear(); + + LUTf xxx(siza);//for color references calculated ==> max in images "like histogram" + + xxx.clear(); + + LUTf yyy(siza); + + yyy.clear(); + + LUTf YYY(siza);//not used directly, but necessary to keep good range + + YYY.clear(); + + bool separated = true; + + int w = -1; + + array2D reff_spect_yy_camera(N_t, 2 * Nc + 2); + + array2D reff_spect_xx_camera(N_t, 2 * Nc + 2); + + //here we select the good spectral color inside the 113 values + //call tempxy to calculate for 201 color references Temp and XYZ with cat02 + + ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 200 illuminants + + //find the good spectral values + //calculate xy reference spectral for tempref + for (int j = 0; j < Nc ; j++) { + reff_spect_xx_camera[j][repref] = TX[j] / (TX[j] + TY[j] + TZ[j]); // x from xyY + reff_spect_yy_camera[j][repref] = TY[j] / (TX[j] + TY[j] + TZ[j]); // y from xyY + } + + array2D xc(bfwitc, bfhitc); + array2D yc(bfwitc, bfhitc); + array2D Yc(bfwitc, bfhitc); + + const int deltarepref = 1; //settings->itcwb_delta; + + for (int nn = 0, drep = -deltarepref; nn <= 2; ++nn, drep += deltarepref) { + //three loop to refine color if temp camera is probably not very good + const int rep = rtengine::LIM(repref + drep, 0, N_t); + + //initialize calculation of xy current for tempref +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int y = 0; y < bfh ; ++y) { + for (int x = 0; x < bfw ; ++x) { + const float RR = rmm[rep] * redloc[y][x]; + const float GG = gmm[rep] * greenloc[y][x]; + const float BB = bmm[rep] * blueloc[y][x]; + Color::rgbxyY(RR, GG, BB, xc[y][x], yc[y][x], Yc[y][x], wp);//use sRGB or ACESp0 + } + } + + //histogram xy depend of temp...but in most cases D45 ..D65.. + //calculate for this image the mean values for each family of color, near histogram x y (number) + //xy vary from x 0..0.77 y 0..0.82 + //neutral values are near x=0.34 0.33 0.315 0.37 y =0.35 0.36 0.34 + //skin are about x 0.45 0.49 y 0.4 0.47 + //blue sky x=0.25 y=0.28 and x=0.29 y=0.32 + // step about 0.02 x 0.32 0.34 y= 0.34 0.36 skin -- sky x 0.24 0.30 y 0.28 0.32 + //big step about 0.2 + + bool purp = true;//if inpaint-opposed or something else enable purp + + // if (hrp.hrenabled && hrp.method == "Coloropp" && settings->itcwb_nopurple == true) {//we disabled (user) with settings if image are naturally with purple (flowers...) + if (hrp.hrenabled && hrp.method == "Coloropp" && wbpar.itcwb_nopurple == true) {//we disabled (user) with settings if image are naturally with purple (flowers...) + purp = false; + } + if(wbpar.itcwb_sampling == false) { + //printf("Use high smapling\n"); + histoxyY(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy, purp);//purp enable, enable purple color in WB + //return histogram x and y for each temp and in a range of 235 colors (siza) + } else { + //printf("Use low smapling - 5.9\n"); + histoxyY_low(bfhitc, bfwitc, xc, yc, Yc, xxx, yyy, YYY, histxy);//low scaling + } + } + + // free some memory + xc.free(); + yc.free(); + Yc.free(); + //calculate x y Y + const int sizcurrref = siza;//choice of number of correlate colors in image + array2D histcurrref(N_t, sizcurrref); + array2D xx_curref(N_t, sizcurrref); + array2D yy_curref(N_t, sizcurrref); + array2D YY_curref(N_t, sizcurrref); + array2D xx_curref_reduc(N_t, sizcurrref); + array2D yy_curref_reduc(N_t, sizcurrref); + array2D YY_curref_reduc(N_t, sizcurrref); + + hiss Wbhis[siza]; + + for (int nh = 0; nh < siza; nh++) { + Wbhis[nh].histnum = histxy[nh]; + Wbhis[nh].index = nh; + } + + //sort in ascending order + std::sort(Wbhis, Wbhis + siza, Wbhis[0]); + + int n1 = 0; + int n4 = 0; + int n15 = 0; + int n30 = 0; + + //part to improve + //determined the number of colors who be used after + for (int nh = 0; nh < siza; nh++) { + if (Wbhis[nh].histnum < 30) { + n30++; //keep only existing color but avoid to small + + if (Wbhis[nh].histnum < 15) { + n15++; //keep only existing color but avoid to small + + if (Wbhis[nh].histnum < 4) { + n4++; //keep only existing color but avoid to small + + if (Wbhis[nh].histnum < 1) { + n1++; //keep only existing color but avoid to small + } + } + } + } + } + + int ntr = n30; + + if (ntr > (siza - 25)) { + ntr = n15; //if to less elements 25 elements mini + } + + if (ntr > (siza - 23)) { + ntr = n4; //if to less elements 25 elements mini + } + + if (ntr > (siza - 20)) { + ntr = n1; //if to less elements 20 elements mini - normally never be used ! + } + + int sizcurr2ref = sizcurrref - ntr; + const int sizcu30 = sizcurrref - n30; + int nbm = 77;//number max of color used = 1.4 * 55 in case all CIExy diagram + if(profuse == "sRGB" || wbpar.itcwb_sampling == true) { + nbm = 55; + } + const int sizcu4 = rtengine::min(sizcu30, nbm);//size of chroma values + + if (settings->verbose) { + printf("ntr=%i sizcurr2ref=%i sizcu30=%i sizcu4=%i\n", ntr, sizcurr2ref, sizcu30, sizcu4); + } + + chrom wbchro[sizcu4]; + const float swpr = Txyz[repref].XX + Txyz[repref].ZZ + 1.f; + const float xwpr = Txyz[repref].XX / swpr;//white point for tt in xy coordinates + const float ywpr = 1.f / swpr; + + for (int i = 0; i < sizcu4; ++i) { //take the max values + histcurrref[i][repref] = Wbhis[siza - (i + 1)].histnum; + xx_curref[i][repref] = xxx[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; + yy_curref[i][repref] = yyy[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; + YY_curref[i][repref] = YYY[Wbhis[siza - (i + 1)].index] / histcurrref[i][repref]; + } + + float estimchrom = 0.f; + + //estimate chromaticity for references + for (int nh = 0; nh < sizcu4; ++nh) { + const float chxy = std::sqrt(SQR(xx_curref[nh][repref] - xwpr) + SQR(yy_curref[nh][repref] - ywpr)); + wbchro[nh].chroxy_number = chxy * std::sqrt(histcurrref[nh][repref]); + wbchro[nh].chroxy = std::sqrt(chxy); + wbchro[nh].chrox = xx_curref[nh][repref]; + wbchro[nh].chroy = yy_curref[nh][repref]; + wbchro[nh].Y = YY_curref[nh][repref]; + wbchro[nh].index = nh; + estimchrom += chxy; + } + + estimchrom /= sizcu4; + + if (settings->verbose) { + printf("estimchrom=%f\n", estimchrom); + } + bool issorted = wbpar.itcwb_sorted; + + if(wbpar.itcwb_sampling == true) { + issorted = false; + } + + + if (issorted) { //sort in ascending with chroma values + std::sort(wbchro, wbchro + sizcu4, wbchro[0]); + } + + int maxval = rtengine::LIM(wbpar.itcwb_thres, 10, 55);//max values of color to find correlation + if(wbpar.itcwb_sampling == true) { + maxval = 34; + } + + sizcurr2ref = rtengine::min(sizcurr2ref, maxval); //keep about the biggest values, + + for (int i = 0; i < sizcurr2ref; ++i) { + //is condition chroxy necessary ? + if (wbchro[sizcu4 - (i + 1)].chrox > 0.1f && wbchro[sizcu4 - (i + 1)].chroy > 0.1f && wbchro[sizcu4 - (i + 1)].chroxy > 0.0f) { //suppress value too far from reference spectral + w++; + xx_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chrox; + yy_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].chroy; + YY_curref_reduc[w][repref] = wbchro[sizcu4 - (i + 1)].Y; + } + } + + //calculate deltaE xx to find best values of spectrals data - limited to chroma values + // int maxnb = rtengine::LIM(settings->itcwb_sizereference, 1, 5); + // int maxnb = rtengine::LIM(wbpar.itcwb_size, 1, 5); + int maxnb = 3; + //wbpar.itcwb_size to verify if this setting is usefull...diificulties with High gamut and limited patch spectral colors. + + if (wbpar.itcwb_thres > 55) {//normally never used + maxnb = 201 / wbpar.itcwb_thres; + } + + for (int nb = 1; nb <= maxnb; ++nb) { //max 5 iterations for Itcwb_thres=33, after trial 3 is good in most cases but in some cases 5 + for (int i = 0; i < w; ++i) { + float mindeltaE = 100000.f;//we can change this value... + int kN = 0; + + for (int j = 0; j < Nc ; j++) { + if (!good_spectral[j]) { + const float deltaE = SQR(xx_curref_reduc[i][repref] - reff_spect_xx_camera[j][repref]) + SQR(yy_curref_reduc[i][repref] - reff_spect_yy_camera[j][repref]); + + if (deltaE < mindeltaE) { + mindeltaE = deltaE; + kN = j; + } + } + } + + good_spectral[kN] = true;//good spectral are spectral color that match color histogram xy + } + } + + // reuse some buffers + array2D& R_curref_reduc = xx_curref_reduc; + array2D& G_curref_reduc = yy_curref_reduc; + array2D& B_curref_reduc = YY_curref_reduc; + + //reconvert to RGB for "reduction" + for (int i = 0; i < w; i++) { + const float X = 65535.f * xx_curref_reduc[i][repref] * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + const float Y = 65535.f * YY_curref_reduc[i][repref]; + const float Z = 65535.f * (1.f - xx_curref_reduc[i][repref] - yy_curref_reduc[i][repref]) * YY_curref_reduc[i][repref] / yy_curref_reduc[i][repref]; + float r, g, b; + Color::xyz2rgb(X, Y, Z, r, g, b, wip); + R_curref_reduc[i][repref] = r / rmm[repref]; + G_curref_reduc[i][repref] = g / gmm[repref]; + B_curref_reduc[i][repref] = b / bmm[repref]; + + } + +//end first part + + //Now begin real calculations + separated = false; + //recalculate histogram with good values and not estimated + ColorTemp::tempxy(separated, repref, Tx, Ty, Tz, Ta, Tb, TL, TX, TY, TZ, wbpar); //calculate chroma xy (xyY) for Z known colors on under 90 illuminants + //calculate x y Y + int sizcurr = siza;//choice of number of correlate colors in image + array2D xxyycurr_reduc(N_t, 2 * sizcurr); + array2D reff_spect_xxyy(N_t, 2 * Nc + 2); + array2D reff_spect_xxyy_prov(N_t, 2 * Nc + 2); + + float minstud = 100000.f; + int goodref = 1; + +//calculate x y z for each pixel with multiplier rmm gmm bmm + + for (int tt = 0; tt < N_t; ++tt) {//N_t + for (int i = 0; i < w; ++i) { + float unused; + + const float RR = rmm[tt] * R_curref_reduc[i][repref]; + const float GG = gmm[tt] * G_curref_reduc[i][repref]; + const float BB = bmm[tt] * B_curref_reduc[i][repref]; + Color::rgbxyY(RR, GG, BB, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i + 1][tt], unused, wp); + } + + for (int j = 0; j < Nc ; ++j) { + reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY + reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY + } + + int kk = -1; + + for (int i = 0; i < Nc ; ++i) { + if (good_spectral[i]) { + kk++; + //we calculate now absolute chroma for each spectral color + reff_spect_xxyy[2 * kk][tt] = reff_spect_xxyy_prov[2 * i][tt]; + reff_spect_xxyy[2 * kk + 1][tt] = reff_spect_xxyy_prov[2 * i + 1][tt]; + } + } + + const float abstud = std::fabs(studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kk, tt)); + + if (abstud < minstud) { // find the minimum Student + minstud = abstud; + goodref = tt; + } + } + + if (extra) {//always used if extra = true because I made this choice, brings better results + struct Tempgreen { + float student; + int tempref; + int greenref; + bool operator()(const Tempgreen& ltg, const Tempgreen& rtg) + { + return ltg.student < rtg.student; + } + }; + Tempgreen Tgstud[N_g]; + + for (int i = 0; i < N_g; ++i) {//init variables with + Tgstud[i].student = 1000.f;//max value to initialize + Tgstud[i].tempref = 57;//5002K position in the list + Tgstud[i].greenref = 55;// 1.f position in the list + } + + int dgoodref = rtengine::LIM(wbpar.itcwb_delta,1, 4); + if(wbpar.itcwb_sampling == true) { + dgoodref = 2; + } + const int scantempbeg = rtengine::max(goodref - (dgoodref + 1), 1); + const int scantempend = rtengine::min(goodref + dgoodref, N_t - 1); + + for (int gr = Rangegreenused.begin; gr < Rangegreenused.end; ++gr) { + float minstudgr = 100000.f; + int goodrefgr = 1; + + for (int tt = scantempbeg; tt < scantempend; ++tt) { + double r, g, b; + ColorTemp WBiter(Txyz[tt].Tem, gree[gr].green, 1.f, "Custom", wbpar.observer); + WBiter.getMultipliers(r, g, b); + float rm = imatrices.cam_rgb[0][0] * r + imatrices.cam_rgb[0][1] * g + imatrices.cam_rgb[0][2] * b; + float gm = imatrices.cam_rgb[1][0] * r + imatrices.cam_rgb[1][1] * g + imatrices.cam_rgb[1][2] * b; + float bm = imatrices.cam_rgb[2][0] * r + imatrices.cam_rgb[2][1] * g + imatrices.cam_rgb[2][2] * b; + //recalculate Multipliers now with good range of temp and green + + const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; + float new_scale_mul[4]; + const 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; + bm = new_scale_mul[2] / scale_mul[2] * gain; + rmm[tt] = rm / gm; + gmm[tt] = 1.f; + bmm[tt] = bm / gm; + } + + + for (int tt = scantempbeg; tt < scantempend; ++tt) {//N_t + for (int i = 0; i < w; ++i) { + float unused; + + const float RR = rmm[tt] * R_curref_reduc[i][repref]; + const float GG = gmm[tt] * G_curref_reduc[i][repref]; + const float BB = bmm[tt] * B_curref_reduc[i][repref]; + Color::rgbxyY(RR, GG, BB, xxyycurr_reduc[2 * i][tt], xxyycurr_reduc[2 * i + 1][tt], unused, wp); + } + + //recalculate xy spectral now with good range of temp and green + + for (int j = 0; j < Nc ; ++j) { + reff_spect_xxyy_prov[2 * j][tt] = Tx[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // x from xyY + reff_spect_xxyy_prov[2 * j + 1][tt] = Ty[j][tt] / (Tx[j][tt] + Ty[j][tt] + Tz[j][tt]); // y from xyY + } + + int kkg = -1; + + for (int i = 0; i < Nc ; ++i) { + if (good_spectral[i]) { + kkg++; + reff_spect_xxyy[2 * kkg][tt] = reff_spect_xxyy_prov[2 * i][tt]; + reff_spect_xxyy[2 * kkg + 1][tt] = reff_spect_xxyy_prov[2 * i + 1][tt]; + } + } + + //now we have good spectral data + //calculate student correlation + const float abstudgr = std::fabs(studentXY(xxyycurr_reduc, reff_spect_xxyy, 2 * w, 2 * kkg, tt)); + + if (abstudgr < minstudgr) { // find the minimum Student + minstudgr = abstudgr; + goodrefgr = tt; + } + + //found the values + Tgstud[gr].tempref = goodrefgr; + Tgstud[gr].greenref = gr; + Tgstud[gr].student = minstudgr; + + } + } + + std::sort(Tgstud, Tgstud + N_g, Tgstud[0]); + + // now search the value of green the nearest of 1 with a good student value, I think it is a good choice, perhaps no... + // I take the 5 first values + // I admit a symetrie in green coefiicient for rgb multiplier...probably not exactly true + // perhaps we can used a Snedecor test ? but why...at least we have confidence interval > 90% + int greengood = 55; + + int maxkgood = wbpar.itcwb_fgreen;//we can change ...to test 3, 4, 5. High values perhaps less good student, but it is a compromise... + maxkgood = rtengine::LIM(maxkgood, 3, 6); + if(wbpar.itcwb_sampling == true) { + maxkgood = 3; // force to 3 with old low sampling + } + + int mingood = std::min(std::fabs(Tgstud[0].greenref - 55), std::fabs(Tgstud[1].greenref - 55)); + + for (int k = 2; k < maxkgood; ++k) { + mingood = std::min(std::fabs(mingood), std::fabs(Tgstud[k].greenref - 55)); + } + + for (int k = 0; k < maxkgood ; ++k) { + if (mingood == fabs(Tgstud[k].greenref - 55)) { + greengood = Tgstud[k].greenref ; + goodref = Tgstud[k].tempref; + studgood = Tgstud[k].student;; + } + } + + if (settings->verbose) { + printf("Student_0=%f Student_k= %f\n", Tgstud[0].student, Tgstud[maxkgood - 1].student); + printf("mingood=%i greeng=%i goodref=%i stud=%f\n", mingood, greengood, goodref, (double) studgood); + } + + tempitc = Txyz[goodref].Tem; + greenitc = gree[greengood].green; + + if (estimchrom < 0.025f) { + float ac = -2.40f * estimchrom + 0.06f;//small empirical correction, maximum 0.06 if chroma=0 for all image, currently for very low chroma +0.02 + greenitc += ac; + } + } + + avg_rm = 10000.f * rmm[goodref]; + avg_gm = 10000.f * gmm[goodref]; + avg_bm = 10000.f * bmm[goodref]; + + if (!extra) { + tempitc = Txyz[goodref].Tem; + } + + //now we have temp green and student + if (settings->verbose) { + printf("ITCWB tempitc=%f gritc=%f stud=%f \n", tempitc, greenitc, studgood); + } +} + +void RawImageSource::WBauto(double & tempref, double & greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double & avg_rm, double & avg_gm, double & avg_bm, double & tempitc, double & greenitc, float & studgood, bool & twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams & cmp, const RAWParams & raw, const ToneCurveParams &hrp) +{ +// BENCHFUN + //auto white balance + //put green (tint) in reasonable limits for an Daylight illuminant + // avoid too bi or too low values + if (wbpar.method == "autitcgreen") { + bool extra = true; + + if (greenref > 0.5 && greenref < 1.3) {// 0.5 and 1.3 arbitraties values + greenitc = greenref; + + } else { + greenitc = 1.; + extra = true; + } + + tempitc = 5000.; + ItcWB(extra, tempref, greenref, tempitc, greenitc, studgood, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, cmp, raw, wbpar, hrp); + } +} + +void RawImageSource::getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, const WBParams & wbpar) +{ +// BENCHFUN + //used by auto WB local to calculate red, green, blue in local region + + int precision = 3;//must be 3 5 or 9 + if(wbpar.itcwb_sampling == true) { + precision = 5; + } + + const int bfw = W / precision + ((W % precision) > 0 ? 1 : 0);// 5 arbitrary value can be change to 3 or 9 ; + const int bfh = H / precision + ((H % precision) > 0 ? 1 : 0); + + if (! greenloc) { + greenloc(bfw, bfh); + } + + if (! redloc) { + redloc(bfw, bfh); + } + + if (! blueloc) { + blueloc(bfw, bfh); + } + + double avgL = 0.0; + //center data on normal values + int nn = 0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avgL, nn) +#endif + + for (int i = 0; i < H; i ++) { + for (int j = 0; j < W; j++) { + const float LL = 0.299f * red[i][j] + 0.587f * green[i][j] + 0.114f * blue[i][j]; + avgL += static_cast(LL); + nn++; + } + } + + avgL /= nn; + + double vari = 0.f; + int mm = 0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:vari, mm) +#endif + + for (int i = 0; i < H; i++) + for (int j = 0; j < W; j++) { + const float LL = 0.299f * red[i][j] + 0.587f * green[i][j] + 0.114f * blue[i][j]; + vari += SQR(LL - avgL); + mm++; + } + + const float sig = std::sqrt(vari / mm); + const float multip = 60000.f / (avgL + 2.f * sig); + //multip to put red, blue, green in a good range +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < bfh; ++i) { + const int ii = i * precision; + + if (ii < H) { + for (int j = 0, jj = 0; j < bfw; ++j, jj += precision) { + redloc[i][j] = red[ii][jj] * multip; + greenloc[i][j] = green[ii][jj] * multip; + blueloc[i][j] = blue[ii][jj] * multip; + } + } + } +} + +void RawImageSource::getAutoWBMultipliersitc(double & tempref, double & greenref, double & tempitc, double & greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double & rm, double & gm, double & bm, const WBParams & wbpar, const ColorManagementParams & cmp, const RAWParams & raw, const ToneCurveParams &hrp) +{ +// BENCHFUN + constexpr double clipHigh = 64000.0; + + if (ri->get_colors() == 1) { + rm = gm = bm = 1; + return; + } + + double avg_r = 0; + double avg_g = 0; + double avg_b = 0; + int rn = 0, gn = 0, bn = 0; + double avg_rm, avg_gm, avg_bm; + + if (wbpar.method == "autold") { + if (fuji) { + for (int i = 32; i < H - 32; i++) { + int fw = ri->get_FujiWidth(); + int start = ABS(fw - i) + 32; + int end = min(H + W - fw - i, fw + i) - 32; + + for (int j = start; j < end; j++) { + if (ri->getSensorType() != ST_BAYER) { + double dr = CLIP(initialGain * (rawData[i][3 * j])); + double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); + double db = CLIP(initialGain * (rawData[i][3 * j + 2])); + + if (dr > clipHigh || dg > clipHigh || db > clipHigh) { + continue; + } + + avg_r += dr; + avg_g += dg; + avg_b += db; + rn = gn = ++bn; + } else { + int c = FC(i, j); + double d = CLIP(initialGain * (rawData[i][j])); + + if (d > clipHigh) { + continue; + } + + // Let's test green first, because they are more numerous + if (c == 1) { + avg_g += d; + gn++; + } else if (c == 0) { + avg_r += d; + rn++; + } else { /*if (c==2)*/ + avg_b += d; + bn++; + } + } + } + } + } else { + if (ri->getSensorType() != ST_BAYER) { + if (ri->getSensorType() == ST_FUJI_XTRANS) { + const double compval = clipHigh / initialGain; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + double avg_c[3] = {0.0}; + int cn[3] = {0}; +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) nowait +#endif + + for (int i = 32; i < H - 32; i++) { + for (int j = 32; j < W - 32; j++) { + // each loop read 1 rgb triplet value + double d = rawData[i][j]; + + if (d > compval) { + continue; + } + + int c = ri->XTRANSFC(i, j); + avg_c[c] += d; + cn[c]++; + } + } + +#ifdef _OPENMP + #pragma omp critical +#endif + { + avg_r += avg_c[0]; + avg_g += avg_c[1]; + avg_b += avg_c[2]; + rn += cn[0]; + gn += cn[1]; + bn += cn[2]; + } + } + avg_r *= initialGain; + avg_g *= initialGain; + avg_b *= initialGain; + } else { + for (int i = 32; i < H - 32; i++) + for (int j = 32; j < W - 32; j++) { + // each loop read 1 rgb triplet value + + double dr = CLIP(initialGain * (rawData[i][3 * j])); + double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); + double db = CLIP(initialGain * (rawData[i][3 * j + 2])); + + if (dr > clipHigh || dg > clipHigh || db > clipHigh) { + continue; + } + + avg_r += dr; + rn++; + avg_g += dg; + avg_b += db; + } + + gn = rn; + bn = rn; + } + } else { + //determine GRBG coset; (ey,ex) is the offset of the R subarray + int ey, ex; + + if (ri->ISGREEN(0, 0)) { //first pixel is G + if (ri->ISRED(0, 1)) { + ey = 0; + ex = 1; + } else { + ey = 1; + ex = 0; + } + } else {//first pixel is R or B + if (ri->ISRED(0, 0)) { + ey = 0; + ex = 0; + } else { + ey = 1; + ex = 1; + } + } + + const double compval = clipHigh / initialGain; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:avg_r,avg_g,avg_b,rn,gn,bn) schedule(dynamic,8) +#endif + + for (int i = 32; i < H - 32; i += 2) + for (int j = 32; j < W - 32; j += 2) { + //average each Bayer quartet component individually if non-clipped + double d[2][2]; + d[0][0] = rawData[i][j]; + d[0][1] = rawData[i][j + 1]; + d[1][0] = rawData[i + 1][j]; + d[1][1] = rawData[i + 1][j + 1]; + + if (d[ey][ex] <= compval) { + avg_r += d[ey][ex]; + rn++; + } + + if (d[1 - ey][ex] <= compval) { + avg_g += d[1 - ey][ex]; + gn++; + } + + if (d[ey][1 - ex] <= compval) { + avg_g += d[ey][1 - ex]; + gn++; + } + + if (d[1 - ey][1 - ex] <= compval) { + avg_b += d[1 - ey][1 - ex]; + bn++; + } + } + + avg_r *= initialGain; + avg_g *= initialGain; + avg_b *= initialGain; + + } + } + } + + if (wbpar.method == "autitcgreen") { + bool twotimes = false; + int precision = 3;//must be 3 5 or 9 + if(wbpar.itcwb_sampling == true) { + precision = 5; + } + + const int bfw = W / precision + ((W % precision) > 0 ? 1 : 0);// 5 arbitrary value can be change to 3 or 9 ; + const int bfh = H / precision + ((H % precision) > 0 ? 1 : 0); + WBauto(tempref, greenref, redloc, greenloc, blueloc, bfw, bfh, avg_rm, avg_gm, avg_bm, tempitc, greenitc, studgood, twotimes, wbpar, begx, begy, yEn, xEn, cx, cy, cmp, raw, hrp); + } + + redloc(0, 0); + greenloc(0, 0); + blueloc(0, 0); + + if (settings->verbose) { + printf("AVG: %g %g %g\n", avg_r / std::max(1, rn), avg_g / std::max(1, gn), avg_b / std::max(1, bn)); + } + + if (wbpar.method == "autitcgreen") { + //not used + redAWBMul = rm = avg_rm * refwb_red; + greenAWBMul = gm = avg_gm * refwb_green; + blueAWBMul = bm = avg_bm * refwb_blue; + } else { + const double reds = avg_r / std::max(1, rn) * refwb_red; + const double greens = avg_g / std::max(1, gn) * refwb_green; + const double blues = avg_b / std::max(1, bn) * refwb_blue; + redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; + greenAWBMul = gm = imatrices.rgb_cam[1][0] * reds + imatrices.rgb_cam[1][1] * greens + imatrices.rgb_cam[1][2] * blues; + blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; + } + +} + +void RawImageSource::getAutoWBMultipliers(double &rm, double &gm, double &bm) { // BENCHFUN constexpr double clipHigh = 64000.0; @@ -3922,12 +6421,12 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) if (fuji) { for (int i = 32; i < H - 32; i++) { int fw = ri->get_FujiWidth(); - int start = ABS(fw - i) + 32; + int start = std::abs(fw - i) + 32; int end = min(H + W - fw - i, fw + i) - 32; for (int j = start; j < end; j++) { if (ri->getSensorType() != ST_BAYER) { - double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dr = CLIP(initialGain * (rawData[i][3 * j])); double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); double db = CLIP(initialGain * (rawData[i][3 * j + 2])); @@ -3940,7 +6439,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) avg_b += db; rn = gn = ++bn; } else { - int c = FC( i, j); + int c = FC(i, j); double d = CLIP(initialGain * (rawData[i][j])); if (d > clipHigh) { @@ -3963,7 +6462,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) } } else { if (ri->getSensorType() != ST_BAYER) { - if(ri->getSensorType() == ST_FUJI_XTRANS) { + if (ri->getSensorType() == ST_FUJI_XTRANS) { const double compval = clipHigh / initialGain; #ifdef _OPENMP #pragma omp parallel @@ -4010,7 +6509,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) for (int j = 32; j < W - 32; j++) { // each loop read 1 rgb triplet value - double dr = CLIP(initialGain * (rawData[i][3 * j] )); + double dr = CLIP(initialGain * (rawData[i][3 * j])); double dg = CLIP(initialGain * (rawData[i][3 * j + 1])); double db = CLIP(initialGain * (rawData[i][3 * j + 2])); @@ -4091,25 +6590,22 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) } } - if( settings->verbose ) { - printf ("AVG: %g %g %g\n", avg_r / std::max(1, rn), avg_g / std::max(1, gn), avg_b / std::max(1, bn)); + if (settings->verbose) { + printf("AVG: %g %g %g\n", avg_r / std::max(1, rn), avg_g / std::max(1, gn), avg_b / std::max(1, bn)); } // return ColorTemp (pow(avg_r/rn, 1.0/6.0)*img_r, pow(avg_g/gn, 1.0/6.0)*img_g, pow(avg_b/bn, 1.0/6.0)*img_b); - double reds = avg_r / std::max(1, rn) * refwb_red; + double reds = avg_r / std::max(1, rn) * refwb_red; double greens = avg_g / std::max(1, gn) * refwb_green; - double blues = avg_b / std::max(1, bn) * refwb_blue; + double blues = avg_b / std::max(1, bn) * refwb_blue; - redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; + redAWBMul = rm = imatrices.rgb_cam[0][0] * reds + imatrices.rgb_cam[0][1] * greens + imatrices.rgb_cam[0][2] * blues; greenAWBMul = gm = imatrices.rgb_cam[1][0] * reds + imatrices.rgb_cam[1][1] * greens + imatrices.rgb_cam[1][2] * blues; - blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; + blueAWBMul = bm = imatrices.rgb_cam[2][0] * reds + imatrices.rgb_cam[2][1] * greens + imatrices.rgb_cam[2][2] * blues; } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) +ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal, StandardObserver observer) { int x; @@ -4118,7 +6614,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vectorgetSensorType() != ST_BAYER) { - if(ri->getSensorType() == ST_FUJI_XTRANS) { + if (ri->getSensorType() == ST_FUJI_XTRANS) { int d[9][2] = {{0, 0}, { -1, -1}, { -1, 0}, { -1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}; for (size_t i = 0; i < red.size(); i++) { @@ -4131,7 +6627,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (ri->ISXTRANSRED(yv, xv)) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -4169,7 +6665,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector 52500 || + if (initialGain * (rawData[yr][3 * xr] ) > 52500 || initialGain * (rawData[yg][3 * xg + 1]) > 52500 || initialGain * (rawData[yb][3 * xb + 2]) > 52500) { continue; @@ -4181,7 +6677,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && ymin >= 0 && xmax < W && ymax < H) { - reds += (rawData[yr][3 * xr] ); + reds += (rawData[yr][3 * xr] ); greens += (rawData[yg][3 * xg + 1]); blues += (rawData[yb][3 * xb + 2]); rn++; @@ -4204,7 +6700,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (c == 0) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -4240,7 +6736,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (c == 0) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -4276,7 +6772,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector= 0 && yv >= 0 && xv < W && yv < H) { + if (xv >= 0 && yv >= 0 && xv < W && yv < H) { if (c == 0) { //RED rloc += (rawData[yv][xv]); rnbrs++; @@ -4317,13 +6813,10 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vectorgetSensorType() == ST_FUJI_XTRANS ? ri->XTRANSFC(ynew,xnew) : ri->FC(ynew,xnew); int val = round(rawData[ynew][xnew] / scale_mul[c]); - if(c == 0) { + if (c == 0) { R = val; G = 0; B = 0; - } else if(c == 2) { + } else if (c == 2) { R = 0; G = 0; B = val; } else { R = 0; G = val; B = 0; } } +bool RawImageSource::isGainMapSupported() const { + return ri->isGainMapSupported(); +} + +void RawImageSource::applyDngGainMap(const float black[4], const std::vector &gainMaps) { + // now we can apply each gain map to raw_data + array2D mvals[2][2]; + for (auto &m : gainMaps) { + mvals[m.Top & 1][m.Left & 1](m.MapPointsH, m.MapPointsV, m.MapGain.data()); + } + + // now we assume, col_scale and row scale is the same for all maps + const float col_scale = float(gainMaps[0].MapPointsH-1) / float(W); + const float row_scale = float(gainMaps[0].MapPointsV-1) / float(H); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (std::size_t y = 0; y < static_cast(H); ++y) { + const float rowBlack[2] = {black[FC(y,0)], black[FC(y,1)]}; + const float ys = y * row_scale; + float xs = 0.f; + for (std::size_t x = 0; x < static_cast(W); ++x, xs += col_scale) { + const float f = getBilinearValue(mvals[y & 1][x & 1], xs, ys); + const float b = rowBlack[x & 1]; + rawData[y][x] = rtengine::max((rawData[y][x] - b) * f + b, 0.f); + } + } +} + void RawImageSource::cleanup () { delete phaseOneIccCurve; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index bd460c61b..b19c6f5c0 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -24,8 +24,10 @@ #include "array2D.h" #include "colortemp.h" +#include "dnggainmap.h" #include "iimage.h" #include "imagesource.h" +#include "procparams.h" #define HR_SCALE 2 @@ -37,7 +39,7 @@ class DiagonalCurve; class RetinextransmissionCurve; class RetinexgaintransmissionCurve; -class RawImageSource : public ImageSource +class RawImageSource final : public ImageSource { private: static DiagonalCurve *phaseOneIccCurve; @@ -45,7 +47,7 @@ private: static LUTf invGrad; // for fast_demosaic static LUTf initInvGrad (); 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); + int defTransform (int tran); protected: MyMutex getImageMutex; // locks getImage @@ -86,11 +88,13 @@ protected: // the interpolated green plane: array2D green; + array2D greenloc; // the interpolated red plane: array2D red; + array2D redloc; // the interpolated blue plane: array2D blue; - // the interpolated green plane: + array2D blueloc; array2D* greenCache; // the interpolated red plane: array2D* redCache; @@ -104,10 +108,11 @@ protected: std::vector histMatchingCache; const std::unique_ptr histMatchingParams; - 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); - void transformPosition (int x, int y, int tran, int& tx, int& ty); + 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); + void transformPosition(int x, int y, int tran, int& tx, int& ty); + void ItcWB(bool extra, double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::WBParams & wbpar, const procparams::ToneCurveParams &hrp); unsigned FC(int row, int col) const; inline void getRowStartEnd (int x, int &start, int &end); @@ -120,14 +125,11 @@ public: 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 filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) override; - bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const procparams::FilmNegativeParams ¤tParams, std::array& newExps) override; void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) 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 flush () override; void HLRecovery_Global (const procparams::ToneCurveParams &hrp) override; void refinement(int PassCount); void setBorder(unsigned int rawBorder) override {border = rawBorder;} @@ -136,11 +138,15 @@ public: return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } - void processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, const float black[4]); - void copyOriginalPixels(const procparams::RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); + void processFlatField(const procparams::RAWParams &raw, const RawImage *riFlatFile, array2D &rawData, const float black[4]); + void copyOriginalPixels(const procparams::RAWParams &raw, RawImage *ri, const RawImage *riDark, RawImage *riFlatFile, array2D &rawData ); void scaleColors (int winx, int winy, int winw, int winh, const procparams::RAWParams &raw, array2D &rawData); // raw for cblack + void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override; + void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override; + void getrgbloc(int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, const procparams::WBParams & wbpar) override; - void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; + void getWBMults (const ColorTemp &ctemp, const procparams::RAWParams &raw, std::array& scale_mul, float &autoGainComp, float &rm, float &gm, float &bm) const override; + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw, int opposed) override; eSensorType getSensorType () const override; bool isMono () const override; ColorTemp getWB () const override @@ -148,7 +154,7 @@ public: return camera_wb; } 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; + ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal, StandardObserver observer) override; bool isWBProviderReady () override { return rawData; @@ -172,26 +178,29 @@ public: return true; } + bool isGainMapSupported() const override; + void setProgressListener (ProgressListener* pl) override { plistener = pl; } 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; + void getAutoMatchedToneCurve(const procparams::ColorManagementParams &cp, StandardObserver observer, std::vector &outCurve) override; DCPProfile *getDCP(const procparams::ColorManagementParams &cmp, DCPProfileApplyState &as) override; 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 procparams::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) { - colorSpaceConversion_ (im, cmp, wb, pre_mul, embedded, camprofile, cam, camName); + colorSpaceConversion_(im, cmp, wb, pre_mul, embedded, camprofile, cam, camName); } - static void inverse33 (const double (*coeff)[3], double (*icoeff)[3]); + static void inverse33(const double (*coeff)[3], double (*icoeff)[3]); void MSR(float** luminance, float **originalLuminance, float **exLuminance, const LUTf& mapcurve, bool mapcontlutili, int width, int height, const procparams::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) override; - static void HLRecovery_Luminance (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval); + void HLRecovery_inpaint (float** red, float** green, float** blue, int blur); + void highlight_recovery_opposed(float scale_mul[3], const ColorTemp &wb, float gainth); + 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 (); @@ -225,10 +234,10 @@ public: protected: typedef unsigned short ushort; - void processFalseColorCorrection (Imagefloat* i, const int steps); - inline void convert_row_to_YIQ (const float* const r, const float* const g, const float* const b, float* Y, float* I, float* Q, const int W); - 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); + void processFalseColorCorrection(Imagefloat* i, const int steps); + inline void convert_row_to_YIQ(const float* const r, const float* const g, const float* const b, float* Y, float* I, float* Q, const int W); + 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 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); @@ -240,7 +249,7 @@ protected: double cared, double cablue, bool avoidColourshift, - const array2D &rawData, + array2D &rawData, double* fitParamsTransfer, bool fitParamsIn, bool fitParamsOut, @@ -258,7 +267,7 @@ protected: int findZeroPixels(PixelsMap &bpMap) const; 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_global(array2D &rawData); void green_equilibrate (const GreenEqulibrateThreshold &greenthresh, array2D &rawData);//Emil's green equilibration void nodemosaic(bool bw); @@ -275,8 +284,8 @@ protected: void rcd_demosaic(size_t chunkSize = 1, bool measure = false); void border_interpolate(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); + void fill_raw(float (*cache)[3], int x0, int y0, float** rawData); + void fill_border(float (*cache)[3], int border, int x0, int y0); void copy_to_buffer(float (*image2)[2], float (*image)[3]); void dcb_hid(float (*image)[3], int x0, int y0); void dcb_color(float (*image)[3], int x0, int y0); @@ -288,15 +297,21 @@ protected: void restore_from_buffer(float (*image)[3], float (*image2)[2]); 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 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, 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 fast_xtrans_interpolate_blend (const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void pixelshift(int winx, int winy, int winw, int winh, const procparams::RAWParams &rawParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); + void bayer_bilinear_demosaic(const float *const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) override; + void applyDngGainMap(const float black[4], const std::vector &gainMaps); +public: + void wbMul2Camera(double &rm, double &gm, double &bm) override; + void wbCamera2Mul(double &rm, double &gm, double &bm) override; }; } diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index 5a86aec40..3a88e1a9a 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -1,7 +1,7 @@ /* * 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) + * Copyright (c) 2017-2020 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 @@ -21,7 +21,6 @@ #include "rawimagesource.h" #include "rt_math.h" #include "../rtgui/multilangmgr.h" -#include "opthelper.h" #include "StopWatch.h" using namespace std; @@ -36,7 +35,7 @@ unsigned fc(const unsigned int cfa[2][2], int r, int c) { namespace rtengine { -/** +/* * RATIO CORRECTED DEMOSAICING * Luis Sanz Rodriguez (luis.sanz.rodriguez(at)gmail(dot)com) * @@ -45,11 +44,27 @@ namespace rtengine * Original code from https://github.com/LuisSR/RCD-Demosaicing * Licensed under the GNU GPL version 3 */ + // Tiled version by Ingo Weyrich (heckflosse67@gmx.de) +// Luis Sanz Rodriguez significantly optimised the v 2.3 code and simplified the directional +// coefficients in an exact, shorter and more performant formula. +// In cooperation with Hanno Schwalm (hanno@schwalm-bremen.de) and Luis Sanz Rodriguez this has been tuned for performance. + void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) { - std::unique_ptr stop; + // Test for RGB cfa + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + if (FC(i, j) == 3) { + // avoid crash + std::cout << "rcd_demosaic supports only RGB Colour filter arrays. Falling back to igv_interpolate" << std::endl; + igv_interpolate(W, H); + return; + } + } + } + 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")); @@ -63,40 +78,44 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) } const unsigned int cfarray[2][2] = {{FC(0,0), FC(0,1)}, {FC(1,0), FC(1,1)}}; + constexpr int tileBorder = 9; // avoid tile-overlap errors constexpr int rcdBorder = 9; - constexpr int tileSize = 214; - constexpr int tileSizeN = tileSize - 2 * rcdBorder; + constexpr int tileSize = 194; + constexpr int tileSizeN = tileSize - 2 * tileBorder; 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; + constexpr float eps = 1e-5f; + constexpr float epssq = 1e-10f; + constexpr float scale = 65536.f; #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 + float *const cfa = (float*) calloc(tileSize * tileSize, sizeof *cfa); + float (*const rgb)[tileSize * tileSize] = (float (*)[tileSize * tileSize])malloc(3 * sizeof *rgb); + float *const VH_Dir = (float*) calloc(tileSize * tileSize, sizeof *VH_Dir); + float *const PQ_Dir = (float*) calloc(tileSize * tileSize / 2, sizeof *PQ_Dir); + float *const lpf = PQ_Dir; // reuse buffer, they don't overlap in usage + float *const P_CDiff_Hpf = (float*) calloc(tileSize * tileSize / 2, sizeof *P_CDiff_Hpf); + float *const Q_CDiff_Hpf = (float*) calloc(tileSize * tileSize / 2, sizeof *Q_CDiff_Hpf); #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) { + 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) { + if (rowStart + tileBorder == rowEnd - tileBorder) { continue; } const int colStart = tc * tileSizeN; const int colEnd = std::min(colStart + tileSize, W); - if(colStart + rcdBorder == colEnd - rcdBorder) { + if (colStart + tileBorder == colEnd - tileBorder) { continue; } @@ -104,104 +123,115 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) const int tilecols = std::min(colEnd - colStart, tileSize); for (int row = rowStart; row < rowEnd; row++) { - int indx = (row - rowStart) * tileSize; - int c0 = fc(cfarray, row, colStart); - int c1 = fc(cfarray, 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); + const int c0 = fc(cfarray, row, colStart); + const int c1 = fc(cfarray, row, colStart + 1); + for (int col = colStart, indx = (row - rowStart) * tileSize; col < colEnd; ++col, ++indx) { + cfa[indx] = rgb[c0][indx] = rgb[c1][indx] = LIM01(rawData[row][col] / scale); } } - /** - * STEP 1: Find cardinal and diagonal interpolation directions - */ + // Step 1: Find cardinal and diagonal interpolation directions + float bufferV[3][tileSize - 8]; - 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]); + // Step 1.1: Calculate the square of the vertical and horizontal color difference high pass filter + for (int row = 3; row < std::min(tileRows - 3, 5); ++row) { + for (int col = 4, indx = row * tileSize + col; col < tilecols - 4; ++col, ++indx) { + bufferV[row - 3][col - 4] = SQR((cfa[indx - w3] - cfa[indx - w1] - cfa[indx + w1] + cfa[indx + w3]) - 3.f * (cfa[indx - w2] + cfa[indx + w2]) + 6.f * cfa[indx]); + } + } + + // Step 1.2: Obtain the vertical and horizontal directional discrimination strength + float bufferH[tileSize - 6] ALIGNED16; + float* V0 = bufferV[0]; + float* V1 = bufferV[1]; + float* V2 = bufferV[2]; + for (int row = 4; row < tileRows - 4; ++row) { + for (int col = 3, indx = row * tileSize + col; col < tilecols - 3; ++col, ++indx) { + bufferH[col - 3] = SQR((cfa[indx - 3] - cfa[indx - 1] - cfa[indx + 1] + cfa[indx + 3]) - 3.f * (cfa[indx - 2] + cfa[indx + 2]) + 6.f * cfa[indx]); + } + for (int col = 4, indx = (row + 1) * tileSize + col; col < tilecols - 4; ++col, ++indx) { + V2[col - 4] = SQR((cfa[indx - w3] - cfa[indx - w1] - cfa[indx + w1] + cfa[indx + w3]) - 3.f * (cfa[indx - w2] + cfa[indx + w2]) + 6.f * cfa[indx]); + } + for (int col = 4, indx = row * tileSize + col; col < tilecols - 4; ++col, ++indx) { + + float V_Stat = std::max(epssq, V0[col - 4] + V1[col - 4] + V2[col - 4]); + float H_Stat = std::max(epssq, bufferH[col - 4] + bufferH[col - 3] + bufferH[col - 2]); VH_Dir[indx] = V_Stat / (V_Stat + H_Stat); } + // rotate pointers from row0, row1, row2 to row1, row2, row0 + std::swap(V0, V2); + std::swap(V0, V1); } - /** - * 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(cfarray, 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 2: 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(cfarray, row, 0) & 1), indx = row * tileSize + col, lpindx = indx / 2; col < tilecols - 2; col += 2, indx += 2, ++lpindx) { + lpf[lpindx] = cfa[indx] + + 0.5f * (cfa[indx - w1] + cfa[indx + w1] + cfa[indx - 1] + cfa[indx + 1]) + + 0.25f * (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(cfarray, 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; - + // Step 3: Populate the green channel at blue and red CFA positions + for (int row = 4; row < tileRows - 4; ++row) { + for (int col = 4 + (fc(cfarray, row, 0) & 1), indx = row * tileSize + col, lpindx = indx / 2; col < tilecols - 4; col += 2, indx += 2, ++lpindx) { // 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]); + const float cfai = cfa[indx]; + const float N_Grad = eps + (std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfai - cfa[indx - w2])) + (std::fabs(cfa[indx - w1] - cfa[indx - w3]) + std::fabs(cfa[indx - w2] - cfa[indx - w4])); + const float S_Grad = eps + (std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfai - cfa[indx + w2])) + (std::fabs(cfa[indx + w1] - cfa[indx + w3]) + std::fabs(cfa[indx + w2] - cfa[indx + w4])); + const float W_Grad = eps + (std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfai - cfa[indx - 2])) + (std::fabs(cfa[indx - 1] - cfa[indx - 3]) + std::fabs(cfa[indx - 2] - cfa[indx - 4])); + const float E_Grad = eps + (std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfai - 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])); + const float lpfi = lpf[lpindx]; + const float N_Est = cfa[indx - w1] * (lpfi + lpfi) / (eps + lpfi + lpf[lpindx - w1]); + const float S_Est = cfa[indx + w1] * (lpfi + lpfi) / (eps + lpfi + lpf[lpindx + w1]); + const float W_Est = cfa[indx - 1] * (lpfi + lpfi) / (eps + lpfi + lpf[lpindx - 1]); + const float E_Est = cfa[indx + 1] * (lpfi + lpfi) / (eps + lpfi + lpf[lpindx + 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); + const float V_Est = (S_Grad * N_Est + N_Grad * S_Est) / (N_Grad + S_Grad); + const 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; + // Refined vertical and horizontal local discrimination + const float VH_Central_Value = VH_Dir[indx]; + const 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])); + const float VH_Disc = std::fabs(0.5f - VH_Central_Value) < std::fabs(0.5f - VH_Neighbourhood_Value) ? VH_Neighbourhood_Value : VH_Central_Value; + rgb[1][indx] = intp(VH_Disc, H_Est, 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(cfarray, 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.0: Calculate the square of the P/Q diagonals color difference high pass filter + for (int row = 3; row < tileRows - 3; ++row) { + for (int col = 3, indx = row * tileSize + col, indx2 = indx / 2; col < tilecols - 3; col+=2, indx+=2, indx2++ ) { + P_CDiff_Hpf[indx2] = SQR((cfa[indx - w3 - 3] - cfa[indx - w1 - 1] - cfa[indx + w1 + 1] + cfa[indx + w3 + 3]) - 3.f * (cfa[indx - w2 - 2] + cfa[indx + w2 + 2]) + 6.f * cfa[indx]); + Q_CDiff_Hpf[indx2] = SQR((cfa[indx - w3 + 3] - cfa[indx - w1 + 1] - cfa[indx + w1 - 1] + cfa[indx + w3 - 3]) - 3.f * (cfa[indx - w2 + 2] + cfa[indx + w2 - 2]) + 6.f * cfa[indx]); + } + } + // Step 4.1: Obtain the P/Q diagonals directional discrimination strength + for (int row = 4; row < tileRows - 4; ++row) { + for (int col = 4 + (fc(cfarray, row, 0) & 1), indx = row * tileSize + col, indx2 = indx / 2, indx3 = (indx - w1 - 1) / 2, indx4 = (indx + w1 - 1) / 2; col < tilecols - 4; col += 2, indx += 2, indx2++, indx3++, indx4++ ) { + float P_Stat = std::max(epssq, P_CDiff_Hpf[indx3] + P_CDiff_Hpf[indx2] + P_CDiff_Hpf[indx4 + 1]); + float Q_Stat = std::max(epssq, Q_CDiff_Hpf[indx3 + 1] + Q_CDiff_Hpf[indx2] + Q_CDiff_Hpf[indx4]); + PQ_Dir[indx2] = 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(cfarray, row, rcdBorder - 1) & 1), indx = row * tileSize + col, c = 2 - fc(cfarray, row, col); col < tilecols - rcdBorder + 3; col += 2, indx += 2) { + for (int row = 4; row < tileRows - 4; ++row) { + for (int col = 4 + (fc(cfarray, row, 0) & 1), indx = row * tileSize + col, c = 2 - fc(cfarray, row, col), pqindx = indx / 2, pqindx2 = (indx - w1 - 1) / 2, pqindx3 = (indx + w1 - 1) / 2; col < tilecols - 4; col += 2, indx += 2, ++pqindx, ++pqindx2, ++pqindx3) { // 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_Central_Value = PQ_Dir[pqindx]; + float PQ_Neighbourhood_Value = 0.25f * (PQ_Dir[pqindx2] + PQ_Dir[pqindx2 + 1] + PQ_Dir[pqindx3] + PQ_Dir[pqindx3 + 1]); float PQ_Disc = (std::fabs(0.5f - PQ_Central_Value) < std::fabs(0.5f - PQ_Neighbourhood_Value)) ? PQ_Neighbourhood_Value : PQ_Central_Value; @@ -222,17 +252,16 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) 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; - + rgb[c][indx] = rgb[1][indx] + intp(PQ_Disc, Q_Est, P_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(cfarray, row, rcdBorder - 1) & 1), indx = row * tileSize + col; col < tilecols - rcdBorder; col += 2, indx += 2) { + for (int row = 4; row < tileRows - 4; ++row) { + for (int col = 4 + (fc(cfarray, row, 1) & 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_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; @@ -266,24 +295,28 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) 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; - + rgb[c][indx] = rgb1 + intp(VH_Disc, H_Est, V_Est); } } } - for (int row = rowStart + rcdBorder; row < rowEnd - rcdBorder; ++row) { - for (int col = colStart + rcdBorder; col < colEnd - rcdBorder; ++col) { + // For the outermost tiles in all directions we can use a smaller border margin + const int firstVertical = rowStart + ((tr == 0) ? rcdBorder : tileBorder); + const int lastVertical = rowEnd - ((tr == numTh - 1) ? rcdBorder : tileBorder); + const int firstHorizontal = colStart + ((tc == 0) ? rcdBorder : tileBorder); + const int lastHorizontal = colEnd - ((tc == numTw - 1) ? rcdBorder : tileBorder); + for (int row = firstVertical; row < lastVertical; ++row) { + for (int col = firstHorizontal; col < lastHorizontal; ++col) { int idx = (row - rowStart) * tileSize + col - colStart ; - red[row][col] = std::max(0.f, rgb[0][idx] * 65535.f); - green[row][col] = std::max(0.f, rgb[1][idx] * 65535.f); - blue[row][col] = std::max(0.f, rgb[2][idx] * 65535.f); + red[row][col] = std::max(0.f, rgb[0][idx] * scale); + green[row][col] = std::max(0.f, rgb[1][idx] * scale); + blue[row][col] = std::max(0.f, rgb[2][idx] * scale); } } - if(plistener) { + if (plistener) { progresscounter++; - if(progresscounter % 32 == 0) { + if (progresscounter % 32 == 0) { #ifdef _OPENMP #pragma omp critical (rcdprogress) #endif @@ -294,7 +327,6 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) } } } - } } @@ -302,6 +334,8 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) free(rgb); free(VH_Dir); free(PQ_Dir); + free(P_CDiff_Hpf); + free(Q_CDiff_Hpf); } border_interpolate(W, H, rcdBorder, rawData, red, green, blue); @@ -309,7 +343,6 @@ void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) if (plistener) { plistener->setProgress(1); } - // ------------------------------------------------------------------------- } } /* namespace */ diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index b77eac29c..eb4a3f888 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -28,23 +28,23 @@ // Aligned so the first entry starts on line 30. int refreshmap[rtengine::NUMOFEVENTS] = { ALL, // EvPhotoLoaded, - ALL, // EvProfileLoaded, + 0, // EvProfileLoaded : obsolete, ALL, // EvProfileChanged, ALL, // EvHistoryBrowsed, - RGBCURVE, // EvBrightness, - RGBCURVE, // EvContrast, - RGBCURVE, // EvBlack, - RGBCURVE, // EvExpComp, - RGBCURVE, // EvHLCompr, - RGBCURVE, // EvSHCompr, - RGBCURVE, // EvToneCurve1, + AUTOEXP, // EvBrightness, + AUTOEXP, // EvContrast, + AUTOEXP, // EvBlack, + AUTOEXP, // EvExpComp, + AUTOEXP, // EvHLCompr, + AUTOEXP, // EvSHCompr, + AUTOEXP, // EvToneCurve1, AUTOEXP, // EvAutoExp, AUTOEXP, // EvClip, LUMINANCECURVE, // EvLBrightness, LUMINANCECURVE, // EvLContrast, - LUMINANCECURVE, // EvLBlack, - LUMINANCECURVE, // EvLHLCompr, - LUMINANCECURVE, // EvLSHCompr, + 0, // EvLBlack : obsolete, + 0, // EvLHLCompr : obsolete, + 0, // EvLSHCompr : obsolete, LUMINANCECURVE, // EvLLCurve, SHARPENING, // EvShrEnabled, SHARPENING, // EvShrRadius, @@ -60,59 +60,59 @@ int refreshmap[rtengine::NUMOFEVENTS] = { SHARPENING, // EvShrDAmount, SHARPENING, // EvShrDDamping, SHARPENING, // EvShrDIterations, - TRANSFORM, // EvLCPUseDist, + HDR, // EvLCPUseDist, DARKFRAME, // EvLCPUseVign, - TRANSFORM, // EvLCPUseCA, + HDR, // EvLCPUseCA, M_VOID, // EvFixedExp ALLNORAW, // EvWBMethod, ALLNORAW, // EvWBTemp, ALLNORAW, // EvWBGreen, - RGBCURVE, // EvToneCurveMode1, - RGBCURVE, // EvToneCurve2, - RGBCURVE, // EvToneCurveMode2, + AUTOEXP, // EvToneCurveMode1, + AUTOEXP, // EvToneCurve2, + AUTOEXP, // EvToneCurveMode2, 0, // EvLDNRadius: obsolete, 0, // EvLDNEdgeTolerance: obsolete, 0, // EvCDNEnabled:obsolete, 0, // free entry - RGBCURVE|M_AUTOEXP, // EvDCPToneCurve, + RGBCURVE | M_AUTOEXP, // EvDCPToneCurve, ALLNORAW, // EvDCPIlluminant, - RETINEX, // EvSHEnabled, - RGBCURVE, // EvSHHighlights, - RGBCURVE, // EvSHShadows, - RGBCURVE, // EvSHHLTonalW, - RGBCURVE, // EvSHSHTonalW, - RGBCURVE, // EvSHLContrast, - RETINEX, // EvSHRadius, + LUMINANCECURVE, // EvSHEnabled, + LUMINANCECURVE, // EvSHHighlights, + LUMINANCECURVE, // EvSHShadows, + LUMINANCECURVE, // EvSHHLTonalW, + LUMINANCECURVE, // EvSHSHTonalW, + 0, // EvSHLContrast : obsolete, + LUMINANCECURVE, // EvSHRadius, ALLNORAW, // EvCTRotate, ALLNORAW, // EvCTHFlip, ALLNORAW, // EvCTVFlip, - TRANSFORM, // EvROTDegree, - TRANSFORM, // EvTransAutoFill, - TRANSFORM, // EvDISTAmount, + HDR, // EvROTDegree, + HDR, // EvTransAutoFill, + HDR, // EvDISTAmount, ALL, // EvBookmarkSelected, CROP, // EvCrop, - TRANSFORM, // EvCACorr, + HDR, // EvCACorr, ALLNORAW, // EvHREnabled, - ALLNORAW, // EvHRAmount, - ALLNORAW, // EvHRMethod, + 0, // EvHRAmount : obsolete, + ALLNORAW|M_RAW, // EvHRMethod, DEMOSAIC, // EvWProfile, OUTPUTPROFILE, // EvOProfile, ALLNORAW, // EvIProfile, - TRANSFORM, // EvVignettingAmount, - RGBCURVE, // EvChMixer, + HDR, // EvVignettingAmount, + AUTOEXP, // EvChMixer, RESIZE, // EvResizeScale, RESIZE, // EvResizeMethod, EXIF, // EvExif, IPTC, // EvIPTC - RESIZE, // EvResizeSpec, + 0, // EvResizeSpec : obsolete, RESIZE, // EvResizeWidth RESIZE, // EvResizeHeight RESIZE, // EvResizeEnabled ALL, // EvProfileChangeNotification - RETINEX, // EvShrHighQuality - TRANSFORM, // EvPerspCorr + 0, // EvSHHighQuality : obsolete + HDR, // EvPerspCorr DARKFRAME, // EvLCPFile - RGBCURVE, // EvRGBrCurveLumamode + AUTOEXP, // EvRGBrCurveLumamode IMPULSEDENOISE, // EvIDNEnabled, IMPULSEDENOISE, // EvIDNThresh, ALLNORAW, // EvDPDNEnabled, @@ -126,15 +126,15 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // EvLbCurve, DEMOSAIC, // EvDemosaicMethod DARKFRAME, // EvPreProcessHotPixel - RGBCURVE, // EvSaturation, - RGBCURVE, // EvHSVEqualizerH, - RGBCURVE, // EvHSVEqualizerS, - RGBCURVE, // EvHSVEqualizerV, - RGBCURVE, // EvHSVEqEnabled, + AUTOEXP, // EvSaturation, + AUTOEXP, // EvHSVEqualizerH, + AUTOEXP, // EvHSVEqualizerS, + AUTOEXP, // EvHSVEqualizerV, + AUTOEXP, // EvHSVEqEnabled, DEFRINGE, // EvDefringeEnabled, DEFRINGE, // EvDefringeRadius, DEFRINGE, // EvDefringeThreshold, - RGBCURVE, // EvHLComprThreshold, + AUTOEXP, // EvHLComprThreshold, RESIZE, // EvResizeBoundingBox RESIZE, // EvResizeAppliesTo LUMINANCECURVE, // EvCBAvoidClip, @@ -156,13 +156,13 @@ int refreshmap[rtengine::NUMOFEVENTS] = { FLATFIELD, // EvFlatFieldAutoSelect, FLATFIELD, // EvFlatFieldBlurRadius, FLATFIELD, // EvFlatFieldBlurType, - TRANSFORM, // EvAutoDIST, - ALLNORAW, // EvDPDNLumCurve, - ALLNORAW, // EvDPDNChromCurve, - GAMMA, // EvGAMMA - GAMMA, // EvGAMPOS - GAMMA, // EvGAMFREE - GAMMA, // EvSLPOS + HDR, // EvAutoDIST, + 0, // EvDPDNLumCurve : obsolete + 0, // EvDPDNChromCurve : obsolete + 0, // EvGAMMA : obsolete + 0, // EvGAMPOS : obsolete + 0, // EvGAMFREE : obsolete + 0, // EvSLPOS : obsolete DARKFRAME, // EvPreProcessExpBlackzero DARKFRAME, // EvPreProcessExpBlackone DARKFRAME, // EvPreProcessExpBlacktwo @@ -177,30 +177,30 @@ int refreshmap[rtengine::NUMOFEVENTS] = { SHARPENING, // EvSharpenMicroEnabled SHARPENING, // EvSharpenMicroMatrix DEMOSAIC, // EvDemosaicALLEnhanced Disabled but not removed for now, may be reintroduced some day - RGBCURVE, // EvVibranceEnabled - RGBCURVE, // EvVibrancePastels - RGBCURVE, // EvVibranceSaturated - RGBCURVE, // EvVibranceProtectSkins - RGBCURVE, // EvVibranceAvoidColorShift - RGBCURVE, // EvVibrancePastSatTog - RGBCURVE, // EvVibrancePastSatThreshold + AUTOEXP, // EvVibranceEnabled + AUTOEXP, // EvVibrancePastels + AUTOEXP, // EvVibranceSaturated + AUTOEXP, // EvVibranceProtectSkins + AUTOEXP, // EvVibranceAvoidColorShift + AUTOEXP, // EvVibrancePastSatTog + AUTOEXP, // EvVibrancePastSatThreshold SHARPENING, // EvEPDStrength SHARPENING, // EvEPDEdgeStopping SHARPENING, // EvEPDScale SHARPENING, // EvEPDReweightingIterates SHARPENING, // EvEPDEnabled - RGBCURVE, // EvRGBrCurve - RGBCURVE, // EvRGBgCurve - RGBCURVE, // EvRGBbCurve - RGBCURVE, // EvNeutralExp + AUTOEXP, // EvRGBrCurve + AUTOEXP, // EvRGBgCurve + AUTOEXP, // EvRGBbCurve + AUTOEXP, // EvNeutralExp DEMOSAIC | M_PREPROC, // EvDemosaicMethodPreProc LUMINANCECURVE, // EvLCCurve LUMINANCECURVE, // EvLCHCurve - RGBCURVE, // EvVibranceSkinTonesCurve + AUTOEXP, // EvVibranceSkinTonesCurve LUMINANCECURVE, // EvLLCCurve LUMINANCECURVE, // EvLLCredsk ALLNORAW, // EvDPDNLdetail - ALLNORAW, // EvCATEnabled + LUMINANCECURVE, // EvCATEnabled LUMINANCECURVE, // EvCATDegree LUMINANCECURVE, // EvCATMethodsur LUMINANCECURVE, // EvCATAdapscen @@ -235,82 +235,82 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // EvCATAutoadap DEFRINGE, // EvPFCurve ALLNORAW, // EvWBequal - ALLNORAW, // EvWBequalbo - TRANSFORM, // EvGradientDegree - TRANSFORM, // EvGradientEnabled - TRANSFORM, // EvPCVignetteStrength - TRANSFORM, // EvPCVignetteEnabled - RGBCURVE, // EvBWChmixEnabled - RGBCURVE, // EvBWred - RGBCURVE, // EvBWgreen - RGBCURVE, // EvBWblue - RGBCURVE, // EvBWredgam - RGBCURVE, // EvBWgreengam - RGBCURVE, // EvBWbluegam - RGBCURVE, // EvBWfilter - RGBCURVE, // EvBWsetting - RGBCURVE, // EvBWoran - RGBCURVE, // EvBWyell - RGBCURVE, // EvBWcyan - RGBCURVE, // EvBWmag - RGBCURVE, // EvBpur - RGBCURVE, // EvBWLuminanceEqual - RGBCURVE, // EvBWChmixEnabledLm - RGBCURVE, // EvBWmethod - RGBCURVE, // EvBWBeforeCurve - RGBCURVE, // EvBWBeforeCurveMode - RGBCURVE, // EvBWAfterCurve - RGBCURVE, // EvBWAfterCurveMode - RGBCURVE, // EvAutoch + 0, // EvWBequalbo : obsolete + HDR, // EvGradientDegree + HDR, // EvGradientEnabled + HDR, // EvPCVignetteStrength + HDR, // EvPCVignetteEnabled + AUTOEXP, // EvBWChmixEnabled + AUTOEXP, // EvBWred + AUTOEXP, // EvBWgreen + AUTOEXP, // EvBWblue + AUTOEXP, // EvBWredgam + AUTOEXP, // EvBWgreengam + AUTOEXP, // EvBWbluegam + AUTOEXP, // EvBWfilter + AUTOEXP, // EvBWsetting + AUTOEXP, // EvBWoran + AUTOEXP, // EvBWyell + AUTOEXP, // EvBWcyan + AUTOEXP, // EvBWmag + AUTOEXP, // EvBpur + AUTOEXP, // EvBWLuminanceEqual + AUTOEXP, // EvBWChmixEnabledLm + AUTOEXP, // EvBWmethod + AUTOEXP, // EvBWBeforeCurve + AUTOEXP, // EvBWBeforeCurveMode + AUTOEXP, // EvBWAfterCurve + AUTOEXP, // EvBWAfterCurveMode + AUTOEXP, // EvAutoch 0, // --unused-- - RGBCURVE, // EvNeutralBW - TRANSFORM, // EvGradientFeather - TRANSFORM, // EvGradientStrength - TRANSFORM, // EvGradientCenter - TRANSFORM, // EvPCVignetteFeather - TRANSFORM, // EvPCVignetteRoundness - TRANSFORM, // EvVignettingRadius, - TRANSFORM, // EvVignettingStrength - TRANSFORM, // EvVignettingCenter + AUTOEXP, // EvNeutralBW + HDR, // EvGradientFeather + HDR, // EvGradientStrength + HDR, // EvGradientCenter + HDR, // EvPCVignetteFeather + HDR, // EvPCVignetteRoundness + HDR, // EvVignettingRadius, + HDR, // EvVignettingStrength + HDR, // EvVignettingCenter LUMINANCECURVE, // EvLCLCurve LUMINANCECURVE, // EvLLHCurve LUMINANCECURVE, // EvLHHCurve ALLNORAW, // EvDirPyrEqualizerThreshold - ALLNORAW, // EvDPDNenhance - RGBCURVE, // EvBWMethodalg + 0, // EvDPDNenhance : obsolete + AUTOEXP, // EvBWMethodalg ALLNORAW, // EvDirPyrEqualizerSkin ALLNORAW, // EvDirPyrEqlgamutlab ALLNORAW, // EvDirPyrEqualizerHueskin ALLNORAW, // EvDPDNmedian ALLNORAW, // EvDPDNmedmet - RGBCURVE, // EvColorToningEnabled - RGBCURVE, // EvColorToningColor - RGBCURVE, // EvColorToningOpacity - RGBCURVE, // EvColorToningCLCurve - RGBCURVE, // EvColorToningMethod - RGBCURVE, // EvColorToningLLCurve - RGBCURVE, // EvColorToningredlow - RGBCURVE, // EvColorToninggreenlow - RGBCURVE, // EvColorToningbluelow - RGBCURVE, // EvColorToningredmed - RGBCURVE, // EvColorToninggreenmed - RGBCURVE, // EvColorToningbluemed - RGBCURVE, // EvColorToningredhigh - RGBCURVE, // EvColorToninggreenhigh - RGBCURVE, // EvColorToningbluehigh - RGBCURVE, // EvColorToningbalance - RGBCURVE, // EvColorToningNeutral - RGBCURVE, // EvColorToningsatlow - RGBCURVE, // EvColorToningsathigh - RGBCURVE, // EvColorToningTwocolor - RGBCURVE, // EvColorToningNeutralcur - RGBCURVE, // EvColorToningLumamode - RGBCURVE, // EvColorToningShadows - RGBCURVE, // EvColorToningHighights - RGBCURVE, // EvColorToningSatProtection - RGBCURVE, // EvColorToningSatThreshold - RGBCURVE, // EvColorToningStrength - RGBCURVE, // EvColorToningautosat + AUTOEXP, // EvColorToningEnabled + AUTOEXP, // EvColorToningColor + AUTOEXP, // EvColorToningOpacity + AUTOEXP, // EvColorToningCLCurve + AUTOEXP, // EvColorToningMethod + AUTOEXP, // EvColorToningLLCurve + AUTOEXP, // EvColorToningredlow + AUTOEXP, // EvColorToninggreenlow + AUTOEXP, // EvColorToningbluelow + AUTOEXP, // EvColorToningredmed + AUTOEXP, // EvColorToninggreenmed + AUTOEXP, // EvColorToningbluemed + AUTOEXP, // EvColorToningredhigh + AUTOEXP, // EvColorToninggreenhigh + AUTOEXP, // EvColorToningbluehigh + AUTOEXP, // EvColorToningbalance + AUTOEXP, // EvColorToningNeutral + 0, // EvColorToningsatlow : obsolete + 0, // EvColorToningsathigh : obsolete + AUTOEXP, // EvColorToningTwocolor + AUTOEXP, // EvColorToningNeutralcur + AUTOEXP, // EvColorToningLumamode + AUTOEXP, // EvColorToningShadows + AUTOEXP, // EvColorToningHighights + AUTOEXP, // EvColorToningSatProtection + AUTOEXP, // EvColorToningSatThreshold + AUTOEXP, // EvColorToningStrength + AUTOEXP, // EvColorToningautosat ALLNORAW, // EvDPDNmetmed ALLNORAW, // EvDPDNrgbmet ALLNORAW, // EvDPDNpasses @@ -319,14 +319,14 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DARKFRAME, // EvPreProcessExpBlackRed DARKFRAME, // EvPreProcessExpBlackGreen DARKFRAME, // EvPreProcessExpBlackBlue - RGBCURVE, // EvFilmSimulationEnabled - RGBCURVE, // EvFilmSimulationStrength - RGBCURVE, // EvFilmSimulationFilename + AUTOEXP, // EvFilmSimulationEnabled + AUTOEXP, // EvFilmSimulationStrength + AUTOEXP, // EvFilmSimulationFilename ALLNORAW, // EvDPDNLCurve ALLNORAW, // EvDPDNsmet DARKFRAME, // EvPreProcessDeadPixel ALLNORAW, // EvDPDNCCCurve - ALLNORAW, // EvDPDNautochroma + 0, // EvDPDNautochroma : obsolete ALLNORAW, // EvDPDNLmet ALLNORAW, // EvDPDNCmet ALLNORAW, // EvDPDNC2met @@ -419,8 +419,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DIRPYREQUALIZER, // EvWavgreenlow DIRPYREQUALIZER, // EvWavbluelow DIRPYREQUALIZER, // EvWavNeutral - RGBCURVE|M_AUTOEXP, // EvDCPApplyLookTable, - RGBCURVE|M_AUTOEXP, // EvDCPApplyBaselineExposureOffset, + RGBCURVE | M_AUTOEXP, // EvDCPApplyLookTable, + RGBCURVE | M_AUTOEXP, // EvDCPApplyBaselineExposureOffset, ALLNORAW, // EvDCPApplyHueSatMap DIRPYREQUALIZER, // EvWavenacont DIRPYREQUALIZER, // EvWavenachrom @@ -435,7 +435,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DIRPYREQUALIZER, // EvWavNPmet DEMOSAIC, // EvretinexMethod RETINEX, // EvLneigh - RETINEX, // EvLgain + 0, // EvLgain : obsolete RETINEX, // EvLoffs RETINEX, // EvLstr RETINEX, // EvLscal @@ -470,7 +470,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { RETINEX, // EvRetinexgaintransmission RETINEX, // EvLskal OUTPUTPROFILE, // EvOBPCompens - ALLNORAW, // EvWBtempBias + ALLNORAW, // EvWBtempBias DARKFRAME, // EvRawImageNum 0, // unused 0, // unused @@ -499,7 +499,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { 0, // unused DEMOSAIC, // EvPixelShiftMotionMethod DEMOSAIC, // EvPixelShiftSmooth - DEMOSAIC, // EvPixelShiftLmmse + 0, // EvPixelShiftLmmse : obsolete DEMOSAIC, // EvPixelShiftEqualBright DEMOSAIC, // EvPixelShiftEqualBrightChannel LUMINANCECURVE, // EvCATtempout @@ -518,11 +518,674 @@ int refreshmap[rtengine::NUMOFEVENTS] = { HDR, // EvTMFattalThreshold HDR, // EvTMFattalAmount ALLNORAW, // EvWBEnabled - RGBCURVE, // EvRGBEnabled + AUTOEXP, // EvRGBEnabled LUMINANCECURVE, // EvLEnabled DEMOSAIC, // EvPdShrEnabled - CAPTURESHARPEN // EvPdShrMaskToggled - + CAPTURESHARPEN, // EvPdShrMaskToggled + AUTOEXP, // EvLocallabSpotDeleted + HDR, // EvLocallabSpotSelected + M_VOID, // EvLocallabSpotName + M_VOID, // EvLocallabSpotVisibility + AUTOEXP, // EvLocallabSpotShape + AUTOEXP, // EvLocallabSpotSpotMethod + AUTOEXP, // EvLocallabSpotShapeMethod + AUTOEXP, // EvLocallabSpotLocX + AUTOEXP, // EvLocallabSpotLocXL + AUTOEXP, // EvLocallabSpotLocY + AUTOEXP, // EvLocallabSpotLocYT + AUTOEXP, // EvLocallabSpotCenter + AUTOEXP, // EvLocallabSpotCircrad + AUTOEXP, // EvLocallabSpotQualityMethod + AUTOEXP, // EvLocallabSpotTransit + AUTOEXP, // EvLocallabSpotThresh + AUTOEXP, // EvLocallabSpotIter + AUTOEXP, // EvLocallabSpotSensiexclu + AUTOEXP, // EvLocallabSpotStruc + AUTOEXP, // EvlocallabEnabled + AUTOEXP, // EvLocenacolor + AUTOEXP, // Evlocallabcurvactiv + AUTOEXP, // Evlocallablightness + AUTOEXP, // Evlocallabcontrast + AUTOEXP, // Evlocallabchroma + AUTOEXP, // Evlocallabsensi + AUTOEXP, // EvlocallabqualitycurveMethod + AUTOEXP, // Evlocallabllshape + AUTOEXP, // Evlocallabccshape + AUTOEXP, // EvlocallabLHshape + AUTOEXP, // EvlocallabHHshape + AUTOEXP, // Evlocallabinvers + AUTOEXP, // EvLocenaexpose + AUTOEXP, // Evlocallabexpcomp + AUTOEXP, // Evlocallabhlcompr + AUTOEXP, // Evlocallabhlcomprthresh + AUTOEXP, // Evlocallabblack + AUTOEXP, // Evlocallabshcompr + AUTOEXP, // Evlocallabwarm + AUTOEXP, // Evlocallabsensiex + AUTOEXP, // Evlocallabshapeexpos + AUTOEXP, // EvLocenavibrance + AUTOEXP, // EvlocallabSaturated + AUTOEXP, // EvlocallabPastels + AUTOEXP, // EvlocallabPastSatThreshold + AUTOEXP, // EvlocallabProtectSkins + AUTOEXP, // EvlocallabAvoidColorShift + AUTOEXP, // EvlocallabPastSatTog + AUTOEXP, // Evlocallabsensiv + AUTOEXP, // EvlocallabSkinTonesCurve + AUTOEXP, // EvLocenablur + AUTOEXP, // Evlocallabradius + AUTOEXP, // Evlocallabstrength + AUTOEXP, // Evlocallabsensibn + AUTOEXP, // EvlocallabblurMethod + AUTOEXP, // Evlocallabactivlum + AUTOEXP, // EvLocenatonemap + AUTOEXP, // Evlocallabstren + AUTOEXP, // Evlocallabgamma + AUTOEXP, // Evlocallabestop + AUTOEXP, // Evlocallabscaltm + AUTOEXP, // Evlocallabrewei + AUTOEXP, // Evlocallabsensitm + AUTOEXP, // EvLocenareti + AUTOEXP, // EvlocallabretinexMethod + AUTOEXP, // Evlocallabstr + AUTOEXP, // Evlocallabchrrt + AUTOEXP, // Evlocallabneigh + AUTOEXP, // Evlocallabvart + AUTOEXP, // Evlocallabsensih + AUTOEXP, // EvlocallabCTgainCurve + AUTOEXP, // Evlocallabinversret + AUTOEXP, // EvLocenasharp + AUTOEXP, // Evlocallabsharradius + AUTOEXP, // Evlocallabsharamount + AUTOEXP, // Evlocallabshardamping + AUTOEXP, // Evlocallabshariter + AUTOEXP, // Evlocallabsensis + AUTOEXP, // Evlocallabinverssha + AUTOEXP, // EvLocenacbdl + AUTOEXP, // EvlocallabEqualizer + AUTOEXP, // Evlocallabchromacbdl + AUTOEXP, // EvlocallabThresho + AUTOEXP, // Evlocallabsensicb + AUTOEXP, // EvLocenadenoi + AUTOEXP, // Evlocallabnoiselumf + AUTOEXP, // Evlocallabnoiselumc + AUTOEXP, // Evlocallabnoiselumdetail + AUTOEXP, // Evlocallabnoiselequal + AUTOEXP, // Evlocallabnoisechrof + AUTOEXP, // Evlocallabnoisechroc + AUTOEXP, // Evlocallabnoisechrodetail + AUTOEXP, // Evlocallabadjblur + AUTOEXP, // Evlocallabbilateral + AUTOEXP, // Evlocallabsensiden + AUTOEXP, // Evlocallabavoid + AUTOEXP, // Evlocallabsharcontrast + AUTOEXP, // EvLocenacontrast + AUTOEXP, // Evlocallablcradius + AUTOEXP, // Evlocallablcamount + AUTOEXP, // Evlocallablcdarkness + AUTOEXP, // Evlocallablclightness + AUTOEXP, // Evlocallabsensilc + AUTOEXP, // Evlocallabdehaz + AUTOEXP, // EvLocenasoft + AUTOEXP, // EvLocallabstreng + AUTOEXP, // EvLocallabsensisf + AUTOEXP, // Evlocallabsharblur + 0, // EvLocenalabregion : obsolete + AUTOEXP, // EvlocallabshowmaskMethod + AUTOEXP, // EvLocallabSpotSelectedWithMask + AUTOEXP, // EvlocallabCCmaskshape + AUTOEXP, // EvlocallabLLmaskshape + AUTOEXP, // EvlocallabCCmaskexpshape + AUTOEXP, // EvlocallabLLmaskexpshape + AUTOEXP, // EvlocallabHHmaskshape + AUTOEXP, // Evlocallabstructcol + AUTOEXP, // Evlocallabstructexp + AUTOEXP, // EvlocallabHHmaskexpshape + AUTOEXP, // Evlocallabblendmaskcol + AUTOEXP, // Evlocallabblendmaskexp + AUTOEXP, // Evlocallabblurexpde + AUTOEXP, // EvLocallabEnaColorMask + AUTOEXP, // EvLocallabEnaExpMask + AUTOEXP, // Evlocallabblurcolde + AUTOEXP, // Evlocallabinversex + AUTOEXP, // Evlocallabstructexclu + AUTOEXP, // Evlocallabexpchroma + AUTOEXP, // EvLocallabLabGridValue + AUTOEXP, // EvLocallabLabstrengthgrid + AUTOEXP, // EvLocallabgridMethod + AUTOEXP, // EvLocenashadhigh + AUTOEXP, // EvLocallabhighlights + AUTOEXP, // EvLocallabh_tonalwidth + AUTOEXP, // EvLocallabshadows + AUTOEXP, // EvLocallabs_tonalwidth + AUTOEXP, // EvLocallabsh_radius + AUTOEXP, // EvLocallabsensihs + AUTOEXP, // Evlocallabradmaskcol + AUTOEXP, // Evlocallabradmaskexp + AUTOEXP, // EvlocallabToolAdded + AUTOEXP, // EvlocallabCCmaskSHshape + AUTOEXP, // EvlocallabLLmaskSHshape + AUTOEXP, // EvlocallabHHmaskSHshape + AUTOEXP, // EvlocallabblendmaskSH + AUTOEXP, // EvLocallabEnaSHMask + AUTOEXP, // EvlocallabradmaskSH + AUTOEXP, // EvlocallabblurSHde + AUTOEXP, // Evlocallabinverssh + AUTOEXP, // EvLocallabSpotbalan + AUTOEXP, // EvLocallabchromaskexp + AUTOEXP, // EvLocallabgammaskexp + AUTOEXP, // EvLocallabslomaskexp + AUTOEXP, // EvLocallabsoftradiusexp + AUTOEXP, // EvLocallabchromaskcol + AUTOEXP, // EvLocallabgammaskcol + AUTOEXP, // EvLocallabslomaskcol + AUTOEXP, // EvLocallabchromaskSH + AUTOEXP, // EvLocallabgammaskSH + AUTOEXP, // EvLocallabslomaskSH + AUTOEXP, // EvLocallabsoftradiuscol + AUTOEXP, // EvLocallabsoftradiusret + AUTOEXP, // EvLocallabsoftradiuscb + AUTOEXP, // EvLocallabSpotTransitweak + AUTOEXP, // EvLocallabclarityml + AUTOEXP, // EvLocallabcontresid + AUTOEXP, // Evlocallabnoiselumf0 + AUTOEXP, // Evlocallabnoiselumf2 + 0, // Evlocallabblurcbdl + AUTOEXP, // Evlocallabblendmaskcb + AUTOEXP, // Evlocallabradmaskcb + AUTOEXP, // Evlocallabchromaskcb + AUTOEXP, // Evlocallabgammaskcb + AUTOEXP, // Evlocallabslomaskcb + AUTOEXP, // EvlocallabCCmaskcbshape + AUTOEXP, // EvlocallabLLmaskcbshape + AUTOEXP, // EvlocallabHHmaskcbshape + AUTOEXP, // EvLocallabEnacbMask + M_VOID, // EvlocallabToolRemovedWithoutRefresh + AUTOEXP, // Evlocallabsoftradiustm + AUTOEXP, // EvLocallabSpotTransitgrad + AUTOEXP, // Evlocallabamount + AUTOEXP, // Evlocallabsatur + AUTOEXP, // EvlocallabCCmaskretishape + AUTOEXP, // EvlocallabLLmaskretishape + AUTOEXP, // EvlocallabHHmaskretishape + AUTOEXP, // EvLocallabEnaretiMask + AUTOEXP, // Evlocallabblendmaskreti + AUTOEXP, // Evlocallabradmaskreti + AUTOEXP, // Evlocallabchromaskreti + AUTOEXP, // Evlocallabgammaskreti + AUTOEXP, // Evlocallabslomaskreti + AUTOEXP, // EvlocallabToolRemovedWithRefresh + AUTOEXP, // EvLocallabEnaretiMasktmap + AUTOEXP, // Evlocallabscalereti + AUTOEXP, // Evlocallabdarkness + AUTOEXP, // Evlocallablightnessreti + AUTOEXP, // Evlocallablimd + AUTOEXP, // Evlocallablaplace + AUTOEXP, // EvlocallabsoftMethod + AUTOEXP, // Evlocallabequilret + AUTOEXP, // Evlocallabequiltm + AUTOEXP, // Evlocallabfftwlc + AUTOEXP, // Evlocallabfftwreti + AUTOEXP, // EvlocallabshowmasksoftMethod + AUTOEXP, // Evlocallabshadex + AUTOEXP, // EvlocallabexpMethod + AUTOEXP, // EvLocallablaplacexp + AUTOEXP, // EvLocallabbalanexp + AUTOEXP, // EvLocallablinear + AUTOEXP, // EvlocallabCCmasktmshape + AUTOEXP, // EvlocallabLLmasktmshape + AUTOEXP, // EvlocallabHHmasktmshape + AUTOEXP, // EvLocallabEnatmMask + AUTOEXP, // Evlocallabblendmasktm + AUTOEXP, // Evlocallabradmasktm + AUTOEXP, // Evlocallabchromasktm + AUTOEXP, // Evlocallabgammasktm + AUTOEXP, // Evlocallabslomasktm + AUTOEXP, // EvlocallabshowmasktmMethod + AUTOEXP, // EvlocallablocalcontMethod + AUTOEXP, // Evlocallabwavcurve + AUTOEXP, // Evlocallablevelwav + AUTOEXP, // Evlocallabresidcont + AUTOEXP, // EvlocallabCCmaskblshape + AUTOEXP, // EvlocallabLLmaskblshape + AUTOEXP, // EvlocallabHHmaskblshape + AUTOEXP, // EvLocallabEnablMask + AUTOEXP, // EvlocallabshowmaskblMethod + AUTOEXP, // Evlocallabblendmaskbl + AUTOEXP, // Evlocallabradmaskbl + AUTOEXP, // Evlocallabchromaskbl + AUTOEXP, // Evlocallabgammaskbl + AUTOEXP, // Evlocallabslomaskbl + AUTOEXP, // EvlocallabblMethod + AUTOEXP, // EvlocallabmedMethod + AUTOEXP, // Evlocallabitera + AUTOEXP, // Evlocallabguidbl + AUTOEXP, // Evlocallabepsbl + AUTOEXP, // EvlocallabshowmaskcolMethodinv + AUTOEXP, // EvlocallabshowmaskexpMethodinv + AUTOEXP, // EvlocallabshowmaskSHMethodinv + AUTOEXP, // Evlocallabclarilres + AUTOEXP, // Evlocallabclarisoft + AUTOEXP, // Evlocallabclaricres + AUTOEXP, // Evlocallabresidchro + AUTOEXP, // Evlocallabgamm + AUTOEXP, // Evlocallabfatamount + AUTOEXP, // Evlocallabfatdetail + AUTOEXP, // Evlocallabfatanchor + AUTOEXP, // Evlocallabfatlevel + AUTOEXP, // EvlocallabSpotCreated + AUTOEXP, // EvlocallabexnoiseMethod + AUTOEXP, // Evlocallabdepth + AUTOEXP, // Evlocallabloglin + AUTOEXP, // EvlocallabdehazeSaturation + AUTOEXP, // Evlocallaboffs + AUTOEXP, // EvlocallabCTtransCurve + AUTOEXP, // Evlocallabcliptm + AUTOEXP, // Evlocallabenatmmaskaft + AUTOEXP, // EvlocallabenaExpmaskaft + AUTOEXP, // Evlocallablapmasktm + AUTOEXP, // Evlocallablapmaskreti + AUTOEXP, // Evlocallablapmaskexp + AUTOEXP, // Evlocallablapmaskcol + AUTOEXP, // EvlocallablapmaskSH + AUTOEXP, // Evlocallablapmaskcb + AUTOEXP, // Evlocallablapmaskbl + AUTOEXP, // Evlocallablaplac + AUTOEXP, // Evlocallabdetailthr + AUTOEXP, // Evlocallabfftwbl + AUTOEXP, // Evlocallabisogr + AUTOEXP, // Evlocallabstrengr + AUTOEXP, // Evlocallabscalegr + AUTOEXP, // EvlocallabLmaskshape + AUTOEXP, // EvlocallabLmaskexpshape + AUTOEXP, // EvlocallabLmaskSHshape + AUTOEXP, // EvlocallabLmasktmshape + AUTOEXP, // EvlocallabLmaskretishape + AUTOEXP, // EvlocallabLmaskcbshape + AUTOEXP, // EvlocallabLmaskblshape + AUTOEXP, // EvlocallabLLmaskblshapewav + AUTOEXP, // Evlocallabshadmaskbl + AUTOEXP, // EvlocallabLLmaskcolshapewav + AUTOEXP, // Evlocallabshadmaskcol + AUTOEXP, // EvlocallabcsThreshold + AUTOEXP, // EvlocallabcsThresholdblur + AUTOEXP, // EvlocallabcsThresholdcol + AUTOEXP, // Evlocallabdeltae + AUTOEXP, // EvLocallabSpotscopemask + AUTOEXP, // EvlocallabshMethod + AUTOEXP, // EvlocallabEqualizersh + AUTOEXP, // EvlocallabdetailSH + AUTOEXP, // EvlocallabfatamountSH + AUTOEXP, // EvlocallabfatanchorSH + AUTOEXP, // Evlocallabshortc + AUTOEXP, // EvLocallabSpotlumask + AUTOEXP, // EvlocallabgamSH + AUTOEXP, // EvlocallabsloSH + AUTOEXP, // Evlocallabsavrest + AUTOEXP, // Evlocallabrecurs + AUTOEXP, // EvLocallabmergecolMethod + AUTOEXP, // EvLocallabopacol + AUTOEXP, // Evlocallabrgbshape + AUTOEXP, // EvLocallabtoneMethod + AUTOEXP, // EvLocallabspecial + AUTOEXP, // EvLocallabconthrcol + AUTOEXP, // EvLocallabmerMethod + AUTOEXP, // EvLocallabstrumaskcol + AUTOEXP, // EvLocallabstrumaskbl + AUTOEXP, // EvLocallabtoolcol + AUTOEXP, // Evlocallabtoolbl + AUTOEXP, // EvlocallabHHhmaskshape + AUTOEXP, // EvlocallabCCmaskvibshape + AUTOEXP, // EvlocallabLLmaskvibshape + AUTOEXP, // EvlocallabHHmaskvibshape + AUTOEXP, // EvlocallabshowmaskvibMethod + AUTOEXP, // EvLocallabEnavibMask + AUTOEXP, // Evlocallabblendmaskvi + AUTOEXP, // Evlocallabradmaskvib + AUTOEXP, // Evlocallabchromaskvib + AUTOEXP, // Evlocallabgammaskvib + AUTOEXP, // Evlocallabslomaskvib + AUTOEXP, // Evlocallablapmaskvib + AUTOEXP, // EvlocallabLmaskvibshape + AUTOEXP, // EvLocallabLabGridmergValue + AUTOEXP, // EvLocallabmercol + AUTOEXP, // EvLocallabmerlucol + AUTOEXP, // Evlocallabstrmaskexp + AUTOEXP, // Evlocallabangmaskexp + AUTOEXP, // Evlocallabstrexp + AUTOEXP, // Evlocallabangexp + AUTOEXP, // EvlocallabstrSH + AUTOEXP, // EvlocallabangSH + AUTOEXP, // Evlocallabstrcol + AUTOEXP, // Evlocallabangcol + AUTOEXP, // Evlocallabstrcolab + AUTOEXP, // EvLocallabSpotfeather + AUTOEXP, // Evlocallabstrcolh + AUTOEXP, // Evlocallabstrvib + AUTOEXP, // Evlocallabangvib + AUTOEXP, // Evlocallabstrvibab + AUTOEXP, // Evlocallabstrvibh + AUTOEXP, // EvLocallabSpotcomplexMethod + AUTOEXP, // Evlocallabclshape + AUTOEXP, // Evlocallablcshape + AUTOEXP, // Evlocallabblurcol + AUTOEXP, // Evlocallabcontcol + AUTOEXP, // EvLocallabfftColorMask + AUTOEXP | M_AUTOEXP, // EvLocenalog + HDR, // EvLocallabAuto + AUTOEXP, // EvlocallabsourceGray + 0, // EvlocallabsourceGrayAuto : obsolete + HDR, // EvlocallabAutoGray + AUTOEXP, // EvlocallabblackEv + AUTOEXP, // EvlocallabwhiteEv + AUTOEXP, // EvlocallabtargetGray + AUTOEXP, // Evlocallabdetail + AUTOEXP, // Evlocallabsensilog + AUTOEXP, // Evlocallabfullimage + AUTOEXP, // Evlocallabbaselog + AUTOEXP, // Evlocallabresidblur + AUTOEXP, // Evlocallabblurlc + AUTOEXP, // Evlocallablevelblur + AUTOEXP, // EvlocallabwavCurvelev + AUTOEXP, // EvlocallabwavCurvecon + AUTOEXP, // Evlocallabsigma + AUTOEXP, // Evlocallaboriglc + AUTOEXP, // Evlocallabsigmadc + AUTOEXP, // Evlocallabdeltad + AUTOEXP, // EvlocallabwavCurvecomp + AUTOEXP, // Evlocallabfatres + AUTOEXP, // EvLocallabSpotbalanh + AUTOEXP, // EvlocallabwavCurveden + AUTOEXP, // EvlocallabHHmasklcshape + AUTOEXP, // EvlocallabCCmasklcshape + AUTOEXP, // EvlocallabLLmasklcshape + AUTOEXP, // EvlocallabEnalcMask + AUTOEXP, // EvlocallabshowmasklcMethod + AUTOEXP, // Evlocallabblendmasklc + AUTOEXP, // Evlocallabradmasklc + AUTOEXP, // Evlocallabchromasklc + AUTOEXP, // EvlocallabLmasklcshape + AUTOEXP, // Evlocallabchromalev + AUTOEXP, // Evlocallabchromablu + AUTOEXP, // Evlocallaboffset + AUTOEXP, // Evlocallabwavblur + AUTOEXP, // Evlocallabwavcont + AUTOEXP, // Evlocallabwavcomp + AUTOEXP, // Evlocallabwavcompre + AUTOEXP, // EvlocallabwavCurvecompre + AUTOEXP, // Evlocallabresidcomp + AUTOEXP, // Evlocallabthreswav + AUTOEXP, // Evlocallabstrwav + AUTOEXP, // Evlocallabangwav + AUTOEXP, // Evlocallabwavgradl + AUTOEXP, // Evlocallabstrlog + AUTOEXP, // Evlocallabanglog + AUTOEXP, // EvLocallabSpotcolorde + AUTOEXP, // EvlocallabshowmasksharMethod + AUTOEXP, // Evlocallabshowreset + AUTOEXP, // Evlocallabstrengthw + AUTOEXP, // Evlocallabradiusw + AUTOEXP, // Evlocallabdetailw + AUTOEXP, // Evlocallabgradw + AUTOEXP, // Evlocallabtloww + AUTOEXP, // Evlocallabthigw + AUTOEXP, // EvlocallabwavCurveedg + AUTOEXP, // EvlocallablocaledgMethod + AUTOEXP, // Evlocallabwavedg + AUTOEXP, // Evlocallabedgw + AUTOEXP, // Evlocallabbasew + AUTOEXP, // EvlocallablocalneiMethod + AUTOEXP, // Evlocallabwaveshow + AUTOEXP, // EvLocallabSpotwavMethod + AUTOEXP, // EvlocallabchroMethod + AUTOEXP, // Evlocallabstrbl + AUTOEXP, // Evlocallabsigmadr + AUTOEXP, // Evlocallabsigmabl + AUTOEXP, // Evlocallabsigmaed + AUTOEXP, // Evlocallabresidsha + AUTOEXP, // Evlocallabresidshathr + AUTOEXP, // Evlocallabresidhi + AUTOEXP, // Evlocallabresidhithr + AUTOEXP, // Evlocallabsigmalc + AUTOEXP, // Evlocallabsigmalc2 + AUTOEXP, // Evlocallabblwh + AUTOEXP, // EvlocallabcomplexityWithRefresh + 0, // can be reused + AUTOEXP, // EvLocallabSpotcolorscope + AUTOEXP, // EvlocallabshowmasktypMethod + AUTOEXP, // Evlocallabshadmaskblsha + AUTOEXP, // EvLocenamask + AUTOEXP, // Evlocallabsensimask + AUTOEXP, // Evlocallabblendmask + AUTOEXP, // EvLocallabEna_Mask + AUTOEXP, // Evlocallabradmask + AUTOEXP, // Evlocallablapmask + AUTOEXP, // Evlocallabchromask + AUTOEXP, // Evlocallabgammask + AUTOEXP, // Evlocallabslopmask + AUTOEXP, // EvlocallabCCmask_shape + AUTOEXP, // EvlocallabLLmask_shape + AUTOEXP, // EvlocallabHHmask_shape + AUTOEXP, // EvLocallabtoolmask + AUTOEXP, // Evlocallabstrumaskmask + AUTOEXP, // EvlocallabHHhmask_shape + AUTOEXP, // EvLocallabfftmask + AUTOEXP, // Evlocallabblurmask + AUTOEXP, // Evlocallabcontmask + AUTOEXP, // Evlocallabshadmask + AUTOEXP, // EvlocallabLmask_shape + AUTOEXP, // EvlocallabLLmask_shapewav + AUTOEXP, // EvlocallabcsThresholdmask + AUTOEXP, // Evlocallabstr_mask + AUTOEXP, // Evlocallabang_mask + AUTOEXP, // Evlocallabsoftradiusmask + AUTOEXP, // Evlocallabblendmaskab + AUTOEXP, // EvLocallabSpotprevMethod + AUTOEXP, // Evlocallabactiv + AUTOEXP, // EvlocallabCHshape + AUTOEXP, //EvlocallabquaMethod + AUTOEXP, //Evlocallabhishow + AUTOEXP, // Evlocallabinvbl + AUTOEXP, // Evlocallabcatad + AUTOEXP, // Evlocallabciecam + AUTOEXP, // Evlocallabsourceabs + AUTOEXP, // Evlocallabtargabs + AUTOEXP, // Evlocallabsurround + AUTOEXP, // Evlocallabsaturl + AUTOEXP, // Evlocallabcontl + AUTOEXP, //EvlocallabCCmaskshapeL + AUTOEXP, //EvlocallabLLmaskshapeL + AUTOEXP, // EvlocallabHHmaskshapeL + AUTOEXP, // EvlocallabenaLMask + AUTOEXP, // EvlocallabblendmaskL + AUTOEXP, // EvlocallabradmaskL + AUTOEXP, // EvlocallabchromaskL + AUTOEXP, //EvlocallabLmaskshapeL + AUTOEXP, // Evlocallablightl + AUTOEXP, // EvlocallabLshapeL + AUTOEXP, // Evlocallabcontq + AUTOEXP, // Evlocallabsursour + AUTOEXP, // Evlocallablightq + AUTOEXP, // Evlocallabcolorfl + AUTOEXP, // Evlocallabrepar + AUTOEXP, //EvlocallabwavCurvehue + AUTOEXP, // Evlocallablevelthr + AUTOEXP, // Evlocallablevelthrlow + AUTOEXP, //Evlocallabusemask1 + AUTOEXP, // Evlocallablnoiselow + AUTOEXP, // Evlocallabrecothres + AUTOEXP, // Evlocallablowthres + AUTOEXP, // Evlocallabhigthres + AUTOEXP, // Evlocallabrecothresd + AUTOEXP, // Evlocallablowthresd + AUTOEXP, // Evlocallabhigthresd + AUTOEXP, // Evlocallabinvmaskd + AUTOEXP, // Evlocallabinvmask + AUTOEXP, // Evlocallabdecayd + AUTOEXP, // Evlocallabrecothresc + AUTOEXP, // Evlocallablowthresc + AUTOEXP, // Evlocallabhigthresc + AUTOEXP, // Evlocallabdecayc + AUTOEXP, // Evlocallabmidthresd + AUTOEXP, // Evlocallabrecothresl + AUTOEXP, // Evlocallablowthresl + AUTOEXP, // Evlocallabhigthresl + AUTOEXP, // Evlocallabdecayl + AUTOEXP, // Evlocallabrecothrese + AUTOEXP, // Evlocallablowthrese + AUTOEXP, // Evlocallabhigthrese + AUTOEXP, // Evlocallabdecaye + AUTOEXP, // Evlocallabrecothress + AUTOEXP, // Evlocallablowthress + AUTOEXP, // Evlocallabhigthress + AUTOEXP, // Evlocallabdecays + AUTOEXP, // Evlocallabrecothrev + AUTOEXP, // Evlocallablowthresv + AUTOEXP, // Evlocallabhigthresv + AUTOEXP, // Evlocallabdecayv + AUTOEXP, // Evlocallabrecothrew + AUTOEXP, // Evlocallablowthresw + AUTOEXP, // Evlocallabhigthresw + AUTOEXP, // Evlocallabdecayw + AUTOEXP, // Evlocallabmidthresdch + AUTOEXP, // Evlocallabrecothret + AUTOEXP, // Evlocallablowthrest + AUTOEXP, // Evlocallabhigthrest + AUTOEXP, // Evlocallabdecayt + AUTOEXP, // Evlocallabrecothrecb + AUTOEXP, // Evlocallablowthrescb + AUTOEXP, // Evlocallabhigthrescb + AUTOEXP, // Evlocallabdecaycb + AUTOEXP, // Evlocallabrecothrer + AUTOEXP, // Evlocallablowthresr + AUTOEXP, // Evlocallabhigthresr + AUTOEXP, // Evlocallabdecayr + AUTOEXP, // Evlocallabnlstr + AUTOEXP, // Evlocallabnldet + AUTOEXP, // Evlocallabnlpat + AUTOEXP, // Evlocallabnlrad + AUTOEXP, // Evlocallabnlgam + AUTOEXP, // Evlocallabdivgr + AUTOEXP, // EvLocallabSpotavoidrad + AUTOEXP, // EvLocallabSpotavoidmun + AUTOEXP, // Evlocallabcontthres + AUTOEXP, // Evlocallabnorm + AUTOEXP, // Evlocallabreparw + AUTOEXP, // Evlocallabreparcol + AUTOEXP, // Evlocallabreparden + AUTOEXP, // Evlocallabreparsh + AUTOEXP, // Evlocallabreparexp + AUTOEXP, // Evlocallabrepartm + AUTOEXP, // Evlocallabchroml + AUTOEXP, // Evlocallabresidgam + AUTOEXP, // Evlocallabresidslop + AUTOEXP, // Evlocallabnoisegam + AUTOEXP, //Evlocallabgamlc + AUTOEXP, //Evlocallabgamc + AUTOEXP, //Evlocallabgamex + AUTOEXP | M_AUTOEXP, // EvLocenacie + AUTOEXP, //Evlocallabreparcie + HDR, //EvlocallabAutograycie + HDR, //EvlocallabsourceGraycie + HDR, //Evlocallabsourceabscie + AUTOEXP, //Evlocallabsursourcie + AUTOEXP, //Evlocallabsaturlcie + AUTOEXP, //Evlocallabchromlcie + AUTOEXP, //Evlocallablightlcie + AUTOEXP, //Evlocallablightqcie + AUTOEXP, //Evlocallabcontlcie + AUTOEXP, //Evlocallabcontthrescie + AUTOEXP, //Evlocallabcontqcie + AUTOEXP, //Evlocallabcolorflcie + AUTOEXP, //Evlocallabtargabscie + AUTOEXP, //EvlocallabtargetGraycie + AUTOEXP, //Evlocallabcatadcie + AUTOEXP, //Evlocallabdetailcie + AUTOEXP, //Evlocallabsurroundcie + AUTOEXP, //Evlocallabsensicie + AUTOEXP, //Evlocallabmodecie + AUTOEXP, //Evlocallabrstprotectcie + AUTOEXP, //Evlocallabsigmoidldacie + AUTOEXP, //Evlocallabsigmoidthcie + AUTOEXP, //Evlocallabsigmoidblcie + AUTOEXP, //Evlocallabsigmoidqjcie + AUTOEXP, //Evlocallabhuecie + AUTOEXP, //Evlocallabjabcie + AUTOEXP, //Evlocallablightjzcie + AUTOEXP, //Evlocallabcontjzcie + AUTOEXP, //Evlocallabchromjzcie + AUTOEXP, //Evlocallabhuejzcie + AUTOEXP, //Evlocallabsigmoidldajzcie + AUTOEXP, //Evlocallabsigmoidthjzcie + AUTOEXP, //Evlocallabsigmoidbljzcie + AUTOEXP, //Evlocallabadapjzcie + AUTOEXP, //Evlocallabmodecam + AUTOEXP, //Evlocallabhljzcie + AUTOEXP, //Evlocallabhlthjzcie + AUTOEXP, //Evlocallabshjzcie + AUTOEXP, //Evlocallabshthjzcie + AUTOEXP, //Evlocallabradjzcie +// AUTOEXP, //EvlocallabHHshapejz + AUTOEXP, //EvlocallabCHshapejz + AUTOEXP, //Evlocallabjz100 + AUTOEXP, //Evlocallabpqremap + AUTOEXP, //EvlocallabLHshapejz + AUTOEXP, //Evlocallabshargam + AUTOEXP, //Evlocallabvibgam + AUTOEXP, //EvLocallabtoneMethodcie + AUTOEXP, //Evlocallabshapecie + AUTOEXP, //EvLocallabtoneMethodcie2 + AUTOEXP, //Evlocallabshapecie2 + AUTOEXP, //Evlocallabshapejz + AUTOEXP, //Evlocallabshapecz + AUTOEXP, //Evlocallabshapeczjz + AUTOEXP, //Evlocallabforcejz +// AUTOEXP, //Evlocallablightlzcam +// AUTOEXP, //Evlocallablightqzcam +// AUTOEXP, //Evlocallabcontlzcam +// AUTOEXP, //Evlocallabcontqzcam +// AUTOEXP, //Evlocallabcontthreszcam +// AUTOEXP, //Evlocallabcolorflzcam +// AUTOEXP, //Evlocallabsaturzcam +// AUTOEXP, //Evlocallabchromzcam + AUTOEXP, //Evlocallabpqremapcam16 + AUTOEXP, //EvLocallabEnacieMask + AUTOEXP, //EvlocallabCCmaskcieshape + AUTOEXP, //EvlocallabLLmaskcieshape + AUTOEXP, //EvlocallabHHmaskcieshape + AUTOEXP, //Evlocallabblendmaskcie + AUTOEXP, //Evlocallabradmaskcie + AUTOEXP, //Evlocallabchromaskcie + AUTOEXP, //EvlocallabLmaskcieshape + AUTOEXP, //Evlocallabrecothrescie + AUTOEXP, //Evlocallablowthrescie + AUTOEXP, //Evlocallabhigthrescie + AUTOEXP, //Evlocallabdecaycie + AUTOEXP, //Evlocallablapmaskcie + AUTOEXP, //Evlocallabgammaskcie + AUTOEXP, //Evlocallabslomaskcie + AUTOEXP, //Evlocallabqtoj + AUTOEXP, //Evlocallabsaturjzcie + AUTOEXP, //EvLocallabSpotdenoichmask + AUTOEXP, //Evlocallabsigmalcjz + AUTOEXP, //EvlocallabcsThresholdjz + AUTOEXP, //EvlocallabwavCurvejz + AUTOEXP, //Evlocallabclarilresjz + AUTOEXP, //Evlocallabclaricresjz + AUTOEXP, //Evlocallabclarisoftjz + AUTOEXP, //EvlocallabHHshapejz + AUTOEXP, //Evlocallabsoftjzcie + AUTOEXP, //Evlocallabthrhjzcie + AUTOEXP, //Evlocallabchjzcie + AUTOEXP, //Evlocallabstrsoftjzcie + AUTOEXP, //EvlocallabblackEvjz + AUTOEXP, //EvlocallabwhiteEvjz + AUTOEXP, //Evlocallablogjz + AUTOEXP, //Evlocallabtargetjz + AUTOEXP, //Evlocallabforcebw + AUTOEXP, //Evlocallabsigjz + AUTOEXP, //Evlocallabsigq + AUTOEXP //Evlocallablogcie }; @@ -553,6 +1216,7 @@ void RefreshMapper::mapEvent(ProcEvent event, int action) int RefreshMapper::getAction(ProcEvent event) const { auto it = actions_.find(event); + if (it == actions_.end()) { return 0; } else { diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index 0f3e5ee90..b53252796 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -32,6 +32,7 @@ // Elementary functions that can be done to // the preview image when an event occurs +#define M_SPOT (1<<19) #define M_CSHARP (1<<18) #define M_MONITOR (1<<14) #define M_RETINEX (1<<13) @@ -51,23 +52,24 @@ // 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_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_MONITOR) // without HIGHQUAL -#define ALL (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) // without HIGHQUAL -#define DARKFRAME (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define DEMOSAIC (M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define CAPTURESHARPEN (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_CSHARP) -#define HDR (M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define AUTOEXP (M_HDR|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define RGBCURVE (M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define LUMINANCECURVE (M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define SHARPENING (M_LUMINANCE|M_COLOR) -#define IMPULSEDENOISE (M_LUMINANCE|M_COLOR) -#define DEFRINGE (M_LUMINANCE|M_COLOR) -#define DIRPYRDENOISE (M_LUMINANCE|M_COLOR) -#define DIRPYREQUALIZER (M_LUMINANCE|M_COLOR) +#define FIRST (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_MONITOR) // without HIGHQUAL +#define ALL (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) // without HIGHQUAL +#define DARKFRAME (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define DEMOSAIC (M_RAW|M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define ALLNORAW (M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define CAPTURESHARPEN (M_INIT|M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_CSHARP) +#define HDR (M_SPOT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define SPOTADJUST (M_SPOT|M_HDR|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define TRANSFORM (M_SPOT|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define AUTOEXP (M_SPOT|M_HDR|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define RGBCURVE (M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define LUMINANCECURVE (M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define SHARPENING (M_LUMINANCE|M_COLOR) +#define IMPULSEDENOISE (M_LUMINANCE|M_COLOR) +#define DEFRINGE (M_LUMINANCE|M_COLOR) +#define DIRPYRDENOISE (M_LUMINANCE|M_COLOR) +#define DIRPYREQUALIZER (M_LUMINANCE|M_COLOR) #define GAMMA M_VOID //M_MONITOR #define CROP M_CROP #define RESIZE M_VOID diff --git a/rtengine/rescale.h b/rtengine/rescale.h index 70974aa48..2a5892224 100644 --- a/rtengine/rescale.h +++ b/rtengine/rescale.h @@ -20,44 +20,46 @@ #pragma once -#include "array2D.h" #include "rt_math.h" +template +class array2D; + + namespace rtengine { inline float getBilinearValue(const array2D &src, float x, float y) { - const int W = src.width(); - const int H = src.height(); + const int W = src.getWidth(); + const int H = src.getHeight(); // 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); + const int xi = x; + const int yi = y; + const float xf = x - xi; + const float yf = y - yi; + const int xi1 = std::min(xi + 1, W - 1); + const 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]; + const float bl = src[yi][xi]; + const float br = src[yi][xi1]; + const float tl = src[yi1][xi]; + const 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; + const float b = intp(xf, br, bl); + const float t = intp(xf, tr, tl); + return intp(yf, t, b); } 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(); + const int Ws = src.getWidth(); + const int Hs = src.getHeight(); + const int Wd = dst.getWidth(); + const int Hd = dst.getHeight(); float col_scale = float (Ws) / float (Wd); float row_scale = float (Hs) / float (Hd); @@ -78,10 +80,10 @@ inline void rescaleBilinear(const array2D &src, array2D &dst, bool 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(); + const int width = src.getWidth(); + const int height = src.getHeight(); + const int nw = dst.getWidth(); + const int nh = dst.getHeight(); #ifdef _OPENMP #pragma omp parallel for if (multithread) diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index a5b48af95..ff4c572fa 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -34,21 +34,22 @@ #include "sleef.h" 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)); + const float x = -16.f + (16.f / threshold) * val; + return 0.5f * (1.f + x / std::sqrt(1.f + rtengine::SQR(x))); } #ifdef __SSE2__ -vfloat calcBlendFactor(vfloat valv, vfloat thresholdv) { +vfloat calcBlendFactor(vfloat val, vfloat threshold) { // 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)); + const vfloat x = -16.f + (16.f / threshold) * val; + return 0.5f * (1.f + x * _mm_rsqrt_ps(1.f + rtengine::SQR(x))); } #endif @@ -488,4 +489,25 @@ void buildBlendMask(const float* const * luminance, float **blend, int W, int H, } } +double accumulateProduct(const float* data1, const float* data2, size_t n, bool multiThread) { + if (n == 0) { + return 0.0; + } + + // use two accumulators to reduce dependencies (improves speed) and increase accuracy + double acc1 = 0.0; + double acc2 = 0.0; +#ifdef _OPENMP + #pragma omp parallel for reduction(+:acc1,acc2) if(multiThread) +#endif + for (size_t i = 0; i < n - 1; i += 2) { + acc1 += static_cast(data1[i]) * static_cast(data2[i]); + acc2 += static_cast(data1[i + 1]) * static_cast(data2[i + 1]); + } + + if (n & 1) { + acc1 += static_cast(data1[n -1]) * static_cast(data2[n -1]); + } + return acc1 + acc2; +} } diff --git a/rtengine/rt_algo.h b/rtengine/rt_algo.h index 81147fd75..bffe17b57 100644 --- a/rtengine/rt_algo.h +++ b/rtengine/rt_algo.h @@ -25,4 +25,9 @@ namespace rtengine { void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multiThread = true); void buildBlendMask(const float* const * luminance, float **blend, int W, int H, float &contrastThreshold, bool autoContrast = false, float ** clipmask = nullptr); +// implemented in tmo_fattal02 +void buildGradientsMask(int W, int H, float **luminance, float **out, + float amount, int nlevels, int detail_level, + float alfa, float beta, bool multithread); +double accumulateProduct(const float* data1, const float* data2, size_t n, bool multiThread = true); } diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 9342f5430..6d4799254 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -44,6 +44,12 @@ constexpr T pow4(T x) return SQR(SQR(x)); } +template +constexpr T pow5(T x) +{ + return x * pow4(x); +} + template constexpr const T& min(const T& a) { diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 0473622c4..1d7994ace 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -31,17 +31,20 @@ #include "imageformat.h" #include "procevents.h" #include "rawmetadatalocation.h" -#include "rt_math.h" #include "settings.h" #include "../rtgui/threadutils.h" + /** * @file * This file contains the main functionality of the RawTherapee engine. * */ +template +class array2D; + template class LUT; @@ -78,6 +81,7 @@ class IImage8; class IImage16; class IImagefloat; class ImageSource; +class TweakOperator; /** * This class provides functions to obtain exif and IPTC metadata information @@ -302,6 +306,8 @@ public: virtual void sizeChanged(int w, int h, int ow, int oh) = 0; }; +class HistogramObservable; + /** This listener is used when the histogram of the final image has changed. */ class HistogramListener { @@ -327,8 +333,43 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, const LUTu& histChroma, - const LUTu& histLRETI + const LUTu& histLRETI, + int vectorscopeScale, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, + int waveformScale, + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) = 0; + /** Tells which observable is notifying the listener. */ + virtual void setObservable(HistogramObservable* observable) = 0; + /** Returns if the listener wants the histogram to be updated. */ + virtual bool updateHistogram(void) const = 0; + /** Returns if the listener wants the raw histogram to be updated. */ + virtual bool updateHistogramRaw(void) const = 0; + /** Returns if the listener wants the H-C vectorscope to be updated. */ + virtual bool updateVectorscopeHC(void) const = 0; + /** Returns if the listener wants the H-S vectorscope to be updated. */ + virtual bool updateVectorscopeHS(void) const = 0; + /** Returns if the listener wants the waveform to be updated. */ + virtual bool updateWaveform(void) const = 0; +}; + +class HistogramObservable +{ +public: + /** Tells the observable to update the histogram data. */ + virtual void requestUpdateHistogram() = 0; + /** Tells the observable to update the raw histogram data. */ + virtual void requestUpdateHistogramRaw() = 0; + /** Tells the observable to update the H-C vectorscope data. */ + virtual void requestUpdateVectorscopeHC() = 0; + /** Tells the observable to update the H-S vectorscope data. */ + virtual void requestUpdateVectorscopeHS() = 0; + /** Tells the observable to update the waveform data. */ + virtual void requestUpdateWaveform() = 0; }; /** This listener is used when the auto exposure has been recomputed (e.g. when the clipping ratio changed). */ @@ -356,6 +397,8 @@ public : virtual void autoCamChanged(double ccam, double ccamout) = 0; virtual void adapCamChanged(double cadap) = 0; virtual void ybCamChanged(int yb) = 0; + virtual void wbCamChanged(double tem, double tin) = 0; + }; class AutoChromaListener @@ -374,6 +417,46 @@ public: virtual void minmaxChanged(double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax) = 0; }; +class LocallabListener +{ +public: + struct locallabRef { + double huer; + double lumar; + double chromar; + float fab; + }; + + struct locallabRetiMinMax { + double cdma; + double cdmin; + double mini; + double maxi; + double Tmean; + double Tsigma; + double Tmin; + double Tmax; + }; + + struct locallabDenoiseLC { + double highres; + double nres; + double highres46; + double nres46; + double Lhighres; + double Lnres; + double Lhighres46; + double Lnres46; + }; + + virtual ~LocallabListener() = default; +// virtual void refChanged(const std::vector &ref, int selspot) = 0; + virtual void minmaxChanged(const std::vector &minmax, int selspot) = 0; + virtual void denChanged(const std::vector &denlc, int selspot) = 0; + virtual void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1) = 0; + virtual void refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot) = 0; +}; + class AutoColorTonListener { public: @@ -381,6 +464,15 @@ public: virtual void autoColorTonChanged(int bwct, int satthres, int satprot) = 0; }; +class AutoprimListener +{ +public: + virtual ~AutoprimListener() = default; + virtual void primChanged(float rx, float ry, float bx, float by, float gx, float gy) = 0; + virtual void iprimChanged(float r_x, float r_y, float b_x, float b_y, float g_x, float g_y, float w_x, float w_y) = 0; +}; + + class AutoBWListener { public: @@ -392,7 +484,7 @@ class AutoWBListener { public: virtual ~AutoWBListener() = default; - virtual void WBChanged(double temp, double green) = 0; + virtual void WBChanged(double temp, double green, double rw, double gw, double bw, float studgood) = 0; }; class FrameCountListener @@ -413,7 +505,7 @@ class ImageTypeListener { public: virtual ~ImageTypeListener() = default; - virtual void imageTypeChanged(bool isRaw, bool isBayer, bool isXtrans, bool is_Mono = false) = 0; + virtual void imageTypeChanged(bool isRaw, bool isBayer, bool isXtrans, bool is_Mono = false, bool isGainMapSupported = false) = 0; }; class AutoContrastListener @@ -438,6 +530,13 @@ public: }; +class FilmNegListener +{ +public: + virtual ~FilmNegListener() = default; + virtual void filmRefValuesChanged(const procparams::FilmNegativeParams::RGB &refInput, const procparams::FilmNegativeParams::RGB &refOutput) = 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. */ @@ -469,9 +568,20 @@ public: /** Returns the initial image corresponding to the image processor. * @return the initial image corresponding to the image processor */ virtual InitialImage* getInitialImage () = 0; + /** Set the TweakOperator + * @param tOperator is a pointer to the object that will alter the ProcParams for the rendering */ + virtual void setTweakOperator (TweakOperator *tOperator) = 0; + /** Unset the TweakOperator + * @param tOperator is a pointer to the object that were altering the ProcParams for the rendering + * It will only unset the tweak operator if tOperator is the same than the currently set operator. + * If it doesn't match, the currently set TweakOperator will remain set. */ + virtual void unsetTweakOperator (TweakOperator *tOperator) = 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) */ - virtual void getParams (procparams::ProcParams* dst) = 0; + * Since the ProcParams can be tweaked by a GUI to operate on the image at a specific stage or with disabled tool, + * you'll have to specify if you want the tweaked version for the current special mode, or the untweaked one. + * @param dst is the location where the image processing parameters are copied (it is assumed that the memory is allocated by the caller) + * @param tweaked is used to choose between the tweaked ProcParams (if there is one) or the untweaked one */ + virtual void getParams (procparams::ProcParams* dst, bool tweaked=false) = 0; /** An essential member function. Call this when a setting has been changed. This function returns a pointer to the * processing parameters, that you have to update to reflect the changed situation. When ready, call the paramsUpdateReady * function to start the image update. @@ -514,15 +624,18 @@ public: virtual void updateUnLock() = 0; + virtual void setLocallabMaskVisibility(bool previewDeltaE, int locallColorMask, int locallColorMaskinv, int locallExpMask, int locallExpMaskinv, int locallSHMask, int locallSHMaskinv, int locallvibMask, int locallsoftMask, int locallblMask, int localltmMask, int locallretiMask, int locallsharMask, int localllcMask, int locallcbMask, int localllogMask, int locall_Mask, int locallcieMask) = 0; + /** Creates and returns a Crop instance that acts as a window on the image * @param editDataProvider pointer to the EditDataProvider that communicates with the EditSubscriber * @return a pointer to the Crop object that handles the image data trough its own pipeline */ virtual DetailedCrop* createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow) = 0; - virtual bool getAutoWB (double& temp, double& green, double equal, double tempBias) = 0; - virtual void getCamWB (double& temp, double& green) = 0; + virtual bool getAutoWB (double& temp, double& green, double equal, StandardObserver observer, double tempBias) = 0; + virtual void getCamWB (double& temp, double& green, StandardObserver observer) = 0; virtual void getSpotWB (int x, int y, int rectSize, double& temp, double& green) = 0; - virtual bool getFilmNegativeExponents(int xA, int yA, int xB, int yB, std::array& newExps) = 0; + virtual bool getFilmNegativeSpot(int x, int y, int spotSize, procparams::FilmNegativeParams::RGB &refInput, procparams::FilmNegativeParams::RGB &refOutput) = 0; + virtual void getAutoCrop (double ratio, int &x, int &y, int &w, int &h) = 0; virtual void saveInputICCReference (const Glib::ustring& fname, bool apply_wb) = 0; @@ -543,10 +656,14 @@ public: virtual void setAutoBWListener (AutoBWListener* l) = 0; virtual void setAutoWBListener (AutoWBListener* l) = 0; virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0; + virtual void setAutoprimListener (AutoprimListener* l) = 0; + virtual void setAutoChromaListener (AutoChromaListener* l) = 0; virtual void setRetinexListener (RetinexListener* l) = 0; virtual void setWaveletListener (WaveletListener* l) = 0; virtual void setImageTypeListener (ImageTypeListener* l) = 0; + virtual void setLocallabListener (LocallabListener* l) = 0; + virtual void setFilmNegListener (FilmNegListener* l) = 0; virtual void setMonitorProfile (const Glib::ustring& monitorProfile, RenderingIntent intent) = 0; virtual void getMonitorProfile (Glib::ustring& monitorProfile, RenderingIntent& intent) const = 0; diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 7ffb9ad33..58f3d12a3 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -46,7 +46,7 @@ LFModifier::operator bool() const } -void LFModifier::correctDistortion(double &x, double &y, int cx, int cy, double scale) const +void LFModifier::correctDistortion(double &x, double &y, int cx, int cy) const { if (!data_) { return; @@ -67,8 +67,6 @@ void LFModifier::correctDistortion(double &x, double &y, int cx, int cy, double x -= cx; y -= cy; } - x *= scale; - y *= scale; } @@ -440,7 +438,7 @@ std::vector LFDatabase::getLenses() const LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring &model) const { LFCamera ret; - if (data_) { + if (data_ && !make.empty()) { MyMutex::MyLock lock(lfDBMutex); auto found = data_->FindCamerasExt(make.c_str(), model.c_str()); if (found) { @@ -455,7 +453,7 @@ LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring & LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) const { LFLens ret; - if (data_) { + if (data_ && !name.empty()) { MyMutex::MyLock lock(lfDBMutex); auto found = data_->FindLenses(camera.data_, nullptr, name.c_str()); for (size_t pos = 0; !found && pos < name.size(); ) { diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 2f3e4677d..51212c9b9 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -53,7 +53,7 @@ public: explicit operator bool() const; - void correctDistortion(double &x, double &y, int cx, int cy, double scale) const override; + void correctDistortion(double &x, double &y, int cx, int cy) const override; bool isCACorrectionAvailable() const override; void correctCA(double &x, double &y, int cx, int cy, int channel) const override; void processVignette(int width, int height, float** rawData) const override; diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 0cdcbf6ed..11dae8018 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -31,6 +31,7 @@ #include "colortemp.h" #include "curves.h" #include "dcp.h" +#include "iccmatrices.h" #include "iccstore.h" #include "image8.h" #include "improcfun.h" @@ -193,7 +194,7 @@ namespace rtengine using namespace procparams; -Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode) +Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, StandardObserver wbObserver, bool inspectorMode) { StdImageSource imgSrc; @@ -204,11 +205,6 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, ImageIO* img = imgSrc.getImageIO(); - // agriggio -- hotfix for #3794, to be revised once a proper solution is implemented - if (std::max(img->getWidth(), img->getHeight()) / std::min(img->getWidth(), img->getHeight()) >= 10) { - return nullptr; - } - Thumbnail* tpp = new Thumbnail (); unsigned char* data; @@ -234,15 +230,29 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, h = img->getHeight(); tpp->scale = 1.; } else { - if (fixwh == 1) { + if (fixwh < 0 && w > 0 && h > 0) { + const int ww = h * img->getWidth() / img->getHeight(); + const int hh = w * img->getHeight() / img->getWidth(); + if (ww <= w) { + w = ww; + tpp->scale = static_cast(img->getHeight()) / h; + } else { + h = hh; + tpp->scale = static_cast(img->getWidth()) / w; + } + } else if (fixwh == 1) { w = h * img->getWidth() / img->getHeight(); - tpp->scale = (double)img->getHeight() / h; + tpp->scale = static_cast(img->getHeight()) / h; } else { h = w * img->getHeight() / img->getWidth(); - tpp->scale = (double)img->getWidth() / w; + tpp->scale = static_cast(img->getWidth()) / w; } } + // Precaution to prevent division by zero later on + if (h < 1) h = 1; + if (w < 1) w = 1; + // bilinear interpolation if (tpp->thumbImg) { delete tpp->thumbImg; @@ -300,8 +310,9 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, tpp->blueAWBMul = avg_b / double (n); tpp->wbEqual = wbEq; tpp->wbTempBias = 0.0; + tpp->wbObserver = wbObserver; - cTemp.mul2temp (tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->autoWBTemp, tpp->autoWBGreen); + cTemp.mul2temp (tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->wbObserver, tpp->autoWBTemp, tpp->autoWBGreen); } tpp->init (); @@ -339,7 +350,7 @@ Image8 *load_inspector_mode(const Glib::ustring &fname, RawMetaDataLocation &rml PreviewProps pp(0, 0, w, h, 1); Imagefloat tmp(w, h); - src.getImage(src.getWB(), TR_NONE, &tmp, pp, neutral.toneCurve, neutral.raw); + src.getImage(src.getWB(), TR_NONE, &tmp, pp, neutral.toneCurve, neutral.raw, 0); src.convertColorSpace(&tmp, neutral.icm, src.getWB()); Image8 *img = new Image8(w, h); @@ -511,8 +522,6 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL ((filter >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3)==0 || !filter) #define FISGREEN(filter,row,col) \ ((filter >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3)==1 || !filter) -#define FISBLUE(filter,row,col) \ - ((filter >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3)==2 || !filter) RawMetaDataLocation Thumbnail::loadMetaDataFromRaw (const Glib::ustring& fname) { @@ -535,7 +544,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, bool forHistogramMatching) +Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, StandardObserver wbObserver, bool rotate, bool forHistogramMatching) { RawImage *ri = new RawImage (fname); unsigned int tempImageNum = 0; @@ -595,6 +604,8 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati 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->scaleGain = scale_mul[0] / pre_mul[0]; // can be used to reconstruct scale_mul later in processing + tpp->gammaCorrected = true; unsigned filter = ri->get_filters(); @@ -972,9 +983,10 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati 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; + tpp->wbObserver = wbObserver; ColorTemp cTemp; - cTemp.mul2temp (tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->autoWBTemp, tpp->autoWBGreen); + cTemp.mul2temp (tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->wbObserver, tpp->autoWBTemp, tpp->autoWBGreen); } if (rotate && ri->get_rotateDegree() > 0) { @@ -1043,6 +1055,7 @@ Thumbnail::Thumbnail () : scaleForSave (8192), gammaCorrected (false), colorMatrix{}, + scaleGain (1.0), isRaw (true) { } @@ -1110,18 +1123,19 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT float iso = metadata->getISOSpeed(imgNum); float fcomp = metadata->getExpComp(imgNum); - // check if the WB's equalizer value has changed - if (wbEqual < (params.wb.equal - 5e-4) || wbEqual > (params.wb.equal + 5e-4) || wbTempBias < (params.wb.tempBias - 5e-4) || wbTempBias > (params.wb.tempBias + 5e-4)) { + // check if the WB's equalizer, temperature bias, or observer value has changed + if (wbEqual < (params.wb.equal - 5e-4) || wbEqual > (params.wb.equal + 5e-4) || wbTempBias < (params.wb.tempBias - 5e-4) || wbTempBias > (params.wb.tempBias + 5e-4) || wbObserver != params.wb.observer) { wbEqual = params.wb.equal; wbTempBias = params.wb.tempBias; + wbObserver = params.wb.observer; // recompute the autoWB ColorTemp cTemp; - cTemp.mul2temp (redAWBMul, greenAWBMul, blueAWBMul, wbEqual, autoWBTemp, autoWBGreen); + cTemp.mul2temp (redAWBMul, greenAWBMul, blueAWBMul, wbEqual, wbObserver, autoWBTemp, autoWBGreen); autoWBTemp += autoWBTemp * wbTempBias; } // compute WB multipliers - ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); + ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method, params.wb.observer); if (!params.wb.enabled) { currWB = ColorTemp(); @@ -1130,9 +1144,9 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT double cam_r = colorMatrix[0][0] * camwbRed + colorMatrix[0][1] * camwbGreen + colorMatrix[0][2] * camwbBlue; double cam_g = colorMatrix[1][0] * camwbRed + colorMatrix[1][1] * camwbGreen + colorMatrix[1][2] * camwbBlue; double cam_b = colorMatrix[2][0] * camwbRed + colorMatrix[2][1] * camwbGreen + colorMatrix[2][2] * camwbBlue; - currWB = ColorTemp (cam_r, cam_g, cam_b, params.wb.equal); - } else if (params.wb.method == "Auto") { - currWB = ColorTemp (autoWBTemp, autoWBGreen, wbEqual, "Custom"); + currWB = ColorTemp (cam_r, cam_g, cam_b, params.wb.equal, params.wb.observer); + } else if (params.wb.method == "autold") { + currWB = ColorTemp (autoWBTemp, autoWBGreen, wbEqual, "Custom", wbObserver); } double rm, gm, bm; @@ -1176,11 +1190,18 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT rwidth = int (size_t (thumbImg->getWidth()) * size_t (rheight) / size_t (thumbImg->getHeight())); } + if (rwidth < 1) rwidth = 1; + if (rheight < 1) rheight = 1; Imagefloat* baseImg = resizeTo (rwidth, rheight, interp, thumbImg); - if (isRaw && params.filmNegative.enabled) { - processFilmNegative(params, baseImg, rwidth, rheight, rmi, gmi, bmi); + // Film negative legacy mode, for backwards compatibility RT v5.8 + if (params.filmNegative.enabled) { + if (params.filmNegative.backCompat == FilmNegativeParams::BackCompat::V1) { + processFilmNegative(params, baseImg, rwidth, rheight); + } else if (params.filmNegative.backCompat == FilmNegativeParams::BackCompat::V2) { + processFilmNegativeV2(params, baseImg, rwidth, rheight); + } } if (params.coarse.rotate) { @@ -1222,6 +1243,19 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT // if luma denoise has to be done for thumbnails, it should be right here + int fw = baseImg->getWidth(); + int fh = baseImg->getHeight(); + //ColorTemp::CAT02 (baseImg, ¶ms) ;//perhaps not good! + + 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(), RenderingIntent(settings->monitorIntent), false, false); + + // Process film negative BEFORE colorspace conversion, if needed + if (params.filmNegative.enabled && params.filmNegative.backCompat == FilmNegativeParams::BackCompat::CURRENT && params.filmNegative.colorSpace == FilmNegativeParams::ColorSpace::INPUT) { + ipf.filmNegativeProcess(baseImg, baseImg, params.filmNegative); + } + // perform color space transformation if (isRaw) { @@ -1231,28 +1265,25 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT StdImageSource::colorSpaceConversion (baseImg, params.icm, embProfile, thumbImg->getSampleFormat()); } - int fw = baseImg->getWidth(); - int fh = baseImg->getHeight(); - //ColorTemp::CAT02 (baseImg, ¶ms) ;//perhaps not good! - - 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(), RenderingIntent(settings->monitorIntent), false, false); + // Process film negative AFTER colorspace conversion, if needed + if (params.filmNegative.enabled && params.filmNegative.backCompat == FilmNegativeParams::BackCompat::CURRENT && params.filmNegative.colorSpace != FilmNegativeParams::ColorSpace::INPUT) { + ipf.filmNegativeProcess(baseImg, baseImg, params.filmNegative); + } LUTu hist16 (65536); ipf.firstAnalysis (baseImg, params, hist16); - ipf.dehaze(baseImg); - ipf.ToneMapFattal02(baseImg); + ipf.dehaze(baseImg, params.dehaze); + ipf.ToneMapFattal02(baseImg, params.fattal, 3, 0, nullptr, 0, 0, 0); // perform transform - if (ipf.needsTransform()) { + int origFW; + int origFH; + double tscale = 0.0; + getDimensions (origFW, origFH, tscale); + if (ipf.needsTransform(origFW * tscale + 0.5, origFH * tscale + 0.5, 0, metadata)) { Imagefloat* trImg = new Imagefloat (fw, fh); - int origFW; - int origFH; - double tscale = 0.0; - getDimensions (origFW, origFH, tscale); ipf.transform (baseImg, trImg, 0, 0, 0, 0, fw, fh, origFW * tscale + 0.5, origFH * tscale + 0.5, metadata, 0, true); // Raw rotate degree not detectable here delete baseImg; baseImg = trImg; @@ -1325,10 +1356,10 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili); clToningcurve (65536); - CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); + CurveFactory::diagonalCurve2Lut (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); cl2Toningcurve (65536); - CurveFactory::curveToning (params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); + CurveFactory::diagonalCurve2Lut (params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); } if (params.blackwhite.enabled) { @@ -1404,23 +1435,37 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 16, utili); - bool clcutili; - CurveFactory::curveCL (clcutili, params.labCurve.clcurve, clcurve, 16); + const bool clcutili = CurveFactory::diagonalCurve2Lut(params.labCurve.clcurve, clcurve, 16); bool autili, butili, ccutili, cclutili; CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 16); + + if (params.colorToning.enabled && params.colorToning.method == "LabGrid") { + ipf.colorToningLabGrid(labView, 0,labView->W , 0, labView->H, false); + } + + ipf.shadowsHighlights(labView, params.sh.enabled, params.sh.lab,params.sh.highlights ,params.sh.shadows, params.sh.radius, 16, params.sh.htonalwidth, params.sh.stonalwidth); + + if (params.localContrast.enabled) { + // Alberto's local contrast + ipf.localContrast(labView, labView->L, params.localContrast, false, 16); + } ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); - ipf.vibrance (labView); + ipf.vibrance (labView, params.vibrance, params.toneCurve.hrenabled, params.icm.workingProfile); ipf.labColorCorrectionRegions(labView); + + + if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || !params.colorappearance.enabled) { ipf.EPDToneMap (labView, 5, 6); } - ipf.softLight(labView); + ipf.softLight(labView, params.softlight); + if (params.colorappearance.enabled) { CurveFactory::curveLightBrightColor ( @@ -1447,10 +1492,11 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT adap = 2000.f; } else { float E_V = fcomp + log2 ((fnum * fnum) / fspeed / (fiso / 100.f)); - float expo2 = params.toneCurve.expcomp; // exposure compensation in tonecurve ==> direct EV + double kexp = 0.; + float expo2 = kexp * params.toneCurve.expcomp; // exposure compensation in tonecurve ==> direct EV E_V += expo2; float expo1;//exposure raw white point - expo1 = log2 (params.raw.expos); //log2 ==>linear to EV + expo1 = 0.5 * log2 (params.raw.expos); //log2 ==>linear to EV E_V += expo1; adap = powf (2.f, E_V - 3.f); //cd / m2 //end calculation adaptation scene luminosity @@ -1469,7 +1515,8 @@ 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); @@ -1544,27 +1591,28 @@ void Thumbnail::getDimensions (int& w, int& h, double& scaleFac) } } -void Thumbnail::getCamWB (double& temp, double& green) +void Thumbnail::getCamWB (double& temp, double& green, StandardObserver observer) { double cam_r = colorMatrix[0][0] * camwbRed + colorMatrix[0][1] * camwbGreen + colorMatrix[0][2] * camwbBlue; double cam_g = colorMatrix[1][0] * camwbRed + colorMatrix[1][1] * camwbGreen + colorMatrix[1][2] * camwbBlue; double cam_b = colorMatrix[2][0] * camwbRed + colorMatrix[2][1] * camwbGreen + colorMatrix[2][2] * camwbBlue; - ColorTemp currWB = ColorTemp (cam_r, cam_g, cam_b, 1.0); // we do not take the equalizer into account here, because we want camera's WB + ColorTemp currWB = ColorTemp (cam_r, cam_g, cam_b, 1.0, observer); // we do not take the equalizer into account here, because we want camera's WB temp = currWB.getTemp (); green = currWB.getGreen (); } -void Thumbnail::getAutoWB (double& temp, double& green, double equal, double tempBias) +void Thumbnail::getAutoWB (double& temp, double& green, double equal, double tempBias, StandardObserver observer) { - if (equal != wbEqual || tempBias != wbTempBias) { + if (equal != wbEqual || tempBias != wbTempBias || observer != wbObserver) { // compute the values depending on equal ColorTemp cTemp; wbEqual = equal; wbTempBias = tempBias; + wbObserver = observer; // compute autoWBTemp and autoWBGreen - cTemp.mul2temp (redAWBMul, greenAWBMul, blueAWBMul, wbEqual, autoWBTemp, autoWBGreen); + cTemp.mul2temp (redAWBMul, greenAWBMul, blueAWBMul, wbEqual, wbObserver, autoWBTemp, autoWBGreen); autoWBTemp += autoWBTemp * tempBias; } @@ -1621,7 +1669,7 @@ void Thumbnail::getSpotWB (const procparams::ProcParams& params, int xp, int yp, double gm = colorMatrix[1][0] * reds + colorMatrix[1][1] * greens + colorMatrix[1][2] * blues; double bm = colorMatrix[2][0] * reds + colorMatrix[2][1] * greens + colorMatrix[2][2] * blues; - ColorTemp ct (rm, gm, bm, params.wb.equal); + ColorTemp ct (rm, gm, bm, params.wb.equal, params.wb.observer); rtemp = ct.getTemp (); rgreen = ct.getGreen (); } @@ -1922,7 +1970,7 @@ bool Thumbnail::writeImage (const Glib::ustring& fname) Glib::ustring fullFName = fname + ".rtti"; - FILE* f = g_fopen (fullFName.c_str (), "wb"); + FILE* f = ::g_fopen (fullFName.c_str (), "wb"); if (!f) { return false; @@ -1965,7 +2013,7 @@ bool Thumbnail::readImage (const Glib::ustring& fname) return false; } - FILE* f = g_fopen(fullFName.c_str (), "rb"); + FILE* f = ::g_fopen(fullFName.c_str (), "rb"); if (!f) { return false; @@ -2123,6 +2171,10 @@ bool Thumbnail::readData (const Glib::ustring& fname) colorMatrix[i][j] = cm[ix++]; } } + + if (keyFile.has_key ("LiveThumbData", "ScaleGain")) { + scaleGain = keyFile.get_double ("LiveThumbData", "ScaleGain"); + } } return true; @@ -2174,6 +2226,7 @@ bool Thumbnail::writeData (const Glib::ustring& fname) keyFile.set_boolean ("LiveThumbData", "GammaCorrected", gammaCorrected); Glib::ArrayHandle cm ((double*)colorMatrix, 9, Glib::OWNERSHIP_NONE); keyFile.set_double_list ("LiveThumbData", "ColorMatrix", cm); + keyFile.set_double ("LiveThumbData", "ScaleGain", scaleGain); keyData = keyFile.to_data (); @@ -2191,7 +2244,7 @@ bool Thumbnail::writeData (const Glib::ustring& fname) return false; } - FILE *f = g_fopen (fname.c_str (), "wt"); + FILE *f = ::g_fopen (fname.c_str (), "wt"); if (!f) { if (settings->verbose) { @@ -2214,7 +2267,7 @@ bool Thumbnail::readEmbProfile (const Glib::ustring& fname) embProfile = nullptr; embProfileLength = 0; - FILE* f = g_fopen (fname.c_str (), "rb"); + FILE* f = ::g_fopen (fname.c_str (), "rb"); if (f) { if (!fseek (f, 0, SEEK_END)) { @@ -2242,7 +2295,7 @@ bool Thumbnail::writeEmbProfile (const Glib::ustring& fname) { if (embProfileData) { - FILE* f = g_fopen (fname.c_str (), "wb"); + FILE* f = ::g_fopen (fname.c_str (), "wb"); if (f) { fwrite (embProfileData, 1, embProfileLength, f); @@ -2254,44 +2307,6 @@ bool Thumbnail::writeEmbProfile (const Glib::ustring& fname) return false; } -bool Thumbnail::readAEHistogram (const Glib::ustring& fname) -{ - - FILE* f = g_fopen(fname.c_str(), "rb"); - - if (!f) { - aeHistogram.reset(); - } else { - 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; - } - - return false; -} - -bool Thumbnail::writeAEHistogram (const Glib::ustring& fname) -{ - - if (aeHistogram) { - FILE* f = g_fopen (fname.c_str (), "wb"); - - if (f) { - fwrite (&aeHistogram[0], 1, (65536 >> aeHistCompression)*sizeof (aeHistogram[0]), f); - fclose (f); - return true; - } - } - - return false; -} - unsigned char* Thumbnail::getImage8Data() { if (thumbImg && thumbImg->getType() == rtengine::sImage8) { diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index dcc9596f6..535613ca2 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -18,8 +18,6 @@ */ #pragma once -#include - #include #include "image16.h" @@ -30,9 +28,18 @@ #include "../rtgui/threadutils.h" +namespace Glib +{ + +class ustring; + +} + namespace rtengine { +enum class StandardObserver; + class Thumbnail { @@ -50,6 +57,7 @@ class Thumbnail double camwbBlue; double redAWBMul, greenAWBMul, blueAWBMul; // multipliers for auto WB double autoWBTemp, autoWBGreen, wbEqual, wbTempBias; // autoWBTemp and autoWBGreen are updated each time autoWB is requested and if wbEqual has been modified + StandardObserver wbObserver; LUTu aeHistogram; int aeHistCompression; bool aeValid; @@ -70,8 +78,10 @@ class Thumbnail int scaleForSave; bool gammaCorrected; double colorMatrix[3][3]; + double scaleGain; - void processFilmNegative(const procparams::ProcParams& params, const Imagefloat* baseImg, int rwidth, int rheight, float &rmi, float &gmi, float &bmi); + void processFilmNegative(const procparams::ProcParams& params, const Imagefloat* baseImg, int rwidth, int rheight); + void processFilmNegativeV2(const procparams::ProcParams& params, const Imagefloat* baseImg, int rwidth, int rheight); public: @@ -88,12 +98,12 @@ public: 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, 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 Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, StandardObserver wbObserver, bool rotate, bool forHistogramMatching = false); + static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, StandardObserver wbObserver, bool inspectorMode = false); static RawMetaDataLocation loadMetaDataFromRaw (const Glib::ustring& fname); - void getCamWB (double& temp, double& green); - void getAutoWB (double& temp, double& green, double equal, double tempBias); + void getCamWB (double& temp, double& green, StandardObserver observer); + void getAutoWB (double& temp, double& green, double equal, double tempBias, StandardObserver observer); void getAutoWBMultipliers (double& rm, double& gm, double& bm); void getSpotWB (const procparams::ProcParams& params, int x, int y, int rect, double& temp, double& green); void applyAutoExp (procparams::ProcParams& pparams); @@ -108,10 +118,6 @@ public: bool readEmbProfile (const Glib::ustring& fname); bool writeEmbProfile (const Glib::ustring& fname); - 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 diff --git a/rtengine/settings.h b/rtengine/settings.h index f261444c8..c920a355d 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -7,8 +7,8 @@ * 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, +itcw * * 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. @@ -48,6 +48,8 @@ public: bool verbose; Glib::ustring darkFramesPath; ///< The default directory for dark frames Glib::ustring flatFieldsPath; ///< The default directory for flat fields + Glib::ustring cameraProfilesPath; ///< The default directory for camera profiles + Glib::ustring lensProfilesPath; ///< The default directory for lens profiles Glib::ustring adobe; // filename of AdobeRGB1998 profile (default to the bundled one) Glib::ustring prophoto; // filename of Prophoto profile (default to the bundled one) @@ -59,12 +61,14 @@ public: 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) + Glib::ustring DCIP3; // filename of DCIP3 profile (default to the bundled one) bool gamutICC; // no longer used bool gamutLch; 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 + // false: histogram is display the value of the image computed in the Output profile int amchroma; + int amchromajz; int protectred; double protectredh; double nrauto; @@ -80,7 +84,22 @@ public: // bool bw_complementary; 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) + Glib::ustring lensfunDbDirectory; // The directory containing the lensfun database. If empty, the system defaults will be used, as described in https://lensfun.github.io/manual/latest/dbsearch.html + Glib::ustring lensfunDbBundleDirectory; + int cropsleep; + double reduchigh; + double reduclow; + bool detectshape; + bool fftwsigma; + int previewselection; + double cbdlsensi; +// bool showtooltip; + bool itcwb_enable; +//wavelet levels + double edghi; + double edglo; + double limrad; + enum class ThumbnailInspectorMode { JPEG, diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index abdcc42a4..306e30bdd 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -27,6 +27,37 @@ #undef THREAD_PRIORITY_NORMAL #include "opthelper.h" +namespace { + +void fillLuminance(rtengine::Imagefloat* img, float** luminance, const float lumi[3], int W, int H) // fill with luminance +{ + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H; i++) + for (int j = 0; j < W; j++) { + luminance[i][j] = lumi[0] * std::max(img->r(i, j), 0.f) + lumi[1] * std::max(img->g(i, j), 0.f) + lumi[2] * std::max(img->b(i, j), 0.f); + } + +} + +void fillLuminanceL(float** L, float** luminance, int W, int H) // fill with luminance +{ + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H; i++) + for (int j = 0; j < W; j++) { + luminance[i][j] = std::max(L[i][j], 0.f) ;//we can put here some enhancements Gamma, compression data,... + } + +} + +} namespace rtengine { @@ -51,39 +82,13 @@ SHMap::~SHMap () delete [] map; } -void SHMap::fillLuminance( Imagefloat * img, float **luminance, double lumi[3] ) // fill with luminance -{ - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = 0; i < H; i++) - for (int j = 0; j < W; j++) { - luminance[i][j] = lumi[0] * std::max(img->r(i, j), 0.f) + lumi[1] * std::max(img->g(i, j), 0.f) + lumi[2] * std::max(img->b(i, j), 0.f); - } - -} - -void SHMap::fillLuminanceL( float ** L, float **luminance) // fill with luminance -{ - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = 0; i < H; i++) - for (int j = 0; j < W; j++) { - luminance[i][j] = std::max(L[i][j], 0.f) ;//we can put here some enhancements Gamma, compression data,... - } - -} - void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int skip) { + const float lumif[3] = { static_cast(lumi[0]), static_cast(lumi[1]), static_cast(lumi[2]) }; + if (!hq) { - fillLuminance( img, map, lumi); + fillLuminance(img, map, lumif, W, H); const bool useBoxBlur = radius > 40.0; // boxblur is less prone to artifacts for large radi @@ -91,7 +96,7 @@ void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int #pragma omp parallel if (!useBoxBlur) #endif { - gaussianBlur (map, map, W, H, radius, useBoxBlur); + gaussianBlur(map, map, W, H, radius, useBoxBlur); } } @@ -99,7 +104,7 @@ void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //experimental dirpyr shmap - float thresh = (100.f * radius); //1000; + float thresh = 100.0 * radius; //1000; // set up range function // calculate size of Lookup table. That's possible because from a value k for all i>=k rangefn[i] will be exp(-10) @@ -142,7 +147,7 @@ void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int dirpyrlo[1] = buffer; } - fillLuminance( img, dirpyrlo[0], lumi); + fillLuminance(img, dirpyrlo[0], lumif, W, H); scale = 1; int level = 0; @@ -181,28 +186,18 @@ void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int for (int j = 0; j < W; j++) { _val = map[i][j]; - if (_val < _min_f) { - _min_f = _val; - } + _min_f = std::min(_min_f, _val); + _max_f = std::max(_max_f, _val); - if (_val > _max_f) { - _max_f = _val; - } - - _avg += _val; + _avg += static_cast(_val); } #ifdef _OPENMP #pragma omp critical #endif { - if(_min_f < min_f ) { - min_f = _min_f; - } - - if(_max_f > max_f ) { - max_f = _max_f; - } + min_f = std::min(min_f, _min_f); + max_f = std::max(max_f, _max_f); } } _avg /= ((H) * (W)); @@ -214,7 +209,7 @@ void SHMap::updateL (float** L, double radius, bool hq, int skip) { if (!hq) { - fillLuminanceL( L, map); + fillLuminanceL(L, map, W, H); #ifdef _OPENMP #pragma omp parallel #endif @@ -228,7 +223,7 @@ void SHMap::updateL (float** L, double radius, bool hq, int skip) { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //experimental dirpyr shmap - float thresh = (100.f * radius); //1000; + float thresh = 100.0 * radius; //1000; int levrad; // = 16; levrad = 2; //for retinex - otherwise levrad = 16 // set up range function @@ -274,7 +269,7 @@ void SHMap::updateL (float** L, double radius, bool hq, int skip) dirpyrlo[1] = buffer; } - fillLuminanceL( L, dirpyrlo[0]); + fillLuminanceL(L, dirpyrlo[0], W, H); scale = 1; int level = 0; @@ -313,28 +308,18 @@ void SHMap::updateL (float** L, double radius, bool hq, int skip) for (int j = 0; j < W; j++) { _val = map[i][j]; - if (_val < _min_f) { - _min_f = _val; - } + _min_f = std::min(_min_f, _val); + _max_f = std::max(_max_f, _val); - if (_val > _max_f) { - _max_f = _val; - } - - _avg += _val; + _avg += static_cast(_val); } #ifdef _OPENMP #pragma omp critical #endif { - if(_min_f < min_f ) { - min_f = _min_f; - } - - if(_max_f > max_f ) { - max_f = _max_f; - } + min_f = std::min(min_f, _min_f); + max_f = std::max(max_f, _max_f); } } _avg /= ((H) * (W)); diff --git a/rtengine/shmap.h b/rtengine/shmap.h index 68e352b23..8e8f73c0e 100644 --- a/rtengine/shmap.h +++ b/rtengine/shmap.h @@ -29,6 +29,7 @@ namespace rtengine { class Imagefloat; +class LabImage; class SHMap : public NonCopyable @@ -40,6 +41,7 @@ public: SHMap (int w, int h); ~SHMap (); + void updateLab (LabImage* img, double radius, bool hq, int skip); void update (Imagefloat* img, double radius, double lumi[3], bool hq, int skip); void updateL (float** L, double radius, bool hq, int skip); @@ -47,9 +49,8 @@ public: private: int W, H; + void fillLuminanceLab( LabImage * img, float **luminance); - void fillLuminance( Imagefloat * img, float **luminance, double lumi[3] ); - void fillLuminanceL( float ** L, float **luminance ); void dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, const LUTf& rangefn, int level, int scale); }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c35fc7431..96cd68d43 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -16,25 +16,32 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include +#include + #include "cieimage.h" -#include "dcp.h" -#include "imagefloat.h" -#include "labimage.h" -#include "rtengine.h" +#include "clutstore.h" +#include "color.h" #include "colortemp.h" +#include "curves.h" +#include "dcp.h" +#include "guidedfilter.h" +#include "iccstore.h" +#include "imagefloat.h" #include "imagesource.h" #include "improcfun.h" -#include "curves.h" -#include "iccstore.h" -#include "clutstore.h" +#include "labimage.h" +#include "mytime.h" #include "processingjob.h" #include "procparams.h" -#include -#include -#include "../rtgui/options.h" #include "rawimagesource.h" +#include "rtengine.h" +#include "utils.h" + #include "../rtgui/multilangmgr.h" -#include "mytime.h" +#include "../rtgui/options.h" + #undef THREAD_PRIORITY_NORMAL namespace rtengine @@ -44,7 +51,7 @@ namespace { template -void adjust_radius (const T &default_param, double scale_factor, T ¶m) +void adjust_radius(const T &default_param, double scale_factor, T ¶m) { const double delta = (param - default_param) * scale_factor; param = default_param + delta; @@ -60,12 +67,12 @@ public: ProgressListener* pl, bool flush ) : - job (static_cast (pjob)), - errorCode (errorCode), - pl (pl), - flush (flush), + job(static_cast(pjob)), + errorCode(errorCode), + pl(pl), + flush(flush), // internal state - ii(nullptr), + initialImage(nullptr), imgsrc(nullptr), fw(0), fh(0), @@ -94,6 +101,7 @@ public: hlcomprthresh(0), baseImg(nullptr), labView(nullptr), + ctColorCurve(), autili(false), butili(false) { @@ -143,14 +151,14 @@ private: errorCode = 0; if (pl) { - pl->setProgressStr ("PROGRESSBAR_PROCESSING"); - pl->setProgress (0.0); + pl->setProgressStr("PROGRESSBAR_PROCESSING"); + pl->setProgress(0.0); } - ii = job->initialImage; + initialImage = job->initialImage; - if (!ii) { - ii = InitialImage::load (job->fname, job->isRaw, &errorCode); + if (!initialImage) { + initialImage = InitialImage::load(job->fname, job->isRaw, &errorCode); if (errorCode) { delete job; @@ -161,11 +169,12 @@ private: procparams::ProcParams& params = job->pparams; // acquire image from imagesource - imgsrc = ii->getImageSource (); + imgsrc = initialImage->getImageSource(); - tr = getCoarseBitMask (params.coarse); - if(imgsrc->getSensorType() == ST_BAYER) { - if(params.raw.bayersensor.method!= RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + 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)); @@ -173,7 +182,8 @@ private: } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { imgsrc->setBorder(params.raw.xtranssensor.border); } - imgsrc->getFullSize (fw, fh, tr); + + imgsrc->getFullSize(fw, fh, tr); // check the crop params if (params.crop.x > fw || params.crop.y > fh) { @@ -207,20 +217,16 @@ private: // MyTime t1,t2; // t1.set(); - ipf_p.reset (new ImProcFunctions (¶ms, true)); + ipf_p.reset(new ImProcFunctions(¶ms, true)); ImProcFunctions &ipf = * (ipf_p.get()); - imgsrc->setCurrentFrame (params.raw.bayersensor.imageNum); - imgsrc->preprocess ( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); - - // After preprocess, run film negative processing if enabled - if ((imgsrc->getSensorType() == ST_BAYER || (imgsrc->getSensorType() == ST_FUJI_XTRANS)) && params.filmNegative.enabled) { - imgsrc->filmNegativeProcess (params.filmNegative); - } + imgsrc->setCurrentFrame(params.raw.bayersensor.imageNum); + imgsrc->preprocess(params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); if (pl) { - pl->setProgress (0.20); + 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; @@ -231,52 +237,52 @@ private: if (pl) { - pl->setProgress (0.30); + pl->setProgress(0.30); } - pp = PreviewProps (0, 0, fw, fh, 1); + + pp = PreviewProps(0, 0, fw, fh, 1); if (params.retinex.enabled) { //enabled Retinex - LUTf cdcurve (65536, 0); - LUTf mapcurve (65536, 0); - LUTu dummy; + LUTf cdcurve(65536, 0); + LUTf mapcurve(65536, 0); RetinextransmissionCurve dehatransmissionCurve; RetinexgaintransmissionCurve dehagaintransmissionCurve; bool dehacontlutili = false; bool mapcontlutili = false; bool useHsl = false; - multi_array2D conversionBuffer (1, 1); - imgsrc->retinexPrepareBuffers (params.icm, params.retinex, conversionBuffer, dummy); - imgsrc->retinexPrepareCurves (params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, dummy, dummy ); + multi_array2D conversionBuffer(1, 1); + imgsrc->retinexPrepareBuffers(params.icm, params.retinex, conversionBuffer, dummy); + imgsrc->retinexPrepareCurves(params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, dummy, dummy); 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, dummy); + imgsrc->retinex(params.icm, params.retinex, params.toneCurve, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, conversionBuffer, dehacontlutili, mapcontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, dummy); } if (pl) { - pl->setProgress (0.40); + pl->setProgress(0.40); } - imgsrc->HLRecovery_Global ( params.toneCurve ); + // imgsrc->HLRecovery_Global(params.toneCurve); if (pl) { - pl->setProgress (0.45); + pl->setProgress(0.45); } // set the color temperature - currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); + currWB = ColorTemp(params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method, params.wb.observer); if (!params.wb.enabled) { currWB = ColorTemp(); } else if (params.wb.method == "Camera") { - currWB = imgsrc->getWB (); - } else if (params.wb.method == "Auto") { + currWB = imgsrc->getWB(); + } else if (params.wb.method == "autold") { double rm, gm, bm; - imgsrc->getAutoWBMultipliers (rm, gm, bm); - currWB.update (rm, gm, bm, params.wb.equal, params.wb.tempBias); + imgsrc->getAutoWBMultipliers(rm, gm, bm); + currWB.update(rm, gm, bm, params.wb.equal, params.wb.observer, params.wb.tempBias); } calclum = nullptr ; - params.dirpyrDenoise.getCurves (noiseLCurve, noiseCCurve); + params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve); autoNR = (float) settings->nrauto;// autoNRmax = (float) settings->nrautomax;// @@ -293,7 +299,7 @@ private: // const int tilesize = 768; // const int overlap = 96; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; - ipf.Tile_calc (tilesize, overlap, 2, fw, fh, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + ipf.Tile_calc(tilesize, overlap, 2, fw, fh, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); int nbtl = numtiles_W * numtiles_H; if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO")) { @@ -346,16 +352,16 @@ private: // Imagefloat *origCropPart;//init auto noise // origCropPart = new Imagefloat (crW, crH);//allocate memory if (params.dirpyrDenoise.enabled) {//evaluate Noise - LUTf gamcurve (65536, 0); + LUTf gamcurve(65536, 0); float gam, gamthresh, gamslope; - ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, 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 + 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 @@ -365,20 +371,20 @@ private: for (int hcr = 0; hcr < numtiles_H; hcr++) { int beg_tileW = wcr * tileWskip + tileWskip / 2.f - crW / 2.f; int beg_tileH = hcr * tileHskip + tileHskip / 2.f - crH / 2.f; - PreviewProps ppP (beg_tileW, beg_tileH, crW, crH, skipP); - imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw ); + PreviewProps ppP(beg_tileW, beg_tileH, crW, crH, skipP); + imgsrc->getImage(currWB, tr, origCropPart, ppP, params.toneCurve, params.raw, 0); //baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve); // 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); } } - imgsrc->convertColorSpace (provicalc, params.icm, currWB); //for denoise luminance curve + imgsrc->convertColorSpace(provicalc, params.icm, currWB); //for denoise luminance curve float maxr = 0.f; float maxb = 0.f; float pondcorrec = 1.0f; @@ -391,11 +397,11 @@ private: maxblueaut = 0.f; chromina = 0.f; sigma = 0.f; - ipf.RGB_denoise_info (origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); + ipf.RGB_denoise_info(origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); float multip = 1.f; float adjustr = 1.f; - if (params.icm.workingProfile == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; // } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; @@ -417,11 +423,11 @@ private: 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 = 2; int lissage = settings->leveldnliss; - ipf.calcautodn_info (chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc); + ipf.calcautodn_info(chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc); // printf("PROCESS cha=%f red=%f bl=%f redM=%f bluM=%f chrom=%f sigm=%f lum=%f sigL=%f\n",chaut,redaut,blueaut, maxredaut, maxblueaut, chromina, sigma, lumema, sigma_L); if (maxredaut > maxblueaut) { @@ -520,7 +526,7 @@ private: if (settings->verbose) { t2pone.set(); - printf ("Info denoise ponderated performed in %d usec:\n", t2pone.etime (t1pone)); + printf("Info denoise ponderated performed in %d usec:\n", t2pone.etime(t1pone)); } } @@ -561,9 +567,9 @@ private: } if (params.dirpyrDenoise.enabled) {//evaluate Noise - LUTf gamcurve (65536, 0); + LUTf gamcurve(65536, 0); float gam, gamthresh, gamslope; - ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); + ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); int Nb[9]; int coordW[3];//coordinate of part of image to measure noise int coordH[3]; @@ -580,8 +586,8 @@ private: #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 + 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 @@ -589,24 +595,24 @@ private: for (int wcr = 0; wcr <= 2; wcr++) { for (int hcr = 0; hcr <= 2; hcr++) { - PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1); - imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw); + PreviewProps ppP(coordW[wcr], coordH[hcr], crW, crH, 1); + imgsrc->getImage(currWB, tr, origCropPart, ppP, params.toneCurve, params.raw, 0); //baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve); // 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); } } - imgsrc->convertColorSpace (provicalc, params.icm, currWB); //for denoise luminance curve + imgsrc->convertColorSpace(provicalc, params.icm, currWB); //for denoise luminance curve int nb = 0; 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; - ipf.RGB_denoise_info (origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); + ipf.RGB_denoise_info(origCropPart, provicalc, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); Nb[hcr * 3 + wcr] = nb; ch_M[hcr * 3 + wcr] = chaut; max_r[hcr * 3 + wcr] = maxredaut; @@ -642,7 +648,7 @@ private: float MinRMoy = 0.f; float MinBMoy = 0.f; - if (params.icm.workingProfile == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; @@ -669,8 +675,8 @@ private: int lissage = settings->leveldnliss; for (int k = 0; k < 9; k++) { - float maxmax = max (max_r[k], max_b[k]); - ipf.calcautodn_info (ch_M[k], delta[k], Nb[k], levaut, maxmax, lumL[k], chromC[k], mode, lissage, ry[k], sk[k], pcsk[k] ); + float maxmax = max(max_r[k], max_b[k]); + ipf.calcautodn_info(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]); } @@ -743,17 +749,17 @@ private: 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 } - baseImg = new Imagefloat (fw, fh); - imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.raw); + baseImg = new Imagefloat(fw, fh); + imgsrc->getImage(currWB, tr, baseImg, pp, params.toneCurve, params.raw, 1); if (pl) { - pl->setProgress (0.50); + pl->setProgress(0.50); } // LUTf Noisecurve (65536,0); @@ -769,12 +775,13 @@ private: if (params.toneCurve.autoexp) { LUTu aehist; int aehistcompr; - imgsrc->getAutoExpHistogram (aehist, aehistcompr); - ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + imgsrc->getAutoExpHistogram(aehist, aehistcompr); + ipf.getAutoExp(aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); } + if (params.toneCurve.histmatching) { if (!params.toneCurve.fromHistMatching) { - imgsrc->getAutoMatchedToneCurve(params.icm, params.toneCurve.curve); + imgsrc->getAutoMatchedToneCurve(params.icm, params.wb.observer, params.toneCurve.curve); } if (params.toneCurve.autoexp) { @@ -787,14 +794,18 @@ private: params.toneCurve.brightness = 0; params.toneCurve.contrast = 0; params.toneCurve.black = 0; - } + } + + // Spot Removal + if (params.spot.enabled && !params.spot.entries.empty ()) { + ipf.removeSpots (baseImg, imgsrc, params.spot.entries, pp, currWB, nullptr, tr); + } // at this stage, we can flush the raw data to free up quite an important amount of memory // commented out because it makes the application crash when batch processing... // TODO: find a better place to flush rawData and rawRGB if (flush) { - imgsrc->flushRawData(); - imgsrc->flushRGB(); + imgsrc->flush(); } return true; @@ -816,29 +827,29 @@ private: noiseLCurve.Reset(); } - if (denoiseParams.enabled && (noiseLCurve || noiseCCurve )) { + 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 + 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) { - calclum->r (ii >> 1, jj >> 1) = baseImg->r (ii, jj); - calclum->g (ii >> 1, jj >> 1) = baseImg->g (ii, jj); - calclum->b (ii >> 1, jj >> 1) = baseImg->b (ii, jj); + calclum->r(ii >> 1, jj >> 1) = baseImg->r(ii, jj); + calclum->g(ii >> 1, jj >> 1) = baseImg->g(ii, jj); + calclum->b(ii >> 1, jj >> 1) = baseImg->b(ii, jj); } } - imgsrc->convertColorSpace (calclum, params.icm, currWB); + imgsrc->convertColorSpace(calclum, params.icm, currWB); } if (denoiseParams.enabled) { ImProcFunctions &ipf = * (ipf_p.get()); float nresi, highresi; int kall = 2; - ipf.RGB_denoise (kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi); + ipf.RGB_denoise(kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi); } @@ -861,27 +872,46 @@ private: //ImProcFunctions ipf (¶ms, true); ImProcFunctions &ipf = * (ipf_p.get()); - imgsrc->convertColorSpace (baseImg, params.icm, currWB); + if (params.filmNegative.enabled) { + // Process film negative AFTER colorspace conversion if camera space is NOT selected + if (params.filmNegative.colorSpace != FilmNegativeParams::ColorSpace::INPUT) { + imgsrc->convertColorSpace(baseImg, params.icm, currWB); + } + + FilmNegativeParams copy = params.filmNegative; + ipf.filmNegativeProcess(baseImg, baseImg, copy, params.raw, imgsrc, currWB); + + // ... otherwise, process film negative BEFORE colorspace conversion + if (params.filmNegative.colorSpace == FilmNegativeParams::ColorSpace::INPUT) { + imgsrc->convertColorSpace(baseImg, params.icm, currWB); + } + + } else { + imgsrc->convertColorSpace(baseImg, params.icm, currWB); + } // perform first analysis - hist16 (65536); + hist16(65536); - ipf.firstAnalysis (baseImg, params, hist16); + ipf.firstAnalysis(baseImg, params, hist16); - ipf.dehaze(baseImg); - ipf.ToneMapFattal02(baseImg); + ipf.dehaze(baseImg, params.dehaze); + ipf.ToneMapFattal02(baseImg, params.fattal, 3, 0, nullptr, 0, 0, 0); // perform transform (excepted resizing) - if (ipf.needsTransform()) { + if (ipf.needsTransform(fw, fh, imgsrc->getRotateDegree(), imgsrc->getMetaData())) { Imagefloat* trImg = nullptr; + if (ipf.needsLuminanceOnly()) { trImg = baseImg; } else { - trImg = new Imagefloat (fw, fh); + trImg = new Imagefloat(fw, fh); } - ipf.transform (baseImg, trImg, 0, 0, 0, 0, fw, fh, fw, fh, - imgsrc->getMetaData(), imgsrc->getRotateDegree(), true); - if(trImg != baseImg) { + + ipf.transform(baseImg, trImg, 0, 0, 0, 0, fw, fh, fw, fh, + imgsrc->getMetaData(), imgsrc->getRotateDegree(), true, true); + + if (trImg != baseImg) { delete baseImg; baseImg = trImg; } @@ -894,71 +924,384 @@ private: //ImProcFunctions ipf (¶ms, true); ImProcFunctions &ipf = * (ipf_p.get()); + for (int sp = 0; sp < (int)params.locallab.spots.size(); sp++) { + if(params.locallab.spots.at(sp).expsharp && params.dirpyrequalizer.cbdlMethod == "bef") { + if(params.locallab.spots.at(sp).shardamping < 1) { + params.locallab.spots.at(sp).shardamping = 1; + } + } + } + if (params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { const int W = baseImg->getWidth(); const int H = baseImg->getHeight(); - LabImage labcbdl (W, H); - ipf.rgb2lab (*baseImg, labcbdl, params.icm.workingProfile); - ipf.dirpyrequalizer (&labcbdl, 1); - ipf.lab2rgb (labcbdl, *baseImg, params.icm.workingProfile); - } - - //gamma TRC working - 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 = 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); - } + LabImage labcbdl(W, H); + ipf.rgb2lab(*baseImg, labcbdl, params.icm.workingProfile); + ipf.dirpyrequalizer(&labcbdl, 1); + ipf.lab2rgb(labcbdl, *baseImg, params.icm.workingProfile); } // RGB processing - curve1 (65536); - curve2 (65536); - curve (65536, 0); - satcurve (65536, 0); - lhskcurve (65536, 0); - lumacurve (32770, 0); // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation - clcurve (65536, 0); - wavclCurve (65536, 0); + labView = new LabImage(fw, fh); + + if (params.locallab.enabled && params.locallab.spots.size() > 0) { + ipf.rgb2lab(*baseImg, *labView, params.icm.workingProfile); + + MyTime t1, t2; + t1.set(); + + const std::unique_ptr reservView(new LabImage(*labView, true)); + const std::unique_ptr lastorigView(new LabImage(*labView, true)); + std::unique_ptr savenormtmView; + std::unique_ptr savenormretiView; + LocretigainCurve locRETgainCurve; + LocretitransCurve locRETtransCurve; + LocLHCurve loclhCurve; + LocHHCurve lochhCurve; + LocCHCurve locchCurve; + LocHHCurve lochhCurvejz; + LocCHCurve locchCurvejz; + LocLHCurve loclhCurvejz; + LocCCmaskCurve locccmasCurve; + LocLLmaskCurve locllmasCurve; + LocHHmaskCurve lochhmasCurve; + LocHHmaskCurve lochhhmasCurve; + LocCCmaskCurve locccmasexpCurve; + LocLLmaskCurve locllmasexpCurve; + LocHHmaskCurve lochhmasexpCurve; + LocCCmaskCurve locccmasSHCurve; + LocLLmaskCurve locllmasSHCurve; + LocHHmaskCurve lochhmasSHCurve; + LocCCmaskCurve locccmasvibCurve; + LocLLmaskCurve locllmasvibCurve; + LocHHmaskCurve lochhmasvibCurve; + LocCCmaskCurve locccmaslcCurve; + LocLLmaskCurve locllmaslcCurve; + LocHHmaskCurve lochhmaslcCurve; + LocCCmaskCurve locccmascbCurve; + LocLLmaskCurve locllmascbCurve; + LocHHmaskCurve lochhmascbCurve; + LocCCmaskCurve locccmasretiCurve; + LocLLmaskCurve locllmasretiCurve; + LocHHmaskCurve lochhmasretiCurve; + LocCCmaskCurve locccmastmCurve; + LocLLmaskCurve locllmastmCurve; + LocHHmaskCurve lochhmastmCurve; + LocCCmaskCurve locccmasblCurve; + LocLLmaskCurve locllmasblCurve; + LocHHmaskCurve lochhmasblCurve; + LocCCmaskCurve locccmaslogCurve; + LocLLmaskCurve locllmaslogCurve; + LocHHmaskCurve lochhmaslogCurve; + LocCCmaskCurve locccmascieCurve; + LocLLmaskCurve locllmascieCurve; + LocHHmaskCurve lochhmascieCurve; + + LocCCmaskCurve locccmas_Curve; + LocLLmaskCurve locllmas_Curve; + LocHHmaskCurve lochhmas_Curve; + LocHHmaskCurve lochhhmas_Curve; + + LocwavCurve loclmasCurveblwav; + LocwavCurve loclmasCurvecolwav; + LocwavCurve loclmasCurve_wav; + LocwavCurve locwavCurve; + LocwavCurve locwavCurvejz; + LocwavCurve loclevwavCurve; + LocwavCurve locconwavCurve; + LocwavCurve loccompwavCurve; + LocwavCurve loccomprewavCurve; + LocwavCurve locedgwavCurve; + LocwavCurve locwavCurvehue; + LocwavCurve locwavCurveden; + LUTf lllocalcurve(65536, LUT_CLIP_OFF); + LUTf lclocalcurve(65536, LUT_CLIP_OFF); + LUTf cllocalcurve(65536, LUT_CLIP_OFF); + LUTf cclocalcurve(65536, LUT_CLIP_OFF); + LUTf rgblocalcurve(65536, LUT_CLIP_OFF); + LUTf hltonecurveloc(65536, LUT_CLIP_OFF); + LUTf shtonecurveloc(65536, LUT_CLIP_OFF); + LUTf tonecurveloc(65536, LUT_CLIP_OFF); + LUTf lightCurveloc(32770, LUT_CLIP_OFF); + LUTf exlocalcurve(65536, LUT_CLIP_OFF); + LUTf lmasklocalcurve(65536, LUT_CLIP_OFF); + LUTf lmaskexplocalcurve(65536, LUT_CLIP_OFF); + LUTf lmaskSHlocalcurve(65536, LUT_CLIP_OFF); + LUTf lmaskviblocalcurve(65536, LUT_CLIP_OFF); + LUTf lmasktmlocalcurve(65536, LUT_CLIP_OFF); + LUTf lmaskretilocalcurve(65536, LUT_CLIP_OFF); + LUTf lmaskcblocalcurve(65536, LUT_CLIP_OFF); + LUTf lmaskbllocalcurve(65536, LUT_CLIP_OFF); + LUTf lmasklclocalcurve(65536, LUT_CLIP_OFF); + LUTf lmaskloglocalcurve(65536, LUT_CLIP_OFF); + LUTf lmasklocal_curve(65536, LUT_CLIP_OFF); + LUTf lmaskcielocalcurve(65536, LUT_CLIP_OFF); + LUTf cielocalcurve(65536, LUT_CLIP_OFF); + LUTf cielocalcurve2(65536, LUT_CLIP_OFF); + LUTf jzlocalcurve(65536, LUT_CLIP_OFF); + LUTf czlocalcurve(65536, LUT_CLIP_OFF); + LUTf czjzlocalcurve(65536, LUT_CLIP_OFF); + + array2D shbuffer; + for (size_t sp = 0; sp < params.locallab.spots.size(); sp++) { + if (params.locallab.spots.at(sp).inverssha) { + shbuffer(fw, fh); + break; + } + } + + for (size_t sp = 0; sp < params.locallab.spots.size(); sp++) { + + // Set local curves of current spot to LUT + locRETgainCurve.Set(params.locallab.spots.at(sp).localTgaincurve); + locRETtransCurve.Set(params.locallab.spots.at(sp).localTtranscurve); + const bool LHutili = loclhCurve.Set(params.locallab.spots.at(sp).LHcurve); + const bool HHutili = lochhCurve.Set(params.locallab.spots.at(sp).HHcurve); + const bool CHutili = locchCurve.Set(params.locallab.spots.at(sp).CHcurve); + const bool HHutilijz = lochhCurvejz.Set(params.locallab.spots.at(sp).HHcurvejz); + const bool CHutilijz = locchCurvejz.Set(params.locallab.spots.at(sp).CHcurvejz); + const bool LHutilijz = loclhCurvejz.Set(params.locallab.spots.at(sp).LHcurvejz); + const bool lcmasutili = locccmasCurve.Set(params.locallab.spots.at(sp).CCmaskcurve); + const bool llmasutili = locllmasCurve.Set(params.locallab.spots.at(sp).LLmaskcurve); + const bool lhmasutili = lochhmasCurve.Set(params.locallab.spots.at(sp).HHmaskcurve); + const bool lhhmasutili = lochhhmasCurve.Set(params.locallab.spots.at(sp).HHhmaskcurve); + const bool lcmasexputili = locccmasexpCurve.Set(params.locallab.spots.at(sp).CCmaskexpcurve); + const bool llmasexputili = locllmasexpCurve.Set(params.locallab.spots.at(sp).LLmaskexpcurve); + const bool lhmasexputili = lochhmasexpCurve.Set(params.locallab.spots.at(sp).HHmaskexpcurve); + const bool lcmasSHutili = locccmasSHCurve.Set(params.locallab.spots.at(sp).CCmaskSHcurve); + const bool llmasSHutili = locllmasSHCurve.Set(params.locallab.spots.at(sp).LLmaskSHcurve); + const bool lhmasSHutili = lochhmasSHCurve.Set(params.locallab.spots.at(sp).HHmaskSHcurve); + const bool lcmasvibutili = locccmasvibCurve.Set(params.locallab.spots.at(sp).CCmaskvibcurve); + const bool llmasvibutili = locllmasvibCurve.Set(params.locallab.spots.at(sp).LLmaskvibcurve); + const bool lhmasvibutili = lochhmasvibCurve.Set(params.locallab.spots.at(sp).HHmaskvibcurve); + const bool lcmascbutili = locccmascbCurve.Set(params.locallab.spots.at(sp).CCmaskcbcurve); + const bool llmascbutili = locllmascbCurve.Set(params.locallab.spots.at(sp).LLmaskcbcurve); + const bool lhmascbutili = lochhmascbCurve.Set(params.locallab.spots.at(sp).HHmaskcbcurve); + const bool lcmasretiutili = locccmasretiCurve.Set(params.locallab.spots.at(sp).CCmaskreticurve); + const bool llmasretiutili = locllmasretiCurve.Set(params.locallab.spots.at(sp).LLmaskreticurve); + const bool lhmasretiutili = lochhmasretiCurve.Set(params.locallab.spots.at(sp).HHmaskreticurve); + const bool lcmastmutili = locccmastmCurve.Set(params.locallab.spots.at(sp).CCmasktmcurve); + const bool lhmaslcutili = lochhmaslcCurve.Set(params.locallab.spots.at(sp).HHmasklccurve); + const bool llmastmutili = locllmastmCurve.Set(params.locallab.spots.at(sp).LLmasktmcurve); + const bool lhmastmutili = lochhmastmCurve.Set(params.locallab.spots.at(sp).HHmasktmcurve); + const bool lcmasblutili = locccmasblCurve.Set(params.locallab.spots.at(sp).CCmaskblcurve); + const bool llmasblutili = locllmasblCurve.Set(params.locallab.spots.at(sp).LLmaskblcurve); + const bool lhmasblutili = lochhmasblCurve.Set(params.locallab.spots.at(sp).HHmaskblcurve); + const bool lcmaslogutili = locccmaslogCurve.Set(params.locallab.spots.at(sp).CCmaskcurveL); + const bool llmaslogutili = locllmaslogCurve.Set(params.locallab.spots.at(sp).LLmaskcurveL); + const bool lhmaslogutili = lochhmaslogCurve.Set(params.locallab.spots.at(sp).HHmaskcurveL); + const bool lcmascieutili = locccmascieCurve.Set(params.locallab.spots.at(sp).CCmaskciecurve); + const bool llmascieutili = locllmascieCurve.Set(params.locallab.spots.at(sp).LLmaskciecurve); + const bool lhmascieutili = lochhmascieCurve.Set(params.locallab.spots.at(sp).HHmaskciecurve); + + const bool lcmas_utili = locccmas_Curve.Set(params.locallab.spots.at(sp).CCmask_curve); + const bool llmas_utili = locllmas_Curve.Set(params.locallab.spots.at(sp).LLmask_curve); + const bool lhmas_utili = lochhmas_Curve.Set(params.locallab.spots.at(sp).HHmask_curve); + const bool lhhmas_utili = lochhhmas_Curve.Set(params.locallab.spots.at(sp).HHhmask_curve); + const bool lmasutiliblwav = loclmasCurveblwav.Set(params.locallab.spots.at(sp).LLmaskblcurvewav); + const bool lmasutilicolwav = loclmasCurvecolwav.Set(params.locallab.spots.at(sp).LLmaskcolcurvewav); + const bool lcmaslcutili = locccmaslcCurve.Set(params.locallab.spots.at(sp).CCmasklccurve); + const bool llmaslcutili = locllmaslcCurve.Set(params.locallab.spots.at(sp).LLmasklccurve); + const bool lmasutili_wav = loclmasCurve_wav.Set(params.locallab.spots.at(sp).LLmask_curvewav); + const bool locwavutili = locwavCurve.Set(params.locallab.spots.at(sp).locwavcurve); + const bool locwavutilijz = locwavCurvejz.Set(params.locallab.spots.at(sp).locwavcurvejz); + const bool locwavhueutili = locwavCurvehue.Set(params.locallab.spots.at(sp).locwavcurvehue); + const bool locwavdenutili = locwavCurveden.Set(params.locallab.spots.at(sp).locwavcurveden); + const bool loclevwavutili = loclevwavCurve.Set(params.locallab.spots.at(sp).loclevwavcurve); + const bool locconwavutili = locconwavCurve.Set(params.locallab.spots.at(sp).locconwavcurve); + const bool loccompwavutili = loccompwavCurve.Set(params.locallab.spots.at(sp).loccompwavcurve); + const bool loccomprewavutili = loccomprewavCurve.Set(params.locallab.spots.at(sp).loccomprewavcurve); + const bool locedgwavutili = locedgwavCurve.Set(params.locallab.spots.at(sp).locedgwavcurve); + const bool locallutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).llcurve, lllocalcurve, 1); + const bool localclutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).clcurve, cllocalcurve, 1); + const bool locallcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).lccurve, lclocalcurve, 1); + const bool localcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).cccurve, cclocalcurve, 1); + const bool localrgbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).rgbcurve, rgblocalcurve, 1); + const bool localexutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).excurve, exlocalcurve, 1); + const bool localmaskutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcurve, lmasklocalcurve, 1); + const bool localmaskexputili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskexpcurve, lmaskexplocalcurve, 1); + const bool localmaskSHutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskSHcurve, lmaskSHlocalcurve, 1); + const bool localmaskvibutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskvibcurve, lmaskviblocalcurve, 1); + const bool localmasktmutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasktmcurve, lmasktmlocalcurve, 1); + const bool localmaskretiutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskreticurve, lmaskretilocalcurve, 1); + const bool localmaskcbutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskcbcurve, lmaskcblocalcurve, 1); + const bool localmaskblutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskblcurve, lmaskbllocalcurve, 1); + const bool localmasklcutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmasklccurve, lmasklclocalcurve, 1); + const bool localmasklogutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).LmaskcurveL, lmaskloglocalcurve, 1); + const bool localmask_utili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmask_curve, lmasklocal_curve, 1); + const bool localmaskcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).Lmaskciecurve, lmaskcielocalcurve, 1); + const bool localcieutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve, cielocalcurve, 1); + const bool localcieutili2 = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).ciecurve2, cielocalcurve2, 1); + const bool localjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).jzcurve, jzlocalcurve, 1); + const bool localczutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czcurve, czlocalcurve, 1); + const bool localczjzutili = CurveFactory::diagonalCurve2Lut(params.locallab.spots.at(sp).czjzcurve, czjzlocalcurve, 1); + + //provisory + double ecomp = params.locallab.spots.at(sp).expcomp; + double lblack = params.locallab.spots.at(sp).black; + double lhlcompr = params.locallab.spots.at(sp).hlcompr; + double lhlcomprthresh = params.locallab.spots.at(sp).hlcomprthresh; + double shcompr = params.locallab.spots.at(sp).shcompr; + double br = params.locallab.spots.at(sp).lightness; + double cont = params.locallab.spots.at(sp).contrast; + if (lblack < 0. && params.locallab.spots.at(sp).expMethod == "pde" ) { + lblack *= 1.5; + } + + // Reference parameters computation + double huere, chromare, lumare, huerefblu, chromarefblu, lumarefblu, sobelre; + int lastsav; + float avge; + float meantme; + float stdtme; + float meanretie; + float stdretie; + float fab = 1.f; + + if (params.locallab.spots.at(sp).spotMethod == "exc") { + ipf.calc_ref(sp, reservView.get(), reservView.get(), 0, 0, fw, fh, 1, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, avge, locwavCurveden, locwavdenutili); + } else { + ipf.calc_ref(sp, labView, labView, 0, 0, fw, fh, 1, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, avge, locwavCurveden, locwavdenutili); + } + CurveFactory::complexCurvelocal(ecomp, lblack / 65535., lhlcompr, lhlcomprthresh, shcompr, br, cont, lumare, + hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, avge, + 1); + float minCD; + float maxCD; + float mini; + float maxi; + float Tmean; + float Tsigma; + float Tmin; + float Tmax; + float highresi = 0.f; + float nresi = 0.f; + float highresi46 =0.f; + float nresi46 = 0.f; + float Lhighresi = 0.f; + float Lnresi = 0.f; + float Lhighresi46 = 0.f; + float Lnresi46 = 0.f; + + // No Locallab mask is shown in exported picture + ipf.Lab_Local(2, sp, shbuffer, labView, labView, reservView.get(), savenormtmView.get(), savenormretiView.get(), lastorigView.get(), fw, fh, 0, 0, fw, fh, 1, locRETgainCurve, locRETtransCurve, + lllocalcurve, locallutili, + cllocalcurve, localclutili, + lclocalcurve, locallcutili, + loclhCurve, lochhCurve, locchCurve, + lochhCurvejz, locchCurvejz,loclhCurvejz, + lmasklocalcurve, localmaskutili, + lmaskexplocalcurve, localmaskexputili, + lmaskSHlocalcurve, localmaskSHutili, + lmaskviblocalcurve, localmaskvibutili, + lmasktmlocalcurve, localmasktmutili, + lmaskretilocalcurve, localmaskretiutili, + lmaskcblocalcurve, localmaskcbutili, + lmaskbllocalcurve, localmaskblutili, + lmasklclocalcurve, localmasklcutili, + lmaskloglocalcurve, localmasklogutili, + lmasklocal_curve, localmask_utili, + lmaskcielocalcurve, localmaskcieutili, + cielocalcurve, localcieutili, + cielocalcurve2, localcieutili2, + jzlocalcurve, localjzutili, + czlocalcurve, localczutili, + czjzlocalcurve, localczjzutili, + + locccmasCurve, lcmasutili, locllmasCurve, llmasutili, lochhmasCurve, lhmasutili, lochhhmasCurve, lhhmasutili, locccmasexpCurve, lcmasexputili, locllmasexpCurve, llmasexputili, lochhmasexpCurve, lhmasexputili, + locccmasSHCurve, lcmasSHutili, locllmasSHCurve, llmasSHutili, lochhmasSHCurve, lhmasSHutili, + locccmasvibCurve, lcmasvibutili, locllmasvibCurve, llmasvibutili, lochhmasvibCurve, lhmasvibutili, + locccmascbCurve, lcmascbutili, locllmascbCurve, llmascbutili, lochhmascbCurve, lhmascbutili, + locccmasretiCurve, lcmasretiutili, locllmasretiCurve, llmasretiutili, lochhmasretiCurve, lhmasretiutili, + locccmastmCurve, lcmastmutili, locllmastmCurve, llmastmutili, lochhmastmCurve, lhmastmutili, + locccmasblCurve, lcmasblutili, locllmasblCurve, llmasblutili, lochhmasblCurve, lhmasblutili, + locccmaslcCurve, lcmaslcutili, locllmaslcCurve, llmaslcutili, lochhmaslcCurve, lhmaslcutili, + locccmaslogCurve, lcmaslogutili, locllmaslogCurve, llmaslogutili, lochhmaslogCurve, lhmaslogutili, + + locccmas_Curve, lcmas_utili, locllmas_Curve, llmas_utili, lochhmas_Curve, lhmas_utili, + locccmascieCurve, lcmascieutili, locllmascieCurve, llmascieutili, lochhmascieCurve, lhmascieutili, + lochhhmas_Curve, lhhmas_utili, + loclmasCurveblwav,lmasutiliblwav, + loclmasCurvecolwav,lmasutilicolwav, + locwavCurve, locwavutili, + locwavCurvejz, locwavutilijz, + loclevwavCurve, loclevwavutili, + locconwavCurve, locconwavutili, + loccompwavCurve, loccompwavutili, + loccomprewavCurve, loccomprewavutili, + locwavCurvehue, locwavhueutili, + locwavCurveden, locwavdenutili, + locedgwavCurve, locedgwavutili, + loclmasCurve_wav,lmasutili_wav, + LHutili, HHutili, CHutili, HHutilijz, CHutilijz, LHutilijz, cclocalcurve, localcutili, rgblocalcurve, localrgbutili, localexutili, exlocalcurve, hltonecurveloc, shtonecurveloc, tonecurveloc, lightCurveloc, + huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, lastsav, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, + meantme, stdtme, meanretie, stdretie, fab, + highresi, nresi, highresi46, nresi46, Lhighresi, Lnresi, Lhighresi46, Lnresi46 +); + + if (sp + 1u < params.locallab.spots.size()) { + // do not copy for last spot as it is not needed anymore + lastorigView->CopyFrom(labView); + } + + if (params.locallab.spots.at(sp).spotMethod == "exc") { + ipf.calc_ref(sp, reservView.get(), reservView.get(), 0, 0, fw, fh, 1, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, avge, locwavCurveden, locwavdenutili); + } else { + ipf.calc_ref(sp, labView, labView, 0, 0, fw, fh, 1, huerefblu, chromarefblu, lumarefblu, huere, chromare, lumare, sobelre, avge, locwavCurveden, locwavdenutili); + } + } + + t2.set(); + ipf.lab2rgb(*labView, *baseImg, params.icm.workingProfile); + + if (settings->verbose) { + printf("Total local:- %d usec\n", t2.etime(t1)); + } + + } + + + curve1(65536); + curve2(65536); + curve(65536, 0); + satcurve(65536, 0); + lhskcurve(65536, 0); + lumacurve(32770, 0); // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation + clcurve(65536, 0); + wavclCurve(65536, 0); //if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; - CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, - params.toneCurve.curve, params.toneCurve.curve2, - hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2 ); + CurveFactory::complexCurve(expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, + params.toneCurve.curve, params.toneCurve.curve2, + hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2); - CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1); - CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, 1); - CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, 1); + CurveFactory::RGBCurve(params.rgbCurves.rcurve, rCurve, 1); + CurveFactory::RGBCurve(params.rgbCurves.gcurve, gCurve, 1); + CurveFactory::RGBCurve(params.rgbCurves.bcurve, bCurve, 1); bool opautili = false; if (params.colorToning.enabled) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); + 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); - clToningcurve (65536, 0); - CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, 1); - cl2Toningcurve (65536, 0); - CurveFactory::curveToning (params.colorToning.cl2curve, cl2Toningcurve, 1); + params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, opautili); + clToningcurve(65536, 0); + CurveFactory::diagonalCurve2Lut(params.colorToning.clcurve, clToningcurve, 1); + cl2Toningcurve(65536, 0); + CurveFactory::diagonalCurve2Lut(params.colorToning.cl2curve, cl2Toningcurve, 1); } - labView = new LabImage (fw, fh); +// labView = new LabImage(fw, fh); if (params.blackwhite.enabled) { - CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 1); + CurveFactory::curveBW(params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 1); } double rrm, ggm, bbm; @@ -969,7 +1312,7 @@ private: if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; - ipf.moyeqt (baseImg, moyS, eqty);//return image : mean saturation and standard dev of saturation + ipf.moyeqt(baseImg, moyS, eqty); //return image : mean saturation and standard dev of saturation 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) { @@ -987,18 +1330,18 @@ private: autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000) DCPProfileApplyState as; - DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as); + DCPProfile *dcpProf = imgsrc->getDCP(params.icm, as); LUTu 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); + 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); + printf ("Output image / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", static_cast(autor), static_cast(autog), static_cast(autob)); } // if clut was used and size of clut cache == 1 we free the memory used by the clutstore (default clut cache size = 1 for 32 bit OS) - if ( params.filmSimulation.enabled && !params.filmSimulation.clutFilename.empty() && options.clutCacheSize == 1) { + if (params.filmSimulation.enabled && !params.filmSimulation.clutFilename.empty() && options.clutCacheSize == 1) { CLUTStore::getInstance().clearCache(); } @@ -1017,7 +1360,7 @@ private: baseImg = nullptr; if (pl) { - pl->setProgress (0.55); + pl->setProgress(0.55); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1032,7 +1375,7 @@ private: #pragma omp parallel #endif { - LUTu hist16thr (hist16.getSize()); // one temporary lookup table per thread + LUTu hist16thr(hist16.getSize()); // one temporary lookup table per thread hist16thr.clear(); #ifdef _OPENMP #pragma omp for schedule(static) nowait @@ -1040,7 +1383,7 @@ private: for (int i = 0; i < fh; i++) for (int j = 0; j < fw; j++) { - hist16thr[ (int) ((labView->L[i][j]))]++; + hist16thr[(int)((labView->L[i][j]))]++; } #ifdef _OPENMP @@ -1053,75 +1396,273 @@ private: } bool utili; - CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 1, utili); + CurveFactory::complexLCurve(params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 1, utili); - bool clcutili; - CurveFactory::curveCL (clcutili, params.labCurve.clcurve, clcurve, 1); + const bool clcutili = CurveFactory::diagonalCurve2Lut(params.labCurve.clcurve, clcurve, 1); bool ccutili, cclutili; - CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, - params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 1); + CurveFactory::complexsgnCurve(autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, + params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 1); + + + if (params.colorToning.enabled && params.colorToning.method == "LabGrid") { + ipf.colorToningLabGrid(labView, 0,labView->W , 0, labView->H, false); + } + + ipf.shadowsHighlights(labView, params.sh.enabled, params.sh.lab,params.sh.highlights ,params.sh.shadows, params.sh.radius, 1, params.sh.htonalwidth, params.sh.stonalwidth); + + if (params.localContrast.enabled) { + // Alberto's local contrast + ipf.localContrast(labView, labView->L, params.localContrast, false, 1);//scale); + } + + ipf.chromiLuminanceCurve(nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); - ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { ipf.EPDToneMap (labView, 0, 1); } - ipf.vibrance (labView); + ipf.vibrance(labView, params.vibrance, params.toneCurve.hrenabled, params.icm.workingProfile); ipf.labColorCorrectionRegions(labView); // for all treatments Defringe, Sharpening, Contrast detail ,Microcontrast they are activated if "CIECAM" function are disabled if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { ipf.impulsedenoise (labView); - ipf.defringe (labView); + ipf.defringe(labView); } if (params.sharpenEdge.enabled) { - ipf.MLsharpen (labView); + ipf.MLsharpen(labView); } if (params.sharpenMicro.enabled) { - if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - ipf.MLmicrocontrast (labView); //!params.colorappearance.sharpcie + if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + ipf.MLmicrocontrast(labView); //!params.colorappearance.sharpcie } } if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) && params.sharpening.enabled) { - ipf.sharpening (labView, params.sharpening); + ipf.sharpening(labView, params.sharpening); } - WaveletParams WaveParams = params.wavelet; - WavCurve wavCLVCurve; - WavOpacityCurveRG waOpacityCurveRG; - WavOpacityCurveBY waOpacityCurveBY; - WavOpacityCurveW waOpacityCurveW; - WavOpacityCurveWL waOpacityCurveWL; - - params.wavelet.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL ); // directional pyramid wavelet if (params.dirpyrequalizer.cbdlMethod == "aft") { if ((params.colorappearance.enabled && !settings->autocielab) || !params.colorappearance.enabled) { - ipf.dirpyrequalizer (labView, 1); //TODO: this is the luminance tonecurve, not the RGB one + ipf.dirpyrequalizer(labView, 1); //TODO: this is the luminance tonecurve, not the RGB one } } - bool wavcontlutili = false; + if ((params.wavelet.enabled)) { + LabImage *unshar = nullptr; + WaveletParams WaveParams = params.wavelet; + WavCurve wavCLVCurve; + WavCurve wavdenoise; + WavCurve wavdenoiseh; + Wavblcurve wavblcurve; + WavOpacityCurveRG waOpacityCurveRG; + WavOpacityCurveSH waOpacityCurveSH; + WavOpacityCurveBY waOpacityCurveBY; + WavOpacityCurveW waOpacityCurveW; + WavOpacityCurveWL waOpacityCurveWL; + LabImage *provradius = nullptr; + bool procont = WaveParams.expcontrast; + bool prochro = WaveParams.expchroma; + bool proedge = WaveParams.expedge; + bool profin = WaveParams.expfinal; + bool proton = WaveParams.exptoning; + bool pronois = WaveParams.expnoise; + +/* + if(WaveParams.showmask) { + WaveParams.showmask = false; + WaveParams.expclari = true; + } +*/ + if (WaveParams.softrad > 0.f) { + provradius = new LabImage(*labView, true); + } - CurveFactory::curveWavContL (wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); + params.wavelet.getCurves(wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - if (params.wavelet.enabled) { - ipf.ip_wavelet (labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + CurveFactory::diagonalCurve2Lut(params.wavelet.wavclCurve, wavclCurve, 1); + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + const Glib::ustring provis = params.wavelet.CLmethod; + params.wavelet.CLmethod = "all"; + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + unshar = new LabImage(*labView, true); + params.wavelet.CLmethod = provis; + + WaveParams.expcontrast = false; + WaveParams.expchroma = false; + WaveParams.expedge = false; + WaveParams.expfinal = false; + WaveParams.exptoning = false; + WaveParams.expnoise = false; + } + + ipf.ip_wavelet(labView, labView, 2, WaveParams, wavCLVCurve, wavdenoise, wavdenoiseh, wavblcurve, waOpacityCurveRG, waOpacityCurveSH, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + WaveParams.expcontrast = procont; + WaveParams.expchroma = prochro; + WaveParams.expedge = proedge; + WaveParams.expfinal = profin; + WaveParams.exptoning = proton; + WaveParams.expnoise = pronois; + + if (WaveParams.softrad > 0.f) { + array2D ble(fw, fh); + array2D guid(fw, fh); + Imagefloat *tmpImage = nullptr; + tmpImage = new Imagefloat(fw, fh); +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < fh; ir++) + for (int jr = 0; jr < fw; jr++) { + float X, Y, Z; + float L = provradius->L[ir][jr]; + float a = provradius->a[ir][jr]; + float b = provradius->b[ir][jr]; + Color::Lab2XYZ(L, a, b, X, Y, Z); + + guid[ir][jr] = Y / 32768.f; + float La = labView->L[ir][jr]; + float aa = labView->a[ir][jr]; + float ba = labView->b[ir][jr]; + Color::Lab2XYZ(La, aa, ba, X, Y, Z); + tmpImage->r(ir, jr) = X; + tmpImage->g(ir, jr) = Y; + tmpImage->b(ir, jr) = Z; + ble[ir][jr] = Y / 32768.f; + } + double epsilmax = 0.0001; + double epsilmin = 0.00001; + double aepsil = (epsilmax - epsilmin) / 100.f; + double bepsil = epsilmin; //epsilmax - 100.f * aepsil; + double epsil = aepsil * WaveParams.softrad + bepsil; + + float blur = 10.f / 1 * (0.5f + 0.8f * WaveParams.softrad); + // rtengine::guidedFilter(guid, ble, ble, blur, 0.001, multiTh); + rtengine::guidedFilter(guid, ble, ble, blur, epsil, false); + + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int ir = 0; ir < fh; ir++) + for (int jr = 0; jr < fw; jr++) { + float X = tmpImage->r(ir, jr); + float Y = 32768.f * ble[ir][jr]; + float Z = tmpImage->b(ir, jr); + float L, a, b; + Color::XYZ2Lab(X, Y, Z, L, a, b); + labView->L[ir][jr] = L; + } + delete tmpImage; + } + + } + + if ((WaveParams.ushamethod == "sharp" || WaveParams.ushamethod == "clari") && WaveParams.expclari && WaveParams.CLmethod != "all") { + float mL = (float)(WaveParams.mergeL / 100.f); + float mC = (float)(WaveParams.mergeC / 100.f); + float mL0; + float mC0; + + if ((WaveParams.CLmethod == "one" || WaveParams.CLmethod == "inf") && WaveParams.Backmethod == "black") { + mL0 = mC0 = 0.f; + mL = -1.5f * mL; + mC = -mC; + } else if (WaveParams.CLmethod == "sup" && WaveParams.Backmethod == "resid") { + mL0 = mL; + mC0 = mC; + } else { + mL0 = mL = mC0 = mC = 0.f; + } + + +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int x = 0; x < fh; x++) + for (int y = 0; y < fw; y++) { + labView->L[x][y] = LIM((1.f + mL0) * (unshar->L[x][y]) - mL * labView->L[x][y], 0.f, 32768.f); + labView->a[x][y] = (1.f + mC0) * (unshar->a[x][y]) - mC * labView->a[x][y]; + labView->b[x][y] = (1.f + mC0) * (unshar->b[x][y]) - mC * labView->b[x][y]; + } + + delete unshar; + unshar = NULL; + + if (WaveParams.softrad > 0.f) { + delete provradius; + provradius = NULL; + } + + } + + wavCLVCurve.Reset(); } - wavCLVCurve.Reset(); + ipf.softLight(labView, params.softlight); - ipf.softLight(labView); + + if (params.icm.workingTRC != ColorManagementParams::WorkingTrc::NONE) { + const int GW = labView->W; + const int GH = labView->H; + std::unique_ptr provis; + const float pres = 0.01f * params.icm.preser; + if (pres > 0.f && params.icm.wprim != ColorManagementParams::Primaries::DEFAULT) { + provis.reset(new LabImage(GW, GH)); + provis->CopyFrom(labView); + } + + const std::unique_ptr tmpImage1(new Imagefloat(GW, GH)); + + ipf.lab2rgb(*labView, *tmpImage1, params.icm.workingProfile); + + const float gamtone = params.icm.workingTRCGamma; + const float slotone = params.icm.workingTRCSlope; + + int illum = toUnderlying(params.icm.will); + const int prim = toUnderlying(params.icm.wprim); + + Glib::ustring prof = params.icm.workingProfile; + + cmsHTRANSFORM dummy = nullptr; + int ill = 0; + ipf.workingtrc(tmpImage1.get(), tmpImage1.get(), GW, GH, -5, prof, 2.4, 12.92310, ill, 0, dummy, true, false, false); + ipf.workingtrc(tmpImage1.get(), tmpImage1.get(), GW, GH, 5, prof, gamtone, slotone, illum, prim, dummy, false, true, true); + + ipf.rgb2lab(*tmpImage1, *labView, params.icm.workingProfile); + // labView and provis + if(provis) { + ipf.preserv(labView, provis.get(), GW, GH); + } + if(params.icm.fbw) { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int x = 0; x < GH; x++) + for (int y = 0; y < GW; y++) { + labView->a[x][y] = 0.f; + labView->b[x][y] = 0.f; + } + } + + } //Colorappearance and tone-mapping associated @@ -1132,9 +1673,9 @@ private: f_h = fh; } - CieImage *cieView = new CieImage (f_w, (f_h)); + CieImage *cieView = new CieImage(f_w, (f_h)); - CurveFactory::curveLightBrightColor ( + CurveFactory::curveLightBrightColor( params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3, @@ -1148,24 +1689,27 @@ private: if (params.colorappearance.enabled) { double adap; int imgNum = 0; + if (imgsrc->getSensorType() == ST_BAYER) { imgNum = params.raw.bayersensor.imageNum; } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { //imgNum = params.raw.xtranssensor.imageNum; } - float fnum = imgsrc->getMetaData()->getFNumber (imgNum); // F number - float fiso = imgsrc->getMetaData()->getISOSpeed (imgNum) ; // ISO - float fspeed = imgsrc->getMetaData()->getShutterSpeed (imgNum) ; //speed - float fcomp = imgsrc->getMetaData()->getExpComp (imgNum); //compensation + - + + float fnum = imgsrc->getMetaData()->getFNumber(imgNum); // F number + float fiso = imgsrc->getMetaData()->getISOSpeed(imgNum) ; // ISO + float fspeed = imgsrc->getMetaData()->getShutterSpeed(imgNum) ; //speed + float fcomp = imgsrc->getMetaData()->getExpComp(imgNum); //compensation + - if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { adap = 2000.; }//if no exif data or wrong else { - float E_V = fcomp + log2 ((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 + double E_V = fcomp + log2 ((fnum * fnum) / fspeed / (fiso / 100.f)); + double kexp = 0.; + E_V += kexp * params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += 0.5 * log2(params.raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = std::pow(2.0, E_V - 3.0); //cd / m2 } LUTf CAMBrightCurveJ; @@ -1187,11 +1731,11 @@ private: //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if (pl) { - pl->setProgress (0.60); + pl->setProgress(0.60); } int imw, imh; - double tmpScale = ipf.resizeScale (¶ms, fw, fh, imw, imh); + double tmpScale = ipf.resizeScale(¶ms, fw, fh, imw, imh); bool labResize = params.resize.enabled && params.resize.method != "Nearest" && (tmpScale != 1.0 || params.prsharpening.enabled); LabImage *tmplab; @@ -1205,7 +1749,7 @@ private: ch = params.crop.h; if (labResize) { // crop lab data - tmplab = new LabImage (cw, ch); + tmplab = new LabImage(cw, ch); for (int row = 0; row < ch; row++) { for (int col = 0; col < cw; col++) { @@ -1224,13 +1768,14 @@ private: if (labResize) { // resize lab data if ((labView->W != imw || labView->H != imh) && - (params.resize.allowUpscaling || (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); + tmplab = new LabImage(imw, imh); + ipf.Lanczos(labView, tmplab, tmpScale); delete labView; labView = tmplab; } + cw = labView->W; ch = labView->H; @@ -1240,13 +1785,11 @@ private: labView->L[i][j] = labView->L[i][j] < 0.f ? 0.f : labView->L[i][j]; } } - ipf.sharpening (labView, params.prsharpening); + + ipf.sharpening(labView, params.prsharpening); } } - cmsHPROFILE jprof = nullptr; - constexpr bool customGamma = false; - constexpr bool useLCMS = false; bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili && !params.colorappearance.enabled; ///////////// Custom output gamma has been removed, the user now has to create @@ -1255,89 +1798,81 @@ private: // 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 - Imagefloat* readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm); + Imagefloat* readyImg = ipf.lab2rgbOut(labView, cx, cy, cw, ch, params.icm); if (settings->verbose) { - printf ("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str()); + printf("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str()); } delete labView; labView = nullptr; - - if (bwonly) { //force BW r=g=b if (settings->verbose) { - printf ("Force BW\n"); + printf("Force BW\n"); } for (int ccw = 0; ccw < cw; ccw++) { for (int cch = 0; cch < ch; cch++) { - readyImg->r (cch, ccw) = readyImg->g (cch, ccw); - readyImg->b (cch, ccw) = readyImg->g (cch, ccw); + readyImg->r(cch, ccw) = readyImg->g(cch, ccw); + readyImg->b(cch, ccw) = readyImg->g(cch, ccw); } } } if (pl) { - pl->setProgress (0.70); + pl->setProgress(0.70); } 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); + (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; readyImg = tempImage; } switch (params.metadata.mode) { - case MetaDataParams::TUNNEL: - // Sending back the whole first root, which won't necessarily be the selected frame number - // and may contain subframe depending on initial raw's hierarchy - readyImg->setMetadata (ii->getMetaData()->getRootExifData ()); - break; - case MetaDataParams::EDIT: - // ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy - readyImg->setMetadata (ii->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); - break; - default: // case MetaDataParams::STRIP - // nothing to do - break; + case MetaDataParams::TUNNEL: + // Sending back the whole first root, which won't necessarily be the selected frame number + // and may contain subframe depending on initial raw's hierarchy + readyImg->setMetadata(initialImage->getMetaData()->getRootExifData()); + break; + + case MetaDataParams::EDIT: + // ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy + readyImg->setMetadata(initialImage->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); + break; + + default: // case MetaDataParams::STRIP + // nothing to do + break; } // Setting the output curve to readyImg - if (customGamma) { - if (!useLCMS) { - // use corrected sRGB profile in order to apply a good TRC if present, otherwise use LCMS2 profile generated by lab2rgb16 w/ gamma - ProfileContent pc (jprof); - readyImg->setOutputProfile (pc.getData().c_str(), pc.getData().size()); - } - } else { - // use the selected output profile if present, otherwise use LCMS2 profile generate by lab2rgb16 w/ gamma + // use the selected output profile if present, otherwise use LCMS2 profile generate by lab2rgb16 w/ gamma - if (!params.icm.outputProfile.empty() && params.icm.outputProfile != ColorManagementParams::NoICMString) { + if (!params.icm.outputProfile.empty() && 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.outputProfile); //get outProfile + // if ICCStore::getInstance()->getProfile send back an object, then ICCStore::getInstance()->getContent will do too + 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.outputProfile.c_str()); - } - } else { - if (settings->verbose) { - printf ("Using \"%s\" output profile\n", params.icm.outputProfile.c_str()); - } - - ProfileContent pc = ICCStore::getInstance()->getContent (params.icm.outputProfile); - readyImg->setOutputProfile (pc.getData().c_str(), pc.getData().size()); + if (jprof == nullptr) { + if (settings->verbose) { + printf("\"%s\" ICC output profile not found!\n - use LCMS2 substitution\n", params.icm.outputProfile.c_str()); } } else { - // No ICM - readyImg->setOutputProfile (nullptr, 0); + if (settings->verbose) { + printf("Using \"%s\" output profile\n", params.icm.outputProfile.c_str()); + } + + ProfileContent pc = ICCStore::getInstance()->getContent(params.icm.outputProfile); + readyImg->setOutputProfile(pc.getData().c_str(), pc.getData().size()); } + } else { + // No ICM + readyImg->setOutputProfile(nullptr, 0); } // t2.set(); @@ -1345,13 +1880,13 @@ private: // printf("Total:- %d usec\n", t2.etime(t1)); if (!job->initialImage) { - ii->decreaseRef (); + initialImage->decreaseRef(); } delete job; if (pl) { - pl->setProgress (0.75); + pl->setProgress(0.75); } /* curve1.reset();curve2.reset(); @@ -1375,10 +1910,10 @@ private: ImProcFunctions &ipf = * (ipf_p.get()); int imw, imh; - double scale_factor = ipf.resizeScale (¶ms, fw, fh, imw, imh); + double scale_factor = ipf.resizeScale(¶ms, fw, fh, imw, imh); - std::unique_ptr tmplab (new LabImage (fw, fh)); - ipf.rgb2lab (*baseImg, *tmplab, params.icm.workingProfile); + std::unique_ptr tmplab(new LabImage(fw, fh)); + ipf.rgb2lab(*baseImg, *tmplab, params.icm.workingProfile); if (params.crop.enabled) { int cx = params.crop.x; @@ -1386,7 +1921,7 @@ private: int cw = params.crop.w; int ch = params.crop.h; - std::unique_ptr cropped (new LabImage (cw, ch)); + std::unique_ptr cropped(new LabImage(cw, ch)); for (int row = 0; row < ch; row++) { for (int col = 0; col < cw; col++) { @@ -1396,29 +1931,29 @@ private: } } - tmplab = std::move (cropped); + tmplab = std::move(cropped); } - assert (params.resize.enabled); + 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); + std::unique_ptr resized(new LabImage(imw, imh)); + ipf.Lanczos(tmplab.get(), resized.get(), scale_factor); + tmplab = std::move(resized); } - adjust_procparams (scale_factor); + adjust_procparams(scale_factor); fw = imw; fh = imh; delete baseImg; - baseImg = new Imagefloat (fw, fh); - ipf.lab2rgb (*tmplab, *baseImg, params.icm.workingProfile); + baseImg = new Imagefloat(fw, fh); + ipf.lab2rgb(*tmplab, *baseImg, params.icm.workingProfile); } - void adjust_procparams (double scale_factor) + void adjust_procparams(double scale_factor) { procparams::ProcParams ¶ms = job->pparams; procparams::ProcParams defaultparams; @@ -1449,13 +1984,13 @@ private: lcurve[i] *= min(noise_factor /* * scale_factor*/, 1.0); } - noiseLCurve.Set (lcurve); + noiseLCurve.Set(lcurve); const char *medmethods[] = { "soft", "33", "55soft", "55", "77", "99" }; if (params.dirpyrDenoise.median) { auto &key = params.dirpyrDenoise.methodmed == "RGB" ? params.dirpyrDenoise.rgbmethod : params.dirpyrDenoise.medmethod; - for (int i = 1; i < int (sizeof (medmethods) / sizeof (const char *)); ++i) { + for (int i = 1; i < int (sizeof(medmethods) / sizeof(const char *)); ++i) { if (key == medmethods[i]) { int j = i - int (1.0 / scale_factor); @@ -1473,17 +2008,17 @@ private: params.epd.scale *= scale_factor; //params.epd.edgeStopping *= scale_factor; - const double dirpyreq_scale = min (scale_factor * 1.5, 1.0); + const double dirpyreq_scale = min(scale_factor * 1.5, 1.0); for (int i = 0; i < 6; ++i) { - adjust_radius (defaultparams.dirpyrequalizer.mult[i], dirpyreq_scale, - params.dirpyrequalizer.mult[i]); + adjust_radius(defaultparams.dirpyrequalizer.mult[i], dirpyreq_scale, + params.dirpyrequalizer.mult[i]); } params.dirpyrequalizer.threshold *= scale_factor; - adjust_radius (defaultparams.defringe.radius, scale_factor, - params.defringe.radius); + adjust_radius(defaultparams.defringe.radius, scale_factor, + params.defringe.radius); params.sh.radius *= scale_factor; params.localContrast.radius *= scale_factor; @@ -1509,7 +2044,7 @@ private: // internal state std::unique_ptr ipf_p; - InitialImage *ii; + InitialImage *initialImage; ImageSource *imgsrc; int fw; int fh; @@ -1578,40 +2113,40 @@ private: } // namespace -IImagefloat* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool flush) +IImagefloat* processImage(ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool flush) { - ImageProcessor proc (pjob, errorCode, pl, flush); + ImageProcessor proc(pjob, errorCode, pl, flush); return proc(); } -void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl) +void batchProcessingThread(ProcessingJob* job, BatchProcessingListener* bpl) { ProcessingJob* currentJob = job; while (currentJob) { int errorCode; - IImagefloat* img = processImage (currentJob, errorCode, bpl, true); + IImagefloat* img = processImage(currentJob, errorCode, bpl, true); if (errorCode) { - bpl->error (M ("MAIN_MSG_CANNOTLOAD")); + bpl->error(M("MAIN_MSG_CANNOTLOAD")); currentJob = nullptr; } else { try { - currentJob = bpl->imageReady (img); + currentJob = bpl->imageReady(img); } catch (Glib::Exception& ex) { - bpl->error (ex.what()); + bpl->error(ex.what()); currentJob = nullptr; } } } } -void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl) +void startBatchProcessing(ProcessingJob* job, BatchProcessingListener* bpl) { if (bpl) { - Glib::Thread::create (sigc::bind (sigc::ptr_fun (batchProcessingThread), job, bpl), 0, true, true, Glib::THREAD_PRIORITY_LOW); + Glib::Thread::create(sigc::bind(sigc::ptr_fun(batchProcessingThread), job, bpl), 0, true, true, Glib::THREAD_PRIORITY_LOW); } } diff --git a/rtengine/sleef.h b/rtengine/sleef.h index 30c059010..e630d882d 100644 --- a/rtengine/sleef.h +++ b/rtengine/sleef.h @@ -3,6 +3,11 @@ // this code was taken from http://shibatch.sourceforge.net/ // Many thanks to the author of original version: Naoki Shibata // +// Copyright Naoki Shibata and contributors 2010 - 2021. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file sleef_LICENSE.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// // This version contains modifications made by Ingo Weyrich // //////////////////////////////////////////////////////////////// @@ -21,7 +26,6 @@ #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 { @@ -532,7 +536,7 @@ __inline double xlog(double d) { x = x * t + 0.693147180559945286226764 * e; - if (xisinf(d)) x = rtengine::RT_INFINITY; + if (xispinf(d)) x = rtengine::RT_INFINITY; if (d < 0) x = rtengine::RT_NAN; if (d == 0) x = -rtengine::RT_INFINITY; @@ -864,7 +868,7 @@ __inline double xlog10(double a) { double2 d = mul_dd(logk(a), dd(0.43429448190325176116, 6.6494347733425473126e-17)); double x = d.x + d.y; - if (xisinf(a)) x = rtengine::RT_INFINITY; + if (xispinf(a)) x = rtengine::RT_INFINITY; if (a < 0) x = rtengine::RT_NAN; if (a == 0) x = -rtengine::RT_INFINITY; @@ -875,7 +879,7 @@ __inline double xlog1p(double a) { double2 d = logk2(add2_ss(a, 1)); double x = d.x + d.y; - if (xisinf(a)) x = rtengine::RT_INFINITY; + if (xispinf(a)) x = rtengine::RT_INFINITY; if (a < -1) x = rtengine::RT_NAN; if (a == -1) x = -rtengine::RT_INFINITY; @@ -894,6 +898,15 @@ __inline double xlog1p(double a) { #define R_LN2f 1.442695040888963407359924681001892137426645954152985934135449406931f +#ifdef __SSE2__ +__inline int xrintf(float x) { + return _mm_cvt_ss2si(_mm_set_ss(x)); +} +#else +__inline int xrintf(float x) { + return x + (x < 0 ? -0.5f : 0.5f); +} +#endif __inline int32_t floatToRawIntBits(float d) { union { float f; @@ -920,7 +933,7 @@ __inline float mulsignf(float x, float y) { return intBitsToFloat(floatToRawIntBits(x) ^ (floatToRawIntBits(y) & (1 << 31))); } -__inline float signf(float d) { return copysign(1, d); } +__inline float signf(float d) { return std::copysign(1.f, d); } __inline float mlaf(float x, float y, float z) { return x * y + z; } __inline int xisnanf(float x) { return x != x; } @@ -980,7 +993,7 @@ __inline float xsinf(float d) { int q; float u, s; - q = rint(d * rtengine::RT_1_PI_F); + q = xrintf(d * rtengine::RT_1_PI_F); d = mlaf(q, -PI4_Af*4, d); d = mlaf(q, -PI4_Bf*4, d); @@ -1009,7 +1022,7 @@ __inline float xcosf(float d) { int q; float u, s; - q = 1 + 2*rint(d * rtengine::RT_1_PI_F - 0.5f); + q = 1 + 2*xrintf(d * rtengine::RT_1_PI_F - 0.5f); d = mlaf(q, -PI4_Af*2, d); d = mlaf(q, -PI4_Bf*2, d); @@ -1041,7 +1054,7 @@ __inline float2 xsincosf(float d) { float u, s, t; float2 r; - q = rint(d * rtengine::RT_2_PI_F); + q = xrintf(d * rtengine::RT_2_PI_F); s = d; @@ -1083,7 +1096,7 @@ __inline float xtanf(float d) { int q; float u, s, x; - q = rint(d * (float)(2 * rtengine::RT_1_PI)); + q = xrintf(d * (float)(2 * rtengine::RT_1_PI)); x = d; @@ -1199,17 +1212,41 @@ __inline float xlogf(float d) { x = x * t + 0.693147180559945286226764f * e; - if (xisinff(d)) x = rtengine::RT_INFINITY_F; + if (xispinff(d)) x = rtengine::RT_INFINITY_F; if (d < 0) x = rtengine::RT_NAN_F; if (d == 0) x = -rtengine::RT_INFINITY_F; return x; } +__inline float xlogf1(float d) { // does xlogf(vmaxf(d, 1.f)) but faster + float x, x2, t, m; + int e; + + e = ilogbp1f(d * 0.7071f); + m = ldexpkf(d, -e); + + x = (m-1.0f) / (m+1.0f); + x2 = x * x; + + t = 0.2371599674224853515625f; + t = mlaf(t, x2, 0.285279005765914916992188f); + t = mlaf(t, x2, 0.400005519390106201171875f); + t = mlaf(t, x2, 0.666666567325592041015625f); + t = mlaf(t, x2, 2.0f); + + x = x * t + 0.693147180559945286226764f * e; + + if (xispinff(d)) x = rtengine::RT_INFINITY_F; + if (d <= 1.f) x = 0; + + return x; +} + __inline float xexpf(float d) { if(d<=-104.0f) return 0.0f; - int q = rint(d * R_LN2f); + int q = xrintf(d * R_LN2f); float s, u; s = mlaf(q, -L2Uf, d); diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c deleted file mode 100644 index 1982c7c4c..000000000 --- a/rtengine/sleefsseavx.c +++ /dev/null @@ -1,1459 +0,0 @@ -//////////////////////////////////////////////////////////////// -// -// this code was taken from http://shibatch.sourceforge.net/ -// Many thanks to the author of original version: Naoki Shibata -// -// This version contains modifications made by Ingo Weyrich -// -//////////////////////////////////////////////////////////////// - - -#ifndef SLEEFSSEAVX -#define SLEEFSSEAVX - -#include -#include "rt_math.h" -#ifdef __SSE2__ -#include "helpersse2.h" - -#ifdef ENABLE_AVX -#include "helperavx.h" -#endif - -#ifdef __GNUC__ -#define INLINE __inline -#else -#define INLINE inline -#endif - -#define PI4_A .7853981554508209228515625 -#define PI4_B .794662735614792836713604629039764404296875e-8 -#define PI4_C .306161699786838294306516483068750264552437361480769e-16 -#define M_4_PI 1.273239544735162542821171882678754627704620361328125 - -#define L2U .69314718055966295651160180568695068359375 -#define L2L .28235290563031577122588448175013436025525412068e-12 -#define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 - -#define PI4_Af 0.78515625f -#define PI4_Bf 0.00024127960205078125f -#define PI4_Cf 6.3329935073852539062e-07f -#define PI4_Df 4.9604681473525147339e-10f - -#define L2Uf 0.693145751953125f -#define L2Lf 1.428606765330187045e-06f -#define R_LN2f 1.442695040888963407359924681001892137426645954152985934135449406931f - -#define INFINITYf ((float)rtengine::RT_INFINITY) -#define NANf ((float)rtengine::RT_NAN) - -static INLINE vdouble vadd3(vdouble v0, vdouble v1, vdouble v2) { - return vadd(vadd(v0, v1), v2); -} - -static INLINE vdouble vadd4(vdouble v0, vdouble v1, vdouble v2, vdouble v3) { - return vadd3(vadd(v0, v1), v2, v3); -} - -static INLINE vdouble vadd5(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4) { - return vadd4(vadd(v0, v1), v2, v3, v4); -} - -static INLINE vdouble vadd6(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4, vdouble v5) { - return vadd5(vadd(v0, v1), v2, v3, v4, v5); -} - -static INLINE vdouble vadd7(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4, vdouble v5, vdouble v6) { - return vadd6(vadd(v0, v1), v2, v3, v4, v5, v6); -} - -static INLINE vdouble vsub3(vdouble v0, vdouble v1, vdouble v2) { - return vsub(vsub(v0, v1), v2); -} - -static INLINE vdouble vsub4(vdouble v0, vdouble v1, vdouble v2, vdouble v3) { - return vsub3(vsub(v0, v1), v2, v3); -} - -static INLINE vdouble vsub5(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4) { - return vsub4(vsub(v0, v1), v2, v3, v4); -} - -// - -static INLINE vdouble2 normalize_d(vdouble2 t) { - vdouble2 s; - - s.x = vadd(t.x, t.y); - s.y = vadd(vsub(t.x, s.x), t.y); - - return s; -} - -static INLINE vdouble2 scale_d(vdouble2 d, vdouble s) { - vdouble2 r = {vmul(d.x, s), vmul(d.y, s)}; - return r; -} - -static INLINE vdouble2 add_ss(vdouble x, vdouble y) { - vdouble2 r; - - r.x = vadd(x, y); - r.y = vadd(vsub(x, r.x), y); - - return r; -} - -static INLINE vdouble2 add2_ss(vdouble x, vdouble y) { - vdouble2 r; - - r.x = vadd(x, y); - vdouble v = vsub(r.x, x); - r.y = vadd(vsub(x, vsub(r.x, v)), vsub(y, v)); - - return r; -} - -static INLINE vdouble2 add_ds(vdouble2 x, vdouble y) { - vdouble2 r; - - r.x = vadd(x.x, y); - r.y = vadd3(vsub(x.x, r.x), y, x.y); - - return r; -} - -static INLINE vdouble2 add2_ds(vdouble2 x, vdouble y) { - vdouble2 r; - - r.x = vadd(x.x, y); - vdouble v = vsub(r.x, x.x); - r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y, v)); - r.y = vadd(r.y, x.y); - - return r; -} - -static INLINE vdouble2 add_sd(vdouble x, vdouble2 y) { - vdouble2 r; - - r.x = vadd(x, y.x); - r.y = vadd3(vsub(x, r.x), y.x, y.y); - - return r; -} - -static INLINE vdouble2 add_dd(vdouble2 x, vdouble2 y) { - // |x| >= |y| - - vdouble2 r; - - r.x = vadd(x.x, y.x); - r.y = vadd4(vsub(x.x, r.x), y.x, x.y, y.y); - - return r; -} - -static INLINE vdouble2 add2_dd(vdouble2 x, vdouble2 y) { - vdouble2 r; - - r.x = vadd(x.x, y.x); - vdouble v = vsub(r.x, x.x); - r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y.x, v)); - r.y = vadd(r.y, vadd(x.y, y.y)); - - return r; -} - -static INLINE vdouble2 div_dd(vdouble2 n, vdouble2 d) { - vdouble t = vrec(d.x); - vdouble dh = vupper(d.x), dl = vsub(d.x, dh); - vdouble th = vupper(t ), tl = vsub(t , th); - vdouble nhh = vupper(n.x), nhl = vsub(n.x, nhh); - - vdouble2 q; - - q.x = vmul(n.x, t); - - vdouble u = vadd5(vsub(vmul(nhh, th), q.x), vmul(nhh, tl), vmul(nhl, th), vmul(nhl, tl), - vmul(q.x, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl)))); - - q.y = vadd(vmul(t, vsub(n.y, vmul(q.x, d.y))), u); - - return q; -} - -static INLINE vdouble2 mul_ss(vdouble x, vdouble y) { - vdouble xh = vupper(x), xl = vsub(x, xh); - vdouble yh = vupper(y), yl = vsub(y, yh); - vdouble2 r; - - r.x = vmul(x, y); - r.y = vadd5(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl)); - - return r; -} - -static INLINE vdouble2 mul_ds(vdouble2 x, vdouble y) { - vdouble xh = vupper(x.x), xl = vsub(x.x, xh); - vdouble yh = vupper(y ), yl = vsub(y , yh); - vdouble2 r; - - r.x = vmul(x.x, y); - r.y = vadd6(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.y, y)); - - return r; -} - -static INLINE vdouble2 mul_dd(vdouble2 x, vdouble2 y) { - vdouble xh = vupper(x.x), xl = vsub(x.x, xh); - vdouble yh = vupper(y.x), yl = vsub(y.x, yh); - vdouble2 r; - - r.x = vmul(x.x, y.x); - r.y = vadd7(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.x, y.y), vmul(x.y, y.x)); - - return r; -} - -static INLINE vdouble2 squ_d(vdouble2 x) { - vdouble xh = vupper(x.x), xl = vsub(x.x, xh); - vdouble2 r; - - r.x = vmul(x.x, x.x); - r.y = vadd5(vmul(xh, xh), vneg(r.x), vmul(vadd(xh, xh), xl), vmul(xl, xl), vmul(x.x, vadd(x.y, x.y))); - - return r; -} - -static INLINE vdouble2 rec_s(vdouble d) { - vdouble t = vrec(d); - vdouble dh = vupper(d), dl = vsub(d, dh); - vdouble th = vupper(t), tl = vsub(t, th); - vdouble2 q; - - q.x = t; - q.y = vmul(t, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl))); - - return q; -} - -static INLINE vdouble2 sqrt_d(vdouble2 d) { - vdouble t = vsqrt(vadd(d.x, d.y)); - return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), vcast_vd_d(0.5)); -} - -// - -static INLINE vdouble xldexp(vdouble x, vint q) { return vldexp(x, q); } - -static INLINE vint xilogb(vdouble d) { - vdouble e = vcast_vd_vi(vsubi(vilogbp1(vabs(d)), vcast_vi_i(1))); - e = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-2147483648.0), e); - e = vsel(vmask_eq(vabs(d), vcast_vd_d(rtengine::RT_INFINITY)), vcast_vd_d(2147483647), e); - return vrint_vi_vd(e); -} - -static INLINE vdouble xsin(vdouble d) { - vint q; - vdouble u, s; - - q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_1_PI))); - - u = vcast_vd_vi(q); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*4))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*4))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*4))); - - s = vmul(d, d); - - d = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vneg(d), d); - - u = vcast_vd_d(-7.97255955009037868891952e-18); - u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); - u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); - u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); - u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); - u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); - u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); - u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); - u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); - - u = vmla(s, vmul(u, d), d); - - return u; -} - -static INLINE vdouble xcos(vdouble d) { - vint q; - vdouble u, s; - - q = vrint_vi_vd(vsub(vmul(d, vcast_vd_d(rtengine::RT_1_PI)), vcast_vd_d(0.5))); - q = vaddi(vaddi(q, q), vcast_vi_i(1)); - - u = vcast_vd_vi(q); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*2))); - d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*2))); - - s = vmul(d, d); - - d = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(0)), vneg(d), d); - - u = vcast_vd_d(-7.97255955009037868891952e-18); - u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); - u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); - u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); - u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); - u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); - u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); - u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); - u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); - - u = vmla(s, vmul(u, d), d); - - return u; -} - -static INLINE vdouble2 xsincos(vdouble d) { - vint q; - vmask m; - vdouble u, s, t, rx, ry; - vdouble2 r; - - q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); - - s = d; - - u = vcast_vd_vi(q); - s = vmla(u, vcast_vd_d(-PI4_A*2), s); - s = vmla(u, vcast_vd_d(-PI4_B*2), s); - s = vmla(u, vcast_vd_d(-PI4_C*2), s); - - t = s; - - s = vmul(s, s); - - u = vcast_vd_d(1.58938307283228937328511e-10); - u = vmla(u, s, vcast_vd_d(-2.50506943502539773349318e-08)); - u = vmla(u, s, vcast_vd_d(2.75573131776846360512547e-06)); - u = vmla(u, s, vcast_vd_d(-0.000198412698278911770864914)); - u = vmla(u, s, vcast_vd_d(0.0083333333333191845961746)); - u = vmla(u, s, vcast_vd_d(-0.166666666666666130709393)); - u = vmul(vmul(u, s), t); - - rx = vadd(t, u); - - u = vcast_vd_d(-1.13615350239097429531523e-11); - u = vmla(u, s, vcast_vd_d(2.08757471207040055479366e-09)); - u = vmla(u, s, vcast_vd_d(-2.75573144028847567498567e-07)); - u = vmla(u, s, vcast_vd_d(2.48015872890001867311915e-05)); - u = vmla(u, s, vcast_vd_d(-0.00138888888888714019282329)); - u = vmla(u, s, vcast_vd_d(0.0416666666666665519592062)); - u = vmla(u, s, vcast_vd_d(-0.5)); - - ry = vadd(vcast_vd_d(1), vmul(s, u)); - - m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(0)); - r.x = vsel(m, rx, ry); - r.y = vsel(m, ry, rx); - - m = vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)); - r.x = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.x))); - - m = vmaski_eq(vandi(vaddi(q, vcast_vi_i(1)), vcast_vi_i(2)), vcast_vi_i(2)); - r.y = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.y))); - - m = vmask_isinf(d); - r.x = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.x); - r.y = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.y); - - return r; -} - -static INLINE vdouble xtan(vdouble d) { - vint q; - vdouble u, s, x; - vmask m; - - q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); - - u = vcast_vd_vi(q); - x = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); - x = vadd(x, vmul(u, vcast_vd_d(-PI4_B*2))); - x = vadd(x, vmul(u, vcast_vd_d(-PI4_C*2))); - - s = vmul(x, x); - - m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)); - x = vsel(m, vneg(x), x); - - u = vcast_vd_d(1.01419718511083373224408e-05); - u = vmla(u, s, vcast_vd_d(-2.59519791585924697698614e-05)); - u = vmla(u, s, vcast_vd_d(5.23388081915899855325186e-05)); - u = vmla(u, s, vcast_vd_d(-3.05033014433946488225616e-05)); - u = vmla(u, s, vcast_vd_d(7.14707504084242744267497e-05)); - u = vmla(u, s, vcast_vd_d(8.09674518280159187045078e-05)); - u = vmla(u, s, vcast_vd_d(0.000244884931879331847054404)); - u = vmla(u, s, vcast_vd_d(0.000588505168743587154904506)); - u = vmla(u, s, vcast_vd_d(0.00145612788922812427978848)); - u = vmla(u, s, vcast_vd_d(0.00359208743836906619142924)); - u = vmla(u, s, vcast_vd_d(0.00886323944362401618113356)); - u = vmla(u, s, vcast_vd_d(0.0218694882853846389592078)); - u = vmla(u, s, vcast_vd_d(0.0539682539781298417636002)); - u = vmla(u, s, vcast_vd_d(0.133333333333125941821962)); - u = vmla(u, s, vcast_vd_d(0.333333333333334980164153)); - - u = vmla(s, vmul(u, x), x); - - u = vsel(m, vrec(u), u); - - u = vsel(vmask_isinf(d), vcast_vd_d(rtengine::RT_NAN), u); - - return u; -} - -static INLINE vdouble atan2k(vdouble y, vdouble x) { - vdouble s, t, u; - vint q; - vmask p; - - q = vseli_lt(x, vcast_vd_d(0), vcast_vi_i(-2), vcast_vi_i(0)); - x = vabs(x); - - q = vseli_lt(x, y, vaddi(q, vcast_vi_i(1)), q); - p = vmask_lt(x, y); - s = vsel (p, vneg(x), y); - t = vmax (x, y); - - s = vdiv(s, t); - t = vmul(s, s); - - u = vcast_vd_d(-1.88796008463073496563746e-05); - u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); - u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); - u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); - u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); - u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); - u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); - u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); - u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); - u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); - u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); - u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); - u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); - u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); - u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); - u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); - u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); - u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); - u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); - - t = vadd(s, vmul(s, vmul(t, u))); - t = vadd(t, vmul(vcast_vd_vi(q), vcast_vd_d(rtengine::RT_PI/2))); - - return t; -} - -static INLINE vdouble xatan2(vdouble y, vdouble x) { - vdouble r = atan2k(vabs(y), x); - - r = vmulsign(r, x); - r = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/2), x))), r); - r = vsel(vmask_isinf(y), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/4), x))), r); - r = vsel(vmask_eq(y, vcast_vd_d(0)), vsel(vmask_eq(vsign(x), vcast_vd_d(-1.0)), vcast_vd_d(rtengine::RT_PI), vcast_vd_d(0)), r); - - return vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), vmulsign(r, y)); -} - -static INLINE vdouble xasin(vdouble d) { - vdouble x, y; - x = vadd(vcast_vd_d(1), d); - y = vsub(vcast_vd_d(1), d); - x = vmul(x, y); - x = vsqrt(x); - x = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), atan2k(vabs(d), x)); - return vmulsign(x, d); -} - -static INLINE vdouble xacos(vdouble d) { - vdouble x, y; - x = vadd(vcast_vd_d(1), d); - y = vsub(vcast_vd_d(1), d); - x = vmul(x, y); - x = vsqrt(x); - x = vmulsign(atan2k(x, vabs(d)), d); - y = (vdouble)vandm(vmask_lt(d, vcast_vd_d(0)), (vmask)vcast_vd_d(rtengine::RT_PI)); - x = vadd(x, y); - return x; -} - -static INLINE vdouble xatan(vdouble s) { - vdouble t, u; - vint q; - - q = vseli_lt(s, vcast_vd_d(0), vcast_vi_i(2), vcast_vi_i(0)); - s = vabs(s); - - q = vseli_lt(vcast_vd_d(1), s, vaddi(q, vcast_vi_i(1)), q); - s = vsel(vmask_lt(vcast_vd_d(1), s), vdiv(vcast_vd_d(1), s), s); - - t = vmul(s, s); - - u = vcast_vd_d(-1.88796008463073496563746e-05); - u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); - u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); - u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); - u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); - u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); - u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); - u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); - u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); - u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); - u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); - u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); - u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); - u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); - u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); - u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); - u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); - u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); - u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); - - t = vadd(s, vmul(s, vmul(t, u))); - - t = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vsub(vcast_vd_d(rtengine::RT_PI/2), t), t); - t = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)), vneg(t), t); - - return t; -} - -static INLINE vdouble xlog(vdouble d) { - vdouble x, x2; - vdouble t, m; - vint e; - - e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); - m = vldexp(d, vsubi(vcast_vi_i(0), e)); - - x = vdiv(vadd(vcast_vd_d(-1), m), vadd(vcast_vd_d(1), m)); - x2 = vmul(x, x); - - t = vcast_vd_d(0.148197055177935105296783); - t = vmla(t, x2, vcast_vd_d(0.153108178020442575739679)); - t = vmla(t, x2, vcast_vd_d(0.181837339521549679055568)); - t = vmla(t, x2, vcast_vd_d(0.22222194152736701733275)); - t = vmla(t, x2, vcast_vd_d(0.285714288030134544449368)); - t = vmla(t, x2, vcast_vd_d(0.399999999989941956712869)); - t = vmla(t, x2, vcast_vd_d(0.666666666666685503450651)); - t = vmla(t, x2, vcast_vd_d(2)); - - x = vadd(vmul(x, t), vmul(vcast_vd_d(0.693147180559945286226764), vcast_vd_vi(e))); - - x = vsel(vmask_ispinf(d), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_gt(vcast_vd_d(0), d), vcast_vd_d(rtengine::RT_NAN), x); - x = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); - - return x; -} - -static INLINE vdouble xexp(vdouble d) { - vint q = vrint_vi_vd(vmul(d, vcast_vd_d(R_LN2))); - vdouble s, u; - - s = vadd(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); - s = vadd(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); - - u = vcast_vd_d(2.08860621107283687536341e-09); - u = vmla(u, s, vcast_vd_d(2.51112930892876518610661e-08)); - u = vmla(u, s, vcast_vd_d(2.75573911234900471893338e-07)); - u = vmla(u, s, vcast_vd_d(2.75572362911928827629423e-06)); - u = vmla(u, s, vcast_vd_d(2.4801587159235472998791e-05)); - u = vmla(u, s, vcast_vd_d(0.000198412698960509205564975)); - u = vmla(u, s, vcast_vd_d(0.00138888888889774492207962)); - u = vmla(u, s, vcast_vd_d(0.00833333333331652721664984)); - u = vmla(u, s, vcast_vd_d(0.0416666666666665047591422)); - u = vmla(u, s, vcast_vd_d(0.166666666666666851703837)); - u = vmla(u, s, vcast_vd_d(0.5)); - - u = vadd(vcast_vd_d(1), vadd(s, vmul(vmul(s, s), u))); - - u = vldexp(u, q); - - u = vsel(vmask_isminf(d), vcast_vd_d(0), u); - - return u; -} - -static INLINE vdouble2 logk(vdouble d) { - vdouble2 x, x2; - vdouble t, m; - vint e; - - e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); - m = vldexp(d, vsubi(vcast_vi_i(0), e)); - - x = div_dd(add2_ss(vcast_vd_d(-1), m), add2_ss(vcast_vd_d(1), m)); - x2 = squ_d(x); - x2 = normalize_d(x2); - - t = vcast_vd_d(0.134601987501262130076155); - t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); - t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); - t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); - t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); - t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); - t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); - t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); - - return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), - vcast_vd_vi(e)), - add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); -} - -static INLINE vdouble expk(vdouble2 d) { - vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); - vint q = vrint_vi_vd(u); - vdouble2 s, t; - - s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); - s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); - - q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); - - s = normalize_d(s); - - u = vcast_vd_d(2.51069683420950419527139e-08); - u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); - u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); - u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); - u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); - u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); - u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); - u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); - u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); - u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); - - t = add_dd(s, mul_ds(squ_d(s), u)); - - t = add_sd(vcast_vd_d(1), t); - u = vadd(t.x, t.y); - u = vldexp(u, q); - - return u; -} - -static INLINE vdouble xpow(vdouble x, vdouble y) { -#if 1 - vmask yisint = vmask_eq(vcast_vd_vi(vrint_vi_vd(y)), y); - vmask yisodd = vandm(vmaski_eq(vandi(vrint_vi_vd(y), vcast_vi_i(1)), vcast_vi_i(1)), yisint); - - vdouble result = expk(mul_ds(logk(vabs(x)), y)); - - //result = vsel(vmask_isnan(result), vcast_vd_d(rtengine::RT_INFINITY), result); - - result = vmul(result, - vsel(vmask_gt(x, vcast_vd_d(0)), - vcast_vd_d(1), - vsel(yisint, - vsel(yisodd, - vcast_vd_d(-1), - vcast_vd_d(1)), - vcast_vd_d(rtengine::RT_NAN)))); - - vdouble efx = vreinterpret_vd_vm(vxorm(vreinterpret_vm_vd(vsub(vabs(x), vcast_vd_d(1))), vsignbit(y))); - - result = vsel(vmask_isinf(y), - vsel(vmask_lt(efx, vcast_vd_d(0)), - vcast_vd_d(0), - vsel(vmask_eq(efx, vcast_vd_d(0)), - vcast_vd_d(1.0), - vcast_vd_d(rtengine::RT_INFINITY))), - result); - - result = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), - vmul(vsel(yisodd, vsign(x), vcast_vd_d(1)), - vsel(vmask_lt(vsel(vmask_eq(x, vcast_vd_d(0)), vneg(y), y), vcast_vd_d(0)), - vcast_vd_d(0), - vcast_vd_d(rtengine::RT_INFINITY))), - result); - - result = vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), result); - - result = vsel(vorm(vmask_eq(y, vcast_vd_d(0)), vmask_eq(x, vcast_vd_d(1))), vcast_vd_d(1), result); - - return result; -#else - return expk(mul_ds(logk(x), y)); -#endif -} - -static INLINE vdouble2 expk2(vdouble2 d) { - vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); - vint q = vrint_vi_vd(u); - vdouble2 s, t; - - s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); - s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); - - q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); - - s = normalize_d(s); - - u = vcast_vd_d(2.51069683420950419527139e-08); - u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); - u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); - u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); - u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); - u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); - u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); - u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); - u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); - u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); - - t = add_dd(s, mul_ds(squ_d(s), u)); - - t = add_sd(vcast_vd_d(1), t); - - return dd(vldexp(t.x, q), vldexp(t.y, q)); -} - -static INLINE vdouble xsinh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = expk2(dd(y, vcast_vd_d(0))); - d = add2_dd(d, div_dd(dd(vcast_vd_d(-1), vcast_vd_d(0)), d)); - y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); - - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - - return y; -} - -static INLINE vdouble xcosh(vdouble x) { - vdouble2 d = expk2(dd(x, vcast_vd_d(0))); - d = add2_dd(d, div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d)); - vdouble y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); - - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - - return y; -} - -static INLINE vdouble xtanh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = expk2(dd(y, vcast_vd_d(0))); - vdouble2 e = div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d); - d = div_dd(add2_dd(d, scale_d(e, vcast_vd_d(-1))), add2_dd(d, e)); - y = d.x + d.y; - - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(1.0), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - - return y; -} - -static INLINE vdouble2 logk2(vdouble2 d) { - vdouble2 x, x2, m; - vdouble t; - vint e; - - d = normalize_d(d); - e = vilogbp1(vmul(d.x, vcast_vd_d(0.7071))); - m = scale_d(d, vldexp(vcast_vd_d(1), vsubi(vcast_vi_i(0), e))); - - x = div_dd(add2_ds(m, vcast_vd_d(-1)), add2_ds(m, vcast_vd_d(1))); - x2 = squ_d(x); - x2 = normalize_d(x2); - - t = vcast_vd_d(0.134601987501262130076155); - t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); - t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); - t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); - t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); - t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); - t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); - t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); - - return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), - vcast_vd_vi(e)), - add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); -} - -static INLINE vdouble xasinh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), vcast_vd_d(1))), y)); - y = vadd(d.x, d.y); - - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - - return y; -} - -static INLINE vdouble xacosh(vdouble x) { - vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), vcast_vd_d(-1))), x)); - vdouble y = vadd(d.x, d.y); - - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); - y = vsel(vmask_eq(x, vcast_vd_d(1.0)), vcast_vd_d(0.0), y); - y = vsel(vmask_lt(x, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), y); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - - return y; -} - -static INLINE vdouble xatanh(vdouble x) { - vdouble y = vabs(x); - vdouble2 d = logk2(div_dd(add2_ss(vcast_vd_d(1), y), add2_ss(vcast_vd_d(1), -y))); - y = vsel(vmask_gt(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), vsel(vmask_eq(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_INFINITY), vmul(vadd(d.x, d.y), vcast_vd_d(0.5)))); - - y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), y); - y = vmulsign(y, x); - y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); - - return y; -} - -static INLINE vdouble xcbrt(vdouble d) { - vdouble x, y, q = vcast_vd_d(1.0); - vint e, qu, re; - vdouble t; - - e = vilogbp1(vabs(d)); - d = vldexp(d, vsubi(vcast_vi_i(0), e)); - - t = vadd(vcast_vd_vi(e), vcast_vd_d(6144)); - qu = vtruncate_vi_vd(vdiv(t, vcast_vd_d(3))); - re = vtruncate_vi_vd(vsub(t, vmul(vcast_vd_vi(qu), vcast_vd_d(3)))); - - q = vsel(vmaski_eq(re, vcast_vi_i(1)), vcast_vd_d(1.2599210498948731647672106), q); - q = vsel(vmaski_eq(re, vcast_vi_i(2)), vcast_vd_d(1.5874010519681994747517056), q); - q = vldexp(q, vsubi(qu, vcast_vi_i(2048))); - - q = vmulsign(q, d); - - d = vabs(d); - - x = vcast_vd_d(-0.640245898480692909870982); - x = vmla(x, d, vcast_vd_d(2.96155103020039511818595)); - x = vmla(x, d, vcast_vd_d(-5.73353060922947843636166)); - x = vmla(x, d, vcast_vd_d(6.03990368989458747961407)); - x = vmla(x, d, vcast_vd_d(-3.85841935510444988821632)); - x = vmla(x, d, vcast_vd_d(2.2307275302496609725722)); - - y = vmul(x, x); y = vmul(y, y); x = vsub(x, vmul(vmla(d, y, vneg(x)), vcast_vd_d(1.0 / 3.0))); - y = vmul(vmul(d, x), x); - y = vmul(vsub(y, vmul(vmul(vcast_vd_d(2.0 / 3.0), y), vmla(y, x, vcast_vd_d(-1.0)))), q); - - return y; -} - -static INLINE vdouble xexp2(vdouble a) { - vdouble u = expk(mul_ds(dd(vcast_vd_d(0.69314718055994528623), vcast_vd_d(2.3190468138462995584e-17)), a)); - u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); - u = vsel(vmask_isminf(a), vcast_vd_d(0), u); - return u; -} - -static INLINE vdouble xexp10(vdouble a) { - vdouble u = expk(mul_ds(dd(vcast_vd_d(2.3025850929940459011), vcast_vd_d(-2.1707562233822493508e-16)), a)); - u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); - u = vsel(vmask_isminf(a), vcast_vd_d(0), u); - return u; -} - -static INLINE vdouble xexpm1(vdouble a) { - vdouble2 d = add2_ds(expk2(dd(a, vcast_vd_d(0))), vcast_vd_d(-1.0)); - vdouble x = d.x + d.y; - x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_isminf(a), vcast_vd_d(-1), x); - return x; -} - -static INLINE vdouble xlog10(vdouble a) { - vdouble2 d = mul_dd(logk(a), dd(vcast_vd_d(0.43429448190325176116), vcast_vd_d(6.6494347733425473126e-17))); - vdouble x = d.x + d.y; - - x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_gt(vcast_vd_d(0), a), vcast_vd_d(rtengine::RT_NAN), x); - x = vsel(vmask_eq(a, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); - - return x; -} - -static INLINE vdouble xlog1p(vdouble a) { - vdouble2 d = logk2(add2_ss(a, vcast_vd_d(1))); - vdouble x = d.x + d.y; - - x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); - x = vsel(vmask_gt(vcast_vd_d(-1), a), vcast_vd_d(rtengine::RT_NAN), x); - x = vsel(vmask_eq(a, vcast_vd_d(-1)), vcast_vd_d(-rtengine::RT_INFINITY), x); - - return x; -} - -// - -typedef struct { - vfloat x, y; -} vfloat2; - -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)); } - -#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); -} - -static INLINE vint vselc(vmask mask, vint x, vint y) { - return _mm_blendv_epi8(y,x,mask); -} - -#else -// three instructions when using SSE2 -static INLINE vfloat vself(vmask mask, vfloat x, vfloat y) { - return (vfloat)vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); -} - -static INLINE vint vselc(vmask mask, vint x, vint y) { - return vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); -} -#endif - -static INLINE vfloat vselfzero(vmask mask, vfloat x) { - // returns value of x if corresponding mask bits are 1, else returns 0 - // faster than vself(mask, x, ZEROV) - return _mm_and_ps((vfloat)mask, x); -} -static INLINE vfloat vselfnotzero(vmask mask, vfloat x) { - // returns value of x if corresponding mask bits are 0, else returns 0 - // faster than vself(mask, ZEROV, x) - return _mm_andnot_ps((vfloat)mask, x); -} - -static INLINE vint vselizero(vmask mask, vint x) { - // returns value of x if corresponding mask bits are 1, else returns 0 - // faster than vselc(mask, x, ZEROV) - return _mm_and_si128(mask, x); -} -static INLINE vint vselinotzero(vmask mask, vint x) { - // returns value of x if corresponding mask bits are 0, else returns 0 - // faster than vselc(mask, ZEROV, x) - return _mm_andnot_si128(mask, x); -} - -static INLINE vint2 vseli2_lt(vfloat f0, vfloat f1, vint2 x, vint2 y) { - vint2 m2 = vcast_vi2_vm(vmaskf_lt(f0, f1)); - return vori2(vandi2(m2, x), vandnoti2(m2, y)); -} - -static INLINE vmask vsignbitf(vfloat f) { - return vandm((vmask)f, (vmask)vcast_vf_f(-0.0f)); -} - -static INLINE vfloat vmulsignf(vfloat x, vfloat y) { - return (vfloat)vxorm((vmask)x, vsignbitf(y)); -} - -static INLINE vfloat vsignf(vfloat f) { - return (vfloat)vorm((vmask)vcast_vf_f(1.0f), vandm((vmask)vcast_vf_f(-0.0f), (vmask)f)); -} - -static INLINE vmask vmaskf_isinf(vfloat d) { return vmaskf_eq(vabsf(d), vcast_vf_f(INFINITYf)); } -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)); } - -static INLINE vint2 vilogbp1f(vfloat d) { - vmask m = vmaskf_lt(d, vcast_vf_f(5.421010862427522E-20f)); - d = vself(m, vmulf(vcast_vf_f(1.8446744073709552E19f), d), d); - vint2 q = vandi2(vsrli2(vcast_vi2_vm(vreinterpret_vm_vf(d)), 23), vcast_vi2_i(0xff)); - q = vsubi2(q, vseli2(m, vcast_vi2_i(64 + 0x7e), vcast_vi2_i(0x7e))); - return q; -} - -static INLINE vfloat vldexpf(vfloat x, vint2 q) { - vfloat u; - vint2 m = vsrai2(q, 31); - m = vslli2(vsubi2(vsrai2(vaddi2(m, q), 6), m), 4); - q = vsubi2(q, vslli2(m, 2)); - u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(m, vcast_vi2_i(0x7f)), 23))); - x = vmulf(vmulf(vmulf(vmulf(x, u), u), u), u); - u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(q, vcast_vi2_i(0x7f)), 23))); - return vmulf(x, u); -} - -static INLINE vfloat xsinf(vfloat d) { - vint2 q; - vfloat u, s; - - q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI))); - - u = vcast_vf_vi2(q); - d = vmlaf(u, vcast_vf_f(-PI4_Af*4), d); - d = vmlaf(u, vcast_vf_f(-PI4_Bf*4), d); - d = vmlaf(u, vcast_vf_f(-PI4_Cf*4), d); - d = vmlaf(u, vcast_vf_f(-PI4_Df*4), d); - - s = vmulf(d, d); - - d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vnegf(d), d); - - u = vcast_vf_f(2.6083159809786593541503e-06f); - u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); - u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); - u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); - - u = vmlaf(s, vmulf(u, d), d); - - return u; -} - -static INLINE vfloat xcosf(vfloat d) { - vint2 q; - vfloat u, s; - - q = vrint_vi2_vf(vsubf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI)), vcast_vf_f(0.5f))); - q = vaddi2(vaddi2(q, q), vcast_vi2_i(1)); - - u = vcast_vf_vi2(q); - d = vmlaf(u, vcast_vf_f(-PI4_Af*2), d); - d = vmlaf(u, vcast_vf_f(-PI4_Bf*2), d); - d = vmlaf(u, vcast_vf_f(-PI4_Cf*2), d); - d = vmlaf(u, vcast_vf_f(-PI4_Df*2), d); - - s = vmulf(d, d); - - d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), d, vnegf(d)); - - u = vcast_vf_f(2.6083159809786593541503e-06f); - u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); - u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); - u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); - - u = vmlaf(s, vmulf(u, d), d); - - return u; -} - -static INLINE vfloat2 xsincosf(vfloat d) { - vint2 q; - vmask m; - vfloat u, s, t, rx, ry; - vfloat2 r; - - q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_2_PI))); - - s = d; - - u = vcast_vf_vi2(q); - s = vmlaf(u, vcast_vf_f(-PI4_Af*2), s); - s = vmlaf(u, vcast_vf_f(-PI4_Bf*2), s); - s = vmlaf(u, vcast_vf_f(-PI4_Cf*2), s); - s = vmlaf(u, vcast_vf_f(-PI4_Df*2), s); - - t = s; - - s = vmulf(s, s); - - u = vcast_vf_f(-0.000195169282960705459117889f); - u = vmlaf(u, s, vcast_vf_f(0.00833215750753879547119141f)); - u = vmlaf(u, s, vcast_vf_f(-0.166666537523269653320312f)); - u = vmulf(vmulf(u, s), t); - - rx = vaddf(t, u); - - u = vcast_vf_f(-2.71811842367242206819355e-07f); - u = vmlaf(u, s, vcast_vf_f(2.47990446951007470488548e-05f)); - u = vmlaf(u, s, vcast_vf_f(-0.00138888787478208541870117f)); - u = vmlaf(u, s, vcast_vf_f(0.0416666641831398010253906f)); - u = vmlaf(u, s, vcast_vf_f(-0.5)); - - ry = vaddf(vcast_vf_f(1), vmulf(s, u)); - - m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(0)); - r.x = vself(m, rx, ry); - r.y = vself(m, ry, rx); - - m = vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)); - r.x = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.x))); - - m = vmaski2_eq(vandi2(vaddi2(q, vcast_vi2_i(1)), vcast_vi2_i(2)), vcast_vi2_i(2)); - r.y = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.y))); - - m = vmaskf_isinf(d); - r.x = vself(m, vcast_vf_f(rtengine::RT_NAN), r.x); - r.y = vself(m, vcast_vf_f(rtengine::RT_NAN), r.y); - - return r; -} - -static INLINE vfloat xtanf(vfloat d) { - vint2 q; - vmask m; - vfloat u, s, x; - - q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)(2 * rtengine::RT_1_PI)))); - - x = d; - - u = vcast_vf_vi2(q); - x = vmlaf(u, vcast_vf_f(-PI4_Af*2), x); - x = vmlaf(u, vcast_vf_f(-PI4_Bf*2), x); - x = vmlaf(u, vcast_vf_f(-PI4_Cf*2), x); - x = vmlaf(u, vcast_vf_f(-PI4_Df*2), x); - - s = vmulf(x, x); - - m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)); - x = vself(m, vnegf(x), x); - - u = vcast_vf_f(0.00927245803177356719970703f); - u = vmlaf(u, s, vcast_vf_f(0.00331984995864331722259521f)); - u = vmlaf(u, s, vcast_vf_f(0.0242998078465461730957031f)); - u = vmlaf(u, s, vcast_vf_f(0.0534495301544666290283203f)); - u = vmlaf(u, s, vcast_vf_f(0.133383005857467651367188f)); - u = vmlaf(u, s, vcast_vf_f(0.333331853151321411132812f)); - - u = vmlaf(s, vmulf(u, x), x); - - u = vself(m, vrecf(u), u); - - u = vself(vmaskf_isinf(d), vcast_vf_f(NANf), u); - - return u; -} - -static INLINE vfloat xatanf(vfloat s) { - vfloat t, u; - vint2 q; - - q = vseli2_lt(s, vcast_vf_f(0.0f), vcast_vi2_i(2), vcast_vi2_i(0)); - s = vabsf(s); - - q = vseli2_lt(vcast_vf_f(1.0f), s, vaddi2(q, vcast_vi2_i(1)), q); - s = vself(vmaskf_lt(vcast_vf_f(1.0f), s), vdivf(vcast_vf_f(1.0f), s), s); - - t = vmulf(s, s); - - u = vcast_vf_f(0.00282363896258175373077393f); - u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); - u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); - u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); - u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); - u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); - u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); - u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); - - t = vaddf(s, vmulf(s, vmulf(t, u))); - - t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), t), t); - t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), vnegf(t), t); - - return t; -} - -static INLINE vfloat atan2kf(vfloat y, vfloat x) { - vfloat s, t, u; - vint2 q; - vmask p; - - q = vseli2_lt(x, vcast_vf_f(0.0f), vcast_vi2_i(-2), vcast_vi2_i(0)); - x = vabsf(x); - - q = vseli2_lt(x, y, vaddi2(q, vcast_vi2_i(1)), q); - p = vmaskf_lt(x, y); - s = vself(p, vnegf(x), y); - t = vmaxf(x, y); - - s = vdivf(s, t); - t = vmulf(s, s); - - u = vcast_vf_f(0.00282363896258175373077393f); - u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); - u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); - u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); - u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); - u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); - u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); - u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); - - t = vaddf(s, vmulf(s, vmulf(t, u))); - t = vaddf(t, vmulf(vcast_vf_vi2(q), vcast_vf_f((float)(rtengine::RT_PI/2)))); - - return t; -} - -static INLINE vfloat xatan2f(vfloat y, vfloat x) { - vfloat r = atan2kf(vabsf(y), x); - - r = vmulsignf(r, x); - r = vself(vorm(vmaskf_isinf(x), vmaskf_eq(x, vcast_vf_f(0.0f))), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), visinf2f(x, vmulsignf(vcast_vf_f((float)(rtengine::RT_PI/2)), x))), r); - 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(vmaskf_isnan(x, y), vcast_vf_f(NANf), vmulsignf(r, y)); -} - -static INLINE vfloat xasinf(vfloat d) { - vfloat x, y; - x = vaddf(vcast_vf_f(1.0f), d); - y = vsubf(vcast_vf_f(1.0f), d); - x = vmulf(x, y); - x = vsqrtf(x); - x = vself(vmaskf_isnan(x), vcast_vf_f(NANf), atan2kf(vabsf(d), x)); - return vmulsignf(x, d); -} - -static INLINE vfloat xacosf(vfloat d) { - vfloat x, y; - x = vaddf(vcast_vf_f(1.0f), d); - y = vsubf(vcast_vf_f(1.0f), d); - x = vmulf(x, y); - x = vsqrtf(x); - x = vmulsignf(atan2kf(x, vabsf(d)), d); - y = (vfloat)vandm(vmaskf_lt(d, vcast_vf_f(0.0f)), (vmask)vcast_vf_f((float)rtengine::RT_PI)); - x = vaddf(x, y); - return x; -} - -static INLINE vfloat xlogf(vfloat d) { - vfloat x, x2, t, m; - vint2 e; - - e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); - m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - - x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); - x2 = vmulf(x, x); - - t = vcast_vf_f(0.2371599674224853515625f); - t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); - t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); - t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); - t = vmlaf(t, x2, vcast_vf_f(2.0f)); - - x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); - - x = vself(vmaskf_ispinf(d), vcast_vf_f(INFINITYf), x); - x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(NANf), x); - x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(-INFINITYf), x); - - return x; -} - -static INLINE vfloat xlogf0(vfloat d) { - vfloat x, x2, t, m; - vint2 e; - - e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); - m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - - x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); - x2 = vmulf(x, x); - - t = vcast_vf_f(0.2371599674224853515625f); - t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); - t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); - t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); - t = vmlaf(t, x2, vcast_vf_f(2.0f)); - - x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); - - x = vself(vmaskf_ispinf(d), vcast_vf_f(0), x); - x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(0), x); - x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(0), x); - - return x; -} - -static INLINE vfloat xlogfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > 0 e.g. when filling a lookup table - vfloat x, x2, t, m; - vint2 e; - - e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); - m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - - x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); - x2 = vmulf(x, x); - - t = vcast_vf_f(0.2371599674224853515625f); - t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); - t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); - t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); - t = vmlaf(t, x2, vcast_vf_f(2.0f)); - - return vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); - -} - -static INLINE vfloat xexpf(vfloat d) { - vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); - vfloat s, u; - - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); - - u = vcast_vf_f(0.00136324646882712841033936f); - u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); - u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); - u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); - u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); - - u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); - - u = vldexpf(u, q); - - // -104.0 - return vselfnotzero(vmaskf_gt(vcast_vf_f(-104.f), d), u); -} - -static INLINE vfloat xexpfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > -104.f e.g. when filling a lookup table - vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); - vfloat s, u; - - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); - s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); - - u = vcast_vf_f(0.00136324646882712841033936f); - u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); - u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); - u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); - u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); - - u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); - - return vldexpf(u, q); -} - -static INLINE vfloat xcbrtf(vfloat d) { - vfloat x, y, q = vcast_vf_f(1.0), t; - vint2 e, qu, re; - - e = vilogbp1f(vabsf(d)); - d = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); - - t = vaddf(vcast_vf_vi2(e), vcast_vf_f(6144)); - qu = vtruncate_vi2_vf(vdivf(t, vcast_vf_f(3))); - re = vtruncate_vi2_vf(vsubf(t, vmulf(vcast_vf_vi2(qu), vcast_vf_f(3)))); - - q = vself(vmaski2_eq(re, vcast_vi2_i(1)), vcast_vf_f(1.2599210498948731647672106f), q); - q = vself(vmaski2_eq(re, vcast_vi2_i(2)), vcast_vf_f(1.5874010519681994747517056f), q); - q = vldexpf(q, vsubi2(qu, vcast_vi2_i(2048))); - - q = vmulsignf(q, d); - d = vabsf(d); - - x = vcast_vf_f(-0.601564466953277587890625f); - x = vmlaf(x, d, vcast_vf_f(2.8208892345428466796875f)); - x = vmlaf(x, d, vcast_vf_f(-5.532182216644287109375f)); - x = vmlaf(x, d, vcast_vf_f(5.898262500762939453125f)); - x = vmlaf(x, d, vcast_vf_f(-3.8095417022705078125f)); - x = vmlaf(x, d, vcast_vf_f(2.2241256237030029296875f)); - - y = vmulf(vmulf(d, x), x); - y = vmulf(vsubf(y, vmulf(vmulf(vcast_vf_f(2.0f / 3.0f), y), vmlaf(y, x, vcast_vf_f(-1.0f)))), q); - - return y; -} - -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){ - return a * 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 - a = vself(condition, b, a); // the values which fit to inverted condition - b = temp; -} - -static inline float vhadd( vfloat a ) { - // returns a[0] + a[1] + a[2] + a[3] - a += _mm_movehl_ps(a, a); - return _mm_cvtss_f32(_mm_add_ss(a, _mm_shuffle_ps(a, a, 1))); -} - -static inline float vhmin(vfloat a) { - // returns min(a[0], a[1], a[2], a[3]) - a = vminf(a, _mm_movehl_ps(a, a)); - return _mm_cvtss_f32(vminf(a, _mm_shuffle_ps(a, a, 1))); -} - -static inline float vhmax(vfloat a) { - // returns max(a[0], a[1], a[2], a[3]) - a = vmaxf(a, _mm_movehl_ps(a, a)); - return _mm_cvtss_f32(vmaxf(a, _mm_shuffle_ps(a, a, 1))); -} - -static INLINE vfloat vmul2f(vfloat a){ - // fastest way to multiply by 2 - return a + a; -} - -static INLINE vfloat vintpf(vfloat a, vfloat b, vfloat c) { - // calculate a * b + (1 - a) * c (interpolate two values) - // following is valid: - // vintpf(a, b+x, c+x) = vintpf(a, b, c) + x - // vintpf(a, b*x, c*x) = vintpf(a, b, c) * x - return a * (b-c) + c; -} - -static INLINE vfloat vdup(vfloat a){ - // returns { a[0],a[0],a[1],a[1] } - return _mm_unpacklo_ps( a, a ); -} - -static INLINE vfloat vaddc2vfu(float &a) -{ - // loads a[0]..a[7] and returns { a[0]+a[1], a[2]+a[3], a[4]+a[5], a[6]+a[7] } - vfloat a1 = _mm_loadu_ps( &a ); - vfloat a2 = _mm_loadu_ps( (&a) + 4 ); - return _mm_shuffle_ps(a1,a2,_MM_SHUFFLE( 2,0,2,0 )) + _mm_shuffle_ps(a1,a2,_MM_SHUFFLE( 3,1,3,1 )); -} - -static INLINE vfloat vadivapb (vfloat a, vfloat b) { - return a / (a+b); -} - -static INLINE void vconvertrgbrgbrgbrgb2rrrrggggbbbb (const float * src, vfloat &rv, vfloat &gv, vfloat &bv) { // cool function name, isn't it ? :P - // converts a sequence of 4 float RGB triplets to 3 red, green and blue quadruples - rv = _mm_setr_ps(src[0],src[3],src[6],src[9]); - gv = _mm_setr_ps(src[1],src[4],src[7],src[10]); - 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/sleefsseavx.h b/rtengine/sleefsseavx.h index 8fe20c54b..374823316 100644 --- a/rtengine/sleefsseavx.h +++ b/rtengine/sleefsseavx.h @@ -1,124 +1,902 @@ -#include -#include +//////////////////////////////////////////////////////////////// +// +// this code was taken from http://shibatch.sourceforge.net/ +// Many thanks to the author of original version: Naoki Shibata +// +// Copyright Naoki Shibata and contributors 2010 - 2021. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file sleef_LICENSE.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// This version contains modifications made by Ingo Weyrich +// +//////////////////////////////////////////////////////////////// +#pragma once +#include "rt_math.h" #ifdef __SSE2__ -#define VECTLENDP 2 -#define VECTLENSP 4 - -typedef __m128d vdouble; -typedef __m128i vint; - -typedef __m128 vfloat; -typedef __m128i vint2; -typedef __m128i vmask; - -static vdouble vloadu(double *p) -{ - return _mm_loadu_pd(p); -} -static void vstoreu(double *p, vdouble v) -{ - _mm_storeu_pd(p, v); -} - -static vfloat vloaduf(float *p) -{ - return _mm_loadu_ps(p); -} -static void vstoreuf(float *p, vfloat v) -{ - _mm_storeu_ps(p, v); -} - -static vint2 vloadui2(int32_t *p) -{ - return (vint2)_mm_loadu_si128((__m128i *)p); -} -static void vstoreui2(int32_t *p, vint2 v) -{ - _mm_storeu_si128((__m128i *)p, (__m128i)v); -} -#endif +#include "helpersse2.h" #ifdef ENABLE_AVX -#define VECTLENDP 4 -#define VECTLENSP 8 +#include "helperavx.h" +#endif -typedef __m256d vdouble; -typedef __m128i vint; +#ifdef __GNUC__ +#define INLINE __inline +#else +#define INLINE inline +#endif +#define PI4_A .7853981554508209228515625 +#define PI4_B .794662735614792836713604629039764404296875e-8 +#define PI4_C .306161699786838294306516483068750264552437361480769e-16 +#define M_4_PI 1.273239544735162542821171882678754627704620361328125 -typedef __m256 vfloat; -typedef struct { - vint x, y; -} vint2; +#define L2U .69314718055966295651160180568695068359375 +#define L2L .28235290563031577122588448175013436025525412068e-12 +#define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 -static vdouble vloadu(double *p) -{ - return _mm256_loadu_pd(p); -} -static void vstoreu(double *p, vdouble v) -{ - return _mm256_storeu_pd(p, v); +#define PI4_Af 0.78515625f +#define PI4_Bf 0.00024127960205078125f +#define PI4_Cf 6.3329935073852539062e-07f +#define PI4_Df 4.9604681473525147339e-10f + +#define L2Uf 0.693145751953125f +#define L2Lf 1.428606765330187045e-06f +#define R_LN2f 1.442695040888963407359924681001892137426645954152985934135449406931f + +#define INFINITYf ((float)rtengine::RT_INFINITY) +#define NANf ((float)rtengine::RT_NAN) + +static INLINE vdouble vadd3(vdouble v0, vdouble v1, vdouble v2) { + return vadd(vadd(v0, v1), v2); } -static vfloat vloaduf(float *p) -{ - return _mm256_loadu_ps(p); -} -static void vstoreuf(float *p, vfloat v) -{ - return _mm256_storeu_ps(p, v); +static INLINE vdouble vadd4(vdouble v0, vdouble v1, vdouble v2, vdouble v3) { + return vadd3(vadd(v0, v1), v2, v3); } -static vint2 vloadui2(int32_t *p) -{ - vint2 r; - r.x = _mm_loadu_si128((__m128i *) p ); - r.y = _mm_loadu_si128((__m128i *)(p + 4)); +static INLINE vdouble vadd5(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4) { + return vadd4(vadd(v0, v1), v2, v3, v4); +} + +static INLINE vdouble vadd6(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4, vdouble v5) { + return vadd5(vadd(v0, v1), v2, v3, v4, v5); +} + +static INLINE vdouble vadd7(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4, vdouble v5, vdouble v6) { + return vadd6(vadd(v0, v1), v2, v3, v4, v5, v6); +} + +static INLINE vdouble vsub3(vdouble v0, vdouble v1, vdouble v2) { + return vsub(vsub(v0, v1), v2); +} + +static INLINE vdouble vsub4(vdouble v0, vdouble v1, vdouble v2, vdouble v3) { + return vsub3(vsub(v0, v1), v2, v3); +} + +static INLINE vdouble vsub5(vdouble v0, vdouble v1, vdouble v2, vdouble v3, vdouble v4) { + return vsub4(vsub(v0, v1), v2, v3, v4); +} + +// + +static INLINE vdouble2 normalize_d(vdouble2 t) { + vdouble2 s; + + s.x = vadd(t.x, t.y); + s.y = vadd(vsub(t.x, s.x), t.y); + + return s; +} + +static INLINE vdouble2 scale_d(vdouble2 d, vdouble s) { + vdouble2 r = {vmul(d.x, s), vmul(d.y, s)}; return r; } -static void vstoreui2(int32_t *p, vint2 v) -{ - _mm_storeu_si128((__m128i *) p , v.x); - _mm_storeu_si128((__m128i *)(p + 4), v.y); +static INLINE vdouble2 add_ss(vdouble x, vdouble y) { + vdouble2 r; + + r.x = vadd(x, y); + r.y = vadd(vsub(x, r.x), y); + + return r; } -#endif -typedef struct { +static INLINE vdouble2 add2_ss(vdouble x, vdouble y) { + vdouble2 r; + + r.x = vadd(x, y); + vdouble v = vsub(r.x, x); + r.y = vadd(vsub(x, vsub(r.x, v)), vsub(y, v)); + + return r; +} + +static INLINE vdouble2 add_ds(vdouble2 x, vdouble y) { + vdouble2 r; + + r.x = vadd(x.x, y); + r.y = vadd3(vsub(x.x, r.x), y, x.y); + + return r; +} + +static INLINE vdouble2 add2_ds(vdouble2 x, vdouble y) { + vdouble2 r; + + r.x = vadd(x.x, y); + vdouble v = vsub(r.x, x.x); + r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y, v)); + r.y = vadd(r.y, x.y); + + return r; +} + +static INLINE vdouble2 add_sd(vdouble x, vdouble2 y) { + vdouble2 r; + + r.x = vadd(x, y.x); + r.y = vadd3(vsub(x, r.x), y.x, y.y); + + return r; +} + +static INLINE vdouble2 add_dd(vdouble2 x, vdouble2 y) { + // |x| >= |y| + + vdouble2 r; + + r.x = vadd(x.x, y.x); + r.y = vadd4(vsub(x.x, r.x), y.x, x.y, y.y); + + return r; +} + +static INLINE vdouble2 add2_dd(vdouble2 x, vdouble2 y) { + vdouble2 r; + + r.x = vadd(x.x, y.x); + vdouble v = vsub(r.x, x.x); + r.y = vadd(vsub(x.x, vsub(r.x, v)), vsub(y.x, v)); + r.y = vadd(r.y, vadd(x.y, y.y)); + + return r; +} + +static INLINE vdouble2 div_dd(vdouble2 n, vdouble2 d) { + vdouble t = vrec(d.x); + vdouble dh = vupper(d.x), dl = vsub(d.x, dh); + vdouble th = vupper(t ), tl = vsub(t , th); + vdouble nhh = vupper(n.x), nhl = vsub(n.x, nhh); + + vdouble2 q; + + q.x = vmul(n.x, t); + + vdouble u = vadd5(vsub(vmul(nhh, th), q.x), vmul(nhh, tl), vmul(nhl, th), vmul(nhl, tl), + vmul(q.x, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl)))); + + q.y = vadd(vmul(t, vsub(n.y, vmul(q.x, d.y))), u); + + return q; +} + +static INLINE vdouble2 mul_ss(vdouble x, vdouble y) { + vdouble xh = vupper(x), xl = vsub(x, xh); + vdouble yh = vupper(y), yl = vsub(y, yh); + vdouble2 r; + + r.x = vmul(x, y); + r.y = vadd5(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl)); + + return r; +} + +static INLINE vdouble2 mul_ds(vdouble2 x, vdouble y) { + vdouble xh = vupper(x.x), xl = vsub(x.x, xh); + vdouble yh = vupper(y ), yl = vsub(y , yh); + vdouble2 r; + + r.x = vmul(x.x, y); + r.y = vadd6(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.y, y)); + + return r; +} + +static INLINE vdouble2 mul_dd(vdouble2 x, vdouble2 y) { + vdouble xh = vupper(x.x), xl = vsub(x.x, xh); + vdouble yh = vupper(y.x), yl = vsub(y.x, yh); + vdouble2 r; + + r.x = vmul(x.x, y.x); + r.y = vadd7(vmul(xh, yh), vneg(r.x), vmul(xl, yh), vmul(xh, yl), vmul(xl, yl), vmul(x.x, y.y), vmul(x.y, y.x)); + + return r; +} + +static INLINE vdouble2 squ_d(vdouble2 x) { + vdouble xh = vupper(x.x), xl = vsub(x.x, xh); + vdouble2 r; + + r.x = vmul(x.x, x.x); + r.y = vadd5(vmul(xh, xh), vneg(r.x), vmul(vadd(xh, xh), xl), vmul(xl, xl), vmul(x.x, vadd(x.y, x.y))); + + return r; +} + +static INLINE vdouble2 rec_s(vdouble d) { + vdouble t = vrec(d); + vdouble dh = vupper(d), dl = vsub(d, dh); + vdouble th = vupper(t), tl = vsub(t, th); + vdouble2 q; + + q.x = t; + q.y = vmul(t, vsub5(vcast_vd_d(1), vmul(dh, th), vmul(dh, tl), vmul(dl, th), vmul(dl, tl))); + + return q; +} + +static INLINE vdouble2 sqrt_d(vdouble2 d) { + vdouble t = vsqrt(vadd(d.x, d.y)); + return scale_d(mul_dd(add2_dd(d, mul_ss(t, t)), rec_s(t)), vcast_vd_d(0.5)); +} + +// + +static INLINE vdouble xldexp(vdouble x, vint q) { return vldexp(x, q); } + +static INLINE vint xilogb(vdouble d) { + vdouble e = vcast_vd_vi(vsubi(vilogbp1(vabs(d)), vcast_vi_i(1))); + e = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-2147483648.0), e); + e = vsel(vmask_eq(vabs(d), vcast_vd_d(rtengine::RT_INFINITY)), vcast_vd_d(2147483647), e); + return vrint_vi_vd(e); +} + +static INLINE vdouble xsin(vdouble d) { + vint q; + vdouble u, s; + + q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_1_PI))); + + u = vcast_vd_vi(q); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*4))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*4))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*4))); + + s = vmul(d, d); + + d = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vneg(d), d); + + u = vcast_vd_d(-7.97255955009037868891952e-18); + u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); + u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); + u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); + u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); + u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); + u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); + u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); + u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); + + u = vmla(s, vmul(u, d), d); + + return u; +} + +static INLINE vdouble xcos(vdouble d) { + vint q; + vdouble u, s; + + q = vrint_vi_vd(vsub(vmul(d, vcast_vd_d(rtengine::RT_1_PI)), vcast_vd_d(0.5))); + q = vaddi(vaddi(q, q), vcast_vi_i(1)); + + u = vcast_vd_vi(q); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_B*2))); + d = vadd(d, vmul(u, vcast_vd_d(-PI4_C*2))); + + s = vmul(d, d); + + d = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(0)), vneg(d), d); + + u = vcast_vd_d(-7.97255955009037868891952e-18); + u = vmla(u, s, vcast_vd_d(2.81009972710863200091251e-15)); + u = vmla(u, s, vcast_vd_d(-7.64712219118158833288484e-13)); + u = vmla(u, s, vcast_vd_d(1.60590430605664501629054e-10)); + u = vmla(u, s, vcast_vd_d(-2.50521083763502045810755e-08)); + u = vmla(u, s, vcast_vd_d(2.75573192239198747630416e-06)); + u = vmla(u, s, vcast_vd_d(-0.000198412698412696162806809)); + u = vmla(u, s, vcast_vd_d(0.00833333333333332974823815)); + u = vmla(u, s, vcast_vd_d(-0.166666666666666657414808)); + + u = vmla(s, vmul(u, d), d); + + return u; +} + +static INLINE vdouble2 xsincos(vdouble d) { + vint q; + vmask m; + vdouble u, s, t, rx, ry; + vdouble2 r; + + q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); + + s = d; + + u = vcast_vd_vi(q); + s = vmla(u, vcast_vd_d(-PI4_A*2), s); + s = vmla(u, vcast_vd_d(-PI4_B*2), s); + s = vmla(u, vcast_vd_d(-PI4_C*2), s); + + t = s; + + s = vmul(s, s); + + u = vcast_vd_d(1.58938307283228937328511e-10); + u = vmla(u, s, vcast_vd_d(-2.50506943502539773349318e-08)); + u = vmla(u, s, vcast_vd_d(2.75573131776846360512547e-06)); + u = vmla(u, s, vcast_vd_d(-0.000198412698278911770864914)); + u = vmla(u, s, vcast_vd_d(0.0083333333333191845961746)); + u = vmla(u, s, vcast_vd_d(-0.166666666666666130709393)); + u = vmul(vmul(u, s), t); + + rx = vadd(t, u); + + u = vcast_vd_d(-1.13615350239097429531523e-11); + u = vmla(u, s, vcast_vd_d(2.08757471207040055479366e-09)); + u = vmla(u, s, vcast_vd_d(-2.75573144028847567498567e-07)); + u = vmla(u, s, vcast_vd_d(2.48015872890001867311915e-05)); + u = vmla(u, s, vcast_vd_d(-0.00138888888888714019282329)); + u = vmla(u, s, vcast_vd_d(0.0416666666666665519592062)); + u = vmla(u, s, vcast_vd_d(-0.5)); + + ry = vadd(vcast_vd_d(1), vmul(s, u)); + + m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(0)); + r.x = vsel(m, rx, ry); + r.y = vsel(m, ry, rx); + + m = vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)); + r.x = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.x))); + + m = vmaski_eq(vandi(vaddi(q, vcast_vi_i(1)), vcast_vi_i(2)), vcast_vi_i(2)); + r.y = vreinterpret_vd_vm(vxorm(vandm(m, vreinterpret_vm_vd(vcast_vd_d(-0.0))), vreinterpret_vm_vd(r.y))); + + m = vmask_isinf(d); + r.x = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.x); + r.y = vsel(m, vcast_vd_d(rtengine::RT_NAN), r.y); + + return r; +} + +static INLINE vdouble xtan(vdouble d) { + vint q; + vdouble u, s, x; + vmask m; + + q = vrint_vi_vd(vmul(d, vcast_vd_d(rtengine::RT_2_PI))); + + u = vcast_vd_vi(q); + x = vadd(d, vmul(u, vcast_vd_d(-PI4_A*2))); + x = vadd(x, vmul(u, vcast_vd_d(-PI4_B*2))); + x = vadd(x, vmul(u, vcast_vd_d(-PI4_C*2))); + + s = vmul(x, x); + + m = vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)); + x = vsel(m, vneg(x), x); + + u = vcast_vd_d(1.01419718511083373224408e-05); + u = vmla(u, s, vcast_vd_d(-2.59519791585924697698614e-05)); + u = vmla(u, s, vcast_vd_d(5.23388081915899855325186e-05)); + u = vmla(u, s, vcast_vd_d(-3.05033014433946488225616e-05)); + u = vmla(u, s, vcast_vd_d(7.14707504084242744267497e-05)); + u = vmla(u, s, vcast_vd_d(8.09674518280159187045078e-05)); + u = vmla(u, s, vcast_vd_d(0.000244884931879331847054404)); + u = vmla(u, s, vcast_vd_d(0.000588505168743587154904506)); + u = vmla(u, s, vcast_vd_d(0.00145612788922812427978848)); + u = vmla(u, s, vcast_vd_d(0.00359208743836906619142924)); + u = vmla(u, s, vcast_vd_d(0.00886323944362401618113356)); + u = vmla(u, s, vcast_vd_d(0.0218694882853846389592078)); + u = vmla(u, s, vcast_vd_d(0.0539682539781298417636002)); + u = vmla(u, s, vcast_vd_d(0.133333333333125941821962)); + u = vmla(u, s, vcast_vd_d(0.333333333333334980164153)); + + u = vmla(s, vmul(u, x), x); + + u = vsel(m, vrec(u), u); + + u = vsel(vmask_isinf(d), vcast_vd_d(rtengine::RT_NAN), u); + + return u; +} + +static INLINE vdouble atan2k(vdouble y, vdouble x) { + vdouble s, t, u; + vint q; + vmask p; + + q = vseli_lt(x, vcast_vd_d(0), vcast_vi_i(-2), vcast_vi_i(0)); + x = vabs(x); + + q = vseli_lt(x, y, vaddi(q, vcast_vi_i(1)), q); + p = vmask_lt(x, y); + s = vsel (p, vneg(x), y); + t = vmax (x, y); + + s = vdiv(s, t); + t = vmul(s, s); + + u = vcast_vd_d(-1.88796008463073496563746e-05); + u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); + u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); + u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); + u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); + u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); + u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); + u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); + u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); + u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); + u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); + u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); + u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); + u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); + u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); + u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); + u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); + u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); + u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); + + t = vadd(s, vmul(s, vmul(t, u))); + t = vadd(t, vmul(vcast_vd_vi(q), vcast_vd_d(rtengine::RT_PI/2))); + + return t; +} + +static INLINE vdouble xatan2(vdouble y, vdouble x) { + vdouble r = atan2k(vabs(y), x); + + r = vmulsign(r, x); + r = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/2), x))), r); + r = vsel(vmask_isinf(y), vsub(vcast_vd_d(rtengine::RT_PI/2), visinf2(x, vmulsign(vcast_vd_d(rtengine::RT_PI/4), x))), r); + r = vsel(vmask_eq(y, vcast_vd_d(0)), vsel(vmask_eq(vsign(x), vcast_vd_d(-1.0)), vcast_vd_d(rtengine::RT_PI), vcast_vd_d(0)), r); + + return vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), vmulsign(r, y)); +} + +static INLINE vdouble xasin(vdouble d) { vdouble x, y; -} vdouble2; + x = vadd(vcast_vd_d(1), d); + y = vsub(vcast_vd_d(1), d); + x = vmul(x, y); + x = vsqrt(x); + x = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), atan2k(vabs(d), x)); + return vmulsign(x, d); +} -vdouble xldexp(vdouble x, vint q); -vint xilogb(vdouble d); +static INLINE vdouble xacos(vdouble d) { + vdouble x, y; + x = vadd(vcast_vd_d(1), d); + y = vsub(vcast_vd_d(1), d); + x = vmul(x, y); + x = vsqrt(x); + x = vmulsign(atan2k(x, vabs(d)), d); + y = (vdouble)vandm(vmask_lt(d, vcast_vd_d(0)), (vmask)vcast_vd_d(rtengine::RT_PI)); + x = vadd(x, y); + return x; +} -vdouble xsin(vdouble d); -vdouble xcos(vdouble d); -vdouble2 xsincos(vdouble d); -vdouble xtan(vdouble d); -vdouble xasin(vdouble s); -vdouble xacos(vdouble s); -vdouble xatan(vdouble s); -vdouble xatan2(vdouble y, vdouble x); -vdouble xlog(vdouble d); -vdouble xexp(vdouble d); -vdouble xpow(vdouble x, vdouble y); +static INLINE vdouble xatan(vdouble s) { + vdouble t, u; + vint q; -vdouble xsinh(vdouble d); -vdouble xcosh(vdouble d); -vdouble xtanh(vdouble d); -vdouble xasinh(vdouble s); -vdouble xacosh(vdouble s); -vdouble xatanh(vdouble s); + q = vseli_lt(s, vcast_vd_d(0), vcast_vi_i(2), vcast_vi_i(0)); + s = vabs(s); -vdouble xcbrt(vdouble d); + q = vseli_lt(vcast_vd_d(1), s, vaddi(q, vcast_vi_i(1)), q); + s = vsel(vmask_lt(vcast_vd_d(1), s), vdiv(vcast_vd_d(1), s), s); -vdouble xexp2(vdouble a); -vdouble xexp10(vdouble a); -vdouble xexpm1(vdouble a); -vdouble xlog10(vdouble a); -vdouble xlog1p(vdouble a); + t = vmul(s, s); + + u = vcast_vd_d(-1.88796008463073496563746e-05); + u = vmla(u, t, vcast_vd_d(0.000209850076645816976906797)); + u = vmla(u, t, vcast_vd_d(-0.00110611831486672482563471)); + u = vmla(u, t, vcast_vd_d(0.00370026744188713119232403)); + u = vmla(u, t, vcast_vd_d(-0.00889896195887655491740809)); + u = vmla(u, t, vcast_vd_d(0.016599329773529201970117)); + u = vmla(u, t, vcast_vd_d(-0.0254517624932312641616861)); + u = vmla(u, t, vcast_vd_d(0.0337852580001353069993897)); + u = vmla(u, t, vcast_vd_d(-0.0407629191276836500001934)); + u = vmla(u, t, vcast_vd_d(0.0466667150077840625632675)); + u = vmla(u, t, vcast_vd_d(-0.0523674852303482457616113)); + u = vmla(u, t, vcast_vd_d(0.0587666392926673580854313)); + u = vmla(u, t, vcast_vd_d(-0.0666573579361080525984562)); + u = vmla(u, t, vcast_vd_d(0.0769219538311769618355029)); + u = vmla(u, t, vcast_vd_d(-0.090908995008245008229153)); + u = vmla(u, t, vcast_vd_d(0.111111105648261418443745)); + u = vmla(u, t, vcast_vd_d(-0.14285714266771329383765)); + u = vmla(u, t, vcast_vd_d(0.199999999996591265594148)); + u = vmla(u, t, vcast_vd_d(-0.333333333333311110369124)); + + t = vadd(s, vmul(s, vmul(t, u))); + + t = vsel(vmaski_eq(vandi(q, vcast_vi_i(1)), vcast_vi_i(1)), vsub(vcast_vd_d(rtengine::RT_PI/2), t), t); + t = vsel(vmaski_eq(vandi(q, vcast_vi_i(2)), vcast_vi_i(2)), vneg(t), t); + + return t; +} + +static INLINE vdouble xlog(vdouble d) { + vdouble x, x2; + vdouble t, m; + vint e; + + e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); + m = vldexp(d, vsubi(vcast_vi_i(0), e)); + + x = vdiv(vadd(vcast_vd_d(-1), m), vadd(vcast_vd_d(1), m)); + x2 = vmul(x, x); + + t = vcast_vd_d(0.148197055177935105296783); + t = vmla(t, x2, vcast_vd_d(0.153108178020442575739679)); + t = vmla(t, x2, vcast_vd_d(0.181837339521549679055568)); + t = vmla(t, x2, vcast_vd_d(0.22222194152736701733275)); + t = vmla(t, x2, vcast_vd_d(0.285714288030134544449368)); + t = vmla(t, x2, vcast_vd_d(0.399999999989941956712869)); + t = vmla(t, x2, vcast_vd_d(0.666666666666685503450651)); + t = vmla(t, x2, vcast_vd_d(2)); + + x = vadd(vmul(x, t), vmul(vcast_vd_d(0.693147180559945286226764), vcast_vd_vi(e))); + + x = vsel(vmask_ispinf(d), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_gt(vcast_vd_d(0), d), vcast_vd_d(rtengine::RT_NAN), x); + x = vsel(vmask_eq(d, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); + + return x; +} + +static INLINE vdouble xexp(vdouble d) { + vint q = vrint_vi_vd(vmul(d, vcast_vd_d(R_LN2))); + vdouble s, u; + + s = vadd(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); + s = vadd(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); + + u = vcast_vd_d(2.08860621107283687536341e-09); + u = vmla(u, s, vcast_vd_d(2.51112930892876518610661e-08)); + u = vmla(u, s, vcast_vd_d(2.75573911234900471893338e-07)); + u = vmla(u, s, vcast_vd_d(2.75572362911928827629423e-06)); + u = vmla(u, s, vcast_vd_d(2.4801587159235472998791e-05)); + u = vmla(u, s, vcast_vd_d(0.000198412698960509205564975)); + u = vmla(u, s, vcast_vd_d(0.00138888888889774492207962)); + u = vmla(u, s, vcast_vd_d(0.00833333333331652721664984)); + u = vmla(u, s, vcast_vd_d(0.0416666666666665047591422)); + u = vmla(u, s, vcast_vd_d(0.166666666666666851703837)); + u = vmla(u, s, vcast_vd_d(0.5)); + + u = vadd(vcast_vd_d(1), vadd(s, vmul(vmul(s, s), u))); + + u = vldexp(u, q); + + u = vsel(vmask_isminf(d), vcast_vd_d(0), u); + + return u; +} + +static INLINE vdouble2 logk(vdouble d) { + vdouble2 x, x2; + vdouble t, m; + vint e; + + e = vilogbp1(vmul(d, vcast_vd_d(0.7071))); + m = vldexp(d, vsubi(vcast_vi_i(0), e)); + + x = div_dd(add2_ss(vcast_vd_d(-1), m), add2_ss(vcast_vd_d(1), m)); + x2 = squ_d(x); + x2 = normalize_d(x2); + + t = vcast_vd_d(0.134601987501262130076155); + t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); + t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); + t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); + t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); + t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); + t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); + t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); + + return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), + vcast_vd_vi(e)), + add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); +} + +static INLINE vdouble expk(vdouble2 d) { + vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); + vint q = vrint_vi_vd(u); + vdouble2 s, t; + + s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); + s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); + + q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); + + s = normalize_d(s); + + u = vcast_vd_d(2.51069683420950419527139e-08); + u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); + u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); + u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); + u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); + u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); + u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); + u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); + u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); + u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); + + t = add_dd(s, mul_ds(squ_d(s), u)); + + t = add_sd(vcast_vd_d(1), t); + u = vadd(t.x, t.y); + u = vldexp(u, q); + + return u; +} + +static INLINE vdouble xpow(vdouble x, vdouble y) { +#if 1 + vmask yisint = vmask_eq(vcast_vd_vi(vrint_vi_vd(y)), y); + vmask yisodd = vandm(vmaski_eq(vandi(vrint_vi_vd(y), vcast_vi_i(1)), vcast_vi_i(1)), yisint); + + vdouble result = expk(mul_ds(logk(vabs(x)), y)); + + //result = vsel(vmask_isnan(result), vcast_vd_d(rtengine::RT_INFINITY), result); + + result = vmul(result, + vsel(vmask_gt(x, vcast_vd_d(0)), + vcast_vd_d(1), + vsel(yisint, + vsel(yisodd, + vcast_vd_d(-1), + vcast_vd_d(1)), + vcast_vd_d(rtengine::RT_NAN)))); + + vdouble efx = vreinterpret_vd_vm(vxorm(vreinterpret_vm_vd(vsub(vabs(x), vcast_vd_d(1))), vsignbit(y))); + + result = vsel(vmask_isinf(y), + vsel(vmask_lt(efx, vcast_vd_d(0)), + vcast_vd_d(0), + vsel(vmask_eq(efx, vcast_vd_d(0)), + vcast_vd_d(1.0), + vcast_vd_d(rtengine::RT_INFINITY))), + result); + + result = vsel(vorm(vmask_isinf(x), vmask_eq(x, vcast_vd_d(0))), + vmul(vsel(yisodd, vsign(x), vcast_vd_d(1)), + vsel(vmask_lt(vsel(vmask_eq(x, vcast_vd_d(0)), vneg(y), y), vcast_vd_d(0)), + vcast_vd_d(0), + vcast_vd_d(rtengine::RT_INFINITY))), + result); + + result = vsel(vorm(vmask_isnan(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), result); + + result = vsel(vorm(vmask_eq(y, vcast_vd_d(0)), vmask_eq(x, vcast_vd_d(1))), vcast_vd_d(1), result); + + return result; +#else + return expk(mul_ds(logk(x), y)); +#endif +} + +static INLINE vdouble2 expk2(vdouble2 d) { + vdouble u = vmul(vadd(d.x, d.y), vcast_vd_d(R_LN2)); + vint q = vrint_vi_vd(u); + vdouble2 s, t; + + s = add2_ds(d, vmul(vcast_vd_vi(q), vcast_vd_d(-L2U))); + s = add2_ds(s, vmul(vcast_vd_vi(q), vcast_vd_d(-L2L))); + + q = vrint_vi_vd(vmin(vmax(vcast_vd_d(-2047.49), u), vcast_vd_d(2047.49))); + + s = normalize_d(s); + + u = vcast_vd_d(2.51069683420950419527139e-08); + u = vmla(u, s.x, vcast_vd_d(2.76286166770270649116855e-07)); + u = vmla(u, s.x, vcast_vd_d(2.75572496725023574143864e-06)); + u = vmla(u, s.x, vcast_vd_d(2.48014973989819794114153e-05)); + u = vmla(u, s.x, vcast_vd_d(0.000198412698809069797676111)); + u = vmla(u, s.x, vcast_vd_d(0.0013888888939977128960529)); + u = vmla(u, s.x, vcast_vd_d(0.00833333333332371417601081)); + u = vmla(u, s.x, vcast_vd_d(0.0416666666665409524128449)); + u = vmla(u, s.x, vcast_vd_d(0.166666666666666740681535)); + u = vmla(u, s.x, vcast_vd_d(0.500000000000000999200722)); + + t = add_dd(s, mul_ds(squ_d(s), u)); + + t = add_sd(vcast_vd_d(1), t); + + return dd(vldexp(t.x, q), vldexp(t.y, q)); +} + +static INLINE vdouble xsinh(vdouble x) { + vdouble y = vabs(x); + vdouble2 d = expk2(dd(y, vcast_vd_d(0))); + d = add2_dd(d, div_dd(dd(vcast_vd_d(-1), vcast_vd_d(0)), d)); + y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); + + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + + return y; +} + +static INLINE vdouble xcosh(vdouble x) { + vdouble2 d = expk2(dd(x, vcast_vd_d(0))); + d = add2_dd(d, div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d)); + vdouble y = vmul(vadd(d.x, d.y), vcast_vd_d(0.5)); + + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + + return y; +} + +static INLINE vdouble xtanh(vdouble x) { + vdouble y = vabs(x); + vdouble2 d = expk2(dd(y, vcast_vd_d(0))); + vdouble2 e = div_dd(dd(vcast_vd_d(1), vcast_vd_d(0)), d); + d = div_dd(add2_dd(d, scale_d(e, vcast_vd_d(-1))), add2_dd(d, e)); + y = d.x + d.y; + + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(1.0), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + + return y; +} + +static INLINE vdouble2 logk2(vdouble2 d) { + vdouble2 x, x2, m; + vdouble t; + vint e; + + d = normalize_d(d); + e = vilogbp1(vmul(d.x, vcast_vd_d(0.7071))); + m = scale_d(d, vldexp(vcast_vd_d(1), vsubi(vcast_vi_i(0), e))); + + x = div_dd(add2_ds(m, vcast_vd_d(-1)), add2_ds(m, vcast_vd_d(1))); + x2 = squ_d(x); + x2 = normalize_d(x2); + + t = vcast_vd_d(0.134601987501262130076155); + t = vmla(t, x2.x, vcast_vd_d(0.132248509032032670243288)); + t = vmla(t, x2.x, vcast_vd_d(0.153883458318096079652524)); + t = vmla(t, x2.x, vcast_vd_d(0.181817427573705403298686)); + t = vmla(t, x2.x, vcast_vd_d(0.222222231326187414840781)); + t = vmla(t, x2.x, vcast_vd_d(0.285714285651261412873718)); + t = vmla(t, x2.x, vcast_vd_d(0.400000000000222439910458)); + t = vmla(t, x2.x, vcast_vd_d(0.666666666666666371239645)); + + return add2_dd(mul_ds(dd(vcast_vd_d(0.693147180559945286226764), vcast_vd_d(2.319046813846299558417771e-17)), + vcast_vd_vi(e)), + add2_dd(scale_d(x, vcast_vd_d(2)), mul_ds(mul_dd(x2, x), t))); +} + +static INLINE vdouble xasinh(vdouble x) { + vdouble y = vabs(x); + vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(y, y), vcast_vd_d(1))), y)); + y = vadd(d.x, d.y); + + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + + return y; +} + +static INLINE vdouble xacosh(vdouble x) { + vdouble2 d = logk2(add2_ds(sqrt_d(add2_ds(mul_ss(x, x), vcast_vd_d(-1))), x)); + vdouble y = vadd(d.x, d.y); + + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_INFINITY), y); + y = vsel(vmask_eq(x, vcast_vd_d(1.0)), vcast_vd_d(0.0), y); + y = vsel(vmask_lt(x, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), y); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + + return y; +} + +static INLINE vdouble xatanh(vdouble x) { + vdouble y = vabs(x); + vdouble2 d = logk2(div_dd(add2_ss(vcast_vd_d(1), y), add2_ss(vcast_vd_d(1), -y))); + y = vsel(vmask_gt(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_NAN), vsel(vmask_eq(y, vcast_vd_d(1.0)), vcast_vd_d(rtengine::RT_INFINITY), vmul(vadd(d.x, d.y), vcast_vd_d(0.5)))); + + y = vsel(vorm(vmask_isinf(x), vmask_isnan(y)), vcast_vd_d(rtengine::RT_NAN), y); + y = vmulsign(y, x); + y = vsel(vmask_isnan(x), vcast_vd_d(rtengine::RT_NAN), y); + + return y; +} + +static INLINE vdouble xcbrt(vdouble d) { + vdouble x, y, q = vcast_vd_d(1.0); + vint e, qu, re; + vdouble t; + + e = vilogbp1(vabs(d)); + d = vldexp(d, vsubi(vcast_vi_i(0), e)); + + t = vadd(vcast_vd_vi(e), vcast_vd_d(6144)); + qu = vtruncate_vi_vd(vdiv(t, vcast_vd_d(3))); + re = vtruncate_vi_vd(vsub(t, vmul(vcast_vd_vi(qu), vcast_vd_d(3)))); + + q = vsel(vmaski_eq(re, vcast_vi_i(1)), vcast_vd_d(1.2599210498948731647672106), q); + q = vsel(vmaski_eq(re, vcast_vi_i(2)), vcast_vd_d(1.5874010519681994747517056), q); + q = vldexp(q, vsubi(qu, vcast_vi_i(2048))); + + q = vmulsign(q, d); + + d = vabs(d); + + x = vcast_vd_d(-0.640245898480692909870982); + x = vmla(x, d, vcast_vd_d(2.96155103020039511818595)); + x = vmla(x, d, vcast_vd_d(-5.73353060922947843636166)); + x = vmla(x, d, vcast_vd_d(6.03990368989458747961407)); + x = vmla(x, d, vcast_vd_d(-3.85841935510444988821632)); + x = vmla(x, d, vcast_vd_d(2.2307275302496609725722)); + + y = vmul(x, x); y = vmul(y, y); x = vsub(x, vmul(vmla(d, y, vneg(x)), vcast_vd_d(1.0 / 3.0))); + y = vmul(vmul(d, x), x); + y = vmul(vsub(y, vmul(vmul(vcast_vd_d(2.0 / 3.0), y), vmla(y, x, vcast_vd_d(-1.0)))), q); + + return y; +} + +static INLINE vdouble xexp2(vdouble a) { + vdouble u = expk(mul_ds(dd(vcast_vd_d(0.69314718055994528623), vcast_vd_d(2.3190468138462995584e-17)), a)); + u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); + u = vsel(vmask_isminf(a), vcast_vd_d(0), u); + return u; +} + +static INLINE vdouble xexp10(vdouble a) { + vdouble u = expk(mul_ds(dd(vcast_vd_d(2.3025850929940459011), vcast_vd_d(-2.1707562233822493508e-16)), a)); + u = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), u); + u = vsel(vmask_isminf(a), vcast_vd_d(0), u); + return u; +} + +static INLINE vdouble xexpm1(vdouble a) { + vdouble2 d = add2_ds(expk2(dd(a, vcast_vd_d(0))), vcast_vd_d(-1.0)); + vdouble x = d.x + d.y; + x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_isminf(a), vcast_vd_d(-1), x); + return x; +} + +static INLINE vdouble xlog10(vdouble a) { + vdouble2 d = mul_dd(logk(a), dd(vcast_vd_d(0.43429448190325176116), vcast_vd_d(6.6494347733425473126e-17))); + vdouble x = d.x + d.y; + + x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_gt(vcast_vd_d(0), a), vcast_vd_d(rtengine::RT_NAN), x); + x = vsel(vmask_eq(a, vcast_vd_d(0)), vcast_vd_d(-rtengine::RT_INFINITY), x); + + return x; +} + +static INLINE vdouble xlog1p(vdouble a) { + vdouble2 d = logk2(add2_ss(a, vcast_vd_d(1))); + vdouble x = d.x + d.y; + + x = vsel(vmask_ispinf(a), vcast_vd_d(rtengine::RT_INFINITY), x); + x = vsel(vmask_gt(vcast_vd_d(-1), a), vcast_vd_d(rtengine::RT_NAN), x); + x = vsel(vmask_eq(a, vcast_vd_d(-1)), vcast_vd_d(-rtengine::RT_INFINITY), x); + + return x; +} // @@ -126,15 +904,580 @@ typedef struct { vfloat x, y; } vfloat2; -vfloat xsinf(vfloat d); -vfloat xcosf(vfloat d); -vfloat2 xsincosf(vfloat d); -vfloat xtanf(vfloat d); -vfloat xasinf(vfloat s); -vfloat xacosf(vfloat s); -vfloat xatanf(vfloat s); -vfloat xatan2f(vfloat y, vfloat x); -vfloat xlogf(vfloat d); -vfloat xlogf0(vfloat d); -vfloat xexpf(vfloat d); -vfloat xcbrtf(vfloat s); +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)); } + +#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); +} + +static INLINE vint vselc(vmask mask, vint x, vint y) { + return _mm_blendv_epi8(y,x,mask); +} + +#else +// three instructions when using SSE2 +static INLINE vfloat vself(vmask mask, vfloat x, vfloat y) { + return (vfloat)vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); +} + +static INLINE vint vselc(vmask mask, vint x, vint y) { + return vorm(vandm(mask, (vmask)x), vandnotm(mask, (vmask)y)); +} +#endif + +static INLINE vfloat vselfzero(vmask mask, vfloat x) { + // returns value of x if corresponding mask bits are 1, else returns 0 + // faster than vself(mask, x, ZEROV) + return _mm_and_ps((vfloat)mask, x); +} +static INLINE vfloat vselfnotzero(vmask mask, vfloat x) { + // returns value of x if corresponding mask bits are 0, else returns 0 + // faster than vself(mask, ZEROV, x) + return _mm_andnot_ps((vfloat)mask, x); +} + +static INLINE vint vselizero(vmask mask, vint x) { + // returns value of x if corresponding mask bits are 1, else returns 0 + // faster than vselc(mask, x, ZEROV) + return _mm_and_si128(mask, x); +} +static INLINE vint vselinotzero(vmask mask, vint x) { + // returns value of x if corresponding mask bits are 0, else returns 0 + // faster than vselc(mask, ZEROV, x) + return _mm_andnot_si128(mask, x); +} + +static INLINE vint2 vseli2_lt(vfloat f0, vfloat f1, vint2 x, vint2 y) { + vint2 m2 = vcast_vi2_vm(vmaskf_lt(f0, f1)); + return vori2(vandi2(m2, x), vandnoti2(m2, y)); +} + +static INLINE vmask vsignbitf(vfloat f) { + return vandm((vmask)f, (vmask)vcast_vf_f(-0.0f)); +} + +static INLINE vfloat vmulsignf(vfloat x, vfloat y) { + return (vfloat)vxorm((vmask)x, vsignbitf(y)); +} + +static INLINE vfloat vsignf(vfloat f) { + return (vfloat)vorm((vmask)vcast_vf_f(1.0f), vandm((vmask)vcast_vf_f(-0.0f), (vmask)f)); +} + +static INLINE vmask vmaskf_isinf(vfloat d) { return vmaskf_eq(vabsf(d), vcast_vf_f(INFINITYf)); } +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)); } + +static INLINE vint2 vilogbp1f(vfloat d) { + vmask m = vmaskf_lt(d, vcast_vf_f(5.421010862427522E-20f)); + d = vself(m, vmulf(vcast_vf_f(1.8446744073709552E19f), d), d); + vint2 q = vandi2(vsrli2(vcast_vi2_vm(vreinterpret_vm_vf(d)), 23), vcast_vi2_i(0xff)); + q = vsubi2(q, vseli2(m, vcast_vi2_i(64 + 0x7e), vcast_vi2_i(0x7e))); + return q; +} + +static INLINE vfloat vldexpf(vfloat x, vint2 q) { + vfloat u; + vint2 m = vsrai2(q, 31); + m = vslli2(vsubi2(vsrai2(vaddi2(m, q), 6), m), 4); + q = vsubi2(q, vslli2(m, 2)); + u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(m, vcast_vi2_i(0x7f)), 23))); + x = vmulf(vmulf(vmulf(vmulf(x, u), u), u), u); + u = vreinterpret_vf_vm(vcast_vm_vi2(vslli2(vaddi2(q, vcast_vi2_i(0x7f)), 23))); + return vmulf(x, u); +} + +static INLINE vfloat xsinf(vfloat d) { + vint2 q; + vfloat u, s; + + q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI))); + + u = vcast_vf_vi2(q); + d = vmlaf(u, vcast_vf_f(-PI4_Af*4), d); + d = vmlaf(u, vcast_vf_f(-PI4_Bf*4), d); + d = vmlaf(u, vcast_vf_f(-PI4_Cf*4), d); + d = vmlaf(u, vcast_vf_f(-PI4_Df*4), d); + + s = vmulf(d, d); + + d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vnegf(d), d); + + u = vcast_vf_f(2.6083159809786593541503e-06f); + u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); + u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); + u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); + + u = vmlaf(s, vmulf(u, d), d); + + return u; +} + +static INLINE vfloat xcosf(vfloat d) { + vint2 q; + vfloat u, s; + + q = vrint_vi2_vf(vsubf(vmulf(d, vcast_vf_f((float)rtengine::RT_1_PI)), vcast_vf_f(0.5f))); + q = vaddi2(vaddi2(q, q), vcast_vi2_i(1)); + + u = vcast_vf_vi2(q); + d = vmlaf(u, vcast_vf_f(-PI4_Af*2), d); + d = vmlaf(u, vcast_vf_f(-PI4_Bf*2), d); + d = vmlaf(u, vcast_vf_f(-PI4_Cf*2), d); + d = vmlaf(u, vcast_vf_f(-PI4_Df*2), d); + + s = vmulf(d, d); + + d = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), d, vnegf(d)); + + u = vcast_vf_f(2.6083159809786593541503e-06f); + u = vmlaf(u, s, vcast_vf_f(-0.0001981069071916863322258f)); + u = vmlaf(u, s, vcast_vf_f(0.00833307858556509017944336f)); + u = vmlaf(u, s, vcast_vf_f(-0.166666597127914428710938f)); + + u = vmlaf(s, vmulf(u, d), d); + + return u; +} + +static INLINE vfloat2 xsincosf(vfloat d) { + vint2 q; + vmask m; + vfloat u, s, t, rx, ry; + vfloat2 r; + + q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)rtengine::RT_2_PI))); + + s = d; + + u = vcast_vf_vi2(q); + s = vmlaf(u, vcast_vf_f(-PI4_Af*2), s); + s = vmlaf(u, vcast_vf_f(-PI4_Bf*2), s); + s = vmlaf(u, vcast_vf_f(-PI4_Cf*2), s); + s = vmlaf(u, vcast_vf_f(-PI4_Df*2), s); + + t = s; + + s = vmulf(s, s); + + u = vcast_vf_f(-0.000195169282960705459117889f); + u = vmlaf(u, s, vcast_vf_f(0.00833215750753879547119141f)); + u = vmlaf(u, s, vcast_vf_f(-0.166666537523269653320312f)); + u = vmulf(vmulf(u, s), t); + + rx = vaddf(t, u); + + u = vcast_vf_f(-2.71811842367242206819355e-07f); + u = vmlaf(u, s, vcast_vf_f(2.47990446951007470488548e-05f)); + u = vmlaf(u, s, vcast_vf_f(-0.00138888787478208541870117f)); + u = vmlaf(u, s, vcast_vf_f(0.0416666641831398010253906f)); + u = vmlaf(u, s, vcast_vf_f(-0.5)); + + ry = vaddf(vcast_vf_f(1), vmulf(s, u)); + + m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(0)); + r.x = vself(m, rx, ry); + r.y = vself(m, ry, rx); + + m = vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)); + r.x = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.x))); + + m = vmaski2_eq(vandi2(vaddi2(q, vcast_vi2_i(1)), vcast_vi2_i(2)), vcast_vi2_i(2)); + r.y = vreinterpret_vf_vm(vxorm(vandm(m, vreinterpret_vm_vf(vcast_vf_f(-0.0))), vreinterpret_vm_vf(r.y))); + + m = vmaskf_isinf(d); + r.x = vself(m, vcast_vf_f(rtengine::RT_NAN), r.x); + r.y = vself(m, vcast_vf_f(rtengine::RT_NAN), r.y); + + return r; +} + +static INLINE vfloat xtanf(vfloat d) { + vint2 q; + vmask m; + vfloat u, s, x; + + q = vrint_vi2_vf(vmulf(d, vcast_vf_f((float)(2 * rtengine::RT_1_PI)))); + + x = d; + + u = vcast_vf_vi2(q); + x = vmlaf(u, vcast_vf_f(-PI4_Af*2), x); + x = vmlaf(u, vcast_vf_f(-PI4_Bf*2), x); + x = vmlaf(u, vcast_vf_f(-PI4_Cf*2), x); + x = vmlaf(u, vcast_vf_f(-PI4_Df*2), x); + + s = vmulf(x, x); + + m = vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)); + x = vself(m, vnegf(x), x); + + u = vcast_vf_f(0.00927245803177356719970703f); + u = vmlaf(u, s, vcast_vf_f(0.00331984995864331722259521f)); + u = vmlaf(u, s, vcast_vf_f(0.0242998078465461730957031f)); + u = vmlaf(u, s, vcast_vf_f(0.0534495301544666290283203f)); + u = vmlaf(u, s, vcast_vf_f(0.133383005857467651367188f)); + u = vmlaf(u, s, vcast_vf_f(0.333331853151321411132812f)); + + u = vmlaf(s, vmulf(u, x), x); + + u = vself(m, vrecf(u), u); + + u = vself(vmaskf_isinf(d), vcast_vf_f(NANf), u); + + return u; +} + +static INLINE vfloat xatanf(vfloat s) { + vfloat t, u; + vint2 q; + + q = vseli2_lt(s, vcast_vf_f(0.0f), vcast_vi2_i(2), vcast_vi2_i(0)); + s = vabsf(s); + + q = vseli2_lt(vcast_vf_f(1.0f), s, vaddi2(q, vcast_vi2_i(1)), q); + s = vself(vmaskf_lt(vcast_vf_f(1.0f), s), vdivf(vcast_vf_f(1.0f), s), s); + + t = vmulf(s, s); + + u = vcast_vf_f(0.00282363896258175373077393f); + u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); + u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); + u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); + u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); + u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); + u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); + u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); + + t = vaddf(s, vmulf(s, vmulf(t, u))); + + t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(1)), vcast_vi2_i(1)), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), t), t); + t = vself(vmaski2_eq(vandi2(q, vcast_vi2_i(2)), vcast_vi2_i(2)), vnegf(t), t); + + return t; +} + +static INLINE vfloat atan2kf(vfloat y, vfloat x) { + vfloat s, t, u; + vint2 q; + vmask p; + + q = vseli2_lt(x, vcast_vf_f(0.0f), vcast_vi2_i(-2), vcast_vi2_i(0)); + x = vabsf(x); + + q = vseli2_lt(x, y, vaddi2(q, vcast_vi2_i(1)), q); + p = vmaskf_lt(x, y); + s = vself(p, vnegf(x), y); + t = vmaxf(x, y); + + s = vdivf(s, t); + t = vmulf(s, s); + + u = vcast_vf_f(0.00282363896258175373077393f); + u = vmlaf(u, t, vcast_vf_f(-0.0159569028764963150024414f)); + u = vmlaf(u, t, vcast_vf_f(0.0425049886107444763183594f)); + u = vmlaf(u, t, vcast_vf_f(-0.0748900920152664184570312f)); + u = vmlaf(u, t, vcast_vf_f(0.106347933411598205566406f)); + u = vmlaf(u, t, vcast_vf_f(-0.142027363181114196777344f)); + u = vmlaf(u, t, vcast_vf_f(0.199926957488059997558594f)); + u = vmlaf(u, t, vcast_vf_f(-0.333331018686294555664062f)); + + t = vaddf(s, vmulf(s, vmulf(t, u))); + t = vaddf(t, vmulf(vcast_vf_vi2(q), vcast_vf_f((float)(rtengine::RT_PI/2)))); + + return t; +} + +static INLINE vfloat xatan2f(vfloat y, vfloat x) { + vfloat r = atan2kf(vabsf(y), x); + + r = vmulsignf(r, x); + r = vself(vorm(vmaskf_isinf(x), vmaskf_eq(x, vcast_vf_f(0.0f))), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), visinf2f(x, vmulsignf(vcast_vf_f((float)(rtengine::RT_PI/2)), x))), r); + 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(vmaskf_isnan(x, y), vcast_vf_f(NANf), vmulsignf(r, y)); +} + +static INLINE vfloat xasinf(vfloat d) { + vfloat x, y; + x = vaddf(vcast_vf_f(1.0f), d); + y = vsubf(vcast_vf_f(1.0f), d); + x = vmulf(x, y); + x = vsqrtf(x); + x = vself(vmaskf_isnan(x), vcast_vf_f(NANf), atan2kf(vabsf(d), x)); + return vmulsignf(x, d); +} + +static INLINE vfloat xacosf(vfloat d) { + vfloat x, y; + x = vaddf(vcast_vf_f(1.0f), d); + y = vsubf(vcast_vf_f(1.0f), d); + x = vmulf(x, y); + x = vsqrtf(x); + x = vmulsignf(atan2kf(x, vabsf(d)), d); + y = (vfloat)vandm(vmaskf_lt(d, vcast_vf_f(0.0f)), (vmask)vcast_vf_f((float)rtengine::RT_PI)); + x = vaddf(x, y); + return x; +} + +static INLINE vfloat xlogf(vfloat d) { + vfloat x, x2, t, m; + vint2 e; + + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); + + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); + + x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + + x = vself(vmaskf_ispinf(d), vcast_vf_f(INFINITYf), x); + x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(NANf), x); + x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(-INFINITYf), x); + + return x; +} + +static INLINE vfloat xlogf1(vfloat d) { // does xlogf(vmaxf(d, 1.f)) but faster + vfloat x, x2, t, m; + vint2 e; + + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); + + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); + + x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + + x = vself(vmaskf_ispinf(d), vcast_vf_f(INFINITYf), x); + x = vselfnotzero(vmaskf_le(d, vcast_vf_f(1.f)), x); + + return x; +} + +static INLINE vfloat xlogf0(vfloat d) { + vfloat x, x2, t, m; + vint2 e; + + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); + + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); + + x = vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + + x = vself(vmaskf_ispinf(d), vcast_vf_f(0), x); + x = vself(vmaskf_gt(vcast_vf_f(0), d), vcast_vf_f(0), x); + x = vself(vmaskf_eq(d, vcast_vf_f(0)), vcast_vf_f(0), x); + + return x; +} + +static INLINE vfloat xlogfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > 0 e.g. when filling a lookup table + vfloat x, x2, t, m; + vint2 e; + + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); + + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); + + return vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + +} + +static INLINE vfloat xexpf(vfloat d) { + vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); + vfloat s, u; + + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); + + u = vcast_vf_f(0.00136324646882712841033936f); + u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); + u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); + u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); + u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); + + u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); + + u = vldexpf(u, q); + + // -104.0 + return vselfnotzero(vmaskf_gt(vcast_vf_f(-104.f), d), u); +} + +static INLINE vfloat xexpfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > -104.f e.g. when filling a lookup table + vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); + vfloat s, u; + + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); + + u = vcast_vf_f(0.00136324646882712841033936f); + u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); + u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); + u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); + u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); + + u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); + + return vldexpf(u, q); +} + +static INLINE vfloat xcbrtf(vfloat d) { + vfloat x, y, q = vcast_vf_f(1.0), t; + vint2 e, qu, re; + + e = vilogbp1f(vabsf(d)); + d = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + + t = vaddf(vcast_vf_vi2(e), vcast_vf_f(6144)); + qu = vtruncate_vi2_vf(vdivf(t, vcast_vf_f(3))); + re = vtruncate_vi2_vf(vsubf(t, vmulf(vcast_vf_vi2(qu), vcast_vf_f(3)))); + + q = vself(vmaski2_eq(re, vcast_vi2_i(1)), vcast_vf_f(1.2599210498948731647672106f), q); + q = vself(vmaski2_eq(re, vcast_vi2_i(2)), vcast_vf_f(1.5874010519681994747517056f), q); + q = vldexpf(q, vsubi2(qu, vcast_vi2_i(2048))); + + q = vmulsignf(q, d); + d = vabsf(d); + + x = vcast_vf_f(-0.601564466953277587890625f); + x = vmlaf(x, d, vcast_vf_f(2.8208892345428466796875f)); + x = vmlaf(x, d, vcast_vf_f(-5.532182216644287109375f)); + x = vmlaf(x, d, vcast_vf_f(5.898262500762939453125f)); + x = vmlaf(x, d, vcast_vf_f(-3.8095417022705078125f)); + x = vmlaf(x, d, vcast_vf_f(2.2241256237030029296875f)); + + y = vmulf(vmulf(d, x), x); + y = vmulf(vsubf(y, vmulf(vmulf(vcast_vf_f(2.0f / 3.0f), y), vmlaf(y, x, vcast_vf_f(-1.0f)))), q); + + return y; +} + +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){ + return a * 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 + a = vself(condition, b, a); // the values which fit to inverted condition + b = temp; +} + +static inline float vhadd( vfloat a ) { + // returns a[0] + a[1] + a[2] + a[3] + a += _mm_movehl_ps(a, a); + return _mm_cvtss_f32(_mm_add_ss(a, _mm_shuffle_ps(a, a, 1))); +} + +static inline float vhmin(vfloat a) { + // returns min(a[0], a[1], a[2], a[3]) + a = vminf(a, _mm_movehl_ps(a, a)); + return _mm_cvtss_f32(vminf(a, _mm_shuffle_ps(a, a, 1))); +} + +static inline float vhmax(vfloat a) { + // returns max(a[0], a[1], a[2], a[3]) + a = vmaxf(a, _mm_movehl_ps(a, a)); + return _mm_cvtss_f32(vmaxf(a, _mm_shuffle_ps(a, a, 1))); +} + +static INLINE vfloat vmul2f(vfloat a){ + // fastest way to multiply by 2 + return a + a; +} + +static INLINE vfloat vintpf(vfloat a, vfloat b, vfloat c) { + // calculate a * b + (1 - a) * c (interpolate two values) + // following is valid: + // vintpf(a, b+x, c+x) = vintpf(a, b, c) + x + // vintpf(a, b*x, c*x) = vintpf(a, b, c) * x + return a * (b-c) + c; +} + +static INLINE vfloat vdup(vfloat a){ + // returns { a[0],a[0],a[1],a[1] } + return _mm_unpacklo_ps( a, a ); +} + +static INLINE vfloat vaddc2vfu(float &a) +{ + // loads a[0]..a[7] and returns { a[0]+a[1], a[2]+a[3], a[4]+a[5], a[6]+a[7] } + vfloat a1 = _mm_loadu_ps( &a ); + vfloat a2 = _mm_loadu_ps( (&a) + 4 ); + return _mm_shuffle_ps(a1,a2,_MM_SHUFFLE( 2,0,2,0 )) + _mm_shuffle_ps(a1,a2,_MM_SHUFFLE( 3,1,3,1 )); +} + +static INLINE vfloat vadivapb (vfloat a, vfloat b) { + return a / (a+b); +} + +static INLINE void vconvertrgbrgbrgbrgb2rrrrggggbbbb (const float * src, vfloat &rv, vfloat &gv, vfloat &bv) { // cool function name, isn't it ? :P + // converts a sequence of 4 float RGB triplets to 3 red, green and blue quadruples + rv = _mm_setr_ps(src[0],src[3],src[6],src[9]); + gv = _mm_setr_ps(src[1],src[4],src[7],src[10]); + 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__ diff --git a/rtengine/spot.cc b/rtengine/spot.cc new file mode 100644 index 000000000..09186a399 --- /dev/null +++ b/rtengine/spot.cc @@ -0,0 +1,580 @@ +/* + * 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 "improcfun.h" +#include "alpha.h" +#include "procparams.h" +#include "imagesource.h" +#include "imagefloat.h" +#include "rt_math.h" +#include +#include +#include + +namespace rtengine +{ + +class SpotBox; + +} + +namespace +{ + +using Boxes = std::vector>; + +/** + * Add the spot and its dependencies to a set of dependencies. + * + * @param spotNum The spot's index. + * @param dependencies A set to place the dependencies in. Spots that are + * already in the set must have all their dependencies included already. + * @param srcSpots Information on spot sources. + * @param dstSpots Information on spot destinations. + */ +void addSpotDependencies(int spotNum, std::unordered_set &dependencies, const Boxes &srcSpots, const Boxes &dstSpots); + +/** + * Returns the supplied spots and all their dependencies. + * + * @param visibleSpots The spots to get dependencies for. + * @param srcSpots Information on spot sources. + * @param dstSpots Information on spot destinations. + */ +std::unordered_set calcSpotDependencies(const std::set &visibleSpots, const Boxes &srcSpots, const Boxes &dstSpots); +} + +namespace rtengine +{ + +class SpotBox { + +public: + enum class Type { + SOURCE, + TARGET, + FINAL + }; + + struct Rectangle { + int x1; + int y1; + int x2; + int y2; + + Rectangle() : Rectangle(0, 0, 0, 0) {} + Rectangle(int X1, int Y1, int X2, int Y2) : x1(X1), y1(Y1), x2(X2), y2(Y2) {} + + int getWidth() { + return x2 - x1 + 1; + } + + int getHeight() { + return y2 - y1 + 1; + } + + bool intersects(const Rectangle &other) const { + return (other.x1 <= x2 && other.x2 >= x1) + && (other.y1 <= y2 && other.y2 >= y1); + } + + bool getIntersection(const Rectangle &other, std::unique_ptr &intersection) const { + if (intersects(other)) { + std::unique_ptr intsec( + new Rectangle( + rtengine::max(x1, other.x1), + rtengine::max(y1, other.y1), + rtengine::min(x2, other.x2), + rtengine::min(y2, other.y2) + ) + ); + + if (intsec->x1 > intsec->x2 || intsec->y1 > intsec->y2) { + return false; + } + + intersection = std::move(intsec); + return true; + } + if (intersection) { + // There's no intersection, we delete the Rectangle structure + intersection.release(); + } + return false; + } + + Rectangle& operator+=(const Coord &v) { + x1 += v.x; + y1 += v.y; + x2 += v.x; + y2 += v.y; + return *this; + } + + Rectangle& operator-=(const Coord &v) { + x1 -= v.x; + y1 -= v.y; + x2 -= v.x; + y2 -= v.y; + return *this; + } + + Rectangle& operator/=(int v) { + if (v == 1) { + return *this; + } + + int w = x2 - x1 + 1; + int h = y2 - y1 + 1; + w = w / v + static_cast(w % v); + h = h / v + static_cast(h % v); + x1 /= v; + y1 /= v; + x2 = x1 + w - 1; + y2 = y1 + h - 1; + + return *this; + } + }; + +private: + Type type; + Imagefloat* image; + +public: + // top/left and bottom/right coordinates of the spot in image space (at some point divided by scale factor) + Rectangle spotArea; + // top/left and bottom/right coordinates of the spot in scaled image space (on borders, imgArea won't cover spotArea) + Rectangle imgArea; + // top/left and bottom/right coordinates of useful part of the image in scaled image space (rounding error workaround) + Rectangle intersectionArea; + float radius; + float featherRadius; + + SpotBox (int tl_x, int tl_y, int br_x, int br_y, int radius, int feather_radius, Imagefloat* image, Type type) : + type(type), + image(image), + spotArea(tl_x, tl_y, br_x, br_y), + imgArea(spotArea), + intersectionArea(), + radius(radius), + featherRadius(feather_radius) + {} + + SpotBox (int tl_x, int tl_y, int radius, int feather_radius, Imagefloat* image, Type type) : + type(type), + image(image), + spotArea(tl_x, tl_y, image ? tl_x + image->getWidth() - 1 : 0, image ? tl_y + image->getHeight() - 1 : 0), + imgArea(spotArea), + intersectionArea(), + radius(radius), + featherRadius(feather_radius) + {} + + SpotBox (SpotEntry &spot, Type type) : + type(type), + image(nullptr), + intersectionArea(), + radius(spot.radius), + featherRadius(int(spot.getFeatherRadius() + 0.5f)) // rounding to int before resizing + { + spotArea.x1 = int ((type == Type::SOURCE ? spot.sourcePos.x : spot.targetPos.x) - featherRadius); + spotArea.x2 = int ((type == Type::SOURCE ? spot.sourcePos.x : spot.targetPos.x) + featherRadius); + spotArea.y1 = int ((type == Type::SOURCE ? spot.sourcePos.y : spot.targetPos.y) - featherRadius); + spotArea.y2 = int ((type == Type::SOURCE ? spot.sourcePos.y : spot.targetPos.y) + featherRadius); + imgArea = spotArea; + } + + ~SpotBox() { + if (image && type != Type::FINAL) { + delete image; + } + } + + SpotBox& operator /=(int v) { + if (v == 1) { + return *this; + } + spotArea /= v; + imgArea /= v; + radius /= float(v); + featherRadius = getWidth() / 2.f; + // intersectionArea doesn't need resize, because it's set after resizing + return *this; + } + + int getWidth() { + return spotArea.getWidth(); + } + + int getHeight() { + return spotArea.getHeight(); + } + + int getImageWidth() { + return imgArea.getWidth(); + } + + int getImageHeight() { + return imgArea.getHeight(); + } + + int getIntersectionWidth() { + return intersectionArea.getWidth(); + } + + int getIntersectionHeight() { + return intersectionArea.getHeight(); + } + + bool checkImageSize() { + if (!image || getImageWidth() != image->getWidth() || getImageHeight() != image->getHeight()) { + return false; + } + return true; + } + + void tuneImageSize() { + if (!image) { + return; + } + if (getImageWidth() > image->getWidth()) { + imgArea.x2 = imgArea.x1 + image->getWidth() - 1; + } + if (getImageHeight() > image->getHeight()) { + imgArea.y2 = imgArea.y1 + image->getHeight() - 1; + } + } + + Imagefloat *getImage() { // TODO: this should send back a const value, but getImage don't want it to be const... + return image; + } + + void allocImage() { + int newW = imgArea.x2 - imgArea.x1 + 1; + int newH = imgArea.y2 - imgArea.y1 + 1; + + if (image && type != Type::FINAL && (image->getWidth() != newW || image->getHeight() != newH)) { + delete image; + image = nullptr; + } + if (image == nullptr) { + image = new Imagefloat(newW, newH); + } + } + + bool spotIntersects(const SpotBox &other) const { + return spotArea.intersects(other.spotArea); + } + + bool getSpotIntersection(const SpotBox &other, std::unique_ptr &intersection) const { + return spotArea.getIntersection(other.spotArea, intersection); + } + + bool imageIntersects(const SpotBox &other, bool atDestLocation=false) const { + if (atDestLocation) { + Coord v(other.spotArea.x1 - spotArea.x1, other.spotArea.y1 - spotArea.y1); + Rectangle imgArea2(imgArea.x1, imgArea.y1, imgArea.x2, imgArea.y2); + imgArea2 += v; + return imgArea2.intersects(other.imgArea); + } + return imgArea.intersects(other.imgArea); + } + + bool mutuallyClipImageArea(SpotBox &other) { + Coord v(other.spotArea.x1 - spotArea.x1, other.spotArea.y1 - spotArea.y1); + Rectangle imgArea2 = imgArea; + imgArea2 += v; + std::unique_ptr intersection; + if (!imgArea2.getIntersection(other.imgArea, intersection)) { + return false; + } + other.intersectionArea = *intersection; + Coord v2(-v.x, -v.y); + *intersection -= v; + intersectionArea = *intersection; + return true; + } + + bool setIntersectionWith(const SpotBox &other) { + if (!spotIntersects(other)) { + return false; + } + imgArea.x1 = rtengine::max(spotArea.x1, other.spotArea.x1); + imgArea.x2 = rtengine::min(spotArea.x2, other.spotArea.x2); + imgArea.y1 = rtengine::max(spotArea.y1, other.spotArea.y1); + imgArea.y2 = rtengine::min(spotArea.y2, other.spotArea.y2); + if (imgArea.x1 > imgArea.x2 || imgArea.y1 > imgArea.y2) { + return false; + } + return true; + } + + bool processIntersectionWith(SpotBox &destBox) { + Imagefloat *dstImg = destBox.image; + + if (image == nullptr || dstImg == nullptr) { + std::cerr << "One of the source or destination SpotBox image is missing !" << std::endl; + return false; + } + + int srcImgY = intersectionArea.y1 - imgArea.y1; + int dstImgY = destBox.intersectionArea.y1 - destBox.imgArea.y1; + for (int y = intersectionArea.y1; y <= intersectionArea.y2; ++y) { + float dy = float(y - spotArea.y1) - featherRadius; + + int srcImgX = intersectionArea.x1 - imgArea.x1; + int dstImgX = destBox.intersectionArea.x1 - destBox.imgArea.x1; + for (int x = intersectionArea.x1; x <= intersectionArea.x2; ++x) { + float dx = float(x - spotArea.x1) - featherRadius; + float r = sqrt(dx * dx + dy * dy); + + if (r >= featherRadius) { + ++srcImgX; + ++dstImgX; + continue; + } + if (r <= radius) { + dstImg->r(dstImgY, dstImgX) = image->r(srcImgY, srcImgX); + dstImg->g(dstImgY, dstImgX) = image->g(srcImgY, srcImgX); + dstImg->b(dstImgY, dstImgX) = image->b(srcImgY, srcImgX); + } else { + float opacity = (featherRadius - r) / (featherRadius - radius); + dstImg->r(dstImgY, dstImgX) = (image->r(srcImgY, srcImgX) - dstImg->r(dstImgY, dstImgX)) * opacity + dstImg->r(dstImgY,dstImgX); + dstImg->g(dstImgY, dstImgX) = (image->g(srcImgY, srcImgX) - dstImg->g(dstImgY, dstImgX)) * opacity + dstImg->g(dstImgY,dstImgX); + dstImg->b(dstImgY, dstImgX) = (image->b(srcImgY, srcImgX) - dstImg->b(dstImgY, dstImgX)) * opacity + dstImg->b(dstImgY,dstImgX); + } + ++srcImgX; + ++dstImgX; + } + ++srcImgY; + ++dstImgY; + } + + return true; + } + + // Copy the intersecting part + bool copyImgTo(SpotBox &destBox) { + Imagefloat *destImg = destBox.image; + + if (image == nullptr || destImg == nullptr) { + std::cerr << "One of the source or destination SpotBox image is missing !" << std::endl; + return false; + } + + std::unique_ptr intersection; + + if (!intersectionArea.getIntersection(destBox.intersectionArea, intersection)) { + return false; + } + + Imagefloat *srcImg = image; + Imagefloat *dstImg = destBox.image; + + int srcImgY = intersection->y1 - imgArea.y1; + int dstImgY = intersection->y1 - destBox.imgArea.y1; + for (int y = intersection->y1; y <= intersection->y2; ++y) { + int srcImgX = intersection->x1 - imgArea.x1; + int dstImgX = intersection->x1 - destBox.imgArea.x1; + + for (int x = intersection->x1; x <= intersection->x2; ++x) { + dstImg->r(dstImgY, dstImgX) = srcImg->r(srcImgY, srcImgX); + dstImg->g(dstImgY, dstImgX) = srcImg->g(srcImgY, srcImgX); + dstImg->b(dstImgY, dstImgX) = srcImg->b(srcImgY, srcImgX); + ++srcImgX; + ++dstImgX; + } + ++srcImgY; + ++dstImgY; + } + + return true; + } +}; + +void ImProcFunctions::removeSpots (Imagefloat* img, ImageSource* imgsrc, const std::vector &entries, const PreviewProps &pp, const ColorTemp &currWB, const ColorManagementParams *cmp, int tr) +{ + //Get the clipped image areas (src & dst) from the source image + + std::vector< std::shared_ptr > srcSpotBoxs; + std::vector< std::shared_ptr > dstSpotBoxs; + int fullImgWidth = 0; + int fullImgHeight = 0; + imgsrc->getFullSize(fullImgWidth, fullImgHeight, tr); + SpotBox fullImageBox(0, 0, fullImgWidth - 1, fullImgHeight - 1, 0, 0, nullptr, SpotBox::Type::FINAL); + SpotBox cropBox(pp.getX(), pp.getY(), + pp.getX() + pp.getWidth() - 1, pp.getY() + pp.getHeight() - 1, + 0, 0, img, SpotBox::Type::FINAL); + + std::set visibleSpots; // list of dest spots intersecting the preview's crop + int i = 0; + + for (auto entry : params->spot.entries) { + std::shared_ptr srcSpotBox(new SpotBox(entry, SpotBox::Type::SOURCE)); + std::shared_ptr dstSpotBox(new SpotBox(entry, SpotBox::Type::TARGET)); + if ( !srcSpotBox->setIntersectionWith(fullImageBox) + || !dstSpotBox->setIntersectionWith(fullImageBox) + || !srcSpotBox->imageIntersects(*dstSpotBox, true)) + { + continue; + } + + // If spot intersect the preview image, add it to the visible spots + if (dstSpotBox->spotIntersects(cropBox)) { + visibleSpots.insert(i); + } + ++i; + + // Source area + PreviewProps spp(srcSpotBox->imgArea.x1, srcSpotBox->imgArea.y1, + srcSpotBox->getImageWidth(), srcSpotBox->getImageHeight(), pp.getSkip()); + int w = 0; + int h = 0; + imgsrc->getSize(spp, w, h); + *srcSpotBox /= pp.getSkip(); + srcSpotBox->allocImage(); + Imagefloat *srcImage = srcSpotBox->getImage(); + for (int y = 0; y < (int)srcImage->getHeight(); ++y) { + for (int x = 0; x < (int)srcImage->getWidth(); ++x) { + srcImage->r(y, x) = 60000.f; + srcImage->g(y, x) = 500.f; + srcImage->b(y, x) = 500.f; + } + } + + imgsrc->getImage(currWB, tr, srcSpotBox->getImage(), spp, params->toneCurve, params->raw, 0); + if (cmp) { + imgsrc->convertColorSpace(srcImage, *cmp, currWB); + } + assert(srcSpotBox->checkImageSize()); + + + // Destination area + spp.set(dstSpotBox->imgArea.x1, dstSpotBox->imgArea.y1, dstSpotBox->getImageWidth(), + dstSpotBox->getImageHeight(), pp.getSkip()); + *dstSpotBox /= pp.getSkip(); + dstSpotBox->allocImage(); + Imagefloat *dstImage = dstSpotBox->getImage(); + for (int y = 0; y < (int)dstImage->getHeight(); ++y) { + for (int x = 0; x < (int)dstImage->getWidth(); ++x) { + dstImage->r(y, x) = 500.f; + dstImage->g(y, x) = 500.f; + dstImage->b(y, x) = 60000.f; + } + } + imgsrc->getImage(currWB, tr, dstSpotBox->getImage(), spp, params->toneCurve, params->raw, 0); + if (cmp) { + imgsrc->convertColorSpace(dstImage, *cmp, currWB); + } + assert(dstSpotBox->checkImageSize()); + + // Update the intersectionArea between src and dest + if (srcSpotBox->mutuallyClipImageArea(*dstSpotBox)) { + srcSpotBoxs.push_back(srcSpotBox); + dstSpotBoxs.push_back(dstSpotBox); + } + + } + + // Construct list of upstream dependencies + + std::unordered_set requiredSpotsSet = calcSpotDependencies(visibleSpots, srcSpotBoxs, dstSpotBoxs); + std::vector requiredSpots(requiredSpotsSet.size()); + std::copy(requiredSpotsSet.begin(), requiredSpotsSet.end(), requiredSpots.begin()); + std::sort(requiredSpots.begin(), requiredSpots.end()); + + // Process spots and copy them downstream + + for (auto i = requiredSpots.begin(); i != requiredSpots.end(); i++) { + // Process + srcSpotBoxs.at(*i)->processIntersectionWith(*dstSpotBoxs.at(*i)); + + // Propagate + std::set positiveSpots; // For DEBUG purpose only ! + auto j = i; + ++j; + while (j != requiredSpots.end()) { + bool intersectionFound = false; + int i_ = *i; + int j_ = *j; + intersectionFound |= dstSpotBoxs.at(i_)->copyImgTo(*srcSpotBoxs.at(j_)); + intersectionFound |= dstSpotBoxs.at(i_)->copyImgTo(*dstSpotBoxs.at(j_)); + if (intersectionFound) { + positiveSpots.insert(j_); + } + ++j; + } + } + + // Copy the dest spot to the preview image + cropBox /= pp.getSkip(); + cropBox.tuneImageSize(); + cropBox.intersectionArea = cropBox.imgArea; + + int f = 0; + for (auto i : visibleSpots) { + f += dstSpotBoxs.at(i)->copyImgTo(cropBox) ? 1 : 0; + } +} + +} + +namespace +{ + +void addSpotDependencies(int spotNum, std::unordered_set &dependencies, const Boxes &srcSpots, const Boxes &dstSpots) +{ + dependencies.insert(spotNum); + + // Our spot can depend on previous spots. + for (int i = spotNum - 1; i >= 0; --i) { + if (dependencies.find(i) != dependencies.end()) { + continue; // Spot already has its dependencies added. + } + + // Check if our spot depends on this previous spot. + if (srcSpots.at(spotNum)->imageIntersects(*dstSpots.at(i))) { + // If so, add it and its dependencies. + addSpotDependencies(i, dependencies, srcSpots, dstSpots); + } + } +} + +std::unordered_set calcSpotDependencies(const std::set &visibleSpots, const Boxes &srcSpots, const Boxes &dstSpots) +{ + std::unordered_set dependencies; + std::vector visibleSpotsOrdered(visibleSpots.size()); + + std::copy(visibleSpots.begin(), visibleSpots.end(), visibleSpotsOrdered.begin()); + std::sort(visibleSpotsOrdered.begin(), visibleSpotsOrdered.end()); + + // Add dependencies, starting with the last spot. + for (auto i = visibleSpotsOrdered.crbegin(); i != visibleSpotsOrdered.crend(); ++i) { + if (dependencies.find(*i) != dependencies.end()) { + continue; // Spot already has its dependencies added. + } + addSpotDependencies(*i, dependencies, srcSpots, dstSpots); + } + + return dependencies; +} + +} + diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 1cb11e94d..411b1de32 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -32,6 +32,8 @@ namespace rtengine { +using namespace procparams; +ProcParams* params; template void freeArray (T** a, int H) { @@ -53,7 +55,6 @@ template T** allocArray (int W, int H) return t; } -#define HR_SCALE 2 StdImageSource::StdImageSource () : ImageSource(), img(nullptr), plistener(nullptr), full(false), max{}, rgbSourceModified(false) { @@ -186,13 +187,13 @@ int StdImageSource::load (const Glib::ustring &fname) plistener->setProgress (1.0); } - wb = ColorTemp (1.0, 1.0, 1.0, 1.0); + wb = ColorTemp (1.0, 1.0, 1.0, 1.0, ColorTemp::DEFAULT_OBSERVER); //this is probably a mistake if embedded profile is not D65 return 0; } -void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) +void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw, int opposed) { // the code will use OpenMP as of now. @@ -310,6 +311,27 @@ void StdImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) } } +void StdImageSource::WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const ColorManagementParams &cmp, const RAWParams &raw, const ToneCurveParams &hrp) +{ +} + +void StdImageSource::getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const WBParams & wbpar, const ColorManagementParams &cmp, const RAWParams &raw, const ToneCurveParams &hrp) +{ + if (redAWBMul != -1.) { + rm = redAWBMul; + gm = greenAWBMul; + bm = blueAWBMul; + return; + } + + img->getAutoWBMultipliersitc(tempref, greenref, tempitc, greenitc,studgood, begx, begy, yEn, xEn, cx, cy, bf_h, bf_w, rm, gm, bm, params->wb, params->icm, params->raw, params->toneCurve); + + redAWBMul = rm; + greenAWBMul = gm; + blueAWBMul = bm; +} + + void StdImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) { if (redAWBMul != -1.) { @@ -326,7 +348,7 @@ void StdImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) blueAWBMul = bm; } -ColorTemp StdImageSource::getSpotWB (std::vector &red, std::vector &green, std::vector& blue, int tran, double equal) +ColorTemp StdImageSource::getSpotWB (std::vector &red, std::vector &green, std::vector& blue, int tran, double equal, StandardObserver observer) { int rn, gn, bn; double reds, greens, blues; @@ -338,13 +360,27 @@ ColorTemp StdImageSource::getSpotWB (std::vector &red, std::vectorallocate(0, 0); }; +void StdImageSource::wbMul2Camera(double &rm, double &gm, double &bm) +{ + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; +} + + +void StdImageSource::wbCamera2Mul(double &rm, double &gm, double &bm) +{ + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; +} } diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index b95328c80..33a5a3667 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -20,6 +20,7 @@ #include "colortemp.h" #include "imagesource.h" +#include "procparams.h" namespace rtengine { @@ -56,13 +57,17 @@ public: ~StdImageSource () override; int load (const Glib::ustring &fname) override; - void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; + void getWBMults (const ColorTemp &ctemp, const procparams::RAWParams &raw, std::array& scale_mul, float &autoGainComp, float &rm, float &gm, float &bm) const override {}; + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw, int opposed) override; + void getrgbloc (int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, const procparams::WBParams & wbpar) override {}; ColorTemp getWB () const override { return wb; } 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; + ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal, StandardObserver observer) override; + void WBauto(double &tempref, double &greenref, array2D &redloc, array2D &greenloc, array2D &blueloc, int bfw, int bfh, double &avg_rm, double &avg_gm, double &avg_bm, double &tempitc, double &greenitc, float &studgood, bool &twotimes, const procparams::WBParams & wbpar, int begx, int begy, int yEn, int xEn, int cx, int cy, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override; + void getAutoWBMultipliersitc(double &tempref, double &greenref, double &tempitc, double &greenitc, float &studgood, int begx, int begy, int yEn, int xEn, int cx, int cy, int bf_h, int bf_w, double &rm, double &gm, double &bm, const procparams::WBParams & wbpar, const procparams::ColorManagementParams &cmp, const procparams::RAWParams &raw, const procparams::ToneCurveParams &hrp) override; eSensorType getSensorType() const override {return ST_NONE;} bool isMono() const override {return false;} @@ -95,6 +100,11 @@ public: return false; } + bool isGainMapSupported() const override + { + return false; + } + void setProgressListener (ProgressListener* pl) override { plistener = pl; @@ -113,8 +123,10 @@ public: void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} + void wbMul2Camera(double &rm, double &gm, double &bm) override; + void wbCamera2Mul(double &rm, double &gm, double &bm) override; - void flushRGB () override; + void flush () override; void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) override {}; }; diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index feba5c95f..f49fe9c53 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -97,60 +97,62 @@ class Array2Df: public array2D typedef array2D Super; public: Array2Df(): Super() {} - Array2Df (int w, int h): Super (w, h) {} + Array2Df(int w, int h): Super(w, h) {} + Array2Df(int w, int h, float **data): + Super(w, h, data, ARRAY2D_BYREFERENCE) {} - float &operator() (int w, int h) + float &operator()(int w, int h) { return (*this)[h][w]; } - const float &operator() (int w, int h) const + const float &operator()(int w, int h) const { return (*this)[h][w]; } - float &operator() (int i) + float &operator()(int i) { - return static_cast (*this)[i]; + return static_cast(*this)[i]; } - const float &operator() (int i) const + const float &operator()(int i) const { - return const_cast (*this).operator() (i); + return const_cast(*this).operator()(i); } int getRows() const { - return const_cast (*this).height(); + return const_cast(*this).getHeight(); } int getCols() const { - return const_cast (*this).width(); + return const_cast(*this).getWidth(); } float *data() { - return static_cast (*this); + return static_cast(*this); } const float *data() const { - return const_cast (*this).data(); + return const_cast(*this).data(); } }; // upper bound on image dimension used in tmo_fattal02 -- see the comment there const int RT_dimension_cap = 1920; -void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread); +void rescale_bilinear(const Array2Df &src, Array2Df &dst, bool multithread); /****************************************************************************** * Luminance HDR code (modifications are marked with an RT comment) ******************************************************************************/ -void downSample (const Array2Df& A, Array2Df& B) +void downSample(const Array2Df& A, Array2Df& B) { const int width = B.getCols(); const int height = B.getRows(); @@ -160,18 +162,18 @@ void downSample (const Array2Df& A, Array2Df& B) // speed improvements. The main issue is the pde solver and in case of the // fft solver uses optimised threaded fftw routines. //#pragma omp parallel for - for ( int y = 0 ; y < height ; y++ ) { - for ( int x = 0 ; x < width ; x++ ) { - float p = A (2 * x, 2 * y); - p += A (2 * x + 1, 2 * y); - p += A (2 * x, 2 * y + 1); - p += A (2 * x + 1, 2 * y + 1); - B (x, y) = p * 0.25f; // p / 4.0f; + for (int y = 0 ; y < height ; y++) { + for (int x = 0 ; x < width ; x++) { + float p = A(2 * x, 2 * y); + p += A(2 * x + 1, 2 * y); + p += A(2 * x, 2 * y + 1); + p += A(2 * x + 1, 2 * y + 1); + B(x, y) = p * 0.25f; // p / 4.0f; } } } -void gaussianBlur (const Array2Df& I, Array2Df& L, bool multithread) +void gaussianBlur(const Array2Df& I, Array2Df& L, bool multithread) { const int width = I.getCols(); const int height = I.getRows(); @@ -179,30 +181,30 @@ void gaussianBlur (const Array2Df& I, Array2Df& L, bool multithread) if (width < 3 || height < 3) { if (&I != &L) { for (int i = 0, n = width * height; i < n; ++i) { - L (i) = I (i); + L(i) = I(i); } } return; } - Array2Df T (width, height); + 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++ ) { - float t = 2.f * I (x, y); - t += I (x - 1, y); - t += I (x + 1, y); - T (x, y) = t * 0.25f; // t / 4.f; + for (int y = 0 ; y < height ; y++) { + for (int x = 1 ; x < width - 1 ; x++) { + float t = 2.f * I(x, y); + t += I(x - 1, y); + t += I(x + 1, y); + T(x, y) = t * 0.25f; // t / 4.f; } - T (0, y) = ( 3.f * I (0, y) + I (1, y) ) * 0.25f; // / 4.f; - T (width - 1, y) = ( 3.f * I (width - 1, y) + I (width - 2, y) ) * 0.25f; // / 4.f; + T(0, y) = (3.f * I(0, y) + I(1, y)) * 0.25f; // / 4.f; + T(width - 1, y) = (3.f * I(width - 1, y) + I(width - 2, y)) * 0.25f; // / 4.f; } //--- Y blur @@ -210,66 +212,66 @@ void gaussianBlur (const Array2Df& I, Array2Df& L, bool multithread) #pragma omp parallel for if(multithread) #endif - for ( int x = 0 ; x < width - 7 ; x += 8 ) { - for ( int y = 1 ; y < height - 1 ; y++ ) { + for (int x = 0 ; x < width - 7 ; x += 8) { + for (int y = 1 ; y < height - 1 ; y++) { for (int xx = 0; xx < 8; ++xx) { - float t = 2.f * T (x + xx, y); - t += T (x + xx, y - 1); - t += T (x + xx, y + 1); - L (x + xx, y) = t * 0.25f; // t/4.0f; + float t = 2.f * T(x + xx, y); + t += T(x + xx, y - 1); + t += T(x + xx, y + 1); + L(x + xx, y) = t * 0.25f; // t/4.0f; } } for (int xx = 0; xx < 8; ++xx) { - L (x + xx, 0) = ( 3.f * T (x + xx, 0) + T (x + xx, 1) ) * 0.25f; // / 4.0f; - L (x + xx, height - 1) = ( 3.f * T (x + xx, height - 1) + T (x + xx, height - 2) ) * 0.25f; // / 4.0f; + L(x + xx, 0) = (3.f * T(x + xx, 0) + T(x + xx, 1)) * 0.25f; // / 4.0f; + L(x + xx, height - 1) = (3.f * T(x + xx, height - 1) + T(x + xx, height - 2)) * 0.25f; // / 4.0f; } } - for ( int x = width - (width % 8) ; x < width ; x++ ) { - for ( int y = 1 ; y < height - 1 ; y++ ) { - float t = 2.f * T (x, y); - t += T (x, y - 1); - t += T (x, y + 1); - L (x, y) = t * 0.25f; // t/4.0f; + for (int x = width - (width % 8) ; x < width ; x++) { + for (int y = 1 ; y < height - 1 ; y++) { + float t = 2.f * T(x, y); + t += T(x, y - 1); + t += T(x, y + 1); + L(x, y) = t * 0.25f; // t/4.0f; } - L (x, 0) = ( 3.f * T (x, 0) + T (x, 1) ) * 0.25f; // / 4.0f; - L (x, height - 1) = ( 3.f * T (x, height - 1) + T (x, height - 2) ) * 0.25f; // / 4.0f; + L(x, 0) = (3.f * T(x, 0) + T(x, 1)) * 0.25f; // / 4.0f; + L(x, height - 1) = (3.f * T(x, height - 1) + T(x, height - 2)) * 0.25f; // / 4.0f; } } -void createGaussianPyramids (Array2Df** pyramids, int nlevels, bool multithread) +void createGaussianPyramids(Array2Df** pyramids, int nlevels, bool multithread) { // pyramids[0] is already set int width = pyramids[0]->getCols(); int height = pyramids[0]->getRows(); - Array2Df* L = new Array2Df (width, height); - gaussianBlur ( *pyramids[0], *L, multithread ); + Array2Df* L = new Array2Df(width, height); + gaussianBlur(*pyramids[0], *L, multithread); - for ( int k = 1 ; k < nlevels ; k++ ) { + for (int k = 1 ; k < nlevels ; k++) { if (width > 2 && height > 2) { width /= 2; height /= 2; - pyramids[k] = new Array2Df (width, height); - downSample (*L, *pyramids[k]); + pyramids[k] = new Array2Df(width, height); + downSample(*L, *pyramids[k]); } else { // RT - now nlevels is fixed in tmo_fattal02 (see the comment in // there), so it might happen that we have to add some padding to // the gaussian pyramids - pyramids[k] = new Array2Df (width, height); + pyramids[k] = new Array2Df(width, height); for (int j = 0, n = width * height; j < n; ++j) { - (*pyramids[k]) (j) = (*L) (j); + (*pyramids[k])(j) = (*L)(j); } } if (k < nlevels - 1) { delete L; - L = new Array2Df (width, height); - gaussianBlur ( *pyramids[k], *L, multithread ); + L = new Array2Df(width, height); + gaussianBlur(*pyramids[k], *L, multithread); } } @@ -278,37 +280,37 @@ void createGaussianPyramids (Array2Df** pyramids, int nlevels, bool multithread) //-------------------------------------------------------------------- -float calculateGradients (Array2Df* H, Array2Df* G, int k, bool multithread) +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 ); + const float divider = pow(2.0f, k + 1); 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++ ) { + for (int y = 0 ; y < height ; y++) { int n = (y == 0 ? 0 : y - 1); int s = (y + 1 == height ? y : y + 1); - for ( int x = 0 ; x < width ; x++ ) { + for (int x = 0 ; x < width ; x++) { float gx, gy; int w, e; w = (x == 0 ? 0 : x - 1); e = (x + 1 == width ? x : x + 1); - gx = ((*H) (w, y) - (*H) (e, y)); + gx = ((*H)(w, y) - (*H)(e, y)); - gy = ((*H) (x, s) - (*H) (x, n)); + gy = ((*H)(x, s) - (*H)(x, n)); // note this implicitly assumes that H(-1)=H(0) // for the fft-pde slover this would need adjustment as H(-1)=H(1) // is assumed, which means gx=0.0, gy=0.0 at the boundaries // however, the impact is not visible so we ignore this here - (*G) (x, y) = sqrt (gx * gx + gy * gy) / divider; - avgGrad += (*G) (x, y); + (*G)(x, y) = sqrt(gx * gx + gy * gy) / divider; + avgGrad += static_cast((*G) (x, y)); } } @@ -317,7 +319,7 @@ float calculateGradients (Array2Df* H, Array2Df* G, int k, bool multithread) //-------------------------------------------------------------------- -void upSample (const Array2Df& A, Array2Df& B) +void upSample(const Array2Df& A, Array2Df& B) { const int width = B.getCols(); const int height = B.getRows(); @@ -325,14 +327,14 @@ void upSample (const Array2Df& A, Array2Df& B) const int aheight = A.getRows(); //#pragma omp parallel for shared(A, B) - for ( int y = 0 ; y < height ; y++ ) { - for ( int x = 0 ; x < width ; x++ ) { - int ax = static_cast (x * 0.5f); //x / 2.f; - int ay = static_cast (y * 0.5f); //y / 2.f; + for (int y = 0 ; y < height ; y++) { + for (int x = 0 ; x < width ; x++) { + int ax = static_cast(x * 0.5f); //x / 2.f; + int ay = static_cast(y * 0.5f); //y / 2.f; ax = (ax < awidth) ? ax : awidth - 1; ay = (ay < aheight) ? ay : aheight - 1; - B (x, y) = A (ax, ay); + B(x, y) = A(ax, ay); } } @@ -352,24 +354,25 @@ void upSample (const Array2Df& A, Array2Df& B) } -void calculateFiMatrix (Array2Df* FI, Array2Df* gradients[], - float avgGrad[], int nlevels, int detail_level, - float alfa, float beta, float noise, bool multithread) +void calculateFiMatrix(Array2Df* FI, Array2Df* gradients[], + float avgGrad[], int nlevels, int detail_level, + float alfa, float beta, float noise, bool multithread) { int width = gradients[nlevels - 1]->getCols(); int height = gradients[nlevels - 1]->getRows(); Array2Df** fi = new Array2Df*[nlevels]; - fi[nlevels - 1] = new Array2Df (width, height); + 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; + + for (int k = 0 ; k < width * height ; k++) { + (*fi[nlevels - 1])(k) = 1.0f; } - for ( int k = nlevels - 1; k >= 0 ; k-- ) { + for (int k = nlevels - 1; k >= 0 ; k--) { width = gradients[k]->getCols(); height = gradients[k]->getRows(); @@ -379,50 +382,51 @@ void calculateFiMatrix (Array2Df* FI, Array2Df* gradients[], #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); - float a = alfa * avgGrad[k]; - float value = pow ((grad + noise) / a, beta - 1.0f); - (*fi[k]) (x, y) *= value; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + float grad = ((*gradients[k]) (x, y) < 1e-4f) ? 1e-4f : (*gradients[k]) (x, y); + float a = alfa * avgGrad[k]; + float value = pow((grad + noise) / a, beta - 1.0f); + + (*fi[k])(x, y) *= value; } } } // create next level - if ( k > 1 ) { + if (k > 1) { width = gradients[k - 1]->getCols(); height = gradients[k - 1]->getRows(); - fi[k - 1] = new Array2Df (width, height); + fi[k - 1] = new Array2Df(width, height); } else { fi[0] = FI; // highest level -> result } if (k > 0) { - upSample (*fi[k], *fi[k - 1]); // upsample to next level - gaussianBlur (*fi[k - 1], *fi[k - 1], multithread); + upSample(*fi[k], *fi[k - 1]); // upsample to next level + gaussianBlur(*fi[k - 1], *fi[k - 1], multithread); } } - for ( int k = 1 ; k < nlevels ; k++ ) { + for (int k = 1 ; k < nlevels ; k++) { delete fi[k]; } delete[] fi; } -void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread); +void solve_pde_fft(Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread, int algo); -void tmo_fattal02 (size_t width, - size_t height, - const Array2Df& Y, - Array2Df& L, - float alfa, - float beta, - float noise, - int detail_level, - bool multithread) +void tmo_fattal02(size_t width, + size_t height, + const Array2Df& Y, + Array2Df& L, + float alfa, + float beta, + float noise, + int detail_level, + bool multithread, int algo) { // #ifdef TIMER_PROFILING // msec_timer stop_watch; @@ -431,13 +435,14 @@ void tmo_fattal02 (size_t width, // static const float black_point = 0.1f; // static const float white_point = 0.5f; static const float gamma = 1.0f; // 0.8f; +//paramet // static const int detail_level = 3; - if ( detail_level < 0 ) { + if (detail_level < 0) { detail_level = 0; } - if ( detail_level > 3 ) { + if (detail_level > 3) { detail_level = 3; } @@ -462,21 +467,26 @@ void tmo_fattal02 (size_t width, int size = width * height; - +//paramet // find max value, normalize to range 0..100 and take logarithm // float minLum = Y (0, 0); - float maxLum = 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)); + for (int i = 0 ; i < size ; i++) { + maxLum = std::max(maxLum, Y(i)); } - Array2Df* H = new Array2Df (width, height); + Array2Df* H = new Array2Df(width, height); float temp = 100.f / maxLum; + + if (algo == 1) { + temp = 1.f; + } + #ifdef _OPENMP #pragma omp parallel if(multithread) #endif @@ -495,13 +505,13 @@ void tmo_fattal02 (size_t width, #ifdef __SSE2__ for (; j < width - 3; j += 4) { - STVFU ((*H)[i][j], xlogf (tempv * LVFU (Y[i][j]) + epsv)); + STVFU((*H)[i][j], xlogf(tempv * LVFU(Y[i][j]) + epsv)); } #endif for (; j < width; ++j) { - (*H)[i][j] = xlogf (temp * Y[i][j] + eps); + (*H)[i][j] = xlogf(temp * Y[i][j] + eps); } } } @@ -528,13 +538,13 @@ void tmo_fattal02 (size_t width, * improved */ int fullwidth = width; int fullheight = height; - int dim = std::max (width, height); + int dim = std::max(width, height); Array2Df *fullH = nullptr; if (dim > RT_dimension_cap) { float s = float (RT_dimension_cap) / float (dim); - Array2Df *HH = new Array2Df (width * s, height * s); - rescale_bilinear (*H, *HH, multithread); + Array2Df *HH = new Array2Df(width * s, height * s); + rescale_bilinear(*H, *HH, multithread); fullH = H; H = HH; width = H->getCols(); @@ -547,25 +557,27 @@ void tmo_fattal02 (size_t width, Array2Df* pyramids[nlevels]; pyramids[0] = H; - createGaussianPyramids (pyramids, nlevels, multithread); + createGaussianPyramids(pyramids, nlevels, multithread); // calculate gradients and its average values on pyramid levels Array2Df* gradients[nlevels]; float avgGrad[nlevels]; - for ( int k = 0 ; k < nlevels ; k++ ) { - gradients[k] = new Array2Df (pyramids[k]->getCols(), pyramids[k]->getRows()); - avgGrad[k] = calculateGradients (pyramids[k], gradients[k], k, multithread); - if(k != 0) // pyramids[0] is H. Will be deleted later + for (int k = 0 ; k < nlevels ; k++) { + gradients[k] = new Array2Df(pyramids[k]->getCols(), pyramids[k]->getRows()); + avgGrad[k] = calculateGradients(pyramids[k], gradients[k], k, multithread); + + if (k != 0) { // pyramids[0] is H. Will be deleted later delete pyramids[k]; + } } // calculate fi matrix - Array2Df* FI = new Array2Df (width, height); - calculateFiMatrix (FI, gradients, avgGrad, nlevels, detail_level, alfa, beta, noise, multithread); + Array2Df* FI = new Array2Df(width, height); + calculateFiMatrix(FI, gradients, avgGrad, nlevels, detail_level, alfa, beta, noise, multithread); - for ( int i = 0 ; i < nlevels ; i++ ) { + for (int i = 0 ; i < nlevels ; i++) { delete gradients[i]; } @@ -573,8 +585,8 @@ void tmo_fattal02 (size_t width, if (fullH) { delete H; H = fullH; - Array2Df *FI2 = new Array2Df (fullwidth, fullheight); - rescale_bilinear (*FI, *FI2, multithread); + Array2Df *FI2 = new Array2Df(fullwidth, fullheight); + rescale_bilinear(*FI, *FI2, multithread); delete FI; FI = FI2; width = fullwidth; @@ -584,7 +596,7 @@ void tmo_fattal02 (size_t width, /** RT */ // attenuate gradients - Array2Df* Gx = new Array2Df (width, height); + Array2Df* Gx = new Array2Df(width, height); Array2Df* Gy = &L; // use L as buffer for Gy // the fft solver solves the Poisson pde but with slightly different @@ -595,16 +607,16 @@ void tmo_fattal02 (size_t width, #pragma omp parallel for if(multithread) #endif - for ( size_t y = 0 ; y < height ; y++ ) { + for (size_t y = 0 ; y < height ; y++) { // sets index+1 based on the boundary assumption H(N+1)=H(N-1) unsigned int yp1 = (y + 1 >= height ? height - 2 : y + 1); - for ( size_t x = 0 ; x < width ; x++ ) { + for (size_t x = 0 ; x < width ; x++) { // sets index+1 based on the boundary assumption H(N+1)=H(N-1) unsigned int xp1 = (x + 1 >= width ? width - 2 : x + 1); // forward differences in H, so need to use between-points approx of FI - (*Gx) (x, y) = ((*H) (xp1, y) - (*H) (x, y)) * 0.5 * ((*FI) (xp1, y) + (*FI) (x, y)); - (*Gy) (x, y) = ((*H) (x, yp1) - (*H) (x, y)) * 0.5 * ((*FI) (x, yp1) + (*FI) (x, y)); + (*Gx) (x, y) = ((*H) (xp1, y) - (*H) (x, y)) * 0.5f * ((*FI) (xp1, y) + (*FI) (x, y)); + (*Gy) (x, y) = ((*H) (x, yp1) - (*H) (x, y)) * 0.5f * ((*FI) (x, yp1) + (*FI) (x, y)); } } @@ -615,24 +627,24 @@ void tmo_fattal02 (size_t width, #pragma omp parallel for if(multithread) #endif - for ( size_t y = 0; y < height; ++y ) { - for ( size_t x = 0; x < width; ++x ) { - (*FI) (x, y) = (*Gx) (x, y) + (*Gy) (x, y); + for (size_t y = 0; y < height; ++y) { + for (size_t x = 0; x < width; ++x) { + (*FI)(x, y) = (*Gx)(x, y) + (*Gy)(x, y); - if ( x > 0 ) { - (*FI) (x, y) -= (*Gx) (x - 1, y); + if (x > 0) { + (*FI)(x, y) -= (*Gx)(x - 1, y); } - if ( y > 0 ) { - (*FI) (x, y) -= (*Gy) (x, y - 1); + if (y > 0) { + (*FI)(x, y) -= (*Gy)(x, y - 1); } if (x == 0) { - (*FI) (x, y) += (*Gx) (x, y); + (*FI)(x, y) += (*Gx)(x, y); } if (y == 0) { - (*FI) (x, y) += (*Gy) (x, y); + (*FI)(x, y) += (*Gy)(x, y); } } @@ -642,8 +654,8 @@ void tmo_fattal02 (size_t width, // solve pde and exponentiate (ie recover compressed image) { - MyMutex::MyLock lock (*fftwMutex); - solve_pde_fft (FI, &L, Gx, multithread); + MyMutex::MyLock lock(*fftwMutex); + solve_pde_fft(FI, &L, Gx, multithread, algo); } delete Gx; delete FI; @@ -653,7 +665,7 @@ void tmo_fattal02 (size_t width, #endif { #ifdef __SSE2__ - vfloat gammav = F2V (gamma); + vfloat gammav = F2V(gamma); #endif #ifdef _OPENMP #pragma omp for schedule(dynamic,16) @@ -664,13 +676,13 @@ void tmo_fattal02 (size_t width, #ifdef __SSE2__ for (; j < width - 3; j += 4) { - STVFU (L[i][j], xexpf (gammav * LVFU (L[i][j]))); + STVFU(L[i][j], xexpf(gammav * LVFU(L[i][j]))); } #endif for (; j < width; j++) { - L[i][j] = xexpf ( gamma * L[i][j]); + L[i][j] = xexpf(gamma * L[i][j]); } } } @@ -724,11 +736,11 @@ void tmo_fattal02 (size_t width, // returns T = EVy A EVx^tr // note, modifies input data -void transform_ev2normal (Array2Df *A, Array2Df *T, bool multithread) +void transform_ev2normal(Array2Df *A, Array2Df *T, bool multithread) { int width = A->getCols(); int height = A->getRows(); - assert ((int)T->getCols() == width && (int)T->getRows() == height); + assert((int)T->getCols() == width && (int)T->getRows() == height); // the discrete cosine transform is not exactly the transform needed // need to scale input values to get the right transformation @@ -736,19 +748,19 @@ void transform_ev2normal (Array2Df *A, Array2Df *T, bool multithread) #pragma omp parallel for if(multithread) #endif - for (int y = 1 ; y < height - 1 ; y++ ) - for (int x = 1 ; x < width - 1 ; x++ ) { - (*A) (x, y) *= 0.25f; + for (int y = 1 ; y < height - 1 ; y++) + for (int x = 1 ; x < width - 1 ; x++) { + (*A)(x, y) *= 0.25f; } - for (int x = 1 ; x < width - 1 ; x++ ) { - (*A) (x, 0) *= 0.5f; - (*A) (x, height - 1) *= 0.5f; + for (int x = 1 ; x < width - 1 ; x++) { + (*A)(x, 0) *= 0.5f; + (*A)(x, height - 1) *= 0.5f; } - for (int y = 1 ; y < height - 1 ; y++ ) { - (*A) (0, y) *= 0.5; - (*A) (width - 1, y) *= 0.5f; + for (int y = 1 ; y < height - 1 ; y++) { + (*A) (0, y) *= 0.5f; + (*A)(width - 1, y) *= 0.5f; } // note, fftw provides its own memory allocation routines which @@ -762,26 +774,26 @@ void transform_ev2normal (Array2Df *A, Array2Df *T, bool multithread) // executes 2d discrete cosine transform fftwf_plan p; - p = fftwf_plan_r2r_2d (height, width, A->data(), T->data(), - FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE); - fftwf_execute (p); - fftwf_destroy_plan (p); + p = fftwf_plan_r2r_2d(height, width, A->data(), T->data(), + FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE); + fftwf_execute(p); + fftwf_destroy_plan(p); } // returns T = EVy^-1 * A * (EVx^-1)^tr -void transform_normal2ev (Array2Df *A, Array2Df *T, bool multithread) +void transform_normal2ev(Array2Df *A, Array2Df *T, bool multithread) { int width = A->getCols(); int height = A->getRows(); - assert ((int)T->getCols() == width && (int)T->getRows() == height); + assert((int)T->getCols() == width && (int)T->getRows() == height); // executes 2d discrete cosine transform fftwf_plan p; - p = fftwf_plan_r2r_2d (height, width, A->data(), T->data(), - FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE); - fftwf_execute (p); - fftwf_destroy_plan (p); + p = fftwf_plan_r2r_2d(height, width, A->data(), T->data(), + FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE); + fftwf_execute(p); + fftwf_destroy_plan(p); // need to scale the output matrix to get the right transform float factor = (1.0f / ((height - 1) * (width - 1))); @@ -789,30 +801,30 @@ void transform_normal2ev (Array2Df *A, Array2Df *T, bool multithread) #pragma omp parallel for if(multithread) #endif - for (int y = 0 ; y < height ; y++ ) - for (int x = 0 ; x < width ; x++ ) { - (*T) (x, y) *= factor; + for (int y = 0 ; y < height ; y++) + for (int x = 0 ; x < width ; x++) { + (*T)(x, y) *= factor; } - for (int x = 0 ; x < width ; x++ ) { - (*T) (x, 0) *= 0.5f; - (*T) (x, height - 1) *= 0.5f; + for (int x = 0 ; x < width ; x++) { + (*T)(x, 0) *= 0.5f; + (*T)(x, height - 1) *= 0.5f; } - for (int y = 0 ; y < height ; y++ ) { - (*T) (0, y) *= 0.5f; - (*T) (width - 1, y) *= 0.5f; + for (int y = 0 ; y < height ; y++) { + (*T)(0, y) *= 0.5f; + (*T)(width - 1, y) *= 0.5f; } } // returns the eigenvalues of the 1d laplace operator -std::vector get_lambda (int n) +std::vector get_lambda(int n) { - assert (n > 1); - std::vector v (n); + assert(n > 1); + std::vector v(n); for (int i = 0; i < n; i++) { - v[i] = -4.0 * SQR (sin ((double)i / (2 * (n - 1)) * RT_PI)); + v[i] = -4.0 * SQR(sin((double)i / (2 * (n - 1)) * RT_PI)); } return v; @@ -862,22 +874,22 @@ std::vector get_lambda (int n) // not modified and the equation might not have a solution but an // approximate solution with a minimum error is then calculated // double precision version -void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/*, pfs::Progress &ph, +void solve_pde_fft(Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread, int algo)/*, pfs::Progress &ph, bool adjust_bound)*/ { // ph.setValue(20); //DEBUG_STR << "solve_pde_fft: solving Laplace U = F ..." << std::endl; int width = F->getCols(); int height = F->getRows(); - assert ((int)U->getCols() == width && (int)U->getRows() == height); - assert (buf->getCols() == width && buf->getRows() == height); + assert((int)U->getCols() == width && (int)U->getRows() == height); + assert(buf->getCols() == width && buf->getRows() == height); // activate parallel execution of fft routines #ifdef RT_FFTW3F_OMP if (multithread) { fftwf_init_threads(); - fftwf_plan_with_nthreads ( omp_get_max_threads() ); + fftwf_plan_with_nthreads(omp_get_max_threads()); } // #else @@ -897,29 +909,29 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/* // transforms F into eigenvector space: Ftr = //DEBUG_STR << "solve_pde_fft: transform F to ev space (fft)" << std::endl; Array2Df* F_tr = buf; - transform_normal2ev (F, F_tr, multithread); + transform_normal2ev(F, F_tr, multithread); // TODO: F no longer needed so could release memory, but as it is an // input parameter we won't do that // in the eigenvector space the solution is very simple - std::vector l1 = get_lambda (height); - std::vector l2 = get_lambda (width); + 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++ ) { - (*F_tr) (x, y) = (*F_tr) (x, y) / (l1[y] + l2[x]); + for (int y = 0 ; y < height ; y++) { + for (int x = 0 ; x < width ; x++) { + (*F_tr) (x, y) = static_cast((*F_tr) (x, y)) / (l1[y] + l2[x]); } } - (*F_tr) (0, 0) = 0.f; // any value ok, only adds a const to the solution + (*F_tr)(0, 0) = 0.f; // any value ok, only adds a const to the solution // transforms F_tr back to the normal space - transform_ev2normal (F_tr, U, multithread); + transform_ev2normal(F_tr, U, multithread); // the solution U as calculated will satisfy something like int U = 0 // since for any constant c, U-c is also a solution and we are mainly @@ -927,21 +939,23 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/* // a solution which has no positive values: U_new(x,y)=U(x,y)-max // (not really needed but good for numerics as we later take exp(U)) //DEBUG_STR << "solve_pde_fft: removing constant from solution" << std::endl; - float maxVal = 0.f; + if (algo == 0) { + float maxVal = 0.f; #ifdef _OPENMP - #pragma omp parallel for reduction(max:maxVal) if(multithread) + #pragma omp parallel for reduction(max:maxVal) if(multithread) #endif - for (int i = 0; i < width * height; i++) { - maxVal = std::max(maxVal, (*U)(i)); - } + for (int i = 0; i < width * height; i++) { + maxVal = std::max(maxVal, (*U)(i)); + } #ifdef _OPENMP - #pragma omp parallel for if(multithread) + #pragma omp parallel for if(multithread) #endif - for (int i = 0; i < width * height; i++) { - (*U) (i) -= maxVal; + for (int i = 0; i < width * height; i++) { + (*U)(i) -= maxVal; + } } } @@ -975,27 +989,27 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/* * RT code from here on *****************************************************************************/ -inline void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread) +inline void rescale_bilinear(const Array2Df &src, Array2Df &dst, bool multithread) { rescaleBilinear(src, dst, multithread); } -inline void rescale_nearest (const Array2Df &src, Array2Df &dst, bool multithread) +inline void rescale_nearest(const Array2Df &src, Array2Df &dst, bool multithread) { rescaleNearest(src, dst, multithread); } -inline float luminance (float r, float g, float b, TMatrix ws) +inline float luminance(float r, float g, float b, TMatrix ws) { return Color::rgbLuminance(r, g, b, ws); } -inline int round_up_pow2 (int dim) +inline int round_up_pow2(int dim) { // from https://graphics.stanford.edu/~seander/bithacks.html - assert (dim > 0); + assert(dim > 0); unsigned int v = dim; v--; v |= v >> 1; @@ -1007,7 +1021,7 @@ inline int round_up_pow2 (int dim) return v; } -inline int find_fast_dim (int dim) +inline int find_fast_dim(int dim) { // as per the FFTW docs: // @@ -1019,7 +1033,7 @@ inline int find_fast_dim (int dim) // the above form. This is not exhaustive, but should be ok for pictures // up to 100MPix at least - int d1 = round_up_pow2 (dim); + int d1 = round_up_pow2(dim); std::vector d = { d1 / 128 * 65, d1 / 64 * 33, @@ -1041,72 +1055,93 @@ inline int find_fast_dim (int dim) } } - assert (false); + assert(false); return dim; } + + } // namespace -void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) +void ImProcFunctions::ToneMapFattal02(Imagefloat *rgb, const FattalToneMappingParams &fatParams, int detail_level, int Lalone, float **Lum, int WW, int HH, int algo) +//algo allows to use ART algorithme algo = 0 RT, algo = 1 ART +//Lalone allows to use L without RGB values in RT mode { - if (!params->fattal.enabled) { + if (!fatParams.enabled) { return; } - + BENCHFUN - const int detail_level = 3; +// const int detail_level = 3; float alpha = 1.f; - if (params->fattal.threshold < 0) { - alpha += (params->fattal.threshold * 0.9f) / 100.f; - } else if (params->fattal.threshold > 0) { - alpha += params->fattal.threshold / 100.f; + if (fatParams.threshold < 0) { + alpha += (fatParams.threshold * 0.9f) / 100.f; + } else if (fatParams.threshold > 0) { + alpha += fatParams.threshold / 100.f; } - float beta = 1.f - (params->fattal.amount * 0.3f) / 100.f; + float beta = 1.f - (fatParams.amount * 0.3f) / 100.f; // sanity check if (alpha <= 0 || beta <= 0) { return; } - int w = rgb->getWidth(); - int h = rgb->getHeight(); + int w; + int h; - Array2Df Yr (w, h); + if (Lalone != 0) { + w = WW; + h = HH; + } else { + w = rgb->getWidth(); + h = rgb->getHeight(); + } + + Array2Df Yr(w, h); constexpr float epsilon = 1e-4f; constexpr float luminance_noise_floor = 65.535f; constexpr float min_luminance = 1.f; - TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.workingProfile); - + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); #ifdef _OPENMP #pragma omp parallel for if(multiThread) #endif + for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { - Yr (x, y) = std::max (luminance (rgb->r (y, x), rgb->g (y, x), rgb->b (y, x), ws), min_luminance); // clip really black pixels + if (Lalone != 0) { + Yr(x, y) = std::max(2.f * Lum[y][x], min_luminance); // clip really black pixels + } else { + Yr(x, y) = std::max(luminance(rgb->r(y, x), rgb->g(y, x), rgb->b(y, x), ws), min_luminance); // clip really black pixels + } } } float oldMedian; - const float percentile = float(LIM(params->fattal.anchor, 1, 100)) / 100.f; - findMinMaxPercentile (Yr.data(), static_cast(Yr.getRows()) * Yr.getCols(), percentile, oldMedian, percentile, oldMedian, multiThread); + float percentile = 1.f; + + if (algo == 0) { + percentile = float(LIM(fatParams.anchor, 1, 100)) / 100.f; + findMinMaxPercentile(Yr.data(), static_cast(Yr.getRows()) * Yr.getCols(), percentile, oldMedian, percentile, oldMedian, multiThread); + } + // median filter on the deep shadows, to avoid boosting noise // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() - int w2 = find_fast_dim (w) + 1; - int h2 = find_fast_dim (h) + 1; - Array2Df L (w2, h2); + int w2 = find_fast_dim(w) + 1; + int h2 = find_fast_dim(h) + 1; + Array2Df L(w2, h2); { #ifdef _OPENMP int num_threads = multiThread ? omp_get_max_threads() : 1; #else int num_threads = 1; #endif - float r = float (std::max (w, h)) / float (RT_dimension_cap); + float r = float (std::max(w, h)) / float (RT_dimension_cap); Median med; if (r >= 3) { @@ -1119,7 +1154,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) med = Median::TYPE_3X3_STRONG; } - Median_Denoise (Yr, Yr, luminance_noise_floor, w, h, med, 1, num_threads, L); + Median_Denoise(Yr, Yr, luminance_noise_floor, w, h, med, 1, num_threads, L); } float noise = alpha * 0.01f; @@ -1129,19 +1164,71 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) << ", detail_level = " << detail_level << std::endl; } - rescale_nearest (Yr, L, multiThread); - tmo_fattal02 (w2, h2, L, L, alpha, beta, noise, detail_level, multiThread); + rescale_nearest(Yr, L, multiThread); + + tmo_fattal02(w2, h2, L, L, alpha, beta, noise, detail_level, multiThread, 0); const float hr = float(h2) / float(h); const float wr = float(w2) / float(w); - float newMedian; - findMinMaxPercentile (L.data(), static_cast(L.getRows()) * L.getCols(), percentile, newMedian, percentile, newMedian, multiThread); - const float scale = (oldMedian == 0.f || newMedian == 0.f) ? 65535.f : (oldMedian / newMedian); // avoid Nan + float offset = 0.f; + float scale = 65535.f; + + if (algo == 0) { + float newMedian; + findMinMaxPercentile(L.data(), static_cast(L.getRows()) * L.getCols(), percentile, newMedian, percentile, newMedian, multiThread); + scale = (oldMedian == 0.f || newMedian == 0.f) ? 65535.f : (oldMedian / newMedian); // avoid Nan + } else { + + { + float ratio = 0.f; + int ww, hh; + + if (w >= h) { + ratio = 200.f / w; + ww = 200; + hh = ratio * h; + } else { + ratio = 200.f / h; + hh = 200; + ww = ratio * w; + } + + Array2Df tmp(ww, hh); + int sz = ww * hh; + int idx = sz / 2; + int oidx = LIM(int(sz * 0.05f + 0.5f), 1, sz - 1); + rescale_nearest(Yr, tmp, multiThread); + std::sort(tmp.data(), tmp.data() + sz); + float oldMedian = tmp(idx); + float old_min = 0.f; + + for (int i = 0; i <= oidx; ++i) { + old_min += tmp(i); + } + + old_min /= oidx; + rescale_nearest(L, tmp, multiThread); + std::sort(tmp.data(), tmp.data() + sz); + float newMedian = tmp(idx); + scale = (oldMedian == 0.f || newMedian == 0.f) ? 65535.f : (oldMedian / newMedian); // avoid Nan + float new_min = 0.f; + + for (int i = 0; i <= oidx; ++i) { + new_min += tmp(i); + } + + new_min /= oidx; + offset = old_min - new_min; + } + + + } #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if(multiThread) #endif + for (int y = 0; y < h; y++) { int yy = y * hr + 1; @@ -1150,16 +1237,106 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) 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))); + if (Lalone == 0) { + float &r = rgb->r(y, x); + float &g = rgb->g(y, x); + float &b = rgb->b(y, x); + if(l > 1.f) { + r = max(r * l - offset, r); + g = max(g * l - offset, g); + b = max(b * l - offset, b); + } else { + r *= l; + g *= l; + b *= l; + } + assert(std::isfinite(rgb->r(y, x))); + assert(std::isfinite(rgb->g(y, x))); + assert(std::isfinite(rgb->b(y, x))); + } else { + if (Lalone == 1) { + Lum[y][x] *= (0.5f * l - offset); + } else if (Lalone == -1) { + Lum[y][x] *= (-0.5f * l + offset); + } + } } } + } +void buildGradientsMask(int W, int H, float **luminance, float **out, + float amount, int nlevels, int detail_level, + float alfa, float beta, bool multithread) +{ + Array2Df Y(W, H, luminance); + const float noise = alfa * 0.01f; + + Array2Df *pyramids[nlevels]; + pyramids[0] = &Y; + createGaussianPyramids(pyramids, nlevels, multithread); + + // calculate gradients and its average values on pyramid levels + Array2Df *gradients[nlevels]; + float avgGrad[nlevels]; + + for (int k = 0 ; k < nlevels ; k++) { + gradients[k] = new Array2Df(pyramids[k]->getCols(), pyramids[k]->getRows()); + avgGrad[k] = calculateGradients(pyramids[k], gradients[k], k, multithread); + + if (k != 0) { // pyramids[0] is Y + delete pyramids[k]; + } + } + + + // calculate fi matrix + Array2Df FI(W, H, out); + calculateFiMatrix(&FI, gradients, avgGrad, nlevels, detail_level, alfa, beta, noise, multithread); + + for (int i = 0 ; i < nlevels ; i++) { + delete gradients[i]; + } + + // rescale the mask + float m = out[0][0]; +#ifdef _OPENMP + # pragma omp parallel for reduction(max:m) if (multithread) +#endif + + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + float v = std::abs(out[y][x]); + out[y][x] = v; + m = std::max(v, m); + } + } + + if (m > 0.f) { + const float f = amount / m; +#ifdef _OPENMP + # pragma omp parallel for reduction(max:m) if (multithread) +#endif + + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + out[y][x] *= f; + } + } + } + + // { + // Imagefloat tmp(W, H); + // for (int y = 0; y < H; ++y) { + // for (int x = 0; x < W; ++x) { + // tmp.r(y, x) = tmp.g(y, x) = tmp.b(y, x) = out[y][x] * 65535.f; + // } + // } + // std::ostringstream name; + // name << "/tmp/FI-" << W << "x" << H << ".tif"; + // tmp.saveAsTIFF(name.str(), 16); + // } +} } // namespace rtengine diff --git a/rtengine/tweakoperator.h b/rtengine/tweakoperator.h new file mode 100644 index 000000000..5ad97e71b --- /dev/null +++ b/rtengine/tweakoperator.h @@ -0,0 +1,45 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 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 + +namespace rtengine +{ + +namespace procparams +{ + +class ProcParams; + +} + +/** This class can let objects alter the collected values of the ProcParams for a specific + * purpose, e.g. displaying a preview image at a specific point in the pipeline or with + * disabled tools. Before starting the rendering, the engine will call the TweakOperator + * (if set) to modify the ProcParams. The untweaked one will still exist as a backup, and + * can be sent back if necessary. */ +class TweakOperator +{ +public: + virtual ~TweakOperator() {} + + /** Callback that will alter the ProcParams before the image is computed. */ + virtual void tweakParams(procparams::ProcParams& pparams) = 0; +}; + +} diff --git a/rtengine/utils.cc b/rtengine/utils.cc index a07a1235f..0674c9806 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -22,7 +22,6 @@ #include "rt_math.h" #include "utils.h" -#include "rt_math.h" using namespace std; diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index ef456af3a..34cab71d1 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -63,6 +63,18 @@ namespace rtengine void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &red, array2D &green, array2D &blue) { + // Test for RGB cfa + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + if (FC(i, j) == 3) { + // avoid crash + std::cout << "vng4_demosaic supports only RGB Colour filter arrays. Falling back to igv_interpolate" << std::endl; + igv_interpolate(W, H); + return; + } + } + } + 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, diff --git a/rtengine/winutils.h b/rtengine/winutils.h new file mode 100644 index 000000000..757849dd1 --- /dev/null +++ b/rtengine/winutils.h @@ -0,0 +1,124 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Lawrence Lee + * + * 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 + +#ifdef WIN32 + +#include +#include + +#include "noncopyable.h" + + +/** + * Wrapper for pointers to memory allocated by HeapAlloc. + * + * Memory is automatically freed when the object goes out of scope. + */ +template +class WinHeapPtr : public rtengine::NonCopyable +{ +private: + const T ptr; + +public: + WinHeapPtr() = delete; + + /** Allocates the specified number of bytes in the process heap. */ + explicit WinHeapPtr(SIZE_T bytes): ptr(static_cast(HeapAlloc(GetProcessHeap(), 0, bytes))) {}; + + ~WinHeapPtr() + { + // HeapFree does a null check. + HeapFree(GetProcessHeap(), 0, static_cast(ptr)); + } + + T operator ->() const + { + return ptr; + } + + operator T() const + { + return ptr; + } +}; + +/** + * Wrapper for HLOCAL pointers to memory allocated by LocalAlloc. + * + * Memory is automatically freed when the object goes out of scope. + */ +template +class WinLocalPtr : public rtengine::NonCopyable +{ +private: + const T ptr; + +public: + WinLocalPtr() = delete; + + /** Wraps a raw pointer. */ + WinLocalPtr(T pointer): ptr(pointer) {}; + + ~WinLocalPtr() + { + // LocalFree does a null check. + LocalFree(static_cast(ptr)); + } + + T operator ->() const + { + return ptr; + } + + operator T() const + { + return ptr; + } +}; + +/** + * Wrapper for HANDLEs. + * + * Handles are automatically closed when the object goes out of scope. + */ +class WinHandle : public rtengine::NonCopyable +{ +private: + const HANDLE handle; + +public: + WinHandle() = delete; + + /** Wraps a HANDLE. */ + WinHandle(HANDLE handle): handle(handle) {}; + + ~WinHandle() + { + CloseHandle(handle); + } + + operator HANDLE() const + { + return handle; + } +}; + +#endif diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc index cb1315ed0..bcad4d7d3 100644 --- a/rtengine/xtrans_demosaic.cc +++ b/rtengine/xtrans_demosaic.cc @@ -31,7 +31,7 @@ namespace rtengine { -const double xyz_rgb[3][3] = { // XYZ from RGB +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 } @@ -45,7 +45,9 @@ void RawImageSource::cielab (const float (*rgb)[3], float* l, float* a, float *b if (!rgb) { static bool cbrtinit = false; if(!cbrtinit) { - #pragma omp parallel for +#ifdef _OPENMP + #pragma omp parallel for +#endif 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; @@ -1025,6 +1027,67 @@ void RawImageSource::fast_xtrans_interpolate (const array2D &rawData, arr plistener->setProgress (1.0); } } + +void RawImageSource::fast_xtrans_interpolate_blend (const float* const * blend, const array2D &rawData, array2D &red, array2D &green, array2D &blue) +{ + + if (plistener) { + plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_XTRANSFAST"))); + plistener->setProgress(0.0); + } + + 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 = 8; row < H - 8; ++row) { + for (int col = 8; col < W - 8; ++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] = intp(blend[row][col], red[row][col], rawData[row][col]); + green[row][col] = intp(blend[row][col], green[row][col], sum[1] * 0.5f); + blue[row][col] = intp(blend[row][col], blue[row][col], sum[2]); + break; + + case 1: // green pixel + green[row][col] = intp(blend[row][col], 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] = intp(blend[row][col], red[row][col], sum[0]); + blue[row][col] = intp(blend[row][col], 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] = intp(blend[row][col], red[row][col], sum[0] * 1.3333333f); + blue[row][col] = intp(blend[row][col], blue[row][col], sum[2] * 1.3333333f); + } + break; + + case 2: // blue pixel + red[row][col] = intp(blend[row][col], red[row][col], sum[0]); + green[row][col] = intp(blend[row][col], green[row][col], sum[1] * 0.5f); + blue[row][col] = intp(blend[row][col], blue[row][col], rawData[row][col]); + break; + } + } + } + + if (plistener) { + plistener->setProgress (1.0); + } +} #undef fcol #undef isgreen diff --git a/rtexif/CMakeLists.txt b/rtexif/CMakeLists.txt index 5a3831455..e7ba81439 100644 --- a/rtexif/CMakeLists.txt +++ b/rtexif/CMakeLists.txt @@ -14,16 +14,16 @@ add_library(rtexif STATIC add_dependencies(rtexif UpdateInfo) if(WIN32) - include_directories(${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS}) - link_directories(. "${PROJECT_SOURCE_DIR}/rtexif" ${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS}) + include_directories(${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS} ${TIFF_INCLUDE_DIRS}) + link_directories(. "${PROJECT_SOURCE_DIR}/rtexif" ${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS} ${TIFF_LIBRARY_DIRS}) else() set_target_properties(rtexif PROPERTIES COMPILE_FLAGS " -fPIC") - include_directories(${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS}) - link_directories(${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS}) + include_directories(${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS} ${TIFF_INCLUDE_DIRS}) + link_directories(${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS} ${TIFF_LIBRARY_DIRS}) endif() include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") if(BUILD_SHARED_LIBS) - install(TARGETS rtexif DESTINATION ${LIBDIR}) + install(TARGETS rtexif DESTINATION "${LIBDIR}") endif() diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 0e6f7eb2f..5300abe02 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -16,8 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _CANONATTRIBS_ -#define _CANONATTRIBS_ #include #include @@ -72,7 +70,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -101,7 +99,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.1fs %s", sec / 10., (sec & 0x4000) ? ",Custom" : ""); + snprintf(buffer, sizeof(buffer), "%.1fs %s", sec / 10., (sec & 0x4000) ? ",Custom" : ""); return buffer; } }; @@ -544,7 +542,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -557,7 +555,8 @@ public: { choices = { {1, "Canon EF 50mm f/1.8"}, - {2, "Canon EF 28mm f/2.8"}, + {2, "Canon EF 28mm f/2.8 or Sigma Lens"}, + {2, "Sigma 24mm f/2.8 Super Wide II"}, {3, "Canon EF 135mm f/2.8 Soft"}, {4, "Canon EF 35-105mm f/3.5-4.5 or Sigma Lens"}, {4, "Sigma UC Zoom 35-135mm f/4-5.6"}, @@ -598,6 +597,8 @@ public: {26, "Tamron SP AF 90mm f/2.8 Di Macro"}, {26, "Tamron SP AF 180mm f/3.5 Di Macro"}, {26, "Carl Zeiss Planar T* 50mm f/1.4"}, + {26, "Voigtlander APO Lanthar 125mm F2.5 SL Macro"}, + {26, "Carl Zeiss Planar T 85mm f/1.4 ZE"}, {27, "Canon EF 35-80mm f/4-5.6"}, {28, "Canon EF 80-200mm f/4.5-5.6 or Tamron Lens"}, {28, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF"}, @@ -629,21 +630,22 @@ public: {36, "Canon EF 38-76mm f/4.5-5.6"}, {37, "Canon EF 35-80mm f/4-5.6 or Tamron Lens"}, {37, "Tamron 70-200mm f/2.8 Di LD IF Macro"}, - {37, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20"}, + {37, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)"}, {37, "Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]"}, {37, "Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro"}, - {38, "Canon EF 80-200mm f/4.5-5.6"}, + {38, "Canon EF 80-200mm f/4.5-5.6 II"}, {39, "Canon EF 75-300mm f/4-5.6"}, {40, "Canon EF 28-80mm f/3.5-5.6"}, {41, "Canon EF 28-90mm f/4-5.6"}, {42, "Canon EF 28-200mm f/3.5-5.6 or Tamron Lens"}, - {42, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20"}, + {42, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)"}, {43, "Canon EF 28-105mm f/4-5.6"}, {44, "Canon EF 90-300mm f/4.5-5.6"}, {45, "Canon EF-S 18-55mm f/3.5-5.6 [II]"}, {46, "Canon EF 28-90mm f/4-5.6"}, {47, "Zeiss Milvus 35mm f/2 or 50mm f/2"}, {47, "Zeiss Milvus 50mm f/2 Makro"}, + {47, "Zeiss Milvus 135mm f/2 ZE"}, {48, "Canon EF-S 18-55mm f/3.5-5.6 IS"}, {49, "Canon EF-S 55-250mm f/4-5.6 IS"}, {50, "Canon EF-S 18-200mm f/3.5-5.6 IS"}, @@ -652,6 +654,7 @@ public: {53, "Canon EF-S 18-55mm f/3.5-5.6 III"}, {54, "Canon EF-S 55-250mm f/4-5.6 IS II"}, {60, "Irix 11mm f/4"}, + {63, "Irix 30mm F1.4 Dragonfly"}, {80, "Canon TS-E 50mm f/2.8L Macro"}, {81, "Canon TS-E 90mm f/2.8L Macro"}, {82, "Canon TS-E 135mm f/4L Macro"}, @@ -660,10 +663,17 @@ public: {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"}, + {106, "Rokinon SP / Samyang XP 35mm f/1.2"}, + {112, "Sigma 28mm f/1.5 FF High-speed Prime or other Sigma Lens"}, + {112, "Sigma 40mm f/1.5 FF High-speed Prime"}, + {112, "Sigma 105mm f/1.5 FF High-speed Prime"}, + {117, "Tamron 35-150mm f/2.8-4.0 Di VC OSD (A043) or other Tamron Lens"}, + {117, "Tamron SP 35mm f/1.4 Di USD (F045)"}, {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"}, + {127, "Canon TS-E 90mm f/2.8 or Tamron Lens"}, + {127, "Tamron 18-200mm f/3.5-6.3 Di II VC (B018)"}, {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"}, @@ -674,10 +684,12 @@ 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"}, + {131, "Sigma 28-70mm f/2.8-4 DG"}, {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"}, + {136, "Tamron SP 15-30mm f/2.8 Di VC USD (A012)"}, {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"}, @@ -687,14 +699,15 @@ public: {137, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C"}, {137, "Sigma 17-50mm f/2.8 OS HSM"}, {137, "Sigma 18-200mm f/3.5-6.3 DC OS HSM [II]"}, - {137, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD"}, + {137, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD (B008)"}, {137, "Sigma 8-16mm f/4.5-5.6 DC HSM"}, - {137, "Tamron SP 17-50mm f/2.8 XR Di II VC"}, - {137, "Tamron SP 60mm f/2 Macro Di II"}, + {137, "Tamron SP 17-50mm f/2.8 XR Di II VC (B005)"}, + {137, "Tamron SP 60mm f/2 Macro Di II (G005)"}, {137, "Sigma 10-20mm f/3.5 EX DC HSM"}, {137, "Tamron SP 24-70mm f/2.8 Di VC USD"}, {137, "Sigma 18-35mm f/1.8 DC HSM"}, {137, "Sigma 12-24mm f/4.5-5.6 DG HSM II"}, + {137, "Sigma 70-300mm f/4-5.6 DG OS"}, {138, "Canon EF 28-80mm f/2.8-4L"}, {139, "Canon EF 400mm f/2.8L USM"}, {140, "Canon EF 500mm f/4.5L USM"}, @@ -713,23 +726,28 @@ public: {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"}, + {150, "Sigma 18-35mm f/1.8 DC HSM | A"}, {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"}, + {152, "Sigma 300-800mm f/5.6 APO EX DG HSM"}, {153, "Canon EF 35-350mm f/3.5-5.6L USM or Sigma or Tamron Lens"}, {153, "Sigma 50-500mm f/4-6.3 APO HSM EX"}, {153, "Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro"}, - {153, "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro Model A14"}, + {153, "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro (A14)"}, {153, "Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro"}, {154, "Canon EF 20mm f/2.8 USM or Zeiss Lens"}, {154, "Zeiss Milvus 21mm f/2.8"}, - {155, "Canon EF 85mm f/1.8 USM"}, + {154, "Zeiss Milvus 15mm f/2.8 ZE"}, + {154, "Zeiss Milvus 18mm f/2.8 ZE"}, + {155, "Canon EF 85mm f/1.8 USM or Sigma Lens"}, + {155, "Sigma 14mm f/1.8 DG HSM | A"}, {156, "Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens"}, - {156, "Tamron SP 70-300mm f/4-5.6 Di VC USD"}, - {156, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF"}, + {156, "Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)"}, + {156, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)"}, {160, "Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens"}, {160, "Tamron AF 19-35mm f/3.5-4.5"}, {160, "Tokina AT-X 124 AF Pro DX 12-24mm f/4"}, @@ -742,7 +760,7 @@ public: {161, "Sigma 24-60mm f/2.8 EX DG"}, {161, "Tamron AF 17-50mm f/2.8 Di-II LD Aspherical"}, {161, "Tamron 90mm f/2.8"}, - {161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF"}, + {161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF (A05)"}, {161, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, {161, "Tokina AT-X 24-70mm f/2.8 PRO FX (IF)"}, {162, "Canon EF 200mm f/2.8L USM"}, @@ -762,18 +780,30 @@ public: {169, "Sigma 30mm f/1.4 EX DC HSM"}, {169, "Sigma 35mm f/1.4 DG HSM"}, {169, "Sigma 35mm f/1.5 FF High-Speed Prime | 017"}, - {170, "Canon EF 200mm f/2.8L II USM"}, + {169, "Sigma 70mm f/2.8 Macro EX DG"}, + {170, "Canon EF 200mm f/2.8L II USM or Sigma Lens"}, + {170, "Sigma 300mm f/2.8 APO EX DG HSM"}, + {170, "Sigma 800mm f/5.6 APO EX DG HSM"}, {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"}, + {172, "Sigma 500mm f/4.5 APO EX DG HSM"}, {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"}, + {173, "Sigma 10mm f/2.8 EX DC Fisheye"}, + {173, "Sigma 15mm f/2.8 EX DG Diagonal Fisheye"}, + {173, "Venus Laowa 100mm F2.8 2X Ultra Macro APO"}, {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"}, + {174, "Sigma APO 50-150mm f/2.8 EX DC OS HSM"}, + {174, "Sigma APO 120-300mm f/2.8 EX DG OS HSM"}, + {174, "Sigma 120-300mm f/2.8 DG OS HSM S013"}, + {174, "Sigma 120-400mm f/4.5-5.6 APO DG OS HSM"}, + {174, "Sigma 200-500mm f/2.8 APO EX DG"}, {175, "Canon EF 400mm f/2.8L USM"}, {176, "Canon EF 24-85mm f/3.5-4.5 USM"}, {177, "Canon EF 300mm f/4L IS USM"}, @@ -788,6 +818,8 @@ public: {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"}, + {180, "Tokina Opera 50mm f/1.4 FF"}, + {180, "Sigma 20mm f/1.4 DG HSM | A"}, {181, "Canon EF 100-400mm f/4.5-5.6L IS USM + 1.4x or Sigma Lens"}, {181, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x"}, {182, "Canon EF 100-400mm f/4.5-5.6L IS USM + 2x or Sigma Lens"}, @@ -814,11 +846,14 @@ public: {195, "Canon EF 35-105mm f/4.5-5.6 USM"}, {196, "Canon EF 75-300mm f/4-5.6 USM"}, {197, "Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens"}, - {197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HS"}, - {198, "Canon EF 50mm f/1.4 USM or Zeiss Lens"}, + {197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HSM"}, + {198, "Canon EF 50mm f/1.4 USM or Other Lens"}, {198, "Zeiss Otus 55mm f/1.4 ZE"}, {198, "Zeiss Otus 85mm f/1.4 ZE"}, {198, "Zeiss Milvus 25mm f/1.4"}, + {198, "Zeiss Otus 100mm f/1.4"}, + {198, "Zeiss Milvus 35mm f/1.4 ZE"}, + {198, "Yongnuo YN 35mm f/2"}, {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"}, @@ -829,13 +864,14 @@ public: {211, "Canon EF 28-200mm f/3.5-5.6 USM"}, {212, "Canon EF 28-105mm f/4-5.6 USM"}, {213, "Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens"}, - {213, "Tamron SP 150-600mm f/5-6.3 Di VC USD"}, - {213, "Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro"}, - {213, "Tamron SP 35mm f/1.8 Di VC USD"}, - {213, "Tamron SP 45mm f/1.8 Di VC USD"}, + {213, "Tamron SP 150-600mm f/5-6.3 Di VC USD (A011)"}, + {213, "Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro (B016)"}, + {213, "Tamron SP 35mm f/1.8 Di VC USD (F012)"}, + {213, "Tamron SP 45mm f/1.8 Di VC USD (F013)"}, {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"}, + {220, "Yongnuo YN 50mm f/1.8"}, {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"}, @@ -843,7 +879,8 @@ public: {228, "Canon EF 28-105mm f/3.5-4.5 USM"}, {229, "Canon EF 16-35mm f/2.8L USM"}, {230, "Canon EF 24-70mm f/2.8L USM"}, - {231, "Canon EF 17-40mm f/4L USM"}, + {231, "Canon EF 17-40mm f/4L USM or Sigma Lens"}, + {231, "Sigma 12-24mm f/4 DG HSM A016"}, {232, "Canon EF 70-300mm f/4.5-5.6 DO IS USM"}, {233, "Canon EF 28-300mm f/3.5-5.6L IS USM"}, {234, "Canon EF-S 17-85mm f/4-5.6 IS USM or Tokina Lens"}, @@ -867,21 +904,38 @@ public: {248, "Sigma 24-35mm f/2 DG HSM | A"}, {248, "Sigma 135mm f/2 FF High-Speed Prime | 017"}, {248, "Sigma 24-35mm f/2.2 FF Zoom | 017"}, + {248, "Sigma 135mm f/1.8 DG HSM A017"}, {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"}, + {250, "Tokina Opera 16-28mm f/2.8 FF"}, + {250, "Sigma 85mm f/1.4 DG HSM A016"}, {251, "Canon EF 70-200mm f/2.8L IS II USM"}, + {251, "Canon EF 70-200mm f/2.8L IS III USM"}, {252, "Canon EF 70-200mm f/2.8L IS II USM + 1.4x"}, + {252, "Canon EF 70-200mm f/2.8L IS III 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"}, + {253, "Canon EF 70-200mm f/2.8L IS III USM + 2x"}, + {254, "Canon EF 100mm f/2.8L Macro IS USM or Tamron Lens"}, + {254, "Tamron SP 90mm f/2.8 Di VC USD 1:1 Macro (F017)"}, + {255, "Sigma 24-105mm f/4 DG OS HSM | A or Other Lens"}, {255, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, + {255, "Tamron SP 70-200mm f/2.8 Di VC USD"}, {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"}, + {368, "Sigma 28mm f/1.4 DG HSM | A"}, + {368, "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, + {368, "Sigma 85mm f/1.4 DG HSM | A"}, + {368, "Sigma 105mm f/1.4 DG HSM"}, + {368, "Sigma 14-24mm f/2.8 DG HSM"}, + {368, "Sigma 35mm f/1.4 DG HSM | A"}, + {368, "Sigma 70mm f/2.8 DG Macro"}, + {368, "Sigma 18-35mm f/1.8 DC HSM | A"}, + {368, "Sigma 24-105mm f/4 DG OS HSM | A"}, {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"}, @@ -897,7 +951,7 @@ public: {493, "Canon EF 24-105mm f/4L IS USM"}, {494, "Canon EF 600mm f/4L IS II USM"}, {495, "Canon EF 24-70mm f/2.8L II USM or Sigma Lens"}, - {495, "Sigma 24-70mm F2.8 DG OS HSM | A"}, + {495, "Sigma 24-70mm f/2.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 or Tamron Lens"}, @@ -908,21 +962,25 @@ public: {506, "Canon EF 400mm f/4 DO IS II USM"}, {507, "Canon EF 16-35mm f/4L IS USM"}, {508, "Canon EF 11-24mm f/4L USM or Tamron Lens"}, - {508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD"}, + {508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)"}, + {624, "Sigma 70-200mm f/2.8 DG OS HSM | S or other Sigma Lens"}, + {624, "Sigma 150-600mm f/5-6.3 | C"}, {747, "Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens"}, {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"}, + {750, "Canon EF 35mm f/1.4L II USM or Tamron Lens"}, + {750, "Tamron SP 85mm f/1.8 Di VC USD (F016)"}, + {750, "Tamron SP 45mm f/1.8 Di VC USD (F013)"}, {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"}, + {1136, "Sigma 24-70mm f/2.8 DG OS HSM | A"}, {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"}, @@ -938,16 +996,54 @@ public: {4154, "Canon EF-S 24mm f/2.8 STM"}, {4155, "Canon EF-M 28mm f/3.5 Macro IS STM"}, {4156, "Canon EF 50mm f/1.8 STM"}, - {4157, "Canon EF-M 18-150mm 1:3.5-6.3 IS STM"}, + {4157, "Canon EF-M 18-150mm f/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"}, + {4208, "Sigma 56mm f/1.4 DC DN | C or other Sigma Lens"}, + {4208, "Sigma 30mm F1.4 DC DN | C"}, {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"}, + {61182, "Canon RF 85mm F1.2L USM"}, + {61182, "Canon RF 85mm F1.2L USM DS"}, + {61182, "Canon RF 24-70mm F2.8L IS USM"}, + {61182, "Canon RF 15-35mm F2.8L IS USM"}, + {61182, "Canon RF 24-240mm F4-6.3 IS USM"}, + {61182, "Canon RF 70-200mm F2.8L IS USM"}, + {61182, "Canon RF 85mm F2 MACRO IS STM"}, + {61182, "Canon RF 600mm F11 IS STM"}, + {61182, "Canon RF 600mm F11 IS STM + RF1.4x"}, + {61182, "Canon RF 600mm F11 IS STM + RF2x"}, + {61182, "Canon RF 800mm F11 IS STM"}, + {61182, "Canon RF 800mm F11 IS STM + RF1.4x"}, + {61182, "Canon RF 800mm F11 IS STM + RF2x"}, + {61182, "Canon RF 24-105mm F4-7.1 IS STM"}, + {61182, "Canon RF 100-500mm F4.5-7.1L IS USM"}, + {61182, "Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x"}, + {61182, "Canon RF 100-500mm F4.5-7.1L IS USM + RF2x"}, + {61182, "Canon RF 70-200mm F4L IS USM"}, + {61182, "Canon RF 100mm F2.8L MACRO IS USM"}, + {61182, "Canon RF 50mm F1.8 STM"}, + {61182, "Canon RF 14-35mm F4L IS USM"}, + {61182, "Canon RF-S 18-45mm F4.5-6.3 IS STM"}, + {61182, "Canon RF 100-400mm F5.6-8 IS USM"}, + {61182, "Canon RF 100-400mm F5.6-8 IS USM + RF1.4x"}, + {61182, "Canon RF 100-400mm F5.6-8 IS USM + RF2x"}, + {61182, "Canon RF-S 18-150mm F3.5-6.3 IS STM"}, + {61182, "Canon RF 24mm F1.8 MACRO IS STM"}, + {61182, "Canon RF 16mm F2.8 STM"}, + {61182, "Canon RF 400mm F2.8L IS USM"}, + {61182, "Canon RF 400mm F2.8L IS USM + RF1.4x"}, + {61182, "Canon RF 400mm F2.8L IS USM + RF2x"}, + {61182, "Canon RF 600mm F4L IS USM"}, + {61182, "Canon RF 15-30mm F4.5-6.3 IS STM"}, + {61182, "Canon RF 800mm F5.6L IS USM"}, + {61182, "Canon RF 1200mm F8L IS USM"}, + {61182, "Canon RF 5.2mm F2.8L Dual Fisheye 3D VR"}, {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"}, @@ -1118,7 +1214,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.2fmm", val * 25.4 / 1000); + snprintf(buffer, sizeof(buffer), "%.2fmm", val * 25.4 / 1000); return buffer; } }; @@ -1131,7 +1227,7 @@ public: { char buffer[32]; double d = pow (2, - t->toInt() / 32.0); - sprintf (buffer, "%.3f", d); + snprintf(buffer, sizeof(buffer), "%.3f", d); return buffer; } }; @@ -1142,7 +1238,7 @@ class CAEVInterpreter : public Interpreter std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%.1f", t->toDouble() / 32.0 ); + snprintf(buffer, sizeof(buffer), "%.1f", t->toDouble() / 32.0 ); return buffer; } }; @@ -1155,7 +1251,7 @@ public: { char buffer[32]; int a = t->toInt(); - sprintf (buffer, "%d", a); + snprintf(buffer, sizeof(buffer), "%d", a); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1174,7 +1270,7 @@ public: int a = Interpreter::toInt (t, ofs, astype); if (a > 1) { - int i = int (double (powf (2.f, float (a) / 32.f - 4.f)) * 50.f + 0.5f); + int i = static_cast(powf (2.f, static_cast(a) / 32.f - 4.f)) * 50.0 + 0.5; return i; } else { return 0; @@ -1297,7 +1393,7 @@ public: } char buffer[32]; - sprintf (buffer, "%.0f", n / 32. ); + snprintf(buffer, sizeof(buffer), "%.0f", n / 32. ); return buffer; } }; @@ -1352,7 +1448,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%.2f", t->toDouble() / 100 ); + snprintf(buffer, sizeof(buffer), "%.2f", t->toDouble() / 100 ); return buffer; } }; @@ -1364,7 +1460,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%.1f", t->toDouble() / 8 - 6 ); + snprintf(buffer, sizeof(buffer), "%.1f", t->toDouble() / 8 - 6 ); return buffer; } }; @@ -1500,7 +1596,7 @@ public: { unsigned long val = t->toInt (0, LONG); char buffer[32]; - sprintf (buffer, "%ld", ((val & 0xffc0) >> 6) * 10000 + ((val >> 16) & 0xff) + ((val & 0x3f) << 8) ); + snprintf(buffer, sizeof(buffer), "%ld", ((val & 0xffc0) >> 6) * 10000 + ((val >> 16) & 0xff) + ((val & 0x3f) << 8) ); return buffer; } }; @@ -1514,7 +1610,11 @@ public: { choices[1042] = "EOS M50 / Kiss M"; choices[2049] = "PowerShot SX740 HS"; + choices[2052] = "PowerShot G5 X Mark II"; choices[2053] = "PowerShot SX70 HS"; + choices[2056] = "PowerShot G7 X Mark III"; + choices[2065] = "EOS M6 Mark II"; + choices[2066] = "EOS M200"; choices[16842752] = "PowerShot A30"; choices[17039360] = "PowerShot S300 / Digital IXUS 300 / IXY Digital 300"; choices[17170432] = "PowerShot A20"; @@ -1679,6 +1779,7 @@ public: choices[52822016] = "PowerShot A3400 IS"; choices[52887552] = "PowerShot A2400 IS"; choices[52953088] = "PowerShot A2300"; + choices[53608448] = "PowerShot S100V"; choices[53673984] = "PowerShot G15"; choices[53739520] = "PowerShot SX50 HS"; choices[53805056] = "PowerShot SX160 IS"; @@ -1737,7 +1838,7 @@ public: choices[67239936] = "PowerShot SX420 IS"; choices[67305472] = "PowerShot ELPH 190 IS / IXUS 180 / IXY 190"; choices[67371008] = "PowerShot G1"; - choices[67371009] = "IXY 180"; + choices[67371009] = "PowerShot ELPH 180 IS / IXUS 175 / IXY 180"; choices[67436544] = "PowerShot SX720 HS"; choices[67502080] = "PowerShot SX620 HS"; choices[67567616] = "EOS M6"; @@ -1821,7 +1922,7 @@ public: choices[2147484453] = "EOS 70D"; choices[2147484454] = "EOS Rebel T5i / 700D / Kiss X7i"; choices[2147484455] = "EOS Rebel T5 / 1200D / Kiss X70 / Hi"; - choices[2147484456] = "EOS-1D X MARK II"; + choices[2147484456] = "EOS-1D X Mark II"; choices[2147484465] = "EOS M"; choices[2147484486] = "EOS Rebel SL1 / 100D / Kiss X7"; choices[2147484487] = "EOS Rebel T6s / 760D / 8000D"; @@ -1836,9 +1937,23 @@ public: choices[2147484678] = "EOS 6D Mark II"; choices[2147484680] = "EOS 77D / 9000D"; choices[2147484695] = "EOS Rebel SL2 / 200D / Kiss X9"; + choices[2147484705] = "EOS R5"; choices[2147484706] = "EOS Rebel T100 / 4000D / 3000D"; - choices[2147484708] = "EOR R"; + choices[2147484708] = "EOS R"; + choices[2147484712] = "EOS-1D X Mark III"; choices[2147484722] = "EOS Rebel T7 / 2000D / 1500D / Kiss X90"; + choices[2147484723] = "EOS RP"; + choices[2147484725] = "EOS Rebel T8i / 850D / X10i"; + choices[2147484726] = "EOS SL3 / 250D / Kiss X10"; + choices[2147484727] = "EOS 90D"; + choices[2147484752] = "EOS R3"; + choices[2147484755] = "EOS R6"; + choices[2147484772] = "EOS R7"; + choices[2147484773] = "EOS R10"; + choices[2147484775] = "PowerShot ZOOM"; + choices[2147484776] = "EOS M50 Mark II / Kiss M2"; + choices[2147484960] = "EOS D2000C"; + choices[2147485024] = "EOS D6000C"; } }; CAModelIDInterpreter caModelIDInterpreter; @@ -2074,5 +2189,4 @@ const TagAttrib canonAttribs[] = { { -1, AC_DONTWRITE, 0, nullptr, 0, AUTO, "", nullptr} }; } -#endif diff --git a/rtexif/fujiattribs.cc b/rtexif/fujiattribs.cc index 0eaa505f6..ffbf3a0be 100644 --- a/rtexif/fujiattribs.cc +++ b/rtexif/fujiattribs.cc @@ -16,8 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _FUJIATTRIBS_ -#define _FUJIATTRIBS_ #include "rtexif.h" @@ -312,5 +310,4 @@ const TagAttrib fujiAttribs[] = { { -1, AC_DONTWRITE, 0, nullptr, 0, AUTO, "", nullptr} }; } -#endif diff --git a/rtexif/kodakattribs.cc b/rtexif/kodakattribs.cc index a9c168a70..c89ca2298 100644 --- a/rtexif/kodakattribs.cc +++ b/rtexif/kodakattribs.cc @@ -1,8 +1,6 @@ /* * This file is part of RawTherapee. */ -#ifndef _KODAKATTRIBS_ -#define _KODAKATTRIBS_ #include #include "rtexif.h" @@ -58,7 +56,7 @@ void parseKodakIfdTextualInfo (Tag *textualInfo, Tag* exif_) // Proback645 may have "Lens" but not "Focal Length" float flen = atof (val.c_str()); - if (flen != 0.0) { + if (flen != 0.f) { t = new Tag (exif, lookupAttrib (exifAttribs, "FocalLength")); t->initRational (flen * 32, 32); exif->replaceTag (t); @@ -66,7 +64,7 @@ void parseKodakIfdTextualInfo (Tag *textualInfo, Tag* exif_) } else if (key == "Focal Length") { float flen = atof (val.c_str()); - if (flen != 0.0) { + if (flen != 0.f) { t = new Tag (exif, lookupAttrib (exifAttribs, "FocalLength")); t->initRational (flen * 32, 32); exif->replaceTag (t); @@ -74,7 +72,7 @@ void parseKodakIfdTextualInfo (Tag *textualInfo, Tag* exif_) } else if (key == "Aperture") { float aperture = atof (&val.c_str()[1]); - if (aperture != 0.0) { + if (aperture != 0.f) { t = new Tag (exif, lookupAttrib (exifAttribs, "FNumber")); t->initRational ((int) (aperture * 10), 10); exif->replaceTag (t); @@ -161,5 +159,4 @@ const TagAttrib kodakIfdAttribs[] = { }; } -#endif diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index 77720dde0..83aec22f6 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -16,8 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _NIKONATTRIBS_ -#define _NIKONATTRIBS_ #include #include @@ -37,7 +35,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->toInt (2)); + snprintf(buffer, sizeof(buffer), "%d", t->toInt (2)); return buffer; } }; @@ -51,7 +49,7 @@ public: { char buffer[32]; int a = t->toInt(); - sprintf (buffer, "%d", a); + snprintf(buffer, sizeof(buffer), "%d", a); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -70,7 +68,7 @@ public: int a = t->getValue()[ofs]; if (a > 1) { - int i = int (double (powf (2.f, float (a) / 12.f - 5.f)) * 100.f + 0.5f); + int i = static_cast(powf(2.f, float (a) / 12.f - 5.f)) * 100.0 + 0.5; return i; } else { return 0; @@ -130,7 +128,7 @@ public: default: { char buffer[32]; - sprintf (buffer, "0x%04X", a); + snprintf(buffer, sizeof(buffer), "0x%04X", a); return buffer; } } @@ -565,6 +563,7 @@ const std::map NALensDataInterpreter::lenses = { {"00 47 44 44 24 24 00 06", "Tokina AT-X M35 PRO DX (AF 35mm f/2.8 Macro)"}, {"00 47 53 80 30 3C 00 06", "Tamron AF 55-200mm f/4-5.6 Di II LD (A15)"}, {"00 48 1C 29 24 24 00 06", "Tokina AT-X 116 PRO DX (AF 11-16mm f/2.8)"}, + {"00 48 27 27 24 24 00 00", "Carl Zeiss Distagon T* 2.8/15 ZF.2"}, {"00 48 29 3C 24 24 00 06", "Tokina AT-X 16-28 AF PRO FX (AF 16-28mm f/2.8)"}, {"00 48 29 50 24 24 00 06", "Tokina AT-X 165 PRO DX (AF 16-50mm f/2.8)"}, {"00 48 32 32 24 24 00 00", "Carl Zeiss Distagon T* 2.8/21 ZF.2"}, @@ -612,6 +611,7 @@ const std::map NALensDataInterpreter::lenses = { {"02 3A 37 50 31 3D 02 00", "Sigma 24-50mm f/4-5.6 UC"}, {"02 3A 5E 8E 32 3D 02 00", "Sigma 75-300mm f/4.0-5.6"}, {"02 3B 44 61 30 3D 02 00", "Sigma 35-80mm f/4-5.6"}, + {"02 3B 5C 82 30 3C 02 00", "Sigma Zoom-K 70-210mm f/4-5.6"}, {"02 3C B0 B0 3C 3C 02 00", "Sigma APO 800mm f/5.6"}, {"02 3F 24 24 2C 2C 02 00", "Sigma 14mm f/3.5"}, {"02 3F 3C 5C 2D 35 02 00", "Sigma 28-70mm f/3.5-4.5 UC"}, @@ -627,6 +627,7 @@ const std::map NALensDataInterpreter::lenses = { {"02 48 65 65 24 24 02 00", "Sigma Macro 90mm f/2.8"}, {"03 43 5C 81 35 35 02 00", "Soligor AF C/D Zoom UMCS 70-210mm 1:4.5"}, {"03 48 5C 81 30 30 02 00", "AF Zoom-Nikkor 70-210mm f/4"}, + {"03 54 68 68 0C 0C 00 00", "Zeiss Otus 1.4/100"}, {"04 48 3C 3C 24 24 03 00", "AF Nikkor 28mm f/2.8"}, {"05 54 50 50 0C 0C 04 00", "AF Nikkor 50mm f/1.4"}, {"06 3F 68 68 2C 2C 06 00", "Cosina AF 100mm f/3.5 Macro"}, @@ -635,6 +636,7 @@ const std::map NALensDataInterpreter::lenses = { {"07 3E 30 43 2D 35 03 00", "Soligor AF Zoom 19-35mm 1:3.5-4.5 MC"}, {"07 40 2F 44 2C 34 03 02", "Tamron AF 19-35mm f/3.5-4.5 (A10)"}, {"07 40 30 45 2D 35 03 02", "Tamron AF 19-35mm f/3.5-4.5 (A10)"}, + {"07 40 30 45 2D 35 03 02", "Voigtlander Ultragon 19-35mm f/3.5-4.5 VMV"}, {"07 40 3C 5C 2C 35 03 00", "Tokina AF 270 II (AF 28-70mm f/3.5-4.5)"}, {"07 40 3C 62 2C 34 03 00", "AF Zoom-Nikkor 28-85mm f/3.5-4.5"}, {"07 46 2B 44 24 30 03 02", "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical (IF) (A05)"}, @@ -719,6 +721,7 @@ const std::map NALensDataInterpreter::lenses = { {"26 40 7B A0 34 40 1C 02", "Sigma APO 170-500mm f/5-6.3 Aspherical RF"}, {"26 41 3C 8E 2C 40 1C 02", "Sigma 28-300mm f/3.5-6.3 DG Macro"}, {"26 44 73 98 34 3C 1C 02", "Sigma 135-400mm f/4.5-5.6 APO Aspherical"}, + {"26 45 68 8E 34 42 1C 02", "Sigma 100-300mm f/4.5-6.7 DL"}, {"26 48 11 11 30 30 1C 02", "Sigma 8mm f/4 EX Circular Fisheye"}, {"26 48 27 27 24 24 1C 02", "Sigma 15mm f/2.8 EX Diagonal Fisheye"}, {"26 48 2D 50 24 24 1C 06", "Sigma 18-50mm f/2.8 EX DC"}, @@ -820,6 +823,7 @@ const std::map NALensDataInterpreter::lenses = { {"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 58 30 30 14 0C 4D 02", "Rokinon 20mm f/1.8 ED AS UMC"}, {"4A 60 36 36 0C 0C 4D 02", "Samyang 24mm f/1.4 ED AS UMC"}, {"4A 60 44 44 0C 0C 4D 02", "Samyang 35mm f/1.4 AS UMC"}, {"4A 60 62 62 0C 0C 4D 02", "Samyang AE 85mm f/1.4 AS IF UMC"}, @@ -873,6 +877,7 @@ const std::map NALensDataInterpreter::lenses = { {"6E 48 98 98 24 24 74 02", "AF-S Nikkor 400mm f/2.8D IF-ED II"}, {"6F 3C A0 A0 30 30 75 02", "AF-S Nikkor 500mm f/4D IF-ED II"}, {"70 3C A6 A6 30 30 76 02", "AF-S Nikkor 600mm f/4D IF-ED II"}, + {"71 48 64 64 24 24 00 00", "Voigtlander APO-Skopar 90mm f/2.8 SL IIs"}, {"72 48 4C 4C 24 24 77 00", "Nikkor 45mm f/2.8 P"}, {"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"}, @@ -900,25 +905,32 @@ const std::map NALensDataInterpreter::lenses = { {"7A 48 2D 50 24 24 4B 06", "Sigma 18-50mm f/2.8 EX DC Macro"}, {"7A 48 5C 80 24 24 4B 06", "Sigma 70-200mm f/2.8 EX APO DG Macro HSM II"}, {"7A 54 6E 8E 24 24 4B 02", "Sigma APO 120-300mm f/2.8 EX DG HSM"}, + {"7B 48 37 44 18 18 4B 06", "Sigma 24-35mm f/2.0 DG HSM | A"}, {"7B 48 80 98 30 30 80 0E", "AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED"}, + {"7C 54 2B 50 24 24 00 06", "Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16)"}, {"7D 48 2B 53 24 24 82 06", "AF-S DX Zoom-Nikkor 17-55mm f/2.8G IF-ED"}, {"7F 40 2D 5C 2C 34 84 06", "AF-S DX Zoom-Nikkor 18-70mm f/3.5-4.5G IF-ED"}, {"7F 48 2B 5C 24 34 1C 06", "Sigma 17-70mm f/2.8-4.5 DC Macro Asp. IF"}, {"7F 48 2D 50 24 24 1C 06", "Sigma 18-50mm f/2.8 EX DC Macro"}, {"80 48 1A 1A 24 24 85 06", "AF DX Fisheye-Nikkor 10.5mm f/2.8G ED"}, + {"80 48 1C 29 24 24 7A 06", "Tokina atx-i 11-16mm f/2.8 CF"}, {"81 34 76 A6 38 40 4B 0E", "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, {"81 54 80 80 18 18 86 0E", "AF-S VR Nikkor 200mm f/2G IF-ED"}, {"82 34 76 A6 38 40 4B 0E", "Sigma 150-600mm f/5-6.3 DG OS HSM | C"}, {"82 48 8E 8E 24 24 87 0E", "AF-S VR Nikkor 300mm f/2.8G IF-ED"}, {"83 00 B0 B0 5A 5A 88 04", "FSA-L2, EDG 65, 800mm f/13 G"}, + {"87 2C 2D 8E 2C 40 4B 0E", "Sigma 18-300mm f/3.5-6.3 DC Macro HSM"}, {"88 54 50 50 0C 0C 4B 06", "Sigma 50mm f/1.4 DG HSM | A"}, + {"89 30 2D 80 2C 40 4B 0E", "Sigma 18-200mm f/3.5-6.3 DC Macro OS HS | C"}, {"89 3C 53 80 30 3C 8B 06", "AF-S DX Zoom-Nikkor 55-200mm f/4-5.6G ED"}, {"8A 3C 37 6A 30 30 4B 0E", "Sigma 24-105mm f/4 DG OS HSM"}, {"8A 54 6A 6A 24 24 8C 0E", "AF-S VR Micro-Nikkor 105mm f/2.8G IF-ED"}, {"8B 40 2D 80 2C 3C 8D 0E", "AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED"}, {"8B 40 2D 80 2C 3C FD 0E", "AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]"}, + {"8B 48 1C 30 24 24 85 06", "Tokina AT-X 11-20 f/2.8 PRO DX (AF 11-20mm f/2.8)"}, {"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"}, + {"8C 48 29 3C 24 24 86 06", "Tokina opera 16-28mm f/2.8 FF"}, {"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"}, @@ -955,14 +967,20 @@ const std::map NALensDataInterpreter::lenses = { {"9E 38 11 29 34 3C 4B 06", "Sigma 8-16mm f/4.5-5.6 DC HSM"}, {"9E 40 2D 6A 2C 3C A0 0E", "AF-S DX VR Zoom-Nikkor 18-105mm f/3.5-5.6G ED"}, {"9F 37 50 A0 34 40 4B 0E", "Sigma 50-500mm f/4.5-6.3 DG OS HSM"}, + {"9F 48 48 48 24 24 A1 06", "Yongnuo YN40mm f/2.8N"}, + {"9F 54 68 68 18 18 A2 06", "Yongnuo YN100mm f/2N"}, {"9F 58 44 44 14 14 A1 06", "AF-S DX Nikkor 35mm f/1.8G"}, + {"A0 37 5C 8E 34 3C A2 06", "Sony FE 70-300mm f/4.5-5.6 G OSS"}, {"A0 40 2D 53 2C 3C CA 0E", "AF-P DX Nikkor 18-55mm f/3.5-5.6G VR"}, {"A0 40 2D 53 2C 3C CA 8E", "AF-P DX Nikkor 18-55mm f/3.5-5.6G"}, {"A0 40 2D 74 2C 3C BB 0E", "AF-S DX Nikkor 18-140mm f/3.5-5.6G ED VR"}, {"A0 48 2A 5C 24 30 4B 0E", "Sigma 17-70mm f/2.8-4 DC Macro OS HSM"}, {"A0 54 50 50 0C 0C A2 06", "AF-S Nikkor 50mm f/1.4G"}, + {"A0 56 44 44 14 14 A2 06", "Sony FE 35mm f/1.8"}, {"A1 40 18 37 2C 34 A3 06", "AF-S DX Nikkor 10-24mm f/3.5-4.5G ED"}, + {"A1 40 2D 53 2C 3C CB 86", "AF-P DX Nikkor 18-55mm f/3.5-5.6G"}, {"A1 41 19 31 2C 2C 4B 06", "Sigma 10-20mm f/3.5 EX DC HSM"}, + {"A1 48 6E 8E 24 24 DB 4E", "AF-S Nikkor 120-300mm f/2.8E FL ED SR VR"}, {"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"}, @@ -1007,6 +1025,7 @@ const std::map NALensDataInterpreter::lenses = { {"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"}, {"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 4E", "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"}, @@ -1033,41 +1052,53 @@ const std::map NALensDataInterpreter::lenses = { {"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"}, + {"BB 48 5C 80 24 24 4B 4E", "Sigma 70-200mm f/2.8 DG OS HSM | S"}, {"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"}, + {"C4 4C 73 73 14 14 4B 46", "Sigma 135mm f/1.8 DG HSM | A"}, + {"C8 54 44 44 0D 0D DF 46", "Tamron SP 35mm f/1.4 Di USD (F045)"}, + {"C8 54 62 62 0C 0C 4B 06", "Sigma 85mm f/1.4 DG HSM | A"}, {"C8 54 62 62 0C 0C 4B 46", "Sigma 85mm f/1.4 DG HSM | A"}, + {"C9 3C 44 76 25 31 DF 4E", "Tamron 35-150mm f/2.8-4 Di VC OSD (A043)"}, {"C9 48 37 5C 24 24 4B 4E", "Sigma 24-70mm f/2.8 DG OS HSM | A"}, + {"CA 3C 1F 37 30 30 4B 46", "Sigma 12-24mm f/4 DG 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 44 68 98 34 41 DF 0E", "Tamron 100-400mm f/4.5-6.3 Di VC USD"}, {"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)"}, + {"D2 3C 8E B0 3C 3C 4B 02", "Sigma APO 300-800mm f/5.6 EX DG HSM"}, + {"DB 40 11 11 2C 2C 1C 06", "Sigma 8mm f/3.5 EX DG Circular Fisheye"}, {"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)"}, + {"E0 40 2D 98 2C 41 DF 4E", "Tamron 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 0E", "Tamron SP 150-600mm f/5-6.3 Di VC USD G2 (A022)"}, {"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 4C 62 62 14 14 C9 4E", "Tamron SP 85mm f/1.8 Di VC USD (F016)"}, {"E5 54 6A 6A 24 24 35 02", "Sigma Macro 105mm f/2.8 EX DG"}, - {"E6 40 2D 80 2C 40 DF 0E", "Tamron AF 18-200mm f/3.5-6.3 Di II VC (B018)"}, + {"E6 40 2D 80 2C 40 DF 0E", "Tamron 18-200mm f/3.5-6.3 Di II VC (B018)"}, {"E6 41 3C 8E 2C 40 1C 02", "Sigma 28-300mm f/3.5-6.3 DG Macro"}, {"E7 4C 4C 4C 14 14 DF 0E", "Tamron SP 45mm f/1.8 Di VC USD (F013)"}, {"E8 4C 44 44 14 14 DF 0E", "Tamron SP 35mm f/1.8 Di VC USD (F012)"}, {"E9 48 27 3E 24 24 DF 0E", "Tamron SP 15-30mm f/2.8 Di VC USD (A012)"}, {"E9 54 37 5C 24 24 1C 02", "Sigma 24-70mm f/2.8 EX DG Macro"}, - {"EA 40 29 8E 2C 40 DF 0E", "Tamron AF 16-300mm f/3.5-6.3 Di II VC PZD (B016)"}, + {"EA 40 29 8E 2C 40 DF 0E", "Tamron 16-300mm f/3.5-6.3 Di II VC PZD (B016)"}, {"EA 48 27 27 24 24 1C 02", "Sigma 15mm f/2.8 EX Diagonal Fisheye"}, {"EB 40 76 A6 38 40 DF 0E", "Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)"}, + {"EC 3E 3C 8E 2C 40 DF 0E", "Tamron 28-300mm f/3.5-6.3 Di VC PZD A010"}, {"ED 40 2D 80 2C 40 4B 0E", "Sigma 18-200mm f/3.5-6.3 DC OS HSM"}, {"EE 48 5C 80 24 24 4B 06", "Sigma 70-200mm f/2.8 EX APO DG Macro HSM II"}, {"F0 38 1F 37 34 3C 4B 06", "Sigma 12-24mm f/4.5-5.6 EX DG Aspherical HSM"}, @@ -1076,6 +1107,7 @@ const std::map NALensDataInterpreter::lenses = { {"F1 47 5C 8E 30 3C DF 0E", "Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)"}, {"F3 48 68 8E 30 30 4B 02", "Sigma APO 100-300mm f/4 EX IF HSM"}, {"F3 54 2B 50 24 24 84 0E", "Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)"}, + {"F4 4C 7C 7C 2C 2C 4B 02", "Sigma APO Macro 180mm f/3.5 EX DG HSM"}, {"F4 54 56 56 18 18 84 06", "Tamron SP AF 60mm f/2.0 Di II Macro 1:1 (G005)"}, {"F5 40 2C 8A 2C 40 40 0E", "Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical (IF) Macro (B003)"}, {"F5 48 76 76 24 24 4B 06", "Sigma APO Macro 150mm f/2.8 EX DG HSM"}, @@ -1220,5 +1252,3 @@ const TagAttrib nikon3Attribs[] = { }; } -#endif - diff --git a/rtexif/olympusattribs.cc b/rtexif/olympusattribs.cc index f9869f13e..63ce6bb43 100644 --- a/rtexif/olympusattribs.cc +++ b/rtexif/olympusattribs.cc @@ -16,8 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _OLYMPUSATTRIBS_ -#define _OLYMPUSATTRIBS_ #include #include @@ -130,9 +128,14 @@ public: 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 32 10"] = "Olympus M.Zuiko Digital ED 12-200mm f/3.5-6.3"; lenses["00 33 00"] = "Olympus Zuiko Digital 25mm f/2.8"; + lenses["00 33 10"] = "Olympus M.Zuiko Digital 150-400mm f/4.5 TC1.25x IS Pro"; lenses["00 34 00"] = "Olympus Zuiko Digital ED 9-18mm f/4.0-5.6"; + lenses["00 34 10"] = "Olympus M.Zuiko Digital ED 12-45mm f/4.0 Pro"; lenses["00 35 00"] = "Olympus Zuiko Digital 14-54mm f/2.8-3.5 II"; + lenses["00 35 10"] = "Olympus M.Zuiko 100-400mm f/5.0-6.3"; + lenses["00 36 10"] = "Olympus M.Zuiko Digital ED 8-25mm f/4 Pro"; lenses["01 01 00"] = "Sigma 18-50mm f/3.5-5.6 DC"; lenses["01 01 10"] = "Sigma 30mm f/2.8 EX DN"; lenses["01 02 00"] = "Sigma 55-200mm f/4.0-5.6 DC"; @@ -190,9 +193,21 @@ public: lenses["02 26 10"] = "Lumix G 25mm f/1.7 Asph."; lenses["02 27 10"] = "Leica DG Vario-Elmar 100-400mm f/4.0-6.3 Asph. Power OIS"; lenses["02 28 10"] = "Lumix G Vario 12-60mm f/3.5-5.6 Asph. Power OIS"; + lenses["02 29 10"] = "Leica DG Summilux 12mm f/1.4 Asph."; + lenses["02 30 10"] = "Leica DG Vario-Elmarit 12-60mm f/2.8-4 Asph. Power OIS"; + lenses["02 31 10"] = "Lumix G Vario 45-200mm f/4.0-5.6 II"; + lenses["02 32 10"] = "Lumix G Vario 100-300mm f/4.0-5.6 II"; + lenses["02 33 10"] = "Lumix G X Vario 12-35mm f/2.8 II Asph. Power OIS"; + lenses["02 34 10"] = "Lumix G Vario 35-100mm f/2.8 II"; + lenses["02 35 10"] = "Leica DG Vario-Elmarit 8-18mm f/2.8-4 Asph."; + lenses["02 36 10"] = "Leica DG Elmarit 200mm f/2.8 Power OIS"; + lenses["02 37 10"] = "Leica DG Vario-Elmarit 50-200mm f/2.8-4 Asph. Power OIS"; + lenses["02 38 10"] = "Leica DG Vario-Summilux 10-25mm f/1.7 Asph."; + lenses["02 40 10"] = "Leica DG Vario-Summilux 25-50mm f/1.7 Asph."; lenses["03 01 00"] = "Leica D Vario Elmarit 14-50mm f/2.8-3.5 Asph."; 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"; + lenses["024 01 10"] = "Venus Optics Laowa 50mm f/2.8 2x Macro"; } std::string toString (const Tag* t) const override { @@ -331,7 +346,7 @@ public: choices[26] = "Museum"; choices[27] = "Shoot & Select"; choices[28] = "Beach & Snow"; - choices[29] = "Self Protrait+Timer"; + choices[29] = "Self Portrait+Timer"; choices[30] = "Candle"; choices[31] = "Available Light"; choices[32] = "Behind Glass"; @@ -842,5 +857,3 @@ const TagAttrib olympusAttribs[] = { { -1, AC_DONTWRITE, 0, nullptr, 0, AUTO, "", nullptr} }; } -#endif - diff --git a/rtexif/panasonicattribs.cc b/rtexif/panasonicattribs.cc index 3062824cf..4ebcf2447 100644 --- a/rtexif/panasonicattribs.cc +++ b/rtexif/panasonicattribs.cc @@ -1,8 +1,6 @@ /* * This file is part of RawTherapee. */ -#ifndef _PANASONICATTRIBS_ -#define _PANASONICATTRIBS_ #include #include "rtexif.h" @@ -138,5 +136,3 @@ const TagAttrib panasonicRawAttribs[] = { }; } -#endif - diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 898150696..bf17941f8 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -16,8 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PENTAXATTRIBS_ -#define _PENTAXATTRIBS_ #include #include @@ -424,7 +422,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -628,7 +626,7 @@ public: return s.str(); } else { char buffer[1024]; - t->toString (buffer); + t->toString (buffer, sizeof(buffer)); return std::string (buffer); } } @@ -696,7 +694,7 @@ public: }; PAColorSpaceInterpreter paColorSpaceInterpreter; -class PALensTypeInterpreter : public IntLensInterpreter< int > +class PALensTypeInterpreter final: public IntLensInterpreter< int > { public: PALensTypeInterpreter () @@ -752,7 +750,7 @@ public: choices.insert (p_t (256 * 3 + 44, "Sigma 17-70mm f/2.8-4.5 DC Macro")); choices.insert (p_t (256 * 3 + 44, "Sigma 18-50mm f/3.5-5.6 DC")); choices.insert (p_t (256 * 3 + 44, "Sigma 17-35mm f/2.8-4 EX DG")); - choices.insert (p_t (256 * 3 + 44, "Tamron 35-90mm f/4 AF")); + choices.insert (p_t (256 * 3 + 44, "Tamron 35-90mm f/4-5.6 AF")); choices.insert (p_t (256 * 3 + 44, "Sigma AF 18-35mm f/3.5-4.5 Aspherical")); choices.insert (p_t (256 * 3 + 46, "Sigma or Samsung Lens (3 46)")); choices.insert (p_t (256 * 3 + 46, "Sigma APO 70-200mm f/2.8 EX")); @@ -784,6 +782,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 + 8, "Irix 150mm f/2.8 Macro")); 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")); @@ -908,8 +907,9 @@ public: choices.insert (p_t (256 * 7 + 243, "smc PENTAX-DA 70mm f/2.4 Limited")); choices.insert (p_t (256 * 7 + 244, "smc PENTAX-DA 21mm f/3.2 AL Limited")); choices.insert (p_t (256 * 8 + 0, "Sigma 50-150mm f/2.8 II APO EX DC HSM")); - choices.insert (p_t (256 * 8 + 3, "Sigma AF 18-125mm f/3.5-5.6 DC")); + choices.insert (p_t (256 * 8 + 3, "Sigma 18-125mm f/3.8-5.6 DC HSM")); choices.insert (p_t (256 * 8 + 4, "Sigma 50mm f/1.4 EX DG HSM")); + choices.insert (p_t (256 * 8 + 6, "Sigma 4.5mm f/2.8 EX DC Fisheye")); choices.insert (p_t (256 * 8 + 7, "Sigma 24-70mm f/2.8 IF EX DG HSM")); choices.insert (p_t (256 * 8 + 8, "Sigma 18-250mm f/3.5-6.3 DC OS HSM")); choices.insert (p_t (256 * 8 + 11, "Sigma 10-20mm f/3.5 EX DC HSM")); @@ -920,9 +920,11 @@ public: choices.insert (p_t (256 * 8 + 16, "Sigma 70-200mm f/2.8 EX DG Macro HSM II")); choices.insert (p_t (256 * 8 + 17, "Sigma 50-500mm f/4.5-6.3 DG OS HSM")); choices.insert (p_t (256 * 8 + 18, "Sigma 8-16mm f/4.5-5.6 DC HSM")); + choices.insert (p_t (256 * 8 + 20, "Sigma 18-50mm f/2.8-4.5 DC HSM")); choices.insert (p_t (256 * 8 + 21, "Sigma 17-50mm f/2.8 EX DC OS HSM")); choices.insert (p_t (256 * 8 + 22, "Sigma 85mm f/1.4 EX DG HSM")); choices.insert (p_t (256 * 8 + 23, "Sigma 70-200mm f/2.8 APO EX DG OS HSM")); + choices.insert (p_t (256 * 8 + 24, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM")); choices.insert (p_t (256 * 8 + 25, "Sigma 17-50mm f/2.8 EX DC HSM")); choices.insert (p_t (256 * 8 + 27, "Sigma 18-200mm f/3.5-6.3 II DC HSM")); choices.insert (p_t (256 * 8 + 28, "Sigma 18-250mm f/3.5-6.3 DC Macro HSM")); @@ -938,6 +940,11 @@ public: 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 + 65, "HD PENTAX-D FA 70-210mm f/4 ED SDM WR")); + choices.insert (p_t (256 * 8 + 66, "HD PENTAX-D FA 85mm f/1.4 ED SDM AW")); + choices.insert (p_t (256 * 8 + 67, "HD PENTAX-D FA 21mm f/2.4 ED Limited DC WR")); + choices.insert (p_t (256 * 8 + 195, "HD PENTAX DA* 16-50mm f/2.8 ED PLM AW")); + choices.insert (p_t (256 * 8 + 196, "HD PENTAX-DA* 11-18mm f/2.8 ED DC 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")); @@ -992,6 +999,7 @@ public: choices.insert (p_t (256 * 22 + 3, "03 Fish-eye 3.2mm f/5.6")); 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")); + choices.insert (p_t (256 * 31 + 1, "GR Lens")); } std::string toString (const Tag* t) const override { @@ -1337,7 +1345,7 @@ public: } char buffer[32]; - sprintf (buffer, "%d", a ); + snprintf(buffer, sizeof(buffer), "%d", a ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1365,7 +1373,7 @@ public: if (a > 1.) { char buffer[32]; - sprintf (buffer, "%.2f", a / 100. ); + snprintf(buffer, sizeof(buffer), "%.2f", a / 100. ); return buffer; } else { return "n/a"; @@ -1391,11 +1399,11 @@ public: 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)); + double b = static_cast(10 * (a >> 2)) * std::pow(4.0, static_cast((a & 0x03) - 2)); - if (b > 1.f) { + if (b > 1.0) { char buffer[32]; - sprintf (buffer, "%.2f", b ); + snprintf(buffer, sizeof(buffer), "%.2f", b ); return buffer; } else { return "n/a"; @@ -1404,9 +1412,9 @@ public: 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)); + double b = static_cast(10 * (a >> 2)) * std::pow(4.0, static_cast((a & 0x03) - 2)); - if (b > 1.f) { + if (b > 1.0) { return b; } else { return 0.; @@ -1424,7 +1432,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = 100.*exp (double (a - 32) * log (2.) / 8.); - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1452,7 +1460,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } else { return "n/a"; @@ -1481,7 +1489,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = double (a - 64) / 8.; - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1501,7 +1509,7 @@ public: int a = t->toInt (0, SBYTE); char buffer[32]; double v = double (a) / 8.; - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1521,7 +1529,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = exp ((double (a) - 68.) * log (2.) / 16.); - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1541,7 +1549,7 @@ public: int a = t->toInt (0, BYTE); char buffer[32]; double v = 24.*exp (- (double (a) - 32.) * log (2.) / 8.); - sprintf (buffer, "%.6f", v ); + snprintf(buffer, sizeof(buffer), "%.6f", v ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1561,7 +1569,7 @@ public: char buffer[32]; int a = t->toInt (0, BYTE); int mina = a & 0x0F; - sprintf (buffer, "%.1f", double (int (pow (2.0, double (mina + 10) / 4.0) + 0.2))); + snprintf(buffer, sizeof(buffer), "%.1f", double (int (pow (2.0, double (mina + 10) / 4.0) + 0.2))); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1581,7 +1589,7 @@ public: char buffer[32]; int a = t->toInt (0, BYTE); int maxa = (a & 0xF0) >> 4; - sprintf (buffer, "%.1f", double (int (pow (2.0, double (maxa) / 4.0) + 0.2)) ); + snprintf(buffer, sizeof(buffer), "%.1f", double (int (pow (2.0, double (maxa) / 4.0) + 0.2)) ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -1698,7 +1706,7 @@ public: { char buffer[32]; int b = t->toInt (0, BYTE) & 0x1F; - sprintf (buffer, "%.0f", pow (2., b / 16. + 4) ); + snprintf(buffer, sizeof(buffer), "%.0f", pow (2., b / 16. + 4) ); return buffer; } }; @@ -1784,7 +1792,7 @@ public: return r->second; } else { char buffer[1024]; - t->toString (buffer); + t->toString (buffer, sizeof(buffer)); return std::string (buffer); } } @@ -2212,7 +2220,6 @@ const TagAttrib pentaxCameraInfoAttribs[] = { }; } -#endif diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 89ff6cd33..68a290eb6 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -139,7 +139,7 @@ TagDirectory* TagDirectory::getRoot() } } -const TagAttrib* TagDirectory::getAttrib (int id) +const TagAttrib* TagDirectory::getAttrib (int id) const { if (attribs) @@ -1017,13 +1017,13 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) Tag* tmake = parent->getRoot()->getTag ("Make"); if (tmake) { - tmake->toString (make); + tmake->toString (make, sizeof(make)); } Tag* tmodel = parent->getRoot()->getTag ("Model"); if (tmodel) { - tmodel->toString (model); + tmodel->toString (model, sizeof(model)); } if (!strncmp (make, "SONY", 4)) { @@ -1209,6 +1209,10 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) goto defsubdirs; } } else { + // In some circumstances, `value` may have been allocated, so + // delete it to prevent a leak. See issue + // https://github.com/Beep6581/RawTherapee/issues/6735 + delete [] value; // read value value = new unsigned char [valuesize + 1]; auto readSize = fread (value, 1, valuesize, f); @@ -1510,8 +1514,6 @@ int Tag::toInt (int ofs, TagType astype) const return attrib->interpreter->toInt (this, ofs, astype); } - int a; - if (astype == INVALID) { astype = type; } @@ -1537,10 +1539,15 @@ int Tag::toInt (int ofs, TagType astype) const case LONG: return (int)sget4 (value + ofs, getOrder()); - case SRATIONAL: - case RATIONAL: - a = (int)sget4 (value + ofs + 4, getOrder()); + case SRATIONAL: { + int a = (int)sget4 (value + ofs + 4, getOrder()); return a == 0 ? 0 : (int)sget4 (value + ofs, getOrder()) / a; + } + + case RATIONAL: { + uint32_t a = (uint32_t)sget4 (value + ofs + 4, getOrder()); + return a == 0 ? 0 : (uint32_t)sget4 (value + ofs, getOrder()) / a; + } case FLOAT: return (int)toDouble (ofs); @@ -1589,10 +1596,14 @@ double Tag::toDouble (int ofs) const return (double) ((int)sget4 (value + ofs, getOrder())); case SRATIONAL: - case RATIONAL: ud = (int)sget4 (value + ofs, getOrder()); dd = (int)sget4 (value + ofs + 4, getOrder()); - return dd == 0. ? 0. : (double)ud / (double)dd; + return dd == 0. ? 0. : ud / dd; + + case RATIONAL: + ud = (uint32_t)sget4 (value + ofs, getOrder()); + dd = (uint32_t)sget4 (value + ofs + 4, getOrder()); + return dd == 0. ? 0. : ud / dd; case FLOAT: conv.i = sget4 (value + ofs, getOrder()); @@ -1670,8 +1681,11 @@ void Tag::toRational (int& num, int& denom, int ofs) const } } -void Tag::toString (char* buffer, int ofs) const +void Tag::toString (char* buffer, std::size_t size, int ofs) const { + if (!buffer || !size) { + return; + } if (type == UNDEFINED && !directory) { bool isstring = true; @@ -1683,64 +1697,80 @@ void Tag::toString (char* buffer, int ofs) const } if (isstring) { - int j = 0; + if (size < 3) { + return; + } + + std::size_t j = 0; for (i = 0; i + ofs < count && i < 64 && value[i + ofs]; i++) { if (value[i + ofs] == '<' || value[i + ofs] == '>') { buffer[j++] = '\\'; + if (j > size - 2) { + break; + } } buffer[j++] = value[i + ofs]; + if (j > size - 2) { + break; + } } buffer[j++] = 0; return; } } else if (type == ASCII) { - sprintf (buffer, "%.64s", value + ofs); + snprintf(buffer, size, "%.64s", value + ofs); return; } size_t maxcount = rtengine::min(count, 10); - strcpy (buffer, ""); + buffer[0] = 0; for (ssize_t i = 0; i < rtengine::min(maxcount, valuesize - ofs); i++) { - if (i > 0) { + std::size_t len = strlen(buffer); + + if (i > 0 && size - len > 2) { strcat (buffer, ", "); + len += 2; } - char* b = buffer + strlen (buffer); + char* b = buffer + len; switch (type) { case UNDEFINED: case BYTE: - sprintf (b, "%d", value[i + ofs]); + snprintf(b, size - len, "%d", value[i + ofs]); break; case SSHORT: - sprintf (b, "%d", toInt (2 * i + ofs)); + snprintf(b, size - len, "%d", toInt (2 * i + ofs)); break; case SHORT: - sprintf (b, "%u", toInt (2 * i + ofs)); + snprintf(b, size - len, "%u", toInt (2 * i + ofs)); break; case SLONG: - sprintf (b, "%d", toInt (4 * i + ofs)); + snprintf(b, size - len, "%d", toInt (4 * i + ofs)); break; case LONG: - sprintf (b, "%u", toInt (4 * i + ofs)); + snprintf(b, size - len, "%u", toInt (4 * i + ofs)); break; case SRATIONAL: + snprintf(b, size - len, "%d/%d", (int)sget4 (value + 8 * i + ofs, getOrder()), (int)sget4 (value + 8 * i + ofs + 4, getOrder())); + break; + case RATIONAL: - sprintf (b, "%d/%d", (int)sget4 (value + 8 * i + ofs, getOrder()), (int)sget4 (value + 8 * i + ofs + 4, getOrder())); + snprintf(b, size - len, "%u/%u", (uint32_t)sget4 (value + 8 * i + ofs, getOrder()), (uint32_t)sget4 (value + 8 * i + ofs + 4, getOrder())); break; case FLOAT: - sprintf (b, "%g", toDouble (8 * i + ofs)); + snprintf(b, size - len, "%g", toDouble (8 * i + ofs)); break; default: @@ -1748,7 +1778,7 @@ void Tag::toString (char* buffer, int ofs) const } } - if (count > maxcount) { + if (count > maxcount && size - strlen(buffer) > 3) { strcat (buffer, "..."); } } @@ -1761,7 +1791,7 @@ std::string Tag::nameToString (int i) if (attrib) { strncpy (buffer, attrib->name, 1024); } else { - sprintf (buffer, "0x%x", tag); + snprintf(buffer, sizeof(buffer), "0x%x", tag); } if (i > 0) { @@ -1778,7 +1808,7 @@ std::string Tag::valueToString () const return attrib->interpreter->toString (this); } else { char buffer[1024]; - toString (buffer); + toString (buffer, sizeof(buffer)); return buffer; } } @@ -2344,7 +2374,7 @@ void ExifManager::parseCIFF (int length, TagDirectory* root) ev = ((short)get2 (f, INTEL)) / 32.0f; fseek (f, 34, SEEK_CUR); - if (shutter > 1e6) { + if (shutter > 1e6f) { shutter = get2 (f, INTEL) / 10.0f; } @@ -2753,7 +2783,7 @@ parse_leafdata (TagDirectory* root, ByteOrder order) &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) == 6) { char tstr[64]; - sprintf (tstr, "%04d:%02d:%02d %02d:%02d:%02d", tm.tm_year, tm.tm_mon, + snprintf(tstr, sizeof(tstr), "%04d:%02d:%02d %02d:%02d:%02d", tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); t->initString (tstr); exif->getDirectory()->addTagFront (t); @@ -3049,19 +3079,14 @@ void ExifManager::parse (bool isRaw, bool skipIgnored, bool parseJpeg) bool frameRootDetected = false; - if(!frameRootDetected) { - std::vector risTagList = root->findTags("RawImageSegmentation"); - if (!risTagList.empty()) { - for (auto ris : risTagList) { - frames.push_back(ris->getParent()); - frameRootDetected = true; + for (auto ris : root->findTags("RawImageSegmentation")) { + frames.push_back(ris->getParent()); + frameRootDetected = true; - #if PRINT_METADATA_TREE - printf("\n--------------- FRAME (RAWIMAGESEGMENTATION) ---------------\n\n"); - ris->getParent()->printAll (); - #endif - } - } +#if PRINT_METADATA_TREE + printf("\n--------------- FRAME (RAWIMAGESEGMENTATION) ---------------\n\n"); + ris->getParent()->printAll (); +#endif } if(!frameRootDetected) { @@ -3222,28 +3247,57 @@ std::vector ExifManager::getDefaultTIFFTags (TagDirectory* forthis) -int ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer) +void ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char *&buffer, unsigned &bufferSize) { // write tiff header - int offs = 6; - memcpy (buffer, "Exif\0\0", 6); + int offs = 6; // "Exif\0\0" ByteOrder order = INTEL; if (root) { order = root->getOrder (); } - sset2 ((unsigned short)order, buffer + offs, order); - offs += 2; - sset2 (42, buffer + offs, order); - offs += 2; - sset4 (8, buffer + offs, order); - TagDirectory* cl; if (root) { - cl = (const_cast (root))->clone (nullptr); + cl = root->clone(nullptr); + + // Drop unwanted tags before exporting + // For example, Nikon Z-series has a 52Kb MakerNotes->ShotInfo tag + // which does not fit into the 65Kb limit on JPEG exif tags + const Tag* const make_tag = cl->getTag(271); + if (make_tag && !std::strncmp((const char*)make_tag->getValue(), "NIKON CORPORATION", 17)) { + [cl]() + { + Tag* const exif_tag = cl->getTag(34665); + if (!exif_tag) { + return; + } + + TagDirectory* const exif_dir = exif_tag->getDirectory(); + if (!exif_dir) { + return; + } + + Tag* const make_notes_tag = exif_dir->getTag(37500); + if (!make_notes_tag) { + return; + } + + TagDirectory* const maker_notes_dir = make_notes_tag->getDirectory(); + if (!maker_notes_dir) { + return; + } + + Tag* const shot_info_tag = maker_notes_dir->getTag(145); + if (!shot_info_tag) { + return; + } + + shot_info_tag->setKeep(false); + }(); + } } else { cl = new TagDirectory (nullptr, ifdAttribs, INTEL); } @@ -3265,11 +3319,18 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::pro } cl->sort (); - int size = cl->write (8, buffer + 6); + bufferSize = cl->calculateSize() + 8 + 6; + buffer = new unsigned char[bufferSize]; // this has to be deleted in caller + memcpy (buffer, "Exif\0\0", 6); + sset2 ((unsigned short)order, buffer + offs, order); + offs += 2; + sset2 (42, buffer + offs, order); + offs += 2; + sset4 (8, buffer + offs, order); + + cl->write (8, buffer + 6); delete cl; - - return size + 6; } int ExifManager::createPNGMarker(const TagDirectory* root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize) diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index c37533352..0b44bc47a 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -145,12 +145,12 @@ public: { return tags.size (); } - const TagAttrib* getAttrib (int id); + const TagAttrib* getAttrib (int id) const; // Find a Tag by scanning the whole tag tree and stopping at the first occurrence const TagAttrib* getAttrib (const char* name); // Try to get the Tag at a given location. 'name' is a path relative to this directory (e.g. "LensInfo/FocalLength") const TagAttrib* getAttribP (const char* name); - const TagAttrib* getAttribTable() + const TagAttrib* getAttribTable() const { return attribs; } @@ -163,14 +163,14 @@ public: // Try to get the Tag in the current directory and in subdirectories // if lookUpward = true, it will scan the parents TagDirectory up to the root one, // but w/o looking into their subdirs - virtual Tag* findTag (const char* name, bool lookUpward = false) const; + Tag* findTag (const char* name, bool lookUpward = false) const; // Find a all Tags with the given name by scanning the whole tag tree std::vector findTags (const char* name); // Find a all Tags with the given ID by scanning the whole tag tree std::vector findTags (int ID); // Try to get the Tag in the current directory and in parent directories // (won't look into subdirs) - virtual Tag* findTagUpward (const char* name) const; + Tag* findTagUpward (const char* name) const; bool getXMPTagValue (const char* name, char* value) const; void keepTag (int ID); @@ -191,10 +191,10 @@ public: virtual TagDirectory* clone (TagDirectory* parent) const; 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, + void printAll (unsigned int level = 0) const; // reentrant debug function, keep level=0 on first call ! + bool CPBDump (const Glib::ustring &commFName, const Glib::ustring &imageFName, const Glib::ustring &profileFName, const Glib::ustring &defaultPParams, const CacheImageData* cfs, const bool flagMode, Glib::KeyFile *keyFile = nullptr, Glib::ustring tagDirName = "") const; - virtual void sort (); + void sort (); }; // a table of tags: id are offset from beginning and not identifiers @@ -304,7 +304,7 @@ public: 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 toString (char* buffer, std::size_t size, 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); @@ -321,7 +321,7 @@ public: Tag* clone (TagDirectory* parent) const; // to control if the tag shall be written - bool getKeep () + bool getKeep () const { return keep; } @@ -331,7 +331,7 @@ public: } // get subdirectory (there can be several, the last is NULL) - bool isDirectory () + bool isDirectory () const { return directory != nullptr; } @@ -340,7 +340,7 @@ public: return (directory) ? directory[i] : nullptr; } - MNKind getMakerNoteFormat () + MNKind getMakerNoteFormat () const { return makerNoteKind; } @@ -379,7 +379,7 @@ public: /// @param forthis The byte order will be taken from the given directory. /// @return The ownership of the return tags is passed to the caller. static std::vector getDefaultTIFFTags (TagDirectory* forthis); - static int createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer); + static void createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char *&buffer, unsigned &bufferSize); static int createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize); static int createPNGMarker(const TagDirectory *root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char *iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize); }; @@ -392,7 +392,7 @@ public: virtual std::string toString (const Tag* t) const { char buffer[1024]; - t->toString (buffer); + t->toString (buffer, sizeof(buffer)); std::string s (buffer); std::string::size_type p1 = s.find_first_not_of (' '); @@ -434,13 +434,18 @@ public: case LONG: return (double) ((int)sget4 (t->getValue() + ofs, t->getOrder())); - case SRATIONAL: - case RATIONAL: { + case SRATIONAL: { const double dividend = (int)sget4 (t->getValue() + ofs, t->getOrder()); const double divisor = (int)sget4 (t->getValue() + ofs + 4, t->getOrder()); return divisor == 0. ? 0. : dividend / divisor; } + case RATIONAL: { + const double dividend = (uint32_t)sget4 (t->getValue() + ofs, t->getOrder()); + const double divisor = (uint32_t)sget4 (t->getValue() + ofs + 4, t->getOrder()); + return divisor == 0. ? 0. : dividend / divisor; + } + case FLOAT: return double (sget4 (t->getValue() + ofs, t->getOrder())); @@ -454,8 +459,6 @@ public: // Get the value as an int virtual int toInt (const Tag* t, int ofs = 0, TagType astype = INVALID) { - int a; - if (astype == INVALID || astype == AUTO) { astype = t->getType(); } @@ -480,10 +483,15 @@ public: case LONG: return (int)sget4 (t->getValue() + ofs, t->getOrder()); - case SRATIONAL: - case RATIONAL: - a = (int)sget4 (t->getValue() + ofs + 4, t->getOrder()); + case SRATIONAL: { + int a = (int)sget4 (t->getValue() + ofs + 4, t->getOrder()); return a == 0 ? 0 : (int)sget4 (t->getValue() + ofs, t->getOrder()) / a; + } + + case RATIONAL: { + uint32_t a = (uint32_t)sget4 (t->getValue() + ofs + 4, t->getOrder()); + return a == 0 ? 0 : (uint32_t)sget4 (t->getValue() + ofs, t->getOrder()) / a; + } case FLOAT: return (int)toDouble (t, ofs); @@ -518,7 +526,7 @@ public: return r->second; } else { char buffer[1024]; - t->toString(buffer); + t->toString(buffer, sizeof(buffer)); return buffer; } } diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 4410a4051..f666d7046 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -15,8 +15,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SONYMINOLTAATTRIBS_ -#define _SONYMINOLTAATTRIBS_ #include @@ -541,7 +539,7 @@ public: }; SAAntiBlurInterpreter saAntiBlurInterpreter; -class SALensIDInterpreter : public IntLensInterpreter +class SALensIDInterpreter final : public IntLensInterpreter { public: SALensIDInterpreter () @@ -574,11 +572,12 @@ public: {23, "Minolta AF 200mm f/4 Macro APO G"}, {24, "Minolta/Sony AF 24-105mm f/3.5-4.5 (D) or Sigma or Tamron Lens"}, {24, "Sigma 18-50mm f/2.8"}, - {24, "Sigma 17-70mm f/2.8-4.5 (D)"}, + {24, "Sigma 17-70mm f/2.8-4.5 DC Macro"}, {24, "Sigma 20-40mm f/2.8 EX DG Aspherical IF"}, {24, "Sigma 18-200mm f/3.5-6.3 DC"}, {24, "Sigma DC 18-125mm f/4-5,6 D"}, {24, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, + {24, "Sigma 15-30mm f/3.5-4.5 EX DG Aspherical"}, {25, "Minolta AF 100-300mm f/4.5-5.6 APO (D) or Sigma Lens"}, {25, "Sigma 100-300mm f/4 EX (APO (D) or D IF)"}, {25, "Sigma 70mm f/2.8 EX DG Macro"}, @@ -612,8 +611,9 @@ public: {45, "Carl Zeiss Planar T* 85mm f/1.4 ZA (SAL85F14Z)"}, {46, "Carl Zeiss Vario-Sonnar T* DT 16-80mm f/3.5-4.5 ZA (SAL1680Z)"}, {47, "Carl Zeiss Sonnar T* 135mm f/1.8 ZA (SAL135F18Z)"}, - {48, "Carl Zeiss Vario-Sonnar T* 24-70mm f/2.8 ZA SSM (SAL2470Z) or ZA SSM II"}, + {48, "Carl Zeiss Vario-Sonnar T* 24-70mm f/2.8 ZA SSM (SAL2470Z) or Other Lens"}, {48, "Carl Zeiss Vario-Sonnar T* 24-70mm f/2.8 ZA SSM II (SAL2470Z2)"}, + {48, "Tamron SP 24-70mm f/2.8 Di USD"}, {49, "Sony DT 55-200mm f/4-5.6 (SAL55200)"}, {50, "Sony DT 18-250mm f/3.5-6.3 (SAL18250)"}, {51, "Sony DT 16-105mm f/3.5-5.6 (SAL16105)"}, @@ -645,7 +645,6 @@ public: {128, "Tamron or Sigma Lens (128)"}, {128, "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro"}, {128, "Tamron AF 28-300mm f/3.5-6.3 XR Di LD Aspherical [IF] Macro"}, - {128, "Tamron 80-300mm f/3.5-6.3"}, {128, "Tamron AF 28-200mm f/3.8-5.6 XR Di Aspherical [IF] Macro"}, {128, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF"}, {128, "Sigma AF 50-150mm f/2.8 EX DC APO HSM II"}, @@ -680,7 +679,7 @@ public: {137, "Cosina 70-210mm f/2.8-4 AF"}, {138, "Soligor 19-35mm f/3.5-4.5"}, {139, "Tokina AF 28-300mm f/4-6.3"}, - {142, "Voigtlander 70-300mm f/4.5-5.6"}, + {142, "Cosina AF 70-300mm f/4.5-5.6 MC"}, {146, "Voigtlander Macro APO-Lanthar 125mm f/2.5 SL"}, {194, "Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical [IF]"}, {202, "Tamron SP AF 70-200mm f/2.8 Di LD [IF] Macro"}, @@ -723,10 +722,11 @@ public: {2552, "Angenieux AF 28-70mm f/2.6"}, {2552, "Tokina AT-X 17 AF 17mm f/3.5"}, {2552, "Tokina 20-35mm f/3.5-4.5 II AF"}, - {2553, "Minolta AF 28-135mm f/4-4.5 or Sigma Lens"}, + {2553, "Minolta AF 28-135mm f/4-4.5 or Other Lens"}, {2553, "Sigma ZOOM-alpha 35-135mm f/3.5-4.5"}, {2553, "Sigma 28-105mm f/2.8-4 Aspherical"}, {2553, "Sigma 28-105mm f/4-5.6 UC"}, + {2553, "Tokina AT-X 242 AF 24-200mm f/3.5-5.6"}, {2554, "Minolta AF 35-105mm f/3.5-4.5"}, {2555, "Minolta AF 70-210mm f/4 Macro or Sigma Lens"}, {2555, "Sigma 70-210mm f/4-5.6 APO"}, @@ -805,7 +805,7 @@ public: {2624, "Minolta AF 35-80mm f/4-5.6 Power Zoom"}, {2628, "Minolta AF 80-200mm f/2.8 HS-APO G"}, {2629, "Minolta AF 85mm f/1.4 New"}, - {2631, "Minolta/Sony AF 100-300mm f/4.5-5.6 APO"}, + {2631, "Minolta AF 100-300mm f/4.5-5.6 APO"}, {2632, "Minolta AF 24-50mm f/4 New"}, {2638, "Minolta AF 50mm f/2.8 Macro New"}, {2639, "Minolta AF 100mm f/2.8 Macro"}, @@ -818,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"}, + {4568, "Tokina AF 35-200mm f/4-5.6 Zoom SD"}, {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"}, @@ -832,97 +833,6 @@ public: {6118, "Canon EF Adapter"}, {6528, "Sigma 16mm f/2.8 Filtermatic Fisheye"}, {6553, "E-Mount, T-Mount, Other Lens or no lens"}, - {6553, "Sony E 16mm f/2.8"}, - {6553, "Sony E 18-55mm f/3.5-5.6 OSS"}, - {6553, "Sony E 55-210mm f/4.5-6.3 OSS"}, - {6553, "Sony E 18-200mm f/3.5-6.3 OSS"}, - {6553, "Sony E 30mm f/3.5 Macro"}, - {6553, "Sony E 24mm f/1.8 ZA"}, - {6553, "Sony E 50mm f/1.8 OSS"}, - {6553, "Sony E 16-70mm f/4 ZA OSS"}, - {6553, "Sony E 10-18mm f/4 OSS"}, - {6553, "Sony E PZ 16-50mm f/3.5-5.6 OSS"}, - {6553, "Sony FE 35mm f/2.8 ZA"}, - {6553, "Sony FE 24-70mm f/4 ZA OSS"}, - {6553, "Sony FE 85mm f/1.8"}, - {6553, "Sony E 18-200mm f/3.5-6.3 OSS LE"}, - {6553, "Sony E 20mm f/2.8"}, - {6553, "Sony E 35mm f/1.8 OSS"}, - {6553, "Sony E PZ 18-105mm f/4 G OSS"}, - {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"}, - {6553, "Sony FE 16-35mm f/4 ZA OSS"}, - {6553, "Sony FE 50mm f/2.8 Macro"}, - {6553, "Sony FE 28-70mm f/3.5-5.6 OSS"}, - {6553, "Sony FE 35mm f/1.4 ZA"}, - {6553, "Sony FE 24-240mm f/3.5-6.3 OSS"}, - {6553, "Sony FE 28mm f/2"}, - {6553, "Sony FE PZ 28-135mm f/4 G OSS"}, - {6553, "Sony FE 100mm f/2.8 STF GM OSS"}, - {6553, "Sony E PZ 18-110mm f/4 G OSS"}, - {6553, "Sony FE 24-70mm f/2.8 GM"}, - {6553, "Sony FE 50mm f/1.4 ZA"}, - {6553, "Sony FE 85mm f/1.4 GM"}, - {6553, "Sony FE 50mm f/1.8"}, - {6553, "Sony FE 21mm f/2.8 (SEL28F20 + SEL075UWC)"}, - {6553, "Sony FE 16mm f/3.5 Fisheye (SEL28F20 + SEL057FEC)"}, - {6553, "Sony FE 70-300mm f/4.5-5.6 G OSS"}, - {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"}, - {6553, "Zeiss Batis 25mm f/2"}, - {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,10 +858,11 @@ public: {25521, "Angenieux AF 28-70mm f/2.6"}, {25521, "Tokina AT-X 17 AF 17mm f/3.5"}, {25521, "Tokina 20-35mm f/3.5-4.5 II AF"}, - {25531, "Minolta AF 28-135mm f/4-4.5 or Sigma Lens"}, + {25531, "Minolta AF 28-135mm f/4-4.5 or Other Lens"}, {25531, "Sigma ZOOM-alpha 35-135mm f/3.5-4.5"}, {25531, "Sigma 28-105mm f/2.8-4 Aspherical"}, {25531, "Sigma 28-105mm f/4-5.6 UC"}, + {25531, "Tokina AT-X 242 AF 24-200mm f/3.5-5.6"}, {25541, "Minolta AF 35-105mm f/3.5-4.5"}, {25551, "Minolta AF 70-210mm f/4 Macro or Sigma Lens"}, {25551, "Sigma 70-210mm f/4-5.6 APO"}, @@ -1030,7 +941,7 @@ public: {26241, "Minolta AF 35-80mm f/4-5.6 Power Zoom"}, {26281, "Minolta AF 80-200mm f/2.8 HS-APO G"}, {26291, "Minolta AF 85mm f/1.4 New"}, - {26311, "Minolta/Sony AF 100-300mm f/4.5-5.6 APO"}, + {26311, "Minolta AF 100-300mm f/4.5-5.6 APO"}, {26321, "Minolta AF 24-50mm f/4 New"}, {26381, "Minolta AF 50mm f/2.8 Macro New"}, {26391, "Minolta AF 100mm f/2.8 Macro"}, @@ -1043,6 +954,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"}, + {45681, "Tokina AF 35-200mm f/4-5.6 Zoom SD"}, {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"}, @@ -1057,104 +969,13 @@ public: {61184, "Canon EF Adapter"}, {65280, "Sigma 16mm f/2.8 Filtermatic Fisheye"}, {65535, "E-Mount, T-Mount, Other Lens or no lens"}, - {65535, "Sony E 16mm f/2.8"}, - {65535, "Sony E 18-55mm f/3.5-5.6 OSS"}, - {65535, "Sony E 55-210mm f/4.5-6.3 OSS"}, - {65535, "Sony E 18-200mm f/3.5-6.3 OSS"}, - {65535, "Sony E 30mm f/3.5 Macro"}, - {65535, "Sony E 24mm f/1.8 ZA"}, - {65535, "Sony E 50mm f/1.8 OSS"}, - {65535, "Sony E 16-70mm f/4 ZA OSS"}, - {65535, "Sony E 10-18mm f/4 OSS"}, - {65535, "Sony E PZ 16-50mm f/3.5-5.6 OSS"}, - {65535, "Sony FE 35mm f/2.8 ZA"}, - {65535, "Sony FE 24-70mm f/4 ZA OSS"}, - {65535, "Sony FE 85mm f/1.8"}, - {65535, "Sony E 18-200mm f/3.5-6.3 OSS LE"}, - {65535, "Sony E 20mm f/2.8"}, - {65535, "Sony E 35mm f/1.8 OSS"}, - {65535, "Sony E PZ 18-105mm f/4 G OSS"}, - {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"}, - {65535, "Sony FE 16-35mm f/4 ZA OSS"}, - {65535, "Sony FE 50mm f/2.8 Macro"}, - {65535, "Sony FE 28-70mm f/3.5-5.6 OSS"}, - {65535, "Sony FE 35mm f/1.4 ZA"}, - {65535, "Sony FE 24-240mm f/3.5-6.3 OSS"}, - {65535, "Sony FE 28mm f/2"}, - {65535, "Sony FE PZ 28-135mm f/4 G OSS"}, - {65535, "Sony FE 100mm f/2.8 STF GM OSS"}, - {65535, "Sony E PZ 18-110mm f/4 G OSS"}, - {65535, "Sony FE 24-70mm f/2.8 GM"}, - {65535, "Sony FE 50mm f/1.4 ZA"}, - {65535, "Sony FE 85mm f/1.4 GM"}, - {65535, "Sony FE 50mm f/1.8"}, - {65535, "Sony FE 21mm f/2.8 (SEL28F20 + SEL075UWC)"}, - {65535, "Sony FE 16mm f/3.5 Fisheye (SEL28F20 + SEL057FEC)"}, - {65535, "Sony FE 70-300mm f/4.5-5.6 G OSS"}, - {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"}, - {65535, "Zeiss Batis 25mm f/2"}, - {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"}, {65535, "Samyang 500mm Mirror f/8.0"}, {65535, "Pentacon Auto 135mm f/2.8"}, {65535, "Pentacon Auto 29mm f/2.8"}, - {65535, "Helios 44-2 58mm f/2.0"}, + {65535, "Helios 44-2 58mm f/2.0"} }; } @@ -1192,36 +1013,53 @@ public: }; SALensIDInterpreter saLensIDInterpreter; -class SALensID2Interpreter : public IntLensInterpreter< int > +class SALensID2Interpreter final : public IntLensInterpreter< int > { public: SALensID2Interpreter () { choices.insert (p_t (0, "Unknown E-mount lens or other lens")); + choices.insert (p_t (0, "Sigma 19mm f/2.8 [EX] DN")); + choices.insert (p_t (0, "Sigma 30mm f/2.8 [EX] DN")); + choices.insert (p_t (0, "Sigma 60mm f/2.8 DN")); + choices.insert (p_t (0, "Sony E 18-200mm f/3.5-6.3 OSS LE")); + choices.insert (p_t (0, "Tamron 18-200mm f/3.5-6.3 Di III VC")); + choices.insert (p_t (0, "Tokina FiRIN 20mm f/2 FE AF")); + choices.insert (p_t (0, "Tokina FiRIN 20mm f/2 FE MF")); + choices.insert (p_t (0, "Zeiss Touit 12mm f/2.8")); + choices.insert (p_t (0, "Zeiss Touit 32mm f/1.8")); + choices.insert (p_t (0, "Zeiss Touit 50mm f/2.8 Macro")); + choices.insert (p_t (0, "Zeiss Loxia 50mm f/2")); + choices.insert (p_t (0, "Zeiss Loxia 35mm f/2")); choices.insert (p_t (1, "Sony LA-EA1 or Sigma MC-11 Adapter")); choices.insert (p_t (2, "Sony LA-EA2 Adapter")); choices.insert (p_t (3, "Sony LA-EA3 Adapter")); choices.insert (p_t (6, "Sony LA-EA4 Adapter")); + choices.insert (p_t (7, "Sony LA-EA5 Adapter")); choices.insert (p_t (44, "Metabones Canon EF Smart Adapter")); choices.insert (p_t (78, "Metabones Canon EF Smart Adapter Mark III or Other Adapter")); + choices.insert (p_t (184, "Metabones Canon EF Speed Booster Ultra")); choices.insert (p_t (234, "Metabones Canon EF Smart Adapter Mark IV")); choices.insert (p_t (239, "Metabones Canon EF Speed Booster")); + choices.insert (p_t (24593, "LA-EA4r MonsterAdapter")); choices.insert (p_t (32784, "Sony E 16mm f/2.8")); choices.insert (p_t (32785, "Sony E 18-55mm f/3.5-5.6 OSS")); choices.insert (p_t (32786, "Sony E 55-210mm f/4.5-6.3 OSS")); choices.insert (p_t (32787, "Sony E 18-200mm f/3.5-6.3 OSS")); choices.insert (p_t (32788, "Sony E 30mm f/3.5 Macro")); - choices.insert (p_t (32789, "Sony E 24mm f/1.8 ZA or Samyang AF 50mm f/1.4 FE")); - choices.insert (p_t (32789, "Samyang AF 50mm f/1.4 FE")); - choices.insert (p_t (32790, "Sony E 50mm f/1.8 OSS or Samyang AF 14mm f/2.8 FE")); - choices.insert (p_t (32790, "Samyang AF 14mm f/2.8 FE")); + choices.insert (p_t (32789, "Sony E 24mm f/1.8 ZA or Samyang AF 50mm f/1.4")); + choices.insert (p_t (32789, "Samyang AF 50mm f/1.4")); + choices.insert (p_t (32790, "Sony E 50mm f/1.8 OSS or Samyang AF 14mm f/2.8")); + choices.insert (p_t (32790, "Samyang AF 14mm f/2.8")); 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 or Samyang AF 24mm f/2.8 FE")); - choices.insert (p_t (32794, "Samyang AF 24mm f/2.8 FE")); + choices.insert (p_t (32794, "Sony FE 35mm f/2.8 ZA or Samyang Lens")); + choices.insert (p_t (32794, "Samyang AF 24mm f/2.8")); + choices.insert (p_t (32794, "Samyang AF 35mm f/2.8")); 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 (32796, "Sony FE 85mm f/1.8 or Viltrox PFU RBMH 85mm f/1.8")); + choices.insert (p_t (32796, "Viltrox PFU RBMH 85mm f/1.8")); choices.insert (p_t (32797, "Sony E 18-200mm f/3.5-6.3 OSS LE")); choices.insert (p_t (32798, "Sony E 20mm f/2.8")); choices.insert (p_t (32799, "Sony E 35mm f/1.8 OSS")); @@ -1245,7 +1083,8 @@ public: choices.insert (p_t (32820, "Sony E PZ 18-110mm f/4 G OSS")); choices.insert (p_t (32821, "Sony FE 24-70mm f/2.8 GM")); choices.insert (p_t (32822, "Sony FE 50mm f/1.4 ZA")); - choices.insert (p_t (32823, "Sony FE 85mm f/1.4 GM")); + choices.insert (p_t (32823, "Sony FE 85mm f/1.4 GM or Samyang AF 85mm f/1.4")); + choices.insert (p_t (32823, "Samyang AF 85mm f/1.4")); choices.insert (p_t (32824, "Sony FE 50mm f/1.8")); choices.insert (p_t (32826, "Sony FE 21mm f/2.8 (SEL28F20 + SEL075UWC)")); choices.insert (p_t (32827, "Sony FE 16mm f/3.5 Fisheye (SEL28F20 + SEL057FEC)")); @@ -1255,6 +1094,28 @@ public: choices.insert (p_t (32831, "Sony FE 16-35mm f/2.8 GM")); 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 (32850, "Sony FE 135mm f/1.8 GM")); + choices.insert (p_t (32851, "Sony FE 200-600mm f/5.6-6.3 G OSS")); + choices.insert (p_t (32852, "Sony FE 600mm f/4 GM OSS")); + choices.insert (p_t (32853, "Sony E 16-55mm f/2.8 G")); + choices.insert (p_t (32854, "Sony E 70-350mm f/4.5-6.3 G OSS")); + choices.insert (p_t (32855, "Sony FE C 16-35mm T3.1 G")); + choices.insert (p_t (32858, "Sony FE 35mm f/1.8")); + choices.insert (p_t (32859, "Sony FE 20mm f/1.8 G")); + choices.insert (p_t (32860, "Sony FE 12-24mm f/2.8 GM")); + choices.insert (p_t (32862, "Sony FE 50mm f/1.2 GM")); + choices.insert (p_t (32863, "Sony FE 14mm f/1.8 GM")); + choices.insert (p_t (32864, "Sony FE 28-60mm f/4-5.6")); + choices.insert (p_t (32865, "Sony FE 35mm f/1.4 GM")); + choices.insert (p_t (32866, "Sony FE 24mm f/2.8 G")); + choices.insert (p_t (32867, "Sony FE 40mm f/2.5 G")); + choices.insert (p_t (32868, "Sony FE 50mm f/2.5 G")); + choices.insert (p_t (32871, "Sony FE PZ 16-35mm f/4 G")); + choices.insert (p_t (32873, "Sony E PZ 10-20mm f/4 G")); + choices.insert (p_t (32874, "Sony FE 70-200mm f/2.8 GM OSS II")); + choices.insert (p_t (32875, "Sony FE 24-70mm f/2.8 GM II")); + choices.insert (p_t (32876, "Sony E 11mm f/1.8")); + choices.insert (p_t (32877, "Sony E 15mm f/1.4 G")); 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)")); @@ -1262,6 +1123,10 @@ public: 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 (33081, "Sony FE 200-600mm f/5.6-6.3 G OSS + 1.4X Teleconverter")); + choices.insert (p_t (33082, "Sony FE 200-600mm f/5.6-6.3 G OSS + 2X Teleconverter")); + choices.insert (p_t (33083, "Sony FE 600mm f/4 GM OSS + 1.4X Teleconverter")); + choices.insert (p_t (33084, "Sony FE 600mm f/4 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")); @@ -1276,11 +1141,31 @@ public: 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 (49458, "Tamron 17-28mm f/2.8 Di III RXD")); + choices.insert (p_t (49459, "Tamron 35mm f/2.8 Di III OSD M1:2")); + choices.insert (p_t (49460, "Tamron 24mm f/2.8 Di III OSD M1:2")); + choices.insert (p_t (49461, "Tamron 20mm f/2.8 Di III OSD M1:2")); + choices.insert (p_t (49462, "Tamron 70-180mm f/2.8 Di III VXD")); + choices.insert (p_t (49463, "Tamron 28-200mm f/2.8-5.6 Di III RXD")); + choices.insert (p_t (49464, "Tamron 70-300mm f/4.5-6.3 Di III RXD")); + choices.insert (p_t (49465, "Tamron 17-70mm f/2.8 Di III-A VC RXD")); + choices.insert (p_t (49466, "Tamron 150-500mm f/5-6.7 Di III VC VXD")); + choices.insert (p_t (49467, "Tamron 11-20mm f/2.8 Di III-A RXD")); + choices.insert (p_t (49468, "Tamron 18-300mm f/3.5-6.3 Di III-A VC VXD")); + choices.insert (p_t (49469, "Tamron 35-150mm f/2-F2.8 Di III VXD")); + choices.insert (p_t (49470, "Tamron 28-75mm f/2.8 Di III VXD G2")); + choices.insert (p_t (49471, "Tamron 50-400mm f/4.5-6.3 Di III VC VXD")); + choices.insert (p_t (49473, "Tokina atx-m 85mm f/1.8 FE or Viltrox lens")); + choices.insert (p_t (49473, "Viltrox 23mm f/1.4 E")); + choices.insert (p_t (49473, "Viltrox 56mm f/1.4 E")); + choices.insert (p_t (49712, "Tokina FiRIN 20mm f/2 FE AF")); + choices.insert (p_t (49713, "Tokina FiRIN 100mm f/2.8 FE MACRO")); 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")); 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 (50485, "Sigma 24mm f/1.4 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")); @@ -1294,8 +1179,26 @@ public: 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 (50512, "Sigma 70-200mm f/2.8 DG OS HSM | S + MC-11")); choices.insert (p_t (50513, "Sigma 70mm f/2.8 DG MACRO | A")); + choices.insert (p_t (50514, "Sigma 45mm f/2.8 DG DN | C")); + choices.insert (p_t (50515, "Sigma 35mm f/1.2 DG DN | A")); + choices.insert (p_t (50516, "Sigma 14-24mm f/2.8 DG DN | A")); + choices.insert (p_t (50517, "Sigma 24-70mm f/2.8 DG DN | A")); + choices.insert (p_t (50518, "Sigma 100-400mm f/5-6.3 DG DN OS | C")); + choices.insert (p_t (50521, "Sigma 85mm f/1.4 DG DN | A")); + choices.insert (p_t (50522, "Sigma 105mm f/2.8 DG DN MACRO | A")); + choices.insert (p_t (50523, "Sigma 65mm f/2 DG DN | C")); + choices.insert (p_t (50524, "Sigma 35mm f/2 DG DN | C")); + choices.insert (p_t (50525, "Sigma 24mm f/3.5 DG DN | C")); + choices.insert (p_t (50526, "Sigma 28-70mm f/2.8 DG DN | C")); + choices.insert (p_t (50527, "Sigma 150-600mm f/5-6.3 DG DN OS | S")); + choices.insert (p_t (50528, "Sigma 35mm f/1.4 DG DN | A")); + choices.insert (p_t (50529, "Sigma 90mm f/2.8 DG DN | C")); + choices.insert (p_t (50530, "Sigma 24mm f/2 DG DN | C")); + choices.insert (p_t (50531, "Sigma 18-50mm f/2.8 DC DN | C")); + choices.insert (p_t (50532, "Sigma 20mm f/2 DG DN | C")); + choices.insert (p_t (50533, "Sigma 16-28mm f/2.8 DG DN | C")); choices.insert (p_t (50992, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III")); choices.insert (p_t (50993, "Voigtlander HELIAR-HYPER WIDE 10mm f/5.6")); choices.insert (p_t (50994, "Voigtlander ULTRA WIDE-HELIAR 12mm f/5.6 III")); @@ -1304,9 +1207,25 @@ public: 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 (51000, "Voigtlander NOKTON 50mm f/1.2 Aspherical")); + choices.insert (p_t (51001, "Voigtlander NOKTON 21mm f/1.4 Aspherical")); + choices.insert (p_t (51002, "Voigtlander APO-LANTHAR 50mm f/2 Aspherical")); + choices.insert (p_t (51003, "Voigtlander NOKTON 35mm f/1.2 Aspherical SE")); + choices.insert (p_t (51006, "Voigtlander APO-LANTHAR 35mm f/2 Aspherical")); + choices.insert (p_t (51504, "Samyang AF 50mm f/1.4")); + choices.insert (p_t (51505, "Samyang AF 14mm f/2.8 or Samyang AF 35mm f/2.8")); + choices.insert (p_t (51505, "Samyang AF 35mm f/2.8")); choices.insert (p_t (51507, "Samyang AF 35mm f/1.4")); + choices.insert (p_t (51508, "Samyang AF 45mm f/1.8")); + choices.insert (p_t (51510, "Samyang AF 18mm f/2.8 or Samyang AF 35mm f/1.8")); + choices.insert (p_t (51510, "Samyang AF 35mm f/1.8")); + choices.insert (p_t (51512, "Samyang AF 75mm f/1.8")); + choices.insert (p_t (51513, "Samyang AF 35mm f/1.8")); + choices.insert (p_t (51514, "Samyang AF 24mm f/1.8")); + choices.insert (p_t (51515, "Samyang AF 12mm f/2.0")); + choices.insert (p_t (51516, "Samyang AF 24-70mm f/2.8")); + choices.insert (p_t (51517, "Samyang AF 50mm f/1.4 II")); + choices.insert (p_t (51518, "Samyang AF 135mm f/1.8")); } std::string toString (const Tag* t) const override @@ -2109,7 +2028,7 @@ public: if (a > 0) { char buffer[32]; - sprintf (buffer, "%.4f", a); + snprintf(buffer, sizeof(buffer), "%.4f", a); return buffer; } else { return "n/a"; @@ -2169,7 +2088,7 @@ public: if (a) { char buffer[32]; - sprintf (buffer, "%.1f", a / 100. ); + snprintf(buffer, sizeof(buffer), "%.1f", a / 100. ); return buffer; } else { return "n/a"; @@ -2229,7 +2148,7 @@ public: if (a) { char buffer[32]; - sprintf (buffer, "%d", a ); + snprintf(buffer, sizeof(buffer), "%d", a ); return buffer; } else { return "Auto"; @@ -2252,7 +2171,7 @@ public: // Decode the value if (a && a != 254) { // 254 = 'Auto' for CameraSettings3, but we might say the same for CameraSettings & CameraSettings2 (?) - return int (expf ((double (a) / 8.f - 6.f) * logf (2.f)) * 100.f + 0.5f); + return std::exp((a / 8.f - 6.f) * std::log(2.f)) * 100.f + 0.5f; } else { return 0; } @@ -2268,7 +2187,7 @@ public: { double a = t->toDouble(); char buffer[32]; - sprintf (buffer, "%.2f", a ); + snprintf(buffer, sizeof(buffer), "%.2f", a ); return buffer; } double toDouble (const Tag* t, int ofs) override @@ -2288,7 +2207,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->getValue()[0] - 20); + snprintf(buffer, sizeof(buffer), "%d", t->getValue()[0] - 20); return buffer; } int toInt (const Tag* t, int ofs, TagType astype) override @@ -2327,7 +2246,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->getValue()[0] & 0x7f); + snprintf(buffer, sizeof(buffer), "%d", t->getValue()[0] & 0x7f); return buffer; } int toInt (const Tag* t, int ofs, TagType astype) override @@ -2383,7 +2302,7 @@ public: std::string toString (const Tag* t) const override { char buffer[32]; - sprintf (buffer, "%d", t->toInt()); + snprintf(buffer, sizeof(buffer), "%d", t->toInt()); return buffer; } int toInt (const Tag* t, int ofs, TagType astype) override @@ -2635,6 +2554,4 @@ const TagAttrib sonyCameraSettingsAttribs3[] = { {-1, AC_DONTWRITE, 0, 0, 0, AUTO, "", NULL}};*/ } -#endif - diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index 8e076152d..e6e3bb35b 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _STDATTRIBS_ -#define _STDATTRIBS_ #include #include @@ -336,7 +334,7 @@ public: return "undef"; } - sprintf (buffer, "%0.1f", v); + snprintf(buffer, sizeof(buffer), "%0.1f", v); return buffer; } }; @@ -355,7 +353,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -374,7 +372,7 @@ public: return "undef"; } - sprintf (buffer, "%+0.2f", v ); + snprintf(buffer, sizeof(buffer), "%+0.2f", v ); return buffer; } }; @@ -390,9 +388,9 @@ public: double d = pow (2.0, -t->toDouble()); if (d > 0.0 && d <= 0.5) { - sprintf (buffer, "1/%.0f", 1.0 / d); + snprintf(buffer, sizeof(buffer), "1/%.0f", 1.0 / d); } else { - sprintf (buffer, "%.1f", d); + snprintf(buffer, sizeof(buffer), "%.1f", d); } return buffer; @@ -410,9 +408,9 @@ public: double d = t->toDouble(); if (d > 0.0 && d <= 0.5) { - sprintf (buffer, "1/%.0f", 1.0 / d); + snprintf(buffer, sizeof(buffer), "1/%.0f", 1.0 / d); } else { - sprintf (buffer, "%.1f", d); + snprintf(buffer, sizeof(buffer), "%.1f", d); } return buffer; @@ -433,7 +431,7 @@ public: return "undef"; } - sprintf (buffer, "%.1f", v ); + snprintf(buffer, sizeof(buffer), "%.1f", v ); return buffer; } }; @@ -639,7 +637,7 @@ public: int lastSegmentWidth = t->toInt(4, SHORT); char buffer[32]; - sprintf (buffer, "%d %d %d", segmentNumber, segmentWidth, lastSegmentWidth); + snprintf(buffer, sizeof(buffer), "%d %d %d", segmentNumber, segmentWidth, lastSegmentWidth); return buffer; } }; @@ -927,5 +925,3 @@ const TagAttrib ifdAttribs[] = { { -1, AC_DONTWRITE, 0, nullptr, 0, AUTO, "", nullptr} }; } - -#endif diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index 4b21ce421..bd08160ae 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -34,6 +34,8 @@ set(NONCLISOURCEFILES colorappearance.cc coloredbar.cc colortoning.cc + controllines.cc + controlspotpanel.cc coordinateadjuster.cc crop.cc crophandler.cc @@ -60,6 +62,7 @@ set(NONCLISOURCEFILES exiffiltersettings.cc exifpanel.cc exportpanel.cc + externaleditorpreferences.cc extprog.cc fattaltonemap.cc filebrowser.cc @@ -90,6 +93,9 @@ set(NONCLISOURCEFILES lensgeom.cc lensprofile.cc localcontrast.cc + locallab.cc + locallabtools.cc + locallabtools2.cc lockablecolorpicker.cc lwbutton.cc lwbuttonset.cc @@ -113,6 +119,7 @@ set(NONCLISOURCEFILES popuptogglebutton.cc preferences.cc preprocess.cc + preprocesswb.cc previewhandler.cc previewloader.cc previewmodepanel.cc @@ -128,6 +135,7 @@ set(NONCLISOURCEFILES retinex.cc rgbcurves.cc rotate.cc + rtappchooserdialog.cc rtimage.cc rtscalable.cc rtsurface.cc @@ -144,6 +152,7 @@ set(NONCLISOURCEFILES softlight.cc soundman.cc splash.cc + spot.cc threadutils.cc thresholdadjuster.cc thresholdselector.cc @@ -152,7 +161,9 @@ set(NONCLISOURCEFILES thumbimageupdater.cc thumbnail.cc tonecurve.cc + toneequalizer.cc toolbar.cc + toollocationpref.cc toolpanel.cc toolpanelcoord.cc vibrance.cc @@ -164,13 +175,13 @@ set(NONCLISOURCEFILES zoompanel.cc ) -include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") +include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) if(APPLE) find_package(MacIntegration REQUIRED) # At the time of writing CMake has no module finder for gtkmacintegration so here we have it hard-coded, if installed via macports it should be in /opt/local/... - set(EXTRA_LIB_RTGUI ${MacIntegration_LIBRARIES}) - set(EXTRA_INCDIR ${EXTRA_INCDIR} ${MacIntegration_INCLUDE_DIRS}) + set(EXTRA_LIB_RTGUI "${MacIntegration_LIBRARIES}") + set(EXTRA_INCDIR "${EXTRA_INCDIR}" "${MacIntegration_INCLUDE_DIRS}") endif() if(WIN32) @@ -186,6 +197,7 @@ if(WIN32) ${GTK_INCLUDE_DIRS} ${LENSFUN_INCLUDE_DIRS} ${RSVG_INCLUDE_DIRS} + ${TIFF_INCLUDE_DIRS} ) link_directories(. "${PROJECT_SOURCE_DIR}/rtexif" ${EXTRA_LIBDIR} @@ -197,6 +209,7 @@ if(WIN32) ${GTK_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS} ${RSVG_LIBRARY_DIRS} + ${TIFF_LIBRARY_DIRS} ) else() include_directories(${EXTRA_INCDIR} @@ -215,6 +228,7 @@ else() ${LCMS_INCLUDE_DIRS} ${LENSFUN_INCLUDE_DIRS} ${RSVG_INCLUDE_DIRS} + ${TIFF_INCLUDE_DIRS} ) link_directories(${EXTRA_LIBDIR} ${CANBERRA-GTK_LIBRARY_DIRS} @@ -232,20 +246,21 @@ else() ${LCMS_LIBRARY_DIRS} ${LENSFUN_LIBRARY_DIRS} ${RSVG_LIBRARY_DIRS} + ${TIFF_LIBRARY_DIRS} ) endif() # Excluding libatomic needed by Clang/FreeBSD, #3636 -if(OPENMP_FOUND AND NOT APPLE AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") - set(EXTRA_LIB_RTGUI ${EXTRA_LIB_RTGUI} "atomic") +if(OPENMP_FOUND AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") + 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") # Create new executables targets -add_executable(rth ${EXTRA_SRC_NONCLI} ${NONCLISOURCEFILES}) -add_executable(rth-cli ${EXTRA_SRC_CLI} ${CLISOURCEFILES}) +add_executable(rth "${EXTRA_SRC_NONCLI}" "${NONCLISOURCEFILES}") +add_executable(rth-cli "${EXTRA_SRC_CLI}" "${CLISOURCEFILES}") # Add dependencies to executables targets add_dependencies(rth UpdateInfo) @@ -311,5 +326,5 @@ target_link_libraries(rth-cli rtengine ) # Install executables -install(TARGETS rth DESTINATION ${BINDIR}) -install(TARGETS rth-cli DESTINATION ${BINDIR}) +install(TARGETS rth DESTINATION "${BINDIR}") +install(TARGETS rth-cli DESTINATION "${BINDIR}") diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 05150517f..d0d24fa76 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -10,6 +10,9 @@ enum { ADDSET_SH_HIGHLIGHTS, ADDSET_SH_SHADOWS, ADDSET_SH_LOCALCONTRAST, // not used anymore + ADDSET_TONE_EQUALIZER_BANDS, + ADDSET_TONE_EQUALIZER_PIVOT, + ADDSET_TONE_EQUALIZER_REGULARIZATION, ADDSET_LC_BRIGHTNESS, ADDSET_LC_CONTRAST, ADDSET_SHARP_AMOUNT, @@ -18,6 +21,12 @@ enum { ADDSET_ROTATE_DEGREE, ADDSET_DIST_AMOUNT, ADDSET_PERSPECTIVE, + ADDSET_PERSP_CAM_ANGLE, + ADDSET_PERSP_CAM_FOCAL_LENGTH, + ADDSET_PERSP_CAM_SHIFT, + ADDSET_PERSP_PROJ_ANGLE, + ADDSET_PERSP_PROJ_ROTATE, + ADDSET_PERSP_PROJ_SHIFT, ADDSET_CA, ADDSET_VIGN_AMOUNT, ADDSET_VIGN_RADIUS, @@ -59,6 +68,8 @@ enum { ADDSET_CAT_CHROMA_S, ADDSET_CAT_CHROMA_M, ADDSET_CAT_HUE, + ADDSET_CAT_DEGREEOUT, + ADDSET_CAT_TEMPOUT, ADDSET_CAT_BADPIX, ADDSET_WB_EQUAL, ADDSET_GRADIENT_DEGREE, @@ -84,6 +95,7 @@ enum { ADDSET_WA_SKINPROTECT, ADDSET_WA_THRR, ADDSET_WA_THRRH, + ADDSET_WA_RADIUS, ADDSET_WA_THRES, ADDSET_WA_THRESHOLD, ADDSET_WA_THRESHOLD2, @@ -101,6 +113,8 @@ enum { ADDSET_WA_EDGEDETECTTHR, ADDSET_WA_EDGEDETECTTHR2, ADDSET_WA_TMRS, + ADDSET_WA_EDGS, + ADDSET_WA_SCALE, ADDSET_WA_GAMMA, ADDSET_RETI_STR, ADDSET_RETI_NEIGH, diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 142374213..49a5ed21b 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -36,7 +36,7 @@ double one2one(double val) } } -Adjuster::Adjuster ( +Adjuster::Adjuster( Glib::ustring vlabel, double vmin, double vmax, @@ -45,21 +45,21 @@ Adjuster::Adjuster ( Gtk::Image *imgIcon1, Gtk::Image *imgIcon2, double2double_fun slider2value, - double2double_fun value2slider) - - : - + double2double_fun value2slider +) : adjustmentName(std::move(vlabel)), grid(nullptr), label(nullptr), imageIcon1(imgIcon1), + imageIcon2(imgIcon2), automatic(nullptr), adjusterListener(nullptr), + spinChange(options.adjusterMinDelay, options.adjusterMaxDelay), + sliderChange(options.adjusterMinDelay, options.adjusterMaxDelay), editedCheckBox(nullptr), afterReset(false), blocked(false), addMode(false), - eventPending(false), vMin(vmin), vMax(vmax), vStep(vstep), @@ -67,8 +67,7 @@ Adjuster::Adjuster ( logPivot(0), logAnchorMiddle(false), value2slider(value2slider ? value2slider : &one2one), - slider2value(slider2value ? slider2value : &one2one), - delay(options.adjusterMinDelay) + slider2value(slider2value ? slider2value : &one2one) { set_hexpand(true); @@ -78,8 +77,8 @@ Adjuster::Adjuster ( setExpandAlignProperties(imageIcon1, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); } - if (imgIcon2) { - setExpandAlignProperties(imgIcon2, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + if (imageIcon2) { + setExpandAlignProperties(imageIcon2, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); } set_column_spacing(0); @@ -122,9 +121,9 @@ Adjuster::Adjuster ( attach_next_to(*imageIcon1, *slider, Gtk::POS_LEFT, 1, 1); } - if (imgIcon2) { - attach_next_to(*imgIcon2, *slider, Gtk::POS_RIGHT, 1, 1); - attach_next_to(*spin, *imgIcon2, Gtk::POS_RIGHT, 1, 1); + if (imageIcon2) { + attach_next_to(*imageIcon2, *slider, Gtk::POS_RIGHT, 1, 1); + attach_next_to(*spin, *imageIcon2, Gtk::POS_RIGHT, 1, 1); } else { attach_next_to(*spin, *slider, Gtk::POS_RIGHT, 1, 1); } @@ -134,7 +133,7 @@ Adjuster::Adjuster ( // A label is provided, spreading the widgets in 2 rows attach_next_to(*label, Gtk::POS_LEFT, 1, 1); attach_next_to(*spin, Gtk::POS_RIGHT, 1, 1); - // A second HBox is necessary + // A second Grid is necessary grid = Gtk::manage(new Gtk::Grid()); grid->attach_next_to(*slider, Gtk::POS_LEFT, 1, 1); @@ -142,9 +141,9 @@ Adjuster::Adjuster ( grid->attach_next_to(*imageIcon1, *slider, Gtk::POS_LEFT, 1, 1); } - if (imgIcon2) { - grid->attach_next_to(*imgIcon2, Gtk::POS_RIGHT, 1, 1); - grid->attach_next_to(*reset, *imgIcon2, Gtk::POS_RIGHT, 1, 1); + if (imageIcon2) { + grid->attach_next_to(*imageIcon2, Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*reset, *imageIcon2, Gtk::POS_RIGHT, 1, 1); } else { grid->attach_next_to(*reset, *slider, Gtk::POS_RIGHT, 1, 1); } @@ -155,8 +154,27 @@ Adjuster::Adjuster ( defaultVal = ctorDefaultVal = shapeValue(vdefault); editedState = defEditedState = Irrelevant; - sliderChange = slider->signal_value_changed().connect( sigc::mem_fun(*this, &Adjuster::sliderChanged) ); - spinChange = spin->signal_value_changed().connect( sigc::mem_fun(*this, &Adjuster::spinChanged), true); + spinChange.connect( + spin->signal_value_changed(), + sigc::mem_fun(*this, &Adjuster::spinChanged), + [this]() + { + sliderChange.block(true); + setSliderValue(addMode ? spin->get_value() : this->value2slider(spin->get_value())); + sliderChange.block(false); + } + ); + sliderChange.connect( + slider->signal_value_changed(), + sigc::mem_fun(*this, &Adjuster::sliderChanged), + [this]() + { + spinChange.block(); + const double v = shapeValue(getSliderValue()); + spin->set_value(addMode ? v : this->slider2value(v)); + spinChange.unblock(); + } + ); reset->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &Adjuster::resetPressed) ); show_all(); @@ -165,9 +183,8 @@ Adjuster::Adjuster ( Adjuster::~Adjuster () { - sliderChange.block(true); - spinChange.block(true); - delayConnection.block(true); + sliderChange.block(); + spinChange.block(); adjusterListener = nullptr; } @@ -182,7 +199,7 @@ void Adjuster::addAutoButton (const Glib::ustring &tooltip) autoChange = automatic->signal_toggled().connect( sigc::mem_fun(*this, &Adjuster::autoToggled) ); if (grid) { - // Hombre, adding the checbox next to the reset button because adding it next to the spin button (as before) + // Hombre, adding the checkbox next to the reset button because adding it next to the spin button (as before) // would diminish the available size for the label and would require a much heavier reorganization of the grid ! grid->attach_next_to(*automatic, *reset, Gtk::POS_RIGHT, 1, 1); } else { @@ -211,8 +228,6 @@ void Adjuster::throwOnButtonRelease(bool throwOnBRelease) buttonReleaseSpin.disconnect(); } } - - eventPending = false; } void Adjuster::setDefault (double def) @@ -239,9 +254,7 @@ void Adjuster::sliderReleased (GdkEventButton* event) { if ((event != nullptr) && (event->button == 1)) { - if (delayConnection.connected()) { - delayConnection.disconnect(); - } + sliderChange.cancel(); notifyListener(); } @@ -250,10 +263,8 @@ void Adjuster::sliderReleased (GdkEventButton* event) void Adjuster::spinReleased (GdkEventButton* event) { - if ((event != nullptr) && delay == 0) { - if (delayConnection.connected()) { - delayConnection.disconnect(); - } + if (event) { + spinChange.cancel(); notifyListener(); } @@ -351,31 +362,15 @@ void Adjuster::setAddMode(bool addM) } } -void Adjuster::spinChanged () +void Adjuster::spinChanged() { - if (delayConnection.connected()) { - delayConnection.disconnect(); - } - - sliderChange.block(true); - setSliderValue(addMode ? spin->get_value() : value2slider(spin->get_value())); - sliderChange.block(false); - - if (delay == 0) { - if (adjusterListener && !blocked) { - if (!buttonReleaseSlider.connected() || afterReset) { - eventPending = false; - if (automatic) { - setAutoValue(false); - } - adjusterListener->adjusterChanged(this, spin->get_value()); - } else { - eventPending = true; + if (adjusterListener && !blocked) { + if (!buttonReleaseSlider.connected() || afterReset) { + if (automatic) { + setAutoValue(false); } + adjusterListener->adjusterChanged(this, spin->get_value()); } - } else { - eventPending = true; - delayConnection = Glib::signal_timeout().connect(sigc::mem_fun(*this, &Adjuster::notifyListener), delay); } if (editedState == UnEdited) { @@ -393,31 +388,13 @@ void Adjuster::spinChanged () void Adjuster::sliderChanged () { - - if (delayConnection.connected()) { - delayConnection.disconnect(); - } - - spinChange.block(true); - const double v = shapeValue(getSliderValue()); - spin->set_value(addMode ? v : slider2value(v)); - spinChange.block(false); - - if (delay == 0 || afterReset) { - if (adjusterListener && !blocked) { - if (!buttonReleaseSlider.connected() || afterReset) { - eventPending = false; - if (automatic) { - setAutoValue(false); - } - adjusterListener->adjusterChanged(this, spin->get_value()); - } else { - eventPending = true; + if (adjusterListener && !blocked) { + if (!buttonReleaseSlider.connected() || afterReset) { + if (automatic) { + setAutoValue(false); } + adjusterListener->adjusterChanged(this, spin->get_value()); } - } else { - eventPending = true; - delayConnection = Glib::signal_timeout().connect(sigc::mem_fun(*this, &Adjuster::notifyListener), delay); } if (!afterReset && editedState == UnEdited) { @@ -435,12 +412,12 @@ void Adjuster::sliderChanged () void Adjuster::setValue (double a) { - spinChange.block(true); + spinChange.block(); sliderChange.block(true); spin->set_value(shapeValue(a)); setSliderValue(addMode ? shapeValue(a) : value2slider(shapeValue(a))); sliderChange.block(false); - spinChange.block(false); + spinChange.unblock(); afterReset = false; } @@ -455,16 +432,13 @@ void Adjuster::setAutoValue (bool a) bool Adjuster::notifyListener () { - - if (eventPending && adjusterListener != nullptr && !blocked) { + if (adjusterListener != nullptr && !blocked) { if (automatic) { setAutoValue(false); } adjusterListener->adjusterChanged(this, spin->get_value()); } - eventPending = false; - return false; } @@ -555,8 +529,6 @@ void Adjuster::editedToggled () } adjusterListener->adjusterChanged(this, spin->get_value()); } - - eventPending = false; } void Adjuster::trimValue (double &val) const @@ -706,3 +678,21 @@ bool Adjuster::getAddMode() const { return addMode; } + +void Adjuster::setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms) +{ + spinChange.setDelay(min_delay_ms, max_delay_ms); + sliderChange.setDelay(min_delay_ms, max_delay_ms); +} + +void Adjuster::showIcons(bool yes) +{ + if (imageIcon1) { + imageIcon1->set_visible(yes); + imageIcon1->set_no_show_all(!yes); + } + if (imageIcon2) { + imageIcon2->set_visible(yes); + imageIcon2->set_no_show_all(!yes); + } +} diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index 59250bc81..76b46b094 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -19,6 +19,7 @@ #pragma once #include "editedstate.h" +#include "delayed.h" #include "guiutils.h" class Adjuster; @@ -33,22 +34,21 @@ public: typedef double(*double2double_fun)(double val); -class Adjuster : public Gtk::Grid +class Adjuster final : public Gtk::Grid { - protected: Glib::ustring adjustmentName; Gtk::Grid* grid; Gtk::Label* label; Gtk::Image *imageIcon1; + Gtk::Image *imageIcon2; MyHScale* slider; MySpinButton* spin; Gtk::Button* reset; Gtk::CheckButton* automatic; AdjusterListener* adjusterListener; - sigc::connection delayConnection; - sigc::connection spinChange; - sigc::connection sliderChange; + DelayedConnection<> spinChange; + DelayedConnection<> sliderChange; sigc::connection editedChange; sigc::connection autoChange; sigc::connection buttonReleaseSlider; @@ -62,7 +62,6 @@ protected: bool afterReset; bool blocked; bool addMode; - bool eventPending; double vMin; double vMax; double vStep; @@ -78,11 +77,18 @@ protected: 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); - ~Adjuster () override; + 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 + ); + ~Adjuster() override; // Add an "Automatic" checkbox next to the reset button. void addAutoButton(const Glib::ustring &tooltip = ""); @@ -127,4 +133,6 @@ public: void trimValue (float &val) const; void trimValue (int &val) const; void setLogScale(double base, double pivot, bool anchorMiddle = false); + void setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms = 0); + void showIcons(bool yes); }; diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 8b4583877..4e25475f0 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -264,6 +264,7 @@ bool BatchQueue::saveBatchQueue () << saveFormat.tiffBits << '|' << (saveFormat.tiffFloat ? 1 : 0) << '|' << saveFormat.tiffUncompressed << '|' << saveFormat.saveParams << '|' << entry->forceFormatOpts << '|' << entry->fast_pipeline << '|' + << saveFormat.bigTiff << '|' << std::endl; } } @@ -331,6 +332,7 @@ bool BatchQueue::loadBatchQueue () const auto saveParams = nextIntOr (options.saveFormat.saveParams); const auto forceFormatOpts = nextIntOr (options.forceFormatOpts); const auto fast = nextIntOr(false); + const auto bigTiff = nextIntOr (options.saveFormat.bigTiff); rtengine::procparams::ProcParams pparams; @@ -344,8 +346,9 @@ bool BatchQueue::loadBatchQueue () auto job = rtengine::ProcessingJob::create (source, thumb->getType () == FT_Raw, pparams, fast); - const auto prevh = getMaxThumbnailHeight (); - const auto prevw = thumb->getThumbnailWidth(prevh, &pparams); + auto prevh = getMaxThumbnailHeight(); + auto prevw = prevh; + thumb->getThumbnailSize(prevw, prevh, &pparams); auto entry = new BatchQueueEntry (job, pparams, source, prevw, prevh, thumb, options.overwriteOutputFile); thumb->decreaseRef (); // Removing the refCount acquired by cacheMgr->getEntry @@ -369,6 +372,7 @@ bool BatchQueue::loadBatchQueue () saveFormat.tiffBits = tiffBits; saveFormat.tiffFloat = tiffFloat == 1; saveFormat.tiffUncompressed = tiffUncompressed != 0; + saveFormat.bigTiff = bigTiff != 0; saveFormat.saveParams = saveParams != 0; entry->forceFormatOpts = forceFormatOpts != 0; } else { @@ -390,7 +394,7 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring &filenam timeval tv; gettimeofday(&tv, nullptr); char mseconds[11]; - sprintf(mseconds, "%d", (int)(tv.tv_usec / 1000)); + snprintf(mseconds, sizeof(mseconds), "%d", (int)(tv.tv_usec / 1000)); time_t rawtime; struct tm *timeinfo; char stringTimestamp [80]; @@ -692,14 +696,20 @@ rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) int err = 0; if (saveFormat.format == "tif") { - err = img->saveAsTIFF (fname, saveFormat.tiffBits, saveFormat.tiffFloat, saveFormat.tiffUncompressed); + err = img->saveAsTIFF ( + fname, + saveFormat.tiffBits, + saveFormat.tiffFloat, + saveFormat.tiffUncompressed, + saveFormat.bigTiff + ); } else if (saveFormat.format == "png") { err = img->saveAsPNG (fname, saveFormat.pngBits); } else if (saveFormat.format == "jpg") { err = img->saveAsJPEG (fname, saveFormat.jpegQuality, saveFormat.jpegSubSamp); } - img->free (); + delete img; if (err) { throw Glib::FileError(Glib::FileError::FAILED, M("MAIN_MSG_CANNOTSAVE") + "\n" + fname); diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index 90079b2cc..7499fb63b 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -34,7 +34,7 @@ bool BatchQueueEntry::iconsLoaded(false); Glib::RefPtr BatchQueueEntry::savedAsIcon; BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine::procparams::ProcParams& pparams, Glib::ustring fname, int prevw, int prevh, Thumbnail* thm, bool overwrite) : - ThumbBrowserEntryBase(fname), + ThumbBrowserEntryBase(fname, thm), opreview(nullptr), origpw(prevw), origph(prevh), @@ -106,8 +106,12 @@ void BatchQueueEntry::refreshThumbnailImage () void BatchQueueEntry::calcThumbnailSize () { - prew = preh * origpw / origph; + if (prew > options.maxThumbnailWidth) { + const float s = static_cast(options.maxThumbnailWidth) / prew; + prew = options.maxThumbnailWidth; + preh = std::max(preh * s, 1); + } } @@ -197,6 +201,9 @@ std::tuple BatchQueueEntry::getToolTip (int x, int y) const if (saveFormat.tiffUncompressed) { tooltip += Glib::ustring::compose("\n%1", M("SAVEDLG_TIFFUNCOMPRESSED")); } + if (saveFormat.bigTiff) { + tooltip += Glib::ustring::compose("\n%1", M("SAVEDLG_BIGTIFF")); + } } } } @@ -261,9 +268,8 @@ void BatchQueueEntry::_updateImage (guint8* img, int w, int h) MYWRITERLOCK(l, lockRW); prew = w; - assert (preview == nullptr); - preview = new guint8 [prew * preh * 3]; - memcpy (preview, img, prew * preh * 3); + preview.resize(prew * preh * 3); + std::copy(img, img + preview.size(), preview.begin()); if (parent) { parent->redrawNeeded (this); diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index c4cd48615..f06b65046 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -50,7 +50,7 @@ struct BatchQueueEntryIdleHelper { int pending; }; -class BatchQueueEntry : public ThumbBrowserEntryBase, public BQEntryUpdateListener, public rtengine::NonCopyable +class BatchQueueEntry final : public ThumbBrowserEntryBase, public BQEntryUpdateListener, public rtengine::NonCopyable { guint8* opreview; diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index f7a73a30b..8a6dd25b4 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -42,10 +42,10 @@ static Glib::ustring makeFolderLabel(Glib::ustring path) BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) { - + set_orientation(Gtk::ORIENTATION_VERTICAL); batchQueue = Gtk::manage( new BatchQueue(aFileCatalog) ); - Gtk::VBox* batchQueueButtonBox = Gtk::manage (new Gtk::VBox); + Gtk::Box* batchQueueButtonBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); batchQueueButtonBox->set_name("BatchQueueButtons"); qStartStop = Gtk::manage (new Gtk::Switch()); @@ -61,12 +61,14 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) 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_QUEUE"))); + bbox->set_label_align(0.025, 0.5); bbox->add(*batchQueueButtonBox); // Output directory selection fdir = Gtk::manage (new Gtk::Frame (M("QUEUE_LOCATION_TITLE"))); - Gtk::VBox* odvb = Gtk::manage (new Gtk::VBox ()); - Gtk::HBox* hb2 = Gtk::manage (new Gtk::HBox ()); + fdir->set_label_align(0.025, 0.5); + Gtk::Box* odvb = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* hb2 = Gtk::manage (new Gtk::Box ()); useTemplate = Gtk::manage (new Gtk::RadioButton (M("QUEUE_LOCATION_TEMPLATE") + ":")); hb2->pack_start (*useTemplate, Gtk::PACK_SHRINK, 4); outdirTemplate = Gtk::manage (new Gtk::Entry ()); @@ -74,7 +76,7 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) odvb->pack_start (*hb2, Gtk::PACK_SHRINK, 4); outdirTemplate->set_tooltip_markup (M("QUEUE_LOCATION_TEMPLATE_TOOLTIP")); useTemplate->set_tooltip_markup (M("QUEUE_LOCATION_TEMPLATE_TOOLTIP")); - Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb3 = Gtk::manage (new Gtk::Box ()); useFolder = Gtk::manage (new Gtk::RadioButton (M("QUEUE_LOCATION_FOLDER") + ":")); hb3->pack_start (*useFolder, Gtk::PACK_SHRINK, 4); @@ -112,6 +114,7 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) // Output file format selection fformat = Gtk::manage (new Gtk::Frame (M("QUEUE_FORMAT_TITLE"))); + fformat->set_label_align(0.025, 0.5); saveFormatPanel = Gtk::manage (new SaveFormatPanel ()); setExpandAlignProperties(saveFormatPanel, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); fformat->add (*saveFormatPanel); @@ -127,7 +130,7 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) saveFormatPanel->setListener (this); // setup button bar - topBox = Gtk::manage (new Gtk::HBox ()); + topBox = Gtk::manage (new Gtk::Box ()); pack_start (*topBox, Gtk::PACK_SHRINK); topBox->set_name("BatchQueueButtonsMainContainer"); @@ -139,12 +142,12 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) pack_start (*batchQueue); // lower box with thumbnail zoom - bottomBox = Gtk::manage (new Gtk::HBox ()); + bottomBox = Gtk::manage (new Gtk::Box ()); pack_start (*bottomBox, Gtk::PACK_SHRINK); // thumbnail zoom - Gtk::HBox* zoomBox = Gtk::manage (new Gtk::HBox ()); - zoomBox->pack_start (*Gtk::manage (new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + Gtk::Box* zoomBox = Gtk::manage (new Gtk::Box ()); + zoomBox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK, 4); Gtk::Label* zoomLabel = Gtk::manage (new Gtk::Label (Glib::ustring("") + M("FILEBROWSER_THUMBSIZE") + ":")); zoomLabel->set_use_markup (true); zoomBox->pack_start (*zoomLabel, Gtk::PACK_SHRINK, 4); diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 7c0a367d4..db4e243e9 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -30,7 +30,7 @@ class RTWindow; class FileCatalog; class Thumbnail; -class BatchQueuePanel : public Gtk::VBox, +class BatchQueuePanel : public Gtk::Box, public BatchQueueListener, public FormatChangeListener { @@ -51,8 +51,8 @@ class BatchQueuePanel : public Gtk::VBox, RTWindow* parent; BatchQueue* batchQueue; - Gtk::HBox* bottomBox; - Gtk::HBox* topBox; + Gtk::Box* bottomBox; + Gtk::Box* topBox; std::atomic queueShouldRun; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 2824a285c..4383ccb74 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -62,7 +62,8 @@ void BatchToolPanelCoordinator::selectionChanged (const std::vector& void BatchToolPanelCoordinator::closeSession (bool save) { - pparamsEdited.set (false); + // Should remain commented for Locallab to work + // pparamsEdited.set (false); for (size_t i = 0; i < selected.size(); i++) { selected[i]->removeThumbnailListener (this); @@ -139,7 +140,7 @@ void BatchToolPanelCoordinator::initSession () if (selected.size() == 1) { for (size_t i = 0; i < toolPanels.size(); i++) { - toolPanels.at(i)->setMultiImage(false); + toolPanels.at (i)->setMultiImage (false); } toneCurve->setAdjusterBehavior (false, false, false, false, false, false, false, false); @@ -147,11 +148,11 @@ void BatchToolPanelCoordinator::initSession () whitebalance->setAdjusterBehavior (false, false, false, false); vibrance->setAdjusterBehavior (false, false); vignetting->setAdjusterBehavior (false, false, false, false); - colorappearance->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false); + colorappearance->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); rotate->setAdjusterBehavior (false); resize->setAdjusterBehavior (false); distortion->setAdjusterBehavior (false); - perspective->setAdjusterBehavior (false); + perspective->setAdjusterBehavior (false, false, false, false, false, false, false); gradient->setAdjusterBehavior (false, false, false, false); pcvignette->setAdjusterBehavior (false, false, false); cacorrection->setAdjusterBehavior (false); @@ -171,20 +172,20 @@ void BatchToolPanelCoordinator::initSession () shadowshighlights->setAdjusterBehavior (false, false); dirpyrequalizer->setAdjusterBehavior (false, false, false); - wavelet->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); + wavelet->setAdjusterBehavior (false, false, false, 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); + flatfield->setAdjusterBehavior (false); rawexposure->setAdjusterBehavior (false); bayerrawexposure->setAdjusterBehavior (false); xtransrawexposure->setAdjusterBehavior (false); } else { for (size_t i = 0; i < toolPanels.size(); i++) { - toolPanels.at(i)->setMultiImage(true); + toolPanels.at (i)->setMultiImage (true); } toneCurve->setAdjusterBehavior (options.baBehav[ADDSET_TC_EXPCOMP], options.baBehav[ADDSET_TC_HLCOMPAMOUNT], options.baBehav[ADDSET_TC_HLCOMPTHRESH], options.baBehav[ADDSET_TC_BRIGHTNESS], options.baBehav[ADDSET_TC_BLACKLEVEL], options.baBehav[ADDSET_TC_SHCOMP], options.baBehav[ADDSET_TC_CONTRAST], options.baBehav[ADDSET_TC_SATURATION]); @@ -192,11 +193,11 @@ void BatchToolPanelCoordinator::initSession () whitebalance->setAdjusterBehavior (options.baBehav[ADDSET_WB_TEMPERATURE], options.baBehav[ADDSET_WB_GREEN], options.baBehav[ADDSET_WB_EQUAL], options.baBehav[ADDSET_WB_TEMPBIAS]); vibrance->setAdjusterBehavior (options.baBehav[ADDSET_VIBRANCE_PASTELS], options.baBehav[ADDSET_VIBRANCE_SATURATED]); vignetting->setAdjusterBehavior (options.baBehav[ADDSET_VIGN_AMOUNT], options.baBehav[ADDSET_VIGN_RADIUS], options.baBehav[ADDSET_VIGN_STRENGTH], options.baBehav[ADDSET_VIGN_CENTER]); - colorappearance->setAdjusterBehavior (options.baBehav[ADDSET_CAT_DEGREE], options.baBehav[ADDSET_CAT_ADAPTSCENE], options.baBehav[ADDSET_CAT_ADAPTVIEWING], options.baBehav[ADDSET_CAT_BADPIX], options.baBehav[ADDSET_CAT_LIGHT], options.baBehav[ADDSET_CAT_CHROMA], options.baBehav[ADDSET_CAT_CONTRAST], options.baBehav[ADDSET_CAT_RSTPRO], options.baBehav[ADDSET_CAT_BRIGHT], options.baBehav[ADDSET_CAT_CONTRAST_Q], options.baBehav[ADDSET_CAT_CHROMA_S], options.baBehav[ADDSET_CAT_CHROMA_M], options.baBehav[ADDSET_CAT_HUE]); + colorappearance->setAdjusterBehavior (options.baBehav[ADDSET_CAT_DEGREE], options.baBehav[ADDSET_CAT_ADAPTSCENE], options.baBehav[ADDSET_CAT_ADAPTVIEWING], options.baBehav[ADDSET_CAT_BADPIX], options.baBehav[ADDSET_CAT_LIGHT], options.baBehav[ADDSET_CAT_CHROMA], options.baBehav[ADDSET_CAT_CONTRAST], options.baBehav[ADDSET_CAT_RSTPRO], options.baBehav[ADDSET_CAT_BRIGHT], options.baBehav[ADDSET_CAT_CONTRAST_Q], options.baBehav[ADDSET_CAT_CHROMA_S], options.baBehav[ADDSET_CAT_CHROMA_M], options.baBehav[ADDSET_CAT_HUE],options.baBehav[ADDSET_CAT_DEGREEOUT], options.baBehav[ADDSET_CAT_TEMPOUT] ); rotate->setAdjusterBehavior (options.baBehav[ADDSET_ROTATE_DEGREE]); resize->setAdjusterBehavior (options.baBehav[ADDSET_RESIZE_SCALE]); distortion->setAdjusterBehavior (options.baBehav[ADDSET_DIST_AMOUNT]); - perspective->setAdjusterBehavior (options.baBehav[ADDSET_PERSPECTIVE]); + perspective->setAdjusterBehavior (options.baBehav[ADDSET_PERSPECTIVE], options.baBehav[ADDSET_PERSP_CAM_FOCAL_LENGTH], options.baBehav[ADDSET_PERSP_CAM_SHIFT], options.baBehav[ADDSET_PERSP_CAM_ANGLE], options.baBehav[ADDSET_PERSP_PROJ_ANGLE], options.baBehav[ADDSET_PERSP_PROJ_SHIFT], options.baBehav[ADDSET_PERSP_PROJ_ROTATE]); 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]); @@ -218,14 +219,15 @@ void BatchToolPanelCoordinator::initSession () chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] ); blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES], options.baBehav[ADDSET_BLACKWHITE_GAMMA]); shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS]); + toneEqualizer->setAdjusterBehavior(options.baBehav[ADDSET_TONE_EQUALIZER_BANDS], options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION], options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT]); 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]); + 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_EDGS], options.baBehav[ADDSET_WA_SCALE], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_RADIUS], 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]); + flatfield->setAdjusterBehavior (options.baBehav[ADDSET_RAWFFCLIPCONTROL]); rawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_LINEAR]); bayerrawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_BLACKS]); xtransrawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_BLACKS]); @@ -241,6 +243,9 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_TC_SATURATION]) { pparams.toneCurve.saturation = 0;} if (options.baBehav[ADDSET_SH_HIGHLIGHTS]) { pparams.sh.highlights = 0; } if (options.baBehav[ADDSET_SH_SHADOWS]) { pparams.sh.shadows = 0; } + if (options.baBehav[ADDSET_TONE_EQUALIZER_BANDS]) { pparams.toneEqualizer.bands = {}; } + if (options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT]) { pparams.toneEqualizer.pivot = 0; } + if (options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION]) { pparams.toneEqualizer.regularization = 0; } if (options.baBehav[ADDSET_LC_BRIGHTNESS]) { pparams.labCurve.brightness = 0; } if (options.baBehav[ADDSET_LC_CONTRAST]) { pparams.labCurve.contrast = 0; } if (options.baBehav[ADDSET_LC_CHROMATICITY]) { pparams.labCurve.chromaticity = 0; } @@ -288,6 +293,8 @@ 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_CAT_DEGREEOUT]) { pparams.colorappearance.degreeout = 0; } + if (options.baBehav[ADDSET_CAT_TEMPOUT]) { pparams.colorappearance.tempout = 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; @@ -308,6 +315,12 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_RESIZE_SCALE]) { pparams.resize.scale = 0; } if (options.baBehav[ADDSET_DIST_AMOUNT]) { pparams.distortion.amount = 0; } if (options.baBehav[ADDSET_PERSPECTIVE]) { pparams.perspective.horizontal = pparams.perspective.vertical = 0; } + if (options.baBehav[ADDSET_PERSP_CAM_FOCAL_LENGTH]) { pparams.perspective.camera_focal_length = pparams.perspective.camera_crop_factor = 0; } + if (options.baBehav[ADDSET_PERSP_CAM_SHIFT]) { pparams.perspective.camera_shift_horiz = pparams.perspective.camera_shift_vert = 0; } + if (options.baBehav[ADDSET_PERSP_CAM_ANGLE]) { pparams.perspective.camera_yaw = pparams.perspective.camera_pitch = 0; } + if (options.baBehav[ADDSET_PERSP_PROJ_ANGLE]) { pparams.perspective.projection_yaw = pparams.perspective.projection_pitch = 0; } + if (options.baBehav[ADDSET_PERSP_PROJ_SHIFT]) { pparams.perspective.projection_shift_horiz = pparams.perspective.projection_shift_vert = 0; } + if (options.baBehav[ADDSET_PERSP_PROJ_ROTATE]) { pparams.perspective.projection_rotate = 0; } if (options.baBehav[ADDSET_GRADIENT_DEGREE]) { pparams.gradient.degree = 0; } if (options.baBehav[ADDSET_GRADIENT_FEATHER]) { pparams.gradient.feather = 0; } if (options.baBehav[ADDSET_GRADIENT_STRENGTH]) { pparams.gradient.strength = 0; } @@ -335,8 +348,11 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_WA_RESCONH]) { pparams.wavelet.resconH = 0; } if (options.baBehav[ADDSET_WA_RESCHRO]) { pparams.wavelet.reschro = 0; } if (options.baBehav[ADDSET_WA_TMRS]) { pparams.wavelet.tmrs = 0; } + if (options.baBehav[ADDSET_WA_EDGS]) { pparams.wavelet.edgs = 0; } + if (options.baBehav[ADDSET_WA_SCALE]) { pparams.wavelet.scale = 0; } if (options.baBehav[ADDSET_WA_THRR]) { pparams.wavelet.thr = 0; } if (options.baBehav[ADDSET_WA_THRRH]) { pparams.wavelet.thrH = 0; } + if (options.baBehav[ADDSET_WA_RADIUS]) { pparams.wavelet.radius = 0; } if (options.baBehav[ADDSET_WA_SKYPROTECT]) { pparams.wavelet.sky = 0; } if (options.baBehav[ADDSET_WA_EDGRAD]) { pparams.wavelet.edgrad = 0; } if (options.baBehav[ADDSET_WA_EDGVAL]) { pparams.wavelet.edgval = 0; } @@ -389,9 +405,12 @@ void BatchToolPanelCoordinator::initSession () for (size_t i = 0; i < paramcListeners.size(); i++) // send this initial state to the History { - paramcListeners[i]->procParamsChanged (&pparams, rtengine::EvPhotoLoaded, M("BATCH_PROCESSING"), &pparamsEdited); + paramcListeners[i]->procParamsChanged (&pparams, rtengine::EvPhotoLoaded, M ("BATCH_PROCESSING"), &pparamsEdited); } } + + // ParamsEdited are set to false for initialization and is updated each time panel is changed (mandatory for Locallab) + pparamsEdited.set(false); } void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) @@ -402,7 +421,8 @@ void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, c somethingChanged = true; - pparamsEdited.set (false); + // Should remain commented for Locallab to work + // pparamsEdited.set (false); // read new values from the gui for (size_t i = 0; i < toolPanels.size(); i++) { @@ -414,7 +434,7 @@ void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, c if (selected.size() == 1) { // Compensate rotation on flip if (event == rtengine::EvCTHFlip || event == rtengine::EvCTVFlip) { - if (fabs(pparams.rotate.degree) > 0.001) { + if (fabs (pparams.rotate.degree) > 0.001) { pparams.rotate.degree *= -1; rotate->read (&pparams); } @@ -422,7 +442,7 @@ void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, c int w, h; selected[0]->getFinalSize (selected[0]->getProcParams (), w, h); - crop->setDimensions(w, h); + crop->setDimensions (w, h); // Some transformations change the crop and resize parameter for convenience. if (event == rtengine::EvCTHFlip) { @@ -444,7 +464,7 @@ void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, c // Compensate rotation on flip if (event == rtengine::EvCTHFlip || event == rtengine::EvCTVFlip) { for (size_t i = 0; i < selected.size(); i++) { - if (fabs(initialPP[i].rotate.degree) > 0.001) { + if (fabs (initialPP[i].rotate.degree) > 0.001) { initialPP[i].rotate.degree *= -1.0; pparamsEdited.rotate.degree = false; @@ -486,30 +506,30 @@ void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, c int rotation = (360 + newDeg - oldDeg) % 360; ProcParams pptemp = selected[i]->getProcParams(); // Get actual procparams - if((pptemp.coarse.hflip != pptemp.coarse.vflip) && ((rotation % 180) == 90)) { + if ((pptemp.coarse.hflip != pptemp.coarse.vflip) && ((rotation % 180) == 90)) { rotation = (rotation + 180) % 360; } switch (rotation) { - case 90: - std::swap(crop.x, crop.y); - std::swap(crop.w, crop.h); + case 90: + std::swap (crop.x, crop.y); + std::swap (crop.w, crop.h); - crop.x = h - crop.x - crop.w; - break; + crop.x = h - crop.x - crop.w; + break; - case 270: - std::swap(crop.x, crop.y); - std::swap(crop.w, crop.h); + case 270: + std::swap (crop.x, crop.y); + std::swap (crop.w, crop.h); - crop.y = w - crop.y - crop.h; - break; + crop.y = w - crop.y - crop.h; + break; - case 180: - crop.x = w - crop.x - crop.w; - crop.y = h - crop.y - crop.h; - break; + case 180: + crop.x = w - crop.x - crop.w; + crop.y = h - crop.y - crop.h; + break; } initialPP[i].coarse.rotate = newDeg; @@ -564,19 +584,27 @@ void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, c } } -void BatchToolPanelCoordinator::getAutoWB (double& temp, double& green, double equal, double tempBias) +void BatchToolPanelCoordinator::setTweakOperator (rtengine::TweakOperator *tOperator) +{ +} + +void BatchToolPanelCoordinator::unsetTweakOperator (rtengine::TweakOperator *tOperator) +{ +} + +void BatchToolPanelCoordinator::getAutoWB (double& temp, double& green, double equal, rtengine::StandardObserver observer, double tempBias) { if (!selected.empty()) { - selected[0]->getAutoWB (temp, green, equal, tempBias); + selected[0]->getAutoWB (temp, green, equal, observer, tempBias); } } -void BatchToolPanelCoordinator::getCamWB (double& temp, double& green) +void BatchToolPanelCoordinator::getCamWB (double& temp, double& green, rtengine::StandardObserver observer) { if (!selected.empty()) { - selected[0]->getCamWB (temp, green); + selected[0]->getCamWB (temp, green, observer); } } @@ -596,13 +624,13 @@ void BatchToolPanelCoordinator::procParamsChanged (Thumbnail* thm, int whoChange } } -void BatchToolPanelCoordinator::beginBatchPParamsChange(int numberOfEntries) +void BatchToolPanelCoordinator::beginBatchPParamsChange (int numberOfEntries) { blockedUpdate = true; if (numberOfEntries > 50) { // Arbitrary amount - parent->set_sensitive(false); + parent->set_sensitive (false); } } @@ -613,7 +641,7 @@ void BatchToolPanelCoordinator::endBatchPParamsChange() closeSession (false); initSession (); blockedUpdate = false; - parent->set_sensitive(true); + parent->set_sensitive (true); } /* @@ -635,7 +663,7 @@ void BatchToolPanelCoordinator::profileChange( return; } - pparams = *(nparams->pparams); + pparams = * (nparams->pparams); if (paramsEdited) { pparamsEdited = *paramsEdited; diff --git a/rtgui/batchtoolpanelcoord.h b/rtgui/batchtoolpanelcoord.h index 7a5fe77ed..f421793ac 100644 --- a/rtgui/batchtoolpanelcoord.h +++ b/rtgui/batchtoolpanelcoord.h @@ -28,7 +28,7 @@ class FilePanel; class Thumbnail; -class BatchToolPanelCoordinator : +class BatchToolPanelCoordinator final : public ToolPanelCoordinator, public FileSelectionChangeListener, public BatchPParamsChangeListener, @@ -56,6 +56,8 @@ public: // toolpanellistener interface void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) override; + void setTweakOperator (rtengine::TweakOperator *tOperator) override; + void unsetTweakOperator (rtengine::TweakOperator *tOperator) override; // profilechangelistener interface void profileChange( @@ -67,8 +69,8 @@ public: ) override; // wbprovider interface - void getAutoWB (double& temp, double& green, double equal, double tempBias) override; - void getCamWB (double& temp, double& green) override; + void getAutoWB (double& temp, double& green, double equal, rtengine::StandardObserver observer, double tempBias) override; + void getCamWB (double& temp, double& green, rtengine::StandardObserver observer) override; // thumbnaillistener interface void procParamsChanged (Thumbnail* thm, int whoChangedIt) override; diff --git a/rtgui/bayerpreprocess.cc b/rtgui/bayerpreprocess.cc index 0c01213e7..e8b965736 100644 --- a/rtgui/bayerpreprocess.cc +++ b/rtgui/bayerpreprocess.cc @@ -28,7 +28,9 @@ using namespace rtengine; using namespace rtengine::procparams; -BayerPreProcess::BayerPreProcess() : FoldableToolPanel(this, "bayerpreprocess", M("TP_PREPROCESS_LABEL"), options.prevdemo != PD_Sidecar) +const Glib::ustring BayerPreProcess::TOOL_NAME = "bayerpreprocess"; + +BayerPreProcess::BayerPreProcess() : FoldableToolPanel(this, TOOL_NAME, M("TP_PREPROCESS_LABEL"), options.prevdemo != PD_Sidecar) { auto m = ProcEventMapper::getInstance(); EvLineDenoiseDirection = m->newEvent(DARKFRAME, "HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION"); @@ -37,22 +39,18 @@ BayerPreProcess::BayerPreProcess() : FoldableToolPanel(this, "bayerpreprocess", 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; - } + lineDenoise->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); lineDenoise->show(); 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; - } + greenEqThreshold->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); greenEqThreshold->show(); - Gtk::HBox *hb = Gtk::manage(new Gtk::HBox()); + Gtk::Box *hb = Gtk::manage(new Gtk::Box()); 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")); @@ -67,7 +65,7 @@ BayerPreProcess::BayerPreProcess() : FoldableToolPanel(this, "bayerpreprocess", pack_start(*lineDenoise, Gtk::PACK_SHRINK, 4); pack_start(*hb, Gtk::PACK_SHRINK, 4); - pack_start(*Gtk::manage(new Gtk::HSeparator())); + pack_start(*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); pack_start(*greenEqThreshold, Gtk::PACK_SHRINK, 4); @@ -75,7 +73,7 @@ BayerPreProcess::BayerPreProcess() : FoldableToolPanel(this, "bayerpreprocess", pdafLinesFilter->show(); pdafLinesFilter->signal_toggled().connect(sigc::mem_fun(*this, &BayerPreProcess::pdafLinesFilterChanged), true); - pack_start(*Gtk::manage(new Gtk::HSeparator())); + pack_start(*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); pack_start(*pdafLinesFilter, Gtk::PACK_SHRINK, 4); } diff --git a/rtgui/bayerpreprocess.h b/rtgui/bayerpreprocess.h index 16b469626..8b5f8d981 100644 --- a/rtgui/bayerpreprocess.h +++ b/rtgui/bayerpreprocess.h @@ -37,6 +37,7 @@ protected: rtengine::ProcEvent EvPDAFLinesFilter; public: + static const Glib::ustring TOOL_NAME; BayerPreProcess (); diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 5b5cfe9c4..e7e038e52 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -28,8 +28,11 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring BayerProcess::TOOL_NAME = "bayerprocess"; -BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RAW_LABEL"), options.prevdemo != PD_Sidecar) +BayerProcess::BayerProcess () : + FoldableToolPanel(this, TOOL_NAME, M("TP_RAW_LABEL"), options.prevdemo != PD_Sidecar), + oldMethod(-1) { auto m = ProcEventMapper::getInstance(); @@ -37,8 +40,9 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA 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"); + EvPixelshiftAverage = m->newEvent(DEMOSAIC, "HISTORY_MSG_PIXELSHIFT_AVERAGE"); - Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb1 = Gtk::manage (new Gtk::Box ()); hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); method = Gtk::manage (new MyComboBoxText ()); @@ -52,33 +56,29 @@ 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()); + dualDemosaicOptions = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); 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->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); dualDemosaicContrast->show(); dualDemosaicOptions->pack_start(*dualDemosaicContrast); pack_start( *dualDemosaicOptions, Gtk::PACK_SHRINK, 4); - borderbox = Gtk::manage(new Gtk::HBox()); + borderbox = Gtk::manage(new Gtk::Box()); 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->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); border->show(); borderbox->pack_start(*border); pack_start(*borderbox, Gtk::PACK_SHRINK, 4); - imageNumberBox = Gtk::manage (new Gtk::HBox ()); + imageNumberBox = Gtk::manage (new Gtk::Box ()); imageNumberBox->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_IMAGENUM") + ": ")), Gtk::PACK_SHRINK, 4); imageNumber = Gtk::manage (new MyComboBoxText ()); imageNumber->append("1"); @@ -90,26 +90,21 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA imageNumberBox->pack_end (*imageNumber, Gtk::PACK_EXPAND_WIDGET, 4); pack_start( *imageNumberBox, Gtk::PACK_SHRINK, 4); - pack_start( *Gtk::manage( new Gtk::HSeparator()), Gtk::PACK_SHRINK, 0 ); + pack_start( *Gtk::manage( new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0 ); ccSteps = Gtk::manage (new Adjuster (M("TP_RAW_FALSECOLOR"), 0, 5, 1, 0 )); ccSteps->setAdjusterListener (this); - if (ccSteps->delay < options.adjusterMaxDelay) { - ccSteps->delay = options.adjusterMaxDelay; - } + ccSteps->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); ccSteps->show(); pack_start( *ccSteps, Gtk::PACK_SHRINK, 4); - - dcbOptions = Gtk::manage (new Gtk::VBox ()); + dcbOptions = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); dcbIterations = Gtk::manage (new Adjuster (M("TP_RAW_DCBITERATIONS"), 0, 5, 1, 2)); dcbIterations->setAdjusterListener (this); - if (dcbIterations->delay < options.adjusterMaxDelay) { - dcbIterations->delay = options.adjusterMaxDelay; - } + dcbIterations->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); dcbIterations->show(); dcbEnhance = Gtk::manage (new CheckBox(M("TP_RAW_DCBENHANCE"), multiImage)); @@ -118,15 +113,13 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA dcbOptions->pack_start(*dcbEnhance); pack_start( *dcbOptions, Gtk::PACK_SHRINK, 4); - lmmseOptions = Gtk::manage (new Gtk::VBox ()); + lmmseOptions = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); lmmseIterations = Gtk::manage (new Adjuster (M("TP_RAW_LMMSEITERATIONS"), 0, 6, 1, 2)); lmmseIterations->setAdjusterListener (this); lmmseIterations->set_tooltip_markup (M("TP_RAW_LMMSE_TOOLTIP")); - if (lmmseIterations->delay < options.adjusterMaxDelay) { - lmmseIterations->delay = options.adjusterMaxDelay; - } + lmmseIterations->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); lmmseIterations->show(); lmmseOptions->pack_start(*lmmseIterations); @@ -137,7 +130,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftFrame = Gtk::manage(new Gtk::Frame(M("TP_RAW_PIXELSHIFT"))); - Gtk::VBox *pixelShiftMainVBox = Gtk::manage (new Gtk::VBox ()); + Gtk::Box *pixelShiftMainVBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); pixelShiftMainVBox->set_border_width(0); pixelShiftEqualBright = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTEQUALBRIGHT"), multiImage)); @@ -150,7 +143,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftEqualBrightChannel->set_tooltip_text (M("TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP")); pixelShiftMainVBox->pack_start(*pixelShiftEqualBrightChannel); - Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb3 = Gtk::manage (new Gtk::Box ()); hb3->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_PIXELSHIFTMOTIONMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); pixelShiftMotionMethod = Gtk::manage (new MyComboBoxText ()); pixelShiftMotionMethod->append(M("TP_RAW_PIXELSHIFTMM_OFF")); @@ -161,7 +154,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA hb3->pack_start(*pixelShiftMotionMethod); pixelShiftMainVBox->pack_start(*hb3); - pixelShiftOptions = Gtk::manage (new Gtk::VBox ()); + pixelShiftOptions = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); pixelShiftOptions->set_border_width(0); pixelShiftShowMotion = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTSHOWMOTION"), multiImage)); @@ -175,7 +168,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftMainVBox->pack_start(*pixelShiftShowMotionMaskOnly); - Gtk::HBox* hb4 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb4 = Gtk::manage (new Gtk::Box ()); 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()) { @@ -207,9 +200,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftSigma->set_tooltip_text (M("TP_RAW_PIXELSHIFTSIGMA_TOOLTIP")); pixelShiftSigma->setAdjusterListener (this); - if (pixelShiftSigma->delay < options.adjusterMaxDelay) { - pixelShiftSigma->delay = options.adjusterMaxDelay; - } + pixelShiftSigma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); pixelShiftSigma->show(); pixelShiftOptions->pack_start(*pixelShiftSigma); @@ -219,9 +210,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftSmooth->set_tooltip_text (M("TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP")); pixelShiftSmooth->setAdjusterListener (this); - if (pixelShiftSmooth->delay < options.adjusterMaxDelay) { - pixelShiftSmooth->delay = options.adjusterMaxDelay; - } + pixelShiftSmooth->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); pixelShiftSmooth->show(); pixelShiftOptions->pack_start(*pixelShiftSmooth); @@ -230,9 +219,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftEperIso->set_tooltip_text(M("TP_RAW_PIXELSHIFTEPERISO_TOOLTIP")); pixelShiftEperIso->setAdjusterListener (this); - if (pixelShiftEperIso->delay < options.adjusterMaxDelay) { - pixelShiftEperIso->delay = options.adjusterMaxDelay; - } + pixelShiftEperIso->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); pixelShiftEperIso->show(); pixelShiftOptions->pack_start(*pixelShiftEperIso); @@ -241,7 +228,13 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftMedian = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTMEDIAN"), multiImage)); pixelShiftMedian->setCheckBoxListener (this); pixelShiftMedian->set_tooltip_text (M("TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP")); + + pixelShiftAverage = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTAVERAGE"), multiImage)); + pixelShiftAverage->setCheckBoxListener (this); + pixelShiftAverage->set_tooltip_text (M("TP_RAW_PIXELSHIFTAVERAGE_TOOLTIP")); + pixelShiftOptions->pack_start(*pixelShiftMedian); + pixelShiftOptions->pack_start(*pixelShiftAverage); pixelShiftMainVBox->pack_start(*pixelShiftOptions); pixelShiftFrame->add(*pixelShiftMainVBox); @@ -296,6 +289,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params } pixelShiftHoleFill->setValue (pp->raw.bayersensor.pixelShiftHoleFill); pixelShiftMedian->setValue (pp->raw.bayersensor.pixelShiftMedian); + pixelShiftAverage->setValue (pp->raw.bayersensor.pixelShiftAverage); pixelShiftGreen->setValue (pp->raw.bayersensor.pixelShiftGreen); pixelShiftBlur->setValue (pp->raw.bayersensor.pixelShiftBlur); pixelShiftSmooth->setValue (pp->raw.bayersensor.pixelShiftSmoothFactor); @@ -329,6 +323,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params pixelShiftShowMotionMaskOnly->setEdited (pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly); pixelShiftHoleFill->setEdited (pedited->raw.bayersensor.pixelShiftHoleFill); pixelShiftMedian->setEdited(pedited->raw.bayersensor.pixelShiftMedian); + pixelShiftAverage->setEdited(pedited->raw.bayersensor.pixelShiftAverage); pixelShiftGreen->setEdited (pedited->raw.bayersensor.pixelShiftGreen); pixelShiftBlur->setEdited (pedited->raw.bayersensor.pixelShiftBlur); pixelShiftSmooth->setEditedState ( pedited->raw.bayersensor.pixelShiftSmooth ? Edited : UnEdited); @@ -364,7 +359,10 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params 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::AMAZEBILINEAR) || 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::DCBBILINEAR) + || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) || 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); @@ -408,6 +406,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.pixelShiftShowMotionMaskOnly = pixelShiftShowMotionMaskOnly->getLastActive (); pp->raw.bayersensor.pixelShiftHoleFill = pixelShiftHoleFill->getLastActive (); pp->raw.bayersensor.pixelShiftMedian = pixelShiftMedian->getLastActive (); + pp->raw.bayersensor.pixelShiftAverage = pixelShiftAverage->getLastActive (); pp->raw.bayersensor.pixelShiftGreen = pixelShiftGreen->getLastActive (); pp->raw.bayersensor.pixelShiftBlur = pixelShiftBlur->getLastActive (); pp->raw.bayersensor.pixelShiftSmoothFactor = pixelShiftSmooth->getValue(); @@ -450,6 +449,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly = !pixelShiftShowMotionMaskOnly->get_inconsistent(); pedited->raw.bayersensor.pixelShiftHoleFill = !pixelShiftHoleFill->get_inconsistent(); pedited->raw.bayersensor.pixelShiftMedian = !pixelShiftMedian->get_inconsistent(); + pedited->raw.bayersensor.pixelShiftAverage = !pixelShiftAverage->get_inconsistent(); pedited->raw.bayersensor.pixelShiftGreen = !pixelShiftGreen->get_inconsistent(); pedited->raw.bayersensor.pixelShiftBlur = !pixelShiftBlur->get_inconsistent(); pedited->raw.bayersensor.pixelShiftSmooth = pixelShiftSmooth->getEditedState(); @@ -573,7 +573,12 @@ void BayerProcess::methodChanged () lmmseOptions->hide(); } - if (currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::RCDVNG4) { + if (currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEVNG4 || + currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4 || + currentMethod == procparams::RAWParams::BayerSensor::Method::RCDVNG4 || + currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEBILINEAR || + currentMethod == procparams::RAWParams::BayerSensor::Method::DCBBILINEAR || + currentMethod == procparams::RAWParams::BayerSensor::Method::RCDBILINEAR) { dualDemosaicOptions->show(); } else { dualDemosaicOptions->hide(); @@ -639,9 +644,19 @@ void BayerProcess::checkBoxToggled (CheckBox* c, CheckValue newval) listener->panelChanged (EvPixelShiftHoleFill, pixelShiftHoleFill->getValueAsStr ()); } } else if (c == pixelShiftMedian) { + if (pixelShiftMedian->getLastActive()) { + pixelShiftAverage->setValue(false); + } if (listener) { listener->panelChanged (EvPixelShiftMedian, pixelShiftMedian->getValueAsStr ()); } + } else if (c == pixelShiftAverage) { + if (pixelShiftAverage->getLastActive()) { + pixelShiftMedian->setValue(false); + } + if (listener) { + listener->panelChanged (EvPixelshiftAverage, pixelShiftAverage->getValueAsStr ()); + } } else if (c == pixelShiftGreen) { if (listener) { listener->panelChanged (EvPixelShiftGreen, pixelShiftGreen->getValueAsStr ()); diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index f8348e02b..00a5c8aac 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -37,18 +37,18 @@ class BayerProcess final : protected: MyComboBoxText* method; - Gtk::HBox* borderbox; - Gtk::HBox *imageNumberBox; + Gtk::Box* borderbox; + Gtk::Box *imageNumberBox; Adjuster* border; MyComboBoxText* imageNumber; Adjuster* ccSteps; - Gtk::VBox *dcbOptions; + Gtk::Box *dcbOptions; Adjuster* dcbIterations; CheckBox* dcbEnhance; - Gtk::VBox *lmmseOptions; + Gtk::Box *lmmseOptions; Adjuster* lmmseIterations; Gtk::Frame *pixelShiftFrame; - Gtk::VBox *pixelShiftOptions; + Gtk::Box *pixelShiftOptions; MyComboBoxText* pixelShiftMotionMethod; MyComboBoxText* pixelShiftDemosaicMethod; CheckBox* pixelShiftShowMotion; @@ -58,12 +58,13 @@ protected: CheckBox* pixelShiftBlur; CheckBox* pixelShiftHoleFill; CheckBox* pixelShiftMedian; + CheckBox* pixelShiftAverage; CheckBox* pixelShiftEqualBright; CheckBox* pixelShiftEqualBrightChannel; Adjuster* pixelShiftSmooth; Adjuster* pixelShiftEperIso; Adjuster* pixelShiftSigma; - Gtk::VBox *dualDemosaicOptions; + Gtk::Box *dualDemosaicOptions; Adjuster* dualDemosaicContrast; int oldMethod; bool lastAutoContrast; @@ -73,7 +74,9 @@ protected: rtengine::ProcEvent EvDemosaicAutoContrast; rtengine::ProcEvent EvDemosaicContrast; rtengine::ProcEvent EvDemosaicPixelshiftDemosaicMethod; + rtengine::ProcEvent EvPixelshiftAverage; public: + static const Glib::ustring TOOL_NAME; BayerProcess (); ~BayerProcess () override; diff --git a/rtgui/bayerrawexposure.cc b/rtgui/bayerrawexposure.cc index 9d8f9fff8..834384a91 100644 --- a/rtgui/bayerrawexposure.cc +++ b/rtgui/bayerrawexposure.cc @@ -26,38 +26,32 @@ using namespace rtengine; using namespace rtengine::procparams; -BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, "bayerrawexposure", M("TP_EXPOS_BLACKPOINT_LABEL"), options.prevdemo != PD_Sidecar) +const Glib::ustring BayerRAWExposure::TOOL_NAME = "bayerrawexposure"; + +BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, TOOL_NAME, M("TP_EXPOS_BLACKPOINT_LABEL"), options.prevdemo != PD_Sidecar) { PexBlack1 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_1"), -2048, 2048, 1.0, 0)); //black level PexBlack1->setAdjusterListener (this); - if (PexBlack1->delay < options.adjusterMaxDelay) { - PexBlack1->delay = options.adjusterMaxDelay; - } + PexBlack1->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack1->show(); PexBlack2 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_2"), -2048, 2048, 1.0, 0)); //black level PexBlack2->setAdjusterListener (this); - if (PexBlack2->delay < options.adjusterMaxDelay) { - PexBlack2->delay = options.adjusterMaxDelay; - } + PexBlack2->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack2->show(); PexBlack3 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_3"), -2048, 2048, 1.0, 0)); //black level PexBlack3->setAdjusterListener (this); - if (PexBlack3->delay < options.adjusterMaxDelay) { - PexBlack3->delay = options.adjusterMaxDelay; - } + PexBlack3->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack3->show(); PexBlack0 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_0"), -2048, 2048, 1.0, 0)); //black level PexBlack0->setAdjusterListener (this); - if (PexBlack0->delay < options.adjusterMaxDelay) { - PexBlack0->delay = options.adjusterMaxDelay; - } + PexBlack0->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlack0->show(); PextwoGreen = Gtk::manage(new CheckBox(M("TP_RAWEXPOS_TWOGREEN"), multiImage));// two green @@ -145,8 +139,8 @@ void BayerRAWExposure::adjusterChanged(Adjuster* a, double newval) if(!PextwoGreen->getLastActive()) { listener->panelChanged (EvPreProcessExpBlackthree, value ); } else { - listener->panelChanged (EvPreProcessExpBlackthree, value ); PexBlack0->setValue (PexBlack3->getValue()); + listener->panelChanged (EvPreProcessExpBlackthree, value ); } } } diff --git a/rtgui/bayerrawexposure.h b/rtgui/bayerrawexposure.h index eb18aa0e3..53c5817f8 100644 --- a/rtgui/bayerrawexposure.h +++ b/rtgui/bayerrawexposure.h @@ -31,6 +31,8 @@ class BayerRAWExposure final : public FoldableToolPanel { public: + static const Glib::ustring TOOL_NAME; + BayerRAWExposure (); void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index 596d99607..6e618ea3b 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -34,8 +34,9 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring BlackWhite::TOOL_NAME = "blackwhite"; -BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LABEL"), false, true) +BlackWhite::BlackWhite (): FoldableToolPanel(this, TOOL_NAME, M("TP_BWMIX_LABEL"), false, true) { CurveListener::setMulti(true); @@ -45,11 +46,12 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- Method combobox ------------------------------ - Gtk::HBox* metHBox = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* metHBox = Gtk::manage (new Gtk::Box ()); metHBox->set_spacing (2); Gtk::Label* metLabel = Gtk::manage (new Gtk::Label (M("TP_BWMIX_MET") + ":")); metHBox->pack_start (*metLabel, Gtk::PACK_SHRINK); - method = Gtk::manage (new MyComboBoxText ()); + + method = Gtk::manage (new MyComboBoxText ()); method->append (M("TP_BWMIX_MET_DESAT")); method->append (M("TP_BWMIX_MET_LUMEQUAL")); method->append (M("TP_BWMIX_MET_CHANMIX")); @@ -62,7 +64,7 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- Luminance equalizer ------------------------------ - luminanceSep = Gtk::manage (new Gtk::HSeparator()); + luminanceSep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); pack_start (*luminanceSep); std::vector bottomMilestones; @@ -70,7 +72,7 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB // -0.1 rad < Hue < 1.6 rad for (int i = 0; i < 7; i++) { - float x = float(i) * (1.0f / 6.0); + float x = float(i) * (1.0f / 6.f); Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); bottomMilestones.push_back( GradientMilestone(double(x), double(R), double(G), double(B)) ); } @@ -89,12 +91,13 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- Auto and Reset buttons ------------------------------ mixerFrame = Gtk::manage (new Gtk::Frame (M("TP_BWMIX_MET_CHANMIX"))); + mixerFrame->set_label_align(0.025, 0.5); pack_start (*mixerFrame, Gtk::PACK_SHRINK, 0); - mixerVBox = Gtk::manage (new Gtk::VBox ()); + mixerVBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); mixerVBox->set_spacing(4); - autoHBox = Gtk::manage (new Gtk::HBox ()); + autoHBox = Gtk::manage (new Gtk::Box ()); autoch = Gtk::manage (new Gtk::ToggleButton (M("TP_BWMIX_AUTOCH"))); autoconn = autoch->signal_toggled().connect( sigc::mem_fun(*this, &BlackWhite::autoch_toggled) ); @@ -110,9 +113,9 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- Presets combobox ------------------------------ - mixerVBox->pack_start (*Gtk::manage (new Gtk::HSeparator())); + mixerVBox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); - settingHBox = Gtk::manage (new Gtk::HBox ()); + settingHBox = Gtk::manage (new Gtk::Box ()); settingHBox->set_spacing (2); settingHBox->set_tooltip_markup (M("TP_BWMIX_SETTING_TOOLTIP")); Gtk::Label *settingLabel = Gtk::manage (new Gtk::Label (M("TP_BWMIX_SETTING") + ":")); @@ -146,7 +149,7 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- Complementary Color checkbox ------------------------------ - enabledccSep = Gtk::manage (new Gtk::HSeparator()); + enabledccSep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); mixerVBox->pack_start (*enabledccSep); enabledcc = Gtk::manage (new Gtk::CheckButton (M("TP_BWMIX_CC_ENABLED"))); @@ -160,10 +163,10 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- Color Filters ------------------------------ - filterSep = Gtk::manage (new Gtk::HSeparator()); + filterSep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); mixerVBox->pack_start (*filterSep); - filterHBox = Gtk::manage (new Gtk::HBox ()); + filterHBox = Gtk::manage (new Gtk::Box ()); filterHBox->set_spacing (2); filterHBox->set_tooltip_markup (M("TP_BWMIX_FILTER_TOOLTIP")); Gtk::Label *filterLabel = Gtk::manage (new Gtk::Label (M("TP_BWMIX_FILTER") + ":")); @@ -199,7 +202,7 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB 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())); + mixerVBox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); mixerRed = Gtk::manage(new Adjuster (/*M("TP_BWMIX_RED")*/"", -100, 200, 1, 33, imgIcon[0])); @@ -222,10 +225,10 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB mixerBlue->show(); mixerVBox->pack_start( *mixerBlue, Gtk::PACK_SHRINK, 0); - filterSep2 = Gtk::manage (new Gtk::HSeparator()); + filterSep2 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); mixerVBox->pack_start (*filterSep2); - algoHBox = Gtk::manage (new Gtk::HBox ()); + algoHBox = Gtk::manage (new Gtk::Box ()); algoHBox->set_spacing (2); algoHBox->set_tooltip_markup (M("TP_BWMIX_ALGO_TOOLTIP")); @@ -280,9 +283,10 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- Gamma sliders ------------------------------ gammaFrame = Gtk::manage (new Gtk::Frame (M("TP_BWMIX_GAMMA"))); + gammaFrame->set_label_align(0.025, 0.5); pack_start (*gammaFrame, Gtk::PACK_SHRINK, 0); - Gtk::VBox *gammaVBox = Gtk::manage (new Gtk::VBox()); + Gtk::Box* gammaVBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); gammaVBox->set_spacing(4); @@ -809,7 +813,6 @@ void BlackWhite::filterChanged () if (listener && (multiImage || getEnabled())) { listener->panelChanged (EvBWfilter, filter->get_active_text ()); - listener->panelChanged (EvAutoch, M("GENERAL_ENABLED")); } } @@ -1185,10 +1188,10 @@ void BlackWhite::updateRGBLabel () RGBLabels->set_text( Glib::ustring::compose(M("TP_BWMIX_RGBLABEL"), - Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.), - Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.), - Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.), - Glib::ustring::format(std::fixed, std::setprecision(0), ceil(kcorrec * 100./*(r+g+b)*100.)*/))) + Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f), + Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f), + Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f), + Glib::ustring::format(std::fixed, std::setprecision(0), ceil(kcorrec * 100.f/*(r+g+b)*100.)*/))) ); // We have to update the RGB sliders too if preset values has been chosen @@ -1204,7 +1207,6 @@ void BlackWhite::setBatchMode (bool batchMode) { removeIfThere (autoHBox, autoch, false); autoch = Gtk::manage (new Gtk::CheckButton (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) ); autoHBox->pack_start (*autoch); diff --git a/rtgui/blackwhite.h b/rtgui/blackwhite.h index 1aed86997..fe41ccda0 100644 --- a/rtgui/blackwhite.h +++ b/rtgui/blackwhite.h @@ -40,6 +40,7 @@ class BlackWhite final : public ColorProvider { public: + static const Glib::ustring TOOL_NAME; BlackWhite (); ~BlackWhite () override; @@ -90,7 +91,7 @@ private: void hideGamma(); FlatCurveEditor* luminanceCurve; - Gtk::HSeparator* luminanceSep; + Gtk::Separator* luminanceSep; CurveEditorGroup* luminanceCEG; CurveEditorGroup* beforeCurveCEG; DiagonalCurveEditor* beforeCurve; @@ -99,13 +100,13 @@ private: DiagonalCurveEditor* afterCurve; MyComboBoxText* afterCurveMode; Gtk::ToggleButton* autoch; - Gtk::HBox* autoHBox; + Gtk::Box* autoHBox; Gtk::Button* neutral; Gtk::Label* RGBLabels; MyComboBoxText* algo; sigc::connection algoconn; Gtk::Label* alLabel; - Gtk::HBox* algoHBox; + Gtk::Box* algoHBox; Adjuster *mixerRed; Adjuster *mixerGreen; @@ -120,20 +121,20 @@ private: Adjuster *mixerPurple; MyComboBoxText* method; sigc::connection methodconn; - Gtk::HBox* filterHBox; - Gtk::HSeparator* filterSep, *filterSep2; + Gtk::Box* filterHBox; + Gtk::Separator* filterSep, *filterSep2; MyComboBoxText* filter; sigc::connection filterconn; - Gtk::HBox* settingHBox; + Gtk::Box* settingHBox; MyComboBoxText* setting; sigc::connection settingconn; Gtk::Frame* mixerFrame; - Gtk::VBox * mixerVBox; + Gtk::Box* mixerVBox; Gtk::Frame* gammaFrame; Gtk::Image *imgIcon[11]; - Gtk::HSeparator* enabledccSep; + Gtk::Separator* enabledccSep; Gtk::CheckButton* enabledcc; bool lastEnabledcc, lastAuto; sigc::connection enaccconn, tcmodeconn, tcmodeconn2, autoconn, neutralconn; diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index 61683e158..7115447c2 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -146,7 +146,7 @@ void BatchQueueEntryUpdater::processThread () } memcpy(current.oimg, img->getData(), prevw * prevh * 3); - img->free(); + delete img; } } diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index c37964e23..5e540b604 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -39,7 +39,7 @@ namespace { constexpr int cacheDirMode = 0777; -constexpr const char* cacheDirs[] = { "profiles", "images", "aehistograms", "embprofiles", "data" }; +constexpr const char* cacheDirs[] = { "profiles", "images", "embprofiles", "data" }; } @@ -59,9 +59,7 @@ void CacheManager::init () auto error = g_mkdir_with_parents (baseDir.c_str(), cacheDirMode); for (const auto& cacheDir : cacheDirs) { - if (strncmp(cacheDir, "aehistograms", 12)) { // don't create aehistograms folder. - error |= g_mkdir_with_parents (Glib::build_filename (baseDir, cacheDir).c_str(), cacheDirMode); - } + error |= g_mkdir_with_parents (Glib::build_filename (baseDir, cacheDir).c_str(), cacheDirMode); } if (error != 0 && rtengine::settings->verbose) { @@ -81,6 +79,7 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname) // if it is open, return it const auto iterator = openEntries.find (fname); + if (iterator != openEntries.end ()) { auto cachedThumbnail = iterator->second; @@ -104,9 +103,11 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname) CacheImageData imageData; const auto error = imageData.load (cacheName); + if (error == 0 && imageData.supported) { thumbnail.reset (new Thumbnail (this, fname, &imageData)); + if (!thumbnail->isSupported ()) { thumbnail.reset (); } @@ -117,6 +118,7 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname) if (!thumbnail) { thumbnail.reset (new Thumbnail (this, fname, md5)); + if (!thumbnail->isSupported ()) { thumbnail.reset (); } @@ -128,6 +130,7 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname) MyMutex::MyLock lock (mutex); const auto iterator = openEntries.find (fname); + if (iterator != openEntries.end ()) { auto cachedThumbnail = iterator->second; @@ -150,6 +153,7 @@ void CacheManager::deleteEntry (const Glib::ustring& fname) // check if it is opened auto iterator = openEntries.find (fname); + if (iterator == openEntries.end ()) { deleteFiles (fname, getMD5 (fname), true, true); return; @@ -187,7 +191,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 ("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 ()); @@ -198,6 +201,7 @@ void CacheManager::renameEntry (const std::string& oldfilename, const std::strin // check if it is opened // if it is open, update md5 const auto iterator = openEntries.find (oldfilename); + if (iterator == openEntries.end ()) { return; } @@ -241,7 +245,6 @@ void CacheManager::clearImages () const deleteDir ("data"); deleteDir ("images"); - deleteDir ("aehistograms"); deleteDir ("embprofiles"); } @@ -250,8 +253,10 @@ void CacheManager::clearProfiles () const MyMutex::MyLock lock (mutex); deleteDir ("profiles"); + } + void CacheManager::deleteDir (const Glib::ustring& dirName) const { try { @@ -259,6 +264,7 @@ void CacheManager::deleteDir (const Glib::ustring& dirName) const Glib::Dir dir (Glib::build_filename (baseDir, dirName)); auto error = 0; + for (auto entry = dir.begin (); entry != dir.end (); ++entry) { error |= g_remove (Glib::build_filename (baseDir, dirName, *entry).c_str ()); } @@ -277,7 +283,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 ("aehistograms", fname, "", md5).c_str ()); error |= g_remove (getCacheFileName ("embprofiles", fname, ".icc", md5).c_str ()); if (purgeData) { @@ -330,9 +335,9 @@ std::string CacheManager::getMD5 (const Glib::ustring& fname) } Glib::ustring CacheManager::getCacheFileName (const Glib::ustring& subDir, - const Glib::ustring& fname, - const Glib::ustring& fext, - const Glib::ustring& md5) const + const Glib::ustring& fname, + const Glib::ustring& fext, + const Glib::ustring& md5) const { const auto dirName = Glib::build_filename (baseDir, subDir); const auto baseName = Glib::path_get_basename (fname) + "." + md5; diff --git a/rtgui/cachemanager.h b/rtgui/cachemanager.h index 56370e966..61602aeba 100644 --- a/rtgui/cachemanager.h +++ b/rtgui/cachemanager.h @@ -59,7 +59,6 @@ public: void clearImages () const; void clearProfiles () const; void clearFromCache (const Glib::ustring& fname, bool purge) const; - static std::string getMD5 (const Glib::ustring& fname); Glib::ustring getCacheFileName (const Glib::ustring& subDir, diff --git a/rtgui/cacorrection.cc b/rtgui/cacorrection.cc index 971c0a284..52ed782df 100644 --- a/rtgui/cacorrection.cc +++ b/rtgui/cacorrection.cc @@ -27,7 +27,9 @@ using namespace rtengine; using namespace rtengine::procparams; -CACorrection::CACorrection () : FoldableToolPanel(this, "cacorrection", M("TP_CACORRECTION_LABEL")) +const Glib::ustring CACorrection::TOOL_NAME = "cacorrection"; + +CACorrection::CACorrection () : FoldableToolPanel(this, TOOL_NAME, M("TP_CACORRECTION_LABEL")) { Gtk::Image* icaredL = Gtk::manage (new RTImage ("circle-red-cyan-small.png")); diff --git a/rtgui/cacorrection.h b/rtgui/cacorrection.h index 12d6396eb..7afccb4de 100644 --- a/rtgui/cacorrection.h +++ b/rtgui/cacorrection.h @@ -34,6 +34,7 @@ protected: Adjuster* blue; public: + static const Glib::ustring TOOL_NAME; CACorrection (); diff --git a/rtgui/checkbox.cc b/rtgui/checkbox.cc index e05ba061a..265123b23 100644 --- a/rtgui/checkbox.cc +++ b/rtgui/checkbox.cc @@ -80,7 +80,7 @@ void CheckBox::setValue (CheckValue newValue) break; case CheckValue::off: set_inconsistent (false); - set_active(true); + set_active(false); lastActive = false; break; case CheckValue::unchanged: diff --git a/rtgui/chmixer.cc b/rtgui/chmixer.cc index 4b243f13c..e54ddfc5d 100644 --- a/rtgui/chmixer.cc +++ b/rtgui/chmixer.cc @@ -25,7 +25,9 @@ using namespace rtengine; using namespace rtengine::procparams; -ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), false, true) +const Glib::ustring ChMixer::TOOL_NAME = "chmixer"; + +ChMixer::ChMixer (): FoldableToolPanel(this, TOOL_NAME, M("TP_CHMIXER_LABEL"), false, true) { imgIcon[0] = Gtk::manage (new RTImage ("circle-red-small.png")); @@ -47,7 +49,7 @@ ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), f 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 ()); + Gtk::Separator* rsep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); pack_start (*rlabel); @@ -66,7 +68,7 @@ ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), f 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 ()); + Gtk::Separator* gsep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); pack_start (*glabel); diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h index d80b89cf7..831449c30 100644 --- a/rtgui/chmixer.h +++ b/rtgui/chmixer.h @@ -36,6 +36,7 @@ protected: Gtk::Image *imgIcon[9]; public: + static const Glib::ustring TOOL_NAME; ChMixer (); diff --git a/rtgui/coarsepanel.h b/rtgui/coarsepanel.h index b7b4f8cf7..a74c05b15 100644 --- a/rtgui/coarsepanel.h +++ b/rtgui/coarsepanel.h @@ -23,7 +23,7 @@ #include "toolpanel.h" class CoarsePanel final : - public Gtk::HBox, + public Gtk::Box, public ToolPanel { diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 62f6eee2c..41f6952a7 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -25,6 +25,7 @@ #include "guiutils.h" #include "options.h" #include "rtimage.h" +#include "eventmapper.h" #include "../rtengine/color.h" #include "../rtengine/procparams.h" @@ -32,29 +33,31 @@ #define MINTEMP0 2000 //1200 #define MAXTEMP0 12000 //12000 -#define CENTERTEMP0 5000 +#define CENTERTEMP0 5003 #define MINGREEN0 0.8 #define MAXGREEN0 1.2 #define MINLA0 0.01 #define MAXLA0 16384 -#define CENTERLA0 500 +//#define CENTERLA0 500 using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring ColorAppearance::TOOL_NAME = "colorappearance"; + static double wbSlider2Temp (double sval) { // slider range: 0 - 10000 double temp; - if (sval <= 5000) { + if (sval <= 5003) { // linear below center-temp - temp = MINTEMP0 + (sval / 5000.0) * (CENTERTEMP0 - MINTEMP0); + temp = MINTEMP0 + (sval / 5003.0) * (CENTERTEMP0 - MINTEMP0); } else { const double slope = (double) (CENTERTEMP0 - MINTEMP0) / (MAXTEMP0 - CENTERTEMP0); - double x = (sval - 5000) / 5000; // x 0..1 + double x = (sval - 5003) / 5003; // x 0..1 double y = x * slope + (1.0 - slope) * pow (x, 4.0); //double y = pow(x, 4.0); temp = CENTERTEMP0 + y * (MAXTEMP0 - CENTERTEMP0); @@ -70,7 +73,7 @@ static double wbSlider2Temp (double sval) return temp; } - +/* static double wbSlider2la (double sval) { @@ -98,7 +101,8 @@ static double wbSlider2la (double sval) return la; } - +*/ +/* static double wbla2Slider (double la) { @@ -152,7 +156,7 @@ static double wbla2Slider (double la) return sval; } - +*/ static double wbTemp2Slider (double temp) @@ -161,7 +165,7 @@ static double wbTemp2Slider (double temp) double sval; if (temp <= CENTERTEMP0) { - sval = ((temp - MINTEMP0) / (CENTERTEMP0 - MINTEMP0)) * 5000.0; + sval = ((temp - MINTEMP0) / (CENTERTEMP0 - MINTEMP0)) * 5003.0; } else { const double slope = (double) (CENTERTEMP0 - MINTEMP0) / (MAXTEMP0 - CENTERTEMP0); const double y = (temp - CENTERTEMP0) / (MAXTEMP0 - CENTERTEMP0); @@ -174,7 +178,7 @@ static double wbTemp2Slider (double temp) for (;;) { double y1 = x * slope + (1.0 - slope) * pow (x, 4.0); - if (5000 * fabs (y1 - y) < 0.1) { + if (5003 * fabs (y1 - y) < 0.1) { break; } @@ -195,7 +199,7 @@ static double wbTemp2Slider (double temp) } } - sval = 5000.0 + x * 5000.0; + sval = 5003.0 + x * 5003.0; } if (sval < 0) { @@ -210,35 +214,87 @@ static double wbTemp2Slider (double temp) } -ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance", M ("TP_COLORAPP_LABEL"), false, true) +ColorAppearance::ColorAppearance () : FoldableToolPanel (this, TOOL_NAME, M ("TP_COLORAPP_LABEL"), false, true) { CurveListener::setMulti (true); std::vector milestones; milestones.push_back ( GradientMilestone (0., 0., 0., 0.) ); milestones.push_back ( GradientMilestone (1., 1., 1., 1.) ); + auto m = ProcEventMapper::getInstance(); + EvCATAutotempout = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_TEMPOUT"); + EvCATillum = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ILLUM"); + EvCATcomplex = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CATCOMPLEX"); + EvCATmodel = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CATMODEL"); + EvCATcat = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_CATCAT"); + //preset button cat02/16 + Gtk::Frame *genFrame; + Gtk::Box* genVBox; + genFrame = Gtk::manage (new Gtk::Frame (M ("TP_COLORAPP_GEN")) ); + genFrame->set_label_align (0.025, 0.5); + genFrame->set_tooltip_markup (M ("TP_COLORAPP_GEN_TOOLTIP")); + genVBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + genVBox->set_spacing (2); + + complexmethod = Gtk::manage (new MyComboBoxText ()); + complexmethod->append(M("TP_WAVELET_COMPNORMAL")); + complexmethod->append(M("TP_WAVELET_COMPEXPERT")); + complexmethodconn = complexmethod->signal_changed().connect(sigc::mem_fun(*this, &ColorAppearance::complexmethodChanged)); + complexmethod->set_tooltip_text(M("TP_WAVELET_COMPLEX_TOOLTIP")); + Gtk::Box* const complexHBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const complexLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_COMPLEXLAB") + ":")); + complexHBox->pack_start(*complexLabel, Gtk::PACK_SHRINK, 4); + complexHBox->pack_start(*complexmethod); + genVBox->pack_start (*complexHBox, Gtk::PACK_SHRINK); + + modelmethod = Gtk::manage (new MyComboBoxText ()); + modelmethod->append(M("TP_COLORAPP_MOD02")); + modelmethod->append(M("TP_COLORAPP_MOD16")); + modelmethodconn = modelmethod->signal_changed().connect(sigc::mem_fun(*this, &ColorAppearance::modelmethodChanged)); + modelmethod->set_tooltip_text(M("TP_COLORAPP_MODELCAT_TOOLTIP")); + Gtk::Box* const modelHBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const modelLabel = Gtk::manage(new Gtk::Label(M("TP_COLORAPP_MODELCAT") + ":")); + modelHBox->pack_start(*modelLabel, Gtk::PACK_SHRINK, 4); + modelHBox->pack_start(*modelmethod); + genVBox->pack_start (*modelHBox, Gtk::PACK_SHRINK); - // ------------------------ Process #1: Converting to CIECAM + catmethod = Gtk::manage (new MyComboBoxText ()); + catmethod->append(M("TP_COLORAPP_CATCLASSIC")); + catmethod->append(M("TP_COLORAPP_CATSYMGEN")); + catmethod->append(M("TP_COLORAPP_CATSYMSPE")); + catmethodconn = catmethod->signal_changed().connect(sigc::mem_fun(*this, &ColorAppearance::catmethodChanged)); + catmethod->set_tooltip_text(M("TP_COLORAPP_CATMET_TOOLTIP")); + Gtk::Box* const catHBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const catLabel = Gtk::manage(new Gtk::Label(M("TP_COLORAPP_CATMOD") + ":")); + catHBox->pack_start(*catLabel, Gtk::PACK_SHRINK, 4); + catHBox->pack_start(*catmethod); + genVBox->pack_start (*catHBox, Gtk::PACK_SHRINK); + + + genFrame->add (*genVBox); + pack_start (*genFrame, Gtk::PACK_EXPAND_WIDGET, 4); + + // ----------------------- Process #1: Converting to CIECAM // Process 1 frame Gtk::Frame *p1Frame; // Vertical box container for the content of the Process 1 frame - Gtk::VBox *p1VBox; + Gtk::Box* p1VBox; p1Frame = Gtk::manage (new Gtk::Frame (M ("TP_COLORAPP_LABEL_SCENE")) ); p1Frame->set_label_align (0.025, 0.5); - - p1VBox = Gtk::manage ( new Gtk::VBox()); + p1Frame->set_tooltip_markup (M ("TP_COLORAPP_SOURCEF_TOOLTIP")); + p1VBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); p1VBox->set_spacing (2); - degree = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 100.)); + degree = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 90.)); + degree->set_tooltip_markup (M ("TP_COLORAPP_DEGREE_TOOLTIP")); + degree->setAdjusterListener(this); - if (degree->delay < options.adjusterMaxDelay) { - degree->delay = options.adjusterMaxDelay; - } + // degree->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - degree->throwOnButtonRelease(); + // degree->throwOnButtonRelease(); degree->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); p1VBox->pack_start (*degree); @@ -246,10 +302,10 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // surrsource->set_tooltip_markup (M ("TP_COLORAPP_SURSOURCE_TOOLTIP")); - Gtk::HBox* surrHBox1 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* surrHBox1 = Gtk::manage (new Gtk::Box ()); surrHBox1->set_spacing (2); - surrHBox1->set_tooltip_markup (M ("TP_COLORAPP_SURROUND_TOOLTIP")); - Gtk::Label* surrLabel1 = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surrHBox1->set_tooltip_markup (M ("TP_COLORAPP_SURSOURCE_TOOLTIP")); + Gtk::Label* surrLabel1 = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUNDSRC") + ":")); surrHBox1->pack_start (*surrLabel1, Gtk::PACK_SHRINK); surrsrc = Gtk::manage (new MyComboBoxText ()); surrsrc->append (M ("TP_COLORAPP_SURROUND_AVER")); @@ -262,7 +318,10 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // p1VBox->pack_start (*surrsource, Gtk::PACK_SHRINK); - Gtk::HBox* wbmHBox = Gtk::manage (new Gtk::HBox ()); + + + wbmHBox = Gtk::manage (new Gtk::Box ()); + wbmHBox->set_spacing (2); wbmHBox->set_tooltip_markup (M ("TP_COLORAPP_MODEL_TOOLTIP")); Gtk::Label* wbmLab = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_MODEL") + ":")); @@ -276,6 +335,26 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" wbmHBox->pack_start (*wbmodel); p1VBox->pack_start (*wbmHBox); + + illumHBox = Gtk::manage (new Gtk::Box ()); + illumHBox->set_spacing (2); + illumHBox->set_tooltip_markup (M ("TP_COLORAPP_ILLUM_TOOLTIP")); + Gtk::Label* illumLab = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_ILLUM") + ":")); + illumHBox->pack_start (*illumLab, Gtk::PACK_SHRINK); + illum = Gtk::manage (new MyComboBoxText ()); + illum->append (M ("TP_COLORAPP_ILA")); + illum->append (M ("TP_COLORAPP_IL41")); + illum->append (M ("TP_COLORAPP_IL50")); + illum->append (M ("TP_COLORAPP_IL55")); + illum->append (M ("TP_COLORAPP_IL60")); + illum->append (M ("TP_COLORAPP_IL65")); + illum->append (M ("TP_COLORAPP_IL75")); + illum->append (M ("TP_COLORAPP_ILFREE")); + + illum->set_active (0); + illumHBox->pack_start (*illum); + p1VBox->pack_start (*illumHBox); + 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")); @@ -293,23 +372,23 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // 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)); +// adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 1997.4, NULL, NULL, &wbSlider2la, &wbla2Slider)); + adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 2000.));//, NULL, NULL, &wbSlider2la, &wbla2Slider)); + adapscen->setLogScale(500, 0); - if (adapscen->delay < options.adjusterMaxDelay) { - adapscen->delay = options.adjusterMaxDelay; - } + // adapscen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + adapscen->set_tooltip_markup (M ("TP_COLORAPP_ADAPSCEN_TOOLTIP")); - adapscen->throwOnButtonRelease(); +// adapscen->throwOnButtonRelease(); adapscen->addAutoButton(); p1VBox->pack_start (*adapscen); ybscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 1, 90, 1, 18)); + ybscen->set_tooltip_markup (M ("TP_COLORAPP_YBSCEN_TOOLTIP")); - if (ybscen->delay < options.adjusterMaxDelay) { - ybscen->delay = options.adjusterMaxDelay; - } + // ybscen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - ybscen->throwOnButtonRelease(); +// ybscen->throwOnButtonRelease(); ybscen->addAutoButton(); p1VBox->pack_start (*ybscen); @@ -328,17 +407,17 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" /* Gtk::Frame *p2Frame; // Vertical box container for the content of the Process 1 frame - Gtk::VBox *p2VBox; + Gtk::Box* p2VBox; p2Frame = Gtk::manage (new Gtk::Frame (M ("TP_COLORAPP_LABEL_CAM02")) ); p2Frame->set_label_align (0.025, 0.5); */ - Gtk::VBox *p2VBox; + Gtk::Box* p2VBox; - p2VBox = Gtk::manage ( new Gtk::VBox()); + p2VBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); p2VBox->set_spacing (2); - Gtk::HBox* alHBox = Gtk::manage (new Gtk::HBox ()); + alHBox = Gtk::manage (new Gtk::Box ()); alHBox->set_spacing (2); alHBox->set_tooltip_markup (M ("TP_COLORAPP_ALGO_TOOLTIP")); Gtk::Label* alLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_ALGO") + ":")); @@ -352,97 +431,80 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" alHBox->pack_start (*algo); p2VBox->pack_start (*alHBox); - p2VBox->pack_start (*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_EXPAND_WIDGET, 4); + p2VBox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_EXPAND_WIDGET, 4); jlight = Gtk::manage (new Adjuster (M ("TP_COLORAPP_LIGHT"), -100.0, 100.0, 0.1, 0.)); + jlight->setAdjusterListener (this); - if (jlight->delay < options.adjusterMaxDelay) { - jlight->delay = options.adjusterMaxDelay; - } + // jlight->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - jlight->throwOnButtonRelease(); + // jlight->throwOnButtonRelease(); jlight->set_tooltip_markup (M ("TP_COLORAPP_LIGHT_TOOLTIP")); p2VBox->pack_start (*jlight); qbright = Gtk::manage (new Adjuster (M ("TP_COLORAPP_BRIGHT"), -100.0, 100.0, 0.1, 0.)); - if (qbright->delay < options.adjusterMaxDelay) { - qbright->delay = options.adjusterMaxDelay; - } + // qbright->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - qbright->throwOnButtonRelease(); +// qbright->throwOnButtonRelease(); qbright->set_tooltip_markup (M ("TP_COLORAPP_BRIGHT_TOOLTIP")); p2VBox->pack_start (*qbright); chroma = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CHROMA"), -100.0, 100.0, 0.1, 0.)); - if (chroma->delay < options.adjusterMaxDelay) { - chroma->delay = options.adjusterMaxDelay; - } + // chroma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - chroma->throwOnButtonRelease(); +// chroma->throwOnButtonRelease(); chroma->set_tooltip_markup (M ("TP_COLORAPP_CHROMA_TOOLTIP")); p2VBox->pack_start (*chroma); schroma = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CHROMA_S"), -100.0, 100.0, 0.1, 0.)); - if (schroma->delay < options.adjusterMaxDelay) { - schroma->delay = options.adjusterMaxDelay; - } + // schroma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - schroma->throwOnButtonRelease(); +// schroma->throwOnButtonRelease(); schroma->set_tooltip_markup (M ("TP_COLORAPP_CHROMA_S_TOOLTIP")); p2VBox->pack_start (*schroma); mchroma = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CHROMA_M"), -100.0, 100.0, 0.1, 0.)); - if (mchroma->delay < options.adjusterMaxDelay) { - mchroma->delay = options.adjusterMaxDelay; - } + // mchroma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - mchroma->throwOnButtonRelease(); +// mchroma->throwOnButtonRelease(); mchroma->set_tooltip_markup (M ("TP_COLORAPP_CHROMA_M_TOOLTIP")); p2VBox->pack_start (*mchroma); rstprotection = Gtk::manage ( new Adjuster (M ("TP_COLORAPP_RSTPRO"), 0., 100., 0.1, 0.) ); - if (rstprotection->delay < options.adjusterMaxDelay) { - rstprotection->delay = options.adjusterMaxDelay; - } + // rstprotection->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - rstprotection->throwOnButtonRelease(); + // rstprotection->throwOnButtonRelease(); rstprotection->set_tooltip_markup (M ("TP_COLORAPP_RSTPRO_TOOLTIP")); p2VBox->pack_start (*rstprotection); contrast = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CONTRAST"), -100.0, 100.0, 0.1, 0.)); - if (contrast->delay < options.adjusterMaxDelay) { - contrast->delay = options.adjusterMaxDelay; - } + // contrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - contrast->throwOnButtonRelease(); +// contrast->throwOnButtonRelease(); contrast->set_tooltip_markup (M ("TP_COLORAPP_CONTRAST_TOOLTIP")); p2VBox->pack_start (*contrast); qcontrast = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CONTRAST_Q"), -100.0, 100.0, 0.1, 0.)); - if (qcontrast->delay < options.adjusterMaxDelay) { - qcontrast->delay = options.adjusterMaxDelay; - } + // qcontrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - qcontrast->throwOnButtonRelease(); + // qcontrast->throwOnButtonRelease(); qcontrast->set_tooltip_markup (M ("TP_COLORAPP_CONTRAST_Q_TOOLTIP")); p2VBox->pack_start (*qcontrast); colorh = Gtk::manage (new Adjuster (M ("TP_COLORAPP_HUE"), -100.0, 100.0, 0.1, 0.)); - if (colorh->delay < options.adjusterMaxDelay) { - colorh->delay = options.adjusterMaxDelay; - } + // colorh->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - colorh->throwOnButtonRelease(); +// colorh->throwOnButtonRelease(); colorh->set_tooltip_markup (M ("TP_COLORAPP_HUE_TOOLTIP")); p2VBox->pack_start (*colorh); @@ -456,7 +518,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" sharpcieconn = sharpcie->signal_toggled().connect( sigc::mem_fun(*this, &ColorAppearance::sharpcie_toggled) ); p2VBox->pack_start (*sharpcie); */ - p2VBox->pack_start (*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_EXPAND_WIDGET, 4); + p2VBox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_EXPAND_WIDGET, 4); toneCurveMode = Gtk::manage (new MyComboBoxText ()); toneCurveMode->append (M ("TP_COLORAPP_TCMODE_LIGHTNESS")); @@ -469,6 +531,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" curveEditorG->setTooltip (M ("TP_COLORAPP_CURVEEDITOR1_TOOLTIP")); shape = static_cast (curveEditorG->addCurve (CT_Diagonal, "", toneCurveMode)); + // shape = static_cast (curveEditorG->addCurve (CT_Diagonal, "J(J)")); @@ -484,6 +547,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" curveEditorG2->setCurveListener (this); shape2 = static_cast (curveEditorG2->addCurve (CT_Diagonal, "", toneCurveMode2)); +// shape2 = static_cast (curveEditorG2->addCurve (CT_Diagonal, "J(J)")); tcmode2conn = toneCurveMode2->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::curveMode2Changed), true ); @@ -523,7 +587,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" float R, G, B; for (int i = 0; i < 7; i++) { - float x = float (i) * (1.0f / 6.0); + float x = float (i) * (1.0f / 6.f); Color::hsv2rgb01 (x, 0.5f, 0.5f, R, G, B); shape3Milestones.push_back ( GradientMilestone (double (x), double (R), double (G), double (B)) ); } @@ -573,39 +637,38 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // Process 3 frame Gtk::Frame *p3Frame; // Vertical box container for the content of the Process 3 frame - Gtk::VBox *p3VBox; + Gtk::Box* p3VBox; p3Frame = Gtk::manage (new Gtk::Frame (M ("TP_COLORAPP_LABEL_VIEWING")) ); // "Editing viewing conditions" ??? p3Frame->set_label_align (0.025, 0.5); + p3Frame->set_tooltip_markup (M ("TP_COLORAPP_VIEWINGF_TOOLTIP")); - p3VBox = Gtk::manage ( new Gtk::VBox()); + p3VBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); p3VBox->set_spacing (2); 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)); + adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 16.));//, NULL, NULL, &wbSlider2la, &wbla2Slider)); + adaplum->setLogScale(500, 0); - if (adaplum->delay < options.adjusterMaxDelay) { - adaplum->delay = options.adjusterMaxDelay; - } + // adaplum->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - adaplum->throwOnButtonRelease(); + // adaplum->throwOnButtonRelease(); adaplum->set_tooltip_markup (M ("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); p3VBox->pack_start (*adaplum); // 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.)); + degreeout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREEOUT"), 0., 100., 1., 90.)); - if (degreeout->delay < options.adjusterMaxDelay) { - degreeout->delay = options.adjusterMaxDelay; - } + // degreeout->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + + // degreeout->throwOnButtonRelease(); + degreeout->set_tooltip_markup (M ("TP_COLORAPP_DEGREOUT_TOOLTIP")); - degreeout->throwOnButtonRelease(); degreeout->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); p3VBox->pack_start (*degreeout); /* @@ -617,16 +680,28 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" 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_MEANLUMINANCE"), 5, 90, 1, 18)); - tempout->set_tooltip_markup (M ("TP_COLORAPP_TEMP_TOOLTIP")); + ybout->set_tooltip_markup (M ("TP_COLORAPP_YBOUT_TOOLTIP")); + tempout->set_tooltip_markup (M ("TP_COLORAPP_TEMP2_TOOLTIP")); +// tempout->throwOnButtonRelease(); + tempout->addAutoButton (M ("TP_COLORAPP_TEMPOUT_TOOLTIP")); + // I renable tempout with addautobutton to work properly (and all code disabled). There are certainly some redundancies, but it doesn't matter tempout->show(); greenout->show(); ybout->show(); - p3VBox->pack_start (*tempout); - p3VBox->pack_start (*greenout); + Gtk::Frame *tempgreenFrame; + tempgreenFrame = Gtk::manage(new Gtk::Frame()); + tempgreenFrame->set_label_align (0.025, 0.5); + Gtk::Box* tempgreenVBox; + tempgreenVBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + tempgreenVBox->set_spacing (2); + tempgreenVBox->pack_start (*tempout); + tempgreenVBox->pack_start (*greenout); + tempgreenFrame->add(*tempgreenVBox); + p3VBox->pack_start(*tempgreenFrame); p3VBox->pack_start (*ybout); - Gtk::HBox* surrHBox = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* surrHBox = Gtk::manage (new Gtk::Box ()); surrHBox->set_spacing (2); surrHBox->set_tooltip_markup (M ("TP_COLORAPP_SURROUND_TOOLTIP")); Gtk::Label* surrLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); @@ -648,7 +723,6 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" gamut = Gtk::manage (new Gtk::CheckButton (M ("TP_COLORAPP_GAMUT"))); - gamut->set_tooltip_markup (M ("TP_COLORAPP_GAMUT_TOOLTIP")); gamutconn = gamut->signal_toggled().connect ( sigc::mem_fun (*this, &ColorAppearance::gamut_toggled) ); pack_start (*gamut, Gtk::PACK_SHRINK); @@ -662,11 +736,9 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" */ badpixsl = Gtk::manage (new Adjuster (M ("TP_COLORAPP_BADPIXSL"), 0, 2, 1, 0)); - if (badpixsl->delay < options.adjusterMaxDelay) { - badpixsl->delay = options.adjusterMaxDelay; - } + // badpixsl->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); - badpixsl->throwOnButtonRelease(); + // badpixsl->throwOnButtonRelease(); badpixsl->set_tooltip_markup (M ("TP_COLORAPP_BADPIXSL_TOOLTIP")); pack_start (*badpixsl, Gtk::PACK_SHRINK); @@ -677,7 +749,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" 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")); + neutral->set_tooltip_text (M ("TP_COLORAPP_NEUTRAL_TOOLTIP")); neutralconn = neutral->signal_pressed().connect ( sigc::mem_fun (*this, &ColorAppearance::neutral_pressed) ); neutral->show(); @@ -690,6 +762,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" // surrconn = surrsource->signal_toggled().connect ( sigc::mem_fun (*this, &ColorAppearance::surrsource_toggled) ); wbmodelconn = wbmodel->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::wbmodelChanged) ); + illumconn = illum->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::illumChanged) ); algoconn = algo->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::algoChanged) ); surroundconn = surround->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::surroundChanged) ); surrsrcconn = surrsrc->signal_changed().connect ( sigc::mem_fun (*this, &ColorAppearance::surrsrcChanged) ); @@ -759,14 +832,16 @@ void ColorAppearance::neutral_pressed () qcontrast->resetValue (false); colorh->resetValue (false); tempout->resetValue (false); + tempout->setAutoValue (true); greenout->resetValue (false); ybout->resetValue (false); tempsc->resetValue (false); greensc->resetValue (false); badpixsl->resetValue (false); wbmodel->set_active (0); + illum->set_active (2); toneCurveMode->set_active (0); - toneCurveMode2->set_active (0); + toneCurveMode2->set_active (1); toneCurveMode3->set_active (0); shape->reset(); shape2->reset(); @@ -798,6 +873,9 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); + complexmethodconn.block(true); + modelmethodconn.block(true); + catmethodconn.block(true); tcmodeconn.block (true); tcmode2conn.block (true); tcmode3conn.block (true); @@ -809,9 +887,13 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) toneCurveMode3->set_active (toUnderlying(pp->colorappearance.curveMode3)); curveMode3Changed(); // This will set the correct sensitive state of depending Adjusters + nexttemp = pp->wb.temperature; + nextgreen = 1.; //pp->wb.green; + if (pedited) { degree->setEditedState (pedited->colorappearance.degree ? Edited : UnEdited); degreeout->setEditedState (pedited->colorappearance.degreeout ? Edited : UnEdited); + tempout->setEditedState (pedited->colorappearance.tempout ? Edited : UnEdited); adapscen->setEditedState (pedited->colorappearance.adapscen ? Edited : UnEdited); ybscen->setEditedState (pedited->colorappearance.ybscen ? Edited : UnEdited); adaplum->setEditedState (pedited->colorappearance.adaplum ? Edited : UnEdited); @@ -842,6 +924,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) adapscen->setAutoInconsistent (multiImage && !pedited->colorappearance.autoadapscen); ybscen->setAutoInconsistent (multiImage && !pedited->colorappearance.autoybscen); set_inconsistent (multiImage && !pedited->colorappearance.enabled); + tempout->setAutoInconsistent (multiImage && !pedited->colorappearance.autotempout); shape->setUnChanged (!pedited->colorappearance.curve); shape2->setUnChanged (!pedited->colorappearance.curve2); @@ -850,6 +933,15 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) if (!pedited->colorappearance.curveMode) { toneCurveMode->set_active (2); } + if (!pedited->colorappearance.complexmethod) { + complexmethod->set_active_text(M("GENERAL_UNCHANGED")); + } + if (!pedited->colorappearance.modelmethod) { + modelmethod->set_active_text(M("GENERAL_UNCHANGED")); + } + if (!pedited->colorappearance.catmethod) { + catmethod->set_active_text(M("GENERAL_UNCHANGED")); + } if (!pedited->colorappearance.curveMode2) { toneCurveMode2->set_active (2); @@ -864,6 +956,30 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) setEnabled (pp->colorappearance.enabled); + if (pp->colorappearance.complexmethod == "normal") { + complexmethod->set_active(0); + } else if (pp->colorappearance.complexmethod == "expert") { + complexmethod->set_active(1); + } + + modelmethod->set_active(0); + + if (pp->colorappearance.modelmethod == "02") { + modelmethod->set_active(0); + } else if (pp->colorappearance.modelmethod == "16") { + modelmethod->set_active(1); + } + + catmethod->set_active(0); + + if (pp->colorappearance.catmethod == "clas") { + catmethod->set_active(0); + } else if (pp->colorappearance.catmethod == "symg") { + catmethod->set_active(1); + } else if (pp->colorappearance.catmethod == "symc") { + catmethod->set_active(2); + } + surrsrcconn.block (true); if (pedited && !pedited->colorappearance.surrsrc) { @@ -919,6 +1035,32 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) // Have to be manually called to handle initial state update wbmodelChanged(); + illumconn.block (true); + + if (pedited && !pedited->colorappearance.illum) { + illum->set_active (8); + } else if (pp->colorappearance.illum == "iA") { + illum->set_active (0); + } else if (pp->colorappearance.illum == "i41") { + illum->set_active (1); + } else if (pp->colorappearance.illum == "i50") { + illum->set_active (2); + } else if (pp->colorappearance.illum == "i55") { + illum->set_active (3); + } else if (pp->colorappearance.illum == "i60") { + illum->set_active (4); + } else if (pp->colorappearance.illum == "i65") { + illum->set_active (5); + } else if (pp->colorappearance.illum == "i75") { + illum->set_active (6); + } else if (pp->colorappearance.illum == "ifree") { + illum->set_active (7); + } + + illumconn.block (false); + // Have to be manually called to handle initial state update + illumChanged(); + algoconn.block (true); if (pedited && !pedited->colorappearance.algo) { @@ -967,6 +1109,7 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) lastAutoAdapscen = pp->colorappearance.autoadapscen; lastAutoDegreeout = pp->colorappearance.autodegreeout; lastAutoybscen = pp->colorappearance.autoybscen; + lastAutotempout = pp->colorappearance.autotempout; degree->setValue (pp->colorappearance.degree); degree->setAutoValue (pp->colorappearance.autodegree); @@ -989,14 +1132,26 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) qcontrast->setValue (pp->colorappearance.qcontrast); colorh->setValue (pp->colorappearance.colorh); tempout->setValue (pp->colorappearance.tempout); + tempout->setAutoValue (pp->colorappearance.autotempout); greenout->setValue (pp->colorappearance.greenout); ybout->setValue (pp->colorappearance.ybout); tempsc->setValue (pp->colorappearance.tempsc); greensc->setValue (pp->colorappearance.greensc); + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + tcmode3conn.block (false); tcmode2conn.block (false); tcmodeconn.block (false); + catmethodconn.block(false); + modelmethodconn.block(false); + complexmethodconn.block(false); enableListener (); } void ColorAppearance::autoOpenCurve () @@ -1041,6 +1196,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.curve2 = shape2->getCurve (); pp->colorappearance.curve3 = shape3->getCurve (); pp->colorappearance.tempout = tempout->getValue (); + pp->colorappearance.autotempout = tempout->getAutoValue (); pp->colorappearance.greenout = greenout->getValue (); pp->colorappearance.ybout = ybout->getValue (); pp->colorappearance.tempsc = tempsc->getValue (); @@ -1073,6 +1229,9 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) } if (pedited) { + pedited->colorappearance.complexmethod = complexmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->colorappearance.modelmethod = modelmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->colorappearance.catmethod = catmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->colorappearance.degree = degree->getEditedState (); pedited->colorappearance.degreeout = degreeout->getEditedState (); pedited->colorappearance.adapscen = adapscen->getEditedState (); @@ -1096,6 +1255,7 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorappearance.surround = surround->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->colorappearance.surrsrc = surrsrc->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->colorappearance.wbmodel = wbmodel->get_active_text() != M ("GENERAL_UNCHANGED"); + pedited->colorappearance.illum = illum->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->colorappearance.algo = algo->get_active_text() != M ("GENERAL_UNCHANGED"); // pedited->colorappearance.surrsource = !surrsource->get_inconsistent(); pedited->colorappearance.gamut = !gamut->get_inconsistent(); @@ -1114,9 +1274,30 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorappearance.ybout = ybout->getEditedState (); pedited->colorappearance.tempsc = tempsc->getEditedState (); pedited->colorappearance.greensc = greensc->getEditedState (); + pedited->colorappearance.autotempout = !tempout->getAutoInconsistent(); } + if (complexmethod->get_active_row_number() == 0) { + pp->colorappearance.complexmethod = "normal"; + } else if (complexmethod->get_active_row_number() == 1) { + pp->colorappearance.complexmethod = "expert"; + } + + if (modelmethod->get_active_row_number() == 0) { + pp->colorappearance.modelmethod = "02"; + } else if (modelmethod->get_active_row_number() == 1) { + pp->colorappearance.modelmethod = "16"; + } + + if (catmethod->get_active_row_number() == 0) { + pp->colorappearance.catmethod = "clas"; + } else if (catmethod->get_active_row_number() == 1) { + pp->colorappearance.catmethod = "symg"; + } else if (catmethod->get_active_row_number() == 2) { + pp->colorappearance.catmethod = "symc"; + } + if (surrsrc->get_active_row_number() == 0) { pp->colorappearance.surrsrc = "Average"; } else if (surrsrc->get_active_row_number() == 1) { @@ -1144,7 +1325,24 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.wbmodel = "RawTCAT02"; } else if (wbmodel->get_active_row_number() == 2) { pp->colorappearance.wbmodel = "free"; + } + if (illum->get_active_row_number() == 0) { + pp->colorappearance.illum = "iA"; + } else if (illum->get_active_row_number() == 1) { + pp->colorappearance.illum = "i41"; + } else if (illum->get_active_row_number() == 2) { + pp->colorappearance.illum = "i50"; + } else if (illum->get_active_row_number() == 3) { + pp->colorappearance.illum = "i55"; + } else if (illum->get_active_row_number() == 4) { + pp->colorappearance.illum = "i60"; + } else if (illum->get_active_row_number() == 5) { + pp->colorappearance.illum = "i65"; + } else if (illum->get_active_row_number() == 6) { + pp->colorappearance.illum = "i75"; + } else if (illum->get_active_row_number() == 7) { + pp->colorappearance.illum = "ifree"; } if (algo->get_active_row_number() == 0) { @@ -1158,6 +1356,203 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) } } + + +void ColorAppearance::updateGUIToMode(int mode) +{ + if(mode ==0) { + alHBox->hide(); + wbmHBox->hide(); + curveEditorG->hide(); + curveEditorG2->hide(); + curveEditorG3->hide(); + //greenout->hide(); + greenout->set_sensitive(false); + + badpixsl->hide(); + datacie->hide(); + } else { + alHBox->show(); + wbmHBox->show(); + curveEditorG->show(); + curveEditorG2->show(); + curveEditorG3->show(); + // greenout->show(); + greenout->set_sensitive(true); + badpixsl->show(); + datacie->show(); + } + +} + +void ColorAppearance::convertParamToNormal() +{ + const ColorAppearanceParams def_params; + disableListener(); + algo->set_active (0); + shape->setCurve(def_params.curve); + shape2->setCurve(def_params.curve2); + shape3->setCurve(def_params.curve3); + shape->reset(); + shape2->reset(); + shape3->reset(); + wbmodel->set_active (0); + if (catmethod->get_active_row_number() == 1 || catmethod->get_active_row_number() == 2) { + wbmodel->set_active (2); + illumChanged(); + } + + greenout->setValue(def_params.greenout); + badpixsl->setValue(def_params.badpixsl); + + enableListener(); + + // Update GUI based on converted widget parameters: +} + +void ColorAppearance::complexmethodChanged() +{ + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvCATcomplex, complexmethod->get_active_text()); + } +} + +void ColorAppearance::modelmethodChanged() +{ + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvCATmodel, modelmethod->get_active_text()); + } +} + +void ColorAppearance::catmethodChanged() +{ + + if (catmethod->get_active_row_number() == 1) { + disableListener(); + jlight->resetValue (false); + qbright->resetValue (false); + chroma->resetValue (false); + schroma->resetValue (false); + mchroma->resetValue (false); + rstprotection->resetValue (false); + contrast->resetValue (false); + qcontrast->resetValue (false); + colorh->resetValue (false); + tempout->resetValue (false); + greenout->resetValue (false); + ybout->resetValue (false); + tempsc->resetValue (false); + greensc->resetValue (false); + badpixsl->resetValue (false); + illum->set_active (2); + toneCurveMode->set_active (0); + toneCurveMode2->set_active (1); + toneCurveMode3->set_active (0); + shape->reset(); + shape2->reset(); + shape3->reset(); + gamutconn.block (true); + gamut->set_active (true); + gamutconn.block (false); + degree->setAutoValue (true); + degree->resetValue (false); + degree->setValue(90); + adapscen->resetValue (false); + adapscen->setAutoValue (true); + degreeout->resetValue (false); + degreeout->setAutoValue (true); + ybscen->resetValue (false); + ybscen->setAutoValue (true); + surrsrc->set_active (0); + wbmodel->set_active (2); + tempsc->resetValue (false); + greensc->resetValue (false); + adapscen->setValue(400.); + ybscen->setValue(18); + surround->set_active (0); + adaplum->setValue(400.); + degreeout->setValue(90); + ybout->setValue(18); + tempout->setValue (nexttemp); + + if(tempout->getAutoValue()) { + tempout->resetValue (false); + tempout->setAutoValue (true); + } else { + tempout->resetValue (false); + tempout->setValue (nexttemp); + tempout->setAutoValue (true); + } + + greenout->setValue (nextgreen); + enableListener(); + + } else if (catmethod->get_active_row_number() == 0) { + disableListener(); + degree->setAutoValue (true); + degree->resetValue (false); + adapscen->resetValue (false); + adapscen->setAutoValue (true); + degreeout->resetValue (false); + degreeout->setAutoValue (true); + ybscen->resetValue (false); + ybscen->setAutoValue (true); + surrsrc->set_active (0); + wbmodel->set_active (0); + illum->set_active (2); + tempsc->resetValue (false); + greensc->resetValue (false); + adapscen->resetValue (false); + ybscen->resetValue (false); + surround->set_active (0); + adaplum->resetValue (false); + degreeout->resetValue (false); + ybout->resetValue (false); + tempout->resetValue (false); + tempout->setAutoValue (true); + greenout->resetValue (false); + enableListener(); + } else if (catmethod->get_active_row_number() == 2) { + disableListener(); + degree->setAutoValue (true); + degree->resetValue (false); + adapscen->resetValue (false); + adapscen->setAutoValue (true); + degreeout->resetValue (false); + degreeout->setAutoValue (true); + ybscen->resetValue (false); + ybscen->setAutoValue (true); + surrsrc->set_active (0); + wbmodel->set_active (2); + illum->set_active (2); + tempsc->resetValue (false); + greensc->resetValue (false); + adapscen->resetValue (false); + ybscen->resetValue (false); + surround->set_active (0); + adaplum->resetValue (false); + degreeout->resetValue (false); + ybout->resetValue (false); + tempout->resetValue (false); + tempout->setValue (nexttemp); + greenout->resetValue (false); + enableListener(); + } + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvCATcat, catmethod->get_active_text()); + } +} + void ColorAppearance::curveChanged (CurveEditor* ce) { @@ -1309,6 +1704,7 @@ void ColorAppearance::badpix_toggled () { } */ + void ColorAppearance::datacie_toggled () { @@ -1470,6 +1866,7 @@ void ColorAppearance::autoCamChanged (double ccam, double ccamout) void ColorAppearance::adapCamChanged (double cadap) { + idle_register.add( [this, cadap]() -> bool { @@ -1481,8 +1878,25 @@ void ColorAppearance::adapCamChanged (double cadap) ); } + +void ColorAppearance::wbCamChanged (double temp, double tin) +{//reactivate this function + + idle_register.add( + [this, temp, tin]() -> bool + { + disableListener(); + tempout->setValue(temp); + greenout->setValue(tin); + enableListener(); + return false; + } + ); +} + void ColorAppearance::ybCamChanged (int ybsc) { + idle_register.add( [this, ybsc]() -> bool { @@ -1602,10 +2016,18 @@ void ColorAppearance::adjusterAutoToggled(Adjuster* a) ybscen->setAutoInconsistent (true); } - lastAutoybscen = ybscen->getAutoValue(); + lastAutotempout = tempout->getAutoValue(); + + if (tempout->getAutoInconsistent()) { + tempout->setAutoInconsistent (false); + tempout->setAutoValue (false); + } else if (lastAutotempout) { + tempout->setAutoInconsistent (true); + } + + lastAutotempout = tempout->getAutoValue(); } - if (listener && (multiImage || getEnabled()) ) { if (a == degree) { @@ -1649,6 +2071,15 @@ void ColorAppearance::adjusterAutoToggled(Adjuster* a) } } + if (a == tempout) { + if (tempout->getAutoInconsistent()) { + listener->panelChanged (EvCATAutotempout, M ("GENERAL_UNCHANGED")); + } else if (tempout->getAutoValue()) { + listener->panelChanged (EvCATAutotempout, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvCATAutotempout, M ("GENERAL_DISABLED")); + } + } } } @@ -1688,13 +2119,19 @@ void ColorAppearance::surroundChanged () void ColorAppearance::wbmodelChanged () { if (wbmodel->get_active_row_number() == 0 || wbmodel->get_active_row_number() == 1) { + illum->hide(); + illumHBox->hide(); tempsc->hide(); greensc->hide(); + tempsc->setValue (5003); + greensc->setValue (1); } if (wbmodel->get_active_row_number() == 2) { + illumHBox->show(); tempsc->show(); greensc->show(); + illum->show(); } if (listener && (multiImage || getEnabled()) ) { @@ -1702,6 +2139,47 @@ void ColorAppearance::wbmodelChanged () } } +void ColorAppearance::illumChanged () +{ + if (illum->get_active_row_number() == 0) { + tempsc->setValue (2856); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 1) { + tempsc->setValue (4100); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 2) { + tempsc->setValue (5003); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 3) { + tempsc->setValue (5503); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 4) { + tempsc->setValue (6000); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 5) { + tempsc->setValue (6504); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 6) { + tempsc->setValue (7504); + tempsc->set_sensitive(false); + greensc->set_sensitive(false); + } else if (illum->get_active_row_number() == 7) { + tempsc->set_sensitive(true); + greensc->set_sensitive(true); + } + + if (listener && (multiImage || getEnabled()) ) { + listener->panelChanged (EvCATillum, illum->get_active_text ()); + } +} + + void ColorAppearance::algoChanged () { @@ -1801,9 +2279,13 @@ void ColorAppearance::setBatchMode (bool batchMode) tempsc->showEditedCB (); greensc->showEditedCB (); + complexmethod->append(M("GENERAL_UNCHANGED")); + modelmethod->append(M("GENERAL_UNCHANGED")); + catmethod->append(M("GENERAL_UNCHANGED")); surround->append (M ("GENERAL_UNCHANGED")); surrsrc->append (M ("GENERAL_UNCHANGED")); wbmodel->append (M ("GENERAL_UNCHANGED")); + illum->append (M ("GENERAL_UNCHANGED")); algo->append (M ("GENERAL_UNCHANGED")); toneCurveMode->append (M ("GENERAL_UNCHANGED")); toneCurveMode2->append (M ("GENERAL_UNCHANGED")); @@ -1833,7 +2315,7 @@ void ColorAppearance::updateCurveBackgroundHistogram( -void ColorAppearance::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 ColorAppearance::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, bool degreeoutadd, bool tempoutadd) { degree->setAddMode (degreeadd); @@ -1849,6 +2331,9 @@ void ColorAppearance::setAdjusterBehavior (bool degreeadd, bool adapscenadd, boo contrast->setAddMode (contrastadd); qcontrast->setAddMode (qcontrastadd); colorh->setAddMode (colorhadd); + degreeout->setAddMode (degreeoutadd); + tempout->setAddMode (tempoutadd); + } void ColorAppearance::trimValues (rtengine::procparams::ProcParams* pp) diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index c42bca774..714f3e557 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -39,6 +39,8 @@ class ColorAppearance final : public ColorProvider { public: + static const Glib::ustring TOOL_NAME; + ColorAppearance (); ~ColorAppearance () override; @@ -53,6 +55,7 @@ public: void surroundChanged (); void surrsrcChanged (); void wbmodelChanged (); + void illumChanged (); void algoChanged (); void surrsource_toggled (); void gamut_toggled (); @@ -63,10 +66,10 @@ public: void autoCamChanged (double ccam, double ccamout) override; bool autoCamComputed_ (); void adapCamChanged (double cadap) override; + void wbCamChanged(double tem, double tin) override; bool adapCamComputed_ (); void ybCamChanged (int yb) override; bool ybCamComputed_ (); - void curveChanged (CurveEditor* ce) override; void curveMode1Changed (); bool curveMode1Changed_ (); @@ -75,12 +78,17 @@ public: void curveMode3Changed (); bool curveMode3Changed_ (); void neutral_pressed (); + void complexmethodChanged(); + void modelmethodChanged(); + void catmethodChanged(); + void convertParamToNormal(); + void updateGUIToMode(int mode); void expandCurve (bool isExpanded); bool isCurveExpanded (); 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 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, bool degreeoutadd, bool tempoutadd); void trimValues (rtengine::procparams::ProcParams* pp) override; void updateCurveBackgroundHistogram( const LUTu& histToneCurve, @@ -99,6 +107,11 @@ public: void writeOptions (std::vector &tpOpen); private: + rtengine::ProcEvent EvCATAutotempout; + rtengine::ProcEvent EvCATillum; + rtengine::ProcEvent EvCATcomplex; + rtengine::ProcEvent EvCATmodel; + rtengine::ProcEvent EvCATcat; bool bgTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); bool srTTipQuery (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); void foldAllButMe (GdkEventButton* event, MyExpander *expander); @@ -134,6 +147,9 @@ private: MyComboBoxText* toneCurveMode; MyComboBoxText* toneCurveMode2; MyComboBoxText* toneCurveMode3; + MyComboBoxText* complexmethod; + MyComboBoxText* modelmethod; + MyComboBoxText* catmethod; //Adjuster* edge; Gtk::CheckButton* surrsource; @@ -143,6 +159,7 @@ private: Gtk::CheckButton* tonecie; // Gtk::CheckButton* sharpcie; Gtk::Button* neutral; + MyComboBoxText* surrsrc; sigc::connection surrsrcconn; @@ -150,11 +167,17 @@ private: sigc::connection surroundconn; MyComboBoxText* wbmodel; sigc::connection wbmodelconn; + MyComboBoxText* illum; + sigc::connection illumconn; MyComboBoxText* algo; sigc::connection algoconn; sigc::connection surrconn; sigc::connection gamutconn, datacieconn, tonecieconn /*,badpixconn , sharpcieconn*/; sigc::connection tcmodeconn, tcmode2conn, tcmode3conn, neutralconn; + sigc::connection complexmethodconn, modelmethodconn, catmethodconn; + Gtk::Box* alHBox; + Gtk::Box* wbmHBox; + Gtk::Box* illumHBox; CurveEditorGroup* curveEditorG; CurveEditorGroup* curveEditorG2; CurveEditorGroup* curveEditorG3; @@ -168,10 +191,13 @@ private: bool lastAutoAdapscen; bool lastAutoDegreeout; bool lastAutoybscen; + bool lastAutotempout; bool lastsurr; bool lastgamut; bool lastdatacie; bool lasttonecie; + double nexttemp; + double nextgreen; IdleRegister idle_register; }; diff --git a/rtgui/coloredbar.h b/rtgui/coloredbar.h index 6cc121cd5..f5156129e 100644 --- a/rtgui/coloredbar.h +++ b/rtgui/coloredbar.h @@ -27,10 +27,10 @@ * * WARNING: If the color has no gradient defined or can't get colors from the provider, * the bar will have undefined data, and the calling class will have to draw - * the bar itself, i.e. use render_background (depending on its Gtk::Style) + * the bar itself, i.e. use render_background (depending on its Gtk::StyleContext) * */ -class ColoredBar : private BackBuffer, public ColorCaller +class ColoredBar final : private BackBuffer, public ColorCaller { private: diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 59768a6ce..d9928cd13 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -14,6 +14,7 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring ColorToning::TOOL_NAME = "colortoning"; namespace { @@ -33,7 +34,7 @@ inline float round_ab(float v) } // namespace -ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLORTONING_LABEL"), false, true) +ColorToning::ColorToning () : FoldableToolPanel(this, TOOL_NAME, M("TP_COLORTONING_LABEL"), false, true) { nextbw = 0; CurveListener::setMulti(true); @@ -51,7 +52,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR method->set_active (0); method->set_tooltip_text (M("TP_COLORTONING_METHOD_TOOLTIP")); - ctbox = Gtk::manage (new Gtk::HBox ()); + ctbox = Gtk::manage (new Gtk::Box ()); Gtk::Label* lab = Gtk::manage (new Gtk::Label (M("TP_COLORTONING_METHOD"))); ctbox->pack_start (*lab, Gtk::PACK_SHRINK, 4); ctbox->pack_start (*method); @@ -61,7 +62,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR //----------- Color curve ------------------------------ - colorSep = Gtk::manage (new Gtk::HSeparator()); + colorSep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); pack_start (*colorSep); colorCurveEditorG = new CurveEditorGroup (options.lastColorToningCurvesDir, M("TP_COLORTONING_COLOR")); @@ -74,7 +75,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR // whole hue range for (int i = 0; i < 7; i++) { float R, G, B; - float x = float(i) * (1.0f / 6.0); + float x = float(i) * (1.0f / 6.f); Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); milestones.push_back( GradientMilestone(double(x), double(R), double(G), double(B)) ); } @@ -202,18 +203,18 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR //----------- Saturation and strength ------------------------------ -// satLimiterSep = Gtk::manage (new Gtk::HSeparator()); +// satLimiterSep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); // pack_start (*satLimiterSep, Gtk::PACK_SHRINK); // Gtk::Frame *p1Frame; // Vertical box container for the content of the Process 1 frame - Gtk::VBox *p1VBox; + Gtk::Box* p1VBox; p1Frame = Gtk::manage (new Gtk::Frame(M("TP_COLORTONING_SA")) ); p1Frame->set_label_align(0.025, 0.5); - p1VBox = Gtk::manage ( new Gtk::VBox()); + p1VBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); p1VBox->set_spacing(2); autosat = Gtk::manage (new Gtk::CheckButton (M("TP_COLORTONING_AUTOSAT"))); @@ -244,10 +245,10 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR // --------------------Sliders BW Colortoning ------------------- - chanMixerBox = Gtk::manage (new Gtk::VBox()); - Gtk::VBox *chanMixerHLBox = Gtk::manage (new Gtk::VBox()); - Gtk::VBox *chanMixerMidBox = Gtk::manage (new Gtk::VBox()); - Gtk::VBox *chanMixerShadowsBox = Gtk::manage (new Gtk::VBox()); + chanMixerBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* chanMixerHLBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* chanMixerMidBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* chanMixerShadowsBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); Gtk::Image* iblueR = Gtk::manage (new RTImage ("circle-blue-small.png")); Gtk::Image* iyelL = Gtk::manage (new RTImage ("circle-yellow-small.png")); @@ -296,6 +297,10 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR Gtk::Frame *chanMixerMidFrame = Gtk::manage (new Gtk::Frame(M("TP_COLORTONING_MIDTONES"))); Gtk::Frame *chanMixerShadowsFrame = Gtk::manage (new Gtk::Frame(M("TP_COLORTONING_SHADOWS"))); + chanMixerHLFrame->set_label_align (0.025, 0.5); + chanMixerMidFrame->set_label_align (0.025, 0.5); + chanMixerShadowsFrame->set_label_align (0.025, 0.5); + chanMixerHLFrame->add(*chanMixerHLBox); chanMixerMidFrame->add(*chanMixerMidBox); chanMixerShadowsFrame->add(*chanMixerShadowsBox); @@ -308,10 +313,10 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR pack_start( *strength, Gtk::PACK_SHRINK, 2); //I have moved after Chanmixer //--------------------- Reset sliders --------------------------- - neutrHBox = Gtk::manage (new Gtk::HBox ()); + neutrHBox = Gtk::manage (new Gtk::Box()); neutral = Gtk::manage (new Gtk::Button (M("TP_COLORTONING_NEUTRAL"))); - neutral->set_tooltip_text (M("TP_COLORTONING_NEUTRAL_TIP")); + neutral->set_tooltip_text (M("TP_COLORTONING_NEUTRAL_TOOLTIP")); neutralconn = neutral->signal_pressed().connect( sigc::mem_fun(*this, &ColorToning::neutral_pressed) ); neutral->show(); neutrHBox->pack_start (*neutral); @@ -342,7 +347,8 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR //------------------------------------------------------------------------ // LAB grid auto m = ProcEventMapper::getInstance(); - EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); +// EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); + EvColorToningLabGridValue = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); labgrid = Gtk::manage(new LabGrid(EvColorToningLabGridValue, M("TP_COLORTONING_LABGRID_VALUES"))); pack_start(*labgrid, Gtk::PACK_EXPAND_WIDGET, 4); //------------------------------------------------------------------------ @@ -374,7 +380,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR 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()); + labRegionBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); labRegionList = Gtk::manage(new Gtk::ListViewText(3)); labRegionList->set_size_request(-1, 150); @@ -384,9 +390,9 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR 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()); + Gtk::Box *hb = Gtk::manage(new Gtk::Box()); hb->pack_start(*labRegionList, Gtk::PACK_EXPAND_WIDGET); - Gtk::VBox *vb = Gtk::manage(new Gtk::VBox()); + Gtk::Box* vb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); 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)); @@ -429,7 +435,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR labRegionPower->setLogScale(4, 0.1); labRegionBox->pack_start(*labRegionPower); - hb = Gtk::manage(new Gtk::HBox()); + hb = Gtk::manage(new Gtk::Box()); labRegionChannel = Gtk::manage(new MyComboBoxText()); labRegionChannel->append(M("TP_COLORTONING_LABREGION_CHANNEL_ALL")); labRegionChannel->append(M("TP_COLORTONING_LABREGION_CHANNEL_R")); @@ -442,7 +448,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR hb->pack_start(*labRegionChannel); labRegionBox->pack_start(*hb); - labRegionBox->pack_start(*Gtk::manage(new Gtk::HSeparator())); + labRegionBox->pack_start(*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); CurveEditorGroup *labRegionEditorG = Gtk::manage(new CurveEditorGroup(options.lastColorToningCurvesDir, M("TP_COLORTONING_LABREGION_MASK"))); labRegionEditorG->setCurveListener(this); @@ -488,11 +494,11 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR 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; + labRegionSaturation->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionSlope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionOffset->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionPower->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + labRegionMaskBlur->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); //------------------------------------------------------------------------ show_all(); @@ -641,7 +647,7 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lastLumamode = pp->colorToning.lumamode; - 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); + 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, 0, 0, 0, 0,false); if (pedited && !pedited->colorToning.method) { method->set_active (7); @@ -710,8 +716,10 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.satProtectionThreshold = satProtectionThreshold->getIntValue(); pp->colorToning.saturatedOpacity = saturatedOpacity->getIntValue(); pp->colorToning.strength = strength->getIntValue(); - - labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + double zerox = 0.; + double zeroy = 0.; + + labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, zerox, zeroy, zerox, zeroy); pp->colorToning.labgridALow *= ColorToningParams::LABGRID_CORR_MAX; pp->colorToning.labgridAHigh *= ColorToningParams::LABGRID_CORR_MAX; pp->colorToning.labgridBLow *= ColorToningParams::LABGRID_CORR_MAX; @@ -827,7 +835,7 @@ 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 / 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); + 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, 0, 0, 0, 0); if (pedited) { @@ -1203,11 +1211,11 @@ void ColorToning::colorForValue (double valX, double valY, enum ColorCaller::Ele // the strength applied to the current hue double strength, hue; hlColSat->getValue(strength, hue); - Color::hsv2rgb01(hue / 360.f, 1.f, 1.f, R, G, B); + Color::hsv2rgb01(hue / 360.0, 1.f, 1.f, R, G, B); const double gray = 0.46; - R = (gray * (1.0 - valX)) + R * valX; - G = (gray * (1.0 - valX)) + G * valX; - B = (gray * (1.0 - valX)) + B * valX; + R = (gray * (1.0 - valX)) + static_cast(R) * valX; + G = (gray * (1.0 - valX)) + static_cast(G) * valX; + B = (gray * (1.0 - valX)) + static_cast(B) * valX; } } else if (callerId == 3) { // Slider 2 background if (valY <= 0.5) @@ -1218,17 +1226,17 @@ void ColorToning::colorForValue (double valX, double valY, enum ColorCaller::Ele // the strength applied to the current hue double strength, hue; shadowsColSat->getValue(strength, hue); - Color::hsv2rgb01(hue / 360.f, 1.f, 1.f, R, G, B); + Color::hsv2rgb01(hue / 360.0, 1.f, 1.f, R, G, B); const double gray = 0.46; - R = (gray * (1.0 - valX)) + R * valX; - G = (gray * (1.0 - valX)) + G * valX; - B = (gray * (1.0 - valX)) + B * valX; + R = (gray * (1.0 - valX)) + static_cast(R) * valX; + G = (gray * (1.0 - valX)) + static_cast(G) * valX; + B = (gray * (1.0 - valX)) + static_cast(B) * valX; } } 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; + float x = valX - 1.0/6.0; if (x < 0.f) { x += 1.f; } @@ -1425,7 +1433,9 @@ void ColorToning::labRegionGet(int idx) auto &r = labRegionData[idx]; double la, lb; - labRegionAB->getParams(la, lb, r.a, r.b); + double zerox = 0.; + double zeroy = 0.; + labRegionAB->getParams(la, lb, r.a, r.b, zerox, zeroy, zerox, zeroy); r.saturation = labRegionSaturation->getValue(); r.slope = labRegionSlope->getValue(); r.offset = labRegionOffset->getValue(); @@ -1561,9 +1571,9 @@ void ColorToning::labRegionShow(int idx, bool list_only) disableListener(); } rtengine::procparams::ColorToningParams::LabCorrectionRegion dflt; - auto &r = labRegionData[idx]; + auto &r = labRegionData[idx]; if (!list_only) { - labRegionAB->setParams(0, 0, r.a, r.b, false); + labRegionAB->setParams(0, 0, r.a, r.b,0, 0, 0, 0, false); labRegionSaturation->setValue(r.saturation); labRegionSlope->setValue(r.slope); labRegionOffset->setValue(r.offset); diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index f1024f41c..e763a069c 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -30,6 +30,8 @@ class ColorToning final : public AdjusterListener { public: + static const Glib::ustring TOOL_NAME; + ColorToning (); ~ColorToning() override; void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; @@ -79,8 +81,8 @@ private: void labRegionShow(int idx, bool list_only=false); void labRegionGet(int idx); - //Gtk::HSeparator* satLimiterSep; - Gtk::HSeparator* colorSep; + //Gtk::Separator* satLimiterSep; + Gtk::Separator* colorSep; CurveEditorGroup* colorCurveEditorG; CurveEditorGroup* opacityCurveEditorG; CurveEditorGroup* clCurveEditorG; @@ -89,10 +91,10 @@ private: FlatCurveEditor* colorShape; DiagonalCurveEditor* clshape; DiagonalCurveEditor* cl2shape; - Gtk::HBox* ctbox; + Gtk::Box* ctbox; Gtk::Frame *p1Frame; - Gtk::VBox* chanMixerBox; + Gtk::Box* chanMixerBox; MyComboBoxText* method; sigc::connection methodconn; MyComboBoxText* twocolor; @@ -116,7 +118,7 @@ private: Gtk::Image* irg; Gtk::Button* neutral; - Gtk::HBox* neutrHBox; + Gtk::Box* neutrHBox; int nextbw; int nextsatth; int nextsatpr; @@ -147,7 +149,7 @@ private: rtengine::ProcEvent EvLabRegionShowMask; rtengine::ProcEvent EvLabRegionChannel; - Gtk::VBox *labRegionBox; + Gtk::Box* labRegionBox; Gtk::ListViewText *labRegionList; Gtk::Button *labRegionAdd; Gtk::Button *labRegionRemove; diff --git a/rtgui/config.h.in b/rtgui/config.h.in index 95217b689..d3fc58cf7 100644 --- a/rtgui/config.h.in +++ b/rtgui/config.h.in @@ -22,10 +22,20 @@ #cmakedefine BUILD_BUNDLE #cmakedefine HAVE_UNALIGNED_MALLOC +#cmakedefine OSX_DEV_BUILD + +#if defined(__APPLE__) && !defined(OSX_DEV_BUILD) +#define DATA_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources/share" +#define DOC_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources" +#define CREDITS_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources" +#define LICENCE_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources" +#define LENSFUN_DB_PATH "${LENSFUNDBDIR}" +#else #define DATA_SEARCH_PATH "${DATADIR}" #define DOC_SEARCH_PATH "${DOCDIR}" #define CREDITS_SEARCH_PATH "${CREDITSDIR}" #define LICENCE_SEARCH_PATH "${LICENCEDIR}" #define LENSFUN_DB_PATH "${LENSFUNDBDIR}" +#endif #endif diff --git a/rtgui/controllines.cc b/rtgui/controllines.cc new file mode 100644 index 000000000..d28ef12ca --- /dev/null +++ b/rtgui/controllines.cc @@ -0,0 +1,611 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2020 Lawrence Lee + * + * 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 "controllines.h" +#include "editcallbacks.h" +#include "editwidgets.h" +#include "rtsurface.h" + +#include "../rtengine/perspectivecorrection.h" + +using namespace rtengine; + +namespace +{ + +enum GeometryIndex { + MO_CANVAS, + MO_OBJECT_COUNT, + + VISIBLE_OBJECT_COUNT = 0 +}; + +/** + * Offsets for mouse-over geometry that can be compared to the mouse-over object + * ID modded with the control line object count. + */ +enum GeometryOffset { + OFFSET_LINE = (MO_OBJECT_COUNT + ::ControlLine::LINE) % ::ControlLine::OBJECT_COUNT, + OFFSET_ICON = (MO_OBJECT_COUNT + ::ControlLine::ICON) % ::ControlLine::OBJECT_COUNT, + OFFSET_BEGIN = (MO_OBJECT_COUNT + ::ControlLine::BEGIN) % ::ControlLine::OBJECT_COUNT, + OFFSET_END = (MO_OBJECT_COUNT + ::ControlLine::END) % ::ControlLine::OBJECT_COUNT, +}; + +/** + * Returns true if the object matches the offset. + */ +constexpr bool checkOffset(int object_id, enum GeometryOffset offset) +{ + return object_id % ::ControlLine::OBJECT_COUNT == offset; +} + +/** + * Converts a control line mouse-over geometry ID to the visible geometry ID. + */ +constexpr int mouseOverIdToVisibleId(int mouse_over_id) +{ + return mouse_over_id - MO_OBJECT_COUNT + VISIBLE_OBJECT_COUNT; +} + +/** + * Converts a control line mouse-over geometry ID to the control line ID. + */ +constexpr int mouseOverIdToLineId(int mouse_over_id) +{ + return (mouse_over_id - MO_OBJECT_COUNT) / ::ControlLine::OBJECT_COUNT; +} + +} + +::ControlLine::~ControlLine() = default; + +ControlLineManager::ControlLineManager(): + EditSubscriber(ET_OBJECTS), + canvas_area(new Rectangle()), + cursor(CSHandOpen), + draw_mode(false), + drawing_line(false), + edited(false), + horizontalCount(0), verticalCount(0), + prev_obj(-1), + selected_object(-1) +{ + canvas_area->filled = true; + canvas_area->topLeft = Coord(0, 0); + mouseOverGeometry.push_back(canvas_area.get()); + + line_icon_h = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-horizontal-hicontrast.png")); + line_icon_v = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-vertical-hicontrast.png")); + line_icon_h_prelight = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-horizontal-prelight.png")); + line_icon_v_prelight = Cairo::RefPtr(new RTSurface( + "bidirectional-arrow-vertical-prelight.png")); +} + +ControlLineManager::~ControlLineManager() = default; + +void ControlLineManager::setActive(bool active) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider || (this == provider->getCurrSubscriber()) == active) { + return; + } + + if (active) { + subscribe(); + + int ih, iw; + provider->getImageSize(iw, ih); + canvas_area->bottomRight = Coord(iw, ih); + } else { + unsubscribe(); + } +} + +void ControlLineManager::setDrawMode(bool draw) +{ + draw_mode = draw; +} + +std::size_t ControlLineManager::size() const +{ + return control_lines.size(); +} + +std::size_t ControlLineManager::getHorizontalCount() const +{ + return horizontalCount; +} + +std::size_t ControlLineManager::getVerticalCount() const +{ + return verticalCount; +} + +bool ControlLineManager::button1Pressed(int modifierKey) +{ + EditDataProvider* dataProvider = getEditProvider(); + + if (!dataProvider) { + return false; + } + + drag_delta = Coord(0, 0); + + const int object = dataProvider->getObject(); + + if (object >= MO_OBJECT_COUNT) { // A control line. + if (checkOffset(object, OFFSET_ICON)) { // Icon. + action = Action::PICKING; + } else { + selected_object = object; + action = Action::DRAGGING; + } + } else if (draw_mode && (modifierKey & GDK_CONTROL_MASK)) { // Add new line. + if (object < 0) { + return false; + } + addLine(dataProvider->posImage, dataProvider->posImage); + drawing_line = true; + selected_object = mouseOverGeometry.size() - ::ControlLine::OBJECT_COUNT + ::ControlLine::END; // Select endpoint. + action = Action::DRAGGING; + } + + return true; +} + +bool ControlLineManager::button1Released(void) +{ + action = Action::NONE; + + if (selected_object >= MO_OBJECT_COUNT) { + mouseOverGeometry[selected_object]->state = Geometry::NORMAL; + } + + edited = true; + callbacks->lineChanged(); + drawing_line = false; + selected_object = -1; + return true; +} + +bool ControlLineManager::button3Pressed(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + action = Action::NONE; + + if (!provider || provider->getObject() < MO_OBJECT_COUNT) { + return false; + } + + action = Action::PICKING; + return true; +} + +bool ControlLineManager::pick1(bool picked) +{ + action = Action::NONE; + + if (!picked) { + return false; + } + + EditDataProvider* provider = getEditProvider(); + + if (!provider || !checkOffset(provider->getObject(), OFFSET_ICON)) { + return false; + } + + // Change line type. + int object_id = provider->getObject(); + ::ControlLine& line = *control_lines[mouseOverIdToLineId(object_id)]; + + if (line.type == rtengine::ControlLine::HORIZONTAL) { + line.icon = line.icon_v; + line.type = rtengine::ControlLine::VERTICAL; + horizontalCount--; + verticalCount++; + } else if (line.type == rtengine::ControlLine::VERTICAL) { + line.icon = line.icon_h; + line.type = rtengine::ControlLine::HORIZONTAL; + horizontalCount++; + verticalCount--; + } + + visibleGeometry[mouseOverIdToVisibleId(object_id)] = line.icon.get(); + + edited = true; + callbacks->lineChanged(); + + return true; +} + +bool ControlLineManager::pick3(bool picked) +{ + action = Action::NONE; + + if (!picked) { + return false; + } + + EditDataProvider* provider = getEditProvider(); + + if (!provider) { + return false; + } + + removeLine(mouseOverIdToLineId(provider->getObject())); + prev_obj = -1; + selected_object = -1; + return true; +} + +bool ControlLineManager::drag1(int modifierKey) +{ + if (action != Action::DRAGGING) { + return false; + } + + EditDataProvider* provider = getEditProvider(); + + if (!provider || selected_object < MO_OBJECT_COUNT) { + return false; + } + + ::ControlLine& control_line = + *control_lines[mouseOverIdToLineId(selected_object)]; + // 0 == end, 1 == line, 2 == icon, 3 == begin + int component = selected_object % ::ControlLine::OBJECT_COUNT; + Coord mouse = provider->posImage + provider->deltaImage; + Coord delta = provider->deltaImage - drag_delta; + int ih, iw; + provider->getImageSize(iw, ih); + + switch (component) { + case (OFFSET_END): // end + control_line.end->center = mouse; + control_line.end->center.clip(iw, ih); + control_line.line->end = control_line.end->center; + control_line.end->state = Geometry::DRAGGED; + break; + + case (OFFSET_LINE): { // line + // Constrain delta so the end stays above the image. + Coord new_delta = control_line.end->center + delta; + new_delta.clip(iw, ih); + new_delta -= control_line.end->center; + // Constrain delta so the beginning stays above the image. + new_delta += control_line.begin->center; + new_delta.clip(iw, ih); + new_delta -= control_line.begin->center; + // Move all objects in the control line. + control_line.end->center += new_delta; + control_line.begin->center += new_delta; + control_line.line->end = control_line.end->center; + control_line.line->begin = control_line.begin->center; + drag_delta += new_delta; + control_line.line->state = Geometry::DRAGGED; + break; + } + + case (OFFSET_BEGIN): // begin + control_line.begin->center = mouse; + control_line.begin->center.clip(iw, ih); + control_line.line->begin = control_line.begin->center; + control_line.begin->state = Geometry::DRAGGED; + break; + } + + control_line.icon_h->position.x = (control_line.begin->center.x + + control_line.end->center.x) / 2; + control_line.icon_h->position.y = (control_line.begin->center.y + + control_line.end->center.y) / 2; + control_line.icon_v->position.x = control_line.icon_h->position.x; + control_line.icon_v->position.y = control_line.icon_h->position.y; + + if (drawing_line) { + autoSetLineType(selected_object); + } + + return true; +} + +void ControlLineManager::releaseEdit(void) +{ + action = Action::NONE; + + if (selected_object >= MO_OBJECT_COUNT) { + mouseOverGeometry[selected_object]->state = Geometry::NORMAL; + } + if (prev_obj >= MO_OBJECT_COUNT) { + visibleGeometry[mouseOverIdToVisibleId(prev_obj)]->state = Geometry::NORMAL; + } + + edited = true; + callbacks->lineChanged(); + drawing_line = false; + selected_object = -1; +} + +bool ControlLineManager::getEdited(void) const +{ + return edited; +} + +CursorShape ControlLineManager::getCursor(int objectID, int xPos, int yPos) const +{ + return cursor; +} + +bool ControlLineManager::mouseOver(int modifierKey) +{ + EditDataProvider* provider = getEditProvider(); + + if (!provider) { + return false; + } + + int cur_obj = provider->getObject(); + + if (cur_obj == MO_CANVAS) { // Canvas + if (draw_mode && modifierKey & GDK_CONTROL_MASK) { + cursor = CSCrosshair; + } else { + cursor = CSHandOpen; + } + } else if (cur_obj < 0) { // Nothing + cursor = CSArrow; + } else if (checkOffset(cur_obj, OFFSET_ICON)) { // Icon + visibleGeometry[mouseOverIdToVisibleId(cur_obj)]->state = Geometry::PRELIGHT; + cursor = CSArrow; + } else { // Object + visibleGeometry[mouseOverIdToVisibleId(cur_obj)]->state = Geometry::PRELIGHT; + cursor = CSMove2D; + } + + if (prev_obj != cur_obj && prev_obj >= MO_OBJECT_COUNT) { + visibleGeometry[mouseOverIdToVisibleId(prev_obj)]->state = Geometry::NORMAL; + } + + prev_obj = cur_obj; + + return true; +} + +void ControlLineManager::switchOffEditMode(void) +{ + if (callbacks) { + callbacks->switchOffEditMode(); + } +} + +void ControlLineManager::setEdited(bool edited) +{ + this->edited = edited; +} + +void ControlLineManager::setEditProvider(EditDataProvider* provider) +{ + EditSubscriber::setEditProvider(provider); +} + +void ControlLineManager::setLines(const std::vector& + lines) +{ + removeAll(); + + for (auto&& line : lines) { + Coord start(line.x1, line.y1); + Coord end(line.x2, line.y2); + addLine(start, end, line.type); + } +} + +void ControlLineManager::addLine(Coord begin, Coord end, + rtengine::ControlLine::Type type) +{ + constexpr int line_width = 2; + constexpr int handle_radius = 6; + std::unique_ptr line; + std::shared_ptr icon_h, icon_v; + std::unique_ptr begin_c, end_c; + + line = std::unique_ptr(new Line()); + line->datum = Geometry::IMAGE; + line->innerLineWidth = line_width; + line->begin = begin; + line->end = end; + + const Cairo::RefPtr null_surface = + Cairo::RefPtr(nullptr); + + icon_h = std::make_shared(line_icon_h, null_surface, + line_icon_h_prelight, + null_surface, null_surface, + Geometry::DP_CENTERCENTER); + icon_h->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); + + icon_v = std::make_shared(line_icon_v, null_surface, + line_icon_v_prelight, + null_surface, null_surface, + Geometry::DP_CENTERCENTER); + icon_v->position = Coord((begin.x + end.x) / 2, (begin.y + end.y) / 2); + + begin_c = std::unique_ptr(new Circle()); + begin_c->datum = Geometry::IMAGE; + begin_c->filled = true; + begin_c->radius = handle_radius; + begin_c->center = begin; + + end_c = std::unique_ptr(new Circle()); + end_c->datum = Geometry::IMAGE; + end_c->filled = true; + end_c->radius = handle_radius; + end_c->center = end; + + std::unique_ptr<::ControlLine> control_line(new ::ControlLine()); + control_line->begin = std::move(begin_c); + control_line->end = std::move(end_c); + control_line->icon_h = icon_h; + control_line->icon_v = icon_v; + + if (type == rtengine::ControlLine::HORIZONTAL) { + control_line->icon = icon_h; + } else { + control_line->icon = icon_v; + } + + control_line->line = std::move(line); + control_line->type = type; + + auto assertEqual = [](size_t a, int b) { + assert(b >= 0); + assert(a == static_cast(b)); + }; + + const int base_visible_offset = VISIBLE_OBJECT_COUNT + ::ControlLine::OBJECT_COUNT * control_lines.size(); + assertEqual(visibleGeometry.size(), base_visible_offset + ::ControlLine::LINE); + EditSubscriber::visibleGeometry.push_back(control_line->line.get()); + assertEqual(visibleGeometry.size(), base_visible_offset + ::ControlLine::ICON); + EditSubscriber::visibleGeometry.push_back(control_line->icon.get()); + assertEqual(visibleGeometry.size(), base_visible_offset + ::ControlLine::BEGIN); + EditSubscriber::visibleGeometry.push_back(control_line->begin.get()); + assertEqual(visibleGeometry.size(), base_visible_offset + ::ControlLine::END); + EditSubscriber::visibleGeometry.push_back(control_line->end.get()); + + const int base_mo_count = MO_OBJECT_COUNT + ::ControlLine::OBJECT_COUNT * control_lines.size(); + assertEqual(mouseOverGeometry.size(), base_mo_count + ::ControlLine::LINE); + EditSubscriber::mouseOverGeometry.push_back(control_line->line.get()); + assertEqual(mouseOverGeometry.size(), base_mo_count + ::ControlLine::ICON); + EditSubscriber::mouseOverGeometry.push_back(control_line->icon.get()); + assertEqual(mouseOverGeometry.size(), base_mo_count + ::ControlLine::BEGIN); + EditSubscriber::mouseOverGeometry.push_back(control_line->begin.get()); + assertEqual(mouseOverGeometry.size(), base_mo_count + ::ControlLine::END); + EditSubscriber::mouseOverGeometry.push_back(control_line->end.get()); + + control_lines.push_back(std::move(control_line)); + if (type == rtengine::ControlLine::HORIZONTAL) { + horizontalCount++; + } else { + verticalCount++; + } +} + +void ControlLineManager::autoSetLineType(int object_id) +{ + int line_id = mouseOverIdToLineId(object_id); + ::ControlLine& line = *control_lines[line_id]; + + int dx = line.begin->center.x - line.end->center.x; + int dy = line.begin->center.y - line.end->center.y; + + if (dx < 0) { + dx = -dx; + } + + if (dy < 0) { + dy = -dy; + } + + rtengine::ControlLine::Type type; + std::shared_ptr icon; + + if (dx > dy) { // More horizontal than vertical. + type = rtengine::ControlLine::HORIZONTAL; + icon = line.icon_h; + } else { + type = rtengine::ControlLine::VERTICAL; + icon = line.icon_v; + } + + if (type != line.type) { // Need to update line type. + line.type = type; + line.icon = icon; + if (type == rtengine::ControlLine::HORIZONTAL) { + horizontalCount++; + verticalCount--; + } else { + horizontalCount--; + verticalCount++; + } + visibleGeometry[line_id * ::ControlLine::OBJECT_COUNT ++ VISIBLE_OBJECT_COUNT + ::ControlLine::ICON] = + line.icon.get(); + } +} + +void ControlLineManager::removeAll(void) +{ + visibleGeometry.clear(); + mouseOverGeometry.erase(mouseOverGeometry.begin() + MO_OBJECT_COUNT, + mouseOverGeometry.end()); + control_lines.clear(); + horizontalCount = verticalCount = 0; + prev_obj = -1; + selected_object = -1; + edited = true; + callbacks->lineChanged(); +} + +void ControlLineManager::removeLine(std::size_t line_id) +{ + if (line_id >= control_lines.size()) { + return; + } + + visibleGeometry.erase( + visibleGeometry.begin() + ::ControlLine::OBJECT_COUNT * line_id + VISIBLE_OBJECT_COUNT, + visibleGeometry.begin() + ::ControlLine::OBJECT_COUNT * line_id + VISIBLE_OBJECT_COUNT + + ::ControlLine::OBJECT_COUNT + ); + mouseOverGeometry.erase( + mouseOverGeometry.begin() + ::ControlLine::OBJECT_COUNT * line_id + MO_OBJECT_COUNT, + mouseOverGeometry.begin() + ::ControlLine::OBJECT_COUNT * line_id + MO_OBJECT_COUNT + ::ControlLine::OBJECT_COUNT + ); + if (control_lines[line_id]->type == rtengine::ControlLine::HORIZONTAL) { + horizontalCount--; + } else { + verticalCount--; + } + control_lines.erase(control_lines.begin() + line_id); + + edited = true; + callbacks->lineChanged(); +} + +void ControlLineManager::toControlLines(std::vector& + converted) const +{ + converted.clear(); + converted.resize(control_lines.size()); + + for (unsigned int i = 0; i < control_lines.size(); i++) { + converted[i].x1 = control_lines[i]->begin->center.x; + converted[i].y1 = control_lines[i]->begin->center.y; + converted[i].x2 = control_lines[i]->end->center.x; + converted[i].y2 = control_lines[i]->end->center.y; + converted[i].type = control_lines[i]->type; + } +} diff --git a/rtgui/controllines.h b/rtgui/controllines.h new file mode 100644 index 000000000..9e850da1c --- /dev/null +++ b/rtgui/controllines.h @@ -0,0 +1,129 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2020 Lawrence Lee + * + * 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 "editcallbacks.h" +#include "../rtengine/perspectivecorrection.h" + +class Circle; +class Line; +class OPIcon; +class Rectangle; +class RTSurface; + +struct ControlLine { + enum ObjectIndex { + LINE, + ICON, + BEGIN, + END, + OBJECT_COUNT + }; + + std::unique_ptr line; + std::shared_ptr icon; + std::shared_ptr icon_h, icon_v; + std::unique_ptr begin, end; + rtengine::ControlLine::Type type; + + ~ControlLine(); +}; + +class ControlLineManager: EditSubscriber +{ + +protected: + /** Hidden object for capturing mouse events. */ + std::unique_ptr canvas_area; + rtengine::Coord drag_delta; + std::vector> control_lines; + CursorShape cursor; + bool draw_mode; + bool drawing_line; + bool edited; + std::size_t horizontalCount, verticalCount; + Cairo::RefPtr line_icon_h, line_icon_v; + Cairo::RefPtr line_icon_h_prelight, line_icon_v_prelight; + int prev_obj; + int selected_object; + + void addLine(rtengine::Coord begin, rtengine::Coord end, + rtengine::ControlLine::Type type = rtengine::ControlLine::VERTICAL); + /** + * Set the line type of the line containing the object according to the + * line's angle. + * + * If the line is within 45 degrees of a perfectly vertical + * line, inclusive, the line type is set to vertical. Otherwise, horizontal. + */ + void autoSetLineType(int object_id); + void removeLine(std::size_t line_id); + +public: + class Callbacks + { + public: + virtual ~Callbacks() {}; + /** Called when a line changed (added, removed, moved, etc.). */ + virtual void lineChanged(void) {}; + /** Called when the EditSubscriber's switchOffEditMode is called. */ + virtual void switchOffEditMode(void) {}; + }; + + /** Callbacks to invoke. */ + std::shared_ptr callbacks; + + ControlLineManager(); + ~ControlLineManager(); + + bool getEdited(void) const; + /** Returns the number of horizontal control lines. */ + std::size_t getHorizontalCount() const; + /** Returns the number of vertical control lines. */ + std::size_t getVerticalCount() const; + /** Release anything that is currently being dragged. */ + void releaseEdit(void); + void removeAll(void); + /** Sets whether or not the lines are visible and interact-able. */ + void setActive(bool active); + /** Set whether or not lines can be drawn and deleted. */ + void setDrawMode(bool draw); + void setEdited(bool edited); + void setEditProvider(EditDataProvider* provider); + void setLines(const std::vector& lines); + /** Returns the number of lines. */ + std::size_t size() const; + /** + * Allocates a new array and populates it with copies of the control lines. + */ + void toControlLines(std::vector& converted) const; + + // EditSubscriber overrides + bool button1Pressed(int modifierKey) override; + bool button1Released(void) override; + bool button3Pressed(int modifierKey) override; + bool pick1(bool picked) override; + bool pick3(bool picked) override; + bool drag1(int modifierKey) override; + CursorShape getCursor(int objectID, int xPos, int yPos) const override; + bool mouseOver(int modifierKey) override; + void switchOffEditMode(void) override; +}; diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc new file mode 100644 index 000000000..60fde12a6 --- /dev/null +++ b/rtgui/controlspotpanel.cc @@ -0,0 +1,2882 @@ +/* + * 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 . + * 2018 Pierre Cabrera + */ + +#include "../rtengine/rt_math.h" +#include "controlspotpanel.h" +#include "editwidgets.h" +#include "options.h" +#include "../rtengine/procparams.h" +#include "rtimage.h" +#include "eventmapper.h" + +using namespace rtengine; +using namespace procparams; + +extern Options options; + +//----------------------------------------------------------------------------- +// ControlSpotPanel +//----------------------------------------------------------------------------- + +ControlSpotPanel::ControlSpotPanel(): + EditSubscriber(ET_OBJECTS), + FoldableToolPanel(this, "controlspotpanel", M("TP_LOCALLAB_SETTINGS")), + + scrolledwindow_(Gtk::manage(new Gtk::ScrolledWindow())), + treeview_(Gtk::manage(new Gtk::TreeView())), + + button_add_(Gtk::manage(new Gtk::Button(M("TP_LOCALLAB_BUTTON_ADD")))), + button_delete_(Gtk::manage(new Gtk::Button(M("TP_LOCALLAB_BUTTON_DEL")))), + button_duplicate_(Gtk::manage(new Gtk::Button(M("TP_LOCALLAB_BUTTON_DUPL")))), + + button_rename_(Gtk::manage(new Gtk::Button(M("TP_LOCALLAB_BUTTON_REN")))), + button_visibility_(Gtk::manage(new Gtk::Button(M("TP_LOCALLAB_BUTTON_VIS")))), + + prevMethod_(Gtk::manage(new MyComboBoxText())), + shape_(Gtk::manage(new MyComboBoxText())), + spotMethod_(Gtk::manage(new MyComboBoxText())), + shapeMethod_(Gtk::manage(new MyComboBoxText())), + qualityMethod_(Gtk::manage(new MyComboBoxText())), + //complexMethod_(Gtk::manage(new MyComboBoxText())), + wavMethod_(Gtk::manage(new MyComboBoxText())), + avoidgamutMethod_(Gtk::manage(new MyComboBoxText())), + + sensiexclu_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSIEXCLU"), 0, 100, 1, 12))), + structexclu_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL"), 0, 100, 1, 0))), + locX_(Gtk::manage(new Adjuster(M("TP_LOCAL_WIDTH"), 2, 3000, 1, 150))), + locXL_(Gtk::manage(new Adjuster(M("TP_LOCAL_WIDTH_L"), 2, 3000, 1, 150))), + locY_(Gtk::manage(new Adjuster(M("TP_LOCAL_HEIGHT"), 2, 3000, 1, 150))), + locYT_(Gtk::manage(new Adjuster(M("TP_LOCAL_HEIGHT_T"), 2, 3000, 1, 150))), + centerX_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CENTER_X"), -1000, 1000, 1, 0))), + centerY_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CENTER_Y"), -1000, 1000, 1, 0))), + circrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CIRCRADIUS"), 2, 150, 1, 18))), + transit_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITVALUE"), 2., 100., 0.1, 60.))), + transitweak_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITWEAK"), 0.5, 25.0, 0.1, 1.0))), + transitgrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TRANSITGRAD"), -1.0, 1.0, 0.01, 0.0))), + feather_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FEATVALUE"), 10., 100., 0.1, 25.))), + struc_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRES"), 1.0, 12.0, 0.1, 4.0))), + thresh_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESDELTAE"), 0.0, 10.0, 0.1, 2.0))), + iter_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_PROXI"), 0.2, 10.0, 0.1, 2.0))), + balan_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALAN"), 0.2, 2.5, 0.1, 1.0, Gtk::manage(new RTImage("rawtherapee-logo-16.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + balanh_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALANH"), 0.2, 2.5, 0.1, 1.0, Gtk::manage(new RTImage("rawtherapee-logo-16.png")), Gtk::manage(new RTImage("circle-red-green-small.png"))))), + colorde_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COLORDE"), -15, 15, 2, 5, Gtk::manage(new RTImage("circle-blue-yellow-small.png")), Gtk::manage(new RTImage("circle-gray-green-small.png"))))), + colorscope_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_COLORSCOPE"), 0., 100.0, 1., 30.))), + avoidrad_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_AVOIDRAD"), 0., 30.0, 0.1, 0.))), + scopemask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCOPEMASK"), 0, 100, 1, 60))), + denoichmask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DENOIMASK"), 0., 100., 0.5, 0))), + lumask_(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LUMASK"), -50, 30, 1, 10, Gtk::manage(new RTImage("circle-yellow-small.png")), Gtk::manage(new RTImage("circle-gray-small.png")) ))), + + hishow_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_PREVSHOW")))), + activ_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIVSPOT")))), + blwh_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_BLWH")))), + recurs_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_RECURS")))), + laplac_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LAPLACC")))), + deltae_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_DELTAEC")))), + shortc_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SHORTC")))), + //savrest_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SAVREST")))), + + expTransGrad_(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_TRANSIT")))), + expShapeDetect_(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_ARTIF")))), + expSpecCases_(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SPECCASE")))), + expMaskMerge_(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_MASFRAME")))), + + preview_(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_PREVIEW")))), + ctboxshape(Gtk::manage(new Gtk::Box())), + ctboxshapemethod(Gtk::manage(new Gtk::Box())), + ctboxgamut(Gtk::manage(new Gtk::Box())), + + controlPanelListener(nullptr), + lastObject_(-1), + nbSpotChanged_(false), + selSpotChanged_(false), + nameChanged_(false), + visibilityChanged_(false), + eventType(None), + excluFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_EXCLUF")))), + maskPrevActive(false) +{ + auto m = ProcEventMapper::getInstance(); + EvLocallabavoidgamutMethod = m->newEvent(AUTOEXP, "HISTORY_MSG_LOCAL_GAMUTMUNSEL"); + const bool showtooltip = options.showtooltip; + pack_start(*hishow_); + + Gtk::Box* const ctboxprevmethod = Gtk::manage(new Gtk::Box()); + prevMethod_->append(M("TP_LOCALLAB_PREVHIDE")); + prevMethod_->append(M("TP_LOCALLAB_PREVSHOW")); + prevMethod_->set_active(0); + prevMethodconn_ = prevMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::prevMethodChanged)); + +// ctboxprevmethod->pack_start(*prevMethod_); + pack_start(*ctboxprevmethod); + + + Gtk::Box* const hbox1_ = Gtk::manage(new Gtk::Box()); + hbox1_->set_spacing(4); + hbox1_->set_homogeneous(true); + buttonaddconn_ = button_add_->signal_clicked().connect( + sigc::mem_fun(*this, &ControlSpotPanel::on_button_add)); + buttondeleteconn_ = button_delete_->signal_clicked().connect( + sigc::mem_fun(*this, &ControlSpotPanel::on_button_delete)); + buttonduplicateconn_ = button_duplicate_->signal_clicked().connect( + sigc::mem_fun(*this, &ControlSpotPanel::on_button_duplicate)); + + hbox1_->pack_start(*button_add_); + hbox1_->pack_start(*button_delete_); + hbox1_->pack_start(*button_duplicate_); + pack_start(*hbox1_); + + Gtk::Box* const hbox2_ = Gtk::manage(new Gtk::Box()); + hbox2_->set_spacing(4); + hbox2_->set_homogeneous(true); + buttonrenameconn_ = button_rename_->signal_clicked().connect( + sigc::mem_fun(*this, &ControlSpotPanel::on_button_rename)); + buttonvisibilityconn_ = button_visibility_->signal_button_release_event().connect( + sigc::mem_fun(*this, &ControlSpotPanel::on_button_visibility)); + + + if (showtooltip) { + button_visibility_->set_tooltip_markup(M("TP_LOCALLAB_VIS_TOOLTIP")); + } + + hbox2_->pack_start(*button_rename_); + hbox2_->pack_start(*button_visibility_); + pack_start(*hbox2_); + + treemodel_ = Gtk::ListStore::create(spots_); + treeview_->set_model(treemodel_); + treeviewconn_ = treeview_->get_selection()->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::controlspotChanged)); + treeview_->set_grid_lines(Gtk::TREE_VIEW_GRID_LINES_VERTICAL); + + // Disable search to prevent hijacking keyboard shortcuts #5265 + treeview_->set_enable_search(false); + treeview_->signal_key_press_event().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::blockTreeviewSearch), false); + + // Avoid situation where no spot is selected (Ctrl+click on treeview) + treeview_->signal_button_press_event().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::onSpotSelectionEvent), false); + + auto cell = Gtk::manage(new Gtk::CellRendererText()); + int cols_count = treeview_->append_column(M("TP_LOCALLAB_COL_NAME"), *cell); + auto col = treeview_->get_column(cols_count - 1); + + if (col) { + col->set_cell_data_func( + *cell, sigc::mem_fun( + *this, &ControlSpotPanel::render_name)); + } + + cell = Gtk::manage(new Gtk::CellRendererText()); + cols_count = treeview_->append_column(M("TP_LOCALLAB_COL_VIS"), *cell); + col = treeview_->get_column(cols_count - 1); + + if (col) { + col->set_cell_data_func( + *cell, sigc::mem_fun( + *this, &ControlSpotPanel::render_isvisible)); + } + + scrolledwindow_->add(*treeview_); + scrolledwindow_->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + scrolledwindow_->set_min_content_height(150); + pack_start(*scrolledwindow_); + + Gtk::Box* const ctboxactivmethod = Gtk::manage(new Gtk::Box()); + ctboxactivmethod->pack_start(*activ_); + pack_start(*ctboxactivmethod); + + Gtk::Label* const labelshape = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_SHAPETYPE") + ":")); + ctboxshape->pack_start(*labelshape, Gtk::PACK_SHRINK, 4); + shape_->append(M("TP_LOCALLAB_ELI")); + shape_->append(M("TP_LOCALLAB_RECT")); + shape_->set_active(0); + shapeconn_ = shape_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::shapeChanged)); + ctboxshape->pack_start(*shape_); + pack_start(*ctboxshape); + if (showtooltip) { + shape_->set_tooltip_text(M("TP_LOCALLAB_SHAPE_TOOLTIP")); + } + + Gtk::Box* const ctboxspotmethod = Gtk::manage(new Gtk::Box()); + Gtk::Label* const labelspotmethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_EXCLUTYPE") + ":")); + ctboxspotmethod->pack_start(*labelspotmethod, Gtk::PACK_SHRINK, 4); + + if (showtooltip) { + ctboxspotmethod->set_tooltip_markup(M("TP_LOCALLAB_EXCLUTYPE_TOOLTIP")); + } + + spotMethod_->append(M("TP_LOCALLAB_EXNORM")); + spotMethod_->append(M("TP_LOCALLAB_EXECLU")); + spotMethod_->append(M("TP_LOCALLAB_EXFULL")); + spotMethod_->set_active(0); + spotMethodconn_ = spotMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::spotMethodChanged)); + ctboxspotmethod->pack_start(*spotMethod_); + pack_start(*ctboxspotmethod); + + + excluFrame->set_label_align(0.025, 0.5); + + if (showtooltip) { + excluFrame->set_tooltip_text(M("TP_LOCALLAB_EXCLUF_TOOLTIP")); + } + + ToolParamBlock* const excluBox = Gtk::manage(new ToolParamBlock()); + + if (showtooltip) { + sensiexclu_->set_tooltip_text(M("TP_LOCALLAB_SENSIEXCLU_TOOLTIP")); + } + + sensiexclu_->setAdjusterListener(this); + structexclu_->setAdjusterListener(this); + structexclu_->setLogScale(10, 0); + + excluBox->pack_start(*sensiexclu_); + excluBox->pack_start(*structexclu_); + excluFrame->add(*excluBox); + pack_start(*excluFrame); + + + Gtk::Label* const labelshapemethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_STYPE") + ":")); + ctboxshapemethod->pack_start(*labelshapemethod, Gtk::PACK_SHRINK, 4); + + if (showtooltip) { + ctboxshapemethod->set_tooltip_markup(M("TP_LOCALLAB_STYPE_TOOLTIP")); + } + + shapeMethod_->append(M("TP_LOCALLAB_IND")); + shapeMethod_->append(M("TP_LOCALLAB_SYM")); + shapeMethod_->append(M("TP_LOCALLAB_INDSL")); + shapeMethod_->append(M("TP_LOCALLAB_SYMSL")); + shapeMethod_->set_active(0); + shapeMethodconn_ = shapeMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::shapeMethodChanged)); + ctboxshapemethod->pack_start(*shapeMethod_); +// pack_start(*ctboxshapemethod); + + pack_start(*locX_); + locX_->setAdjusterListener(this); + + pack_start(*locXL_); + locXL_->setAdjusterListener(this); + + pack_start(*locY_); + locY_->setAdjusterListener(this); + + pack_start(*locYT_); + locYT_->setAdjusterListener(this); + + pack_start(*centerX_); + centerX_->setAdjusterListener(this); + + pack_start(*centerY_); + centerY_->setAdjusterListener(this); + + pack_start(*circrad_); + circrad_->setAdjusterListener(this); + + if (showtooltip) { + circrad_->set_tooltip_text(M("TP_LOCALLAB_CIRCRAD_TOOLTIP")); + } + + Gtk::Box* const ctboxqualitymethod = Gtk::manage(new Gtk::Box()); + Gtk::Label* const labelqualitymethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_QUAL_METHOD") + ":")); + ctboxqualitymethod->pack_start(*labelqualitymethod, Gtk::PACK_SHRINK, 4); + + if (showtooltip) { + ctboxqualitymethod->set_tooltip_markup(M("TP_LOCALLAB_METHOD_TOOLTIP")); + } + + qualityMethod_->append(M("TP_LOCALLAB_ENH")); + qualityMethod_->append(M("TP_LOCALLAB_ENHDEN")); + qualityMethod_->set_active(1); + qualityMethodconn_ = qualityMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::qualityMethodChanged)); + ctboxqualitymethod->pack_start(*qualityMethod_); + + if (showtooltip) { + expTransGrad_->set_tooltip_text(M("TP_LOCALLAB_TRANSIT_TOOLTIP")); + } + + ToolParamBlock* const transitBox = Gtk::manage(new ToolParamBlock()); + + if (showtooltip) { + transit_->set_tooltip_text(M("TP_LOCALLAB_TRANSIT_TOOLTIP")); + transitweak_->set_tooltip_text(M("TP_LOCALLAB_TRANSITWEAK_TOOLTIP")); + feather_->set_tooltip_text(M("TP_LOCALLAB_FEATH_TOOLTIP")); + transitgrad_->set_tooltip_text(M("TP_LOCALLAB_TRANSITGRAD_TOOLTIP")); + scopemask_->set_tooltip_text(M("TP_LOCALLAB_SCOPEMASK_TOOLTIP")); + denoichmask_->set_tooltip_text(M("TP_LOCALLAB_DENOIMASK_TOOLTIP")); + } + + transit_->setAdjusterListener(this); + transitweak_->setAdjusterListener(this); + transitgrad_->setAdjusterListener(this); + feather_->setAdjusterListener(this); + scopemask_->setAdjusterListener(this); + denoichmask_->setAdjusterListener(this); + transitBox->pack_start(*transit_); + transitBox->pack_start(*transitweak_); + transitBox->pack_start(*transitgrad_); + transitBox->pack_start(*feather_); + expTransGrad_->add(*transitBox, false); + pack_start(*expTransGrad_, false, false); + + if (showtooltip) { + expShapeDetect_->set_tooltip_text(M("TP_LOCALLAB_ARTIF_TOOLTIP")); + } + + ToolParamBlock* const artifBox = Gtk::manage(new ToolParamBlock()); + struc_->setAdjusterListener(this); + thresh_->setAdjusterListener(this); + iter_->setAdjusterListener(this); + balan_->setAdjusterListener(this); + balanh_->setAdjusterListener(this); + colorde_->setAdjusterListener(this); + colorscope_->setAdjusterListener(this); + avoidrad_->setAdjusterListener(this); + + preview_->set_active(false); + previewConn_ = preview_->signal_clicked().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::previewChanged)); + + if (showtooltip) { + balan_->set_tooltip_text(M("TP_LOCALLAB_BALAN_TOOLTIP")); + balanh_->set_tooltip_text(M("TP_LOCALLAB_BALAN_TOOLTIP")); + colorde_->set_tooltip_text(M("TP_LOCALLAB_COLORDE_TOOLTIP")); + colorscope_->set_tooltip_text(M("TP_LOCALLAB_COLORSCOPE_TOOLTIP")); + preview_->set_tooltip_text(M("TP_LOCALLAB_COLORDEPREV_TOOLTIP")); + } + +// artifBox->pack_start(*struc_); + artifBox->pack_start(*thresh_); + artifBox->pack_start(*iter_); + artifBox->pack_start(*balan_); + artifBox->pack_start(*balanh_); + artifBox->pack_start(*colorde_); +// artifBox->pack_start(*preview_); +// artifBox->pack_start(*colorscope_); + expShapeDetect_->add(*artifBox, false); + pack_start(*expShapeDetect_, false, false); + ToolParamBlock* const artifBox2 = Gtk::manage(new ToolParamBlock()); + + artifBox2->pack_start(*preview_); + artifBox2->pack_start(*colorscope_); + pack_start(*artifBox2); + ToolParamBlock* const specCaseBox = Gtk::manage(new ToolParamBlock()); + + hishowconn_ = hishow_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::hishowChanged)); + + activConn_ = activ_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::activChanged)); + + Gtk::Label* const labelgamut = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_AVOID") + ":")); + ctboxgamut->pack_start(*labelgamut, Gtk::PACK_SHRINK, 4); + avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTNON")); + avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTLABRELA")); + avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTXYZABSO")); + avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTXYZRELA")); + avoidgamutMethod_->append(M("TP_LOCALLAB_GAMUTMUNSELL")); + avoidgamutMethod_->set_active(4); + avoidgamutconn_ = avoidgamutMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::avoidgamutMethodChanged)); + ctboxgamut->pack_start(*avoidgamutMethod_); + if (showtooltip) { + ctboxgamut->set_tooltip_text(M("TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP")); + } + + Gtk::Frame* const avFrame = Gtk::manage(new Gtk::Frame()); + ToolParamBlock* const avbox = Gtk::manage(new ToolParamBlock()); + avFrame->set_label_align(0.025, 0.5); + avbox->pack_start(*ctboxgamut); + avbox->pack_start(*avoidrad_); + avFrame->add(*avbox); + specCaseBox->pack_start(*avFrame); + + + blwhConn_ = blwh_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::blwhChanged)); + + if (showtooltip) { + blwh_->set_tooltip_text(M("TP_LOCALLAB_BLWH_TOOLTIP")); + } + + specCaseBox->pack_start(*blwh_); + + recursConn_ = recurs_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::recursChanged)); + + if (showtooltip) { + recurs_->set_tooltip_text(M("TP_LOCALLAB_RECURS_TOOLTIP")); + } + + specCaseBox->pack_start(*recurs_); + specCaseBox->pack_start(*ctboxshapemethod); + + Gtk::Box* const ctboxwavmethod = Gtk::manage(new Gtk::Box()); + Gtk::Label* const labelwavmethod = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DAUBLOCAL") + ":")); + ctboxwavmethod->pack_start(*labelwavmethod, Gtk::PACK_SHRINK, 4); + + if (showtooltip) { + ctboxwavmethod->set_tooltip_markup(M("TP_WAVELET_DAUB_TOOLTIP")); + } + + wavMethod_->append(M("TP_WAVELET_DAUB2")); + wavMethod_->append(M("TP_WAVELET_DAUB4")); + wavMethod_->append(M("TP_WAVELET_DAUB6")); + wavMethod_->append(M("TP_WAVELET_DAUB10")); + wavMethod_->append(M("TP_WAVELET_DAUB14")); + wavMethod_->set_active(1); + wavMethodconn_ = wavMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::wavMethodChanged)); + ctboxwavmethod->pack_start(*wavMethod_); + specCaseBox->pack_start(*ctboxwavmethod); + + + expSpecCases_->add(*specCaseBox, false); + pack_start(*expSpecCases_, false, false); + + if (showtooltip) { + expMaskMerge_->set_tooltip_text(M("TP_LOCALLAB_MASFRAME_TOOLTIP")); + } + + ToolParamBlock* const maskBox = Gtk::manage(new ToolParamBlock()); + laplacConn_ = laplac_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::laplacChanged)); + deltaeConn_ = deltae_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::deltaeChanged)); + shortcConn_ = shortc_->signal_toggled().connect( + sigc::mem_fun(*this, &ControlSpotPanel::shortcChanged)); + + if (showtooltip) { + shortc_->set_tooltip_text(M("TP_LOCALLAB_SHORTCMASK_TOOLTIP")); + } + + lumask_->setAdjusterListener(this); + //savrestConn_ = savrest_->signal_toggled().connect( + // sigc::mem_fun(*this, &ControlSpotPanel::savrestChanged)); + + if (showtooltip) { + //savrest_->set_tooltip_text(M("TP_LOCALLAB_SAVREST_TOOLTIP")); + lumask_->set_tooltip_text(M("TP_LOCALLAB_LUMASK_TOOLTIP")); + laplac_->set_tooltip_text(M("TP_LOCALLAB_LAP_MASK_TOOLTIP")); + } + +// maskBox->pack_start(*laplac_); + maskBox->pack_start(*deltae_); + maskBox->pack_start(*scopemask_); + maskBox->pack_start(*denoichmask_); + // maskBox->pack_start(*shortc_); + maskBox->pack_start(*lumask_); + // maskBox->pack_start(*savrest_); + expMaskMerge_->add(*maskBox, false); + pack_start(*expMaskMerge_, false, false); + + Gtk::Separator *separatormet = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + pack_start(*separatormet, Gtk::PACK_SHRINK, 2); + + //Gtk::Box* const ctboxcomplexmethod = Gtk::manage(new Gtk::Box()); + + //if (showtooltip) { + // ctboxcomplexmethod->set_tooltip_markup(M("TP_LOCALLAB_COMPLEXMETHOD_TOOLTIP")); + //} + + //Gtk::Label* const labelcomplexmethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_COMPLEX_METHOD") + ":")); + //ctboxcomplexmethod->pack_start(*labelcomplexmethod, Gtk::PACK_SHRINK, 4); + + //if (showtooltip) { + // complexMethod_->set_tooltip_markup(M("TP_LOCALLAB_COMPLEX_TOOLTIP")); + //} + + //complexMethod_->append(M("TP_LOCALLAB_SIM")); + //complexMethod_->append(M("TP_LOCALLAB_MED")); + //complexMethod_->append(M("TP_LOCALLAB_ALL")); + //complexMethod_->set_active(1); + //complexMethodconn_ = complexMethod_->signal_changed().connect( + // sigc::mem_fun( + // *this, &ControlSpotPanel::complexMethodChanged)); + //ctboxcomplexmethod->pack_start(*complexMethod_); + // pack_start(*ctboxcomplexmethod); +/* + Gtk::Box* const ctboxwavmethod = Gtk::manage(new Gtk::Box()); + Gtk::Label* const labelwavmethod = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DAUBLOCAL") + ":")); + ctboxwavmethod->pack_start(*labelwavmethod, Gtk::PACK_SHRINK, 4); + + if (showtooltip) { + ctboxwavmethod->set_tooltip_markup(M("TP_WAVELET_DAUB_TOOLTIP")); + } + + wavMethod_->append(M("TP_WAVELET_DAUB2")); + wavMethod_->append(M("TP_WAVELET_DAUB4")); + wavMethod_->append(M("TP_WAVELET_DAUB6")); + wavMethod_->append(M("TP_WAVELET_DAUB10")); + wavMethod_->append(M("TP_WAVELET_DAUB14")); + wavMethod_->set_active(1); + wavMethodconn_ = wavMethod_->signal_changed().connect( + sigc::mem_fun( + *this, &ControlSpotPanel::wavMethodChanged)); + ctboxwavmethod->pack_start(*wavMethod_); + pack_start(*ctboxwavmethod); +*/ + show_all(); + + // Define row background color + // Mouseovered spot (opaque orange) + colorMouseover.set_red(1.); + colorMouseover.set_green(100. / 255.); + colorMouseover.set_blue(0.); + colorMouseover.set_alpha(1.); + + colorMouseovertext.set_red(0.6); + colorMouseovertext.set_green(100. / 255.); + colorMouseovertext.set_blue(0.); + colorMouseovertext.set_alpha(0.5); + + // Nominal spot (transparent black) + colorNominal.set_red(0.); + colorNominal.set_green(0.); + colorNominal.set_blue(0.); + colorNominal.set_alpha(0.); +} + +ControlSpotPanel::~ControlSpotPanel() +{ + // visibleGeometry + for (auto i = EditSubscriber::visibleGeometry.begin(); i != EditSubscriber::visibleGeometry.end(); ++i) { + delete *i; + } + + // mouseOverGeometry + for (auto i = EditSubscriber::mouseOverGeometry.begin(); i != EditSubscriber::mouseOverGeometry.end(); ++i) { + delete *i; + } +} + +void ControlSpotPanel::setEditProvider(EditDataProvider* provider) +{ + EditSubscriber::setEditProvider(provider); +} + +void ControlSpotPanel::render_name( + Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter) +{ + auto row = *iter; + Gtk::CellRendererText *ct = static_cast(cell); + + // Render cell text + ct->property_text() = row[spots_.name]; + + // Render cell background color + if (row[spots_.mouseover]) { + ct->property_background_rgba() = colorMouseovertext; + } else { + ct->property_background_rgba() = colorNominal; + } +} + +void ControlSpotPanel::render_isvisible( + Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter) +{ + auto row = *iter; + Gtk::CellRendererText *ct = static_cast(cell); + + // Render cell text + if (row[spots_.isvisible]) { + ct->property_text() = M("TP_LOCALLAB_ROW_VIS"); + } else { + ct->property_text() = M("TP_LOCALLAB_ROW_NVIS"); + } + + // Render cell background color + if (row[spots_.mouseover]) { + ct->property_background_rgba() = colorMouseovertext; + } else { + ct->property_background_rgba() = colorNominal; + } +} + +void ControlSpotPanel::on_button_add() +{ + // printf("on_button_add\n"); + + if (!listener) { + return; + } + + // Raise event + nbSpotChanged_ = true; + selSpotChanged_ = true; + eventType = SpotCreation; + listener->panelChanged(EvLocallabSpotCreated, "-"); +} + +void ControlSpotPanel::on_button_delete() +{ + // printf("on_button_delete\n"); + + if (!listener) { + return; + } + + // Raise event + const int selIndex = getSelectedSpot(); + + if (selIndex == -1) { // No selected spot to remove + return; + } + + nbSpotChanged_ = true; + selSpotChanged_ = true; + eventType = SpotDeletion; + SpotRow* const delSpotRow = getSpot(selIndex); + listener->panelChanged(EvLocallabSpotDeleted, delSpotRow->name); +} + +void ControlSpotPanel::on_button_duplicate() +{ + // printf("on_button_duplicate\n"); + + if (!listener) { + return; + } + + // Raise event + const int selIndex = getSelectedSpot(); + + if (selIndex == -1) { // No selected spot to duplicate + return; + } + + nbSpotChanged_ = true; + selSpotChanged_ = true; + eventType = SpotDuplication; + SpotRow* const duplSpotRow = getSpot(selIndex); + listener->panelChanged(EvLocallabSpotCreated, M("TP_LOCALLAB_EV_DUPL") + " " + + duplSpotRow->name); +} + +void ControlSpotPanel::on_button_rename() +{ + // printf("on_button_rename\n"); + + if (!listener) { + return; + } + + // Get actual control spot name + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + const Gtk::TreeModel::Row row = *iter; + const Glib::ustring actualname = row[spots_.name]; + + // Launch windows to update spot name + RenameDialog d(actualname, + static_cast(*get_toplevel())); + int status = d.run(); + + // Update actual name and raise event + if (status == RenameDialog::OkButton) { + const Glib::ustring newname = d.get_new_name(); + + if (newname != actualname) { // Event is only raised if name is updated + nameChanged_ = true; + row[spots_.name] = newname; + treeview_->columns_autosize(); + listener->panelChanged(EvLocallabSpotName, newname); + if (controlPanelListener) { + controlPanelListener->spotNameChanged(newname); + } + } + } +} + +bool ControlSpotPanel::on_button_visibility(GdkEventButton* event) +{ + // printf("on_button_visibility\n"); + + if (!listener) { + return true; + } + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return true; + } + + const auto iter = s->get_selected(); + const Gtk::TreeModel::Row row = *iter; + + const int ctrl = event->state & GDK_CONTROL_MASK; + + if (event->button == 1) { // Left click on button + if (ctrl) { // Ctrl+click case: all spots are shown/hidden + // Get visibility of selected spot + const bool selVisibility = row[spots_.isvisible]; + + // Update visibility of all spot + const Gtk::TreeModel::Children children = treemodel_->children(); + + for (auto i = children.begin(); i != children.end(); i++) { + Gtk::TreeModel::Row r = *i; + r[spots_.isvisible] = !selVisibility; + updateControlSpotCurve(r); + } + + // Raise event + visibilityChanged_ = true; + eventType = SpotAllVisibilityChanged; + + if (!selVisibility) { + listener->panelChanged(EvLocallabSpotVisibility, M("TP_LOCALLAB_EV_VIS_ALL")); + } else { + listener->panelChanged(EvLocallabSpotVisibility, M("TP_LOCALLAB_EV_NVIS_ALL")); + } + + return true; + } else { // Click case: only selected spot is shown/hidden + // Update visibility for selected spot only + row[spots_.isvisible] = !row[spots_.isvisible]; + updateControlSpotCurve(row); + + // Raise event + visibilityChanged_ = true; + SpotRow* const spotRow = getSpot(getSelectedSpot()); + + if (row[spots_.isvisible]) { + listener->panelChanged(EvLocallabSpotVisibility, M("TP_LOCALLAB_EV_VIS") + " (" + spotRow->name + ")"); + } else { + listener->panelChanged(EvLocallabSpotVisibility, M("TP_LOCALLAB_EV_NVIS") + " (" + spotRow->name + ")"); + } + + return true; + } + } + + return false; +} + +bool ControlSpotPanel::blockTreeviewSearch(GdkEventKey* event) +{ + // printf("blockTreeviewSearch\n"); + + if (event->state & Gdk::CONTROL_MASK) { // Ctrl + if (event->keyval == GDK_KEY_f || event->keyval == GDK_KEY_F) { + // No action is performed to avoid activating treeview search + return true; + } + } + + // Otherwise key action is transferred to treeview widget + return false; +} + +bool ControlSpotPanel::onSpotSelectionEvent(GdkEventButton* event) +{ + if (event->state & Gdk::CONTROL_MASK) { // Ctrl + // No action is performed to avoid a situation where no spot is selected + return true; + } + + // Otherwise selection action is transferred to treeview widget + return false; +} + +void ControlSpotPanel::load_ControlSpot_param() +{ + // printf("load_ControlSpot_param\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + const Gtk::TreeModel::Row row = *iter; + + // Load param in selected control spot + prevMethod_->set_active(row[spots_.prevMethod]); + shape_->set_active(row[spots_.shape]); + spotMethod_->set_active(row[spots_.spotMethod]); + sensiexclu_->setValue((double)row[spots_.sensiexclu]); + structexclu_->setValue((double)row[spots_.structexclu]); + shapeMethod_->set_active(row[spots_.shapeMethod]); + locX_->setValue((double)row[spots_.locX]); + locXL_->setValue((double)row[spots_.locXL]); + locY_->setValue((double)row[spots_.locY]); + locYT_->setValue((double)row[spots_.locYT]); + centerX_->setValue((double)row[spots_.centerX]); + centerY_->setValue((double)row[spots_.centerY]); + circrad_->setValue((double)row[spots_.circrad]); + qualityMethod_->set_active(row[spots_.qualityMethod]); + transit_->setValue((double)row[spots_.transit]); + transitweak_->setValue((double)row[spots_.transitweak]); + transitgrad_->setValue((double)row[spots_.transitgrad]); + feather_->setValue((double)row[spots_.feather]); + struc_->setValue((double)row[spots_.struc]); + thresh_->setValue((double)row[spots_.thresh]); + iter_->setValue((double)row[spots_.iter]); + balan_->setValue((double)row[spots_.balan]); + balanh_->setValue((double)row[spots_.balanh]); + colorde_->setValue((double)row[spots_.colorde]); + colorscope_->setValue((double)row[spots_.colorscope]); + avoidrad_->setValue((double)row[spots_.avoidrad]); + hishow_->set_active(row[spots_.hishow]); + activ_->set_active(row[spots_.activ]); + blwh_->set_active(row[spots_.blwh]); + recurs_->set_active(row[spots_.recurs]); + // laplac_->set_active(row[spots_.laplac]); + laplac_->set_active(true); + deltae_->set_active(row[spots_.deltae]); + scopemask_->setValue((double)row[spots_.scopemask]); + denoichmask_->setValue(row[spots_.denoichmask]); + shortc_->set_active(row[spots_.shortc]); + lumask_->setValue((double)row[spots_.lumask]); + //savrest_->set_active(row[spots_.savrest]); + //complexMethod_->set_active(row[spots_.complexMethod]); + wavMethod_->set_active(row[spots_.wavMethod]); + avoidgamutMethod_->set_active(row[spots_.avoidgamutMethod]); + +} + +void ControlSpotPanel::controlspotChanged() +{ + // printf("controlspotChanged\n"); + + if (!listener) { + return; + } + + // Raise event + const int selIndex = getSelectedSpot(); + + if (selIndex == -1) { // No selected spot + return; + } + + selSpotChanged_ = true; + eventType = SpotSelection; + SpotRow* const spotRow = getSpot(selIndex); + + // Image area shall be regenerated if mask or deltaE preview was active when switching spot + if (maskPrevActive || preview_->get_active()) { + listener->panelChanged(EvLocallabSpotSelectedWithMask, spotRow->name); + } else { + listener->panelChanged(EvLocallabSpotSelected, spotRow->name); + } +} + +void ControlSpotPanel::shapeChanged() +{ + // printf("shapeChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + row[spots_.shape] = shape_->get_active_row_number(); + updateControlSpotCurve(row); + + // Raise event + if (listener) { + listener->panelChanged(EvLocallabSpotShape, shape_->get_active_text()); + } +} + +void ControlSpotPanel::prevMethodChanged() +{ + // printf("prevMethodChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + row[spots_.prevMethod] = prevMethod_->get_active_row_number(); +/* + // Update Control Spot GUI according to spotMethod_ combobox state (to be compliant with updateParamVisibility function) + if (multiImage && prevMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + circrad_->show(); + ctboxshape->show(); + } else if (prevMethod_->get_active_row_number() == 0) { // Normal case + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + circrad_->hide(); + ctboxshape->hide(); + shapeMethod_->set_active(0); + + } else { // Excluding case + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + circrad_->show(); + ctboxshape->show(); + } +*/ + // Raise event + if (listener) { +// listener->panelChanged(EvLocallabSpotprevMethod, prevMethod_->get_active_text()); + } +} + + + +void ControlSpotPanel::spotMethodChanged() +{ + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + const int oldSpotMethod = row[spots_.spotMethod]; + row[spots_.spotMethod] = spotMethod_->get_active_row_number(); + + // Update Control Spot GUI according to spotMethod_ combobox state (to be compliant with updateParamVisibility function) + if (multiImage && spotMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { + excluFrame->show(); + } else if (spotMethod_->get_active_row_number() == 0) { // Normal case + excluFrame->hide(); + + // Reset spot shape only if previous spotMethod is Full image + if (oldSpotMethod == 2) { + disableParamlistener(true); + locX_->setValue(150.); + row[spots_.locX] = locX_->getIntValue(); + locXL_->setValue(150.); + row[spots_.locXL] = locXL_->getIntValue(); + locY_->setValue(150.); + row[spots_.locY] = locY_->getIntValue(); + locYT_->setValue(150.); + row[spots_.locYT] = locYT_->getIntValue(); + shape_->set_active(0); + row[spots_.shape] = shape_->get_active_row_number(); + transit_->setValue(60.); + row[spots_.transit] = transit_->getValue(); + disableParamlistener(false); + updateControlSpotCurve(row); + } + } else if (spotMethod_->get_active_row_number() == 1) { // Excluding case + excluFrame->show(); + + // Reset spot shape only if previous spotMethod is Full image + if (oldSpotMethod == 2) { + disableParamlistener(true); + locX_->setValue(150.); + row[spots_.locX] = locX_->getIntValue(); + locXL_->setValue(150.); + row[spots_.locXL] = locXL_->getIntValue(); + locY_->setValue(150.); + row[spots_.locY] = locY_->getIntValue(); + locYT_->setValue(150.); + row[spots_.locYT] = locYT_->getIntValue(); + shape_->set_active(0); + row[spots_.shape] = shape_->get_active_row_number(); + transit_->setValue(60.); + row[spots_.transit] = transit_->getValue(); + disableParamlistener(false); + updateControlSpotCurve(row); + } + } else if (spotMethod_->get_active_row_number() == 2) { // Full image case + excluFrame->hide(); + shape_->set_active(0); + + locX_->setValue(3000.); + row[spots_.locX] = locX_->getIntValue(); + locXL_->setValue(3000.); + row[spots_.locXL] = locXL_->getIntValue(); + locY_->setValue(3000.); + row[spots_.locY] = locY_->getIntValue(); + locYT_->setValue(3000.); + row[spots_.locYT] = locYT_->getIntValue(); + shape_->set_active(1); + row[spots_.shape] = shape_->get_active_row_number(); + transit_->setValue(100.); + row[spots_.transit] = transit_->getValue(); + } + + // Raise event + if (listener) { + listener->panelChanged(EvLocallabSpotSpotMethod, spotMethod_->get_active_text()); + } +} + +void ControlSpotPanel::avoidgamutMethodChanged() +{ + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + const int meth = avoidgamutMethod_->get_active_row_number(); + avoidrad_->show(); + + if(meth == 2 || meth == 3 || meth == 4) { + avoidrad_->hide(); + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + row[spots_.avoidgamutMethod] = avoidgamutMethod_->get_active_row_number(); + + // Raise event + if (listener) { + listener->panelChanged(EvLocallabavoidgamutMethod, avoidgamutMethod_->get_active_text()); + } + +} + +void ControlSpotPanel::shapeMethodChanged() +{ + // printf("shapeMethodChanged\n"); + + const int method = shapeMethod_->get_active_row_number(); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases + disableParamlistener(true); + locXL_->setValue(locX_->getValue()); + locYT_->setValue(locY_->getValue()); + disableParamlistener(false); + + row[spots_.shapeMethod] = shapeMethod_->get_active_row_number(); + row[spots_.locXL] = locX_->getIntValue(); + row[spots_.locYT] = locY_->getIntValue(); + + updateControlSpotCurve(row); + } else { // In batch mode, sliders are always independent + row[spots_.shapeMethod] = shapeMethod_->get_active_row_number(); + } + + // Update Control Spot GUI according to shapeMethod_ combobox state (to be compliant with updateParamVisibility function) + if (!batchMode) { + if (method == 1 || method == 3) { // Symmetrical cases + locXL_->hide(); + locYT_->hide(); + + if (method == 1) { // 1 = Symmetrical (mouse) + locX_->hide(); + locY_->hide(); + centerX_->hide(); + centerY_->hide(); + } else { // 3 = Symmetrical (mouse + sliders) + locX_->show(); + locY_->show(); + centerX_->show(); + centerY_->show(); + } + } else { // Independent cases + if (method == 0) { // 0 = Independent (mouse) + locX_->hide(); + locXL_->hide(); + locY_->hide(); + locYT_->hide(); + centerX_->hide(); + centerY_->hide(); + } else { // 2 = Independent (mouse + sliders) + locX_->show(); + locXL_->show(); + locY_->show(); + locYT_->show(); + centerX_->show(); + centerY_->show(); + } + } + } else { // In batch mode, sliders are necessary shown + locX_->show(); + locXL_->show(); + locY_->show(); + locYT_->show(); + centerX_->show(); + centerY_->show(); + } + + // Raise event + if (listener) { + listener->panelChanged(EvLocallabSpotShapeMethod, shapeMethod_->get_active_text()); + } +} + +void ControlSpotPanel::qualityMethodChanged() +{ + // printf("qualityMethodChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + row[spots_.qualityMethod] = qualityMethod_->get_active_row_number(); + + // Raise event + if (listener) { + listener->panelChanged(EvLocallabSpotQualityMethod, qualityMethod_->get_active_text()); + } +} + +//void ControlSpotPanel::complexMethodChanged() +//{ +// // printf("qualityMethodChanged\n"); +// +// // Get selected control spot +// const auto s = treeview_->get_selection(); +// +// if (!s->count_selected_rows()) { +// return; +// } +// +// const auto iter = s->get_selected(); +// Gtk::TreeModel::Row row = *iter; +// +// row[spots_.complexMethod] = complexMethod_->get_active_row_number(); +// +// if (multiImage && complexMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { +// // excluFrame->show(); +// } else if (complexMethod_->get_active_row_number() == 0) { //sim +// // excluFrame->hide(); +// } else if (complexMethod_->get_active_row_number() == 1) { // mod +// // excluFrame->show(); +// } else if (complexMethod_->get_active_row_number() == 2) { // all +// // excluFrame->show(); +// } +// +// // Raise event +// if (listener) { +// listener->panelChanged(EvLocallabSpotcomplexMethod, complexMethod_->get_active_text()); +// } +//} + +void ControlSpotPanel::wavMethodChanged() +{ + // printf("qualityMethodChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + row[spots_.wavMethod] = wavMethod_->get_active_row_number(); + + // Raise event + if (listener) { + listener->panelChanged(EvLocallabSpotwavMethod, wavMethod_->get_active_text()); + } +} + +void ControlSpotPanel::updateParamVisibility() +{ + // printf("updateParamVisibility\n"); + + // Update Control Spot GUI according to shapeMethod_ combobox state (to be compliant with shapeMethodChanged function) + const int method = shapeMethod_->get_active_row_number(); + const int meth = avoidgamutMethod_->get_active_row_number(); + + if (!batchMode) { + if (method == 1 || method == 3) { // Symmetrical cases + locXL_->hide(); + locYT_->hide(); + + if (method == 1) { // 1 = Symmetrical (mouse) + locX_->hide(); + locY_->hide(); + centerX_->hide(); + centerY_->hide(); + } else { // 3 = Symmetrical (mouse + sliders) + locX_->show(); + locY_->show(); + centerX_->show(); + centerY_->show(); + } + } else { // Independent cases + if (method == 0) { // 0 = Independent (mouse) + locX_->hide(); + locXL_->hide(); + locY_->hide(); + locYT_->hide(); + centerX_->hide(); + centerY_->hide(); + } else { // 2 = Independent (mouse + sliders) + locX_->show(); + locXL_->show(); + locY_->show(); + locYT_->show(); + centerX_->show(); + centerY_->show(); + } + } + } else { // In batch mode, sliders are necessary shown + locX_->show(); + locXL_->show(); + locY_->show(); + locYT_->show(); + centerX_->show(); + centerY_->show(); + } + + if(meth == 1) { + avoidrad_->show(); + } else { + avoidrad_->hide(); +} + + // Update Control Spot GUI according to spotMethod_ combobox state (to be compliant with spotMethodChanged function) + if (multiImage && spotMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { + excluFrame->show(); + } else if (spotMethod_->get_active_row_number() == 0) { // Normal case + excluFrame->hide(); + } else if (spotMethod_->get_active_row_number() == 1) { // Excluding case + excluFrame->show(); + } else if (spotMethod_->get_active_row_number() == 2) {//full image + excluFrame->hide(); + } + +/* + if (multiImage && prevMethod_->get_active_text() == M("GENERAL_UNCHANGED")) { + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + circrad_->show(); + ctboxshape->show(); + } else if (prevMethod_->get_active_row_number() == 0) { // Normal case + */ + if (!hishow_->get_active()) { // Normal case + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + circrad_->hide(); + ctboxshape->hide(); + } else { // Excluding case + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + circrad_->show(); + ctboxshape->show(); + } + + +} + +void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) +{ + // printf("adjusterChanged\n"); + + const int method = shapeMethod_->get_active_row_number(); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + if (a == sensiexclu_) { + row[spots_.sensiexclu] = sensiexclu_->getIntValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotSensiexclu, sensiexclu_->getTextValue()); + } + } + + if (a == structexclu_) { + row[spots_.structexclu] = structexclu_->getIntValue(); + + if (listener) { + listener->panelChanged(Evlocallabstructexlu, structexclu_->getTextValue()); + } + } + + if (a == locX_) { + row[spots_.locX] = locX_->getIntValue(); + + if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) + disableParamlistener(true); + locXL_->setValue(locX_->getValue()); + disableParamlistener(false); + row[spots_.locXL] = locXL_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocX, locX_->getTextValue()); + } + } + + if (a == locXL_) { + row[spots_.locXL] = locXL_->getIntValue(); + + if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) + disableParamlistener(true); + locX_->setValue(locXL_->getValue()); + disableParamlistener(false); + row[spots_.locX] = locX_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocXL, locXL_->getTextValue()); + } + } + + if (a == locY_) { + row[spots_.locY] = locY_->getIntValue(); + + if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) + disableParamlistener(true); + locYT_->setValue(locY_->getValue()); + disableParamlistener(false); + row[spots_.locYT] = locYT_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocY, locY_->getTextValue()); + } + } + + if (a == locYT_) { + row[spots_.locYT] = locYT_->getIntValue(); + + if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) + disableParamlistener(true); + locY_->setValue(locYT_->getValue()); + disableParamlistener(false); + row[spots_.locY] = locY_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocYT, locYT_->getTextValue()); + } + } + + if (a == centerX_ || a == centerY_) { + row[spots_.centerX] = centerX_->getIntValue(); + row[spots_.centerY] = centerY_->getIntValue(); + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotCenter, "X=" + centerX_->getTextValue() + ", Y=" + centerY_->getTextValue()); + } + } + + if (a == circrad_) { + row[spots_.circrad] = circrad_->getIntValue(); + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotCircrad, circrad_->getTextValue()); + } + } + + if (a == transit_) { + row[spots_.transit] = transit_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotTransit, transit_->getTextValue()); + } + } + + if (a == transitweak_) { + row[spots_.transitweak] = transitweak_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotTransitweak, transitweak_->getTextValue()); + } + } + + if (a == transitgrad_) { + row[spots_.transitgrad] = transitgrad_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotTransitgrad, transitgrad_->getTextValue()); + } + } + + if (a == feather_) { + row[spots_.feather] = feather_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotfeather, feather_->getTextValue()); + } + } + + if (a == struc_) { + row[spots_.struc] = struc_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotStruc, struc_->getTextValue()); + } + } + + if (a == thresh_) { + row[spots_.thresh] = thresh_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotThresh, thresh_->getTextValue()); + } + } + + if (a == iter_) { + row[spots_.iter] = iter_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotIter, iter_->getTextValue()); + } + } + + if (a == balan_) { + row[spots_.balan] = balan_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotbalan, balan_->getTextValue()); + } + } + + if (a == balanh_) { + row[spots_.balanh] = balanh_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotbalanh, balanh_->getTextValue()); + } + } + + if (a == colorde_) { + row[spots_.colorde] = colorde_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotcolorde, colorde_->getTextValue()); + } + } + + if (a == colorscope_) { + row[spots_.colorscope] = colorscope_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotcolorscope, colorscope_->getTextValue()); + } + } + + if (a == avoidrad_) { + row[spots_.avoidrad] = avoidrad_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotavoidrad, avoidrad_->getTextValue()); + } + } + + if (a == scopemask_) { + row[spots_.scopemask] = scopemask_->getIntValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotscopemask, scopemask_->getTextValue()); + } + } + + if (a == denoichmask_) { + row[spots_.denoichmask] = denoichmask_->getValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotdenoichmask, denoichmask_->getTextValue()); + } + } + + if (a == lumask_) { + row[spots_.lumask] = lumask_->getIntValue(); + + if (listener) { + listener->panelChanged(EvLocallabSpotlumask, lumask_->getTextValue()); + } + } +} + +void ControlSpotPanel::hishowChanged() +{ + // printf("avoidChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.hishow] = hishow_->get_active(); + + + + if (!hishow_->get_active()) { // Normal case + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + circrad_->hide(); + ctboxshape->hide(); + shapeMethod_->set_active(0); + + } else { // Excluding case + expTransGrad_->show(); + expShapeDetect_->show(); + expSpecCases_->show(); + expMaskMerge_->show(); + circrad_->show(); + ctboxshape->show(); + } + + // Raise event + if (listener) { + if (hishow_->get_active()) { + listener->panelChanged(Evlocallabhishow, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabhishow, M("GENERAL_DISABLED")); + } + } +} + + +void ControlSpotPanel::activChanged() +{ + // printf("activChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.activ] = activ_->get_active(); + + // Raise event + if (listener) { + if (activ_->get_active()) { + listener->panelChanged(Evlocallabactiv, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabactiv, M("GENERAL_DISABLED")); + } + } +} + + +void ControlSpotPanel::blwhChanged() +{ + // printf("blwhChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.blwh] = blwh_->get_active(); + + // Raise event + if (listener) { + if (blwh_->get_active()) { + listener->panelChanged(Evlocallabblwh, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabblwh, M("GENERAL_DISABLED")); + } + } +} + +void ControlSpotPanel::recursChanged() +{ + // printf("recursChanged\n"); + + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.recurs] = recurs_->get_active(); + + // Raise event + if (listener) { + if (recurs_->get_active()) { + listener->panelChanged(Evlocallabrecurs, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabrecurs, M("GENERAL_DISABLED")); + } + } +} + + +void ControlSpotPanel::laplacChanged() +{ + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.laplac] = laplac_->get_active(); + + // Raise event + if (listener) { + if (laplac_->get_active()) { + listener->panelChanged(Evlocallablaplac, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallablaplac, M("GENERAL_DISABLED")); + } + } +} + + +void ControlSpotPanel::deltaeChanged() +{ + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.deltae] = deltae_->get_active(); + + // Raise event + if (listener) { + if (deltae_->get_active()) { + listener->panelChanged(Evlocallabdeltae, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabdeltae, M("GENERAL_DISABLED")); + } + } +} + +void ControlSpotPanel::shortcChanged() +{ + // Get selected control spot + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + row[spots_.shortc] = shortc_->get_active(); + + // Raise event + if (listener) { + if (shortc_->get_active()) { + listener->panelChanged(Evlocallabshortc, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(Evlocallabshortc, M("GENERAL_DISABLED")); + } + } +} + +//void ControlSpotPanel::savrestChanged() +//{ +// // Get selected control spot +// const auto s = treeview_->get_selection(); +// +// if (!s->count_selected_rows()) { +// return; +// } +// +// const auto iter = s->get_selected(); +// Gtk::TreeModel::Row row = *iter; +// row[spots_.savrest] = savrest_->get_active(); +// +// // Raise event +// if (listener) { +// if (savrest_->get_active()) { +// listener->panelChanged(Evlocallabsavrest, M("GENERAL_ENABLED")); +// } else { +// listener->panelChanged(Evlocallabsavrest, M("GENERAL_DISABLED")); +// } +// } +//} + +void ControlSpotPanel::previewChanged() +{ + // If deltaE preview is activated, deactivate all other tool mask preview + if (controlPanelListener) { + controlPanelListener->resetToolMaskView(); + } + + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } +} + +void ControlSpotPanel::disableParamlistener(bool cond) +{ + // printf("disableParamlistener: %d\n", cond); + + treeviewconn_.block(cond); + buttonaddconn_.block(cond); + buttondeleteconn_.block(cond); + buttonduplicateconn_.block(cond); + buttonrenameconn_.block(cond); + buttonvisibilityconn_.block(cond); + prevMethodconn_.block(cond); + shapeconn_.block(cond); + spotMethodconn_.block(cond); + sensiexclu_->block(cond); + structexclu_->block(cond); + shapeMethodconn_.block(cond); + locX_->block(cond); + locXL_->block(cond); + locY_->block(cond); + locYT_->block(cond); + centerX_->block(cond); + centerY_->block(cond); + circrad_->block(cond); + qualityMethodconn_.block(cond); + transit_->block(cond); + transitweak_->block(cond); + transitgrad_->block(cond); + feather_->block(cond); + struc_->block(cond); + thresh_->block(cond); + iter_->block(cond); + balan_->block(cond); + balanh_->block(cond); + colorde_->block(cond); + colorscope_->block(cond); + avoidrad_->block(cond); + hishowconn_.block(cond); + activConn_.block(cond); + blwhConn_.block(cond); + recursConn_.block(cond); + laplacConn_.block(cond); + deltaeConn_.block(cond); + scopemask_->block(cond); + denoichmask_->block(cond); + shortcConn_.block(cond); + lumask_->block(cond); + //savrestConn_.block(cond); + //complexMethodconn_.block(cond); + wavMethodconn_.block(cond); + avoidgamutconn_.block(cond); + +} + +void ControlSpotPanel::setParamEditable(bool cond) +{ + // printf("setParamEditable: %d\n", cond); + + prevMethod_->set_sensitive(cond); + shape_->set_sensitive(cond); + spotMethod_->set_sensitive(cond); + sensiexclu_->set_sensitive(cond); + structexclu_->set_sensitive(cond); + shapeMethod_->set_sensitive(cond); + locX_->set_sensitive(cond); + locXL_->set_sensitive(cond); + locY_->set_sensitive(cond); + locYT_->set_sensitive(cond); + centerX_->set_sensitive(cond); + centerY_->set_sensitive(cond); + circrad_->set_sensitive(cond); + qualityMethod_->set_sensitive(cond); + transit_->set_sensitive(cond); + transitweak_->set_sensitive(cond); + transitgrad_->set_sensitive(cond); + feather_->set_sensitive(cond); + struc_->set_sensitive(cond); + thresh_->set_sensitive(cond); + iter_->set_sensitive(cond); + balan_->set_sensitive(cond); + balanh_->set_sensitive(cond); + colorde_->set_sensitive(cond); + colorscope_->set_sensitive(cond); + avoidrad_->set_sensitive(cond); + hishow_->set_sensitive(cond); + activ_->set_sensitive(cond); + blwh_->set_sensitive(cond); + recurs_->set_sensitive(cond); + laplac_->set_sensitive(cond); + deltae_->set_sensitive(cond); + scopemask_->set_sensitive(cond); + denoichmask_->set_sensitive(cond); + shortc_->set_sensitive(cond); + lumask_->set_sensitive(cond); + //savrest_->set_sensitive(cond); + //complexMethod_->set_sensitive(cond); + wavMethod_->set_sensitive(cond); + preview_->set_sensitive(cond); + avoidgamutMethod_->set_sensitive(cond); + + if (!cond) { + // Reset complex parameters visibility to default state + expTransGrad_->hide(); + expShapeDetect_->hide(); + expSpecCases_->hide(); + expMaskMerge_->hide(); + circrad_->hide(); + ctboxshape->hide(); + excluFrame->hide(); +// ctboxshapemethod->hide(); + locX_->hide(); + locXL_->hide(); + locY_->hide(); + locYT_->hide(); + centerX_->hide(); + centerY_->hide(); + } +} + +void ControlSpotPanel::setDefaultExpanderVisibility() +{ + expTransGrad_->set_expanded(false); + expShapeDetect_->set_expanded(false); + expSpecCases_->set_expanded(false); + expMaskMerge_->set_expanded(false); +} + +void ControlSpotPanel::addControlSpotCurve(Gtk::TreeModel::Row& row) +{ + // printf("addControlSpotCurve\n"); + + if (row[spots_.curveid] > 0) { // Row has already an associated curve + return; + } + + // Creation of visibleGeometry + Circle* cirX; + cirX = new Circle(); + cirX->radius = 4.; + cirX->filled = true; + cirX->datum = Geometry::IMAGE; + Circle* cirXL; + cirXL = new Circle(); + cirXL->radius = 4.; + cirXL->filled = true; + cirXL->datum = Geometry::IMAGE; + Circle* cirY; + cirY = new Circle(); + cirY->radius = 4.; + cirY->filled = true; + cirY->datum = Geometry::IMAGE; + Circle* cirYT; + cirYT = new Circle(); + cirYT->radius = 4.; + cirYT->filled = true; + cirYT->datum = Geometry::IMAGE; + Circle* centerCircle; + centerCircle = new Circle(); + centerCircle->datum = Geometry::IMAGE; + centerCircle->radiusInImageSpace = true; + Ellipse* shape_ellipse; + shape_ellipse = new Ellipse(); + shape_ellipse->datum = Geometry::IMAGE; + shape_ellipse->radiusInImageSpace = true; + Rectangle* shape_rectangle; + shape_rectangle = new Rectangle(); + shape_rectangle->datum = Geometry::IMAGE; + EditSubscriber::visibleGeometry.push_back(centerCircle); // (curveid - 1) * 7 + EditSubscriber::visibleGeometry.push_back(shape_ellipse); // (curveid - 1) * 7 + 1 + EditSubscriber::visibleGeometry.push_back(shape_rectangle); // (curveid - 1) * 7 + 2 + EditSubscriber::visibleGeometry.push_back(cirX); // (curveid - 1) * 7 + 3 + EditSubscriber::visibleGeometry.push_back(cirXL); // (curveid - 1) * 7 + 4 + EditSubscriber::visibleGeometry.push_back(cirY); // (curveid - 1) * 7 + 5 + EditSubscriber::visibleGeometry.push_back(cirYT); // (curveid - 1) * 7 + 6 + + // Creation of mouseOverGeometry + cirX = new Circle(); + cirX->radius = 4.; + cirX->filled = true; + cirX->datum = Geometry::IMAGE; + cirXL = new Circle(); + cirXL->radius = 4.; + cirXL->filled = true; + cirXL->datum = Geometry::IMAGE; + cirY = new Circle(); + cirY->radius = 4.; + cirY->filled = true; + cirY->datum = Geometry::IMAGE; + cirYT = new Circle(); + cirYT->radius = 4.; + cirYT->filled = true; + cirYT->datum = Geometry::IMAGE; + centerCircle = new Circle(); + centerCircle->filled = true; + centerCircle->datum = Geometry::IMAGE; + centerCircle->radiusInImageSpace = true; + shape_ellipse = new Ellipse(); + shape_ellipse->datum = Geometry::IMAGE; + shape_ellipse->radiusInImageSpace = true; + shape_rectangle = new Rectangle(); + shape_rectangle->datum = Geometry::IMAGE; + EditSubscriber::mouseOverGeometry.push_back(centerCircle); // (curveid - 1) * 7 + EditSubscriber::mouseOverGeometry.push_back(shape_ellipse); // (curveid - 1) * 7 + 1 + EditSubscriber::mouseOverGeometry.push_back(shape_rectangle); // (curveid - 1) * 7 + 2 + EditSubscriber::mouseOverGeometry.push_back(cirX); // (curveid - 1) * 7 + 3 + EditSubscriber::mouseOverGeometry.push_back(cirXL); // (curveid - 1) * 7 + 4 + EditSubscriber::mouseOverGeometry.push_back(cirY); // (curveid - 1) * 7 + 5 + EditSubscriber::mouseOverGeometry.push_back(cirYT); // (curveid - 1) * 7 + 6 + + row[spots_.curveid] = EditSubscriber::visibleGeometry.size() / 7; +} + +void ControlSpotPanel::updateControlSpotCurve(const Gtk::TreeModel::Row& row) +{ + const int curveid_ = row[spots_.curveid]; + EditDataProvider* const dataProvider = getEditProvider(); + + // printf("updateControlSpotCurve: %d\n", curveid_); + + if (curveid_ == 0 || !dataProvider) { // Row has no associated curve or there is no EditProvider + return; + } + + int imW = 0; + int imH = 0; + dataProvider->getImageSize(imW, imH); + + if (!imW || !imH) { // No image loaded + return; + } + + const int centerX_ = row[spots_.centerX]; + const int centerY_ = row[spots_.centerY]; + const int circrad_ = row[spots_.circrad]; + const int locX_ = row[spots_.locX]; + const int locXL_ = row[spots_.locXL]; + const int locY_ = row[spots_.locY]; + const int locYT_ = row[spots_.locYT]; + const int shape_ = row[spots_.shape]; + const bool isvisible_ = row[spots_.isvisible]; + + const int decayX = (double)locX_ * (double)imW / 2000.; + const int decayXL = (double)locXL_ * (double)imW / 2000.; + const int decayY = (double)locY_ * (double)imH / 2000.; + const int decayYT = (double)locYT_ * (double)imH / 2000.; + const rtengine::Coord origin((double)imW / 2. + (double)centerX_ * (double)imW / 2000., (double)imH / 2. + (double)centerY_ * (double)imH / 2000.); + + const auto updateSelectionCircle = [&](Geometry * geometry, const int offsetX, const int offsetY) { + const auto cir = static_cast(geometry); + cir->center.x = origin.x + offsetX; + cir->center.y = origin.y + offsetY; + }; + + const auto updateCenterCircle = [&](Geometry * geometry) { + const auto circle = static_cast(geometry); + circle->center = origin; + circle->radius = circrad_; + }; + + const auto updateEllipse = [&](Geometry * geometry) { + const auto ellipse = static_cast(geometry); + ellipse->center = origin; + ellipse->radX = decayX; + ellipse->radXL = decayXL; + ellipse->radY = decayY; + ellipse->radYT = decayYT; + }; + + const auto updateRectangle = [&](Geometry * geometry) { + const auto rectangle = static_cast(geometry); + rectangle->bottomRight.x = origin.x + decayX; + rectangle->bottomRight.y = origin.y + decayY; + rectangle->topLeft.x = origin.x - decayXL; + rectangle->topLeft.y = origin.y - decayYT; + }; + + updateCenterCircle(visibleGeometry.at((curveid_ - 1) * 7)); + updateCenterCircle(mouseOverGeometry.at((curveid_ - 1) * 7)); + + updateEllipse(visibleGeometry.at((curveid_ - 1) * 7 + 1)); + updateEllipse(mouseOverGeometry.at((curveid_ - 1) * 7 + 1)); + + updateRectangle(visibleGeometry.at((curveid_ - 1) * 7 + 2)); + updateRectangle(mouseOverGeometry.at((curveid_ - 1) * 7 + 2)); + + updateSelectionCircle(visibleGeometry.at((curveid_ - 1) * 7 + 3), decayX, 0.); + updateSelectionCircle(mouseOverGeometry.at((curveid_ - 1) * 7 + 3), decayX, 0.); + + updateSelectionCircle(visibleGeometry.at((curveid_ - 1) * 7 + 4), -decayXL, 0.); + updateSelectionCircle(mouseOverGeometry.at((curveid_ - 1) * 7 + 4), -decayXL, 0.); + + updateSelectionCircle(visibleGeometry.at((curveid_ - 1) * 7 + 5), 0., decayY); + updateSelectionCircle(mouseOverGeometry.at((curveid_ - 1) * 7 + 5), 0., decayY); + + updateSelectionCircle(visibleGeometry.at((curveid_ - 1) * 7 + 6), 0., -decayYT); + updateSelectionCircle(mouseOverGeometry.at((curveid_ - 1) * 7 + 6), 0., -decayYT); + + // Update Arcellipse/Rectangle visibility according to shape and visibility + if (isvisible_) { + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7)->setActive(true); // centerCircle + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 3)->setActive(true); // cirX + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 4)->setActive(true); // cirXL + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 5)->setActive(true); // cirY + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 6)->setActive(true); // cirYT + + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7)->setActive(true); // centerCircle + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 3)->setActive(true); // cirX + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 4)->setActive(true); // cirXL + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 5)->setActive(true); // cirY + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 6)->setActive(true); // cirYT + + if (shape_ == 0) { // 0 = Ellipse + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 1)->setActive(true); // shape_ellipse + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 2)->setActive(false); // shape_rectangle + + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 1)->setActive(true); // shape_ellipse + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 2)->setActive(false); // shape_rectangle + } else { // 1 = Rectangle + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 1)->setActive(false); // shape_ellipse + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 2)->setActive(true); // shape_rectangle + + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 1)->setActive(false); // shape_ellipse + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 2)->setActive(true); // shape_rectangle + } + } else { + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7)->setActive(false); // centerCircle + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 1)->setActive(false); // shape_ellipse + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 2)->setActive(false); // shape_rectangle + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 3)->setActive(false); // cirX + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 4)->setActive(false); // cirXL + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 5)->setActive(false); // cirY + EditSubscriber::visibleGeometry.at((curveid_ - 1) * 7 + 6)->setActive(false); // cirYT + + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7)->setActive(false); // centerCircle + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 1)->setActive(false); // shape_ellipse + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 2)->setActive(false); // shape_rectangle + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 3)->setActive(false); // cirX + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 4)->setActive(false); // cirXL + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 5)->setActive(false); // cirY + EditSubscriber::mouseOverGeometry.at((curveid_ - 1) * 7 + 6)->setActive(false); // cirYT + } +} + +void ControlSpotPanel::deleteControlSpotCurve(Gtk::TreeModel::Row& row) +{ + const int curveid_ = row[spots_.curveid]; + + // printf("deleteControlSpotCurve: %d\n", curveid_); + + if (curveid_ == 0) { // Row has no associated curve + return; + } + + // visibleGeometry + for (int i = 6; i >= 0; i--) { + delete *(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + i); + EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + i); + } + + // mouseOverGeometry + for (int i = 6; i >= 0; i--) { + delete *(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + i); + EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + i); + } + + row[spots_.curveid] = 0; // Reset associated curve id + + // Reordering curve id + const Gtk::TreeModel::Children children = treemodel_->children(); + + for (auto iter = children.begin(); iter != children.end(); iter++) { + Gtk::TreeModel::Row r = *iter; + + if (r[spots_.curveid] > curveid_) { + r[spots_.curveid] = r[spots_.curveid] - 1; + } + } +} + +void ControlSpotPanel::updateCurveOpacity(const Gtk::TreeModel::Row& selectedRow) +{ + const int curveid_ = selectedRow[spots_.curveid]; + + // printf("updateCurveOpacity: %d\n", curveid_); + + if (curveid_ == 0) { // Row has no associated curve + return; + } + + for (int it_ = 0; it_ < (int) EditSubscriber::visibleGeometry.size(); it_++) { + if ((it_ < ((curveid_ - 1) * 7)) || (it_ > ((curveid_ - 1) * 7) + 6)) { // it_ does not belong to selected curve + EditSubscriber::visibleGeometry.at(it_)->opacity = 25.; + } else { + EditSubscriber::visibleGeometry.at(it_)->opacity = 75.; + } + } +} + +CursorShape ControlSpotPanel::getCursor(int objectID, int xPos, int yPos) const +{ + // printf("Object ID: %d\n", objectID); + + // When there is no control spot (i.e. no selected row), objectID can unexpectedly be different from -1 and produced not desired behavior + const auto s = treeview_->get_selection(); + + if (!s->count_selected_rows()) { + return CSHandOpen; + } + + const int rem_ = objectID % 7; + + switch (rem_) { + case (0): // centerCircle: (curveid_ - 1) * 7 + return CSMove2D; + + case (1): // shape_ellipse: (curveid_ - 1) * 7 + 1 + return CSMove2D; + + case (2): // shape_rectangle: (curveid_ - 1) * 7 + 2 + return CSMove2D; + + case (3): // cirX: (curveid_ - 1) * 7 + 3 + return CSMove1DH; + + case (4): // cirXL: (curveid_ - 1) * 7 + 4 + return CSMove1DH; + + case (5): // cirY: (curveid_ - 1) * 7 + 5 + return CSMove1DV; + + case (6): // cirYT: (curveid_ - 1) * 7 + 6 + return CSMove1DV; + + default: + return CSHandOpen; + } +} + +bool ControlSpotPanel::mouseOver(int modifierKey) +{ + EditDataProvider* editProvider_ = getEditProvider(); + const auto s = treeview_->get_selection(); + + if (!editProvider_ || !s->count_selected_rows()) { // When there is no control spot (i.e. no selected row), objectID can unexpectedly be different from -1 and produced not desired behavior + return false; + } + + // Get selected row + const auto selIter = s->get_selected(); + const Gtk::TreeModel::Row selRow = *selIter; + + const int object_ = editProvider_->object; + + if (object_ != lastObject_) { + if (object_ == -1) { + // Reset mouseOver preview for visibleGeometry + for (size_t it_ = 0; it_ < EditSubscriber::visibleGeometry.size(); it_++) { + EditSubscriber::visibleGeometry.at(it_)->state = Geometry::NORMAL; + } + + // Reset mouseOver preview for TreeView + const Gtk::TreeModel::Children children = treemodel_->children(); + + for (auto iter = children.begin(); iter != children.end(); iter++) { + Gtk::TreeModel::Row row = *iter; + row[spots_.mouseover] = false; + } + + // Actualize lastObject_ + lastObject_ = object_; + return false; + } + + const int curveId_ = object_ / 7 + 1; + const int rem = object_ % 7; + + // Manage mouseOver preview for TreeView + const Gtk::TreeModel::Children children = treemodel_->children(); + + for (auto iter = children.begin(); iter != children.end(); iter++) { + Gtk::TreeModel::Row row = *iter; + + if (row[spots_.curveid] == curveId_ && *row != *selRow) { + row[spots_.mouseover] = true; + } else { + row[spots_.mouseover] = false; + } + } + + for (int it_ = 0; it_ < (int) EditSubscriber::visibleGeometry.size(); it_++) { + if ((it_ < ((curveId_ - 1) * 7)) || (it_ > ((curveId_ - 1) * 7) + 6)) { // it_ does not belong to cursor pointed curve + EditSubscriber::visibleGeometry.at(it_)->state = Geometry::NORMAL; + } + } + + const int method = shapeMethod_->get_active_row_number(); + + // Circle, Arcellipses and Rectangle + if (rem >= 0 && rem < 3) { + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 1)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 2)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 3)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 4)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 5)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 6)->state = Geometry::PRELIGHT; + } else { + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 2)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 3)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 4)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 4)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 5)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 6)->state = Geometry::NORMAL; + } + + // cirX + if (rem == 3) { + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 3)->state = Geometry::PRELIGHT; + + if (method == 1 || method == 3) { // Symmetrical cases + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 4)->state = Geometry::PRELIGHT; + } + } + + // cirXL + if (rem == 4) { + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 4)->state = Geometry::PRELIGHT; + + if (method == 1 || method == 3) { // Symmetrical cases + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 3)->state = Geometry::PRELIGHT; + } + } + + // cirY + if (rem == 5) { + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 5)->state = Geometry::PRELIGHT; + + if (method == 1 || method == 3) { // Symmetrical cases + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 6)->state = Geometry::PRELIGHT; + } + } + + // cirYT + if (rem == 6) { + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 6)->state = Geometry::PRELIGHT; + + if (method == 1 || method == 3) { // Symmetrical cases + EditSubscriber::visibleGeometry.at((curveId_ - 1) * 7 + 5)->state = Geometry::PRELIGHT; + } + } + + lastObject_ = object_; + return true; + } + + return false; +} + +bool ControlSpotPanel::button1Pressed(int modifierKey) +{ + // printf("button1Pressed\n"); + + EditDataProvider *provider = getEditProvider(); + const auto s = treeview_->get_selection(); + + if (!provider || lastObject_ == -1 || !s->count_selected_rows()) { // When there is no control spot (i.e. no selected row), objectID can unexpectedly be different from -1 and produced not desired behavior + return false; + } + + // Select associated control spot + const int curveId_ = lastObject_ / 7 + 1; + Gtk::TreeModel::Children children = treemodel_->children(); + + for (auto iter = children.begin(); iter != children.end(); iter++) { + const Gtk::TreeModel::Row r = *iter; + + if (r[spots_.curveid] == curveId_) { + treeview_->set_cursor(treemodel_->get_path(r)); + break; + } + } + + lastCoord_.set(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y); + EditSubscriber::action = EditSubscriber::Action::DRAGGING; + return true; +} + +bool ControlSpotPanel::button1Released() +{ + // printf("button1Released\n"); + EditSubscriber::action = EditSubscriber::Action::NONE; + return true; +} + +bool ControlSpotPanel::drag1(int modifierKey) +{ + // printf("drag1\n"); + + EditDataProvider *provider = getEditProvider(); + const auto s = treeview_->get_selection(); + + if (!provider || lastObject_ == -1 || !s->count_selected_rows()) { // When there is no control spot (i.e. no selected row), objectID can unexpectedly be different from -1 and produced not desired behavior + return false; + } + + const auto iter = s->get_selected(); + Gtk::TreeModel::Row row = *iter; + + int imW, imH; + provider->getImageSize(imW, imH); + const int rem = lastObject_ % 7; + const int method = shapeMethod_->get_active_row_number(); + Coord newCoord = Coord(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y); + + // Circle, Ellipses and Rectangle + if (rem >= 0 && rem < 3) { + double deltaX = (double (newCoord.x) - double (lastCoord_.x)) * 2000. / double (imW); + double deltaY = (double (newCoord.y) - double (lastCoord_.y)) * 2000. / double (imH); + centerX_->setValue(centerX_->getValue() + deltaX); + centerY_->setValue(centerY_->getValue() + deltaY); + row[spots_.centerX] = centerX_->getIntValue(); + row[spots_.centerY] = centerY_->getIntValue(); + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotCenter, "X=" + centerX_->getTextValue() + ", Y=" + centerY_->getTextValue()); + } + } + + // cirX + if (rem == 3) { + double deltaX = (double (newCoord.x) - double (lastCoord_.x)) * 2000. / double (imW); + locX_->setValue(locX_->getValue() + deltaX); + row[spots_.locX] = locX_->getIntValue(); + + if (method == 1 || method == 3) { // Symmetrical cases + disableParamlistener(true); + locXL_->setValue(locX_->getValue()); + disableParamlistener(false); + row[spots_.locXL] = locXL_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocX, locX_->getTextValue()); + } + } + + // cirXL + if (rem == 4) { + double deltaXL = (double (lastCoord_.x) - double (newCoord.x)) * 2000. / double (imW); + locXL_->setValue(locXL_->getValue() + deltaXL); + row[spots_.locXL] = locXL_->getIntValue(); + + if (method == 1 || method == 3) { // Symmetrical cases + disableParamlistener(true); + locX_->setValue(locXL_->getValue()); + disableParamlistener(false); + row[spots_.locX] = locX_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocXL, locXL_->getTextValue()); + } + } + + // cirY + if (rem == 5) { + double deltaY = (double (newCoord.y) - double (lastCoord_.y)) * 2000. / double (imH); + locY_->setValue(locY_->getValue() + deltaY); + row[spots_.locY] = locY_->getIntValue(); + + if (method == 1 || method == 3) { // Symmetrical cases + disableParamlistener(true); + locYT_->setValue(locY_->getValue()); + disableParamlistener(false); + row[spots_.locYT] = locYT_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocY, locY_->getTextValue()); + } + } + + // cirYT + if (rem == 6) { + double deltaYT = (double (lastCoord_.y) - double (newCoord.y)) * 2000. / double (imH); + locYT_->setValue(locYT_->getValue() + deltaYT); + row[spots_.locYT] = locYT_->getIntValue(); + + if (method == 1 || method == 3) { // Symmetrical cases + disableParamlistener(true); + locY_->setValue(locYT_->getValue()); + disableParamlistener(false); + row[spots_.locY] = locY_->getIntValue(); + } + + updateControlSpotCurve(row); + + if (listener) { + listener->panelChanged(EvLocallabSpotLocYT, locYT_->getTextValue()); + } + } + + lastCoord_.set(newCoord.x, newCoord.y); + return true; +} + +int ControlSpotPanel::getEventType() +{ + const int tmp = eventType; + eventType = None; // Re-initialization at "None" if event type gotten + return tmp; +} + +ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int index) +{ + // printf("getSpot: %d\n", index); + + MyMutex::MyLock lock(mTreeview); + + SpotRow* r = new SpotRow(); + + int i = -1; + + for (auto &row : treemodel_->children()) { + i++; + + if (i == index) { + r->name = row[spots_.name]; + r->isvisible = row[spots_.isvisible]; + r->prevMethod = row[spots_.prevMethod]; + r->shape = row[spots_.shape]; + r->spotMethod = row[spots_.spotMethod]; +// r->mergeMethod = row[spots_.mergeMethod]; + r->sensiexclu = row[spots_.sensiexclu]; + r->structexclu = row[spots_.structexclu]; + r->struc = row[spots_.struc]; + r->shapeMethod = row[spots_.shapeMethod]; + r->locX = row[spots_.locX]; + r->locXL = row[spots_.locXL]; + r->locY = row[spots_.locY]; + r->locYT = row[spots_.locYT]; + r->centerX = row[spots_.centerX]; + r->centerY = row[spots_.centerY]; + r->circrad = row[spots_.circrad]; + r->qualityMethod = row[spots_.qualityMethod]; + r->complexMethod = row[spots_.complexMethod]; + r->transit = row[spots_.transit]; + r->feather = row[spots_.feather]; + r->thresh = row[spots_.thresh]; + r->iter = row[spots_.iter]; + r->balan = row[spots_.balan]; + r->balanh = row[spots_.balanh]; + r->colorde = row[spots_.colorde]; + r->colorscope = row[spots_.colorscope]; + r->avoidrad = row[spots_.avoidrad]; + r->transitweak = row[spots_.transitweak]; + r->transitgrad = row[spots_.transitgrad]; + r->scopemask = row[spots_.scopemask]; + r->denoichmask = row[spots_.denoichmask]; + r->lumask = row[spots_.lumask]; + r->hishow = row[spots_.hishow]; + r->activ = row[spots_.activ]; + r->blwh = row[spots_.blwh]; + r->recurs = row[spots_.recurs]; + r->laplac = row[spots_.laplac]; + r->deltae = row[spots_.deltae]; + r->shortc = row[spots_.shortc]; + //r->savrest = row[spots_.savrest]; + r->wavMethod = row[spots_.wavMethod]; + r->avoidgamutMethod = row[spots_.avoidgamutMethod]; + + return r; + } + } + + return nullptr; +} + +int ControlSpotPanel::getSpotNumber() +{ + // printf("getSpotNumber\n"); + + return (int)treemodel_->children().size(); +} + +int ControlSpotPanel::getSelectedSpot() +{ + // printf("getSelectedSpot\n"); + + MyMutex::MyLock lock(mTreeview); + + const auto s = treeview_->get_selection(); + + // Check if treeview has row, otherwise return 0 + if (!s->count_selected_rows()) { + return -1; + } + + const auto selRow = s->get_selected(); + + // Get selected spot index + int index = -1; + + for (auto i : treemodel_->children()) { + index++; + + if (selRow == i) { + return index; + } + } + + return -1; +} + +bool ControlSpotPanel::setSelectedSpot(const int index) +{ + // printf("setSelectedSpot: %d\n", index); + + MyMutex::MyLock lock(mTreeview); + + int i = -1; + + for (auto &row : treemodel_->children()) { + i++; + + if (i == index) { + disableParamlistener(true); + + treeview_->set_cursor(treemodel_->get_path(row)); + load_ControlSpot_param(); + updateParamVisibility(); + updateCurveOpacity(row); + + disableParamlistener(false); + + return true; + } + } + + return false; +} + +bool ControlSpotPanel::isDeltaEPrevActive() +{ + return (preview_->get_active()); +} + +void ControlSpotPanel::resetDeltaEPreview() +{ + previewConn_.block(true); + preview_->set_active(false); + previewConn_.block(false); +} + +void ControlSpotPanel::addControlSpot(SpotRow* newSpot) +{ + // printf("addControlSpot: %d\n", newSpot->name); + + MyMutex::MyLock lock(mTreeview); + + disableParamlistener(true); + Gtk::TreeModel::Row row = *(treemodel_->append()); + row[spots_.mouseover] = false; + row[spots_.name] = newSpot->name; + row[spots_.isvisible] = newSpot->isvisible; + row[spots_.curveid] = 0; // No associated curve + row[spots_.prevMethod] = newSpot->prevMethod; + row[spots_.shape] = newSpot->shape; + row[spots_.spotMethod] = newSpot->spotMethod; + row[spots_.sensiexclu] = newSpot->sensiexclu; + row[spots_.structexclu] = newSpot->structexclu; + row[spots_.shapeMethod] = newSpot->shapeMethod; + row[spots_.locX] = newSpot->locX; + row[spots_.locXL] = newSpot->locXL; + row[spots_.locY] = newSpot->locY; + row[spots_.locYT] = newSpot->locYT; + row[spots_.centerX] = newSpot->centerX; + row[spots_.centerY] = newSpot->centerY; + row[spots_.circrad] = newSpot->circrad; + row[spots_.qualityMethod] = newSpot->qualityMethod; + row[spots_.transit] = newSpot->transit; + row[spots_.transitweak] = newSpot->transitweak; + row[spots_.transitgrad] = newSpot->transitgrad; + row[spots_.feather] = newSpot->feather; + row[spots_.struc] = newSpot->struc; + row[spots_.thresh] = newSpot->thresh; + row[spots_.iter] = newSpot->iter; + row[spots_.balan] = newSpot->balan; + row[spots_.balanh] = newSpot->balanh; + row[spots_.colorde] = newSpot->colorde; + row[spots_.colorscope] = newSpot->colorscope; + row[spots_.avoidrad] = newSpot->avoidrad; + row[spots_.hishow] = newSpot->hishow; + row[spots_.activ] = newSpot->activ; + row[spots_.blwh] = newSpot->blwh; + row[spots_.recurs] = newSpot->recurs; + row[spots_.laplac] = newSpot->laplac; + row[spots_.deltae] = newSpot->deltae; + row[spots_.scopemask] = newSpot->scopemask; + row[spots_.denoichmask] = newSpot->denoichmask; + row[spots_.shortc] = newSpot->shortc; + row[spots_.lumask] = newSpot->lumask; + //row[spots_.savrest] = newSpot->savrest; + row[spots_.complexMethod] = newSpot->complexMethod; + row[spots_.wavMethod] = newSpot->wavMethod; + row[spots_.avoidgamutMethod] = newSpot->avoidgamutMethod; + updateParamVisibility(); + disableParamlistener(false); + + // Add associated control spot curve + addControlSpotCurve(row); + updateControlSpotCurve(row); +} + +void ControlSpotPanel::deleteControlSpot(const int index) +{ + // printf("deleteControlSpot: %d\n", index); + + MyMutex::MyLock lock(mTreeview); + + disableParamlistener(true); + + int i = -1; + + for (auto iter : treemodel_->children()) { + i++; + + if (i == index) { + Gtk::TreeModel::Row row = *iter; + deleteControlSpotCurve(row); + treemodel_->erase(*row); + break; + } + } + + disableParamlistener(false); +} + +void ControlSpotPanel::setDefaults(const rtengine::procparams::ProcParams * defParams, const ParamsEdited * pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster widgets + sensiexclu_->setDefault((double)defSpot.sensiexclu); + structexclu_->setDefault((double)defSpot.structexclu); + locX_->setDefault((double)defSpot.loc.at(0)); + locXL_->setDefault((double)defSpot.loc.at(1)); + locY_->setDefault((double)defSpot.loc.at(2)); + locYT_->setDefault((double)defSpot.loc.at(3)); + centerX_->setDefault((double)defSpot.centerX); + centerY_->setDefault((double)defSpot.centerY); + circrad_->setDefault((double)defSpot.circrad); + transit_->setDefault(defSpot.transit); + transitweak_->setDefault(defSpot.transitweak); + transitgrad_->setDefault(defSpot.transitgrad); + feather_->setDefault(defSpot.feather); + struc_->setDefault(defSpot.struc); + thresh_->setDefault(defSpot.thresh); + iter_->setDefault(defSpot.iter); + balan_->setDefault(defSpot.balan); + balanh_->setDefault(defSpot.balanh); + colorde_->setDefault(defSpot.colorde); + colorscope_->setDefault(defSpot.colorscope); + avoidrad_->setDefault(defSpot.avoidrad); + scopemask_->setDefault((double)defSpot.scopemask); + denoichmask_->setDefault((double)defSpot.denoichmask); + lumask_->setDefault((double)defSpot.lumask); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +//----------------------------------------------------------------------------- +// ControlSpots +//----------------------------------------------------------------------------- + +ControlSpotPanel::ControlSpots::ControlSpots() +{ + add(mouseover); + add(name); + add(isvisible); + add(curveid); + add(prevMethod); + add(shape); + add(spotMethod); + add(sensiexclu); + add(structexclu); + add(shapeMethod); + add(locX); + add(locXL); + add(locYT); + add(locY); + add(centerX); + add(centerY); + add(circrad); + add(qualityMethod); + add(transit); + add(transitweak); + add(transitgrad); + add(feather); + add(struc); + add(thresh); + add(iter); + add(balan); + add(balanh); + add(colorde); + add(colorscope); + add(avoidrad); + add(hishow); + add(activ); + add(blwh); + add(recurs); + add(laplac); + add(deltae); + add(scopemask); + add(denoichmask); + add(shortc); + add(lumask); + //add(savrest); + add(complexMethod); + add(wavMethod); + add(avoidgamutMethod); +} + +//----------------------------------------------------------------------------- +// RenameDialog +//----------------------------------------------------------------------------- + +ControlSpotPanel::RenameDialog::RenameDialog(const Glib::ustring &actualname, Gtk::Window &parent): + Gtk::Dialog(M("TP_LOCALLAB_REN_DIALOG_NAME"), parent), + + newname_(Gtk::manage(new Gtk::Entry())) +{ + // Entry widget + Gtk::Box* const hb = Gtk::manage(new Gtk::Box()); + hb->pack_start(*Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_REN_DIALOG_LAB"))), false, false, 4); + newname_->set_text(actualname); + hb->pack_start(*newname_); + get_content_area()->pack_start(*hb, Gtk::PACK_SHRINK, 4); + + // OK/CANCEL buttons + add_button(M("GENERAL_OK"), OkButton); + add_button(M("GENERAL_CANCEL"), CancelButton); + + // Set OK button as default one when pressing enter + newname_->set_activates_default(); + set_default_response(OkButton); + + show_all_children(); +} + +Glib::ustring ControlSpotPanel::RenameDialog::get_new_name() +{ + return newname_->get_text(); +} diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h new file mode 100644 index 000000000..b1e191b0e --- /dev/null +++ b/rtgui/controlspotpanel.h @@ -0,0 +1,458 @@ +/* + * 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 . + * 2018 Pierre Cabrera + */ + +#ifndef _CONTROLSPOTPANEL_H_ +#define _CONTROLSPOTPANEL_H_ + +#include "../rtengine/coord.h" +#include "editcallbacks.h" +#include "threadutils.h" +#include "toolpanel.h" +#include "adjuster.h" + +class ControlPanelListener +{ +public: + ControlPanelListener() {}; + virtual ~ControlPanelListener() {}; + + virtual void resetToolMaskView() = 0; + virtual void spotNameChanged(const Glib::ustring &newName) = 0; +}; + + +class ControlSpotPanel: + public ToolParamBlock, + public AdjusterListener, + public EditSubscriber, + public FoldableToolPanel +{ +public: + /** + * A SpotRow structure allows exchanges from and to ControlSpotClass + */ + struct SpotRow { + Glib::ustring name; + bool isvisible; + int prevMethod; // 0 = Normal, 1 = Excluding + int shape; // 0 = Ellipse, 1 = Rectangle + int spotMethod; // 0 = Normal, 1 = Excluding + int sensiexclu; + int structexclu; + int shapeMethod; // 0 = Independent (mouse), 1 = Symmetrical (mouse), 2 = Independent (mouse + sliders), 3 = Symmetrical (mouse + sliders) + int avoidgamutMethod; + int locX; + int locXL; + int locY; + int locYT; + int centerX; + int centerY; + int circrad; + int qualityMethod; // 0 = Standard, 1 = Enhanced, 2 = Enhanced + chroma denoise + double transit; + double transitweak; + double transitgrad; + double feather; + double struc; + double thresh; + double iter; + double balan; + double balanh; + double colorde; + double colorscope; + double avoidrad; + bool hishow; + bool activ; + bool blwh; + bool recurs; + bool laplac; + bool deltae; + int scopemask; + double denoichmask; + bool shortc; + int lumask; + //bool savrest; + int complexMethod; // 0 = Simple, 1 = Moderate, 2 = all + int wavMethod; // 0 = D2, 1 = D4, 2 = D6, 3 = D10, 4 = D14 + }; + + /** + * An event type enumeration allows exchanges of spot panel event type from and to ControlSpotClass + */ + enum eventType { + None = 0, + SpotCreation = 1, + SpotDeletion = 2, + SpotSelection = 3, + SpotDuplication = 4, + SpotAllVisibilityChanged = 5 + }; + + // Constructor and management functions + /** + * Default constructor of ControlSpotPanel class + */ + ControlSpotPanel(); + /** + * Destructor of ControlSpotPanel class + */ + ~ControlSpotPanel(); + /** + * Implementation of setEditProvider function of toolpanel.h + * + * @param provider The EditDataProvider to be linked to the panel to manage curves + */ + void setEditProvider(EditDataProvider* provider) override; + /** + * Setter for controlPanelListener + * + * @param cpl The ControlPanelListener to be linked to the panel + */ + void setControlPanelListener(ControlPanelListener* cpl) + { + controlPanelListener = cpl; + } + /** + * Getter of the event type raised by this panel + * + * @return The raised event type (refer to eventType enumeration) + */ + int getEventType(); + /** + * Getter of params of associated spot + * + * @param index The spot index to get params + * @return A SpotRow structure containing params of associated spot + */ + SpotRow* getSpot(const int index); + /** + * Getter of spots number + * + * @return The number of spots in panel + */ + int getSpotNumber(); + /** + * Getter of selected spot index + * + * @return The index of selected spot in treeview (return -1 if no selected spot) + */ + int getSelectedSpot(); + /** + * Setter of selected spot + * + * @param index The index of spot to be selected + * @return True if a spot corresponding to the index has been selected + */ + bool setSelectedSpot(const int index); + /** + * Setter for mask preview active indicator + * + * @param ind True is mask preview is active + */ + void setMaskPrevActive(bool ind) + { + maskPrevActive = ind; + } + /** + * Getter for deltaE preview active + * + * @return True if preview deltaE is active + */ + bool isDeltaEPrevActive(); + /** + * Reset deltaE preview active state + */ + void resetDeltaEPreview(); + + // Control spot creation functions + /** + * Add a new spot (and its associated curve) + * + * @param newSpot A SpotRow structure containing new spot params + */ + void addControlSpot(SpotRow* newSpot); + + // Control spot delete function + /** + * Delete a spot (and its associated curve) + * + * @param id The id of the spot to be deleted + */ + void deleteControlSpot(const int index); + + // Panel widgets management functions + /** + * Implementation of setDefaults function of toolpanel.h + * + * @param defParams ProcParams containing default values to set to the adjusters + * @param pedited ParamsEdited containing default state values to set to the adjusters (not used because batch mode is deactivated for Locallab) + */ + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + /** + * Enable or disable the interactions with panel widgets + * + * @param cond Condition to enable interactions + */ + void setParamEditable(bool cond); + /** + * Reset expander collapse state to default one + */ + void setDefaultExpanderVisibility(); + + // Batch mode management + // Note: Batch mode is deactivated for Locallab + +private: + // Cell renderer + void render_name(Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); + void render_isvisible(Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); + + void on_button_add(); + void on_button_delete(); + void on_button_duplicate(); + void on_button_rename(); + bool on_button_visibility(GdkEventButton* event); + + bool blockTreeviewSearch(GdkEventKey* event); + bool onSpotSelectionEvent(GdkEventButton* event); + + void load_ControlSpot_param(); + + void controlspotChanged(); + + void prevMethodChanged(); + void shapeChanged(); + void spotMethodChanged(); + void shapeMethodChanged(); + void qualityMethodChanged(); + void avoidgamutMethodChanged(); + //void complexMethodChanged(); + void wavMethodChanged(); + + void updateParamVisibility(); + + void adjusterChanged(Adjuster* a, double newval) override; + + void hishowChanged(); + void activChanged(); + void blwhChanged(); + void recursChanged(); + void laplacChanged(); + void deltaeChanged(); + void shortcChanged(); + //void savrestChanged(); + + void previewChanged(); + + void disableParamlistener(bool cond); + + void addControlSpotCurve(Gtk::TreeModel::Row& row); + void updateControlSpotCurve(const Gtk::TreeModel::Row& row); + void deleteControlSpotCurve(Gtk::TreeModel::Row& row); + void updateCurveOpacity(const Gtk::TreeModel::Row& selectedRow); + CursorShape getCursor(int objectID, int xPos, int yPos) const override; + bool mouseOver(int modifierKey) override; + bool button1Pressed(int modifierKey) override; + bool button1Released() override; + bool drag1(int modifierKey) override; + + using ToolPanel::setDefaults; + + class ControlSpots: + public Gtk::TreeModel::ColumnRecord + { + public: + ControlSpots(); + + Gtk::TreeModelColumn mouseover; // Used to manage spot enlightening when mouse over + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn isvisible; + Gtk::TreeModelColumn curveid; // Associated curve id + Gtk::TreeModelColumn prevMethod; // 0 = hide, 1 = show + Gtk::TreeModelColumn shape; // 0 = Ellipse, 1 = Rectangle + Gtk::TreeModelColumn spotMethod; // 0 = Normal, 1 = Excluding + Gtk::TreeModelColumn sensiexclu; + Gtk::TreeModelColumn structexclu; + Gtk::TreeModelColumn shapeMethod; // 0 = Independent (mouse), 1 = Symmetrical (mouse), 2 = Independent (mouse + sliders), 3 = Symmetrical (mouse + sliders) + Gtk::TreeModelColumn avoidgamutMethod; + Gtk::TreeModelColumn locX; + Gtk::TreeModelColumn locXL; + Gtk::TreeModelColumn locY; + Gtk::TreeModelColumn locYT; + Gtk::TreeModelColumn centerX; + Gtk::TreeModelColumn centerY; + Gtk::TreeModelColumn circrad; + Gtk::TreeModelColumn qualityMethod; // 0 = Standard, 1 = Enhanced, 2 = Enhanced + chroma denoise + Gtk::TreeModelColumn transit; + Gtk::TreeModelColumn transitweak; + Gtk::TreeModelColumn transitgrad; + Gtk::TreeModelColumn feather; + Gtk::TreeModelColumn struc; + Gtk::TreeModelColumn thresh; + Gtk::TreeModelColumn iter; + Gtk::TreeModelColumn balan; + Gtk::TreeModelColumn balanh; + Gtk::TreeModelColumn colorde; + Gtk::TreeModelColumn colorscope; + Gtk::TreeModelColumn avoidrad; + Gtk::TreeModelColumn hishow; + Gtk::TreeModelColumn activ; + Gtk::TreeModelColumn blwh; + Gtk::TreeModelColumn recurs; + Gtk::TreeModelColumn laplac; + Gtk::TreeModelColumn deltae; + Gtk::TreeModelColumn scopemask; + Gtk::TreeModelColumn denoichmask; + Gtk::TreeModelColumn shortc; + Gtk::TreeModelColumn lumask; + //Gtk::TreeModelColumn savrest; + Gtk::TreeModelColumn complexMethod; // 0 = Simple, 1 = mod, 2 = all + Gtk::TreeModelColumn wavMethod; // 0 = D2, 1 = D4, 2 = D6, 3 = D10, 4 = D14 + }; + + class RenameDialog: + public Gtk::Dialog + { + public: + enum DialogButton { + OkButton = 1, + CancelButton = 2 + }; + + RenameDialog(const Glib::ustring &actualname, Gtk::Window &parent); + Glib::ustring get_new_name(); + + private: + Gtk::Entry* const newname_; + }; + + ControlSpots spots_; + rtengine::ProcEvent EvLocallabavoidgamutMethod; + + // Child widgets + Gtk::ScrolledWindow* const scrolledwindow_; + Gtk::TreeView* const treeview_; + sigc::connection treeviewconn_; + Glib::RefPtr treemodel_; + + Gtk::Button* const button_add_; + sigc::connection buttonaddconn_; + Gtk::Button* const button_delete_; + sigc::connection buttondeleteconn_; + Gtk::Button* const button_duplicate_; + sigc::connection buttonduplicateconn_; + + Gtk::Button* const button_rename_; + sigc::connection buttonrenameconn_; + Gtk::Button* const button_visibility_; + sigc::connection buttonvisibilityconn_; + + + MyComboBoxText* const prevMethod_; + sigc::connection prevMethodconn_; + MyComboBoxText* const shape_; + sigc::connection shapeconn_; + MyComboBoxText* const spotMethod_; + sigc::connection spotMethodconn_; + MyComboBoxText* const shapeMethod_; + sigc::connection shapeMethodconn_; + MyComboBoxText* const qualityMethod_; + sigc::connection qualityMethodconn_; + //MyComboBoxText* const complexMethod_; + //sigc::connection complexMethodconn_; + MyComboBoxText* const wavMethod_; + sigc::connection wavMethodconn_; + MyComboBoxText* const avoidgamutMethod_; + sigc::connection avoidgamutconn_; + + Adjuster* const sensiexclu_; + Adjuster* const structexclu_; + Adjuster* const locX_; + Adjuster* const locXL_; + Adjuster* const locY_; + Adjuster* const locYT_; + Adjuster* const centerX_; + Adjuster* const centerY_; + Adjuster* const circrad_; + Adjuster* const transit_; + Adjuster* const transitweak_; + Adjuster* const transitgrad_; + Adjuster* const feather_; + Adjuster* const struc_; + Adjuster* const thresh_; + Adjuster* const iter_; + Adjuster* const balan_; + Adjuster* const balanh_; + Adjuster* const colorde_; + Adjuster* const colorscope_; + Adjuster* const avoidrad_; + Adjuster* const scopemask_; + Adjuster* const denoichmask_; + Adjuster* const lumask_; + + Gtk::CheckButton* const hishow_; + sigc::connection hishowconn_; + Gtk::CheckButton* const activ_; + sigc::connection activConn_; + Gtk::CheckButton* const blwh_; + sigc::connection blwhConn_; + Gtk::CheckButton* const recurs_; + sigc::connection recursConn_; + Gtk::CheckButton* const laplac_; + sigc::connection laplacConn_; + Gtk::CheckButton* const deltae_; + sigc::connection deltaeConn_; + Gtk::CheckButton* const shortc_; + sigc::connection shortcConn_; + //Gtk::CheckButton* const savrest_; + //sigc::connection savrestConn_; + + MyExpander* const expTransGrad_; + MyExpander* const expShapeDetect_; + MyExpander* const expSpecCases_; + MyExpander* const expMaskMerge_; + + Gtk::ToggleButton* const preview_; + sigc::connection previewConn_; + + Gtk::Box* const ctboxshape; + Gtk::Box* const ctboxshapemethod; + Gtk::Box* const ctboxgamut; + + // Internal variables + ControlPanelListener* controlPanelListener; + int lastObject_; + rtengine::Coord lastCoord_; + bool nbSpotChanged_; + bool selSpotChanged_; + bool nameChanged_; + bool visibilityChanged_; + int eventType; // 0 = No event, 1 = Spot creation event, 2 = Spot deletion event, 3 = Spot selection event, 4 = Spot duplication event + Gtk::Frame* const excluFrame; + bool maskPrevActive; + + // Row background color + Gdk::RGBA colorMouseover, colorNominal, colorMouseovertext; + + // Treeview mutex + MyMutex mTreeview; +}; + +#endif // _CONTROLSPOTPANEL_H_ diff --git a/rtgui/coordinateadjuster.cc b/rtgui/coordinateadjuster.cc index ebf36b7e7..57190cf63 100644 --- a/rtgui/coordinateadjuster.cc +++ b/rtgui/coordinateadjuster.cc @@ -69,14 +69,14 @@ void CoordinateAdjuster::AxisAdjuster::setValue(double newValue) { float range = rangeUpperBound - rangeLowerBound; spinButtonConn.block(true); - spinButton->set_value(newValue * range + rangeLowerBound); + spinButton->set_value(static_cast(newValue) * range + rangeLowerBound); spinButtonConn.block(false); } void CoordinateAdjuster::AxisAdjuster::valueChanged() { float range = rangeUpperBound - rangeLowerBound; - parent->updatePos(idx, (spinButton->get_value() - rangeLowerBound) / range); + parent->updatePos(idx, (static_cast(spinButton->get_value()) - rangeLowerBound) / range); } CoordinateAdjuster::CoordinateAdjuster(CoordinateProvider *provider, CurveEditorSubGroup *parent, const std::vector &axis) @@ -171,7 +171,7 @@ void CoordinateAdjuster::startNumericalAdjustment(const std::vector Gtk::SpinButton *currSpinButton = axisAdjusters.at(i)->spinButton; currSpinButton->set_sensitive(true); float range = axisAdjusters.at(i)->rangeUpperBound - axisAdjusters.at(i)->rangeLowerBound; - currSpinButton->set_range(newBoundaries.at(i).minVal * range + axisAdjusters.at(i)->rangeLowerBound, newBoundaries.at(i).maxVal * range + axisAdjusters.at(i)->rangeLowerBound); + currSpinButton->set_range(newBoundaries.at(i).minVal * static_cast(range) + static_cast(axisAdjusters.at(i)->rangeLowerBound), newBoundaries.at(i).maxVal * static_cast(range) + static_cast(axisAdjusters.at(i)->rangeLowerBound)); } axisAdjusters.at(0)->spinButton->grab_focus(); @@ -200,7 +200,7 @@ void CoordinateAdjuster::switchAdjustedPoint(std::vector &pos, const std // ...narrow the range to the new interval float range = axisAdjusters.at(i)->rangeUpperBound - axisAdjusters.at(i)->rangeLowerBound; - currAxis->spinButton->set_range(newBoundaries.at(i).minVal * range + axisAdjusters.at(i)->rangeLowerBound, newBoundaries.at(i).maxVal * range + axisAdjusters.at(i)->rangeLowerBound); + currAxis->spinButton->set_range(newBoundaries.at(i).minVal * static_cast(range) + static_cast(axisAdjusters.at(i)->rangeLowerBound), newBoundaries.at(i).maxVal * static_cast(range) + static_cast(axisAdjusters.at(i)->rangeLowerBound)); // enable events currAxis->spinButtonConn.block(false); diff --git a/rtgui/coordinateadjuster.h b/rtgui/coordinateadjuster.h index 70fe42233..24edc707a 100644 --- a/rtgui/coordinateadjuster.h +++ b/rtgui/coordinateadjuster.h @@ -69,7 +69,7 @@ public: * * The position of the Axis in the vector will be used in the communication between the Adjuster and the Provider to identify the Axis */ -class CoordinateAdjuster : public Gtk::FlowBox +class CoordinateAdjuster final : public Gtk::FlowBox { public: diff --git a/rtgui/crop.cc b/rtgui/crop.cc index 3bdcf14cf..21a32b653 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -16,16 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include + #include "crop.h" #include "options.h" #include "rtimage.h" #include "../rtengine/procparams.h" +#include "../rtengine/utils.h" using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring Crop::TOOL_NAME = "crop"; + namespace { @@ -46,39 +51,83 @@ inline void get_custom_ratio(int w, int h, double &rw, double &rh) } // namespace +class Crop::CropRatios final +{ +public: + CropRatios() : + 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 + {"16:10", 16.0 / 10.0}, // L1.6, P0.625 + {"1:1", 1.0 / 1.0}, // L1, P1 + {"2:1", 2.0 / 1.0}, // L2, P0.5 + {"3:1", 3.0 / 1.0}, // L3, P0.333... + {"4:1", 4.0 / 1.0}, // L4, P0.25 + {"5:1", 5.0 / 1.0}, // L5, P0.2 + {"6:1", 6.0 / 1.0}, // L6, P0.1666... + {"7:1", 7.0 / 1.0}, // L7, P0.142... + {"4:5", 4.0 / 5.0}, // L1.25, P0.8 + {"5:7", 5.0 / 7.0}, // L1.4, P0.714... + {"6:7", 6.0 / 7.0}, // L1.166..., P0.857... + {"6:17", 6.0 / 17.0}, // L2.833..., P0.352... + {"24:65 - XPAN", 24.0 / 65.0}, // L2.708..., P0.369... + {"1.414 - DIN EN ISO 216", 1.414}, // L1.414, P0.707... + {"3.5:5", 3.5 / 5.0}, // L1.428..., P0.7 + {"8.5:11 - US Letter", 8.5 / 11.0}, // L1.294..., P0.772... + {"9.5:12", 9.5 / 12.0}, // L1.263..., P0.791... + {"10:12", 10.0 / 12.0}, // L1.2, P0.833... + {"11:14", 11.0 / 14.0}, // L1.272..., P0.785... + {"11:17 - Tabloid", 11.0 / 17.0}, // L1.545..., P0.647... + {"13:19", 13.0 / 19.0}, // L1.461..., P0.684... + {"17:22", 17.0 / 22.0}, // L1.294..., P0.772... + {"45:35 - ePassport", 45.0 / 35.0}, // L1.285,... P0.777... + {"64:27", 64.0 / 27.0}, // L2.370..., P0.421... + {"13:18", 13.0 / 18.0}, // L1.384..., P0.722... + } + { + } + + std::vector getLabels() const + { + std::vector res; + + res.reserve(ratios.size()); + + for (const auto& ratio : ratios) { + res.push_back(ratio.label); + } + + return res; + } + + double getValue(std::size_t index) const + { + return + index < ratios.size() + ? ratios[index].value + : ratios[0].value; + } + + void updateCurrentRatio(double value) + { + ratios[1].value = value; + } + +private: + struct CropRatio { + Glib::ustring label; + double value; + }; + + std::vector ratios; +}; + 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 - {"16:10", 16.0 / 10.0}, // L1.6, P0.625 - {"1:1", 1.0 / 1.0}, // L1, P1 - {"2:1", 2.0 / 1.0}, // L2, P0.5 - {"3:1", 3.0 / 1.0}, // L3, P0.333... - {"4:1", 4.0 / 1.0}, // L4, P0.25 - {"5:1", 5.0 / 1.0}, // L5, P0.2 - {"6:1", 6.0 / 1.0}, // L6, P0.1666... - {"7:1", 7.0 / 1.0}, // L7, P0.142... - {"4:5", 4.0 / 5.0}, // L1.25, P0.8 - {"5:7", 5.0 / 7.0}, // L1.4, P0.714... - {"6:7", 6.0 / 7.0}, // L1.166..., P0.857... - {"6:17", 6.0 / 17.0}, // L2.833..., P0.352... - {"24:65 - XPAN", 24.0 / 65.0}, // L2.708..., P0.369... - {"1.414 - DIN EN ISO 216", 1.414}, // L1.414, P0.707... - {"3.5:5", 3.5 / 5.0}, // L1.428..., P0.7 - {"8.5:11 - US Letter", 8.5 / 11.0}, // L1.294..., P0.772... - {"9.5:12", 9.5 / 12.0}, // L1.263..., P0.791... - {"10:12", 10.0 / 12.0}, // L1.2, P0.833... - {"11:14", 11.0 / 14.0}, // L1.272..., P0.785... - {"11:17 - Tabloid", 11.0 / 17.0}, // L1.545..., P0.647... - {"13:19", 13.0 / 19.0}, // L1.461..., P0.684... - {"17:22", 17.0 / 22.0}, // L1.294..., P0.772... - {"45:35 - ePassport", 45.0 / 35.0}, // L1.285,... P0.777... - {"64:27", 64.0 / 27.0}, // L2.370..., P0.421... - }, + FoldableToolPanel(this, TOOL_NAME, M("TP_CROP_LABEL"), false, true), + crop_ratios(new CropRatios), opt(0), wDirty(true), hDirty(true), @@ -146,7 +195,7 @@ Crop::Crop(): methodgrid->attach (*resetCrop, 2, 2, 2, 1); pack_start (*methodgrid, Gtk::PACK_EXPAND_WIDGET, 0 ); - Gtk::HSeparator* methodseparator = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* methodseparator = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); methodseparator->get_style_context()->add_class("grid-row-separator"); pack_start (*methodseparator, Gtk::PACK_SHRINK, 0); @@ -196,7 +245,7 @@ Crop::Crop(): ppigrid->set_column_homogeneous (true); setExpandAlignProperties(ppigrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::HSeparator* ppiseparator = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* ppiseparator = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); ppiseparator->get_style_context()->add_class("grid-row-separator"); Gtk::Grid* ppisubgrid = Gtk::manage(new Gtk::Grid()); @@ -229,8 +278,8 @@ Crop::Crop(): // ppigrid END // Populate the combobox - for (const auto& crop_ratio : crop_ratios) { - ratio->append (crop_ratio.label); + for (const auto& label : crop_ratios->getLabels()) { + ratio->append (label); } ratio->set_active (0); @@ -249,6 +298,7 @@ Crop::Crop(): guide->append (M("TP_CROP_GTTRIANGLE1")); guide->append (M("TP_CROP_GTTRIANGLE2")); guide->append (M("TP_CROP_GTEPASSPORT")); + guide->append (M("TP_CROP_GTCENTEREDSQUARE")); guide->set_active (0); w->set_range (1, maxw); @@ -354,7 +404,10 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) setDimensions (pp->crop.x + pp->crop.w, pp->crop.y + pp->crop.h); } - 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; + const bool flip_orientation = + pp->crop.fixratio + && crop_ratios->getValue(ratio->get_active_row_number()) > 0 + && crop_ratios->getValue(ratio->get_active_row_number()) < 1.0; if (pp->crop.orientation == "Landscape") { orientation->set_active (flip_orientation ? 1 : 0); @@ -364,24 +417,19 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) orientation->set_active (2); } - if (pp->crop.guide == "None") { - guide->set_active (0); - } else if (pp->crop.guide == "Frame") { - guide->set_active (1); - } else if (pp->crop.guide == "Rule of thirds") { - guide->set_active (2); - } else if (pp->crop.guide == "Rule of diagonals") { - guide->set_active (3); - } else if (!strncmp(pp->crop.guide.data(), "Harmonic means", 14)) { - guide->set_active (4); - } else if (pp->crop.guide == "Grid") { - guide->set_active (5); - } else if (pp->crop.guide == "Golden Triangle 1") { - guide->set_active (6); - } else if (pp->crop.guide == "Golden Triangle 2") { - guide->set_active (7); - } else if (pp->crop.guide == "ePassport") { - guide->set_active (8); + switch (pp->crop.guide) { + case procparams::CropParams::Guide::NONE: + case procparams::CropParams::Guide::FRAME: + case procparams::CropParams::Guide::RULE_OF_THIRDS: + case procparams::CropParams::Guide::RULE_OF_DIAGONALS: + case procparams::CropParams::Guide::HARMONIC_MEANS: + case procparams::CropParams::Guide::GRID: + case procparams::CropParams::Guide::GOLDEN_TRIANGLE_1: + case procparams::CropParams::Guide::GOLDEN_TRIANGLE_2: + case procparams::CropParams::Guide::EPASSPORT: + case procparams::CropParams::Guide::CENTERED_SQUARE: { + guide->set_active(toUnderlying(pp->crop.guide)); + } } x->set_value(pp->crop.x); @@ -469,7 +517,10 @@ void Crop::write (ProcParams* pp, ParamsEdited* pedited) } // 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; + const bool flip_orientation = + fixr->get_active() + && crop_ratios->getValue(ratio->get_active_row_number()) > 0 + && crop_ratios->getValue(ratio->get_active_row_number()) < 1.0; if (orientation->get_active_row_number() == 0) { pp->crop.orientation = flip_orientation ? "Portrait" : "Landscape"; @@ -479,25 +530,7 @@ void Crop::write (ProcParams* pp, ParamsEdited* pedited) pp->crop.orientation = "As Image"; } - if (guide->get_active_row_number() == 0) { - pp->crop.guide = "None"; - } else if (guide->get_active_row_number() == 1) { - pp->crop.guide = "Frame"; - } else if (guide->get_active_row_number() == 2) { - pp->crop.guide = "Rule of thirds"; - } else if (guide->get_active_row_number() == 3) { - pp->crop.guide = "Rule of diagonals"; - } else if (guide->get_active_row_number() == 4) { - pp->crop.guide = "Harmonic means"; - } else if (guide->get_active_row_number() == 5) { - pp->crop.guide = "Grid"; - } else if (guide->get_active_row_number() == 6) { - pp->crop.guide = "Golden Triangle 1"; - } else if (guide->get_active_row_number() == 7) { - pp->crop.guide = "Golden Triangle 2"; - } else if (guide->get_active_row_number() == 8) { - pp->crop.guide = "ePassport"; - } + pp->crop.guide = procparams::CropParams::Guide(guide->get_active_row_number()); if (pedited) { pedited->crop.enabled = !get_inconsistent(); @@ -561,6 +594,11 @@ void Crop::doresetCrop () yDirty = true; wDirty = true; hDirty = true; + + // Reset ratio, ratio lock and orientation as well + ratio->set_active(0); + orientation->set_active(2); + fixr->set_active(true); int X = 0; int Y = 0; @@ -1006,7 +1044,7 @@ void Crop::cropWidth1Resized (int &X, int &Y, int &W, int &H, float custom_ratio } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0.f ? custom_ratio : static_cast(getRatio()); H = (int)round(W / r); int Hmax = min(ny + nh, maxh - ny); @@ -1053,7 +1091,7 @@ void Crop::cropWidth2Resized (int &X, int &Y, int &W, int &H, float custom_ratio } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0 ? custom_ratio : static_cast(getRatio()); H = (int)round(W / r); int Hmax = min(ny + nh, maxh - ny); @@ -1101,7 +1139,7 @@ void Crop::cropHeight1Resized (int &X, int &Y, int &W, int &H, float custom_rati } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0 ? custom_ratio : static_cast(getRatio()); W = (int)round(H * r); int Wmax = min(nx + nw, maxw - nx); @@ -1148,7 +1186,7 @@ void Crop::cropHeight2Resized (int &X, int &Y, int &W, int &H, float custom_rati } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0 ? custom_ratio : static_cast(getRatio()); W = (int)round(H * r); int Wmax = min(nx + nw, maxw - nx); @@ -1205,7 +1243,7 @@ void Crop::cropTopLeftResized (int &X, int &Y, int &W, int &H, float custom_rati } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0 ? custom_ratio : static_cast(getRatio()); W = (int)round(H * r); if (W > oldXR) { @@ -1252,7 +1290,7 @@ void Crop::cropTopRightResized (int &X, int &Y, int &W, int &H, float custom_rat } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0 ? custom_ratio : static_cast(getRatio()); W = (int)round(H * r); if (W > maxw - nx) { @@ -1298,7 +1336,7 @@ void Crop::cropBottomLeftResized (int &X, int &Y, int &W, int &H, float custom_r } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0 ? custom_ratio : static_cast(getRatio()); W = (int)round(H * r); if (W > oldXR) { @@ -1342,7 +1380,7 @@ void Crop::cropBottomRightResized (int &X, int &Y, int &W, int &H, float custom_ } if (fixr->get_active() || custom_ratio > 0) { - double r = custom_ratio > 0 ? custom_ratio : getRatio(); + double r = custom_ratio > 0 ? custom_ratio : static_cast(getRatio()); W = (int)round(H * r); if (W > maxw - nx) { @@ -1501,7 +1539,7 @@ double Crop::getRatio () const return r; } - r = crop_ratios[ratio->get_active_row_number()].value; + r = crop_ratios->getValue(ratio->get_active_row_number()); if (!r) { r = maxh <= maxw ? float(maxh)/float(maxw) : float(maxw)/float(maxh); } @@ -1539,5 +1577,5 @@ 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()); + crop_ratios->updateCurrentRatio(static_cast(w->get_value()) / static_cast(h->get_value())); } diff --git a/rtgui/crop.h b/rtgui/crop.h index b9221a803..83eb6bbbb 100644 --- a/rtgui/crop.h +++ b/rtgui/crop.h @@ -18,7 +18,7 @@ */ #pragma once -#include +#include #include @@ -41,6 +41,8 @@ class Crop final : public rtengine::SizeListener { public: + static const Glib::ustring TOOL_NAME; + Crop(); ~Crop() override; @@ -91,16 +93,13 @@ public: void rotateCrop (int deg, bool hflip, bool vflip); private: - struct CropRatio { - Glib::ustring label; - double value; - }; - - std::vector crop_ratios; + class CropRatios; void adjustCropToRatio(); void updateCurrentRatio(); + const std::unique_ptr crop_ratios; + Gtk::CheckButton* fixr; MyComboBoxText* ratio; MyComboBoxText* orientation; diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 0a9b81112..0cd6f3f6c 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -37,6 +37,7 @@ #include "rtsurface.h" #include "../rtengine/dcrop.h" +#include "../rtengine/imagesource.h" #include "../rtengine/procparams.h" #include "../rtengine/rt_math.h" @@ -123,14 +124,14 @@ void CropWindow::initZoomSteps() zoomSteps.push_back(ZoomStep(" 8%", 1.0/12.0, 120, true)); char lbl[64]; for (int s = 100; s >= 11; --s) { - float z = 10./float(s); - sprintf(lbl, "% 2d%%", int(z * 100)); + float z = 10.f / s; + snprintf(lbl, sizeof(lbl), "% 2d%%", int(z * 100)); bool is_major = (s == s/10 * 10); zoomSteps.push_back(ZoomStep(lbl, z, s, is_major)); } zoom11index = zoomSteps.size(); for (int s = 1; s <= 8; ++s) { - sprintf(lbl, "%d00%%", s); + snprintf(lbl, sizeof(lbl), "%d00%%", s); zoomSteps.push_back(ZoomStep(lbl, s, s * 1000, true)); } zoomSteps.push_back(ZoomStep("1600%", 16, 16000, true)); @@ -294,7 +295,7 @@ void CropWindow::flawnOver (bool isFlawnOver) void CropWindow::scroll (int state, GdkScrollDirection direction, int x, int y, double deltaX, double deltaY) { double delta = 0.0; - if (abs(deltaX) > abs(deltaY)) { + if (std::fabs(deltaX) > std::fabs(deltaY)) { delta = deltaX; } else { delta = deltaY; @@ -303,7 +304,7 @@ void CropWindow::scroll (int state, GdkScrollDirection direction, int x, int y, if (direction == GDK_SCROLL_SMOOTH) { scrollAccum += delta; //Only change zoom level if we've accumulated +/- 1.0 of deltas. This conditional handles the previous delta=0.0 case - if (abs(scrollAccum) < 1.0) { + if (std::fabs(scrollAccum) < 1.0) { return; } } @@ -402,7 +403,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->outputProfile, &cropHandler.colorParams->workingProfile); + LockableColorPicker *newPicker = new LockableColorPicker(this, cropHandler.colorParams.get()); colorPickers.push_back(newPicker); hoveredPicker = newPicker; updateHoveredPicker(&imgPos); @@ -413,7 +414,8 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) action_y = 0; needRedraw = true; } - } else if (iarea->getToolMode () == TMHand + } else if ((iarea->getToolMode () == TMHand + || iarea->getToolMode() == TMPerspective) && editSubscriber && cropgl && cropgl->inImageArea(iarea->posImage.x, iarea->posImage.y) @@ -428,6 +430,8 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) state = SEditPick1; pickedObject = iarea->getObject(); pickModifierKey = bstate; + } else if (iarea->getToolMode() == TMPerspective) { + state = SCropImgMove; } press_x = x; press_y = y; @@ -506,7 +510,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) 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))) { + if ((cropgl && cropgl->inImageArea(iarea->posImage.x, iarea->posImage.y) && (editSubscriber->getEditingType() == ET_PIPETTE && (bstate & GDK_CONTROL_MASK))) || editSubscriber->getEditingType() == ET_OBJECTS) { needRedraw = editSubscriber->button1Pressed(bstate); if (editSubscriber->isDragging()) { state = SEditDrag1; @@ -536,7 +540,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) action_y = 0; } - } else if (iarea->getToolMode () == TMHand) { // events outside of the image domain + } else if (iarea->getToolMode () == TMHand || iarea->getToolMode() == TMPerspective) { // events outside of the image domain EditSubscriber *editSubscriber = iarea->getCurrSubscriber(); if (editSubscriber && editSubscriber->getEditingType() == ET_OBJECTS) { @@ -591,7 +595,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) } } } else if (button == 3) { - if (iarea->getToolMode () == TMHand) { + if (iarea->getToolMode () == TMHand || iarea->getToolMode() == TMPerspective) { EditSubscriber *editSubscriber = iarea->getCurrSubscriber(); if (editSubscriber && editSubscriber->getEditingType() == ET_OBJECTS) { needRedraw = editSubscriber->button3Pressed(bstate); @@ -701,15 +705,15 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) state = SNormal; needRedraw = true; } else if (state == SEditDrag1 || state == SEditDrag2 || state == SEditDrag3) { - if (state == SEditDrag1) { - needRedraw = editSubscriber->button1Released(); - } else if (state == SEditDrag2) { - needRedraw = editSubscriber->button2Released(); - } else if (state == SEditDrag3) { - needRedraw = editSubscriber->button3Released(); - } - if (editSubscriber) { + if (state == SEditDrag1) { + needRedraw = editSubscriber->button1Released(); + } else if (state == SEditDrag2) { + needRedraw = editSubscriber->button2Released(); + } else if (state == SEditDrag3) { + needRedraw = editSubscriber->button3Released(); + } + rtengine::Crop* crop = static_cast(cropHandler.getCrop()); Coord imgPos; action_x = x; @@ -763,7 +767,10 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) iarea->setObject(ObjectMOBuffer::getObjectID(cropPos)); - bool elemPicked = iarea->getObject() == pickedObject && bstate == pickModifierKey; + int buttonMask = ((state == SEditPick1) ? GDK_BUTTON1_MASK : 0) + | ((state == SEditPick2) ? GDK_BUTTON2_MASK : 0) + | ((state == SEditPick3) ? GDK_BUTTON3_MASK : 0); + bool elemPicked = iarea->getObject() == pickedObject && bstate == (pickModifierKey | buttonMask); if (state == SEditPick1) { needRedraw = editSubscriber->pick1 (elemPicked); @@ -787,6 +794,13 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) iarea->setToolHand (); } + if (state != SEditDrag1 && state != SEditDrag2 && state != SEditDrag3) { + iarea->deltaImage.set(0, 0); + iarea->deltaScreen.set(0, 0); + iarea->deltaPrevImage.set(0, 0); + iarea->deltaPrevScreen.set(0, 0); + } + if (cropgl && (state == SCropSelecting || state == SResizeH1 || state == SResizeH2 || state == SResizeW1 || state == SResizeW2 || state == SResizeTL || state == SResizeTR || state == SResizeBL || state == SResizeBR || state == SCropMove)) { cropgl->cropManipReady (); iarea->setToolHand (); @@ -1081,10 +1095,10 @@ void CropWindow::pointerMoved (int bstate, int x, int y) printf("Using \"%s\" output\n", outputProfile.c_str()); if(outputProfile==options.rtSettings.srgb) printf("OK SRGB2"); */ - pmlistener->pointerMoved (false, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, -1, -1, -1); + pmlistener->pointerMoved (false, *cropHandler.colorParams, mx, my, -1, -1, -1); if (pmhlistener) { - pmhlistener->pointerMoved (false, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, -1, -1, -1); + pmhlistener->pointerMoved (false, *cropHandler.colorParams, mx, my, -1, -1, -1); } } else { @@ -1121,7 +1135,7 @@ void CropWindow::pointerMoved (int bstate, int x, int y) rtengine::StagedImageProcessor* ipc = iarea->getImProcCoordinator(); if(ipc) { procparams::ProcParams params; - ipc->getParams(¶ms); + ipc->getParams(¶ms, true); 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()); @@ -1131,11 +1145,11 @@ void CropWindow::pointerMoved (int bstate, int x, int y) // 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); + pmlistener->pointerMoved (true, *cropHandler.colorParams, 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); + pmhlistener->pointerMoved (true, *cropHandler.colorParams, mx, my, rval, gval, bval); } } } @@ -1286,7 +1300,10 @@ void CropWindow::updateCursor (int x, int y) } else if (onArea (CropToolBar, x, y)) { newType = CSMove; } else if (iarea->getObject() > -1 && editSubscriber && editSubscriber->getEditingType() == ET_OBJECTS) { - newType = editSubscriber->getCursor(iarea->getObject()); + int cursorX; + int cursorY; + screenCoordToImage (x, y, cursorX, cursorY); + newType = editSubscriber->getCursor(iarea->getObject(), cursorX, cursorY); } else if (onArea (CropResize, x, y)) { newType = CSResizeDiagonal; } else if (tm == TMColorPicker && hoveredPicker) { @@ -1313,7 +1330,10 @@ void CropWindow::updateCursor (int x, int y) } if (objectID > -1) { - newType = editSubscriber->getCursor(objectID); + int cursorX; + int cursorY; + screenCoordToImage (x, y, cursorX, cursorY); + newType = editSubscriber->getCursor(objectID, cursorX, cursorY); } else if (tm == TMHand) { if (onArea (CropObserved, x, y)) { newType = CSMove; @@ -1339,7 +1359,10 @@ void CropWindow::updateCursor (int x, int y) } if (objectID > -1) { - newType = editSubscriber->getCursor(objectID); + int cursorX; + int cursorY; + screenCoordToImage (x, y, cursorX, cursorY); + newType = editSubscriber->getCursor(objectID, cursorX, cursorY); } else { newType = CSArrow; } @@ -1368,6 +1391,16 @@ void CropWindow::updateCursor (int x, int y) newType = CSResizeDiagonal; } else if (state == SDragPicker) { newType = CSMove2D; + } else if (editSubscriber && editSubscriber->getEditingType() == ET_OBJECTS) { + int objectID = iarea->getObject(); + if (objectID > -1) { + int cursorX; + int cursorY; + screenCoordToImage (x, y, cursorX, cursorY); + newType = editSubscriber->getCursor(objectID, cursorX, cursorY); + } else { + newType = CSArrow; + } } if (newType != cursor_type) { @@ -1437,10 +1470,10 @@ void CropWindow::expose (Cairo::RefPtr cr) if (state == SNormal) { switch (options.cropGuides) { case Options::CROP_GUIDE_NONE: - cropParams.guide = "None"; + cropParams.guide = procparams::CropParams::Guide::NONE; break; case Options::CROP_GUIDE_FRAME: - cropParams.guide = "Frame"; + cropParams.guide = procparams::CropParams::Guide::FRAME; break; default: break; diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 491124ad5..623653d2d 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -54,7 +54,7 @@ public: }; class ImageArea; -class CropWindow : public LWButtonListener, public CropDisplayHandler, public EditCoordSystem, public ObjectMOBuffer, public rtengine::NonCopyable +class CropWindow final : public LWButtonListener, public CropDisplayHandler, public EditCoordSystem, public ObjectMOBuffer, public rtengine::NonCopyable { static bool initialized; diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc index 8dc88473e..67cea5174 100644 --- a/rtgui/curveeditor.cc +++ b/rtgui/curveeditor.cc @@ -248,6 +248,7 @@ CurveEditor::CurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEd { bgHistValid = false; + locallabRef = 0.0; remoteDrag = false; selected = DCT_Linear; bottomBarCP = nullptr; @@ -322,6 +323,18 @@ void CurveEditor::updateBackgroundHistogram(const LUTu& hist) subGroup->updateBackgroundHistogram(this); } +/* + * Update Locallab reference value displayed in the background + */ +void CurveEditor::updateLocallabBackground(double ref) +{ + // Copy Locallab reference value in the curve editor cache + locallabRef = ref; + + // Then call the curve editor group to eventually update the histogram + subGroup->updateLocallabBackground(this); +} + // Open up the curve if it has modifications and it's not already opened // Returns: true if curve was non linear and opened bool CurveEditor::openIfNonlinear() @@ -491,7 +504,7 @@ bool CurveEditor::drag1(int modifierKey) return false; } -CursorShape CurveEditor::getCursor(int objectID) const +CursorShape CurveEditor::getCursor(int objectID, int xPos, int yPos) const { if (remoteDrag) { return CSResizeHeight; diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h index baae8f492..398c63603 100644 --- a/rtgui/curveeditor.h +++ b/rtgui/curveeditor.h @@ -18,8 +18,8 @@ */ #pragma once -#include "coloredbar.h" #include "editcallbacks.h" +#include "guiutils.h" #include "../rtengine/diagonalcurvetypes.h" #include "../rtengine/flatcurvetypes.h" @@ -28,6 +28,7 @@ class CurveEditorGroup; class CurveEditorSubGroup; +class ColorProvider; class PopUpToggleButton; /* @@ -58,7 +59,7 @@ protected: PopUpToggleButton* curveType; LUTu histogram; // histogram values bool bgHistValid; - + double locallabRef; // Locallab reference value bool remoteDrag; int selected; @@ -94,7 +95,7 @@ public: bool isUnChanged (); void setUnChanged (bool uc); void updateBackgroundHistogram(const LUTu& hist); - + void updateLocallabBackground(double ref); void setLeftBarColorProvider(ColorProvider* cp, int callerId); void setBottomBarColorProvider(ColorProvider* cp, int callerId); void setCurveColorProvider(ColorProvider* cp, int callerId); @@ -132,7 +133,7 @@ public: bool button1Pressed(int modifierKey) override; bool button1Released() override; bool drag1(int modifierKey) override; - CursorShape getCursor(int objectID) const override; + CursorShape getCursor(int objectID, int xPos, int yPos) const override; }; diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index cad49d331..d099e1a99 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -29,12 +29,17 @@ #include "options.h" #include "pathutils.h" -CurveEditorGroup::CurveEditorGroup (Glib::ustring& curveDir, Glib::ustring groupLabel) : curveDir(curveDir), line(0), curve_reset(nullptr), +CurveEditorGroup::CurveEditorGroup (Glib::ustring& curveDir, Glib::ustring groupLabel, int blank) : curveDir(curveDir), line(0), curve_reset(nullptr), displayedCurve(nullptr), flatSubGroup(nullptr), diagonalSubGroup(nullptr), cl(nullptr), numberOfPackedCurve(0) { // We set the label to the one provided as parameter, even if it's an empty string - curveGroupLabel = Gtk::manage (new Gtk::Label (groupLabel + ":", Gtk::ALIGN_START)); + if(blank == 0) { + curveGroupLabel = Gtk::manage (new Gtk::Label (groupLabel + ":", Gtk::ALIGN_START)); + } else if(blank == 1){ + curveGroupLabel = Gtk::manage (new Gtk::Label (groupLabel, Gtk::ALIGN_START)); + } + setExpandAlignProperties(curveGroupLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); set_row_spacing(RTScalable::getScale()); } @@ -274,6 +279,7 @@ void CurveEditorGroup::curveTypeToggled(CurveEditor* ce) if (ct < ce->subGroup->valUnchanged) { ce->subGroup->restoreDisplayedHistogram(); + ce->subGroup->restoreLocallabBackground(); } } else { // The button is now released, so we have to hide this CurveEditor diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index 5ef13656b..55d438b2d 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -71,7 +71,7 @@ public: * dialogs. */ - explicit CurveEditorGroup(Glib::ustring& curveDir, Glib::ustring groupLabel = ""); + explicit CurveEditorGroup(Glib::ustring& curveDir, Glib::ustring groupLabel = "", int blank = 0); ~CurveEditorGroup() override; void newLine(); void curveListComplete(); @@ -137,6 +137,7 @@ public: } void updateEditButton(CurveEditor* curve, Gtk::ToggleButton *button, sigc::connection &connection); virtual void updateBackgroundHistogram (CurveEditor* ce) {} + virtual void updateLocallabBackground(CurveEditor* ce) {}; virtual void switchGUI() = 0; virtual void refresh(CurveEditor *curveToRefresh) = 0; virtual void editModeSwitchedOff() = 0; @@ -166,6 +167,7 @@ protected: virtual void storeCurveValues (CurveEditor* ce, const std::vector& p) = 0; virtual void storeDisplayedCurve () = 0; virtual void restoreDisplayedHistogram() {}; + virtual void restoreLocallabBackground() {}; virtual void removeEditor () = 0; virtual const std::vector getCurveFromGUI (int type) = 0; diff --git a/rtgui/darkframe.cc b/rtgui/darkframe.cc index 74ef1384a..83c7fe81c 100644 --- a/rtgui/darkframe.cc +++ b/rtgui/darkframe.cc @@ -30,9 +30,11 @@ using namespace rtengine; using namespace rtengine::procparams; -DarkFrame::DarkFrame () : FoldableToolPanel(this, "darkframe", M("TP_DARKFRAME_LABEL")), dfChanged(false), lastDFauto(false), dfp(nullptr), israw(true) +const Glib::ustring DarkFrame::TOOL_NAME = "darkframe"; + +DarkFrame::DarkFrame () : FoldableToolPanel(this, TOOL_NAME, M("TP_DARKFRAME_LABEL")), dfChanged(false), lastDFauto(false), dfp(nullptr), israw(true) { - hbdf = Gtk::manage(new Gtk::HBox()); + hbdf = Gtk::manage(new Gtk::Box()); hbdf->set_spacing(4); darkFrameFile = Gtk::manage(new MyFileChooserButton(M("TP_DARKFRAME_LABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)); bindCurrentFolder (*darkFrameFile, options.lastDarkframeDir); @@ -97,7 +99,7 @@ void DarkFrame::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi if( pp->raw.df_autoselect && dfp && !multiImage) { // retrieve the auto-selected df filename - rtengine::RawImage *img = dfp->getDF(); + const rtengine::RawImage *img = dfp->getDF(); if( img ) { dfInfo->set_text( Glib::ustring::compose("%1: %2ISO %3s", Glib::path_get_basename(img->get_filename()), img->get_ISOspeed(), img->get_shutter()) ); @@ -179,7 +181,7 @@ void DarkFrame::dfAutoChanged() if(dfAuto->get_active() && dfp && !batchMode) { // retrieve the auto-selected df filename - rtengine::RawImage *img = dfp->getDF(); + const rtengine::RawImage *img = dfp->getDF(); if( img ) { dfInfo->set_text( Glib::ustring::compose("%1: %2ISO %3s", Glib::path_get_basename(img->get_filename()), img->get_ISOspeed(), img->get_shutter()) ); diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index 30696e3db..086ee7ec5 100644 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -36,7 +36,7 @@ class DFProvider { public: virtual ~DFProvider() = default; - virtual rtengine::RawImage* getDF() = 0; + virtual const rtengine::RawImage* getDF() = 0; virtual Glib::ustring GetCurrentImageFilePath() = 0; // add other info here }; @@ -49,7 +49,7 @@ class DarkFrame final: protected: MyFileChooserButton *darkFrameFile; - Gtk::HBox *hbdf; + Gtk::Box *hbdf; Gtk::Button *btnReset; Gtk::Label *dfLabel; Gtk::Label *dfInfo; @@ -62,6 +62,7 @@ protected: bool israw; public: + static const Glib::ustring TOOL_NAME; DarkFrame (); diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc index cdec88edc..72388ac8c 100644 --- a/rtgui/defringe.cc +++ b/rtgui/defringe.cc @@ -30,14 +30,16 @@ using namespace rtengine; using namespace rtengine::procparams; -Defringe::Defringe () : FoldableToolPanel(this, "defringe", M("TP_DEFRINGE_LABEL"), true, true) +const Glib::ustring Defringe::TOOL_NAME = "defringe"; + +Defringe::Defringe () : FoldableToolPanel(this, TOOL_NAME, M("TP_DEFRINGE_LABEL"), true, true) { std::vector bottomMilestones; float R, G, B; for (int i = 0; i < 7; i++) { - float x = float(i) * (1.0f / 6.0); + float x = i / 6.f; Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); bottomMilestones.push_back( GradientMilestone(double(x), double(R), double(G), double(B)) ); } diff --git a/rtgui/defringe.h b/rtgui/defringe.h index ebf1eecd8..d939ff926 100644 --- a/rtgui/defringe.h +++ b/rtgui/defringe.h @@ -46,6 +46,7 @@ protected: bool edges; public: + static const Glib::ustring TOOL_NAME; Defringe (); ~Defringe () override; diff --git a/rtgui/dehaze.cc b/rtgui/dehaze.cc index 6b7fcd64f..b77b76945 100644 --- a/rtgui/dehaze.cc +++ b/rtgui/dehaze.cc @@ -29,14 +29,16 @@ using namespace rtengine; using namespace rtengine::procparams; -Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, true) +const Glib::ustring Dehaze::TOOL_NAME = "dehaze"; + +Dehaze::Dehaze(): FoldableToolPanel(this, TOOL_NAME, 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"); - EvDehazeLuminance = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_LUMINANCE"); + EvDehazeSaturation = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_SATURATION"); strength = Gtk::manage(new Adjuster(M("TP_DEHAZE_STRENGTH"), 0., 100., 1., 50.)); strength->setAdjusterListener(this); @@ -46,9 +48,9 @@ Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, depth->setAdjusterListener(this); depth->show(); - luminance = Gtk::manage(new Gtk::CheckButton(M("TP_DEHAZE_LUMINANCE"))); - luminance->signal_toggled().connect(sigc::mem_fun(*this, &Dehaze::luminanceChanged)); - luminance->show(); + saturation = Gtk::manage(new Adjuster(M("TP_DEHAZE_SATURATION"), 0., 100., 1., 50.)); + saturation->setAdjusterListener(this); + saturation->show(); showDepthMap = Gtk::manage(new Gtk::CheckButton(M("TP_DEHAZE_SHOW_DEPTH_MAP"))); showDepthMap->signal_toggled().connect(sigc::mem_fun(*this, &Dehaze::showDepthMapChanged)); @@ -56,65 +58,65 @@ Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, pack_start(*strength); pack_start(*depth); - pack_start(*luminance); + pack_start(*saturation); pack_start(*showDepthMap); } - void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) { disableListener(); if (pedited) { strength->setEditedState(pedited->dehaze.strength ? Edited : UnEdited); + saturation->setEditedState(pedited->dehaze.saturation ? Edited : UnEdited); depth->setEditedState(pedited->dehaze.depth ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->dehaze.enabled); showDepthMap->set_inconsistent(!pedited->dehaze.showDepthMap); - luminance->set_inconsistent(!pedited->dehaze.luminance); } setEnabled(pp->dehaze.enabled); strength->setValue(pp->dehaze.strength); + saturation->setValue(pp->dehaze.saturation); depth->setValue(pp->dehaze.depth); showDepthMap->set_active(pp->dehaze.showDepthMap); - luminance->set_active(pp->dehaze.luminance); enableListener(); } - void Dehaze::write(ProcParams *pp, ParamsEdited *pedited) { pp->dehaze.strength = strength->getValue(); + pp->dehaze.saturation = saturation->getValue(); pp->dehaze.depth = depth->getValue(); pp->dehaze.enabled = getEnabled(); pp->dehaze.showDepthMap = showDepthMap->get_active(); - pp->dehaze.luminance = luminance->get_active(); if (pedited) { pedited->dehaze.strength = strength->getEditedState(); + pedited->dehaze.saturation = saturation->getEditedState(); pedited->dehaze.depth = depth->getEditedState(); pedited->dehaze.enabled = !get_inconsistent(); pedited->dehaze.showDepthMap = !showDepthMap->get_inconsistent(); - pedited->dehaze.luminance = !luminance->get_inconsistent(); } } void Dehaze::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) { strength->setDefault(defParams->dehaze.strength); + saturation->setDefault(defParams->dehaze.saturation); depth->setDefault(defParams->dehaze.depth); if (pedited) { + saturation->setDefaultEditedState(pedited->dehaze.saturation ? Edited : UnEdited); strength->setDefaultEditedState(pedited->dehaze.strength ? Edited : UnEdited); depth->setDefaultEditedState(pedited->dehaze.depth ? Edited : UnEdited); } else { + saturation->setDefaultEditedState(Irrelevant); strength->setDefaultEditedState(Irrelevant); depth->setDefaultEditedState(Irrelevant); } } - void Dehaze::adjusterChanged(Adjuster* a, double newval) { if (listener && getEnabled()) { @@ -122,11 +124,12 @@ void Dehaze::adjusterChanged(Adjuster* a, double newval) listener->panelChanged(EvDehazeStrength, a->getTextValue()); } else if (a == depth) { listener->panelChanged(EvDehazeDepth, a->getTextValue()); + } else if (a == saturation) { + listener->panelChanged(EvDehazeSaturation, a->getTextValue()); } } } - void Dehaze::enabledChanged () { if (listener) { @@ -140,7 +143,6 @@ void Dehaze::enabledChanged () } } - void Dehaze::showDepthMapChanged() { if (listener) { @@ -148,13 +150,6 @@ void Dehaze::showDepthMapChanged() } } -void Dehaze::luminanceChanged() -{ - if (listener) { - listener->panelChanged(EvDehazeLuminance, luminance->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); - } -} - void Dehaze::setBatchMode(bool batchMode) { ToolPanel::setBatchMode(batchMode); @@ -163,9 +158,7 @@ void Dehaze::setBatchMode(bool batchMode) depth->showEditedCB(); } - void Dehaze::setAdjusterBehavior(bool strengthAdd) { strength->setAddMode(strengthAdd); } - diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h index 79d2e015c..1da50d7dd 100644 --- a/rtgui/dehaze.h +++ b/rtgui/dehaze.h @@ -28,16 +28,18 @@ class Dehaze final : public ToolParamBlock, public AdjusterListener, public Fold private: Adjuster *strength; Adjuster *depth; + Adjuster *saturation; Gtk::CheckButton *showDepthMap; - Gtk::CheckButton *luminance; +// Gtk::CheckButton *luminance; rtengine::ProcEvent EvDehazeEnabled; rtengine::ProcEvent EvDehazeStrength; rtengine::ProcEvent EvDehazeDepth; rtengine::ProcEvent EvDehazeShowDepthMap; - rtengine::ProcEvent EvDehazeLuminance; + rtengine::ProcEvent EvDehazeSaturation; public: + static const Glib::ustring TOOL_NAME; Dehaze(); @@ -49,7 +51,7 @@ public: void adjusterChanged(Adjuster *a, double newval) override; void enabledChanged() override; void showDepthMapChanged(); - void luminanceChanged(); +// void luminanceChanged(); void setAdjusterBehavior(bool strengthAdd); }; diff --git a/rtgui/delayed.h b/rtgui/delayed.h new file mode 100644 index 000000000..80d91a3be --- /dev/null +++ b/rtgui/delayed.h @@ -0,0 +1,240 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (C) 2020 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 . + */ + +#pragma once + +#include +#include +#include + +#include +#include + +#include "../rtengine/noncopyable.h" + +namespace delayed_helper +{ + + // C++14 + + // See https://gist.github.com/ntessore/dc17769676fb3c6daa1f + template + struct index_sequence + { + }; + + template + struct make_index_sequence : + make_index_sequence + { + }; + + template + struct make_index_sequence<0, Is...> : + index_sequence + { + }; + + // C++17 + + // See https://aherrmann.github.io/programming/2016/02/28/unpacking-tuples-in-cpp14/ + template + void apply_impl(F f, T t, index_sequence) + { + f(std::get(t)...); + } + + template + void apply(F f, T t) + { + apply_impl(f, t, make_index_sequence{}>{}); + } + +} + +template +class DelayedCall final : + public rtengine::NonCopyable +{ +public: + DelayedCall(std::function _function, unsigned int _min_delay_ms, unsigned int _max_delay_ms = 0) : + function(_function), + min_delay_ms(_min_delay_ms), + max_delay_ms(_max_delay_ms) + { + } + + explicit DelayedCall(unsigned int _min_delay_ms, unsigned int _max_delay_ms = 0) : + DelayedCall({}, _min_delay_ms, _max_delay_ms) + { + } + + void setFunction(std::function function) + { + this->function = function; + } + + void operator ()(Ts... ts) + { + if (!function) { + return; + } + + if (!min_delay_ms) { + function(ts...); + return; + } + + params = std::make_tuple(ts...); + + min_timeout.disconnect(); + min_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedCall::onMinTimeout), min_delay_ms); + + if (max_delay_ms && !max_timeout.connected()) { + max_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedCall::onMaxTimeout), max_delay_ms); + } + } + + void cancel() + { + min_timeout.disconnect(); + max_timeout.disconnect(); + } + +private: + bool onMinTimeout() + { + max_timeout.disconnect(); + if (function) { + delayed_helper::apply(function, params); + } + return false; + } + + bool onMaxTimeout() + { + min_timeout.disconnect(); + if (function) { + delayed_helper::apply(function, params); + } + return false; + } + + std::function function; + + unsigned int min_delay_ms; + unsigned int max_delay_ms; + + sigc::connection min_timeout; + sigc::connection max_timeout; + + std::tuple params; +}; + +template +class DelayedConnection final : + public rtengine::NonCopyable +{ +public: + explicit DelayedConnection(unsigned int _min_delay_ms, unsigned int _max_delay_ms = 0) : + min_delay_ms(_min_delay_ms), + max_delay_ms(_max_delay_ms) + { + } + + void connect(Glib::SignalProxy signal, const sigc::slot& slot, const sigc::slot& immediate_slot = {}) + { + this->slot = slot; + this->immediate_slot = immediate_slot; + this->signal = signal.connect(sigc::mem_fun(*this, &DelayedConnection::onSignal)); + } + + void block(bool value = true) + { + signal.block(value); + } + + void unblock() + { + signal.unblock(); + } + + void cancel() + { + min_timeout.disconnect(); + max_timeout.disconnect(); + } + + void setDelay(unsigned int min_delay_ms, unsigned int max_delay_ms = 0) + { + this->min_delay_ms = min_delay_ms; + this->max_delay_ms = max_delay_ms; + + min_timeout.disconnect(); + max_timeout.disconnect(); + } + +private: + void onSignal(Ts... ts) + { + if (immediate_slot) { + immediate_slot(ts...); + } + + if (!min_delay_ms) { + slot(ts...); + return; + } + + params = std::make_tuple(ts...); + + min_timeout.disconnect(); + min_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedConnection::onMinTimeout), min_delay_ms); + + if (max_delay_ms && !max_timeout.connected()) { + max_timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DelayedConnection::onMaxTimeout), max_delay_ms); + } + } + + bool onMinTimeout() + { + max_timeout.disconnect(); + delayed_helper::apply(slot, params); + return false; + } + + bool onMaxTimeout() + { + min_timeout.disconnect(); + delayed_helper::apply(slot, params); + return false; + } + + unsigned int min_delay_ms; + unsigned int max_delay_ms; + + sigc::connection signal; + sigc::connection min_timeout; + sigc::connection max_timeout; + + sigc::slot slot; + sigc::slot immediate_slot; + + std::tuple params; +}; diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index eed6c63d3..f4fc8449e 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -399,6 +399,25 @@ DiagonalCurveEditor* DiagonalCurveEditorSubGroup::addCurve(Glib::ustring curveLa return newCE; } + +void DiagonalCurveEditorSubGroup::updateLocallabBackground(CurveEditor* ce) +{ + if (ce == parent->displayedCurve) { + paramCurve->updateLocallabBackground(ce->locallabRef); + customCurve->updateLocallabBackground(ce->locallabRef); + NURBSCurve->updateLocallabBackground(ce->locallabRef); + } +} + +void DiagonalCurveEditorSubGroup::restoreLocallabBackground() +{ + if (parent->displayedCurve) { + paramCurve->updateLocallabBackground(parent->displayedCurve->locallabRef); + customCurve->updateLocallabBackground(parent->displayedCurve->locallabRef); + NURBSCurve->updateLocallabBackground(parent->displayedCurve->locallabRef); + } +} + /* * Switch off the edit button */ @@ -477,13 +496,13 @@ void DiagonalCurveEditorSubGroup::pipetteMouseOver(EditDataProvider *provider, i double pos[3]; shcSelector->getPositions(pos[0], pos[1], pos[2]); - if (pipetteVal >= pos[2]) { + if (static_cast(pipetteVal) >= pos[2]) { editedAdjuster = highlights; paramCurve->setActiveParam(4); - } else if(pipetteVal >= pos[1]) { + } else if(static_cast(pipetteVal) >= pos[1]) { editedAdjuster = lights; paramCurve->setActiveParam(5); - } else if(pipetteVal >= pos[0]) { + } else if(static_cast(pipetteVal) >= pos[0]) { editedAdjuster = darks; paramCurve->setActiveParam(6); } else { diff --git a/rtgui/diagonalcurveeditorsubgroup.h b/rtgui/diagonalcurveeditorsubgroup.h index a077da807..08e0828f5 100644 --- a/rtgui/diagonalcurveeditorsubgroup.h +++ b/rtgui/diagonalcurveeditorsubgroup.h @@ -27,7 +27,7 @@ class DiagonalCurveEditor; class MyDiagonalCurve; -class DiagonalCurveEditorSubGroup : +class DiagonalCurveEditorSubGroup final : public CurveEditorSubGroup, public SHCListener, public AdjusterListener, @@ -95,6 +95,7 @@ public: void pipetteDrag(EditDataProvider *provider, int modifierKey) override; void showCoordinateAdjuster(CoordinateProvider *provider) override; void stopNumericalAdjustment() override; + void updateLocallabBackground(CurveEditor* ce) override; bool curveReset (CurveEditor *ce) override; @@ -102,6 +103,7 @@ protected: void storeCurveValues (CurveEditor* ce, const std::vector& p) override; void storeDisplayedCurve () override; void restoreDisplayedHistogram () override; + void restoreLocallabBackground() override; void savePressed (); void loadPressed (); void copyPressed (); diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 669528ac1..2be1e3f3a 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -91,7 +91,7 @@ DirBrowser::DirBrowser () : dirTreeModel(), , volumes(0) #endif { - + set_orientation(Gtk::ORIENTATION_VERTICAL); dirtree = Gtk::manage ( new Gtk::TreeView() ); scrolledwindow4 = Gtk::manage ( new Gtk::ScrolledWindow() ); crt.property_ellipsize() = Pango::ELLIPSIZE_END; @@ -293,36 +293,32 @@ void DirBrowser::row_expanded (const Gtk::TreeModel::iterator& iter, const Gtk:: auto dir = Gio::File::create_for_path (iter->get_value (dtColumns.dirname)); auto subDirs = listSubDirs (dir, options.fbShowHidden); - if (subDirs.empty()) { - dirtree->collapse_row(path); - } else { - Gtk::TreeNodeChildren children = iter->children(); - std::list forErase(children.begin(), children.end()); + Gtk::TreeNodeChildren children = iter->children(); + std::list forErase(children.begin(), children.end()); - std::sort (subDirs.begin (), subDirs.end (), [] (const Glib::ustring& firstDir, const Glib::ustring& secondDir) - { - switch (options.dirBrowserSortType) { - default: - case Gtk::SORT_ASCENDING: - return firstDir < secondDir; - case Gtk::SORT_DESCENDING: - return firstDir > secondDir; - } - }); - - for (auto it = subDirs.begin(), end = subDirs.end(); it != end; ++it) { - addDir(iter, *it); + std::sort (subDirs.begin (), subDirs.end (), [] (const Glib::ustring& firstDir, const Glib::ustring& secondDir) + { + switch (options.dirBrowserSortType) { + default: + case Gtk::SORT_ASCENDING: + return firstDir < secondDir; + case Gtk::SORT_DESCENDING: + return firstDir > secondDir; } + }); - for (auto it = forErase.begin(), end = forErase.end(); it != end; ++it) { - dirTreeModel->erase(*it); - } - - dirTreeModel->set_sort_column(prevSortColumn, prevSortType); - - expandSuccess = true; + for (auto it = subDirs.begin(), end = subDirs.end(); it != end; ++it) { + addDir(iter, *it); } + for (auto it = forErase.begin(), end = forErase.end(); it != end; ++it) { + dirTreeModel->erase(*it); + } + + dirTreeModel->set_sort_column(prevSortColumn, prevSortType); + + expandSuccess = true; + 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())); @@ -383,8 +379,10 @@ void DirBrowser::row_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewC Glib::ustring dname = dirTreeModel->get_iter (path)->get_value (dtColumns.dirname); - if (Glib::file_test (dname, Glib::FILE_TEST_IS_DIR)) + if (Glib::file_test (dname, Glib::FILE_TEST_IS_DIR)) { dirSelectionSignal (dname, Glib::ustring()); + dirtree->expand_row(path, false); + } } Gtk::TreePath DirBrowser::expandToDir (const Glib::ustring& absDirPath) diff --git a/rtgui/dirbrowser.h b/rtgui/dirbrowser.h index 6ead83919..0254d6eb5 100644 --- a/rtgui/dirbrowser.h +++ b/rtgui/dirbrowser.h @@ -23,7 +23,7 @@ #include "guiutils.h" -class DirBrowser : public Gtk::VBox +class DirBrowser : public Gtk::Box { public: typedef sigc::signal DirSelectionSignal; diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index 7129542d1..f2b780eba 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -33,7 +33,9 @@ using namespace rtengine; using namespace rtengine::procparams; -DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP_DIRPYRDENOISE_LABEL"), true, true), lastmedian(false) +const Glib::ustring DirPyrDenoise::TOOL_NAME = "dirpyrdenoise"; + +DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, TOOL_NAME, M("TP_DIRPYRDENOISE_LABEL"), true, true), lastmedian(false) { std::vector milestones; CurveListener::setMulti(true); @@ -48,10 +50,10 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP Gtk::Frame* lumaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_LUMINANCE_FRAME")) ); lumaFrame->set_label_align(0.025, 0.5); - Gtk::VBox * lumaVBox = Gtk::manage ( new Gtk::VBox()); + Gtk::Box* lumaVBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); lumaVBox->set_spacing(2); - ctboxL = Gtk::manage (new Gtk::HBox ()); + ctboxL = Gtk::manage (new Gtk::Box ()); Gtk::Label* labmL = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_LUMINANCE_CONTROL") + ":")); ctboxL->pack_start (*labmL, Gtk::PACK_SHRINK, 1); @@ -83,10 +85,10 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP Gtk::Frame* chromaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_CHROMINANCE_FRAME")) ); chromaFrame->set_label_align(0.025, 0.5); - Gtk::VBox *chromaVBox = Gtk::manage ( new Gtk::VBox()); + Gtk::Box* chromaVBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); chromaVBox->set_spacing(2); - ctboxC = Gtk::manage (new Gtk::HBox ()); + ctboxC = Gtk::manage (new Gtk::Box ()); Gtk::Label* labmC = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD") + ":")); ctboxC->pack_start (*labmC, Gtk::PACK_SHRINK, 1); @@ -99,7 +101,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP Cmethodconn = Cmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::CmethodChanged) ); Cmethod->set_tooltip_markup (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP")); - ctboxC2 = Gtk::manage (new Gtk::HBox ()); + ctboxC2 = Gtk::manage (new Gtk::Box ()); Gtk::Label* labmC2 = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD") + ":")); ctboxC2->pack_start (*labmC2, Gtk::PACK_SHRINK, 1); ctboxC2->set_tooltip_markup (M("TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP")); @@ -121,7 +123,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP redchro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN"), -100, 100, 0.1, 0)); bluechro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW"), -100, 100, 0.1, 0)); - Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb1 = Gtk::manage (new Gtk::Box ()); hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_COLORSPACE") + ": ")), Gtk::PACK_SHRINK, 1); hb1->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP")); @@ -165,9 +167,8 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP // ---- Median FIltering ---- Gtk::Frame* medianFrame = Gtk::manage (new Gtk::Frame ()); - medianFrame->set_label_align(0.025, 0.5); - Gtk::VBox *medianVBox = Gtk::manage ( new Gtk::VBox()); + Gtk::Box* medianVBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); medianVBox->set_spacing(2); median = Gtk::manage (new Gtk::CheckButton (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL") + ":")); @@ -204,19 +205,19 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP medmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP")); medmethodconn = medmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::medmethodChanged) ); - ctboxm = Gtk::manage (new Gtk::HBox ()); + ctboxm = Gtk::manage (new Gtk::Box ()); Gtk::Label* labmm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_METHOD") + ":")); ctboxm->pack_start (*labmm, Gtk::PACK_SHRINK, 1); - ctbox = Gtk::manage (new Gtk::HBox ()); + ctbox = Gtk::manage (new Gtk::Box ()); Gtk::Label* labm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_TYPE") + ":")); ctbox->pack_start (*labm, Gtk::PACK_SHRINK, 1); - ctboxrgb = Gtk::manage (new Gtk::HBox ()); + ctboxrgb = Gtk::manage (new Gtk::Box ()); Gtk::Label* labrgb = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_TYPE") + ":")); ctboxrgb->pack_start (*labrgb, Gtk::PACK_SHRINK, 1); - Gtk::HBox* hb11 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb11 = Gtk::manage (new Gtk::Box ()); hb11->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_MODE") + ": ")), Gtk::PACK_SHRINK, 1); hb11->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP")); diff --git a/rtgui/dirpyrdenoise.h b/rtgui/dirpyrdenoise.h index c754e705c..dadd96988 100644 --- a/rtgui/dirpyrdenoise.h +++ b/rtgui/dirpyrdenoise.h @@ -40,6 +40,8 @@ class DirPyrDenoise final : public ColorProvider { public: + static const Glib::ustring TOOL_NAME; + DirPyrDenoise (); ~DirPyrDenoise () override; @@ -115,21 +117,21 @@ private: sigc::connection smethodconn; MyComboBoxText* medmethod; sigc::connection medmethodconn; - Gtk::HBox* ctbox; + Gtk::Box* ctbox; MyComboBoxText* methodmed; sigc::connection methodmedconn; - Gtk::HBox* ctboxm; + Gtk::Box* ctboxm; MyComboBoxText* rgbmethod; sigc::connection rgbmethodconn; - Gtk::HBox* ctboxrgb; + Gtk::Box* ctboxrgb; double nextchroma; double nextred; double nextblue; double nextnresid; double nexthighresid; - Gtk::HBox* ctboxL; - Gtk::HBox* ctboxC; - Gtk::HBox* ctboxC2; + Gtk::Box* ctboxL; + Gtk::Box* ctboxC; + Gtk::Box* ctboxC2; int nexttileX; int nexttileY; int nextprevX; diff --git a/rtgui/dirpyrequalizer.cc b/rtgui/dirpyrequalizer.cc index fd0268efa..46966ea45 100644 --- a/rtgui/dirpyrequalizer.cc +++ b/rtgui/dirpyrequalizer.cc @@ -24,7 +24,9 @@ using namespace rtengine; using namespace rtengine::procparams; -DirPyrEqualizer::DirPyrEqualizer () : FoldableToolPanel(this, "dirpyrequalizer", M("TP_DIRPYREQUALIZER_LABEL"), true, true) +const Glib::ustring DirPyrEqualizer::TOOL_NAME = "dirpyrequalizer"; + +DirPyrEqualizer::DirPyrEqualizer () : FoldableToolPanel(this, TOOL_NAME, M("TP_DIRPYREQUALIZER_LABEL"), true, true) { std::vector milestones; @@ -53,11 +55,11 @@ DirPyrEqualizer::DirPyrEqualizer () : FoldableToolPanel(this, "dirpyrequalizer", Color::hsv2rgb01(0.3240, 0.5, 0.5, r, g, b); milestones.push_back( GradientMilestone(1. , r, g, b) ); // hsv: 0.324 rad: 2.5 - Gtk::VBox * cbVBox = Gtk::manage ( new Gtk::VBox()); + Gtk::Box* cbVBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); cbVBox->set_border_width(4); cbVBox->set_spacing(2); - cdbox = Gtk::manage (new Gtk::HBox ()); + cdbox = Gtk::manage (new Gtk::Box ()); labmcd = Gtk::manage (new Gtk::Label (M("TP_CBDL_METHOD") + ":")); cdbox->pack_start (*labmcd, Gtk::PACK_SHRINK, 1); @@ -71,7 +73,9 @@ DirPyrEqualizer::DirPyrEqualizer () : FoldableToolPanel(this, "dirpyrequalizer", cbVBox->pack_start(*cdbox); pack_start(*cbVBox); - Gtk::HBox * buttonBox1 = Gtk::manage (new Gtk::HBox(true, 10)); + Gtk::Box * buttonBox1 = Gtk::manage (new Gtk::Box()); + buttonBox1->set_spacing(10); + buttonBox1->set_homogeneous(true); pack_start(*buttonBox1); Gtk::Button * lumacontrastMinusButton = Gtk::manage (new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS"))); @@ -88,7 +92,7 @@ DirPyrEqualizer::DirPyrEqualizer () : FoldableToolPanel(this, "dirpyrequalizer", buttonBox1->show_all_children(); - Gtk::HSeparator *separator2 = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator *separator2 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); pack_start(*separator2, Gtk::PACK_SHRINK, 2); for(int i = 0; i < 6; i++) { @@ -106,17 +110,17 @@ DirPyrEqualizer::DirPyrEqualizer () : FoldableToolPanel(this, "dirpyrequalizer", pack_start(*multiplier[i]); } - Gtk::HSeparator *separator3 = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator *separator3 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); pack_start(*separator3, Gtk::PACK_SHRINK, 2); threshold = Gtk::manage ( new Adjuster (M("TP_DIRPYREQUALIZER_THRESHOLD"), 0, 1, 0.01, 0.2) ); threshold->setAdjusterListener(this); pack_start(*threshold); - Gtk::HSeparator *separator4 = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator *separator4 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); pack_start(*separator4, Gtk::PACK_SHRINK, 2); /* - algoHBox = Gtk::manage (new Gtk::HBox ()); + algoHBox = Gtk::manage (new Gtk::Box ()); algoHBox->set_spacing (2); algoHBox->set_tooltip_markup (M("TP_DIRPYREQUALIZER_ALGO_TOOLTIP")); */ @@ -428,7 +432,7 @@ void DirPyrEqualizer::lumacontrastPlusPressed () { for (int i = 0; i < 6; i++) { - float inc = 0.05 * (6 - i); + double inc = 0.05 * (6 - i); multiplier[i]->setValue(multiplier[i]->getValue() + inc); adjusterChanged(multiplier[i], multiplier[i]->getValue()); } @@ -439,7 +443,7 @@ void DirPyrEqualizer::lumacontrastMinusPressed () { for (int i = 0; i < 6; i++) { - float inc = -0.05 * (6 - i); + double inc = -0.05 * (6 - i); multiplier[i]->setValue(multiplier[i]->getValue() + inc); adjusterChanged(multiplier[i], multiplier[i]->getValue()); } diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h index 84924099e..39b201b9b 100644 --- a/rtgui/dirpyrequalizer.h +++ b/rtgui/dirpyrequalizer.h @@ -42,7 +42,7 @@ protected: // MyComboBoxText* algo; // sigc::connection algoconn; // Gtk::Label* alLabel; - // Gtk::HBox* algoHBox; + // Gtk::Box* algoHBox; sigc::connection gamutlabConn; sigc::connection lumaneutralPressedConn; @@ -50,12 +50,13 @@ protected: sigc::connection lumacontrastMinusPressedConn; sigc::connection cbdlMethodConn; Gtk::Label* labmcd; - Gtk::HBox* cdbox; + Gtk::Box* cdbox; MyComboBoxText* cbdlMethod; bool lastgamutlab; public: + static const Glib::ustring TOOL_NAME; DirPyrEqualizer (); ~DirPyrEqualizer () override; diff --git a/rtgui/distortion.cc b/rtgui/distortion.cc index 165ccee06..a5138eb99 100644 --- a/rtgui/distortion.cc +++ b/rtgui/distortion.cc @@ -27,7 +27,9 @@ using namespace rtengine; using namespace rtengine::procparams; -Distortion::Distortion (): FoldableToolPanel(this, "distortion", M("TP_DISTORTION_LABEL")) +const Glib::ustring Distortion::TOOL_NAME = "distortion"; + +Distortion::Distortion (): FoldableToolPanel(this, TOOL_NAME, M("TP_DISTORTION_LABEL")) { rlistener = nullptr; @@ -35,7 +37,7 @@ Distortion::Distortion (): FoldableToolPanel(this, "distortion", M("TP_DISTORTIO 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")); + autoDistor->set_tooltip_text (M("TP_DISTORTION_AUTO_TOOLTIP")); idConn = autoDistor->signal_pressed().connect( sigc::mem_fun(*this, &Distortion::idPressed) ); autoDistor->show(); pack_start (*autoDistor); diff --git a/rtgui/distortion.h b/rtgui/distortion.h index 7ef33d73a..98044bacf 100644 --- a/rtgui/distortion.h +++ b/rtgui/distortion.h @@ -37,6 +37,7 @@ protected: LensGeomListener * rlistener; public: + static const Glib::ustring TOOL_NAME; Distortion (); diff --git a/rtgui/dynamicprofilepanel.cc b/rtgui/dynamicprofilepanel.cc index d7ed8ee97..feb6aea70 100644 --- a/rtgui/dynamicprofilepanel.cc +++ b/rtgui/dynamicprofilepanel.cc @@ -35,13 +35,14 @@ DynamicProfilePanel::EditDialog::EditDialog (const Glib::ustring &title, Gtk::Wi Gtk::Dialog (title, parent) { profilepath_ = Gtk::manage (new ProfileStoreComboBox()); - Gtk::HBox *hb = Gtk::manage (new Gtk::HBox()); + Gtk::Box *hb = Gtk::manage (new Gtk::Box()); hb->pack_start (*Gtk::manage (new Gtk::Label (M ("DYNPROFILEEDITOR_PROFILE"))), false, false, 4); hb->pack_start (*profilepath_, true, true, 2); get_content_area()->pack_start (*hb, Gtk::PACK_SHRINK, 4); add_optional (M ("EXIFFILTER_CAMERA"), has_camera_, camera_); add_optional (M ("EXIFFILTER_LENS"), has_lens_, lens_); + add_optional (M ("EXIFFILTER_PATH"), has_path_, path_); imagetype_ = Gtk::manage (new MyComboBoxText()); imagetype_->append(Glib::ustring("(") + M("DYNPROFILEEDITOR_IMGTYPE_ANY") + ")"); @@ -49,7 +50,7 @@ DynamicProfilePanel::EditDialog::EditDialog (const Glib::ustring &title, Gtk::Wi imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_HDR")); imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_PS")); imagetype_->set_active(0); - hb = Gtk::manage (new Gtk::HBox()); + hb = Gtk::manage (new Gtk::Box()); 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); @@ -93,6 +94,9 @@ void DynamicProfilePanel::EditDialog::set_rule ( has_lens_->set_active (rule.lens.enabled); lens_->set_text (rule.lens.value); + has_path_->set_active (rule.path.enabled); + path_->set_text (rule.path.value); + if (!rule.imagetype.enabled) { imagetype_->set_active(0); } else if (rule.imagetype.value == "STD") { @@ -136,6 +140,9 @@ DynamicProfileRule DynamicProfilePanel::EditDialog::get_rule() ret.lens.enabled = has_lens_->get_active(); ret.lens.value = lens_->get_text(); + ret.path.enabled = has_path_->get_active(); + ret.path.value = path_->get_text(); + ret.imagetype.enabled = imagetype_->get_active_row_number() > 0; switch (imagetype_->get_active_row_number()) { case 1: @@ -195,7 +202,7 @@ void DynamicProfilePanel::EditDialog::set_ranges() void DynamicProfilePanel::EditDialog::add_range (const Glib::ustring &name, Gtk::SpinButton *&from, Gtk::SpinButton *&to) { - Gtk::HBox *hb = Gtk::manage (new Gtk::HBox()); + Gtk::Box *hb = Gtk::manage (new Gtk::Box()); hb->pack_start (*Gtk::manage (new Gtk::Label (name)), false, false, 4); from = Gtk::manage (new Gtk::SpinButton()); to = Gtk::manage (new Gtk::SpinButton()); @@ -210,7 +217,7 @@ void DynamicProfilePanel::EditDialog::add_range (const Glib::ustring &name, void DynamicProfilePanel::EditDialog::add_optional (const Glib::ustring &name, Gtk::CheckButton *&check, Gtk::Entry *&field) { check = Gtk::manage (new Gtk::CheckButton (name)); - Gtk::HBox *hb = Gtk::manage (new Gtk::HBox()); + Gtk::Box *hb = Gtk::manage (new Gtk::Box()); hb->pack_start (*check, Gtk::PACK_SHRINK, 4); field = Gtk::manage (new Gtk::Entry()); hb->pack_start (*field, true, true, 2); @@ -231,10 +238,13 @@ DynamicProfilePanel::DynamicProfilePanel(): button_edit_ (M ("DYNPROFILEEDITOR_EDIT")), button_delete_ (M ("DYNPROFILEEDITOR_DELETE")) { + set_orientation(Gtk::ORIENTATION_VERTICAL); + add (vbox_); treeview_.set_grid_lines (Gtk::TREE_VIEW_GRID_LINES_VERTICAL); scrolledwindow_.add (treeview_); + scrolledwindow_.set_vexpand(); scrolledwindow_.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); @@ -293,6 +303,16 @@ DynamicProfilePanel::DynamicProfilePanel(): *this, &DynamicProfilePanel::render_lens)); } + cell = Gtk::manage (new Gtk::CellRendererText()); + cols_count = treeview_.append_column (M ("EXIFFILTER_PATH"), *cell); + col = treeview_.get_column (cols_count - 1); + + if (col) { + col->set_cell_data_func ( + *cell, sigc::mem_fun ( + *this, &DynamicProfilePanel::render_path)); + } + cell = Gtk::manage (new Gtk::CellRendererText()); cols_count = treeview_.append_column (M ("EXIFFILTER_IMAGETYPE"), *cell); col = treeview_.get_column (cols_count - 1); @@ -372,6 +392,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_.path] = rule.path; row[columns_.imagetype] = rule.imagetype; row[columns_.profilepath] = rule.profilepath; } @@ -395,6 +416,7 @@ DynamicProfileRule DynamicProfilePanel::to_rule (Gtk::TreeModel::Row row, ret.expcomp = row[columns_.expcomp]; ret.camera = row[columns_.camera]; ret.lens = row[columns_.lens]; + ret.path = row[columns_.path]; ret.profilepath = row[columns_.profilepath]; ret.imagetype = row[columns_.imagetype]; return ret; @@ -507,6 +529,12 @@ void DynamicProfilePanel::render_lens ( RENDER_OPTIONAL_ (lens); } +void DynamicProfilePanel::render_path ( + Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter) +{ + RENDER_OPTIONAL_ (path); +} + void DynamicProfilePanel::render_imagetype ( Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter) { diff --git a/rtgui/dynamicprofilepanel.h b/rtgui/dynamicprofilepanel.h index 5796c9c85..03b9e7c62 100644 --- a/rtgui/dynamicprofilepanel.h +++ b/rtgui/dynamicprofilepanel.h @@ -25,7 +25,7 @@ #include "../rtengine/dynamicprofile.h" class DynamicProfilePanel : - public Gtk::VBox + public Gtk::Box { public: DynamicProfilePanel(); @@ -55,6 +55,7 @@ private: add (expcomp); add (camera); add (lens); + add (path); add (profilepath); add (imagetype); } @@ -66,6 +67,7 @@ private: Gtk::TreeModelColumn> expcomp; Gtk::TreeModelColumn camera; Gtk::TreeModelColumn lens; + Gtk::TreeModelColumn path; Gtk::TreeModelColumn imagetype; Gtk::TreeModelColumn profilepath; }; @@ -78,6 +80,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_path (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); @@ -114,6 +117,9 @@ private: Gtk::CheckButton *has_lens_; Gtk::Entry *lens_; + Gtk::CheckButton *has_path_; + Gtk::Entry *path_; + MyComboBoxText *imagetype_; ProfileStoreComboBox *profilepath_; diff --git a/rtgui/editcallbacks.cc b/rtgui/editcallbacks.cc index 1538ef7ba..71c342874 100644 --- a/rtgui/editcallbacks.cc +++ b/rtgui/editcallbacks.cc @@ -99,10 +99,11 @@ bool EditSubscriber::isPicking() const EditDataProvider::EditDataProvider() : currSubscriber(nullptr), - object(0), +// object(0), pipetteVal1(0.f), pipetteVal2(0.f), pipetteVal3(0.f), + object(0), posScreen(-1, -1), posImage(-1, -1), deltaScreen(0, 0), @@ -172,10 +173,10 @@ void EditDataProvider::setPipetteVal3(float newVal) pipetteVal3 = newVal; } -CursorShape EditDataProvider::getCursor(int objectID) const +CursorShape EditDataProvider::getCursor(int objectID, int xPos, int yPos) const { if (currSubscriber) { - currSubscriber->getCursor(objectID); + currSubscriber->getCursor(objectID, xPos, yPos); } return CSHandOpen; @@ -186,12 +187,12 @@ EditSubscriber* EditDataProvider::getCurrSubscriber() const return currSubscriber; } -EditDataProvider* EditSubscriber::getEditProvider() +EditDataProvider* EditSubscriber::getEditProvider() const { return provider; } -CursorShape EditSubscriber::getCursor(int objectID) const +CursorShape EditSubscriber::getCursor(int objectID, int xPos, int yPos) const { return CSHandOpen; } diff --git a/rtgui/editcallbacks.h b/rtgui/editcallbacks.h index c2efcf53e..61d392de5 100644 --- a/rtgui/editcallbacks.h +++ b/rtgui/editcallbacks.h @@ -18,6 +18,8 @@ */ #pragma once +#include + #include "editid.h" #include "cursormanager.h" #include "../rtengine/coord.h" @@ -57,7 +59,7 @@ public: virtual ~EditSubscriber () = default; void setEditProvider(EditDataProvider *provider); - EditDataProvider* getEditProvider (); + EditDataProvider* getEditProvider () const; void setEditID(EditUniqueID ID, BufferType buffType); bool isCurrentSubscriber() const; virtual void subscribe(); @@ -70,8 +72,10 @@ public: bool isPicking() const; /// Returns true if something is being picked /** @brief Get the cursor to be displayed when above handles - @param objectID object currently "hovered" */ - virtual CursorShape getCursor (int objectID) const; + @param objectID object currently "hovered" + @param xPos X cursor position in image space + @param yPos Y cursor position in image space */ + virtual CursorShape getCursor (int objectID, int xPos, int yPos) const; /** @brief Triggered when the mouse is moving over an object This method is also triggered when the cursor is moving over the image in ET_PIPETTE mode @@ -160,12 +164,13 @@ class EditDataProvider private: EditSubscriber *currSubscriber; - int object; /// ET_OBJECTS mode: Object detected under the cursor, 0 otherwise; ET_PIPETTE mode: 1 if above the image, 0 otherwise +// int object; /// ET_OBJECTS mode: Object detected under the cursor, 0 otherwise; ET_PIPETTE mode: 1 if above the image, 0 otherwise float pipetteVal1; /// Current pipette values float pipetteVal2; /// Current pipette values; if bufferType==BT_SINGLEPLANE_FLOAT, will be set to 0 float pipetteVal3; /// Current pipette values; if bufferType==BT_SINGLEPLANE_FLOAT, will be set to 0 public: + int object; /// ET_OBJECTS mode: Object detected under the cursor, 0 otherwise; ET_PIPETTE mode: 1 if above the image, 0 otherwise rtengine::Coord posScreen; /// Location of the mouse button press, in preview image space rtengine::Coord posImage; /// Location of the mouse button press, in the full image space @@ -188,8 +193,10 @@ public: void setPipetteVal1(float newVal); void setPipetteVal2(float newVal); void setPipetteVal3(float newVal); - virtual CursorShape getCursor(int objectID) const; + virtual CursorShape getCursor(int objectID, int xPos, int yPos) const; int getPipetteRectSize () const; EditSubscriber* getCurrSubscriber() const; virtual void getImageSize (int &w, int&h) = 0; + virtual void getPreviewCenterPos(int &x, int &y) = 0; + virtual void getPreviewSize(int &w, int &h) = 0; }; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 806af8b2e..420717b7e 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -21,6 +21,7 @@ #include +#include "../rtengine/array2D.h" #include "../rtengine/imagesource.h" #include "../rtengine/iccstore.h" #include "batchqueue.h" @@ -38,15 +39,20 @@ #include "procparamchangers.h" #include "placesbrowser.h" #include "pathutils.h" +#include "rtappchooserdialog.h" #include "thumbnail.h" #include "toolpanelcoord.h" #ifdef WIN32 #include "windows.h" + +#include "../rtengine/winutils.h" #endif using namespace rtengine::procparams; +using ScopeType = Options::ScopeType; + namespace { @@ -61,7 +67,7 @@ void setprogressStrUI(double val, const Glib::ustring str, MyProgressBar* pProgr } } - +#if !defined(__APPLE__) // monitor profile not supported on apple bool find_default_monitor_profile (GdkWindow *rootwin, Glib::ustring &defprof, Glib::ustring &defprofname) { #ifdef WIN32 @@ -91,7 +97,7 @@ bool find_default_monitor_profile (GdkWindow *rootwin, Glib::ustring &defprof, G ReleaseDC (NULL, hDC); } -#elif !defined(__APPLE__) +#else // taken from geeqie (image.c) and adapted // Originally licensed as GPL v2+, with the following copyright: // * Copyright (C) 2006 John Ellis @@ -129,8 +135,237 @@ bool find_default_monitor_profile (GdkWindow *rootwin, Glib::ustring &defprof, G #endif return false; } +#endif +bool hasUserOnlyPermission(const Glib::ustring &dirname) +{ +#if defined(__linux__) || defined(__APPLE__) + const Glib::RefPtr file = Gio::File::create_for_path(dirname); + const Glib::RefPtr file_info = file->query_info("owner::user,unix::mode"); + if (!file_info) { + return false; + } + + const Glib::ustring owner = file_info->get_attribute_string("owner::user"); + const guint32 mode = file_info->get_attribute_uint32("unix::mode"); + + return (mode & 0777) == 0700 && owner == Glib::get_user_name(); +#elif defined(WIN32) + const Glib::RefPtr file = Gio::File::create_for_path(dirname); + const Glib::RefPtr file_info = file->query_info("owner::user"); + if (!file_info) { + return false; + } + + // Current user must be the owner. + const Glib::ustring user_name = Glib::get_user_name(); + const Glib::ustring owner = file_info->get_attribute_string("owner::user"); + if (user_name != owner) { + return false; + } + + // Get security descriptor and discretionary access control list. + PACL dacl = nullptr; + PSECURITY_DESCRIPTOR sec_desc_raw_ptr = nullptr; + auto win_error = GetNamedSecurityInfo( + dirname.c_str(), + SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION, + nullptr, + nullptr, + &dacl, + nullptr, + &sec_desc_raw_ptr + ); + const WinLocalPtr sec_desc_ptr(sec_desc_raw_ptr); + if (win_error != ERROR_SUCCESS) { + return false; + } + + // Must not inherit permissions. + SECURITY_DESCRIPTOR_CONTROL sec_desc_control; + DWORD revision; + if (!( + GetSecurityDescriptorControl(sec_desc_ptr, &sec_desc_control, &revision) + && sec_desc_control & SE_DACL_PROTECTED + )) { + return false; + } + + // Check that there is one entry allowing full access. + ULONG acl_entry_count; + PEXPLICIT_ACCESS acl_entry_list_raw = nullptr; + win_error = GetExplicitEntriesFromAcl(dacl, &acl_entry_count, &acl_entry_list_raw); + const WinLocalPtr acl_entry_list(acl_entry_list_raw); + if (win_error != ERROR_SUCCESS || acl_entry_count != 1) { + return false; + } + const EXPLICIT_ACCESS &ace = acl_entry_list[0]; + if ( + ace.grfAccessMode != GRANT_ACCESS + || (ace.grfAccessPermissions & FILE_ALL_ACCESS) != FILE_ALL_ACCESS + || ace.Trustee.TrusteeForm != TRUSTEE_IS_SID // Should already be SID, but double check. + ) { + return false; + } + + // ACE must be for the current user. + HANDLE process_token_raw; + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &process_token_raw)) { + return false; + } + const WinHandle process_token(process_token_raw); + DWORD actual_token_info_size = 0; + GetTokenInformation(process_token, TokenUser, nullptr, 0, &actual_token_info_size); + if (!actual_token_info_size) { + return false; + } + const WinHeapPtr user_token_ptr(actual_token_info_size); + if (!user_token_ptr || !GetTokenInformation( + process_token, + TokenUser, + user_token_ptr, + actual_token_info_size, + &actual_token_info_size + )) { + return false; + } + return EqualSid(ace.Trustee.ptstrName, user_token_ptr->User.Sid); +#endif + return false; +} + +/** + * Sets read and write permissions, and optionally the execute permission, for + * the user and no permissions for others. + */ +void setUserOnlyPermission(const Glib::RefPtr file, bool execute) +{ +#if defined(__linux__) || defined(__APPLE__) + const Glib::RefPtr file_info = file->query_info("unix::mode"); + if (!file_info) { + return; + } + + guint32 mode = file_info->get_attribute_uint32("unix::mode"); + mode = (mode & ~0777) | (execute ? 0700 : 0600); + try { + file->set_attribute_uint32("unix::mode", mode, Gio::FILE_QUERY_INFO_NONE); + } catch (Gio::Error &) { + } +#elif defined(WIN32) + // Get the current user's SID. + HANDLE process_token_raw; + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &process_token_raw)) { + return; + } + const WinHandle process_token(process_token_raw); + DWORD actual_token_info_size = 0; + GetTokenInformation(process_token, TokenUser, nullptr, 0, &actual_token_info_size); + if (!actual_token_info_size) { + return; + } + const WinHeapPtr user_token_ptr(actual_token_info_size); + if (!user_token_ptr || !GetTokenInformation( + process_token, + TokenUser, + user_token_ptr, + actual_token_info_size, + &actual_token_info_size + )) { + return; + } + const PSID user_sid = user_token_ptr->User.Sid; + + // Get a handle to the file. + const Glib::ustring filename = file->get_path(); + const HANDLE file_handle_raw = CreateFile( + filename.c_str(), + READ_CONTROL | WRITE_DAC, + 0, + nullptr, + OPEN_EXISTING, + execute ? FILE_FLAG_BACKUP_SEMANTICS : FILE_ATTRIBUTE_NORMAL, + nullptr + ); + if (file_handle_raw == INVALID_HANDLE_VALUE) { + return; + } + const WinHandle file_handle(file_handle_raw); + + // Create the user-only permission and set it. + EXPLICIT_ACCESS ea = { + .grfAccessPermissions = FILE_ALL_ACCESS, + .grfAccessMode = GRANT_ACCESS, + .grfInheritance = NO_INHERITANCE, + }; + BuildTrusteeWithSid(&(ea.Trustee), user_sid); + PACL new_dacl_raw = nullptr; + auto win_error = SetEntriesInAcl(1, &ea, nullptr, &new_dacl_raw); + if (win_error != ERROR_SUCCESS) { + return; + } + const WinLocalPtr new_dacl(new_dacl_raw); + SetSecurityInfo( + file_handle, + SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, + nullptr, + nullptr, + new_dacl, + nullptr + ); +#endif +} + +/** + * Gets the path to the temp directory, creating it if necessary. + */ +Glib::ustring getTmpDirectory() +{ +#if defined(__linux__) || defined(__APPLE__) || defined(WIN32) + static Glib::ustring recent_dir = ""; + const Glib::ustring tmp_dir_root = Glib::get_tmp_dir(); + const Glib::ustring subdir_base = + Glib::ustring::compose("rawtherapee-%1", Glib::get_user_name()); + Glib::ustring dir = Glib::build_filename(tmp_dir_root, subdir_base); + + // Returns true if the directory doesn't exist or has the right permissions. + auto is_usable_dir = [](const Glib::ustring &dir_path) { + return !Glib::file_test(dir_path, Glib::FILE_TEST_EXISTS) || (Glib::file_test(dir_path, Glib::FILE_TEST_IS_DIR) && hasUserOnlyPermission(dir_path)); + }; + + if (!(is_usable_dir(dir) || recent_dir.empty())) { + // Try to reuse the random suffix directory. + dir = recent_dir; + } + + if (!is_usable_dir(dir)) { + // Create new directory with random suffix. + gchar *const rand_dir = g_dir_make_tmp((subdir_base + "-XXXXXX").c_str(), nullptr); + if (!rand_dir) { + return tmp_dir_root; + } + dir = recent_dir = rand_dir; + g_free(rand_dir); + Glib::RefPtr file = Gio::File::create_for_path(dir); + setUserOnlyPermission(file, true); + } else if (!Glib::file_test(dir, Glib::FILE_TEST_EXISTS)) { + // Create the directory. + Glib::RefPtr file = Gio::File::create_for_path(dir); + bool dir_created = file->make_directory(); + if (!dir_created) { + return tmp_dir_root; + } + setUserOnlyPermission(file, true); + } + + return dir; +#else + return Glib::get_tmp_dir(); +#endif +} } class EditorPanel::ColorManagementToolbar @@ -172,7 +407,7 @@ private: const std::vector profiles = rtengine::ICCStore::getInstance()->getProfiles (rtengine::ICCStore::ProfileType::MONITOR); - for (const auto profile : profiles) { + for (const auto& profile : profiles) { profileBox.append (profile); } @@ -467,12 +702,16 @@ public: EditorPanel::EditorPanel (FilePanel* filePanel) : catalogPane (nullptr), realized (false), tbBeforeLock (nullptr), iHistoryShow (nullptr), iHistoryHide (nullptr), iTopPanel_1_Show (nullptr), iTopPanel_1_Hide (nullptr), iRightPanel_1_Show (nullptr), iRightPanel_1_Hide (nullptr), - iBeforeLockON (nullptr), iBeforeLockOFF (nullptr), previewHandler (nullptr), beforePreviewHandler (nullptr), + iBeforeLockON (nullptr), iBeforeLockOFF (nullptr), + externalEditorChangedSignal (nullptr), + previewHandler (nullptr), beforePreviewHandler (nullptr), beforeIarea (nullptr), beforeBox (nullptr), afterBox (nullptr), beforeLabel (nullptr), afterLabel (nullptr), beforeHeaderBox (nullptr), afterHeaderBox (nullptr), parent (nullptr), parentWindow (nullptr), openThm (nullptr), - selectedFrame(0), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false) + selectedFrame(0), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false), + histogram_observable(nullptr), histogram_scope_type(ScopeType::NONE) { + set_orientation(Gtk::ORIENTATION_VERTICAL); epih = new EditorPanelIdleHelper; epih->epanel = this; epih->destroyed = false; @@ -489,30 +728,32 @@ EditorPanel::EditorPanel (FilePanel* filePanel) // build left side panel 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); + // make a subpaned to allow resizing of the histogram (if it's on the left) + leftsubpaned = new Gtk::Paned(Gtk::ORIENTATION_VERTICAL); + leftsubpaned->set_size_request(230, 250); histogramPanel = nullptr; - profilep = Gtk::manage (new ProfilePanel ()); + profilep = Gtk::manage(new ProfilePanel()); ppframe = Gtk::manage(new Gtk::Frame()); + ppframe->set_label_align(0.025, 0.5); ppframe->set_name ("ProfilePanel"); ppframe->add (*profilep); - ppframe->set_label (M ("PROFILEPANEL_LABEL")); - //leftsubbox->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); + ppframe->set_label(M("PROFILEPANEL_LABEL")); + //leftsubpaned->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); - navigator = Gtk::manage (new Navigator ()); - navigator->previewWindow->set_size_request (-1, 150 * RTScalable::getScale()); - leftsubbox->pack_start (*navigator, Gtk::PACK_SHRINK, 2); + navigator = Gtk::manage(new Navigator()); + navigator->previewWindow->set_size_request(-1, 150 * RTScalable::getScale()); + leftsubpaned->pack1(*navigator, false, false); - history = Gtk::manage (new History ()); - leftsubbox->pack_start (*history); + history = Gtk::manage(new History()); + leftsubpaned->pack2(*history, true, false); - leftsubbox->show_all (); + leftsubpaned->set_position(0); + leftsubpaned->show_all(); - leftbox->pack2 (*leftsubbox, true, true); - leftbox->show_all (); + leftbox->pack2(*leftsubpaned, true, true); + leftbox->show_all(); // build the middle of the screen Gtk::Box* editbox = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_VERTICAL)); @@ -532,10 +773,10 @@ EditorPanel::EditorPanel (FilePanel* filePanel) 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 ()); - Gtk::VSeparator* vsepi = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vseph = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator* vsept = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* vsepz = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* vsepi = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* vseph = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); hidehp = Gtk::manage (new Gtk::ToggleButton ()); @@ -564,13 +805,13 @@ EditorPanel::EditorPanel (FilePanel* filePanel) tbTopPanel_1->set_image (*iTopPanel_1_Hide); } - Gtk::VSeparator* vsepcl = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vsepz2 = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vsepz3 = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vsepz4 = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator* vsepcl = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* vsepz2 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* vsepz3 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* vsepz4 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); - Gtk::VSeparator* vsep1 = Gtk::manage (new Gtk::VSeparator ()); - Gtk::VSeparator* vsep2 = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator* vsep1 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* vsep2 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); // Histogram profile toggle controls toggleHistogramProfile = Gtk::manage (new Gtk::ToggleButton ()); @@ -580,7 +821,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) toggleHistogramProfile->set_active (options.rtSettings.HistogramWorking); toggleHistogramProfile->set_tooltip_markup ( (M ("PREFERENCES_HISTOGRAM_TOOLTIP"))); - Gtk::VSeparator* vsep3 = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator* vsep3 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); iareapanel = new ImageAreaPanel (); tpc->setEditProvider (iareapanel->imageArea); @@ -597,7 +838,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) toolBarPanel->pack_start (*vsept, Gtk::PACK_SHRINK, 2); if (tbTopPanel_1) { - Gtk::VSeparator* vsep = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator* vsep = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); toolBarPanel->pack_end (*tbTopPanel_1, Gtk::PACK_SHRINK, 1); toolBarPanel->pack_end (*vsep, Gtk::PACK_SHRINK, 2); } @@ -630,6 +871,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) vboxright = new Gtk::Paned (Gtk::ORIENTATION_VERTICAL); vsubboxright = new Gtk::Box (Gtk::ORIENTATION_VERTICAL, 0); +// int rightsize = options.fontSize * 44; +// vsubboxright->set_size_request (rightsize, rightsize - 50); vsubboxright->set_size_request (300, 250); vsubboxright->pack_start (*ppframe, Gtk::PACK_SHRINK, 2); @@ -659,12 +902,14 @@ EditorPanel::EditorPanel (FilePanel* filePanel) 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 ("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); + send_to_external = Gtk::manage(new PopUpButton("", false)); + send_to_external->set_tooltip_text(M("MAIN_BUTTON_SENDTOEDITOR_TOOLTIP")); + setExpandAlignProperties(send_to_external->buttonGroup, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + updateExternalEditorWidget( + options.externalEditorIndex >= 0 ? options.externalEditorIndex : options.externalEditors.size(), + options.externalEditors + ); + send_to_external->show(); // Status box progressLabel = Gtk::manage (new MyProgressBar (300)); @@ -729,7 +974,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iops->attach_next_to (*vsep1, Gtk::POS_LEFT, 1, 1); if (!gimpPlugin) { - iops->attach_next_to (*sendtogimp, Gtk::POS_LEFT, 1, 1); + iops->attach_next_to(*send_to_external->buttonGroup, Gtk::POS_LEFT, 1, 1); } if (!gimpPlugin && !simpleEditor) { @@ -746,7 +991,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) colorMgmtToolBar->pack_right_in (iops); if (!simpleEditor && !options.tabbedUI) { - Gtk::VSeparator* vsep3 = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator* vsep3 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); iops->attach_next_to (*vsep3, Gtk::POS_RIGHT, 1, 1); iops->attach_next_to (*navPrev, Gtk::POS_RIGHT, 1, 1); iops->attach_next_to (*navSync, Gtk::POS_RIGHT, 1, 1); @@ -773,6 +1018,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) hpanedr->set_name ("EditorRightPaned"); leftbox->reference (); vboxright->reference (); + vboxright->set_name ("EditorModules"); if (options.showHistory) { hpanedl->pack1 (*leftbox, false, false); @@ -832,7 +1078,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) tbRightPanel_1->signal_toggled().connect ( sigc::mem_fun (*this, &EditorPanel::tbRightPanel_1_toggled) ); saveimgas->signal_pressed().connect ( sigc::mem_fun (*this, &EditorPanel::saveAsPressed) ); queueimg->signal_pressed().connect ( sigc::mem_fun (*this, &EditorPanel::queueImgPressed) ); - sendtogimp->signal_pressed().connect ( sigc::mem_fun (*this, &EditorPanel::sendToGimpPressed) ); + send_to_external->signal_changed().connect(sigc::mem_fun(*this, &EditorPanel::sendToExternalChanged)); + send_to_external->signal_pressed().connect(sigc::mem_fun(*this, &EditorPanel::sendToExternalPressed)); toggleHistogramProfile->signal_toggled().connect( sigc::mem_fun (*this, &EditorPanel::histogramProfile_toggled) ); if (navPrev) { @@ -895,7 +1142,7 @@ EditorPanel::~EditorPanel () delete tpc; - delete leftsubbox; + delete leftsubpaned; delete leftbox; delete vsubboxright; delete vboxright; @@ -957,6 +1204,13 @@ void EditorPanel::writeToolExpandedStatus (std::vector &tpOpen) } } +void EditorPanel::updateShowtooltipVisibility (bool showtooltip) +{ + if (tpc) { + tpc->updateShowtooltipVisibility (showtooltip); + } +} + void EditorPanel::showTopPanel (bool show) { if (tbTopPanel_1->get_active() != show) { @@ -980,7 +1234,7 @@ void EditorPanel::setAspect () void EditorPanel::on_realize () { realized = true; - Gtk::VBox::on_realize (); + Gtk::Box::on_realize (); // This line is needed to avoid autoexpansion of the window :-/ //vboxright->set_size_request (options.toolPanelWidth, -1); tpc->updateToolState(); @@ -1318,8 +1572,8 @@ void EditorPanel::info_toggled () if (idata && idata->hasExif(selectedFrame)) { infoString = Glib::ustring::compose ("%1 + %2\nf/%3 %4s %5%6 %7mm", - Glib::ustring (idata->getMake() + " " + idata->getModel()), - Glib::ustring (idata->getLens()), + escapeHtmlChars (idata->getMake() + " " + idata->getModel()), + escapeHtmlChars (idata->getLens()), Glib::ustring (idata->apertureToString (idata->getFNumber(selectedFrame))), Glib::ustring (idata->shutterToString (idata->getShutterSpeed(selectedFrame))), M ("QINFO_ISO"), idata->getISOSpeed(selectedFrame), @@ -1658,7 +1912,7 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) case GDK_KEY_e: if (!gimpPlugin) { - sendToGimpPressed(); + sendToExternalPressed(); } return true; @@ -1674,6 +1928,11 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) case GDK_KEY_F5: openThm->openDefaultViewer (3); return true; + + case GDK_KEY_f: + case GDK_KEY_F: + // No action is performed to avoid Gtk-CRITICAL due to Locallab treeview when treeview isn't focused + return true; } } //if (!ctrl) } //if (!alt) @@ -1735,6 +1994,7 @@ void EditorPanel::procParamsChanged (Thumbnail* thm, int whoChangedIt) PartialProfile pp (true); pp.set (true); * (pp.pparams) = openThm->getProcParams(); + pp.pedited->locallab.spots.resize(pp.pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); tpc->profileChange (&pp, rtengine::EvProfileChangeNotification, M ("PROGRESSDLG_PROFILECHANGEDINBROWSER")); pp.deleteInstance(); } @@ -1753,7 +2013,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.tiffFloat, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fname, sf.tiffBits, sf.tiffFloat, sf.tiffUncompressed, sf.bigTiff), 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), @@ -1765,12 +2025,12 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, delete ld; } } else { - Glib::ustring msg_ = Glib::ustring ("") + fname + ": Error during image processing\n"; + Glib::ustring msg_ = Glib::ustring ("") + escapeHtmlChars(fname) + ": Error during image processing\n"; Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); saveimgas->set_sensitive (true); - sendtogimp->set_sensitive (true); + send_to_external->set_sensitive(true); isProcessing = false; } @@ -1782,7 +2042,7 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, bool EditorPanel::idle_imageSaved (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) { - img->free (); + delete img; if (! pc->returnValue() ) { openThm->imageDeveloped (); @@ -1798,7 +2058,7 @@ bool EditorPanel::idle_imageSaved (ProgressConnector *pc, rtengine::IImagef } saveimgas->set_sensitive (true); - sendtogimp->set_sensitive (true); + send_to_external->set_sensitive(true); parent->setProgressStr (""); parent->setProgress (0.); @@ -1909,7 +2169,7 @@ void EditorPanel::saveAsPressed () ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_saveImage ), ld, fnameOut, sf, pparams)); saveimgas->set_sensitive (false); - sendtogimp->set_sensitive (false); + send_to_external->set_sensitive(false); } } else { BatchQueueEntry* bqe = createBatchQueueEntry (); @@ -1940,7 +2200,7 @@ void EditorPanel::queueImgPressed () parent->addBatchQueueJob (createBatchQueueEntry ()); } -void EditorPanel::sendToGimpPressed () +void EditorPanel::sendToExternal() { if (!ipc || !openThm) { return; @@ -1949,12 +2209,50 @@ void EditorPanel::sendToGimpPressed () // develop image rtengine::procparams::ProcParams pparams; ipc->getParams (&pparams); + if (options.editor_bypass_output_profile) { + pparams.icm.outputProfile = rtengine::procparams::ColorManagementParams::NoProfileString; + } + + if (!cached_exported_filename.empty() && cached_exported_image == ipc->getInitialImage() && pparams == cached_exported_pparams && Glib::file_test(cached_exported_filename, Glib::FILE_TEST_IS_REGULAR)) { + idle_sentToGimp(nullptr, nullptr, cached_exported_filename); + return; + } + + cached_exported_image = ipc->getInitialImage(); + cached_exported_pparams = pparams; + cached_exported_filename.clear(); rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); ProgressConnector *ld = new ProgressConnector(); ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_sendToGimp ), ld, openThm->getFileName() )); saveimgas->set_sensitive (false); - sendtogimp->set_sensitive (false); + send_to_external->set_sensitive(false); +} + +void EditorPanel::sendToExternalChanged(int) +{ + int index = send_to_external->getSelected(); + if (index >= 0 && static_cast(index) == options.externalEditors.size()) { + index = -1; + } + options.externalEditorIndex = index; + if (externalEditorChangedSignal) { + externalEditorChangedSignal->emit(); + } +} + +void EditorPanel::sendToExternalPressed() +{ + if (options.externalEditorIndex == -1) { + // "Other" external editor. Show app chooser dialog to let user pick. + RTAppChooserDialog *dialog = getAppChooserDialog(); + dialog->show(); + } else { + struct ExternalEditor editor = options.externalEditors.at(options.externalEditorIndex); + external_editor_info = Gio::AppInfo::create_from_commandline(editor.command, editor.name, Gio::APP_INFO_CREATE_NONE); + external_editor_native_command = editor.native_command; + sendToExternal(); + } } @@ -1973,7 +2271,7 @@ bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveForm if (gimpPlugin) { err = img->saveAsTIFF (filename, 32, true, true); } else if (sf.format == "tif") { - err = img->saveAsTIFF (filename, sf.tiffBits, sf.tiffFloat, sf.tiffUncompressed); + err = img->saveAsTIFF (filename, sf.tiffBits, sf.tiffFloat, sf.tiffUncompressed, sf.bigTiff); } else if (sf.format == "png") { err = img->saveAsPNG (filename, sf.pngBits); } else if (sf.format == "jpg") { @@ -1982,7 +2280,7 @@ bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveForm err = 1; } - img->free(); + delete img; return !err; } @@ -2008,6 +2306,23 @@ void EditorPanel::syncFileBrowser() // synchronize filebrowser with image in E } } +ExternalEditorChangedSignal * EditorPanel::getExternalEditorChangedSignal() +{ + return externalEditorChangedSignal; +} + +void EditorPanel::setExternalEditorChangedSignal(ExternalEditorChangedSignal *signal) +{ + if (externalEditorChangedSignal) { + externalEditorChangedSignalConnection.disconnect(); + } + externalEditorChangedSignal = signal; + if (signal) { + externalEditorChangedSignalConnection = signal->connect( + sigc::mem_fun(*this, &EditorPanel::updateExternalEditorSelection)); + } +} + void EditorPanel::histogramProfile_toggled() { options.rtSettings.HistogramWorking = toggleHistogramProfile->get_active(); @@ -2022,42 +2337,58 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p if (img) { // get file name base - const Glib::ustring shortname = removeExtension (Glib::path_get_basename (fname)); - const Glib::ustring dirname = Glib::get_tmp_dir (); - const Glib::ustring lfname = Glib::build_filename (dirname, shortname); + Glib::ustring shortname = removeExtension(Glib::path_get_basename(fname)); + Glib::ustring dirname; + switch (options.editor_out_dir) { + case Options::EDITOR_OUT_DIR_CURRENT: + dirname = Glib::path_get_dirname(fname); + break; + case Options::EDITOR_OUT_DIR_CUSTOM: + dirname = options.editor_custom_out_dir; + break; + default: // Options::EDITOR_OUT_DIR_TEMP + dirname = getTmpDirectory(); + break; + } + Glib::ustring fullFileName = Glib::build_filename(dirname, shortname); SaveFormat sf; sf.format = "tif"; - sf.tiffBits = 16; - sf.tiffFloat = false; + if (options.editor_float32) { + sf.tiffBits = 32; + sf.tiffFloat = true; + } else { + sf.tiffBits = 16; + sf.tiffFloat = false; + } + sf.tiffUncompressed = true; sf.saveParams = true; - Glib::ustring fileName = Glib::ustring::compose ("%1.%2", lfname, sf.format); + Glib::ustring fileName = Glib::ustring::compose ("%1.%2", fullFileName, sf.format); // TODO: Just list all file with a suitable name instead of brute force... int tries = 1; - while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries < 1000) { - fileName = Glib::ustring::compose ("%1-%2.%3", lfname, tries, sf.format); + fileName = Glib::ustring::compose ("%1-%2.%3", fullFileName, tries, sf.format); tries++; } if (tries == 1000) { - img->free (); + delete img; return false; } ProgressConnector *ld = new ProgressConnector(); img->setSaveProgressListener (parent->getProgressListener()); - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fileName, sf.tiffBits, sf.tiffFloat, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fileName, sf.tiffBits, sf.tiffFloat, sf.tiffUncompressed, sf.bigTiff), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_sentToGimp), ld, img, fileName)); } else { Glib::ustring msg_ = Glib::ustring (" Error during image processing\n"); Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); saveimgas->set_sensitive (true); - sendtogimp->set_sensitive (true); + send_to_external->set_sensitive(true); } return false; @@ -2065,25 +2396,27 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring filename) { - img->free (); - int errore = pc->returnValue(); + if (img) { + delete img; + cached_exported_filename = filename; + } + int errore = 0; setProgressState(false); - delete pc; + if (pc) { + errore = pc->returnValue(); + delete pc; + } - if (!errore) { + if ((!img && Glib::file_test(filename, Glib::FILE_TEST_IS_REGULAR)) || (img && !errore)) { saveimgas->set_sensitive (true); - sendtogimp->set_sensitive (true); + send_to_external->set_sensitive(true); parent->setProgressStr (""); parent->setProgress (0.); bool success = false; - if (options.editorToSendTo == 1) { - success = ExtProgStore::openInGimp (filename); - } else if (options.editorToSendTo == 2) { - success = ExtProgStore::openInPhotoshop (filename); - } else if (options.editorToSendTo == 3) { - success = ExtProgStore::openInCustomEditor (filename); - } + setUserOnlyPermission(Gio::File::create_for_path(filename), false); + + success = ExtProgStore::openInExternalEditor(filename, external_editor_info, external_editor_native_command); if (!success) { Gtk::MessageDialog msgd (*parent, M ("MAIN_MSG_CANNOTSTARTEDITOR"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); @@ -2096,6 +2429,49 @@ bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImagef return false; } +RTAppChooserDialog *EditorPanel::getAppChooserDialog() +{ + if (!app_chooser_dialog.get()) { + app_chooser_dialog.reset(new RTAppChooserDialog("image/tiff")); + app_chooser_dialog->signal_response().connect( + sigc::mem_fun(*this, &EditorPanel::onAppChooserDialogResponse) + ); + app_chooser_dialog->set_modal(); + } + + return app_chooser_dialog.get(); +} + +void EditorPanel::onAppChooserDialogResponse(int responseId) +{ + switch (responseId) { + case Gtk::RESPONSE_OK: + getAppChooserDialog()->close(); + external_editor_info = getAppChooserDialog()->get_app_info(); + external_editor_native_command = false; + sendToExternal(); + break; + case Gtk::RESPONSE_CANCEL: + case Gtk::RESPONSE_CLOSE: + getAppChooserDialog()->close(); + break; + default: + break; + } +} + +void EditorPanel::updateExternalEditorSelection() +{ + int index = send_to_external->getSelected(); + if (index >= 0 && static_cast(index) == options.externalEditors.size()) { + index = -1; + } + if (options.externalEditorIndex != index) { + send_to_external->setSelected( + options.externalEditorIndex >= 0 ? options.externalEditorIndex : options.externalEditors.size()); + } +} + void EditorPanel::historyBeforeLineChanged (const rtengine::procparams::ProcParams& params) { @@ -2168,7 +2544,7 @@ void EditorPanel::beforeAfterToggled () history->blistenerLock ? tbBeforeLock->set_image (*iBeforeLockON) : tbBeforeLock->set_image (*iBeforeLockOFF); tbBeforeLock->set_active (history->blistenerLock); - beforeBox = Gtk::manage (new Gtk::VBox ()); + beforeBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); beforeBox->pack_start (*beforeHeaderBox, Gtk::PACK_SHRINK, 2); beforeBox->pack_start (*beforeIarea); @@ -2232,16 +2608,94 @@ void EditorPanel::histogramChanged( const LUTu& histGreenRaw, const LUTu& histBlueRaw, const LUTu& histChroma, - const LUTu& histLRETI + const LUTu& histLRETI, + int vectorscopeScale, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, + int waveformScale, + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) { if (histogramPanel) { - histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw); + histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscopeHC, vectorscopeHS, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); } tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); } +void EditorPanel::setObservable(rtengine::HistogramObservable* observable) +{ + histogram_observable = observable; +} + +bool EditorPanel::updateHistogram(void) const +{ + return histogram_scope_type == ScopeType::HISTOGRAM + || histogram_scope_type == ScopeType::NONE; +} + +bool EditorPanel::updateHistogramRaw(void) const +{ + return histogram_scope_type == ScopeType::HISTOGRAM_RAW + || histogram_scope_type == ScopeType::NONE; +} + +bool EditorPanel::updateVectorscopeHC(void) const +{ + return + histogram_scope_type == ScopeType::VECTORSCOPE_HC + || histogram_scope_type == ScopeType::NONE; +} + +bool EditorPanel::updateVectorscopeHS(void) const +{ + return + histogram_scope_type == ScopeType::VECTORSCOPE_HS + || histogram_scope_type == ScopeType::NONE; +} + +bool EditorPanel::updateWaveform(void) const +{ + return histogram_scope_type == ScopeType::WAVEFORM + || histogram_scope_type == ScopeType::PARADE + || histogram_scope_type == ScopeType::NONE; +} + +void EditorPanel::scopeTypeChanged(ScopeType new_type) +{ + histogram_scope_type = new_type; + + if (!histogram_observable) { + return; + } + + // Make sure the new scope is updated since we only actively update the + // current scope. + switch (new_type) { + case ScopeType::HISTOGRAM: + histogram_observable->requestUpdateHistogram(); + break; + case ScopeType::HISTOGRAM_RAW: + histogram_observable->requestUpdateHistogramRaw(); + break; + case ScopeType::VECTORSCOPE_HC: + histogram_observable->requestUpdateVectorscopeHC(); + break; + case ScopeType::VECTORSCOPE_HS: + histogram_observable->requestUpdateVectorscopeHS(); + break; + case ScopeType::PARADE: + case ScopeType::WAVEFORM: + histogram_observable->requestUpdateWaveform(); + break; + case ScopeType::NONE: + break; + } +} + bool EditorPanel::CheckSidePanelsVisibility() { if (tbTopPanel_1) { @@ -2293,6 +2747,45 @@ void EditorPanel::tbShowHideSidePanels_managestate() ShowHideSidePanelsconn.block (false); } +void EditorPanel::updateExternalEditorWidget(int selectedIndex, const std::vector &editors) +{ + // Remove the editors. + while (send_to_external->getEntryCount()) { + send_to_external->removeEntry(send_to_external->getEntryCount() - 1); + } + + // Create new radio button group because they cannot be reused: https://developer-old.gnome.org/gtkmm/3.16/classGtk_1_1RadioButtonGroup.html#details. + send_to_external_radio_group = Gtk::RadioButtonGroup(); + + // Add the editors. + for (unsigned i = 0; i < editors.size(); i++) { + const auto & name = editors[i].name.empty() ? Glib::ustring(" ") : editors[i].name; + if (!editors[i].icon_serialized.empty()) { + Glib::RefPtr gioIcon; + GError *e = nullptr; + GVariant *icon_variant = g_variant_parse( + nullptr, editors[i].icon_serialized.c_str(), nullptr, nullptr, &e); + + if (e) { + std::cerr + << "Error loading external editor icon from \"" + << editors[i].icon_serialized << "\": " << e->message + << std::endl; + gioIcon = Glib::RefPtr(); + } else { + gioIcon = Gio::Icon::deserialize(Glib::VariantBase(icon_variant)); + } + + send_to_external->insertEntry(i, gioIcon, name, &send_to_external_radio_group); + } else { + send_to_external->insertEntry(i, "palette-brush.png", name, &send_to_external_radio_group); + } + } + send_to_external->addEntry("palette-brush.png", M("GENERAL_OTHER"), &send_to_external_radio_group); + send_to_external->setSelected(selectedIndex); + send_to_external->show(); +} + void EditorPanel::updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC) { } @@ -2358,10 +2851,21 @@ void EditorPanel::updateHistogramPosition (int oldPosition, int newPosition) break; } + if (histogramPanel) { + histogramPanel->setPanelListener(this); + } + iareapanel->imageArea->setPointerMotionHListener (histogramPanel); } +void EditorPanel::updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools) +{ + if (tpc) { + tpc->updateToolLocations(favorites, cloneFavoriteTools); + } +} void EditorPanel::defaultMonitorProfileChanged (const Glib::ustring &profile_name, bool auto_monitor_profile) { diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 8993fea07..309f14e8c 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -32,11 +32,21 @@ #include "../rtengine/noncopyable.h" #include "../rtengine/rtengine.h" +namespace rtengine +{ +template +class array2D; +} + +using ExternalEditorChangedSignal = sigc::signal; + class BatchQueueEntry; class EditorPanel; class FilePanel; class MyProgressBar; class Navigator; +class PopUpButton; +class RTAppChooserDialog; class Thumbnail; class ToolPanelCoordinator; @@ -49,15 +59,17 @@ struct EditorPanelIdleHelper { class RTWindow; class EditorPanel final : - public Gtk::VBox, + public Gtk::Box, public PParamsChangeListener, public rtengine::ProgressListener, public ThumbnailListener, public HistoryBeforeLineListener, public rtengine::HistogramListener, + public HistogramPanelListener, public rtengine::NonCopyable { public: + explicit EditorPanel (FilePanel* filePanel = nullptr); ~EditorPanel () override; @@ -79,6 +91,7 @@ public: void writeOptions(); void writeToolExpandedStatus (std::vector &tpOpen); + void updateShowtooltipVisibility (bool showtooltip); void showTopPanel (bool show); bool isRealized() @@ -125,8 +138,25 @@ public: const LUTu& histGreenRaw, const LUTu& histBlueRaw, const LUTu& histChroma, - const LUTu& histLRETI + const LUTu& histLRETI, + int vectorscopeScale, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, + int waveformScale, + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) override; + void setObservable(rtengine::HistogramObservable* observable) override; + bool updateHistogram(void) const override; + bool updateHistogramRaw(void) const override; + bool updateVectorscopeHC(void) const override; + bool updateVectorscopeHS(void) const override; + bool updateWaveform(void) const override; + + // HistogramPanelListener + void scopeTypeChanged(Options::ScopeType new_type) override; // event handlers void info_toggled (); @@ -137,11 +167,17 @@ public: void tbBeforeLock_toggled(); void saveAsPressed (); void queueImgPressed (); - void sendToGimpPressed (); + void sendToExternal(); + void sendToExternalChanged(int); + void sendToExternalPressed(); void openNextEditorImage (); void openPreviousEditorImage (); void syncFileBrowser (); + // Signals. + ExternalEditorChangedSignal * getExternalEditorChangedSignal(); + void setExternalEditorChangedSignal(ExternalEditorChangedSignal *signal); + void tbTopPanel_1_visible (bool visible); bool CheckSidePanelsVisibility(); void tbShowHideSidePanels_managestate(); @@ -157,9 +193,12 @@ public: { return isProcessing; } + void updateExternalEditorWidget(int selectedIndex, const std::vector &editors); void updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC); void updateTPVScrollbar (bool hide); void updateHistogramPosition (int oldPosition, int newPosition); + void updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools); void defaultMonitorProfileChanged (const Glib::ustring &profile_name, bool auto_monitor_profile); @@ -176,6 +215,9 @@ private: bool idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname); bool idle_sentToGimp (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring filename); void histogramProfile_toggled (); + RTAppChooserDialog *getAppChooserDialog(); + void onAppChooserDialogResponse(int resposneId); + void updateExternalEditorSelection(); Glib::ustring lastSaveAsFileName; @@ -199,16 +241,26 @@ private: Gtk::Image *iShowHideSidePanels_exit; Gtk::Image *iBeforeLockON, *iBeforeLockOFF; Gtk::Paned *leftbox; - Gtk::Box *leftsubbox; + Gtk::Paned *leftsubpaned; Gtk::Paned *vboxright; Gtk::Box *vsubboxright; Gtk::Button* queueimg; Gtk::Button* saveimgas; - Gtk::Button* sendtogimp; + PopUpButton* send_to_external; + Gtk::RadioButtonGroup send_to_external_radio_group; Gtk::Button* navSync; Gtk::Button* navNext; Gtk::Button* navPrev; + Glib::RefPtr external_editor_info; + bool external_editor_native_command; + std::unique_ptr app_chooser_dialog; + ExternalEditorChangedSignal *externalEditorChangedSignal; + sigc::connection externalEditorChangedSignalConnection; + + rtengine::InitialImage *cached_exported_image; + rtengine::procparams::ProcParams cached_exported_pparams; + Glib::ustring cached_exported_filename; class ColorManagementToolbar; std::unique_ptr colorMgmtToolBar; @@ -259,4 +311,7 @@ private: bool isProcessing; IdleRegister idle_register; + + rtengine::HistogramObservable* histogram_observable; + Options::ScopeType histogram_scope_type; }; diff --git a/rtgui/editwidgets.cc b/rtgui/editwidgets.cc index f7c748744..f9c9b3781 100644 --- a/rtgui/editwidgets.cc +++ b/rtgui/editwidgets.cc @@ -22,7 +22,11 @@ #include "editbuffer.h" #include "editcallbacks.h" #include "rtsurface.h" -#include "../rtengine/rt_math.h" + +const std::vector Geometry::dash = {3., 1.5}; + +#define INNERGEOM_OPACITY 1. +#define OUTERGEOM_OPACITY 0.7 RGBColor Geometry::getInnerLineColor () { @@ -67,7 +71,8 @@ RGBColor Geometry::getOuterLineColor () void Circle::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { - if ((flags & F_VISIBLE) && state != INSENSITIVE) { + double lineWidth = getOuterLineWidth(); + if ((flags & F_VISIBLE) && state != INSENSITIVE && lineWidth > 0. && innerLineWidth > 0.) { RGBColor color; if (flags & F_AUTO_COLOR) { @@ -76,8 +81,9 @@ void Circle::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuffer color = outerLineColor; } - cr->set_source_rgb (color.getR(), color.getG(), color.getB()); - cr->set_line_width( getOuterLineWidth() ); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), OUTERGEOM_OPACITY * rtengine::min(innerLineWidth / 2.f, 1.f)); + cr->set_line_width (lineWidth); + cr->set_line_cap(Cairo::LINE_CAP_ROUND); rtengine::Coord center_ = center; double radius_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas(double(radius)) : double(radius); @@ -107,10 +113,11 @@ void Circle::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuffer color = innerLineColor; } - cr->set_source_rgb(color.getR(), color.getG(), color.getB()); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), INNERGEOM_OPACITY); } - cr->set_line_width( innerLineWidth ); + cr->set_line_width(innerLineWidth); + cr->set_line_cap(flags & F_DASHED ? Cairo::LINE_CAP_BUTT : Cairo::LINE_CAP_ROUND); rtengine::Coord center_ = center; double radius_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas(double(radius)) : double(radius); @@ -123,39 +130,34 @@ void Circle::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuffer center_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; } - if (filled && state != INSENSITIVE) { - cr->arc(center_.x + 0.5, center_.y + 0.5, radius_, 0., 2.*rtengine::RT_PI); + if (flags & F_DASHED) { + cr->set_dash(dash, 0.); + } - if (innerLineWidth > 0.) { + if (filled) { + cr->arc(center_.x + 0.5, center_.y + 0.5, radius_, 0., 2.*rtengine::RT_PI); + if (innerLineWidth > 0.f) { cr->fill_preserve(); cr->stroke(); } else { cr->fill(); } - } else if (innerLineWidth > 0.) { + } else if (innerLineWidth > 0.f) { cr->arc(center_.x + 0.5, center_.y + 0.5, radius_, 0., 2.*rtengine::RT_PI); - - if (state == INSENSITIVE) { - std::valarray ds(1); - ds[0] = 4; - cr->set_source_rgba(1.0, 1.0, 1.0, 0.618); - cr->stroke_preserve(); - cr->set_source_rgba(0.0, 0.0, 0.0, 0.618); - cr->set_dash(ds, 0); - cr->stroke(); - ds.resize(0); - cr->set_dash(ds, 0); - } else { - cr->stroke(); - } + cr->stroke(); } - } + + if (flags & F_DASHED) { + cr->unset_dash(); + } +} } void Circle::drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { if (flags & F_HOVERABLE) { cr->set_line_width( getMouseOverLineWidth() ); + cr->set_line_cap(Cairo::LINE_CAP_ROUND); rtengine::Coord center_ = center; double radius_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas(double(radius)) : double(radius); @@ -176,7 +178,7 @@ void Circle::drawToMOChannel (Cairo::RefPtr &cr, unsigned short cr->arc(center_.x + 0.5, center_.y + 0.5, radius_, 0, 2.*rtengine::RT_PI); if (filled) { - if (innerLineWidth > 0.) { + if (innerLineWidth > 0.f) { cr->fill_preserve(); cr->stroke(); } else { @@ -190,7 +192,8 @@ void Circle::drawToMOChannel (Cairo::RefPtr &cr, unsigned short void Line::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { - if ((flags & F_VISIBLE) && state != INSENSITIVE) { + double lineWidth = getOuterLineWidth(); + if ((flags & F_VISIBLE) && state != INSENSITIVE && lineWidth > 0. && innerLineWidth > 0.) { RGBColor color; if (flags & F_AUTO_COLOR) { @@ -199,8 +202,9 @@ void Line::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuffer * color = outerLineColor; } - cr->set_source_rgb (color.getR(), color.getG(), color.getB()); - cr->set_line_width( getOuterLineWidth() ); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), OUTERGEOM_OPACITY * rtengine::min(innerLineWidth / 2.f, 1.f)); + cr->set_line_width (lineWidth); + cr->set_line_cap(Cairo::LINE_CAP_ROUND); rtengine::Coord begin_ = begin; rtengine::Coord end_ = end; @@ -224,7 +228,7 @@ void Line::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuffer * void Line::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { - if ((flags & F_VISIBLE) && innerLineWidth > 0.) { + if ((flags & F_VISIBLE) && innerLineWidth > 0.f) { if (state != INSENSITIVE) { RGBColor color; @@ -234,10 +238,11 @@ void Line::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuffer * color = innerLineColor; } - cr->set_source_rgb (color.getR(), color.getG(), color.getB()); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), INNERGEOM_OPACITY); } cr->set_line_width(innerLineWidth); + cr->set_line_cap(flags & F_DASHED ? Cairo::LINE_CAP_BUTT : Cairo::LINE_CAP_ROUND); rtengine::Coord begin_ = begin; rtengine::Coord end_ = end; @@ -253,21 +258,16 @@ void Line::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuffer * end_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; } + if (flags & F_DASHED) { + cr->set_dash(dash, 0.); + } + cr->move_to(begin_.x + 0.5, begin_.y + 0.5); cr->line_to(end_.x + 0.5, end_.y + 0.5); + cr->stroke(); - if (state == INSENSITIVE) { - std::valarray ds(1); - ds[0] = 4; - cr->set_source_rgba(1.0, 1.0, 1.0, 0.618); - cr->stroke_preserve(); - cr->set_source_rgba(0.0, 0.0, 0.0, 0.618); - cr->set_dash(ds, 0); - cr->stroke(); - ds.resize(0); - cr->set_dash(ds, 0); - } else { - cr->stroke(); + if (flags & F_DASHED) { + cr->unset_dash(); } } } @@ -276,6 +276,7 @@ void Line::drawToMOChannel(Cairo::RefPtr &cr, unsigned short id, { if (flags & F_HOVERABLE) { cr->set_line_width( getMouseOverLineWidth() ); + cr->set_line_cap(Cairo::LINE_CAP_ROUND); rtengine::Coord begin_ = begin; rtengine::Coord end_ = end; @@ -304,7 +305,8 @@ void Line::drawToMOChannel(Cairo::RefPtr &cr, unsigned short id, void Polyline::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { - if ((flags & F_VISIBLE) && state != INSENSITIVE && points.size() > 1) { + double lineWidth = getOuterLineWidth(); + if ((flags & F_VISIBLE) && state != INSENSITIVE && points.size() > 1 && lineWidth > 0.) { RGBColor color; if (flags & F_AUTO_COLOR) { @@ -313,8 +315,10 @@ void Polyline::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuff color = outerLineColor; } - cr->set_source_rgb (color.getR(), color.getG(), color.getB()); - cr->set_line_width( getOuterLineWidth() ); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), OUTERGEOM_OPACITY * rtengine::min(innerLineWidth / 2.f, 1.f)); + cr->set_line_width (lineWidth); + cr->set_line_cap(Cairo::LINE_CAP_ROUND); + cr->set_line_join(Cairo::LINE_JOIN_ROUND); rtengine::Coord currPos; @@ -357,10 +361,16 @@ void Polyline::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuff color = innerLineColor; } - cr->set_source_rgb (color.getR(), color.getG(), color.getB()); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), INNERGEOM_OPACITY); } - cr->set_line_width( innerLineWidth ); + cr->set_line_width(innerLineWidth); + cr->set_line_cap(flags & F_DASHED ? Cairo::LINE_CAP_BUTT : Cairo::LINE_CAP_ROUND); + cr->set_line_join(Cairo::LINE_JOIN_ROUND); + + if (flags & F_DASHED) { + cr->set_dash(dash, 0.); + } if (filled && state != INSENSITIVE) { rtengine::Coord currPos; @@ -383,13 +393,13 @@ void Polyline::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuff } } - if (innerLineWidth > 0.) { + if (innerLineWidth > 0.f) { cr->fill_preserve(); cr->stroke(); } else { cr->fill(); } - } else if (innerLineWidth > 0.) { + } else if (innerLineWidth > 0.f) { rtengine::Coord currPos; for (unsigned int i = 0; i < points.size(); ++i) { @@ -409,20 +419,11 @@ void Polyline::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuff cr->line_to(currPos.x + 0.5, currPos.y + 0.5); } } + cr->stroke(); + } - if (state == INSENSITIVE) { - std::valarray ds(1); - ds[0] = 4; - cr->set_source_rgba(1.0, 1.0, 1.0, 0.618); - cr->stroke_preserve(); - cr->set_source_rgba(0.0, 0.0, 0.0, 0.618); - cr->set_dash(ds, 0); - cr->stroke(); - ds.resize(0); - cr->set_dash(ds, 0); - } else { - cr->stroke(); - } + if (flags & F_DASHED) { + cr->unset_dash(); } } } @@ -439,8 +440,11 @@ void Polyline::drawToMOChannel (Cairo::RefPtr &cr, unsigned shor cr->set_source_rgba (0., 0., 0., (id + 1) / 65535.); } + cr->set_line_width( getMouseOverLineWidth() ); + cr->set_line_cap(Cairo::LINE_CAP_ROUND); + cr->set_line_join(Cairo::LINE_JOIN_ROUND); + for (unsigned int i = 0; i < points.size(); ++i) { - cr->set_line_width( getMouseOverLineWidth() ); currPos = points.at(i); if (datum == IMAGE) { @@ -459,7 +463,7 @@ void Polyline::drawToMOChannel (Cairo::RefPtr &cr, unsigned shor } if (filled) { - if (innerLineWidth > 0.) { + if (innerLineWidth > 0.f) { cr->fill_preserve(); cr->stroke(); } else { @@ -497,7 +501,8 @@ void Rectangle::setXYXY(rtengine::Coord topLeft, rtengine::Coord bottomRight) void Rectangle::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { - if ((flags & F_VISIBLE) && state != INSENSITIVE) { + double lineWidth = getOuterLineWidth(); + if ((flags & F_VISIBLE) && state != INSENSITIVE && lineWidth > 0. && innerLineWidth > 0.) { RGBColor color; if (flags & F_AUTO_COLOR) { @@ -506,8 +511,9 @@ void Rectangle::drawOuterGeometry(Cairo::RefPtr &cr, ObjectMOBuf color = outerLineColor; } - cr->set_source_rgb (color.getR(), color.getG(), color.getB()); - cr->set_line_width( getOuterLineWidth() ); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), OUTERGEOM_OPACITY * rtengine::min(innerLineWidth / 2.f, 1.f)); + cr->set_line_width (lineWidth); + cr->set_line_join(Cairo::LINE_JOIN_BEVEL); rtengine::Coord tl, br; @@ -550,10 +556,11 @@ void Rectangle::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuf color = innerLineColor; } - cr->set_source_rgb (color.getR(), color.getG(), color.getB()); + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), INNERGEOM_OPACITY); } - cr->set_line_width( innerLineWidth ); + cr->set_line_width(innerLineWidth); + cr->set_line_join(Cairo::LINE_JOIN_BEVEL); rtengine::Coord tl, br; @@ -573,31 +580,26 @@ void Rectangle::drawInnerGeometry(Cairo::RefPtr &cr, ObjectMOBuf br = bottomRight + objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; } - if (filled && state != INSENSITIVE) { + if (flags & F_DASHED) { + cr->set_dash(dash, 0.); + } + + if (filled) { cr->rectangle(tl.x + 0.5, tl.y + 0.5, br.x - tl.x, br.y - tl.y); - if (innerLineWidth > 0.) { + if (innerLineWidth > 0.f) { cr->fill_preserve(); cr->stroke(); } else { cr->fill(); } - } else if (innerLineWidth > 0.) { + } else if (innerLineWidth > 0.f) { cr->rectangle(tl.x + 0.5, tl.y + 0.5, br.x - tl.x, br.y - tl.y); + cr->stroke(); + } - if (state == INSENSITIVE) { - std::valarray ds(1); - ds[0] = 4; - cr->set_source_rgba(1.0, 1.0, 1.0, 0.618); - cr->stroke_preserve(); - cr->set_source_rgba(0.0, 0.0, 0.0, 0.618); - cr->set_dash(ds, 0); - cr->stroke(); - ds.resize(0); - cr->set_dash(ds, 0); - } else { - cr->stroke(); - } + if (flags & F_DASHED) { + cr->unset_dash(); } } } @@ -606,6 +608,7 @@ void Rectangle::drawToMOChannel(Cairo::RefPtr &cr, unsigned shor { if (flags & F_HOVERABLE) { cr->set_line_width( getMouseOverLineWidth() ); + cr->set_line_join(Cairo::LINE_JOIN_ROUND); rtengine::Coord tl, br; @@ -633,6 +636,292 @@ void Rectangle::drawToMOChannel(Cairo::RefPtr &cr, unsigned shor } cr->rectangle(tl.x + 0.5, tl.y + 0.5, br.x - tl.x, br.y - tl.y); + if (filled) { + if (innerLineWidth > 0.f) { + cr->fill_preserve(); + cr->stroke(); + } else { + cr->fill(); + } + } else { + cr->stroke(); + } + } +} + +void Ellipse::drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if ((flags & F_VISIBLE) && state != INSENSITIVE) { + RGBColor color; + + if (flags & F_AUTO_COLOR) { + color = getOuterLineColor(); + } else { + color = outerLineColor; + } + + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), opacity / 100.); + cr->set_line_width ( getOuterLineWidth() ); + + rtengine::Coord center_ = center; + double radYT_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radYT)) : double (radYT); + double radY_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radY)) : double (radY); + double radXL_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radXL)) : double (radXL); + double radX_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radX)) : double (radX); + + if (datum == IMAGE) { + coordSystem.imageCoordToScreen (center.x, center.y, center_.x, center_.y); + } else if (datum == CLICKED_POINT) { + center_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + center_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + if (radYT_ > 0 && radY_ > 0 && radXL_ > 0 && radX_ > 0) { + // To have an ellipse with radius of (radX, radX), a circle of radius 1. shall be twisted with a scale + // of radX for x-axis, radY for y-axis + // Center of coordinates (x, y) in previous coordinates system becomes (X, Y) = (radX * x, radY * y) in new one + // To go back to previous location, center shall be translated to tx = -X * (1 - 1 / radX) in x-axis (x = tx + X) + // and ty = -Y * (1 - 1 / radY) in y-axis (y = ty + Y) + cr->save(); + + // Drawing bottom-right part + cr->scale (radX_, radY_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, 0.0, rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing bottom-left part + cr->scale (radXL_, radY_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI_2, rtengine::RT_PI); + cr->scale (radXL_, radY_); + + cr->restore (); + cr->save(); + + // Drawing top-left part + cr->scale (radXL_, radYT_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI, 3. * rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing top-right part + cr->scale (radX_, radYT_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, 3. * rtengine::RT_PI_2, 2. * rtengine::RT_PI); + + cr->restore (); + cr->stroke (); + } + } +} + +void Ellipse::drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if (flags & F_VISIBLE) { + if (state != INSENSITIVE) { + RGBColor color; + + if (flags & F_AUTO_COLOR) { + color = getInnerLineColor(); + } else { + color = innerLineColor; + } + + cr->set_source_rgba (color.getR(), color.getG(), color.getB(), opacity / 100.); + } + + cr->set_line_width ( innerLineWidth ); + + rtengine::Coord center_ = center; + double radYT_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radYT)) : double (radYT); + double radY_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radY)) : double (radY); + double radXL_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radXL)) : double (radXL); + double radX_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radX)) : double (radX); + + if (datum == IMAGE) { + coordSystem.imageCoordToScreen (center.x, center.y, center_.x, center_.y); + } else if (datum == CLICKED_POINT) { + center_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + center_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + if (filled && state != INSENSITIVE) { + if (radYT_ > 0 && radY_ > 0 && radXL_ > 0 && radX_ > 0) { + // To have an ellipse with radius of (radX, radX), a circle of radius 1. shall be twisted with a scale + // of radX for x-axis, radY for y-axis + // Center of coordinates (x, y) in previous coordinates system becomes (X, Y) = (radX * x, radY * y) in new one + // To go back to previous location, center shall be translated to tx = -X * (1 - 1 / radX) in x-axis (x = tx + X) + // and ty = -Y * (1 - 1 / radY) in y-axis (y = ty + Y) + cr->save(); + + // Drawing bottom-right part + cr->scale (radX_, radY_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, 0.0, rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing bottom-left part + cr->scale (radXL_, radY_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI_2, rtengine::RT_PI); + cr->scale (radXL_, radY_); + + cr->restore (); + cr->save(); + + // Drawing top-left part + cr->scale (radXL_, radYT_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI, 3. * rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing top-right part + cr->scale (radX_, radYT_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, 3. * rtengine::RT_PI_2, 2. * rtengine::RT_PI); + + cr->restore (); + cr->stroke (); + } + + if (innerLineWidth > 0.) { + cr->fill_preserve(); + cr->stroke(); + } else { + cr->fill(); + } + } else if (innerLineWidth > 0.) { + if (radYT_ > 0 && radY_ > 0 && radXL_ > 0 && radX_ > 0) { + // To have an ellipse with radius of (radX, radX), a circle of radius 1. shall be twisted with a scale + // of radX for x-axis, radY for y-axis + // Center of coordinates (x, y) in previous coordinates system becomes (X, Y) = (radX * x, radY * y) in new one + // To go back to previous location, center shall be translated to tx = -X * (1 - 1 / radX) in x-axis (x = tx + X) + // and ty = -Y * (1 - 1 / radY) in y-axis (y = ty + Y) + cr->save(); + + // Drawing bottom-right part + cr->scale (radX_, radY_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, 0.0, rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing bottom-left part + cr->scale (radXL_, radY_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI_2, rtengine::RT_PI); + cr->scale (radXL_, radY_); + + cr->restore (); + cr->save(); + + // Drawing top-left part + cr->scale (radXL_, radYT_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI, 3. * rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing top-right part + cr->scale (radX_, radYT_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, 3. * rtengine::RT_PI_2, 2. * rtengine::RT_PI); + + cr->restore (); + cr->stroke (); + } + + if (state == INSENSITIVE) { + std::valarray ds (1); + ds[0] = 4; + cr->set_source_rgba (1.0, 1.0, 1.0, 0.618); + cr->stroke_preserve(); + cr->set_source_rgba (0.0, 0.0, 0.0, 0.618); + cr->set_dash (ds, 0); + cr->stroke(); + ds.resize (0); + cr->set_dash (ds, 0); + } else { + cr->stroke(); + } + } + } +} + +void Ellipse::drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if (flags & F_HOVERABLE) { + cr->set_line_width ( getMouseOverLineWidth() ); + + rtengine::Coord center_ = center; + double radYT_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radYT)) : double (radYT); + double radY_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radY)) : double (radY); + double radXL_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radXL)) : double (radXL); + double radX_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radX)) : double (radX); + + if (datum == IMAGE) { + coordSystem.imageCoordToCropCanvas (center.x, center.y, center_.x, center_.y); + } else if (datum == CLICKED_POINT) { + center_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + center_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + if (radYT_ > 0 && radY_ > 0 && radXL_ > 0 && radX_ > 0) { + // To have an ellipse with radius of (radX, radX), a circle of radius 1. shall be twisted with a scale + // of radX for x-axis, radY for y-axis + // Center of coordinates (x, y) in previous coordinates system becomes (X, Y) = (radX * x, radY * y) in new one + // To go back to previous location, center shall be translated to tx = -X * (1 - 1 / radX) in x-axis (x = tx + X) + // and ty = -Y * (1 - 1 / radY) in y-axis (y = ty + Y) + cr->save(); + + // Drawing bottom-right part + cr->scale (radX_, radY_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, 0.0, rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing bottom-left part + cr->scale (radXL_, radY_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radY_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI_2, rtengine::RT_PI); + cr->scale (radXL_, radY_); + + cr->restore (); + cr->save(); + + // Drawing top-left part + cr->scale (radXL_, radYT_); + cr->translate(- center_.x * (1 - 1 / radXL_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, rtengine::RT_PI, 3. * rtengine::RT_PI_2); + + cr->restore (); + cr->save(); + + // Drawing top-right part + cr->scale (radX_, radYT_); + cr->translate(- center_.x * (1 - 1 / radX_), - center_.y * (1 - 1 / radYT_)); + cr->arc (center_.x, center_.y, 1.0, 3. * rtengine::RT_PI_2, 2. * rtengine::RT_PI); + + cr->restore (); + cr->stroke (); + } + if (filled) { if (innerLineWidth > 0.) { cr->fill_preserve(); diff --git a/rtgui/editwidgets.h b/rtgui/editwidgets.h index 0fa7a91bf..fd539c355 100644 --- a/rtgui/editwidgets.h +++ b/rtgui/editwidgets.h @@ -24,10 +24,11 @@ #include #include "editcoordsys.h" +#include "rtsurface.h" #include "../rtengine/coord.h" +#include "../rtengine/rt_math.h" class ObjectMOBuffer; -class RTSurface; /** @file * @@ -210,6 +211,8 @@ public: F_VISIBLE = 1 << 0, /// true if the geometry have to be drawn on the visible layer F_HOVERABLE = 1 << 1, /// true if the geometry have to be drawn on the "mouse over" layer F_AUTO_COLOR = 1 << 2, /// true if the color depend on the state value, not the color field above + F_DASHED = 1 << 3, /// true if the geometry have to be drawn as a dash line + // (TODO: add a F_LARGE_DASH to have two different dash size ?) }; /// @brief Key point of the image's rectangle that is used to locate the icon copy to the target point: @@ -226,6 +229,7 @@ public: }; protected: + static const std::vector dash; RGBColor innerLineColor; RGBColor outerLineColor; short flags; @@ -234,6 +238,7 @@ public: float innerLineWidth; // ...outerLineWidth = innerLineWidth+2 Datum datum; State state; // set by the Subscriber + float opacity; // Percentage of opacity Geometry (); virtual ~Geometry() {} @@ -251,6 +256,8 @@ public: void setVisible (bool visible); bool isHoverable (); void setHoverable (bool visible); + bool isDashed (); + void setDashed (bool dashed); // setActive will enable/disable the visible and hoverable flags in one shot! @@ -324,6 +331,25 @@ public: void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; }; +class Ellipse : public Geometry +{ +public: + rtengine::Coord center; + int radYT; // Ellipse half-radius for top y-axis + int radY; // Ellipse half-radius for bottom y-axis + int radXL; // Ellipse half-radius for left x-axis + int radX; // Ellipse half-radius for right x-axis + bool filled; + bool radiusInImageSpace; /// If true, the radius depend on the image scale; if false, it is a fixed 'screen' size + + Ellipse (); + Ellipse (const rtengine::Coord& center, int radYT, int radY, int radXL, int radX, bool filled = false, bool radiusInImageSpace = false); + + 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" { @@ -429,7 +455,7 @@ inline void Geometry::setOuterLineColor (char r, char g, char b) { } inline double Geometry::getMouseOverLineWidth () { - return getOuterLineWidth () + 2.; + return rtengine::max(double(innerLineWidth), 1.) + 2.; } inline void Geometry::setAutoColor (bool aColor) { @@ -464,6 +490,18 @@ inline void Geometry::setHoverable (bool hoverable) { } } +inline bool Geometry::isDashed () { + return flags & F_DASHED; +} + +inline void Geometry::setDashed (bool dashed) { + if (dashed) { + flags |= F_DASHED; + } else { + flags &= ~F_DASHED; + } +} + inline void Geometry::setActive (bool active) { if (active) { flags |= (F_VISIBLE | F_HOVERABLE); @@ -476,7 +514,7 @@ inline Geometry::Geometry () : innerLineColor (char (255), char (255), char (255)), outerLineColor ( char (0), char (0), char (0)), flags ( F_VISIBLE | F_HOVERABLE | F_AUTO_COLOR), innerLineWidth (1.5f), datum ( - IMAGE), state (NORMAL) { + IMAGE), state (NORMAL), opacity(100.) { } inline RGBAColor::RGBAColor () : @@ -520,6 +558,10 @@ inline Line::Line () : begin (10, 10), end (100, 100) { } +inline Ellipse::Ellipse () : + center (100, 100), radYT (5), radY (5), radXL (10), radX (10), filled (false), radiusInImageSpace (false) { +} + inline Circle::Circle (rtengine::Coord& center, int radius, bool filled, bool radiusInImageSpace) : center (center), radius (radius), filled (filled), radiusInImageSpace ( @@ -540,5 +582,10 @@ inline Line::Line (int beginX, int beginY, int endX, int endY) : begin (beginX, beginY), end (endX, endY) { } -#endif +inline Ellipse::Ellipse (const rtengine::Coord& center, int radYT, int radY, int radXL, int radX, + bool filled, bool radiusInImageSpace) : + center (center), radYT (radYT), radY (radY), radXL (radXL), radX (radX), filled (filled), + radiusInImageSpace (radiusInImageSpace) { +} +#endif diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index 8841d3d42..0364b0afa 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -31,11 +31,17 @@ extern Glib::ustring argv0; // Check if the system has more than one display and option is set bool EditWindow::isMultiDisplayEnabled() { - return options.multiDisplayMode > 0 && Gdk::Screen::get_default()->get_n_monitors() > 1; + const auto screen = Gdk::Screen::get_default(); + + if (screen) { + return options.multiDisplayMode > 0 && screen->get_display()->get_n_monitors() > 1; + } else { + return false; // There is no default screen + } } -// Should only be created once, auto-creates window on correct display -EditWindow* EditWindow::getInstance(RTWindow* p, bool restore) +// Should only be created once +EditWindow* EditWindow::getInstance(RTWindow* p) { struct EditWindowInstance { @@ -47,13 +53,15 @@ EditWindow* EditWindow::getInstance(RTWindow* p, bool restore) }; static EditWindowInstance instance_(p); - if(restore) { - instance_.editWnd.restoreWindow(); - } return &instance_.editWnd; } -EditWindow::EditWindow (RTWindow* p) : resolution(RTScalable::baseDPI), parent(p) , isFullscreen(false), isClosed(true) +EditWindow::EditWindow (RTWindow* p) + : resolution(RTScalable::baseDPI) + , parent(p) + , isFullscreen(false) + , isClosed(true) + , isMinimized(false) { updateResolution(); @@ -70,51 +78,84 @@ EditWindow::EditWindow (RTWindow* p) : resolution(RTScalable::baseDPI), parent(p 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_window_state_event().connect(sigc::mem_fun(*this, &EditWindow::on_window_state_event)); + onConfEventConn = signal_configure_event().connect(sigc::mem_fun(*this, &EditWindow::on_configure_event)); - Gtk::VBox* mainBox = Gtk::manage(new Gtk::VBox()); + Gtk::Box* mainBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); mainBox->pack_start(*mainNB); add(*mainBox); } -void EditWindow::restoreWindow() { +void EditWindow::restoreWindow() +{ + if (isClosed) { + onConfEventConn.block(true); // Avoid getting size and position while window is being moved, maximized, ... - if(isClosed) { - int meowMonitor = 0; - if(isMultiDisplayEnabled()) { - if(options.meowMonitor >= 0) { // use display from last session if available - meowMonitor = std::min(options.meowMonitor, Gdk::Screen::get_default()->get_n_monitors() - 1); - } else { // Determine the other display - const Glib::RefPtr< Gdk::Window >& wnd = parent->get_window(); - meowMonitor = parent->get_screen()->get_monitor_at_window(wnd) == 0 ? 1 : 0; + int meowMonitor = 0; // By default, set to main monitor + const auto display = get_screen()->get_display(); + + if (isMultiDisplayEnabled()) { + if (options.meowMonitor >= 0) { // Use display from last session if available + meowMonitor = std::max(0, std::min(options.meowMonitor, display->get_n_monitors() - 1)); + } else { // Determine the main RT window display + const Glib::RefPtr &wnd = parent->get_window(); + + // Retrieve window monitor ID + const int monitor_nb = display->get_n_monitors(); + + for (int id = 0; id < monitor_nb; id++) { + if (display->get_monitor_at_window(wnd) == display->get_monitor(id)) { + meowMonitor = id; + break; + } + } } } Gdk::Rectangle lMonitorRect; - get_screen()->get_monitor_geometry(meowMonitor, lMonitorRect); - if(options.meowMaximized) { + display->get_monitor(meowMonitor)->get_geometry(lMonitorRect); + +#ifdef __APPLE__ + // Get macOS menu bar height + Gdk::Rectangle lWorkAreaRect; + display->get_monitor(std::min(meowMonitor, display->get_n_monitors() - 1))->get_workarea(lWorkAreaRect); + const int macMenuBarHeight = lWorkAreaRect.get_y(); + + // Place RT window to saved one in options file + if (options.meowX <= lMonitorRect.get_x() + lMonitorRect.get_width() + && options.meowX >= 0 + && options.meowY <= lMonitorRect.get_y() + lMonitorRect.get_height() - macMenuBarHeight + && options.meowY >= 0) { + move(options.meowX, options.meowY + macMenuBarHeight); + } else { + move(lMonitorRect.get_x(), lMonitorRect.get_y() + macMenuBarHeight); + } +#else + // Place RT window to saved one in options file + if (options.meowX <= lMonitorRect.get_x() + lMonitorRect.get_width() + && options.meowX >= 0 + && options.meowY <= lMonitorRect.get_y() + lMonitorRect.get_height() + && options.meowY >= 0) { + move(options.meowX, options.meowY); + } else { move(lMonitorRect.get_x(), lMonitorRect.get_y()); + } +#endif + + // Maximize RT window according to options file + if (options.meowMaximized) { maximize(); } else { + unmaximize(); resize(options.meowWidth, options.meowHeight); - if(options.meowX <= lMonitorRect.get_x() + lMonitorRect.get_width() && options.meowY <= lMonitorRect.get_y() + lMonitorRect.get_height()) { - move(options.meowX, options.meowY); - } else { - move(lMonitorRect.get_x(), lMonitorRect.get_y()); - } - } - show_all(); - - isFullscreen = options.meowFullScreen; - - if(isFullscreen) { - fullscreen(); } isClosed = false; - } + onConfEventConn.block(false); + } } void EditWindow::on_realize () @@ -174,27 +215,23 @@ bool EditWindow::on_configure_event(GdkEventConfigure* event) setAppIcon(); } - if (get_realized() && is_visible()) { - if(!is_maximized()) { - get_position(options.meowX, options.meowY); - get_size(options.meowWidth, options.meowHeight); - } - options.meowMaximized = is_maximized(); + if (!options.meowMaximized && !isFullscreen && !isMinimized) { + get_position(options.meowX, options.meowY); + get_size(options.meowWidth, options.meowHeight); } return Gtk::Widget::on_configure_event(event); } -/* HOMBRE: Disabling this since it's maximized when opened anyway. - * Someday, the EditorWindow might save its own position and state, so it'll have to be uncommented bool EditWindow::on_window_state_event(GdkEventWindowState* event) { - if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) { - options.windowMaximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED; - } + // Retrieve RT window states + options.meowMaximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED; + isMinimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + isFullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN; return Gtk::Widget::on_window_state_event(event); -}*/ +} void EditWindow::on_mainNB_switch_page(Gtk::Widget* widget, guint page_num) { @@ -213,9 +250,10 @@ void EditWindow::addEditorPanel (EditorPanel* ep, const std::string &name) { ep->setParent (parent); ep->setParentWindow(this); + ep->setExternalEditorChangedSignal(&externalEditorChangedSignal); // construct closeable tab for the image - Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb = Gtk::manage (new Gtk::Box ()); 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); @@ -241,7 +279,8 @@ void EditWindow::addEditorPanel (EditorPanel* ep, const std::string &name) epanels[ name ] = ep; filesEdited.insert ( name ); parent->fpanel->refreshEditedState (filesEdited); - ep->setAspect(); + + show_all(); } void EditWindow::remEditorPanel (EditorPanel* ep) @@ -250,6 +289,7 @@ void EditWindow::remEditorPanel (EditorPanel* ep) return; // Will crash if destroyed while loading } + ep->setExternalEditorChangedSignal(nullptr); epanels.erase (ep->getFileName()); filesEdited.erase (ep->getFileName ()); parent->fpanel->refreshEditedState (filesEdited); @@ -281,10 +321,20 @@ bool EditWindow::selectEditorPanel(const std::string &name) void EditWindow::toFront () { - // when using the secondary window on the same monitor as the primary window we need to present the secondary window. + // When using the secondary window on the same monitor as the primary window we need to present the secondary window. // If we don't, it will stay in background when opening 2nd, 3rd... editor, which is annoying // It will also deiconify the window - present(); + // To avoid unexpected behavior while window is being updated, present() function is called after at idle + idle_register.add( + [this]()-> bool + { + onConfEventConn.block(true); // Avoid getting size and position while window is being moved, maximized, ... + present(); + onConfEventConn.block(false); + + return false; + } + ); } bool EditWindow::keyPressed (GdkEventKey* event) @@ -308,27 +358,63 @@ bool EditWindow::keyPressed (GdkEventKey* event) return false; } - } -void EditWindow::toggleFullscreen () +void EditWindow::toggleFullscreen() { + onConfEventConn.block(true); // Avoid getting size and position while window is getting fullscreen + isFullscreen ? unfullscreen() : fullscreen(); - options.meowFullScreen = isFullscreen = !isFullscreen; + + onConfEventConn.block(false); } -void EditWindow::writeOptions() { +void EditWindow::get_position(int& x, int& y) const +{ + // Call native function + Gtk::Window::get_position(x, y); - if(is_visible()) { - if(isMultiDisplayEnabled()) { - options.meowMonitor = get_screen()->get_monitor_at_window(get_window()); + // Retrieve display (concatenation of all monitors) size + int width = 0, height = 0; + const auto display = get_screen()->get_display(); + const int nbMonitors = display->get_n_monitors(); + + for (int i = 0; i < nbMonitors; i++) { + Gdk::Rectangle lMonitorRect; + display->get_monitor(i)->get_geometry(lMonitorRect); + width = std::max(width, lMonitorRect.get_x() + lMonitorRect.get_width()); + height = std::max(height, lMonitorRect.get_y() + lMonitorRect.get_height()); + } + + // Saturate position at monitor limits to avoid unexpected behavior (fixes #6233) + x = std::min(width, std::max(0, x)); + y = std::min(height, std::max(0, y)); +} + +void EditWindow::writeOptions() +{ + if (is_visible()) { + if (isMultiDisplayEnabled()) { + // Retrieve window monitor ID + options.meowMonitor = 0; + const auto display = get_screen()->get_display(); + const int monitor_nb = display->get_n_monitors(); + + for (int id = 0; id < monitor_nb; id++) { + if (display->get_monitor_at_window(get_window()) == display->get_monitor(id)) { + options.windowMonitor = id; + break; + } + } } - options.meowMaximized = is_maximized(); - get_position(options.meowX, options.meowY); - get_size(options.meowWidth,options.meowHeight); + if (!options.meowMaximized && !isFullscreen && !isMinimized) { + get_position(options.meowX, options.meowY); + get_size(options.meowWidth, options.meowHeight); + } } } + bool EditWindow::on_delete_event(GdkEventAny* event) { @@ -401,3 +487,11 @@ void EditWindow::set_title_decorated(Glib::ustring fname) set_title("RawTherapee " + M("EDITWINDOW_TITLE") + subtitle); } + +void EditWindow::updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools) +{ + for (const auto& panel : epanels) { + panel.second->updateToolPanelToolLocations(favorites, cloneFavoriteTools); + } +} diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index f4ada571d..0b10cb67e 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -21,6 +21,7 @@ #include #include "rtimage.h" +#include "guiutils.h" class EditorPanel; class RTWindow; @@ -38,19 +39,24 @@ private: std::set filesEdited; std::map epanels; + sigc::signal externalEditorChangedSignal; + bool isFullscreen; bool isClosed; + bool isMinimized; + sigc::connection onConfEventConn; void toggleFullscreen (); - void restoreWindow(); bool updateResolution(); void setAppIcon(); + IdleRegister idle_register; + public: // Check if the system has more than one display and option is set static bool isMultiDisplayEnabled(); - // Should only be created once, auto-creates window on correct display - static EditWindow* getInstance(RTWindow* p, bool restore = true); + // Should only be created once + static EditWindow* getInstance(RTWindow* p); explicit EditWindow (RTWindow* p); @@ -60,13 +66,17 @@ public: bool selectEditorPanel(const std::string &name); bool closeOpenEditors(); bool isProcessing(); + void updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools); void toFront(); bool keyPressed (GdkEventKey* event); bool on_configure_event(GdkEventConfigure* event) override; bool on_delete_event(GdkEventAny* event) override; - //bool on_window_state_event(GdkEventWindowState* event); + bool on_window_state_event(GdkEventWindowState* event) override; void on_mainNB_switch_page(Gtk::Widget* page, guint page_num); void set_title_decorated(Glib::ustring fname); void on_realize () override; + void get_position(int& x, int& y) const; + void restoreWindow(); }; diff --git a/rtgui/epd.cc b/rtgui/epd.cc index 307790ff7..073c5ecdd 100644 --- a/rtgui/epd.cc +++ b/rtgui/epd.cc @@ -26,13 +26,15 @@ using namespace rtengine; using namespace rtengine::procparams; -EdgePreservingDecompositionUI::EdgePreservingDecompositionUI () : FoldableToolPanel(this, "epd", M("TP_EPD_LABEL"), true, true) +const Glib::ustring EdgePreservingDecompositionUI::TOOL_NAME = "epd"; + +EdgePreservingDecompositionUI::EdgePreservingDecompositionUI () : FoldableToolPanel(this, TOOL_NAME, M("TP_EPD_LABEL"), true, true) { 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)); - scale = Gtk::manage(new Adjuster (M("TP_EPD_SCALE"), 0.1, 10.0, 0.01, 0.1)); + edgeStopping = Gtk::manage(new Adjuster (M("TP_EPD_EDGESTOPPING"), 0.1, 4.0, 0.01, 1.4)); + scale = Gtk::manage(new Adjuster (M("TP_EPD_SCALE"), 0.1, 10.0, 0.01, 1.0)); reweightingIterates = Gtk::manage(new Adjuster (M("TP_EPD_REWEIGHTINGITERATES"), 0, 9, 1, 0)); strength->setAdjusterListener(this); @@ -69,17 +71,18 @@ void EdgePreservingDecompositionUI::read(const ProcParams *pp, const ParamsEdite setEnabled(pp->epd.enabled); strength->set_sensitive (true); - - if(pp->wavelet.enabled) { - if(pp->wavelet.tmrs == 0) { + gamma->set_sensitive (true); +/* + if(pp->wavelet.enabled) { + if(pp->wavelet.tmrs == 0 || pp->wavelet.TMmethod == "cont") { strength->set_sensitive (true); gamma->set_sensitive (true); - } else { + } else if(pp->wavelet.tmrs != 0 && pp->wavelet.TMmethod == "tm") { strength->set_sensitive (false); gamma->set_sensitive (false); } } - +*/ strength->setValue(pp->epd.strength); gamma->setValue(pp->epd.gamma); edgeStopping->setValue(pp->epd.edgeStopping); @@ -98,17 +101,18 @@ void EdgePreservingDecompositionUI::write(ProcParams *pp, ParamsEdited *pedited) pp->epd.reweightingIterates = reweightingIterates->getValue(); pp->epd.enabled = getEnabled(); strength->set_sensitive (true); - - if(pp->wavelet.enabled) { - if(pp->wavelet.tmrs == 0) { + gamma->set_sensitive (true); +/* + if(pp->wavelet.enabled) { + if(pp->wavelet.tmrs == 0 || pp->wavelet.TMmethod == "cont") { strength->set_sensitive (true); gamma->set_sensitive (true); - } else { + } else if(pp->wavelet.tmrs != 0 && pp->wavelet.TMmethod == "tm") { strength->set_sensitive (false); gamma->set_sensitive (false); } } - +*/ if(pedited) { pedited->epd.strength = strength->getEditedState(); pedited->epd.gamma = gamma->getEditedState(); diff --git a/rtgui/epd.h b/rtgui/epd.h index 6a5160623..1d866d690 100644 --- a/rtgui/epd.h +++ b/rtgui/epd.h @@ -36,6 +36,7 @@ protected: Adjuster *reweightingIterates; public: + static const Glib::ustring TOOL_NAME; EdgePreservingDecompositionUI(); diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index 341d0f303..eeff0c8c7 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -33,6 +33,7 @@ ExifPanel::ExifPanel() : changeList(new rtengine::procparams::ExifPairs), defChangeList(new rtengine::procparams::ExifPairs) { + set_orientation(Gtk::ORIENTATION_VERTICAL); recursiveOp = true; exifTree = Gtk::manage (new Gtk::TreeView()); @@ -41,7 +42,7 @@ ExifPanel::ExifPanel() : exifTree->set_headers_visible (false); exifTree->set_rules_hint (false); exifTree->set_reorderable (false); - exifTree->set_enable_search (true); + exifTree->set_enable_search (false); exifTree->get_selection()->set_mode (Gtk::SELECTION_MULTIPLE); scrolledWindow->set_shadow_type (Gtk::SHADOW_NONE); scrolledWindow->set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_ALWAYS); @@ -209,6 +210,9 @@ void ExifPanel::setImageData (const FramesMetaData* id) Gtk::TreeModel::Children ExifPanel::addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable) { + if (!value.validate()) { + value = "???"; + } Gtk::TreeModel::Row row = * (exifTreeModel->append (root)); row[exifColumns.action] = action; @@ -472,11 +476,11 @@ void ExifPanel::addPressed () { Gtk::Dialog* dialog = new Gtk::Dialog (M ("EXIFPANEL_ADDTAGDLG_TITLE"), * ((Gtk::Window*)get_toplevel()), true); - dialog->add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); - dialog->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + dialog->add_button ("_OK", Gtk::RESPONSE_OK); + dialog->add_button ("_Cancel", Gtk::RESPONSE_CANCEL); - Gtk::HBox* hb1 = new Gtk::HBox (); - Gtk::HBox* hb2 = new Gtk::HBox (); + Gtk::Box* hb1 = new Gtk::Box (); + Gtk::Box* hb2 = new Gtk::Box (); Gtk::Label* tlabel = new Gtk::Label (M ("EXIFPANEL_ADDTAGDLG_SELECTTAG") + ":"); MyComboBoxText* tcombo = new MyComboBoxText (); diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index 0894c21ad..4c28af289 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -25,8 +25,8 @@ #include "toolpanel.h" #include "../rtexif/rtexif.h" -class ExifPanel : - public Gtk::VBox, +class ExifPanel final : + public Gtk::Box, public ToolPanel { diff --git a/rtgui/exportpanel.cc b/rtgui/exportpanel.cc index b4332f4a4..f6c8a79f0 100644 --- a/rtgui/exportpanel.cc +++ b/rtgui/exportpanel.cc @@ -30,9 +30,10 @@ using namespace rtengine::procparams; ExportPanel::ExportPanel () : listener (nullptr) { + set_orientation(Gtk::ORIENTATION_VERTICAL); /*enabled = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_ENABLE")) ); pack_start(*enabled, Gtk::PACK_SHRINK, 4); - pack_start (*Gtk::manage(new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 2);*/ + pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 2);*/ Gtk::Label* labExportTitle = Gtk::manage ( new Gtk::Label (M ("EXPORT_FASTEXPORTOPTIONS")) ); labExportTitle->set_use_markup (true); @@ -43,9 +44,9 @@ ExportPanel::ExportPanel () : listener (nullptr) Gtk::RadioButton::Group pipeline_group; use_fast_pipeline = Gtk::manage ( new Gtk::RadioButton (pipeline_group, M ("EXPORT_USE_FAST_PIPELINE"))); use_normal_pipeline = Gtk::manage ( new Gtk::RadioButton (pipeline_group, M ("EXPORT_USE_NORMAL_PIPELINE"))); - bypass_box = Gtk::manage (new Gtk::VBox()); + bypass_box = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); bypass_ALL = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_ALL"))); - use_fast_pipeline->set_tooltip_text (M ("EXPORT_USE_FAST_PIPELINE_TIP")); + use_fast_pipeline->set_tooltip_text (M ("EXPORT_USE_FAST_PIPELINE_TOOLTIP")); bypass_sharpening = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_SHARPENING"))); bypass_sharpenEdge = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_SHARPENEDGE"))); bypass_sharpenMicro = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_SHARPENMICRO"))); @@ -63,9 +64,10 @@ ExportPanel::ExportPanel () : listener (nullptr) // ---------------------- Bayer sensor frame ----------------------- Gtk::Frame *bayerFrame = Gtk::manage ( new Gtk::Frame (M ("TP_RAW_SENSOR_BAYER_LABEL"))); - Gtk::VBox* bayerFrameVBox = Gtk::manage (new Gtk::VBox ()); + bayerFrame->set_label_align(0.025, 0.5); + Gtk::Box* bayerFrameVBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - Gtk::HBox* hb_raw_bayer_method = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb_raw_bayer_method = Gtk::manage (new Gtk::Box ()); hb_raw_bayer_method->pack_start (*Gtk::manage (new Gtk::Label ( M ("EXPORT_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); raw_bayer_method = Gtk::manage (new MyComboBoxText ()); @@ -86,9 +88,10 @@ ExportPanel::ExportPanel () : listener (nullptr) // ---------------------- Bayer sensor frame ----------------------- Gtk::Frame *xtransFrame = Gtk::manage ( new Gtk::Frame (M ("TP_RAW_SENSOR_XTRANS_LABEL"))); - Gtk::VBox* xtransFrameVBox = Gtk::manage (new Gtk::VBox ()); + xtransFrame->set_label_align(0.025, 0.5); + Gtk::Box* xtransFrameVBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - Gtk::HBox* hb_raw_xtrans_method = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb_raw_xtrans_method = Gtk::manage (new Gtk::Box ()); hb_raw_xtrans_method->pack_start (*Gtk::manage (new Gtk::Label ( M ("EXPORT_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); raw_xtrans_method = Gtk::manage (new MyComboBoxText ()); @@ -102,18 +105,18 @@ ExportPanel::ExportPanel () : listener (nullptr) // ---------------------------------------------------------------- // start global packing - Gtk::HBox* lblbox = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* lblbox = Gtk::manage (new Gtk::Box ()); lblbox->pack_start (*Gtk::manage (new Gtk::Label (M ("EXPORT_PIPELINE"))), Gtk::PACK_SHRINK, 4); pack_start (*lblbox, Gtk::PACK_SHRINK, 4); pack_start (*use_fast_pipeline, Gtk::PACK_SHRINK, 4); pack_start (*use_normal_pipeline, Gtk::PACK_SHRINK, 4); - bypass_box->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 4); - lblbox = Gtk::manage (new Gtk::HBox ()); + bypass_box->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 4); + lblbox = Gtk::manage (new Gtk::Box ()); lblbox->pack_start (*Gtk::manage (new Gtk::Label (M ("EXPORT_BYPASS"))), Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*lblbox, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_ALL, Gtk::PACK_SHRINK, 4); - // bypass_box->pack_start(*Gtk::manage(new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 4); + // bypass_box->pack_start(*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_sharpening, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_sharpenEdge, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_sharpenMicro, Gtk::PACK_SHRINK, 4); @@ -146,16 +149,16 @@ ExportPanel::ExportPanel () : listener (nullptr) pack_start (*bypass_box, Gtk::PACK_SHRINK); - pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 2); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 2); // Resize options - Gtk::HBox* rmbox = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* rmbox = Gtk::manage (new Gtk::Box ()); rmbox->pack_start (*Gtk::manage (new Gtk::Label (M ("TP_RESIZE_LABEL"))), Gtk::PACK_SHRINK, 4); pack_start (*rmbox, Gtk::PACK_SHRINK, 4); - Gtk::HBox* wbox = Gtk::manage (new Gtk::HBox ()); - Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* wbox = Gtk::manage (new Gtk::Box ()); + Gtk::Box* hbox = Gtk::manage (new Gtk::Box ()); MaxWidth = Gtk::manage (new MySpinButton ()); MaxHeight = Gtk::manage (new MySpinButton ()); wbox->pack_start (*Gtk::manage (new Gtk::Label (M ("EXPORT_MAXWIDTH"))), Gtk::PACK_SHRINK, 4); @@ -187,8 +190,8 @@ ExportPanel::ExportPanel () : listener (nullptr) // add panel ending - Gtk::VBox* vboxpe = Gtk::manage (new Gtk::VBox ()); - Gtk::HSeparator* hseptpe = Gtk::manage (new Gtk::HSeparator ()); + Gtk::Box* vboxpe = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* hseptpe = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); Gtk::Image* peImg = Gtk::manage (new RTImage ("ornament1.png")); vboxpe->pack_start (*hseptpe, Gtk::PACK_SHRINK, 4); vboxpe->pack_start (*peImg); diff --git a/rtgui/exportpanel.h b/rtgui/exportpanel.h index 7ae7e043c..18c4bda49 100644 --- a/rtgui/exportpanel.h +++ b/rtgui/exportpanel.h @@ -31,12 +31,12 @@ public: virtual void exportRequested() = 0; }; -class ExportPanel : public Gtk::VBox +class ExportPanel : public Gtk::Box { protected: - Gtk::VBox *bypass_box; + Gtk::Box* bypass_box; //Gtk::CheckButton* enabled; Gtk::RadioButton* use_fast_pipeline; Gtk::RadioButton* use_normal_pipeline; diff --git a/rtgui/externaleditorpreferences.cc b/rtgui/externaleditorpreferences.cc new file mode 100644 index 000000000..5d9b45c5d --- /dev/null +++ b/rtgui/externaleditorpreferences.cc @@ -0,0 +1,389 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Lawrence Lee + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include + +#include +#include +#include +#include + +#include "externaleditorpreferences.h" +#include "multilangmgr.h" +#include "rtimage.h" + + +ExternalEditorPreferences::ExternalEditorPreferences(): + Box(Gtk::Orientation::ORIENTATION_VERTICAL), + list_model(Gtk::ListStore::create(model_columns)), + toolbar(Gtk::Orientation::ORIENTATION_HORIZONTAL) +{ + // List view. + list_view = Gtk::manage(new Gtk::TreeView()); + list_view->set_model(list_model); + list_view->append_column(*Gtk::manage(makeAppColumn())); + list_view->append_column(*Gtk::manage(makeNativeCommandColumn())); + list_view->append_column(*Gtk::manage(makeCommandColumn())); + + for (auto &&column : list_view->get_columns()) { + column->set_sizing(Gtk::TreeViewColumnSizing::TREE_VIEW_COLUMN_FIXED); + } + + list_view->set_grid_lines(Gtk::TREE_VIEW_GRID_LINES_VERTICAL); + list_view->set_reorderable(); + + // List scroll area. + list_scroll_area.set_hexpand(); + list_scroll_area.set_vexpand(); + list_scroll_area.add(*list_view); + + // Toolbar buttons. + auto add_image = Gtk::manage(new RTImage("add-small.png")); + auto remove_image = Gtk::manage(new RTImage("remove-small.png")); + button_add = Gtk::manage(new Gtk::Button()); + button_remove = Gtk::manage(new Gtk::Button()); + button_add->set_image(*add_image); + button_remove->set_image(*remove_image); + button_app_chooser = Gtk::manage(new Gtk::Button(M("PREFERENCES_EXTERNALEDITOR_CHANGE"))); + button_file_chooser = Gtk::manage(new Gtk::Button(M("PREFERENCES_EXTERNALEDITOR_CHANGE_FILE"))); + + button_app_chooser->signal_pressed().connect(sigc::mem_fun( + *this, &ExternalEditorPreferences::openAppChooserDialog)); + button_add->signal_pressed().connect(sigc::mem_fun( + *this, &ExternalEditorPreferences::addEditor)); + button_file_chooser->signal_pressed().connect(sigc::mem_fun( + *this, &ExternalEditorPreferences::openFileChooserDialog)); + button_remove->signal_pressed().connect(sigc::mem_fun( + *this, &ExternalEditorPreferences::removeSelectedEditors)); + + list_view->get_selection()->signal_changed().connect(sigc::mem_fun( + *this, &ExternalEditorPreferences::updateToolbarSensitivity)); + updateToolbarSensitivity(); + + // Toolbar. + toolbar.set_halign(Gtk::Align::ALIGN_END); + toolbar.add(*button_app_chooser); + toolbar.add(*button_file_chooser); + toolbar.add(*button_add); + toolbar.add(*button_remove); + + // This widget's children. + add(list_scroll_area); + add(toolbar); + show_all(); +} + +std::vector +ExternalEditorPreferences::getEditors() const +{ + std::vector editors; + + auto children = list_model->children(); + + for (auto rowIter = children.begin(); rowIter != children.end(); rowIter++) { + const Gio::Icon *const icon = rowIter->get_value(model_columns.icon).get(); + const auto &icon_serialized = icon == nullptr ? "" : icon->serialize().print(); + editors.emplace_back( + rowIter->get_value(model_columns.name), + rowIter->get_value(model_columns.command), + icon_serialized, + rowIter->get_value(model_columns.native_command), + rowIter->get_value(model_columns.other_data)); + } + + return editors; +} + +void ExternalEditorPreferences::setEditors( + const std::vector &editors) +{ + list_model->clear(); + + for (const EditorInfo & editor : editors) { + auto row = *list_model->append(); + Glib::RefPtr icon; + + // Get icon. + if (editor.icon_serialized.empty()) { + icon = Glib::RefPtr(); + } else { + GError *e = nullptr; + GVariant *icon_variant = g_variant_parse( + nullptr, editor.icon_serialized.c_str(), nullptr, nullptr, &e); + if (e) { + std::cerr + << "Error loading external editor icon from \"" + << editor.icon_serialized << "\": " << e->message + << std::endl; + icon = Glib::RefPtr(); + } else { + icon = Gio::Icon::deserialize(Glib::VariantBase(icon_variant)); + } + } + + row[model_columns.name] = editor.name; + row[model_columns.icon] = icon; + row[model_columns.command] = editor.command; + row[model_columns.native_command] = editor.native_command; + row[model_columns.other_data] = editor.other_data; + } +} + +void ExternalEditorPreferences::addEditor() +{ + Gtk::TreeModel::Row row; + auto selected = list_view->get_selection()->get_selected_rows(); + + if (selected.size()) { + row = *list_model->insert_after(list_model->get_iter(selected.back())); + } else { + row = *list_model->append(); + } + + row[model_columns.name] = "-"; + list_view->get_selection()->select(row); +} + +Gtk::TreeViewColumn *ExternalEditorPreferences::makeAppColumn() +{ + auto name_renderer = Gtk::manage(new Gtk::CellRendererText()); + auto icon_renderer = Gtk::manage(new Gtk::CellRendererPixbuf()); + auto col = Gtk::manage(new Gtk::TreeViewColumn()); + + col->set_title(M("PREFERENCES_EXTERNALEDITOR_COLUMN_NAME")); + col->set_resizable(); + col->pack_start(*icon_renderer, false); + col->pack_start(*name_renderer); + col->add_attribute(icon_renderer->property_gicon(), model_columns.icon); + col->add_attribute(name_renderer->property_text(), model_columns.name); + col->set_min_width(20); + + name_renderer->property_editable() = true; + name_renderer->signal_edited().connect( + sigc::mem_fun(*this, &ExternalEditorPreferences::setAppName)); + + return col; +} + +Gtk::TreeViewColumn *ExternalEditorPreferences::makeCommandColumn() +{ + auto command_renderer = Gtk::manage(new Gtk::CellRendererText()); + auto col = Gtk::manage(new Gtk::TreeViewColumn()); + + col->set_title(M("PREFERENCES_EXTERNALEDITOR_COLUMN_COMMAND")); + col->pack_start(*command_renderer); + col->add_attribute(command_renderer->property_text(), model_columns.command); + + command_renderer->property_editable() = true; + command_renderer->signal_edited().connect( + sigc::mem_fun(*this, &ExternalEditorPreferences::setAppCommand)); + + return col; +} + +Gtk::TreeViewColumn *ExternalEditorPreferences::makeNativeCommandColumn() +{ + auto toggle_renderer = Gtk::manage(new Gtk::CellRendererToggle()); + auto col = Gtk::manage(new Gtk::TreeViewColumn()); + + col->set_title(M("PREFERENCES_EXTERNALEDITOR_COLUMN_NATIVE_COMMAND")); + col->pack_start(*toggle_renderer); + col->add_attribute(toggle_renderer->property_active(), model_columns.native_command); + + toggle_renderer->signal_toggled().connect([this](const Glib::ustring &path) { + const auto row_iter = list_model->get_iter(path); + bool new_value = !row_iter->get_value(model_columns.native_command); + row_iter->set_value(model_columns.native_command, new_value); + }); + + return col; +} + +void ExternalEditorPreferences::onAppChooserDialogResponse( + int response_id, RTAppChooserDialog *dialog) +{ + switch (response_id) { + case Gtk::RESPONSE_OK: + dialog->close(); + setApp(dialog->get_app_info()); + break; + + case Gtk::RESPONSE_CANCEL: + case Gtk::RESPONSE_CLOSE: + dialog->close(); + break; + + default: + break; + } +} + +void ExternalEditorPreferences::onFileChooserDialogResponse( + int response_id, Gtk::FileChooserDialog *dialog) +{ + switch (response_id) { + case Gtk::RESPONSE_OK: { + dialog->close(); + + auto selection = list_view->get_selection()->get_selected_rows(); + for (const auto &selected : selection) { + auto row = *list_model->get_iter(selected); + row[model_columns.icon] = Glib::RefPtr(nullptr); + row[model_columns.native_command] = false; + row[model_columns.command] = +#ifdef WIN32 + '"' + dialog->get_filename() + '"'; +#else + Glib::shell_quote(dialog->get_filename()); +#endif + } + + break; + } + + case Gtk::RESPONSE_CANCEL: + case Gtk::RESPONSE_CLOSE: + dialog->close(); + break; + + default: + break; + } +} + +void ExternalEditorPreferences::openAppChooserDialog() +{ + if (app_chooser_dialog.get()) { + app_chooser_dialog->refresh(); + app_chooser_dialog->show(); + return; + } + + app_chooser_dialog.reset(new RTAppChooserDialog("image/tiff")); + app_chooser_dialog->signal_response().connect(sigc::bind( + sigc::mem_fun(*this, &ExternalEditorPreferences::onAppChooserDialogResponse), + app_chooser_dialog.get() + )); + app_chooser_dialog->set_modal(); + app_chooser_dialog->show(); +} + +void ExternalEditorPreferences::openFileChooserDialog() +{ + if (file_chooser_dialog.get()) { + file_chooser_dialog->show(); + return; + } + + file_chooser_dialog.reset(new Gtk::FileChooserDialog(M("PREFERENCES_EXTERNALEDITOR_CHANGE_FILE"))); + + const auto exe_filter = Gtk::FileFilter::create(); + exe_filter->set_name(M("FILECHOOSER_FILTER_EXECUTABLE")); + exe_filter->add_custom(Gtk::FILE_FILTER_MIME_TYPE, [](const Gtk::FileFilter::Info &info) { +#ifdef WIN32 + return info.mime_type == "application/x-msdownload"; +#else + return Gio::content_type_can_be_executable(info.mime_type); +#endif + }); + const auto all_filter = Gtk::FileFilter::create(); + all_filter->set_name(M("FILECHOOSER_FILTER_ANY")); + all_filter->add_pattern("*"); + file_chooser_dialog->add_filter(exe_filter); + file_chooser_dialog->add_filter(all_filter); + + file_chooser_dialog->signal_response().connect(sigc::bind( + sigc::mem_fun(*this, &ExternalEditorPreferences::onFileChooserDialogResponse), + file_chooser_dialog.get())); + file_chooser_dialog->set_modal(); + file_chooser_dialog->add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); + file_chooser_dialog->add_button(M("GENERAL_OPEN"), Gtk::RESPONSE_OK); + file_chooser_dialog->show(); +} + +void ExternalEditorPreferences::removeSelectedEditors() +{ + auto selection = list_view->get_selection()->get_selected_rows(); + + for (const auto &selected : selection) { + list_model->erase(list_model->get_iter(selected)); + } +} + +void ExternalEditorPreferences::setApp(const Glib::RefPtr app_info) +{ + auto selection = list_view->get_selection()->get_selected_rows(); + + for (const auto &selected : selection) { + auto row = *list_model->get_iter(selected); + row[model_columns.icon] = app_info->get_icon(); + row[model_columns.name] = app_info->get_name(); + row[model_columns.command] = app_info->get_commandline(); + row[model_columns.native_command] = false; + } +} + +void ExternalEditorPreferences::setAppCommand( + const Glib::ustring & path, const Glib::ustring & new_text) +{ + auto row_iter = list_model->get_iter(path); + + if (!row_iter->get_value(model_columns.command).compare(new_text)) { + return; + } + + row_iter->set_value(model_columns.command, new_text); + row_iter->set_value(model_columns.icon, Glib::RefPtr(nullptr)); +} + +void ExternalEditorPreferences::setAppName( + const Glib::ustring & path, const Glib::ustring & new_text) +{ + list_model->get_iter(path)->set_value(model_columns.name, new_text); +} + +void ExternalEditorPreferences::updateToolbarSensitivity() +{ + bool selected = list_view->get_selection()->count_selected_rows(); + button_app_chooser->set_sensitive(selected); + button_file_chooser->set_sensitive(selected); + button_remove->set_sensitive(selected); +} + +ExternalEditorPreferences::EditorInfo::EditorInfo( + const Glib::ustring &name, + const Glib::ustring &command, + const Glib::ustring &icon_serialized, + bool native_command, + EditorTag other_data) : + name(name), + icon_serialized(icon_serialized), + command(command), + native_command(native_command), + other_data(other_data) +{ +} + +ExternalEditorPreferences::ModelColumns::ModelColumns() +{ + add(name); + add(icon); + add(command); + add(native_command); + add(other_data); +} diff --git a/rtgui/externaleditorpreferences.h b/rtgui/externaleditorpreferences.h new file mode 100644 index 000000000..a1e3c7e74 --- /dev/null +++ b/rtgui/externaleditorpreferences.h @@ -0,0 +1,183 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Lawrence Lee + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "rtappchooserdialog.h" + + +namespace Gtk +{ + +class FileChooserDialog; + +} + + +/** + * Widget for editing the external editors options. + */ +class ExternalEditorPreferences : public Gtk::Box +{ +public: + struct EditorTag { + bool selected; + EditorTag(): selected(false) {} + explicit EditorTag(bool selected): selected(selected) {} + }; + + /** + * Data struct containing information about an external editor. + */ + struct EditorInfo { + explicit EditorInfo( + const Glib::ustring &name = Glib::ustring(), + const Glib::ustring &command = Glib::ustring(), + const Glib::ustring &icon_serialized = Glib::ustring(), + bool native_command = false, + EditorTag other_data = EditorTag() + ); + /** + * Name of the external editor. + */ + Glib::ustring name; + /** + * The string representation of the icon. See Gio::Icon::serialize(). + */ + Glib::ustring icon_serialized; + /** + * The commandline for running the program. See + * Gio::AppInfo::get_commandline() + */ + Glib::ustring command; + /** + * Use the OS native launcher instead of Gio. + */ + bool native_command; + /** + * Holds any other data associated with the editor. For example, it can + * be used as a tag to uniquely identify the editor. + */ + EditorTag other_data; + }; + + ExternalEditorPreferences(); + + /** + * Creates and returns a vector representing the external editors shown in + * this widget. + */ + std::vector getEditors() const; + /** + * Populates this widget with the external editors described in the + * argument. + */ + void setEditors(const std::vector &editors); + +private: + /** + * Model representing the data fields each external editor entry has. + */ + class ModelColumns : public Gtk::TreeModelColumnRecord + { + public: + ModelColumns(); + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn> icon; + Gtk::TreeModelColumn command; + Gtk::TreeModelColumn native_command; + Gtk::TreeModelColumn other_data; + }; + + ModelColumns model_columns; + Glib::RefPtr list_model; // The list of editors. + Gtk::ScrolledWindow list_scroll_area; // Allows the list to be scrolled. + Gtk::TreeView *list_view; // Widget for displaying the list. + Gtk::Box toolbar; // Contains buttons for editing the list. + Gtk::Button *button_app_chooser; + Gtk::Button *button_add; + Gtk::Button *button_file_chooser; + Gtk::Button *button_remove; + std::unique_ptr app_chooser_dialog; + std::unique_ptr file_chooser_dialog; + + /** + * Inserts a new editor entry after the current selection, or at the end if + * no editor is selected. + */ + void addEditor(); + /** + * Constructs the column for displaying the external editor name (and icon). + */ + Gtk::TreeViewColumn *makeAppColumn(); + /** + * Constructs the column for displaying an editable commandline. + */ + Gtk::TreeViewColumn *makeCommandColumn(); + /** + * Constructs the column for displaying the native command toggle. + */ + Gtk::TreeViewColumn *makeNativeCommandColumn(); + /** + * Called when the user is done interacting with the app chooser dialog. + * Closes the dialog and updates the selected entry if an app was chosen. + */ + void onAppChooserDialogResponse(int responseId, RTAppChooserDialog *dialog); + /** + * Called when the user is done interacting with the file chooser dialog. + * Closes the dialog and updates the selected entry if a file was chosen. + */ + void onFileChooserDialogResponse(int responseId, Gtk::FileChooserDialog *dialog); + /** + * Shows the app chooser dialog. + */ + void openAppChooserDialog(); + /** + * Shows the file chooser dialog for picking an executable. + */ + void openFileChooserDialog(); + /** + * Removes all selected editors. + */ + void removeSelectedEditors(); + /** + * Sets the selected entries with the provided information. + */ + void setApp(const Glib::RefPtr app_info); + /** + * Updates the application command and removes the icon for the given row. + */ + void setAppCommand(const Glib::ustring & path, const Glib::ustring & new_text); + /** + * Updates the application name for the given row. + */ + void setAppName(const Glib::ustring & path, const Glib::ustring & new_text); + /** + * Sets the sensitivity of the widgets in the toolbar to reflect the current + * state of the list. For example, makes the remove button insensitive if no + * entries are selected. + */ + void updateToolbarSensitivity(); +}; diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index 57d57ecd8..ea1800638 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -276,8 +276,8 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) for (auto ver = 12; ver >= 0; --ver) { executable = Glib::build_filename (options.gimpDir, "bin", Glib::ustring::compose (Glib::ustring("gimp-2.%1.exe"), ver)); - auto lsuccess = ShellExecute( NULL, "open", executable.c_str(), fileName.c_str(), NULL, SW_SHOWNORMAL ); - + Glib::ustring escapedFileName = Glib::ustring::compose ("\"%1\"", fileName); + auto lsuccess = ShellExecute( NULL, "open", executable.c_str(), escapedFileName.c_str(), NULL, SW_SHOWNORMAL ); if (reinterpret_cast(lsuccess) > 32) { return true; } @@ -318,24 +318,70 @@ bool ExtProgStore::openInPhotoshop (const Glib::ustring& fileName) return spawnCommandAsync (cmdLine); } -bool ExtProgStore::openInCustomEditor (const Glib::ustring& fileName) +bool ExtProgStore::openInCustomEditor (const Glib::ustring& fileName, const Glib::ustring* command) { + if (!command) { + command = &(options.customEditorProg); + } + #if defined WIN32 - const auto cmdLine = Glib::ustring("\"") + options.customEditorProg + Glib::ustring("\""); + const auto cmdLine = Glib::ustring("\"") + *command + Glib::ustring("\""); auto success = ShellExecute( NULL, "open", cmdLine.c_str(), ('"' + fileName + '"').c_str(), NULL, SW_SHOWNORMAL ); return (uintptr_t)success > 32; #elif defined __APPLE__ - const auto cmdLine = options.customEditorProg + Glib::ustring(" \"") + fileName + Glib::ustring("\""); + const auto cmdLine = *command + Glib::ustring(" \"") + fileName + Glib::ustring("\""); return spawnCommandAsync (cmdLine); #else - const auto cmdLine = options.customEditorProg + Glib::ustring(" ") + Glib::shell_quote(fileName); + const auto cmdLine = *command + Glib::ustring(" ") + Glib::shell_quote(fileName); return spawnCommandAsync (cmdLine); #endif } + +bool ExtProgStore::openInExternalEditor(const Glib::ustring &fileName, const Glib::RefPtr &editorInfo, bool nativeCommand) +{ + if (nativeCommand) { + if (rtengine::settings->verbose) { + std::cout << "Launching external editor as native command." << std::endl; + } + const Glib::ustring command = editorInfo->get_commandline(); + return openInCustomEditor(fileName, &command); + } + + if (rtengine::settings->verbose) { + std::cout << "Launching external editor with Gio." << std::endl; + } + + bool success = false; + + try { + success = editorInfo->launch(Gio::File::create_for_path(fileName)); + } catch (const Glib::Error &e) { + std::cerr + << "Error launching external editor.\n" + << "Error code #" << e.code() << ": " << e.what() + << std::endl; + success = false; + } + + if (success) { + return true; + } + + if (rtengine::settings->verbose) { + std::cout << "Unable to launch external editor with Gio. Trying custom launcher." << std::endl; + } + Glib::ustring command = editorInfo->get_commandline(); +#if defined WIN32 + if (command.length() > 2 && command[0] == '"' && command[command.length() - 1] == '"') { + command = command.substr(1, command.length() - 2); + } +#endif + return openInCustomEditor(fileName, &command); +} diff --git a/rtgui/extprog.h b/rtgui/extprog.h index c5e00bb1b..5336c4703 100644 --- a/rtgui/extprog.h +++ b/rtgui/extprog.h @@ -20,10 +20,16 @@ #include +#include #include #include "threadutils.h" +namespace Gio +{ + class AppInfo; +} + struct ExtProgAction { Glib::ustring filePathEXE; @@ -63,7 +69,8 @@ public: static bool openInGimp (const Glib::ustring& fileName); static bool openInPhotoshop (const Glib::ustring& fileName); - static bool openInCustomEditor (const Glib::ustring& fileName); + static bool openInCustomEditor (const Glib::ustring& fileName, const Glib::ustring* command = nullptr); + static bool openInExternalEditor(const Glib::ustring &fileName, const Glib::RefPtr &editorInfo, bool nativeCommand); }; #define extProgStore ExtProgStore::getInstance() diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index 89a1e9e30..d4ed90612 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -31,7 +31,9 @@ using namespace rtengine; using namespace rtengine::procparams; -FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, "fattal", M("TP_TM_FATTAL_LABEL"), true, true) +const Glib::ustring FattalToneMapping::TOOL_NAME = "fattal"; + +FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, TOOL_NAME, M("TP_TM_FATTAL_LABEL"), true, true) { auto m = ProcEventMapper::getInstance(); EvTMFattalAnchor = m->newEvent(HDR, "HISTORY_MSG_TM_FATTAL_ANCHOR"); diff --git a/rtgui/fattaltonemap.h b/rtgui/fattaltonemap.h index 3d36ec7d2..f5c19f15c 100644 --- a/rtgui/fattaltonemap.h +++ b/rtgui/fattaltonemap.h @@ -33,6 +33,7 @@ protected: rtengine::ProcEvent EvTMFattalAnchor; public: + static const Glib::ustring TOOL_NAME; FattalToneMapping(); diff --git a/rtgui/favoritbrowser.cc b/rtgui/favoritbrowser.cc index 2d49ab087..0481847cb 100644 --- a/rtgui/favoritbrowser.cc +++ b/rtgui/favoritbrowser.cc @@ -22,11 +22,13 @@ FavoritBrowser::FavoritBrowser () : listener (NULL) { + set_orientation(Gtk::ORIENTATION_VERTICAL); scrollw = Gtk::manage (new Gtk::ScrolledWindow ()); scrollw->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); Gtk::Frame* frame = Gtk::manage (new Gtk::Frame ("Favorite Folders")); + frame->set_label_align(0.025, 0.5); frame->add (*scrollw); pack_start (*frame); @@ -65,7 +67,7 @@ FavoritBrowser::FavoritBrowser () : listener (NULL) del->set_valign(Gtk::ALIGN_START); 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 ()); + Gtk::Box* buttonBox = Gtk::manage (new Gtk::Box ()); buttonBox->pack_start (*add); buttonBox->pack_start (*del); diff --git a/rtgui/favoritbrowser.h b/rtgui/favoritbrowser.h index 7a73b98af..ff57a38dc 100644 --- a/rtgui/favoritbrowser.h +++ b/rtgui/favoritbrowser.h @@ -24,7 +24,7 @@ #include "dirselectionlistener.h" class FavoritBrowser : - public Gtk::VBox, + public Gtk::Box, public DirSelectionListener { class FavoritColumns : diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index caa60ebbc..ac4a27dec 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -27,8 +27,10 @@ #include "batchqueue.h" #include "clipboard.h" +#include "inspector.h" #include "multilangmgr.h" #include "options.h" +#include "paramsedited.h" #include "profilestorecombobox.h" #include "procparamchangers.h" #include "rtimage.h" @@ -151,6 +153,10 @@ FileBrowser::FileBrowser () : pmenu = new Gtk::Menu (); pmenu->attach (*Gtk::manage(open = new Gtk::MenuItem (M("FILEBROWSER_POPUPOPEN"))), 0, 1, p, p + 1); p++; + if (options.inspectorWindow) { + pmenu->attach (*Gtk::manage(inspect = new Gtk::MenuItem (M("FILEBROWSER_POPUPINSPECT"))), 0, 1, p, p + 1); + p++; + } 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); @@ -161,6 +167,41 @@ FileBrowser::FileBrowser () : pmenu->attach (*Gtk::manage(selall = new Gtk::MenuItem (M("FILEBROWSER_POPUPSELECTALL"))), 0, 1, p, p + 1); p++; + /*********************** + * sort + ***********************/ + const std::array cnameSortOrders = { + M("SORT_ASCENDING"), + M("SORT_DESCENDING"), + }; + + const std::array cnameSortMethods = { + M("SORT_BY_NAME"), + M("SORT_BY_DATE"), + M("SORT_BY_EXIF"), + M("SORT_BY_RANK"), + M("SORT_BY_LABEL"), + }; + + pmenu->attach (*Gtk::manage(menuSort = new Gtk::MenuItem (M("FILEBROWSER_POPUPSORTBY"))), 0, 1, p, p + 1); + p++; + Gtk::Menu* submenuSort = Gtk::manage (new Gtk::Menu ()); + Gtk::RadioButtonGroup sortOrderGroup, sortMethodGroup; + for (size_t i = 0; i < cnameSortOrders.size(); i++) { + submenuSort->attach (*Gtk::manage(sortOrder[i] = new Gtk::RadioMenuItem (sortOrderGroup, cnameSortOrders[i])), 0, 1, p, p + 1); + p++; + sortOrder[i]->set_active (i == options.sortDescending); + } + submenuSort->attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p + 1); + p++; + for (size_t i = 0; i < cnameSortMethods.size(); i++) { + submenuSort->attach (*Gtk::manage(sortMethod[i] = new Gtk::RadioMenuItem (sortMethodGroup, cnameSortMethods[i])), 0, 1, p, p + 1); + p++; + sortMethod[i]->set_active (i == options.sortMethod); + } + submenuSort->show_all (); + menuSort->set_submenu (*submenuSort); + /*********************** * rank ***********************/ @@ -404,6 +445,8 @@ FileBrowser::FileBrowser () : trash->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_Delete, (Gdk::ModifierType)0, Gtk::ACCEL_VISIBLE); untrash->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_Delete, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE); open->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_Return, (Gdk::ModifierType)0, Gtk::ACCEL_VISIBLE); + if (options.inspectorWindow) + inspect->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_f, (Gdk::ModifierType)0, Gtk::ACCEL_VISIBLE); develop->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_B, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); developfast->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_B, Gdk::CONTROL_MASK | Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE); copyprof->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_C, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); @@ -415,6 +458,18 @@ FileBrowser::FileBrowser () : // Bind to event handlers open->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), open)); + if (options.inspectorWindow) { + inspect->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), inspect)); + } + + for (int i = 0; i < 2; i++) { + sortOrder[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), sortOrder[i])); + } + + for (int i = 0; i < Options::SORT_METHOD_COUNT; i++) { + sortMethod[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), sortMethod[i])); + } + for (int i = 0; i < 6; i++) { rank[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), rank[i])); } @@ -598,27 +653,7 @@ void FileBrowser::addEntry_ (FileBrowserEntry* entry) entry->getThumbButtonSet()->setButtonListener(this); entry->resize(getThumbnailHeight()); entry->filtered = !checkFilter(entry); - - // find place in abc order - { - MYWRITERLOCK(l, entryRW); - - fd.insert( - std::lower_bound( - fd.begin(), - fd.end(), - entry, - [](const ThumbBrowserEntryBase* a, const ThumbBrowserEntryBase* b) - { - return *a < *b; - } - ), - entry - ); - - initEntry(entry); - } - redraw(entry); + insertEntry(entry); } FileBrowserEntry* FileBrowser::delEntry (const Glib::ustring& fname) @@ -697,7 +732,6 @@ void FileBrowser::menuColorlabelActivated (Gtk::MenuItem* m) void FileBrowser::menuItemActivated (Gtk::MenuItem* m) { - std::vector mselected; { @@ -713,6 +747,18 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) return; } + for (int i = 0; i < 2; i++) + if (m == sortOrder[i]) { + sortOrderRequested (i); + return; + } + + for (int i = 0; i < Options::SORT_METHOD_COUNT; i++) + if (m == sortMethod[i]) { + sortMethodRequested (i); + return; + } + for (int i = 0; i < 6; i++) if (m == rank[i]) { rankingRequested (mselected, i); @@ -750,6 +796,8 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) if (m == open) { openRequested(mselected); + } else if (options.inspectorWindow && m == inspect) { + inspectRequested(mselected); } else if (m == remove) { tbl->deleteRequested (mselected, false, true); } else if (m == removeInclProc) { @@ -862,11 +910,11 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) } // Reinit cache - rtengine::dfm.init( options.rtSettings.darkFramesPath ); + rtengine::DFManager::getInstance().init( options.rtSettings.darkFramesPath ); } else { // Target directory creation failed, we clear the darkFramesPath setting options.rtSettings.darkFramesPath.clear(); - Glib::ustring msg_ = Glib::ustring::compose (M("MAIN_MSG_PATHDOESNTEXIST"), options.rtSettings.darkFramesPath) + Glib::ustring msg_ = Glib::ustring::compose (M("MAIN_MSG_PATHDOESNTEXIST"), escapeHtmlChars(options.rtSettings.darkFramesPath)) + "\n\n" + M("MAIN_MSG_OPERATIONCANCELLED"); Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.set_title(M("TP_DARKFRAME_LABEL")); @@ -942,7 +990,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) } else { // Target directory creation failed, we clear the flatFieldsPath setting options.rtSettings.flatFieldsPath.clear(); - Glib::ustring msg_ = Glib::ustring::compose (M("MAIN_MSG_PATHDOESNTEXIST"), options.rtSettings.flatFieldsPath) + Glib::ustring msg_ = Glib::ustring::compose (M("MAIN_MSG_PATHDOESNTEXIST"), escapeHtmlChars(options.rtSettings.flatFieldsPath)) + "\n\n" + M("MAIN_MSG_OPERATIONCANCELLED"); Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.set_title(M("TP_FLATFIELD_LABEL")); @@ -972,11 +1020,19 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) } for (size_t i = 0; i < mselected.size(); i++) { - mselected[i]->thumbnail->createProcParamsForUpdate (false, true); + const auto thumbnail = mselected[i]->thumbnail; + const auto rank = thumbnail->getRank(); + const auto colorLabel = thumbnail->getColorLabel(); + const auto stage = thumbnail->getStage(); + + thumbnail->createProcParamsForUpdate (false, true); + thumbnail->setRank(rank); + thumbnail->setColorLabel(colorLabel); + thumbnail->setStage(stage); // Empty run to update the thumb - rtengine::procparams::ProcParams params = mselected[i]->thumbnail->getProcParams (); - mselected[i]->thumbnail->setProcParams (params, nullptr, FILEBROWSER, true, true); + rtengine::procparams::ProcParams params = thumbnail->getProcParams (); + thumbnail->setProcParams (params, nullptr, FILEBROWSER, true, true); } if (!mselected.empty() && bppcl) { @@ -1066,6 +1122,8 @@ void FileBrowser::partPasteProfile () auto toplevel = static_cast (get_toplevel ()); PartialPasteDlg partialPasteDlg (M("PARTIALPASTE_DIALOGLABEL"), toplevel); + partialPasteDlg.updateSpotWidget(clipboard.getPartialProfile().pparams); + int i = partialPasteDlg.run (); if (i == Gtk::RESPONSE_OK) { @@ -1351,6 +1409,19 @@ int FileBrowser::getThumbnailHeight () } } +void FileBrowser::enableTabMode(bool enable) +{ + ThumbBrowserBase::enableTabMode(enable); + if (options.inspectorWindow) { + if (enable) { + inspect->remove_accelerator(pmenu->get_accel_group(), GDK_KEY_f, (Gdk::ModifierType)0); + } + else { + inspect->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_f, (Gdk::ModifierType)0, Gtk::ACCEL_VISIBLE); + } + } +} + void FileBrowser::applyMenuItemActivated (ProfileStoreLabel *label) { MYREADERLOCK(l, entryRW); @@ -1392,6 +1463,8 @@ void FileBrowser::applyPartialMenuItemActivated (ProfileStoreLabel *label) auto toplevel = static_cast (get_toplevel ()); PartialPasteDlg partialPasteDlg (M("PARTIALPASTE_DIALOGLABEL"), toplevel); + partialPasteDlg.updateSpotWidget(srcProfiles->pparams); + if (partialPasteDlg.run() == Gtk::RESPONSE_OK) { MYREADERLOCK(l, entryRW); @@ -1406,6 +1479,7 @@ void FileBrowser::applyPartialMenuItemActivated (ProfileStoreLabel *label) rtengine::procparams::PartialProfile dstProfile(true); *dstProfile.pparams = (static_cast(selected[i]))->thumbnail->getProcParams (); dstProfile.set(true); + dstProfile.pedited->locallab.spots.resize(dstProfile.pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); partialPasteDlg.applyPaste (dstProfile.pparams, dstProfile.pedited, srcProfiles->pparams, srcProfiles->pedited); (static_cast(selected[i]))->thumbnail->setProcParams (*dstProfile.pparams, dstProfile.pedited, FILEBROWSER); dstProfile.deleteInstance(); @@ -1593,6 +1667,18 @@ void FileBrowser::fromTrashRequested (std::vector tbe) applyFilter (filter); } +void FileBrowser::sortMethodRequested (int method) +{ + options.sortMethod = Options::SortMethod(method); + resort (); +} + +void FileBrowser::sortOrderRequested (int order) +{ + options.sortDescending = !!order; + resort (); +} + void FileBrowser::rankingRequested (std::vector tbe, int rank) { @@ -2071,3 +2157,8 @@ void FileBrowser::openRequested( std::vector mselected) tbl->openRequested (entries); } + +void FileBrowser::inspectRequested(std::vector mselected) +{ + getInspector()->showWindow(true); +} diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index 86ab59395..0df1cf9eb 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -56,7 +56,7 @@ public: /* * Class handling actions common to all thumbnails of the file browser */ -class FileBrowser : public ThumbBrowserBase, +class FileBrowser final : public ThumbBrowserBase, public LWButtonListener, public ExportPanelListener, public ProfileStoreListener, @@ -81,10 +81,14 @@ protected: Gtk::MenuItem* remove; Gtk::MenuItem* removeInclProc; Gtk::MenuItem* open; + Gtk::MenuItem* inspect; Gtk::MenuItem* selall; + Gtk::RadioMenuItem* sortMethod[Options::SORT_METHOD_COUNT]; + Gtk::RadioMenuItem* sortOrder[2]; Gtk::MenuItem* copyTo; Gtk::MenuItem* moveTo; + Gtk::MenuItem* menuSort; Gtk::MenuItem* menuRank; Gtk::MenuItem* menuLabel; Gtk::MenuItem* menuFileOperations; @@ -130,12 +134,15 @@ protected: void toTrashRequested (std::vector tbe); void fromTrashRequested (std::vector tbe); + void sortMethodRequested (int method); + void sortOrderRequested (int order); void rankingRequested (std::vector tbe, int rank); void colorlabelRequested (std::vector tbe, int colorlabel); void requestRanking (int rank); void requestColorLabel(int colorlabel); void notifySelectionListener (); void openRequested( std::vector mselected); + void inspectRequested( std::vector mselected); ExportPanel* exportPanel; type_trash_changed m_trash_changed; @@ -180,6 +187,8 @@ public: void saveThumbnailHeight (int height) override; int getThumbnailHeight () override; + + void enableTabMode(bool enable); bool isInTabMode() override { return tbl ? tbl->isInTabMode() : false; diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index 3129e93e2..b89fe340d 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -45,10 +45,8 @@ 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), cropParams(new rtengine::procparams::CropParams), cropgl(nullptr), state(SNormal), crop_custom_ratio(0.f) + : ThumbBrowserEntryBase (fname, thm), 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; - feih = new FileBrowserEntryIdleHelper; feih->fbentry = this; feih->destroyed = false; @@ -116,9 +114,12 @@ void FileBrowserEntry::refreshQuickThumbnailImage () void FileBrowserEntry::calcThumbnailSize () { - if (thumbnail) { - prew = thumbnail->getThumbnailWidth(preh); + int ow = prew, oh = preh; + thumbnail->getThumbnailSize(prew, preh); + if (ow != prew || oh != preh || preview.size() != static_cast(prew * preh * 3)) { + preview.clear(); + } } } @@ -173,10 +174,10 @@ void FileBrowserEntry::customBackBufferUpdate (Cairo::RefPtr c) rtengine::procparams::CropParams cparams = thumbnail->getProcParams().crop; switch (options.cropGuides) { case Options::CROP_GUIDE_NONE: - cparams.guide = "None"; + cparams.guide = rtengine::procparams::CropParams::Guide::NONE; break; case Options::CROP_GUIDE_FRAME: - cparams.guide = "Frame"; + cparams.guide = rtengine::procparams::CropParams::Guide::FRAME; break; default: break; @@ -230,7 +231,7 @@ void FileBrowserEntry::updateImage(rtengine::IImage8* img, double scale, const r --feih->pending; } - img->free(); + delete img; return false; } @@ -255,28 +256,22 @@ void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rten bool rotated = false; if (preh == img->getHeight()) { - const bool resize = !preview || prew != img->getWidth(); prew = img->getWidth (); // Check if image has been rotated since last time - rotated = preview && newLandscape != landscape; + rotated = !preview.empty() && newLandscape != landscape; - if (resize) { - if (preview) { - delete [] preview; - } - preview = new guint8 [prew * preh * 3]; - } - memcpy(preview, img->getData(), prew * preh * 3); + preview.resize(prew * preh * 3); + std::copy(img->getData(), img->getData() + preview.size(), preview.begin()); { - GThreadLock lock; - updateBackBuffer (); + GThreadLock lock; + updateBackBuffer (); } } landscape = newLandscape; - img->free(); + delete img; if (parent) { if (rotated) { @@ -297,7 +292,7 @@ bool FileBrowserEntry::motionNotify (int x, int y) Inspector* inspector = parent->getInspector(); - if (inspector && inspector->isActive() && !parent->isInTabMode()) { + if (inspector && inspector->isActive() && (!parent->isInTabMode() || options.inspectorWindow)) { const rtengine::Coord2D coord(getPosInImgSpace(x, y)); if (coord.x != -1.) { @@ -601,7 +596,7 @@ bool FileBrowserEntry::onArea (CursorArea a, int x, int y) { MYREADERLOCK(l, lockRW); - if (!drawable || !preview) { + if (!drawable || preview.empty()) { return false; } diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index ea5140ed6..67b953514 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -43,7 +43,7 @@ struct FileBrowserEntryIdleHelper { }; class FileThumbnailButtonSet; -class FileBrowserEntry : public ThumbBrowserEntryBase, +class FileBrowserEntry final : public ThumbBrowserEntryBase, public ThumbnailListener, public ThumbImageUpdateListener, public rtengine::NonCopyable diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 109a1bb57..d6c440570 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -42,11 +42,10 @@ #include "pathutils.h" #include "thumbnail.h" #include "toolbar.h" +#include "inspector.h" using namespace std; -#define CHECKTIME 2000 - FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : filepanel(filepanel), selectedDirectoryId(1), @@ -55,6 +54,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : fslistener(nullptr), iatlistener(nullptr), hbToolBar1STB(nullptr), + progressImage(nullptr), + progressLabel(nullptr), hasValidCurrentEFS(false), filterPanel(nullptr), exportPanel(nullptr), @@ -65,6 +66,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : toolBar(tb) { + set_orientation(Gtk::ORIENTATION_VERTICAL); + inTabMode = false; set_name ("FileBrowser"); @@ -77,7 +80,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : set_size_request(0, 250); // construct trash panel with the extra "empty trash" button - trashButtonBox = Gtk::manage( new Gtk::VBox ); + trashButtonBox = Gtk::manage( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); Gtk::Button* emptyT = Gtk::manage( new Gtk::Button ()); emptyT->set_tooltip_markup (M("FILEBROWSER_EMPTYTRASHHINT")); emptyT->set_image (*Gtk::manage(new RTImage ("trash-delete.png"))); @@ -87,7 +90,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : trashButtonBox->show (); //initialize hbToolBar1 - hbToolBar1 = Gtk::manage(new Gtk::HBox ()); + hbToolBar1 = Gtk::manage(new Gtk::Box ()); //setup BrowsePath iRefreshWhite = new RTImage("refresh-small.png"); @@ -96,7 +99,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : BrowsePath = Gtk::manage(new Gtk::Entry ()); BrowsePath->set_width_chars (50); BrowsePath->set_tooltip_markup (M("FILEBROWSER_BROWSEPATHHINT")); - Gtk::HBox* hbBrowsePath = Gtk::manage(new Gtk::HBox ()); + Gtk::Box* hbBrowsePath = Gtk::manage(new Gtk::Box ()); buttonBrowsePath = Gtk::manage(new Gtk::Button ()); buttonBrowsePath->set_image (*iRefreshWhite); buttonBrowsePath->set_tooltip_markup (M("FILEBROWSER_BROWSEPATHBUTTONHINT")); @@ -117,7 +120,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : Query->set_width_chars (20); // TODO !!! add this value to options? Query->set_max_width_chars (20); Query->set_tooltip_markup (M("FILEBROWSER_QUERYHINT")); - Gtk::HBox* hbQuery = Gtk::manage(new Gtk::HBox ()); + Gtk::Box* hbQuery = Gtk::manage(new Gtk::Box ()); buttonQueryClear = Gtk::manage(new Gtk::Button ()); buttonQueryClear->set_image (*iQueryClear); buttonQueryClear->set_tooltip_markup (M("FILEBROWSER_QUERYBUTTONHINT")); @@ -140,7 +143,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : } // setup button bar - buttonBar = Gtk::manage( new Gtk::HBox () ); + buttonBar = Gtk::manage( new Gtk::Box () ); buttonBar->set_name ("ToolBarPanelFileBrowser"); MyScrolledToolbar *stb = Gtk::manage(new MyScrolledToolbar()); stb->set_name("FileBrowserIconToolbar"); @@ -158,7 +161,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : tbLeftPanel_1->signal_toggled().connect( sigc::mem_fun(*this, &FileCatalog::tbLeftPanel_1_toggled) ); buttonBar->pack_start (*tbLeftPanel_1, Gtk::PACK_SHRINK); - vSepiLeftPanel = new Gtk::VSeparator (); + vSepiLeftPanel = new Gtk::Separator(Gtk::ORIENTATION_VERTICAL); buttonBar->pack_start (*vSepiLeftPanel, Gtk::PACK_SHRINK); iFilterClear = new RTImage ("filter-clear.png"); @@ -171,12 +174,12 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bFilterClear->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); bCateg[0] = bFilterClear->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bFilterClear, true)); buttonBar->pack_start (*bFilterClear, Gtk::PACK_SHRINK); - buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); + buttonBar->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK); - fltrVbox1 = Gtk::manage (new Gtk::VBox()); - fltrRankbox = Gtk::manage (new Gtk::HBox()); + fltrVbox1 = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + fltrRankbox = Gtk::manage (new Gtk::Box()); fltrRankbox->get_style_context()->add_class("smallbuttonbox"); - fltrLabelbox = Gtk::manage (new Gtk::HBox()); + fltrLabelbox = Gtk::manage (new Gtk::Box()); fltrLabelbox->get_style_context()->add_class("smallbuttonbox"); iUnRanked = new RTImage ("star-gold-hollow-small.png"); @@ -252,12 +255,12 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bCLabel[3]->set_tooltip_markup (M("FILEBROWSER_SHOWCOLORLABEL4HINT")); bCLabel[4]->set_tooltip_markup (M("FILEBROWSER_SHOWCOLORLABEL5HINT")); - buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); + buttonBar->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK); - fltrVbox2 = Gtk::manage (new Gtk::VBox()); - fltrEditedBox = Gtk::manage (new Gtk::HBox()); + fltrVbox2 = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + fltrEditedBox = Gtk::manage (new Gtk::Box()); fltrEditedBox->get_style_context()->add_class("smallbuttonbox"); - fltrRecentlySavedBox = Gtk::manage (new Gtk::HBox()); + fltrRecentlySavedBox = Gtk::manage (new Gtk::Box()); fltrRecentlySavedBox->get_style_context()->add_class("smallbuttonbox"); // bEdited @@ -314,7 +317,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : fltrVbox2->pack_start (*fltrRecentlySavedBox, Gtk::PACK_SHRINK, 0); buttonBar->pack_start (*fltrVbox2, Gtk::PACK_SHRINK); - buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); + buttonBar->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK); // Trash iTrashShowEmpty = new RTImage("trash-empty-show.png") ; @@ -347,7 +350,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar->pack_start (*bTrash, Gtk::PACK_SHRINK); buttonBar->pack_start (*bNotTrash, Gtk::PACK_SHRINK); buttonBar->pack_start (*bOriginal, Gtk::PACK_SHRINK); - buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); + buttonBar->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK); fileBrowser->trash_changed().connect( sigc::mem_fun(*this, &FileCatalog::trashChanged) ); // 0 - bFilterClear @@ -405,7 +408,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar->pack_start (*exifInfo, Gtk::PACK_SHRINK); // thumbnail zoom - Gtk::HBox* zoomBox = Gtk::manage( new Gtk::HBox () ); + Gtk::Box* zoomBox = Gtk::manage( new Gtk::Box () ); zoomInButton = Gtk::manage( new Gtk::Button () ); zoomInButton->set_image (*Gtk::manage(new RTImage ("magnifier-plus.png"))); zoomInButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomIn)); @@ -420,7 +423,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : zoomBox->pack_end (*zoomOutButton, Gtk::PACK_SHRINK); buttonBar->pack_start (*zoomBox, Gtk::PACK_SHRINK); - buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); + buttonBar->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK); //iRightArrow = new RTImage("right.png"); //iRightArrow_red = new RTImage("right_red.png"); @@ -442,12 +445,12 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar->pack_end (*tbRightPanel_1, Gtk::PACK_SHRINK); buttonBar->pack_end (*coarsePanel, Gtk::PACK_SHRINK); - buttonBar->pack_end (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + buttonBar->pack_end (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK, 4); buttonBar->pack_end (*toolBar, Gtk::PACK_SHRINK); - buttonBar->pack_end (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + buttonBar->pack_end (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK, 4); // add default panel - hBox = Gtk::manage( new Gtk::HBox () ); + hBox = Gtk::manage( new Gtk::Box () ); hBox->show (); hBox->pack_end (*fileBrowser); hBox->set_name ("FilmstripPanel"); @@ -524,7 +527,7 @@ void FileCatalog::exifInfoButtonToggled() void FileCatalog::on_realize() { - Gtk::VBox::on_realize(); + Gtk::Box::on_realize(); Pango::FontDescription fontd = get_pango_context()->get_font_description (); fileBrowser->get_pango_context()->set_font_description (fontd); // batchQueue->get_pango_context()->set_font_description (fontd); @@ -705,35 +708,38 @@ void FileCatalog::_refreshProgressBar () // The second, usually longer pass is done multithreaded down in the single entries and is NOT measured by this if (!inTabMode && (!previewsToLoad || std::floor(100.f * previewsLoaded / previewsToLoad) != std::floor(100.f * (previewsLoaded - 1) / previewsToLoad))) { 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 (!progressImage || !progressLabel) { + // create tab label once + Gtk::Notebook *nb = (Gtk::Notebook *)(filepanel->get_parent()); + Gtk::Grid* grid = Gtk::manage(new Gtk::Grid()); + progressImage = Gtk::manage(new RTImage("folder-closed.png")); + progressLabel = Gtk::manage(new Gtk::Label(M("MAIN_FRAME_FILEBROWSER"))); + grid->attach_next_to(*progressImage, options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*progressLabel, options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); + grid->set_tooltip_markup(M("MAIN_FRAME_FILEBROWSER_TOOLTIP")); + grid->show_all(); + if (options.mainNBVertical) { + progressLabel->set_angle(90); + } + if (nb) { + nb->set_tab_label(*filepanel, *grid); + } + } if (!previewsToLoad) { - grid->attach_next_to(*Gtk::manage(new RTImage("folder-closed.png")), options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); + progressImage->changeImage("folder-closed.png"); int filteredCount = min(fileBrowser->getNumFiltered(), previewsLoaded); - - label = Gtk::manage(new Gtk::Label(M("MAIN_FRAME_FILEBROWSER") + - (filteredCount != previewsLoaded ? " [" + Glib::ustring::format(filteredCount) + "/" : " (") - + Glib::ustring::format(previewsLoaded) + - (filteredCount != previewsLoaded ? "]" : ")"))); + progressLabel->set_text(M("MAIN_FRAME_FILEBROWSER") + + (filteredCount != previewsLoaded ? " [" + Glib::ustring::format(filteredCount) + "/" : " (") + + Glib::ustring::format(previewsLoaded) + + (filteredCount != previewsLoaded ? "]" : ")")); } else { - 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 ) + "%]" )); + progressImage->changeImage("magnifier.png"); + progressLabel->set_text(M("MAIN_FRAME_FILEBROWSER") + " [" + + Glib::ustring::format(previewsLoaded) + "/" + + Glib::ustring::format(previewsToLoad) + "]" ); filepanel->loadingThumbs("", (double)previewsLoaded / previewsToLoad); } - - if (options.mainNBVertical) { - label->set_angle(90); - } - - grid->attach_next_to(*label, options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); - grid->set_tooltip_markup(M("MAIN_FRAME_FILEBROWSER_TOOLTIP")); - grid->show_all(); - - if (nb) { - nb->set_tab_label(*filepanel, *grid); - } } } @@ -1209,9 +1215,13 @@ void FileCatalog::developRequested(const std::vector& tbe, bo if (params.resize.enabled) { params.resize.width = rtengine::min(params.resize.width, options.fastexport_resize_width); params.resize.height = rtengine::min(params.resize.height, options.fastexport_resize_height); + params.resize.longedge = rtengine::min(params.resize.longedge, options.fastexport_resize_longedge); + params.resize.shortedge = rtengine::min(params.resize.shortedge, options.fastexport_resize_shortedge); } else { params.resize.width = options.fastexport_resize_width; params.resize.height = options.fastexport_resize_height; + params.resize.longedge = options.fastexport_resize_longedge; + params.resize.shortedge = options.fastexport_resize_shortedge; } params.resize.enabled = options.fastexport_resize_enabled; @@ -1224,8 +1234,9 @@ void FileCatalog::developRequested(const std::vector& tbe, bo rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (fbe->filename, th->getType() == FT_Raw, params, fastmode && options.fastexport_use_fast_pipeline); - const int ph = BatchQueue::calcMaxThumbnailHeight(); - const int pw = th->getThumbnailWidth(ph); + int pw; + int ph = BatchQueue::calcMaxThumbnailHeight(); + th->getThumbnailSize (pw, ph); // processThumbImage is the processing intensive part, but adding to queue must be ordered //#pragma omp ordered @@ -1272,7 +1283,7 @@ void FileCatalog::renameRequested(const std::vector& tbe) /* check if filename already exists*/ if (Glib::file_test (nfname, Glib::FILE_TEST_EXISTS)) { - Glib::ustring msg_ = Glib::ustring("") + nfname + ": " + M("MAIN_MSG_ALREADYEXISTS") + ""; + Glib::ustring msg_ = Glib::ustring("") + escapeHtmlChars(nfname) + ": " + M("MAIN_MSG_ALREADYEXISTS") + ""; Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); } else { @@ -2443,6 +2454,8 @@ bool FileCatalog::handleShortcutKey (GdkEventKey* event) case GDK_KEY_underscore: zoomOut(); return true; + default: // do nothing, avoids a cppcheck false positive + break; } } @@ -2503,9 +2516,37 @@ bool FileCatalog::handleShortcutKey (GdkEventKey* event) } } + if (!ctrl && !alt) { + switch (event->keyval) { + case GDK_KEY_f: + fileBrowser->getInspector()->showWindow(false, true); + return true; + case GDK_KEY_F: + fileBrowser->getInspector()->showWindow(false, false); + return true; + } + } + return fileBrowser->keyPressed(event); } +bool FileCatalog::handleShortcutKeyRelease(GdkEventKey* event) +{ + bool ctrl = event->state & GDK_CONTROL_MASK; + bool alt = event->state & GDK_MOD1_MASK; + + if (!ctrl && !alt) { + switch (event->keyval) { + case GDK_KEY_f: + case GDK_KEY_F: + fileBrowser->getInspector()->hideWindow(); + return true; + } + } + + return false; +} + void FileCatalog::showToolBar() { if (hbToolBar1STB) { diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 8f7e5618f..23d56af73 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -43,7 +43,7 @@ class ToolBar; * - handling the thumbnail toolbar, * - monitoring the directory (for any change) */ -class FileCatalog : public Gtk::VBox, +class FileCatalog final : public Gtk::Box, public PreviewLoaderListener, public FilterPanelListener, public FileBrowserListener, @@ -55,7 +55,7 @@ public: private: FilePanel* filepanel; - Gtk::HBox* hBox; + Gtk::Box* hBox; Glib::ustring selectedDirectory; int selectedDirectoryId; bool enabled; @@ -69,19 +69,19 @@ private: ImageAreaToolListener* iatlistener; DirSelectionSlot selectDir; - Gtk::HBox* buttonBar; - Gtk::HBox* hbToolBar1; + Gtk::Box* buttonBar; + Gtk::Box* hbToolBar1; MyScrolledToolbar* hbToolBar1STB; - Gtk::HBox* fltrRankbox; - Gtk::HBox* fltrLabelbox; - Gtk::VBox* fltrVbox1; + Gtk::Box* fltrRankbox; + Gtk::Box* fltrLabelbox; + Gtk::Box* fltrVbox1; - Gtk::HBox* fltrEditedBox; - Gtk::HBox* fltrRecentlySavedBox; - Gtk::VBox* fltrVbox2; + Gtk::Box* fltrEditedBox; + Gtk::Box* fltrRecentlySavedBox; + Gtk::Box* fltrVbox2; - Gtk::VSeparator* vSepiLeftPanel; + Gtk::Separator* vSepiLeftPanel; Gtk::ToggleButton* tbLeftPanel_1; Gtk::ToggleButton* tbRightPanel_1; @@ -119,11 +119,14 @@ private: double vScrollPos[18]; int lastScrollPos; - Gtk::VBox* trashButtonBox; + Gtk::Box* trashButtonBox; Gtk::Button* zoomInButton; Gtk::Button* zoomOutButton; + RTImage* progressImage; + Gtk::Label* progressLabel; + MyMutex dirEFSMutex; ExifFilterSettings dirEFS; ExifFilterSettings currentEFS; @@ -273,6 +276,7 @@ public: void openNextPreviousEditorImage (Glib::ustring fname, bool clearFilters, eRTNav nextPrevious); bool handleShortcutKey (GdkEventKey* event); + bool handleShortcutKeyRelease(GdkEventKey *event); bool CheckSidePanelsVisibility(); void toggleSidePanels(); diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index 1a66aed7c..adcd6985d 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -34,7 +34,7 @@ FilePanel::FilePanel () : parent(nullptr), error(0) { // Contains everything except for the batch Tool Panel and tabs (Fast Export, Inspect, etc) - dirpaned = Gtk::manage ( new Gtk::HPaned () ); + dirpaned = Gtk::manage ( new Gtk::Paned () ); dirpaned->set_position (options.dirBrowserWidth); // The directory tree @@ -45,12 +45,12 @@ FilePanel::FilePanel () : parent(nullptr), error(0) recentBrowser = Gtk::manage ( new RecentBrowser () ); // The whole left panel. Contains Places, Recent Folders and Folders. - placespaned = Gtk::manage ( new Gtk::VPaned () ); + placespaned = Gtk::manage ( new Gtk::Paned (Gtk::ORIENTATION_VERTICAL) ); placespaned->set_name ("PlacesPaned"); placespaned->set_size_request(250, 100); placespaned->set_position (options.dirBrowserHeight); - Gtk::VBox* obox = Gtk::manage (new Gtk::VBox ()); + Gtk::Box* obox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); obox->get_style_context()->add_class ("plainback"); obox->pack_start (*recentBrowser, Gtk::PACK_SHRINK, 4); obox->pack_start (*dirBrowser); @@ -79,11 +79,11 @@ FilePanel::FilePanel () : parent(nullptr), error(0) recentBrowser->setDirSelector (sigc::mem_fun (dirBrowser, &DirBrowser::selectDir)); fileCatalog->setFileSelectionListener (this); - rightBox = Gtk::manage ( new Gtk::HBox () ); + rightBox = Gtk::manage ( new Gtk::Box () ); rightBox->set_size_request(350, 100); rightNotebook = Gtk::manage ( new Gtk::Notebook () ); rightNotebookSwitchConn = rightNotebook->signal_switch_page().connect_notify( sigc::mem_fun(*this, &FilePanel::on_NB_switch_page) ); - //Gtk::VBox* taggingBox = Gtk::manage ( new Gtk::VBox () ); + //Gtk::Box* taggingBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); history = Gtk::manage ( new History (false) ); @@ -115,9 +115,12 @@ FilePanel::FilePanel () : parent(nullptr), error(0) Gtk::Label* devLab = Gtk::manage ( new Gtk::Label (M("MAIN_TAB_DEVELOP")) ); devLab->set_name ("LabelRightNotebook"); devLab->set_angle (90); - Gtk::Label* inspectLab = Gtk::manage ( new Gtk::Label (M("MAIN_TAB_INSPECT")) ); - inspectLab->set_name ("LabelRightNotebook"); - inspectLab->set_angle (90); + Gtk::Label* inspectLab = nullptr; + if (!options.inspectorWindow) { + inspectLab = Gtk::manage ( new Gtk::Label (M("MAIN_TAB_INSPECT")) ); + inspectLab->set_name ("LabelRightNotebook"); + inspectLab->set_angle (90); + } Gtk::Label* filtLab = Gtk::manage ( new Gtk::Label (M("MAIN_TAB_FILTER")) ); filtLab->set_name ("LabelRightNotebook"); filtLab->set_angle (90); @@ -127,12 +130,13 @@ FilePanel::FilePanel () : parent(nullptr), error(0) exportLab->set_name ("LabelRightNotebook"); exportLab->set_angle (90); - tpcPaned = Gtk::manage ( new Gtk::VPaned () ); + tpcPaned = Gtk::manage ( new Gtk::Paned (Gtk::ORIENTATION_VERTICAL) ); tpcPaned->pack1 (*tpc->toolPanelNotebook, false, true); tpcPaned->pack2 (*history, true, false); rightNotebook->append_page (*sFilterPanel, *filtLab); - rightNotebook->append_page (*inspectorPanel, *inspectLab); + if (!options.inspectorWindow) + rightNotebook->append_page (*inspectorPanel, *inspectLab); rightNotebook->append_page (*tpcPaned, *devLab); //rightNotebook->append_page (*taggingBox, *tagLab); commented out: currently the tab is empty ... rightNotebook->append_page (*sExportPanel, *exportLab); @@ -173,7 +177,7 @@ FilePanel::~FilePanel () void FilePanel::on_realize () { - Gtk::HPaned::on_realize (); + Gtk::Paned::on_realize (); tpc->closeAllTools(); } @@ -300,7 +304,8 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector 0 && winGdiHandles <= 8500) // 0 means we don't have the rights to access the function, 8500 because the limit is 10000 and we need about 1500 free handles + if(winGdiHandles > 0 && winGdiHandles <= 6500) //(old settings 8500) 0 means we don't have the rights to access the function, 8500 because the limit is 10000 and we need about 1500 free handles + //J.Desmis october 2021 I change 8500 to 6500..Why ? because without while increasing size GUI system crash in multieditor #endif { GThreadLock lock; // Acquiring the GUI... not sure that it's necessary, but it shouldn't harm @@ -309,7 +314,7 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector") + M("MAIN_MSG_CANNOTLOAD") + " \"" + thm->getFileName() + "\" .\n" + M("MAIN_MSG_TOOMANYOPENEDITORS") + ""; + Glib::ustring msg_ = Glib::ustring("") + M("MAIN_MSG_CANNOTLOAD") + " \"" + escapeHtmlChars(thm->getFileName()) + "\" .\n" + M("MAIN_MSG_TOOMANYOPENEDITORS") + ""; Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); goto MAXGDIHANDLESREACHED; @@ -330,7 +335,7 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnectorset_title_decorated(pl->thm->getFileName()); } } else { - Glib::ustring msg_ = Glib::ustring("") + M("MAIN_MSG_CANNOTLOAD") + " \"" + thm->getFileName() + "\" .\n"; + Glib::ustring msg_ = Glib::ustring("") + M("MAIN_MSG_CANNOTLOAD") + " \"" + escapeHtmlChars(thm->getFileName()) + "\" .\n"; Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); } @@ -408,6 +413,15 @@ bool FilePanel::handleShortcutKey (GdkEventKey* event) return false; } +bool FilePanel::handleShortcutKeyRelease(GdkEventKey *event) +{ + if(fileCatalog->handleShortcutKeyRelease(event)) { + return true; + } + + return false; +} + void FilePanel::loadingThumbs(Glib::ustring str, double rate) { GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected @@ -423,3 +437,11 @@ void FilePanel::updateTPVScrollbar (bool hide) { tpc->updateTPVScrollbar (hide); } + +void FilePanel::updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools) +{ + if (tpc) { + tpc->updateToolLocations(favorites, cloneFavoriteTools); + } +} diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index cbfe8e53e..4a006f002 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -37,7 +37,7 @@ class RTWindow; class DirBrowser; class FilePanel final : - public Gtk::HPaned, + public Gtk::Paned, public FileSelectionListener, public rtengine::NonCopyable { @@ -46,9 +46,9 @@ public: ~FilePanel () override; Gtk::Paned* placespaned; - Gtk::HPaned* dirpaned; + Gtk::Paned* dirpaned; - Gtk::HBox* rightBox; + Gtk::Box* rightBox; DirBrowser* dirBrowser; FilterPanel* filterPanel; @@ -81,7 +81,10 @@ public: bool imageLoaded( Thumbnail* thm, ProgressConnector * ); bool handleShortcutKey (GdkEventKey* event); + bool handleShortcutKeyRelease(GdkEventKey *event); void updateTPVScrollbar (bool hide); + void updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools); private: void on_NB_switch_page(Gtk::Widget* page, guint page_num); @@ -90,7 +93,7 @@ private: RecentBrowser* recentBrowser; Inspector* inspectorPanel; - Gtk::VPaned* tpcPaned; + Gtk::Paned* tpcPaned; BatchToolPanelCoordinator* tpc; History* history; RTWindow* parent; diff --git a/rtgui/filmnegative.cc b/rtgui/filmnegative.cc index 90cedf148..4f1ae9311 100644 --- a/rtgui/filmnegative.cc +++ b/rtgui/filmnegative.cc @@ -26,45 +26,206 @@ #include "rtimage.h" #include "../rtengine/procparams.h" +#include "../rtengine/color.h" + +const Glib::ustring FilmNegative::TOOL_NAME = "filmnegative"; namespace { -Adjuster* createExponentAdjuster(AdjusterListener* listener, const Glib::ustring& label, double minV, double maxV, double defaultVal) +/** + * Observer to use for displaying the temperature and tint equivalent of the + * multipliers. + */ +constexpr rtengine::StandardObserver standard_observer = rtengine::ColorTemp::DEFAULT_OBSERVER; + +double toAdjuster(double v) { - Adjuster* const adj = Gtk::manage(new Adjuster(label, minV, maxV, 0.001, defaultVal)); + return CLAMP(std::log2(v), 6, 16) - 6; +} + +double fromAdjuster(double v) +{ + return std::pow(2, v + 6); +} + +Adjuster* createExponentAdjuster(AdjusterListener* listener, const Glib::ustring& label, double minV, double maxV, double step, double defaultVal) +{ + Adjuster* const adj = Gtk::manage(new Adjuster(label, minV, maxV, step, defaultVal)); adj->setAdjusterListener(listener); adj->setLogScale(6, 1, true); - if (adj->delay < options.adjusterMaxDelay) { - adj->delay = options.adjusterMaxDelay; - } + adj->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); adj->show(); return adj; } +Adjuster* createLevelAdjuster(AdjusterListener* listener, const Glib::ustring& label) +{ +// Adjuster* const adj = Gtk::manage(new Adjuster(label, 1.0, 65535.0, 1.0, rtengine::MAXVALF / 24.)); + Adjuster* const adj = Gtk::manage(new Adjuster(label, 0.0, 10.0, 0.01, toAdjuster(rtengine::MAXVALF / 24.))); + adj->setAdjusterListener(listener); +// adj->setLogScale(6, 1000.0, true); + + adj->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + + adj->show(); + return adj; +} + +Adjuster* createBalanceAdjuster(AdjusterListener* listener, const Glib::ustring& label, double minV, double maxV, double defaultVal, + const Glib::ustring& leftIcon, const Glib::ustring& rightIcon) +{ + Adjuster* const adj = Gtk::manage(new Adjuster(label, minV, maxV, 0.01, defaultVal, + Gtk::manage(new RTImage(leftIcon)), Gtk::manage(new RTImage(rightIcon)))); + adj->setAdjusterListener(listener); + adj->setLogScale(9, 0, true); + + adj->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + + adj->show(); + return adj; +} + + +Glib::ustring fmt(const RGB& rgb) +{ + if (rgb.r <= 0.f && rgb.g <= 0.f && rgb.b <= 0.f) { + return "- - -"; + } else { + return Glib::ustring::format(std::fixed, std::setprecision(1), rgb.r) + " " + + Glib::ustring::format(std::fixed, std::setprecision(1), rgb.g) + " " + + Glib::ustring::format(std::fixed, std::setprecision(1), rgb.b); + } +} + + +RGB getFilmNegativeExponents(const RGB &ref1, const RGB &ref2) // , const RGB &clearValsOut, const RGB &denseValsOut) +{ + using rtengine::settings; + + RGB clearVals = ref1; + RGB denseVals = ref2; + + // Detect which one is the dense spot, based on green channel + if (clearVals.g < denseVals.g) { + std::swap(clearVals, denseVals); + //std::swap(clearValsOut, denseValsOut); + } + + if (settings->verbose) { + printf("Clear input values: R=%g G=%g B=%g\n", static_cast(clearVals.r), static_cast(clearVals.g), static_cast(clearVals.b)); + printf("Dense input values: R=%g G=%g B=%g\n", static_cast(denseVals.r), static_cast(denseVals.g), static_cast(denseVals.b)); + + // printf("Clear output values: R=%g G=%g B=%g\n", static_cast(clearValsOut.r), static_cast(clearValsOut.g), static_cast(clearValsOut.b)); + // printf("Dense output values: R=%g G=%g B=%g\n", static_cast(denseValsOut.r), static_cast(denseValsOut.g), static_cast(denseValsOut.b)); + } + + const float denseGreenRatio = clearVals.g / denseVals.g; + + // Calculate logarithms in arbitrary base + const auto logBase = + [](float base, float num) -> float + { + return std::log(num) / std::log(base); + }; + + // const auto ratio = + // [](float a, float b) -> float + // { + // return a > b ? a / b : b / a; + // }; + + RGB newExps; + newExps.r = logBase(clearVals.r / denseVals.r, denseGreenRatio); + newExps.g = 1.f; // logBase(ratio(clearVals.g, denseVals.g), ratio(denseValsOut.g, clearValsOut.g) ); + newExps.b = logBase(clearVals.b / denseVals.b, denseGreenRatio); + + + + if (settings->verbose) { + printf("New exponents: R=%g G=%g B=%g\n", static_cast(newExps.r), static_cast(newExps.g), static_cast(newExps.b)); + } + + // // Re-adjust color balance based on dense spot values and new exponents + // calcBalance(rtengine::max(static_cast(params->filmNegative.refInput.g), 1.f), + // -newExps[0], -newExps[1], -newExps[2], + // denseVals[0], denseVals[1], denseVals[2], + // rBal, bBal); + + return newExps; + +} + +void temp2rgb(double outLev, double temp, double green, RGB &refOut) +{ + rtengine::ColorTemp ct = rtengine::ColorTemp(temp, green, 1., "Custom", standard_observer); + + double rm, gm, bm; + ct.getMultipliers(rm, gm, bm); + + double maxGain = rtengine::max(rm, gm, bm); + + refOut.r = (rm / maxGain) * outLev; + refOut.g = (gm / maxGain) * outLev; + refOut.b = (bm / maxGain) * outLev; +} + + +void rgb2temp(const RGB &refOut, double &outLev, double &temp, double &green) +{ + double maxVal = rtengine::max(refOut.r, refOut.g, refOut.b); + + rtengine::ColorTemp ct = rtengine::ColorTemp( + refOut.r / maxVal, + refOut.g / maxVal, + refOut.b / maxVal, + 1., + standard_observer); + + outLev = maxVal; + temp = ct.getTemp(); + green = ct.getGreen(); +} + + } FilmNegative::FilmNegative() : - FoldableToolPanel(this, "filmnegative", M("TP_FILMNEGATIVE_LABEL"), false, true), + FoldableToolPanel(this, TOOL_NAME, M("TP_FILMNEGATIVE_LABEL"), false, true), EditSubscriber(ET_OBJECTS), - evFilmNegativeExponents(ProcEventMapper::getInstance()->newEvent(FIRST, "HISTORY_MSG_FILMNEGATIVE_VALUES")), - evFilmNegativeEnabled(ProcEventMapper::getInstance()->newEvent(FIRST, "HISTORY_MSG_FILMNEGATIVE_ENABLED")), + NEUTRAL_TEMP(rtengine::ColorTemp(1., 1., 1., 1., rtengine::ColorTemp::DEFAULT_OBSERVER)), + evFilmNegativeExponents(ProcEventMapper::getInstance()->newEvent(ALLNORAW, "HISTORY_MSG_FILMNEGATIVE_VALUES")), + evFilmNegativeEnabled(ProcEventMapper::getInstance()->newEvent(ALLNORAW, "HISTORY_MSG_FILMNEGATIVE_ENABLED")), + evFilmNegativeRefSpot(ProcEventMapper::getInstance()->newEvent(ALLNORAW, "HISTORY_MSG_FILMNEGATIVE_REF_SPOT")), + evFilmNegativeBalance(ProcEventMapper::getInstance()->newEvent(ALLNORAW, "HISTORY_MSG_FILMNEGATIVE_BALANCE")), + evFilmNegativeColorSpace(ProcEventMapper::getInstance()->newEvent(ALLNORAW, "HISTORY_MSG_FILMNEGATIVE_COLORSPACE")), + refInputValues({0.f, 0.f, 0.f}), + paramsUpgraded(false), + refLuminance({{0.f, 0.f, 0.f}, 0.f}), fnp(nullptr), - greenExp(createExponentAdjuster(this, M("TP_FILMNEGATIVE_GREEN"), 0.3, 4, 1.5)), // master exponent (green channel) - redRatio(createExponentAdjuster(this, M("TP_FILMNEGATIVE_RED"), 0.3, 3, (2.04 / 1.5))), // ratio of red exponent to master exponent - blueRatio(createExponentAdjuster(this, M("TP_FILMNEGATIVE_BLUE"), 0.3, 3, (1.29 / 1.5))), // ratio of blue exponent to master exponent - spotgrid(Gtk::manage(new Gtk::Grid())), - spotbutton(Gtk::manage(new Gtk::ToggleButton(M("TP_FILMNEGATIVE_PICK")))) + colorSpace(Gtk::manage(new MyComboBoxText())), + greenExp(createExponentAdjuster(this, M("TP_FILMNEGATIVE_GREEN"), 0.3, 4, 0.01, 1.5)), // master exponent (green channel) + redRatio(createExponentAdjuster(this, M("TP_FILMNEGATIVE_RED"), 0.3, 5, 0.01, (2.04 / 1.5))), // ratio of red exponent to master exponent + blueRatio(createExponentAdjuster(this, M("TP_FILMNEGATIVE_BLUE"), 0.3, 5, 0.01, (1.29 / 1.5))), // ratio of blue exponent to master exponent + spotButton(Gtk::manage(new Gtk::ToggleButton(M("TP_FILMNEGATIVE_PICK")))), + refInputLabel(Gtk::manage(new Gtk::Label(Glib::ustring::compose(M("TP_FILMNEGATIVE_REF_LABEL"), "- - -")))), + refSpotButton(Gtk::manage(new Gtk::ToggleButton(M("TP_FILMNEGATIVE_REF_PICK")))), + outputLevel(createLevelAdjuster(this, M("TP_FILMNEGATIVE_OUT_LEVEL"))), // ref level + greenBalance(createBalanceAdjuster(this, M("TP_FILMNEGATIVE_GREENBALANCE"), -3.0, 3.0, 0.0, "circle-magenta-small.png", "circle-green-small.png")), // green balance + blueBalance(createBalanceAdjuster(this, M("TP_FILMNEGATIVE_BLUEBALANCE"), -3.0, 3.0, 0.0, "circle-blue-small.png", "circle-yellow-small.png")) // blue balance { - spotgrid->get_style_context()->add_class("grid-spacing"); - setExpandAlignProperties(spotgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + setExpandAlignProperties(spotButton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + spotButton->get_style_context()->add_class("independent"); + spotButton->set_tooltip_text(M("TP_FILMNEGATIVE_GUESS_TOOLTIP")); + spotButton->set_image(*Gtk::manage(new RTImage("color-picker-small.png"))); - setExpandAlignProperties(spotbutton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - spotbutton->get_style_context()->add_class("independent"); - spotbutton->set_tooltip_text(M("TP_FILMNEGATIVE_GUESS_TOOLTIP")); - spotbutton->set_image (*Gtk::manage (new RTImage ("color-picker-small.png"))); + refSpotButton->set_tooltip_text(M("TP_FILMNEGATIVE_REF_TOOLTIP")); + + setExpandAlignProperties(refInputLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); +// refInputLabel->set_justify(Gtk::Justification::JUSTIFY_CENTER); +// refInputLabel->set_line_wrap(true); // TODO make spot size configurable ? @@ -81,22 +242,58 @@ FilmNegative::FilmNegative() : // spotsize->set_active(0); // spotsize->append ("4"); - spotgrid->attach (*spotbutton, 0, 1, 1, 1); + // spotgrid->attach(*spotButton, 0, 1, 1, 1); // spotgrid->attach (*slab, 1, 0, 1, 1); // spotgrid->attach (*wbsizehelper, 2, 0, 1, 1); + colorSpace->append(M("TP_FILMNEGATIVE_COLORSPACE_INPUT")); + colorSpace->append(M("TP_FILMNEGATIVE_COLORSPACE_WORKING")); + setExpandAlignProperties(colorSpace, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + colorSpace->set_tooltip_markup(M("TP_FILMNEGATIVE_COLORSPACE_TOOLTIP")); + + Gtk::Grid* csGrid = Gtk::manage(new Gtk::Grid()); + Gtk::Label* csLabel = Gtk::manage(new Gtk::Label(M("TP_FILMNEGATIVE_COLORSPACE"))); + csGrid->attach(*csLabel, 0, 0, 1, 1); + csGrid->attach(*colorSpace, 1, 0, 1, 1); + + pack_start(*csGrid); + + colorSpace->set_active((int)ColorSpace::WORKING); + colorSpace->signal_changed().connect(sigc::mem_fun(*this, &FilmNegative::colorSpaceChanged)); + colorSpace->show(); + pack_start(*greenExp, Gtk::PACK_SHRINK, 0); pack_start(*redRatio, Gtk::PACK_SHRINK, 0); pack_start(*blueRatio, Gtk::PACK_SHRINK, 0); - pack_start(*spotgrid, Gtk::PACK_SHRINK, 0); + pack_start(*spotButton, Gtk::PACK_SHRINK, 0); - spotbutton->signal_toggled().connect(sigc::mem_fun(*this, &FilmNegative::editToggled)); +// pack_start(*oldMethod, Gtk::PACK_SHRINK, 0); + + Gtk::Separator* const sep = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + sep->get_style_context()->add_class("grid-row-separator"); + pack_start(*sep, Gtk::PACK_SHRINK, 0); + +// Gtk::Grid* const fbGrid = Gtk::manage(new Gtk::Grid()); +// fbGrid->attach(*refInputLabel, 0, 0, 1, 1); +// fbGrid->attach(*filmBaseValuesLabel, 1, 0, 1, 1); +// pack_start(*fbGrid, Gtk::PACK_SHRINK, 0); + pack_start(*refInputLabel, Gtk::PACK_SHRINK, 0); + + pack_start(*outputLevel, Gtk::PACK_SHRINK, 0); + pack_start(*blueBalance, Gtk::PACK_SHRINK, 0); + pack_start(*greenBalance, Gtk::PACK_SHRINK, 0); + + pack_start(*refSpotButton, Gtk::PACK_SHRINK, 0); + + spotButton->signal_toggled().connect(sigc::mem_fun(*this, &FilmNegative::editToggled)); // spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) ); + refSpotButton->signal_toggled().connect(sigc::mem_fun(*this, &FilmNegative::refSpotToggled)); + // Editing geometry; create the spot rectangle Rectangle* const spotRect = new Rectangle(); spotRect->filled = false; - + visibleGeometry.push_back(spotRect); // Stick a dummy rectangle over the whole image in mouseOverGeometry. @@ -109,6 +306,8 @@ FilmNegative::FilmNegative() : FilmNegative::~FilmNegative() { + idle_register.destroy(); + for (auto geometry : visibleGeometry) { delete geometry; } @@ -118,6 +317,26 @@ FilmNegative::~FilmNegative() } } + +void FilmNegative::readOutputSliders(RGB &refOut) +{ + temp2rgb(fromAdjuster(outputLevel->getValue()), + NEUTRAL_TEMP.getTemp() / std::pow(2., blueBalance->getValue()), + NEUTRAL_TEMP.getGreen() / std::pow(2., greenBalance->getValue()), + refOut); +} + +void FilmNegative::writeOutputSliders(const RGB &refOut) +{ + double outLev, cTemp, green; + rgb2temp(refOut, outLev, cTemp, green); + + outputLevel->setValue(toAdjuster(outLev)); + blueBalance->setValue(std::log2(NEUTRAL_TEMP.getTemp() / cTemp)); + greenBalance->setValue(std::log2(NEUTRAL_TEMP.getGreen() / green)); +} + + void FilmNegative::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { disableListener(); @@ -126,30 +345,82 @@ void FilmNegative::read(const rtengine::procparams::ProcParams* pp, const Params redRatio->setEditedState(pedited->filmNegative.redRatio ? Edited : UnEdited); greenExp->setEditedState(pedited->filmNegative.greenExp ? Edited : UnEdited); blueRatio->setEditedState(pedited->filmNegative.blueRatio ? Edited : UnEdited); + outputLevel->setEditedState(pedited->filmNegative.refOutput ? Edited : UnEdited); + greenBalance->setEditedState(pedited->filmNegative.refOutput ? Edited : UnEdited); + blueBalance->setEditedState(pedited->filmNegative.refOutput ? Edited : UnEdited); set_inconsistent(multiImage && !pedited->filmNegative.enabled); } setEnabled(pp->filmNegative.enabled); + + // Reset luminance reference each time params are read + refLuminance.lum = 0.f; + + colorSpace->set_active(CLAMP((int)pp->filmNegative.colorSpace, 0, 1)); redRatio->setValue(pp->filmNegative.redRatio); greenExp->setValue(pp->filmNegative.greenExp); blueRatio->setValue(pp->filmNegative.blueRatio); + refInputValues = pp->filmNegative.refInput; + + // If reference input values are not set in params, estimated values will be passed in later + // (after processing) via FilmNegListener + refInputLabel->set_markup( + Glib::ustring::compose(M("TP_FILMNEGATIVE_REF_LABEL"), fmt(refInputValues))); + + if (pp->filmNegative.backCompat == BackCompat::CURRENT) { + outputLevel->show(); + blueBalance->show(); + greenBalance->show(); + } else { + outputLevel->hide(); + blueBalance->hide(); + greenBalance->hide(); + } + + // If reference output values are not set in params, set the default output + // chosen for median estimation: gray 1/24th of max + if (pp->filmNegative.refOutput.r <= 0) { + float gray = rtengine::MAXVALF / 24.f; + writeOutputSliders({gray, gray, gray}); + } else { + writeOutputSliders(pp->filmNegative.refOutput); + } + enableListener(); } void FilmNegative::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) { + if (colorSpace->get_active_row_number() != 3) { // UNCHANGED entry, see setBatchMode + pp->filmNegative.colorSpace = rtengine::procparams::FilmNegativeParams::ColorSpace(colorSpace->get_active_row_number()); + } + pp->filmNegative.redRatio = redRatio->getValue(); pp->filmNegative.greenExp = greenExp->getValue(); pp->filmNegative.blueRatio = blueRatio->getValue(); + pp->filmNegative.enabled = getEnabled(); if (pedited) { + pedited->filmNegative.colorSpace = colorSpace->get_active_row_number() != 3; // UNCHANGED entry, see setBatchMode pedited->filmNegative.redRatio = redRatio->getEditedState(); pedited->filmNegative.greenExp = greenExp->getEditedState(); pedited->filmNegative.blueRatio = blueRatio->getEditedState(); + pedited->filmNegative.refOutput = outputLevel->getEditedState() || greenBalance->getEditedState() || blueBalance->getEditedState(); + // In batch mode, make sure refinput is always updated together with the balance sliders + pedited->filmNegative.refInput = pedited->filmNegative.refOutput || (refInputValues != pp->filmNegative.refInput); pedited->filmNegative.enabled = !get_inconsistent(); } + + pp->filmNegative.refInput = refInputValues; + + readOutputSliders(pp->filmNegative.refOutput); + + if (paramsUpgraded) { + pp->filmNegative.backCompat = BackCompat::CURRENT; + } + } void FilmNegative::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) @@ -158,44 +429,73 @@ void FilmNegative::setDefaults(const rtengine::procparams::ProcParams* defParams greenExp->setValue(defParams->filmNegative.greenExp); blueRatio->setValue(defParams->filmNegative.blueRatio); + float gray = rtengine::MAXVALF / 24.f; + writeOutputSliders({gray, gray, gray}); + if (pedited) { redRatio->setDefaultEditedState(pedited->filmNegative.redRatio ? Edited : UnEdited); greenExp->setDefaultEditedState(pedited->filmNegative.greenExp ? Edited : UnEdited); blueRatio->setDefaultEditedState(pedited->filmNegative.blueRatio ? Edited : UnEdited); + + outputLevel->setDefaultEditedState(pedited->filmNegative.refOutput ? Edited : UnEdited); + greenBalance->setDefaultEditedState(pedited->filmNegative.refOutput ? Edited : UnEdited); + blueBalance->setDefaultEditedState(pedited->filmNegative.refOutput ? Edited : UnEdited); } else { redRatio->setDefaultEditedState(Irrelevant); greenExp->setDefaultEditedState(Irrelevant); blueRatio->setDefaultEditedState(Irrelevant); + outputLevel->setDefaultEditedState(Irrelevant); + greenBalance->setDefaultEditedState(Irrelevant); + blueBalance->setDefaultEditedState(Irrelevant); } } void FilmNegative::setBatchMode(bool batchMode) { + ToolPanel::setBatchMode(batchMode); + if (batchMode) { - spotConn.disconnect(); - removeIfThere(this, spotgrid, false); - ToolPanel::setBatchMode(batchMode); + removeIfThere(this, spotButton, false); + removeIfThere(this, refSpotButton, false); + colorSpace->append(M("GENERAL_UNCHANGED")); + colorSpace->set_active_text(M("GENERAL_UNCHANGED")); redRatio->showEditedCB(); greenExp->showEditedCB(); blueRatio->showEditedCB(); + removeIfThere(this, refInputLabel, false); + removeIfThere(this, outputLevel, false); + removeIfThere(this, greenBalance, false); + removeIfThere(this, blueBalance, false); } } void FilmNegative::adjusterChanged(Adjuster* a, double newval) { - if (listener) { + if (listener && getEnabled()) { if (a == redRatio || a == greenExp || a == blueRatio) { - if (getEnabled()) { - listener->panelChanged( - evFilmNegativeExponents, - Glib::ustring::compose( - "Ref=%1\nR=%2\nB=%3", - greenExp->getValue(), - redRatio->getValue(), - blueRatio->getValue() - ) - ); - } + listener->panelChanged( + evFilmNegativeExponents, + Glib::ustring::compose( + "Ref=%1\nR=%2\nB=%3", + greenExp->getValue(), + redRatio->getValue(), + blueRatio->getValue() + ) + ); + } else if (a == outputLevel || a == greenBalance || a == blueBalance) { + + // Reset luminance reference when output level/color sliders are changed + refLuminance.lum = 0.f; + + listener->panelChanged( + evFilmNegativeBalance, + Glib::ustring::compose( + "Lev=%1 G=%2 B=%3", + outputLevel->getValue(), + greenBalance->getValue(), + blueBalance->getValue() + ) + ); } } } @@ -205,16 +505,47 @@ void FilmNegative::enabledChanged() if (listener) { if (get_inconsistent()) { listener->panelChanged(evFilmNegativeEnabled, M("GENERAL_UNCHANGED")); - } - else if (getEnabled()) { + } else if (getEnabled()) { listener->panelChanged(evFilmNegativeEnabled, M("GENERAL_ENABLED")); - } - else { + } else { listener->panelChanged(evFilmNegativeEnabled, M("GENERAL_DISABLED")); } } } +void FilmNegative::colorSpaceChanged() +{ + if (listener) { + listener->panelChanged(evFilmNegativeColorSpace, colorSpace->get_active_text()); + } +} + +void FilmNegative::filmRefValuesChanged(const RGB &refInput, const RGB &refOutput) +{ + + idle_register.add( + [this, refInput, refOutput]() -> bool { + refInputValues = refInput; + paramsUpgraded = true; + + disableListener(); + + refInputLabel->set_markup( + Glib::ustring::compose(M("TP_FILMNEGATIVE_REF_LABEL"), fmt(refInputValues))); + + writeOutputSliders(refOutput); + + outputLevel->show(); + blueBalance->show(); + greenBalance->show(); + + enableListener(); + return false; + } + ); + +} + void FilmNegative::setFilmNegProvider(FilmNegProvider* provider) { fnp = provider; @@ -225,9 +556,9 @@ void FilmNegative::setEditProvider(EditDataProvider* provider) EditSubscriber::setEditProvider(provider); } -CursorShape FilmNegative::getCursor(int objectID) const +CursorShape FilmNegative::getCursor(int objectID, int xPos, int yPos) const { - return CSSpotWB; + return CSSpotWB; } bool FilmNegative::mouseOver(int modifierKey) @@ -246,35 +577,104 @@ bool FilmNegative::button1Pressed(int modifierKey) EditSubscriber::action = EditSubscriber::Action::NONE; if (listener) { - refSpotCoords.push_back(provider->posImage); + if (spotButton->get_active()) { - if (refSpotCoords.size() == 2) { - // User has selected 2 reference gray spots. Calculating new exponents - // from channel values and updating parameters. + refSpotCoords.push_back(provider->posImage); - std::array newExps; - if (fnp->getFilmNegativeExponents(refSpotCoords[0], refSpotCoords[1], newExps)) { - disableListener(); - // Leaving green exponent unchanged, setting red and blue exponents based on - // the ratios between newly calculated exponents. - redRatio->setValue(newExps[0] / newExps[1]); - blueRatio->setValue(newExps[2] / newExps[1]); - enableListener(); + if (refSpotCoords.size() == 2) { + // User has selected 2 reference gray spots. Calculating new exponents + // from channel values and updating parameters. + + RGB ref1, ref2, dummy; + + if (fnp->getFilmNegativeSpot(refSpotCoords[0], 32, ref1, dummy) && + fnp->getFilmNegativeSpot(refSpotCoords[1], 32, ref2, dummy)) { + + disableListener(); + + RGB newExps = getFilmNegativeExponents(ref1, ref2); + + // Leaving green exponent unchanged, setting red and blue exponents based on + // the ratios between newly calculated exponents. + redRatio->setValue(newExps.r / newExps.g); + blueRatio->setValue(newExps.b / newExps.g); + + enableListener(); + + if (getEnabled()) { + listener->panelChanged( + evFilmNegativeExponents, + Glib::ustring::compose( + "Ref=%1\nR=%2\nB=%3", + greenExp->getValue(), + redRatio->getValue(), + blueRatio->getValue() + ) + ); + } - if (listener && getEnabled()) { - listener->panelChanged( - evFilmNegativeExponents, - Glib::ustring::compose( - "Ref=%1\nR=%2\nB=%3", - greenExp->getValue(), - redRatio->getValue(), - blueRatio->getValue() - ) - ); } + + switchOffEditMode(); + } - switchOffEditMode(); + + } else if (refSpotButton->get_active()) { + + disableListener(); + + // If the luminance reference is not set, copy the current reference input + // values, and the corresponding output luminance + if(refLuminance.lum <= 0.f) { + RGB out; + readOutputSliders(out); + refLuminance.input = refInputValues; + refLuminance.lum = rtengine::Color::rgbLuminance(out.r, out.g, out.b); + } + + RGB refOut; + fnp->getFilmNegativeSpot(provider->posImage, 32, refInputValues, refOut); + + // Output luminance of the sampled spot + float spotLum = rtengine::Color::rgbLuminance(refOut.r, refOut.g, refOut.b); + + float rexp = -(greenExp->getValue() * redRatio->getValue()); + float gexp = -greenExp->getValue(); + float bexp = -(greenExp->getValue() * blueRatio->getValue()); + + RGB mult = { + spotLum / pow_F(rtengine::max(refInputValues.r, 1.f), rexp), + spotLum / pow_F(rtengine::max(refInputValues.g, 1.f), gexp), + spotLum / pow_F(rtengine::max(refInputValues.b, 1.f), bexp) + }; + + // Calculate the new luminance of the initial luminance reference spot, by + // applying current multipliers + float newRefLum = rtengine::Color::rgbLuminance( + mult.r * pow_F(rtengine::max(refLuminance.input.r, 1.f), rexp), + mult.g * pow_F(rtengine::max(refLuminance.input.g, 1.f), gexp), + mult.b * pow_F(rtengine::max(refLuminance.input.b, 1.f), bexp)); + + // Choose a suitable gray value for the sampled spot, so that luminance + // of the initial reference spot is preserved. + float gray = spotLum * (refLuminance.lum / newRefLum); + + writeOutputSliders({gray, gray, gray}); + + refInputLabel->set_text( + Glib::ustring::compose(M("TP_FILMNEGATIVE_REF_LABEL"), fmt(refInputValues))); + + enableListener(); + + listener->panelChanged( + evFilmNegativeRefSpot, + Glib::ustring::compose( + "%1, %2, %3", + round(refInputValues.r), round(refInputValues.g), round(refInputValues.b) + ) + ); + } } @@ -287,16 +687,28 @@ bool FilmNegative::button1Released() return true; } +bool FilmNegative::button3Pressed(int modifierKey) +{ + EditSubscriber::action = EditSubscriber::Action::NONE; + switchOffEditMode(); + return true; +} + void FilmNegative::switchOffEditMode() { refSpotCoords.clear(); unsubscribe(); - spotbutton->set_active(false); + spotButton->set_active(false); + refSpotButton->set_active(false); } void FilmNegative::editToggled() { - if (spotbutton->get_active()) { + if (spotButton->get_active()) { + + refSpotButton->set_active(false); + refSpotCoords.clear(); + subscribe(); int w, h; @@ -311,3 +723,27 @@ void FilmNegative::editToggled() unsubscribe(); } } + + +void FilmNegative::refSpotToggled() +{ + if (refSpotButton->get_active()) { + + spotButton->set_active(false); + refSpotCoords.clear(); + + subscribe(); + + int w, h; + getEditProvider()->getImageSize(w, h); + + // Stick a dummy rectangle over the whole image in mouseOverGeometry. + // This is to make sure the getCursor() call is fired everywhere. + Rectangle* const imgRect = static_cast(mouseOverGeometry.at(0)); + imgRect->setXYWH(0, 0, w, h); + + } else { + refSpotCoords.clear(); + unsubscribe(); + } +} diff --git a/rtgui/filmnegative.h b/rtgui/filmnegative.h index bca155ceb..722625fa2 100644 --- a/rtgui/filmnegative.h +++ b/rtgui/filmnegative.h @@ -27,21 +27,33 @@ #include "guiutils.h" #include "toolpanel.h" +#include "../rtengine/colortemp.h" + +namespace +{ +using RGB = rtengine::procparams::FilmNegativeParams::RGB; +using ColorSpace = rtengine::procparams::FilmNegativeParams::ColorSpace; +using BackCompat = rtengine::procparams::FilmNegativeParams::BackCompat; +} + class FilmNegProvider { public: virtual ~FilmNegProvider() = default; - virtual bool getFilmNegativeExponents(rtengine::Coord spotA, rtengine::Coord spotB, std::array& newExps) = 0; + virtual bool getFilmNegativeSpot(rtengine::Coord spot, int spotSize, RGB &refInput, RGB &refOutput) = 0; }; class FilmNegative final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, - public EditSubscriber + public EditSubscriber, + public rtengine::FilmNegListener { public: + static const Glib::ustring TOOL_NAME; + FilmNegative(); ~FilmNegative() override; @@ -52,33 +64,71 @@ public: void adjusterChanged(Adjuster* a, double newval) override; void enabledChanged() override; + void colorSpaceChanged(); + + void filmRefValuesChanged(const RGB &refInput, const RGB &refOutput) override; void setFilmNegProvider(FilmNegProvider* provider); void setEditProvider(EditDataProvider* provider) override; // EditSubscriber interface - CursorShape getCursor(int objectID) const override; + CursorShape getCursor(int objectID, int xPos, int yPos) const override; bool mouseOver(int modifierKey) override; bool button1Pressed(int modifierKey) override; bool button1Released() override; + bool button3Pressed(int modifierKey) override; void switchOffEditMode() override; private: void editToggled(); + void refSpotToggled(); + + void readOutputSliders(RGB &refOutput); + void writeOutputSliders(const RGB &refOutput); + + // ColorTemp value corresponding to neutral RGB multipliers (1,1,1). Should be around 6500K. + const rtengine::ColorTemp NEUTRAL_TEMP; const rtengine::ProcEvent evFilmNegativeExponents; const rtengine::ProcEvent evFilmNegativeEnabled; + const rtengine::ProcEvent evFilmNegativeRefSpot; + const rtengine::ProcEvent evFilmNegativeBalance; + const rtengine::ProcEvent evFilmNegativeColorSpace; std::vector refSpotCoords; + RGB refInputValues; + bool paramsUpgraded; + + /** + * Luminance reference: these input RGB values must produce this output luminance. + * This allows keeping constant luminance when picking several white balance spot + * samples in sequence; values are set on the initial white balance spot sampling, + * and reset every time params are read, or the output sliders are changed. + */ + struct { + RGB input; + float lum; + } refLuminance; + FilmNegProvider* fnp; + MyComboBoxText* const colorSpace; + Adjuster* const greenExp; Adjuster* const redRatio; Adjuster* const blueRatio; - Gtk::Grid* const spotgrid; - Gtk::ToggleButton* const spotbutton; - sigc::connection spotConn; + Gtk::ToggleButton* const spotButton; + + Gtk::Label* const refInputLabel; + Gtk::ToggleButton* const refSpotButton; + + Adjuster* const outputLevel; + Adjuster* const greenBalance; + Adjuster* const blueBalance; + + IdleRegister idle_register; + }; diff --git a/rtgui/filmsimulation.cc b/rtgui/filmsimulation.cc index 6b40bb586..fb38f87dc 100644 --- a/rtgui/filmsimulation.cc +++ b/rtgui/filmsimulation.cc @@ -12,6 +12,8 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring FilmSimulation::TOOL_NAME = "filmsimulation"; + namespace { @@ -61,9 +63,10 @@ bool notifySlowParseDir (const std::chrono::system_clock::time_point& startedAt) } FilmSimulation::FilmSimulation() - : FoldableToolPanel( this, "filmsimulation", M("TP_FILMSIMULATION_LABEL"), false, true ) + : FoldableToolPanel( this, TOOL_NAME, M("TP_FILMSIMULATION_LABEL"), false, true ) { m_clutComboBox = Gtk::manage( new ClutComboBox(options.clutsDir) ); + int foundClutsCount = m_clutComboBox->foundClutsCount(); if ( foundClutsCount == 0 ) { @@ -218,7 +221,11 @@ ClutComboBox::ClutComboBox(const Glib::ustring &path): set_model(m_model()); if (cm->count > 0) { - pack_start(m_columns().label, false); + // Pack a CellRendererText in order to display long Clut file names properly + Gtk::CellRendererText* const renderer = Gtk::manage(new Gtk::CellRendererText); + renderer->property_ellipsize() = Pango::ELLIPSIZE_END; + pack_start(*renderer, false); + add_attribute(*renderer, "text", 0); } if (!options.multiDisplayMode) { diff --git a/rtgui/filmsimulation.h b/rtgui/filmsimulation.h index cfe7016bb..ed30b866e 100644 --- a/rtgui/filmsimulation.h +++ b/rtgui/filmsimulation.h @@ -56,6 +56,8 @@ private: class FilmSimulation : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { public: + static const Glib::ustring TOOL_NAME; + FilmSimulation(); void adjusterChanged(Adjuster* a, double newval) override; diff --git a/rtgui/filterpanel.cc b/rtgui/filterpanel.cc index 301a7b188..c407b88d7 100644 --- a/rtgui/filterpanel.cc +++ b/rtgui/filterpanel.cc @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . + * along with RawTherapee. If not, see . */ #include "filterpanel.h" #include "multilangmgr.h" @@ -25,14 +25,15 @@ using namespace rtengine; FilterPanel::FilterPanel () : listener (nullptr) { + set_orientation(Gtk::ORIENTATION_VERTICAL); enabled = Gtk::manage (new Gtk::CheckButton (M("EXIFFILTER_METADATAFILTER"))); pack_start (*enabled, Gtk::PACK_SHRINK, 2); - pack_start (*Gtk::manage(new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 2); + pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 2); enaFNumber = Gtk::manage (new Gtk::CheckButton (M("EXIFFILTER_APERTURE") + ":")); - Gtk::VBox* fnvb = Gtk::manage(new Gtk::VBox ()); - Gtk::HBox* fnhb = Gtk::manage(new Gtk::HBox ()); + Gtk::Box* fnvb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* fnhb = Gtk::manage(new Gtk::Box ()); fnvb->pack_start (*enaFNumber, Gtk::PACK_SHRINK, 0); fnumberFrom = Gtk::manage(new Gtk::Entry ()); fnumberFrom->set_width_chars(1); @@ -45,8 +46,8 @@ FilterPanel::FilterPanel () : listener (nullptr) pack_start (*fnvb, Gtk::PACK_SHRINK, 4); enaShutter = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_SHUTTER") + ":")); - Gtk::VBox* svb = Gtk::manage(new Gtk::VBox ()); - Gtk::HBox* shb = Gtk::manage(new Gtk::HBox ()); + Gtk::Box* svb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* shb = Gtk::manage(new Gtk::Box ()); svb->pack_start (*enaShutter, Gtk::PACK_SHRINK, 0); shutterFrom = Gtk::manage(new Gtk::Entry ()); shutterFrom->set_width_chars(1); @@ -59,8 +60,8 @@ FilterPanel::FilterPanel () : listener (nullptr) pack_start (*svb, Gtk::PACK_SHRINK, 4); enaISO = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_ISO") + ":")); - Gtk::VBox* ivb = Gtk::manage(new Gtk::VBox ()); - Gtk::HBox* ihb = Gtk::manage(new Gtk::HBox ()); + Gtk::Box* ivb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* ihb = Gtk::manage(new Gtk::Box ()); ivb->pack_start (*enaISO, Gtk::PACK_SHRINK, 0); isoFrom = Gtk::manage(new Gtk::Entry ()); isoFrom->set_width_chars(1); @@ -73,8 +74,8 @@ FilterPanel::FilterPanel () : listener (nullptr) pack_start (*ivb, Gtk::PACK_SHRINK, 4); enaFocalLen = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_FOCALLEN") + ":")); - Gtk::VBox* fvb = Gtk::manage(new Gtk::VBox ()); - Gtk::HBox* fhb = Gtk::manage(new Gtk::HBox ()); + Gtk::Box* fvb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* fhb = Gtk::manage(new Gtk::Box ()); fvb->pack_start (*enaFocalLen, Gtk::PACK_SHRINK, 0); focalFrom = Gtk::manage(new Gtk::Entry ()); focalFrom->set_width_chars(1); @@ -87,7 +88,7 @@ FilterPanel::FilterPanel () : listener (nullptr) pack_start (*fvb, Gtk::PACK_SHRINK, 4); enaExpComp = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_EXPOSURECOMPENSATION") + ":")); - Gtk::VBox* evb = Gtk::manage(new Gtk::VBox ()); + Gtk::Box* evb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); evb->pack_start (*enaExpComp, Gtk::PACK_SHRINK, 0); expcomp = Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE)); expcomp->set_headers_visible (false); @@ -99,7 +100,7 @@ FilterPanel::FilterPanel () : listener (nullptr) pack_start (*evb, Gtk::PACK_SHRINK, 4); enaCamera = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_CAMERA") + ":")); - Gtk::VBox* cvb = Gtk::manage(new Gtk::VBox ()); + Gtk::Box* cvb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); cvb->pack_start (*enaCamera, Gtk::PACK_SHRINK, 0); camera = Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE)); camera->set_headers_visible (false); @@ -107,11 +108,11 @@ FilterPanel::FilterPanel () : listener (nullptr) scamera->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); scamera->set_size_request(-1, 80); scamera->add(*camera); - cvb->pack_start (*scamera, Gtk::PACK_SHRINK, 0); - pack_start (*cvb, Gtk::PACK_SHRINK, 4); + cvb->pack_start (*scamera, Gtk::PACK_EXPAND_WIDGET, 0); + pack_start (*cvb, Gtk::PACK_EXPAND_WIDGET, 4); enaLens = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_LENS") + ":")); - Gtk::VBox* lvb = Gtk::manage(new Gtk::VBox ()); + Gtk::Box* lvb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); lvb->pack_start (*enaLens, Gtk::PACK_SHRINK, 0); lens = Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE)); lens->set_headers_visible (false); @@ -119,11 +120,11 @@ FilterPanel::FilterPanel () : listener (nullptr) slens->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); slens->set_size_request(-1, 80); slens->add(*lens); - lvb->pack_start (*slens, Gtk::PACK_SHRINK, 0); - pack_start (*lvb, Gtk::PACK_SHRINK, 4); + lvb->pack_start (*slens, Gtk::PACK_EXPAND_WIDGET, 0); + pack_start (*lvb, Gtk::PACK_EXPAND_WIDGET, 4); enaFiletype = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_FILETYPE") + ":")); - Gtk::VBox* ftvb = Gtk::manage(new Gtk::VBox ()); + Gtk::Box* ftvb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); ftvb->pack_start (*enaFiletype, Gtk::PACK_SHRINK, 0); filetype = Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE)); filetype->set_headers_visible (false); @@ -131,12 +132,12 @@ FilterPanel::FilterPanel () : listener (nullptr) sfiletype->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); sfiletype->set_size_request(-1, 80); sfiletype->add(*filetype); - ftvb->pack_start (*sfiletype, Gtk::PACK_SHRINK, 0); - pack_start (*ftvb, Gtk::PACK_SHRINK, 4); + ftvb->pack_start (*sfiletype, Gtk::PACK_EXPAND_WIDGET, 0); + pack_start (*ftvb, Gtk::PACK_EXPAND_WIDGET, 4); // add panel ending - Gtk::VBox* vboxpe = Gtk::manage (new Gtk::VBox ()); - Gtk::HSeparator* hseptpe = Gtk::manage (new Gtk::HSeparator ()); + Gtk::Box* vboxpe = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* hseptpe = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); Gtk::Image* peImg = Gtk::manage (new RTImage("ornament1.png")); vboxpe->pack_start(*hseptpe, Gtk::PACK_SHRINK, 4); vboxpe->pack_start(*peImg); diff --git a/rtgui/filterpanel.h b/rtgui/filterpanel.h index 25a368b27..77c2d063e 100644 --- a/rtgui/filterpanel.h +++ b/rtgui/filterpanel.h @@ -29,7 +29,7 @@ public: virtual void exifFilterChanged () = 0; }; -class FilterPanel : public Gtk::VBox +class FilterPanel : public Gtk::Box { protected: diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index 4e0591ac3..1cc3f5c14 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -556,6 +556,13 @@ void FlatCurveEditorSubGroup::restoreDisplayedHistogram() } +void FlatCurveEditorSubGroup::restoreLocallabBackground() +{ + if (parent->displayedCurve) { + CPointsCurve->updateLocallabBackground(parent->displayedCurve->locallabRef); + } +} + void FlatCurveEditorSubGroup::storeCurveValues (CurveEditor* ce, const std::vector& p) { if (!p.empty()) { @@ -629,6 +636,13 @@ bool FlatCurveEditorSubGroup::curveReset(CurveEditor *ce) return true; } +void FlatCurveEditorSubGroup::updateLocallabBackground(CurveEditor* ce) +{ + if (ce == parent->displayedCurve) { + CPointsCurve->updateLocallabBackground(ce->locallabRef); + } +} + /*void FlatCurveEditorSubGroup::updateBackgroundHistogram (CurveEditor* ce) { CurveEditor* fce = (CurveEditor*)ce; if (fce==displayedCurve) { diff --git a/rtgui/flatcurveeditorsubgroup.h b/rtgui/flatcurveeditorsubgroup.h index c358dde3b..79dd5e7d0 100644 --- a/rtgui/flatcurveeditorsubgroup.h +++ b/rtgui/flatcurveeditorsubgroup.h @@ -27,7 +27,7 @@ class FlatCurveEditor; class MyFlatCurve; -class FlatCurveEditorSubGroup: +class FlatCurveEditorSubGroup final : public CurveEditorSubGroup, public rtengine::NonCopyable { @@ -55,6 +55,7 @@ public: FlatCurveEditor* addCurve(Glib::ustring curveLabel = "", bool periodic = true); //virtual void updateBackgroundHistogram (CurveEditor* ce); + void updateLocallabBackground(CurveEditor* ce) override; void switchGUI() override; void refresh(CurveEditor *curveToRefresh) override; void editModeSwitchedOff() override; @@ -71,6 +72,7 @@ protected: void storeCurveValues (CurveEditor* ce, const std::vector& p) override; void storeDisplayedCurve () override; void restoreDisplayedHistogram () override; + void restoreLocallabBackground() override; void savePressed (); void loadPressed (); void copyPressed (); diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index 7433fd4de..21cdb4315 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -18,6 +18,7 @@ */ #include +#include "eventmapper.h" #include "flatfield.h" #include "guiutils.h" @@ -30,9 +31,14 @@ using namespace rtengine; using namespace rtengine::procparams; -FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_LABEL")) +const Glib::ustring FlatField::TOOL_NAME = "flatfield"; + +FlatField::FlatField () : FoldableToolPanel(this, TOOL_NAME, M("TP_FLATFIELD_LABEL")) { - hbff = Gtk::manage(new Gtk::HBox()); + auto m = ProcEventMapper::getInstance(); + EvFlatFieldFromMetaData = m->newEvent(DARKFRAME, "HISTORY_MSG_FF_FROMMETADATA"); + + hbff = Gtk::manage(new Gtk::Box()); flatFieldFile = Gtk::manage(new MyFileChooserButton(M("TP_FLATFIELD_LABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)); bindCurrentFolder (*flatFieldFile, options.lastFlatfieldDir); ffLabel = Gtk::manage(new Gtk::Label(M("GENERAL_FILE"))); @@ -42,18 +48,18 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L hbff->pack_start(*flatFieldFile); hbff->pack_start(*flatFieldFileReset, Gtk::PACK_SHRINK); flatFieldAutoSelect = Gtk::manage(new Gtk::CheckButton((M("TP_FLATFIELD_AUTOSELECT")))); + flatFieldFromMetaData = Gtk::manage(new CheckBox((M("TP_FLATFIELD_FROMMETADATA")), multiImage)); + flatFieldFromMetaData->setCheckBoxListener (this); ffInfo = Gtk::manage(new Gtk::Label("-")); setExpandAlignProperties(ffInfo, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); flatFieldBlurRadius = Gtk::manage(new Adjuster (M("TP_FLATFIELD_BLURRADIUS"), 0, 200, 2, 32)); flatFieldBlurRadius->setAdjusterListener (this); - if (flatFieldBlurRadius->delay < options.adjusterMaxDelay) { - flatFieldBlurRadius->delay = options.adjusterMaxDelay; - } + flatFieldBlurRadius->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); flatFieldBlurRadius->show(); - Gtk::HBox* hbffbt = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hbffbt = Gtk::manage (new Gtk::Box ()); hbffbt->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_FLATFIELD_BLURTYPE") + ":")), Gtk::PACK_SHRINK); flatFieldBlurType = Gtk::manage (new MyComboBoxText ()); flatFieldBlurType->append(M("TP_FLATFIELD_BT_AREA")); @@ -67,15 +73,15 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L flatFieldClipControl->setAdjusterListener(this); flatFieldClipControl->addAutoButton(""); - if (flatFieldClipControl->delay < options.adjusterMaxDelay) { - flatFieldClipControl->delay = options.adjusterMaxDelay; - } + flatFieldClipControl->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); flatFieldClipControl->show(); flatFieldClipControl->set_tooltip_markup (M("TP_FLATFIELD_CLIPCONTROL_TOOLTIP")); - pack_start( *hbff, Gtk::PACK_SHRINK); + pack_start( *flatFieldFromMetaData, Gtk::PACK_SHRINK); + pack_start( *Gtk::manage( new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0 ); pack_start( *flatFieldAutoSelect, Gtk::PACK_SHRINK); + pack_start( *hbff, Gtk::PACK_SHRINK); pack_start( *ffInfo, Gtk::PACK_SHRINK); pack_start( *hbffbt, Gtk::PACK_SHRINK); pack_start( *flatFieldBlurRadius, Gtk::PACK_SHRINK); @@ -132,12 +138,14 @@ void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi } flatFieldAutoSelect->set_active (pp->raw.ff_AutoSelect); + flatFieldFromMetaData->set_active (pp->raw.ff_FromMetaData); flatFieldBlurRadius->setValue (pp->raw.ff_BlurRadius); flatFieldClipControl->setValue (pp->raw.ff_clipControl); flatFieldClipControl->setAutoValue (pp->raw.ff_AutoClipControl); if(pedited ) { flatFieldAutoSelect->set_inconsistent (!pedited->raw.ff_AutoSelect); + flatFieldFromMetaData->set_inconsistent (!pedited->raw.ff_FromMetaData); flatFieldBlurRadius->setEditedState( pedited->raw.ff_BlurRadius ? Edited : UnEdited ); flatFieldClipControl->setEditedState( pedited->raw.ff_clipControl ? Edited : UnEdited ); flatFieldClipControl->setAutoInconsistent(multiImage && !pedited->raw.ff_AutoClipControl); @@ -218,6 +226,7 @@ void FlatField::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedit { pp->raw.ff_file = flatFieldFile->get_filename(); pp->raw.ff_AutoSelect = flatFieldAutoSelect->get_active(); + pp->raw.ff_FromMetaData = flatFieldFromMetaData->get_active(); pp->raw.ff_BlurRadius = flatFieldBlurRadius->getIntValue(); pp->raw.ff_clipControl = flatFieldClipControl->getIntValue(); pp->raw.ff_AutoClipControl = flatFieldClipControl->getAutoValue(); @@ -231,6 +240,7 @@ void FlatField::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedit if (pedited) { pedited->raw.ff_file = ffChanged; pedited->raw.ff_AutoSelect = !flatFieldAutoSelect->get_inconsistent(); + pedited->raw.ff_FromMetaData = !flatFieldFromMetaData->get_inconsistent(); pedited->raw.ff_BlurRadius = flatFieldBlurRadius->getEditedState (); pedited->raw.ff_clipControl = flatFieldClipControl->getEditedState (); pedited->raw.ff_AutoClipControl = !flatFieldClipControl->getAutoInconsistent(); @@ -356,6 +366,13 @@ void FlatField::flatFieldBlurTypeChanged () } } +void FlatField::checkBoxToggled (CheckBox* c, CheckValue newval) +{ + if (listener && c == flatFieldFromMetaData) { + listener->panelChanged (EvFlatFieldFromMetaData, flatFieldFromMetaData->getLastActive() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + void FlatField::flatFieldAutoSelectChanged() { if (batchMode) { @@ -423,3 +440,18 @@ void FlatField::flatFieldAutoClipValueChanged(int n) } ); } + +void FlatField::setGainMap(bool enabled) { + flatFieldFromMetaData->set_sensitive(enabled); + if (!enabled) { + idle_register.add( + [this, enabled]() -> bool + { + disableListener(); + flatFieldFromMetaData->setValue(false); + enableListener(); + return false; + } + ); + } +} diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index 5cbc49684..efb8a2cec 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -23,6 +23,7 @@ #include #include "adjuster.h" +#include "checkbox.h" #include "guiutils.h" #include "toolpanel.h" @@ -42,7 +43,7 @@ public: // add other info here }; -class FlatField final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener +class FlatField final : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener { protected: @@ -52,10 +53,11 @@ protected: Gtk::Label *ffInfo; Gtk::Button *flatFieldFileReset; Gtk::CheckButton* flatFieldAutoSelect; + CheckBox* flatFieldFromMetaData; Adjuster* flatFieldClipControl; Adjuster* flatFieldBlurRadius; MyComboBoxText* flatFieldBlurType; - Gtk::HBox *hbff; + Gtk::Box *hbff; bool ffChanged; bool lastFFAutoSelect; bool lastFFAutoClipCtrl; @@ -64,9 +66,12 @@ protected: Glib::ustring lastShortcutPath; bool b_filter_asCurrent; bool israw; + rtengine::ProcEvent EvFlatFieldFromMetaData; IdleRegister idle_register; + public: + static const Glib::ustring TOOL_NAME; FlatField (); ~FlatField () override; @@ -90,4 +95,6 @@ public: ffp = p; }; void flatFieldAutoClipValueChanged(int n = 0) override; + void checkBoxToggled(CheckBox* c, CheckValue newval) override; + void setGainMap(bool enabled); }; diff --git a/rtgui/gradient.cc b/rtgui/gradient.cc index 4f389e112..26be51975 100644 --- a/rtgui/gradient.cc +++ b/rtgui/gradient.cc @@ -12,10 +12,25 @@ using namespace rtengine; using namespace rtengine::procparams; -Gradient::Gradient () : FoldableToolPanel(this, "gradient", M("TP_GRADIENT_LABEL"), false, true), EditSubscriber(ET_OBJECTS), lastObject(-1), draggedPointOldAngle(-1000.) +namespace { - editHBox = Gtk::manage (new Gtk::HBox()); +enum GeometryIndex { + H_LINE, + V_LINE, + FEATHER_LINE_1, + FEATHER_LINE_2, + CENTER_CIRCLE, +}; + +} + +const Glib::ustring Gradient::TOOL_NAME = "gradient"; + +Gradient::Gradient () : FoldableToolPanel(this, TOOL_NAME, M("TP_GRADIENT_LABEL"), false, true), EditSubscriber(ET_OBJECTS), lastObject(-1), draggedPointOldAngle(-1000.) +{ + + editHBox = Gtk::manage (new Gtk::Box()); edit = Gtk::manage (new Gtk::ToggleButton()); edit->get_style_context()->add_class("independent"); edit->add (*Gtk::manage (new RTImage ("crosshair-adjust.png"))); @@ -151,6 +166,8 @@ void Gradient::updateGeometry(const int centerX, const int centerY, const double int imW=0; int imH=0; + + if (fullWidth != -1 && fullHeight != -1) { imW = fullWidth; imH = fullHeight; @@ -164,7 +181,7 @@ void Gradient::updateGeometry(const int centerX, const int centerY, const double const auto decay = feather * rtengine::norm2 (imW, imH) / 200.0; rtengine::Coord origin (imW / 2 + centerX * imW / 200, imH / 2 + centerY * imH / 200); - const auto updateLine = [&](Geometry* geometry, const float radius, const float begin, const float end) + const auto updateLine = [&](Geometry* geometry, const double radius, const double begin, const double end) { const auto line = static_cast(geometry); line->begin = PolarCoord(radius, -degree + begin); @@ -173,7 +190,7 @@ void Gradient::updateGeometry(const int centerX, const int centerY, const double line->end += origin; }; - const auto updateLineWithDecay = [&](Geometry* geometry, const float radius, const float offSetAngle) + const auto updateLineWithDecay = [&](Geometry* geometry, const double radius, const double offSetAngle) { const auto line = static_cast(geometry); line->begin = PolarCoord (radius, -degree + 180.) + PolarCoord (decay, -degree + offSetAngle); @@ -189,24 +206,24 @@ void Gradient::updateGeometry(const int centerX, const int centerY, const double }; // update horizontal line - updateLine (visibleGeometry.at(0), 1500., 0., 180.); - updateLine (mouseOverGeometry.at(0), 1500., 0., 180.); + updateLine (visibleGeometry.at(H_LINE), 1500., 0., 180.); + updateLine (mouseOverGeometry.at(H_LINE), 1500., 0., 180.); // update vertical line - updateLine (visibleGeometry.at(1), 700., 90., 270.); - updateLine (mouseOverGeometry.at(1), 700., 90., 270.); + updateLine (visibleGeometry.at(V_LINE), 700., 90., 270.); + updateLine (mouseOverGeometry.at(V_LINE), 700., 90., 270.); // update upper feather line - updateLineWithDecay (visibleGeometry.at(2), 350., 270.); - updateLineWithDecay (mouseOverGeometry.at(2), 350., 270.); + updateLineWithDecay (visibleGeometry.at(FEATHER_LINE_1), 350., 270.); + updateLineWithDecay (mouseOverGeometry.at(FEATHER_LINE_1), 350., 270.); // update lower feather line - updateLineWithDecay (visibleGeometry.at(3), 350., 90.); - updateLineWithDecay (mouseOverGeometry.at(3), 350., 90.); + updateLineWithDecay (visibleGeometry.at(FEATHER_LINE_2), 350., 90.); + updateLineWithDecay (mouseOverGeometry.at(FEATHER_LINE_2), 350., 90.); // update circle's position - updateCircle (visibleGeometry.at(4)); - updateCircle (mouseOverGeometry.at(4)); + updateCircle (visibleGeometry.at(CENTER_CIRCLE)); + updateCircle (mouseOverGeometry.at(CENTER_CIRCLE)); } void Gradient::write (ProcParams* pp, ParamsEdited* pedited) @@ -323,19 +340,20 @@ void Gradient::editToggled () if (edit->get_active()) { subscribe(); } else { + releaseEdit(); unsubscribe(); } } -CursorShape Gradient::getCursor(int objectID) const +CursorShape Gradient::getCursor(int objectID, int xPos, int yPos) const { switch (objectID) { - case (0): - case (1): + case (H_LINE): + case (V_LINE): return CSMoveRotate; - case (2): - case (3): { + case (FEATHER_LINE_1): + case (FEATHER_LINE_2): { int angle = degree->getIntValue(); if (angle < -135 || (angle >= -45 && angle <= 45) || angle > 135) { @@ -345,7 +363,7 @@ CursorShape Gradient::getCursor(int objectID) const return CSMove1DH; } - case (4): + case (CENTER_CIRCLE): return CSMove2D; default: @@ -359,18 +377,18 @@ bool Gradient::mouseOver(int modifierKey) if (editProvider && editProvider->getObject() != lastObject) { if (lastObject > -1) { - if (lastObject == 2 || lastObject == 3) { - EditSubscriber::visibleGeometry.at(2)->state = Geometry::NORMAL; - EditSubscriber::visibleGeometry.at(3)->state = Geometry::NORMAL; + if (lastObject == FEATHER_LINE_1 || lastObject == FEATHER_LINE_2) { + EditSubscriber::visibleGeometry.at(FEATHER_LINE_1)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at(FEATHER_LINE_2)->state = Geometry::NORMAL; } else { EditSubscriber::visibleGeometry.at(lastObject)->state = Geometry::NORMAL; } } if (editProvider->getObject() > -1) { - if (editProvider->getObject() == 2 || editProvider->getObject() == 3) { - EditSubscriber::visibleGeometry.at(2)->state = Geometry::PRELIGHT; - EditSubscriber::visibleGeometry.at(3)->state = Geometry::PRELIGHT; + if (editProvider->getObject() == FEATHER_LINE_1 || editProvider->getObject() == FEATHER_LINE_2) { + EditSubscriber::visibleGeometry.at(FEATHER_LINE_1)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at(FEATHER_LINE_2)->state = Geometry::PRELIGHT; } else { EditSubscriber::visibleGeometry.at(editProvider->getObject())->state = Geometry::PRELIGHT; } @@ -412,7 +430,7 @@ bool Gradient::button1Pressed(int modifierKey) //printf("\ndraggedPointOldAngle=%.3f\n\n", draggedPointOldAngle); draggedPointAdjusterAngle = degree->getValue(); - if (lastObject == 2 || lastObject == 3) { + if (lastObject == FEATHER_LINE_1 || lastObject == FEATHER_LINE_2) { // Dragging a line to change the angle PolarCoord draggedPoint; rtengine::Coord currPos; @@ -428,7 +446,7 @@ bool Gradient::button1Pressed(int modifierKey) // compute the projected value of the dragged point draggedFeatherOffset = draggedPoint.radius * sin((draggedPoint.angle - degree->getValue()) / 180.*rtengine::RT_PI); - if (lastObject == 3) { + if (lastObject == FEATHER_LINE_2) { draggedFeatherOffset = -draggedFeatherOffset; } @@ -439,9 +457,9 @@ bool Gradient::button1Pressed(int modifierKey) return false; } else { // should theoretically always be true // this will let this class ignore further drag events - if (lastObject == 2 || lastObject == 3) { - EditSubscriber::visibleGeometry.at(2)->state = Geometry::NORMAL; - EditSubscriber::visibleGeometry.at(3)->state = Geometry::NORMAL; + if (lastObject == FEATHER_LINE_1 || lastObject == FEATHER_LINE_2) { + EditSubscriber::visibleGeometry.at(FEATHER_LINE_1)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at(FEATHER_LINE_2)->state = Geometry::NORMAL; } else { EditSubscriber::visibleGeometry.at(lastObject)->state = Geometry::NORMAL; } @@ -469,7 +487,7 @@ bool Gradient::drag1(int modifierKey) double halfSizeW = imW / 2.; double halfSizeH = imH / 2.; - if (lastObject == 0 || lastObject == 1) { + if (lastObject == H_LINE || lastObject == V_LINE) { // Dragging a line to change the angle PolarCoord draggedPoint; @@ -513,7 +531,7 @@ bool Gradient::drag1(int modifierKey) return true; } - } else if (lastObject == 2 || lastObject == 3) { + } else if (lastObject == FEATHER_LINE_1 || lastObject == FEATHER_LINE_2) { // Dragging the upper or lower feather bar PolarCoord draggedPoint; rtengine::Coord currPos; @@ -530,11 +548,11 @@ bool Gradient::drag1(int modifierKey) draggedPoint = currPos - centerPos; double currDraggedFeatherOffset = draggedPoint.radius * sin((draggedPoint.angle - degree->getValue()) / 180.*rtengine::RT_PI); - if (lastObject == 2) + if (lastObject == FEATHER_LINE_1) // Dragging the upper feather bar { currDraggedFeatherOffset -= draggedFeatherOffset; - } else if (lastObject == 3) + } else if (lastObject == FEATHER_LINE_2) // Dragging the lower feather bar { currDraggedFeatherOffset = -currDraggedFeatherOffset + draggedFeatherOffset; @@ -552,7 +570,7 @@ bool Gradient::drag1(int modifierKey) return true; } - } else if (lastObject == 4) { + } else if (lastObject == CENTER_CIRCLE) { // Dragging the circle to change the center rtengine::Coord currPos; draggedCenter += provider->deltaPrevImage; @@ -577,6 +595,19 @@ bool Gradient::drag1(int modifierKey) return false; } +void Gradient::releaseEdit() +{ + if (lastObject >= 0) { + if (lastObject == FEATHER_LINE_1 || lastObject == FEATHER_LINE_2) { + EditSubscriber::visibleGeometry.at(FEATHER_LINE_1)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at(FEATHER_LINE_2)->state = Geometry::NORMAL; + } else { + EditSubscriber::visibleGeometry.at(lastObject)->state = Geometry::NORMAL; + } + } + action = Action::NONE; +} + void Gradient::switchOffEditMode () { if (edit->get_active()) { diff --git a/rtgui/gradient.h b/rtgui/gradient.h index f2be47ccc..d7754007c 100644 --- a/rtgui/gradient.h +++ b/rtgui/gradient.h @@ -21,7 +21,7 @@ private: int lastObject; protected: - Gtk::HBox *editHBox; + Gtk::Box *editHBox; Gtk::ToggleButton* edit; Adjuster* degree; Adjuster* feather; @@ -35,8 +35,10 @@ protected: sigc::connection editConn; void editToggled (); + void releaseEdit(); public: + static const Glib::ustring TOOL_NAME; Gradient (); ~Gradient () override; @@ -55,7 +57,7 @@ public: void setEditProvider (EditDataProvider* provider) override; // EditSubscriber interface - CursorShape getCursor(int objectID) const override; + CursorShape getCursor(int objectID, int xPos, int yPos) const override; bool mouseOver(int modifierKey) override; bool button1Pressed(int modifierKey) override; bool button1Released() override; diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 1132077de..8e039400e 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -20,7 +20,6 @@ #include "guiutils.h" #include "options.h" -#include "../rtengine/rt_math.h" #include "../rtengine/utils.h" #include "../rtengine/procparams.h" #include "rtimage.h" @@ -169,7 +168,7 @@ bool confirmOverwrite (Gtk::Window& parent, const std::string& filename) bool safe = true; if (Glib::file_test (filename, Glib::FILE_TEST_EXISTS)) { - Glib::ustring msg_ = Glib::ustring ("\"") + Glib::path_get_basename (filename) + "\": " + Glib::ustring msg_ = Glib::ustring ("\"") + escapeHtmlChars(Glib::path_get_basename (filename)) + "\": " + M("MAIN_MSG_ALREADYEXISTS") + "\n" + M("MAIN_MSG_QOVERWRITE"); Gtk::MessageDialog msgd (parent, msg_, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_YES_NO, true); safe = (msgd.run () == Gtk::RESPONSE_YES); @@ -180,7 +179,7 @@ bool confirmOverwrite (Gtk::Window& parent, const std::string& filename) void writeFailed (Gtk::Window& parent, const std::string& filename) { - Glib::ustring msg_ = Glib::ustring::compose(M("MAIN_MSG_WRITEFAILED"), filename); + Glib::ustring msg_ = Glib::ustring::compose(M("MAIN_MSG_WRITEFAILED"), escapeHtmlChars(filename)); Gtk::MessageDialog msgd (parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); } @@ -215,7 +214,7 @@ void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int cr->fill (); // rectangle around the cropped area and guides - if (cparams.guide != "None" && drawGuide) { + if (cparams.guide != rtengine::procparams::CropParams::Guide::NONE && drawGuide) { double rectx1 = round(c1x) + imx + 0.5; double recty1 = round(c1y) + imy + 0.5; double rectx2 = round(c2x) + imx + 0.5; @@ -244,60 +243,98 @@ void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int cr->stroke (); cr->set_dash (std::valarray(), 0); - if (cparams.guide != "Rule of diagonals" && cparams.guide != "Golden Triangle 1" && cparams.guide != "Golden Triangle 2") { + if ( + cparams.guide != rtengine::procparams::CropParams::Guide::RULE_OF_DIAGONALS + && cparams.guide != rtengine::procparams::CropParams::Guide::GOLDEN_TRIANGLE_1 + && cparams.guide != rtengine::procparams::CropParams::Guide::GOLDEN_TRIANGLE_2 + ) { // draw guide lines std::vector horiz_ratios; std::vector vert_ratios; - if (cparams.guide == "Rule of thirds") { - horiz_ratios.push_back (1.0 / 3.0); - horiz_ratios.push_back (2.0 / 3.0); - vert_ratios.push_back (1.0 / 3.0); - vert_ratios.push_back (2.0 / 3.0); - } else if (!strncmp(cparams.guide.data(), "Harmonic means", 14)) { - horiz_ratios.push_back (1.0 - 0.618); - horiz_ratios.push_back (0.618); - vert_ratios.push_back (0.618); - vert_ratios.push_back (1.0 - 0.618); - } else if (cparams.guide == "Grid") { - // To have even distribution, normalize it a bit - const int longSideNumLines = 10; + switch (cparams.guide) { + case rtengine::procparams::CropParams::Guide::NONE: + case rtengine::procparams::CropParams::Guide::FRAME: + case rtengine::procparams::CropParams::Guide::RULE_OF_DIAGONALS: + case rtengine::procparams::CropParams::Guide::GOLDEN_TRIANGLE_1: + case rtengine::procparams::CropParams::Guide::GOLDEN_TRIANGLE_2: { + break; + } - int w = rectx2 - rectx1, h = recty2 - recty1; + case rtengine::procparams::CropParams::Guide::RULE_OF_THIRDS: { + horiz_ratios.push_back (1.0 / 3.0); + horiz_ratios.push_back (2.0 / 3.0); + vert_ratios.push_back (1.0 / 3.0); + vert_ratios.push_back (2.0 / 3.0); + break; + } - if (w > longSideNumLines && h > longSideNumLines) { - if (w > h) { - for (int i = 1; i < longSideNumLines; i++) { - vert_ratios.push_back ((double)i / longSideNumLines); - } + case rtengine::procparams::CropParams::Guide::HARMONIC_MEANS: { + horiz_ratios.push_back (1.0 - 0.618); + horiz_ratios.push_back (0.618); + vert_ratios.push_back (0.618); + vert_ratios.push_back (1.0 - 0.618); + break; + } - int shortSideNumLines = (int)round(h * (double)longSideNumLines / w); + case rtengine::procparams::CropParams::Guide::GRID: { + // To have even distribution, normalize it a bit + const int longSideNumLines = 10; - for (int i = 1; i < shortSideNumLines; i++) { - horiz_ratios.push_back ((double)i / shortSideNumLines); - } - } else { - for (int i = 1; i < longSideNumLines; i++) { - horiz_ratios.push_back ((double)i / longSideNumLines); - } + int w = rectx2 - rectx1, h = recty2 - recty1; - int shortSideNumLines = (int)round(w * (double)longSideNumLines / h); + if (w > longSideNumLines && h > longSideNumLines) { + if (w > h) { + for (int i = 1; i < longSideNumLines; i++) { + vert_ratios.push_back ((double)i / longSideNumLines); + } - for (int i = 1; i < shortSideNumLines; i++) { - vert_ratios.push_back ((double)i / shortSideNumLines); + int shortSideNumLines = (int)round(h * (double)longSideNumLines / w); + + for (int i = 1; i < shortSideNumLines; i++) { + horiz_ratios.push_back ((double)i / shortSideNumLines); + } + } else { + for (int i = 1; i < longSideNumLines; i++) { + horiz_ratios.push_back ((double)i / longSideNumLines); + } + + int shortSideNumLines = (int)round(w * (double)longSideNumLines / h); + + for (int i = 1; i < shortSideNumLines; i++) { + vert_ratios.push_back ((double)i / shortSideNumLines); + } } } + break; + } + + case rtengine::procparams::CropParams::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 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." + */ + horiz_ratios.push_back (7.0 / 45.0); + horiz_ratios.push_back (26.0 / 45.0); + horiz_ratios.push_back (37.0 / 45.0); + vert_ratios.push_back (0.5); + break; + } + + case rtengine::procparams::CropParams::Guide::CENTERED_SQUARE: { + const double w = rectx2 - rectx1, h = recty2 - recty1; + double ratio = w / h; + if (ratio < 1.0) { + ratio = 1.0 / ratio; + horiz_ratios.push_back((ratio - 1.0) / (2.0 * ratio)); + horiz_ratios.push_back(1.0 - (ratio - 1.0) / (2.0 * ratio)); + } else { + vert_ratios.push_back((ratio - 1.0) / (2.0 * ratio)); + vert_ratios.push_back(1.0 - (ratio - 1.0) / (2.0 * ratio)); + } + break; } - } 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 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." - */ - horiz_ratios.push_back (7.0 / 45.0); - horiz_ratios.push_back (26.0 / 45.0); - horiz_ratios.push_back (37.0 / 45.0); - vert_ratios.push_back (0.5); } // Horizontals @@ -333,7 +370,7 @@ void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int ds.resize (0); cr->set_dash (ds, 0); } - } else if (cparams.guide == "Rule of diagonals") { + } else if (cparams.guide == rtengine::procparams::CropParams::Guide::RULE_OF_DIAGONALS) { double corners_from[4][2]; double corners_to[4][2]; int mindim = min(rectx2 - rectx1, recty2 - recty1); @@ -369,9 +406,12 @@ void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int ds.resize (0); cr->set_dash (ds, 0); } - } else if (cparams.guide == "Golden Triangle 1" || cparams.guide == "Golden Triangle 2") { + } else if ( + cparams.guide == rtengine::procparams::CropParams::Guide::GOLDEN_TRIANGLE_1 + || cparams.guide == rtengine::procparams::CropParams::Guide::GOLDEN_TRIANGLE_2 + ) { // main diagonal - if(cparams.guide == "Golden Triangle 2") { + if(cparams.guide == rtengine::procparams::CropParams::Guide::GOLDEN_TRIANGLE_2) { std::swap(rectx1, rectx2); } @@ -521,18 +561,21 @@ MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) : child(nullptr), headerWidget(nullptr), statusImage(nullptr), label(nullptr), useEnabled(useEnabled) { + set_orientation(Gtk::ORIENTATION_VERTICAL); set_spacing(0); set_name("MyExpander"); set_can_focus(false); setExpandAlignProperties(this, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - headerHBox = Gtk::manage( new Gtk::HBox()); + headerHBox = Gtk::manage( new Gtk::Box()); headerHBox->set_can_focus(false); setExpandAlignProperties(headerHBox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); if (useEnabled) { + get_style_context()->add_class("OnOff"); statusImage = Gtk::manage(new RTImage(disabledImage)); imageEvBox = Gtk::manage(new Gtk::EventBox()); + imageEvBox->set_name("MyExpanderStatus"); imageEvBox->add(*statusImage); imageEvBox->set_above_child(true); imageEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_enabled_change) ); @@ -540,6 +583,7 @@ MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) : imageEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_enable), false ); headerHBox->pack_start(*imageEvBox, Gtk::PACK_SHRINK, 0); } else { + get_style_context()->add_class("Fold"); statusImage = Gtk::manage(new RTImage(openedImage)); headerHBox->pack_start(*statusImage, Gtk::PACK_SHRINK, 0); } @@ -554,7 +598,7 @@ MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) : titleEvBox = Gtk::manage(new Gtk::EventBox()); titleEvBox->set_name("MyExpanderTitle"); - titleEvBox->set_border_width(2); + titleEvBox->set_border_width(0); titleEvBox->add(*headerHBox); titleEvBox->set_above_child(false); // this is the key! By making it below the child, they will get the events first. titleEvBox->set_can_focus(false); @@ -573,17 +617,18 @@ MyExpander::MyExpander(bool useEnabled, Glib::ustring titleLabel) : child(nullptr), headerWidget(nullptr), label(nullptr), useEnabled(useEnabled) { + set_orientation(Gtk::ORIENTATION_VERTICAL); set_spacing(0); set_name("MyExpander"); set_can_focus(false); setExpandAlignProperties(this, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - headerHBox = Gtk::manage( new Gtk::HBox()); + headerHBox = Gtk::manage( new Gtk::Box()); headerHBox->set_can_focus(false); setExpandAlignProperties(headerHBox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - if (useEnabled) { + get_style_context()->add_class("OnOff"); statusImage = Gtk::manage(new RTImage(disabledImage)); imageEvBox = Gtk::manage(new Gtk::EventBox()); imageEvBox->set_name("MyExpanderStatus"); @@ -594,6 +639,7 @@ MyExpander::MyExpander(bool useEnabled, Glib::ustring titleLabel) : imageEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_enable), false ); headerHBox->pack_start(*imageEvBox, Gtk::PACK_SHRINK, 0); } else { + get_style_context()->add_class("Fold"); statusImage = Gtk::manage(new RTImage(openedImage)); headerHBox->pack_start(*statusImage, Gtk::PACK_SHRINK, 0); } @@ -602,12 +648,12 @@ MyExpander::MyExpander(bool useEnabled, Glib::ustring titleLabel) : label = Gtk::manage(new Gtk::Label()); setExpandAlignProperties(label, true, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - label->set_markup(Glib::ustring("") + escapeHtmlChars(titleLabel) + Glib::ustring("")); + label->set_markup(escapeHtmlChars(titleLabel)); headerHBox->pack_start(*label, Gtk::PACK_EXPAND_WIDGET, 0); titleEvBox = Gtk::manage(new Gtk::EventBox()); titleEvBox->set_name("MyExpanderTitle"); - titleEvBox->set_border_width(2); + titleEvBox->set_border_width(0); titleEvBox->add(*headerHBox); titleEvBox->set_above_child(false); // this is the key! By make it below the child, they will get the events first. titleEvBox->set_can_focus(false); @@ -684,7 +730,7 @@ void MyExpander::setLevel (int level) void MyExpander::setLabel (Glib::ustring newLabel) { if (label) { - label->set_markup(Glib::ustring("") + escapeHtmlChars(newLabel) + Glib::ustring("")); + label->set_markup(escapeHtmlChars(newLabel)); } } @@ -712,8 +758,10 @@ void MyExpander::set_inconsistent(bool isInconsistent) } else { if (enabled) { statusImage->set(enabledImage->get_surface()); + get_style_context()->add_class("enabledTool"); } else { statusImage->set(disabledImage->get_surface()); + get_style_context()->remove_class("enabledTool"); } } } @@ -740,6 +788,7 @@ void MyExpander::setEnabled(bool isEnabled) if (!inconsistent) { statusImage->set(disabledImage->get_surface()); + get_style_context()->remove_class("enabledTool"); message.emit(); } } else { @@ -747,6 +796,7 @@ void MyExpander::setEnabled(bool isEnabled) if (!inconsistent) { statusImage->set(enabledImage->get_surface()); + get_style_context()->add_class("enabledTool"); message.emit(); } } @@ -774,12 +824,6 @@ void MyExpander::set_expanded( bool expanded ) return; } - bool isVisible = expBox->is_visible(); - - if (isVisible == expanded) { - return; - } - if (!useEnabled) { if (expanded ) { statusImage->set(openedImage->get_surface()); @@ -855,9 +899,11 @@ bool MyExpander::on_enabled_change(GdkEventButton* event) if (enabled) { enabled = false; statusImage->set(disabledImage->get_surface()); + get_style_context()->remove_class("enabledTool"); } else { enabled = true; statusImage->set(enabledImage->get_surface()); + get_style_context()->add_class("enabledTool"); } message.emit(); @@ -945,7 +991,7 @@ 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 + // Works fine with Gtk 3.22, but 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); } @@ -1114,6 +1160,7 @@ MySpinButton::MySpinButton () set_numeric(true); set_wrap(false); set_alignment(Gtk::ALIGN_END); + set_update_policy(Gtk::SpinButtonUpdatePolicy::UPDATE_IF_VALID); // Avoid updating text if input is not a numeric } void MySpinButton::updateSize() @@ -1146,19 +1193,19 @@ bool MySpinButton::on_key_press_event (GdkEventKey* event) double vMin, vMax; get_range(vMin, vMax); - if ( (event->string[0] >= 'a' && event->string[0] <= 'z') - || (event->string[0] >= 'A' && event->string[0] <= 'Z') - || event->string[0] == '+' || (event->string[0] == '-' && vMin >= 0) - || event->string[0] == '=' || event->string[0] == '_' - ) { - return false; + if ((event->keyval >= GDK_KEY_a && event->keyval <= GDK_KEY_z) + || (event->keyval >= GDK_KEY_A && event->keyval <= GDK_KEY_Z) + || event->keyval == GDK_KEY_equal || event->keyval == GDK_KEY_underscore + || event->keyval == GDK_KEY_plus || (event->keyval == GDK_KEY_minus && vMin >= 0)) { + return false; // Event is propagated further } else { - if(event->string[0] == ',') { - event->keyval = GDK_KEY_period; - event->string[0] = '.'; + if (event->keyval == GDK_KEY_comma || event->keyval == GDK_KEY_KP_Decimal) { + set_text(get_text() + "."); + set_position(get_text().length()); // When setting text, cursor position is reset at text start. Avoiding this with this code + return true; // Event is not propagated further } - return Gtk::Widget::on_key_press_event(event); + return Gtk::SpinButton::on_key_press_event(event); // Event is propagated normally } } @@ -1181,7 +1228,7 @@ bool MyHScale::on_scroll_event (GdkEventScroll* event) // 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); + Gtk::Scale::on_scroll_event(event); return true; } @@ -1211,7 +1258,7 @@ MyFileChooserButton::MyFileChooserButton(const Glib::ustring &title, Gtk::FileCh box_.pack_start(lbl_, true, true); Gtk::Image *img = Gtk::manage(new Gtk::Image()); 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(*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), false, false, 5); box_.pack_start(*img, false, false); box_.show_all_children(); add(box_); @@ -1406,33 +1453,110 @@ TextOrIcon::TextOrIcon (const Glib::ustring &fname, const Glib::ustring &labelTx } -MyImageMenuItem::MyImageMenuItem(Glib::ustring label, Glib::ustring imageFileName) +class ImageAndLabel::Impl { - box = Gtk::manage (new Gtk::Grid()); - this->label = Gtk::manage( new Gtk::Label(label)); - box->set_orientation(Gtk::ORIENTATION_HORIZONTAL); +public: + RTImage* image; + Gtk::Label* label; - if (!imageFileName.empty()) { - image = Gtk::manage( new RTImage(imageFileName) ); - box->attach_next_to(*image, Gtk::POS_LEFT, 1, 1); - } else { - image = nullptr; + Impl(RTImage* image, Gtk::Label* label) : image(image), label(label) {} + static std::unique_ptr createImage(const Glib::ustring& fileName); +}; + +std::unique_ptr ImageAndLabel::Impl::createImage(const Glib::ustring& fileName) +{ + if (fileName.empty()) { + return nullptr; + } + return std::unique_ptr(new RTImage(fileName)); +} + +ImageAndLabel::ImageAndLabel(const Glib::ustring& label, const Glib::ustring& imageFileName) : + ImageAndLabel(label, Gtk::manage(Impl::createImage(imageFileName).release())) +{ +} + +ImageAndLabel::ImageAndLabel(const Glib::ustring& label, RTImage *image) : + pimpl(new Impl(image, Gtk::manage(new Gtk::Label(label)))) +{ + Gtk::Grid* grid = Gtk::manage(new Gtk::Grid()); + grid->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + + if (image) { + grid->attach_next_to(*image, Gtk::POS_LEFT, 1, 1); } - box->attach_next_to(*this->label, Gtk::POS_RIGHT, 1, 1); - box->set_column_spacing(4); - box->set_row_spacing(0); - add(*box); + grid->attach_next_to(*(pimpl->label), Gtk::POS_RIGHT, 1, 1); + grid->set_column_spacing(4); + grid->set_row_spacing(0); + pack_start(*grid, Gtk::PACK_SHRINK, 0); +} + +const RTImage* ImageAndLabel::getImage() const +{ + return pimpl->image; +} + +const Gtk::Label* ImageAndLabel::getLabel() const +{ + return pimpl->label; +} + +class MyImageMenuItem::Impl +{ +private: + std::unique_ptr widget; + +public: + Impl(const Glib::ustring &label, const Glib::ustring &imageFileName) : + widget(new ImageAndLabel(label, imageFileName)) {} + Impl(const Glib::ustring &label, RTImage *itemImage) : + widget(new ImageAndLabel(label, itemImage)) {} + ImageAndLabel* getWidget() const { return widget.get(); } +}; + +MyImageMenuItem::MyImageMenuItem(const Glib::ustring& label, const Glib::ustring& imageFileName) : + pimpl(new Impl(label, imageFileName)) +{ + add(*(pimpl->getWidget())); +} + +MyImageMenuItem::MyImageMenuItem(const Glib::ustring& label, RTImage* itemImage) : + pimpl(new Impl(label, itemImage)) +{ + add(*(pimpl->getWidget())); } const RTImage *MyImageMenuItem::getImage () const { - return image; + return pimpl->getWidget()->getImage(); } const Gtk::Label* MyImageMenuItem::getLabel () const { - return label; + return pimpl->getWidget()->getLabel(); +} + +class MyRadioImageMenuItem::Impl +{ + std::unique_ptr widget; + +public: + Impl(const Glib::ustring &label, RTImage *image) : + widget(new ImageAndLabel(label, image)) {} + ImageAndLabel* getWidget() const { return widget.get(); } +}; + +MyRadioImageMenuItem::MyRadioImageMenuItem(const Glib::ustring& label, RTImage *image, Gtk::RadioButton::Group& group) : + Gtk::RadioMenuItem(group), + pimpl(new Impl(label, image)) +{ + add(*(pimpl->getWidget())); +} + +const Gtk::Label* MyRadioImageMenuItem::getLabel() const +{ + return pimpl->getWidget()->getLabel(); } MyProgressBar::MyProgressBar(int width) : w(rtengine::max(width, 10 * RTScalable::getScale())) {} diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 97c72513b..152b626de 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -20,6 +20,7 @@ #include #include +#include #include @@ -74,6 +75,17 @@ private: MyMutex mutex; }; +struct ScopedEnumHash { + template::value && !std::is_convertible::value, int>::type = 0> + size_t operator ()(T val) const noexcept + { + using type = typename std::underlying_type::type; + + return std::hash{}(static_cast(val)); + } +}; + + // TODO: The documentation says gdk_threads_enter and gdk_threads_leave should be replaced // by g_main_context_invoke(), g_idle_add() and related functions, but this will require more extensive changes. // We silence those warnings until then so that we notice the others. @@ -92,7 +104,7 @@ private: * } * */ -class GThreadLock +class GThreadLock final { public: GThreadLock() @@ -110,7 +122,7 @@ public: * * Will relock on destruction. */ -class GThreadUnLock +class GThreadUnLock final { public: GThreadUnLock() @@ -125,7 +137,7 @@ public: #pragma GCC diagnostic pop -class ConnectionBlocker +class ConnectionBlocker final { public: explicit ConnectionBlocker (Gtk::Widget *associatedWidget, sigc::connection& connection) : connection (associatedWidget ? &connection : nullptr), wasBlocked(false) @@ -152,7 +164,7 @@ private: /** * @brief Glue box to control visibility of the MyExpender's content ; also handle the frame around it */ -class ExpanderBox: public Gtk::EventBox +class ExpanderBox final : public Gtk::EventBox { private: Gtk::Container *pC; @@ -185,7 +197,7 @@ public: * * Warning: once you've instantiated this class with a text label or a widget label, you won't be able to revert to the other solution. */ -class MyExpander : public Gtk::VBox +class MyExpander final : public Gtk::Box { public: typedef sigc::signal type_signal_enabled_toggled; @@ -199,7 +211,7 @@ private: bool enabled; /// Enabled feature (default to true) bool inconsistent; /// True if the enabled button is inconsistent Gtk::EventBox *titleEvBox; /// EventBox of the title, to get a connector from it - Gtk::HBox *headerHBox; + Gtk::Box *headerHBox; bool flushEvent; /// Flag to control the weird event mechanism of Gtk (please prove me wrong!) ExpanderBox* expBox; /// Frame that includes the child and control its visibility Gtk::EventBox *imageEvBox; /// Enable/Disable or Open/Close arrow event box @@ -232,7 +244,7 @@ public: */ MyExpander(bool useEnabled, Glib::ustring titleLabel); - /** Create a custom expander with a a custom - and responsive - widget + /** Create a custom expander with a custom - and responsive - widget * @param useEnabled Set whether to handle an enabled/disabled toggle button and display the appropriate image * @param titleWidget A widget to display in the header. Warning: you won't be able to switch to a string label. */ @@ -295,7 +307,7 @@ public: /** * @brief subclass of Gtk::ScrolledWindow in order to handle the scrollwheel */ -class MyScrolledWindow : public Gtk::ScrolledWindow +class MyScrolledWindow final : public Gtk::ScrolledWindow { bool on_scroll_event (GdkEventScroll* event) override; @@ -310,7 +322,7 @@ public: /** * @brief subclass of Gtk::ScrolledWindow in order to handle the large toolbars (wider than available space) */ -class MyScrolledToolbar : public Gtk::ScrolledWindow +class MyScrolledToolbar final : public Gtk::ScrolledWindow { bool on_scroll_event (GdkEventScroll* event) override; @@ -340,7 +352,7 @@ public: /** * @brief subclass of Gtk::ComboBoxText in order to handle the scrollwheel */ -class MyComboBoxText : public Gtk::ComboBoxText +class MyComboBoxText final : public Gtk::ComboBoxText { int naturalWidth, minimumWidth; sigc::connection myConnection; @@ -360,7 +372,7 @@ public: /** * @brief subclass of Gtk::SpinButton in order to handle the scrollwheel */ -class MySpinButton : public Gtk::SpinButton +class MySpinButton final : public Gtk::SpinButton { protected: @@ -373,25 +385,27 @@ public: }; /** - * @brief subclass of Gtk::HScale in order to handle the scrollwheel + * @brief subclass of Gtk::Scale in order to handle the scrollwheel */ -class MyHScale : public Gtk::HScale +class MyHScale final : public Gtk::Scale { +protected: bool on_scroll_event (GdkEventScroll* event) override; bool on_key_press_event (GdkEventKey* event) override; + }; /** * @brief subclass of Gtk::FileChooserButton in order to handle the scrollwheel */ -class MyFileChooserButton: public Gtk::Button { +class MyFileChooserButton final : public Gtk::Button { private: void show_chooser(); Glib::ustring title_; Gtk::FileChooserAction action_; - Gtk::HBox box_; + Gtk::Box box_; Gtk::Label lbl_; std::string filename_; std::string current_folder_; @@ -473,27 +487,66 @@ typedef enum RTNav { /** * @brief Handle the switch between text and image to be displayed in the HBox (to be used in a button/toolpanel) */ -class TextOrIcon : public Gtk::HBox +class TextOrIcon final : public Gtk::Box { public: TextOrIcon (const Glib::ustring &filename, const Glib::ustring &labelTx, const Glib::ustring &tooltipTx); }; -class MyImageMenuItem : public Gtk::MenuItem +/** + * Widget with image and label placed horizontally. + */ +class ImageAndLabel final : public Gtk::Box { -private: - Gtk::Grid *box; - RTImage *image; - Gtk::Label *label; + class Impl; + std::unique_ptr pimpl; public: - MyImageMenuItem (Glib::ustring label, Glib::ustring imageFileName); - const RTImage *getImage () const; - const Gtk::Label* getLabel () const; + ImageAndLabel(const Glib::ustring& label, const Glib::ustring& imageFileName); + ImageAndLabel(const Glib::ustring& label, RTImage* image); + const RTImage* getImage() const; + const Gtk::Label* getLabel() const; }; -class MyProgressBar : public Gtk::ProgressBar +/** + * Menu item with an image and label. + */ +class MyImageMenuItemInterface +{ +public: + virtual const Gtk::Label* getLabel() const = 0; +}; + +/** + * Basic image menu item. + */ +class MyImageMenuItem final : public Gtk::MenuItem, public MyImageMenuItemInterface +{ + class Impl; + std::unique_ptr pimpl; + +public: + MyImageMenuItem (const Glib::ustring& label, const Glib::ustring& imageFileName); + MyImageMenuItem (const Glib::ustring& label, RTImage* image); + const RTImage *getImage () const; + const Gtk::Label* getLabel() const override; +}; + +/** + * Image menu item with radio selector. + */ +class MyRadioImageMenuItem final : public Gtk::RadioMenuItem, public MyImageMenuItemInterface +{ + class Impl; + std::unique_ptr pimpl; + +public: + MyRadioImageMenuItem(const Glib::ustring& label, RTImage* image, Gtk::RadioButton::Group& group); + const Gtk::Label* getLabel() const override; +}; + +class MyProgressBar final : public Gtk::ProgressBar { private: int w; @@ -512,7 +565,7 @@ public: /** * @brief Define a gradient milestone */ -class GradientMilestone +class GradientMilestone final { public: double position; diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index dd0cbde46..821f6f0be 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -22,17 +22,60 @@ #include "options.h" #include #include -#include "../rtengine/LUT.h" #include "rtimage.h" +#include "../rtengine/array2D.h" #include "../rtengine/color.h" +#include "../rtengine/improcfun.h" +#include "../rtengine/LUT.h" using namespace rtengine; +constexpr float HistogramArea::MAX_BRIGHT; +constexpr float HistogramArea::MIN_BRIGHT; + +using ScopeType = Options::ScopeType; + + +namespace +{ + +const rtengine::procparams::ColorManagementParams DEFAULT_CMP; + +} // // // HistogramPanel -HistogramPanel::HistogramPanel () +HistogramPanel::HistogramPanel () : + pointer_moved_delayed_call( + [this](bool validPos, const rtengine::procparams::ColorManagementParams *cmp, int r, int g, int b) + { + bool update_hist_area; + + if (!validPos) { + // do something to un-show vertical bars + if (histogramRGBArea) { + histogramRGBArea->updateBackBuffer(-1, -1, -1); + } + update_hist_area = histogramArea->updatePointer(-1, -1, -1); + } else { + // do something to show vertical bars + if (histogramRGBArea) { + histogramRGBArea->updateBackBuffer(r, g, b, cmp); + } + update_hist_area = histogramArea->updatePointer(r, g, b, cmp); + } + if (histogramRGBArea) { + histogramRGBArea->queue_draw(); + } + if (update_hist_area) { + histogramArea->queue_draw(); + } + }, + 50, + 100 + ), + panel_listener(nullptr) { setExpandAlignProperties(this, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); set_name("HistogramPanel"); @@ -40,30 +83,51 @@ HistogramPanel::HistogramPanel () histogramArea = Gtk::manage (new HistogramArea (this)); setExpandAlignProperties(histogramArea, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - histogramRGBArea = Gtk::manage (new HistogramRGBArea ()); - setExpandAlignProperties(histogramRGBArea, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_END); - histogramRGBArea->show(); + histogramRGBAreaHori.reset(new HistogramRGBAreaHori()); + setExpandAlignProperties(histogramRGBAreaHori.get(), true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_END); + + histogramRGBAreaVert.reset(new HistogramRGBAreaVert()); + setExpandAlignProperties(histogramRGBAreaVert.get(), false, true, Gtk::ALIGN_END, Gtk::ALIGN_FILL); + + switch (options.histogramScopeType) { + case ScopeType::NONE: + case ScopeType::HISTOGRAM_RAW: + case ScopeType::VECTORSCOPE_HC: + case ScopeType::VECTORSCOPE_HS: + histogramRGBArea = nullptr; + break; + case ScopeType::PARADE: + case ScopeType::WAVEFORM: + histogramRGBArea = histogramRGBAreaVert.get(); + break; + case ScopeType::HISTOGRAM: + histogramRGBArea = histogramRGBAreaHori.get(); + break; + } // connecting the two childs - histogramArea->signal_factor_changed().connect( sigc::mem_fun(*histogramRGBArea, &HistogramRGBArea::factorChanged) ); + histogramArea->signal_factor_changed().connect( sigc::mem_fun(*histogramRGBAreaHori, &HistogramRGBArea::factorChanged) ); + histogramArea->signal_factor_changed().connect( sigc::mem_fun(*histogramRGBAreaVert, &HistogramRGBArea::factorChanged) ); gfxGrid = Gtk::manage (new Gtk::Grid ()); - gfxGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); gfxGrid->set_row_spacing(1); gfxGrid->set_column_spacing(1); - histogramRGBArea->setParent(gfxGrid); gfxGrid->add(*histogramArea); - - if (options.histogramBar) { - gfxGrid->add (*histogramRGBArea); - } + gfxGrid->attach_next_to( + *histogramRGBAreaVert, *histogramArea, + options.histogramPosition == 1 ? Gtk::POS_RIGHT : Gtk::POS_LEFT, + 1, + 1 + ); + gfxGrid->attach_next_to(*histogramRGBAreaHori, *histogramArea, Gtk::POS_BOTTOM, 1, 1); + histogramRGBAreaHori->set_no_show_all(); + histogramRGBAreaVert->set_no_show_all(); 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 ("histogram-red-off-small.png"); @@ -71,21 +135,41 @@ HistogramPanel::HistogramPanel () 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"); + Gtk::Image* histImage = Gtk::manage(new RTImage("histogram-type-histogram-small.png")); + Gtk::Image* histRawImage = Gtk::manage(new RTImage("histogram-type-histogram-raw-small.png")); + Gtk::Image* paradeImage = Gtk::manage(new RTImage("histogram-type-parade-small.png")); + Gtk::Image* waveImage = Gtk::manage(new RTImage("histogram-type-waveform-small.png")); + Gtk::Image* vectHcImage = Gtk::manage(new RTImage("histogram-type-vectorscope-hc-small.png")); + Gtk::Image* vectHsImage = Gtk::manage(new RTImage("histogram-type-vectorscope-hs-small.png")); + showRed = Gtk::manage (new Gtk::ToggleButton ()); showGreen = Gtk::manage (new Gtk::ToggleButton ()); showBlue = Gtk::manage (new Gtk::ToggleButton ()); showValue = Gtk::manage (new Gtk::ToggleButton ()); showChro = Gtk::manage (new Gtk::ToggleButton ()); - showRAW = Gtk::manage (new Gtk::ToggleButton ()); showMode = Gtk::manage (new Gtk::Button ()); showBAR = Gtk::manage (new Gtk::ToggleButton ()); + scopeOptions = Gtk::manage (new Gtk::ToggleButton ()); + + Gtk::RadioButtonGroup scopeTypeGroup; + scopeHistBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeHistRawBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeParadeBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeWaveBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeVectHcBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeVectHsBtn = Gtk::manage(new Gtk::RadioButton(scopeTypeGroup)); + scopeHistBtn->set_mode(false); + scopeHistRawBtn->set_mode(false); + scopeParadeBtn->set_mode(false); + scopeWaveBtn->set_mode(false); + scopeVectHcBtn->set_mode(false); + scopeVectHsBtn->set_mode(false); showRed->set_name("histButton"); showRed->set_can_focus(false); @@ -97,40 +181,68 @@ HistogramPanel::HistogramPanel () showValue->set_can_focus(false); showChro->set_name("histButton"); showChro->set_can_focus(false); - showRAW->set_name("histButton"); - showRAW->set_can_focus(false); showMode->set_name("histButton"); showMode->set_can_focus(false); + scopeOptions->set_name("histButton"); + scopeOptions->set_can_focus(false); showBAR->set_name("histButton"); showBAR->set_can_focus(false); + scopeHistBtn->set_name("histButton"); + scopeHistBtn->set_can_focus(false); + scopeHistRawBtn->set_name("histButton"); + scopeHistRawBtn->set_can_focus(false); + scopeParadeBtn->set_name("histButton"); + scopeParadeBtn->set_can_focus(false); + scopeWaveBtn->set_name("histButton"); + scopeWaveBtn->set_can_focus(false); + scopeVectHcBtn->set_name("histButton"); + scopeVectHcBtn->set_can_focus(false); + scopeVectHsBtn->set_name("histButton"); + scopeVectHsBtn->set_can_focus(false); showRed->set_relief (Gtk::RELIEF_NONE); showGreen->set_relief (Gtk::RELIEF_NONE); showBlue->set_relief (Gtk::RELIEF_NONE); showValue->set_relief (Gtk::RELIEF_NONE); showChro->set_relief (Gtk::RELIEF_NONE); - showRAW->set_relief (Gtk::RELIEF_NONE); showMode->set_relief (Gtk::RELIEF_NONE); + scopeOptions->set_relief (Gtk::RELIEF_NONE); showBAR->set_relief (Gtk::RELIEF_NONE); + scopeHistBtn->set_relief (Gtk::RELIEF_NONE); + scopeHistRawBtn->set_relief (Gtk::RELIEF_NONE); + scopeParadeBtn->set_relief (Gtk::RELIEF_NONE); + scopeWaveBtn->set_relief (Gtk::RELIEF_NONE); + scopeVectHcBtn->set_relief (Gtk::RELIEF_NONE); + scopeVectHsBtn->set_relief (Gtk::RELIEF_NONE); showRed->set_tooltip_text (M("HISTOGRAM_TOOLTIP_R")); showGreen->set_tooltip_text (M("HISTOGRAM_TOOLTIP_G")); showBlue->set_tooltip_text (M("HISTOGRAM_TOOLTIP_B")); showValue->set_tooltip_text (M("HISTOGRAM_TOOLTIP_L")); showChro->set_tooltip_text (M("HISTOGRAM_TOOLTIP_CHRO")); - showRAW->set_tooltip_text (M("HISTOGRAM_TOOLTIP_RAW")); showMode->set_tooltip_text (M("HISTOGRAM_TOOLTIP_MODE")); - showBAR->set_tooltip_text (M("HISTOGRAM_TOOLTIP_BAR")); + scopeOptions->set_tooltip_text(M("HISTOGRAM_TOOLTIP_SHOW_OPTIONS")); + scopeHistBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM")); + scopeHistRawBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_HISTOGRAM_RAW")); + scopeParadeBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_PARADE")); + scopeWaveBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_WAVEFORM")); + scopeVectHcBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HC")); + scopeVectHsBtn->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TYPE_VECTORSCOPE_HS")); buttonGrid = Gtk::manage (new Gtk::Grid ()); - buttonGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + buttonGrid->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + persistentButtons = Gtk::manage(new Gtk::Box()); + persistentButtons->set_orientation(Gtk::ORIENTATION_VERTICAL); + optionButtons = Gtk::manage(new Gtk::Box()); + optionButtons->set_orientation(Gtk::ORIENTATION_VERTICAL); + 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 + scopeOptions->set_active(options.histogramShowOptionButtons); showBAR->set_active (options.histogramBar); showRed->set_image (showRed->get_active() ? *redImage : *redImage_g); @@ -138,66 +250,145 @@ HistogramPanel::HistogramPanel () showBlue->set_image (showBlue->get_active() ? *blueImage : *blueImage_g); 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); if (options.histogramDrawMode == 0) showMode->set_image(*mode0Image); else if (options.histogramDrawMode == 1) showMode->set_image(*mode1Image); else showMode->set_image(*mode2Image); + scopeHistBtn->set_image(*histImage); + scopeHistRawBtn->set_image(*histRawImage); + scopeParadeBtn->set_image(*paradeImage); + scopeWaveBtn->set_image(*waveImage); + scopeVectHcBtn->set_image(*vectHcImage); + scopeVectHsBtn->set_image(*vectHsImage); + switch(options.histogramScopeType) { + case ScopeType::HISTOGRAM: + scopeHistBtn->set_active(); + break; + case ScopeType::HISTOGRAM_RAW: + scopeHistRawBtn->set_active(); + break; + case ScopeType::PARADE: + scopeParadeBtn->set_active(); + break; + case ScopeType::WAVEFORM: + scopeWaveBtn->set_active(); + break; + case ScopeType::VECTORSCOPE_HS: + scopeVectHsBtn->set_active(); + break; + case ScopeType::VECTORSCOPE_HC: + scopeVectHcBtn->set_active(); + break; + case ScopeType::NONE: + break; + } + scopeOptions->set_image(*Gtk::manage(new RTImage("histogram-ellipsis-small.png"))); showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); - - raw_toggled(); // Make sure the luma/chroma toggles are enabled or disabled - 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); + setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showBlue , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showValue, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showChro , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(scopeOptions, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + setExpandAlignProperties(scopeOptions, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeHistBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeHistRawBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeParadeBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeWaveBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeVectHcBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(scopeVectHsBtn, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + setExpandAlignProperties(persistentButtons, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); + setExpandAlignProperties(optionButtons, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); showRed->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::red_toggled), showRed ); showGreen->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::green_toggled), showGreen ); showBlue->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::blue_toggled), showBlue ); 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 ); showMode->signal_released().connect( sigc::mem_fun(*this, &HistogramPanel::mode_released), showMode ); + scopeOptions->signal_toggled().connect(sigc::mem_fun(*this, &HistogramPanel::scopeOptionsToggled)); showBAR->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::bar_toggled), showBAR ); + scopeHistBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistBtn)); + scopeHistRawBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeHistRawBtn)); + scopeParadeBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeParadeBtn)); + scopeWaveBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeWaveBtn)); + scopeVectHcBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHcBtn)); + scopeVectHsBtn->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &HistogramPanel::type_selected), scopeVectHsBtn)); - buttonGrid->add (*showRed); - buttonGrid->add (*showGreen); - buttonGrid->add (*showBlue); - buttonGrid->add (*showValue); - buttonGrid->add (*showChro); - buttonGrid->add (*showRAW); - buttonGrid->add (*showMode); - buttonGrid->add (*showBAR); + brightnessWidget = Gtk::manage(new Gtk::Scale(Gtk::ORIENTATION_VERTICAL)); + brightnessWidget->set_inverted(); + brightnessWidget->set_range(log(HistogramArea::MIN_BRIGHT), log(HistogramArea::MAX_BRIGHT)); + brightnessWidget->set_draw_value(false); + brightnessWidget->signal_value_changed().connect(sigc::mem_fun(*this, &HistogramPanel::brightnessWidgetValueChanged)); + brightnessWidget->set_name("histScale"); + brightnessWidget->set_tooltip_text(M("HISTOGRAM_TOOLTIP_TRACE_BRIGHTNESS")); + setExpandAlignProperties(brightnessWidget, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + + optionButtons->add(*showRed); + optionButtons->add(*showGreen); + optionButtons->add(*showBlue); + optionButtons->add(*showValue); + optionButtons->add(*showChro); + optionButtons->add(*showMode); + optionButtons->add(*showBAR); + optionButtons->add(*brightnessWidget); + + Gtk::Separator* separator = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + setExpandAlignProperties(separator, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + persistentButtons->add(*scopeHistBtn); + persistentButtons->add(*scopeHistRawBtn); + persistentButtons->add(*scopeParadeBtn); + persistentButtons->add(*scopeWaveBtn); + persistentButtons->add(*scopeVectHsBtn); + persistentButtons->add(*scopeVectHcBtn); + persistentButtons->add(*separator); + persistentButtons->add(*scopeOptions); // Put the button vbox next to the window's border to be less disturbing if (options.histogramPosition == 1) { + buttonGrid->add(*persistentButtons); + buttonGrid->add(*optionButtons); + add (*buttonGrid); add (*gfxGrid); } else { + buttonGrid->add(*optionButtons); + buttonGrid->add(*persistentButtons); + add (*gfxGrid); add (*buttonGrid); } show_all (); + optionButtons->set_no_show_all(); + optionButtons->set_visible(options.histogramShowOptionButtons); + type_changed(); + updateHistAreaOptions(); + if (histogramRGBArea) { + updateHistRGBAreaOptions(); + } + + brightness_changed_connection = histogramArea->getBrighnessChangedSignal().connect(sigc::mem_fun(*this, &HistogramPanel::brightnessUpdated)); rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &HistogramPanel::resized) ); + + histogramArea->setBrightness(options.histogramTraceBrightness); } HistogramPanel::~HistogramPanel () { + pointer_moved_delayed_call.cancel(); + delete redImage; delete greenImage; delete blueImage; delete valueImage; delete chroImage; - delete rawImage; delete mode0Image; delete mode1Image; delete mode2Image; @@ -208,24 +399,51 @@ HistogramPanel::~HistogramPanel () delete blueImage_g; delete valueImage_g; delete chroImage_g; - delete rawImage_g; delete barImage_g; } +void HistogramPanel::showRGBBar() +{ + histogramRGBAreaHori->set_visible( + histogramRGBArea == histogramRGBAreaHori.get() && showBAR->get_active()); + histogramRGBAreaVert->set_visible( + histogramRGBArea == histogramRGBAreaVert.get() && showBAR->get_active()); + histogramRGBAreaHori->setShow(false); + histogramRGBAreaVert->setShow(false); + + if (!histogramRGBArea) { + return; + } + + setHistRGBInvalid(); + histogramRGBArea->setShow(showBAR->get_active()); +} + void HistogramPanel::resized (Gtk::Allocation& req) { + static int old_height = 0; + static int old_width = 0; - histogramArea->updateBackBuffer (); - histogramArea->queue_draw (); + bool size_changed = + old_height != req.get_height() || old_width != req.get_width(); + + if (!histogramArea->updatePending() && size_changed) { + histogramArea->updateBackBuffer (); + histogramArea->queue_draw (); + } // set histogramRGBArea invalid; - histogramRGBArea->updateBackBuffer(-1, -1, -1); - histogramRGBArea->queue_draw (); + if (histogramRGBArea && size_changed) { + histogramRGBArea->updateBackBuffer(-1, -1, -1); + histogramRGBArea->queue_draw (); + } // Store current height of the histogram options.histogramHeight = get_height(); + old_height = req.get_height(); + old_width = req.get_width(); } void HistogramPanel::red_toggled () @@ -258,21 +476,6 @@ void HistogramPanel::chro_toggled () rgbv_toggled(); } -void HistogramPanel::raw_toggled () -{ - if (showRAW->get_active()) { - showRAW->set_image(*rawImage); - showValue->set_sensitive(false); - showChro->set_sensitive(false); - } else { - showRAW->set_image(*rawImage_g); - showValue->set_sensitive(true); - showChro->set_sensitive(true); - } - - rgbv_toggled(); -} - void HistogramPanel::mode_released () { options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; @@ -285,21 +488,141 @@ void HistogramPanel::mode_released () rgbv_toggled(); } +void HistogramPanel::brightnessWidgetValueChanged(void) +{ + ConnectionBlocker blocker(brightness_changed_connection); + histogramArea->setBrightness(exp(brightnessWidget->get_value())); + options.histogramTraceBrightness = histogramArea->getBrightness(); +} + +void HistogramPanel::brightnessUpdated(float brightness) +{ + brightnessWidget->set_value(log(brightness)); + options.histogramTraceBrightness = histogramArea->getBrightness(); +} + +void HistogramPanel::scopeOptionsToggled() +{ + options.histogramShowOptionButtons = scopeOptions->get_active(); + optionButtons->set_visible(scopeOptions->get_active()); +} + +void HistogramPanel::type_selected(Gtk::RadioButton* button) +{ + ScopeType new_type = ScopeType::NONE; + + if (button == scopeHistBtn) { + new_type = ScopeType::HISTOGRAM; + } else if (button == scopeHistRawBtn) { + new_type = ScopeType::HISTOGRAM_RAW; + } else if (button == scopeParadeBtn) { + new_type = ScopeType::PARADE; + } else if (button == scopeWaveBtn) { + new_type = ScopeType::WAVEFORM; + } else if (button == scopeVectHcBtn) { + new_type = ScopeType::VECTORSCOPE_HC; + } else if (button == scopeVectHsBtn) { + new_type = ScopeType::VECTORSCOPE_HS; + } + + if (new_type == options.histogramScopeType) { + return; + } + + options.histogramScopeType = new_type; + + type_changed(); + updateHistAreaOptions(); + if (histogramRGBArea) { + updateHistRGBAreaOptions(); + } + histogramArea->setDirty(true); + histogramArea->queue_draw(); +} + +void HistogramPanel::type_changed() +{ + switch (options.histogramScopeType) { + case ScopeType::HISTOGRAM: + showRed->show(); + showGreen->show(); + showBlue->show(); + showValue->show(); + showChro->show(); + showMode->show(); + showBAR->show(); + showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_BAR")); + brightnessWidget->hide(); + histogramRGBArea = histogramRGBAreaHori.get(); + break; + case ScopeType::HISTOGRAM_RAW: + showRed->show(); + showGreen->show(); + showBlue->show(); + showValue->hide(); + showChro->hide(); + showMode->show(); + showBAR->hide(); + brightnessWidget->hide(); + histogramRGBArea = nullptr; + break; + case ScopeType::PARADE: + case ScopeType::WAVEFORM: + showRed->show(); + showGreen->show(); + showBlue->show(); + showValue->show(); + showChro->hide(); + showMode->hide(); + showBAR->show(); + showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_BAR")); + brightnessWidget->show(); + histogramRGBArea = histogramRGBAreaVert.get(); + break; + case ScopeType::VECTORSCOPE_HC: + case ScopeType::VECTORSCOPE_HS: + showRed->hide(); + showGreen->hide(); + showBlue->hide(); + showValue->hide(); + showChro->hide(); + showMode->hide(); + showBAR->show(); + showBAR->set_tooltip_text(M("HISTOGRAM_TOOLTIP_CROSSHAIR")); + brightnessWidget->show(); + histogramRGBArea = nullptr; + break; + case ScopeType::NONE: + break; + } + + if (panel_listener) { + updateHistAreaOptions(); + panel_listener->scopeTypeChanged(options.histogramScopeType); + } + + showRGBBar(); +} + void HistogramPanel::bar_toggled () { showBAR->set_image(showBAR->get_active() ? *barImage : *barImage_g); rgbv_toggled(); + showRGBBar(); } void HistogramPanel::rgbv_toggled () { // Update Display - histogramArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), options.histogramDrawMode); + updateHistAreaOptions(); + histogramArea->updateBackBuffer (); histogramArea->queue_draw (); - 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); - histogramRGBArea->queue_draw (); + if (histogramRGBArea) { + updateHistRGBAreaOptions(); + histogramRGBArea->updateBackBuffer(-1, -1, -1); + histogramRGBArea->queue_draw (); + } } void HistogramPanel::setHistRGBInvalid () @@ -309,17 +632,9 @@ void HistogramPanel::setHistRGBInvalid () histogramRGBArea->queue_draw (); } -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) +void HistogramPanel::pointerMoved(bool validPos, const rtengine::procparams::ColorManagementParams &cmp, 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); - } else { - // do something to show vertical bars - histogramRGBArea->updateBackBuffer(r, g, b, profile, profileW); - } - histogramRGBArea->queue_draw (); + pointer_moved_delayed_call(validPos, &cmp, r, g, b); } /* @@ -333,11 +648,27 @@ void HistogramPanel::reorder (Gtk::PositionType align) removeIfThere(this, gfxGrid, false); add (*gfxGrid); gfxGrid->unreference(); + + gfxGrid->remove(*histogramRGBAreaVert); + gfxGrid->add(*histogramRGBAreaVert); + + optionButtons->reference(); + removeIfThere(buttonGrid, optionButtons, false); + buttonGrid->add(*optionButtons); + optionButtons->unreference(); } else { buttonGrid->reference(); removeIfThere(this, buttonGrid, false); add (*buttonGrid); buttonGrid->unreference(); + + gfxGrid->remove(*histogramRGBAreaVert); + gfxGrid->attach_next_to(*histogramRGBAreaVert, *histogramArea, Gtk::POS_LEFT, 1, 1); + + persistentButtons->reference(); + removeIfThere(buttonGrid, persistentButtons, false); + buttonGrid->add(*persistentButtons); + persistentButtons->unreference(); } } @@ -352,6 +683,41 @@ void HistogramPanel::toggleButtonMode () showMode->set_image(*mode2Image); } +void HistogramPanel::setPanelListener(HistogramPanelListener* listener) +{ + panel_listener = listener; + + if (listener) { + listener->scopeTypeChanged(options.histogramScopeType); + } +} + +void HistogramPanel::updateHistAreaOptions() +{ + histogramArea->updateOptions( + showRed->get_active(), + showGreen->get_active(), + showBlue->get_active(), + showValue->get_active(), + showChro->get_active(), + options.histogramDrawMode, + options.histogramScopeType, + showBAR->get_active() + ); +} + +void HistogramPanel::updateHistRGBAreaOptions() +{ + histogramRGBArea->updateOptions( + showRed->get_active(), + showGreen->get_active(), + showBlue->get_active(), + showValue->get_active(), + showChro->get_active(), + showBAR->get_active() + ); +} + // // // @@ -369,10 +735,9 @@ double HistogramScaling::log(double vsize, double val) 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), + needLuma(options.histogramLuma), needChroma(options.histogramChroma), showMode(options.histogramBar), barDisplayed(options.histogramBar), parent(nullptr) { - get_style_context()->add_class("drawingarea"); set_name("HistogramRGBArea"); @@ -394,46 +759,41 @@ HistogramRGBArea::~HistogramRGBArea () } -Gtk::SizeRequestMode HistogramRGBArea::get_request_mode_vfunc () const +void HistogramRGBArea::getPreferredThickness(int& min_thickness, int& natural_thickness) const { - return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; + int minimumLength = 0; + int naturalLength = 0; + getPreferredLength(minimumLength, naturalLength); + getPreferredThicknessForLength(minimumLength, min_thickness, natural_thickness); } -void HistogramRGBArea::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); -} - -void HistogramRGBArea::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const +void HistogramRGBArea::getPreferredLength(int& min_length, int& natural_length) const { int s = RTScalable::getScale(); - minimum_width = 60 * s; - natural_width = 200 * s; + min_length = 60 * s; + natural_length = 200 * s; } -void HistogramRGBArea::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const +void HistogramRGBArea::getPreferredThicknessForLength(int length, int& min_thickness, int& natural_thickness) const { - int bHeight = width / 30; + int bThickness = length / 30; int s = RTScalable::getScale(); - if (bHeight > (10 * s)) { - bHeight = 10 * s; - } else if (bHeight < (5 * s)) { - bHeight = 5 * s; + if (bThickness > (10 * s)) { + bThickness = 10 * s; + } else if (bThickness < (5 * s)) { + bThickness = 5 * s; } - minimum_height = bHeight; - natural_height = bHeight; + min_thickness = bThickness; + natural_thickness = bThickness; } // unused? -void HistogramRGBArea::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const +void HistogramRGBArea::getPreferredLengthForThickness(int thickness, int& min_length, int& natural_length) const { - get_preferred_width_vfunc (minimum_width, natural_width); + getPreferredLength(min_length, natural_length); } bool HistogramRGBArea::getShow() @@ -441,9 +801,18 @@ bool HistogramRGBArea::getShow() return(showMode); } -void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) +void HistogramRGBArea::setShow(bool show) { - if (!get_realized () || !showMode || rawMode) { + showMode = show; +} + +void HistogramRGBArea::updateBackBuffer(int r, int g, int b, const rtengine::procparams::ColorManagementParams *cmp) +{ + if (!get_realized () || !showMode || !( + options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::PARADE + || options.histogramScopeType == ScopeType::WAVEFORM + )) { return; } @@ -474,72 +843,47 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustrin if (needRed) { // Red cc->set_source_rgb(1.0, 0.0, 0.0); - if (options.histogramDrawMode < 2) { - cc->move_to(r * (winw - 1.) / 255.0 + 0.5*s, 0); // Rescaling seems needed to fit between boundaries of draw area - cc->line_to(r * (winw - 1.) / 255.0 + 0.5*s, winh - 0); - } else { - cc->move_to(HistogramScaling::log (255, r) * (winw - 1.*s) / 255.0 + 0.5*s, 0); - cc->line_to(HistogramScaling::log (255, r) * (winw - 1.*s) / 255.0 + 0.5*s, winh - 0); - } - cc->stroke(); + drawBar(cc, r, 255.0, winw, winh, s); } if (needGreen) { // Green cc->set_source_rgb(0.0, 1.0, 0.0); - if (options.histogramDrawMode < 2) { - cc->move_to(g * (winw - 1.) / 255.0 + 0.5*s, 0); - cc->line_to(g * (winw - 1.) / 255.0 + 0.5*s, winh - 0); - } else { - cc->move_to(HistogramScaling::log (255, g) * (winw - 1.) / 255.0 + 0.5*s, 0); - cc->line_to(HistogramScaling::log (255, g) * (winw - 1.) / 255.0 + 0.5*s, winh - 0); - } - cc->stroke(); + drawBar(cc, g, 255.0, winw, winh, s); } if (needBlue) { // Blue cc->set_source_rgb(0.0, 0.4, 1.0); - if (options.histogramDrawMode < 2) { - cc->move_to(b * (winw - 1.) / 255.0 + 0.5*s, 0); - cc->line_to(b * (winw - 1.) / 255.0 + 0.5*s, winh - 0); - } else { - cc->move_to(HistogramScaling::log (255, b) * (winw - 1.) / 255.0 + 0.5*s, 0); - cc->line_to(HistogramScaling::log (255, b) * (winw - 1.) / 255.0 + 0.5*s, winh - 0); - } - cc->stroke(); + drawBar(cc, b, 255.0, winw, winh, s); } - if(needLuma || needChroma) { + if( + (needLuma || needChroma) + && (options.histogramScopeType == ScopeType::HISTOGRAM + || options.histogramScopeType == ScopeType::PARADE + || options.histogramScopeType == ScopeType::WAVEFORM) + ) { float 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); + ImProcFunctions::rgb2lab( + static_cast(r), + static_cast(g), + static_cast(b), + Lab_L, Lab_a, Lab_b, + cmp != nullptr ? *cmp : DEFAULT_CMP, + true); if (needLuma) { // Luma cc->set_source_rgb(1.0, 1.0, 1.0); - if (options.histogramDrawMode < 2) { - cc->move_to(Lab_L * (winw - 3.*s) / 100.0 + 0.5*s, 0); - cc->line_to(Lab_L * (winw - 3.*s) / 100.0 + 0.5*s, winh - 0); - } else { - cc->move_to(HistogramScaling::log (100, Lab_L) * (winw - 1.) / 100.0 + 0.5*s, 0); - cc->line_to(HistogramScaling::log (100, Lab_L) * (winw - 1.) / 100.0 + 0.5*s, winh - 0); - } - cc->stroke(); + drawBar(cc, Lab_L, 32768., winw, winh, s); } - if (needChroma) { + if (needChroma && options.histogramScopeType == ScopeType::HISTOGRAM) { // 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); + double chromaval = sqrt(Lab_a * Lab_a + Lab_b * Lab_b) / (255. * 188); cc->set_source_rgb(0.9, 0.9, 0.0); - if (options.histogramDrawMode < 2) { - cc->move_to(chromaval * (winw - 1.) / 100.0 + 0.5*s, 0); - cc->line_to(chromaval * (winw - 1.) / 100.0 + 0.5*s, winh - 0); - } else { - cc->move_to(HistogramScaling::log (100, chromaval) * (winw - 1.) / 100.0 + 0.5*s, 0); - cc->line_to(HistogramScaling::log (100, chromaval) * (winw - 1.) / 100.0 + 0.5*s, winh - 0); - } - cc->stroke(); + drawBar(cc, chromaval, 1.0, winw, winh, s); } } } @@ -586,7 +930,7 @@ void HistogramRGBArea::update (int valh, int rh, int gh, int bh) ); } -void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, bool bar) +void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool bar) { options.histogramRed = needRed = r; @@ -594,18 +938,8 @@ void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bo 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) { - parent->add(*this); - barDisplayed = true; - } else if (!bar && barDisplayed) { - removeIfThere(parent, this, false); - barDisplayed = false; - } - } void HistogramRGBArea::on_realize () @@ -650,16 +984,105 @@ void HistogramRGBArea::factorChanged (double newFactor) factor = newFactor; } +void HistogramRGBAreaHori::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) +{ + double pos; + if (options.histogramDrawMode < 2) { + pos = padding + value * (winw - padding * 2.0) / max_value + 0.5 * scale; + } else { + pos = padding + HistogramScaling::log (max_value, value) * (winw - padding * 2.0) / max_value + 0.5 * scale; + } + cc->move_to(pos, 0.0); + cc->line_to(pos, winh - 0.0); + cc->stroke(); +} + +Gtk::SizeRequestMode HistogramRGBAreaHori::get_request_mode_vfunc () const +{ + return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; +} + +void HistogramRGBAreaHori::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const +{ + getPreferredThickness(minimum_height, natural_height); +} + +void HistogramRGBAreaHori::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const +{ + getPreferredLength(minimum_width, natural_width); +} + +void HistogramRGBAreaHori::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const +{ + getPreferredThicknessForLength(width, minimum_height, natural_height); +} + +void HistogramRGBAreaHori::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const +{ + getPreferredLengthForThickness(height, minimum_width, natural_width); +} + +void HistogramRGBAreaVert::drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) +{ + double pos; + if (options.histogramDrawMode < 2 || options.histogramScopeType == ScopeType::PARADE || options.histogramScopeType == ScopeType::WAVEFORM) { + pos = padding + value * (winh - padding * 2.0 - 1) / max_value + 0.5 * scale; + } else { + pos = padding + HistogramScaling::log (max_value, value) * (winh - padding * 2.0) / max_value + 0.5 * scale; + } + cc->move_to(0.0, winh - pos); + cc->line_to(winw, winh - pos); + cc->stroke(); +} + +Gtk::SizeRequestMode HistogramRGBAreaVert::get_request_mode_vfunc () const +{ + return Gtk::SIZE_REQUEST_WIDTH_FOR_HEIGHT; +} + +void HistogramRGBAreaVert::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const +{ + getPreferredLength(minimum_height, natural_height); +} + +void HistogramRGBAreaVert::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const +{ + minimum_width = 10 * RTScalable::getScale(); + natural_width = minimum_width; +} + +void HistogramRGBAreaVert::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const +{ + getPreferredLengthForThickness(width, minimum_height, natural_height); +} + +void HistogramRGBAreaVert::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const +{ + get_preferred_width_vfunc(minimum_width, natural_width); +} + // // // // HistogramArea HistogramArea::HistogramArea (DrawModeListener *fml) : + vectorscope_scale(0), + vect_hc(0, 0), vect_hs(0, 0), + vect_hc_buffer_dirty(true), vect_hs_buffer_dirty(true), + waveform_scale(0), + rwave(0, 0), gwave(0, 0),bwave(0, 0), lwave(0, 0), + parade_buffer_r_dirty(true), parade_buffer_g_dirty(true), parade_buffer_b_dirty(true), + wave_buffer_dirty(true), wave_buffer_luma_dirty(true), valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), + scopeType(options.histogramScopeType), oldwidth(-1), oldheight(-1), + trace_brightness(1.0), needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), - needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), - isPressed(false), movingPosition(0.0) + needLuma(options.histogramLuma), needChroma(options.histogramChroma), + isPressed(false), movingPosition(0.0), + needPointer(options.histogramBar), + pointer_red(-1), pointer_green(-1), pointer_blue(-1), + pointer_a(0), pointer_b(0) { rhist(256); @@ -695,7 +1118,7 @@ Gtk::SizeRequestMode HistogramArea::get_request_mode_vfunc () const void HistogramArea::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - int s = (int)RTScalable::getScale(); + int s = RTScalable::getScale(); minimum_height = 100 * s; natural_height = 200 * s; } @@ -703,7 +1126,7 @@ void HistogramArea::get_preferred_height_vfunc (int &minimum_height, int &natura void HistogramArea::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - int s = (int)RTScalable::getScale(); + int s = RTScalable::getScale(); minimum_width = 200 * s; natural_width = 400 * s; } @@ -720,18 +1143,23 @@ 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 c, bool raw, int mode) +void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, int mode, ScopeType type, bool pointer) { + wave_buffer_dirty = wave_buffer_dirty || needRed != r || needGreen != g || needBlue != b; 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; + options.histogramScopeType = scopeType = type; + options.histogramBar = needPointer = pointer; +} - updateBackBuffer (); +bool HistogramArea::updatePending(void) +{ + return haih->pending > 0 && !haih->destroyed; } void HistogramArea::update( @@ -742,18 +1170,55 @@ void HistogramArea::update( const LUTu& histChroma, const LUTu& histRedRaw, const LUTu& histGreenRaw, - const LUTu& histBlueRaw + const LUTu& histBlueRaw, + int vectorscopeScale, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, + int waveformScale, + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ) { if (histRed) { - rhist = histRed; - ghist = histGreen; - bhist = histBlue; - lhist = histLuma; - chist = histChroma; - rhistRaw = histRedRaw; - ghistRaw = histGreenRaw; - bhistRaw = histBlueRaw; + switch (scopeType) { + case ScopeType::HISTOGRAM: + rhist = histRed; + ghist = histGreen; + bhist = histBlue; + lhist = histLuma; + chist = histChroma; + break; + case ScopeType::HISTOGRAM_RAW: + rhistRaw = histRedRaw; + ghistRaw = histGreenRaw; + bhistRaw = histBlueRaw; + break; + case ScopeType::PARADE: + case ScopeType::WAVEFORM: { + MyWriterLock wave_lock(wave_mutex); + waveform_scale = waveformScale; + rwave = waveformRed; + gwave = waveformGreen; + bwave = waveformBlue; + lwave = waveformLuma; + parade_buffer_r_dirty = parade_buffer_g_dirty = parade_buffer_b_dirty = wave_buffer_dirty = wave_buffer_luma_dirty = true; + break; + } + case ScopeType::VECTORSCOPE_HS: + vectorscope_scale = vectorscopeScale; + vect_hs = vectorscopeHS; + vect_hs_buffer_dirty = true; + break; + case ScopeType::VECTORSCOPE_HC: + vectorscope_scale = vectorscopeScale; + vect_hc = vectorscopeHC; + vect_hc_buffer_dirty = true; + break; + case ScopeType::NONE: + break; + } valid = true; } else { valid = false; @@ -788,7 +1253,6 @@ void HistogramArea::update( void HistogramArea::updateBackBuffer () { - if (!get_realized ()) { return; } @@ -822,42 +1286,54 @@ void HistogramArea::updateBackBuffer () 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 nrOfHGridPartitions = static_cast(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, 0.); - cr->line_to ((pow(2.0,i) - 1) / 255.0 * w + 0.5, h); - 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, 0.); - cr->line_to (HistogramScaling::log (255, pow(2.0,i) - 1) / 255.0 * w + 0.5, h); + if (options.histogramScopeType == ScopeType::HISTOGRAM || options.histogramScopeType == ScopeType::HISTOGRAM_RAW) { + for (int i = 0; i <= nrOfVGridPartitions; i++) { + double xpos = padding + 0.5; + if (options.histogramDrawMode < 2) { + xpos += (pow(2.0,i) - 1) * (w - padding * 2.0) / 255.0; + } else { + xpos += HistogramScaling::log (255, pow(2.0,i) - 1) * (w - padding * 2.0) / 255.0; + } + cr->move_to (xpos, 0.); + cr->line_to (xpos, h); cr->stroke (); } } // draw horizontal gridlines - if (options.histogramDrawMode == 0) { + if (options.histogramScopeType == ScopeType::PARADE || options.histogramScopeType == ScopeType::WAVEFORM) { + for (int i = 0; i <= nrOfVGridPartitions; i++) { + const double ypos = h - padding - (pow(2.0,i) - 1) * (h - 2 * padding - 1) / 255.0; + cr->move_to(0, ypos); + cr->line_to(w, ypos); + cr->stroke(); + } + } else if (options.histogramScopeType == ScopeType::VECTORSCOPE_HC || options.histogramScopeType == ScopeType::VECTORSCOPE_HS) { + // Vectorscope has no gridlines. + } else if (options.histogramDrawMode == 0) { for (int i = 1; i < nrOfHGridPartitions; i++) { - cr->move_to (0., i * (double)h / nrOfHGridPartitions + 0.5); - cr->line_to (w, i * (double)h / nrOfHGridPartitions + 0.5); + cr->move_to (padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); + cr->line_to (w - padding, i * static_cast(h) / nrOfHGridPartitions + 0.5); cr->stroke (); } } else { for (int i = 1; i < nrOfHGridPartitions; i++) { - cr->move_to (0., h - HistogramScaling::log (h, i * (double)h / nrOfHGridPartitions) + 0.5*s); - cr->line_to (w, h - HistogramScaling::log (h, i * (double)h / nrOfHGridPartitions) + 0.5*s); + cr->move_to (padding, h - HistogramScaling::log (h, i * static_cast(h) / nrOfHGridPartitions) + 0.5); + cr->line_to (w - padding, h - HistogramScaling::log (h, i * static_cast(h) / nrOfHGridPartitions) + 0.5); cr->stroke (); } } cr->unset_dash(); - if (valid) { + MyReaderLock wave_lock(wave_mutex); + if (valid && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW)) { + bool rawMode = scopeType == ScopeType::HISTOGRAM_RAW; + // For RAW mode use the other hists LUTu& rh = rawMode ? rhistRaw : rhist; LUTu& gh = rawMode ? ghistRaw : ghist; @@ -964,7 +1440,14 @@ void HistogramArea::updateBackBuffer () drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } + } else if (scopeType == ScopeType::PARADE && rwave.getWidth() > 0) { + drawParade(cr, w, h); + } else if (scopeType == ScopeType::WAVEFORM && rwave.getWidth() > 0) { + drawWaveform(cr, w, h); + } else if (scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS) { + drawVectorscope(cr, w, h); } + wave_lock.release(); // Draw the frame's border style->render_frame(cr, 0, 0, surface->get_width(), surface->get_height()); @@ -975,6 +1458,33 @@ void HistogramArea::updateBackBuffer () setDirty(false); } +bool HistogramArea::updatePointer(int r, int g, int b, const rtengine::procparams::ColorManagementParams *cmp) +{ + if (!needPointer || !(scopeType == ScopeType::VECTORSCOPE_HC || scopeType == ScopeType::VECTORSCOPE_HS)) { + return false; + } + if (pointer_red == r && pointer_green == g && pointer_blue == b) { + return false; + } + + float L; + pointer_red = r; + pointer_green = g; + pointer_blue = b; + ImProcFunctions::rgb2lab( + static_cast(r), + static_cast(g), + static_cast(b), + L, pointer_a, pointer_b, + cmp != nullptr ? *cmp : DEFAULT_CMP, + true); + L /= 327.68f; + pointer_a /= 327.68f; + pointer_b /= 327.68f; + updateBackBuffer(); + return true; +} + void HistogramArea::on_realize () { @@ -988,28 +1498,28 @@ void HistogramArea::drawCurve(Cairo::RefPtr &cr, double s = RTScalable::getScale(); cr->set_line_width(s); - cr->move_to (0, vsize - 1); - scale = scale <= 0.f ? 0.001f : scale; // avoid division by zero and negative values + cr->move_to (padding, vsize - 1); + scale = scale <= 0.0 ? 0.001 : scale; // avoid division by zero and negative values for (int i = 0; i < 256; i++) { - double val = data[i] * (double)vsize / scale; + double val = data[i] * static_cast(vsize) / scale; if (drawMode > 0) { // scale y for single and double log-scale - val = HistogramScaling::log ((double)vsize, val); + val = HistogramScaling::log (static_cast(vsize), val); } double iscaled = i; if (drawMode == 2) { // scale x for double log-scale - iscaled = HistogramScaling::log (255.0, (double)i); + iscaled = HistogramScaling::log (255.0, static_cast(i)); } - double posX = (iscaled / 255.0) * (hsize - 1); + double posX = padding + iscaled * (hsize - padding * 2.0) / 255.0; double posY = vsize - 2 + val * (4 - vsize) / vsize; cr->line_to (posX, posY); } - cr->line_to (hsize - 1, vsize - 1); + cr->line_to (hsize - padding, vsize - 1); } void HistogramArea::drawMarks(Cairo::RefPtr &cr, @@ -1018,20 +1528,389 @@ void HistogramArea::drawMarks(Cairo::RefPtr &cr, int s = 8 * RTScalable::getScale(); if(data[0] > scale) { - cr->rectangle(0, (ui++)*s, s, s); + cr->rectangle(padding, (ui++)*s, s, s); } if(data[255] > scale) { - cr->rectangle(hsize - s, (oi++)*s, s, s); + cr->rectangle(hsize - s - padding, (oi++)*s, s, s); } cr->fill(); } +void HistogramArea::drawParade(Cairo::RefPtr &cr, int w, int h) +{ + // Arbitrary scale factor divided by current scale. + const float scale = trace_brightness * 32.f * 255.f / waveform_scale; + const int wave_width = rwave.getWidth(); + const int wave_height = rwave.getHeight(); + + // See Cairo documentation on stride. + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); + const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; + + if (parade_buffer_r_dirty && needRed) { + parade_buffer_r.assign(buffer_size, 0); + assert(parade_buffer_r.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const r_row = rwave[val]; + std::uint32_t* const buffer_r_row = reinterpret_cast(parade_buffer_r.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char r = std::min(scale * r_row[col], 0xff); + if (r != 0) { + buffer_r_row[col] = (r << 16) | (r << 24); + } + } + } + + parade_buffer_r_dirty = false; + } + + if (parade_buffer_g_dirty && needGreen) { + parade_buffer_g.assign(buffer_size, 0); + assert(parade_buffer_g.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const g_row = gwave[val]; + std::uint32_t* const buffer_g_row = reinterpret_cast(parade_buffer_g.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char g = std::min(scale * g_row[col], 0xff); + if (g != 0) { + buffer_g_row[col] = (g << 8) | (g << 24); + } + } + } + + parade_buffer_g_dirty = false; + } + + if (parade_buffer_b_dirty && needBlue) { + parade_buffer_b.assign(buffer_size, 0); + assert(parade_buffer_b.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const b_row = bwave[val]; + std::uint32_t* const buffer_b_row = reinterpret_cast(parade_buffer_b.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char b = std::min(scale * b_row[col], 0xff); + if (b != 0) { + const unsigned char green = b / 2; // Make blue easier to see. + buffer_b_row[col] = b | (green << 8) | (b << 24); + } + } + } + + parade_buffer_b_dirty = false; + } + + if (wave_buffer_luma_dirty && needLuma) { + wave_buffer_luma.assign(buffer_size, 0); + assert(wave_buffer_luma.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const l_row = lwave[val]; + std::uint32_t* const buffer_row = + reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char l = std::min(scale * l_row[col], 0xff); + buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); + } + } + + wave_buffer_luma_dirty = false; + } + + std::vector buffers; + if (needLuma) { + buffers.push_back(wave_buffer_luma.data()); + } + if (needRed) { + buffers.push_back(parade_buffer_r.data()); + } + if (needGreen) { + buffers.push_back(parade_buffer_g.data()); + } + if (needBlue) { + buffers.push_back(parade_buffer_b.data()); + } + + auto orig_matrix = cr->get_matrix(); + const double display_wave_width = static_cast(w) / buffers.size(); + for (unsigned i = 0; i < buffers.size(); i++) { + Cairo::RefPtr surface; + cr->translate(i * display_wave_width, padding); + cr->scale(display_wave_width / wave_width, (h - 2 * padding) / wave_height); + surface = Cairo::ImageSurface::create( + buffers[i], Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + cr->set_matrix(orig_matrix); + } +} + +void HistogramArea::drawVectorscope(Cairo::RefPtr &cr, int w, int h) +{ + if (scopeType != ScopeType::VECTORSCOPE_HC && scopeType != ScopeType::VECTORSCOPE_HS) { + return; + } + + const auto& vect = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc : vect_hs; + auto& vect_buffer = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc_buffer : vect_hs_buffer; + auto& vect_buffer_dirty = (scopeType == ScopeType::VECTORSCOPE_HC) ? vect_hc_buffer_dirty : vect_hs_buffer_dirty; + + const int vect_width = vect.getWidth(); + const int vect_height = vect.getHeight(); + // Arbitrary scale factor multiplied by vectorscope area and divided by + // current scale. + const float scale = trace_brightness * 8.f * vect_width * vect_height / vectorscope_scale; + + // See Cairo documentation on stride. + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, vect_width); + + if (vect_buffer_dirty && vectorscope_scale > 0) { + if (vect_buffer.size() != static_cast(cairo_stride) * vect_height) { + vect_buffer.resize(static_cast(cairo_stride) * vect_height); + } + + assert(vect_buffer.size() % 4 == 0); + + for (int y = 0; y < vect_height; y++) { + const int* const vect_row = vect[y]; + std::uint32_t* const buffer_row = + reinterpret_cast(vect_buffer.data() + (vect_height - 1 - y) * cairo_stride); + for (int x = 0; x < vect_width; x++) { + const unsigned char value = std::min(scale * vect_row[x], 0xff); + buffer_row[x] = value | (value << 8) | (value << 16) | (value << 24); + } + } + + vect_buffer_dirty = false; + } + + const bool fit_width = + vect_width * (h - 2 * padding) > vect_height * (w - 2 * padding); + const float scope_scale = fit_width ? + (w - 2 * padding) / vect_width : (h - 2 * padding) / vect_height; + const float scope_size = (vectorscope_scale > 0) ? + scope_scale * std::max(vect_width, vect_height) : std::min(w, h) - 2 * padding; + const float o_x = (w - scope_scale * vect_width) / 2; + const float o_y = (h - scope_scale * vect_height) / 2; + const double s = RTScalable::getScale(); + auto orig_matrix = cr->get_matrix(); + const double line_length = scope_size / 2.0; + std::valarray ch_ds(1); + + cr->translate(w / 2.0, h / 2.0); + cr->set_line_width (1.0 * s); + cr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); + ch_ds[0] = 4; + + if (scopeType == ScopeType::VECTORSCOPE_HS) { // Hue-Saturation. + // RYGCBM lines. + cr->set_line_width (2.0 * s); + constexpr double color_labels[6][3] = { + {1, 0, 0}, // R + {0, 1, 0}, // G + {0, 0, 1}, // B + {0, 1, 1}, // C + {1, 0, 1}, // M + {1, 1, 0}, // Y + }; + for (int i = 0; i < 3; i++) { + auto gradient = Cairo::LinearGradient::create(-line_length, 0, line_length, 0); + const double (&color_1)[3] = color_labels[i]; + const double (&color_2)[3] = color_labels[i + 3]; + cr->set_source(gradient); + gradient->add_color_stop_rgba(0, color_2[0], color_2[1], color_2[2], 0.5); + gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); + gradient->add_color_stop_rgba(1, color_1[0], color_1[1], color_1[2], 0.5); + cr->move_to(-line_length, 0); + cr->line_to(line_length, 0); + cr->rotate_degrees(-120); + cr->stroke(); + } + cr->set_line_width (1.0 * s); + cr->set_source_rgba (1, 1, 1, 0.25); + // 100% saturation circle. + cr->arc(0, 0, scope_size / 2.0, 0, 2 * RT_PI); + cr->stroke(); + // 25%, 50%, and 75% saturation. + cr->set_dash(ch_ds, 0); + for (int i = 1; i < 4; i++) { + cr->arc(0, 0, i * scope_size / 8.0, 0, 2 * RT_PI); + cr->stroke(); + } + // HSV skin tone line derived from -I axis of YIQ. + cr->rotate(-0.134900 * RT_PI); + cr->move_to(0, 0); + cr->line_to(line_length, 0); + cr->stroke(); + cr->unset_dash(); + } else if (scopeType == ScopeType::VECTORSCOPE_HC) { // Hue-Chroma. + // a and b axes. + Cairo::RefPtr gradient; + cr->set_line_width (2.0 * s); + gradient = Cairo::LinearGradient::create(0, -line_length, 0, line_length); + cr->set_source(gradient); + gradient->add_color_stop_rgba(0, 1, 1, 0, 0.5); // "yellow" + gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); // neutral + gradient->add_color_stop_rgba(1, 0, 0, 1, 0.5); // "blue" + cr->move_to(0, 0); + cr->line_to(0, line_length); + cr->move_to(0, 0); + cr->line_to(0, -line_length); + cr->stroke(); + gradient = Cairo::LinearGradient::create(-line_length, 0, line_length, 0); + cr->set_source(gradient); + gradient->add_color_stop_rgba(0, 0, 1, 0, 0.5); // "green" + gradient->add_color_stop_rgba(0.5, 1, 1, 1, 0.25); // neutral + gradient->add_color_stop_rgba(1, 1, 0, 1, 0.5); // "magenta" + cr->move_to(0, 0); + cr->line_to(line_length, 0); + cr->move_to(0, 0); + cr->line_to(-line_length, 0); + cr->stroke(); + cr->set_source_rgba (1, 1, 1, 0.25); + cr->set_line_width (1.0 * s); + // 25%, 50%, 75%, and 100% of standard chroma range. + cr->set_dash(ch_ds, 0); + for (int i = 1; i <= 4; i++) { + cr->arc(0, 0, i * scope_size / 8.0, 0, 2 * RT_PI); + cr->stroke(); + } + // CIELAB skin tone line, approximated by 50% saturation and + // value along the HSV skin tone line. + cr->rotate(-0.321713 * RT_PI); + cr->move_to(0, 0); + cr->line_to(line_length, 0); + cr->stroke(); + cr->unset_dash(); + } + cr->set_matrix(orig_matrix); + + // Vectorscope trace. + if (vectorscope_scale > 0) { + Cairo::RefPtr surface = Cairo::ImageSurface::create( + vect_buffer.data(), Cairo::FORMAT_ARGB32, vect_width, vect_height, cairo_stride); + cr->translate(o_x, o_y); + cr->scale(scope_scale, scope_scale); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + cr->set_matrix(orig_matrix); + + if (needPointer && pointer_red >= 0 && pointer_green >= 0 && pointer_blue >= 0) { + float cx, cy; + if (scopeType == ScopeType::VECTORSCOPE_HS) { + float H, S, L; + Color::rgb2hslfloat(pointer_red * 257.f, pointer_green * 257.f, pointer_blue * 257.f, H, S, L); + cx = (w + scope_size * S * std::cos(H * 2 * RT_PI_F)) / 2; + cy = (h - scope_size * S * std::sin(H * 2 * RT_PI_F)) / 2; + } else { + constexpr float ab_factor = 1.f / 256.f; + cx = w / 2.f + scope_size * pointer_a * ab_factor; + cy = h / 2.f - scope_size * pointer_b * ab_factor; + } + const float crosshair_size = 20.f * s; + cr->set_source_rgba(1, 1, 1, 0.5); + cr->move_to(cx - crosshair_size, cy); + cr->line_to(cx + crosshair_size, cy); + cr->move_to(cx, cy - crosshair_size); + cr->line_to(cx, cy + crosshair_size); + cr->stroke(); + cr->arc(cx, cy, 3 * s, 0, 2 * RT_PI); + cr->set_source_rgb(1, 1, 1); + cr->fill_preserve(); + cr->set_source_rgb(0, 0, 0); + cr->set_line_width (1.0 * s); + cr->stroke(); + } + } +} + +void HistogramArea::drawWaveform(Cairo::RefPtr &cr, int w, int h) +{ + // Arbitrary scale factor divided by current scale. + const float scale = trace_brightness * 32.f * 255.f / waveform_scale; + const int wave_width = rwave.getWidth(); + const int wave_height = rwave.getHeight(); + + // See Cairo documentation on stride. + const int cairo_stride = Cairo::ImageSurface::format_stride_for_width(Cairo::FORMAT_ARGB32, rwave.getWidth()); + const auto buffer_size = static_cast::size_type>(wave_height) * cairo_stride; + + if (wave_buffer_dirty && (needRed || needGreen || needBlue)) { + wave_buffer.assign(buffer_size, 0); + assert(wave_buffer.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const r_row = rwave[val]; + const int* const g_row = gwave[val]; + const int* const b_row = bwave[val]; + std::uint32_t* const buffer_row = reinterpret_cast(wave_buffer.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char r = needRed ? std::min(scale * r_row[col], 0xff) : 0; + const unsigned char g = needGreen ? std::min(scale * g_row[col], 0xff) : 0; + const unsigned char b = needBlue ? std::min(scale * b_row[col], 0xff) : 0; + const unsigned char value = rtengine::max(r, g, b); + if (value != 0) { + // Ensures correct order regardless of endianness. + buffer_row[col] = b | (g << 8) | (r << 16) | (value << 24); + } + } + } + + wave_buffer_dirty = false; + } + + if (wave_buffer_luma_dirty && needLuma) { + wave_buffer_luma.assign(buffer_size, 0); + assert(wave_buffer_luma.size() % 4 == 0); + + for (int val = 0; val < wave_height; val++) { + const int* const l_row = lwave[val]; + std::uint32_t* const buffer_row = + reinterpret_cast(wave_buffer_luma.data() + (255 - val) * cairo_stride); + for (int col = 0; col < wave_width; col++) { + const unsigned char l = std::min(scale * l_row[col], 0xff); + buffer_row[col] = l | (l << 8) | (l << 16) | (l << 24); + } + } + + wave_buffer_luma_dirty = false; + } + + Cairo::RefPtr surface; + auto orig_matrix = cr->get_matrix(); + cr->translate(0, padding); + cr->scale(static_cast(w) / wave_width, (h - 2 * padding) / wave_height); + if (needLuma) { + surface = Cairo::ImageSurface::create( + wave_buffer_luma.data(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + } + if (needRed || needGreen || needBlue) { + surface = Cairo::ImageSurface::create( + wave_buffer.data(), Cairo::FORMAT_ARGB32, wave_width, wave_height, cairo_stride); + cr->set_source(surface, 0, 0); + cr->set_operator(Cairo::OPERATOR_OVER); + cr->paint(); + surface->finish(); + } + cr->set_matrix(orig_matrix); +} + bool HistogramArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { - if (get_width() != oldwidth || get_height() != oldheight || isDirty ()) { + if (!updatePending() && (get_width() != oldwidth || get_height() != oldheight || isDirty())) { updateBackBuffer (); } @@ -1048,7 +1927,10 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event) isPressed = true; movingPosition = event->x; - if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { + if ( + event->type == GDK_2BUTTON_PRESS && event->button == 1 + && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) + ) { drawMode = (drawMode + 1) % 3; options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; @@ -1072,8 +1954,18 @@ bool HistogramArea::on_button_release_event (GdkEventButton* event) bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) { - if (isPressed) - { + if ( + drawMode == 0 + && (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) + ) { + return false; + } + + if (!isPressed) { + return true; + } + + if (scopeType == ScopeType::HISTOGRAM || scopeType == ScopeType::HISTOGRAM_RAW) { // Adjust log scale. double mod = 1 + (event->x - movingPosition) / get_width(); factor /= mod; @@ -1086,11 +1978,45 @@ bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) setDirty(true); queue_draw (); + } else if ( + scopeType == ScopeType::PARADE + || scopeType == ScopeType::WAVEFORM + || scopeType == ScopeType::VECTORSCOPE_HC + || scopeType == ScopeType::VECTORSCOPE_HS + ) { // Adjust brightness. + constexpr float RANGE = MAX_BRIGHT / MIN_BRIGHT; + double dx = (event->x - movingPosition) / get_width(); + float new_brightness = LIM(trace_brightness * pow(RANGE, dx), MIN_BRIGHT, MAX_BRIGHT); + setBrightness(new_brightness); + movingPosition = event->x; } return true; } +float HistogramArea::getBrightness(void) +{ + return trace_brightness; +} + +void HistogramArea::setBrightness(float brightness) +{ + brightness = LIM(brightness, MIN_BRIGHT, MAX_BRIGHT); + if (brightness != trace_brightness) { + parade_buffer_r_dirty = parade_buffer_g_dirty = parade_buffer_b_dirty = wave_buffer_dirty = wave_buffer_luma_dirty = vect_hc_buffer_dirty = vect_hs_buffer_dirty = true; + trace_brightness = brightness; + setDirty(true); + queue_draw(); + + signal_brightness_changed.emit(trace_brightness); + } +} + +HistogramArea::SignalBrightnessChanged HistogramArea::getBrighnessChangedSignal(void) +{ + return signal_brightness_changed; +} + HistogramArea::type_signal_factor_changed HistogramArea::signal_factor_changed() { return sigFactorChanged; diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 4fd21bcc2..7f165bb15 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -18,15 +18,20 @@ */ #pragma once +#include + #include #include #include +#include "delayed.h" #include "guiutils.h" +#include "options.h" #include "pointermotionlistener.h" +#include "../rtengine/array2D.h" #include "../rtengine/LUT.h" #include "../rtengine/noncopyable.h" @@ -53,7 +58,7 @@ public: double log (double vsize, double val); }; -class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling, public rtengine::NonCopyable +class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer, protected HistogramScaling, public rtengine::NonCopyable { private: typedef const double (*TMatrix)[3]; @@ -73,40 +78,67 @@ protected: bool needBlue; bool needLuma; bool needChroma; - bool rawMode; bool showMode; bool barDisplayed; Gtk::Grid* parent; + + double padding = 5.0; HistogramRGBAreaIdleHelper* harih; + /** Draw an indicator bar for the value. */ + virtual void drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) = 0; + + void getPreferredThickness(int& min_thickness, int& natural_length) const; + void getPreferredLength(int& min_length, int& natural_length) const; + void getPreferredThicknessForLength(int length, int& min_thickness, int& natural_length) const; + void getPreferredLengthForThickness(int thickness, int& min_length, int& natural_length) const; + public: HistogramRGBArea(); ~HistogramRGBArea() override; - void updateBackBuffer (int r, int g, int b, const Glib::ustring &profile = "", const Glib::ustring &profileW = ""); + void updateBackBuffer(int r, int g, int b, const rtengine::procparams::ColorManagementParams *cmp = nullptr); bool getShow (); + void setShow(bool show); void setParent (Gtk::Grid* p) { parent = p; }; void update (int val, int rh, int gh, int bh); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, bool show); + void updateOptions (bool r, bool g, bool b, bool l, bool c, 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); +}; + +class HistogramRGBAreaHori final : public HistogramRGBArea +{ private: + void drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) 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 h, int &minimum_width, int &natural_width) const override; +}; +class HistogramRGBAreaVert final : public HistogramRGBArea +{ +private: + void drawBar(Cairo::RefPtr cc, double value, double max_value, int winw, int winh, double scale) 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 h, int &minimum_width, int &natural_width) const override; }; class DrawModeListener @@ -116,11 +148,14 @@ public: virtual void toggleButtonMode() = 0; }; -class HistogramArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling, public rtengine::NonCopyable +class HistogramArea final : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling, public rtengine::NonCopyable { public: typedef sigc::signal type_signal_factor_changed; + typedef sigc::signal SignalBrightnessChanged; + static constexpr float MIN_BRIGHT = 0.1; + static constexpr float MAX_BRIGHT = 3; private: IdleRegister idle_register; type_signal_factor_changed sigFactorChanged; @@ -128,24 +163,50 @@ private: protected: LUTu rhist, ghist, bhist, lhist, chist; LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? + int vectorscope_scale; + array2D vect_hc, vect_hs; + std::vector vect_hc_buffer, vect_hs_buffer; + bool vect_hc_buffer_dirty, vect_hs_buffer_dirty; + int waveform_scale; + array2D rwave, gwave, bwave, lwave; + MyRWMutex wave_mutex; + std::vector parade_buffer_r; + std::vector parade_buffer_g; + std::vector parade_buffer_b; + bool parade_buffer_r_dirty, parade_buffer_g_dirty, parade_buffer_b_dirty; + std::vector wave_buffer; + std::vector wave_buffer_luma; + bool wave_buffer_dirty, wave_buffer_luma_dirty; bool valid; int drawMode; DrawModeListener *myDrawModeListener; + Options::ScopeType scopeType; int oldwidth, oldheight; + /// Intensity of waveform and vectorscope trace. + float trace_brightness; bool needRed, needGreen, needBlue, needLuma, needChroma; - bool rawMode; bool isPressed; double movingPosition; + bool needPointer; + + double padding = 5.0; HistogramAreaIdleHelper* haih; + int pointer_red, pointer_green, pointer_blue; + float pointer_a, pointer_b; + + SignalBrightnessChanged signal_brightness_changed; + public: explicit HistogramArea(DrawModeListener *fml = nullptr); ~HistogramArea() override; void updateBackBuffer (); + /// Update pointer values. Returns true if widget needs redrawing. + bool updatePointer(int r, int g, int b, const rtengine::procparams::ColorManagementParams *cmp = nullptr); void update( const LUTu& histRed, const LUTu& histGreen, @@ -154,19 +215,35 @@ public: const LUTu& histChroma, const LUTu& histRedRaw, const LUTu& histGreenRaw, - const LUTu& histBlueRaw + const LUTu& histBlueRaw, + int vectorscopeScale, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, + int waveformScale, + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma ); - void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode); + void updateOptions (bool r, bool g, bool b, bool l, bool c, int mode, Options::ScopeType type, bool pointer); + bool updatePending(); 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; + float getBrightness(void); + /** Set the trace brightness, with 1 being normal. */ + void setBrightness(float brightness); + SignalBrightnessChanged getBrighnessChangedSignal(void); type_signal_factor_changed signal_factor_changed(); private: void drawCurve(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int vsize); void drawMarks(Cairo::RefPtr &cr, const LUTu & data, double scale, int hsize, int & ui, int & oi); + void drawParade(Cairo::RefPtr &cr, int hsize, int vsize); + void drawVectorscope(Cairo::RefPtr &cr, int hsize, int vsize); + void drawWaveform(Cairo::RefPtr &cr, int hsize, int vsize); 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; @@ -174,29 +251,48 @@ private: 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 DrawModeListener, public rtengine::NonCopyable +class HistogramPanelListener { +public: + virtual void scopeTypeChanged(Options::ScopeType new_type) = 0; +}; + +class HistogramPanel final : public Gtk::Grid, public PointerMotionListener, public DrawModeListener, public rtengine::NonCopyable +{ +private: + DelayedCall pointer_moved_delayed_call; protected: Gtk::Grid* gfxGrid; Gtk::Grid* buttonGrid; + Gtk::Box* persistentButtons; + Gtk::Box* optionButtons; HistogramArea* histogramArea; HistogramRGBArea* histogramRGBArea; + std::unique_ptr histogramRGBAreaHori; + std::unique_ptr histogramRGBAreaVert; Gtk::ToggleButton* showRed; Gtk::ToggleButton* showGreen; Gtk::ToggleButton* showBlue; Gtk::ToggleButton* showValue; - Gtk::ToggleButton* showRAW; Gtk::ToggleButton* showBAR; Gtk::ToggleButton* showChro; Gtk::Button* showMode; + Gtk::ToggleButton* scopeOptions; + Gtk::Scale* brightnessWidget; + + Gtk::RadioButton* scopeHistBtn; + Gtk::RadioButton* scopeHistRawBtn; + Gtk::RadioButton* scopeParadeBtn; + Gtk::RadioButton* scopeWaveBtn; + Gtk::RadioButton* scopeVectHcBtn; + Gtk::RadioButton* scopeVectHsBtn; Gtk::Image *redImage; Gtk::Image *greenImage; Gtk::Image *blueImage; Gtk::Image *valueImage; - Gtk::Image *rawImage; Gtk::Image *barImage; Gtk::Image *chroImage; @@ -204,7 +300,6 @@ protected: Gtk::Image *greenImage_g; Gtk::Image *blueImage_g; Gtk::Image *valueImage_g; - Gtk::Image *rawImage_g; Gtk::Image *barImage_g; Gtk::Image *chroImage_g; @@ -212,8 +307,14 @@ protected: Gtk::Image *mode1Image; Gtk::Image *mode2Image; + HistogramPanelListener* panel_listener; + + sigc::connection brightness_changed_connection; sigc::connection rconn; void setHistInvalid (); + void showRGBBar(); + void updateHistAreaOptions(); + void updateHistRGBAreaOptions(); public: @@ -228,12 +329,21 @@ public: const LUTu& histChroma, const LUTu& histRedRaw, const LUTu& histGreenRaw, - const LUTu& histBlueRaw) + const LUTu& histBlueRaw, + int vectorscopeScale, + const array2D& vectorscopeHC, + const array2D& vectorscopeHS, + int waveformScale, + const array2D& waveformRed, + const array2D& waveformGreen, + const array2D& waveformBlue, + const array2D& waveformLuma + ) { - histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw); + histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw, vectorscopeScale, vectorscopeHC, vectorscopeHS, waveformScale, waveformRed, waveformGreen, waveformBlue, waveformLuma); } // pointermotionlistener interface - 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; + void pointerMoved (bool validPos, const rtengine::procparams::ColorManagementParams &cmp, int x, int y, int r, int g, int b, bool isRaw = false) override; // TODO should be protected void setHistRGBInvalid (); @@ -243,13 +353,19 @@ public: void green_toggled (); void blue_toggled (); void value_toggled (); - void raw_toggled (); void chro_toggled (); void bar_toggled (); void mode_released (); + void brightnessWidgetValueChanged(); + void brightnessUpdated(float brightness); + void scopeOptionsToggled(); + void type_selected(Gtk::RadioButton* button); + void type_changed (); void rgbv_toggled (); void resized (Gtk::Allocation& req); // drawModeListener interface void toggleButtonMode () override; + + void setPanelListener(HistogramPanelListener* listener); }; diff --git a/rtgui/history.cc b/rtgui/history.cc index 5305c258b..4d6940e9b 100644 --- a/rtgui/history.cc +++ b/rtgui/history.cc @@ -29,16 +29,23 @@ using namespace rtengine; using namespace rtengine::procparams; -History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(nullptr), tpc (nullptr), bmnum (1) +History::History (bool bookmarkSupport) : historyVPaned (nullptr), blistener (nullptr), tpc (nullptr), bmnum (1) { + set_orientation(Gtk::ORIENTATION_VERTICAL); blistenerLock = false; // sets default that the Before preview will not be locked + /* + // fill history event message array + for (int i = 0; i < NUMOFEVENTS; i++) { + eventDescrArray[i] = M (Glib::ustring::compose ("HISTORY_MSG_%1", i + 1)); + } + */ // History List // ~~~~~~~~~~~~ Gtk::ScrolledWindow* hscrollw = Gtk::manage (new Gtk::ScrolledWindow ()); hscrollw->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - Gtk::Frame* histFrame = Gtk::manage (new Gtk::Frame (M("HISTORY_LABEL"))); + Gtk::Frame* histFrame = Gtk::manage (new Gtk::Frame (M ("HISTORY_LABEL"))); histFrame->set_name ("HistoryPanel"); histFrame->add (*hscrollw); @@ -48,9 +55,9 @@ History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(null historyModel = Gtk::ListStore::create (historyColumns); hTreeView->set_model (historyModel); hTreeView->set_headers_visible (false); - hTreeView->set_hscroll_policy(Gtk::SCROLL_MINIMUM); - hTreeView->set_vscroll_policy(Gtk::SCROLL_NATURAL); - hTreeView->set_size_request(80, -1); + hTreeView->set_hscroll_policy (Gtk::SCROLL_MINIMUM); + hTreeView->set_vscroll_policy (Gtk::SCROLL_NATURAL); + hTreeView->set_size_request (80, -1); Gtk::CellRendererText *changecrt = Gtk::manage (new Gtk::CellRendererText()); changecrt->property_ellipsize() = Pango::ELLIPSIZE_END; @@ -59,46 +66,46 @@ History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(null Gtk::TreeView::Column *hviewcol = Gtk::manage (new Gtk::TreeView::Column ("")); hviewcol->pack_start (*changecrt, true); hviewcol->add_attribute (changecrt->property_markup (), historyColumns.text); - hviewcol->set_expand(true); + hviewcol->set_expand (true); hviewcol->set_resizable (true); - hviewcol->set_fixed_width(35); - hviewcol->set_min_width(35); - hviewcol->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE); + hviewcol->set_fixed_width (35); + hviewcol->set_min_width (35); + hviewcol->set_sizing (Gtk::TREE_VIEW_COLUMN_AUTOSIZE); Gtk::TreeView::Column *hviewcol2 = Gtk::manage (new Gtk::TreeView::Column ("")); hviewcol2->pack_start (*valuecrt, true); hviewcol2->add_attribute (valuecrt->property_markup (), historyColumns.value); - hviewcol2->set_expand(true); - hviewcol2->set_resizable(true); - hviewcol2->set_fixed_width(35); - hviewcol2->set_min_width(35); - hviewcol2->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE); - valuecrt->set_alignment(1.f, 0.f); + hviewcol2->set_expand (true); + hviewcol2->set_resizable (true); + hviewcol2->set_fixed_width (35); + hviewcol2->set_min_width (35); + hviewcol2->set_sizing (Gtk::TREE_VIEW_COLUMN_AUTOSIZE); + valuecrt->set_alignment (1.f, 0.f); - hTreeView->set_has_tooltip(true); - hTreeView->signal_query_tooltip().connect( sigc::mem_fun(*this, &History::on_query_tooltip) ); + hTreeView->set_has_tooltip (true); + hTreeView->signal_query_tooltip().connect ( sigc::mem_fun (*this, &History::on_query_tooltip) ); hTreeView->append_column (*hviewcol); hTreeView->append_column (*hviewcol2); - selchangehist = hTreeView->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &History::historySelectionChanged)); + selchangehist = hTreeView->get_selection()->signal_changed().connect (sigc::mem_fun (*this, &History::historySelectionChanged)); // Bookmark List // ~~~~~~~~~~~~~ - Gtk::HBox* ahbox = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* ahbox = Gtk::manage (new Gtk::Box ()); addBookmark = Gtk::manage (new Gtk::Button ()); // M("HISTORY_NEWSNAPSHOT") - setExpandAlignProperties(addBookmark, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + setExpandAlignProperties (addBookmark, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //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")); + addBookmark->get_style_context()->add_class ("Left"); + addBookmark->set_tooltip_markup (M ("HISTORY_NEWSNAPSHOT_TOOLTIP")); Gtk::Image* addimg = Gtk::manage (new RTImage ("add-small.png")); addBookmark->set_image (*addimg); ahbox->pack_start (*addBookmark); delBookmark = Gtk::manage (new Gtk::Button ()); // M("HISTORY_DELSNAPSHOT") - setExpandAlignProperties(delBookmark, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + 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"); + delBookmark->get_style_context()->add_class ("Right"); Gtk::Image* delimg = Gtk::manage (new RTImage ("remove-small.png")); delBookmark->set_image (*delimg); ahbox->pack_start (*delBookmark); @@ -108,19 +115,19 @@ History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(null bscrollw->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); bscrollw->set_size_request (-1, 45); - Gtk::Frame* bmFrame = Gtk::manage (new Gtk::Frame (M("HISTORY_SNAPSHOTS"))); - bmFrame->set_name("Snapshots"); - Gtk::VBox* bmBox = Gtk::manage (new Gtk::VBox ()); + Gtk::Frame* bmFrame = Gtk::manage (new Gtk::Frame (M ("HISTORY_SNAPSHOTS"))); + bmFrame->set_name ("Snapshots"); + Gtk::Box* bmBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); bmFrame->add (*bmBox); bmBox->pack_start (*bscrollw, Gtk::PACK_EXPAND_WIDGET, 4); bmBox->pack_end (*ahbox, Gtk::PACK_SHRINK, 4); - bmBox->set_size_request(-1,60); + bmBox->set_size_request (-1, 60); if (bookmarkSupport) { - historyVPaned = Gtk::manage ( new Gtk::VPaned () ); - historyVPaned->pack1 (*histFrame, true, true); + historyVPaned = Gtk::manage ( new Gtk::Paned (Gtk::ORIENTATION_VERTICAL) ); + historyVPaned->pack1 (*histFrame, true, false); historyVPaned->pack2 (*bmFrame, false, false); - pack_start(*historyVPaned); + pack_start (*historyVPaned); } else { pack_start (*histFrame); } @@ -132,19 +139,19 @@ History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(null bookmarkModel = Gtk::ListStore::create (bookmarkColumns); bTreeView->set_model (bookmarkModel); bTreeView->set_headers_visible (false); - bTreeView->append_column_editable (M("HISTORY_SNAPSHOTS"), bookmarkColumns.text); + bTreeView->append_column_editable (M ("HISTORY_SNAPSHOTS"), bookmarkColumns.text); - selchangebm = bTreeView->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &History::bookmarkSelectionChanged)); + selchangebm = bTreeView->get_selection()->signal_changed().connect (sigc::mem_fun (*this, &History::bookmarkSelectionChanged)); - addBookmark->signal_clicked().connect( sigc::mem_fun(*this, &History::addBookmarkPressed) ); - delBookmark->signal_clicked().connect( sigc::mem_fun(*this, &History::delBookmarkPressed) ); + addBookmark->signal_clicked().connect ( sigc::mem_fun (*this, &History::addBookmarkPressed) ); + delBookmark->signal_clicked().connect ( sigc::mem_fun (*this, &History::delBookmarkPressed) ); //hTreeView->set_grid_lines (Gtk::TREE_VIEW_GRID_LINES_HORIZONTAL); hTreeView->set_grid_lines (Gtk::TREE_VIEW_GRID_LINES_BOTH); //hTreeView->signal_size_allocate().connect( sigc::mem_fun(*this, &History::resized) ); - hTreeView->set_enable_search(false); - bTreeView->set_enable_search(false); + hTreeView->set_enable_search (false); + bTreeView->set_enable_search (false); show_all_children (); } @@ -152,7 +159,7 @@ History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(null void History::initHistory () { - ConnectionBlocker selBlocker(selchangehist); + ConnectionBlocker selBlocker (selchangehist); historyModel->clear (); bookmarkModel->clear (); } @@ -172,9 +179,11 @@ void History::historySelectionChanged () if (row && tpc) { ProcParams pparams = row[historyColumns.params]; - ParamsEdited pe(true); - PartialProfile pp(&pparams, &pe); + ParamsEdited pe (true); + pe.locallab.spots.resize(pparams.locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); + PartialProfile pp (&pparams, &pe); ParamsEdited paramsEdited = row[historyColumns.paramsEdited]; + tpc->profileChange (&pp, EvHistoryBrowsed, row[historyColumns.text], ¶msEdited); } @@ -205,8 +214,9 @@ void History::bookmarkSelectionChanged () if (row && tpc) { ProcParams pparams = row[bookmarkColumns.params]; - ParamsEdited pe(true); - PartialProfile pp(&pparams, &pe); + ParamsEdited pe (true); + pe.locallab.spots.resize(pparams.locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); + PartialProfile pp (&pparams, &pe); ParamsEdited paramsEdited = row[bookmarkColumns.paramsEdited]; tpc->profileChange (&pp, EvBookmarkSelected, row[bookmarkColumns.text], ¶msEdited); } @@ -221,7 +231,7 @@ void History::procParamsChanged( ) { // to prevent recursion, we filter out the events triggered by the history and events that should not be registered - if (ev == EvHistoryBrowsed || ev == EvMonitorTransform) { + if (ev == EvHistoryBrowsed || ev == EvMonitorTransform || descr == "") { return; } @@ -255,10 +265,11 @@ void History::procParamsChanged( } // if there is no last item or its chev!=ev, create a new one - if (size == 0 || !row || row[historyColumns.chev] != ev || ev == EvProfileChanged) { - Gtk::TreeModel::Row newrow = *(historyModel->append()); + if (size == 0 || !row || row[historyColumns.chev] != ev || ev == EvProfileChanged + || ev == EvLocallabSpotCreated || ev == EvLocallabSpotDeleted) { // Special cases: If Locallab spot is created , deleted or duplicated several times in a row, a new history row is used + Gtk::TreeModel::Row newrow = * (historyModel->append()); newrow[historyColumns.text] = ProcEventMapper::getInstance()->getHistoryMsg(ev); - newrow[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1); + newrow[historyColumns.value] = g_markup_escape_text (descr.c_str(), -1); newrow[historyColumns.chev] = ev; newrow[historyColumns.params] = *params; newrow[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited; @@ -314,7 +325,7 @@ void History::addBookmarkWithText (Glib::ustring text) } // append new row to bookmarks - Gtk::TreeModel::Row newrow = *(bookmarkModel->append()); + Gtk::TreeModel::Row newrow = * (bookmarkModel->append()); newrow[bookmarkColumns.text] = text; ProcParams params = row[historyColumns.params]; newrow[bookmarkColumns.params] = params; @@ -326,7 +337,7 @@ void History::addBookmarkPressed () { if (hTreeView->get_selection()->get_selected()) { - addBookmarkWithText (Glib::ustring::compose ("%1 %2", M("HISTORY_SNAPSHOT"), bmnum++)); + addBookmarkWithText (Glib::ustring::compose ("%1 %2", M ("HISTORY_SNAPSHOT"), bmnum++)); } } @@ -361,7 +372,7 @@ void History::undo () int size = historyModel->children().size (); if (size > 1) { - selection->select (historyModel->children().operator [](size - 2)); + selection->select (historyModel->children().operator [] (size - 2)); } } } @@ -382,7 +393,7 @@ void History::redo () int size = historyModel->children().size (); if (size > 1) { - selection->select (historyModel->children().operator [](size - 2)); + selection->select (historyModel->children().operator [] (size - 2)); } } } @@ -408,22 +419,27 @@ bool History::getBeforeLineParams (rtengine::procparams::ProcParams& params) return true; } -bool History::on_query_tooltip(int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip) { +bool History::on_query_tooltip (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip) +{ bool displayTooltip = false; Gtk::TreeModel::Path path; int x2 = -1; int y2 = -1; - hTreeView->convert_widget_to_bin_window_coords(x, y, x2, y2); - bool hasPath = hTreeView->get_path_at_pos(x2, y2, path); + hTreeView->convert_widget_to_bin_window_coords (x, y, x2, y2); + bool hasPath = hTreeView->get_path_at_pos (x2, y2, path); if (hasPath) { if (path && !path.empty()) { - Gtk::TreeModel::iterator iter = historyModel->get_iter(path); + Gtk::TreeModel::iterator iter = historyModel->get_iter (path); + if (iter) { +// Glib::ustring param, val; +// iter->get_value (1, param); +// iter->get_value (2, val); Glib::ustring text, val; - iter->get_value(0, text); - iter->get_value(1, val); + iter->get_value (0, text); + iter->get_value (1, val); /* * @@ -435,17 +451,19 @@ bool History::on_query_tooltip(int x, int y, bool keyboard_tooltip, const Glib:: Gtk::Label *left = Gtk::manage (new Gtk::Label(param+" :")); Gtk::Label *right = Gtk::manage (new Gtk::Label(val)); right->set_justify(Gtk::JUSTIFY_LEFT); - Gtk::HBox *hbox = Gtk::manage (new Gtk::HBox()); + Gtk::Box *hbox = Gtk::manage (new Gtk::Box()); hbox->set_spacing(5); hbox->pack_start(*left, Gtk::PACK_SHRINK, 0); hbox->pack_start(*right, Gtk::PACK_SHRINK, 0); tooltip->set_custom(*hbox); */ - tooltip->set_text(text + " : " + val); +// tooltip->set_text (param + " : " + val); + tooltip->set_text (text + " : " + val); displayTooltip = true; } } } + return displayTooltip; } diff --git a/rtgui/history.h b/rtgui/history.h index faebe4765..197e5690b 100644 --- a/rtgui/history.h +++ b/rtgui/history.h @@ -33,7 +33,7 @@ public: virtual void historyBeforeLineChanged(const rtengine::procparams::ProcParams& params) = 0; }; -class History : public Gtk::VBox, public PParamsChangeListener +class History : public Gtk::Box, public PParamsChangeListener { public: @@ -72,7 +72,7 @@ public: BookmarkColumns bookmarkColumns; protected: - Gtk::VPaned* historyVPaned; + Gtk::Paned* historyVPaned; Gtk::TreeView* hTreeView; Glib::RefPtr historyModel; diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index ee3eb90a7..ddb1d2fb5 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -28,9 +28,11 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring HSVEqualizer::TOOL_NAME = "hsvequalizer"; + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL"), false, true) +HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, TOOL_NAME, M("TP_HSVEQUALIZER_LABEL"), false, true) { std::vector bottomMilestones; @@ -38,7 +40,7 @@ HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HS // -0.1 rad < Hue < 1.6 rad for (int i = 0; i < 7; i++) { - float x = float(i) * (1.0f / 6.0); + float x = i / 6.0; Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); bottomMilestones.push_back( GradientMilestone(double(x), double(R), double(G), double(B)) ); } diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index 77c1ee1b0..1f80cd9e4 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -44,6 +44,7 @@ protected: FlatCurveEditor* vshape; public: + static const Glib::ustring TOOL_NAME; HSVEqualizer (); ~HSVEqualizer () override; diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc index a8f9be007..446dda3fb 100644 --- a/rtgui/iccprofilecreator.cc +++ b/rtgui/iccprofilecreator.cc @@ -79,6 +79,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) primaries->append(M("ICCPROFCREATOR_PRIM_BEST")); primaries->append(M("ICCPROFCREATOR_PRIM_BETA")); primaries->append(M("ICCPROFCREATOR_PRIM_BRUCE")); + primaries->append(M("ICCPROFCREATOR_PRIM_DCIP3")); primaries->set_tooltip_text(M("ICCPROFCREATOR_PRIM_TOOLTIP")); mainGrid->attach(*primaries, 1, 0, 1, 1); @@ -101,17 +102,17 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) 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*/)); + aPrimariesRedX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDX"), 0.4100, 0.9000, 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*/)); + aPrimariesRedY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDY"), 0.1000, 0.6000, 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*/)); + aPrimariesGreenX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREX"), -0.100, 0.4000, 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*/)); + aPrimariesGreenY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREY"), 0.50, 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*/)); + aPrimariesBlueX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUX"), -0.1, 0.3000, 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*/)); + aPrimariesBlueY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUY"), -0.100, 0.4000, 0.0001, 0.060/*, gamutl5, gamuts5*/)); setExpandAlignProperties(aPrimariesBlueY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); primariesGrid->attach(*aPrimariesRedX, 0, 0, 1, 1); @@ -151,9 +152,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) 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->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); aGamma->show(); mainGrid->attach(*aGamma, 1, 3, 1, 1); //gamma @@ -161,9 +160,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) 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->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); aSlope->show(); mainGrid->attach(*aSlope, 1, 4, 1, 1); //slope @@ -180,6 +177,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) cIlluminant->append(M("ICCPROFCREATOR_ILL_50")); cIlluminant->append(M("ICCPROFCREATOR_ILL_55")); cIlluminant->append(M("ICCPROFCREATOR_ILL_60")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_63")); cIlluminant->append(M("ICCPROFCREATOR_ILL_65")); cIlluminant->append(M("ICCPROFCREATOR_ILL_80")); cIlluminant->append(M("ICCPROFCREATOR_ILL_INC")); @@ -269,6 +267,8 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BETA")); } else if (primariesPreset == "BruceRGB") { primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BRUCE")); + } else if (primariesPreset == "DCIP3") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_DCIP3")); } trcPresets->set_active(0); @@ -300,6 +300,8 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_55")); } else if (illuminant == "D60") { cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_60")); + } else if (illuminant == "D63") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_63")); } else if (illuminant == "D65") { cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_65")); } else if (illuminant == "D80") { @@ -328,7 +330,7 @@ ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) close->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::closePressed)); get_action_area()->pack_start(*close); - //--------------- Show childrens + //--------------- Show children show_all_children(); @@ -441,6 +443,8 @@ void ICCProfileCreator::storeValues() 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_63")) { + options.ICCPC_illuminant = illuminant = "D63"; } 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")) { @@ -486,6 +490,8 @@ Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &pre 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_PRIM_DCIP3")) { + return Glib::ustring("DCIP3"); } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { return Glib::ustring("custom"); } else { @@ -574,6 +580,13 @@ void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, double *p, Col p[3] = 0.8404; p[4] = 0.0366; p[5] = 0.0001; + } else if (preset == "DCIP3") { + p[0] = 0.68; // DCIP3 primaries + p[1] = 0.32; + p[2] = 0.265; + p[3] = 0.69; + p[4] = 0.15; + p[5] = 0.06; } else if (preset == "custom") { p[0] = redPrimaryX; p[1] = redPrimaryY; @@ -659,7 +672,7 @@ void ICCProfileCreator::savePressed() // -------------------------------------------- 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 isD65 = (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "DCIP3"); 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"); @@ -697,23 +710,23 @@ void ICCProfileCreator::savePressed() if (options.rtSettings.widegamut.substr(0, 4) == "RTv4") { options.rtSettings.widegamut = "RTv2_Wide"; } - sNewProfile = options.rtSettings.widegamut; - sPrimariesPreset = "Wide"; + } else if (primariesPreset == "DCIP3") {//only at the request of the user + sNewProfile = options.rtSettings.DCIP3; + sPrimariesPreset = "DCIP3"; } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { if (options.rtSettings.best.substr(0, 4) == "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; if (options.rtSettings.beta.substr(0, 4) == "RTv4") { options.rtSettings.widegamut = "RTv2_Beta"; } + sNewProfile = options.rtSettings.beta; sPrimariesPreset = "Beta"; } else if (primariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) { @@ -754,6 +767,8 @@ void ICCProfileCreator::savePressed() sPrimariesPreset = "Best"; } else if (primariesPreset == "BetaRGB") { sPrimariesPreset = "Beta"; + } else if (primariesPreset == "DCIP3") { + sPrimariesPreset = "DCIP3"; } else if (primariesPreset == "custom") { sPrimariesPreset = "Custom"; } @@ -881,8 +896,7 @@ void ICCProfileCreator::savePressed() 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 + rtengine::Color::calcGamma(pwr, ts, 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; @@ -1017,6 +1031,8 @@ void ICCProfileCreator::savePressed() tempv4 = 5500.; } else if (illuminant == "D60") { tempv4 = 6004.; + } else if (illuminant == "D63") { + tempv4 = 6300.; } else if (illuminant == "D65") { tempv4 = 6504.; } else if (illuminant == "D80") { @@ -1035,6 +1051,10 @@ void ICCProfileCreator::savePressed() xyD = {0.32168, 0.33767, 1.0}; } + if (illuminant == "D63") { + xyD = {0.314, 0.351, 1.0}; + } + if (illuminant == "D50") { xyD = {0.3457, 0.3585, 1.0};//white D50 near LCMS values but not perfect...it's a compromise!! } @@ -1082,6 +1102,9 @@ void ICCProfileCreator::savePressed() } else if (illuminant == "D60") { Wx = 0.952646075; Wz = 1.008825184; + } else if (illuminant == "D63") { + Wx = 0.894587; + Wz = 0.954416; } else if (illuminant == "D41") { Wx = 0.991488263; Wz = 0.631604625; diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h index 2cd19e14f..8ee46a71d 100644 --- a/rtgui/iccprofilecreator.h +++ b/rtgui/iccprofilecreator.h @@ -27,7 +27,7 @@ class RTWindow; -class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener +class ICCProfileCreator final : public Gtk::Dialog, public AdjusterListener { private: diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 3e3c0508c..57f12fd7e 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -22,6 +22,7 @@ #include "eventmapper.h" #include "guiutils.h" +#include "labgrid.h" #include "options.h" #include "pathutils.h" #include "rtimage.h" @@ -29,31 +30,47 @@ #include "../rtengine/dcp.h" #include "../rtengine/iccstore.h" #include "../rtengine/procparams.h" +#include "../rtengine/utils.h" using namespace rtengine; using namespace rtengine::procparams; -ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunchanged(nullptr), icmplistener(nullptr) +const Glib::ustring ICMPanel::TOOL_NAME = "icm"; + +ICMPanel::ICMPanel() : FoldableToolPanel(this, TOOL_NAME, M("TP_ICM_LABEL")), iunchanged(nullptr), icmplistener(nullptr) { 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"); - + //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(LUMINANCECURVE, "HISTORY_MSG_ICM_WORKING_GAMMA"); + EvICMslop = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_WORKING_SLOPE"); + EvICMtrcinMethod = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_WORKING_TRC_METHOD"); + EvICMwillMethod = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_WORKING_ILLUM_METHOD"); + EvICMwprimMethod = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_WORKING_PRIM_METHOD"); + EvICMredx = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_REDX"); + EvICMredy = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_REDY"); + EvICMgrex = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_GREX"); + EvICMgrey = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_GREY"); + EvICMblux = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_BLUX"); + EvICMbluy = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_BLUY"); + EvaIntent = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_AINTENT"); + EvICMpreser = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_PRESER"); + EvICMLabGridciexy = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICL_LABGRIDCIEXY"); + EvICMfbw = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_FBW"); + EvICMgamut = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_ICM_GAMUT"); 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); + labgridcie = Gtk::manage(new LabGrid(EvICMLabGridciexy, M("TP_ICM_LABGRID_CIEXY"), true, true)); // ------------------------------- Input profile @@ -62,7 +79,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha 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 = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); inone = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTNONE"))); inone->set_tooltip_text(M("TP_ICM_INPUTNONE_TOOLTIP")); @@ -81,7 +98,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha 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()); + Gtk::Box* ffbox = Gtk::manage(new Gtk::Box()); ifromfile->set_tooltip_text(M("TP_ICM_INPUTCUSTOM_TOOLTIP")); ffbox->pack_start(*ifromfile, Gtk::PACK_SHRINK); ffbox->pack_start(*ipDialog); @@ -95,6 +112,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha inone->set_group(opts); dcpFrame = Gtk::manage(new Gtk::Frame("DCP")); + dcpFrame->set_label_align(0.025, 0.5); Gtk::Grid* dcpGrid = Gtk::manage(new Gtk::Grid()); dcpGrid->set_column_homogeneous(false); @@ -170,7 +188,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha Gtk::Frame *wFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_WORKINGPROFILE"))); wFrame->set_label_align(0.025, 0.5); - Gtk::VBox *wProfVBox = Gtk::manage(new Gtk::VBox()); + Gtk::Box* wProfVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); wProfNames = Gtk::manage(new MyComboBoxText()); wProfVBox->pack_start(*wProfNames, Gtk::PACK_SHRINK); @@ -183,48 +201,191 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha wProfNames->set_active(0); - // 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); + //-----------------gamma TRC working + Gtk::Frame *trcFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_TRCFRAME"))); + trcFrame->set_label_align(0.025, 0.5); + Gtk::Box *trcProfVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + trcFrame->set_tooltip_text(M("TP_ICM_TRCFRAME_TOOLTIP")); + + wTRCBox = Gtk::manage(new Gtk::Box()); + + wTRC = Gtk::manage(new MyComboBoxText()); + wTRCBox->pack_start(*wTRC, Gtk::PACK_EXPAND_WIDGET); + trcProfVBox->pack_start(*wTRCBox, Gtk::PACK_EXPAND_WIDGET); + wTRC->append(M("TP_ICM_WORKING_TRC_NONE")); + wTRC->append(M("TP_ICM_WORKING_TRC_CUSTOM")); + wTRC->append(M("TP_ICM_WORKING_TRC_BT709")); + wTRC->append(M("TP_ICM_WORKING_TRC_SRGB")); + wTRC->append(M("TP_ICM_WORKING_TRC_22")); + wTRC->append(M("TP_ICM_WORKING_TRC_18")); + wTRC->append(M("TP_ICM_WORKING_TRC_LIN")); + + wTRC->set_active(0); + wTRC->set_tooltip_text(M("TP_ICM_TRC_TOOLTIP")); + + wFrame->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.222)); + wSlope = Gtk::manage(new Adjuster(M("TP_ICM_WORKING_TRC_SLOPE"), 0., 300., 0.01, 4.5)); + trcProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK); + wGamma->show(); + + trcProfVBox->pack_start(*wSlope, Gtk::PACK_SHRINK); + wSlope->show(); + + willuBox = Gtk::manage(new Gtk::Box()); + willulab = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_ILLU") + ":")); + + willuBox->pack_start(*willulab, Gtk::PACK_SHRINK); + will = Gtk::manage(new MyComboBoxText()); + willuBox->pack_start(*will, Gtk::PACK_EXPAND_WIDGET); + trcProfVBox->pack_start(*willuBox, Gtk::PACK_EXPAND_WIDGET); + will->append(M("TP_ICM_WORKING_ILLU_NONE")); + will->append(M("TP_ICM_WORKING_ILLU_D41")); + will->append(M("TP_ICM_WORKING_ILLU_D50")); + will->append(M("TP_ICM_WORKING_ILLU_D55")); + will->append(M("TP_ICM_WORKING_ILLU_D60")); + will->append(M("TP_ICM_WORKING_ILLU_D65")); + will->append(M("TP_ICM_WORKING_ILLU_D80")); + will->append(M("TP_ICM_WORKING_ILLU_D120")); + will->append(M("TP_ICM_WORKING_ILLU_STDA")); + will->append(M("TP_ICM_WORKING_ILLU_2000")); + will->append(M("TP_ICM_WORKING_ILLU_1500")); + will->set_active(0); + will->set_tooltip_text(M("TP_ICM_ILLUMPRIM_TOOLTIP")); + + + wprimBox = Gtk::manage(new Gtk::Box()); + wprimlab = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_PRIM") + ":")); + + wprimBox->pack_start(*wprimlab, Gtk::PACK_SHRINK); + wprim = Gtk::manage(new MyComboBoxText()); + wprimBox->pack_start(*wprim, Gtk::PACK_EXPAND_WIDGET); + fbw = Gtk::manage(new Gtk::CheckButton((M("TP_ICM_FBW")))); + fbw->set_active(true); + gamut = Gtk::manage(new Gtk::CheckButton((M("TP_ICM_GAMUT")))); + gamut->set_active(false); + + trcProfVBox->pack_start(*wprimBox, Gtk::PACK_EXPAND_WIDGET); + trcProfVBox->pack_start(*fbw, Gtk::PACK_EXPAND_WIDGET); + trcProfVBox->pack_start(*gamut, Gtk::PACK_EXPAND_WIDGET); + + neutral = Gtk::manage (new Gtk::Button (M ("TP_ICM_NEUTRAL"))); + setExpandAlignProperties (neutral, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + 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); + neutralconn = neutral->signal_pressed().connect ( sigc::mem_fun (*this, &ICMPanel::neutral_pressed) ); + neutral->show(); + + trcProfVBox->pack_start (*neutral); + + + wprim->append(M("TP_ICM_WORKING_PRIM_NONE")); + wprim->append(M("TP_ICM_WORKING_PRIM_SRGB")); + wprim->append(M("TP_ICM_WORKING_PRIM_ADOB")); + wprim->append(M("TP_ICM_WORKING_PRIM_PROP")); + wprim->append(M("TP_ICM_WORKING_PRIM_REC")); + wprim->append(M("TP_ICM_WORKING_PRIM_ACE")); + wprim->append(M("TP_ICM_WORKING_PRIM_WID")); + wprim->append(M("TP_ICM_WORKING_PRIM_AC0")); + wprim->append(M("TP_ICM_WORKING_PRIM_BRU")); + wprim->append(M("TP_ICM_WORKING_PRIM_BET")); + wprim->append(M("TP_ICM_WORKING_PRIM_BST")); + wprim->append(M("TP_ICM_WORKING_PRIM_CUS")); + wprim->append(M("TP_ICM_WORKING_PRIM_CUSGR")); + wprim->set_active(0); + + wprim->set_tooltip_text(M("TP_ICM_PRIMILLUM_TOOLTIP")); + + + redx = Gtk::manage(new Adjuster(M("TC_PRIM_REDX"), 0.41, 1.0, 0.0001, 0.7347)); + setExpandAlignProperties(redx, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + redy = Gtk::manage(new Adjuster(M("TC_PRIM_REDY"), 0.0, 0.70, 0.0001, 0.2653)); + setExpandAlignProperties(redy, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + grex = Gtk::manage(new Adjuster(M("TC_PRIM_GREX"), -0.1, 0.4, 0.0001, 0.1596)); + setExpandAlignProperties(grex, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + grey = Gtk::manage(new Adjuster(M("TC_PRIM_GREY"), 0.50, 1.0, 0.0001, 0.8404)); + setExpandAlignProperties(grey, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + blux = Gtk::manage(new Adjuster(M("TC_PRIM_BLUX"), -0.1, 0.4, 0.0001, 0.0366)); + setExpandAlignProperties(blux, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + bluy = Gtk::manage(new Adjuster(M("TC_PRIM_BLUY"), -0.1, 0.49, 0.0001, 0.0001)); + setExpandAlignProperties(bluy, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + redx->set_tooltip_text(M("TP_ICM_PRIMRED_TOOLTIP")); + grex->set_tooltip_text(M("TP_ICM_PRIMGRE_TOOLTIP")); + blux->set_tooltip_text(M("TP_ICM_PRIMBLU_TOOLTIP")); + + redFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_REDFRAME"))); + redFrame->set_label_align(0.025, 0.5); + redFrame->set_tooltip_text(M("TP_ICM_WORKING_PRIMFRAME_TOOLTIP")); + + Gtk::Box *redVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + primCoordGrid = Gtk::manage(new Gtk::Grid()); + primCoordGrid->set_column_homogeneous(true); + primCoordGrid->attach(*redx, 0, 0, 1, 1); + primCoordGrid->attach_next_to(*redy, *redx, Gtk::PositionType::POS_RIGHT, 1, 1); + primCoordGrid->attach_next_to(*grex, *redx, Gtk::PositionType::POS_BOTTOM, 1, 1); + primCoordGrid->attach_next_to(*grey, *grex, Gtk::PositionType::POS_RIGHT, 1, 1); + primCoordGrid->attach_next_to(*blux, *grex, Gtk::PositionType::POS_BOTTOM, 1, 1); + primCoordGrid->attach_next_to(*bluy, *blux, Gtk::PositionType::POS_RIGHT, 1, 1); + redVBox->pack_start(*primCoordGrid, Gtk::PACK_EXPAND_WIDGET); + + Gtk::Separator* const separator1 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + Gtk::Separator* const separator2 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + + preser = Gtk::manage(new Adjuster(M("TP_ICM_WORKING_PRESER"), 0., 100., 0.5, 0.)); + preser->setAdjusterListener(this); + + preBox = Gtk::manage(new Gtk::Box()); + preBox->pack_start(*preser, Gtk::PACK_EXPAND_WIDGET); + redVBox->pack_start(*separator1, Gtk::PACK_SHRINK); + redVBox->pack_start(*preBox, Gtk::PACK_EXPAND_WIDGET); + redVBox->pack_start(*separator2, Gtk::PACK_SHRINK); + + cielab = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_CIEDIAG") + ":")); + + redVBox->pack_start(*cielab, Gtk::PACK_SHRINK); + + redVBox->pack_start(*labgridcie, Gtk::PACK_EXPAND_WIDGET, 4); + + redFrame->add(*redVBox); + + wGamma->setAdjusterListener(this); + wSlope->setLogScale(16, 0); + wSlope->setAdjusterListener(this); + redx->setAdjusterListener(this); + redy->setAdjusterListener(this); + grex->setAdjusterListener(this); + grey->setAdjusterListener(this); + blux->setAdjusterListener(this); + bluy->setAdjusterListener(this); + + wGamma->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + + wSlope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + + // Rendering intent + riaHBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* abIntentLbl = Gtk::manage(new Gtk::Label(M("TP_ICM_PROFILEINTENT"))); + riaHBox->pack_start(*abIntentLbl, Gtk::PACK_SHRINK); + aRendIntent.reset(new PopUpButton()); + aRendIntent->addEntry("intent-perceptual.png", M("PREFERENCES_INTENT_PERCEPTUAL")); + aRendIntent->addEntry("intent-relative.png", M("PREFERENCES_INTENT_RELATIVE")); + aRendIntent->addEntry("intent-saturation.png", M("PREFERENCES_INTENT_SATURATION")); + aRendIntent->addEntry("intent-absolute.png", M("PREFERENCES_INTENT_ABSOLUTE")); + aRendIntent->setSelected(1); + aRendIntent->show(); + riaHBox->pack_start(*aRendIntent->buttonGroup, Gtk::PACK_EXPAND_PADDING); + + trcFrame->add(*trcProfVBox); + pack_start(*wFrame, Gtk::PACK_EXPAND_WIDGET); + pack_start(*trcFrame, Gtk::PACK_EXPAND_WIDGET); + pack_start(*redFrame, Gtk::PACK_EXPAND_WIDGET); // ---------------------------- Output profile @@ -232,8 +393,9 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha Gtk::Frame *oFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_OUTPUTPROFILE"))); oFrame->set_label_align(0.025, 0.5); + oFrame->set_tooltip_text(M("TP_ICM_OUTPUTPROFILE_TOOLTIP")); - Gtk::VBox *oProfVBox = Gtk::manage(new Gtk::VBox()); + Gtk::Box* oProfVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); oProfNames = Gtk::manage(new MyComboBoxText()); oProfVBox->pack_start(*oProfNames, Gtk::PACK_SHRINK); @@ -250,7 +412,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha oProfNames->set_active(0); // Rendering intent - Gtk::HBox *riHBox = Gtk::manage(new Gtk::HBox()); + Gtk::Box *riHBox = Gtk::manage(new Gtk::Box()); Gtk::Label* outputIntentLbl = Gtk::manage(new Gtk::Label(M("TP_ICM_PROFILEINTENT"))); riHBox->pack_start(*outputIntentLbl, Gtk::PACK_SHRINK); oRendIntent.reset(new PopUpButton()); @@ -306,9 +468,14 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha 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)); + arendintentconn = aRendIntent->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::aiChanged)); dcpillconn = dcpIll->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::dcpIlluminantChanged)); wtrcconn = wTRC->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wtrcinChanged)); + willconn = will->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::willChanged)); + wprimconn = wprim->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wprimChanged)); + fbwconn = fbw->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::fbwChanged)); + gamutconn = gamut->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::gamutChanged)); 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)); @@ -326,6 +493,39 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha show_all(); } +void ICMPanel::neutral_pressed () +{ //find working profile and set the same destination proile + if (wProfNames->get_active_text() == "Rec2020") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::REC2020)); + } else if (wProfNames->get_active_text() == "sRGB") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::SRGB)); + } else if (wProfNames->get_active_text() == "Adobe RGB") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::ADOBE_RGB)); + } else if (wProfNames->get_active_text() == "ProPhoto") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::PRO_PHOTO)); + } else if (wProfNames->get_active_text() == "ACESp1") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::ACES_P1)); + } else if (wProfNames->get_active_text() == "WideGamut") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::WIDE_GAMUT)); + } else if (wProfNames->get_active_text() == "ACESp0") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::ACES_P0)); + } else if (wProfNames->get_active_text() == "BruceRGB") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::BRUCE_RGB)); + } else if (wProfNames->get_active_text() == "Beta RGB") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::BETA_RGB)); + } else if (wProfNames->get_active_text() == "BestRGB") { + wprim->set_active(toUnderlying(ColorManagementParams::Primaries::BEST_RGB)); + } + const ColorManagementParams defPar; + wGamma->setValue(defPar.workingTRCGamma);//2.4 + wSlope->setValue(defPar.workingTRCSlope);//12.92 + preser->setValue(defPar.preser); + fbw->set_active(defPar.fbw); + gamut->set_active(defPar.gamut); + wTRC->set_active(toUnderlying(ColorManagementParams::WorkingTrc::NONE));//reset to none + will->set_active(toUnderlying(ColorManagementParams::Illuminant::DEFAULT));//reset to default - after wprim +} + void ICMPanel::updateRenderingIntent(const Glib::ustring &profile) { const uint8_t supportedIntents = rtengine::ICCStore::getInstance()->getOutputIntents(profile); @@ -342,6 +542,13 @@ void ICMPanel::updateRenderingIntent(const Glib::ustring &profile) oRendIntent->setItemSensitivity(1, supportsRelative); oRendIntent->setItemSensitivity(2, supportsSaturation); oRendIntent->setItemSensitivity(3, supportsAbsolute); + + aRendIntent->set_sensitive(true); + aRendIntent->setItemSensitivity(0, supportsPerceptual); + aRendIntent->setItemSensitivity(1, supportsRelative); + aRendIntent->setItemSensitivity(2, supportsSaturation); + aRendIntent->setItemSensitivity(3, supportsAbsolute); + } else { oRendIntent->setItemSensitivity(0, true); oRendIntent->setItemSensitivity(1, true); @@ -349,9 +556,91 @@ void ICMPanel::updateRenderingIntent(const Glib::ustring &profile) oRendIntent->setItemSensitivity(3, true); oRendIntent->set_sensitive(false); oRendIntent->setSelected(1); + + aRendIntent->setItemSensitivity(0, true); + aRendIntent->setItemSensitivity(1, true); + aRendIntent->setItemSensitivity(2, true); + aRendIntent->setItemSensitivity(3, true); + aRendIntent->set_sensitive(false); + aRendIntent->setSelected(1); + } } +ICMPanel::~ICMPanel() +{ + idle_register.destroy(); +} + +void ICMPanel::primChanged (float rx, float ry, float bx, float by, float gx, float gy) +{ //update sliders R G B Ciexy + nextrx = rx; + nextry = ry; + nextbx = bx; + nextby = by; + nextgx = gx; + nextgy = gy; + + idle_register.add( + [this]() -> bool + { + disableListener(); + redx->setValue(nextrx); + redy->setValue(nextry); + blux->setValue(nextbx); + bluy->setValue(nextby); + grex->setValue(nextgx); + grey->setValue(nextgy); + + enableListener(); + return false; + } + ); +} + +void ICMPanel::iprimChanged (float r_x, float r_y, float b_x, float b_y, float g_x, float g_y, float w_x, float w_y) +{//update CIE xy graph + nextrx = r_x; + nextry = r_y; + nextbx = b_x; + nextby = b_y; + nextgx = g_x; + nextgy = g_y; + nextwx = w_x; + nextwy = w_y; + //convert xy datas in datas for labgrid areas + nextrx = 1.81818f * (nextrx + 0.1f) - 1.f; + nextry = 1.81818f * (nextry + 0.1f) - 1.f; + nextbx = 1.81818f * (nextbx + 0.1f) - 1.f; + nextby = 1.81818f * (nextby + 0.1f) - 1.f; + nextgx = 1.81818f * (nextgx + 0.1f) - 1.f; + nextgy = 1.81818f * (nextgy + 0.1f) - 1.f; + nextwx = 1.81818f * (nextwx + 0.1f) - 1.f; + nextwy = 1.81818f * (nextwy + 0.1f) - 1.f; + + idle_register.add( + [this]() -> bool + { + disableListener(); + labgridcie->setParams(nextrx, nextry, nextbx, nextby, nextgx, nextgy, nextwx, nextwy, false); + enableListener(); + return false; + } + ); +} + + +void ICMPanel::setEditProvider(EditDataProvider *provider) +{ + //in case of +} + +void ICMPanel::setListener(ToolPanelListener *tpl) +{//enable listener Toolpanel and Labgridcie + ToolPanel::setListener(tpl); + labgridcie->setListener(tpl); +} + void ICMPanel::updateDCP(int dcpIlluminant, Glib::ustring dcp_name) { ConnectionBlocker dcpillconn_(dcpillconn); @@ -428,8 +717,8 @@ void ICMPanel::updateDCP(int dcpIlluminant, Glib::ustring dcp_name) if (illuminants.will_interpolate) { if (dcpTemperatures[0] != illuminants.temperature_1 || dcpTemperatures[1] != illuminants.temperature_2) { char tempstr1[64], tempstr2[64]; - sprintf(tempstr1, "%.0fK", illuminants.temperature_1); - sprintf(tempstr2, "%.0fK", illuminants.temperature_2); + snprintf(tempstr1, sizeof(tempstr1), "%.0fK", illuminants.temperature_1); + snprintf(tempstr2, sizeof(tempstr2), "%.0fK", illuminants.temperature_2); int curr_active = dcpIll->get_active_row_number(); dcpIll->remove_all(); dcpIll->append(M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); @@ -484,6 +773,8 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) disableListener(); ConnectionBlocker obpcconn_(obpcconn); + ConnectionBlocker fbwconn_(fbwconn); + ConnectionBlocker gamutconn_(gamutconn); ConnectionBlocker ipc_(ipc); ConnectionBlocker tcurveconn_(tcurveconn); ConnectionBlocker ltableconn_(ltableconn); @@ -492,10 +783,14 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) ConnectionBlocker wprofnamesconn_(wprofnamesconn); ConnectionBlocker oprofnamesconn_(oprofnamesconn); ConnectionBlocker orendintentconn_(orendintentconn); + ConnectionBlocker arendintentconn_(arendintentconn); ConnectionBlocker dcpillconn_(dcpillconn); + ConnectionBlocker wtrcconn_(wtrcconn); + ConnectionBlocker willconn_(willconn); + ConnectionBlocker wprimconn_(wprimconn); - if (pp->icm.inputProfile.substr(0, 5) != "file:" && !ipDialog->get_filename().empty()) { - ipDialog->set_filename(pp->icm.inputProfile); + if (pp->icm.inputProfile.substr(0, 5) != "file:") { + ipDialog->set_filename(" "); } if (pp->icm.inputProfile == "(none)") { @@ -528,13 +823,15 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) wProfNames->set_active_text(pp->icm.workingProfile); - if (pp->icm.workingTRC == "none") { - wTRC->set_active(0); - } else if (pp->icm.workingTRC == "Custom") { - wTRC->set_active(1); - } + wTRC->set_active(rtengine::toUnderlying(pp->icm.workingTRC)); + + will->set_active(rtengine::toUnderlying(pp->icm.will)); + + wprim->set_active(rtengine::toUnderlying(pp->icm.wprim)); wtrcinChanged(); + willChanged(); + wprimChanged(); if (pp->icm.outputProfile == ColorManagementParams::NoICMString) { oProfNames->set_active_text(M("TP_ICM_NOICM")); @@ -547,8 +844,11 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) } oRendIntent->setSelected(pp->icm.outputIntent); + aRendIntent->setSelected(pp->icm.aRendIntent); obpc->set_active(pp->icm.outputBPC); + fbw->set_active(pp->icm.fbw); + gamut->set_active(pp->icm.gamut); ckbToneCurve->set_active(pp->icm.toneCurve); lastToneCurve = pp->icm.toneCurve; ckbApplyLookTable->set_active(pp->icm.applyLookTable); @@ -560,10 +860,20 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) wGamma->setValue(pp->icm.workingTRCGamma); wSlope->setValue(pp->icm.workingTRCSlope); + redx->setValue(pp->icm.redx); + redy->setValue(pp->icm.redy); + grex->setValue(pp->icm.grex); + grey->setValue(pp->icm.grey); + blux->setValue(pp->icm.blux); + bluy->setValue(pp->icm.bluy); + preser->setValue(pp->icm.preser); + labgridcie->setParams(pp->icm.labgridcieALow, pp->icm.labgridcieBLow, pp->icm.labgridcieAHigh, pp->icm.labgridcieBHigh, pp->icm.labgridcieGx, pp->icm.labgridcieGy, pp->icm.labgridcieWx, pp->icm.labgridcieWy, false); if (pedited) { iunchanged->set_active(!pedited->icm.inputProfile); obpc->set_inconsistent(!pedited->icm.outputBPC); + fbw->set_inconsistent(!pedited->icm.fbw); + gamut->set_inconsistent(!pedited->icm.gamut); ckbToneCurve->set_inconsistent(!pedited->icm.toneCurve); ckbApplyLookTable->set_inconsistent(!pedited->icm.applyLookTable); ckbApplyBaselineExposureOffset->set_inconsistent(!pedited->icm.applyBaselineExposureOffset); @@ -581,6 +891,10 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) oRendIntent->setSelected(4); } + if (!pedited->icm.aRendIntent) { + aRendIntent->setSelected(4); + } + if (!pedited->icm.dcpIlluminant) { dcpIll->set_active_text(M("GENERAL_UNCHANGED")); } @@ -589,11 +903,207 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) wTRC->set_active_text(M("GENERAL_UNCHANGED")); } + if (!pedited->icm.will) { + will->set_active_text(M("GENERAL_UNCHANGED")); + } + + if (!pedited->icm.wprim) { + wprim->set_active_text(M("GENERAL_UNCHANGED")); + } + labgridcie->setEdited(pedited->icm.labgridcieALow || pedited->icm.labgridcieBLow || pedited->icm.labgridcieAHigh || pedited->icm.labgridcieBHigh || pedited->icm.labgridcieGx || pedited->icm.labgridcieGy || pedited->icm.labgridcieWx || pedited->icm.labgridcieWy); + wGamma->setEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); wSlope->setEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); + redx->setEditedState(pedited->icm.redx ? Edited : UnEdited); + redy->setEditedState(pedited->icm.redy ? Edited : UnEdited); + grex->setEditedState(pedited->icm.grex ? Edited : UnEdited); + grey->setEditedState(pedited->icm.grey ? Edited : UnEdited); + blux->setEditedState(pedited->icm.blux ? Edited : UnEdited); + bluy->setEditedState(pedited->icm.bluy ? Edited : UnEdited); + preser->setEditedState(pedited->icm.preser ? Edited : UnEdited); } + switch (ColorManagementParams::WorkingTrc(wTRC->get_active_row_number())) { + case ColorManagementParams::WorkingTrc::NONE: { + wSlope->set_sensitive(false); + wGamma->set_sensitive(false); + will->set_sensitive(false); + willulab->set_sensitive(false); + wprim->set_sensitive(false); + fbw->set_sensitive(false); + gamut->set_sensitive(false); + wprimlab->set_sensitive(false); + riaHBox->set_sensitive(false); + redFrame->hide(); + break; + } + + case ColorManagementParams::WorkingTrc::CUSTOM: { + will->set_sensitive(false); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + if ( + ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM + && ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM_GRID + ) { + will->set_sensitive(false); + primCoordGrid->set_sensitive(false); + labgridcie->set_sensitive(false); + + } else { + will->set_sensitive(false); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::CUSTOM) { + will->set_sensitive(true); + } + primCoordGrid->set_sensitive(true); + labgridcie->set_sensitive(true); + } + + } + riaHBox->set_sensitive(true); + + if (pp->icm.workingTRCGamma <= 1.) { + wGamma->set_sensitive(true); + wSlope->set_sensitive(false); + } else { + wGamma->set_sensitive(true); + wSlope->set_sensitive(true); + } + break; + } + + case ColorManagementParams::WorkingTrc::BT709: + wGamma->setValue(2.222); + wSlope->setValue(4.5); + will->set_sensitive(true); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + } + riaHBox->set_sensitive(true); + break; + case ColorManagementParams::WorkingTrc::SRGB: + wGamma->setValue(2.4); + wSlope->setValue(12.92); + will->set_sensitive(true); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + } + break; + case ColorManagementParams::WorkingTrc::GAMMA_2_2: + wGamma->setValue(2.2); + wSlope->setValue(0.); + will->set_sensitive(true); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + redFrame->show(); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + } + break; + case ColorManagementParams::WorkingTrc::GAMMA_1_8: + wGamma->setValue(1.8); + wSlope->setValue(0.); + will->set_sensitive(true); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + } + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + break; + case ColorManagementParams::WorkingTrc::LINEAR: + wGamma->setValue(1.); + wSlope->setValue(1.); + will->set_sensitive(true); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + } + break; + } + + switch (ColorManagementParams::Primaries(wprim->get_active_row_number())) { + case ColorManagementParams::Primaries::DEFAULT: + case ColorManagementParams::Primaries::SRGB: + case ColorManagementParams::Primaries::ADOBE_RGB: + case ColorManagementParams::Primaries::PRO_PHOTO: + case ColorManagementParams::Primaries::REC2020: + case ColorManagementParams::Primaries::ACES_P1: + case ColorManagementParams::Primaries::WIDE_GAMUT: + case ColorManagementParams::Primaries::ACES_P0: + case ColorManagementParams::Primaries::BRUCE_RGB: + case ColorManagementParams::Primaries::BETA_RGB: + case ColorManagementParams::Primaries::BEST_RGB: { + labgridcie->set_sensitive(false); + will->set_sensitive(false); + break; + } + + case ColorManagementParams::Primaries::CUSTOM: { + will->set_sensitive(true); + labgridcie->set_sensitive(false); + break; + } + + case ColorManagementParams::Primaries::CUSTOM_GRID: { + labgridcie->set_sensitive(true); + primCoordGrid->set_sensitive(false); + will->set_sensitive(false); + break; + } + } + enableListener(); } @@ -618,7 +1128,7 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) 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(); + labgridcie->getParams(pp->icm.labgridcieALow, pp->icm.labgridcieBLow, pp->icm.labgridcieAHigh, pp->icm.labgridcieBHigh, pp->icm.labgridcieGx, pp->icm.labgridcieGy, pp->icm.labgridcieWx, pp->icm.labgridcieWy); if (oProfNames->get_active_text() == M("TP_ICM_NOICM")) { pp->icm.outputProfile = ColorManagementParams::NoICMString; @@ -634,27 +1144,45 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) pp->icm.outputIntent = rtengine::RI_RELATIVE; } - if (wTRC->get_active_row_number() == 0) { - pp->icm.workingTRC = "none"; - } else if (wTRC->get_active_row_number() == 1) { - pp->icm.workingTRC = "Custom"; + int aintentVal = aRendIntent->getSelected(); + + if (aintentVal >= 0 && aintentVal < RI__COUNT) { + pp->icm.aRendIntent = static_cast(aintentVal); + } else { + pp->icm.aRendIntent = rtengine::RI_RELATIVE; } + pp->icm.workingTRC = ColorManagementParams::WorkingTrc(wTRC->get_active_row_number()); + pp->icm.will = ColorManagementParams::Illuminant(will->get_active_row_number()); + pp->icm.wprim = ColorManagementParams::Primaries(wprim->get_active_row_number()); + 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->icm.fbw = fbw->get_active(); + pp->icm.gamut = gamut->get_active(); + pp->icm.workingTRCGamma = wGamma->getValue(); + pp->icm.workingTRCSlope = wSlope->getValue(); + pp->icm.redx = redx->getValue(); + pp->icm.redy = redy->getValue(); + pp->icm.grex = grex->getValue(); + pp->icm.grey = grey->getValue(); + pp->icm.blux = blux->getValue(); + pp->icm.bluy = bluy->getValue(); pp->toneCurve.fromHistMatching = false; + pp->icm.preser = preser->getValue(); if (pedited) { 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.aRendIntent = aRendIntent->getSelected() < 4; pedited->icm.outputBPC = !obpc->get_inconsistent(); + pedited->icm.fbw = !fbw->get_inconsistent(); + pedited->icm.gamut = !gamut->get_inconsistent(); pedited->icm.dcpIlluminant = dcpIll->get_active_text() != M("GENERAL_UNCHANGED"); pedited->icm.toneCurve = !ckbToneCurve->get_inconsistent(); pedited->icm.applyLookTable = !ckbApplyLookTable->get_inconsistent(); @@ -663,21 +1191,50 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) pedited->icm.workingTRCGamma = wGamma->getEditedState(); pedited->icm.workingTRCSlope = wSlope->getEditedState(); pedited->icm.workingTRC = wTRC->get_active_text() != M("GENERAL_UNCHANGED"); - } + pedited->icm.will = will->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->icm.wprim = wprim->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->icm.redx = redx->getEditedState(); + pedited->icm.redy = redy->getEditedState(); + pedited->icm.labgridcieALow = pedited->icm.labgridcieBLow = pedited->icm.labgridcieAHigh = pedited->icm.labgridcieBHigh = pedited->icm.labgridcieGx = pedited->icm.labgridcieGy = pedited->icm.labgridcieWx = pedited->icm.labgridcieWy = labgridcie->getEdited(); + } } void ICMPanel::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { wGamma->setDefault(defParams->icm.workingTRCGamma); wSlope->setDefault(defParams->icm.workingTRCSlope); + redx->setDefault(defParams->icm.redx); + redy->setDefault(defParams->icm.redy); + grex->setDefault(defParams->icm.grex); + grey->setDefault(defParams->icm.grey); + blux->setDefault(defParams->icm.blux); + bluy->setDefault(defParams->icm.bluy); + preser->setDefault(defParams->icm.preser); + labgridcie->setDefault(defParams->icm.labgridcieALow, defParams->icm.labgridcieBLow , defParams->icm.labgridcieAHigh, defParams->icm.labgridcieBHigh, defParams->icm.labgridcieGx, defParams->icm.labgridcieGy, defParams->icm.labgridcieWx, defParams->icm.labgridcieWy); if (pedited) { wGamma->setDefaultEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); wSlope->setDefaultEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); + redx->setDefaultEditedState(pedited->icm.redx ? Edited : UnEdited); + redy->setDefaultEditedState(pedited->icm.redy ? Edited : UnEdited); + grex->setDefaultEditedState(pedited->icm.grex ? Edited : UnEdited); + grey->setDefaultEditedState(pedited->icm.grey ? Edited : UnEdited); + blux->setDefaultEditedState(pedited->icm.blux ? Edited : UnEdited); + bluy->setDefaultEditedState(pedited->icm.bluy ? Edited : UnEdited); + labgridcie->setEdited((pedited->icm.labgridcieALow || pedited->icm.labgridcieBLow || pedited->icm.labgridcieAHigh || pedited->icm.labgridcieBHigh || pedited->icm.labgridcieGx || pedited->icm.labgridcieGy || pedited->icm.labgridcieWx || pedited->icm.labgridcieWy) ? Edited : UnEdited); + preser->setDefaultEditedState(pedited->icm.preser ? Edited : UnEdited); } else { wGamma->setDefaultEditedState(Irrelevant); wSlope->setDefaultEditedState(Irrelevant); + redx->setDefaultEditedState(Irrelevant); + redy->setDefaultEditedState(Irrelevant); + grex->setDefaultEditedState(Irrelevant); + grey->setDefaultEditedState(Irrelevant); + blux->setDefaultEditedState(Irrelevant); + bluy->setDefaultEditedState(Irrelevant); + preser->setDefaultEditedState(Irrelevant); + labgridcie->setEdited(Edited); } } @@ -688,9 +1245,28 @@ void ICMPanel::adjusterChanged(Adjuster* a, double newval) Glib::ustring costr2 = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), newval); if (a == wGamma) { + if (wGamma->getValue() <= 1.) { + wSlope->set_sensitive(false); + } else { + wSlope->set_sensitive(true); + } listener->panelChanged(EvICMgamm, costr2); } else if (a == wSlope) { listener->panelChanged(EvICMslop, costr2); + } else if (a == redx) { + listener->panelChanged(EvICMredx, costr2); + } else if (a == redy) { + listener->panelChanged(EvICMredy, costr2); + } else if (a == grex) { + listener->panelChanged(EvICMgrex, costr2); + } else if (a == grey) { + listener->panelChanged(EvICMgrey, costr2); + } else if (a == blux) { + listener->panelChanged(EvICMblux, costr2); + } else if (a == bluy) { + listener->panelChanged(EvICMbluy, costr2); + } else if (a == preser) { + listener->panelChanged(EvICMpreser, costr2); } } @@ -705,13 +1281,223 @@ void ICMPanel::wpChanged() void ICMPanel::wtrcinChanged() { - if (wTRC->get_active_row_number() == 0) { - wGamma->set_sensitive(false); - wSlope->set_sensitive(false); + switch (ColorManagementParams::WorkingTrc(wTRC->get_active_row_number())) { + case ColorManagementParams::WorkingTrc::NONE: { + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + will->set_sensitive(false); + willulab->set_sensitive(false); + wprim->set_sensitive(false); + fbw->set_sensitive(false); + gamut->set_sensitive(false); + wprimlab->set_sensitive(false); + redFrame->hide(); + riaHBox->set_sensitive(false); + break; + } - } else { - wGamma->set_sensitive(true); - wSlope->set_sensitive(true); + case ColorManagementParams::WorkingTrc::CUSTOM: { + will->set_sensitive(false); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + willulab->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + if ( + ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM + && ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM_GRID + ) { + primCoordGrid->set_sensitive(false); + } else { + primCoordGrid->set_sensitive(true); + } + } + riaHBox->set_sensitive(true); + if (wGamma->getValue() <= 1.) { + wGamma->set_sensitive(true); + wSlope->set_sensitive(false); + } else { + wGamma->set_sensitive(true); + wSlope->set_sensitive(true); + } + break; + } + + case ColorManagementParams::WorkingTrc::BT709: { + wGamma->setValue(2.222); + wSlope->setValue(4.5); + will->set_sensitive(false); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + if ( + ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM + && ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM_GRID + ) { + primCoordGrid->set_sensitive(false); + } + } + riaHBox->set_sensitive(true); + break; + } + + case ColorManagementParams::WorkingTrc::SRGB: { + wGamma->setValue(2.4); + wSlope->setValue(12.92); + will->set_sensitive(false); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + if ( + ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM + && ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM_GRID + ) { + primCoordGrid->set_sensitive(false); + } else { + primCoordGrid->set_sensitive(true); + } + } + break; + } + + case ColorManagementParams::WorkingTrc::GAMMA_2_2: { + wGamma->setValue(2.2); + wSlope->setValue(0.); + will->set_sensitive(false); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + if ( + ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM + && ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM_GRID + ) { + primCoordGrid->set_sensitive(false); + } else { + primCoordGrid->set_sensitive(true); + } + } + break; + } + + case ColorManagementParams::WorkingTrc::GAMMA_1_8: { + wGamma->setValue(1.8); + wSlope->setValue(0.); + will->set_sensitive(false); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + if ( + ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM + && ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM_GRID + ) { + primCoordGrid->set_sensitive(false); + } else { + primCoordGrid->set_sensitive(true); + } + } + break; + } + + case ColorManagementParams::WorkingTrc::LINEAR: { + wGamma->setValue(1.0); + wSlope->setValue(1.); + will->set_sensitive(false); + willulab->set_sensitive(true); + wprim->set_sensitive(true); + fbw->set_sensitive(true); + gamut->set_sensitive(true); + wprimlab->set_sensitive(true); + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + riaHBox->set_sensitive(true); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + redFrame->hide(); + } else { + redFrame->show(); + if ( + ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM + && ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM_GRID + ) { + primCoordGrid->set_sensitive(false); + } else { + primCoordGrid->set_sensitive(true); + } + } + break; + } + } + wprimChanged(); + + switch (ColorManagementParams::Primaries(wprim->get_active_row_number())) { + case ColorManagementParams::Primaries::DEFAULT: + case ColorManagementParams::Primaries::SRGB: + case ColorManagementParams::Primaries::ADOBE_RGB: + case ColorManagementParams::Primaries::PRO_PHOTO: + case ColorManagementParams::Primaries::REC2020: + case ColorManagementParams::Primaries::ACES_P1: + case ColorManagementParams::Primaries::WIDE_GAMUT: + case ColorManagementParams::Primaries::ACES_P0: + case ColorManagementParams::Primaries::BRUCE_RGB: + case ColorManagementParams::Primaries::BETA_RGB: + case ColorManagementParams::Primaries::BEST_RGB: { + labgridcie->set_sensitive(false); + will->set_sensitive(false); + break; + } + + case ColorManagementParams::Primaries::CUSTOM: { + will->set_sensitive(true); + labgridcie->set_sensitive(false); + break; + } + + case ColorManagementParams::Primaries::CUSTOM_GRID: { + labgridcie->set_sensitive(true); + will->set_sensitive(false); + break; + } + } + + if (ColorManagementParams::WorkingTrc(wTRC->get_active_row_number()) == ColorManagementParams::WorkingTrc::NONE) { + redFrame->hide(); } if (listener) { @@ -719,6 +1505,280 @@ void ICMPanel::wtrcinChanged() } } +void ICMPanel::willChanged() +{ + switch (ColorManagementParams::Primaries(wprim->get_active_row_number())) { + case ColorManagementParams::Primaries::DEFAULT: + case ColorManagementParams::Primaries::SRGB: + case ColorManagementParams::Primaries::ADOBE_RGB: + case ColorManagementParams::Primaries::PRO_PHOTO: + case ColorManagementParams::Primaries::REC2020: + case ColorManagementParams::Primaries::ACES_P1: + case ColorManagementParams::Primaries::WIDE_GAMUT: + case ColorManagementParams::Primaries::ACES_P0: + case ColorManagementParams::Primaries::BRUCE_RGB: + case ColorManagementParams::Primaries::BETA_RGB: + case ColorManagementParams::Primaries::BEST_RGB: { + labgridcie->set_sensitive(false); + will->set_sensitive(false); + break; + } + + case ColorManagementParams::Primaries::CUSTOM: { + will->set_sensitive(true); + labgridcie->set_sensitive(false); + break; + } + + case ColorManagementParams::Primaries::CUSTOM_GRID: { + labgridcie->set_sensitive(true); + will->set_sensitive(false); + break; + } + } + + if (listener) { + listener->panelChanged(EvICMwillMethod, will->get_active_text()); + } +} + + + +void ICMPanel::wprimChanged() +{ + switch (ColorManagementParams::Primaries(wprim->get_active_row_number())) { + case ColorManagementParams::Primaries::DEFAULT: + case ColorManagementParams::Primaries::CUSTOM: + case ColorManagementParams::Primaries::CUSTOM_GRID: { + break; + } + + case ColorManagementParams::Primaries::SRGB: { + redx->setValue(0.64); + redy->setValue(0.33); + grex->setValue(0.30); + grey->setValue(0.60); + blux->setValue(0.15); + bluy->setValue(0.06); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + break; + } + + case ColorManagementParams::Primaries::ADOBE_RGB: { + redx->setValue(0.64); + redy->setValue(0.33); + grex->setValue(0.21); + grey->setValue(0.71); + blux->setValue(0.15); + bluy->setValue(0.06); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + break; + } + + case ColorManagementParams::Primaries::PRO_PHOTO: { + redx->setValue(0.7347); + redy->setValue(0.2653); + grex->setValue(0.1596); + grey->setValue(0.8404); + blux->setValue(0.0366); + bluy->setValue(0.0001); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + break; + } + + case ColorManagementParams::Primaries::REC2020: { + redx->setValue(0.708); + redy->setValue(0.292); + grex->setValue(0.17); + grey->setValue(0.797); + blux->setValue(0.131); + bluy->setValue(0.046); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + break; + } + + case ColorManagementParams::Primaries::ACES_P1: { + redx->setValue(0.713); + redy->setValue(0.293); + grex->setValue(0.165); + grey->setValue(0.830); + blux->setValue(0.128); + bluy->setValue(0.044); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D60)); + break; + } + + case ColorManagementParams::Primaries::WIDE_GAMUT: { + redx->setValue(0.735); + redy->setValue(0.265); + grex->setValue(0.115); + grey->setValue(0.826); + blux->setValue(0.1570); + bluy->setValue(0.018); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + break; + } + + case ColorManagementParams::Primaries::ACES_P0: { + redx->setValue(0.7347); + redy->setValue(0.2653); + grex->setValue(0.); + grey->setValue(1.0); + blux->setValue(0.0001); + bluy->setValue(-0.077); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D60)); + break; + } + + case ColorManagementParams::Primaries::BRUCE_RGB: { + redx->setValue(0.64); + redy->setValue(0.33); + grex->setValue(0.28); + grey->setValue(0.65); + blux->setValue(0.15); + bluy->setValue(0.06); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + break; + } + + case ColorManagementParams::Primaries::BETA_RGB: { + redx->setValue(0.6888); + redy->setValue(0.3112); + grex->setValue(0.1986); + grey->setValue(0.7551); + blux->setValue(0.1265); + bluy->setValue(0.0352); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + break; + } + + case ColorManagementParams::Primaries::BEST_RGB: { + redx->setValue(0.7347); + redy->setValue(0.2653); + grex->setValue(0.2150); + grey->setValue(0.7750); + blux->setValue(0.130); + bluy->setValue(0.035); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + break; + } + } + + + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::DEFAULT) { + if (wProfNames->get_active_text() == "Rec2020") { + redx->setValue(0.708); + redy->setValue(0.292); + grex->setValue(0.17); + grey->setValue(0.797); + blux->setValue(0.131); + bluy->setValue(0.046); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + } else if (wProfNames->get_active_text() == "sRGB") { + redx->setValue(0.64); + redy->setValue(0.33); + grex->setValue(0.30); + grey->setValue(0.60); + blux->setValue(0.15); + bluy->setValue(0.06); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + } else if (wProfNames->get_active_text() == "Adobe RGB") { + redx->setValue(0.64); + redy->setValue(0.33); + grex->setValue(0.21); + grey->setValue(0.71); + blux->setValue(0.15); + bluy->setValue(0.06); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + } else if (wProfNames->get_active_text() == "ProPhoto") { + redx->setValue(0.7347); + redy->setValue(0.2653); + grex->setValue(0.1596); + grey->setValue(0.8404); + blux->setValue(0.0366); + bluy->setValue(0.0001); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + } else if (wProfNames->get_active_text() == "ACESp1") { + redx->setValue(0.713); + redy->setValue(0.293); + grex->setValue(0.165); + grey->setValue(0.830); + blux->setValue(0.128); + bluy->setValue(0.044); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D60)); + } else if (wProfNames->get_active_text() == "WideGamut") { + redx->setValue(0.735); + redy->setValue(0.265); + grex->setValue(0.115); + grey->setValue(0.826); + blux->setValue(0.1570); + bluy->setValue(0.018); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + } else if (wProfNames->get_active_text() == "ACESp0") { + redx->setValue(0.7347); + redy->setValue(0.2653); + grex->setValue(0.); + grey->setValue(1.0); + blux->setValue(0.0001); + bluy->setValue(-0.077); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D60)); + } else if (wProfNames->get_active_text() == "BruceRGB") { + redx->setValue(0.64); + redy->setValue(0.33); + grex->setValue(0.28); + grey->setValue(0.65); + blux->setValue(0.15); + bluy->setValue(0.06); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D65)); + } else if (wProfNames->get_active_text() == "Beta RGB") { + redx->setValue(0.6888); + redy->setValue(0.3112); + grex->setValue(0.1986); + grey->setValue(0.7551); + blux->setValue(0.1265); + bluy->setValue(0.0352); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + } else if (wProfNames->get_active_text() == "BestRGB") { + redx->setValue(0.7347); + redy->setValue(0.2653); + grex->setValue(0.2150); + grey->setValue(0.7750); + blux->setValue(0.130); + bluy->setValue(0.035); + will->set_active(toUnderlying(ColorManagementParams::Illuminant::D50)); + } + + redFrame->hide(); + } else { + redFrame->show(); + + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) != ColorManagementParams::Primaries::CUSTOM) { + primCoordGrid->set_sensitive(false); + labgridcie->set_sensitive(false); + will->set_sensitive(false); + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::CUSTOM_GRID) { + labgridcie->set_sensitive(true); + } + } else { + primCoordGrid->set_sensitive(true); + labgridcie->set_sensitive(false); + will->set_sensitive(true); + } + + } + willChanged (); + + if (ColorManagementParams::Primaries(wprim->get_active_row_number()) == ColorManagementParams::Primaries::CUSTOM_GRID) { + labgridcie->set_sensitive(true); + } else { + labgridcie->set_sensitive(false); + } + + if (listener) { + listener->panelChanged(EvICMwprimMethod, wprim->get_active_text()); + } +} + void ICMPanel::dcpIlluminantChanged() { if (listener) { @@ -834,23 +1894,29 @@ void ICMPanel::ipChanged() { Glib::ustring profname; + Glib::ustring localized_profname; if (inone->get_active()) { profname = "(none)"; + localized_profname = inone->get_label(); } else if (iembedded->get_active()) { profname = "(embedded)"; + localized_profname = iembedded->get_label(); } else if (icamera->get_active()) { profname = "(camera)"; + localized_profname = icamera->get_label(); } else if (icameraICC->get_active()) { profname = "(cameraICC)"; + localized_profname = icameraICC->get_label(); } else { profname = ipDialog->get_filename(); + localized_profname = profname; } updateDCP(-1, profname); if (listener && profname != oldip) { - listener->panelChanged(EvIProfile, profname); + listener->panelChanged(EvIProfile, localized_profname); } oldip = profname; @@ -900,6 +1966,39 @@ void ICMPanel::oiChanged(int n) } } +void ICMPanel::aiChanged(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; + } + + listener->panelChanged(EvaIntent, str); + } +} + void ICMPanel::oBPCChanged() { if (multiImage) { @@ -926,6 +2025,59 @@ void ICMPanel::oBPCChanged() } } +void ICMPanel::fbwChanged() +{ + if (multiImage) { + if (fbw->get_inconsistent()) { + fbw->set_inconsistent(false); + fbwconn.block(true); + fbw->set_active(false); + fbwconn.block(false); + } else if (lastfbw) { + fbw->set_inconsistent(true); + } + + lastfbw = fbw->get_active(); + } + + if (listener) { + if (fbw->get_inconsistent()) { + listener->panelChanged(EvICMfbw, M("GENERAL_UNCHANGED")); + } else if (fbw->get_active()) { + listener->panelChanged(EvICMfbw, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvICMfbw, M("GENERAL_DISABLED")); + } + } +} + +void ICMPanel::gamutChanged() +{ + if (multiImage) { + if (gamut->get_inconsistent()) { + gamut->set_inconsistent(false); + gamutconn.block(true); + gamut->set_active(false); + gamutconn.block(false); + } else if (lastgamut) { + gamut->set_inconsistent(true); + } + + lastgamut = gamut->get_active(); + } + + if (listener) { + if (gamut->get_inconsistent()) { + listener->panelChanged(EvICMgamut, M("GENERAL_UNCHANGED")); + } else if (fbw->get_active()) { + listener->panelChanged(EvICMgamut, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvICMgamut, M("GENERAL_DISABLED")); + } + } +} + + void ICMPanel::setRawMeta(bool raw, const rtengine::FramesData* pMeta) { @@ -951,6 +2103,8 @@ void ICMPanel::ipSelectionChanged() ipChanged(); } + + void ICMPanel::saveReferencePressed() { @@ -967,7 +2121,7 @@ void ICMPanel::saveReferencePressed() 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()); + Gtk::Box* hbox = Gtk::manage(new Gtk::Box()); hbox->pack_end(applyWB, Gtk::PACK_SHRINK, 2); Gtk::Box *box = dialog.get_content_area(); box->pack_end(*hbox, Gtk::PACK_SHRINK, 2); @@ -1025,10 +2179,21 @@ void ICMPanel::setBatchMode(bool batchMode) oProfNames->append(M("GENERAL_UNCHANGED")); oRendIntent->addEntry("template-24.png", M("GENERAL_UNCHANGED")); oRendIntent->show(); + aRendIntent->addEntry("template-24.png", M("GENERAL_UNCHANGED")); + aRendIntent->show(); wProfNames->append(M("GENERAL_UNCHANGED")); wTRC->append(M("GENERAL_UNCHANGED")); + will->append(M("GENERAL_UNCHANGED")); + wprim->append(M("GENERAL_UNCHANGED")); dcpIll->append(M("GENERAL_UNCHANGED")); wGamma->showEditedCB(); wSlope->showEditedCB(); + redx->showEditedCB(); + redy->showEditedCB(); + grex->showEditedCB(); + grey->showEditedCB(); + blux->showEditedCB(); + bluy->showEditedCB(); + preser->showEditedCB(); } diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index cc46c5d37..6c670c5e6 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -36,24 +36,38 @@ public: virtual void saveInputICCReference(const Glib::ustring& fname, bool apply_wb) = 0; }; +class LabGrid; + class ICMPanel final : public ToolParamBlock, - public AdjusterListener, - public FoldableToolPanel + public FoldableToolPanel, + public rtengine::AutoprimListener, + public AdjusterListener { protected: Gtk::Frame* dcpFrame; Gtk::Frame* coipFrame; + Gtk::Frame* redFrame; Adjuster* wGamma; Adjuster* wSlope; + Adjuster* redx; + Adjuster* redy; + Adjuster* grex; + Adjuster* grey; + Adjuster* blux; + Adjuster* bluy; + Adjuster* preser; Gtk::Label* labmga; - Gtk::HBox* gabox; + Gtk::Box* gabox; + //Gtk::Label* blr; + //Gtk::Label* blg; + //Gtk::Label* blb; + Gtk::Button* neutral; - - //bool freegamma; + sigc::connection neutralconn; bool lastToneCurve; sigc::connection tcurveconn; bool lastApplyLookTable; @@ -64,24 +78,53 @@ protected: sigc::connection hsmconn; bool lastobpc; sigc::connection obpcconn; + bool lastfbw; + sigc::connection fbwconn; bool isBatchMode; + bool lastgamut; + sigc::connection gamutconn; private: 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 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; + rtengine::ProcEvent EvICMwillMethod; + rtengine::ProcEvent EvICMwprimMethod; + rtengine::ProcEvent EvICMredx; + rtengine::ProcEvent EvICMredy; + rtengine::ProcEvent EvICMgrex; + rtengine::ProcEvent EvICMgrey; + rtengine::ProcEvent EvICMblux; + rtengine::ProcEvent EvICMbluy; + rtengine::ProcEvent EvaIntent; + rtengine::ProcEvent EvICMpreser; + rtengine::ProcEvent EvICMLabGridciexy; + rtengine::ProcEvent EvICMfbw; + rtengine::ProcEvent EvICMgamut; + LabGrid *labgridcie; + IdleRegister idle_register; - Gtk::VBox* iVBox; - Gtk::HBox* wTRCHBox; + Gtk::Box* willuBox; + Gtk::Label* willulab; + Gtk::Box* wprimBox; + Gtk::Label* wprimlab; + Gtk::Label* cielab; + Gtk::Grid* primCoordGrid; + Gtk::Box* riaHBox; + Gtk::Box* preBox; + Gtk::Box* iVBox; + Gtk::Box* wTRCBox; + Gtk::CheckButton* fbw; + Gtk::CheckButton* gamut; Gtk::CheckButton* obpc; Gtk::RadioButton* inone; @@ -101,6 +144,12 @@ private: sigc::connection wprofnamesconn; MyComboBoxText* wTRC; sigc::connection wtrcconn; + MyComboBoxText* will; + sigc::connection willconn; + MyComboBoxText* wprim; + sigc::connection wprimconn; + std::unique_ptr aRendIntent; + sigc::connection arendintentconn; MyComboBoxText* oProfNames; sigc::connection oprofnamesconn; @@ -113,26 +162,47 @@ private: 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); + + float nextrx; + float nextry; + float nextbx; + float nextby; + float nextgx; + float nextgy; + float nextwx; + float nextwy; + public: + static const Glib::ustring TOOL_NAME; + ICMPanel(); + ~ICMPanel() 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 adjusterChanged(Adjuster* a, double newval) override; + void primChanged (float rx, float ry, float bx, float by, float gx, float gy) override; + void iprimChanged (float r_x, float r_y, float b_x, float b_y, float g_x, float g_y, float w_x, float w_y) override; + void neutral_pressed(); void wpChanged(); void wtrcinChanged(); + void willChanged(); + void wprimChanged(); void opChanged(); void oiChanged(int n); + void aiChanged(int n); void oBPCChanged(); + void fbwChanged(); + void gamutChanged(); void ipChanged(); void ipSelectionChanged(); void dcpIlluminantChanged(); @@ -143,9 +213,13 @@ public: void setRawMeta(bool raw, const rtengine::FramesData* pMeta); void saveReferencePressed(); + void setListener(ToolPanelListener* tpl) override; + void setEditProvider(EditDataProvider *provider) override; void setICMPanelListener(ICMPanelListener* ipl) { icmplistener = ipl; } + }; + diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index 0be6982f9..22e140e7d 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -409,6 +409,34 @@ void ImageArea::getImageSize (int &w, int&h) } } +void ImageArea::getPreviewCenterPos(int &x, int &y) +{ + if (mainCropWindow) { + // Getting crop window size + int cW, cH; + mainCropWindow->getSize(cW, cH); + + // Converting center coord of crop window to image coord + const int cX = cW / 2; + const int cY = cH / 2; + mainCropWindow->screenCoordToImage(cX, cY, x, y); + } else { + x = y = 0; + } +} + +void ImageArea::getPreviewSize(int &w, int &h) +{ + if (mainCropWindow) { + int tmpW, tmpH; + mainCropWindow->getSize(tmpW, tmpH); + w = mainCropWindow->scaleValueToImage(tmpW); + h = mainCropWindow->scaleValueToImage(tmpH); + } else { + w = h = 0; + } +} + void ImageArea::grabFocus (CropWindow* cw) { diff --git a/rtgui/imagearea.h b/rtgui/imagearea.h index 28b52dcd2..ad6fd305f 100644 --- a/rtgui/imagearea.h +++ b/rtgui/imagearea.h @@ -34,7 +34,7 @@ class ImageAreaPanel; -class ImageArea : +class ImageArea final : public Gtk::DrawingArea, public CropWindowListener, public EditDataProvider, @@ -148,6 +148,8 @@ public: void subscribe(EditSubscriber *subscriber) override; void unsubscribe() override; void getImageSize (int &w, int&h) override; + void getPreviewCenterPos(int &x, int &y) override; + void getPreviewSize(int &w, int &h) override; // CropWindowListener interface void cropPositionChanged (CropWindow* cw) override; diff --git a/rtgui/imageareapanel.cc b/rtgui/imageareapanel.cc index f693c3181..ee153026d 100644 --- a/rtgui/imageareapanel.cc +++ b/rtgui/imageareapanel.cc @@ -20,10 +20,11 @@ ImageAreaPanel::ImageAreaPanel () : before(nullptr), after(nullptr) { + set_orientation(Gtk::ORIENTATION_VERTICAL); imageArea = new ImageArea (this); - Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb1 = Gtk::manage (new Gtk::Box ()); Gtk::Frame* frame = Gtk::manage (new Gtk::Frame ()); frame->add (*imageArea); diff --git a/rtgui/imageareapanel.h b/rtgui/imageareapanel.h index 831371dbb..8572d41d6 100644 --- a/rtgui/imageareapanel.h +++ b/rtgui/imageareapanel.h @@ -22,8 +22,8 @@ class ImageArea; -class ImageAreaPanel : - public Gtk::VBox +class ImageAreaPanel final : + public Gtk::Box { protected: diff --git a/rtgui/impulsedenoise.cc b/rtgui/impulsedenoise.cc index cc2e10899..1df662aad 100644 --- a/rtgui/impulsedenoise.cc +++ b/rtgui/impulsedenoise.cc @@ -28,7 +28,9 @@ using namespace rtengine; using namespace rtengine::procparams; -ImpulseDenoise::ImpulseDenoise () : FoldableToolPanel(this, "impulsedenoise", M("TP_IMPULSEDENOISE_LABEL"), true, true) +const Glib::ustring ImpulseDenoise::TOOL_NAME = "impulsedenoise"; + +ImpulseDenoise::ImpulseDenoise () : FoldableToolPanel(this, TOOL_NAME, M("TP_IMPULSEDENOISE_LABEL"), true, true) { thresh = Gtk::manage (new Adjuster (M("TP_IMPULSEDENOISE_THRESH"), 0, 100, 1, 50)); diff --git a/rtgui/impulsedenoise.h b/rtgui/impulsedenoise.h index b8acafcfc..c4c297927 100644 --- a/rtgui/impulsedenoise.h +++ b/rtgui/impulsedenoise.h @@ -34,6 +34,7 @@ protected: //Adjuster* edge; public: + static const Glib::ustring TOOL_NAME; ImpulseDenoise (); diff --git a/rtgui/indclippedpanel.h b/rtgui/indclippedpanel.h index 1017b58f1..6be0a6c40 100644 --- a/rtgui/indclippedpanel.h +++ b/rtgui/indclippedpanel.h @@ -24,7 +24,7 @@ class ImageArea; class IndicateClippedPanel : - public Gtk::HBox + public Gtk::Box { protected: diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index 9002cc389..675da51c6 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -21,6 +21,7 @@ #include #include "cursormanager.h" #include "guiutils.h" +#include "multilangmgr.h" #include "options.h" #include "pathutils.h" #include "rtscalable.h" @@ -82,18 +83,330 @@ InspectorBuffer::~InspectorBuffer() { // return deg; //} -Inspector::Inspector () : currImage(nullptr), zoom(0.0), active(false) +Inspector::Inspector () : currImage(nullptr), scaled(false), scale(1.0), zoomScale(1.0), zoomScaleBegin(1.0), active(false), pinned(false), dirty(false), fullscreen(true), keyDown(false), windowShowing(false) { set_name("Inspector"); + + if (!options.inspectorWindow) { + window = nullptr; + } + else { + window = new Gtk::Window(); + window->set_name("InspectorWindow"); + window->set_title("RawTherapee " + M("INSPECTOR_WINDOW_TITLE")); + window->set_visible(false); + window->add_events(Gdk::KEY_PRESS_MASK); + window->signal_key_release_event().connect(sigc::mem_fun(*this, &Inspector::on_key_release)); + window->signal_key_press_event().connect(sigc::mem_fun(*this, &Inspector::on_key_press)); + window->signal_hide().connect(sigc::mem_fun(*this, &Inspector::on_window_hide)); + window->signal_window_state_event().connect(sigc::mem_fun(*this, &Inspector::on_inspector_window_state_event)); + + add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK); + gestureZoom = Gtk::GestureZoom::create(*this); + gestureZoom->signal_begin().connect(sigc::mem_fun(*this, &Inspector::on_zoom_begin)); + gestureZoom->signal_scale_changed().connect(sigc::mem_fun(*this, &Inspector::on_zoom_scale_changed)); + + window->add(*this); + window->set_size_request(500, 500); + window->fullscreen(); + initialized = false; // delay init to avoid flickering on some systems + active = true; // always track inspected thumbnails + } } Inspector::~Inspector() { deleteBuffers(); + if (window) + delete window; +} + +void Inspector::showWindow(bool pinned, bool scaled) +{ + if (!window || windowShowing) + return; + + // initialize when shown first + if (!initialized) { + window->show_all(); + initialized = true; + } + + // show inspector window + this->scaled = scaled; + window->set_visible(true); + this->pinned = pinned; + windowShowing = true; + + // update content when becoming visible + switchImage(next_image_path); + mouseMove(next_image_pos, 0); +} + +void Inspector::hideWindow() +{ + if (!window) { + return; + } + window->set_visible(false); +} + +bool Inspector::on_key_release(GdkEventKey *event) +{ + keyDown = false; + + if (!window) + return false; + + if (!pinned) { + switch (event->keyval) { + case GDK_KEY_f: + case GDK_KEY_F: + zoomScale = 1.0; + window->set_visible(false); + return true; + } + } + return false; +} + +bool Inspector::on_key_press(GdkEventKey *event) +{ + if (!window) + return false; + + if (keyDown) { + return true; + } + + keyDown = true; + + switch (event->keyval) { + case GDK_KEY_z: + case GDK_KEY_F: + // show image unscaled in 100% view + if (pinned || scaled) + zoomScale = 1.0; // reset if not key hold + scaled = false; + queue_draw(); + return true; + case GDK_KEY_f: + // show image scaled to window size + if (pinned || !scaled) + zoomScale = 1.0; // reset if not key hold + scaled = true; + queue_draw(); + return true; + case GDK_KEY_F11: + // toggle fullscreen + if (fullscreen) + window->unfullscreen(); + else + window->fullscreen(); + fullscreen = !fullscreen; + return true; + case GDK_KEY_Escape: + // hide window + zoomScale = 1.0; + window->set_visible(false); + return true; + } + + keyDown = false; + + return false; +} + +void Inspector::on_window_hide() +{ + windowShowing = false; +} + +bool Inspector::on_inspector_window_state_event(GdkEventWindowState *event) +{ + if (!window->get_window() || window->get_window()->gobj() != event->window) { + return false; + } + + fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN; + + return true; +} + +bool Inspector::on_button_press_event(GdkEventButton *event) +{ + if (!window) + return false; + + if (event->type == GDK_BUTTON_PRESS) { + button_pos.set(event->x, event->y); + if (!pinned) + // pin window with mouse click + pinned = true; + return true; + } + return false; +} + +bool Inspector::on_motion_notify_event(GdkEventMotion *event) +{ + if (!currImage || !window) + return false; + + int deviceScale = get_scale_factor(); + int event_x = round(event->x); + int event_y = round(event->y); + int delta_x = (button_pos.x - event_x) * deviceScale; + int delta_y = (button_pos.y - event_y) * deviceScale; + int imW = currImage->imgBuffer.getWidth(); + int imH = currImage->imgBuffer.getHeight(); + + moveCenter(delta_x, delta_y, imW, imH, deviceScale); + button_pos.set(event_x, event_y); + + if (!dirty) { + dirty = true; + queue_draw(); + } + + return true; +} + +bool Inspector::on_scroll_event(GdkEventScroll *event) +{ + if (!currImage || !window) + return false; + + pinned = true; + + bool alt = event->state & GDK_MOD1_MASK; + int deviceScale = get_scale_factor(); + int imW = currImage->imgBuffer.getWidth(); + int imH = currImage->imgBuffer.getHeight(); + +#ifdef GDK_WINDOWING_QUARTZ + // event reports speed of scroll wheel + double step_x = -event->delta_x; + double step_y = event->delta_y; +#else + // assume fixed step of 5% + double step_x = 5; + double step_y = 5; +#endif + int delta_x = 0; + int delta_y = 0; + switch (event->direction) { + case GDK_SCROLL_SMOOTH: +#ifdef GDK_WINDOWING_QUARTZ + // no additional step for smooth scrolling + delta_x = event->delta_x * deviceScale; + delta_y = event->delta_y * deviceScale; +#else + // apply step to smooth scrolling as well + delta_x = event->delta_x * deviceScale * step_x * imW / 100; + delta_y = event->delta_y * deviceScale * step_y * imH / 100; +#endif + break; + case GDK_SCROLL_DOWN: + delta_y = step_y * deviceScale * imH / 100; + break; + case GDK_SCROLL_UP: + delta_y = -step_y * deviceScale * imH / 100; + break; + case GDK_SCROLL_LEFT: + delta_x = step_x * deviceScale * imW / 100; + break; + case GDK_SCROLL_RIGHT: + delta_x = -step_x * deviceScale * imW / 100; + break; + } + + if ((options.zoomOnScroll && !alt) || (!options.zoomOnScroll && alt)) { + // zoom + beginZoom(event->x, event->y); + if (std::fabs(delta_y) > std::fabs(delta_x)) + on_zoom_scale_changed(1.0 - (double)delta_y / imH / deviceScale); + else + on_zoom_scale_changed(1.0 - (double)delta_x / imW / deviceScale); + return true; + } + + // scroll + moveCenter(delta_x, delta_y, imW, imH, deviceScale); + + if (!dirty) { + dirty = true; + queue_draw(); + } + + return true; +} + +void Inspector::moveCenter(int delta_x, int delta_y, int imW, int imH, int deviceScale) +{ + rtengine::Coord margin; // limit to image size + margin.x = rtengine::min(window->get_width() * deviceScale / scale, imW) / 2; + margin.y = rtengine::min(window->get_height() * deviceScale / scale, imH) / 2; + center.set(rtengine::LIM(center.x + delta_x / scale, margin.x, imW - margin.x), + rtengine::LIM(center.y + delta_y / scale, margin.y, imH - margin.y)); +} + +void Inspector::beginZoom(double x, double y) +{ + if (!currImage || !window) + return; + + int deviceScale = get_scale_factor(); + int imW = currImage->imgBuffer.getWidth(); + int imH = currImage->imgBuffer.getHeight(); + + // limit center to image size + moveCenter(0, 0, imW, imH, deviceScale); + + // store center and current position for zooming + double cur_scale = zoomScale; + if (scaled) { + Glib::RefPtr win = get_window(); + double winW = win->get_width() * deviceScale; + double winH = win->get_height() * deviceScale; + int imW = rtengine::max(currImage->imgBuffer.getWidth(), 1); + int imH = rtengine::max(currImage->imgBuffer.getHeight(), 1); + cur_scale *= rtengine::min(winW / imW, winH / imH); + } + dcenterBegin.x = (x - window->get_width() / 2.) / cur_scale * deviceScale; + dcenterBegin.y = (y - window->get_height() / 2.) / cur_scale * deviceScale; + centerBegin = center; + zoomScaleBegin = zoomScale; + +} + +void Inspector::on_zoom_begin(GdkEventSequence *s) +{ + double x, y; + pinned = true; + if (gestureZoom->get_point(s, x, y)) + beginZoom(x, y); +} + +void Inspector::on_zoom_scale_changed(double zscale) +{ + if (!currImage || !window) + return; + + zoomScale = rtengine::LIM(zoomScaleBegin * zscale, 0.01, 16.0); + double dcenterRatio = 1.0 - zoomScaleBegin / zoomScale; + center.x = centerBegin.x + dcenterBegin.x * dcenterRatio; + center.y = centerBegin.y + dcenterBegin.y * dcenterRatio; + + if (!dirty) { + dirty = true; + queue_draw(); + } } bool Inspector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) { + dirty = false; Glib::RefPtr win = get_window(); @@ -113,45 +426,62 @@ bool Inspector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) // this will eventually create/update the off-screen pixmap // compute the displayed area - rtengine::Coord availableSize; - rtengine::Coord topLeft; - rtengine::Coord dest(0, 0); - availableSize.x = win->get_width(); - availableSize.y = win->get_height(); - int imW = currImage->imgBuffer.getWidth(); - int imH = currImage->imgBuffer.getHeight(); + rtengine::Coord2D availableSize; + rtengine::Coord2D topLeft; + rtengine::Coord topLeftInt; + rtengine::Coord2D dest(0, 0); + int deviceScale = window? get_scale_factor(): 1; + availableSize.x = win->get_width() * deviceScale; + availableSize.y = win->get_height() * deviceScale; + int imW = rtengine::max(currImage->imgBuffer.getWidth(), 1); + int imH = rtengine::max(currImage->imgBuffer.getHeight(), 1); + scale = rtengine::min(1., rtengine::min(availableSize.x / imW, availableSize.y / imH)); + if (scaled) { + // reduce size of image to fit into window, no further zoom down + zoomScale = rtengine::max(zoomScale, 1.0); + scale *= zoomScale; + } + else { + // limit zoom to fill at least complete window or 1:1 + zoomScale = rtengine::max(zoomScale, rtengine::min(1.0, scale)); + scale = zoomScale; + } + availableSize.x /= scale; + availableSize.y /= scale; if (imW < availableSize.x) { // center the image in the available space along X topLeft.x = 0; - dest.x = (availableSize.x - imW) / 2; + dest.x = (availableSize.x - imW) / 2.; } else { // partial image display // double clamp - topLeft.x = center.x + availableSize.x / 2; - topLeft.x = rtengine::min(topLeft.x, imW); + topLeft.x = center.x + availableSize.x / 2.; + topLeft.x = rtengine::min(topLeft.x, imW); topLeft.x -= availableSize.x; - topLeft.x = rtengine::max(topLeft.x, 0); + topLeft.x = rtengine::max(topLeft.x, 0); } if (imH < availableSize.y) { // center the image in the available space along Y topLeft.y = 0; - dest.y = (availableSize.y - imH) / 2; + dest.y = (availableSize.y - imH) / 2.; } else { // partial image display // double clamp - topLeft.y = center.y + availableSize.y / 2; - topLeft.y = rtengine::min(topLeft.y, imH); + topLeft.y = center.y + availableSize.y / 2.; + topLeft.y = rtengine::min(topLeft.y, imH); topLeft.y -= availableSize.y; - topLeft.y = rtengine::max(topLeft.y, 0); + topLeft.y = rtengine::max(topLeft.y, 0); } - //printf("center: %d, %d (img: %d, %d) (availableSize: %d, %d) (topLeft: %d, %d)\n", center.x, center.y, imW, imH, availableSize.x, availableSize.y, topLeft.x, topLeft.y); + topLeftInt.x = floor(topLeft.x); + topLeftInt.y = floor(topLeft.y); + // define the destination area - currImage->imgBuffer.setDrawRectangle(win, dest.x, dest.y, rtengine::min(availableSize.x - dest.x, imW), rtengine::min(availableSize.y - dest.y, imH), false); - currImage->imgBuffer.setSrcOffset(topLeft.x, topLeft.y); + currImage->imgBuffer.setDrawRectangle(win, dest.x, dest.y, rtengine::min(ceil(availableSize.x + (topLeft.x - topLeftInt.x) - 2 * dest.x), imW), rtengine::min(ceil(availableSize.y + (topLeft.y - topLeftInt.y) - 2 * dest.y), imH), false); + currImage->imgBuffer.setSrcOffset(topLeftInt.x, topLeftInt.y); if (!currImage->imgBuffer.surfaceCreated()) { return false; @@ -162,25 +492,51 @@ bool Inspector::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) Gdk::RGBA c; Glib::RefPtr style = get_style_context(); - // draw the background - style->render_background(cr, 0, 0, get_width(), get_height()); + if (!window) { + // draw the background + style->render_background(cr, 0, 0, get_width(), get_height()); + } - /* --- old method - c = style->get_background_color (Gtk::STATE_FLAG_NORMAL); - cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->set_line_width (0); - cr->rectangle (0, 0, availableSize.x, availableSize.y); - cr->fill (); - */ + bool scaledImage = scale != 1.0; + if (!window || (deviceScale == 1 && !scaledImage)) { + // standard drawing + currImage->imgBuffer.copySurface(win); + } + else { + // consider device scale and image scale + if (deviceScale > 1) { +#ifdef __APPLE__ + // use full device resolution and let it scale the image (macOS) + cairo_surface_set_device_scale(cr->get_target()->cobj(), scale, scale); + scaledImage = false; +#else + cr->scale(1. / deviceScale, 1. / deviceScale); +#endif + } + int viewW = rtengine::min(imW, ceil(availableSize.x + (topLeft.x - topLeftInt.x))); + int viewH = rtengine::min(imH, ceil(availableSize.y + (topLeft.y - topLeftInt.y))); + Glib::RefPtr crop = Gdk::Pixbuf::create(currImage->imgBuffer.getSurface(), topLeftInt.x, topLeftInt.y, viewW, viewH); + if (!scaledImage) { + Gdk::Cairo::set_source_pixbuf(cr, crop, dest.x, dest.y); + } + else { + double dx = scale * (dest.x + topLeftInt.x - topLeft.x); + double dy = scale * (dest.y + topLeftInt.y - topLeft.y); + // scale crop as the device does not seem to support it (Linux) + crop = crop->scale_simple(round(viewW*scale), round(viewH*scale), Gdk::INTERP_BILINEAR); + Gdk::Cairo::set_source_pixbuf(cr, crop, dx, dy); + } + cr->paint(); + } - currImage->imgBuffer.copySurface(win); - - // draw the frame - c = style->get_border_color (Gtk::STATE_FLAG_NORMAL); - cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->set_line_width (1); - cr->rectangle (0.5, 0.5, availableSize.x - 1, availableSize.y - 1); - cr->stroke (); + if (!window) { + // draw the frame + c = style->get_border_color (Gtk::STATE_FLAG_NORMAL); + cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); + cr->set_line_width (1); + cr->rectangle (0.5, 0.5, availableSize.x - 1, availableSize.y - 1); + cr->stroke (); + } } return true; @@ -192,8 +548,14 @@ void Inspector::mouseMove (rtengine::Coord2D pos, int transform) return; } + next_image_pos = pos; + + // skip actual update of content when not visible + if (window && !window->get_visible()) + return; + if (currImage) { - center.set(int(rtengine::LIM01(pos.x)*double(currImage->imgBuffer.getWidth())), int(rtengine::LIM01(pos.y)*double(currImage->imgBuffer.getHeight()))); + center.set(rtengine::LIM01(pos.x)*double(currImage->imgBuffer.getWidth()), rtengine::LIM01(pos.y)*double(currImage->imgBuffer.getHeight())); } else { center.set(0, 0); } @@ -212,6 +574,11 @@ void Inspector::switchImage (const Glib::ustring &fullPath) } next_image_path = fullPath; + + // skip actual update of content when not visible + if (window && !window->get_visible()) + return; + if (!options.inspectorDelay) { doSwitchImage(); } else { @@ -309,7 +676,8 @@ void Inspector::setActive(bool state) flushBuffers(); } - active = state; + if (!window) + active = state; } diff --git a/rtgui/inspector.h b/rtgui/inspector.h index 8338259bf..5577bfb45 100644 --- a/rtgui/inspector.h +++ b/rtgui/inspector.h @@ -22,7 +22,6 @@ #include "guiutils.h" -#include "../rtengine/coord.h" #include "../rtengine/coord2d.h" class InspectorBuffer @@ -40,18 +39,47 @@ public: //~InspectorBuffer(); }; -class Inspector : public Gtk::DrawingArea +class Inspector final : public Gtk::DrawingArea { private: - rtengine::Coord center; + rtengine::Coord2D center; std::vector images; InspectorBuffer* currImage; - double zoom; + bool scaled; // fit image into window + double scale; // current scale + double zoomScale, zoomScaleBegin; // scale during zoom + rtengine::Coord2D centerBegin, dcenterBegin; // center during zoom bool active; + bool pinned; + bool dirty; + bool initialized; + bool fullscreen; // window is shown in fullscreen mode + bool keyDown; + bool windowShowing; sigc::connection delayconn; Glib::ustring next_image_path; + rtengine::Coord2D next_image_pos; + + Gtk::Window *window; + bool on_key_release(GdkEventKey *event); + bool on_key_press(GdkEventKey *event); + + void on_window_hide(); + bool on_inspector_window_state_event(GdkEventWindowState *event); + + rtengine::Coord button_pos; + bool on_button_press_event(GdkEventButton *event) override; + bool on_motion_notify_event(GdkEventMotion *event) override; + + bool on_scroll_event(GdkEventScroll *event) override; + void moveCenter(int delta_x, int delta_y, int imW, int imH, int deviceScale); + + Glib::RefPtr gestureZoom; + void beginZoom(double x, double y); + void on_zoom_begin(GdkEventSequence *); + void on_zoom_scale_changed(double zscale); bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; void deleteBuffers(); @@ -62,6 +90,17 @@ public: Inspector(); ~Inspector() override; + /** @brief Show or hide window + * @param pinned pin window + * @param scaled fit image into window + */ + void showWindow(bool pinned, bool scaled = true); + + /** + * Hide the window. + */ + void hideWindow(); + /** @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 * @param transform H/V flip and coarse rotation transformation diff --git a/rtgui/iptcpanel.cc b/rtgui/iptcpanel.cc index 25cd20560..1134b36da 100644 --- a/rtgui/iptcpanel.cc +++ b/rtgui/iptcpanel.cc @@ -31,6 +31,7 @@ IPTCPanel::IPTCPanel () : embeddedData(new rtengine::procparams::IPTCPairs) { + set_orientation(Gtk::ORIENTATION_VERTICAL); set_spacing (4); Gtk::Grid* iptc = Gtk::manage( new Gtk::Grid () ); @@ -90,7 +91,7 @@ IPTCPanel::IPTCPanel () : // -------------------------- - Gtk::HSeparator* hsep1 = Gtk::manage( new Gtk::HSeparator () ); + Gtk::Separator* hsep1 = Gtk::manage( new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL) ); setExpandAlignProperties(hsep1, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); iptc->attach (*hsep1, 0, row++, 2, 1); @@ -134,7 +135,7 @@ IPTCPanel::IPTCPanel () : iptc->attach (*scrolledWindowkw, 0, row++, 2, 1); // -------------------------- - Gtk::HSeparator* hsep2 = Gtk::manage( new Gtk::HSeparator () ); + Gtk::Separator* hsep2 = Gtk::manage( new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL) ); setExpandAlignProperties(hsep2, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); iptc->attach (*hsep2, 0, row++, 2, 1); // -------------------------- @@ -187,7 +188,7 @@ IPTCPanel::IPTCPanel () : iptc->attach (*scrolledWindowsc, 0, row++, 2, 1); // -------------------------- - Gtk::HSeparator* hsep3 = Gtk::manage( new Gtk::HSeparator () ); + Gtk::Separator* hsep3 = Gtk::manage( new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL) ); setExpandAlignProperties(hsep3, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); iptc->attach (*hsep3, 0, row++, 2, 1); // -------------------------- @@ -247,7 +248,7 @@ IPTCPanel::IPTCPanel () : // -------------------------- - Gtk::HSeparator* hsep4 = Gtk::manage( new Gtk::HSeparator () ); + Gtk::Separator* hsep4 = Gtk::manage( new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL) ); setExpandAlignProperties(hsep4, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); iptc->attach (*hsep4, 0, row++, 2, 1); diff --git a/rtgui/iptcpanel.h b/rtgui/iptcpanel.h index 15d117f87..da52fa7d2 100644 --- a/rtgui/iptcpanel.h +++ b/rtgui/iptcpanel.h @@ -25,8 +25,8 @@ #include "guiutils.h" #include "toolpanel.h" -class IPTCPanel : - public Gtk::VBox, +class IPTCPanel final : + public Gtk::Box, public ToolPanel { diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index 491b02c4c..e29733cac 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -19,6 +19,7 @@ #include #include "labcurve.h" +#include "eventmapper.h" #include "curveeditor.h" #include "curveeditorgroup.h" @@ -32,61 +33,82 @@ using namespace rtengine; using namespace rtengine::procparams; -LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), false, true) +const Glib::ustring LCurve::TOOL_NAME = "labcurves"; + +LCurve::LCurve() : FoldableToolPanel(this, TOOL_NAME, M("TP_LABCURVE_LABEL"), false, true) { - brightness = Gtk::manage (new Adjuster (M("TP_LABCURVE_BRIGHTNESS"), -100., 100., 1., 0.)); - contrast = Gtk::manage (new Adjuster (M("TP_LABCURVE_CONTRAST"), -100., 100., 1., 0.)); - chromaticity = Gtk::manage (new Adjuster (M("TP_LABCURVE_CHROMATICITY"), -100., 100., 1., 0.)); + auto m = ProcEventMapper::getInstance(); + Evgamutmunsell = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_GAMUTMUNSEL"); + CurveListener::setMulti(true); + brightness = Gtk::manage(new Adjuster(M("TP_LABCURVE_BRIGHTNESS"), -100., 100., 1., 0.)); + contrast = Gtk::manage(new Adjuster(M("TP_LABCURVE_CONTRAST"), -100., 100., 1., 0.)); + chromaticity = Gtk::manage(new Adjuster(M("TP_LABCURVE_CHROMATICITY"), -100., 100., 1., 0.)); chromaticity->set_tooltip_markup(M("TP_LABCURVE_CHROMA_TOOLTIP")); - pack_start (*brightness); - brightness->show (); + pack_start(*brightness); + brightness->show(); - pack_start (*contrast); - contrast->show (); + pack_start(*contrast); + contrast->show(); - pack_start (*chromaticity); - chromaticity->show (); + pack_start(*chromaticity); + chromaticity->show(); - brightness->setAdjusterListener (this); - contrast->setAdjusterListener (this); - chromaticity->setAdjusterListener (this); + brightness->setAdjusterListener(this); + 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 (); - pack_start (*hsep2, Gtk::PACK_EXPAND_WIDGET, 4); + Gtk::Separator* hsep2 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + hsep2->show(); + pack_start(*hsep2, Gtk::PACK_EXPAND_WIDGET, 4); - avoidcolorshift = Gtk::manage (new Gtk::CheckButton (M("TP_LABCURVE_AVOIDCOLORSHIFT"))); - avoidcolorshift->set_tooltip_text (M("TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP")); - pack_start (*avoidcolorshift, Gtk::PACK_SHRINK, 4); - lcredsk = Gtk::manage (new Gtk::CheckButton (M("TP_LABCURVE_LCREDSK"))); - lcredsk->set_tooltip_markup (M("TP_LABCURVE_LCREDSK_TIP")); - pack_start (*lcredsk); - rstprotection = Gtk::manage ( new Adjuster (M("TP_LABCURVE_RSTPROTECTION"), 0., 100., 0.1, 0.) ); - pack_start (*rstprotection); - rstprotection->show (); - rstprotection->setAdjusterListener (this); - rstprotection->set_tooltip_text (M("TP_LABCURVE_RSTPRO_TOOLTIP")); + Gtk::Box* metHBox = Gtk::manage(new Gtk::Box()); + metHBox->set_spacing(2); + Gtk::Label* metLabel = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_AVOID") + ":")); + metHBox->pack_start(*metLabel, Gtk::PACK_SHRINK); - acconn = avoidcolorshift->signal_toggled().connect( sigc::mem_fun(*this, &LCurve::avoidcolorshift_toggled) ); - lcconn = lcredsk->signal_toggled().connect( sigc::mem_fun(*this, &LCurve::lcredsk_toggled) ); + gamutmunselmethod = Gtk::manage(new MyComboBoxText()); + gamutmunselmethod->append(M("TP_LOCALLAB_GAMUTNON")); + gamutmunselmethod->append(M("TP_LOCALLAB_GAMUTLABRELA")); + gamutmunselmethod->append(M("TP_LOCALLAB_GAMUTXYZABSO")); + gamutmunselmethod->append(M("TP_LOCALLAB_GAMUTXYZRELA")); + gamutmunselmethod->append(M("TP_LOCALLAB_GAMUTMUNSELL")); + gamutmunselmethod->set_active(4); + gamutmunselmethod->set_tooltip_text(M("TP_LOCALLAB_AVOIDCOLORSHIFT_TOOLTIP")); + metHBox->pack_start(*gamutmunselmethod); + pack_start(*metHBox); + gamutmunselmethodconn = gamutmunselmethod->signal_changed().connect(sigc::mem_fun(*this, &LCurve::gamutmunselChanged)); + + + lcredsk = Gtk::manage(new Gtk::CheckButton(M("TP_LABCURVE_LCREDSK"))); + lcredsk->set_tooltip_markup(M("TP_LABCURVE_LCREDSK_TOOLTIP")); + pack_start(*lcredsk); + + rstprotection = Gtk::manage(new Adjuster(M("TP_LABCURVE_RSTPROTECTION"), 0., 100., 0.1, 0.)); + pack_start(*rstprotection); + rstprotection->show(); + + rstprotection->setAdjusterListener(this); + rstprotection->set_tooltip_text(M("TP_LABCURVE_RSTPRO_TOOLTIP")); + + lcconn = lcredsk->signal_toggled().connect(sigc::mem_fun(*this, &LCurve::lcredsk_toggled)); //%%%%%%%%%%%%%%%%%%% - Gtk::HSeparator *hsep3 = Gtk::manage (new Gtk::HSeparator()); - hsep3->show (); - pack_start (*hsep3, Gtk::PACK_EXPAND_WIDGET, 4); + Gtk::Separator* hsep3 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + hsep3->show(); + pack_start(*hsep3, Gtk::PACK_EXPAND_WIDGET, 4); - curveEditorG = new CurveEditorGroup (options.lastLabCurvesDir); - curveEditorG->setCurveListener (this); + curveEditorG = new CurveEditorGroup(options.lastLabCurvesDir); + curveEditorG->setCurveListener(this); lshape = static_cast(curveEditorG->addCurve(CT_Diagonal, "L*")); lshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP")); @@ -203,7 +225,7 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), for (int i = 0; i < 7; i++) { float R, G, B; - float x = float(i) * (1.0f / 6.0); + float x = i / 6.0; Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); milestones.emplace_back(x, R, G, B); } @@ -216,88 +238,111 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), // This will add the reset button at the end of the curveType buttons curveEditorG->curveListComplete(); - pack_start (*curveEditorG, Gtk::PACK_SHRINK, 4); - Gtk::HSeparator *hsepdh = Gtk::manage (new Gtk::HSeparator()); - hsepdh->show (); - pack_start (*hsepdh, Gtk::PACK_EXPAND_WIDGET, 4); + pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); + Gtk::Separator* hsepdh = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + hsepdh->show(); + pack_start(*hsepdh, Gtk::PACK_EXPAND_WIDGET, 4); + show_all_children(); } -LCurve::~LCurve () +LCurve::~LCurve() { delete curveEditorG; } -void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) +void LCurve::read(const ProcParams* pp, const ParamsEdited* pedited) { - disableListener (); + disableListener(); + gamutmunselmethodconn.block(true); + + + brightness->setValue(pp->labCurve.brightness); + contrast->setValue(pp->labCurve.contrast); + chromaticity->setValue(pp->labCurve.chromaticity); + adjusterChanged(chromaticity, pp->labCurve.chromaticity); // To update the GUI sensitiveness + //%%%%%%%%%%%%%%%%%%%%%% + rstprotection->setValue(pp->labCurve.rstprotection); + + + bwtconn.block(true); + lcconn.block(true); + lcredsk->set_active(pp->labCurve.lcredsk); + + bwtconn.block(false); + lcconn.block(false); + + lastLCVal = pp->labCurve.lcredsk; + //%%%%%%%%%%%%%%%%%%%%%% + + lshape->setCurve(pp->labCurve.lcurve); + ashape->setCurve(pp->labCurve.acurve); + bshape->setCurve(pp->labCurve.bcurve); + ccshape->setCurve(pp->labCurve.cccurve); + chshape->setCurve(pp->labCurve.chcurve); + lhshape->setCurve(pp->labCurve.lhcurve); + hhshape->setCurve(pp->labCurve.hhcurve); + lcshape->setCurve(pp->labCurve.lccurve); + clshape->setCurve(pp->labCurve.clcurve); + + if (pedited && !pedited->labCurve.gamutmunselmethod) { + gamutmunselmethod->set_active(4); // "Unchanged" + } else if (pp->labCurve.gamutmunselmethod == "NONE") { + gamutmunselmethod->set_active(0); + } else if (pp->labCurve.gamutmunselmethod == "LAB") { + gamutmunselmethod->set_active(1); + } else if (pp->labCurve.gamutmunselmethod == "XYZ") { + gamutmunselmethod->set_active(2); + } else if (pp->labCurve.gamutmunselmethod == "XYZREL") { + gamutmunselmethod->set_active(3); + } else if (pp->labCurve.gamutmunselmethod == "MUN") { + gamutmunselmethod->set_active(4); + } + + gamutmunselChanged(); if (pedited) { - brightness->setEditedState (pedited->labCurve.brightness ? Edited : UnEdited); - contrast->setEditedState (pedited->labCurve.contrast ? Edited : UnEdited); - chromaticity->setEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited); + brightness->setEditedState(pedited->labCurve.brightness ? Edited : UnEdited); + contrast->setEditedState(pedited->labCurve.contrast ? Edited : UnEdited); + chromaticity->setEditedState(pedited->labCurve.chromaticity ? Edited : UnEdited); //%%%%%%%%%%%%%%%%%%%%%% - rstprotection->setEditedState (pedited->labCurve.rstprotection ? Edited : UnEdited); - avoidcolorshift->set_inconsistent (!pedited->labCurve.avoidcolorshift); - lcredsk->set_inconsistent (!pedited->labCurve.lcredsk); + rstprotection->setEditedState(pedited->labCurve.rstprotection ? Edited : UnEdited); + lcredsk->set_inconsistent(!pedited->labCurve.lcredsk); //%%%%%%%%%%%%%%%%%%%%%% - lshape->setUnChanged (!pedited->labCurve.lcurve); - ashape->setUnChanged (!pedited->labCurve.acurve); - bshape->setUnChanged (!pedited->labCurve.bcurve); - ccshape->setUnChanged (!pedited->labCurve.cccurve); - chshape->setUnChanged (!pedited->labCurve.chcurve); - lhshape->setUnChanged (!pedited->labCurve.lhcurve); - hhshape->setUnChanged (!pedited->labCurve.hhcurve); - lcshape->setUnChanged (!pedited->labCurve.lccurve); - clshape->setUnChanged (!pedited->labCurve.clcurve); + lshape->setUnChanged(!pedited->labCurve.lcurve); + ashape->setUnChanged(!pedited->labCurve.acurve); + bshape->setUnChanged(!pedited->labCurve.bcurve); + ccshape->setUnChanged(!pedited->labCurve.cccurve); + chshape->setUnChanged(!pedited->labCurve.chcurve); + lhshape->setUnChanged(!pedited->labCurve.lhcurve); + hhshape->setUnChanged(!pedited->labCurve.hhcurve); + lcshape->setUnChanged(!pedited->labCurve.lccurve); + clshape->setUnChanged(!pedited->labCurve.clcurve); + + if (!pedited->labCurve.gamutmunselmethod) { + gamutmunselmethod->set_active_text(M("GENERAL_UNCHANGED")); + } set_inconsistent(multiImage && !pedited->labCurve.enabled); } - brightness->setValue (pp->labCurve.brightness); - contrast->setValue (pp->labCurve.contrast); - chromaticity->setValue (pp->labCurve.chromaticity); - adjusterChanged(chromaticity, pp->labCurve.chromaticity); // To update the GUI sensitiveness - //%%%%%%%%%%%%%%%%%%%%%% - rstprotection->setValue (pp->labCurve.rstprotection); + gamutmunselmethodconn.block(false); - bwtconn.block (true); - acconn.block (true); - lcconn.block (true); - avoidcolorshift->set_active (pp->labCurve.avoidcolorshift); - lcredsk->set_active (pp->labCurve.lcredsk); - - bwtconn.block (false); - acconn.block (false); - lcconn.block (false); - - lastACVal = pp->labCurve.avoidcolorshift; - lastLCVal = pp->labCurve.lcredsk; - //%%%%%%%%%%%%%%%%%%%%%% - - lshape->setCurve (pp->labCurve.lcurve); - ashape->setCurve (pp->labCurve.acurve); - bshape->setCurve (pp->labCurve.bcurve); - ccshape->setCurve (pp->labCurve.cccurve); - chshape->setCurve (pp->labCurve.chcurve); - lhshape->setCurve (pp->labCurve.lhcurve); - hhshape->setCurve (pp->labCurve.hhcurve); - lcshape->setCurve (pp->labCurve.lccurve); - clshape->setCurve (pp->labCurve.clcurve); setEnabled(pp->labCurve.enabled); - + queue_draw(); - enableListener (); + enableListener(); } -void LCurve::autoOpenCurve () + +void LCurve::autoOpenCurve() { // Open up the first curve if selected bool active = lshape->openIfNonlinear(); @@ -336,7 +381,7 @@ void LCurve::autoOpenCurve () } -void LCurve::setEditProvider (EditDataProvider *provider) +void LCurve::setEditProvider(EditDataProvider *provider) { lshape->setEditProvider(provider); ccshape->setEditProvider(provider); @@ -351,127 +396,128 @@ void LCurve::setEditProvider (EditDataProvider *provider) } -void LCurve::write (ProcParams* pp, ParamsEdited* pedited) +void LCurve::write(ProcParams* pp, ParamsEdited* pedited) { pp->labCurve.enabled = getEnabled(); - - pp->labCurve.brightness = brightness->getValue (); - pp->labCurve.contrast = (int)contrast->getValue (); - pp->labCurve.chromaticity = (int)chromaticity->getValue (); - //%%%%%%%%%%%%%%%%%%%%%% - pp->labCurve.avoidcolorshift = avoidcolorshift->get_active (); - pp->labCurve.lcredsk = lcredsk->get_active (); - pp->labCurve.rstprotection = rstprotection->getValue (); + pp->labCurve.brightness = brightness->getValue(); + pp->labCurve.contrast = (int)contrast->getValue(); + pp->labCurve.chromaticity = (int)chromaticity->getValue(); + //%%%%%%%%%%%%%%%%%%%%%% + pp->labCurve.lcredsk = lcredsk->get_active(); + + pp->labCurve.rstprotection = rstprotection->getValue(); //%%%%%%%%%%%%%%%%%%%%%% - pp->labCurve.lcurve = lshape->getCurve (); - pp->labCurve.acurve = ashape->getCurve (); - pp->labCurve.bcurve = bshape->getCurve (); - pp->labCurve.cccurve = ccshape->getCurve (); - pp->labCurve.chcurve = chshape->getCurve (); - pp->labCurve.lhcurve = lhshape->getCurve (); - pp->labCurve.hhcurve = hhshape->getCurve (); - pp->labCurve.lccurve = lcshape->getCurve (); - pp->labCurve.clcurve = clshape->getCurve (); + pp->labCurve.lcurve = lshape->getCurve(); + pp->labCurve.acurve = ashape->getCurve(); + pp->labCurve.bcurve = bshape->getCurve(); + pp->labCurve.cccurve = ccshape->getCurve(); + pp->labCurve.chcurve = chshape->getCurve(); + pp->labCurve.lhcurve = lhshape->getCurve(); + pp->labCurve.hhcurve = hhshape->getCurve(); + pp->labCurve.lccurve = lcshape->getCurve(); + pp->labCurve.clcurve = clshape->getCurve(); + + if (pedited) { - pedited->labCurve.brightness = brightness->getEditedState (); - pedited->labCurve.contrast = contrast->getEditedState (); - pedited->labCurve.chromaticity = chromaticity->getEditedState (); + pedited->labCurve.brightness = brightness->getEditedState(); + pedited->labCurve.contrast = contrast->getEditedState(); + pedited->labCurve.chromaticity = chromaticity->getEditedState(); //%%%%%%%%%%%%%%%%%%%%%% - pedited->labCurve.avoidcolorshift = !avoidcolorshift->get_inconsistent(); pedited->labCurve.lcredsk = !lcredsk->get_inconsistent(); - pedited->labCurve.rstprotection = rstprotection->getEditedState (); + pedited->labCurve.rstprotection = rstprotection->getEditedState(); + pedited->labCurve.gamutmunselmethod = gamutmunselmethod->get_active_text() != M("GENERAL_UNCHANGED"); - pedited->labCurve.lcurve = !lshape->isUnChanged (); - pedited->labCurve.acurve = !ashape->isUnChanged (); - pedited->labCurve.bcurve = !bshape->isUnChanged (); - pedited->labCurve.cccurve = !ccshape->isUnChanged (); - pedited->labCurve.chcurve = !chshape->isUnChanged (); - pedited->labCurve.lhcurve = !lhshape->isUnChanged (); - pedited->labCurve.hhcurve = !hhshape->isUnChanged (); - pedited->labCurve.lccurve = !lcshape->isUnChanged (); - pedited->labCurve.clcurve = !clshape->isUnChanged (); + pedited->labCurve.lcurve = !lshape->isUnChanged(); + pedited->labCurve.acurve = !ashape->isUnChanged(); + pedited->labCurve.bcurve = !bshape->isUnChanged(); + pedited->labCurve.cccurve = !ccshape->isUnChanged(); + pedited->labCurve.chcurve = !chshape->isUnChanged(); + pedited->labCurve.lhcurve = !lhshape->isUnChanged(); + pedited->labCurve.hhcurve = !hhshape->isUnChanged(); + pedited->labCurve.lccurve = !lcshape->isUnChanged(); + pedited->labCurve.clcurve = !clshape->isUnChanged(); pedited->labCurve.enabled = !get_inconsistent(); + } + if (gamutmunselmethod->get_active_row_number() == 0) { + pp->labCurve.gamutmunselmethod = "NONE"; + } else if (gamutmunselmethod->get_active_row_number() == 1) { + pp->labCurve.gamutmunselmethod = "LAB"; + } else if (gamutmunselmethod->get_active_row_number() == 2) { + pp->labCurve.gamutmunselmethod = "XYZ"; + } else if (gamutmunselmethod->get_active_row_number() == 3) { + pp->labCurve.gamutmunselmethod = "XYZREL"; + } else if (gamutmunselmethod->get_active_row_number() == 4) { + pp->labCurve.gamutmunselmethod = "MUN"; + } + + + } -void LCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +void LCurve::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { - brightness->setDefault (defParams->labCurve.brightness); - contrast->setDefault (defParams->labCurve.contrast); - chromaticity->setDefault (defParams->labCurve.chromaticity); - rstprotection->setDefault (defParams->labCurve.rstprotection); + brightness->setDefault(defParams->labCurve.brightness); + contrast->setDefault(defParams->labCurve.contrast); + chromaticity->setDefault(defParams->labCurve.chromaticity); + rstprotection->setDefault(defParams->labCurve.rstprotection); if (pedited) { - brightness->setDefaultEditedState (pedited->labCurve.brightness ? Edited : UnEdited); - contrast->setDefaultEditedState (pedited->labCurve.contrast ? Edited : UnEdited); - chromaticity->setDefaultEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited); - rstprotection->setDefaultEditedState (pedited->labCurve.rstprotection ? Edited : UnEdited); + brightness->setDefaultEditedState(pedited->labCurve.brightness ? Edited : UnEdited); + contrast->setDefaultEditedState(pedited->labCurve.contrast ? Edited : UnEdited); + chromaticity->setDefaultEditedState(pedited->labCurve.chromaticity ? Edited : UnEdited); + rstprotection->setDefaultEditedState(pedited->labCurve.rstprotection ? Edited : UnEdited); } else { - brightness->setDefaultEditedState (Irrelevant); - contrast->setDefaultEditedState (Irrelevant); - chromaticity->setDefaultEditedState (Irrelevant); - rstprotection->setDefaultEditedState (Irrelevant); + brightness->setDefaultEditedState(Irrelevant); + contrast->setDefaultEditedState(Irrelevant); + chromaticity->setDefaultEditedState(Irrelevant); + rstprotection->setDefaultEditedState(Irrelevant); } } //%%%%%%%%%%%%%%%%%%%%%% -//Color shift control changed -void LCurve::avoidcolorshift_toggled () + +void LCurve::gamutmunselChanged() { - if (batchMode) { - if (avoidcolorshift->get_inconsistent()) { - avoidcolorshift->set_inconsistent (false); - acconn.block (true); - avoidcolorshift->set_active (false); - acconn.block (false); - } else if (lastACVal) { - avoidcolorshift->set_inconsistent (true); - } - - lastACVal = avoidcolorshift->get_active (); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(Evgamutmunsell, gamutmunselmethod->get_active_text()); } - if (listener && getEnabled()) { - if (avoidcolorshift->get_active ()) { - listener->panelChanged (EvLAvoidColorShift, M("GENERAL_ENABLED")); - } else { - listener->panelChanged (EvLAvoidColorShift, M("GENERAL_DISABLED")); - } - } } -void LCurve::lcredsk_toggled () + +void LCurve::lcredsk_toggled() { if (batchMode) { if (lcredsk->get_inconsistent()) { - lcredsk->set_inconsistent (false); - lcconn.block (true); - lcredsk->set_active (false); - lcconn.block (false); + lcredsk->set_inconsistent(false); + lcconn.block(true); + lcredsk->set_active(false); + lcconn.block(false); } else if (lastLCVal) { - lcredsk->set_inconsistent (true); + lcredsk->set_inconsistent(true); } - lastLCVal = lcredsk->get_active (); + lastLCVal = lcredsk->get_active(); } else { lcshape->refresh(); } if (listener && getEnabled()) { - if (lcredsk->get_active ()) { - listener->panelChanged (EvLLCredsk, M("GENERAL_ENABLED")); + if (lcredsk->get_active()) { + listener->panelChanged(EvLLCredsk, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvLLCredsk, M("GENERAL_DISABLED")); + listener->panelChanged(EvLLCredsk, M("GENERAL_DISABLED")); } } } @@ -484,44 +530,44 @@ void LCurve::lcredsk_toggled () * If more than one curve has been added, the curve listener is automatically * set to 'multi=true', and send a pointer of the modified curve in a parameter */ -void LCurve::curveChanged (CurveEditor* ce) +void LCurve::curveChanged(CurveEditor* ce) { if (listener && getEnabled()) { if (ce == lshape) { - listener->panelChanged (EvLLCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLLCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == ashape) { - listener->panelChanged (EvLaCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLaCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == bshape) { - listener->panelChanged (EvLbCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLbCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == ccshape) { - listener->panelChanged (EvLCCCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLCCCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == chshape) { - listener->panelChanged (EvLCHCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLCHCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == lhshape) { - listener->panelChanged (EvLLHCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLLHCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == hhshape) { - listener->panelChanged (EvLHHCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLHHCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == lcshape) { - listener->panelChanged (EvLLCCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLLCCurve, M("HISTORY_CUSTOMCURVE")); } if (ce == clshape) { - listener->panelChanged (EvLCLCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvLCLCurve, M("HISTORY_CUSTOMCURVE")); } @@ -533,45 +579,43 @@ void LCurve::adjusterChanged(Adjuster* a, double newval) Glib::ustring costr; if (a == brightness) { - costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); + costr = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), a->getValue()); } else if (a == rstprotection) { - costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(1), a->getValue()); + costr = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(1), a->getValue()); } else { - costr = Glib::ustring::format ((int)a->getValue()); + costr = Glib::ustring::format((int)a->getValue()); } if (a == brightness) { if (listener && getEnabled()) { - listener->panelChanged (EvLBrightness, costr); + listener->panelChanged(EvLBrightness, costr); } } else if (a == contrast) { if (listener && getEnabled()) { - listener->panelChanged (EvLContrast, costr); + listener->panelChanged(EvLContrast, costr); } } else if (a == rstprotection) { if (listener && getEnabled()) { - listener->panelChanged (EvLRSTProtection, costr); + listener->panelChanged(EvLRSTProtection, costr); } } else if (a == chromaticity) { if (multiImage) { //if chromaticity==-100 (lowest value), we enter the B&W mode and avoid color shift and rstprotection has no effect - rstprotection->set_sensitive( true ); - avoidcolorshift->set_sensitive( true ); - lcredsk->set_sensitive( true ); + rstprotection->set_sensitive(true); + lcredsk->set_sensitive(true); } else { //if chromaticity==-100 (lowest value), we enter the B&W mode and avoid color shift and rstprotection has no effect - rstprotection->set_sensitive( int(newval) > -100 ); //no reason for grey rstprotection - avoidcolorshift->set_sensitive( int(newval) > -100 ); - lcredsk->set_sensitive( int(newval) > -100 ); + rstprotection->set_sensitive(int(newval) > -100); //no reason for grey rstprotection + lcredsk->set_sensitive(int(newval) > -100); } if (listener && getEnabled()) { - listener->panelChanged (EvLSaturation, costr); + listener->panelChanged(EvLSaturation, costr); } } } -void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) +void LCurve::colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) { float R = 0.f, G = 0.f, B = 0.f; @@ -586,47 +630,54 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY * 0.8), float(valX), value, R, G, B); } else if (callerId == 6) { // cc - left bar float value = (1.f - 0.7f) * float(valX) + 0.7f; float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; + if (hue > 1.0f) { hue -= 1.0f; } + // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else if (callerId == 3) { // lc - bottom bar float value = (1.f - 0.7f) * float(valX) + 0.7f; + if (lcredsk->get_active()) { // skin range // -0.1 rad < Hue < 1.6 rad // Y axis / from 0.92 up to 0.14056 float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; + if (hue > 1.0f) { hue -= 1.0f; } + // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else { // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY * 0.8), float(valX), value, R, G, B); } } else if (callerId == 4) { // LH - bottom bar Color::hsv2rgb01(float(valX), 0.5f, float(valY), R, G, B); } else if (callerId == 5) { // HH - bottom bar float h = float((valY - 0.5) * 0.3 + valX); + if (h > 1.0f) { h -= 1.0f; } else if (h < 0.0f) { h += 1.0f; } + Color::hsv2rgb01(h, 0.5f, 0.5f, R, G, B); } else if (callerId == 7) { // cc and cl - left bar float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY*0.8), 1.f - float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY * 0.8), 1.f - float(valX), value, R, G, B); } caller->ccRed = double(R); @@ -634,17 +685,19 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType caller->ccBlue = double(B); } -void LCurve::setBatchMode (bool batchMode) +void LCurve::setBatchMode(bool batchMode) { - ToolPanel::setBatchMode (batchMode); - brightness->showEditedCB (); - contrast->showEditedCB (); - chromaticity->showEditedCB (); - rstprotection->showEditedCB (); - curveEditorG->setBatchMode (batchMode); + ToolPanel::setBatchMode(batchMode); + brightness->showEditedCB(); + contrast->showEditedCB(); + chromaticity->showEditedCB(); + rstprotection->showEditedCB(); + curveEditorG->setBatchMode(batchMode); lcshape->setBottomBarColorProvider(nullptr, -1); lcshape->setLeftBarColorProvider(nullptr, -1); + gamutmunselmethod->append(M("GENERAL_UNCHANGED")); + } @@ -661,11 +714,13 @@ void LCurve::updateCurveBackgroundHistogram( const LUTu& histLRETI ) { - lshape->updateBackgroundHistogram (histLCurve); - ccshape->updateBackgroundHistogram (histCCurve); + lshape->updateBackgroundHistogram(histLCurve); + ccshape->updateBackgroundHistogram(histCCurve); + lcshape->updateBackgroundHistogram(histCCurve); + clshape->updateBackgroundHistogram(histLCurve); } -void LCurve::setAdjusterBehavior (bool bradd, bool contradd, bool satadd) +void LCurve::setAdjusterBehavior(bool bradd, bool contradd, bool satadd) { brightness->setAddMode(bradd); @@ -673,7 +728,7 @@ void LCurve::setAdjusterBehavior (bool bradd, bool contradd, bool satadd) chromaticity->setAddMode(satadd); } -void LCurve::trimValues (rtengine::procparams::ProcParams* pp) +void LCurve::trimValues(rtengine::procparams::ProcParams* pp) { brightness->trimValue(pp->labCurve.brightness); @@ -685,11 +740,11 @@ void LCurve::enabledChanged() { if (listener) { if (get_inconsistent()) { - listener->panelChanged (EvLEnabled, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvLEnabled, M("GENERAL_UNCHANGED")); } else if (getEnabled()) { - listener->panelChanged (EvLEnabled, M("GENERAL_ENABLED")); + listener->panelChanged(EvLEnabled, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvLEnabled, M("GENERAL_DISABLED")); + listener->panelChanged(EvLEnabled, M("GENERAL_DISABLED")); } } } diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index e8488a8c6..99e0cf0c4 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -53,22 +53,26 @@ protected: FlatCurveEditor* lhshape; FlatCurveEditor* hhshape; Gtk::Label* labmdh; - Gtk::HBox* dhbox; + Gtk::Box* dhbox; DiagonalCurveEditor* clshape; DiagonalCurveEditor* cdshape; //%%%%%%%%%%%%%%%% - Gtk::CheckButton* avoidcolorshift; Gtk::CheckButton* lcredsk; + MyComboBoxText* gamutmunselmethod; + sigc::connection gamutmunselmethodconn; + rtengine::ProcEvent Evgamutmunsell; + Adjuster* rstprotection; - sigc::connection bwtconn, acconn, lcconn; + sigc::connection bwtconn, lcconn; bool lastACVal, lastLCVal; //%%%%%%%%%%%%%%%% public: + static const Glib::ustring TOOL_NAME; LCurve (); ~LCurve () override; @@ -84,8 +88,8 @@ public: void curveChanged (CurveEditor* ce) override; void adjusterChanged (Adjuster* a, double newval) override; - void avoidcolorshift_toggled (); void lcredsk_toggled(); + void gamutmunselChanged(); void updateCurveBackgroundHistogram( const LUTu& histToneCurve, diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index 516dbb825..bc3b806de 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -4,6 +4,8 @@ * * Copyright (c) 2017 Alberto Griggio * + * Copyright (c) 2021 Jacques Desmis for CIE xy graph + * * 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 @@ -57,22 +59,34 @@ bool LabGridArea::notifyListener() { 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))); + if (! ciexy_enabled){ + listener->panelChanged(evt, Glib::ustring::compose(evtMsg, round(high_a), round(high_b), round(low_a), round(low_b))); + } else { + float high_a1 = 0.55f * (high_a + 1.f) - 0.1f; + float high_b1 = 0.55f * (high_b + 1.f) - 0.1f; + float low_a1 = 0.55f * (low_a + 1.f) - 0.1f; + float low_b1 = 0.55f * (low_b + 1.f) - 0.1f; + float gre_x1 = 0.55f * (gre_x + 1.f) - 0.1f; + float gre_y1 = 0.55f * (gre_y + 1.f) - 0.1f; + listener->panelChanged(evt, Glib::ustring::compose(evtMsg, round(low_a1), round(low_b1), round(gre_x1), round(gre_y1), round(high_a1), round(high_b1))); + } } return false; } -LabGridArea::LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): +LabGridArea::LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low, bool ciexy): Gtk::DrawingArea(), 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), + low_a(0.f), high_a(0.f), low_b(0.f), high_b(0.f), gre_x(0.f), gre_y(0.f), whi_x(0.f), whi_y(0.f),//these variables are used as xy in Ciexy - no change labels + defaultLow_a(0.f), defaultHigh_a(0.f), defaultLow_b(0.f), defaultHigh_b(0.f), defaultgre_x(0.f), defaultgre_y(0.f), defaultwhi_x(0.f), defaultwhi_y(0.f), listener(nullptr), edited(false), isDragged(false), - low_enabled(enable_low) + low_enabled(enable_low), + ciexy_enabled(ciexy) + { set_can_focus(false); // prevent moving the grid while you're moving a point add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK); @@ -80,16 +94,21 @@ LabGridArea::LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool get_style_context()->add_class("drawingarea"); } -void LabGridArea::getParams(double &la, double &lb, double &ha, double &hb) const +void LabGridArea::getParams(double &la, double &lb, double &ha, double &hb, double &gx, double &gy, double &wx, double &wy) const { la = low_a; ha = high_a; lb = low_b; hb = high_b; + gx = gre_x; + gy = gre_y; + wx = whi_x; + wy = whi_y; + // printf("la=%f ha=%f lb=%f hb=%f gx=%f gy=%f\n", la, ha, lb, hb, gx, gy); } -void LabGridArea::setParams(double la, double lb, double ha, double hb, bool notify) +void LabGridArea::setParams(double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, bool notify) { const double lo = -1.0; const double hi = 1.0; @@ -97,27 +116,37 @@ void LabGridArea::setParams(double la, double lb, double ha, double hb, bool not low_b = rtengine::LIM(lb, lo, hi); high_a = rtengine::LIM(ha, lo, hi); high_b = rtengine::LIM(hb, lo, hi); + gre_x = rtengine::LIM(gx, lo, hi); + gre_y = rtengine::LIM(gy, lo, hi); + whi_x = rtengine::LIM(wx, lo, hi); + whi_y = rtengine::LIM(wy, lo, hi); + queue_draw(); if (notify) { notifyListener(); } } -void LabGridArea::setDefault (double la, double lb, double ha, double hb) +void LabGridArea::setDefault (double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy) { defaultLow_a = la; defaultLow_b = lb; defaultHigh_a = ha; defaultHigh_b = hb; + defaultgre_x = gx; + defaultgre_y = gy; + defaultwhi_x = wx; + defaultwhi_y = wy; } void LabGridArea::reset(bool toInitial) { if (toInitial) { - setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, true); + setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, defaultgre_x, defaultgre_y, defaultwhi_x, defaultwhi_y, true); } else { - setParams(0., 0., 0., 0., true); + // printf("RESET \n"); + setParams(0., 0., 0., 0., 0., 0., 0., 0., true); } } @@ -166,6 +195,7 @@ bool LabGridArea::on_draw(const ::Cairo::RefPtr &crf) Gtk::Border padding = getPadding(style); // already scaled Cairo::RefPtr cr = getContext(); + if (isDirty()) { int width = allocation.get_width(); int height = allocation.get_height(); @@ -195,55 +225,208 @@ bool LabGridArea::on_draw(const ::Cairo::RefPtr &crf) // flip y: cr->translate(0, height); cr->scale(1., -1.); - const int cells = 8; - float step = 12000.f / float(cells/2); - double cellW = double(width) / double(cells); - double cellH = double(height) / double(cells); - double cellYMin = 0.; - double cellYMax = std::floor(cellH); - for (int j = 0; j < cells; j++) { - double cellXMin = 0.; - double cellXMax = std::floor(cellW); - for (int i = 0; i < cells; i++) { - float R, G, B; - float x, y, z; - int ii = i - cells/2; - int jj = j - cells/2; - float a = step * (ii + 0.5); - float b = step * (jj + 0.5); - Color::Lab2XYZ(25000.f, a, b, x, y, z); - Color::xyz2srgb(x, y, z, R, G, B); - cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); - cr->rectangle( - cellXMin, - cellYMin, - cellXMax - cellXMin - (i == cells-1 ? 0. : double(s)), - cellYMax - cellYMin - (j == cells-1 ? 0. : double(s)) - ); - cellXMin = cellXMax; - cellXMax = std::floor(cellW * double(i+2) + 0.01); - cr->fill(); - } - cellYMin = cellYMax; - cellYMax = std::floor(cellH * double(j+2) + 0.01); - } + if (! ciexy_enabled) {//draw cells for Labgrid + int cells = 8; + float step = 12000.f / float(cells/2); + double cellW = double(width) / double(cells); + double cellH = double(height) / double(cells); + double cellYMin = 0.; + double cellYMax = std::floor(cellH); + for (int j = 0; j < cells; j++) { + double cellXMin = 0.; + double cellXMax = std::floor(cellW); + for (int i = 0; i < cells; i++) { + float R, G, B; + float x, y, z; + int ii = i - cells/2; + int jj = j - cells/2; + float a = step * (ii + 0.5f); + float b = step * (jj + 0.5f); + Color::Lab2XYZ(25000.f, a, b, x, y, z); + Color::xyz2srgb(x, y, z, R, G, B); + cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); + cr->rectangle( + cellXMin, + cellYMin, + cellXMax - cellXMin - (i == cells-1 ? 0. : double(s)), + cellYMax - cellYMin - (j == cells-1 ? 0. : double(s)) + ); + cellXMin = cellXMax; + cellXMax = std::floor(cellW * double(i+2) + 0.01); + cr->fill(); + } + cellYMin = cellYMax; + cellYMax = std::floor(cellH * double(j+2) + 0.01); + } + } else {//cells for CIE xy + int cells = 600; + float step = 1.f / float(cells); + double cellW = double(width) / double(cells); + double cellH = double(height) / double(cells); + double cellYMin = 0.; + double cellYMax = std::floor(cellH); + //various approximations to simulate Ciexy curves graph + // this graph is not accurate...I replace curve by polygon or parabolic + float xa = 0.2653f / (0.7347f - 0.17f); + float xb = -0.17f * xa; + //linear values + // float ax = (0.1f - 0.6f) / 0.08f; + // float bx = 0.6f; + // float ax0 = -0.1f / (0.17f - 0.08f); + // float bx0 = -0.17f* ax0; + float axs = (0.2653f - 0.65f) / (0.7347f - 0.35f); + float bxs = 0.65f - axs * 0.35f; + // float axss = (0.7f - 0.83f) / (0.3f - 0.1f); + // float bxss = 0.7f - 0.3f * axss; + //float bxsss = 0.65f; + //float axsss = (0.83f - bxsss) / 0.05f; + //float bx4s = 0.83f; + float ay = 0.4f; + float by = 0.4f; + for (int j = 0; j < cells; j++) { + double cellXMin = 0.; + double cellXMax = std::floor(cellW); + for (int i = 0; i < cells; i++) { + float R, G, B; + float XX, YY, ZZ; + float x = 1.1f * step * i - 0.1f;//Graph CIExy with -0.1 to 1 - must be enough + float y = 1.1f * step * j - 0.1;//Graph CIExy with -0.1 to 1 - must be enough + if(y > 0.5f) { + YY = 0.6f; + } else { + YY = ay * y + by; + } + XX = (x * YY) / y; + ZZ = ((1.f - x - y)* YY) / y; + float yr = xa * x + xb; + // float y0 = ax0 * x + bx0; + // float y1 = ax * x + bx; + float y2 = axs * x + bxs; + // float y3 = axss * x + bxss; + // float y4 = axsss * x + bxsss; + // float y5 = bx4s; + float y6 = 22.52f * x * x - 7.652f * x + 0.65f;//parabolic passing in x=0.17 y=0 - x=0.1 y =0.11 - x=0 y= 0.65 + float y3 = -1.266666f * x * x -0.170002f * x + 0.859686f;//other parabolic for green passing in x=0.35 y=0.65 - x=0.20 y=0.775 - x=0.1 y=0.83 + float y4 = -60.71428f * x * x + 6.821428f * x + 0.65f;//other parabolic x=0 y=0.65 - x=0.03 y=0.8 - x=0.07 y=0.83 + //small difference in the connection of the 2 last parabolic + + Color::xyz2srgb(XX, YY, ZZ, R, G, B); + //replace color by gray + if(y < yr && x > 0.17f) { + R = 0.7f; G = 0.7f; B = 0.7f; + } + /* + if(y < y0 && x <= 0.17f && x >= 0.08f) { + R = 0.7f; G = 0.7f; B = 0.7f; + } + if(y < y1 && x < 0.08f) { + R = 0.7f; G = 0.7f; B = 0.7f; + } + */ + if(y < y6 && y < 0.65f && x < 0.17f) { + R = 0.7f; G = 0.7f; B = 0.7f; + } + + if(y > y2 && x > 0.35f) {//0.35 + R = 0.7f; G = 0.7f; B = 0.7f; + } + if(y > y3 && x <= 0.35f && x > 0.06f) {//0.35 + R = 0.7f; G = 0.7f; B = 0.7f; + } + if(y > y4 && x <= 0.06f) { + R = 0.7f; G = 0.7f; B = 0.7f; + } + // if(y > y5 && x >= 0.07f && x <= 0.1f) { + // R = 0.7f; G = 0.7f; B = 0.7f; + // } + + cr->set_source_rgb(R , G , B); + + cr->rectangle( + cellXMin, + cellYMin, + cellXMax - cellXMin - (i == cells-1 ? 0. : 0.f * double(s)), + cellYMax - cellYMin - (j == cells-1 ? 0. : 0.f * double(s)) + ); + cellXMin = cellXMax; + cellXMax = std::floor(cellW * double(i+2) + 0.001); + cr->fill(); + } + cellYMin = cellYMax; + cellYMax = std::floor(cellH * double(j+2) + 0.001); + } + } // drawing the connection line cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); - float loa, hia, lob, hib; - 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. * double(s)); + float loa, hia, lob, hib, grx, gry, whx, why; + loa = .5 * (width + width * low_a); + hia = .5 * (width + width * high_a); + lob = .5 * (height + height * low_b); + hib = .5 * (height + height * high_b); + grx = .5 * (width + width * gre_x); + gry = .5 * (height + height * gre_y); + whx = .5 * (width + width * whi_x); + why = .5 * (height + height * whi_y); + cr->set_line_width(1.5f * double(s)); cr->set_source_rgb(0.6, 0.6, 0.6); cr->move_to(loa, lob); cr->line_to(hia, hib); + if (ciexy_enabled) { + cr->move_to(loa, lob); + cr->line_to(grx, gry); + cr->move_to(grx, gry); + cr->line_to(hia, hib); + } cr->stroke(); + if (ciexy_enabled) { + //to convert from / to Ciexy <=> area + // pos_area = 1.81818 * (x + 0.1) - 1 + // x = 0.55 * (pos_area + 1) - 0.1 + cr->set_line_width(0.2f * double(s)); + cr->set_source_rgb(0.1, 0.1, 0.1); + //draw horiz and vertical lines + for(int i = 0; i < 22; i++) { + cr->move_to(0.04545 * i * width, 0.); + cr->line_to(0.04545 * i * width, height); + } + for(int i = 0; i < 22; i++) { + cr->move_to(0., 0.04545 * i * height ); + cr->line_to(width, 0.04545 * i * height); + } + + cr->stroke(); + //draw abciss and ordonate + cr->set_line_width(1.f * double(s)); + cr->set_source_rgb(0.4, 0., 0.); + cr->move_to(0.04545 * 2 * width, 0.); + cr->line_to(0.04545 * 2 * width, height); + cr->move_to(0., 0.04545 * 2 * height ); + cr->line_to(width, 0.04545 * 2 * height); + cr->stroke(); + + //draw 0 and 1 with circle and lines + cr->set_line_width(1.2f * double(s)); + cr->set_source_rgb(0.4, 0., 0.); + cr->arc(0.06 * width, 0.06 * height, 0.016 * width, 0, 2. * rtengine::RT_PI); + cr->stroke(); + cr->set_line_width(1.5f * double(s)); + cr->set_source_rgb(0.4, 0., 0.); + cr->move_to(0.985 * width, 0.08 * height); + cr->line_to(0.985 * width, 0.055 * height); + + cr->move_to(0.07 * width, 0.99 * height); + cr->line_to(0.07 * width, 0.965 * height); + + cr->stroke(); + + } + + // drawing points if (low_enabled) { - cr->set_source_rgb(0.1, 0.1, 0.1); + cr->set_source_rgb(0.1, 0.1, 0.1);//black for red in Ciexy if (litPoint == LOW) { cr->arc(loa, lob, 5 * s, 0, 2. * rtengine::RT_PI); } else { @@ -252,7 +435,23 @@ bool LabGridArea::on_draw(const ::Cairo::RefPtr &crf) cr->fill(); } - cr->set_source_rgb(0.9, 0.9, 0.9); + if (ciexy_enabled) { + cr->set_source_rgb(0.5, 0.5, 0.5);//gray for green + if (litPoint == GRE) { + cr->arc(grx, gry, 5 * s, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(grx, gry, 3 * s, 0, 2. * rtengine::RT_PI); + } + cr->fill(); + } + + if (ciexy_enabled) {//White Point + cr->set_source_rgb(1., 1., 1.);//White + cr->arc(whx, why, 3 * s, 0, 2. * rtengine::RT_PI); + cr->fill(); + } + + cr->set_source_rgb(0.9, 0.9, 0.9);//white for blue en Ciexy if (litPoint == HIGH) { cr->arc(hia, hib, 5 * s, 0, 2. * rtengine::RT_PI); } else { @@ -269,10 +468,11 @@ bool LabGridArea::on_draw(const ::Cairo::RefPtr &crf) bool LabGridArea::on_button_press_event(GdkEventButton *event) { if (event->button == 1) { + if (!ciexy_enabled) { if (event->type == GDK_2BUTTON_PRESS) { switch (litPoint) { case NONE: - low_a = low_b = high_a = high_b = 0.f; + low_a = low_b = high_a = high_b = gre_x = gre_y = 0.f; break; case LOW: low_a = low_b = 0.f; @@ -280,6 +480,9 @@ bool LabGridArea::on_button_press_event(GdkEventButton *event) case HIGH: high_a = high_b = 0.f; break; + case GRE: + gre_x = gre_y = 0.f; + break; } edited = true; notifyListener(); @@ -287,6 +490,16 @@ bool LabGridArea::on_button_press_event(GdkEventButton *event) } else if (event->type == GDK_BUTTON_PRESS && litPoint != NONE) { isDragged = true; } + } else { + if (event->type == GDK_2BUTTON_PRESS) { + edited = true; + notifyListener(); + queue_draw(); + } else if (event->type == GDK_BUTTON_PRESS && litPoint != NONE) { + isDragged = true; + } + + } return false; } return true; @@ -319,8 +532,8 @@ bool LabGridArea::on_motion_notify_event(GdkEventMotion *event) int height = get_allocated_height() - 2 * inset * s - padding.get_top() - padding.get_bottom(); const float mouse_x = std::min(double(std::max(event->x - inset * s - padding.get_right(), 0.)), double(width)); const float mouse_y = std::min(double(std::max(get_allocated_height() - 1 - event->y - inset * s - padding.get_bottom(), 0.)), double(height)); - const float ma = (2.0 * mouse_x - width) / (float)width; - const float mb = (2.0 * mouse_y - height) / (float)height; + const float ma = (2.f * mouse_x - width) / width; + const float mb = (2.f * mouse_y - height) / height; if (isDragged) { if (litPoint == LOW) { low_a = ma; @@ -328,6 +541,9 @@ bool LabGridArea::on_motion_notify_event(GdkEventMotion *event) } else if (litPoint == HIGH) { high_a = ma; high_b = mb; + } else if (litPoint == GRE) { + gre_x = ma; + gre_y = mb; } edited = true; grab_focus(); @@ -343,13 +559,18 @@ bool LabGridArea::on_motion_notify_event(GdkEventMotion *event) float lb = low_b; float ha = high_a; float hb = high_b; + float gx = gre_x; + float gy = gre_y; 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); + const float distgxy = (gx - ma) * (gx - ma) + (gy - mb) * (gy - mb); if (low_enabled && distlo < thrs * thrs && distlo < disthi) { litPoint = LOW; } else if (disthi < thrs * thrs && disthi <= distlo) { litPoint = HIGH; + } else if (ciexy_enabled && distgxy < thrs * thrs && distgxy <= distlo) { + litPoint = GRE; } if ((oldLitPoint == NONE && litPoint != NONE) || (oldLitPoint != NONE && litPoint == NONE)) { queue_draw(); @@ -391,6 +612,10 @@ bool LabGridArea::lowEnabled() const return low_enabled; } +bool LabGridArea::ciexyEnabled() const +{ + return ciexy_enabled; +} void LabGridArea::setLowEnabled(bool yes) { @@ -400,17 +625,26 @@ void LabGridArea::setLowEnabled(bool yes) } } +void LabGridArea::setciexyEnabled(bool yes) +{ + if (ciexy_enabled != yes) { + ciexy_enabled = yes; + queue_draw(); + } +} //----------------------------------------------------------------------------- // LabGrid //----------------------------------------------------------------------------- -LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): - grid(evt, msg, enable_low) +LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low, bool ciexy): + grid(evt, msg, enable_low, ciexy) { 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"))); + if(!ciexy) {//disabled for Cie xy + 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); diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index 4693c897c..0ed4cdf98 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -48,17 +48,25 @@ private: rtengine::ProcEvent evt; Glib::ustring evtMsg; - enum State { NONE, HIGH, LOW }; + enum State { NONE, HIGH, LOW, GRE}; State litPoint; double low_a; double high_a; double low_b; double high_b; - + double gre_x; + double gre_y; + double whi_x; + double whi_y; + double defaultLow_a; double defaultHigh_a; double defaultLow_b; double defaultHigh_b; + double defaultgre_x; + double defaultgre_y; + double defaultwhi_x; + double defaultwhi_y; ToolPanelListener *listener; bool edited; @@ -67,16 +75,17 @@ private: static const int inset = 5; bool low_enabled; + bool ciexy_enabled; bool notifyListener(); void getLitPoint(); public: - LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); + LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true, bool ciexy=false); - void getParams(double &la, double &lb, double &ha, double &hb) const; - void setParams(double la, double lb, double ha, double hb, bool notify); - void setDefault (double la, double lb, double ha, double hb); + void getParams(double &la, double &lb, double &ha, double &hb, double &gx, double &gy, double &wx, double &wy) const; + void setParams(double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, bool notify); + void setDefault (double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy); void setEdited(bool yes); bool getEdited() const; void reset(bool toInitial); @@ -84,6 +93,8 @@ public: bool lowEnabled() const; void setLowEnabled(bool yes); + bool ciexyEnabled() const; + void setciexyEnabled(bool yes); bool on_draw(const ::Cairo::RefPtr &crf) override; void on_style_updated () override; @@ -96,23 +107,25 @@ public: }; -class LabGrid: public Gtk::HBox { +class LabGrid: public Gtk::Box { private: LabGridArea grid; bool resetPressed(GdkEventButton *event); public: - LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); + LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true, bool ciexy=false); - 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 getParams(double &la, double &lb, double &ha, double &hb, double &gx, double &gy, double &wx, double &wy) const { return grid.getParams(la, lb, ha, hb, gx, gy, wx, wy); } + void setParams(double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy, bool notify) { grid.setParams(la, lb, ha, hb, gx, gy, wx, wy, notify); } + void setDefault (double la, double lb, double ha, double hb, double gx, double gy, double wx, double wy) { grid.setDefault(la, lb, ha, hb, gx, gy, wx, wy); } 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); } + bool ciexyEnabled() const { return grid.ciexyEnabled(); } + void setciexyEnabled(bool yes) { grid.setciexyEnabled(yes); } }; diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index 76e0635eb..e8febf8e2 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -17,6 +17,8 @@ * along with RawTherapee. If not, see . */ #include "lensgeom.h" + +#include "eventmapper.h" #include "guiutils.h" #include "rtimage.h" @@ -25,9 +27,23 @@ using namespace rtengine; using namespace rtengine::procparams; -LensGeometry::LensGeometry () : FoldableToolPanel(this, "lensgeom", M("TP_LENSGEOM_LABEL")), rlistener(nullptr), lastFill(false) +const Glib::ustring LensGeometry::TOOL_NAME = "lensgeom"; + +LensGeometry::LensGeometry () : FoldableToolPanel(this, TOOL_NAME, M("TP_LENSGEOM_LABEL")), rlistener(nullptr), lastFill(false) { + auto m = ProcEventMapper::getInstance(); + EvTransMethod = m->newEvent(TRANSFORM, "HISTORY_MSG_TRANS_METHOD"); + + Gtk::Box* hb1 = Gtk::manage (new Gtk::Box ()); + hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); + method = Gtk::manage (new MyComboBoxText ()); + method->append(M("TP_LENSGEOM_LOG")); + method->append(M("TP_LENSGEOM_LIN")); + method->set_active(0); + hb1->pack_end (*method, Gtk::PACK_EXPAND_WIDGET, 4); + pack_start( *hb1, Gtk::PACK_SHRINK, 4); + fill = Gtk::manage (new Gtk::CheckButton (M("TP_LENSGEOM_FILL"))); pack_start (*fill); @@ -36,11 +52,9 @@ LensGeometry::LensGeometry () : FoldableToolPanel(this, "lensgeom", M("TP_LENSGE autoCrop->get_style_context()->add_class("independent"); pack_start (*autoCrop, Gtk::PACK_SHRINK, 2); - packBox = Gtk::manage (new ToolParamBlock ()); - pack_start (*packBox); - - autoCrop->signal_pressed().connect( sigc::mem_fun(*this, &LensGeometry::autoCropPressed) ); - fillConn = fill->signal_toggled().connect( sigc::mem_fun(*this, &LensGeometry::fillPressed) ); + method->connect(method->signal_changed().connect(sigc::mem_fun(*this, &LensGeometry::methodChanged))); + autoCrop->signal_pressed().connect(sigc::mem_fun(*this, &LensGeometry::autoCropPressed)); + fillConn = fill->signal_toggled().connect(sigc::mem_fun(*this, &LensGeometry::fillPressed)); fill->set_active (true); show_all (); @@ -55,8 +69,14 @@ void LensGeometry::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); + method->block (true); + method->set_active(pp->commonTrans.method == "log" ? 0 : 1); if (pedited) { + if(!pedited->commonTrans.method) { + method->set_active_text(M("GENERAL_UNCHANGED")); + } + fill->set_inconsistent (!pedited->commonTrans.autofill); } @@ -67,15 +87,20 @@ void LensGeometry::read (const ProcParams* pp, const ParamsEdited* pedited) lastFill = pp->commonTrans.autofill; + method->block (false); enableListener (); } void LensGeometry::write (ProcParams* pp, ParamsEdited* pedited) { - + int currentRow = method->get_active_row_number(); + if( currentRow >= 0 && method->get_active_text() != M("GENERAL_UNCHANGED")) { + pp->commonTrans.method = currentRow == 0 ? "log" : "lin"; + } pp->commonTrans.autofill = fill->get_active (); if (pedited) { + pedited->commonTrans.method = method->get_active_text() != M("GENERAL_UNCHANGED"); pedited->commonTrans.autofill = !fill->get_inconsistent(); } } @@ -115,6 +140,14 @@ void LensGeometry::fillPressed () } } +void LensGeometry::methodChanged () +{ + + if (listener && method->get_active_row_number() >= 0) { + listener->panelChanged(EvTransMethod, method->get_active_text()); + } +} + void LensGeometry::setBatchMode (bool batchMode) { diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h index 18b31a619..fa260e177 100644 --- a/rtgui/lensgeom.h +++ b/rtgui/lensgeom.h @@ -29,27 +29,25 @@ class LensGeometry final : { protected: + MyComboBoxText* method; Gtk::Button* autoCrop; LensGeomListener* rlistener; Gtk::CheckButton* fill; bool lastFill; sigc::connection fillConn; - ToolParamBlock* packBox; + rtengine::ProcEvent EvTransMethod; public: + static const Glib::ustring TOOL_NAME; LensGeometry (); ~LensGeometry () override; - Gtk::Box* getPackBox () - { - return packBox; - } - 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 methodChanged(); void fillPressed (); void autoCropPressed (); void setLensGeomListener (LensGeomListener* l) diff --git a/rtgui/lensgeomlistener.h b/rtgui/lensgeomlistener.h index 7bfa0fb45..7f437c170 100644 --- a/rtgui/lensgeomlistener.h +++ b/rtgui/lensgeomlistener.h @@ -18,6 +18,15 @@ */ #pragma once +#include +#include + +namespace rtengine +{ +class ControlLine; +class ProcEvent; +} + class LensGeomListener { public: @@ -25,4 +34,5 @@ public: virtual void straightenRequested () = 0; virtual void autoCropRequested () = 0; virtual double autoDistorRequested () = 0; + virtual void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector *lines = nullptr) = 0; }; diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index be21512d5..65c962b7b 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -36,8 +36,10 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring LensProfilePanel::TOOL_NAME = "lensprof"; + LensProfilePanel::LensProfilePanel() : - FoldableToolPanel(this, "lensprof", M("TP_LENSPROFILE_LABEL")), + FoldableToolPanel(this, TOOL_NAME, M("TP_LENSPROFILE_LABEL")), lcModeChanged(false), lcpFileChanged(false), useDistChanged(false), @@ -74,11 +76,13 @@ LensProfilePanel::LensProfilePanel() : // Main containers: Gtk::Frame *nodesFrame = Gtk::manage(new Gtk::Frame(M("TP_LENSPROFILE_MODE_HEADER"))); + nodesFrame->set_label_align (0.025, 0.5); 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"))); + distFrame->set_label_align (0.025, 0.5); distGrid->get_style_context()->add_class("grid-spacing"); setExpandAlignProperties(distGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); @@ -586,6 +590,9 @@ void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) LensProfilePanel::LFDbHelper::LFDbHelper() { + lensfunCameraModel = Gtk::TreeStore::create(lensfunModelCam); + lensfunLensModel = Gtk::TreeStore::create(lensfunModelLens); + #ifdef _OPENMP #pragma omp parallel sections if (!settings->verbose) #endif @@ -594,14 +601,12 @@ LensProfilePanel::LFDbHelper::LFDbHelper() #pragma omp section #endif { - lensfunCameraModel = Gtk::TreeStore::create(lensfunModelCam); fillLensfunCameras(); } #ifdef _OPENMP #pragma omp section #endif { - lensfunLensModel = Gtk::TreeStore::create(lensfunModelLens); fillLensfunLenses(); } } diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index 7b5b7343c..42746f41e 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -28,6 +28,8 @@ class LensProfilePanel final : public FoldableToolPanel { public: + static const Glib::ustring TOOL_NAME; + LensProfilePanel(); void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index d91642b6c..a56f9cb15 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -29,14 +29,22 @@ using namespace rtengine; using namespace rtengine::procparams; -LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_LOCALCONTRAST_LABEL"), false, true) +const Glib::ustring LocalContrast::TOOL_NAME = "localcontrast"; + +LocalContrast::LocalContrast(): FoldableToolPanel(this, TOOL_NAME, M("TP_LOCALCONTRAST_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); - EvLocalContrastEnabled = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); +/* EvLocalContrastEnabled = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); EvLocalContrastRadius = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_RADIUS"); EvLocalContrastAmount = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_AMOUNT"); EvLocalContrastDarkness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); EvLocalContrastLightness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); +*/ + EvLocalContrastEnabled = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); + EvLocalContrastRadius = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_RADIUS"); + EvLocalContrastAmount = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_AMOUNT"); + EvLocalContrastDarkness = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); + EvLocalContrastLightness = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 20., 200., 1., 80.)); amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2)); diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h index d1d25fb3d..fa769c35e 100644 --- a/rtgui/localcontrast.h +++ b/rtgui/localcontrast.h @@ -38,6 +38,7 @@ private: rtengine::ProcEvent EvLocalContrastLightness; public: + static const Glib::ustring TOOL_NAME; LocalContrast(); diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc new file mode 100644 index 000000000..e7725a005 --- /dev/null +++ b/rtgui/locallab.cc @@ -0,0 +1,1359 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2010 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as publishfed 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 . + * 2017 Jacques Desmis + * 2019 Pierre Cabrera + */ +#include "locallab.h" + +#include "options.h" +#include "../rtengine/procparams.h" + +using namespace rtengine; +using namespace procparams; + +extern Options options; + +const Glib::ustring Locallab::TOOL_NAME = "locallab"; + +/* ==== LocallabToolList ==== */ +LocallabToolList::LocallabToolList(): + // Tool list GUI elements + list(Gtk::manage(new MyComboBox())), + listTreeModel(Gtk::ListStore::create(toolRow)), + + // Tool list listener + listListener(nullptr) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + list->set_model(listTreeModel); + list->pack_start(toolRow.name); + listConn = list->signal_changed().connect(sigc::mem_fun(*this, &LocallabToolList::toolRowSelected)); + list->set_tooltip_text(M("TP_LOCALLAB_LIST_TOOLTIP")); + // Append title row to list + // Important: Title row shall always be the first one + const auto titleRow = *(listTreeModel->append()); + titleRow[toolRow.id] = 0; + titleRow[toolRow.name] = M("TP_LOCALLAB_LIST_NAME"); + listConn.block(true); + list->set_active(titleRow); + listConn.block(false); + + // Add ComboBox to LocallabToolList widget + add(*list); +} + +void LocallabToolList::addToolRow(const Glib::ustring &toolname, const int id) +{ + // Disable event management + listConn.block(true); + + // Add tool name according to id + Gtk::TreeIter insertAfter; + + for (auto &r : listTreeModel->children()) { + if (r[toolRow.id] < id) { + insertAfter = *r; // Tool name shall be added at least after this row + } else { + break; // Tool name shall be added before this row + } + } + + // Note: There is always at list one row (i.e. title one) + + const auto newRow = *(listTreeModel->insert_after(insertAfter)); + newRow[toolRow.id] = id; + newRow[toolRow.name] = toolname; + + // Select title row (i.e. always first row) + list->set_active(0); + + // Enable event management + listConn.block(false); +} + +void LocallabToolList::removeToolRow(const Glib::ustring &toolname) +{ + // Disable event management + listConn.block(true); + + // Remove tool name row + for (auto &r : listTreeModel->children()) { + if (r[toolRow.name] == toolname) { + listTreeModel->erase(*r); + break; + } + } + + // Select title row (i.e. always first row) + list->set_active(0); + + // Enable event management + listConn.block(false); +} + +void LocallabToolList::removeAllTool() +{ + // Disable event management + listConn.block(true); + + // Remove all tools + listTreeModel->clear(); + + // Add title row again + const auto titleRow = *(listTreeModel->append()); + titleRow[toolRow.id] = 0; + titleRow[toolRow.name] = M("TP_LOCALLAB_LIST_NAME"); + + // Select title row (i.e. always first row) + list->set_active(0); + + // Enable event management + listConn.block(false); +} + +void LocallabToolList::toolRowSelected() +{ + // Get selected tool name + const auto selRow = *(list->get_active()); + const Glib::ustring toolname = selRow[toolRow.name]; + + // Remove selected tool name for ComboBox + removeToolRow(toolname); + + // Warm tool list listener + if (listListener) { + listListener->locallabToolToAdd(toolname); + } +} + +/* ==== Locallab ==== */ +Locallab::Locallab(): + FoldableToolPanel(this, TOOL_NAME, M("TP_LOCALLAB_LABEL"), false, true), + + // Spot control panel widget + expsettings(Gtk::manage(new ControlSpotPanel())), + + // Tool list widget + toollist(Gtk::manage(new LocallabToolList())) + + // expcie(Gtk::manage(new Locallabcie())), + // Other widgets + //resetshowButton(Gtk::manage(new Gtk::Button(M("TP_LOCALLAB_RESETSHOW")))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + // Create panel widget to receive Locallab GUI elements + ToolVBox* const panel = Gtk::manage(new ToolVBox()); + panel->set_spacing(2); + + // Add spot control panel to panel widget + expsettings->setControlPanelListener(this); + expsettings->setLevel(2); + panel->pack_start(*expsettings->getExpander(), false, false); + + // Add separator + Gtk::Separator* const separator = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + panel->pack_start(*separator, false, false); + + // Add tool list widget + toollist->setLocallabToolListListener(this); + panel->pack_start(*toollist, false, false); + + // Add Locallab tools to panel widget + ToolVBox* const toolpanel = Gtk::manage(new ToolVBox()); + toolpanel->set_name("LocallabToolPanel"); + addTool(toolpanel, &expcolor); + addTool(toolpanel, &expshadhigh); + addTool(toolpanel, &expvibrance); + addTool(toolpanel, &explog); + addTool(toolpanel, &expcie); + addTool(toolpanel, &expexpose); + addTool(toolpanel, &expmask); + addTool(toolpanel, &expsoft); + addTool(toolpanel, &expblur); + addTool(toolpanel, &exptonemap); + addTool(toolpanel, &expreti); + addTool(toolpanel, &expsharp); + addTool(toolpanel, &expcontrast); + addTool(toolpanel, &expcbdl); + panel->pack_start(*toolpanel, false, false); + + // Add separator + // Gtk::Separator* const separator2 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + // panel->pack_start(*separator2, false, false); + + // Add mask reset button to panel widget + //resetshowButton->signal_pressed().connect(sigc::mem_fun(*this, &Locallab::resetshowPressed)); + // panel->pack_start(*resetshowButton); + + // Add panel widget to Locallab GUI + pack_start(*panel); + + // Show all widgets + show_all(); + + // Update Locallab tools advice tooltips visibility based on saved option + for (auto tool : locallabTools) { + tool->updateAdviceTooltips(options.showtooltip); + } + + // By default, if no photo is loaded, all Locallab tools are removed and it's not possible to add them + // (to be necessary called after "show_all" function) + setParamEditable(false); +} + +void Locallab::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update Locallab activation state + setEnabled(pp->locallab.enabled); + + // Transmit Locallab activation state to Locallab tools + for (auto tool : locallabTools) { + tool->isLocallabActivated(exp->getEnabled()); + } + + // TODO Manage it with read function in controlspotpanel.cc + // Delete all existent spots + const int spotNb = expsettings->getSpotNumber(); + + for (int i = spotNb - 1; i >= 0; i--) { + expsettings->deleteControlSpot(i); + } + + // TODO Manage it with read function in controlspotpanel.cc + // Add existent spots based on pp + ControlSpotPanel::SpotRow* const r = new ControlSpotPanel::SpotRow(); + + for (int i = 0; i < (int)pp->locallab.spots.size(); i++) { + r->name = pp->locallab.spots.at(i).name; + r->isvisible = pp->locallab.spots.at(i).isvisible; + + if (pp->locallab.spots.at(i).shape == "ELI") { + r->shape = 0; + } else { + r->shape = 1; + } + + if (pp->locallab.spots.at(i).prevMethod == "hide") { + r->prevMethod = 0; + } else { + r->prevMethod = 1; + } + + if (pp->locallab.spots.at(i).spotMethod == "norm") { + r->spotMethod = 0; + } else if(pp->locallab.spots.at(i).spotMethod == "exc"){ + r->spotMethod = 1; + } else if (pp->locallab.spots.at(i).spotMethod == "full"){ + r->spotMethod = 2; + } + + r->sensiexclu = pp->locallab.spots.at(i).sensiexclu; + r->structexclu = pp->locallab.spots.at(i).structexclu; + + if (pp->locallab.spots.at(i).shapeMethod == "IND") { + r->shapeMethod = 0; + } else if (pp->locallab.spots.at(i).shapeMethod == "SYM") { + r->shapeMethod = 1; + } else if (pp->locallab.spots.at(i).shapeMethod == "INDSL") { + r->shapeMethod = 2; + } else { + r->shapeMethod = 3; + } + + if (pp->locallab.spots.at(i).avoidgamutMethod == "NONE") { + r->avoidgamutMethod = 0; + } else if (pp->locallab.spots.at(i).avoidgamutMethod == "LAB") { + r->avoidgamutMethod = 1; + } else if (pp->locallab.spots.at(i).avoidgamutMethod == "XYZ") { + r->avoidgamutMethod= 2; + } else if (pp->locallab.spots.at(i).avoidgamutMethod == "XYZREL") { + r->avoidgamutMethod= 3; + } else if (pp->locallab.spots.at(i).avoidgamutMethod == "MUNS") { + r->avoidgamutMethod= 4; + } + + r->locX = pp->locallab.spots.at(i).loc.at(0); + r->locXL = pp->locallab.spots.at(i).loc.at(1); + r->locY = pp->locallab.spots.at(i).loc.at(2); + r->locYT = pp->locallab.spots.at(i).loc.at(3); + r->centerX = pp->locallab.spots.at(i).centerX; + r->centerY = pp->locallab.spots.at(i).centerY; + r->circrad = pp->locallab.spots.at(i).circrad; + + if (pp->locallab.spots.at(i).qualityMethod == "enh") { + r->qualityMethod = 0; + } else { + r->qualityMethod = 1; + } + + r->transit = pp->locallab.spots.at(i).transit; + r->transitweak = pp->locallab.spots.at(i).transitweak; + r->transitgrad = pp->locallab.spots.at(i).transitgrad; + r->feather = pp->locallab.spots.at(i).feather; + r->struc = pp->locallab.spots.at(i).struc; + r->thresh = pp->locallab.spots.at(i).thresh; + r->iter = pp->locallab.spots.at(i).iter; + r->balan = pp->locallab.spots.at(i).balan; + r->balanh = pp->locallab.spots.at(i).balanh; + r->colorde = pp->locallab.spots.at(i).colorde; + r->colorscope = pp->locallab.spots.at(i).colorscope; + r->avoidrad = pp->locallab.spots.at(i).avoidrad; + r->hishow = pp->locallab.spots.at(i).hishow; + r->activ = pp->locallab.spots.at(i).activ; + r->blwh = pp->locallab.spots.at(i).blwh; + r->recurs = pp->locallab.spots.at(i).recurs; + r->laplac = true; //pp->locallab.spots.at(i).laplac; + r->deltae = pp->locallab.spots.at(i).deltae; + r->scopemask = pp->locallab.spots.at(i).scopemask; + r->denoichmask = pp->locallab.spots.at(i).denoichmask; + r->shortc = pp->locallab.spots.at(i).shortc; + r->lumask = pp->locallab.spots.at(i).lumask; + //r->savrest = pp->locallab.spots.at(i).savrest; + + if (pp->locallab.spots.at(i).complexMethod == "sim") { + r->complexMethod = 0; + } else if (pp->locallab.spots.at(i).complexMethod == "mod") { + r->complexMethod = 1; + } else if (pp->locallab.spots.at(i).complexMethod == "all") { + r->complexMethod = 2; + } + + if (pp->locallab.spots.at(i).wavMethod == "D2") { + r->wavMethod = 0; + } else if (pp->locallab.spots.at(i).wavMethod == "D4") { + r->wavMethod = 1; + } else if (pp->locallab.spots.at(i).wavMethod == "D6") { + r->wavMethod = 2; + } else if (pp->locallab.spots.at(i).wavMethod == "D10") { + r->wavMethod = 3; + } else if (pp->locallab.spots.at(i).wavMethod == "D14") { + r->wavMethod = 4; + } + + expsettings->addControlSpot(r); + } + + // Select active spot + if (pp->locallab.spots.size() > 0) { + expsettings->setSelectedSpot(pp->locallab.selspot); + spotName = pp->locallab.spots.at(pp->locallab.selspot).name; + } + + // Update each Locallab tools GUI + for (auto tool : locallabTools) { + tool->read(pp, pedited); + } + + // Update tool list widget + int toolNb = 0; + toollist->removeAllTool(); // Reset Locallab list firstly + + for (auto tool : locallabTools) { + toolNb++; + + if (!tool->isLocallabToolAdded()) { + toollist->addToolRow(tool->getToolName(), toolNb); + } + } + + // Specific case: if there is no spot, GUI isn't anymore editable (i.e. Locallab tool cannot be managed) + if (pp->locallab.spots.size() > 0) { + setParamEditable(true); + } else { + setParamEditable(false); + } + + // Enable all listeners + enableListener(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void Locallab::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + // Update Locallab activation state + pp->locallab.enabled = getEnabled(); + + // Transmit Locallab activation state to Locallab tools (in case of updated) + for (auto tool : locallabTools) { + tool->isLocallabActivated(exp->getEnabled()); + } + + const int spotPanelEvent = expsettings->getEventType(); + int spotIndex; + ControlSpotPanel::SpotRow* r; + rtengine::procparams::LocallabParams::LocallabSpot* newSpot; + + int imW, imH; // Size of image + int prW, prH; // Size of preview area + int prX, prY; // Coord of preview area center + EditDataProvider* const provider = expsettings->getEditProvider(); + + int toolNb; + + switch (spotPanelEvent) { + case (ControlSpotPanel::SpotCreation): // Spot creation event + // Spot creation (default initialization) + newSpot = new LocallabParams::LocallabSpot(); + r = new ControlSpotPanel::SpotRow(); + r->name = newSpot->name = M("TP_LOCALLAB_SPOTNAME"); + r->isvisible = newSpot->isvisible; + + if (newSpot->shape == "ELI") { + r->shape = 0; + } else { + r->shape = 1; + } + + if (newSpot->prevMethod == "hide") { + r->prevMethod = 0; + } else { + r->prevMethod = 1; + } + + + if (newSpot->spotMethod == "norm") { + r->spotMethod = 0; + } else if(newSpot->spotMethod == "exc") { + r->spotMethod = 1; + } else if(newSpot->spotMethod == "full") { + r->spotMethod = 2; + } + + r->sensiexclu = newSpot->sensiexclu; + r->structexclu = newSpot->structexclu; + + if (newSpot->shapeMethod == "IND") { + r->shapeMethod = 0; + } else if (newSpot->shapeMethod == "SYM") { + r->shapeMethod = 1; + } else if (newSpot->shapeMethod == "INDSL") { + r->shapeMethod = 2; + } else { + r->shapeMethod = 3; + } + + if (newSpot->avoidgamutMethod == "NONE") { + r->avoidgamutMethod = 0; + } else if (newSpot->avoidgamutMethod == "LAB") { + r->avoidgamutMethod = 1; + } else if (newSpot->avoidgamutMethod == "XYZ") { + r->avoidgamutMethod = 2; + } else if (newSpot->avoidgamutMethod == "XYZREL") { + r->avoidgamutMethod = 3; + } else if (newSpot->avoidgamutMethod == "MUNS") { + r->avoidgamutMethod = 4; + } + + // Calculate spot size and center position according to preview area + if (provider && !batchMode) { + provider->getImageSize(imW, imH); + provider->getPreviewCenterPos(prX, prY); + provider->getPreviewSize(prW, prH); + + if (imW && imH) { // Image loaded + // Spot center position computation + newSpot->centerX = rtengine::LIM(int(int((double)prX - (double)imW / 2.) * 2000. / (double)imW), -1000, 1000); + newSpot->centerY = rtengine::LIM(int(int((double)prY - (double)imH / 2.) * 2000. / (double)imH), -1000, 1000); + // Ellipse/rectangle size computation + newSpot->loc.at(0) = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->loc.at(0)); + newSpot->loc.at(1) = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->loc.at(1)); + newSpot->loc.at(2) = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->loc.at(2)); + newSpot->loc.at(3) = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->loc.at(3)); + } + } + + r->locX = newSpot->loc.at(0); + r->locXL = newSpot->loc.at(1); + r->locY = newSpot->loc.at(2); + r->locYT = newSpot->loc.at(3); + r->centerX = newSpot->centerX; + r->centerY = newSpot->centerY; + + r->circrad = newSpot->circrad; + + if (newSpot->qualityMethod == "enh") { + r->qualityMethod = 0; + } else { + r->qualityMethod = 1; + } + + r->transit = newSpot->transit; + r->transitweak = newSpot->transitweak; + r->transitgrad = newSpot->transitgrad; + r->feather = newSpot->feather; + r->struc = newSpot->struc; + r->thresh = newSpot->thresh; + r->iter = newSpot->iter; + r->balan = newSpot->balan; + r->balanh = newSpot->balanh; + r->colorde = newSpot->colorde; + r->colorscope = newSpot->colorscope; + r->avoidrad = newSpot->avoidrad; + r->hishow = newSpot->hishow; + r->activ = newSpot->activ; + r->blwh = newSpot->blwh; + r->recurs = newSpot->recurs; + r->laplac = newSpot->laplac; + r->deltae = newSpot->deltae; + r->scopemask = newSpot->scopemask; + r->denoichmask = newSpot->denoichmask; + r->shortc = newSpot->shortc; + r->lumask = newSpot->lumask; + //r->savrest = newSpot->savrest; + + if (newSpot->complexMethod == "sim") { + r->complexMethod = 0; + } else if (newSpot->complexMethod == "mod") { + r->complexMethod = 1; + } else if (newSpot->complexMethod == "all") { + r->complexMethod = 2; + } + + if (newSpot->wavMethod == "D2") { + r->wavMethod = 0; + } else if (newSpot->wavMethod == "D4") { + r->wavMethod = 1; + } else if (newSpot->wavMethod == "D6") { + r->wavMethod = 2; + } else if (newSpot->wavMethod == "D10") { + r->wavMethod = 3; + } else if (newSpot->wavMethod == "D14") { + r->wavMethod = 4; + } + + expsettings->addControlSpot(r); + + // ProcParams update + pp->locallab.spots.push_back(*newSpot); + pp->locallab.selspot = pp->locallab.spots.size() - 1; + + // New created spot selection + expsettings->setSelectedSpot(pp->locallab.selspot); + + // Update Locallab tools GUI with new created spot + disableListener(); + + spotName = pp->locallab.spots.at(pp->locallab.selspot).name; + + for (auto tool : locallabTools) { + tool->read(pp, pedited); + } + + enableListener(); + + // Update tool list widget + toolNb = 0; + toollist->removeAllTool(); // Reset Locallab list firstly + + for (auto tool : locallabTools) { + toolNb++; + + if (!tool->isLocallabToolAdded()) { + toollist->addToolRow(tool->getToolName(), toolNb); + } + } + + if (pp->locallab.spots.size() == 1) { + setParamEditable(true); + } + + // Update default values according to selected spot + setDefaults(pp, pedited); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab + + break; + + case (ControlSpotPanel::SpotDeletion): // Spot deletion event + // Get deleted spot index in ProcParams and update it + spotIndex = expsettings->getSelectedSpot(); + + for (int i = 0; i < (int)pp->locallab.spots.size(); i++) { + if (i == spotIndex) { + // ProcParams update + pp->locallab.spots.erase(pp->locallab.spots.begin() + i); + expsettings->deleteControlSpot(spotIndex); + + // Select the first remaining spot before deleted one + if (pp->locallab.spots.size() > 0) { + for (int j = i - 1; j >= 0; j--) { + if (expsettings->setSelectedSpot(j)) { // True if an existing spot has been selected on controlspotpanel + pp->locallab.selspot = j; + + break; + } + } + } else { + // Reset selspot + pp->locallab.selspot = 0; + } + + // Update Locallab tools GUI with selected spot + disableListener(); + + if (pp->locallab.spots.size() > 0) { + spotName = pp->locallab.spots.at(pp->locallab.selspot).name; + } + + for (auto tool : locallabTools) { + tool->read(pp, pedited); + } + + enableListener(); + + // Update tool list widget + toolNb = 0; + toollist->removeAllTool(); // Reset Locallab list firstly + + for (auto tool : locallabTools) { + toolNb++; + + if (!tool->isLocallabToolAdded()) { + toollist->addToolRow(tool->getToolName(), toolNb); + } + } + + if (pp->locallab.spots.size() == 0) { + setParamEditable(false); + } + + // Update default values according to selected spot + setDefaults(pp, pedited); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab + + break; + } + } + + break; + + case (ControlSpotPanel::SpotSelection): // Spot selection event + pp->locallab.selspot = expsettings->getSelectedSpot(); + + // Update control spots and Locallab tools GUI with selected spot + expsettings->setSelectedSpot(pp->locallab.selspot); + disableListener(); + + if (pp->locallab.spots.size() > 0) { + spotName = pp->locallab.spots.at(pp->locallab.selspot).name; + } + + for (auto tool : locallabTools) { + tool->read(pp, pedited); + } + + enableListener(); + + // Update tool list widget + toolNb = 0; + toollist->removeAllTool(); // Reset Locallab list firstly + + for (auto tool : locallabTools) { + toolNb++; + + if (!tool->isLocallabToolAdded()) { + toollist->addToolRow(tool->getToolName(), toolNb); + } + } +/* + // Update locallab tools mask background + if (pp->locallab.selspot < (int)maskBackRef.size()) { + const double huer = maskBackRef.at(pp->locallab.selspot).huer; + const double lumar = maskBackRef.at(pp->locallab.selspot).lumar; + const double chromar = maskBackRef.at(pp->locallab.selspot).chromar; + const float fab = maskBackRef.at(pp->locallab.selspot).fab; + + for (auto tool : locallabTools) { + tool->refChanged(huer, lumar, chromar, fab); + } + } +*/ + // Update Locallab Retinex tool min/max + if (pp->locallab.selspot < (int)retiMinMax.size()) { + const double cdma = retiMinMax.at(pp->locallab.selspot).cdma; + const double cdmin = retiMinMax.at(pp->locallab.selspot).cdmin; + const double mini = retiMinMax.at(pp->locallab.selspot).mini; + const double maxi = retiMinMax.at(pp->locallab.selspot).maxi; + const double Tmean = retiMinMax.at(pp->locallab.selspot).Tmean; + const double Tsigma = retiMinMax.at(pp->locallab.selspot).Tsigma; + const double Tmin = retiMinMax.at(pp->locallab.selspot).Tmin; + const double Tmax = retiMinMax.at(pp->locallab.selspot).Tmax; + + expreti.updateMinMax(cdma, cdmin, mini, maxi, Tmean, Tsigma, Tmin, Tmax); + } + // Update Locallab Denoise tool lum/chro + if (pp->locallab.selspot < (int) denoiselc.size()) { + const double highres = denoiselc.at(pp->locallab.selspot).highres; + const double nres = denoiselc.at(pp->locallab.selspot).nres; + const double highres46 = denoiselc.at(pp->locallab.selspot).highres46; + const double nres46 = denoiselc.at(pp->locallab.selspot).nres46; + const double Lhighres = denoiselc.at(pp->locallab.selspot).Lhighres; + const double Lnres = denoiselc.at(pp->locallab.selspot).Lnres; + const double Lhighres46 = denoiselc.at(pp->locallab.selspot).Lhighres46; + const double Lnres46 = denoiselc.at(pp->locallab.selspot).Lnres46; + + expblur.updatedenlc(highres, nres, highres46, nres46, Lhighres, Lnres, Lhighres46, Lnres46); + } + + // Update default values according to selected spot + setDefaults(pp, pedited); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab + + break; + + case (ControlSpotPanel::SpotDuplication): // Spot duplication event + newSpot = nullptr; + spotIndex = expsettings->getSelectedSpot(); + + for (int i = 0; i < (int)pp->locallab.spots.size(); i++) { + if (i == spotIndex) { + newSpot = new LocallabParams::LocallabSpot(pp->locallab.spots.at(i)); + break; + } + } + + if (!newSpot) { + break; + } + + // Spot creation (initialization at currently selected spot) + r = new ControlSpotPanel::SpotRow(); + r->name = newSpot->name = newSpot->name + " - " + M("TP_LOCALLAB_DUPLSPOTNAME"); + r->isvisible = newSpot->isvisible; + + if (newSpot->shape == "ELI") { + r->shape = 0; + } else { + r->shape = 1; + } + + if (newSpot->prevMethod == "hide") { + r->prevMethod = 0; + } else { + r->prevMethod = 1; + } + + if (newSpot->spotMethod == "norm") { + r->spotMethod = 0; + } else if (newSpot->spotMethod == "exc") { + r->spotMethod = 1; + } else if (newSpot->spotMethod == "full") { + r->spotMethod = 2; + } + + r->sensiexclu = newSpot->sensiexclu; + r->structexclu = newSpot->structexclu; + + if (newSpot->shapeMethod == "IND") { + r->shapeMethod = 0; + } else if (newSpot->shapeMethod == "SYM") { + r->shapeMethod = 1; + } else if (newSpot->shapeMethod == "INDSL") { + r->shapeMethod = 2; + } else { + r->shapeMethod = 3; + } + //printf("n0=%f n1=%f n2=%f n3=%f\n", (double) newSpot->loc.at(0), (double) newSpot->loc.at(1), (double) newSpot->loc.at(2), (double) newSpot->loc.at(3)); + if (newSpot->avoidgamutMethod == "NONE") { + r->avoidgamutMethod = 0; + } else if (newSpot->avoidgamutMethod == "LAB") { + r->avoidgamutMethod = 1; + } else if (newSpot->avoidgamutMethod== "XYZ") { + r->avoidgamutMethod = 2; + } else if (newSpot->avoidgamutMethod== "XYZREL") { + r->avoidgamutMethod = 3; + } else if (newSpot->avoidgamutMethod== "MUNS") { + r->avoidgamutMethod = 4; + } + //printf("n0=%f n1=%f n2=%f n3=%f\n", (double) newSpot->loc.at(0), (double) newSpot->loc.at(1), (double) newSpot->loc.at(2), (double) newSpot->loc.at(3)); + + // Calculate spot size and center position according to preview area + if (provider && !batchMode) { + provider->getImageSize(imW, imH); + provider->getPreviewCenterPos(prX, prY); + provider->getPreviewSize(prW, prH); + + if (imW && imH) { // Image loaded + // Spot center position computation + newSpot->centerX = rtengine::LIM(int(int((double)prX - (double)imW / 2.) * 2000. / (double)imW), -1000, 1000); + newSpot->centerY = rtengine::LIM(int(int((double)prY - (double)imH / 2.) * 2000. / (double)imH), -1000, 1000); + // Ellipse/rectangle size computation + /* + newSpot->loc.at(0) = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->loc.at(0)); + newSpot->loc.at(1) = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->loc.at(1)); + newSpot->loc.at(2) = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->loc.at(2)); + newSpot->loc.at(3) = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->loc.at(3)); + */ + } + } + + if(r->spotMethod != 2) { + r->locX = newSpot->loc.at(0); + r->locXL = newSpot->loc.at(1); + r->locY = newSpot->loc.at(2); + r->locYT = newSpot->loc.at(3); + } else { + r->locX = 3000.; + r->locXL = 3000.; + r->locY = 3000.; + r->locYT = 3000.; + } + + r->centerX = newSpot->centerX; + r->centerY = newSpot->centerY; + + r->circrad = newSpot->circrad; + + if (newSpot->qualityMethod == "enh") { + r->qualityMethod = 0; + } else { + r->qualityMethod = 1; + } + + r->transit = newSpot->transit; + r->transitweak = newSpot->transitweak; + r->transitgrad = newSpot->transitgrad; + r->feather = newSpot->feather; + r->struc = newSpot->struc; + r->thresh = newSpot->thresh; + r->iter = newSpot->iter; + r->balan = newSpot->balan; + r->balanh = newSpot->balanh; + r->colorde = newSpot->colorde; + r->colorscope = newSpot->colorscope; + r->avoidrad = newSpot->avoidrad; + r->activ = newSpot->activ; + r->blwh = newSpot->blwh; + r->recurs = newSpot->recurs; + r->laplac = newSpot->laplac; + r->deltae = newSpot->deltae; + r->scopemask = newSpot->scopemask; + r->denoichmask = newSpot->denoichmask; + r->shortc = newSpot->shortc; + r->lumask = newSpot->lumask; + //r->savrest = newSpot->savrest; + + if (newSpot->complexMethod == "sim") { + r->complexMethod = 0; + } else if (newSpot->complexMethod == "mod") { + r->complexMethod = 1; + } else if (newSpot->complexMethod == "all") { + r->complexMethod = 2; + } + + if (newSpot->wavMethod == "D2") { + r->wavMethod = 0; + } else if (newSpot->wavMethod == "D4") { + r->wavMethod = 1; + } else if (newSpot->wavMethod == "D6") { + r->wavMethod = 2; + } else if (newSpot->wavMethod == "D10") { + r->wavMethod = 3; + } else if (newSpot->wavMethod == "D14") { + r->wavMethod = 4; + } + + expsettings->addControlSpot(r); + + // ProcParams update + pp->locallab.spots.push_back(*newSpot); + pp->locallab.selspot = pp->locallab.spots.size() - 1; + + + // New created spot selection + expsettings->setSelectedSpot(pp->locallab.selspot); + + // Update Locallab tools GUI with new created spot + disableListener(); + + spotName = pp->locallab.spots.at(pp->locallab.selspot).name; + + for (auto tool : locallabTools) { + tool->read(pp, pedited); + } + + enableListener(); + + // Update tool list widget + toolNb = 0; + toollist->removeAllTool(); // Reset Locallab list firstly + + for (auto tool : locallabTools) { + toolNb++; + + if (!tool->isLocallabToolAdded()) { + toollist->addToolRow(tool->getToolName(), toolNb); + } + } + + // Update default values according to selected spot + setDefaults(pp, pedited); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab + + break; + + case (ControlSpotPanel::SpotAllVisibilityChanged): // Event when updating visibility of all spots + r = expsettings->getSpot(expsettings->getSelectedSpot()); + + // ProcParams update + for (size_t i = 0; i < pp->locallab.spots.size(); i++) { + pp->locallab.spots.at(i).isvisible = r->isvisible; + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab + + break; + + default: // Spot or locallab GUI updated + if (pp->locallab.spots.size() > 0) { + r = expsettings->getSpot(expsettings->getSelectedSpot()); + + // ProcParams update + if (pp->locallab.selspot < (int)pp->locallab.spots.size()) { + // Control spot settings + pp->locallab.spots.at(pp->locallab.selspot).name = r->name; + pp->locallab.spots.at(pp->locallab.selspot).isvisible = r->isvisible; + + if (r->shape == 0) { + pp->locallab.spots.at(pp->locallab.selspot).shape = "ELI"; + } else { + pp->locallab.spots.at(pp->locallab.selspot).shape = "RECT"; + } + + if (r->prevMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).prevMethod = "hide"; + } else { + pp->locallab.spots.at(pp->locallab.selspot).prevMethod = "show"; + } + + + if (r->spotMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).spotMethod = "norm"; + } else if (r->spotMethod == 1){ + pp->locallab.spots.at(pp->locallab.selspot).spotMethod = "exc"; + } else if (r->spotMethod == 2) { + pp->locallab.spots.at(pp->locallab.selspot).spotMethod = "full"; + } + + pp->locallab.spots.at(pp->locallab.selspot).sensiexclu = r->sensiexclu; + pp->locallab.spots.at(pp->locallab.selspot).structexclu = r->structexclu; + + if (r->shapeMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).shapeMethod = "IND"; + } else if (r->shapeMethod == 1) { + pp->locallab.spots.at(pp->locallab.selspot).shapeMethod = "SYM"; + } else if (r->shapeMethod == 2) { + pp->locallab.spots.at(pp->locallab.selspot).shapeMethod = "INDSL"; + } else { + pp->locallab.spots.at(pp->locallab.selspot).shapeMethod = "SYMSL"; + } + + if (r->avoidgamutMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).avoidgamutMethod = "NONE"; + } else if (r->avoidgamutMethod == 1) { + pp->locallab.spots.at(pp->locallab.selspot).avoidgamutMethod = "LAB"; + } else if (r->avoidgamutMethod == 2) { + pp->locallab.spots.at(pp->locallab.selspot).avoidgamutMethod = "XYZ"; + } else if (r->avoidgamutMethod == 3) { + pp->locallab.spots.at(pp->locallab.selspot).avoidgamutMethod = "XYZREL"; + } else if (r->avoidgamutMethod == 4) { + pp->locallab.spots.at(pp->locallab.selspot).avoidgamutMethod = "MUNS"; + } + + pp->locallab.spots.at(pp->locallab.selspot).loc.at(0) = r->locX; + pp->locallab.spots.at(pp->locallab.selspot).loc.at(1) = r->locXL; + pp->locallab.spots.at(pp->locallab.selspot).loc.at(2) = r->locY; + pp->locallab.spots.at(pp->locallab.selspot).loc.at(3) = r->locYT; + pp->locallab.spots.at(pp->locallab.selspot).centerX = r->centerX; + pp->locallab.spots.at(pp->locallab.selspot).centerY = r->centerY; + pp->locallab.spots.at(pp->locallab.selspot).circrad = r->circrad; + + if (r->qualityMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).qualityMethod = "enh"; + } else { + pp->locallab.spots.at(pp->locallab.selspot).qualityMethod = "enhden"; + } + + pp->locallab.spots.at(pp->locallab.selspot).transit = r->transit; + pp->locallab.spots.at(pp->locallab.selspot).transitweak = r->transitweak; + pp->locallab.spots.at(pp->locallab.selspot).transitgrad = r->transitgrad; + pp->locallab.spots.at(pp->locallab.selspot).feather = r->feather; + pp->locallab.spots.at(pp->locallab.selspot).struc = r->struc; + pp->locallab.spots.at(pp->locallab.selspot).thresh = r->thresh; + pp->locallab.spots.at(pp->locallab.selspot).iter = r->iter; + pp->locallab.spots.at(pp->locallab.selspot).balan = r->balan; + pp->locallab.spots.at(pp->locallab.selspot).balanh = r->balanh; + pp->locallab.spots.at(pp->locallab.selspot).colorde = r->colorde; + pp->locallab.spots.at(pp->locallab.selspot).colorscope = r->colorscope; + pp->locallab.spots.at(pp->locallab.selspot).avoidrad = r->avoidrad; + pp->locallab.spots.at(pp->locallab.selspot).hishow = r->hishow; + pp->locallab.spots.at(pp->locallab.selspot).activ = r->activ; + pp->locallab.spots.at(pp->locallab.selspot).blwh = r->blwh; + pp->locallab.spots.at(pp->locallab.selspot).recurs = r->recurs; + pp->locallab.spots.at(pp->locallab.selspot).laplac = r->laplac; + pp->locallab.spots.at(pp->locallab.selspot).deltae = r->deltae; + pp->locallab.spots.at(pp->locallab.selspot).scopemask = r->scopemask; + pp->locallab.spots.at(pp->locallab.selspot).denoichmask = r->denoichmask; + pp->locallab.spots.at(pp->locallab.selspot).shortc = r->shortc; + pp->locallab.spots.at(pp->locallab.selspot).lumask = r->lumask; + //pp->locallab.spots.at(pp->locallab.selspot).savrest = r->savrest; + + if (r->complexMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).complexMethod = "sim"; + } else if (r->complexMethod == 1) { + pp->locallab.spots.at(pp->locallab.selspot).complexMethod = "mod"; + } else if (r->complexMethod == 2) { + pp->locallab.spots.at(pp->locallab.selspot).complexMethod = "all"; + } + + if (r->wavMethod == 0) { + pp->locallab.spots.at(pp->locallab.selspot).wavMethod = "D2"; + } else if (r->wavMethod == 1) { + pp->locallab.spots.at(pp->locallab.selspot).wavMethod = "D4"; + } else if (r->wavMethod == 2) { + pp->locallab.spots.at(pp->locallab.selspot).wavMethod = "D6"; + } else if (r->wavMethod == 3) { + pp->locallab.spots.at(pp->locallab.selspot).wavMethod = "D10"; + } else if (r->wavMethod == 4) { + pp->locallab.spots.at(pp->locallab.selspot).wavMethod = "D14"; + } + } + + for (auto tool : locallabTools) { + tool->write(pp, pedited); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab + } + } +} + +/* + * Note: + * By default, this function is called when a new image/profile is loaded (after read function). In this case, + * if there is at least one spot, default values are set to selected spot ones. + * To keep having default values according to selected spot, this function shall also be called in the following + * situations (after having called write function for controlspotpanel): + * - After spot creation + * - After spot deletion + * - After spot selection + * - After spot duplication + */ +void Locallab::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + // Set default values in spot panel control + expsettings->setDefaults(defParams, pedited); + + // Set default values in Locallab tools + for (auto tool : locallabTools) { + tool->setDefaults(defParams, pedited); + } +} + +void Locallab::setListener(ToolPanelListener* tpl) +{ + this->listener = tpl; + + // Set listener for spot control panel + expsettings->setListener(tpl); + + // Set listener for locallab tools + for (auto tool : locallabTools) { + tool->setListener(tpl); + } +} + +void Locallab::minmaxChanged(const std::vector &minmax, int selspot) +{ + // Saving transmitted min/max data + retiMinMax = minmax; + + // Update Locallab Retinex tool min/max + if (selspot < (int)retiMinMax.size()) { + const double cdma = retiMinMax.at(selspot).cdma; + const double cdmin = retiMinMax.at(selspot).cdmin; + const double mini = retiMinMax.at(selspot).mini; + const double maxi = retiMinMax.at(selspot).maxi; + const double Tmean = retiMinMax.at(selspot).Tmean; + const double Tsigma = retiMinMax.at(selspot).Tsigma; + const double Tmin = retiMinMax.at(selspot).Tmin; + const double Tmax = retiMinMax.at(selspot).Tmax; + + expreti.updateMinMax(cdma, cdmin, mini, maxi, Tmean, Tsigma, Tmin, Tmax); + } +} + +void Locallab::denChanged(const std::vector &denlc, int selspot) +{ + // Saving transmitted min/max data + denoiselc = denlc; + + //Update Locallab Denoise tool lum chro + if (selspot < (int) denoiselc.size()) { + const double highres = denoiselc.at(selspot).highres; + const double nres = denoiselc.at(selspot).nres; + const double highres46 = denoiselc.at(selspot).highres46; + const double nres46 = denoiselc.at(selspot).nres46; + const double Lhighres = denoiselc.at(selspot).Lhighres; + const double Lnres = denoiselc.at(selspot).Lnres; + const double Lhighres46 = denoiselc.at(selspot).Lhighres46; + const double Lnres46 = denoiselc.at(selspot).Lnres46; + + expblur.updatedenlc(highres, nres, highres46, nres46, Lhighres, Lnres, Lhighres46, Lnres46); + } + +} + + +void Locallab::logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1) +{ + // Update Locallab Log Encoding and Ciecam accordingly + if(autocomput) { + explog.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + } + if(autocie) { + expcie.updateAutocompute(blackev, whiteev, sourceg, sourceab, targetg, jz1); + } + +} +void Locallab::refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot) +{ + const double huer = huerefp[selspot]; + const double lumar = lumarefp[selspot]; + const double chromar = chromarefp[selspot]; + const float fab = fabrefp[selspot]; + for (auto tool : locallabTools) { + tool->refChanged(huer, lumar, chromar, fab); + } +} +/* +void Locallab::refChanged(const std::vector &ref, int selspot) +{ + // Saving transmitted mask background data + maskBackRef = ref; + + // Update locallab tools mask background + if (selspot < (int)maskBackRef.size()) { + const double huer = maskBackRef.at(selspot).huer; + const double lumar = maskBackRef.at(selspot).lumar; + const double chromar = maskBackRef.at(selspot).chromar; + const float fab = maskBackRef.at(selspot).fab; + + for (auto tool : locallabTools) { + tool->refChanged(huer, lumar, chromar, fab); + } + } +} +*/ +void Locallab::resetMaskVisibility() +{ + // Indicate to spot control panel that no more mask preview is active + expsettings->setMaskPrevActive(false); + + // Reset deltaE preview + expsettings->resetDeltaEPreview(); + + // Reset mask preview for all Locallab tools + for (auto tool : locallabTools) { + tool->resetMaskView(); + } +} + +Locallab::llMaskVisibility Locallab::getMaskVisibility() const +{ + // Get deltaE preview state + const bool prevDeltaE = expsettings->isDeltaEPrevActive(); + + // Get mask preview from Locallab tools + int colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask, cieMask; + + for (auto tool : locallabTools) { + tool->getMaskView(colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask, cieMask); + } + + // Indicate to spot control panel if one mask preview is active + const bool isMaskActive = (colorMask == 0) || (colorMaskinv == 0) || (expMask == 0) || (expMaskinv == 0) || + (shMask == 0) || (shMaskinv == 0) || (vibMask == 0) || (softMask == 0) || + (blMask == 0) || (tmMask == 0) || (retiMask == 0) || (sharMask == 0) || + (lcMask == 0) || (cbMask == 0) || (logMask == 0) || (maskMask == 0) || (cieMask == 0); + expsettings->setMaskPrevActive(isMaskActive); + + return {prevDeltaE, colorMask, colorMaskinv, expMask, expMaskinv, shMask, shMaskinv, vibMask, softMask, blMask, tmMask, retiMask, sharMask, lcMask, cbMask, logMask, maskMask, cieMask}; +} + +//void Locallab::resetshowPressed() +//{ +// // Raise event to reset mask +// if (listener) { +// listener->panelChanged(Evlocallabshowreset, ""); +// } +//} + +void Locallab::setEditProvider(EditDataProvider * provider) +{ + expsettings->setEditProvider(provider); +} + +void Locallab::subscribe() +{ + expsettings->subscribe(); +} + +void Locallab::unsubscribe() +{ + expsettings->unsubscribe(); +} + +void Locallab::enabledChanged() +{ + if (listener) { + if (getEnabled()) { + listener->panelChanged(EvlocallabEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvlocallabEnabled, M("GENERAL_DISABLED")); + } + } +} + +void Locallab::autoOpenCurve() +{ + // TODO Actually autoOpenCurve only considers linearity state of selected spot curve +} + +void Locallab::foldAllButOne(LocallabTool* except) +{ + for (auto tool : locallabTools) { + if (tool != except) { + // All other tool expanders are fold + tool->setExpanded(false); + } else { + // If fold, selected tool expander is unfold + if (!tool->getExpanded()) { + tool->setExpanded(true); + } + } + } +} + +void Locallab::openAllTools() +{ + // Set default visibility for settings panel sub-expanders + expsettings->setDefaultExpanderVisibility(); + + for (auto tool : locallabTools) { + tool->setExpanded(true); + + // Set default visibility for tool sub-expanders + tool->setDefaultExpanderVisibility(); + } +} + +void Locallab::updateShowtooltipVisibility(bool showtooltip) +{ + for (auto tool : locallabTools) { + tool->updateAdviceTooltips(showtooltip); + } +} + +void Locallab::spotNameChanged(const Glib::ustring &newName) +{ + spotName = newName; +} + +void Locallab::addTool(Gtk::Box* where, LocallabTool* tool) +{ + tool->getExpander()->setLevel(3); + where->pack_start(*tool->getExpander(), false, false); + locallabTools.push_back(tool); + tool->setLocallabToolListener(this); + tool->setSpotNameSource(&spotName); +} + +void Locallab::setParamEditable(bool cond) +{ + // Update params editable state for controlspotpanel + expsettings->setParamEditable(cond); // TODO Move this code to controlspotpanel.cc when there is zero spot + + // Enable/disable possibility to add Locallab tool + toollist->set_sensitive(cond); + + // Remove all Locallab tool (without raising event) only if cond is false + if (!cond) { + for (auto tool : locallabTools) { + tool->removeLocallabTool(false); + } + } +} + +void Locallab::resetToolMaskView() +{ + // Reset mask view GUI for all other Locallab tools + for (auto tool : locallabTools) { + tool->resetMaskView(); + } +} + +void Locallab::resetOtherMaskView(LocallabTool* current) +{ + // Reset deltaE preview + expsettings->resetDeltaEPreview(); + + // Reset mask view GUI for all other Locallab tools except current + for (auto tool : locallabTools) { + if (tool != current) { + tool->resetMaskView(); + } + } +} + +void Locallab::toolRemoved(LocallabTool* current) +{ + // Update tool list widget according to removed tool + int toolNb = 0; + + for (auto tool : locallabTools) { + toolNb++; + + if (tool == current) { + toollist->addToolRow(tool->getToolName(), toolNb); + } + } +} + +void Locallab::locallabToolToAdd(const Glib::ustring &toolname) +{ + for (auto tool : locallabTools) { + if (tool->getToolName() == toolname) { + // Set expanders visibility default state when adding tool + tool->setExpanded(true); + tool->setDefaultExpanderVisibility(); + + // Add tool + tool->addLocallabTool(true); + } + } +} diff --git a/rtgui/locallab.h b/rtgui/locallab.h new file mode 100644 index 000000000..e39f213cc --- /dev/null +++ b/rtgui/locallab.h @@ -0,0 +1,227 @@ +/* + * 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 . + * 2017 Jacques Desmis + * 2019 Pierre Cabrera + */ +#ifndef _LOCALLAB_H_ +#define _LOCALLAB_H_ + +#pragma once + +#include "controlspotpanel.h" +#include "locallabtools.h" + +/* ==== LocallabToolListListener ==== */ +class LocallabToolList; +class LocallabToolListListener +{ +public: + LocallabToolListListener() {}; + virtual ~LocallabToolListListener() {}; + + virtual void locallabToolToAdd(const Glib::ustring &toolname) = 0; +}; + +/* ==== LocallabToolList ==== */ +class LocallabToolList: + public Gtk::Box +{ +private: + // Tree model to manage ComboBox rows + class ToolRow: + public Gtk::TreeModel::ColumnRecord + { + public: + Gtk::TreeModelColumn id; + Gtk::TreeModelColumn name; + + ToolRow() + { + add(id); + add(name); + } + }; + + // Tool list GUI widgets + MyComboBox* const list; + sigc::connection listConn; + ToolRow toolRow; + Glib::RefPtr listTreeModel; + + // Tool list listener + LocallabToolListListener* listListener; + +public: + LocallabToolList(); + + // Setter for tool list listener + void setLocallabToolListListener(LocallabToolListListener* ltll) + { + listListener = ltll; + } + + // Tool list management function + void addToolRow(const Glib::ustring &toolname, const int id); + void removeToolRow(const Glib::ustring &toolname); + void removeAllTool(); + +private: + // Tool list event management function + void toolRowSelected(); +}; + +/* ==== Locallab ==== */ +class Locallab : + public ToolParamBlock, + public FoldableToolPanel, + public rtengine::LocallabListener, + public ControlPanelListener, + public LocallabToolListener, + public LocallabToolListListener +{ +private: + // Spot control panel widget + ControlSpotPanel* const expsettings; + + // Tool list widget + LocallabToolList* const toollist; + + // Locallab tool widgets + LocallabColor expcolor; + LocallabExposure expexpose; + LocallabShadow expshadhigh; + LocallabVibrance expvibrance; + LocallabSoft expsoft; + LocallabBlur expblur; + LocallabTone exptonemap; + LocallabRetinex expreti; + LocallabSharp expsharp; + LocallabContrast expcontrast; + LocallabCBDL expcbdl; + LocallabLog explog; + LocallabMask expmask; + Locallabcie expcie; + + std::vector locallabTools; + + // Locallab tools mask background management data + std::vector retiMinMax; + + // Locallab tools mask background management data + std::vector denoiselc; + + // Locallab tools mask background management data + std::vector maskBackRef; + + // Other widgets + //Gtk::Button* const resetshowButton; + + Glib::ustring spotName; + +public: + static const Glib::ustring TOOL_NAME; + + Locallab(); + + // FoldableToolPanel management functions + 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 setListener(ToolPanelListener* tpl) override; + + // Locallab Retinex tool min/man management function + void minmaxChanged(const std::vector &minmax, int selspot) override; + + //Locallab denoise + // Locallab Retinex tool min/man management function + void denChanged(const std::vector &denlc, int selspot) override; + + // Locallab Log Encoding autocompute function + void logencodChanged(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const bool autocomput, const bool autocie, const float jz1) override; + + // Locallab tools mask background management function +// void refChanged(const std::vector &ref, int selspot) override; + void refChanged2(float *huerefp, float *chromarefp, float *lumarefp, float *fabrefp, int selspot)override; + + // Mask visibility management functions + struct llMaskVisibility { + bool previewDeltaE; + int colorMask; + int colorMaskinv; + int expMask; + int expMaskinv; + int SHMask; + int SHMaskinv; + int vibMask; + int softMask; + int blMask; + int tmMask; + int retiMask; + int sharMask; + int lcMask; + int cbMask; + int logMask; + int maskMask; + int cieMask; + }; + + void resetMaskVisibility(); + llMaskVisibility getMaskVisibility() const; + + // Other widgets event functions + //void resetshowPressed(); + + // EditProvider management function + void setEditProvider(EditDataProvider* provider) override; + void subscribe(); + void unsubscribe(); + + // FoldableToolPanel event function + void enabledChanged() override; + + // Curve management function + void autoOpenCurve() override; + + // Locallab tools expanders management functions + void foldAllButOne(LocallabTool* except); + void openAllTools(); + + // Locallab tools advice tooltips management function + void updateShowtooltipVisibility(bool showtooltip); + +private: + // Locallab tools management functions + void addTool(Gtk::Box* where, LocallabTool* tool); + + // Locallab GUI management function + void setParamEditable(bool cond); + + // ControlSpotListener function + void resetToolMaskView() override; + void spotNameChanged(const Glib::ustring &newName) override; + + // LocallabToolListener function + void resetOtherMaskView(LocallabTool* current) override; + void toolRemoved(LocallabTool* current) override; + + // LocallabToolListListener function + void locallabToolToAdd(const Glib::ustring &toolname) override; +}; + +#endif diff --git a/rtgui/locallabtools.cc b/rtgui/locallabtools.cc new file mode 100644 index 000000000..8bf88724c --- /dev/null +++ b/rtgui/locallabtools.cc @@ -0,0 +1,8709 @@ +/* + * + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2010 Gabor Horvath frame +fft * + * 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 . + * 2019-2020 Pierre Cabrera + */ +#include "locallabtools.h" + +#include "options.h" +#include "../rtengine/procparams.h" +#include "locallab.h" +#include "thresholdadjuster.h" +#include "rtimage.h" +#include "../rtengine/color.h" + +#define MINRAD 1.5 +#define MAXRAD 10000 +#define CENTERRAD 100 +#define MINCHRO 0. +#define MAXCHRO 150. +#define MAXCHROCC 100. +#define MINEXP -1.5 +#define MAXEXP 1.5 + +using namespace rtengine; +using namespace procparams; + +extern Options options; +static double blurSlider2radius(double sval) +{ + // Slider range: 0 - 1000 + double radius; + + if (sval <= 100) { + // Linear below center-temp + radius = MINRAD + (sval / 100.0) * (CENTERRAD - MINRAD); + } else { + const double slope = (double)(CENTERRAD - MINRAD) / (MAXRAD - CENTERRAD); + double x = (sval - 100) / 100; // x range: 0 - 1 + double y = x * slope + (1.0 - slope) * pow(x, 4.0); + radius = CENTERRAD + y * (MAXRAD - CENTERRAD); + } + + if (radius < MINRAD) { + radius = MINRAD; + } + + if (radius > MAXRAD) { + radius = MAXRAD; + } + + return radius; +} + +static double blurRadius2Slider(double radius) +{ + double sval; + + if (radius <= CENTERRAD) { + sval = ((radius - MINRAD) / (CENTERRAD - MINRAD)) * 100.0; + } else { + const double slope = (double)(CENTERRAD - MINRAD) / (MAXRAD - CENTERRAD); + const double y = (radius - CENTERRAD) / (MAXRAD - CENTERRAD); + double x = pow(y, 0.25); // Rough guess of x, will be a little lower + double k = 0.1; + bool add = true; + + // The y=f(x) function is a mess to invert, therefore we have this trial-refinement loop instead. + // From tests, worst case is about 20 iterations, i.e. no problem + for (;;) { + double y1 = x * slope + (1.0 - slope) * pow(x, 4.0); + + if (100. * fabs(y1 - y) < 0.1) { + break; + } + + if (y1 < y) { + if (!add) { + k /= 2; + } + + x += k; + add = true; + } else { + if (add) { + k /= 2; + } + + x -= k; + add = false; + } + } + + sval = 100.0 + x * 100.0; + } + + if (sval < 0.) { + sval = 0.; + } + + if (sval > 10000.) { + sval = 10000.; + } + + return sval; +} + +/* ==== LocallabTool ==== */ +LocallabTool::LocallabTool(Gtk::Box* content, Glib::ustring toolName, Glib::ustring UILabel, bool need11, bool needMode): + ToolPanel(toolName, need11), + + // LocallabTool parameters + needMode(needMode), + isLocActivated(false), + locToolListener(nullptr), + + // LocallabTool generic widgets + complexity(Gtk::manage(new MyComboBoxText())) +{ + // Create expander title bar + Gtk::Box *titVBox; + titVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + titVBox->set_spacing(2); + + Gtk::Box* const titleBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const titleLabel = Gtk::manage(new Gtk::Label()); + titleLabel->set_markup(Glib::ustring("") + escapeHtmlChars(UILabel) + Glib::ustring("")); + titleLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + titleBox->pack_start(*titleLabel, Gtk::PACK_EXPAND_WIDGET, 0); + + Gtk::EventBox* const removeEvBox = Gtk::manage(new Gtk::EventBox()); // Glue to manage mouse clicking event on remove image + removeEvBox->set_can_focus(false); + removeEvBox->set_above_child(false); // To have priority over expander title bar when mouse clicking on remove image + removeEvBox->signal_button_release_event().connect(sigc::mem_fun(this, &LocallabTool::on_remove_change)); + RTImage* const removeImage = Gtk::manage(new RTImage("cancel-small.png")); + removeEvBox->add(*removeImage); + titleBox->pack_end(*removeEvBox, Gtk::PACK_SHRINK, 1); + if (needMode) { + complexity->append(M("TP_LOCALLAB_MODE_EXPERT")); + complexity->append(M("TP_LOCALLAB_MODE_NORMAL")); + complexity->append(M("TP_LOCALLAB_MODE_SIMPLE")); + complexity->set_active(2); + complexityConn = complexity->signal_changed().connect(sigc::mem_fun(*this, &LocallabTool::complexityModeChanged)); + } + + Gtk::Separator* const separator = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + titleBox->pack_end(*separator, Gtk::PACK_SHRINK, 0); + + if (need100Percent) { + RTImage* const titleImage = Gtk::manage(new RTImage("one-to-one-small.png")); + titleImage->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP")); + titleBox->pack_end(*titleImage, Gtk::PACK_SHRINK, 0); + } + titVBox->pack_start(*titleBox, Gtk::PACK_SHRINK, 1); + titVBox->pack_start(*complexity, Gtk::PACK_SHRINK, 1); + + exp = Gtk::manage(new MyExpander(true, titVBox)); + exp->signal_button_release_event().connect_notify(sigc::mem_fun(this, &LocallabTool::foldThemAll)); + enaExpConn = exp->signal_enabled_toggled().connect(sigc::mem_fun(*this, &LocallabTool::enabledChanged)); + + ToolParamBlock* const totalBox = Gtk::manage(new ToolParamBlock()); + + // Create panel for specific widget tools + totalBox->pack_start(*content, Gtk::PACK_SHRINK, 0); + exp->add(*totalBox, false); +} + +LocallabTool::~LocallabTool() +{ + idle_register.destroy(); +} + +Glib::ustring LocallabTool::getSpotName() const +{ + if (spotNameSource) { + return *spotNameSource; + } + return ""; +} + +void LocallabTool::addLocallabTool(bool raiseEvent) +{ + exp->set_visible(true); + + // Raise event if required + if (raiseEvent) { // Note: Event is only raised when a tool is added by user + // By default, activate newly added tool + enaExpConn.block(true); + exp->setEnabled(true); + enaExpConn.block(false); + + if (needMode) { + // Set complexity mode according to chosen default one + complexityConn.block(true); + complexity->set_active(options.complexity); + complexityConn.block(false); + + // Update GUI accordingly + if (complexity->get_active_row_number() == Normal) { + convertParamToNormal(); + updateGUIToMode(Normal); + } else if (complexity->get_active_row_number() == Expert) { + updateGUIToMode(Expert); + } else if (complexity->get_active_row_number() == Simple) { + convertParamToNormal(); + updateGUIToMode(Normal); + convertParamToSimple(); + updateGUIToMode(Simple); + } + + } + + if (listener) { + listener->panelChanged(EvlocallabToolAdded, + toolName + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabTool::removeLocallabTool(bool raiseEvent) +{ + exp->set_visible(false); + + // Inform LocallabToolListener to update Locallab tools list + if (locToolListener) { + locToolListener->toolRemoved(this); + } + + if (exp->getEnabled() || isMaskViewActive()) { + // Disable tool while removing it + disableListener(); + exp->setEnabled(false); + enableListener(); + // Note: Mask views are all reset when removing tool (in toolpanelcoord.cc) + + // Raise event if required refreshing image + if (raiseEvent && listener) { + listener->panelChanged(EvlocallabToolRemovedWithRefresh, + toolName + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } else { + // Raise event if required without refreshing image + if (raiseEvent && listener) { + listener->panelChanged(EvlocallabToolRemovedWithoutRefresh, + toolName + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +bool LocallabTool::isLocallabToolAdded() +{ + return exp->get_visible(); +} + +void LocallabTool::refChanged(const double huer, const double lumar, const double chromar, const float fab) +{ + // Hue reference normalization (between 0 and 1) + double normHuer = huer; + float h = Color::huelab_to_huehsv2(normHuer); + // h += 1.f / 6.f; + + if (h > 1.f) { + h -= 1.f; + } + + normHuer = h; + + double normHuerjz = huer; + + float hz = Color::huejz_to_huehsv2(normHuerjz); + + if (hz > 1.f) { + hz -= 1.f; + } + normHuerjz = hz; + + // Luma reference normalization (between 0 and 1) + const double normLumar = lumar / 100.f; + + // Chroma reference normalization (between 0 and 1) + const double corfap = (65535.) / (double) fab; + //printf("FAB=%f corfap=%f chromar=%f chroret=%f\n", (double) fab, corfap, chromar, (double) corfap * (chromar / 195.f)); + const double normChromar = LIM01(corfap * (chromar / 195.f));//195 a little more than 128 * 1.414 = 181 + + // Update mask curve backgrounds + updateMaskBackground(normChromar, normLumar, normHuer, normHuerjz); +} + +void LocallabTool::colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) +{ + float R = 0.f; + float G = 0.f; + float B = 0.f; + float x; + + if (elemType == ColorCaller::CCET_VERTICAL_BAR) { + valY = 0.5; + } + + switch (callerId) { + case 1: // Mask CC shape (bottom bar) + Color CC/LC shape (left bar) + Color::hsv2rgb01(float(valY), float(valX), 0.5f, R, G, B); + + break; + + case 2: // Mask HH shape (main curve and bottom bar) + x = valX - 1.f / 6.f; + + if (x < 0.f) { + x += 1.f; + } + + x = log2lin(x, 3.f); + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + + break; + + case 3: // Color LH/HH shape (main curve) + Color::hsv2rgb01(float (valX), float (valY), 0.5f, R, G, B); + + break; + + case 4: // Color CC/LC shape (bottom bar) + const float value = (1.f - 0.7f) * float (valX) + 0.7f; + // Whole hue range + // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) + Color::hsv2rgb01(float (valY), float (valX), value, R, G, B); + } + + caller->ccRed = double (R); + caller->ccGreen = double (G); + caller->ccBlue = double (B); +} + +void LocallabTool::disableListener() +{ + ToolPanel::disableListener(); + + enaExpConn.block(true); + + if (needMode) { + complexityConn.block(true); + } +} +void LocallabTool::enableListener() +{ + ToolPanel::enableListener(); + + enaExpConn.block(false); + + if (needMode) { + complexityConn.block(false); + } +} + +bool LocallabTool::on_remove_change(GdkEventButton* event) +{ + if (event->button == GDK_BUTTON_PRIMARY) { + // Remove Locallab tool raising an event + removeLocallabTool(true); + } + + return true; // No event propagation further (to avoid closing expander when mouse clicking on remove image) +} + +void LocallabTool::foldThemAll(GdkEventButton* event) +{ + if (event->button == GDK_BUTTON_SECONDARY) { + if (locToolListener) { + (static_cast(locToolListener))->foldAllButOne(this); + } + } +} + +void LocallabTool::complexityModeChanged() +{ + if (complexity->get_active_row_number() == Simple) { // New selected mode is Simple one + const bool maskPreviewActivated = isMaskViewActive(); + + // Convert tool widget parameters + convertParamToNormal(); // From Expert mode to Normal mode + convertParamToSimple(); // From Normal mode to Simple mode + // Update GUI based on new mode + updateGUIToMode(Simple); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_SIMPLE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } else if (complexity->get_active_row_number() == Normal) { // New selected mode is Normal one + // Convert tool widget parameters + convertParamToNormal(); + // Update GUI based on new mode + updateGUIToMode(Normal); + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_NORMAL") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } else if (complexity->get_active_row_number() == Expert) { // New selected mode is Expert one + // Update GUI based on new mode + updateGUIToMode(Expert); + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_EXPERT") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +/* ==== LocallabColor ==== */ +LocallabColor::LocallabColor(): + LocallabTool(this, M("TP_LOCALLAB_COLOR_TOOLNAME"), M("TP_LOCALLAB_COFR"), false), + + // Color & Light specific widgets + lumFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LUMFRA")))), + reparcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + gamc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3.0, 0.05, 1.))), + lightness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTNESS"), -100, 500, 1, 0))), + contrast(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTRAST"), -100, 100, 1, 0))), + chroma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMA"), -100, 150, 1, 0))), + curvactiv(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_CURV")))), + gridFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRID")))), + labgrid(Gtk::manage(new LabGrid(EvLocallabLabGridValue, M("TP_LOCALLAB_LABGRID_VALUES"), true, false))), + gridMethod(Gtk::manage(new MyComboBoxText())), + strengthgrid(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRGRID"), 0, 100, 1, 30))), + sensi(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 15))), + structcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL1"), 0, 100, 1, 0))), + blurcolde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), + softradiuscol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), + exprecov(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablec(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthresc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decayc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + invers(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), + expgradcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), + strcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRLUM"), -4., 4., 0.05, 0.))), + strcolab(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRCHRO"), -6., 6., 0.05, 0.))), + strcolh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRHUE"), -6., 6., 0.05, 0.))), + angcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + expcurvcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPCURV")))), + labqualcurv(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_QUALCURV_METHOD") + ":"))), + qualitycurveMethod(Gtk::manage(new MyComboBoxText())), + llCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_LUM"))), + llshape(static_cast(llCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + ccshape(static_cast(llCurveEditorG->addCurve(CT_Diagonal, "C(C)"))), + clCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_CH"))), + clshape(static_cast(clCurveEditorG->addCurve(CT_Diagonal, "C(L)"))), + lcshape(static_cast(clCurveEditorG->addCurve(CT_Diagonal, "L(C)"))), + HCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_HLH"))), + LHshape(static_cast(HCurveEditorG->addCurve(CT_Flat, "L(h)", nullptr, false, true))), + H3CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_HLH"))), + CHshape(static_cast(H3CurveEditorG->addCurve(CT_Flat, "C(h)", nullptr, false, true))), + H2CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_HLH"))), + HHshape(static_cast(H2CurveEditorG->addCurve(CT_Flat, "h(h)", nullptr, false, true))), + rgbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_RGB"))), + toneMethod(Gtk::manage(new MyComboBoxText())), + rgbshape(static_cast(rgbCurveEditorG->addCurve(CT_Diagonal, "", toneMethod))), + special(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SPECIAL")))), + expmaskcol1(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWC1")))), + merMethod(Gtk::manage(new MyComboBoxText())), + mask7(Gtk::manage(new ToolParamBlock())), + mergecolMethod(Gtk::manage(new MyComboBoxText())), + mercol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MERDCOL"), 0.0, 100.0, 0.5, 18.))), + opacol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OPACOL"), 0.0, 100.0, 0.5, 60.))), + conthrcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTTHR"), 0.0, 100.0, 0.5, 0.))), + gridmerFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABGRIDMERG")))), + labgridmerg(Gtk::manage(new LabGrid(EvLocallabLabGridmergValue, M("TP_LOCALLAB_LABGRID_VALUES"), false))), + merlucol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MERLUCOL"), 0.0, 100.0, 0.5, 32., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + expmaskcol(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWC")))), + mergecolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGECOLFRA")))), + showmaskcolMethod(Gtk::manage(new MyComboBoxText())), + showmaskcolMethodinv(Gtk::manage(new MyComboBoxText())), + enaColorMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), +// maskCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASKCOL"))), + maskCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir,"", 1)), + CCmaskshape(static_cast(maskCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskshape(static_cast(maskCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskshape(static_cast(maskCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + struFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABSTRUM")))), + strumaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUMASKCOL"), 0., 200., 0.1, 0.))), + toolcol(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TOOLCOL")))), + blurFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABBLURM")))), + fftColorMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTCOL_MASK")))), + contcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTCOL"), 0., 200., 0.5, 0.))), + blurcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURCOL"), 0.2, 100., 0.5, 0.2))), + blendmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + toolcolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), + toolcolFrame2(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK_2")))), + radmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + shadmaskcol(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHAMASKCOL"), 0, 100, 1, 0))), + // maskHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASKH"))), + maskHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "")), + HHhmaskshape(static_cast(maskHCurveEditorG->addCurve(CT_Flat, "h(h)", nullptr, false, true))), + mask2CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmaskshape(static_cast(mask2CurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + mask2CurveEditorGwav(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVMASK"))), + LLmaskcolshapewav(static_cast(mask2CurveEditorGwav->addCurve(CT_Flat, "L(L)", nullptr, false, false))), + csThresholdcol(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 0, 9, 0, 0, 6, 5, 0, false))) +{ + + set_orientation(Gtk::ORIENTATION_VERTICAL); + + float R, G, B; + + std::vector six_shape; + + for (int i = 0; i < 6; i++) { + const float x = static_cast(i) * (1.f / 6.f); + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + six_shape.emplace_back(x, R, G, B); + } + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Color & Light specific widgets + lumFrame->set_label_align(0.025, 0.5); + + lightness->setAdjusterListener(this); + + gamc->setAdjusterListener(this); + + reparcol->setAdjusterListener(this); + + contrast->setAdjusterListener(this); + + chroma->setAdjusterListener(this); + + curvactivConn = curvactiv->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::curvactivChanged)); + + gridFrame->set_label_align(0.025, 0.5); + + gridMethod->append(M("TP_LOCALLAB_GRIDONE")); + gridMethod->append(M("TP_LOCALLAB_GRIDTWO")); + gridMethod->set_active(0); + gridMethodConn = gridMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabColor::gridMethodChanged)); + + strengthgrid->setAdjusterListener(this); + + sensi->setAdjusterListener(this); + + structcol->setAdjusterListener(this); + + blurcolde->setAdjusterListener(this); + + softradiuscol->setLogScale(10, 0); + softradiuscol->setAdjusterListener(this); + recothresc->setAdjusterListener(this); + lowthresc->setAdjusterListener(this); + higthresc->setAdjusterListener(this); + decayc->setAdjusterListener(this); + setExpandAlignProperties(exprecov, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + inversConn = invers->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::inversChanged)); + invers->set_tooltip_text(M("TP_LOCALLAB_INVERS_TOOLTIP")); + + setExpandAlignProperties(expgradcol, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + strcol->setAdjusterListener(this); + + strcolab->setAdjusterListener(this); + strcolab->set_tooltip_text(M("TP_LOCALLAB_GRADSTRAB_TOOLTIP")); + + strcolh->setAdjusterListener(this); + strcolh->set_tooltip_text(M("TP_LOCALLAB_GRADSTRHUE_TOOLTIP")); + + angcol->setAdjusterListener(this); + + setExpandAlignProperties(expcurvcol, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + qualitycurveMethod->append(M("TP_LOCALLAB_CURVNONE")); + qualitycurveMethod->append(M("TP_LOCALLAB_CURVCURR")); + qualitycurveMethod->set_active(0); + qualitycurveMethodConn = qualitycurveMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabColor::qualitycurveMethodChanged)); + + llCurveEditorG->setCurveListener(this); + + llshape->setResetCurve(DiagonalCurveType(defSpot.llcurve.at(0)), defSpot.llcurve); + llshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + llshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + llshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + ccshape->setResetCurve(DiagonalCurveType(defSpot.cccurve.at(0)), defSpot.cccurve); + ccshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + ccshape->setBottomBarColorProvider(this, 4); + ccshape->setLeftBarColorProvider(this, 1); + + llCurveEditorG->curveListComplete(); + + clCurveEditorG->setCurveListener(this); + + clshape->setResetCurve(DiagonalCurveType(defSpot.clcurve.at(0)), defSpot.clcurve); + clshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + clshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + clshape->setLeftBarColorProvider(this, 1); + + lcshape->setResetCurve(DiagonalCurveType(defSpot.lccurve.at(0)), defSpot.lccurve); + lcshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + lcshape->setBottomBarColorProvider(this, 4); + lcshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + clCurveEditorG->curveListComplete(); + + HCurveEditorG->setCurveListener(this); + + LHshape->setIdentityValue(0.); + LHshape->setResetCurve(FlatCurveType(defSpot.LHcurve.at(0)), defSpot.LHcurve); + LHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + LHshape->setCurveColorProvider(this, 3); + LHshape->setBottomBarBgGradient(six_shape); + + HCurveEditorG->curveListComplete(); + + H3CurveEditorG->setCurveListener(this); + + CHshape->setIdentityValue(0.); + CHshape->setResetCurve(FlatCurveType(defSpot.CHcurve.at(0)), defSpot.CHcurve); + CHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + CHshape->setCurveColorProvider(this, 3); + CHshape->setBottomBarBgGradient(six_shape); + + H3CurveEditorG->curveListComplete(); + + H2CurveEditorG->setCurveListener(this); + + HHshape->setIdentityValue(0.); + HHshape->setResetCurve(FlatCurveType(defSpot.HHcurve.at(0)), defSpot.HHcurve); + HHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + HHshape->setCurveColorProvider(this, 3); + HHshape->setBottomBarBgGradient(six_shape); + + H2CurveEditorG->curveListComplete(); + + rgbCurveEditorG->setCurveListener(this); + + toneMethod->append(M("TP_EXPOSURE_TCMODE_STANDARD")); + toneMethod->append(M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); + toneMethod->append(M("TP_EXPOSURE_TCMODE_LUMINANCE")); + toneMethod->append(M("TP_EXPOSURE_TCMODE_FILMLIKE")); + toneMethod->set_active(0); + toneMethodConn = toneMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabColor::toneMethodChanged)); + + rgbshape->setResetCurve(DiagonalCurveType(defSpot.rgbcurve.at(0)), defSpot.rgbcurve); + rgbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + rgbshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + rgbshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + rgbCurveEditorG->curveListComplete(); + + specialConn = special->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::specialChanged)); + + setExpandAlignProperties(expmaskcol1, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + merMethod->append(M("TP_LOCALLAB_MRONE")); + // merMethod->append(M("TP_LOCALLAB_MRTWO")); + merMethod->append(M("TP_LOCALLAB_MRTHR")); + merMethod->append(M("TP_LOCALLAB_MRFOU")); + merMethod->append(M("TP_LOCALLAB_MRFIV")); + merMethod->set_active(0); + merMethodConn = merMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabColor::merMethodChanged)); + + mergecolMethod->append(M("TP_LOCALLAB_MERONE")); + mergecolMethod->append(M("TP_LOCALLAB_MERTWO")); + mergecolMethod->append(M("TP_LOCALLAB_MERTHR")); + mergecolMethod->append(M("TP_LOCALLAB_MERFOU")); + mergecolMethod->append(M("TP_LOCALLAB_MERFIV")); + mergecolMethod->append(M("TP_LOCALLAB_MERSIX")); + mergecolMethod->append(M("TP_LOCALLAB_MERSEV")); + mergecolMethod->append(M("TP_LOCALLAB_MERSEV0")); + mergecolMethod->append(M("TP_LOCALLAB_MERSEV1")); + mergecolMethod->append(M("TP_LOCALLAB_MERSEV2")); + mergecolMethod->append(M("TP_LOCALLAB_MERHEI")); + mergecolMethod->append(M("TP_LOCALLAB_MERNIN")); + mergecolMethod->append(M("TP_LOCALLAB_MERTEN")); + mergecolMethod->append(M("TP_LOCALLAB_MERELE")); + mergecolMethod->append(M("TP_LOCALLAB_MERTWE")); + mergecolMethod->append(M("TP_LOCALLAB_MERTHI")); + mergecolMethod->append(M("TP_LOCALLAB_MERFOR")); + mergecolMethod->append(M("TP_LOCALLAB_MERHUE")); + mergecolMethod->append(M("TP_LOCALLAB_MERSAT")); + mergecolMethod->append(M("TP_LOCALLAB_MERCOL")); + mergecolMethod->append(M("TP_LOCALLAB_MERLUM")); + mergecolMethod->set_active(0); + mergecolMethodConn = mergecolMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabColor::mergecolMethodChanged)); + + mercol->setAdjusterListener(this); + + opacol->setAdjusterListener(this); + + conthrcol->setAdjusterListener(this); + + merlucol->setAdjusterListener(this); + + setExpandAlignProperties(expmaskcol, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskcolMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskcolMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskcolMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskcolMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskcolMethod->append(M("TP_LOCALLAB_SHOWSTRUC")); + showmaskcolMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskcolMethod->set_active(0); + showmaskcolMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskcolMethodConn = showmaskcolMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabColor::showmaskcolMethodChanged)); + + showmaskcolMethodinv->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskcolMethodinv->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskcolMethodinv->set_active(0); + showmaskcolMethodinv->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskcolMethodConninv = showmaskcolMethodinv->signal_changed().connect(sigc::mem_fun(*this, &LocallabColor::showmaskcolMethodChangedinv)); + + enaColorMaskConn = enaColorMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::enaColorMaskChanged)); + + maskCurveEditorG->setCurveListener(this); + + CCmaskshape->setIdentityValue(0.); + CCmaskshape->setResetCurve(FlatCurveType(defSpot.CCmaskcurve.at(0)), defSpot.CCmaskcurve); + CCmaskshape->setBottomBarColorProvider(this, 1); + + LLmaskshape->setIdentityValue(0.); + LLmaskshape->setResetCurve(FlatCurveType(defSpot.LLmaskcurve.at(0)), defSpot.LLmaskcurve); + LLmaskshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskshape->setIdentityValue(0.); + HHmaskshape->setResetCurve(FlatCurveType(defSpot.HHmaskcurve.at(0)), defSpot.HHmaskcurve); + HHmaskshape->setCurveColorProvider(this, 2); + HHmaskshape->setBottomBarColorProvider(this, 2); + + maskCurveEditorG->curveListComplete(); + + struFrame->set_label_align(0.025, 0.5); + + strumaskcol->setAdjusterListener(this); + + toolcolConn = toolcol->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::toolcolChanged)); + + blurFrame->set_label_align(0.025, 0.5); + + fftColorMaskConn = fftColorMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabColor::fftColorMaskChanged)); + + contcol->setAdjusterListener(this); + + blurcol->setAdjusterListener(this); + + blendmaskcol->setAdjusterListener(this); + + radmaskcol->setAdjusterListener(this); + + lapmaskcol->setAdjusterListener(this); + + chromaskcol->setAdjusterListener(this); + + gammaskcol->setAdjusterListener(this); + + slomaskcol->setAdjusterListener(this); + + shadmaskcol->setAdjusterListener(this); + + maskHCurveEditorG->setCurveListener(this); + + HHhmaskshape->setIdentityValue(0.); + HHhmaskshape->setResetCurve(FlatCurveType(defSpot.HHhmaskcurve.at(0)), defSpot.HHhmaskcurve); + HHhmaskshape->setCurveColorProvider(this, 2); + HHhmaskshape->setBottomBarColorProvider(this, 2); + + maskHCurveEditorG->curveListComplete(); + + mask2CurveEditorG->setCurveListener(this); + + Lmaskshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskcurve.at(0)), defSpot.Lmaskcurve); + Lmaskshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmaskshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2CurveEditorG->curveListComplete(); + + mask2CurveEditorGwav->setCurveListener(this); + + LLmaskcolshapewav->setIdentityValue(0.); + LLmaskcolshapewav->setResetCurve(FlatCurveType(defSpot.LLmaskcolcurvewav.at(0)), defSpot.LLmaskcolcurvewav); +// LLmaskcolshapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2CurveEditorGwav->curveListComplete(); + + csThresholdcol->setAdjusterListener(this); + + // Add Color & Light specific widgets to GUI + pack_start(*reparcol); + pack_start(*invers); + ToolParamBlock* const lumBox = Gtk::manage(new ToolParamBlock()); + lumBox->pack_start(*lightness); + lumBox->pack_start(*contrast); + lumBox->pack_start(*chroma); + lumBox->pack_start(*gamc); + lumFrame->add(*lumBox); + pack_start(*lumFrame); + Gtk::Frame* const superFrame = Gtk::manage(new Gtk::Frame()); + superFrame->set_label_align(0.025, 0.5); + // superFrame->set_label_widget(*curvactiv); + ToolParamBlock* const superBox = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const gridBox = Gtk::manage(new ToolParamBlock()); + gridBox->pack_start(*labgrid); + gridBox->pack_start(*gridMethod); + gridBox->pack_start(*strengthgrid); + gridFrame->add(*gridBox); + superBox->pack_start(*gridFrame); + superFrame->add(*superBox); + pack_start(*superFrame); + // pack_start(*sensi); + pack_start(*structcol); + pack_start(*blurcolde); + pack_start(*softradiuscol); +// pack_start(*invers); + ToolParamBlock* const colBox3 = Gtk::manage(new ToolParamBlock()); + colBox3->pack_start(*maskusablec, Gtk::PACK_SHRINK, 0); + colBox3->pack_start(*maskunusablec, Gtk::PACK_SHRINK, 0); + colBox3->pack_start(*recothresc); + colBox3->pack_start(*lowthresc); + colBox3->pack_start(*higthresc); + colBox3->pack_start(*decayc); + // colBox3->pack_start(*invmaskc); + exprecov->add(*colBox3, false); + pack_start(*exprecov, false, false); + + + ToolParamBlock* const gradcolBox = Gtk::manage(new ToolParamBlock()); + gradcolBox->pack_start(*strcol); + gradcolBox->pack_start(*strcolab); + gradcolBox->pack_start(*strcolh); + gradcolBox->pack_start(*angcol); + expgradcol->add(*gradcolBox, false); + pack_start(*expgradcol, false, false); + ToolParamBlock* const curvBox = Gtk::manage(new ToolParamBlock()); + Gtk::Box* const qualcurvbox = Gtk::manage(new Gtk::Box()); + qualcurvbox->pack_start(*labqualcurv, Gtk::PACK_SHRINK, 4); + qualcurvbox->pack_start(*qualitycurveMethod); + curvBox->pack_start(*qualcurvbox); + curvBox->pack_start(*llCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + curvBox->pack_start(*clCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + curvBox->pack_start(*HCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + curvBox->pack_start(*H3CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + curvBox->pack_start(*H2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + curvBox->pack_start(*rgbCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + curvBox->pack_start(*special); + expcurvcol->add(*curvBox, false); + pack_start(*expcurvcol, false, false); + ToolParamBlock* const mask7Box = Gtk::manage(new ToolParamBlock()); + mask7Box->pack_start(*merMethod); + Gtk::Frame* const merge1colFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_MERGE1COLFRA"))); + merge1colFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const mergecolBox = Gtk::manage(new ToolParamBlock()); + Gtk::Separator* const separatormer = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + mergecolBox->pack_start(*separatormer, Gtk::PACK_SHRINK, 2); + mergecolBox->pack_start(*mergecolMethod); + mergecolBox->pack_start(*mercol); + mergecolBox->pack_start(*opacol); + mergecolBox->pack_start(*conthrcol); + ToolParamBlock* const gridmerBox = Gtk::manage(new ToolParamBlock()); + gridmerFrame->set_label_align(0.025, 0.5); + gridmerBox->pack_start(*labgridmerg); + gridmerBox->pack_start(*merlucol); + gridmerFrame->add(*gridmerBox); + mergecolBox->pack_start(*gridmerFrame); + merge1colFrame->add(*mergecolBox); + mask7->pack_start(*merge1colFrame); + mask7Box->pack_start(*mask7); + expmaskcol1->add(*mask7Box, false); + pack_start(*expmaskcol1, false, false); + mergecolFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const maskcolBox = Gtk::manage(new ToolParamBlock()); + maskcolBox->pack_start(*showmaskcolMethod, Gtk::PACK_SHRINK, 4); + maskcolBox->pack_start(*showmaskcolMethodinv, Gtk::PACK_SHRINK, 4); + maskcolBox->pack_start(*enaColorMask, Gtk::PACK_SHRINK, 0); + maskcolBox->pack_start(*maskCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + ToolParamBlock* const strumBox = Gtk::manage(new ToolParamBlock()); + strumBox->pack_start(*strumaskcol); + strumBox->pack_start(*toolcol); + struFrame->add(*strumBox); + maskcolBox->pack_start(*struFrame, Gtk::PACK_SHRINK, 0); + ToolParamBlock* const blurmBox = Gtk::manage(new ToolParamBlock()); + blurmBox->pack_start(*fftColorMask, Gtk::PACK_SHRINK, 0); + blurmBox->pack_start(*contcol); + blurmBox->pack_start(*blurcol); + blurFrame->add(*blurmBox); + maskcolBox->pack_start(*blurFrame, Gtk::PACK_SHRINK, 0); + maskcolBox->pack_start(*blendmaskcol, Gtk::PACK_SHRINK, 0); +// Gtk::Frame* const toolcolFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK"))); + toolcolFrame->set_label_align(0.025, 0.5); + toolcolFrame2->set_label_align(0.025, 0.5); + ToolParamBlock* const toolcolBox = Gtk::manage(new ToolParamBlock()); + toolcolBox->pack_start(*radmaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*lapmaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*chromaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*gammaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*slomaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*shadmaskcol, Gtk::PACK_SHRINK, 0); + toolcolBox->pack_start(*maskHCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolcolBox->pack_start(*mask2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + ToolParamBlock* const toolcolBox2 = Gtk::manage(new ToolParamBlock()); + toolcolBox2->pack_start(*mask2CurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolcolBox2->pack_start(*csThresholdcol, Gtk::PACK_SHRINK, 0); + toolcolFrame2->add(*toolcolBox2); + toolcolBox->pack_start(*toolcolFrame2); + toolcolFrame->add(*toolcolBox); + maskcolBox->pack_start(*toolcolFrame); + mergecolFrame->add(*maskcolBox); + expmaskcol->add(*mergecolFrame, false); + pack_start(*expmaskcol, false, false); +} + +LocallabColor::~LocallabColor() +{ + delete llCurveEditorG; + delete clCurveEditorG; + delete HCurveEditorG; + delete H3CurveEditorG; + delete H2CurveEditorG; + delete rgbCurveEditorG; + delete maskCurveEditorG; + delete maskHCurveEditorG; + delete mask2CurveEditorG; + delete mask2CurveEditorGwav; +} + +void LocallabColor::setListener(ToolPanelListener* tpl) +{ + LocallabTool::setListener(tpl); + + labgrid->setListener(tpl); + labgridmerg->setListener(tpl); +} + +bool LocallabColor::isMaskViewActive() +{ + return ((showmaskcolMethod->get_active_row_number() != 0) || (showmaskcolMethodinv->get_active_row_number() != 0)); +} + +void LocallabColor::resetMaskView() +{ + showmaskcolMethodConn.block(true); + showmaskcolMethodConninv.block(true); + + showmaskcolMethod->set_active(0); + showmaskcolMethodinv->set_active(0); + + showmaskcolMethodConn.block(false); + showmaskcolMethodConninv.block(false); +} + +void LocallabColor::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + colorMask = showmaskcolMethod->get_active_row_number(); + colorMaskinv = showmaskcolMethodinv->get_active_row_number(); +} + +void LocallabColor::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + lumFrame->set_tooltip_text(M("TP_LOCALLAB_EXPCOLOR_TOOLTIP")); + recothresc->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + gamc->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); + lightness->set_tooltip_text(M("TP_LOCALLAB_LIGHTN_TOOLTIP")); + reparcol->set_tooltip_text(M("TP_LOCALLAB_REPARCOL_TOOLTIP")); + gridMethod->set_tooltip_text(M("TP_LOCALLAB_GRIDMETH_TOOLTIP")); + strengthgrid->set_tooltip_text(M("TP_LOCALLAB_STRENGRID_TOOLTIP")); + blurcolde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP")); + softradiuscol->set_tooltip_text(M("TP_LOCALLAB_SOFTRADIUSCOL_TOOLTIP")); + exprecov->set_tooltip_markup(M("TP_LOCALLAB_MASKRECOL_TOOLTIP")); + expgradcol->set_tooltip_text(M("TP_LOCALLAB_EXPGRADCOL_TOOLTIP")); + rgbCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_RGBCURVE_TOOLTIP")); + sensi->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + structcol->set_tooltip_text(M("TP_LOCALLAB_STRUCT_TOOLTIP")); + strcol->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); + angcol->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + qualitycurveMethod->set_tooltip_markup(M("TP_LOCALLAB_CURVEMETHOD_TOOLTIP")); + special->set_tooltip_text(M("TP_LOCALLAB_SPECIAL_TOOLTIP")); + expmaskcol1->set_tooltip_text(M("TP_LOCALLAB_EXPMERGEFILE_TOOLTIP")); + mercol->set_tooltip_text(M("TP_LOCALLAB_MERGEMER_TOOLTIP")); + opacol->set_tooltip_text(M("TP_LOCALLAB_MERGEOPA_TOOLTIP")); + conthrcol->set_tooltip_text(M("TP_LOCALLAB_MERGEOPA_TOOLTIP")); + gridmerFrame->set_tooltip_text(M("TP_LOCALLAB_GRIDFRAME_TOOLTIP")); + expmaskcol->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + CCmaskshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + struFrame->set_tooltip_text(M("TP_LOCALLAB_STRUMASK_TOOLTIP")); + blurFrame->set_tooltip_text(M("TP_LOCALLAB_BLURMASK_TOOLTIP")); + blendmaskcol->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + maskHCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_HHMASK_TOOLTIP")); + mask2CurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmaskshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + mask2CurveEditorGwav->set_tooltip_text(M("TP_LOCALLAB_WAVMASK_TOOLTIP")); + LLmaskcolshapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); + mergecolFrame->set_tooltip_markup(M("TP_LOCALLAB_MERGECOLFRMASK_TOOLTIP")); + maskCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + strumaskcol->set_tooltip_text(M("TP_LOCALLAB_STRUSTRMASK_TOOLTIP")); + toolcol->set_tooltip_text(M("TP_LOCALLAB_TOOLMASK_TOOLTIP")); + toolcolFrame->set_tooltip_text(M("TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP")); + fftColorMask->set_tooltip_text(M("TP_LOCALLAB_FFTMASK_TOOLTIP")); + gammaskcol->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskcol->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskcol->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + shadmaskcol->set_tooltip_text(M("TP_LOCALLAB_SHADMASK_TOOLTIP")); + contcol->set_tooltip_text(M("TP_LOCALLAB_CONTTHMASK_TOOLTIP")); + blurcol->set_tooltip_text(M("TP_LOCALLAB_BLURRMASK_TOOLTIP")); + lapmaskcol->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + csThresholdcol->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); + decayc->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthresc->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESC_TOOLTIP")); + higthresc->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESC_TOOLTIP")); + } else { + lumFrame->set_tooltip_text(""); + recothresc->set_tooltip_text(""); + lightness->set_tooltip_text(""); + gamc->set_tooltip_text(""); + reparcol->set_tooltip_text(""); + gridMethod->set_tooltip_text(""); + strengthgrid->set_tooltip_text(""); + blurcolde->set_tooltip_text(""); + softradiuscol->set_tooltip_text(""); + exprecov->set_tooltip_markup(""); + expgradcol->set_tooltip_text(""); + rgbCurveEditorG->set_tooltip_text(""); + sensi->set_tooltip_text(""); + structcol->set_tooltip_text(""); + strcol->set_tooltip_text(""); + angcol->set_tooltip_text(""); + qualitycurveMethod->set_tooltip_markup(""); + special->set_tooltip_text(""); + expmaskcol1->set_tooltip_text(""); + maskCurveEditorG->set_tooltip_markup(""); + mercol->set_tooltip_text(""); + opacol->set_tooltip_text(""); + conthrcol->set_tooltip_text(""); + gridmerFrame->set_tooltip_text(""); + expmaskcol->set_tooltip_markup(""); + mergecolFrame->set_tooltip_markup(""); + CCmaskshape->setTooltip(""); + LLmaskshape->setTooltip(""); + HHmaskshape->setTooltip(""); + struFrame->set_tooltip_text(""); + strumaskcol->set_tooltip_text(""); + toolcol->set_tooltip_text(""); + toolcolFrame->set_tooltip_text(""); + fftColorMask->set_tooltip_text(""); + gammaskcol->set_tooltip_text(""); + chromaskcol->set_tooltip_text(""); + slomaskcol->set_tooltip_text(""); + shadmaskcol->set_tooltip_text(""); + contcol->set_tooltip_text(""); + blurcol->set_tooltip_text(""); + blurFrame->set_tooltip_text(""); + blendmaskcol->set_tooltip_text(""); + radmaskcol->set_tooltip_text(""); + lapmaskcol->set_tooltip_text(""); + maskHCurveEditorG->set_tooltip_text(""); + mask2CurveEditorG->set_tooltip_text(""); + Lmaskshape->setTooltip(""); + mask2CurveEditorGwav->set_tooltip_text(""); + LLmaskcolshapewav->setTooltip(""); + csThresholdcol->set_tooltip_text(""); + decayc->set_tooltip_text(""); + lowthresc->set_tooltip_text(""); + higthresc->set_tooltip_text(""); + } +} + +void LocallabColor::setDefaultExpanderVisibility() +{ + exprecov->set_expanded(false); + expgradcol->set_expanded(false); + expcurvcol->set_expanded(false); + expmaskcol1->set_expanded(false); + expmaskcol->set_expanded(false); +} + +void LocallabColor::disableListener() +{ + LocallabTool::disableListener(); + + curvactivConn.block(true); + gridMethodConn.block(true); + inversConn.block(true); + qualitycurveMethodConn.block(true); + toneMethodConn.block(true); + specialConn.block(true); + merMethodConn.block(true); + mergecolMethodConn.block(true); + showmaskcolMethodConn.block(true); + showmaskcolMethodConninv.block(true); + enaColorMaskConn.block(true); + toolcolConn.block(true); + fftColorMaskConn.block(true); +} + +void LocallabColor::enableListener() +{ + LocallabTool::enableListener(); + + curvactivConn.block(false); + gridMethodConn.block(false); + inversConn.block(false); + qualitycurveMethodConn.block(false); + toneMethodConn.block(false); + specialConn.block(false); + merMethodConn.block(false); + mergecolMethodConn.block(false); + showmaskcolMethodConn.block(false); + showmaskcolMethodConninv.block(false); + enaColorMaskConn.block(false); + toolcolConn.block(false); + fftColorMaskConn.block(false); +} + +void LocallabColor::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visicolor); + exp->setEnabled(spot.expcolor); + complexity->set_active(spot.complexcolor); + + lightness->setValue(spot.lightness); + gamc->setValue(spot.gamc); + reparcol->setValue(spot.reparcol); + contrast->setValue(spot.contrast); + chroma->setValue(spot.chroma); + curvactiv->set_active(spot.curvactiv); + labgrid->setParams(spot.labgridALow / LocallabParams::LABGRIDL_CORR_MAX, + spot.labgridBLow / LocallabParams::LABGRIDL_CORR_MAX, + spot.labgridAHigh / LocallabParams::LABGRIDL_CORR_MAX, + spot.labgridBHigh / LocallabParams::LABGRIDL_CORR_MAX, + 0, 0, 0, 0, false); + // printf("labgridlow=%f \n", spot.labgridALow); + if (spot.gridMethod == "one") { + gridMethod->set_active(0); + } else if (spot.gridMethod == "two") { + gridMethod->set_active(1); + } + + strengthgrid->setValue(spot.strengthgrid); + sensi->setValue(spot.sensi); + structcol->setValue(spot.structcol); + blurcolde->setValue(spot.blurcolde); + softradiuscol->setValue(spot.softradiuscol); + invers->set_active(spot.invers); + strcol->setValue(spot.strcol); + strcolab->setValue(spot.strcolab); + strcolh->setValue(spot.strcolh); + angcol->setValue(spot.angcol); + + if (spot.qualitycurveMethod == "none") { + qualitycurveMethod->set_active(0); + } else if (spot.qualitycurveMethod == "std") { + qualitycurveMethod->set_active(1); + } + + llshape->setCurve(spot.llcurve); + ccshape->setCurve(spot.cccurve); + clshape->setCurve(spot.clcurve); + lcshape->setCurve(spot.lccurve); + LHshape->setCurve(spot.LHcurve); + HHshape->setCurve(spot.HHcurve); + CHshape->setCurve(spot.CHcurve); + + if (spot.toneMethod == "one") { + toneMethod->set_active(0); + } else if (spot.toneMethod == "two") { + toneMethod->set_active(1); + } else if (spot.toneMethod == "thr") { + toneMethod->set_active(2); + } else if (spot.toneMethod == "fou") { + toneMethod->set_active(3); + } + + rgbshape->setCurve(spot.rgbcurve); + special->set_active(spot.special); + + if (spot.merMethod == "mone") { + merMethod->set_active(0); + // } else if (spot.merMethod == "mtwo") { + // merMethod->set_active(1); + } else if (spot.merMethod == "mthr") { + merMethod->set_active(1); + } else if (spot.merMethod == "mfou") { + merMethod->set_active(2); + } else if (spot.merMethod == "mfiv") { + merMethod->set_active(3); + } + + recothresc->setValue((double)spot.recothresc); + lowthresc->setValue((double)spot.lowthresc); + higthresc->setValue((double)spot.higthresc); + decayc->setValue((double)spot.decayc); + + if (spot.mergecolMethod == "one") { + mergecolMethod->set_active(0); + } else if (spot.mergecolMethod == "two") { + mergecolMethod->set_active(1); + } else if (spot.mergecolMethod == "thr") { + mergecolMethod->set_active(2); + } else if (spot.mergecolMethod == "fou") { + mergecolMethod->set_active(3); + } else if (spot.mergecolMethod == "fiv") { + mergecolMethod->set_active(4); + } else if (spot.mergecolMethod == "six") { + mergecolMethod->set_active(5); + } else if (spot.mergecolMethod == "sev") { + mergecolMethod->set_active(6); + } else if (spot.mergecolMethod == "sev0") { + mergecolMethod->set_active(7); + } else if (spot.mergecolMethod == "sev1") { + mergecolMethod->set_active(8); + } else if (spot.mergecolMethod == "sev2") { + mergecolMethod->set_active(9); + } else if (spot.mergecolMethod == "hei") { + mergecolMethod->set_active(10); + } else if (spot.mergecolMethod == "nin") { + mergecolMethod->set_active(11); + } else if (spot.mergecolMethod == "ten") { + mergecolMethod->set_active(12); + } else if (spot.mergecolMethod == "ele") { + mergecolMethod->set_active(13); + } else if (spot.mergecolMethod == "twe") { + mergecolMethod->set_active(14); + } else if (spot.mergecolMethod == "thi") { + mergecolMethod->set_active(15); + } else if (spot.mergecolMethod == "for") { + mergecolMethod->set_active(16); + } else if (spot.mergecolMethod == "hue") { + mergecolMethod->set_active(17); + } else if (spot.mergecolMethod == "sat") { + mergecolMethod->set_active(18); + } else if (spot.mergecolMethod == "col") { + mergecolMethod->set_active(19); + } else if (spot.mergecolMethod == "lum") { + mergecolMethod->set_active(20); + } + + mercol->setValue(spot.mercol); + opacol->setValue(spot.opacol); + conthrcol->setValue(spot.conthrcol); + labgridmerg->setParams(0, 0, + spot.labgridAHighmerg / LocallabParams::LABGRIDL_CORR_MAX, + spot.labgridBHighmerg / LocallabParams::LABGRIDL_CORR_MAX, + 0, 0, 0, 0, false); + merlucol->setValue(spot.merlucol); + enaColorMask->set_active(spot.enaColorMask); + CCmaskshape->setCurve(spot.CCmaskcurve); + LLmaskshape->setCurve(spot.LLmaskcurve); + HHmaskshape->setCurve(spot.HHmaskcurve); + strumaskcol->setValue(spot.strumaskcol); + toolcol->set_active(spot.toolcol); + fftColorMask->set_active(spot.fftColorMask); + contcol->setValue(spot.contcol); + // Update GUI according to fftColorMash button state + // Note: Contrary to the others, shall be called before setting 'blurcol' value + updateColorGUI3(); + blurcol->setValue(spot.blurcol); + blendmaskcol->setValue(spot.blendmaskcol); + radmaskcol->setValue(spot.radmaskcol); + lapmaskcol->setValue(spot.lapmaskcol); + chromaskcol->setValue(spot.chromaskcol); + gammaskcol->setValue(spot.gammaskcol); + slomaskcol->setValue(spot.slomaskcol); + shadmaskcol->setValue(spot.shadmaskcol); + HHhmaskshape->setCurve(spot.HHhmaskcurve); + Lmaskshape->setCurve(spot.Lmaskcurve); + LLmaskcolshapewav->setCurve(spot.LLmaskcolcurvewav); + csThresholdcol->setValue(spot.csthresholdcol); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update GUI according to invers button state + updateColorGUI1(); + + // Update GUI according to merMethod combobox state + updateColorGUI2(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabColor::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expcolor = exp->getEnabled(); + spot.visicolor = exp->get_visible(); + spot.complexcolor = complexity->get_active_row_number(); + + spot.lightness = lightness->getIntValue(); + spot.gamc = gamc->getValue(); + spot.reparcol = reparcol->getValue(); + spot.contrast = contrast->getIntValue(); + spot.chroma = chroma->getIntValue(); + spot.curvactiv = curvactiv->get_active(); + double zerox = 0.; + double zeroy = 0.; + labgrid->getParams(spot.labgridALow, + spot.labgridBLow, + spot.labgridAHigh, + spot.labgridBHigh, zerox, zeroy, zerox, zeroy); + spot.labgridALow *= LocallabParams::LABGRIDL_CORR_MAX; + spot.labgridAHigh *= LocallabParams::LABGRIDL_CORR_MAX; + spot.labgridBLow *= LocallabParams::LABGRIDL_CORR_MAX; + spot.labgridBHigh *= LocallabParams::LABGRIDL_CORR_MAX; + + if (gridMethod->get_active_row_number() == 0) { + spot.gridMethod = "one"; + } else if (gridMethod->get_active_row_number() == 1) { + spot.gridMethod = "two"; + } + + spot.strengthgrid = strengthgrid->getIntValue(); + spot.sensi = sensi->getIntValue(); + spot.structcol = structcol->getIntValue(); + spot.blurcolde = blurcolde->getIntValue(); + spot.softradiuscol = softradiuscol->getValue(); + spot.invers = invers->get_active(); + spot.strcol = strcol->getValue(); + spot.strcolab = strcolab->getValue(); + spot.strcolh = strcolh->getValue(); + spot.angcol = angcol->getValue(); + + spot.recothresc = recothresc->getValue(); + spot.lowthresc = lowthresc->getValue(); + spot.higthresc = higthresc->getValue(); + spot.decayc = decayc->getValue(); + + if (qualitycurveMethod->get_active_row_number() == 0) { + spot.qualitycurveMethod = "none"; + } else if (qualitycurveMethod->get_active_row_number() == 1) { + spot.qualitycurveMethod = "std"; + } + + spot.llcurve = llshape->getCurve(); + spot.cccurve = ccshape->getCurve(); + spot.clcurve = clshape->getCurve(); + spot.lccurve = lcshape->getCurve(); + spot.LHcurve = LHshape->getCurve(); + spot.HHcurve = HHshape->getCurve(); + spot.CHcurve = CHshape->getCurve(); + + if (toneMethod->get_active_row_number() == 0) { + spot.toneMethod = "one"; + } else if (toneMethod->get_active_row_number() == 1) { + spot.toneMethod = "two"; + } else if (toneMethod->get_active_row_number() == 2) { + spot.toneMethod = "thr"; + } else if (toneMethod->get_active_row_number() == 3) { + spot.toneMethod = "fou"; + } + + spot.rgbcurve = rgbshape->getCurve(); + spot.special = special->get_active(); + + if (merMethod->get_active_row_number() == 0) { + spot.merMethod = "mone"; + // } else if (merMethod->get_active_row_number() == 1) { + // spot.merMethod = "mtwo"; + } else if (merMethod->get_active_row_number() == 1) { + spot.merMethod = "mthr"; + } else if (merMethod->get_active_row_number() == 2) { + spot.merMethod = "mfou"; + } else if (merMethod->get_active_row_number() == 3) { + spot.merMethod = "mfiv"; + } + + if (mergecolMethod->get_active_row_number() == 0) { + spot.mergecolMethod = "one"; + } else if (mergecolMethod->get_active_row_number() == 1) { + spot.mergecolMethod = "two"; + } else if (mergecolMethod->get_active_row_number() == 2) { + spot.mergecolMethod = "thr"; + } else if (mergecolMethod->get_active_row_number() == 3) { + spot.mergecolMethod = "fou"; + } else if (mergecolMethod->get_active_row_number() == 4) { + spot.mergecolMethod = "fiv"; + } else if (mergecolMethod->get_active_row_number() == 5) { + spot.mergecolMethod = "six"; + } else if (mergecolMethod->get_active_row_number() == 6) { + spot.mergecolMethod = "sev"; + } else if (mergecolMethod->get_active_row_number() == 7) { + spot.mergecolMethod = "sev0"; + } else if (mergecolMethod->get_active_row_number() == 8) { + spot.mergecolMethod = "sev1"; + } else if (mergecolMethod->get_active_row_number() == 9) { + spot.mergecolMethod = "sev2"; + } else if (mergecolMethod->get_active_row_number() == 10) { + spot.mergecolMethod = "hei"; + } else if (mergecolMethod->get_active_row_number() == 11) { + spot.mergecolMethod = "nin"; + } else if (mergecolMethod->get_active_row_number() == 12) { + spot.mergecolMethod = "ten"; + } else if (mergecolMethod->get_active_row_number() == 13) { + spot.mergecolMethod = "ele"; + } else if (mergecolMethod->get_active_row_number() == 14) { + spot.mergecolMethod = "twe"; + } else if (mergecolMethod->get_active_row_number() == 15) { + spot.mergecolMethod = "thi"; + } else if (mergecolMethod->get_active_row_number() == 16) { + spot.mergecolMethod = "for"; + } else if (mergecolMethod->get_active_row_number() == 17) { + spot.mergecolMethod = "hue"; + } else if (mergecolMethod->get_active_row_number() == 18) { + spot.mergecolMethod = "sat"; + } else if (mergecolMethod->get_active_row_number() == 19) { + spot.mergecolMethod = "col"; + } else if (mergecolMethod->get_active_row_number() == 20) { + spot.mergecolMethod = "lum"; + } + + spot.mercol = mercol->getValue(); + spot.opacol = opacol->getValue(); + spot.conthrcol = conthrcol->getValue(); + double zerox1 = 0.; + double zeroy1 = 0.; + labgridmerg->getParams(spot.labgridALowmerg, + spot.labgridBLowmerg, + spot.labgridAHighmerg, + spot.labgridBHighmerg, zerox1, zeroy1, zerox1, zeroy1); + spot.labgridALowmerg *= LocallabParams::LABGRIDL_CORR_MAX; + spot.labgridAHighmerg *= LocallabParams::LABGRIDL_CORR_MAX; + spot.labgridBLowmerg *= LocallabParams::LABGRIDL_CORR_MAX; + spot.labgridBHighmerg *= LocallabParams::LABGRIDL_CORR_MAX; + spot.merlucol = merlucol->getValue(); + spot.enaColorMask = enaColorMask->get_active(); + spot.CCmaskcurve = CCmaskshape->getCurve(); + spot.LLmaskcurve = LLmaskshape->getCurve(); + spot.HHmaskcurve = HHmaskshape->getCurve(); + spot.strumaskcol = strumaskcol->getValue(); + spot.toolcol = toolcol->get_active(); + spot.fftColorMask = fftColorMask->get_active(); + spot.contcol = contcol->getValue(); + spot.blurcol = blurcol->getValue(); + spot.blendmaskcol = blendmaskcol->getIntValue(); + spot.radmaskcol = radmaskcol->getValue(); + spot.lapmaskcol = lapmaskcol->getValue(); + spot.chromaskcol = chromaskcol->getValue(); + spot.gammaskcol = gammaskcol->getValue(); + spot.slomaskcol = slomaskcol->getValue(); + spot.shadmaskcol = shadmaskcol->getIntValue(); + spot.HHhmaskcurve = HHhmaskshape->getCurve(); + spot.Lmaskcurve = Lmaskshape->getCurve(); + spot.LLmaskcolcurvewav = LLmaskcolshapewav->getCurve(); + spot.csthresholdcol = csThresholdcol->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabColor::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default value for adjuster, labgrid and threshold adjuster widgets + lightness->setDefault((double)defSpot.lightness); + gamc->setDefault((double)defSpot.gamc); + reparcol->setDefault(defSpot.reparcol); + contrast->setDefault((double)defSpot.contrast); + chroma->setDefault((double)defSpot.chroma); + labgrid->setDefault(defSpot.labgridALow / LocallabParams::LABGRIDL_CORR_MAX, + defSpot.labgridBLow / LocallabParams::LABGRIDL_CORR_MAX, + defSpot.labgridAHigh / LocallabParams::LABGRIDL_CORR_MAX, + defSpot.labgridBHigh / LocallabParams::LABGRIDL_CORR_MAX, 0, 0, 0, 0); + strengthgrid->setDefault((double) defSpot.strengthgrid); + sensi->setDefault((double)defSpot.sensi); + structcol->setDefault((double)defSpot.structcol); + blurcolde->setDefault((double)defSpot.blurcolde); + softradiuscol->setDefault(defSpot.softradiuscol); + strcol->setDefault(defSpot.strcol); + strcolab->setDefault(defSpot.strcolab); + strcolh->setDefault(defSpot.strcolh); + angcol->setDefault(defSpot.angcol); + mercol->setDefault(defSpot.mercol); + opacol->setDefault(defSpot.opacol); + conthrcol->setDefault(defSpot.conthrcol); + labgridmerg->setDefault(defSpot.labgridALowmerg / LocallabParams::LABGRIDL_CORR_MAX, + defSpot.labgridBLowmerg / LocallabParams::LABGRIDL_CORR_MAX, + defSpot.labgridAHighmerg / LocallabParams::LABGRIDL_CORR_MAX, + defSpot.labgridBHighmerg / LocallabParams::LABGRIDL_CORR_MAX, 0, 0, 0, 0); + merlucol->setDefault(defSpot.merlucol); + strumaskcol->setDefault(defSpot.strumaskcol); + contcol->setDefault(defSpot.contcol); + blurcol->setDefault(defSpot.blurcol); + blendmaskcol->setDefault((double)defSpot.blendmaskcol); + radmaskcol->setDefault(defSpot.radmaskcol); + lapmaskcol->setDefault(defSpot.lapmaskcol); + chromaskcol->setDefault(defSpot.chromaskcol); + gammaskcol->setDefault(defSpot.gammaskcol); + slomaskcol->setDefault(defSpot.slomaskcol); + shadmaskcol->setDefault((double)defSpot.shadmaskcol); + csThresholdcol->setDefault(defSpot.csthresholdcol); + recothresc->setDefault((double)defSpot.recothresc); + lowthresc->setDefault((double)defSpot.lowthresc); + higthresc->setDefault((double)defSpot.higthresc); + decayc->setDefault((double)defSpot.decayc); + + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabColor::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == lightness) { + if (listener) { + listener->panelChanged(Evlocallablightness, + lightness->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gamc) { + if (listener) { + listener->panelChanged(Evlocallabgamc, + gamc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == reparcol) { + if (listener) { + listener->panelChanged(Evlocallabreparcol, + reparcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == contrast) { + if (listener) { + listener->panelChanged(Evlocallabcontrast, + contrast->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chroma) { + if (listener) { + listener->panelChanged(Evlocallabchroma, + chroma->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strengthgrid) { + if (listener) { + listener->panelChanged(EvLocallabLabstrengthgrid, + strengthgrid->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensi) { + if (listener) { + listener->panelChanged(Evlocallabsensi, + sensi->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == structcol) { + if (listener) { + listener->panelChanged(Evlocallabstructcol, + structcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blurcolde) { + if (listener) { + listener->panelChanged(Evlocallabblurcolde, + blurcolde->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == softradiuscol) { + if (listener) { + listener->panelChanged(Evlocallabsoftradiuscol, + softradiuscol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothresc) { + + if (listener) { + listener->panelChanged(Evlocallabrecothresc, + recothresc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthresc) { + if (listener) { + listener->panelChanged(Evlocallablowthresc, + lowthresc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthresc) { + if (listener) { + listener->panelChanged(Evlocallabhigthresc, + higthresc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decayc) { + if (listener) { + listener->panelChanged(Evlocallabdecayc, + decayc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + if (a == strcol) { + if (listener) { + listener->panelChanged(Evlocallabstrcol, + strcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strcolab) { + if (listener) { + listener->panelChanged(Evlocallabstrcolab, + strcolab->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strcolh) { + if (listener) { + listener->panelChanged(Evlocallabstrcolh, + strcolh->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == angcol) { + if (listener) { + listener->panelChanged(Evlocallabangcol, + angcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == mercol) { + if (listener) { + listener->panelChanged(Evlocallabmercol, + mercol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == opacol) { + if (listener) { + listener->panelChanged(Evlocallabopacol, + opacol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == conthrcol) { + if (listener) { + listener->panelChanged(Evlocallabconthrcol, + conthrcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == merlucol) { + if (listener) { + listener->panelChanged(Evlocallabmerlucol, + merlucol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strumaskcol) { + if (listener) { + listener->panelChanged(Evlocallabstrumaskcol, + strumaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == contcol) { + if (listener) { + listener->panelChanged(Evlocallabcontcol, + contcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blurcol) { + if (listener) { + listener->panelChanged(Evlocallabblurcol, + blurcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskcol) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskcol, + blendmaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskcol) { + if (listener) { + listener->panelChanged(Evlocallabradmaskcol, + radmaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskcol) { + if (listener) { + listener->panelChanged(Evlocallablapmaskcol, + lapmaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskcol) { + if (listener) { + listener->panelChanged(Evlocallabchromaskcol, + chromaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskcol) { + if (listener) { + listener->panelChanged(Evlocallabgammaskcol, + gammaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskcol) { + if (listener) { + listener->panelChanged(Evlocallabslomaskcol, + slomaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shadmaskcol) { + if (listener) { + listener->panelChanged(Evlocallabshadmaskcol, + shadmaskcol->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == csThresholdcol) { + if (listener) { + listener->panelChanged(EvlocallabcsThresholdcol, + csThresholdcol->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == llshape) { + if (listener) { + listener->panelChanged(Evlocallabllshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == ccshape) { + if (listener) { + listener->panelChanged(Evlocallabccshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == clshape) { + if (listener) { + listener->panelChanged(Evlocallabclshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == lcshape) { + if (listener) { + listener->panelChanged(Evlocallablcshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LHshape) { + if (listener) { + listener->panelChanged(EvlocallabLHshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CHshape) { + if (listener) { + listener->panelChanged(EvlocallabCHshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHshape) { + if (listener) { + listener->panelChanged(EvlocallabHHshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == rgbshape) { + if (listener) { + listener->panelChanged(Evlocallabrgbshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CCmaskshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHhmaskshape) { + if (listener) { + listener->panelChanged(EvlocallabHHhmaskshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskcolshapewav) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskcolshapewav, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenacolor, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenacolor, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + gamc->setValue(defSpot.gamc); + + // Set hidden GUI widgets in Normal mode to default spot values + blurcolde->setValue((double)defSpot.blurcolde); + structcol->setValue((double)defSpot.structcol); + strcolab->setValue(defSpot.strcolab); + strcolh->setValue(defSpot.strcolh); + clshape->setCurve(defSpot.clcurve); + lcshape->setCurve(defSpot.lccurve); + LHshape->setCurve(defSpot.LHcurve); + CHshape->setCurve(defSpot.CHcurve); + HHshape->setCurve(defSpot.HHcurve); + + if (defSpot.toneMethod == "one") { + toneMethod->set_active(0); + } else if (defSpot.toneMethod == "two") { + toneMethod->set_active(1); + } else if (defSpot.toneMethod == "thr") { + toneMethod->set_active(2); + } else if (defSpot.toneMethod == "fou") { + toneMethod->set_active(3); + } + + rgbshape->setCurve(defSpot.rgbcurve); + special->set_active(defSpot.special); + + if (defSpot.merMethod == "mone") { + merMethod->set_active(0); + // } else if (defSpot.merMethod == "mtwo") { + // merMethod->set_active(1); + } else if (defSpot.merMethod == "mthr") { + merMethod->set_active(1); + } else if (defSpot.merMethod == "mfou") { + merMethod->set_active(2); + } else if (defSpot.merMethod == "mfiv") { + merMethod->set_active(3); + } + + if (defSpot.mergecolMethod == "one") { + mergecolMethod->set_active(0); + } else if (defSpot.mergecolMethod == "two") { + mergecolMethod->set_active(1); + } else if (defSpot.mergecolMethod == "thr") { + mergecolMethod->set_active(2); + } else if (defSpot.mergecolMethod == "fou") { + mergecolMethod->set_active(3); + } else if (defSpot.mergecolMethod == "fiv") { + mergecolMethod->set_active(4); + } else if (defSpot.mergecolMethod == "six") { + mergecolMethod->set_active(5); + } else if (defSpot.mergecolMethod == "sev") { + mergecolMethod->set_active(6); + } else if (defSpot.mergecolMethod == "sev0") { + mergecolMethod->set_active(7); + } else if (defSpot.mergecolMethod == "sev1") { + mergecolMethod->set_active(8); + } else if (defSpot.mergecolMethod == "sev2") { + mergecolMethod->set_active(9); + } else if (defSpot.mergecolMethod == "hei") { + mergecolMethod->set_active(10); + } else if (defSpot.mergecolMethod == "nin") { + mergecolMethod->set_active(11); + } else if (defSpot.mergecolMethod == "ten") { + mergecolMethod->set_active(12); + } else if (defSpot.mergecolMethod == "ele") { + mergecolMethod->set_active(13); + } else if (defSpot.mergecolMethod == "twe") { + mergecolMethod->set_active(14); + } else if (defSpot.mergecolMethod == "thi") { + mergecolMethod->set_active(15); + } else if (defSpot.mergecolMethod == "for") { + mergecolMethod->set_active(16); + } else if (defSpot.mergecolMethod == "hue") { + mergecolMethod->set_active(17); + } else if (defSpot.mergecolMethod == "sat") { + mergecolMethod->set_active(18); + } else if (defSpot.mergecolMethod == "col") { + mergecolMethod->set_active(19); + } else if (defSpot.mergecolMethod == "lum") { + mergecolMethod->set_active(20); + } + + mercol->setValue(defSpot.mercol); + opacol->setValue(defSpot.opacol); + conthrcol->setValue(defSpot.conthrcol); + labgridmerg->setParams(0, 0, + defSpot.labgridAHighmerg / LocallabParams::LABGRIDL_CORR_MAX, + defSpot.labgridBHighmerg / LocallabParams::LABGRIDL_CORR_MAX, + 0, 0, 0, 0, false); + merlucol->setValue(defSpot.merlucol); + strumaskcol->setValue(defSpot.strumaskcol); + toolcol->set_active(defSpot.toolcol); + fftColorMask->set_active(defSpot.fftColorMask); + contcol->setValue(defSpot.contcol); + blurcol->setValue(defSpot.blurcol); + lapmaskcol->setValue(defSpot.lapmaskcol); + gammaskcol->setValue(defSpot.gammaskcol); + slomaskcol->setValue(defSpot.slomaskcol); + shadmaskcol->setValue((double)defSpot.shadmaskcol); + HHhmaskshape->setCurve(defSpot.HHhmaskcurve); + LLmaskcolshapewav->setCurve(defSpot.LLmaskcolcurvewav); + csThresholdcol->setValue(defSpot.csthresholdcol); + decayc->setValue(defSpot.decayc); + + // Enable all listeners + enableListener(); + + // Update GUI based on converted widget parameters: + // - Update GUI according to merMethod combobox state + updateColorGUI2(); + // - Update GUI according to fftColorMash button state + updateColorGUI3(); +} + +void LocallabColor::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + softradiuscol->setValue(defSpot.softradiuscol); + strcol->setValue(defSpot.strcol); + angcol->setValue(defSpot.angcol); + gamc->setValue(defSpot.gamc); + + if (defSpot.qualitycurveMethod == "none") { + qualitycurveMethod->set_active(0); + } else if (defSpot.qualitycurveMethod == "std") { + qualitycurveMethod->set_active(1); + } + + llshape->setCurve(defSpot.llcurve); + ccshape->setCurve(defSpot.cccurve); + showmaskcolMethod->set_active(0); + showmaskcolMethodinv->set_active(0); + enaColorMask->set_active(defSpot.enaColorMask); +// CCmaskshape->setCurve(defSpot.CCmaskcurve); +// LLmaskshape->setCurve(defSpot.LLmaskcurve); +// HHmaskshape->setCurve(defSpot.HHmaskcurve); +// blendmaskcol->setValue((double)defSpot.blendmaskcol); +// radmaskcol->setValue(defSpot.radmaskcol); +// chromaskcol->setValue(defSpot.chromaskcol); +// Lmaskshape->setCurve(defSpot.Lmaskcurve); + recothresc->setValue(defSpot.recothresc); + lowthresc->setValue(defSpot.lowthresc); + higthresc->setValue(defSpot.higthresc); + decayc->setValue(defSpot.decayc); + + // Enable all listeners + enableListener(); +} + +void LocallabColor::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + structcol->hide(); + blurcolde->hide(); + softradiuscol->hide(); + expgradcol->hide(); + expcurvcol->hide(); + expmaskcol1->hide(); + expmaskcol->hide(); + exprecov->hide(); + maskusablec->hide(); + maskunusablec->hide(); + decayc->hide(); + gamc->hide(); + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + structcol->hide(); + gamc->hide(); + blurcolde->hide(); + strcolab->hide(); + strcolh->hide(); + clCurveEditorG->hide(); + HCurveEditorG->hide(); + H3CurveEditorG->hide(); + H2CurveEditorG->hide(); + rgbCurveEditorG->hide(); + special->hide(); + exprecov->show(); + expmaskcol1->hide(); + struFrame->hide(); + blurFrame->hide(); + lapmaskcol->hide(); + gammaskcol->hide(); + slomaskcol->hide(); + shadmaskcol->hide(); + maskHCurveEditorG->hide(); + mask2CurveEditorGwav->hide(); + csThresholdcol->hide(); + toolcolFrame2->hide(); + // Specific Simple mode widgets are shown in Normal mode + softradiuscol->show(); + if (enaColorMask->get_active()) { + maskusablec->show(); + maskunusablec->hide(); + + } else { + maskusablec->hide(); + maskunusablec->show(); + } + + if (!invers->get_active()) { // Keep widget hidden when invers is toggled + expgradcol->show(); + exprecov->show(); + gamc->hide(); + } + + expcurvcol->show(); + expmaskcol->show(); + decayc->hide(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + structcol->show(); + blurcolde->show(); + gamc->show(); + + if (!invers->get_active()) { // Keep widget hidden when invers is toggled + softradiuscol->show(); + expgradcol->show(); + exprecov->show(); + gamc->show(); + } + + strcolab->show(); + strcolh->show(); + expcurvcol->show(); + if (enaColorMask->get_active()) { + maskusablec->show(); + maskunusablec->hide(); + + } else { + maskusablec->hide(); + maskunusablec->show(); + } + + exprecov->show(); + decayc->show(); + + if (!invers->get_active()) { // Keep widgets hidden when invers is toggled + clCurveEditorG->show(); + HCurveEditorG->show(); + H3CurveEditorG->show(); + } + + H2CurveEditorG->show(); + rgbCurveEditorG->show(); + special->show(); + + if (!invers->get_active()) { // Keep widget hidden when invers is toggled + expmaskcol1->show(); + } + + expmaskcol->show(); + struFrame->show(); + blurFrame->show(); + lapmaskcol->show(); + gammaskcol->show(); + slomaskcol->show(); + shadmaskcol->show(); + maskHCurveEditorG->show(); + mask2CurveEditorGwav->show(); + csThresholdcol->show(); + toolcolFrame2->show(); + } +} + +void LocallabColor::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskshape->updateLocallabBackground(normChromar); + LLmaskshape->updateLocallabBackground(normLumar); + HHmaskshape->updateLocallabBackground(normHuer); + HHhmaskshape->updateLocallabBackground(normHuer); + Lmaskshape->updateLocallabBackground(normLumar); + HHshape->updateLocallabBackground(normHuer); + CHshape->updateLocallabBackground(normHuer); + LHshape->updateLocallabBackground(normHuer); + llshape->updateLocallabBackground(normLumar); + ccshape->updateLocallabBackground(normChromar); + clshape->updateLocallabBackground(normLumar); + lcshape->updateLocallabBackground(normChromar); + + return false; + } + ); +} + +void LocallabColor::curvactivChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (curvactiv->get_active()) { + listener->panelChanged(Evlocallabcurvactiv, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabcurvactiv, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::gridMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabgridMethod, + gridMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabColor::inversChanged() +{ + const bool maskPreviewActivated = isMaskViewActive(); + + // Update GUI according to invers button state + updateColorGUI1(); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (invers->get_active()) { + listener->panelChanged(Evlocallabinvers, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinvers, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::qualitycurveMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabqualitycurveMethod, + qualitycurveMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabColor::toneMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabtoneMethod, + toneMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabColor::specialChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (special->get_active()) { + listener->panelChanged(EvLocallabspecial, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabspecial, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::merMethodChanged() +{ + updateColorGUI2(); // Update GUI according to merMethod combobox state + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabmerMethod, + merMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabColor::mergecolMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabmergecolMethod, + mergecolMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabColor::showmaskcolMethodChanged() +{ + // If mask preview is activated, deactivate other Color & Light mask preview + showmaskcolMethodConninv.block(true); + showmaskcolMethodinv->set_active(0); + showmaskcolMethodConninv.block(false); + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabColor::showmaskcolMethodChangedinv() +{ + // If mask preview is activated, deactivate other Color & Light mask preview + showmaskcolMethodConn.block(true); + showmaskcolMethod->set_active(0); + showmaskcolMethodConn.block(false); + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabColor::enaColorMaskChanged() +{ + if (enaColorMask->get_active()) { + maskusablec->show(); + maskunusablec->hide(); + + } else { + maskusablec->hide(); + maskunusablec->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enaColorMask->get_active()) { + listener->panelChanged(EvLocallabEnaColorMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaColorMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::toolcolChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (toolcol->get_active()) { + listener->panelChanged(EvLocallabtoolcol, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabtoolcol, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::fftColorMaskChanged() +{ + updateColorGUI3(); // Update GUI according to fftColorMash button state + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (fftColorMask->get_active()) { + listener->panelChanged(EvLocallabfftColorMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabfftColorMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabColor::updateColorGUI1() +{ + const int mode = complexity->get_active_row_number(); + + if (invers->get_active()) { + gridFrame->hide(); + structcol->hide(); + softradiuscol->hide(); + expgradcol->hide(); + exprecov->hide(); + labqualcurv->hide(); + qualitycurveMethod->hide(); + clCurveEditorG->hide(); + HCurveEditorG->hide(); + H3CurveEditorG->hide(); + expmaskcol1->hide(); + showmaskcolMethod->hide(); + // Reset hidden mask combobox + showmaskcolMethodConn.block(true); + showmaskcolMethod->set_active(0); + showmaskcolMethodConn.block(false); + showmaskcolMethodinv->show(); + contcol->hide(); + blurcol->hide(); + reparcol->hide(); + gamc->hide(); + } else { + gridFrame->show(); + gamc->hide(); + + if (mode == Expert) { // Keep widget hidden in Normal and Simple mode + structcol->show(); + } + + if (mode == Expert || mode == Normal) { // Keep widget hidden in Simple mode + softradiuscol->show(); + expgradcol->show(); + exprecov->show(); + } + + labqualcurv->show(); + qualitycurveMethod->show(); + + if (mode == Expert) { // Keep widgets hidden in Normal and Simple mode + clCurveEditorG->show(); + HCurveEditorG->show(); + H3CurveEditorG->show(); + expmaskcol1->show(); + gamc->show(); + } + + showmaskcolMethod->show(); + showmaskcolMethodinv->hide(); + // Reset hidden mask combobox + showmaskcolMethodConninv.block(true); + showmaskcolMethodinv->set_active(0); + showmaskcolMethodConninv.block(false); + contcol->show(); + blurcol->show(); + reparcol->show(); + } +} + +void LocallabColor::updateColorGUI2() +{ + // Note: When a merMethod is selected, invers button is set insensitive to avoid the combobox to disappear + switch (merMethod->get_active_row_number()) { + case 0: + invers->set_sensitive(true); + H2CurveEditorG->set_sensitive(true); + rgbCurveEditorG->set_sensitive(true); + special->set_sensitive(true); + mask7->hide(); + conthrcol->hide(); + gridmerFrame->hide(); + break; + + /* + case 1: + invers->set_sensitive(false); + H2CurveEditorG->set_sensitive(true); + rgbCurveEditorG->set_sensitive(true); + special->set_sensitive(true); + mask7->hide(); + conthrcol->hide(); + gridmerFrame->hide(); + break; + */ + case 1: + invers->set_sensitive(false); + H2CurveEditorG->set_sensitive(true); + rgbCurveEditorG->set_sensitive(false); + special->set_sensitive(false); + mask7->show(); + conthrcol->show(); + gridmerFrame->hide(); + break; + + case 2: + invers->set_sensitive(false); + H2CurveEditorG->set_sensitive(true); + rgbCurveEditorG->set_sensitive(false); + special->set_sensitive(false); + mask7->show(); + conthrcol->show(); + gridmerFrame->hide(); + break; + + case 3: + invers->set_sensitive(false); + H2CurveEditorG->set_sensitive(true); + rgbCurveEditorG->set_sensitive(false); + special->set_sensitive(false); + mask7->show(); + conthrcol->hide(); + gridmerFrame->show(); + } +} + +void LocallabColor::updateColorGUI3() +{ + const double temp = blurcol->getValue(); + + if (fftColorMask->get_active()) { + blurcol->setLimits(0.2, 1000., 0.5, 0.2); + } else { + blurcol->setLimits(0.2, 100., 0.5, 0.2); + } + + blurcol->setValue(temp); +} + +/* ==== LocallabExposure ==== */ +LocallabExposure::LocallabExposure(): + LocallabTool(this, M("TP_LOCALLAB_EXP_TOOLNAME"), M("TP_LOCALLAB_EXPOSE"), false), + + // Exposure specific widgets + expMethod(Gtk::manage(new MyComboBoxText())), +// pdeFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_PDEFRA")))), + exppde(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_PDEFRA")))), + laplacexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPLACEXP"), 0.0, 100.0, 0.1, 0.))), + reparexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + linear(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LINEAR"), 0.01, 1., 0.01, 0.05))), + balanexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BALANEXP"), 0.5, 1.5, 0.01, 1.0))), + gamm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMM"), 0.2, 1.3, 0.01, 0.4))), + labelexpmethod(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_NOISEMETH") + ":"))), + exnoiseMethod(Gtk::manage(new MyComboBoxText())), +// fatFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATFRA")))), + expfat(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_FATFRA")))), + fatamount(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATAMOUNT"), 1., 100., 1., 1.))), + fatdetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATDETAIL"), -100., 300., 1., 0.))), + norm(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EQUIL")))), + fatlevel(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATLEVEL"), 0.5, 2.0, 0.01, 1.))), + fatanchor(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 0.1, 100.0, 0.01, 50., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + gamex(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3.0, 0.05, 1.))), + sensiex(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + structexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUCCOL"), 0, 100, 1, 0))), + blurexpde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), + exptoolexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPTOOL")))), + expcomp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EXPCOMP"), MINEXP, MAXEXP, 0.01, 0.))), + black(Gtk::manage(new Adjuster(M("TP_EXPOSURE_BLACKLEVEL"), -16384, 32768, 10, 0))), + hlcompr(Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 500, 1, 0))), + hlcomprthresh(Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD"), 0, 100, 1, 0))), + shadex(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHADEX"), 0, 100, 1, 0))), + shcompr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHADEXCOMP"), 0, 100, 1, 50))), + expchroma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EXPCHROMA"), -50, 100, 1, 5))), + curveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_CURVEEDITOR_TONES_LABEL"))), + shapeexpos(static_cast(curveEditorG->addCurve(CT_Diagonal, ""))), + exprecove(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablee(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablee(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothrese(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthrese(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthrese(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decaye(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + expgradexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), + strexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), + angexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + softradiusexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), + inversex(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), + expmaskexp(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWE")))), + showmaskexpMethod(Gtk::manage(new MyComboBoxText())), + showmaskexpMethodinv(Gtk::manage(new MyComboBoxText())), + enaExpMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), + enaExpMaskaft(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASKAFT")))), + // maskexpCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskexpCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskexpshape(static_cast(maskexpCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskexpshape(static_cast(maskexpCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskexpshape(static_cast(maskexpCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + gradFramemask(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADFRA")))), + strmaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2., 2., 0.05, 0.))), + angmaskexp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180., 180., 0.1, 0.))), + mask2expCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmaskexpshape(static_cast(mask2expCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Exposure specific widgets + expMethod->append(M("TP_LOCALLAB_STD")); + expMethod->append(M("TP_LOCALLAB_PDE")); + expMethod->set_active(0); + expMethodConn = expMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabExposure::expMethodChanged)); + +// pdeFrame->set_label_align(0.025, 0.5); + setExpandAlignProperties(exppde, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + setExpandAlignProperties(expfat, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + laplacexp->setAdjusterListener(this); + reparexp->setAdjusterListener(this); + + linear->setAdjusterListener(this); + + balanexp->setAdjusterListener(this); + + gamm->setAdjusterListener(this); + + exnoiseMethod->append(M("TP_LOCALLAB_NONENOISE")); + exnoiseMethod->append(M("TP_LOCALLAB_MEDIAN")); + exnoiseMethod->append(M("TP_LOCALLAB_WEDIANHI")); + exnoiseMethod->set_active(0); + exnoiseMethodConn = exnoiseMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabExposure::exnoiseMethodChanged)); + + // fatFrame->set_label_align(0.025, 0.5); + + fatamount->setAdjusterListener(this); + + fatdetail->setAdjusterListener(this); + + fatlevel->setAdjusterListener(this); + + fatanchor->setAdjusterListener(this); + + sensiex->setAdjusterListener(this); + + gamex->setAdjusterListener(this); + + structexp->setAdjusterListener(this); + + blurexpde->setAdjusterListener(this); + + setExpandAlignProperties(exptoolexp, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + expcomp->setAdjusterListener(this); + + black->setAdjusterListener(this); + + hlcompr->setAdjusterListener(this); + + hlcomprthresh->setAdjusterListener(this); + + shadex->setAdjusterListener(this); + + shcompr->setAdjusterListener(this); + + expchroma->setAdjusterListener(this); + + curveEditorG->setCurveListener(this); + + shapeexpos->setResetCurve(DiagonalCurveType(defSpot.excurve.at(0)), defSpot.excurve); + shapeexpos->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1}}); + shapeexpos->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1}}); + + curveEditorG->curveListComplete(); + + setExpandAlignProperties(expgradexp, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + strexp->setAdjusterListener(this); + + angexp->setAdjusterListener(this); + angexp->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + + softradiusexp->setLogScale(10, 0); + softradiusexp->setAdjusterListener(this); + recothrese->setAdjusterListener(this); + lowthrese->setAdjusterListener(this); + higthrese->setAdjusterListener(this); + decaye->setAdjusterListener(this); + setExpandAlignProperties(exprecove, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + normConn = norm->signal_toggled().connect(sigc::mem_fun(*this, &LocallabExposure::normChanged)); + + inversexConn = inversex->signal_toggled().connect(sigc::mem_fun(*this, &LocallabExposure::inversexChanged)); + inversex->set_tooltip_text(M("TP_LOCALLAB_INVERS_TOOLTIP")); + + setExpandAlignProperties(expmaskexp, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskexpMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskexpMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskexpMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskexpMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskexpMethod->append(M("TP_LOCALLAB_SHOWSTRUCEX")); + showmaskexpMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskexpMethod->set_active(0); + showmaskexpMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskexpMethodConn = showmaskexpMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabExposure::showmaskexpMethodChanged)); + + showmaskexpMethodinv->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskexpMethodinv->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskexpMethodinv->set_active(0); + showmaskexpMethodinv->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskexpMethodConninv = showmaskexpMethodinv->signal_changed().connect(sigc::mem_fun(*this, &LocallabExposure::showmaskexpMethodChangedinv)); + + enaExpMaskConn = enaExpMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabExposure::enaExpMaskChanged)); + + enaExpMaskaftConn = enaExpMaskaft->signal_toggled().connect(sigc::mem_fun(*this, &LocallabExposure::enaExpMaskaftChanged)); + + maskexpCurveEditorG->setCurveListener(this); + + CCmaskexpshape->setIdentityValue(0.); + CCmaskexpshape->setResetCurve(FlatCurveType(defSpot.CCmaskexpcurve.at(0)), defSpot.CCmaskexpcurve); + CCmaskexpshape->setBottomBarColorProvider(this, 1); + + LLmaskexpshape->setIdentityValue(0.); + LLmaskexpshape->setResetCurve(FlatCurveType(defSpot.LLmaskexpcurve.at(0)), defSpot.LLmaskexpcurve); + LLmaskexpshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1}}); + + HHmaskexpshape->setIdentityValue(0.); + HHmaskexpshape->setResetCurve(FlatCurveType(defSpot.HHmaskexpcurve.at(0)), defSpot.HHmaskexpcurve); + HHmaskexpshape->setCurveColorProvider(this, 2); + HHmaskexpshape->setBottomBarColorProvider(this, 2); + + maskexpCurveEditorG->curveListComplete(); + + blendmaskexp->setAdjusterListener(this); + + radmaskexp->setAdjusterListener(this); + + lapmaskexp->setAdjusterListener(this); + + chromaskexp->setAdjusterListener(this); + + gammaskexp->setAdjusterListener(this); + + slomaskexp->setAdjusterListener(this); + + gradFramemask->set_label_align(0.025, 0.5); + + strmaskexp->setAdjusterListener(this); + + angmaskexp->setAdjusterListener(this); + angmaskexp->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + + mask2expCurveEditorG->setCurveListener(this); + + Lmaskexpshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskexpcurve.at(0)), defSpot.Lmaskexpcurve); + Lmaskexpshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1}}); + Lmaskexpshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1}}); + + mask2expCurveEditorG->curveListComplete(); + + // Add Color & Light specific widgets to GUI + pack_start(*sensiex); + pack_start(*reparexp); + pack_start(*inversex); + ToolParamBlock* const pdeBox = Gtk::manage(new ToolParamBlock()); + pdeBox->pack_start(*laplacexp); + pdeBox->pack_start(*linear); + pdeBox->pack_start(*balanexp); + pdeBox->pack_start(*gamm); + Gtk::Box* const ctboxexpmethod = Gtk::manage(new Gtk::Box()); +// Gtk::Label* const labelexpmethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_NOISEMETH") + ":")); + ctboxexpmethod->pack_start(*labelexpmethod, Gtk::PACK_SHRINK, 4); + ctboxexpmethod->pack_start(*exnoiseMethod); + pdeBox->pack_start(*ctboxexpmethod); + exppde->add(*pdeBox, false); +// pdeFrame->add(*pdeBox); +// pack_start(*pdeFrame); + pack_start(*exppde); + ToolParamBlock* const fatBox = Gtk::manage(new ToolParamBlock()); + fatBox->pack_start(*fatamount); + fatBox->pack_start(*fatdetail); +// fatBox->pack_start(*norm); +// fatBox->pack_start(*fatlevel); + fatBox->pack_start(*fatanchor); +// fatFrame->add(*fatBox); + expfat->add(*fatBox, false); +// pack_start(*fatFrame); + pack_start(*expfat); + pack_start(*expcomp); + pack_start(*gamex); + pack_start(*structexp); + pack_start(*blurexpde); + ToolParamBlock* const toolBox = Gtk::manage(new ToolParamBlock()); + toolBox->pack_start(*black); + toolBox->pack_start(*hlcompr); + toolBox->pack_start(*hlcomprthresh); + toolBox->pack_start(*shadex); + toolBox->pack_start(*shcompr); + toolBox->pack_start(*expchroma); + toolBox->pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + exptoolexp->add(*toolBox, false); + pack_start(*exptoolexp); + ToolParamBlock* const expBox3 = Gtk::manage(new ToolParamBlock()); + expBox3->pack_start(*maskusablee, Gtk::PACK_SHRINK, 0); + expBox3->pack_start(*maskunusablee, Gtk::PACK_SHRINK, 0); + expBox3->pack_start(*recothrese); + expBox3->pack_start(*lowthrese); + expBox3->pack_start(*higthrese); + expBox3->pack_start(*decaye); + exprecove->add(*expBox3, false); + pack_start(*exprecove, false, false); + + ToolParamBlock* const gradBox = Gtk::manage(new ToolParamBlock()); + gradBox->pack_start(*strexp); + gradBox->pack_start(*angexp); + expgradexp->add(*gradBox, false); + pack_start(*expgradexp); + pack_start(*softradiusexp); + // pack_start(*inversex); + ToolParamBlock* const maskexpBox = Gtk::manage(new ToolParamBlock()); + maskexpBox->pack_start(*showmaskexpMethod, Gtk::PACK_SHRINK, 4); + maskexpBox->pack_start(*showmaskexpMethodinv, Gtk::PACK_SHRINK, 4); + maskexpBox->pack_start(*enaExpMask, Gtk::PACK_SHRINK, 0); + // maskexpBox->pack_start(*enaExpMaskaft, Gtk::PACK_SHRINK, 0); + maskexpBox->pack_start(*maskexpCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskexpBox->pack_start(*blendmaskexp, Gtk::PACK_SHRINK, 0); + maskexpBox->pack_start(*radmaskexp, Gtk::PACK_SHRINK, 0); + maskexpBox->pack_start(*lapmaskexp, Gtk::PACK_SHRINK, 0); + maskexpBox->pack_start(*chromaskexp, Gtk::PACK_SHRINK, 0); + maskexpBox->pack_start(*gammaskexp, Gtk::PACK_SHRINK, 0); + maskexpBox->pack_start(*slomaskexp, Gtk::PACK_SHRINK, 0); + ToolParamBlock* const gradmaskBox = Gtk::manage(new ToolParamBlock()); + gradmaskBox->pack_start(*strmaskexp); + gradmaskBox->pack_start(*angmaskexp); + gradFramemask->add(*gradmaskBox); + maskexpBox->pack_start(*gradFramemask); + maskexpBox->pack_start(*mask2expCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmaskexp->add(*maskexpBox, false); + pack_start(*expmaskexp, false, false); +} + +LocallabExposure::~LocallabExposure() +{ + delete curveEditorG; + delete maskexpCurveEditorG; + delete mask2expCurveEditorG; +} + +bool LocallabExposure::isMaskViewActive() +{ + return ((showmaskexpMethod->get_active_row_number() != 0) || (showmaskexpMethodinv->get_active_row_number() != 0)); +} + +void LocallabExposure::resetMaskView() +{ + showmaskexpMethodConn.block(true); + showmaskexpMethodConninv.block(true); + + showmaskexpMethod->set_active(0); + showmaskexpMethodinv->set_active(0); + + showmaskexpMethodConn.block(false); + showmaskexpMethodConninv.block(false); +} + +void LocallabExposure::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + expMask = showmaskexpMethod->get_active_row_number(); + expMaskinv = showmaskexpMethodinv->get_active_row_number(); +} + +void LocallabExposure::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_text(M("TP_LOCALLAB_EXPOSURE_TOOLTIP")); +// expMethod->set_tooltip_text(M("TP_LOCALLAB_EXPMETHOD_TOOLTIP")); +// pdeFrame->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); + exppde->set_tooltip_text(M("TP_LOCALLAB_PDEFRAME_TOOLTIP")); + recothrese->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + exprecove->set_tooltip_markup(M("TP_LOCALLAB_MASKREEXP_TOOLTIP")); + decaye->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthrese->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESE_TOOLTIP")); + higthrese->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESE_TOOLTIP")); + blurexpde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP")); + laplacexp->set_tooltip_text(M("TP_LOCALLAB_EXPLAP_TOOLTIP")); + reparexp->set_tooltip_text(M("TP_LOCALLAB_REPAREXP_TOOLTIP")); + linear->set_tooltip_text(M("TP_LOCALLAB_EXPLAPLIN_TOOLTIP")); + balanexp->set_tooltip_text(M("TP_LOCALLAB_EXPLAPBAL_TOOLTIP")); + gamm->set_tooltip_text(M("TP_LOCALLAB_EXPLAPGAMM_TOOLTIP")); + labelexpmethod->set_tooltip_text(M("TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP")); + exnoiseMethod->set_tooltip_text(M("TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP")); +// fatFrame->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); + expfat->set_tooltip_text(M("TP_LOCALLAB_FATFRAME_TOOLTIP")); + expcomp->set_tooltip_text(M("TP_LOCALLAB_EXPCOMP_TOOLTIP")); + gamex->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); + sensiex->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + structexp->set_tooltip_text(M("TP_LOCALLAB_STRUCT_TOOLTIP")); + expchroma->set_tooltip_text(M("TP_LOCALLAB_EXPCHROMA_TOOLTIP")); + shapeexpos->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP")); + strexp->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); + expmaskexp->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + CCmaskexpshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskexpshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskexpshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmaskexp->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + strmaskexp->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); + mask2expCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmaskexpshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskexpCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskexp->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskexp->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskexp->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskexp->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + } else { + exp->set_tooltip_text(""); + recothrese->set_tooltip_text(""); + exppde->set_tooltip_text(""); + blurexpde->set_tooltip_text(""); + exprecove->set_tooltip_markup(""); + laplacexp->set_tooltip_text(""); + reparexp->set_tooltip_text(""); + linear->set_tooltip_text(""); + balanexp->set_tooltip_text(""); + gamm->set_tooltip_text(""); + labelexpmethod->set_tooltip_text(""); + exnoiseMethod->set_tooltip_text(""); + expfat->set_tooltip_text(""); + expcomp->set_tooltip_text(""); + sensiex->set_tooltip_text(""); + structexp->set_tooltip_text(""); + expchroma->set_tooltip_text(""); + shapeexpos->setTooltip(""); + strexp->set_tooltip_text(""); + expmaskexp->set_tooltip_markup(""); + CCmaskexpshape->setTooltip(""); + LLmaskexpshape->setTooltip(""); + HHmaskexpshape->setTooltip(""); + blendmaskexp->set_tooltip_text(""); + radmaskexp->set_tooltip_text(""); + strmaskexp->set_tooltip_text(""); + mask2expCurveEditorG->set_tooltip_text(""); + Lmaskexpshape->setTooltip(""); + gammaskexp->set_tooltip_text(""); + chromaskexp->set_tooltip_text(""); + slomaskexp->set_tooltip_text(""); + lapmaskexp->set_tooltip_text(""); + gamex->set_tooltip_text(""); + } +} + +void LocallabExposure::setDefaultExpanderVisibility() +{ + exptoolexp->set_expanded(false); + exprecove->set_expanded(false); + exppde->set_expanded(false); + expfat->set_expanded(false); + expgradexp->set_expanded(false); + expmaskexp->set_expanded(false); +} + +void LocallabExposure::disableListener() +{ + LocallabTool::disableListener(); + + expMethodConn.block(true); + exnoiseMethodConn.block(true); + inversexConn.block(true); + normConn.block(true); + showmaskexpMethodConn.block(true); + showmaskexpMethodConninv.block(true); + enaExpMaskConn.block(true); + enaExpMaskaftConn.block(true); +} + +void LocallabExposure::enableListener() +{ + LocallabTool::enableListener(); + + expMethodConn.block(false); + exnoiseMethodConn.block(false); + inversexConn.block(false); + normConn.block(false); + showmaskexpMethodConn.block(false); + showmaskexpMethodConninv.block(false); + enaExpMaskConn.block(false); + enaExpMaskaftConn.block(false); +} + +void LocallabExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visiexpose); + exp->setEnabled(spot.expexpose); + complexity->set_active(spot.complexexpose); +/* + if (spot.expMethod == "std") { + expMethod->set_active(0); + } else if (spot.expMethod == "pde") { + expMethod->set_active(1); + } +*/ + laplacexp->setValue(spot.laplacexp); + reparexp->setValue(spot.reparexp); + linear->setValue(spot.linear); + balanexp->setValue(spot.balanexp); + gamm->setValue(spot.gamm); + + if (spot.exnoiseMethod == "one") { + exnoiseMethod->set_active(0); + } else if (spot.exnoiseMethod == "med") { + exnoiseMethod->set_active(1); + } else if (spot.exnoiseMethod == "medhi") { + exnoiseMethod->set_active(2); + } + + recothrese->setValue((double)spot.recothrese); + lowthrese->setValue((double)spot.lowthrese); + higthrese->setValue((double)spot.higthrese); + decaye->setValue((double)spot.decaye); + + fatamount->setValue(spot.fatamount); + fatdetail->setValue(spot.fatdetail); + fatlevel->setValue(spot.fatlevel); + fatanchor->setValue(spot.fatanchor); + // fatlevel->setValue(1.); + // fatanchor->setValue(1.); + sensiex->setValue(spot.sensiex); + gamex->setValue(spot.gamex); + structexp->setValue(spot.structexp); + blurexpde->setValue(spot.blurexpde); + expcomp->setValue(spot.expcomp); + black->setValue(spot.black); + hlcompr->setValue(spot.hlcompr); + hlcomprthresh->setValue(spot.hlcomprthresh); + shadex->setValue(spot.shadex); + shcompr->setValue(spot.shcompr); + expchroma->setValue(spot.expchroma); + shapeexpos->setCurve(spot.excurve); + strexp->setValue(spot.strexp); + angexp->setValue(spot.angexp); + softradiusexp->setValue(spot.softradiusexp); + norm->set_active(spot.norm); + inversex->set_active(spot.inversex); + enaExpMask->set_active(spot.enaExpMask); + enaExpMaskaft->set_active(spot.enaExpMaskaft); + CCmaskexpshape->setCurve(spot.CCmaskexpcurve); + LLmaskexpshape->setCurve(spot.LLmaskexpcurve); + HHmaskexpshape->setCurve(spot.HHmaskexpcurve); + blendmaskexp->setValue(spot.blendmaskexp); + radmaskexp->setValue(spot.radmaskexp); + lapmaskexp->setValue(spot.lapmaskexp); + chromaskexp->setValue(spot.chromaskexp); + gammaskexp->setValue(spot.gammaskexp); + slomaskexp->setValue(spot.slomaskexp); + strmaskexp->setValue(spot.strmaskexp); + angmaskexp->setValue(spot.angmaskexp); + Lmaskexpshape->setCurve(spot.Lmaskexpcurve); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update shcompr sensitivity according to black and shadex value + updateExposureGUI1(); + + // Update exposure GUI according to expMethod value + updateExposureGUI2(); + + // Update exposure GUI according to inversex button state + updateExposureGUI3(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabExposure::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expexpose = exp->getEnabled(); + spot.visiexpose = exp->get_visible(); + spot.complexexpose = complexity->get_active_row_number(); +/* + if (expMethod->get_active_row_number() == 0) { + spot.expMethod = "std"; + } else if (expMethod->get_active_row_number() == 1) { + spot.expMethod = "pde"; + } +*/ + spot.laplacexp = laplacexp->getValue(); + spot.reparexp = reparexp->getValue(); + spot.linear = linear->getValue(); + spot.balanexp = balanexp->getValue(); + spot.gamm = gamm->getValue(); + + if (exnoiseMethod->get_active_row_number() == 0) { + spot.exnoiseMethod = "none"; + } else if (exnoiseMethod->get_active_row_number() == 1) { + spot.exnoiseMethod = "med"; + } else if (exnoiseMethod->get_active_row_number() == 2) { + spot.exnoiseMethod = "medhi"; + } + spot.recothrese = recothrese->getValue(); + spot.lowthrese = lowthrese->getValue(); + spot.higthrese = higthrese->getValue(); + spot.decaye = decaye->getValue(); + + spot.fatamount = fatamount->getValue(); + spot.fatdetail = fatdetail->getValue(); + spot.fatlevel = fatlevel->getValue(); + spot.fatanchor = fatanchor->getValue(); + spot.sensiex = sensiex->getIntValue(); + spot.gamex = gamex->getValue(); + spot.structexp = structexp->getIntValue(); + spot.blurexpde = blurexpde->getIntValue(); + spot.expcomp = expcomp->getValue(); + spot.black = black->getIntValue(); + spot.hlcompr = hlcompr->getIntValue(); + spot.hlcomprthresh = hlcomprthresh->getIntValue(); + spot.shadex = shadex->getIntValue(); + spot.shcompr = shcompr->getIntValue(); + spot.expchroma = expchroma->getIntValue(); + spot.excurve = shapeexpos->getCurve(); + spot.strexp = strexp->getValue(); + spot.angexp = angexp->getValue(); + spot.softradiusexp = softradiusexp->getValue(); + spot.inversex = inversex->get_active(); + spot.norm = norm->get_active(); + spot.enaExpMask = enaExpMask->get_active(); + spot.enaExpMaskaft = enaExpMaskaft->get_active(); + spot.CCmaskexpcurve = CCmaskexpshape->getCurve(); + spot.LLmaskexpcurve = LLmaskexpshape->getCurve(); + spot.HHmaskexpcurve = HHmaskexpshape->getCurve(); + spot.blendmaskexp = blendmaskexp->getIntValue(); + spot.radmaskexp = radmaskexp->getValue(); + spot.lapmaskexp = lapmaskexp->getValue(); + spot.chromaskexp = chromaskexp->getValue(); + spot.gammaskexp = gammaskexp->getValue(); + spot.slomaskexp = slomaskexp->getValue(); + spot.strmaskexp = strmaskexp->getValue(); + spot.angmaskexp = angmaskexp->getValue(); + spot.Lmaskexpcurve = Lmaskexpshape->getCurve(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabExposure::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster widgets + laplacexp->setDefault(defSpot.laplacexp); + reparexp->setDefault(defSpot.reparexp); + linear->setDefault(defSpot.linear); + balanexp->setDefault(defSpot.balanexp); + gamm->setDefault(defSpot.gamm); + fatamount->setDefault(defSpot.fatamount); + fatdetail->setDefault(defSpot.fatdetail); + fatlevel->setDefault(defSpot.fatlevel); + fatanchor->setDefault(defSpot.fatanchor); + sensiex->setDefault((double)defSpot.sensiex); + gamex->setDefault((double)defSpot.gamex); + structexp->setDefault((double)defSpot.structexp); + blurexpde->setDefault((double)defSpot.blurexpde); + expcomp->setDefault(defSpot.expcomp); + black->setDefault((double)defSpot.black); + hlcompr->setDefault((double)defSpot.hlcompr); + hlcomprthresh->setDefault((double)defSpot.hlcomprthresh); + shadex->setDefault((double)defSpot.shadex); + shcompr->setDefault((double)defSpot.shcompr); + expchroma->setDefault((double)defSpot.expchroma); + strexp->setDefault(defSpot.strexp); + angexp->setDefault(defSpot.angexp); + softradiusexp->setDefault(defSpot.softradiusexp); + blendmaskexp->setDefault((double)defSpot.blendmaskexp); + radmaskexp->setDefault(defSpot.radmaskexp); + lapmaskexp->setDefault(defSpot.lapmaskexp); + chromaskexp->setDefault(defSpot.chromaskexp); + gammaskexp->setDefault(defSpot.gammaskexp); + slomaskexp->setDefault(defSpot.slomaskexp); + strmaskexp->setDefault(defSpot.strmaskexp); + angmaskexp->setDefault(defSpot.angmaskexp); + recothrese->setDefault((double)defSpot.recothrese); + lowthrese->setDefault((double)defSpot.lowthrese); + higthrese->setDefault((double)defSpot.higthrese); + decaye->setDefault((double)defSpot.decaye); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabExposure::adjusterChanged(Adjuster* a, double newval) +{ + // Update shcompr sensitivity according to black and shadex value + if (a == black || a == shadex) { + updateExposureGUI1(); + } + + if (isLocActivated && exp->getEnabled()) { + if (a == laplacexp) { + if (listener) { + listener->panelChanged(Evlocallablaplacexp, + laplacexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == reparexp) { + if (listener) { + listener->panelChanged(Evlocallabreparexp, + reparexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == linear) { + if (listener) { + listener->panelChanged(Evlocallablinear, + linear->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == balanexp) { + if (listener) { + listener->panelChanged(Evlocallabbalanexp, + balanexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gamm) { + if (listener) { + listener->panelChanged(Evlocallabgamm, + gamm->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == fatamount) { + if (listener) { + listener->panelChanged(Evlocallabfatamount, + fatamount->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == fatdetail) { + if (listener) { + listener->panelChanged(Evlocallabfatdetail, + fatdetail->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == fatlevel) { + if (listener) { + listener->panelChanged(Evlocallabfatlevel, + fatlevel->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == fatanchor) { + if (listener) { + listener->panelChanged(Evlocallabfatanchor, + fatanchor->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gamex) { + if (listener) { + listener->panelChanged(Evlocallabgamex, + gamex->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothrese) { + if (listener) { + listener->panelChanged(Evlocallabrecothrese, + recothrese->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthrese) { + if (listener) { + listener->panelChanged(Evlocallablowthrese, + lowthrese->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthrese) { + if (listener) { + listener->panelChanged(Evlocallabhigthrese, + higthrese->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decaye) { + if (listener) { + listener->panelChanged(Evlocallabdecaye, + decaye->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensiex) { + if (listener) { + listener->panelChanged(Evlocallabsensiex, + sensiex->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == structexp) { + if (listener) { + listener->panelChanged(Evlocallabstructexp, + structexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blurexpde) { + if (listener) { + listener->panelChanged(Evlocallabblurexpde, + blurexpde->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == expcomp) { + if (listener) { + listener->panelChanged(Evlocallabexpcomp, + expcomp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == black) { + if (listener) { + listener->panelChanged(Evlocallabblack, + black->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == hlcompr) { + if (listener) { + listener->panelChanged(Evlocallabhlcompr, + hlcompr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == hlcomprthresh) { + if (listener) { + listener->panelChanged(Evlocallabhlcomprthresh, + hlcomprthresh->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shadex) { + if (listener) { + listener->panelChanged(Evlocallabshadex, + shadex->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shcompr) { + if (listener) { + listener->panelChanged(Evlocallabshcompr, + shcompr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == expchroma) { + if (listener) { + listener->panelChanged(Evlocallabexpchroma, + expchroma->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strexp) { + if (listener) { + listener->panelChanged(Evlocallabstrexp, + strexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == angexp) { + if (listener) { + listener->panelChanged(Evlocallabangexp, + angexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == softradiusexp) { + if (listener) { + listener->panelChanged(Evlocallabsoftradiusexp, + softradiusexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskexp) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskexp, + blendmaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskexp) { + if (listener) { + listener->panelChanged(Evlocallabradmaskexp, + radmaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskexp) { + if (listener) { + listener->panelChanged(Evlocallablapmaskexp, + lapmaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskexp) { + if (listener) { + listener->panelChanged(Evlocallabchromaskexp, + chromaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskexp) { + if (listener) { + listener->panelChanged(Evlocallabgammaskexp, + gammaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskexp) { + if (listener) { + listener->panelChanged(Evlocallabslomaskexp, + slomaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strmaskexp) { + if (listener) { + listener->panelChanged(Evlocallabstrmaskexp, + strmaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == angmaskexp) { + if (listener) { + listener->panelChanged(Evlocallabangmaskexp, + angmaskexp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabExposure::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == shapeexpos) { + if (listener) { + listener->panelChanged(Evlocallabshapeexpos, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CCmaskexpshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskexpshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskexpshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskexpshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskexpshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskexpshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskexpshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskexpshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabExposure::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenaexpose, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenaexpose, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabExposure::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + gamex->setValue(defSpot.gamex); + + // Set hidden GUI widgets in Normal mode to default spot values + structexp->setValue((double)defSpot.structexp); + blurexpde->setValue((double)defSpot.blurexpde); + lapmaskexp->setValue(defSpot.lapmaskexp); + gammaskexp->setValue(defSpot.gammaskexp); + slomaskexp->setValue(defSpot.slomaskexp); + strmaskexp->setValue(defSpot.strmaskexp); + angmaskexp->setValue(defSpot.angmaskexp); + decaye->setValue(defSpot.decaye); +// norm->set_active(defSpot.enaExpMask); + fatlevel->setValue(defSpot.fatlevel); + + // Enable all listeners + enableListener(); +} + +void LocallabExposure::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + fatlevel->setValue(defSpot.fatlevel); + fatanchor->setValue(defSpot.fatanchor); + norm->set_active(false); + // Set hidden specific GUI widgets in Simple mode to default spot values + strexp->setValue(defSpot.strexp); + angexp->setValue(defSpot.angexp); + softradiusexp->setValue(defSpot.softradiusexp); + enaExpMask->set_active(defSpot.enaExpMask); + enaExpMaskaft->set_active(defSpot.enaExpMaskaft); + gamex->setValue(defSpot.gamex); + // CCmaskexpshape->setCurve(defSpot.CCmaskexpcurve); + // LLmaskexpshape->setCurve(defSpot.CCmaskexpcurve); + // HHmaskexpshape->setCurve(defSpot.HHmaskexpcurve); + // blendmaskexp->setValue((double)defSpot.blendmaskexp); + // radmaskexp->setValue(defSpot.radmaskexp); +// chromaskexp->setValue(defSpot.chromaskexp); +// Lmaskexpshape->setCurve(defSpot.Lmaskexpcurve); + recothrese->setValue(defSpot.recothrese); + lowthrese->setValue(defSpot.lowthrese); + higthrese->setValue(defSpot.higthrese); + decaye->setValue(defSpot.decaye); + + // Enable all listeners + enableListener(); +} + +void LocallabExposure::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + structexp->hide(); + blurexpde->hide(); + expgradexp->hide(); + softradiusexp->hide(); + exprecove->hide(); + maskusablee->hide(); + maskunusablee->hide(); + decaye->hide(); + expmaskexp->hide(); + norm->hide(); + fatlevel->hide(); + fatanchor->hide(); + gamex->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + structexp->hide(); + gamex->hide(); + blurexpde->hide(); + lapmaskexp->hide(); + gammaskexp->hide(); + slomaskexp->hide(); + gradFramemask->hide(); + exprecove->show(); + if (enaExpMask->get_active()) { + maskusablee->show(); + maskunusablee->hide(); + + } else { + maskusablee->hide(); + maskunusablee->show(); + } + norm->show(); + fatlevel->hide(); + fatanchor->show(); + + // Specific Simple mode widgets are shown in Normal mode + softradiusexp->hide(); + blurexpde->hide(); + + if (!inversex->get_active()) { // Keep widget hidden when invers is toggled + expgradexp->show(); + softradiusexp->show(); + exprecove->show(); + gamex->hide(); + blurexpde->show(); + } + + expmaskexp->show(); + decaye->hide(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + structexp->hide(); + if (!inversex->get_active()) { // Keep widget hidden when invers is toggled + structexp->show(); + } + + blurexpde->show(); + norm->show(); + fatlevel->show(); + fatanchor->show(); + softradiusexp->hide(); + gamex->show(); + + if (!inversex->get_active()) { // Keep widget hidden when invers is toggled + expgradexp->show(); + softradiusexp->show(); + exprecove->show(); + gamex->show(); + blurexpde->show(); + + } + if (enaExpMask->get_active()) { + maskusablee->show(); + maskunusablee->hide(); + + } else { + maskusablee->hide(); + maskunusablee->show(); + } + + expmaskexp->show(); + lapmaskexp->show(); + gammaskexp->show(); + slomaskexp->show(); + gradFramemask->show(); + decaye->show(); + } +} + +void LocallabExposure::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskexpshape->updateLocallabBackground(normChromar); + LLmaskexpshape->updateLocallabBackground(normLumar); + HHmaskexpshape->updateLocallabBackground(normHuer); + shapeexpos->updateLocallabBackground(normLumar); + Lmaskexpshape->updateLocallabBackground(normLumar); + return false; + } + ); +} + +void LocallabExposure::expMethodChanged() +{ + // Update exposure GUI according to expMethod value + updateExposureGUI2(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabexpMethod, + expMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabExposure::exnoiseMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabexnoiseMethod, + exnoiseMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabExposure::normChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (norm->get_active()) { + listener->panelChanged(Evlocallabnorm, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabnorm, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + + +void LocallabExposure::inversexChanged() +{ + const bool maskPreviewActivated = isMaskViewActive(); + + // Update exposure GUI according to inversex button state + updateExposureGUI3(); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (inversex->get_active()) { + listener->panelChanged(Evlocallabinversex, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinversex, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabExposure::showmaskexpMethodChanged() +{ + // If mask preview is activated, deactivate other Exposure mask preview + showmaskexpMethodConninv.block(true); + showmaskexpMethodinv->set_active(0); + showmaskexpMethodConninv.block(false); + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabExposure::showmaskexpMethodChangedinv() +{ + // If mask preview is activated, deactivate other Exposure mask preview + showmaskexpMethodConn.block(true); + showmaskexpMethod->set_active(0); + showmaskexpMethodConn.block(false); + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabExposure::enaExpMaskChanged() +{ + if (enaExpMask->get_active()) { + maskusablee->show(); + maskunusablee->hide(); + } else { + maskusablee->hide(); + maskunusablee->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enaExpMask->get_active()) { + listener->panelChanged(EvLocallabEnaExpMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaExpMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabExposure::enaExpMaskaftChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enaExpMaskaft->get_active()) { + listener->panelChanged(EvLocallabEnaExpMaskaft, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaExpMaskaft, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabExposure::updateExposureGUI1() +{ + // Update shcompr sensitivity according to black and shadex value + if (black->getIntValue() == 0 && shadex->getIntValue() == 0) { + shcompr->set_sensitive(false); + } else { + shcompr->set_sensitive(true); + } +} + +void LocallabExposure::updateExposureGUI2() +{ /* + // Update exposure GUI according to expMethod value + if (expMethod->get_active_row_number() == 0) { +// pdeFrame->hide(); +// fatFrame->hide(); + exppde->hide(); + expfat->hide(); + softradiusexp->set_sensitive(true); + sensiex->set_sensitive(true); + } else if (expMethod->get_active_row_number() == 1) { + // pdeFrame->show(); + // fatFrame->show(); + exppde->show(); + expfat->show(); + softradiusexp->set_sensitive(false); + sensiex->set_sensitive(true); + } + */ +} + +void LocallabExposure::updateExposureGUI3() +{ + const int mode = complexity->get_active_row_number(); + + // Update exposure GUI according to inversex button state + if (inversex->get_active()) { + expMethod->hide(); + expcomp->setLabel(M("TP_LOCALLAB_EXPCOMPINV")); + exprecove->hide(); + reparexp->hide(); + gamex->hide(); + expfat->hide(); + exppde->hide(); + structexp->hide(); + blurexpde->hide(); + + // Manage specific case where expMethod is different from 0 + if (expMethod->get_active_row_number() > 0) { + expMethodConn.block(true); + expMethod->set_active(0); + expMethodConn.block(false); + + // Update GUI accordingly + updateExposureGUI2(); + } + + softradiusexp->hide(); + expgradexp->hide(); + showmaskexpMethod->hide(); + // Reset hidden mask combobox + showmaskexpMethodConn.block(true); + showmaskexpMethod->set_active(0); + showmaskexpMethodConn.block(false); + showmaskexpMethodinv->show(); + } else { + expMethod->show(); + expcomp->setLabel(M("TP_LOCALLAB_EXPCOMP")); + gamex->hide(); + expfat->show(); + exppde->show(); + + if (mode == Normal) { // Keep widgets hidden in Simple mode + softradiusexp->show(); + expgradexp->show(); + exprecove->show(); + blurexpde->show(); + } + if (mode == Expert) { // Keep widgets hidden in Simple mode + softradiusexp->show(); + expgradexp->show(); + exprecove->show(); + structexp->show(); + blurexpde->show(); + gamex->show(); + + } + + reparexp->show(); + + showmaskexpMethodinv->hide(); + // Reset hidden mask combobox + showmaskexpMethodConninv.block(true); + showmaskexpMethodinv->set_active(0); + showmaskexpMethodConninv.block(false); + showmaskexpMethod->show(); + } +} + +/* ==== LocallabShadow ==== */ +LocallabShadow::LocallabShadow(): + LocallabTool(this, M("TP_LOCALLAB_SH_TOOLNAME"), M("TP_LOCALLAB_SHADHIGH"), false), + + // Shadow highlight specific widgets + shMethod(Gtk::manage(new MyComboBoxText())), + reparsh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + multipliersh([]() -> std::array + { + std::array res = {}; + + for (unsigned int i = 0; i < res.size(); ++i) { + Glib::ustring ss = Glib::ustring::format(i); + + if (i == 0) { + ss += Glib::ustring::compose(" (%1)", M("TP_LOCALLAB_LUMADARKEST")); + } else if (i == 4) { + ss += Glib::ustring::compose(" (%1)", M("TP_LOCALLAB_LUMAWHITESEST")); + } + + res[i] = Gtk::manage(new Adjuster(std::move(ss), -100, 100, 1, 0)); + } + + return res; + } + ()), + detailSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILSH"), -5, 5, 1, 0))), + tePivot(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TE_PIVOT"), -12, 12, 0.05, 0))), + 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, 70))), + 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, 30))), + sh_radius(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_RADIUS"), 0, 100, 1, 40))), + sensihs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 15))),//unused here, but used for normalize_mean_dt + blurSHde(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURDE"), 2, 100, 1, 5))), + exprecovs(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusables(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusables(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothress(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthress(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthress(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decays(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + gamFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GAMFRA")))), + gamSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMSH"), 0.25, 15.0, 0.01, 2.4))), + sloSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOSH"), 0.0, 500.0, 0.01, 12.92))), + expgradsh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), + strSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), + angSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + inverssh(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), + expmasksh(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWS")))), + showmaskSHMethod(Gtk::manage(new MyComboBoxText())), + showmaskSHMethodinv(Gtk::manage(new MyComboBoxText())), + enaSHMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), +// maskSHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskSHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskSHshape(static_cast(maskSHCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskSHshape(static_cast(maskSHCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskSHshape(static_cast(maskSHCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + mask2SHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + LmaskSHshape(static_cast(mask2SHCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + fatSHFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_FATSHFRA")))), + fatamountSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATAMOUNT"), 1., 100., 1., 1.))), + fatanchorSH(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATANCHOR"), 1., 100., 1., 50., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + EvlocallabTePivot(ProcEventMapper::getInstance()->newEvent(AUTOEXP, "HISTORY_MSG_LOCALLAB_TE_PIVOT")) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Shadow highlight specific widgets + shMethod->append(M("TP_LOCALLAB_SH1")); + shMethod->append(M("TP_LOCALLAB_SH2")); + shMethod->set_active(0); + shMethodConn = shMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabShadow::shMethodChanged)); + + for (const auto multiplier : multipliersh) { + multiplier->setAdjusterListener(this); + } + + detailSH->setAdjusterListener(this); + tePivot->setAdjusterListener(this); + reparsh->setAdjusterListener(this); + + highlights->setAdjusterListener(this); + + h_tonalwidth->setAdjusterListener(this); + + shadows->setAdjusterListener(this); + + s_tonalwidth->setAdjusterListener(this); + + sh_radius->setAdjusterListener(this); + + + recothress->setAdjusterListener(this); + lowthress->setAdjusterListener(this); + higthress->setAdjusterListener(this); + decays->setAdjusterListener(this); + setExpandAlignProperties(exprecovs, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + sensihs->setAdjusterListener(this); + + blurSHde->setAdjusterListener(this); + + gamSH->setAdjusterListener(this); + sloSH->setLogScale(16, 0); + + sloSH->setAdjusterListener(this); + + setExpandAlignProperties(expgradsh, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + strSH->setAdjusterListener(this); + + angSH->setAdjusterListener(this); + angSH->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + + inversshConn = inverssh->signal_toggled().connect(sigc::mem_fun(*this, &LocallabShadow::inversshChanged)); + inverssh->set_tooltip_text(M("TP_LOCALLAB_INVERS_TOOLTIP")); + + setExpandAlignProperties(expmasksh, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskSHMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskSHMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskSHMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskSHMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskSHMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskSHMethod->set_active(0); + showmaskSHMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskSHMethodConn = showmaskSHMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabShadow::showmaskSHMethodChanged)); + + showmaskSHMethodinv->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskSHMethodinv->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskSHMethodinv->set_active(0); + showmaskSHMethodinv->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskSHMethodConninv = showmaskSHMethodinv->signal_changed().connect(sigc::mem_fun(*this, &LocallabShadow::showmaskSHMethodChangedinv)); + + enaSHMaskConn = enaSHMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabShadow::enaSHMaskChanged)); + + maskSHCurveEditorG->setCurveListener(this); + + CCmaskSHshape->setIdentityValue(0.); + CCmaskSHshape->setResetCurve(FlatCurveType(defSpot.CCmaskSHcurve.at(0)), defSpot.CCmaskSHcurve); + CCmaskSHshape->setBottomBarColorProvider(this, 1); + + LLmaskSHshape->setIdentityValue(0.); + LLmaskSHshape->setResetCurve(FlatCurveType(defSpot.LLmaskSHcurve.at(0)), defSpot.LLmaskSHcurve); + LLmaskSHshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskSHshape->setIdentityValue(0.); + HHmaskSHshape->setResetCurve(FlatCurveType(defSpot.HHmaskSHcurve.at(0)), defSpot.HHmaskSHcurve); + HHmaskSHshape->setCurveColorProvider(this, 2); + HHmaskSHshape->setBottomBarColorProvider(this, 2); + + maskSHCurveEditorG->curveListComplete(); + + blendmaskSH->setAdjusterListener(this); + + radmaskSH->setAdjusterListener(this); + + lapmaskSH->setAdjusterListener(this); + + chromaskSH->setAdjusterListener(this); + + gammaskSH->setAdjusterListener(this); + + slomaskSH->setAdjusterListener(this); + + mask2SHCurveEditorG->setCurveListener(this); + + LmaskSHshape->setResetCurve(DiagonalCurveType(defSpot.LmaskSHcurve.at(0)), defSpot.LmaskSHcurve); + LmaskSHshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + LmaskSHshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2SHCurveEditorG->curveListComplete(); + + fatSHFrame->set_label_align(0.025, 0.5); + + fatamountSH->setAdjusterListener(this); + + fatanchorSH->setAdjusterListener(this); + + // Add Shadow highlight specific widgets to GUI + pack_start(*reparsh); + pack_start(*inverssh); + pack_start(*shMethod); + + for (const auto multiplier : multipliersh) { + pack_start(*multiplier); + } + + pack_start(*detailSH); + pack_start(*tePivot); + pack_start(*highlights); + pack_start(*h_tonalwidth); + pack_start(*shadows); + pack_start(*s_tonalwidth); + pack_start(*sh_radius); + // pack_start(*sensihs);//unused here, but used for normalize_mean_dt + pack_start(*blurSHde); + ToolParamBlock* const shBox3 = Gtk::manage(new ToolParamBlock()); + shBox3->pack_start(*maskusables, Gtk::PACK_SHRINK, 0); + shBox3->pack_start(*maskunusables, Gtk::PACK_SHRINK, 0); + shBox3->pack_start(*recothress); + shBox3->pack_start(*lowthress); + shBox3->pack_start(*higthress); + shBox3->pack_start(*decays); + // colBox3->pack_start(*invmaskc); + exprecovs->add(*shBox3, false); + pack_start(*exprecovs, false, false); + gamFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const gammBox = Gtk::manage(new ToolParamBlock()); + gammBox->pack_start(*gamSH); + gammBox->pack_start(*sloSH); + gamFrame->add(*gammBox); + pack_start(*gamFrame); + ToolParamBlock* const gradSHBox = Gtk::manage(new ToolParamBlock()); + gradSHBox->pack_start(*strSH); + gradSHBox->pack_start(*angSH); + expgradsh->add(*gradSHBox, false); + pack_start(*expgradsh); +// pack_start(*inverssh); + ToolParamBlock* const maskSHBox = Gtk::manage(new ToolParamBlock()); + maskSHBox->pack_start(*showmaskSHMethod, Gtk::PACK_SHRINK, 4); + maskSHBox->pack_start(*showmaskSHMethodinv, Gtk::PACK_SHRINK, 4); + maskSHBox->pack_start(*enaSHMask, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*maskSHCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskSHBox->pack_start(*blendmaskSH, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*radmaskSH, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*lapmaskSH, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*chromaskSH, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*gammaskSH, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*slomaskSH, Gtk::PACK_SHRINK, 0); + maskSHBox->pack_start(*mask2SHCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + ToolParamBlock* const fatSHBox = Gtk::manage(new ToolParamBlock()); + fatSHBox->pack_start(*fatamountSH); + fatSHBox->pack_start(*fatanchorSH); + fatSHFrame->add(*fatSHBox); + // maskSHBox->pack_start(*fatSHFrame); + expmasksh->add(*maskSHBox, false); + pack_start(*expmasksh, false, false); +} + +LocallabShadow::~LocallabShadow() +{ + delete maskSHCurveEditorG; + delete mask2SHCurveEditorG; +} + +bool LocallabShadow::isMaskViewActive() +{ + return ((showmaskSHMethod->get_active_row_number() != 0) || (showmaskSHMethodinv->get_active_row_number() != 0)); +} + +void LocallabShadow::resetMaskView() +{ + showmaskSHMethodConn.block(true); + showmaskSHMethodConninv.block(true); + + showmaskSHMethod->set_active(0); + showmaskSHMethodinv->set_active(0); + + showmaskSHMethodConn.block(false); + showmaskSHMethodConninv.block(false); +} + +void LocallabShadow::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + shMask = showmaskSHMethod->get_active_row_number(); + shMaskinv = showmaskSHMethodinv->get_active_row_number(); +} + +void LocallabShadow::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_text(M("TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP")); + + for (const auto multiplier : multipliersh) { + multiplier->set_tooltip_text(M("TP_LOCALLAB_MULTIPL_TOOLTIP")); + } + recothress->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + gamSH->set_tooltip_text(M("TP_LOCALLAB_SHTRC_TOOLTIP")); + reparsh->set_tooltip_text(M("TP_LOCALLAB_REPARSH_TOOLTIP")); + sloSH->set_tooltip_text(M("TP_LOCALLAB_SHTRC_TOOLTIP")); + strSH->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); + exprecovs->set_tooltip_markup(M("TP_LOCALLAB_MASKRESH_TOOLTIP")); + expmasksh->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + blurSHde->set_tooltip_text(M("TP_LOCALLAB_BLURCOLDE_TOOLTIP")); + CCmaskSHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskSHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskSHshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmaskSH->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + mask2SHCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + LmaskSHshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskSHCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskSH->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskSH->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskSH->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskSH->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + /* + highlights->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + h_tonalwidth->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + shadows->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + s_tonalwidth->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + sh_radius->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + */ + highlights->set_tooltip_text(""); + h_tonalwidth->set_tooltip_text(""); + shadows->set_tooltip_text(""); + s_tonalwidth->set_tooltip_text(""); + sh_radius->set_tooltip_text(""); + decays->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthress->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESS_TOOLTIP")); + higthress->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESS_TOOLTIP")); + + } else { + exp->set_tooltip_text(""); + + for (const auto multiplier : multipliersh) { + multiplier->set_tooltip_text(""); + } + recothress->set_tooltip_text(""); + gamSH->set_tooltip_text(""); + reparsh->set_tooltip_text(""); + sloSH->set_tooltip_text(""); + strSH->set_tooltip_text(""); + blurSHde->set_tooltip_text(""); + expmasksh->set_tooltip_markup(""); + CCmaskSHshape->setTooltip(""); + LLmaskSHshape->setTooltip(""); + HHmaskSHshape->setTooltip(""); + blendmaskSH->set_tooltip_text(""); + radmaskSH->set_tooltip_text(""); + lapmaskSH->set_tooltip_text(""); + mask2SHCurveEditorG->set_tooltip_text(""); + LmaskSHshape->setTooltip(""); + maskSHCurveEditorG->set_tooltip_markup(""); + gammaskSH->set_tooltip_text(""); + chromaskSH->set_tooltip_text(""); + slomaskSH->set_tooltip_text(""); + highlights->set_tooltip_text(""); + h_tonalwidth->set_tooltip_text(""); + shadows->set_tooltip_text(""); + s_tonalwidth->set_tooltip_text(""); + sh_radius->set_tooltip_text(""); + exprecovs->set_tooltip_markup(""); + decays->set_tooltip_text(""); + lowthress->set_tooltip_text(""); + higthress->set_tooltip_text(""); + + } +} + +void LocallabShadow::setDefaultExpanderVisibility() +{ + exprecovs->set_expanded(false); + expgradsh->set_expanded(false); + expmasksh->set_expanded(false); +} + +void LocallabShadow::disableListener() +{ + LocallabTool::disableListener(); + + shMethodConn.block(true); + inversshConn.block(true); + showmaskSHMethodConn.block(true); + showmaskSHMethodConninv.block(true); + enaSHMaskConn.block(true); +} + +void LocallabShadow::enableListener() +{ + LocallabTool::enableListener(); + + shMethodConn.block(false); + inversshConn.block(false); + showmaskSHMethodConn.block(false); + showmaskSHMethodConninv.block(false); + enaSHMaskConn.block(false); +} + +void LocallabShadow::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visishadhigh); + exp->setEnabled(spot.expshadhigh); + complexity->set_active(spot.complexshadhigh); + + if (spot.shMethod == "std") { + shMethod->set_active(0); + } else if (spot.shMethod == "tone") { + shMethod->set_active(1); + } + + for (int i = 0; i < 5; i++) { + multipliersh[i]->setValue((double)spot.multsh[i]); + } + recothress->setValue((double)spot.recothress); + lowthress->setValue((double)spot.lowthress); + higthress->setValue((double)spot.higthress); + decays->setValue((double)spot.decays); + + detailSH->setValue((double)spot.detailSH); + tePivot->setValue(spot.tePivot); + reparsh->setValue(spot.reparsh); + highlights->setValue((double)spot.highlights); + h_tonalwidth->setValue((double)spot.h_tonalwidth); + shadows->setValue(spot.shadows); + s_tonalwidth->setValue((double)spot.s_tonalwidth); + sh_radius->setValue((double)spot.sh_radius); + sensihs->setValue((double)spot.sensihs); + blurSHde->setValue((double)spot.blurSHde); + gamSH->setValue(spot.gamSH); + sloSH->setValue(spot.sloSH); + strSH->setValue(spot.strSH); + angSH->setValue(spot.angSH); + inverssh->set_active(spot.inverssh); + enaSHMask->set_active(spot.enaSHMask); + CCmaskSHshape->setCurve(spot.CCmaskSHcurve); + LLmaskSHshape->setCurve(spot.LLmaskSHcurve); + HHmaskSHshape->setCurve(spot.HHmaskSHcurve); + blendmaskSH->setValue((double)spot.blendmaskSH); + radmaskSH->setValue(spot.radmaskSH); + lapmaskSH->setValue(spot.lapmaskSH); + chromaskSH->setValue(spot.chromaskSH); + gammaskSH->setValue(spot.gammaskSH); + slomaskSH->setValue(spot.slomaskSH); + LmaskSHshape->setCurve(spot.LmaskSHcurve); + fatamountSH->setValue(spot.fatamountSH); + fatanchorSH->setValue(spot.fatanchorSH); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update shadow highlight GUI according to inverssh button state + updateShadowGUI1(); + + // Update shadow highlight GUI according to shMethod combobox state + updateShadowGUI2(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabShadow::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expshadhigh = exp->getEnabled(); + spot.visishadhigh = exp->get_visible(); + spot.complexshadhigh = complexity->get_active_row_number(); + + if (shMethod->get_active_row_number() == 0) { + spot.shMethod = "std"; + } else if (shMethod->get_active_row_number() == 1) { + spot.shMethod = "tone"; + } + + for (int i = 0; i < 5; i++) { + spot.multsh[i] = multipliersh[i]->getIntValue(); + } + + spot.detailSH = detailSH->getIntValue(); + spot.tePivot = tePivot->getValue(); + spot.reparsh = reparsh->getValue(); + spot.highlights = highlights->getIntValue(); + spot.h_tonalwidth = h_tonalwidth->getIntValue(); + spot.shadows = shadows->getIntValue(); + spot.s_tonalwidth = s_tonalwidth->getIntValue(); + spot.sh_radius = sh_radius->getIntValue(); + spot.sensihs = sensihs->getIntValue(); + spot.blurSHde = blurSHde->getIntValue(); + spot.gamSH = gamSH->getValue(); + spot.sloSH = sloSH->getValue(); + spot.strSH = strSH->getValue(); + spot.angSH = angSH->getValue(); + spot.inverssh = inverssh->get_active(); + spot.enaSHMask = enaSHMask->get_active(); + spot.LLmaskSHcurve = LLmaskSHshape->getCurve(); + spot.CCmaskSHcurve = CCmaskSHshape->getCurve(); + spot.HHmaskSHcurve = HHmaskSHshape->getCurve(); + spot.blendmaskSH = blendmaskSH->getIntValue(); + spot.radmaskSH = radmaskSH->getValue(); + spot.lapmaskSH = lapmaskSH->getValue(); + spot.chromaskSH = chromaskSH->getValue(); + spot.gammaskSH = gammaskSH->getValue(); + spot.slomaskSH = slomaskSH->getValue(); + spot.LmaskSHcurve = LmaskSHshape->getCurve(); + spot.fatamountSH = fatamountSH->getValue(); + spot.fatanchorSH = fatanchorSH->getValue(); + spot.recothress = recothress->getValue(); + spot.lowthress = lowthress->getValue(); + spot.higthress = higthress->getValue(); + spot.decays = decays->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabShadow::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster widgets + for (int i = 0; i < 5; i++) { + multipliersh[i]->setDefault(defSpot.multsh[i]); + } + + detailSH->setDefault((double)defSpot.detailSH); + tePivot->setDefault(defSpot.tePivot); + reparsh->setDefault(defSpot.reparsh); + highlights->setDefault((double)defSpot.highlights); + h_tonalwidth->setDefault((double)defSpot.h_tonalwidth); + shadows->setDefault((double)defSpot.shadows); + s_tonalwidth->setDefault((double)defSpot.s_tonalwidth); + sh_radius->setDefault((double)defSpot.sh_radius); + sensihs->setDefault((double)defSpot.sensihs); + blurSHde->setDefault((double)defSpot.blurSHde); + gamSH->setDefault(defSpot.gamSH); + sloSH->setDefault(defSpot.sloSH); + strSH->setDefault(defSpot.strSH); + angSH->setDefault(defSpot.angSH); + blendmaskSH->setDefault((double)defSpot.blendmaskSH); + radmaskSH->setDefault(defSpot.radmaskSH); + lapmaskSH->setDefault(defSpot.lapmaskSH); + chromaskSH->setDefault(defSpot.chromaskSH); + gammaskSH->setDefault(defSpot.gammaskSH); + slomaskSH->setDefault(defSpot.slomaskSH); + fatamountSH->setDefault(defSpot.fatamountSH); + fatanchorSH->setDefault(defSpot.fatanchorSH); + recothress->setDefault((double)defSpot.recothress); + lowthress->setDefault((double)defSpot.lowthress); + higthress->setDefault((double)defSpot.higthress); + decays->setDefault((double)defSpot.decays); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabShadow::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == multipliersh[0] || a == multipliersh[1] || a == multipliersh[2] || a == multipliersh[3] || a == multipliersh[4]) { + if (listener) { + listener->panelChanged(EvlocallabEqualizersh, + Glib::ustring::compose("%1, %2, %3, %4, %5", + Glib::ustring::format(std::fixed, std::setprecision(2), multipliersh[0]->getIntValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multipliersh[1]->getIntValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multipliersh[2]->getIntValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multipliersh[3]->getIntValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multipliersh[4]->getIntValue())) + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == detailSH) { + if (listener) { + listener->panelChanged(EvlocallabdetailSH, + detailSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == tePivot) { + if (listener) { + listener->panelChanged(EvlocallabTePivot, + tePivot->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == reparsh) { + if (listener) { + listener->panelChanged(Evlocallabreparsh, + reparsh->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == highlights) { + if (listener) { + listener->panelChanged(Evlocallabhighlights, + highlights->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == h_tonalwidth) { + if (listener) { + listener->panelChanged(Evlocallabh_tonalwidth, + h_tonalwidth->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shadows) { + if (listener) { + listener->panelChanged(Evlocallabshadows, + shadows->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == s_tonalwidth) { + if (listener) { + listener->panelChanged(Evlocallabs_tonalwidth, + s_tonalwidth->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sh_radius) { + if (listener) { + listener->panelChanged(Evlocallabsh_radius, + sh_radius->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothress) { + + if (listener) { + listener->panelChanged(Evlocallabrecothress, + recothress->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthress) { + if (listener) { + listener->panelChanged(Evlocallablowthress, + lowthress->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthress) { + if (listener) { + listener->panelChanged(Evlocallabhigthress, + higthress->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decays) { + if (listener) { + listener->panelChanged(Evlocallabdecays, + decays->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + if (a == sensihs) { + if (listener) { + listener->panelChanged(Evlocallabsensihs, + sensihs->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blurSHde) { + if (listener) { + listener->panelChanged(EvlocallabblurSHde, + blurSHde->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gamSH) { + if (listener) { + listener->panelChanged(EvlocallabgamSH, + gamSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sloSH) { + if (listener) { + listener->panelChanged(EvlocallabsloSH, + sloSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strSH) { + if (listener) { + listener->panelChanged(EvlocallabstrSH, + strSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == angSH) { + if (listener) { + listener->panelChanged(EvlocallabangSH, + angSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskSH) { + if (listener) { + listener->panelChanged(EvlocallabblendmaskSH, + blendmaskSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskSH) { + if (listener) { + listener->panelChanged(EvlocallabradmaskSH, + radmaskSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskSH) { + if (listener) { + listener->panelChanged(EvlocallablapmaskSH, + lapmaskSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskSH) { + if (listener) { + listener->panelChanged(EvlocallabchromaskSH, + chromaskSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskSH) { + if (listener) { + listener->panelChanged(EvlocallabgammaskSH, + gammaskSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskSH) { + if (listener) { + listener->panelChanged(EvlocallabslomaskSH, + slomaskSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == fatamountSH) { + if (listener) { + listener->panelChanged(EvlocallabfatamountSH, + fatamountSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + if (a == fatanchorSH) { + if (listener) { + listener->panelChanged(EvlocallabfatanchorSH, + fatanchorSH->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabShadow::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == CCmaskSHshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskSHshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskSHshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskSHshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskSHshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskSHshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LmaskSHshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskSHshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabShadow::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenashadhigh, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenashadhigh, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabShadow::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + blurSHde->setValue((double)defSpot.blurSHde); + lapmaskSH->setValue(defSpot.lapmaskSH); + gammaskSH->setValue(defSpot.gammaskSH); + slomaskSH->setValue(defSpot.slomaskSH); + fatamountSH->setValue(defSpot.fatamountSH); + fatanchorSH->setValue(defSpot.fatanchorSH); + decays->setValue(defSpot.decays); + + // Enable all listeners + enableListener(); +} + +void LocallabShadow::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + gamSH->setValue(defSpot.gamSH); + sloSH->setValue(defSpot.sloSH); + strSH->setValue(defSpot.strSH); + angSH->setValue(defSpot.angSH); + showmaskSHMethod->set_active(0); + showmaskSHMethodinv->set_active(0); + enaSHMask->set_active(defSpot.enaSHMask); + // CCmaskSHshape->setCurve(defSpot.CCmaskSHcurve); + // LLmaskSHshape->setCurve(defSpot.LLmaskSHcurve); + // HHmaskSHshape->setCurve(defSpot.HHmaskSHcurve); + // blendmaskSH->setValue((double)defSpot.blendmaskSH); + // radmaskSH->setValue(defSpot.radmaskSH); + // chromaskSH->setValue(defSpot.chromaskSH); + // LmaskSHshape->setCurve(defSpot.LmaskSHcurve); + + recothress->setValue(defSpot.recothress); + lowthress->setValue(defSpot.lowthress); + higthress->setValue(defSpot.higthresc); + decays->setValue(defSpot.decays); + + // Enable all listeners + enableListener(); +} + +void LocallabShadow::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + blurSHde->hide(); + gamFrame->hide(); + expgradsh->hide(); + expmasksh->hide(); + exprecovs->hide(); + maskusables->hide(); + maskunusables->hide(); + decays->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + blurSHde->hide(); + lapmaskSH->hide(); + gammaskSH->hide(); + slomaskSH->hide(); + fatSHFrame->hide(); + exprecovs->show(); + + // Specific Simple mode widgets are shown in Normal mode + if (shMethod->get_active_row_number() != 0) { // Keep widget hidden when shMethod is equal to 0 + gamFrame->show(); + } + + if (enaSHMask->get_active()) { + maskusables->show(); + maskunusables->hide(); + + } else { + maskusables->hide(); + maskunusables->show(); + } + + if (!inverssh->get_active()) { // Keep widget hidden when inverssh is toggled + expgradsh->show(); + exprecovs->show(); + } + + expmasksh->show(); + decays->hide(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + blurSHde->show(); + + if (shMethod->get_active_row_number() != 0) { // Keep widget hidden when shMethod is equal to 0 + gamFrame->show(); + } + + if (!inverssh->get_active()) { // Keep widget hidden when inverssh is toggled + expgradsh->show(); + exprecovs->show(); + } + if (enaSHMask->get_active()) { + maskusables->show(); + maskunusables->hide(); + + } else { + maskusables->hide(); + maskunusables->show(); + } + exprecovs->show(); + decays->show(); + + expmasksh->show(); + lapmaskSH->show(); + gammaskSH->show(); + slomaskSH->show(); + fatSHFrame->show(); + } +} + +void LocallabShadow::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskSHshape->updateLocallabBackground(normChromar); + LLmaskSHshape->updateLocallabBackground(normLumar); + HHmaskSHshape->updateLocallabBackground(normHuer); + LmaskSHshape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + +void LocallabShadow::shMethodChanged() +{ + + // Update shadow highlight GUI according to shMethod combobox state + updateShadowGUI2(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshMethod, + shMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabShadow::inversshChanged() +{ + const bool maskPreviewActivated = isMaskViewActive(); + + // Update shadow highlight GUI according to inverssh button state + updateShadowGUI1(); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (inverssh->get_active()) { + listener->panelChanged(Evlocallabinverssh, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinverssh, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabShadow::showmaskSHMethodChanged() +{ + // If mask preview is activated, deactivate other Shadow highlight mask preview + showmaskSHMethodConninv.block(true); + showmaskSHMethodinv->set_active(0); + showmaskSHMethodConninv.block(false); + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabShadow::showmaskSHMethodChangedinv() +{ + // If mask preview is activated, deactivate other Shadow highlight mask preview + showmaskSHMethodConn.block(true); + showmaskSHMethod->set_active(0); + showmaskSHMethodConn.block(false); + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabShadow::enaSHMaskChanged() +{ + if (enaSHMask->get_active()) { + maskusables->show(); + maskunusables->hide(); + + } else { + maskusables->hide(); + maskunusables->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enaSHMask->get_active()) { + listener->panelChanged(EvLocallabEnaSHMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaSHMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabShadow::updateShadowGUI1() +{ + const int mode = complexity->get_active_row_number(); + + // Update shadow highlight GUI according to inverssh button state + if (inverssh->get_active()) { + expgradsh->hide(); + showmaskSHMethod->hide(); + // Reset hidden mask combobox + showmaskSHMethodConn.block(true); + showmaskSHMethod->set_active(0); + showmaskSHMethodConn.block(false); + showmaskSHMethodinv->show(); + exprecovs->hide(); + reparsh->hide(); + } else { + if (mode == Expert || mode == Normal) { // Keep widget hidden in Simple mode + expgradsh->show(); + exprecovs->show(); + } + reparsh->show(); + + showmaskSHMethod->show(); + showmaskSHMethodinv->hide(); + // Reset hidden mask combobox + showmaskSHMethodConninv.block(true); + showmaskSHMethodinv->set_active(0); + showmaskSHMethodConninv.block(false); + } +} + +void LocallabShadow::updateShadowGUI2() +{ + const int mode = complexity->get_active_row_number(); + + // Update shadow highlight GUI according to shMethod combobox state + if (shMethod->get_active_row_number() == 0) { + for (const auto multiplier : multipliersh) { + multiplier->hide(); + } + + gamFrame->hide(); + detailSH->hide(); + tePivot->hide(); + highlights->show(); + h_tonalwidth->show(); + shadows->show(); + s_tonalwidth->show(); + sh_radius->show(); + } else if (shMethod->get_active_row_number() == 1) { + for (const auto multiplier : multipliersh) { + multiplier->show(); + } + + if (mode == Expert || mode == Normal) { // Keep widget hidden in Simple mode + gamFrame->show(); + } + + detailSH->show(); + tePivot->show(); + highlights->hide(); + h_tonalwidth->hide(); + shadows->hide(); + s_tonalwidth->hide(); + sh_radius->hide(); + } +} + +/* ==== LocallabVibrance ==== */ +LocallabVibrance::LocallabVibrance(): + LocallabTool(this, M("TP_LOCALLAB_VIB_TOOLNAME"), M("TP_LOCALLAB_VIBRANCE"), false), + + // Vibrance specific widgets + saturated(Gtk::manage(new Adjuster(M("TP_VIBRANCE_SATURATED"), -100., 100., 1., 0.))), + pastels(Gtk::manage(new Adjuster(M("TP_VIBRANCE_PASTELS"), -100., 100., 1., 0.))), + vibgam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3., 0.05, 1.))), + warm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WARM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-orange-small.png"))))), + psThreshold(Gtk::manage(new ThresholdAdjuster(M("TP_VIBRANCE_PSTHRESHOLD"), -100., 100., 0., M("TP_VIBRANCE_PSTHRESHOLD_WEIGTHING"), 0, 0., 100., 75., M("TP_VIBRANCE_PSTHRESHOLD_SATTHRESH"), 0, this, false))), + protectSkins(Gtk::manage(new Gtk::CheckButton(M("TP_VIBRANCE_PROTECTSKINS")))), + avoidColorShift(Gtk::manage(new Gtk::CheckButton(M("TP_VIBRANCE_AVOIDCOLORSHIFT")))), + pastSatTog(Gtk::manage(new Gtk::CheckButton(M("TP_VIBRANCE_PASTSATTOG")))), + sensiv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 15))),//unused here, but used for normalize_mean_dt + curveEditorGG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL"))), + skinTonesCurve(static_cast(curveEditorGG->addCurve(CT_Diagonal, M("TP_VIBRANCE_CURVEEDITOR_SKINTONES")))), + exprecovv(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablev(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablev(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothresv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthresv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthresv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decayv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + expgradvib(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPGRAD")))), + strvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4., 4., 0.05, 0.))), + strvibab(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRCHRO"), -4., 4., 0.05, 0.))), + strvibh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTRHUE2"), -6., 6., 0.05, 0.))), + angvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + expmaskvib(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWVI")))), + showmaskvibMethod(Gtk::manage(new MyComboBoxText())), + enavibMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), + // maskvibCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskvibCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskvibshape(static_cast(maskvibCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskvibshape(static_cast(maskvibCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskvibshape(static_cast(maskvibCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskvib(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + mask2vibCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmaskvibshape(static_cast(mask2vibCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + float R, G, B; + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Vibrance specific widgets + saturated->setAdjusterListener(this); + + pastels->setAdjusterListener(this); + + vibgam->setAdjusterListener(this); + + warm->setAdjusterListener(this); + + psThreshold->set_tooltip_markup(M("TP_VIBRANCE_PSTHRESHOLD_TOOLTIP")); + psThreshold->setAdjusterListener(this); + + pskinsConn = protectSkins->signal_toggled().connect(sigc::mem_fun(*this, &LocallabVibrance::protectskins_toggled)); + + ashiftConn = avoidColorShift->signal_toggled().connect(sigc::mem_fun(*this, &LocallabVibrance::avoidcolorshift_toggled)); + + pastsattogConn = pastSatTog->signal_toggled().connect(sigc::mem_fun(*this, &LocallabVibrance::pastsattog_toggled)); + + sensiv->setAdjusterListener(this); + + curveEditorGG->setCurveListener(this); + + skinTonesCurve->setTooltip(M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP")); + std::vector mskinTonesCurve; + // -0.1 rad < Hue < 1.6 rad + Color::hsv2rgb01(0.92f, 0.45f, 0.6f, R, G, B); + mskinTonesCurve.emplace_back(0.0, R, G, B); + Color::hsv2rgb01(0.14056f, 0.45f, 0.6f, R, G, B); + mskinTonesCurve.emplace_back(1.0, R, G, B); + skinTonesCurve->setBottomBarBgGradient(mskinTonesCurve); + skinTonesCurve->setLeftBarBgGradient(mskinTonesCurve); + skinTonesCurve->setRangeLabels( + M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1"), M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2"), + M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3"), M("TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4") + ); + skinTonesCurve->setRangeDefaultMilestones(0.1, 0.4, 0.85); + + curveEditorGG->curveListComplete(); + + recothresv->setAdjusterListener(this); + lowthresv->setAdjusterListener(this); + higthresv->setAdjusterListener(this); + decayv->setAdjusterListener(this); + setExpandAlignProperties(exprecovv, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + setExpandAlignProperties(expgradvib, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + strvib->setAdjusterListener(this); + + strvibab->set_tooltip_text(M("TP_LOCALLAB_GRADSTRAB_TOOLTIP")); + strvibab->setAdjusterListener(this); + + strvibh->set_tooltip_text(M("TP_LOCALLAB_GRADSTRHUE_TOOLTIP")); + strvibh->setAdjusterListener(this); + + angvib->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + angvib->setAdjusterListener(this); + + setExpandAlignProperties(expmaskvib, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskvibMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskvibMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskvibMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskvibMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskvibMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskvibMethod->set_active(0); + showmaskvibMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskvibMethodConn = showmaskvibMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabVibrance::showmaskvibMethodChanged)); + + enavibMaskConn = enavibMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabVibrance::enavibMaskChanged)); + + maskvibCurveEditorG->setCurveListener(this); + + CCmaskvibshape->setIdentityValue(0.); + CCmaskvibshape->setResetCurve(FlatCurveType(defSpot.CCmaskvibcurve.at(0)), defSpot.CCmaskvibcurve); + CCmaskvibshape->setBottomBarColorProvider(this, 1); + + LLmaskvibshape->setIdentityValue(0.); + LLmaskvibshape->setResetCurve(FlatCurveType(defSpot.LLmaskvibcurve.at(0)), defSpot.LLmaskvibcurve); + LLmaskvibshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskvibshape->setIdentityValue(0.); + HHmaskvibshape->setResetCurve(FlatCurveType(defSpot.HHmaskvibcurve.at(0)), defSpot.HHmaskvibcurve); + HHmaskvibshape->setCurveColorProvider(this, 2); + HHmaskvibshape->setBottomBarColorProvider(this, 2); + + maskvibCurveEditorG->curveListComplete(); + + blendmaskvib->setAdjusterListener(this); + + radmaskvib->setAdjusterListener(this); + + lapmaskvib->setAdjusterListener(this); + + chromaskvib->setAdjusterListener(this); + + gammaskvib->setAdjusterListener(this); + + slomaskvib->setAdjusterListener(this); + + mask2vibCurveEditorG->setCurveListener(this); + + Lmaskvibshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskvibcurve.at(0)), defSpot.Lmaskvibcurve); + Lmaskvibshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmaskvibshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2vibCurveEditorG->curveListComplete(); + + // Add Vibrance specific widgets to GUI + pack_start(*saturated, Gtk::PACK_SHRINK, 0); + pack_start(*pastels, Gtk::PACK_SHRINK, 0); + pack_start(*vibgam, Gtk::PACK_SHRINK, 0); + Gtk::Separator* const separatorvib = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + pack_start(*separatorvib, Gtk::PACK_SHRINK, 2); + pack_start(*warm, Gtk::PACK_SHRINK, 0); + pack_start(*psThreshold, Gtk::PACK_SHRINK, 0); + pack_start(*protectSkins, Gtk::PACK_SHRINK, 0); + pack_start(*avoidColorShift, Gtk::PACK_SHRINK, 0); + pack_start(*pastSatTog, Gtk::PACK_SHRINK, 0); + // pack_start(*sensiv, Gtk::PACK_SHRINK, 0);//unused here, but used for normalize_mean_dt + pack_start(*curveEditorGG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + ToolParamBlock* const vibBox3 = Gtk::manage(new ToolParamBlock()); + vibBox3->pack_start(*maskusablev, Gtk::PACK_SHRINK, 0); + vibBox3->pack_start(*maskunusablev, Gtk::PACK_SHRINK, 0); + vibBox3->pack_start(*recothresv); + vibBox3->pack_start(*lowthresv); + vibBox3->pack_start(*higthresv); + vibBox3->pack_start(*decayv); + // colBox3->pack_start(*invmaskc); + exprecovv->add(*vibBox3, false); + pack_start(*exprecovv, false, false); + + ToolParamBlock* const gradvibBox = Gtk::manage(new ToolParamBlock()); + gradvibBox->pack_start(*strvib); + gradvibBox->pack_start(*strvibab); + gradvibBox->pack_start(*strvibh); + gradvibBox->pack_start(*angvib); + expgradvib->add(*gradvibBox, false); + pack_start(*expgradvib); + ToolParamBlock* const maskvibBox = Gtk::manage(new ToolParamBlock()); + maskvibBox->pack_start(*showmaskvibMethod, Gtk::PACK_SHRINK, 4); + maskvibBox->pack_start(*enavibMask, Gtk::PACK_SHRINK, 0); + maskvibBox->pack_start(*maskvibCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskvibBox->pack_start(*blendmaskvib, Gtk::PACK_SHRINK, 0); + maskvibBox->pack_start(*radmaskvib, Gtk::PACK_SHRINK, 0); + maskvibBox->pack_start(*lapmaskvib, Gtk::PACK_SHRINK, 0); + maskvibBox->pack_start(*chromaskvib, Gtk::PACK_SHRINK, 0); + maskvibBox->pack_start(*gammaskvib, Gtk::PACK_SHRINK, 0); + maskvibBox->pack_start(*slomaskvib, Gtk::PACK_SHRINK, 0); + maskvibBox->pack_start(*mask2vibCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmaskvib->add(*maskvibBox, false); + pack_start(*expmaskvib, false, false); +} + +LocallabVibrance::~LocallabVibrance() +{ + delete curveEditorGG; + delete maskvibCurveEditorG; + delete mask2vibCurveEditorG; +} + +bool LocallabVibrance::isMaskViewActive() +{ + return (showmaskvibMethod->get_active_row_number() != 0); +} + +void LocallabVibrance::resetMaskView() +{ + showmaskvibMethodConn.block(true); + showmaskvibMethod->set_active(0); + showmaskvibMethodConn.block(false); +} + +void LocallabVibrance::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + vibMask = showmaskvibMethod->get_active_row_number(); +} + +void LocallabVibrance::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_text(M("TP_LOCALLAB_VIBRA_TOOLTIP")); + warm->set_tooltip_text(M("TP_LOCALLAB_WARM_TOOLTIP")); + recothresv->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + strvib->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); + exprecovv->set_tooltip_markup(M("TP_LOCALLAB_MASKRESVIB_TOOLTIP")); + expmaskvib->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + CCmaskvibshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskvibshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskvibshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmaskvib->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + mask2vibCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmaskvibshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskvibCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskvib->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskvib->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskvib->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskvib->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + vibgam->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); + +/* + saturated->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + pastels->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + psThreshold->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + protectSkins->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + avoidColorShift->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + pastSatTog->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + sensiv->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); + curveEditorGG->set_tooltip_text(M("TP_LOCALLAB_NUL_TOOLTIP")); +*/ + + saturated->set_tooltip_text(""); + pastels->set_tooltip_text(""); + psThreshold->set_tooltip_text(""); + protectSkins->set_tooltip_text(""); + avoidColorShift->set_tooltip_text(""); + pastSatTog->set_tooltip_text(""); + sensiv->set_tooltip_text(""); + curveEditorGG->set_tooltip_text(""); + decayv->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthresv->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESVIB_TOOLTIP")); + higthresv->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESVIB_TOOLTIP")); + + } else { + exp->set_tooltip_text(""); + warm->set_tooltip_text(""); + strvib->set_tooltip_text(""); + recothresv->set_tooltip_text(""); + expmaskvib->set_tooltip_markup(""); + CCmaskvibshape->setTooltip(""); + LLmaskvibshape->setTooltip(""); + HHmaskvibshape->setTooltip(""); + blendmaskvib->set_tooltip_text(""); + mask2vibCurveEditorG->set_tooltip_text(""); + Lmaskvibshape->setTooltip(""); + maskvibCurveEditorG->set_tooltip_markup(""); + gammaskvib->set_tooltip_text(""); + chromaskvib->set_tooltip_text(""); + slomaskvib->set_tooltip_text(""); + lapmaskvib->set_tooltip_text(""); + saturated->set_tooltip_text(""); + pastels->set_tooltip_text(""); + psThreshold->set_tooltip_text(""); + protectSkins->set_tooltip_text(""); + avoidColorShift->set_tooltip_text(""); + pastSatTog->set_tooltip_text(""); + sensiv->set_tooltip_text(""); + curveEditorGG->set_tooltip_text(""); + exprecovv->set_tooltip_markup(""); + decayv->set_tooltip_text(""); + lowthresv->set_tooltip_text(""); + higthresv->set_tooltip_text(""); + vibgam->set_tooltip_text(""); + } +} + +void LocallabVibrance::setDefaultExpanderVisibility() +{ + exprecovv->set_expanded(false); + expgradvib->set_expanded(false); + expmaskvib->set_expanded(false); +} + +void LocallabVibrance::disableListener() +{ + LocallabTool::disableListener(); + + pskinsConn.block(true); + ashiftConn.block(true); + pastsattogConn.block(true); + showmaskvibMethodConn.block(true); + enavibMaskConn.block(true); +} + +void LocallabVibrance::enableListener() +{ + LocallabTool::enableListener(); + + pskinsConn.block(false); + ashiftConn.block(false); + pastsattogConn.block(false); + showmaskvibMethodConn.block(false); + enavibMaskConn.block(false); +} + +void LocallabVibrance::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visivibrance); + exp->setEnabled(spot.expvibrance); + complexity->set_active(spot.complexvibrance); + + saturated->setValue(spot.saturated); + pastels->setValue(spot.pastels); + vibgam->setValue(spot.vibgam); + warm->setValue(spot.warm); + psThreshold->setValue(spot.psthreshold); + protectSkins->set_active(spot.protectskins); + avoidColorShift->set_active(spot.avoidcolorshift); + pastSatTog->set_active(spot.pastsattog); + sensiv->setValue(spot.sensiv); + skinTonesCurve->setCurve(spot.skintonescurve); + strvib->setValue(spot.strvib); + strvibab->setValue(spot.strvibab); + strvibh->setValue(spot.strvibh); + angvib->setValue(spot.angvib); + enavibMask->set_active(spot.enavibMask); + CCmaskvibshape->setCurve(spot.CCmaskvibcurve); + LLmaskvibshape->setCurve(spot.LLmaskvibcurve); + HHmaskvibshape->setCurve(spot.HHmaskvibcurve); + blendmaskvib->setValue(spot.blendmaskvib); + radmaskvib->setValue(spot.radmaskvib); + lapmaskvib->setValue(spot.lapmaskvib); + chromaskvib->setValue(spot.chromaskvib); + gammaskvib->setValue(spot.gammaskvib); + slomaskvib->setValue(spot.slomaskvib); + Lmaskvibshape->setCurve(spot.Lmaskvibcurve); + recothresv->setValue((double)spot.recothresv); + lowthresv->setValue((double)spot.lowthresv); + higthresv->setValue((double)spot.higthresv); + decayv->setValue((double)spot.decayv); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update vibrance GUI according to pastsattog button state + updateVibranceGUI(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabVibrance::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expvibrance = exp->getEnabled(); + spot.visivibrance = exp->get_visible(); + spot.complexvibrance = complexity->get_active_row_number(); + + spot.saturated = saturated->getIntValue(); + spot.pastels = pastels->getIntValue(); + spot.vibgam = vibgam->getValue(); + spot.warm = warm->getIntValue(); + spot.psthreshold = psThreshold->getValue(); + spot.protectskins = protectSkins->get_active(); + spot.avoidcolorshift = avoidColorShift->get_active(); + spot.pastsattog = pastSatTog->get_active(); + spot.sensiv = sensiv->getIntValue(); + spot.skintonescurve = skinTonesCurve->getCurve(); + spot.strvib = strvib->getValue(); + spot.strvibab = strvibab->getValue(); + spot.strvibh = strvibh->getValue(); + spot.angvib = angvib->getValue(); + spot.enavibMask = enavibMask->get_active(); + spot.CCmaskvibcurve = CCmaskvibshape->getCurve(); + spot.LLmaskvibcurve = LLmaskvibshape->getCurve(); + spot.HHmaskvibcurve = HHmaskvibshape->getCurve(); + spot.blendmaskvib = blendmaskvib->getIntValue(); + spot.radmaskvib = radmaskvib->getValue(); + spot.lapmaskvib = lapmaskvib->getValue(); + spot.chromaskvib = chromaskvib->getValue(); + spot.gammaskvib = gammaskvib->getValue(); + spot.slomaskvib = slomaskvib->getValue(); + spot.Lmaskvibcurve = Lmaskvibshape->getCurve(); + spot.recothresv = recothresv->getValue(); + spot.lowthresv = lowthresv->getValue(); + spot.higthresv = higthresv->getValue(); + spot.decayv = decayv->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabVibrance::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster and threshold adjuster widgets + saturated->setDefault((double)defSpot.saturated); + pastels->setDefault((double)defSpot.pastels); + vibgam->setDefault((double)defSpot.vibgam); + warm->setDefault((double)defSpot.warm); + psThreshold->setDefault(defSpot.psthreshold); + sensiv->setDefault((double)defSpot.sensiv); + strvib->setDefault(defSpot.strvib); + strvibab->setDefault(defSpot.strvibab); + strvibh->setDefault(defSpot.strvibh); + angvib->setDefault(defSpot.angvib); + blendmaskvib->setDefault((double)defSpot.blendmaskvib); + radmaskvib->setDefault(defSpot.radmaskvib); + lapmaskvib->setDefault(defSpot.lapmaskvib); + chromaskvib->setDefault(defSpot.chromaskvib); + gammaskvib->setDefault(defSpot.gammaskvib); + slomaskvib->setDefault(defSpot.slomaskvib); + recothresv->setDefault((double)defSpot.recothresv); + lowthresv->setDefault((double)defSpot.lowthresv); + higthresv->setDefault((double)defSpot.higthresv); + decayv->setDefault((double)defSpot.decayv); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabVibrance::adjusterChanged(Adjuster* a, double newval) +{ + // Copy pastels adjuster value to saturated one according to pastSatTog button state + if (a == pastels && pastSatTog->get_active()) { + saturated->setValue(newval); + } + + if (isLocActivated && exp->getEnabled()) { + if (a == saturated && !pastSatTog->get_active()) { + if (listener) { + listener->panelChanged(EvlocallabSaturated, + saturated->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == pastels) { + if (listener) { + listener->panelChanged(EvlocallabPastels, + pastels->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == vibgam) { + if (listener) { + listener->panelChanged(Evlocallabvibgam, + vibgam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == warm) { + if (listener) { + listener->panelChanged(Evlocallabwarm, + warm->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensiv) { + if (listener) { + listener->panelChanged(Evlocallabsensiv, + sensiv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothresv) { + + if (listener) { + listener->panelChanged(Evlocallabrecothresv, + recothresv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthresv) { + if (listener) { + listener->panelChanged(Evlocallablowthresv, + lowthresv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthresv) { + if (listener) { + listener->panelChanged(Evlocallabhigthresv, + higthresv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decayv) { + if (listener) { + listener->panelChanged(Evlocallabdecayv, + decayv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strvib) { + if (listener) { + listener->panelChanged(Evlocallabstrvib, + strvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strvibab) { + if (listener) { + listener->panelChanged(Evlocallabstrvibab, + strvibab->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strvibh) { + if (listener) { + listener->panelChanged(Evlocallabstrvibh, + strvibh->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == angvib) { + if (listener) { + listener->panelChanged(Evlocallabangvib, + angvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskvib) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskvi, + blendmaskvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskvib) { + if (listener) { + listener->panelChanged(Evlocallabradmaskvib, + radmaskvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskvib) { + if (listener) { + listener->panelChanged(Evlocallablapmaskvib, + lapmaskvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskvib) { + if (listener) { + listener->panelChanged(Evlocallabchromaskvib, + chromaskvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskvib) { + if (listener) { + listener->panelChanged(Evlocallabgammaskvib, + gammaskvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskvib) { + if (listener) { + listener->panelChanged(Evlocallabslomaskvib, + slomaskvib->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabVibrance::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabPastSatThreshold, + psThreshold->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +std::vector LocallabVibrance::getCurvePoints(ThresholdSelector* tAdjuster) const +{ + std::vector points; + double threshold, transitionWeighting; + tAdjuster->getPositions(transitionWeighting, threshold); // ( range -100;+100, range 0;+100 ) + transitionWeighting /= 100.; // range -1., +1. + threshold /= 100.; // range 0., +1. + + // Initial point + points.push_back(0.); + points.push_back(0.); + + double p2 = 3.0 * threshold / 4.0; // same one than in ipvibrance.cc + double s0 = threshold + (1.0 - threshold) / 4.0; // same one than in ipvibrance.cc + + // point at the beginning of the first linear transition + points.push_back(p2); + points.push_back(0.); + + // Y value of the chroma mean point, calculated to get a straight line between p2 and s0 + double chromaMean = (threshold / 4.0) / (s0 - p2); + + // move chromaMean up or down depending on transitionWeighting + if (transitionWeighting > 0.0) { + // positive values -> give more weight to Saturated + chromaMean = (1.0 - chromaMean) * transitionWeighting + chromaMean; + } else if (transitionWeighting < 0.0) { + // negative values -> give more weight to Pastels + chromaMean = chromaMean * transitionWeighting + chromaMean; + } + + // point at the location of the Top cursor, at the end of the first linear transition and the beginning of the second one + points.push_back(threshold); + points.push_back(chromaMean); + + if (threshold < 1.0) { + // point at the end of the second linear transition + points.push_back(s0); + points.push_back(1.0); + + // end point + points.push_back(1.0); + points.push_back(1.0); + } + + return points; +} + +void LocallabVibrance::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == skinTonesCurve) { + if (listener) { + listener->panelChanged(EvlocallabSkinTonesCurve, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CCmaskvibshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskvibshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskvibshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskvibshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskvibshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskvibshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskvibshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskvibshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabVibrance::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenavibrance, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenashadhigh, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabVibrance::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + saturated->setValue((double)defSpot.saturated); + vibgam->setValue(defSpot.vibgam); + + psThreshold->setValue(defSpot.psthreshold); + protectSkins->set_active(defSpot.protectskins); + avoidColorShift->set_active(defSpot.avoidcolorshift); + pastSatTog->set_active(defSpot.pastsattog); + skinTonesCurve->setCurve(defSpot.skintonescurve); + strvibab->setValue(defSpot.strvibab); + strvibh->setValue(defSpot.strvibh); + lapmaskvib->setValue(defSpot.lapmaskvib); + gammaskvib->setValue(defSpot.gammaskvib); + slomaskvib->setValue(defSpot.slomaskvib); + decayv->setValue(defSpot.decayv); + + // Enable all listeners + enableListener(); + + // Update GUI based on converted widget parameters: + // - Update vibrance GUI according to pastsattog button state + updateVibranceGUI(); +} + +void LocallabVibrance::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + strvib->setValue(defSpot.strvib); + angvib->setValue(defSpot.angvib); + showmaskvibMethod->set_active(0); + enavibMask->set_active(defSpot.enavibMask); + // CCmaskvibshape->setCurve(defSpot.CCmaskvibcurve); + // LLmaskvibshape->setCurve(defSpot.LLmaskvibcurve); + // HHmaskvibshape->setCurve(defSpot.HHmaskvibcurve); + // blendmaskvib->setValue((double)defSpot.blendmaskvib); + // radmaskvib->setValue(defSpot.radmaskvib); + // chromaskvib->setValue(defSpot.chromaskvib); + // Lmaskvibshape->setCurve(defSpot.Lmaskvibcurve); + recothresv->setValue(defSpot.recothresv); + lowthresv->setValue(defSpot.lowthresv); + higthresv->setValue(defSpot.higthresv); + decayv->setValue(defSpot.decayv); + + // Enable all listener + enableListener(); +} + +void LocallabVibrance::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + saturated->hide(); + pastels->setLabel(M("TP_LOCALLAB_PASTELS2")); + vibgam->hide(); + psThreshold->hide(); + protectSkins->hide(); + avoidColorShift->hide(); + pastSatTog->hide(); + curveEditorGG->hide(); + expgradvib->hide(); + expmaskvib->hide(); + exprecovv->hide(); + decayv->hide(); + maskusablev->hide(); + maskunusablev->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + saturated->hide(); + vibgam->hide(); + pastels->setLabel(M("TP_LOCALLAB_PASTELS2")); + psThreshold->hide(); + protectSkins->hide(); + avoidColorShift->hide(); + pastSatTog->hide(); + curveEditorGG->hide(); + strvibab->hide(); + strvibh->hide(); + lapmaskvib->hide(); + gammaskvib->hide(); + slomaskvib->hide(); + // Specific Simple mode widgets are shown in Normal mode + expgradvib->show(); + expmaskvib->show(); + exprecovv->show(); + decayv->hide(); + if (enavibMask->get_active()) { + maskusablev->show(); + maskunusablev->hide(); + + } else { + maskusablev->hide(); + maskunusablev->show(); + } + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + saturated->show(); + vibgam->show(); + pastels->setLabel(M("TP_VIBRANCE_PASTELS")); + psThreshold->show(); + protectSkins->show(); + avoidColorShift->show(); + pastSatTog->show(); + curveEditorGG->show(); + expgradvib->show(); + strvibab->show(); + strvibh->show(); + expmaskvib->show(); + lapmaskvib->show(); + gammaskvib->show(); + slomaskvib->show(); + exprecovv->show(); + decayv->show(); + if (enavibMask->get_active()) { + maskusablev->show(); + maskunusablev->hide(); + + } else { + maskusablev->hide(); + maskunusablev->show(); + } + } +} + +void LocallabVibrance::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskvibshape->updateLocallabBackground(normChromar); + LLmaskvibshape->updateLocallabBackground(normLumar); + HHmaskvibshape->updateLocallabBackground(normHuer); + Lmaskvibshape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + +void LocallabVibrance::protectskins_toggled() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (protectSkins->get_active()) { + listener->panelChanged(EvlocallabProtectSkins, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvlocallabProtectSkins, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabVibrance::avoidcolorshift_toggled() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (avoidColorShift->get_active()) { + listener->panelChanged(EvlocallabAvoidColorShift, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvlocallabAvoidColorShift, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabVibrance::pastsattog_toggled() +{ + // Update vibrance GUI according to pastsattog button state + updateVibranceGUI(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (pastSatTog->get_active()) { + listener->panelChanged(EvlocallabPastSatTog, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvlocallabPastSatTog, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabVibrance::showmaskvibMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabVibrance::enavibMaskChanged() +{ + if (enavibMask->get_active()) { + maskusablev->show(); + maskunusablev->hide(); + + } else { + maskusablev->hide(); + maskunusablev->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enavibMask->get_active()) { + listener->panelChanged(EvLocallabEnavibMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnavibMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabVibrance::updateVibranceGUI() +{ + // Update vibrance GUI according to pastsattog button state + if (pastSatTog->get_active()) { + // Link both slider, so we set saturated and psThresholds unsensitive + psThreshold->set_sensitive(false); + saturated->set_sensitive(false); + saturated->setValue(pastels->getValue()); // Pastels and Saturated are linked + } else { + // Separate sliders, so we set saturated and psThresholds sensitive again + psThreshold->set_sensitive(true); + saturated->set_sensitive(true); + } +} + +/* ==== LocallabSoft ==== */ +LocallabSoft::LocallabSoft(): + LocallabTool(this, M("TP_LOCALLAB_SOFT_TOOLNAME"), M("TP_LOCALLAB_SOFT"), false), + + // Soft light specific widgets + softMethod(Gtk::manage(new MyComboBoxText())), + ctboxsoftmethod(Gtk::manage(new Gtk::Box())), + showmasksoftMethod(Gtk::manage(new MyComboBoxText())), + streng(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRENG"), 1, 100, 1, 1))), + laplace(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPLACE"), 0., 100., 0.5, 25.))), + sensisf(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 1, 100, 1, 30))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + // Parameter Soft light specific widgets + softMethod->append(M("TP_LOCALLAB_SOFTM")); + softMethod->append(M("TP_LOCALLAB_RETIM")); + softMethod->set_active(0); + softMethodConn = softMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabSoft::softMethodChanged)); + + showmasksoftMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmasksoftMethod->append(M("TP_LOCALLAB_SHOWLAPLACE")); + showmasksoftMethod->append(M("TP_LOCALLAB_SHOWFOURIER")); + showmasksoftMethod->append(M("TP_LOCALLAB_SHOWPOISSON")); + showmasksoftMethod->append(M("TP_LOCALLAB_SHOWNORMAL")); + showmasksoftMethod->append(M("TP_LOCALLAB_SHOWMODIF2")); + showmasksoftMethod->set_active(0); + showmasksoftMethodConn = showmasksoftMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabSoft::showmasksoftMethodChanged)); + + streng->setAdjusterListener(this); + + laplace->setAdjusterListener(this); + + sensisf->setAdjusterListener(this); + + // Add Soft light specific widgets to GUI + pack_start(*sensisf); + pack_start(*softMethod); + Gtk::Label* const labelsoftmethod = Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_SHOWDCT") + ":")); + ctboxsoftmethod->pack_start(*labelsoftmethod, Gtk::PACK_SHRINK, 4); + ctboxsoftmethod->pack_start(*showmasksoftMethod); + pack_start(*ctboxsoftmethod); + pack_start(*streng); + pack_start(*laplace); +} + +bool LocallabSoft::isMaskViewActive() +{ + return (showmasksoftMethod->get_active_row_number() != 0); +} + +void LocallabSoft::resetMaskView() +{ + showmasksoftMethodConn.block(true); + showmasksoftMethod->set_active(0); + showmasksoftMethodConn.block(false); +} + +void LocallabSoft::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + softMask = showmasksoftMethod->get_active_row_number(); +} + +void LocallabSoft::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_markup(M("TP_LOCALLAB_SOFTMETHOD_TOOLTIP")); + showmasksoftMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP")); + streng->set_tooltip_text(M("TP_LOCALLAB_ORRETISTREN_TOOLTIP")); + laplace->set_tooltip_text(M("TP_LOCALLAB_ORRETILAP_TOOLTIP")); + sensisf->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + + } else { + exp->set_tooltip_text(""); + showmasksoftMethod->set_tooltip_markup(""); + streng->set_tooltip_text(""); + laplace->set_tooltip_text(""); + sensisf->set_tooltip_text(""); + } +} + +void LocallabSoft::disableListener() +{ + LocallabTool::disableListener(); + + softMethodConn.block(true); + showmasksoftMethodConn.block(true); +} + +void LocallabSoft::enableListener() +{ + LocallabTool::enableListener(); + + softMethodConn.block(false); + showmasksoftMethodConn.block(false); +} + +void LocallabSoft::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visisoft); + exp->setEnabled(spot.expsoft); + complexity->set_active(spot.complexsoft); + + if (spot.softMethod == "soft") { + softMethod->set_active(0); + } else if (spot.softMethod == "reti") { + softMethod->set_active(1); + } + + streng->setValue((double)spot.streng); + sensisf->setValue((double)spot.sensisf); + laplace->setValue(spot.laplace); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update soft light GUI according to softMethod combobox + updateSoftGUI(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabSoft::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expsoft = exp->getEnabled(); + spot.visisoft = exp->get_visible(); + spot.complexsoft = complexity->get_active_row_number(); + + if (softMethod->get_active_row_number() == 0) { + spot.softMethod = "soft"; + } else if (softMethod->get_active_row_number() == 1) { + spot.softMethod = "reti"; + } + + spot.streng = streng->getIntValue(); + spot.sensisf = sensisf->getIntValue(); + spot.laplace = laplace->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabSoft::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default value for adjuster widgets + streng->setDefault((double)defSpot.streng); + laplace->setDefault(defSpot.laplace); + sensisf->setDefault((double)defSpot.sensisf); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabSoft::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == streng) { + if (listener) { + listener->panelChanged(Evlocallabstreng, + streng->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensisf) { + if (listener) { + listener->panelChanged(Evlocallabsensisf, + sensisf->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == laplace) { + if (listener) { + listener->panelChanged(Evlocallablaplace, + laplace->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabSoft::complexityModeChanged() +{ + if (complexity->get_active_row_number() == Simple) { // New selected mode is Simple one + const bool maskPreviewActivated = isMaskViewActive(); + + // Convert tool widget parameters + convertParamToNormal(); // From Expert mode to Normal mode + convertParamToSimple(); // From Normal mode to Simple mode + // Update GUI based on new mode + updateGUIToMode(Simple); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_SIMPLE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } else if (complexity->get_active_row_number() == Normal) { // New selected mode is Normal one + const bool maskPreviewActivated = isMaskViewActive(); + + // Convert tool widget parameters + convertParamToNormal(); + // Update GUI based on new mode + updateGUIToMode(Normal); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_NORMAL") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } else if (complexity->get_active_row_number() == Expert) { // New selected mode is Expert one + // Update GUI based on new mode + updateGUIToMode(Expert); + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_EXPERT") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabSoft::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenasoft, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenasoft, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabSoft::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + showmasksoftMethod->set_active(0); + + // Enable all listeners + enableListener(); +} + +void LocallabSoft::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + if (defSpot.softMethod == "soft") { + softMethod->set_active(0); + } else if (defSpot.softMethod == "reti") { + softMethod->set_active(1); + } + + // Enable all listeners + enableListener(); + + // Update GUI based on converted widget parameters: + // - Update soft light GUI according to softMethod combobox + updateSoftGUI(); +} + +void LocallabSoft::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + softMethod->hide(); + ctboxsoftmethod->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + ctboxsoftmethod->hide(); + // Specific Simple mode widgets are shown in Normal mode + softMethod->show(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + softMethod->show(); + + if (softMethod->get_active_row_number() != 0) { // Keep widget hidden when softMethod is equal to 0 + ctboxsoftmethod->show(); + } + } +} + +void LocallabSoft::softMethodChanged() +{ + const bool maskPreviewActivated = isMaskViewActive(); + + // Update soft light GUI according to softMethod combobox + updateSoftGUI(); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabsoftMethod, + softMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabSoft::showmasksoftMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabSoft::updateSoftGUI() +{ + // Update soft light GUI according to softMethod combobox + const int comp = complexity->get_active_row_number(); + + if (softMethod->get_active_row_number() == 0) { + ctboxsoftmethod->hide(); + // Reset hidden mask combobox + showmasksoftMethodConn.block(true); + showmasksoftMethod->set_active(0); + showmasksoftMethodConn.block(false); + laplace->hide(); + } else { + if (comp == Expert) { // Keep widget hidden in Simple and Normal mode + ctboxsoftmethod->show(); + } + + laplace->show(); + } +} + +/* ==== LocallabBlur ==== */ +LocallabBlur::LocallabBlur(): + LocallabTool(this, M("TP_LOCALLAB_BLUR_TOOLNAME"), M("TP_LOCALLAB_BLUFR"), true), + + // Blur, Noise & Denoise specific widgets + expblnoise(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_BLNOI_EXP")))), + blMethod(Gtk::manage(new MyComboBoxText())), + fftwbl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTWBLUR")))), + radius(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADIUS"), MINRAD, MAXRAD, 0.1, 1.5, nullptr, nullptr, &blurSlider2radius, &blurRadius2Slider))), + strength(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRENGTH"), 0, 100, 1, 0))), + grainFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRAINFRA")))), + grainFrame2(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRAINFRA2")))), + isogr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ISOGR"), 20, 6400, 1, 400))), + strengr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRENGR"), 0, 100, 1, 0))), + scalegr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALEGR"), 0, 100, 1, 100))), + divgr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DIVGR"), 0.2, 3., 0.1, 1.))), + medMethod(Gtk::manage(new MyComboBoxText())), + itera(Gtk::manage(new Adjuster(M("TP_DIRPYRDENOISE_MEDIAN_PASSES"), 1, 4, 1, 1))), + guidbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GUIDBL"), 0, 1000, 1, 0))), + strbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRBL"), 0, 100, 1, 50))), + epsbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_EPSBL"), -10, 10, 1, 0))), + expdenoise2(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + recothres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + lowthres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW2"), 1., 80., 0.5, 12.))), + higthres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR2"), 20., 99., 0.5, 85.))), + sensibn(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 40))), + blurMethod(Gtk::manage(new MyComboBoxText())), + invbl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVBL")))), + chroMethod(Gtk::manage(new MyComboBoxText())), + activlum(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ACTIV")))), + expdenoise(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI_EXP")))), + quamethod(Gtk::manage(new MyComboBoxText())), + expdenoisenl(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_NLFRA")))), + expdenoiselum(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOIWAVLUM")))), + expdenoisech(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOIWAVCH")))), + LocalcurveEditorwavden(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVDEN"))), + wavshapeden(static_cast(LocalcurveEditorwavden->addCurve(CT_Flat, "", nullptr, false, false))), + // lCLabels(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_LCLABELS")))), + lCLabels(Gtk::manage(new Gtk::Label("-----------------"))), + lumLabels(Gtk::manage(new Gtk::Label("---"))), + lum46Labels(Gtk::manage(new Gtk::Label("---"))), + chroLabels(Gtk::manage(new Gtk::Label("---"))), + chro46Labels(Gtk::manage(new Gtk::Label("---"))), + expdenoise1(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI1_EXP")))), + maskusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusable(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + maskusable2(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusable2(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + maskusable3(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusable3(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + usemask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_USEMASK")))), + lnoiselow(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLNOISELOW"), 0.7, 2., 0.01, 1.))), + levelthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR2"), 20., 99., 0.5, 85.))), + levelthrlow(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW2"), 1., 80., 0.5, 12.))), + noiselumf0(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINEZERO"), MINCHRO, MAXCHRO, 0.01, 0.))), + noiselumf(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINE"), MINCHRO, MAXCHRO, 0.01, 0.))), + noiselumf2(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMFINETWO"), MINCHRO, MAXCHRO, 0.01, 0.))), + noiselumc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMCOARSE"), MINCHRO, MAXCHROCC, 0.01, 0.))),//unused here, but used for normalize_mean_dt + noiselumdetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELUMDETAIL"), 0., 100., 0.01, 50.))), + noiselequal(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISELEQUAL"), -2, 10, 1, 7, Gtk::manage(new RTImage("circle-white-small.png")), Gtk::manage(new RTImage("circle-black-small.png"))))), + noisegam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISEGAM"), 1.0, 5., 0.1, 1.))), + LocalcurveEditorwavhue(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_WAVELET_DENOISEHUE"))), + wavhue(static_cast(LocalcurveEditorwavhue->addCurve(CT_Flat, "", nullptr, false, true))), + noisechrof(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHROFINE"), MINCHRO, MAXCHRO, 0.01, 0.))), + noisechroc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHROCOARSE"), MINCHRO, MAXCHROCC, 0.01, 0.))), + noisechrodetail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NOISECHRODETAIL"), 0., 100., 0.01, 50.))), + detailFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DETAILFRA")))), + detailthr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAILTHR"), 0, 100, 1, 50))), + adjblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ADJ"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-yellow-small.png")), Gtk::manage(new RTImage("circle-red-green-small.png"))))), + expdenoise3(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + recothresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + lowthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW2"), 1., 80., 0.5, 12.))), + midthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRMID"), 0., 100., 0.5, 0.))), + midthresdch(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRMIDCH"), 0., 100., 0.5, 0.))), + higthresd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR2"), 20., 99., 0.5, 85.))), + decayd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + invmaskd(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVMASK")))), + invmask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVMASK")))), + prevFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LCLABELS")))), + nlstr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLLUM"), 0, 100, 1, 0))), + nldet(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLDET"), 0, 100, 1, 50))), + nlpat(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLPAT"), 1, 5, 1, 2))), + nlrad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLRAD"), 3, 10, 1, 5))), + nlgam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NLGAM"), 2., 5., 0.1, 3.))), + bilateral(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BILATERAL"), 0, 100, 1, 0))), + sensiden(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + reparden(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + neutral(Gtk::manage (new Gtk::Button (M ("TP_RETINEX_NEUTRAL")))), + expmaskbl(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWPLUS")))), + showmaskblMethod(Gtk::manage(new MyComboBoxText())), + showmaskblMethodtyp(Gtk::manage(new MyComboBoxText())), + enablMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), +// maskblCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskblCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskblshape(static_cast(maskblCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskblshape(static_cast(maskblCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskblshape(static_cast(maskblCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + strumaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUMASKCOL"), 0., 200., 0.1, 0.))), + toolbl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TOOLCOL")))), + toolblFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), + toolblFrame2(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK_2")))), + blendmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), + slomaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + shadmaskbl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_HIGHMASKCOL"), 0, 100, 1, 0))), + shadmaskblsha(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHAMASKCOL"), 0, 100, 1, 0))), + mask2blCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + Lmaskblshape(static_cast(mask2blCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + mask2blCurveEditorGwav(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVMASK"))), + LLmaskblshapewav(static_cast(mask2blCurveEditorGwav->addCurve(CT_Flat, "L(L)", nullptr, false, false))), + quaHBox(Gtk::manage(new Gtk::Box())), + csThresholdblur(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 0, 9, 0, 0, 6, 5, 0, false))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Blur, Noise & Denoise specific widgets + setExpandAlignProperties(expblnoise, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + float R, G, B; + std::vector six_shape; + + for (int i = 0; i < 6; i++) { + const float x = static_cast(i) * (1.f / 6.f); + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + six_shape.emplace_back(x, R, G, B); + } + + blMethod->append(M("TP_LOCALLAB_BLUR")); + blMethod->append(M("TP_LOCALLAB_BLMED")); + blMethod->append(M("TP_LOCALLAB_BLGUID")); + blMethod->set_active(0); + blMethodConn = blMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::blMethodChanged)); + + fftwblConn = fftwbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::fftwblChanged)); + usemaskConn = usemask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::usemaskChanged)); + invblConn = invbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invblChanged)); + invmaskdConn = invmaskd->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invmaskdChanged)); + invmaskConn = invmask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::invmaskChanged)); + + radius->setAdjusterListener(this); + + strength->setAdjusterListener(this); + + grainFrame->set_label_align(0.025, 0.5); + grainFrame2->set_label_align(0.025, 0.5); + + isogr->setAdjusterListener(this); + + strengr->setAdjusterListener(this); + + scalegr->setAdjusterListener(this); + divgr->setAdjusterListener(this); + + medMethod->append(M("TP_LOCALLAB_MEDNONE")); + medMethod->append(M("TP_DIRPYRDENOISE_TYPE_3X3")); + medMethod->append(M("TP_DIRPYRDENOISE_TYPE_5X5")); + medMethod->append(M("TP_DIRPYRDENOISE_TYPE_7X7")); + medMethod->append(M("TP_DIRPYRDENOISE_TYPE_9X9")); + medMethod->set_active(0); + medMethodConn = medMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::medMethodChanged)); + + itera->setAdjusterListener(this); + + guidbl->setLogScale(100, 0); + guidbl->setAdjusterListener(this); + + strbl->setAdjusterListener(this); + + epsbl->setAdjusterListener(this); + setExpandAlignProperties(expdenoise2, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + recothres->setAdjusterListener(this); + lowthres->setAdjusterListener(this); + higthres->setAdjusterListener(this); + + sensibn->setAdjusterListener(this); + + blurMethod->append(M("TP_LOCALLAB_BLNORM")); + blurMethod->append(M("TP_LOCALLAB_BLINV")); + blurMethod->set_active(0); + blurMethodConn = blurMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::blurMethodChanged)); + + chroMethod->append(M("TP_LOCALLAB_BLLO")); + chroMethod->append(M("TP_LOCALLAB_BLCO")); + chroMethod->append(M("TP_LOCALLAB_BLLC")); + chroMethod->set_active(0); + chroMethodConn = chroMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::chroMethodChanged)); + + activlumConn = activlum->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::activlumChanged)); + + setExpandAlignProperties(expdenoise, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + + quamethod->append(M("TP_LOCALLAB_QUANONEALL")); + quamethod->append(M("TP_LOCALLAB_QUACONSER")); + quamethod->append(M("TP_LOCALLAB_QUAAGRES")); + quamethod->append(M("TP_LOCALLAB_QUANONEWAV")); + quamethodconn = quamethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::quamethodChanged)); + Gtk::Label* const quaLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENQUA") + ":")); + quaHBox->pack_start(*quaLabel, Gtk::PACK_SHRINK, 4); + quaHBox->pack_start(*quamethod); + setExpandAlignProperties(expdenoisenl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + setExpandAlignProperties(expdenoiselum, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + setExpandAlignProperties(expdenoisech, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + LocalcurveEditorwavden->setCurveListener(this); + + wavshapeden->setIdentityValue(0.); + wavshapeden->setResetCurve(FlatCurveType(defSpot.locwavcurveden.at(0)), defSpot.locwavcurveden); + + setExpandAlignProperties(lCLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + setExpandAlignProperties(lumLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + setExpandAlignProperties(lum46Labels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + + setExpandAlignProperties(chroLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + setExpandAlignProperties(chro46Labels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + + + LocalcurveEditorwavden->curveListComplete(); + setExpandAlignProperties(expdenoise1, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + levelthr->setAdjusterListener(this); + lnoiselow->setAdjusterListener(this); + + levelthrlow->setAdjusterListener(this); + + noiselumf0->setAdjusterListener(this); + + noiselumf->setAdjusterListener(this); + + noiselumf2->setAdjusterListener(this); + + noiselumc->setAdjusterListener(this); + + noiselumdetail->setAdjusterListener(this); + + noiselequal->setAdjusterListener(this); + + noisegam->setAdjusterListener(this); + + LocalcurveEditorwavhue->setCurveListener(this); + + wavhue->setIdentityValue(0.); + wavhue->setResetCurve(FlatCurveType(defSpot.locwavcurvehue.at(0)), defSpot.locwavcurvehue); + wavhue->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + wavhue->setCurveColorProvider(this, 3); + wavhue->setBottomBarBgGradient(six_shape); + +// wavguid->setIdentityValue(0.); +// wavguid->setResetCurve(FlatCurveType(defSpot.locwavcurveguid.at(0)), defSpot.locwavcurveguid); + + LocalcurveEditorwavhue->curveListComplete(); + + noisechrof->setAdjusterListener(this); + + noisechroc->set_tooltip_text(M("TP_LOCALLAB_NOISECHROC_TOOLTIP")); + noisechroc->setAdjusterListener(this); + + noisechrodetail->setAdjusterListener(this); + + detailFrame->set_label_align(0.025, 0.5); + detailthr->setAdjusterListener(this); + + adjblur->setAdjusterListener(this); + setExpandAlignProperties(expdenoise3, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + recothresd->setAdjusterListener(this); + lowthresd->setAdjusterListener(this); + midthresd->setAdjusterListener(this); + midthresdch->setAdjusterListener(this); + higthresd->setAdjusterListener(this); + decayd->setAdjusterListener(this); + + bilateral->setAdjusterListener(this); + prevFrame->set_label_align(0.025, 0.5); + + nlstr->setAdjusterListener(this); + nldet->setAdjusterListener(this); + nlpat->setAdjusterListener(this); + nlrad->setAdjusterListener(this); + nlgam->setAdjusterListener(this); + + sensiden->setAdjusterListener(this); + reparden->setAdjusterListener(this); + + + setExpandAlignProperties (neutral, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + 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_TOOLTIP")); + neutralconn = neutral->signal_pressed().connect ( sigc::mem_fun (*this, &LocallabBlur::neutral_pressed) ); + neutral->show(); + + setExpandAlignProperties(expmaskbl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskblMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskblMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskblMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskblMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskblMethod->set_active(0); + showmaskblMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskblMethodConn = showmaskblMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::showmaskblMethodChanged)); + + showmaskblMethodtyp->append(M("TP_LOCALLAB_SHOWMASKTYP1")); + showmaskblMethodtyp->append(M("TP_LOCALLAB_SHOWMASKTYP2")); + showmaskblMethodtyp->append(M("TP_LOCALLAB_SHOWMASKTYP3")); + showmaskblMethodtyp->set_active(1); + showmaskblMethodtypConn = showmaskblMethodtyp->signal_changed().connect(sigc::mem_fun(*this, &LocallabBlur::showmaskblMethodtypChanged)); + + enablMaskConn = enablMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::enablMaskChanged)); + + maskblCurveEditorG->setCurveListener(this); + + CCmaskblshape->setIdentityValue(0.); + CCmaskblshape->setResetCurve(FlatCurveType(defSpot.CCmaskblcurve.at(0)), defSpot.CCmaskblcurve); + CCmaskblshape->setBottomBarColorProvider(this, 1); + + LLmaskblshape->setIdentityValue(0.); + LLmaskblshape->setResetCurve(FlatCurveType(defSpot.LLmaskblcurve.at(0)), defSpot.LLmaskblcurve); + LLmaskblshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskblshape->setIdentityValue(0.); + HHmaskblshape->setResetCurve(FlatCurveType(defSpot.HHmaskblcurve.at(0)), defSpot.HHmaskblcurve); + HHmaskblshape->setCurveColorProvider(this, 2); + HHmaskblshape->setBottomBarColorProvider(this, 2); + + maskblCurveEditorG->curveListComplete(); + + strumaskbl->setAdjusterListener(this); + + toolblConn = toolbl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabBlur::toolblChanged)); + + blendmaskbl->setAdjusterListener(this); + + radmaskbl->setAdjusterListener(this); + + lapmaskbl->setAdjusterListener(this); + + chromaskbl->setAdjusterListener(this); + + gammaskbl->setAdjusterListener(this); + + slomaskbl->setAdjusterListener(this); + + shadmaskbl->setAdjusterListener(this); + + shadmaskblsha->setAdjusterListener(this); + + mask2blCurveEditorG->setCurveListener(this); + + Lmaskblshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskblcurve.at(0)), defSpot.Lmaskblcurve); + Lmaskblshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmaskblshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + mask2blCurveEditorG->curveListComplete(); + + mask2blCurveEditorGwav->setCurveListener(this); + + LLmaskblshapewav->setIdentityValue(0.); + LLmaskblshapewav->setResetCurve(FlatCurveType(defSpot.LLmaskblcurvewav.at(0)), defSpot.LLmaskblcurvewav); + LLmaskblshapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2blCurveEditorGwav->curveListComplete(); + + csThresholdblur->setAdjusterListener(this); + + // Add Blur, Noise & Denoise specific widgets to GUI + ToolParamBlock* const blnoisebox = Gtk::manage(new ToolParamBlock()); + blnoisebox->pack_start(*sensibn); + blnoisebox->pack_start(*invbl); + blnoisebox->pack_start(*blMethod); + blnoisebox->pack_start(*fftwbl, Gtk::PACK_SHRINK, 0); + blnoisebox->pack_start(*radius); + blnoisebox->pack_start(*strength); + + ToolParamBlock* const grain2Box = Gtk::manage(new ToolParamBlock()); + grain2Box->pack_start(*isogr); + grain2Box->pack_start(*divgr); + grainFrame2->add(*grain2Box); + + ToolParamBlock* const grainBox = Gtk::manage(new ToolParamBlock()); + grainBox->pack_start(*grainFrame2); + grainBox->pack_start(*strengr); + grainBox->pack_start(*scalegr); + grainFrame->add(*grainBox); + blnoisebox->pack_start(*grainFrame); + blnoisebox->pack_start(*medMethod); + blnoisebox->pack_start(*itera); + blnoisebox->pack_start(*guidbl); + blnoisebox->pack_start(*strbl); + blnoisebox->pack_start(*epsbl); + ToolParamBlock* const wavBox2 = Gtk::manage(new ToolParamBlock()); + wavBox2->pack_start(*maskusable2, Gtk::PACK_SHRINK, 0); + wavBox2->pack_start(*maskunusable2, Gtk::PACK_SHRINK, 0); + wavBox2->pack_start(*recothres); + wavBox2->pack_start(*lowthres); + wavBox2->pack_start(*higthres); + wavBox2->pack_start(*invmask); + expdenoise2->add(*wavBox2, false); + blnoisebox->pack_start(*expdenoise2); +// blnoisebox->pack_start(*sensibn); +// blnoisebox->pack_start(*blurMethod); +// blnoisebox->pack_start(*invbl); + blnoisebox->pack_start(*chroMethod); + // blnoisebox->pack_start(*activlum); + expblnoise->add(*blnoisebox, false); + pack_start(*expblnoise); + ToolParamBlock* const denoisebox = Gtk::manage(new ToolParamBlock()); + Gtk::Frame* const wavFrame = Gtk::manage(new Gtk::Frame()); + ToolParamBlock* const wavBox = Gtk::manage(new ToolParamBlock()); + wavBox->pack_start(*quaHBox); + wavBox->pack_start(*sensiden); + wavBox->pack_start(*reparden); + ToolParamBlock* const prevBox = Gtk::manage(new ToolParamBlock()); + prevBox->pack_start(*lumLabels); + prevBox->pack_start(*lum46Labels); + prevBox->pack_start(*lCLabels); + prevBox->pack_start(*chroLabels); + prevBox->pack_start(*chro46Labels); + prevFrame->add(*prevBox); + wavBox->pack_start(*prevFrame); + + ToolParamBlock* const nlbox = Gtk::manage(new ToolParamBlock()); + nlbox->pack_start(*nlstr); + nlbox->pack_start(*nldet); + nlbox->pack_start(*nlgam); + nlbox->pack_start(*nlpat); + nlbox->pack_start(*nlrad); + expdenoisenl->add(*nlbox); + + wavBox->pack_start(*expdenoisenl); + + + // wavBox->pack_start(*noiselumf0); + // wavBox->pack_start(*noiselumf); + // wavBox->pack_start(*noiselumf2); + // wavBox->pack_start(*noiselumc);//unused here, but used for normalize_mean_dt + ToolParamBlock* const wchBox = Gtk::manage(new ToolParamBlock()); + + wchBox->pack_start(*LocalcurveEditorwavden, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + wchBox->pack_start(*noiselumdetail); + wchBox->pack_start(*noiselequal); + wchBox->pack_start(*noisegam); + wchBox->pack_start(*LocalcurveEditorwavhue, Gtk::PACK_SHRINK, 4); + ToolParamBlock* const wavBox1 = Gtk::manage(new ToolParamBlock()); + wavBox1->pack_start(*maskusable, Gtk::PACK_SHRINK, 0); + wavBox1->pack_start(*maskunusable, Gtk::PACK_SHRINK, 0); + wavBox1->pack_start(*lnoiselow, Gtk::PACK_SHRINK, 0); + wavBox1->pack_start(*levelthrlow, Gtk::PACK_SHRINK, 0); + wavBox1->pack_start(*levelthr, Gtk::PACK_SHRINK, 0); + expdenoise1->add(*wavBox1, false); + wchBox->pack_start(*expdenoise1); + expdenoiselum->add(*wchBox); + wavBox->pack_start(*expdenoiselum); + ToolParamBlock* const chBox = Gtk::manage(new ToolParamBlock()); + + chBox->pack_start(*noisechrof); + chBox->pack_start(*noisechroc); + chBox->pack_start(*noisechrodetail); + chBox->pack_start(*adjblur); + expdenoisech->add(*chBox); + wavBox->pack_start(*expdenoisech); + + ToolParamBlock* const detailBox = Gtk::manage(new ToolParamBlock()); + detailBox->pack_start(*detailthr); + detailBox->pack_start(*usemask, Gtk::PACK_SHRINK, 0); + detailFrame->add(*detailBox); + wavBox->pack_start(*detailFrame); + + wavFrame->add(*wavBox); + denoisebox->pack_start(*wavFrame); + + ToolParamBlock* const wavBox3 = Gtk::manage(new ToolParamBlock()); + wavBox3->pack_start(*maskusable3, Gtk::PACK_SHRINK, 0); + wavBox3->pack_start(*maskunusable3, Gtk::PACK_SHRINK, 0); + wavBox3->pack_start(*recothresd); + wavBox3->pack_start(*lowthresd); + wavBox3->pack_start(*midthresd); + wavBox3->pack_start(*midthresdch); + wavBox3->pack_start(*higthresd); + wavBox3->pack_start(*decayd); + wavBox3->pack_start(*invmaskd); + expdenoise3->add(*wavBox3, false); + denoisebox->pack_start(*expdenoise3); + denoisebox->pack_start(*bilateral); + denoisebox->pack_start(*neutral); + + expdenoise->add(*denoisebox, false); + pack_start(*expdenoise); + ToolParamBlock* const maskblBox = Gtk::manage(new ToolParamBlock()); + maskblBox->pack_start(*showmaskblMethod, Gtk::PACK_SHRINK, 4); + maskblBox->pack_start(*showmaskblMethodtyp, Gtk::PACK_SHRINK, 4); + maskblBox->pack_start(*enablMask, Gtk::PACK_SHRINK, 0); + maskblBox->pack_start(*maskblCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskblBox->pack_start(*strumaskbl, Gtk::PACK_SHRINK, 0); + maskblBox->pack_start(*toolbl, Gtk::PACK_SHRINK, 0); + Gtk::Separator* const separatorstrubl = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + maskblBox->pack_start(*separatorstrubl, Gtk::PACK_SHRINK, 2); + maskblBox->pack_start(*blendmaskbl, Gtk::PACK_SHRINK, 0); + toolblFrame->set_label_align(0.025, 0.5); + toolblFrame2->set_label_align(0.025, 0.5); + ToolParamBlock* const toolblBox = Gtk::manage(new ToolParamBlock()); + toolblBox->pack_start(*radmaskbl, Gtk::PACK_SHRINK, 0); + toolblBox->pack_start(*lapmaskbl, Gtk::PACK_SHRINK, 0); + toolblBox->pack_start(*chromaskbl, Gtk::PACK_SHRINK, 0); + toolblBox->pack_start(*gammaskbl, Gtk::PACK_SHRINK, 0); + toolblBox->pack_start(*slomaskbl, Gtk::PACK_SHRINK, 0); + toolblBox->pack_start(*shadmaskblsha, Gtk::PACK_SHRINK, 0); + toolblBox->pack_start(*shadmaskbl, Gtk::PACK_SHRINK, 0); + toolblBox->pack_start(*mask2blCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + ToolParamBlock* const toolblBox2 = Gtk::manage(new ToolParamBlock()); + toolblBox2->pack_start(*mask2blCurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolblBox2->pack_start(*csThresholdblur, Gtk::PACK_SHRINK, 0); + toolblFrame2->add(*toolblBox2); + toolblBox->pack_start(*toolblFrame2); + toolblFrame->add(*toolblBox); + maskblBox->pack_start(*toolblFrame); + expmaskbl->add(*maskblBox, false); + pack_start(*expmaskbl); +} + +LocallabBlur::~LocallabBlur() +{ + delete LocalcurveEditorwavden; + delete LocalcurveEditorwavhue; + delete maskblCurveEditorG; + delete mask2blCurveEditorG; + delete mask2blCurveEditorGwav; +} + +bool LocallabBlur::isMaskViewActive() +{ + return (showmaskblMethod->get_active_row_number() != 0); +} + +void LocallabBlur::resetMaskView() +{ + showmaskblMethodConn.block(true); + showmaskblMethod->set_active(0); + showmaskblMethodConn.block(false); +} + +void LocallabBlur::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + blMask = showmaskblMethod->get_active_row_number(); +} + +void LocallabBlur::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + expblnoise->set_tooltip_markup(M("TP_LOCALLAB_BLUMETHOD_TOOLTIP")); + radius->set_tooltip_text(M("TP_LOCALLAB_RADIUS_TOOLTIP")); + strength->set_tooltip_text(M("TP_LOCALLAB_NOISE_TOOLTIP")); + grainFrame->set_tooltip_text(M("TP_LOCALLAB_GRAIN_TOOLTIP")); + sensibn->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + reparden->set_tooltip_text(M("TP_LOCALLAB_REPARDEN_TOOLTIP")); + medMethod->set_tooltip_text(M("TP_LOCALLAB_MEDIAN_TOOLTIP")); + itera->set_tooltip_text(M("TP_LOCALLAB_MEDIANITER_TOOLTIP")); + fftwbl->set_tooltip_text(M("TP_LOCALLAB_FFTMASK_TOOLTIP")); + guidbl->set_tooltip_text(M("TP_LOCALLAB_GUIDBL_TOOLTIP")); + strbl->set_tooltip_text(M("TP_LOCALLAB_GUIDSTRBL_TOOLTIP")); + epsbl->set_tooltip_text(M("TP_LOCALLAB_GUIDEPSBL_TOOLTIP")); + blurMethod->set_tooltip_markup(M("TP_LOCALLAB_BLMETHOD_TOOLTIP")); + invbl->set_tooltip_markup(M("TP_LOCALLAB_INVBL_TOOLTIP")); + expdenoise->set_tooltip_markup(M("TP_LOCALLAB_DENOI_TOOLTIP")); + quamethod->set_tooltip_markup(M("TP_LOCALLAB_DENOIQUA_TOOLTIP")); + wavshapeden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); + wavhue->setTooltip(M("TP_LOCALLAB_WAVHUE_TOOLTIP")); + expdenoise1->set_tooltip_markup(M("TP_LOCALLAB_MASKLC_TOOLTIP")); + expdenoise2->set_tooltip_markup(M("TP_LOCALLAB_MASKGF_TOOLTIP")); + expdenoise3->set_tooltip_markup(M("TP_LOCALLAB_MASKDE_TOOLTIP")); + expdenoisenl->set_tooltip_markup(M("TP_LOCALLAB_NLFRAME_TOOLTIP")); + invmask->set_tooltip_text(M("TP_LOCALLAB_MASKDEINV_TOOLTIP")); + invmaskd->set_tooltip_text(M("TP_LOCALLAB_MASKDEINV_TOOLTIP")); + LocalcurveEditorwavden->setTooltip(M("TP_LOCALLAB_WASDEN_TOOLTIP")); + noiselequal->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUAL_TOOLTIP")); + noisegam->set_tooltip_text(M("TP_LOCALLAB_NOISEGAM_TOOLTIP")); + noiselumdetail->set_tooltip_text(M("TP_LOCALLAB_DENOILUMDETAIL_TOOLTIP")); + noisechrof->set_tooltip_text(M("TP_LOCALLAB_DENOICHROF_TOOLTIP")); + noisechroc->set_tooltip_text(M("TP_LOCALLAB_DENOICHROC_TOOLTIP")); + noisechrodetail->set_tooltip_text(M("TP_LOCALLAB_DENOICHRODET_TOOLTIP")); + detailthr->set_tooltip_text(M("TP_LOCALLAB_DENOITHR_TOOLTIP")); + adjblur->set_tooltip_text(M("TP_LOCALLAB_DENOIEQUALCHRO_TOOLTIP")); + bilateral->set_tooltip_text(M("TP_LOCALLAB_DENOIBILAT_TOOLTIP")); + prevFrame->set_tooltip_text(M("TP_LOCALLAB_LCLABELS_TOOLTIP")); + nlstr->set_tooltip_text(M("TP_LOCALLAB_NLDENOISE_TOOLTIP")); + nldet->set_tooltip_text(M("TP_LOCALLAB_NLDENOISE_TOOLTIP")); + nlpat->set_tooltip_text(M("TP_LOCALLAB_NLDENOISENLPAT_TOOLTIP")); + nlrad->set_tooltip_text(M("TP_LOCALLAB_NLDENOISENLRAD_TOOLTIP")); + nlgam->set_tooltip_text(M("TP_LOCALLAB_NLDENOISENLGAM_TOOLTIP")); + noiselumc->set_tooltip_text(M("TP_LOCALLAB_NOISECHROC_TOOLTIP")); + expmaskbl->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + showmaskblMethodtyp->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKTYP_TOOLTIP")); + CCmaskblshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskblshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskblshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmaskbl->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + Lmaskblshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + LLmaskblshapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); + maskblCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + strumaskbl->set_tooltip_text(M("TP_LOCALLAB_STRUSTRMASK_TOOLTIP")); + toolbl->set_tooltip_text(M("TP_LOCALLAB_TOOLMASK_TOOLTIP")); + toolblFrame->set_tooltip_text(M("TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP")); + gammaskbl->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskbl->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskbl->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + shadmaskbl->set_tooltip_text(M("TP_LOCALLAB_SHADHMASK_TOOLTIP")); + shadmaskblsha->set_tooltip_text(M("TP_LOCALLAB_SHADMASK_TOOLTIP")); + lapmaskbl->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + csThresholdblur->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); + sensiden->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + lowthres->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRES_TOOLTIP")); + lowthresd->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESD_TOOLTIP")); +// midthresd->set_tooltip_text(M("TP_LOCALLAB_MASKMIDTHRESD_TOOLTIP")); + higthresd->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESD_TOOLTIP")); + higthres->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRES_TOOLTIP")); + decayd->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lCLabels->set_tooltip_text(M("TP_LOCALLAB_LCLABELS_TOOLTIP")); + } else { + + expblnoise->set_tooltip_markup(""); + radius->set_tooltip_text(""); + strength->set_tooltip_text(""); + grainFrame->set_tooltip_text(""); + sensibn->set_tooltip_text(""); + reparden->set_tooltip_text(""); + medMethod->set_tooltip_text(""); + itera->set_tooltip_text(""); + fftwbl->set_tooltip_text(""); + guidbl->set_tooltip_text(""); + strbl->set_tooltip_text(""); + epsbl->set_tooltip_text(""); + blurMethod->set_tooltip_markup(""); + quamethod->set_tooltip_markup(""); + wavhue->setTooltip(""); + expdenoise1->set_tooltip_markup(""); + expdenoise2->set_tooltip_markup(""); + expdenoise3->set_tooltip_markup(""); + invmask->set_tooltip_text(""); + invmaskd->set_tooltip_text(""); + LocalcurveEditorwavden->setTooltip(""); + noiselequal->set_tooltip_text(""); + noisegam->set_tooltip_text(""); + noiselumdetail->set_tooltip_text(""); + noisechrof->set_tooltip_text(""); + noisechroc->set_tooltip_text(""); + noisechrodetail->set_tooltip_text(""); + detailthr->set_tooltip_text(""); + adjblur->set_tooltip_text(""); + bilateral->set_tooltip_text(""); + prevFrame->set_tooltip_text(""); + nlstr->set_tooltip_text(""); + nldet->set_tooltip_text(""); + nlpat->set_tooltip_text(""); + nlrad->set_tooltip_text(""); + nlgam->set_tooltip_text(""); + blurMethod->set_tooltip_markup(""); + expdenoise->set_tooltip_markup(""); + wavshapeden->setTooltip(""); + noiselumc->set_tooltip_text(""); + expmaskbl->set_tooltip_markup(""); + showmaskblMethodtyp->set_tooltip_markup(""); + CCmaskblshape->setTooltip(""); + LLmaskblshape->setTooltip(""); + HHmaskblshape->setTooltip(""); + blendmaskbl->set_tooltip_text(""); + radmaskbl->set_tooltip_text(""); + lapmaskbl->set_tooltip_text(""); + Lmaskblshape->setTooltip(""); + LLmaskblshapewav->setTooltip(""); + maskblCurveEditorG->set_tooltip_markup(""); + strumaskbl->set_tooltip_text(""); + toolbl->set_tooltip_text(""); + toolblFrame->set_tooltip_text(""); + gammaskbl->set_tooltip_text(""); + chromaskbl->set_tooltip_text(""); + slomaskbl->set_tooltip_text(""); + shadmaskbl->set_tooltip_text(""); + shadmaskblsha->set_tooltip_text(""); + csThresholdblur->set_tooltip_text(""); + sensiden->set_tooltip_text(""); + lowthres->set_tooltip_text(""); + lowthresd->set_tooltip_text(""); + higthresd->set_tooltip_text(""); + higthres->set_tooltip_text(""); +// midthresd->set_tooltip_text(""); + decayd->set_tooltip_text(""); + lCLabels->set_tooltip_text(""); + expdenoisenl->set_tooltip_markup(""); + + } +} + +void LocallabBlur::neutral_pressed () +{ + const LocallabParams::LocallabSpot defSpot; + lnoiselow->setValue(defSpot.lnoiselow); + levelthr->setValue(defSpot.levelthr); + levelthrlow->setValue(defSpot.levelthrlow); + noiselumf0->setValue(defSpot.noiselumf0); + noiselumdetail->setValue(defSpot.noiselumdetail); + noiselequal->setValue(defSpot.noiselequal); + noisegam->setValue(defSpot.noisegam); + noisechrof->setValue(defSpot.noisechrof); + noisechroc->setValue(defSpot.noisechroc); + noisechrodetail->setValue(defSpot.noisechrodetail); + detailthr->setValue(defSpot.detailthr);; + adjblur->setValue(defSpot.adjblur); + bilateral->setValue(defSpot.bilateral); + nlstr->setValue(defSpot.nlstr); + nldet->setValue(defSpot.nldet); + nlpat->setValue(defSpot.nlpat); + nlrad->setValue(defSpot.nlrad); + nlgam->setValue(defSpot.nlgam); + sensiden->setValue(defSpot.sensiden); + quamethod->set_active (0); + wavshapeden->setCurve(defSpot.locwavcurveden); + wavhue->setCurve(defSpot.locwavcurvehue); + usemask->set_active(defSpot.usemask); + invmaskd->set_active(defSpot.invmaskd); + invmask->set_active(defSpot.invmask); + recothresd->setValue(defSpot.recothresd); + lowthresd->setValue(defSpot.lowthresd); + midthresd->setValue(defSpot.midthresd); + midthresdch->setValue(defSpot.midthresdch); + higthresd->setValue(defSpot.higthresd); + decayd->setValue(defSpot.decayd); + recothres->setValue(defSpot.recothres); + lowthres->setValue(defSpot.lowthres); + higthres->setValue(defSpot.higthres); + + +} +void LocallabBlur::updatedenlc(const double highres, const double nres, const double highres46, const double nres46, const double Lhighres, const double Lnres, const double Lhighres46, const double Lnres46) +{ + idle_register.add( + [this, highres, nres, highres46, nres46, Lhighres, Lnres, Lhighres46, Lnres46]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + lumLabels->set_text( + Glib::ustring::compose(M("TP_LOCALLAB_LUMLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), Lnres), + Glib::ustring::format(std::fixed, std::setprecision(0), Lhighres)) + ); + lum46Labels->set_text( + Glib::ustring::compose(M("TP_LOCALLAB_LUM46LABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), Lnres46 ), + Glib::ustring::format(std::fixed, std::setprecision(0), Lhighres46)) + ); + chroLabels->set_text( + Glib::ustring::compose(M("TP_LOCALLAB_CHROLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), nres), + Glib::ustring::format(std::fixed, std::setprecision(0), highres)) + ); + chro46Labels->set_text( + Glib::ustring::compose(M("TP_LOCALLAB_CHRO46LABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), nres46), + Glib::ustring::format(std::fixed, std::setprecision(0), highres46)) + ); + return false; + } + ); +} +void LocallabBlur::setDefaultExpanderVisibility() +{ + expblnoise->set_expanded(false); + expdenoise->set_expanded(false); + expdenoise1->set_expanded(false); + expdenoise2->set_expanded(false); + expdenoise3->set_expanded(false); + expmaskbl->set_expanded(false); + expdenoisenl->set_expanded(false); + expdenoiselum->set_expanded(false); + expdenoisech->set_expanded(false); +} + +void LocallabBlur::disableListener() +{ + LocallabTool::disableListener(); + + blMethodConn.block(true); + fftwblConn.block(true); + usemaskConn.block(true); + invmaskdConn.block(true); + invmaskConn.block(true); + invblConn.block(true); + medMethodConn.block(true); + blurMethodConn.block(true); + chroMethodConn.block(true); + quamethodconn.block(true); + activlumConn.block(true); + showmaskblMethodConn.block(true); + showmaskblMethodtypConn.block(true); + enablMaskConn.block(true); + toolblConn.block(true); +} + +void LocallabBlur::enableListener() +{ + LocallabTool::enableListener(); + + blMethodConn.block(false); + fftwblConn.block(false); + usemaskConn.block(false); + invmaskdConn.block(false); + invmaskConn.block(false); + invblConn.block(false); + medMethodConn.block(false); + blurMethodConn.block(false); + chroMethodConn.block(false); + quamethodconn.block(false); + activlumConn.block(false); + showmaskblMethodConn.block(false); + showmaskblMethodtypConn.block(false); + enablMaskConn.block(false); + toolblConn.block(false); +} + +void LocallabBlur::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visiblur); + exp->setEnabled(spot.expblur); + complexity->set_active(spot.complexblur); + + if (spot.blMethod == "blur") { + blMethod->set_active(0); + } else if (spot.blMethod == "med") { + blMethod->set_active(1); + } else if (spot.blMethod == "guid") { + blMethod->set_active(2); + } + + fftwbl->set_active(spot.fftwbl); + usemask->set_active(spot.usemask); + invmaskd->set_active(spot.invmaskd); + invmask->set_active(spot.invmask); + invbl->set_active(spot.invbl); + radius->setValue(spot.radius); + strength->setValue(spot.strength); + isogr->setValue((double)spot.isogr); + strengr->setValue((double)spot.strengr); + scalegr->setValue((double)spot.scalegr); + divgr->setValue((double)spot.divgr); + + if (spot.medMethod == "none") { + medMethod->set_active(0); + } else if (spot.medMethod == "33") { + medMethod->set_active(1); + } else if (spot.medMethod == "55") { + medMethod->set_active(2); + } else if (spot.medMethod == "77") { + medMethod->set_active(3); + } else if (spot.medMethod == "99") { + medMethod->set_active(4); + } + + itera->setValue((double)spot.itera); + guidbl->setValue((double)spot.guidbl); + strbl->setValue((double)spot.strbl); + recothres->setValue((double)spot.recothres); + lowthres->setValue((double)spot.lowthres); + higthres->setValue((double)spot.higthres); + epsbl->setValue((double)spot.epsbl); + sensibn->setValue((double)spot.sensibn); + reparden->setValue(spot.reparden); + recothresd->setValue((double)spot.recothresd); + lowthresd->setValue((double)spot.lowthresd); + midthresd->setValue((double)spot.midthresd); + midthresdch->setValue((double)spot.midthresdch); + higthresd->setValue((double)spot.higthresd); + decayd->setValue((double)spot.decayd); + + if (spot.blurMethod == "norm") { + blurMethod->set_active(0); + } else if (spot.blurMethod == "inv") { + blurMethod->set_active(1); + } + + if (spot.chroMethod == "lum") { + chroMethod->set_active(0); + } else if (spot.chroMethod == "chr") { + chroMethod->set_active(1); + } else if (spot.chroMethod == "all") { + chroMethod->set_active(2); + } + + if (spot.quamethod == "none") { + quamethod->set_active(0); + } else if (spot.quamethod == "cons") { + quamethod->set_active(1); + } else if (spot.quamethod == "agre") { + quamethod->set_active(2); + } else if (spot.quamethod == "nlmean") { + quamethod->set_active(3); + } + + activlum->set_active(spot.activlum); + wavshapeden->setCurve(spot.locwavcurveden); + wavhue->setCurve(spot.locwavcurvehue); + noiselumf0->setValue(spot.noiselumf0); + noiselumf->setValue(spot.noiselumf); + noiselumf2->setValue(spot.noiselumf2); + noiselumc->setValue(spot.noiselumc); + noiselumdetail->setValue(spot.noiselumdetail); + levelthr->setValue(spot.levelthr); + lnoiselow->setValue(spot.lnoiselow); + levelthrlow->setValue(spot.levelthrlow); + noiselequal->setValue((double)spot.noiselequal); + noisegam->setValue((double)spot.noisegam); + noisechrof->setValue(spot.noisechrof); + noisechroc->setValue(spot.noisechroc); + noisechrodetail->setValue(spot.noisechrodetail); + detailthr->setValue((double)spot.detailthr); + adjblur->setValue((double)spot.adjblur); + bilateral->setValue((double)spot.bilateral); + nlstr->setValue((double)spot.nlstr); + nldet->setValue((double)spot.nldet); + nlpat->setValue((double)spot.nlpat); + nlrad->setValue((double)spot.nlrad); + nlgam->setValue((double)spot.nlgam); + sensiden->setValue((double)spot.sensiden); + + if (spot.showmaskblMethodtyp == "blur") { + showmaskblMethodtyp ->set_active(0); + } else if (spot.showmaskblMethodtyp == "nois") { + showmaskblMethodtyp->set_active(1); + } else if (spot.showmaskblMethodtyp == "all") { + showmaskblMethodtyp->set_active(2); + } + + enablMask->set_active(spot.enablMask); + CCmaskblshape->setCurve(spot.CCmaskblcurve); + LLmaskblshape->setCurve(spot.LLmaskblcurve); + HHmaskblshape->setCurve(spot.HHmaskblcurve); + strumaskbl->setValue(spot.strumaskbl); + toolbl->set_active(spot.toolbl); + blendmaskbl->setValue((double)spot.blendmaskbl); + radmaskbl->setValue(spot.radmaskbl); + lapmaskbl->setValue(spot.lapmaskbl); + chromaskbl->setValue(spot.chromaskbl); + gammaskbl->setValue(spot.gammaskbl); + slomaskbl->setValue(spot.slomaskbl); + shadmaskbl->setValue((double)spot.shadmaskbl); + shadmaskblsha->setValue((double)spot.shadmaskblsha); + Lmaskblshape->setCurve(spot.Lmaskblcurve); + LLmaskblshapewav->setCurve(spot.LLmaskblcurvewav); + csThresholdblur->setValue(spot.csthresholdblur); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update Blur & Noise GUI according to blMethod combobox state + updateBlurGUI(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabBlur::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expblur = exp->getEnabled(); + spot.visiblur = exp->get_visible(); + spot.complexblur = complexity->get_active_row_number(); + + if (blMethod->get_active_row_number() == 0) { + spot.blMethod = "blur"; + } else if (blMethod->get_active_row_number() == 1) { + spot.blMethod = "med"; + } else if (blMethod->get_active_row_number() == 2) { + spot.blMethod = "guid"; + } + + spot.fftwbl = fftwbl->get_active(); + spot.usemask = usemask->get_active(); + spot.invmaskd = invmaskd->get_active(); + spot.invmask = invmask->get_active(); + spot.invbl = invbl->get_active(); + spot.radius = radius->getValue(); + spot.strength = strength->getIntValue(); + spot.isogr = isogr->getIntValue(); + spot.strengr = strengr->getIntValue(); + spot.scalegr = scalegr->getIntValue(); + spot.divgr = divgr->getValue(); + + if (medMethod->get_active_row_number() == 0) { + spot.medMethod = "none"; + } else if (medMethod->get_active_row_number() == 1) { + spot.medMethod = "33"; + } else if (medMethod->get_active_row_number() == 2) { + spot.medMethod = "55"; + } else if (medMethod->get_active_row_number() == 3) { + spot.medMethod = "77"; + } else if (medMethod->get_active_row_number() == 4) { + spot.medMethod = "99"; + } + + spot.itera = itera->getIntValue(); + spot.guidbl = guidbl->getIntValue(); + spot.strbl = strbl->getIntValue(); + spot.recothres = recothres->getValue(); + spot.lowthres = lowthres->getValue(); + spot.higthres = higthres->getValue(); + spot.epsbl = epsbl->getIntValue(); + spot.sensibn = sensibn->getIntValue(); + spot.reparden = reparden->getValue(); + spot.recothresd = recothresd->getValue(); + spot.lowthresd = lowthresd->getValue(); + spot.midthresd = midthresd->getValue(); + spot.midthresdch = midthresdch->getValue(); + spot.higthresd = higthresd->getValue(); + spot.decayd = decayd->getValue(); + + if (blurMethod->get_active_row_number() == 0) { + spot.blurMethod = "norm"; + } else if (blurMethod->get_active_row_number() == 1) { + spot.blurMethod = "inv"; + } + + if (chroMethod->get_active_row_number() == 0) { + spot.chroMethod = "lum"; + } else if (chroMethod->get_active_row_number() == 1) { + spot.chroMethod = "chr"; + } else if (chroMethod->get_active_row_number() == 2) { + spot.chroMethod = "all"; + } + + if (quamethod->get_active_row_number() == 0) { + spot.quamethod = "none"; + } else if (quamethod->get_active_row_number() == 1) { + spot.quamethod = "cons"; + } else if (quamethod->get_active_row_number() == 2) { + spot.quamethod = "agre"; + } else if (quamethod->get_active_row_number() == 3) { + spot.quamethod = "nlmean"; + } + + spot.activlum = activlum->get_active(); + spot.locwavcurveden = wavshapeden->getCurve(); + spot.locwavcurvehue = wavhue->getCurve(); + spot.noiselumf0 = noiselumf0->getValue(); + spot.noiselumf = noiselumf->getValue(); + spot.noiselumf2 = noiselumf2->getValue(); + spot.noiselumc = noiselumc->getValue(); + spot.noiselumdetail = noiselumdetail->getValue(); + spot.levelthr = levelthr->getValue(); + spot.lnoiselow = lnoiselow->getValue(); + spot.levelthrlow = levelthrlow->getValue(); + spot.noiselequal = noiselequal->getIntValue(); + spot.noisegam = noisegam->getValue(); + spot.noisechrof = noisechrof->getValue(); + spot.noisechroc = noisechroc->getValue(); + spot.noisechrodetail = noisechrodetail->getValue(); + spot.detailthr = detailthr->getIntValue(); + spot.adjblur = adjblur->getIntValue(); + spot.bilateral = bilateral->getIntValue(); + spot.sensiden = sensiden->getIntValue(); + spot.nlstr = nlstr->getIntValue(); + spot.nldet = nldet->getIntValue(); + spot.nlpat = nlpat->getIntValue(); + spot.nlrad = nlrad->getIntValue(); + spot.nlgam = nlgam->getValue(); + + if (showmaskblMethodtyp->get_active_row_number() == 0) { + spot.showmaskblMethodtyp = "blur"; + } else if (showmaskblMethodtyp->get_active_row_number() == 1) { + spot.showmaskblMethodtyp = "nois"; + } else if (showmaskblMethodtyp->get_active_row_number() == 2) { + spot.showmaskblMethodtyp = "all"; + } + + spot.enablMask = enablMask->get_active(); + spot.LLmaskblcurve = LLmaskblshape->getCurve(); + spot.CCmaskblcurve = CCmaskblshape->getCurve(); + spot.HHmaskblcurve = HHmaskblshape->getCurve(); + spot.strumaskbl = strumaskbl->getValue(); + spot.toolbl = toolbl->get_active(); + spot.blendmaskbl = blendmaskbl->getIntValue(); + spot.radmaskbl = radmaskbl->getValue(); + spot.lapmaskbl = lapmaskbl->getValue(); + spot.chromaskbl = chromaskbl->getValue(); + spot.gammaskbl = gammaskbl->getValue(); + spot.slomaskbl = slomaskbl->getValue(); + spot.shadmaskbl = shadmaskbl->getIntValue(); + spot.shadmaskblsha = shadmaskblsha->getIntValue(); + spot.Lmaskblcurve = Lmaskblshape->getCurve(); + spot.LLmaskblcurvewav = LLmaskblshapewav->getCurve(); + spot.csthresholdblur = csThresholdblur->getValue(); + + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabBlur::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default value for adjuster and threshold adjuster widgets + radius->setDefault(defSpot.radius); + strength->setDefault((double)defSpot.strength); + isogr->setDefault((double)defSpot.isogr); + strengr->setDefault((double)defSpot.strengr); + scalegr->setDefault((double)defSpot.scalegr); + divgr->setDefault((double)defSpot.divgr); + itera->setDefault((double)defSpot.itera); + guidbl->setDefault((double)defSpot.guidbl); + strbl->setDefault((double)defSpot.strbl); + recothres->setDefault((double)defSpot.recothres); + lowthres->setDefault((double)defSpot.lowthres); + higthres->setDefault((double)defSpot.higthres); + epsbl->setDefault((double)defSpot.epsbl); + sensibn->setDefault((double)defSpot.sensibn); + reparden->setDefault(defSpot.reparden); + recothresd->setDefault((double)defSpot.recothresd); + lowthresd->setDefault((double)defSpot.lowthresd); + midthresd->setDefault((double)defSpot.midthresd); + midthresdch->setDefault((double)defSpot.midthresdch); + higthresd->setDefault((double)defSpot.higthresd); + decayd->setDefault((double)defSpot.decayd); + noiselumf0->setDefault(defSpot.noiselumf0); + noiselumf->setDefault(defSpot.noiselumf); + noiselumf2->setDefault(defSpot.noiselumf2); + noiselumc->setDefault(defSpot.noiselumc); + noiselumdetail->setDefault(defSpot.noiselumdetail); + levelthr->setDefault(defSpot.levelthr); + lnoiselow->setDefault(defSpot.lnoiselow); + levelthrlow->setDefault(defSpot.levelthrlow); + noiselequal->setDefault((double)defSpot.noiselequal); + noisegam->setDefault(defSpot.noisegam); + noisechrof->setDefault(defSpot.noisechrof); + noisechroc->setDefault(defSpot.noisechroc); + noisechrodetail->setDefault(defSpot.noisechrodetail); + detailthr->setDefault((double)defSpot.detailthr); + adjblur->setDefault((double)defSpot.adjblur); + bilateral->setDefault((double)defSpot.bilateral); + nlstr->setDefault((double)defSpot.nlstr); + nldet->setDefault((double)defSpot.nldet); + nlpat->setDefault((double)defSpot.nlpat); + nlrad->setDefault((double)defSpot.nlrad); + nlgam->setDefault(defSpot.nlgam); + sensiden->setDefault((double)defSpot.sensiden); + strumaskbl->setDefault(defSpot.strumaskbl); + blendmaskbl->setDefault((double)defSpot.blendmaskbl); + radmaskbl->setDefault(defSpot.radmaskbl); + lapmaskbl->setDefault(defSpot.lapmaskbl); + chromaskbl->setDefault(defSpot.chromaskbl); + gammaskbl->setDefault(defSpot.gammaskbl); + slomaskbl->setDefault(defSpot.slomaskbl); + shadmaskbl->setDefault(defSpot.shadmaskbl); + shadmaskblsha->setDefault(defSpot.shadmaskblsha); + csThresholdblur->setDefault(defSpot.csthresholdblur); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabBlur::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == radius) { + if (listener) { + listener->panelChanged(Evlocallabradius, + radius->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strength) { + if (listener) { + listener->panelChanged(Evlocallabstrength, + strength->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == isogr) { + if (listener) { + listener->panelChanged(Evlocallabisogr, + isogr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strengr) { + if (listener) { + listener->panelChanged(Evlocallabstrengr, + strengr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == scalegr) { + if (listener) { + listener->panelChanged(Evlocallabscalegr, + scalegr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == divgr) { + if (listener) { + listener->panelChanged(Evlocallabdivgr, + divgr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == itera) { + if (listener) { + listener->panelChanged(Evlocallabitera, + itera->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == guidbl) { + if (listener) { + listener->panelChanged(Evlocallabguidbl, + guidbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strbl) { + if (listener) { + listener->panelChanged(Evlocallabstrbl, + strbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothres) { + if(recothres->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 1) { + showmaskblMethodtyp->set_active(2); + } + } + + if (listener) { + listener->panelChanged(Evlocallabrecothres, + recothres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthres) { + if (listener) { + listener->panelChanged(Evlocallablowthres, + lowthres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthres) { + if (listener) { + listener->panelChanged(Evlocallabhigthres, + higthres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothresd) { + if(recothresd->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + + if (listener) { + listener->panelChanged(Evlocallabrecothresd, + recothresd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthresd) { + if (listener) { + listener->panelChanged(Evlocallablowthresd, + lowthresd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == midthresd) { + if (listener) { + listener->panelChanged(Evlocallabmidthresd, + midthresd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == midthresdch) { + if (listener) { + listener->panelChanged(Evlocallabmidthresdch, + midthresdch->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthresd) { + if (listener) { + listener->panelChanged(Evlocallabhigthresd, + higthresd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decayd) { + if (listener) { + listener->panelChanged(Evlocallabdecayd, + decayd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == epsbl) { + if (listener) { + listener->panelChanged(Evlocallabepsbl, + epsbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensibn) { + if (listener) { + listener->panelChanged(Evlocallabsensibn, + sensibn->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noiselumf0) { + if (listener) { + listener->panelChanged(Evlocallabnoiselumf0, + noiselumf0->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noiselumf) { + if (listener) { + listener->panelChanged(Evlocallabnoiselumf, + noiselumf->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noiselumf2) { + if (listener) { + listener->panelChanged(Evlocallabnoiselumf2, + noiselumf2->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noiselumc) { + if (listener) { + listener->panelChanged(Evlocallabnoiselumc, + noiselumc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noiselumdetail) { + if (listener) { + listener->panelChanged(Evlocallabnoiselumdetail, + noiselumdetail->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noiselequal) { + if (listener) { + listener->panelChanged(Evlocallabnoiselequal, + noiselequal->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noisegam) { + if (listener) { + listener->panelChanged(Evlocallabnoisegam, + noisegam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == levelthr) { + if (listener) { + listener->panelChanged(Evlocallablevelthr, + levelthr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lnoiselow) { + if(lnoiselow->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + if (listener) { + listener->panelChanged(Evlocallablnoiselow, + lnoiselow->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == levelthrlow) { + if (listener) { + listener->panelChanged(Evlocallablevelthrlow, + levelthrlow->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noisechrof) { + if (listener) { + listener->panelChanged(Evlocallabnoisechrof, + noisechrof->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noisechroc) { + if (listener) { + listener->panelChanged(Evlocallabnoisechroc, + noisechroc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == noisechrodetail) { + if (listener) { + listener->panelChanged(Evlocallabnoisechrodetail, + noisechrodetail->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == detailthr) { + if (listener) { + listener->panelChanged(Evlocallabdetailthr, + detailthr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == adjblur) { + if (listener) { + listener->panelChanged(Evlocallabadjblur, + adjblur->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == bilateral) { + if (listener) { + listener->panelChanged(Evlocallabbilateral, + bilateral->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == nlstr) { + if (listener) { + listener->panelChanged(Evlocallabnlstr, + nlstr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == nldet) { + if (listener) { + listener->panelChanged(Evlocallabnldet, + nldet->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == nlpat) { + if (listener) { + listener->panelChanged(Evlocallabnlpat, + nlpat->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == nlrad) { + if (listener) { + listener->panelChanged(Evlocallabnlrad, + nlrad->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == nlgam) { + if (listener) { + listener->panelChanged(Evlocallabnlgam, + nlgam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensiden) { + if (listener) { + listener->panelChanged(Evlocallabsensiden, + sensiden->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == reparden) { + if (listener) { + listener->panelChanged(Evlocallabreparden, + reparden->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strumaskbl) { + if (listener) { + listener->panelChanged(Evlocallabstrumaskbl, + strumaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskbl) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskbl, + blendmaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskbl) { + if (listener) { + listener->panelChanged(Evlocallabradmaskbl, + radmaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskbl) { + if (listener) { + listener->panelChanged(Evlocallablapmaskbl, + lapmaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskbl) { + if (listener) { + listener->panelChanged(Evlocallabchromaskbl, + chromaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskbl) { + if (listener) { + listener->panelChanged(Evlocallabgammaskbl, + gammaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskbl) { + if (listener) { + listener->panelChanged(Evlocallabslomaskbl, + slomaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shadmaskbl) { + if (listener) { + listener->panelChanged(Evlocallabshadmaskbl, + shadmaskbl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shadmaskblsha) { + if (listener) { + listener->panelChanged(Evlocallabshadmaskblsha, + shadmaskblsha->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + } +} + + + +void LocallabBlur::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabcsThresholdblur, + csThresholdblur->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabBlur::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == wavshapeden) { + if (listener) { + listener->panelChanged(EvlocallabwavCurveden, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavhue) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvehue, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CCmaskblshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskblshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskblshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskblshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskblshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskblshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskblshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskblshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskblshapewav) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskblshapewav, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenablur, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenablur, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + invmask->set_active(defSpot.invmask); + invmaskd->set_active(defSpot.invmaskd); + // Set hidden GUI widgets in Normal mode to default spot values + fftwbl->set_active(defSpot.fftwbl); + strumaskbl->setValue(defSpot.strumaskbl); + toolbl->set_active(defSpot.toolbl); + decayd->setValue(defSpot.decayd); + lapmaskbl->setValue(defSpot.lapmaskbl); + shadmaskbl->setValue((double)defSpot.shadmaskbl); + shadmaskblsha->setValue((double)defSpot.shadmaskblsha); + LLmaskblshapewav->setCurve(defSpot.LLmaskblcurvewav); + csThresholdblur->setValue(defSpot.csthresholdblur); + lnoiselow->setValue(defSpot.lnoiselow); + nlrad->setValue(defSpot.nlrad); + noisegam->setValue(defSpot.noisegam); + + // Enable all listeners + enableListener(); +} + +void LocallabBlur::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + invmask->set_active(defSpot.invmask); + invmaskd->set_active(defSpot.invmaskd); + scalegr->setValue(defSpot.scalegr); + // Set hidden specific GUI widgets in Simple mode to default spot values + showmaskblMethod->set_active(0); + + if (defSpot.showmaskblMethodtyp == "blur") { + showmaskblMethodtyp ->set_active(0); + } else if (defSpot.showmaskblMethodtyp == "nois") { + showmaskblMethodtyp->set_active(1); + } else if (defSpot.showmaskblMethodtyp == "all") { + showmaskblMethodtyp->set_active(2); + } + lnoiselow->setValue(defSpot.lnoiselow); + enablMask->set_active(defSpot.enablMask); + // CCmaskblshape->setCurve(defSpot.CCmaskblcurve); + // LLmaskblshape->setCurve(defSpot.LLmaskblcurve); + // HHmaskblshape->setCurve(defSpot.HHmaskblcurve); + // blendmaskbl->setValue((double)defSpot.blendmaskbl); + // radmaskbl->setValue(defSpot.radmaskbl); + // chromaskbl->setValue(defSpot.chromaskbl); + // gammaskbl->setValue(defSpot.gammaskbl); + // slomaskbl->setValue(defSpot.slomaskbl); + // Lmaskblshape->setCurve(defSpot.Lmasklccurve); + levelthr->setValue(defSpot.levelthr); + lnoiselow->setValue(defSpot.lnoiselow); + levelthrlow->setValue(defSpot.levelthrlow); + usemask->set_active(defSpot.usemask); + invmaskd->set_active(defSpot.invmaskd); + invmask->set_active(defSpot.invmask); + recothresd->setValue(defSpot.recothresd); + lowthresd->setValue(defSpot.lowthresd); + midthresd->setValue(defSpot.midthresd); + midthresdch->setValue(defSpot.midthresdch); + higthresd->setValue(defSpot.higthresd); + decayd->setValue(defSpot.decayd); + recothres->setValue(defSpot.recothres); + lowthres->setValue(defSpot.lowthres); + higthres->setValue(defSpot.higthres); + adjblur->setValue(defSpot.adjblur); + noisechrodetail->setValue(defSpot.noisechrodetail); + nlpat->setValue(defSpot.nlpat); + nlrad->setValue(defSpot.nlrad); + nlgam->setValue(defSpot.nlgam); + noisegam->setValue(defSpot.noisegam); + + // Enable all listeners + enableListener(); +} + +void LocallabBlur::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + fftwbl->hide(); + expmaskbl->hide(); + expdenoise1->hide(); + expdenoise2->hide(); + expdenoise3->hide(); + maskusable->hide(); + maskunusable->hide(); + maskusable2->hide(); + maskunusable2->hide(); + maskusable3->hide(); + maskunusable3->hide(); + decayd->hide(); + invmask->hide(); + invmaskd->hide(); + adjblur->hide(); + noisechrodetail->hide(); + usemask->hide(); + nlpat->hide(); + nlrad->hide(); + nlgam->hide(); + scalegr->hide(); + noisegam->hide(); + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + fftwbl->hide(); + strumaskbl->hide(); + toolbl->hide(); + lapmaskbl->hide(); + shadmaskbl->hide(); + shadmaskblsha->hide(); + mask2blCurveEditorGwav->hide(); + csThresholdblur->hide(); + toolblFrame2->hide(); + // Specific Simple mode widgets are shown in Normal mode + expmaskbl->show(); + expdenoise1->hide(); + expdenoise2->hide(); + expdenoise3->show(); + adjblur->show(); + noisechrodetail->show(); + usemask->show(); + nlpat->show(); + nlrad->hide(); + nlgam->show(); + scalegr->show(); + noisegam->hide(); + + if (blMethod->get_active_row_number() == 2) { + expdenoise2->show(); + } + + decayd->hide(); + invmask->hide(); + invmaskd->hide(); + if(lnoiselow->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + if(recothres->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 1) { + showmaskblMethodtyp->set_active(2); + } + } + if(recothresd->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + + if (enablMask->get_active()) { + maskusable->show(); + maskunusable->hide(); + maskusable2->show(); + maskunusable2->hide(); + maskusable3->show(); + maskunusable3->hide(); + + } else { + maskusable->hide(); + maskunusable->show(); + maskusable2->hide(); + maskunusable2->show(); + maskusable3->hide(); + maskunusable3->show(); + } + + break; + + case Expert: + + // Show widgets hidden in Normal and Simple mode + if (blMethod->get_active_row_number() == 0) { // Keep widget hidden when blMethod is > 0 + fftwbl->show(); + expdenoise2->hide(); + } + if (blMethod->get_active_row_number() == 1) { + expdenoise2->hide(); + } + if (blMethod->get_active_row_number() == 2) { + expdenoise2->show(); + } + + expdenoise1->show(); + expdenoise3->show(); + decayd->show(); + invmask->show(); + invmaskd->show(); + adjblur->show(); + noisechrodetail->show(); + usemask->show(); + scalegr->show(); + + expmaskbl->show(); + strumaskbl->show(); + toolbl->show(); + lapmaskbl->show(); + shadmaskbl->show(); + shadmaskblsha->show(); + mask2blCurveEditorGwav->show(); + csThresholdblur->show(); + toolblFrame2->show(); + nlpat->show(); + nlrad->show(); + nlgam->show(); + noisegam->show(); + + if(lnoiselow->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + if(recothres->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 1) { + showmaskblMethodtyp->set_active(2); + } + } + if(recothresd->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + + if (enablMask->get_active()) { + maskusable->show(); + maskunusable->hide(); + maskusable2->show(); + maskunusable2->hide(); + maskusable3->show(); + maskunusable3->hide(); + } else { + maskusable->hide(); + maskunusable->show(); + maskusable2->hide(); + maskunusable2->show(); + maskusable3->show(); + maskunusable3->hide(); + } + + } +} + +void LocallabBlur::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskblshape->updateLocallabBackground(normChromar); + LLmaskblshape->updateLocallabBackground(normLumar); + HHmaskblshape->updateLocallabBackground(normHuer); + Lmaskblshape->updateLocallabBackground(normLumar); + wavhue->updateLocallabBackground(normHuer); + return false; + } + ); +} + +void LocallabBlur::blMethodChanged() +{ + // Update Blur & Noise GUI according to blMethod combobox state + updateBlurGUI(); + const LocallabParams::LocallabSpot defSpot; + + if (invbl->get_active() && blMethod->get_active_row_number() == 2) { + radius->setValue(defSpot.radius); + medMethod->set_active(0); + } else if(invbl->get_active() && blMethod->get_active_row_number() == 0) { + guidbl->setValue(defSpot.guidbl); + medMethod->set_active(0); + } else if(invbl->get_active() && blMethod->get_active_row_number() == 1) { + radius->setValue(defSpot.radius); + guidbl->setValue(defSpot.guidbl); + } + + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabblMethod, + blMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabBlur::fftwblChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (fftwbl->get_active()) { + listener->panelChanged(Evlocallabfftwbl, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabfftwbl, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::usemaskChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (usemask->get_active()) { + listener->panelChanged(Evlocallabusemask1, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabusemask1, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::invmaskdChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (invmaskd->get_active()) { + listener->panelChanged(Evlocallabinvmaskd, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinvmaskd, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::invmaskChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (invmask->get_active()) { + listener->panelChanged(Evlocallabinvmask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinvmask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + + +void LocallabBlur::invblChanged() +{ + const LocallabParams::LocallabSpot defSpot; + + if (invbl->get_active() && blMethod->get_active_row_number() == 2) { + radius->setValue(defSpot.radius); + medMethod->set_active(0); + } else if(invbl->get_active() && blMethod->get_active_row_number() == 0) { + guidbl->setValue(defSpot.guidbl); + medMethod->set_active(0); + } else if(invbl->get_active() && blMethod->get_active_row_number() == 1) { + radius->setValue(defSpot.radius); + guidbl->setValue(defSpot.guidbl); + } + + + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (invbl->get_active()) { + listener->panelChanged(Evlocallabinvbl, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinvbl, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::medMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabmedMethod, + medMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabBlur::blurMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabblurMethod, + blurMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabBlur::chroMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabchroMethod, + chroMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabBlur::quamethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabquaMethod, + quamethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void LocallabBlur::activlumChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (activlum->get_active()) { + listener->panelChanged(Evlocallabactivlum, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabactivlum, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::showmaskblMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } +} + +void LocallabBlur::showmaskblMethodtypChanged() +{ + if(lnoiselow->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + if(recothres->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 1) { + showmaskblMethodtyp->set_active(2); + } + } + if(recothresd->getValue()!= 1.) { + if (showmaskblMethodtyp->get_active_row_number() == 0) { + showmaskblMethodtyp->set_active(2); + } + } + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if (listener) { + listener->panelChanged(EvlocallabshowmasktypMethod, + showmaskblMethodtyp->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } +} + +void LocallabBlur::enablMaskChanged() +{ + if (enablMask->get_active()) { + maskusable->show(); + maskunusable->hide(); + maskusable2->show(); + maskunusable2->hide(); + maskusable3->show(); + maskunusable3->hide(); + } else { + maskusable->hide(); + maskunusable->show(); + maskusable2->hide(); + maskunusable2->show(); + maskusable3->hide(); + maskunusable3->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enablMask->get_active()) { + listener->panelChanged(EvLocallabEnablMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnablMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::toolblChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (toolbl->get_active()) { + listener->panelChanged(Evlocallabtoolbl, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabtoolbl, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabBlur::updateBlurGUI() +{ + const LocallabParams::LocallabSpot defSpot; + + if (invbl->get_active() && blMethod->get_active_row_number() == 2) { + radius->setValue(defSpot.radius); + medMethod->set_active(0); + } else if(invbl->get_active() && blMethod->get_active_row_number() == 0) { + guidbl->setValue(defSpot.guidbl); + medMethod->set_active(0); + } else if(invbl->get_active() && blMethod->get_active_row_number() == 1) { + radius->setValue(defSpot.radius); + guidbl->setValue(defSpot.guidbl); + } + + + const int mode = complexity->get_active_row_number(); + + if (blMethod->get_active_row_number() == 0) { + if (mode == Expert) { // Keep widget hidden in Normal and Simple mode + fftwbl->show(); + } + expdenoise2->hide(); + radius->show(); + strength->show(); + grainFrame->show(); + medMethod->hide(); + itera->hide(); + guidbl->hide(); + strbl->hide(); + recothres->hide(); + lowthres->hide(); + higthres->hide(); + epsbl->hide(); + activlum->show(); + } else if (blMethod->get_active_row_number() == 1) { + fftwbl->hide(); + radius->hide(); + strength->hide(); + grainFrame->hide(); + medMethod->show(); + itera->show(); + guidbl->hide(); + strbl->hide(); + expdenoise2->hide(); + recothres->hide(); + lowthres->hide(); + higthres->hide(); + epsbl->hide(); + activlum->show(); + } else if (blMethod->get_active_row_number() == 2) { + fftwbl->hide(); + radius->hide(); + strength->hide(); + grainFrame->hide(); + medMethod->hide(); + itera->hide(); + guidbl->show(); + strbl->show(); + expdenoise2->hide(); + if (mode == Expert || mode == Normal){ + expdenoise2->show(); + recothres->show(); + lowthres->show(); + higthres->show(); + } + epsbl->show(); + activlum->hide(); + } +} diff --git a/rtgui/locallabtools.h b/rtgui/locallabtools.h new file mode 100644 index 000000000..1664d1839 --- /dev/null +++ b/rtgui/locallabtools.h @@ -0,0 +1,1744 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2010 Gabor Horvath frame + * + * + * 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 . + * 2019-2020 Pierre Cabrera + */ +#ifndef _LOCALLABTOOLS_H_ +#define _LOCALLABTOOLS_H_ + +#include "curveeditorgroup.h" +#include "curveeditor.h" +#include "labgrid.h" +#include "thresholdadjuster.h" +#include "toolpanel.h" +#include "adjuster.h" + +/* ==== LocallabToolListener ==== */ +class LocallabTool; +class LocallabToolListener +{ +public: + LocallabToolListener() {}; + virtual ~LocallabToolListener() {}; + + virtual void resetOtherMaskView(LocallabTool* current) = 0; + virtual void toolRemoved(LocallabTool* current) = 0; +}; + + +/* ==== LocallabTool ==== */ +class LocallabTool: + public ToolPanel, + public CurveListener, + public ColorProvider, + public AdjusterListener +{ +protected: + // LocallabTool mode enumeration + enum modeType { + Expert = 0, + Normal = 1, + Simple = 2 + }; + + // LocallabTool parameters + bool needMode; + bool isLocActivated; + const Glib::ustring *spotNameSource; + LocallabToolListener* locToolListener; + + // LocallabTool generic widgets + MyExpander* exp; + MyComboBoxText* const complexity; + + sigc::connection enaExpConn, complexityConn; + + IdleRegister idle_register; + + Glib::ustring getSpotName() const; + +public: + // Locallab tool constructor/destructor + LocallabTool(Gtk::Box* content, Glib::ustring toolName, Glib::ustring UILabel, bool need11 = false, bool needMode = true); + virtual ~LocallabTool(); + + // Getter for Locallab tool expander + MyExpander* getExpander() override + { + return exp; + } + + // Getter/setter for Locallab tool expanded status + void setExpanded(bool expanded) override + { + exp->set_expanded(expanded); + } + + bool getExpanded() override + { + return exp->get_expanded(); + } + + // Setter for Locallab activation indicator + void isLocallabActivated(bool cond) + { + isLocActivated = cond; + } + + // Setter for spot name source + void setSpotNameSource(const Glib::ustring *source) + { + spotNameSource = source; + } + + // Setter for Locallab tool listener + void setLocallabToolListener(LocallabToolListener* ltl) + { + locToolListener = ltl; + } + + // Management functions to add/remove Locallab tool + void addLocallabTool(bool raiseEvent); + void removeLocallabTool(bool raiseEvent); + bool isLocallabToolAdded(); + + // Mask background management function + void refChanged(const double huer, const double lumar, const double chromar, const float fab); + + // Mask preview functions + virtual bool isMaskViewActive() + { + return false; + }; + virtual void resetMaskView() {}; + virtual void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) {}; + + // Advice tooltips management function + virtual void updateAdviceTooltips(const bool showTooltips) {}; + + /* Notes: + - callerId #1: Mask CC shape (bottom bar) + Color CC/LC shape (left bar) + - callerId #2: Mask HH shape (main curve and bottom bar) + - callerId #3: Color LH/HH shape (main curve) + - callerId #4: Color CC/LC shape (bottom bar) + */ + void colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; + + // To be implemented + virtual void setDefaultExpanderVisibility() {}; + virtual void disableListener(); + virtual void enableListener(); + 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 adjusterChanged(Adjuster* a, double newval) override {}; + void curveChanged(CurveEditor* ce) override {}; + +protected: + // To be implemented + virtual void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) {}; // Only necessary when using mask + +private: + // Remove button event function + bool on_remove_change(GdkEventButton* event); + + // Tool expander event function + void foldThemAll(GdkEventButton* event); + + // Complexity mode event function + void complexityModeChanged(); + + // To be implemented + virtual void enabledChanged() {}; + virtual void convertParamToNormal() {}; // From Expert mode to Normal mode; Only necessary when using mode + virtual void convertParamToSimple() {}; // From Normal mode to Simple mode; Only necessary when using mode + virtual void updateGUIToMode(const modeType new_type) {}; // Only necessary when using mode +}; + +/* ==== LocallabColor ==== */ +class LocallabColor: + public Gtk::Box, + public LocallabTool, + public ThresholdAdjusterListener +{ +private: + // Color & Light specific widgets + Gtk::Frame* const lumFrame; + Adjuster* const reparcol; + Adjuster* const gamc; + Adjuster* const lightness; + Adjuster* const contrast; + Adjuster* const chroma; + Gtk::CheckButton* const curvactiv; + Gtk::Frame* const gridFrame; + LabGrid* const labgrid; + MyComboBoxText* const gridMethod; + Adjuster* const strengthgrid; + Adjuster* const sensi; + Adjuster* const structcol; + Adjuster* const blurcolde; + Adjuster* const softradiuscol; + MyExpander* const exprecov; + Gtk::Label* const maskusablec; + Gtk::Label* const maskunusablec; + Adjuster* const recothresc; + Adjuster* const lowthresc; + Adjuster* const higthresc; + Adjuster* const decayc; + Gtk::CheckButton* const invers; + MyExpander* const expgradcol; + Adjuster* const strcol; + Adjuster* const strcolab; + Adjuster* const strcolh; + Adjuster* const angcol; + MyExpander* const expcurvcol; + Gtk::Label* const labqualcurv; + MyComboBoxText* const qualitycurveMethod; + CurveEditorGroup* const llCurveEditorG; + DiagonalCurveEditor* const llshape; + DiagonalCurveEditor* const ccshape; + CurveEditorGroup* const clCurveEditorG; + DiagonalCurveEditor* const clshape; + DiagonalCurveEditor* const lcshape; + CurveEditorGroup* const HCurveEditorG; + FlatCurveEditor* const LHshape; + CurveEditorGroup* const H3CurveEditorG; + FlatCurveEditor* const CHshape; + CurveEditorGroup* const H2CurveEditorG; + FlatCurveEditor* const HHshape; + CurveEditorGroup* const rgbCurveEditorG; + MyComboBoxText* const toneMethod; + DiagonalCurveEditor* const rgbshape; + Gtk::CheckButton* const special; + MyExpander* const expmaskcol1; + MyComboBoxText* const merMethod; + ToolParamBlock* const mask7; + MyComboBoxText* const mergecolMethod; + Adjuster* const mercol; + Adjuster* const opacol; + Adjuster* const conthrcol; + Gtk::Frame* const gridmerFrame; + LabGrid* const labgridmerg; + Adjuster* const merlucol; + MyExpander* const expmaskcol; + Gtk::Frame* const mergecolFrame ; + MyComboBoxText* const showmaskcolMethod; + MyComboBoxText* const showmaskcolMethodinv; + Gtk::CheckButton* const enaColorMask; + CurveEditorGroup* const maskCurveEditorG; + FlatCurveEditor* const CCmaskshape; + FlatCurveEditor* const LLmaskshape; + FlatCurveEditor* const HHmaskshape; + Gtk::Frame* const struFrame; + Adjuster* const strumaskcol; + Gtk::CheckButton* const toolcol; + Gtk::Frame* const blurFrame; + Gtk::CheckButton* const fftColorMask; + Adjuster* const contcol; + Adjuster* const blurcol; + Adjuster* const blendmaskcol; + Gtk::Frame* const toolcolFrame; + Gtk::Frame* const toolcolFrame2; + Adjuster* const radmaskcol; + Adjuster* const lapmaskcol; + Adjuster* const chromaskcol; + Adjuster* const gammaskcol; + Adjuster* const slomaskcol; + Adjuster* const shadmaskcol; + CurveEditorGroup* const maskHCurveEditorG; + FlatCurveEditor* const HHhmaskshape; + CurveEditorGroup* const mask2CurveEditorG; + DiagonalCurveEditor* const Lmaskshape; + CurveEditorGroup* const mask2CurveEditorGwav; + FlatCurveEditor* const LLmaskcolshapewav; + ThresholdAdjuster* const csThresholdcol; + + sigc::connection curvactivConn, gridMethodConn, inversConn, qualitycurveMethodConn, toneMethodConn, specialConn, merMethodConn, mergecolMethodConn, showmaskcolMethodConn, showmaskcolMethodConninv, enaColorMaskConn, toolcolConn, fftColorMaskConn; + +public: + LocallabColor(); + ~LocallabColor(); + + void setListener(ToolPanelListener* tpl) override; + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override {}; // Not used +// void adjusterChanged3(ThresholdAdjuster* a, double newBottom, double newTop) override {}; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override {}; // Not used + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void curvactivChanged(); + void gridMethodChanged(); + void inversChanged(); + void qualitycurveMethodChanged(); + void toneMethodChanged(); + void specialChanged(); + void merMethodChanged(); + void mergecolMethodChanged(); + void showmaskcolMethodChanged(); + void showmaskcolMethodChangedinv(); + void enaColorMaskChanged(); + void toolcolChanged(); + void fftColorMaskChanged(); + + void updateColorGUI1(); + void updateColorGUI2(); + void updateColorGUI3(); +}; + +/* ==== LocallabExposure ==== */ +class LocallabExposure: + public Gtk::Box, + public LocallabTool +{ +private: + // Exposure specific widgets + MyComboBoxText* const expMethod; +// Gtk::Frame* const pdeFrame; + MyExpander* const exppde; + Adjuster* const laplacexp; + Adjuster* const reparexp; + Adjuster* const linear; + Adjuster* const balanexp; + Adjuster* const gamm; + Gtk::Label* const labelexpmethod; + MyComboBoxText* const exnoiseMethod; +// Gtk::Frame* const fatFrame; + MyExpander* const expfat; + Adjuster* const fatamount; + Adjuster* const fatdetail; + Gtk::CheckButton* const norm; + Adjuster* const fatlevel; + Adjuster* const fatanchor; + Adjuster* const gamex; + Adjuster* const sensiex; + Adjuster* const structexp; + Adjuster* const blurexpde; + MyExpander* const exptoolexp; + Adjuster* const expcomp; + Adjuster* const black; + Adjuster* const hlcompr; + Adjuster* const hlcomprthresh; + Adjuster* const shadex; + Adjuster* const shcompr; + Adjuster* const expchroma; + CurveEditorGroup* const curveEditorG; + DiagonalCurveEditor* shapeexpos; + MyExpander* const exprecove; + Gtk::Label* const maskusablee; + Gtk::Label* const maskunusablee; + Adjuster* const recothrese; + Adjuster* const lowthrese; + Adjuster* const higthrese; + Adjuster* const decaye; + + MyExpander* const expgradexp; + Adjuster* const strexp; + Adjuster* const angexp; + Adjuster* const softradiusexp; + Gtk::CheckButton* const inversex; + MyExpander* const expmaskexp; + MyComboBoxText* const showmaskexpMethod; + MyComboBoxText* const showmaskexpMethodinv; + Gtk::CheckButton* const enaExpMask; + Gtk::CheckButton* const enaExpMaskaft; + CurveEditorGroup* const maskexpCurveEditorG; + FlatCurveEditor* const CCmaskexpshape; + FlatCurveEditor* const LLmaskexpshape; + FlatCurveEditor* const HHmaskexpshape; + Adjuster* const blendmaskexp; + Adjuster* const radmaskexp; + Adjuster* const lapmaskexp; + Adjuster* const chromaskexp; + Adjuster* const gammaskexp; + Adjuster* const slomaskexp; + Gtk::Frame* const gradFramemask; + Adjuster* const strmaskexp; + Adjuster* const angmaskexp; + CurveEditorGroup* const mask2expCurveEditorG; + DiagonalCurveEditor* const Lmaskexpshape; + + sigc::connection expMethodConn, exnoiseMethodConn, inversexConn, normConn, showmaskexpMethodConn, showmaskexpMethodConninv, enaExpMaskConn, enaExpMaskaftConn; + +public: + LocallabExposure(); + ~LocallabExposure(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void expMethodChanged(); + void exnoiseMethodChanged(); + void inversexChanged(); + void normChanged(); + void showmaskexpMethodChanged(); + void showmaskexpMethodChangedinv(); + void enaExpMaskChanged(); + void enaExpMaskaftChanged(); + + void updateExposureGUI1(); + void updateExposureGUI2(); + void updateExposureGUI3(); +}; + + +/* ==== LocallabjShadow ==== */ +class LocallabShadow: + public Gtk::Box, + public LocallabTool +{ +private: + // Shadow highlight specific widgets + MyComboBoxText* const shMethod; + Adjuster* const reparsh; + const std::array multipliersh; + Adjuster* const detailSH; + Adjuster* const tePivot; + Adjuster* const highlights; + Adjuster* const h_tonalwidth; + Adjuster* const shadows; + Adjuster* const s_tonalwidth; + Adjuster* const sh_radius; + Adjuster* const sensihs; + Adjuster* const blurSHde; + MyExpander* const exprecovs; + Gtk::Label* const maskusables; + Gtk::Label* const maskunusables; + Adjuster* const recothress; + Adjuster* const lowthress; + Adjuster* const higthress; + Adjuster* const decays; + Gtk::Frame* const gamFrame; + Adjuster* const gamSH; + Adjuster* const sloSH; + MyExpander* const expgradsh; + Adjuster* const strSH; + Adjuster* const angSH; + Gtk::CheckButton* const inverssh; + MyExpander* const expmasksh; + MyComboBoxText* const showmaskSHMethod; + MyComboBoxText* const showmaskSHMethodinv; + Gtk::CheckButton* const enaSHMask; + CurveEditorGroup* const maskSHCurveEditorG; + FlatCurveEditor* const CCmaskSHshape; + FlatCurveEditor* const LLmaskSHshape; + FlatCurveEditor* const HHmaskSHshape; + Adjuster* const blendmaskSH; + Adjuster* const radmaskSH; + Adjuster* const lapmaskSH; + Adjuster* const chromaskSH; + Adjuster* const gammaskSH; + Adjuster* const slomaskSH; + CurveEditorGroup* const mask2SHCurveEditorG; + DiagonalCurveEditor* const LmaskSHshape; + Gtk::Frame* const fatSHFrame; + Adjuster* const fatamountSH; + Adjuster* const fatanchorSH; + + rtengine::ProcEvent EvlocallabTePivot; + + sigc::connection shMethodConn, inversshConn, showmaskSHMethodConn, showmaskSHMethodConninv, enaSHMaskConn; + +public: + LocallabShadow(); + ~LocallabShadow(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void shMethodChanged(); + void inversshChanged(); + void showmaskSHMethodChanged(); + void showmaskSHMethodChangedinv(); + void enaSHMaskChanged(); + + void updateShadowGUI1(); + void updateShadowGUI2(); +}; + +/* ==== LocallabVibrance ==== */ +class LocallabVibrance: + public Gtk::Box, + public LocallabTool, + public ThresholdAdjusterListener, + public ThresholdCurveProvider +{ +private: + // Vibrance specific widgets + Adjuster* const saturated; + Adjuster* const pastels; + Adjuster* const vibgam; + Adjuster* const warm; + ThresholdAdjuster* const psThreshold; + Gtk::CheckButton* const protectSkins; + Gtk::CheckButton* const avoidColorShift; + Gtk::CheckButton* const pastSatTog; + Adjuster* const sensiv; + CurveEditorGroup* const curveEditorGG; + DiagonalCurveEditor* const skinTonesCurve; + MyExpander* const exprecovv; + Gtk::Label* const maskusablev; + Gtk::Label* const maskunusablev; + Adjuster* const recothresv; + Adjuster* const lowthresv; + Adjuster* const higthresv; + Adjuster* const decayv; + MyExpander* const expgradvib; + Adjuster* const strvib; + Adjuster* const strvibab; + Adjuster* const strvibh; + Adjuster* const angvib; + MyExpander* const expmaskvib; + MyComboBoxText* const showmaskvibMethod; + Gtk::CheckButton* const enavibMask; + CurveEditorGroup* const maskvibCurveEditorG; + FlatCurveEditor* const CCmaskvibshape; + FlatCurveEditor* const LLmaskvibshape; + FlatCurveEditor* const HHmaskvibshape; + Adjuster* const blendmaskvib; + Adjuster* const radmaskvib; + Adjuster* const lapmaskvib; + Adjuster* const chromaskvib; + Adjuster* const gammaskvib; + Adjuster* const slomaskvib; + CurveEditorGroup* const mask2vibCurveEditorG; + DiagonalCurveEditor* const Lmaskvibshape; + + sigc::connection pskinsConn, ashiftConn, pastsattogConn, showmaskvibMethodConn, enavibMaskConn; + +public: + LocallabVibrance(); + ~LocallabVibrance(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override {}; // Not used +// void adjusterChanged3(ThresholdAdjuster* a, double newBottom, double newTop) override {}; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override {}; // Not used + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override {}; // Not used + std::vector getCurvePoints(ThresholdSelector* tAdjuster) const override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void protectskins_toggled(); + void avoidcolorshift_toggled(); + void pastsattog_toggled(); + void showmaskvibMethodChanged(); + void enavibMaskChanged(); + + void updateVibranceGUI(); +}; + +/* ==== LocallabSoft ==== */ +class LocallabSoft: + public Gtk::Box, + public LocallabTool +{ +private: + // Soft light specific widgets + MyComboBoxText* const softMethod; + Gtk::Box* const ctboxsoftmethod; + MyComboBoxText* const showmasksoftMethod; + Adjuster* const streng; + Adjuster* const laplace; + Adjuster* const sensisf; + + sigc::connection softMethodConn, showmasksoftMethodConn; + +public: + LocallabSoft(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + +private: + void complexityModeChanged(); + + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void softMethodChanged(); + void showmasksoftMethodChanged(); + + void updateSoftGUI(); +}; + +/* ==== LocallabBlur ==== */ +class LocallabBlur: + public Gtk::Box, + public LocallabTool, + public ThresholdAdjusterListener +// public ThresholdCurveProvider + +{ +private: + // Blur & Noise specific widgets + MyExpander* const expblnoise; + MyComboBoxText* const blMethod; + Gtk::CheckButton* const fftwbl; + Adjuster* const radius; + Adjuster* const strength; + Gtk::Frame* const grainFrame; + Gtk::Frame* const grainFrame2; + Adjuster* const isogr; + Adjuster* const strengr; + Adjuster* const scalegr; + Adjuster* const divgr; + MyComboBoxText* const medMethod; + Adjuster* const itera; + Adjuster* const guidbl; + Adjuster* const strbl; + Adjuster* const epsbl; + MyExpander* const expdenoise2; + Adjuster* const recothres; + Adjuster* const lowthres; + Adjuster* const higthres; + Adjuster* const sensibn; + MyComboBoxText* const blurMethod; + Gtk::CheckButton* const invbl; + MyComboBoxText* const chroMethod; + Gtk::CheckButton* const activlum; + MyExpander* const expdenoise; + MyComboBoxText* const quamethod; + MyExpander* const expdenoisenl; + MyExpander* const expdenoiselum; + MyExpander* const expdenoisech; + CurveEditorGroup* const LocalcurveEditorwavden; + FlatCurveEditor* const wavshapeden; + Gtk::Label* const lCLabels; + Gtk::Label* const lumLabels; + Gtk::Label* const lum46Labels; + Gtk::Label* const chroLabels; + Gtk::Label* const chro46Labels; + + MyExpander* const expdenoise1; + Gtk::Label* const maskusable; + Gtk::Label* const maskunusable; + Gtk::Label* const maskusable2; + Gtk::Label* const maskunusable2; + Gtk::Label* const maskusable3; + Gtk::Label* const maskunusable3; + + Gtk::CheckButton* const usemask; + Adjuster* const lnoiselow; + Adjuster* const levelthr; + Adjuster* const levelthrlow; + Adjuster* const noiselumf0; + Adjuster* const noiselumf; + Adjuster* const noiselumf2; + Adjuster* const noiselumc; + Adjuster* const noiselumdetail; + Adjuster* const noiselequal; + Adjuster* const noisegam; + CurveEditorGroup* const LocalcurveEditorwavhue; + FlatCurveEditor* wavhue; + Adjuster* const noisechrof; + Adjuster* const noisechroc; + Adjuster* const noisechrodetail; + Gtk::Frame* const detailFrame; + Adjuster* const detailthr; + Adjuster* const adjblur; + MyExpander* const expdenoise3; + Adjuster* const recothresd; + Adjuster* const lowthresd; + Adjuster* const midthresd; + Adjuster* const midthresdch; + Adjuster* const higthresd; + Adjuster* const decayd; + + Gtk::CheckButton* const invmaskd; + Gtk::CheckButton* const invmask; + Gtk::Frame* const prevFrame; + Adjuster* const nlstr; + Adjuster* const nldet; + Adjuster* const nlpat; + Adjuster* const nlrad; + Adjuster* const nlgam; + Adjuster* const bilateral; + Adjuster* const sensiden; + Adjuster* const reparden; + Gtk::Button* neutral; + MyExpander* const expmaskbl; + MyComboBoxText* const showmaskblMethod; + MyComboBoxText* const showmaskblMethodtyp; + Gtk::CheckButton* const enablMask; + CurveEditorGroup* const maskblCurveEditorG; + FlatCurveEditor* const CCmaskblshape; + FlatCurveEditor* const LLmaskblshape; + FlatCurveEditor* const HHmaskblshape; + Adjuster* const strumaskbl; + Gtk::CheckButton* const toolbl; + Gtk::Frame* const toolblFrame; + Gtk::Frame* const toolblFrame2; + Adjuster* const blendmaskbl; + Adjuster* const radmaskbl; + Adjuster* const lapmaskbl; + Adjuster* const chromaskbl; + Adjuster* const gammaskbl; + Adjuster* const slomaskbl; + Adjuster* const shadmaskbl; + Adjuster* const shadmaskblsha; + CurveEditorGroup* const mask2blCurveEditorG; + DiagonalCurveEditor* const Lmaskblshape; + CurveEditorGroup* const mask2blCurveEditorGwav; + FlatCurveEditor* const LLmaskblshapewav; + Gtk::Box* const quaHBox; + ThresholdAdjuster* const csThresholdblur; + + sigc::connection blMethodConn, fftwblConn, invblConn, medMethodConn, blurMethodConn, chroMethodConn, activlumConn, showmaskblMethodConn, showmaskblMethodtypConn, enablMaskConn, toolblConn; + sigc::connection quamethodconn, usemaskConn, invmaskdConn, invmaskConn, neutralconn; +public: + LocallabBlur(); + ~LocallabBlur(); + void updatedenlc(const double highres, const double nres, const double highres46, const double nres46, const double Lhighres, const double Lnres, const double Lhighres46, const double Lnres46); + + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + void neutral_pressed(); + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override {}; // Not used +// void adjusterChanged3(ThresholdAdjuster* a, double newBotto, double newTo) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override {}; // Not used + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void blMethodChanged(); + void fftwblChanged(); + void usemaskChanged(); + void invmaskdChanged(); + void invmaskChanged(); + void invblChanged(); + void medMethodChanged(); + void blurMethodChanged(); + void chroMethodChanged(); + void activlumChanged(); + void showmaskblMethodChanged(); + void showmaskblMethodtypChanged(); + void enablMaskChanged(); + void toolblChanged(); + void quamethodChanged(); + + void updateBlurGUI(); +}; + +/* ==== LocallabTone ==== */ +class LocallabTone: + public Gtk::Box, + public LocallabTool +{ +private: + // Tone Mapping specific widgets + Adjuster* const repartm; + Adjuster* const amount; + Adjuster* const stren; + Gtk::CheckButton* const equiltm; + Adjuster* const gamma; + Adjuster* const satur; + Adjuster* const estop; + Adjuster* const scaltm; + Adjuster* const rewei; + Adjuster* const softradiustm; + Adjuster* const sensitm; + MyExpander* const exprecovt; + Gtk::Label* const maskusablet; + Gtk::Label* const maskunusablet; + Adjuster* const recothrest; + Adjuster* const lowthrest; + Adjuster* const higthrest; + Adjuster* const decayt; + MyExpander* const expmasktm; + MyComboBoxText* const showmasktmMethod; + Gtk::CheckButton* const enatmMask; + Gtk::CheckButton* const enatmMaskaft; + CurveEditorGroup* const masktmCurveEditorG; + FlatCurveEditor* const CCmasktmshape; + FlatCurveEditor* const LLmasktmshape; + FlatCurveEditor* const HHmasktmshape; + Adjuster* const blendmasktm; + Adjuster* const lapmasktm; + Adjuster* const radmasktm; + Adjuster* const chromasktm; + Adjuster* const gammasktm; + Adjuster* const slomasktm; + CurveEditorGroup* const mask2tmCurveEditorG; + DiagonalCurveEditor* const Lmasktmshape; + + sigc::connection equiltmConn, showmasktmMethodConn, enatmMaskConn, enatmMaskaftConn; + +public: + LocallabTone(); + ~LocallabTone(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void equiltmChanged(); + void showmasktmMethodChanged(); + void enatmMaskChanged(); + void enatmMaskaftChanged(); +}; + +/* ==== LocallabRetinex ==== */ +class LocallabRetinex: + public Gtk::Box, + public LocallabTool +{ +private: + // Retinex specific widgets + Gtk::Frame* const dehaFrame; + Adjuster* const dehaz; + Adjuster* const depth; + Adjuster* const dehazeSaturation; + Gtk::Frame* const retiFrame; + Adjuster* const str; + Gtk::CheckButton* const loglin; + Adjuster* const sensih; + Gtk::Frame* const retitoolFrame; + MyComboBoxText* const retinexMethod; + Gtk::CheckButton* const fftwreti; + Gtk::CheckButton* const equilret; + Adjuster* const neigh; + Adjuster* const vart; + Adjuster* const scalereti; + Adjuster* const limd; + Adjuster* const offs; + MyExpander* const expretitools; + Adjuster* const chrrt; + Adjuster* const darkness; + Adjuster* const lightnessreti; + Adjuster* const cliptm; + Adjuster* const softradiusret; + CurveEditorGroup* const LocalcurveEditortransT; + FlatCurveEditor* const cTtransshape; + Gtk::Label* const mMLabels; + Gtk::Label* const transLabels; + Gtk::Label* const transLabels2; + CurveEditorGroup* const LocalcurveEditorgainT; + FlatCurveEditor* const cTgainshape; + MyExpander* const exprecovr; + Gtk::Label* const maskusabler; + Gtk::Label* const maskunusabler; + Adjuster* const recothresr; + Adjuster* const lowthresr; + Adjuster* const higthresr; + Adjuster* const decayr; + MyExpander* const expmaskreti; + MyComboBoxText* const showmaskretiMethod; + Gtk::CheckButton* const enaretiMask; + Gtk::CheckButton* const enaretiMasktmap; + CurveEditorGroup* const maskretiCurveEditorG; + FlatCurveEditor* const CCmaskretishape; + FlatCurveEditor* const LLmaskretishape; + FlatCurveEditor* const HHmaskretishape; + Adjuster* const blendmaskreti; + Adjuster* const radmaskreti; + Adjuster* const lapmaskreti; + Adjuster* const chromaskreti; + Adjuster* const gammaskreti; + Adjuster* const slomaskreti; + CurveEditorGroup* const mask2retiCurveEditorG; + DiagonalCurveEditor* const Lmaskretishape; + Gtk::CheckButton* const inversret; + + sigc::connection loglinConn, retinexMethodConn, fftwretiConn, equilretConn, showmaskretiMethodConn, enaretiMaskConn, enaretiMasktmapConn, inversretConn; + +public: + LocallabRetinex(); + ~LocallabRetinex(); + + void updateMinMax(const double cdma, const double cdmin, const double mini, const double maxi, const double Tmean, const double Tsigma, const double Tmin, const double Tmax); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void loglinChanged(); + void retinexMethodChanged(); + void fftwretiChanged(); + void equilretChanged(); + void showmaskretiMethodChanged(); + void enaretiMaskChanged(); + void enaretiMasktmapChanged(); + void inversretChanged(); + + void updateRetinexGUI1(); + void updateRetinexGUI2(); + void updateRetinexGUI3(); +}; + +/* ==== LocallabSharp ==== */ +class LocallabSharp: + public Gtk::Box, + public LocallabTool +{ +private: + Adjuster* const sharcontrast; + Adjuster* const sharblur; + Adjuster* const shargam; + Adjuster* const sharamount; + Adjuster* const shardamping; + Adjuster* const shariter; + Adjuster* const sharradius; + Adjuster* const sensisha; + Gtk::CheckButton* const inverssha; + Gtk::Frame* const sharFrame; + MyComboBoxText* const showmasksharMethod; + + sigc::connection inversshaConn, showmasksharMethodConn; + +public: + LocallabSharp(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void inversshaChanged(); + void showmasksharMethodChanged(); +}; + +/* ==== LocallabContrast ==== */ +class LocallabContrast: + public Gtk::Box, + public LocallabTool, + public ThresholdAdjusterListener + +{ +private: + MyComboBoxText* const localcontMethod; + Adjuster* const lcradius; + Adjuster* const lcamount; + Adjuster* const lcdarkness; + Adjuster* const lclightness; + Gtk::Frame* const contFrame; + Adjuster* const sigmalc; + CurveEditorGroup* const LocalcurveEditorwav; + FlatCurveEditor* const wavshape; + ThresholdAdjuster* const csThreshold; + Adjuster* const levelwav; + MyExpander* const expresidpyr; + Adjuster* const residcont; + Adjuster* const residchro; + Adjuster* const residsha; + Adjuster* const residshathr; + Adjuster* const residhi; + Adjuster* const residhithr; + Adjuster* const gamlc; + Adjuster* const residgam; + Adjuster* const residslop; + Adjuster* const sensilc; + Adjuster* const reparw; + Gtk::Frame* const clariFrame; + Adjuster* const clarilres; + Adjuster* const claricres; + Adjuster* const clarisoft; + Gtk::CheckButton* const origlc; + MyExpander* const expcontrastpyr; + Gtk::CheckButton* const wavgradl; + Adjuster* const sigmalc2; + Adjuster* const strwav; + Adjuster* const angwav; + Gtk::CheckButton* const wavedg; + Adjuster* const strengthw; + Adjuster* const sigmaed; + CurveEditorGroup* const LocalcurveEditorwavedg; + FlatCurveEditor* const wavshapeedg; + Adjuster* const gradw; + Gtk::CheckButton* const waveshow; + ToolParamBlock* const edgsBoxshow; + Adjuster* const radiusw; + Adjuster* const detailw; + MyComboBoxText* const localedgMethod; + Adjuster* const tloww; + Adjuster* const thigw; + Adjuster* const edgw; + Adjuster* const basew; + MyComboBoxText* const localneiMethod; + Gtk::CheckButton* const wavblur; + Adjuster* const levelblur; + Adjuster* const sigmabl; + Adjuster* const chromablu; + CurveEditorGroup* const LocalcurveEditorwavlev; + FlatCurveEditor* const wavshapelev; + Adjuster* const residblur; + Gtk::CheckButton* const blurlc; + MyExpander* const expcontrastpyr2; + Gtk::CheckButton* const wavcont; + Adjuster* const sigma; + Adjuster* const offset; + Adjuster* const chromalev; + CurveEditorGroup* const LocalcurveEditorwavcon; + FlatCurveEditor* const wavshapecon; + Gtk::CheckButton* const wavcompre; + CurveEditorGroup* const LocalcurveEditorwavcompre; + FlatCurveEditor* const wavshapecompre; + Adjuster* const sigmadr; + Adjuster* const threswav; + Adjuster* const residcomp; + Gtk::CheckButton* const wavcomp; + Adjuster* const sigmadc; + Adjuster* const deltad; + CurveEditorGroup* const LocalcurveEditorwavcomp; + FlatCurveEditor* const wavshapecomp; + //Adjuster* const fatres; + Gtk::CheckButton* const fftwlc; + MyExpander* const exprecovw; + Gtk::Label* const maskusablew; + Gtk::Label* const maskunusablew; + Adjuster* const recothresw; + Adjuster* const lowthresw; + Adjuster* const higthresw; + Adjuster* const decayw; + MyExpander* const expmasklc; + MyComboBoxText* const showmasklcMethod; + Gtk::CheckButton* const enalcMask; + CurveEditorGroup* const masklcCurveEditorG; + FlatCurveEditor* const CCmasklcshape; + FlatCurveEditor* const LLmasklcshape; + FlatCurveEditor* const HHmasklcshape; + Adjuster* const blendmasklc; + Adjuster* const radmasklc; + Adjuster* const chromasklc; + CurveEditorGroup* const mask2lcCurveEditorG; + DiagonalCurveEditor* const Lmasklcshape; + + sigc::connection localcontMethodConn, origlcConn, wavgradlConn, wavedgConn, localedgMethodConn, waveshowConn, localneiMethodConn, wavblurConn, blurlcConn, wavcontConn, wavcompreConn, wavcompConn, fftwlcConn, showmasklcMethodConn, enalcMaskConn; + +public: + LocallabContrast(); + ~LocallabContrast(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override {}; // Not used +// void adjusterChanged3(ThresholdAdjuster* a, double newBottom, double newTop) override {}; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override {}; // Not used + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void localcontMethodChanged(); + void origlcChanged(); + void wavgradlChanged(); + void wavedgChanged(); + void localedgMethodChanged(); + void waveshowChanged(); + void localneiMethodChanged(); + void wavblurChanged(); + void blurlcChanged(); + void wavcontChanged(); + void wavcompreChanged(); + void wavcompChanged(); + void fftwlcChanged(); + void showmasklcMethodChanged(); + void enalcMaskChanged(); + + void updateContrastGUI1(); + void updateContrastGUI2(); + void updateContrastGUI3(); +}; + +/* ==== LocallabCBDL ==== */ +class LocallabCBDL: + public Gtk::Box, + public LocallabTool +{ +private: + Gtk::Frame* const levFrame; + const std::array multiplier; + Adjuster* const chromacbdl; + Adjuster* const threshold; + Adjuster* const clarityml; + Adjuster* const contresid; + Adjuster* const softradiuscb; + Adjuster* const sensicb; + MyExpander* const exprecovcb; + Gtk::Label* const maskusablecb; + Gtk::Label* const maskunusablecb; + Adjuster* const recothrescb; + Adjuster* const lowthrescb; + Adjuster* const higthrescb; + Adjuster* const decaycb; + MyExpander* const expmaskcb; + MyComboBoxText* const showmaskcbMethod; + Gtk::CheckButton* const enacbMask; + CurveEditorGroup* const maskcbCurveEditorG; + FlatCurveEditor* const CCmaskcbshape; + FlatCurveEditor* const LLmaskcbshape; + FlatCurveEditor* const HHmaskcbshape; + Adjuster* const blendmaskcb; + Adjuster* const radmaskcb; + Adjuster* const lapmaskcb; + Adjuster* const chromaskcb; + Adjuster* const gammaskcb; + Adjuster* const slomaskcb; + CurveEditorGroup* const mask2cbCurveEditorG; + DiagonalCurveEditor* const Lmaskcbshape; + + sigc::connection showmaskcbMethodConn, enacbMaskConn; + + Gtk::Button* const lumacontrastMinusButton; + Gtk::Button* const lumaneutralButton; + Gtk::Button* const lumacontrastPlusButton; + + sigc::connection lumacontrastMinusPressedConn, lumaneutralPressedConn, lumacontrastPlusPressedConn; + +public: + LocallabCBDL(); + ~LocallabCBDL(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void setDefaultExpanderVisibility() override; + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void curveChanged(CurveEditor* ce) override; + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void showmaskcbMethodChanged(); + void enacbMaskChanged(); + + void lumacontrastMinusPressed(); + void lumaneutralPressed(); + void lumacontrastPlusPressed(); +}; + +/* ==== LocallabLog ==== */ +class LocallabLog: + public Gtk::Box, + public LocallabTool +{ +private: + Adjuster* const repar; + Gtk::CheckButton* const ciecam; + Gtk::ToggleButton* const autocompute; + Gtk::Frame* const logPFrame; + Adjuster* const blackEv; + Adjuster* const whiteEv; + Gtk::CheckButton* const fullimage; + Gtk::Frame* const logFrame; + Gtk::CheckButton* const Autogray; + Adjuster* const sourceGray; + Adjuster* const sourceabs; + MyComboBoxText* const sursour; + Gtk::Box* const surHBox; + Gtk::Frame* const log1Frame; + Gtk::Frame* const log2Frame; + Adjuster* const targetGray; + Adjuster* const detail; + Adjuster* const catad; + Adjuster* const lightl; + Adjuster* const lightq; + Adjuster* const contl; + Adjuster* const contq; + Adjuster* const contthres; + Adjuster* const colorfl; + Adjuster* const saturl; + Adjuster* const chroml; + MyExpander* const expL; + //CurveEditorGroup* const CurveEditorL; + //DiagonalCurveEditor* const LshapeL; + Adjuster* const targabs; + MyComboBoxText* const surround; + Gtk::Box* const surrHBox; + + Adjuster* const baselog; + MyExpander* const exprecovl; + Gtk::Label* const maskusablel; + Gtk::Label* const maskunusablel; + Adjuster* const recothresl; + Adjuster* const lowthresl; + Adjuster* const higthresl; + Adjuster* const decayl; + + Adjuster* const sensilog; + Gtk::Frame* const gradlogFrame; + Adjuster* const strlog; + Adjuster* const anglog; + MyExpander* const expmaskL; + MyComboBoxText* const showmaskLMethod; + Gtk::CheckButton* const enaLMask; + CurveEditorGroup* const maskCurveEditorL; + FlatCurveEditor* const CCmaskshapeL; + FlatCurveEditor* const LLmaskshapeL; + FlatCurveEditor* const HHmaskshapeL; + Adjuster* const blendmaskL; + Adjuster* const radmaskL; + Adjuster* const chromaskL; + CurveEditorGroup* const mask2CurveEditorL; + DiagonalCurveEditor* const LmaskshapeL; + + sigc::connection autoconn, ciecamconn, fullimageConn, AutograyConn; + sigc::connection surroundconn, sursourconn; + sigc::connection showmaskLMethodConn, enaLMaskConn; +public: + LocallabLog(); + ~LocallabLog(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + void surroundChanged(); + void sursourChanged(); + void setDefaultExpanderVisibility() override; + + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void curveChanged(CurveEditor* ce) override; + + void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1); + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + void complexityModeChanged(); + + void autocomputeToggled(); + void fullimageChanged(); + void AutograyChanged(); + void ciecamChanged(); + void showmaskLMethodChanged(); + void enaLMaskChanged(); + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void updateLogGUI(); + void updateLogGUI2(); +}; + + +/* ==== LocallabMask ==== */ +class LocallabMask: + public Gtk::Box, + public LocallabTool, + public ThresholdAdjusterListener +{ +private: + Adjuster* const sensimask; + Adjuster* const blendmask; + Adjuster* const blendmaskab; + Adjuster* const softradiusmask; + MyComboBoxText* const showmask_Method; + Gtk::CheckButton* const enamask; + CurveEditorGroup* const mask_CurveEditorG; + FlatCurveEditor* const CCmask_shape; + FlatCurveEditor* const LLmask_shape; + FlatCurveEditor* const HHmask_shape; + Gtk::Frame* const struFrame; + Adjuster* const strumaskmask; + Gtk::CheckButton* const toolmask; + Gtk::Frame* const blurFrame; + Gtk::CheckButton* const fftmask; + Adjuster* const contmask; + Adjuster* const blurmask; + Gtk::Frame* const toolmaskFrame; + Adjuster* const radmask; + Adjuster* const lapmask; + Adjuster* const chromask; + Adjuster* const gammask; + Adjuster* const slopmask; + Adjuster* const shadmask; + CurveEditorGroup* const mask_HCurveEditorG; + FlatCurveEditor* const HHhmask_shape; + CurveEditorGroup* const mask2CurveEditorG; + DiagonalCurveEditor* const Lmask_shape; + CurveEditorGroup* const mask2CurveEditorGwav; + FlatCurveEditor* const LLmask_shapewav; + ThresholdAdjuster* const csThresholdmask; + Gtk::Frame* const gradFramemask; + Adjuster* const str_mask; + Adjuster* const ang_mask; + + sigc::connection showmask_MethodConn, enamaskConn, toolmaskConn, fftmaskConn; + +public: + LocallabMask(); + ~LocallabMask(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override {}; // Not used +// void adjusterChanged3(ThresholdAdjuster* a, double newBottom, double newTop) override {}; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override {}; // Not used + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + void curveChanged(CurveEditor* ce) override; + +private: + void complexityModeChanged(); + + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + + void showmask_MethodChanged(); + void enamaskChanged(); + void toolmaskChanged(); + void fftmaskChanged(); + + void updateMaskGUI(); +}; + + +/* ==== Locallabcie ==== */ +class Locallabcie: + public Gtk::Box, + public ThresholdAdjusterListener, + public LocallabTool +{ +private: + Adjuster* const sensicie; + Adjuster* const reparcie; + Gtk::CheckButton* const jabcie; + MyComboBoxText* const modecam; + MyComboBoxText* const modecie; + Gtk::Frame* const jzFrame; + Gtk::Box* const modeHBoxcam; + Gtk::Box* const modeHBoxcie; + Gtk::Frame* const cieFrame; + Gtk::CheckButton* const Autograycie; + Adjuster* const sourceGraycie; + Adjuster* const sourceabscie; + MyComboBoxText* const sursourcie; + Gtk::Box* const surHBoxcie; + Gtk::Frame* const cie1Frame; + Gtk::Frame* const cie1lightFrame; + Gtk::Frame* const cie1contFrame; + Gtk::Frame* const cie1colorFrame; + Gtk::Frame* const czlightFrame; +// Gtk::Frame* const czcontFrame; + Gtk::Frame* const czcolorFrame; + Gtk::Frame* const PQFrame; + Gtk::CheckButton* const qtoj; + Adjuster* const lightlcie; + Adjuster* const lightjzcie; + Adjuster* const contjzcie; + Adjuster* const adapjzcie; + Adjuster* const jz100; + Adjuster* const pqremap; + Adjuster* const pqremapcam16; + Gtk::CheckButton* const forcejz; + MyExpander* const expjz; + Gtk::Frame* const jzshFrame; + Adjuster* const hljzcie; + Adjuster* const hlthjzcie; + Adjuster* const shjzcie; + Adjuster* const shthjzcie; + Adjuster* const radjzcie; + + MyExpander* const expwavjz; + + Gtk::Frame* const contFramejz; + Adjuster* const sigmalcjz; + CurveEditorGroup* const LocalcurveEditorwavjz; + FlatCurveEditor* const wavshapejz; + ThresholdAdjuster* const csThresholdjz; + Gtk::Frame* const clariFramejz; + Adjuster* const clarilresjz; + Adjuster* const claricresjz; + Adjuster* const clarisoftjz; + + MyExpander* const expcam16; + + Adjuster* const lightqcie; + Adjuster* const contlcie; + Adjuster* const contqcie; + Adjuster* const contthrescie; + Gtk::Frame* const logjzFrame; + Gtk::CheckButton* const logjz; + Adjuster* const blackEvjz; + Adjuster* const whiteEvjz; + Adjuster* const targetjz; + Gtk::Frame* const bevwevFrame; + Gtk::CheckButton* const forcebw; + + Gtk::Frame* const sigmoidFrame; + Gtk::CheckButton* const sigq; + Adjuster* const sigmoidldacie; + Adjuster* const sigmoidthcie; + Adjuster* const sigmoidblcie; + Gtk::CheckButton* const sigmoidqjcie; + Gtk::CheckButton* const logcie; + Gtk::Frame* const sigmoidjzFrame; + Gtk::CheckButton* const sigjz; + Adjuster* const sigmoidldajzcie; + Adjuster* const sigmoidthjzcie; + Adjuster* const sigmoidbljzcie; + + Adjuster* const colorflcie; + Adjuster* const saturlcie; + Adjuster* const rstprotectcie; + Adjuster* const chromlcie; + Adjuster* const huecie; + CurveEditorGroup* const cieCurveEditorG; + MyComboBoxText* const toneMethodcie; + DiagonalCurveEditor* const shapecie; + CurveEditorGroup* const cieCurveEditorG2; + MyComboBoxText* const toneMethodcie2; + DiagonalCurveEditor* const shapecie2; + + Adjuster* const chromjzcie; + Adjuster* const saturjzcie; + Adjuster* const huejzcie; + CurveEditorGroup* const jz1CurveEditorG; + DiagonalCurveEditor* const shapejz; + DiagonalCurveEditor* const shapecz; + + + Gtk::Frame* const HFramejz; + Gtk::Frame* const JzHFramejz; + CurveEditorGroup* const jz2CurveEditorG; + CurveEditorGroup* const jz3CurveEditorG; + DiagonalCurveEditor* const shapeczjz; + FlatCurveEditor* const HHshapejz; + FlatCurveEditor* const CHshapejz; + FlatCurveEditor* const LHshapejz; + Adjuster* const softjzcie; + Adjuster* const thrhjzcie; + Gtk::CheckButton* const chjzcie; + Adjuster* const strsoftjzcie; + +/* + Gtk::Frame* const ciezFrame; + Adjuster* const lightlzcam; + Adjuster* const lightqzcam; + Adjuster* const contlzcam; + Adjuster* const contqzcam; + Adjuster* const contthreszcam; + Adjuster* const colorflzcam; + Adjuster* const saturzcam; + Adjuster* const chromzcam; +*/ + MyExpander* const expLcie; + Gtk::Frame* const cie2Frame; + Adjuster* const targetGraycie; + Adjuster* const targabscie; + Adjuster* const detailcie; + Adjuster* const catadcie; + MyComboBoxText* const surroundcie; + Gtk::Box* const surrHBoxcie; + + MyExpander* const exprecovcie; + Gtk::Label* const maskusablecie; + Gtk::Label* const maskunusablecie; + Adjuster* const recothrescie; + Adjuster* const lowthrescie; + Adjuster* const higthrescie; + Adjuster* const decaycie; + + MyExpander* const expmaskcie; + MyComboBoxText* const showmaskcieMethod; + Gtk::CheckButton* const enacieMask; + CurveEditorGroup* const maskcieCurveEditorG; + FlatCurveEditor* const CCmaskcieshape; + FlatCurveEditor* const LLmaskcieshape; + FlatCurveEditor* const HHmaskcieshape; + Adjuster* const blendmaskcie; + Adjuster* const radmaskcie; + Adjuster* const lapmaskcie; + Adjuster* const chromaskcie; + Adjuster* const gammaskcie; + Adjuster* const slomaskcie; + + CurveEditorGroup* const mask2cieCurveEditorG; + DiagonalCurveEditor* const Lmaskcieshape; + + sigc::connection AutograycieConn, forcejzConn, forcebwConn, qtojConn, showmaskcieMethodConn, enacieMaskConn, jabcieConn, sursourcieconn, surroundcieconn, modecieconn, modecamconn, sigmoidqjcieconn, logcieconn, logjzconn, sigjzconn, sigqconn, chjzcieconn, toneMethodcieConn, toneMethodcieConn2; +public: + Locallabcie(); + ~Locallabcie(); + + bool isMaskViewActive() override; + void resetMaskView() override; + void getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) override; + + void updateAdviceTooltips(const bool showTooltips) override; + void setDefaultExpanderVisibility() override; + + void disableListener() override; + void enableListener() 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 adjusterChanged(Adjuster* a, double newval) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override {}; // Not used +// void adjusterChanged3(ThresholdAdjuster* a, double newBottom, double newTop) override {}; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override {}; // Not used + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override {}; // Not used + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + void sursourcieChanged(); + void surroundcieChanged(); + void modecieChanged(); + void modecamChanged(); + void curveChanged(CurveEditor* ce) override; + void toneMethodcieChanged(); + void toneMethodcie2Changed(); + void updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1); + +private: + void enabledChanged() override; + void convertParamToNormal() override; + void convertParamToSimple() override; + void updateGUIToMode(const modeType new_type) override; + void complexityModeChanged(); + void AutograycieChanged(); + void forcejzChanged(); + void forcebwChanged(); + void qtojChanged(); + void jabcieChanged(); + void sigmoidqjcieChanged(); + void logcieChanged(); + void logjzChanged(); + void sigjzChanged(); + void sigqChanged(); + void chjzcieChanged(); + void updatecieGUI(); + void updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) override; + void showmaskcieMethodChanged(); + void enacieMaskChanged(); + +}; + +#endif diff --git a/rtgui/locallabtools2.cc b/rtgui/locallabtools2.cc new file mode 100644 index 000000000..a2c18ee08 --- /dev/null +++ b/rtgui/locallabtools2.cc @@ -0,0 +1,10452 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2010 Gabor Horvath frame + * + * + * 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 . + * 2019-2020 Pierre Cabrera + */ +#include "locallabtools.h" + +#include "options.h" +#include "../rtengine/procparams.h" +#include "locallab.h" +#include "rtimage.h" +#include "../rtengine/color.h" + +#define MINNEIGH 0.1 +#define MAXNEIGH 1500 +#define CENTERNEIGH 200 + +using namespace rtengine; +using namespace procparams; + +extern Options options; + +static double retiSlider2neigh(double sval) +{ + // Slider range: 0 - 5000 + double neigh; + + if (sval <= 200) { + // Linear below center-temp + neigh = MINNEIGH + (sval / 200.0) * (CENTERNEIGH - MINNEIGH); + } else { + const double slope = (double)(CENTERNEIGH - MINNEIGH) / (MAXNEIGH - CENTERNEIGH); + const double x = (sval - 200) / 200; // x range: 0 - 1 + const double y = x * slope + (1.0 - slope) * pow(x, 4.0); + neigh = CENTERNEIGH + y * (MAXNEIGH - CENTERNEIGH); + } + + if (neigh < MINNEIGH) { + neigh = MINNEIGH; + } + + if (neigh > MAXNEIGH) { + neigh = MAXNEIGH; + } + + return neigh; +} + +static double retiNeigh2Slider(double neigh) +{ + double sval; + + if (neigh <= CENTERNEIGH) { + sval = ((neigh - MINNEIGH) / (CENTERNEIGH - MINNEIGH)) * 200.0; + } else { + const double slope = (double)(CENTERNEIGH - MINNEIGH) / (MAXNEIGH - CENTERNEIGH); + const double y = (neigh - CENTERNEIGH) / (MAXNEIGH - CENTERNEIGH); + double x = pow(y, 0.25); // Rough guess of x, will be a little lower + double k = 0.1; + bool add = true; + + // The y=f(x) function is a mess to invert, therefore we have this trial-refinement loop instead. + // From tests, worst case is about 20 iterations, i.e. no problem + for (;;) { + double y1 = x * slope + (1.0 - slope) * pow(x, 4.0); + + if (200 * fabs(y1 - y) < 0.1) { + break; + } + + if (y1 < y) { + if (!add) { + k /= 2; + } + + x += k; + add = true; + } else { + if (add) { + k /= 2; + } + + x -= k; + add = false; + } + } + + sval = 200.0 + x * 200.0; + } + + if (sval < 0.) { + sval = 0.; + } + + if (sval > 1500.) { + sval = 1500.; + } + + return sval; +} + +/* ==== LocallabTone ==== */ +LocallabTone::LocallabTone(): + LocallabTool(this, M("TP_LOCALLAB_TONE_TOOLNAME"), M("TP_LOCALLAB_TM"), true), + + // Tone mapping specific widgets + repartm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + amount(Gtk::manage(new Adjuster(M("TP_LOCALLAB_AMOUNT"), 50., 100.0, 0.5, 95.))), + stren(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STREN"), -0.5, 2.0, 0.01, 0.5))), + equiltm(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EQUIL")))), + gamma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAM"), 0.4, 4.0, 0.11, 1.0))), + satur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATUR"), -100., 100., 0.1, 0.))), // By default satur = 0 ==> use Mantiuk value + estop(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ESTOP"), 0.1, 4., 0.01, 1.4))), + scaltm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALTM"), 0.1, 10.0, 0.01, 1.0))), + rewei(Gtk::manage(new Adjuster(M("TP_LOCALLAB_REWEI"), 0, 3, 1, 0))), + softradiustm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.1, 0.))),//unused here, but used for normalize_mean_dt + sensitm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + exprecovt(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablet(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablet(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothrest(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthrest(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthrest(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decayt(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + expmasktm(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWT")))), + showmasktmMethod(Gtk::manage(new MyComboBoxText())), + enatmMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), + enatmMaskaft(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_AFTER_MASK")))), + // masktmCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + masktmCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmasktmshape(static_cast(masktmCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmasktmshape(static_cast(masktmCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmasktmshape(static_cast(masktmCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + lapmasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + radmasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), + slomasktm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + mask2tmCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmasktmshape(static_cast(mask2tmCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Tone Mapping specific widgets + amount->setAdjusterListener(this); + + repartm->setAdjusterListener(this); + + stren->setAdjusterListener(this); + + equiltmConn = equiltm->signal_toggled().connect(sigc::mem_fun(*this, &LocallabTone::equiltmChanged)); + + gamma->setAdjusterListener(this); + + satur->setAdjusterListener(this); + + estop->setAdjusterListener(this); + + scaltm->setAdjusterListener(this); + + rewei->setAdjusterListener(this); + + softradiustm->setLogScale(10, 0); + softradiustm->setAdjusterListener(this); + + sensitm->setAdjusterListener(this); + + recothrest->setAdjusterListener(this); + lowthrest->setAdjusterListener(this); + higthrest->setAdjusterListener(this); + decayt->setAdjusterListener(this); + setExpandAlignProperties(exprecovt, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + setExpandAlignProperties(expmasktm, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmasktmMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmasktmMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmasktmMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmasktmMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmasktmMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmasktmMethod->set_active(0); + showmasktmMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmasktmMethodConn = showmasktmMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabTone::showmasktmMethodChanged)); + + enatmMaskConn = enatmMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabTone::enatmMaskChanged)); + + enatmMaskaftConn = enatmMaskaft->signal_toggled().connect(sigc::mem_fun(*this, &LocallabTone::enatmMaskaftChanged)); + + masktmCurveEditorG->setCurveListener(this); + + CCmasktmshape->setIdentityValue(0.); + CCmasktmshape->setResetCurve(FlatCurveType(defSpot.CCmasktmcurve.at(0)), defSpot.CCmasktmcurve); + CCmasktmshape->setBottomBarColorProvider(this, 1); + + LLmasktmshape->setIdentityValue(0.); + LLmasktmshape->setResetCurve(FlatCurveType(defSpot.LLmasktmcurve.at(0)), defSpot.LLmasktmcurve); + LLmasktmshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmasktmshape->setIdentityValue(0.); + HHmasktmshape->setResetCurve(FlatCurveType(defSpot.HHmasktmcurve.at(0)), defSpot.HHmasktmcurve); + HHmasktmshape->setCurveColorProvider(this, 2); + HHmasktmshape->setBottomBarColorProvider(this, 2); + + masktmCurveEditorG->curveListComplete(); + + blendmasktm->setAdjusterListener(this); + + lapmasktm->setAdjusterListener(this); + + radmasktm->setAdjusterListener(this); + + chromasktm->setAdjusterListener(this); + + gammasktm->setAdjusterListener(this); + + slomasktm->setAdjusterListener(this); + + mask2tmCurveEditorG->setCurveListener(this); + Lmasktmshape->setResetCurve(DiagonalCurveType(defSpot.Lmasktmcurve.at(0)), defSpot.Lmasktmcurve); + Lmasktmshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmasktmshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2tmCurveEditorG->curveListComplete(); + Gtk::Separator* const separatortm = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + + // Add Tone Mapping specific widgets to GUI + // pack_start(*amount); // To use if we change transit_shapedetect parameters + pack_start(*sensitm); + pack_start(*repartm); + pack_start(*separatortm); + pack_start(*stren); + pack_start(*equiltm); + pack_start(*gamma); + pack_start(*satur); + pack_start(*estop); + pack_start(*scaltm); + pack_start(*rewei); + // pack_start(*softradiustm); //unused here, but used for normalize_mean_dt +// pack_start(*sensitm); + ToolParamBlock* const tmBox3 = Gtk::manage(new ToolParamBlock()); + tmBox3->pack_start(*maskusablet, Gtk::PACK_SHRINK, 0); + tmBox3->pack_start(*maskunusablet, Gtk::PACK_SHRINK, 0); + tmBox3->pack_start(*recothrest); + tmBox3->pack_start(*lowthrest); + tmBox3->pack_start(*higthrest); + tmBox3->pack_start(*decayt); + // colBox3->pack_start(*invmaskc); + exprecovt->add(*tmBox3, false); + pack_start(*exprecovt, false, false); + + ToolParamBlock* const masktmBox = Gtk::manage(new ToolParamBlock()); + masktmBox->pack_start(*showmasktmMethod, Gtk::PACK_SHRINK, 4); + masktmBox->pack_start(*enatmMask, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*enatmMaskaft, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*masktmCurveEditorG, Gtk::PACK_SHRINK, 4); + masktmBox->pack_start(*blendmasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*lapmasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*radmasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*chromasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*gammasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*slomasktm, Gtk::PACK_SHRINK, 0); + masktmBox->pack_start(*mask2tmCurveEditorG, Gtk::PACK_SHRINK, 4); + expmasktm->add(*masktmBox, false); + pack_start(*expmasktm, false, false); +} + +LocallabTone::~LocallabTone() +{ + delete masktmCurveEditorG; + delete mask2tmCurveEditorG; +} + +bool LocallabTone::isMaskViewActive() +{ + return (showmasktmMethod->get_active_row_number() != 0); +} + +void LocallabTone::resetMaskView() +{ + showmasktmMethodConn.block(true); + showmasktmMethod->set_active(0); + showmasktmMethodConn.block(false); +} + +void LocallabTone::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + tmMask = showmasktmMethod->get_active_row_number(); +} + +void LocallabTone::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_text(M("TP_LOCALLAB_TONEMAP_TOOLTIP")); + recothrest->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + exprecovt->set_tooltip_markup(M("TP_LOCALLAB_MASKRESTM_TOOLTIP")); + equiltm->set_tooltip_text(M("TP_LOCALLAB_EQUILTM_TOOLTIP")); + repartm->set_tooltip_text(M("TP_LOCALLAB_REPARTM_TOOLTIP")); + gamma->set_tooltip_text(M("TP_LOCALLAB_TONEMAPGAM_TOOLTIP")); + estop->set_tooltip_text(M("TP_LOCALLAB_TONEMAPESTOP_TOOLTIP")); + scaltm->set_tooltip_text(M("TP_LOCALLAB_TONEMASCALE_TOOLTIP")); + rewei->set_tooltip_text(M("TP_LOCALLAB_TONEMAPREWEI_TOOLTIP")); + sensitm->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + expmasktm->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + CCmasktmshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmasktmshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmasktmshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmasktm->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + mask2tmCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmasktmshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + masktmCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammasktm->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromasktm->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomasktm->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmasktm->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + decayt->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthrest->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESTM_TOOLTIP")); + higthrest->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESTM_TOOLTIP")); + + } else { + exp->set_tooltip_text(""); + equiltm->set_tooltip_text(""); + recothrest->set_tooltip_text(""); + repartm->set_tooltip_text(""); + gamma->set_tooltip_text(""); + estop->set_tooltip_text(""); + scaltm->set_tooltip_text(""); + rewei->set_tooltip_text(""); + sensitm->set_tooltip_text(""); + expmasktm->set_tooltip_markup(""); + CCmasktmshape->setTooltip(""); + LLmasktmshape->setTooltip(""); + HHmasktmshape->setTooltip(""); + blendmasktm->set_tooltip_text(""); + radmasktm->set_tooltip_text(""); + mask2tmCurveEditorG->set_tooltip_text(""); + Lmasktmshape->setTooltip(""); + mask2tmCurveEditorG->set_tooltip_text(""); + Lmasktmshape->setTooltip(""); + masktmCurveEditorG->set_tooltip_markup(""); + gammasktm->set_tooltip_text(""); + chromasktm->set_tooltip_text(""); + slomasktm->set_tooltip_text(""); + lapmasktm->set_tooltip_text(""); + exprecovt->set_tooltip_markup(""); + decayt->set_tooltip_text(""); + lowthrest->set_tooltip_text(""); + higthrest->set_tooltip_text(""); + } +} + +void LocallabTone::setDefaultExpanderVisibility() +{ + exprecovt->set_expanded(false); + expmasktm->set_expanded(false); +} + +void LocallabTone::disableListener() +{ + LocallabTool::disableListener(); + + equiltmConn.block(true); + showmasktmMethodConn.block(true); + enatmMaskConn.block(true); + enatmMaskaftConn.block(true); +} + +void LocallabTone::enableListener() +{ + LocallabTool::enableListener(); + + equiltmConn.block(false); + showmasktmMethodConn.block(false); + enatmMaskConn.block(false); + enatmMaskaftConn.block(false); +} + +void LocallabTone::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visitonemap); + exp->setEnabled(spot.exptonemap); + complexity->set_active(spot.complextonemap); + + amount->setValue(spot.amount); + stren->setValue(spot.stren); + repartm->setValue(spot.repartm); + equiltm->set_active(spot.equiltm); + gamma->setValue(spot.gamma); + satur->setValue(spot.satur); + estop->setValue(spot.estop); + scaltm->setValue(spot.scaltm); + rewei->setValue((double)spot.rewei); + softradiustm->setValue(spot.softradiustm); + sensitm->setValue((double)spot.sensitm); + enatmMask->set_active(spot.enatmMask); + enatmMaskaft->set_active(spot.enatmMaskaft); + CCmasktmshape->setCurve(spot.CCmasktmcurve); + LLmasktmshape->setCurve(spot.LLmasktmcurve); + HHmasktmshape->setCurve(spot.HHmasktmcurve); + blendmasktm->setValue((double)spot.blendmasktm); + lapmasktm->setValue(spot.lapmasktm); + radmasktm->setValue(spot.radmasktm); + chromasktm->setValue(spot.chromasktm); + gammasktm->setValue(spot.gammasktm); + slomasktm->setValue(spot.slomasktm); + Lmasktmshape->setCurve(spot.Lmasktmcurve); + recothrest->setValue((double)spot.recothrest); + lowthrest->setValue((double)spot.lowthrest); + higthrest->setValue((double)spot.higthrest); + decayt->setValue((double)spot.decayt); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabTone::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.exptonemap = exp->getEnabled(); + spot.visitonemap = exp->get_visible(); + spot.complextonemap = complexity->get_active_row_number(); + + spot.amount = amount->getValue(); + spot.stren = stren->getValue(); + spot.repartm = repartm->getValue(); + spot.equiltm = equiltm->get_active(); + spot.gamma = gamma->getValue(); + spot.satur = satur->getValue(); + spot.estop = estop->getValue(); + spot.scaltm = scaltm->getValue(); + spot.rewei = rewei->getIntValue(); + spot.softradiustm = softradiustm->getValue(); + spot.sensitm = sensitm->getIntValue(); + spot.enatmMask = enatmMask->get_active(); + spot.enatmMaskaft = enatmMaskaft->get_active(); + spot.LLmasktmcurve = LLmasktmshape->getCurve(); + spot.CCmasktmcurve = CCmasktmshape->getCurve(); + spot.HHmasktmcurve = HHmasktmshape->getCurve(); + spot.blendmasktm = blendmasktm->getIntValue(); + spot.lapmasktm = lapmasktm->getValue(); + spot.radmasktm = radmasktm->getValue(); + spot.chromasktm = chromasktm->getValue(); + spot.gammasktm = gammasktm->getValue(); + spot.slomasktm = slomasktm->getValue(); + spot.Lmasktmcurve = Lmasktmshape->getCurve(); + spot.recothrest = recothrest->getValue(); + spot.lowthrest = lowthrest->getValue(); + spot.higthrest = higthrest->getValue(); + spot.decayt = decayt->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabTone::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster widgets + amount->setDefault(defSpot.amount); + stren->setDefault(defSpot.stren); + gamma->setDefault(defSpot.gamma); + satur->setDefault(defSpot.satur); + estop->setDefault(defSpot.estop); + scaltm->setDefault(defSpot.scaltm); + repartm->setDefault(defSpot.repartm); + rewei->setDefault((double)defSpot.rewei); + softradiustm->setDefault(defSpot.softradiustm); + sensitm->setDefault((double)defSpot.sensitm); + blendmasktm->setDefault((double)defSpot.blendmasktm); + lapmasktm->setDefault(defSpot.lapmasktm); + radmasktm->setDefault(defSpot.radmasktm); + chromasktm->setDefault(defSpot.chromasktm); + gammasktm->setDefault(defSpot.gammasktm); + slomasktm->setDefault(defSpot.slomasktm); + recothrest->setDefault((double)defSpot.recothrest); + lowthrest->setDefault((double)defSpot.lowthrest); + higthrest->setDefault((double)defSpot.higthrest); + decayt->setDefault((double)defSpot.decayt); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabTone::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled() && listener) { + const auto spName = " (" + escapeHtmlChars(getSpotName()) + ")"; + + if (a == amount) { + listener->panelChanged(Evlocallabamount, amount->getTextValue() + spName); + } else if (a == stren) { + listener->panelChanged(Evlocallabstren, stren->getTextValue() + spName); + } else if (a == gamma) { + listener->panelChanged(Evlocallabgamma, gamma->getTextValue() + spName); + } else if (a == satur) { + listener->panelChanged(Evlocallabsatur, satur->getTextValue() + spName); + } else if (a == estop) { + listener->panelChanged(Evlocallabestop, estop->getTextValue() + spName); + } else if (a == scaltm) { + listener->panelChanged(Evlocallabscaltm, scaltm->getTextValue() + spName); + } else if (a == repartm) { + listener->panelChanged(Evlocallabrepartm, repartm->getTextValue() + spName); + } else if (a == rewei) { + listener->panelChanged(Evlocallabrewei, rewei->getTextValue() + spName); + } else if (a == softradiustm) { + listener->panelChanged(Evlocallabsoftradiustm, softradiustm->getTextValue() + spName); + } else if (a == sensitm) { + listener->panelChanged(Evlocallabsensitm, sensitm->getTextValue() + spName); + } else if (a == blendmasktm) { + listener->panelChanged(Evlocallabblendmasktm, blendmasktm->getTextValue() + spName); + } else if (a == lapmasktm) { + listener->panelChanged(Evlocallablapmasktm, lapmasktm->getTextValue() + spName); + } else if (a == radmasktm) { + listener->panelChanged(Evlocallabradmasktm, radmasktm->getTextValue() + spName); + } else if (a == chromasktm) { + listener->panelChanged(Evlocallabchromasktm, chromasktm->getTextValue() + spName); + } else if (a == gammasktm) { + listener->panelChanged(Evlocallabgammasktm, gammasktm->getTextValue() + spName); + } else if (a == slomasktm) { + listener->panelChanged(Evlocallabslomasktm, slomasktm->getTextValue() + spName); + } else if (a == recothrest) { + listener->panelChanged(Evlocallabrecothrest, recothrest->getTextValue() + spName); + } else if (a == lowthrest) { + listener->panelChanged(Evlocallablowthrest, lowthrest->getTextValue() + spName); + } else if (a == higthrest) { + listener->panelChanged(Evlocallabhigthrest, higthrest->getTextValue() + spName); + } else if (a == decayt) { + listener->panelChanged(Evlocallabdecayt, decayt->getTextValue() + spName); + } + } +} + +void LocallabTone::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled() && listener) { + const auto spName = M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"; + + if (ce == CCmasktmshape) { + listener->panelChanged(EvlocallabCCmasktmshape, spName); + } else if (ce == LLmasktmshape) { + listener->panelChanged(EvlocallabLLmasktmshape, spName); + } else if (ce == HHmasktmshape) { + listener->panelChanged(EvlocallabHHmasktmshape, spName); + } else if (ce == Lmasktmshape) { + listener->panelChanged(EvlocallabLmasktmshape, spName); + } + } +} + +void LocallabTone::enabledChanged() +{ + if (isLocActivated && listener) { + listener->panelChanged(EvLocenatonemap, (exp->getEnabled() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")) + + " (" + escapeHtmlChars(getSpotName()) + ")"); + } +} + +void LocallabTone::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + gamma->setValue(defSpot.gamma); + satur->setValue(defSpot.satur); + rewei->setValue((double)defSpot.rewei); + lapmasktm->setValue(defSpot.lapmasktm); + gammasktm->setValue(defSpot.gammasktm); + slomasktm->setValue(defSpot.slomasktm); + + // Enable all listeners + enableListener(); +} + +void LocallabTone::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + showmasktmMethod->set_active(0); + enatmMask->set_active(defSpot.enatmMask); + enatmMaskaft->set_active(defSpot.enatmMaskaft); +// CCmasktmshape->setCurve(defSpot.CCmasktmcurve); +// LLmasktmshape->setCurve(defSpot.LLmasktmcurve); +// HHmasktmshape->setCurve(defSpot.HHmasktmcurve); +// blendmasktm->setValue((double)defSpot.blendmasktm); +// radmasktm->setValue(defSpot.radmasktm); +// chromasktm->setValue(defSpot.chromasktm); +// Lmasktmshape->setCurve(defSpot.Lmasktmcurve); + recothrest->setValue(defSpot.recothrest); + lowthrest->setValue(defSpot.lowthrest); + higthrest->setValue(defSpot.higthrest); + decayt->setValue(defSpot.decayt); + + // Enable all listeners + enableListener(); +} + +void LocallabTone::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + gamma->hide(); + satur->hide(); + rewei->hide(); + expmasktm->hide(); + exprecovt->hide(); + decayt->hide(); + maskusablet->hide(); + maskunusablet->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + gamma->hide(); + satur->hide(); + rewei->hide(); + lapmasktm->hide(); + gammasktm->hide(); + slomasktm->hide(); + // Specific Simple mode widgets are shown in Normal mode + expmasktm->show(); + exprecovt->show(); + decayt->hide(); + if (enatmMask->get_active()) { + maskusablet->show(); + maskunusablet->hide(); + + } else { + maskusablet->hide(); + maskunusablet->show(); + } + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + gamma->show(); + satur->show(); + rewei->show(); + expmasktm->show(); + lapmasktm->show(); + gammasktm->show(); + slomasktm->show(); + exprecovt->show(); + decayt->show(); + if (enatmMask->get_active()) { + maskusablet->show(); + maskunusablet->hide(); + + } else { + maskusablet->hide(); + maskunusablet->show(); + } + } +} + +void LocallabTone::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmasktmshape->updateLocallabBackground(normChromar); + LLmasktmshape->updateLocallabBackground(normLumar); + HHmasktmshape->updateLocallabBackground(normHuer); + Lmasktmshape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + +void LocallabTone::equiltmChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (equiltm->get_active()) { + listener->panelChanged(Evlocallabequiltm, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabequiltm, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabTone::showmasktmMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabTone::enatmMaskChanged() +{ + if (enatmMask->get_active()) { + maskusablet->show(); + maskunusablet->hide(); + } else { + maskusablet->hide(); + maskunusablet->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enatmMask->get_active()) { + listener->panelChanged(EvLocallabEnatmMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnatmMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabTone::enatmMaskaftChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enatmMaskaft->get_active()) { + listener->panelChanged(EvLocallabEnatmMaskaft, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnatmMaskaft, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +/* ==== LocallabRetinex ==== */ +LocallabRetinex::LocallabRetinex(): + LocallabTool(this, M("TP_LOCALLAB_RET_TOOLNAME"), M("TP_LOCALLAB_RETI"), true), + + // Retinex specific widgets + dehaFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DEHAFRA")))), + dehaz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEHAZ"), -100, 100, 1, 0))), + depth(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DEPTH"), 0, 100, 1, 25))), + dehazeSaturation(Gtk::manage(new Adjuster(M("TP_DEHAZE_SATURATION"), 0, 100, 1, 50))), + retiFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETIFRA")))), + str(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STR"), 0., 100., 0.2, 0.))), + loglin(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LOGLIN")))), + sensih(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + retitoolFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RETITOOLFRA")))), + retinexMethod(Gtk::manage(new MyComboBoxText())), + fftwreti(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTW")))), + equilret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EQUIL")))), + neigh(Gtk::manage(new Adjuster(M("TP_LOCALLAB_NEIGH"), MINNEIGH, MAXNEIGH, 0.5, 50., nullptr, nullptr, &retiSlider2neigh, &retiNeigh2Slider))), + vart(Gtk::manage(new Adjuster(M("TP_LOCALLAB_VART"), 0.1, 500., 0.1, 150.))), + scalereti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SCALERETI"), 1.0, 10.0, 1., 2.))), + limd(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESRETI"), 1.2, 100.0, 0.1, 8.))), + offs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFS"), -16386., 32768., 1., 0.))), + expretitools(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_EXPRETITOOLS")))), + chrrt(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHRRT"), 0.0, 100.0, 0.1, 0.0))), + darkness(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DARKRETI"), 0.01, 6.0, 0.01, 2.0))), + lightnessreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LIGHTRETI"), 0.01, 4.0, 0.01, 1.))), + cliptm(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLIPTM"), 0.02, 2.0, 0.01, 1.))), + softradiusret(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRETI"), 0.0, 100.0, 0.5, 40.))), + LocalcurveEditortransT(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_TRANSMISSIONMAP"))), + cTtransshape(static_cast(LocalcurveEditortransT->addCurve(CT_Flat, "", nullptr, false, false))), + mMLabels(Gtk::manage(new Gtk::Label("---"))), + transLabels(Gtk::manage(new Gtk::Label("---"))), + transLabels2(Gtk::manage(new Gtk::Label("---"))), + LocalcurveEditorgainT(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_TRANSMISSIONGAIN"))), + cTgainshape(static_cast(LocalcurveEditorgainT->addCurve(CT_Flat, "", nullptr, false, false))), + exprecovr(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusabler(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusabler(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothresr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + lowthresr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW2"), 1., 80., 0.5, 12.))), + higthresr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR2"), 20., 99., 0.5, 85.))), + decayr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + expmaskreti(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWR")))), + showmaskretiMethod(Gtk::manage(new MyComboBoxText())), + enaretiMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), + enaretiMasktmap(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TM_MASK")))), + // maskretiCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskretiCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskretishape(static_cast(maskretiCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskretishape(static_cast(maskretiCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskretishape(static_cast(maskretiCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 10.))), + lapmaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.05, 5.0, 0.01, 1.))), + slomaskreti(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + mask2retiCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmaskretishape(static_cast(mask2retiCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + inversret(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Retinex specific widgets + dehaz->setAdjusterListener(this); + + dehazeSaturation->setAdjusterListener(this); + depth->setAdjusterListener(this); + + retiFrame->set_label_align(0.025, 0.5); + + str->setAdjusterListener(this); + + loglinConn = loglin->signal_toggled().connect(sigc::mem_fun(*this, &LocallabRetinex::loglinChanged)); + + sensih->setAdjusterListener(this); + + retitoolFrame->set_label_align(0.025, 0.5); + + retinexMethod->append(M("TP_RETINEX_LOW")); + retinexMethod->append(M("TP_RETINEX_UNIFORM")); + retinexMethod->append(M("TP_RETINEX_HIGH")); + retinexMethod->set_active(0); + retinexMethod->set_tooltip_markup(M("TP_LOCRETI_METHOD_TOOLTIP")); + retinexMethodConn = retinexMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabRetinex::retinexMethodChanged)); + + fftwretiConn = fftwreti->signal_toggled().connect(sigc::mem_fun(*this, &LocallabRetinex::fftwretiChanged)); + + equilretConn = equilret->signal_toggled().connect(sigc::mem_fun(*this, &LocallabRetinex::equilretChanged)); + + neigh->setAdjusterListener(this); + + vart->setAdjusterListener(this); + + scalereti->setAdjusterListener(this); + + limd->setAdjusterListener(this); + + offs->setAdjusterListener(this); + + setExpandAlignProperties(expretitools, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + chrrt->setAdjusterListener(this); + + darkness->setAdjusterListener(this); + + lightnessreti->setAdjusterListener(this); + + cliptm->setAdjusterListener(this); + + softradiusret->setLogScale(10, 0); + softradiusret->setAdjusterListener(this); + + LocalcurveEditortransT->setCurveListener(this); + + cTtransshape->setIdentityValue(0.); + cTtransshape->setResetCurve(FlatCurveType(defSpot.localTtranscurve.at(0)), defSpot.localTtranscurve); + + LocalcurveEditortransT->curveListComplete(); + + setExpandAlignProperties(mMLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + + setExpandAlignProperties(transLabels, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + + setExpandAlignProperties(transLabels2, true, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + + LocalcurveEditorgainT->setCurveListener(this); + + cTgainshape->setIdentityValue(0.); + cTgainshape->setResetCurve(FlatCurveType(defSpot.localTgaincurve.at(0)), defSpot.localTgaincurve); + + LocalcurveEditorgainT->curveListComplete(); + + recothresr->setAdjusterListener(this); + lowthresr->setAdjusterListener(this); + higthresr->setAdjusterListener(this); + decayr->setAdjusterListener(this); + setExpandAlignProperties(exprecovr, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + setExpandAlignProperties(expmaskreti, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskretiMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskretiMethod->set_active(0); + showmaskretiMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskretiMethodConn = showmaskretiMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabRetinex::showmaskretiMethodChanged)); + + enaretiMaskConn = enaretiMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabRetinex::enaretiMaskChanged)); + + enaretiMasktmapConn = enaretiMasktmap->signal_toggled().connect(sigc::mem_fun(*this, &LocallabRetinex::enaretiMasktmapChanged)); + + maskretiCurveEditorG->setCurveListener(this); + + CCmaskretishape->setIdentityValue(0.); + CCmaskretishape->setResetCurve(FlatCurveType(defSpot.CCmaskreticurve.at(0)), defSpot.CCmaskreticurve); + CCmaskretishape->setBottomBarColorProvider(this, 1); + + LLmaskretishape->setIdentityValue(0.); + LLmaskretishape->setResetCurve(FlatCurveType(defSpot.LLmaskreticurve.at(0)), defSpot.LLmaskreticurve); + LLmaskretishape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskretishape->setIdentityValue(0.); + HHmaskretishape->setResetCurve(FlatCurveType(defSpot.HHmaskreticurve.at(0)), defSpot.HHmaskreticurve); + HHmaskretishape->setCurveColorProvider(this, 2); + HHmaskretishape->setBottomBarColorProvider(this, 2); + + maskretiCurveEditorG->curveListComplete(); + + blendmaskreti->setAdjusterListener(this); + + radmaskreti->setAdjusterListener(this); + + lapmaskreti->setAdjusterListener(this); + + chromaskreti->setAdjusterListener(this); + + gammaskreti->setAdjusterListener(this); + + slomaskreti->setAdjusterListener(this); + + mask2retiCurveEditorG->setCurveListener(this); + + Lmaskretishape->setResetCurve(DiagonalCurveType(defSpot.Lmaskreticurve.at(0)), defSpot.Lmaskreticurve); + Lmaskretishape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmaskretishape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2retiCurveEditorG->curveListComplete(); + + inversretConn = inversret->signal_toggled().connect(sigc::mem_fun(*this, &LocallabRetinex::inversretChanged)); + + // Add Retinex specific widgets to GUI + pack_start(*sensih); + ToolParamBlock* const auxBox = Gtk::manage(new ToolParamBlock()); +// Gtk::Frame* const dehaFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_DEHAFRA"))); + dehaFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const dehaBox = Gtk::manage(new ToolParamBlock()); + dehaBox->pack_start(*dehaz); + dehaBox->pack_start(*depth); + dehaBox->pack_start(*dehazeSaturation); + dehaFrame->add(*dehaBox); + auxBox->add(*dehaFrame); + ToolParamBlock* const deharetiBox = Gtk::manage(new ToolParamBlock()); + deharetiBox->pack_start(*str); + deharetiBox->pack_start(*loglin); + retiFrame->add(*deharetiBox); + auxBox->add(*retiFrame); + // ToolParamBlock* const scopeBox = Gtk::manage(new ToolParamBlock()); + // scopeBox->pack_start(*sensih); + // auxBox->add(*scopeBox); + pack_start(*auxBox); + ToolParamBlock* const retiBox = Gtk::manage(new ToolParamBlock()); + retiBox->pack_start(*retinexMethod); + retiBox->pack_start(*fftwreti); + retiBox->pack_start(*equilret); + retiBox->pack_start(*neigh); + retiBox->pack_start(*vart); + retiBox->pack_start(*scalereti); + retiBox->pack_start(*limd); + retiBox->pack_start(*offs); + ToolParamBlock* const toolretiBox = Gtk::manage(new ToolParamBlock()); + // toolretiBox->pack_start(*chrrt); + toolretiBox->pack_start(*darkness); + toolretiBox->pack_start(*lightnessreti); + toolretiBox->pack_start(*cliptm); + toolretiBox->pack_start(*softradiusret); + toolretiBox->pack_start(*LocalcurveEditortransT, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolretiBox->pack_start(*mMLabels); + toolretiBox->pack_start(*transLabels); + toolretiBox->pack_start(*transLabels2); + toolretiBox->pack_start(*LocalcurveEditorgainT, Gtk::PACK_SHRINK, 4); + expretitools->add(*toolretiBox, false); + retiBox->pack_start(*expretitools, false, false); + ToolParamBlock* const reBox3 = Gtk::manage(new ToolParamBlock()); + reBox3->pack_start(*maskusabler, Gtk::PACK_SHRINK, 0); + reBox3->pack_start(*maskunusabler, Gtk::PACK_SHRINK, 0); + reBox3->pack_start(*recothresr); + reBox3->pack_start(*lowthresr); + reBox3->pack_start(*higthresr); + reBox3->pack_start(*decayr); + // colBox3->pack_start(*invmaskc); + exprecovr->add(*reBox3, false); + + ToolParamBlock* const maskretiBox = Gtk::manage(new ToolParamBlock()); + maskretiBox->pack_start(*showmaskretiMethod, Gtk::PACK_SHRINK, 4); + maskretiBox->pack_start(*enaretiMask, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*enaretiMasktmap, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*maskretiCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskretiBox->pack_start(*blendmaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*radmaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*lapmaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*chromaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*gammaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*slomaskreti, Gtk::PACK_SHRINK, 0); + maskretiBox->pack_start(*mask2retiCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmaskreti->add(*maskretiBox, false); + retiBox->pack_start(*exprecovr, false, false); + retiBox->pack_start(*expmaskreti, false, false); + // retiBox->pack_start(*inversret); + retitoolFrame->add(*retiBox); + pack_start(*retitoolFrame); +} + +LocallabRetinex::~LocallabRetinex() +{ + delete LocalcurveEditortransT; + delete LocalcurveEditorgainT; + delete maskretiCurveEditorG; + delete mask2retiCurveEditorG; +} + +void LocallabRetinex::updateMinMax(const double cdma, const double cdmin, const double mini, const double maxi, const double Tmean, const double Tsigma, const double Tmin, const double Tmax) +{ + idle_register.add( + [this, cdma, cdmin, mini, maxi, Tmean, Tsigma, Tmin, Tmax]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + mMLabels->set_text( + Glib::ustring::compose(M("TP_LOCALLAB_MLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), cdmin), + Glib::ustring::format(std::fixed, std::setprecision(0), cdma)) + ); + transLabels->set_text( + Glib::ustring::compose(M("TP_LOCALLAB_TLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(1), mini), + Glib::ustring::format(std::fixed, std::setprecision(1), maxi), + Glib::ustring::format(std::fixed, std::setprecision(1), Tmean), + Glib::ustring::format(std::fixed, std::setprecision(1), Tsigma)) + ); + transLabels2->set_text( + Glib::ustring::compose(M("TP_RETINEX_TLABEL2"), + Glib::ustring::format(std::fixed, std::setprecision(1), Tmin), + Glib::ustring::format(std::fixed, std::setprecision(1), Tmax)) + ); + + return false; + } + ); +} + +bool LocallabRetinex::isMaskViewActive() +{ + return (showmaskretiMethod->get_active_row_number() != 0); +} + +void LocallabRetinex::resetMaskView() +{ + showmaskretiMethodConn.block(true); + showmaskretiMethod->set_active(0); + showmaskretiMethodConn.block(false); +} + +void LocallabRetinex::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + retiMask = showmaskretiMethod->get_active_row_number(); +} + +void LocallabRetinex::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + dehaFrame->set_tooltip_text(M("TP_LOCALLAB_DEHAZFRAME_TOOLTIP")); + dehaz->set_tooltip_text(M("TP_LOCALLAB_DEHAZ_TOOLTIP")); + retiFrame->set_tooltip_text(M("TP_LOCALLAB_RETIFRAME_TOOLTIP")); + exprecovr->set_tooltip_markup(M("TP_LOCALLAB_MASKRESRETI_TOOLTIP")); + loglin->set_tooltip_text(M("TP_LOCALLAB_RETI_LOGLIN_TOOLTIP")); + sensih->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + fftwreti->set_tooltip_text(M("TP_LOCALLAB_LC_FFTW_TOOLTIP")); + equilret->set_tooltip_text(M("TP_LOCALLAB_EQUILTM_TOOLTIP")); + neigh->set_tooltip_text(M("TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP")); + vart->set_tooltip_text(M("TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP")); + scalereti->set_tooltip_text(M("TP_LOCALLAB_RETI_SCALE_TOOLTIP")); + limd->set_tooltip_text(M("TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP")); + offs->set_tooltip_text(M("TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP")); + darkness->set_tooltip_text(M("TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP")); + lightnessreti->set_tooltip_text(M("TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP")); + cliptm->set_tooltip_text(M("TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP")); + softradiusret->set_tooltip_text(M("TP_LOCALLAB_GUIDFILTER_TOOLTIP")); + cTtransshape->setTooltip(M("TP_LOCALLAB_TRANSMISSION_TOOLTIP")); + mMLabels->set_tooltip_markup(M("TP_LOCALLAB_MLABEL_TOOLTIP")); + transLabels->set_tooltip_markup(M("TP_LOCALLAB_TLABEL_TOOLTIP")); + transLabels2->set_tooltip_markup(M("TP_LOCALLAB_TLABEL_TOOLTIP")); + cTgainshape->setTooltip(M("TP_RETINEX_GAINTRANSMISSION_TOOLTIP")); + expmaskreti->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + enaretiMasktmap->set_tooltip_markup(M("TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP")); + CCmaskretishape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskretishape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskretishape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmaskreti->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + mask2retiCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmaskretishape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskretiCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskreti->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskreti->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskreti->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskreti->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + decayr->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthresr->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESRETI_TOOLTIP")); + higthresr->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESRETI_TOOLTIP")); + + } else { + dehaFrame->set_tooltip_text(""); + dehaz->set_tooltip_text(""); + retiFrame->set_tooltip_text(""); + loglin->set_tooltip_text(""); + sensih->set_tooltip_text(""); + fftwreti->set_tooltip_text(""); + equilret->set_tooltip_text(""); + neigh->set_tooltip_text(""); + vart->set_tooltip_text(""); + scalereti->set_tooltip_text(""); + limd->set_tooltip_text(""); + offs->set_tooltip_text(""); + darkness->set_tooltip_text(""); + lightnessreti->set_tooltip_text(""); + cliptm->set_tooltip_text(""); + softradiusret->set_tooltip_text(""); + cTtransshape->setTooltip(""); + mMLabels->set_tooltip_markup(""); + transLabels->set_tooltip_markup(""); + transLabels2->set_tooltip_markup(""); + cTgainshape->setTooltip(""); + expmaskreti->set_tooltip_markup(""); + enaretiMasktmap->set_tooltip_markup(""); + CCmaskretishape->setTooltip(""); + LLmaskretishape->setTooltip(""); + HHmaskretishape->setTooltip(""); + blendmaskreti->set_tooltip_text(""); + radmaskreti->set_tooltip_text(""); + mask2retiCurveEditorG->set_tooltip_text(""); + Lmaskretishape->setTooltip(""); + maskretiCurveEditorG->set_tooltip_markup(""); + gammaskreti->set_tooltip_text(""); + chromaskreti->set_tooltip_text(""); + slomaskreti->set_tooltip_text(""); + lapmaskreti->set_tooltip_text(""); + exprecovr->set_tooltip_markup(""); + decayr->set_tooltip_text(""); + lowthresr->set_tooltip_text(""); + higthresr->set_tooltip_text(""); + } +} + +void LocallabRetinex::setDefaultExpanderVisibility() +{ + exprecovr->set_expanded(false); + expretitools->set_expanded(false); + expmaskreti->set_expanded(false); +} + +void LocallabRetinex::disableListener() +{ + LocallabTool::disableListener(); + + loglinConn.block(true); + retinexMethodConn.block(true); + fftwretiConn.block(true); + equilretConn.block(true); + showmaskretiMethodConn.block(true); + enaretiMaskConn.block(true); + enaretiMasktmapConn.block(true); + inversretConn.block(true); +} + +void LocallabRetinex::enableListener() +{ + LocallabTool::enableListener(); + + loglinConn.block(false); + retinexMethodConn.block(false); + fftwretiConn.block(false); + equilretConn.block(false); + showmaskretiMethodConn.block(false); + enaretiMaskConn.block(false); + enaretiMasktmapConn.block(false); + inversretConn.block(false); +} + +void LocallabRetinex::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visireti); + exp->setEnabled(spot.expreti); + complexity->set_active(spot.complexreti); + + dehaz->setValue((double)spot.dehaz); + depth->setValue((double)spot.depth); + dehazeSaturation->setValue((double)spot.dehazeSaturation); + str->setValue(spot.str); + loglin->set_active(spot.loglin); + sensih->setValue((double)spot.sensih); + + if (spot.retinexMethod == "low") { + retinexMethod->set_active(0); + } else if (spot.retinexMethod == "uni") { + retinexMethod->set_active(1); + } else { + retinexMethod->set_active(2); + } + + fftwreti->set_active(spot.fftwreti); + equilret->set_active(spot.equilret); + neigh->setValue(spot.neigh); + vart->setValue(spot.vart); + scalereti->setValue(spot.scalereti); + limd->setValue(spot.limd); + offs->setValue(spot.offs); + chrrt->setValue(0.); + // chrrt->setValue(spot.chrrt); + darkness->setValue(spot.darkness); + lightnessreti->setValue(spot.lightnessreti); + cliptm->setValue(spot.cliptm); + softradiusret->setValue(spot.softradiusret); + cTtransshape->setCurve(spot.localTtranscurve); + cTgainshape->setCurve(spot.localTgaincurve); + enaretiMask->set_active(spot.enaretiMask); + enaretiMasktmap->set_active(spot.enaretiMasktmap); + CCmaskretishape->setCurve(spot.CCmaskreticurve); + LLmaskretishape->setCurve(spot.LLmaskreticurve); + HHmaskretishape->setCurve(spot.HHmaskreticurve); + blendmaskreti->setValue((double)spot.blendmaskreti); + radmaskreti->setValue(spot.radmaskreti); + lapmaskreti->setValue(spot.lapmaskreti); + chromaskreti->setValue(spot.chromaskreti); + gammaskreti->setValue(spot.gammaskreti); + slomaskreti->setValue(spot.slomaskreti); + Lmaskretishape->setCurve(spot.Lmaskreticurve); + inversret->set_active(spot.inversret); + recothresr->setValue((double)spot.recothresr); + lowthresr->setValue((double)spot.lowthresr); + higthresr->setValue((double)spot.higthresr); + decayr->setValue((double)spot.decayr); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update Retinex GUI according to scalereti adjuster value + updateRetinexGUI1(); + + // Update Retinex GUI according to inversret button state + updateRetinexGUI2(); + + // Update Retinex GUI according to str adjuster value + updateRetinexGUI3(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabRetinex::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expreti = exp->getEnabled(); + spot.visireti = exp->get_visible(); + spot.complexreti = complexity->get_active_row_number(); + + spot.dehaz = dehaz->getIntValue(); + spot.depth = depth->getIntValue(); + spot.dehazeSaturation = dehazeSaturation->getIntValue(); + spot.str = str->getValue(); + spot.loglin = loglin->get_active(); + spot.sensih = sensih->getIntValue(); + + if (retinexMethod->get_active_row_number() == 0) { + spot.retinexMethod = "low"; + } else if (retinexMethod->get_active_row_number() == 1) { + spot.retinexMethod = "uni"; + } else if (retinexMethod->get_active_row_number() == 2) { + spot.retinexMethod = "high"; + } + + spot.fftwreti = fftwreti->get_active(); + spot.equilret = equilret->get_active(); + spot.neigh = neigh->getValue(); + spot.vart = vart->getValue(); + spot.scalereti = scalereti->getValue(); + spot.limd = limd->getValue(); + spot.offs = offs->getValue(); + spot.chrrt = chrrt->getValue(); + spot.darkness = darkness->getValue(); + spot.lightnessreti = lightnessreti->getValue(); + spot.cliptm = cliptm->getValue(); + spot.softradiusret = softradiusret->getValue(); + spot.localTtranscurve = cTtransshape->getCurve(); + spot.localTgaincurve = cTgainshape->getCurve(); + spot.enaretiMask = enaretiMask->get_active(); + spot.enaretiMasktmap = enaretiMasktmap->get_active(); + spot.CCmaskreticurve = CCmaskretishape->getCurve(); + spot.LLmaskreticurve = LLmaskretishape->getCurve(); + spot.HHmaskreticurve = HHmaskretishape->getCurve(); + spot.blendmaskreti = blendmaskreti->getIntValue(); + spot.radmaskreti = radmaskreti->getValue(); + spot.lapmaskreti = lapmaskreti->getValue(); + spot.chromaskreti = chromaskreti->getValue(); + spot.gammaskreti = gammaskreti->getValue(); + spot.slomaskreti = slomaskreti->getValue(); + spot.Lmaskreticurve = Lmaskretishape->getCurve(); + spot.inversret = inversret->get_active(); + spot.recothresr = recothresr->getValue(); + spot.lowthresr = lowthresr->getValue(); + spot.higthresr = higthresr->getValue(); + spot.decayr = decayr->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabRetinex::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster widgets + dehaz->setDefault((double)defSpot.dehaz); + dehazeSaturation->setDefault((double)defSpot.dehazeSaturation); + depth->setDefault((double)defSpot.depth); + str->setDefault(defSpot.str); + sensih->setDefault((double)defSpot.sensih); + neigh->setDefault(defSpot.neigh); + vart->setDefault(defSpot.vart); + scalereti->setDefault(defSpot.scalereti); + limd->setDefault(defSpot.limd); + offs->setDefault(defSpot.offs); + chrrt->setDefault(defSpot.chrrt); + darkness->setDefault(defSpot.darkness); + lightnessreti->setDefault(defSpot.lightnessreti); + cliptm->setDefault(defSpot.cliptm); + softradiusret->setDefault(defSpot.softradiusret); + blendmaskreti->setDefault((double)defSpot.blendmaskreti); + radmaskreti->setDefault(defSpot.radmaskreti); + lapmaskreti->setDefault(defSpot.lapmaskreti); + chromaskreti->setDefault(defSpot.chromaskreti); + gammaskreti->setDefault(defSpot.gammaskreti); + slomaskreti->setDefault(defSpot.slomaskreti); + recothresr->setDefault((double)defSpot.recothresr); + lowthresr->setDefault((double)defSpot.lowthresr); + higthresr->setDefault((double)defSpot.higthresr); + decayr->setDefault((double)defSpot.decayr); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabRetinex::adjusterChanged(Adjuster* a, double newval) +{ + // Update Retinex GUI according to scalereti adjuster value + if (a == scalereti) { + updateRetinexGUI1(); + } + + // Update Retinex GUI according to str adjuster value + if (a == str) { + updateRetinexGUI3(); + } + + if (isLocActivated && exp->getEnabled()) { + if (a == dehaz) { + if (listener) { + listener->panelChanged(Evlocallabdehaz, + dehaz->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == dehazeSaturation) { + if (listener) { + listener->panelChanged(EvlocallabdehazeSaturation, + dehazeSaturation->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == depth) { + if (listener) { + listener->panelChanged(Evlocallabdepth, + depth->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == str) { + if (listener) { + listener->panelChanged(Evlocallabstr, + str->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensih) { + if (listener) { + listener->panelChanged(Evlocallabsensih, + sensih->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == neigh) { + if (listener) { + listener->panelChanged(Evlocallabneigh, + neigh->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == vart) { + if (listener) { + listener->panelChanged(Evlocallabvart, + vart->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == scalereti) { + if (listener) { + listener->panelChanged(Evlocallabscalereti, + scalereti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == limd) { + if (listener) { + listener->panelChanged(Evlocallablimd, + limd->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == offs) { + if (listener) { + listener->panelChanged(Evlocallaboffs, + offs->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chrrt) { + if (listener) { + listener->panelChanged(Evlocallabchrrt, + chrrt->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == darkness) { + if (listener) { + listener->panelChanged(Evlocallabdarkness, + darkness->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lightnessreti) { + if (listener) { + listener->panelChanged(Evlocallablightnessreti, + lightnessreti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == cliptm) { + if (listener) { + listener->panelChanged(Evlocallabcliptm, + cliptm->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == softradiusret) { + if (listener) { + listener->panelChanged(Evlocallabsoftradiusret, + softradiusret->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothresr) { + + if (listener) { + listener->panelChanged(Evlocallabrecothresr, + recothresr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthresr) { + if (listener) { + listener->panelChanged(Evlocallablowthresr, + lowthresr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthresr) { + if (listener) { + listener->panelChanged(Evlocallabhigthresr, + higthresr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decayr) { + if (listener) { + listener->panelChanged(Evlocallabdecayr, + decayr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskreti) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskreti, + blendmaskreti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskreti) { + if (listener) { + listener->panelChanged(Evlocallabradmaskreti, + radmaskreti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskreti) { + if (listener) { + listener->panelChanged(Evlocallablapmaskreti, + lapmaskreti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskreti) { + if (listener) { + listener->panelChanged(Evlocallabchromaskreti, + chromaskreti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskreti) { + if (listener) { + listener->panelChanged(Evlocallabgammaskreti, + gammaskreti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskreti) { + if (listener) { + listener->panelChanged(Evlocallabslomaskreti, + slomaskreti->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == cTtransshape) { + if (listener) { + listener->panelChanged(EvlocallabCTtransCurve, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == cTgainshape) { + if (listener) { + listener->panelChanged(EvlocallabCTgainCurve, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CCmaskretishape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskretishape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskretishape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskretishape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskretishape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskretishape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskretishape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskretishape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenareti, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenareti, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + str->setValue(defSpot.str); + loglin->set_active(defSpot.loglin); + + if (defSpot.retinexMethod == "low") { + retinexMethod->set_active(0); + } else if (defSpot.retinexMethod == "uni") { + retinexMethod->set_active(1); + } else { + retinexMethod->set_active(2); + } + + fftwreti->set_active(defSpot.fftwreti); + equilret->set_active(defSpot.equilret); + neigh->setValue(defSpot.neigh); + vart->setValue(defSpot.vart); + scalereti->setValue(defSpot.scalereti); + limd->setValue(defSpot.limd); + offs->setValue(defSpot.offs); + chrrt->setValue(defSpot.chrrt); + darkness->setValue(defSpot.darkness); + lightnessreti->setValue(defSpot.lightnessreti); + cliptm->setValue(defSpot.cliptm); + softradiusret->setValue(defSpot.softradiusret); + cTtransshape->setCurve(defSpot.localTtranscurve); + cTgainshape->setCurve(defSpot.localTgaincurve); + showmaskretiMethod->set_active(0); + enaretiMask->set_active(defSpot.enaretiMask); + enaretiMasktmap->set_active(defSpot.enaretiMasktmap); + CCmaskretishape->setCurve(defSpot.CCmaskreticurve); + LLmaskretishape->setCurve(defSpot.LLmaskreticurve); + HHmaskretishape->setCurve(defSpot.HHmaskreticurve); + blendmaskreti->setValue((double)defSpot.blendmaskreti); + radmaskreti->setValue(defSpot.radmaskreti); + lapmaskreti->setValue(defSpot.lapmaskreti); + chromaskreti->setValue(defSpot.chromaskreti); + gammaskreti->setValue(defSpot.gammaskreti); + slomaskreti->setValue(defSpot.slomaskreti); + Lmaskretishape->setCurve(defSpot.Lmaskreticurve); + inversret->set_active(defSpot.inversret); + recothresr->setValue(defSpot.recothresr); + lowthresr->setValue(defSpot.lowthresr); + higthresr->setValue(defSpot.higthresr); + decayr->setValue(defSpot.decayr); + + // Enable all listeners + enableListener(); + + // Update GUI based on converted widget parameters: + // - Update Retinex GUI according to scalereti adjuster value + updateRetinexGUI1(); + // - Update Retinex GUI according to inversret button state + updateRetinexGUI2(); + // - Update Retinex GUI according to str adjuster value + updateRetinexGUI3(); +} + +void LocallabRetinex::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + recothresr->setValue(defSpot.recothresr); + lowthresr->setValue(defSpot.lowthresr); + higthresr->setValue(defSpot.higthresr); + decayr->setValue(defSpot.decayr); + enableListener(); + +} + +void LocallabRetinex::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + retiFrame->hide(); + retitoolFrame->hide(); + exprecovr->hide(); + decayr->hide(); + maskusabler->hide(); + maskunusabler->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + retiFrame->hide(); + retitoolFrame->hide(); + // Specific Simple mode widgets are shown in Normal mode + exprecovr->hide(); + decayr->hide(); + maskusabler->hide(); + maskunusabler->hide(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + retiFrame->show(); + retitoolFrame->show(); + exprecovr->show(); + decayr->show(); + if (enaretiMask->get_active()) { + maskusabler->show(); + maskunusabler->hide(); + + } else { + maskusabler->hide(); + maskunusabler->show(); + } + } +} + +void LocallabRetinex::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskretishape->updateLocallabBackground(normChromar); + LLmaskretishape->updateLocallabBackground(normLumar); + HHmaskretishape->updateLocallabBackground(normHuer); + Lmaskretishape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + +void LocallabRetinex::loglinChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (loglin->get_active()) { + listener->panelChanged(Evlocallabloglin, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabloglin, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::retinexMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabretinexMethod, + retinexMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabRetinex::fftwretiChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (fftwreti->get_active()) { + listener->panelChanged(Evlocallabfftwreti, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabfftwreti, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::equilretChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (inversret->get_active()) { + listener->panelChanged(Evlocallabequilret, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabequilret, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::showmaskretiMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabRetinex::enaretiMaskChanged() +{ + if (enaretiMask->get_active()) { + maskusabler->show(); + maskunusabler->hide(); + + } else { + maskusabler->hide(); + maskunusabler->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enaretiMask->get_active()) { + listener->panelChanged(EvLocallabEnaretiMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaretiMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::enaretiMasktmapChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enaretiMasktmap->get_active()) { + listener->panelChanged(EvLocallabEnaretiMasktmap, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaretiMasktmap, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::inversretChanged() +{ + const bool maskPreviewActivated = isMaskViewActive(); + + // Update Retinex GUI according to inversret button state + updateRetinexGUI2(); + + if (maskPreviewActivated) { + // This event is called to transmit reset mask state + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (inversret->get_active()) { + listener->panelChanged(Evlocallabinversret, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinversret, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabRetinex::updateRetinexGUI1() +{ + // Update Retinex GUI according to scalereti adjuster value + if (scalereti->getValue() == 1) { + retinexMethod->hide(); + softradiusret->hide(); + LocalcurveEditortransT->hide(); + LocalcurveEditorgainT->hide(); + } else { + retinexMethod->show(); + softradiusret->show(); + LocalcurveEditortransT->show(); + LocalcurveEditorgainT->show(); + } +} + +void LocallabRetinex::updateRetinexGUI2() +{ + // Update Retinex GUI according to inversret button state + if (inversret->get_active()) { + expmaskreti->hide(); + showmaskretiMethodConn.block(true); + showmaskretiMethod->set_active(0); + showmaskretiMethodConn.block(false); + } else { + expmaskreti->show(); + } +} + +void LocallabRetinex::updateRetinexGUI3() +{ + if (str->getValue() >= 0.1f) { + retitoolFrame->show(); + } else { + retitoolFrame->hide(); + } +} + +/* ==== LocallabSharp ==== */ +LocallabSharp::LocallabSharp(): + LocallabTool(this, M("TP_LOCALLAB_SHARP_TOOLNAME"), M("TP_LOCALLAB_SHARP"), true), + + // Sharpening specific widgets + sharcontrast(Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 20))), + sharblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARBLUR"), 0.2, 2.0, 0.05, 0.2))), + shargam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMC"), 0.5, 3.0, 0.05, 1.))), + sharamount(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARAMOUNT"), 0, 100, 1, 100))), + shardamping(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARDAMPING"), 0, 100, 1, 0))), + shariter(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARITER"), 5, 100, 1, 30))), + sharradius(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHARRADIUS"), 0.4, 2.5, 0.01, 0.75))), + sensisha(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 40))), + inverssha(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_INVERS")))), + sharFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SHARFRAME")))), + showmasksharMethod(Gtk::manage(new MyComboBoxText())) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + // Parameter Sharpening specific widgets + sharcontrast->setAdjusterListener(this); + + sharradius->setAdjusterListener(this); + + sharamount->setAdjusterListener(this); + + shardamping->setAdjusterListener(this); + + shariter->setAdjusterListener(this); + + sharblur->setAdjusterListener(this); + + shargam->setAdjusterListener(this); + + sensisha->setAdjusterListener(this); + + inversshaConn = inverssha->signal_toggled().connect(sigc::mem_fun(*this, &LocallabSharp::inversshaChanged)); + + showmasksharMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmasksharMethod->append(M("TP_LOCALLAB_SHOWMODIF2")); + showmasksharMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmasksharMethod->set_active(0); + showmasksharMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmasksharMethodConn = showmasksharMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabSharp::showmasksharMethodChanged)); + + // Add Sharpening specific widgets to GUI + pack_start(*sensisha); + pack_start(*sharcontrast); + pack_start(*sharblur); + pack_start(*shargam); + pack_start(*sharradius); + pack_start(*sharamount); + pack_start(*shardamping); + pack_start(*shariter); +// pack_start(*sensisha); + pack_start(*inverssha); + sharFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const sharfBox = Gtk::manage(new ToolParamBlock()); + sharfBox->pack_start(*showmasksharMethod); + sharFrame->add(*sharfBox); + pack_start(*sharFrame); +} + +bool LocallabSharp::isMaskViewActive() +{ + return (showmasksharMethod->get_active_row_number() != 0); +} + +void LocallabSharp::resetMaskView() +{ + showmasksharMethodConn.block(true); + showmasksharMethod->set_active(0); + showmasksharMethodConn.block(false); +} + +void LocallabSharp::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + sharMask = showmasksharMethod->get_active_row_number(); +} + +void LocallabSharp::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_text(M("TP_LOCALLAB_EXPSHARP_TOOLTIP")); + sensisha->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + shargam->set_tooltip_text(M("TP_LOCALLAB_GAMCOL_TOOLTIP")); + + } else { + exp->set_tooltip_text(""); + sensisha->set_tooltip_text(""); + shargam->set_tooltip_text(""); + } +} + +void LocallabSharp::disableListener() +{ + LocallabTool::disableListener(); + + inversshaConn.block(true); + showmasksharMethodConn.block(true); +} + +void LocallabSharp::enableListener() +{ + LocallabTool::enableListener(); + + inversshaConn.block(false); + showmasksharMethodConn.block(false); +} + +void LocallabSharp::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visisharp); + exp->setEnabled(spot.expsharp); + complexity->set_active(spot.complexsharp); + + sharcontrast->setValue((double)spot.sharcontrast); + sharradius->setValue(spot.sharradius); + sharamount->setValue((double)spot.sharamount); + shardamping->setValue((double)spot.shardamping); + shariter->setValue((double)spot.shariter); + sharblur->setValue(spot.sharblur); + shargam->setValue(spot.shargam); + sensisha->setValue((double)spot.sensisha); + inverssha->set_active(spot.inverssha); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabSharp::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expsharp = exp->getEnabled(); + spot.visisharp = exp->get_visible(); + spot.complexsharp = complexity->get_active_row_number(); + + spot.sharcontrast = sharcontrast->getIntValue(); + spot.sharradius = sharradius->getValue(); + spot.sharamount = sharamount->getIntValue(); + spot.shardamping = shardamping->getIntValue(); + spot.shariter = shariter->getIntValue(); + spot.sharblur = sharblur->getValue(); + spot.shargam = shargam->getValue(); + spot.sensisha = sensisha->getIntValue(); + spot.inverssha = inverssha->get_active(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabSharp::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster widgets + sharcontrast->setDefault((double)defSpot.sharcontrast); + sharradius->setDefault(defSpot.sharradius); + sharamount->setDefault((double)defSpot.sharamount); + shardamping->setDefault((double)defSpot.shardamping); + shariter->setDefault((double)defSpot.shariter); + sharblur->setDefault(defSpot.sharblur); + shargam->setDefault(defSpot.shargam); + sensisha->setDefault((double)defSpot.sensisha); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabSharp::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == sharcontrast) { + if (listener) { + listener->panelChanged(Evlocallabsharcontrast, + sharcontrast->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sharradius) { + if (listener) { + listener->panelChanged(Evlocallabsharradius, + sharradius->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sharamount) { + if (listener) { + listener->panelChanged(Evlocallabsharamount, + sharamount->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shardamping) { + if (listener) { + listener->panelChanged(Evlocallabshardamping, + shardamping->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shariter) { + if (listener) { + listener->panelChanged(Evlocallabshariter, + shariter->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sharblur) { + if (listener) { + listener->panelChanged(Evlocallabsharblur, + sharblur->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shargam) { + if (listener) { + listener->panelChanged(Evlocallabshargam, + shargam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensisha) { + if (listener) { + listener->panelChanged(Evlocallabsensis, + sensisha->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabSharp::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenasharp, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenasharp, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabSharp::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + sharcontrast->setValue((double)defSpot.sharcontrast); + sharblur->setValue(defSpot.sharblur); + sharamount->setValue(defSpot.sharamount); + shardamping->setValue((double)defSpot.shardamping); + shariter->setValue((double)defSpot.shariter); + shargam->setValue(defSpot.shargam); + + // Enable all listeners + enableListener(); +} + +void LocallabSharp::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + showmasksharMethod->set_active(0); + + // Enable all listeners + enableListener(); + + // Update GUI based on converted widget parameters: +} + +void LocallabSharp::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + sharcontrast->hide(); + sharblur->hide(); + sharamount->hide(); + shardamping->hide(); + shariter->hide(); + sharFrame->hide(); + shargam->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + sharcontrast->hide(); + sharblur->hide(); + shargam->hide(); + sharamount->hide(); + shardamping->hide(); + shariter->hide(); + // Specific Simple mode widgets are shown in Normal mode + sharFrame->show(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + sharcontrast->show(); + sharblur->show(); + shargam->show(); + sharamount->show(); + shardamping->show(); + shariter->show(); + sharFrame->show(); + } +} + +void LocallabSharp::inversshaChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (inverssha->get_active()) { + listener->panelChanged(Evlocallabinverssha, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabinverssha, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabSharp::showmasksharMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +/* ==== LocallabContrast ==== */ +LocallabContrast::LocallabContrast(): + LocallabTool(this, M("TP_LOCALLAB_LC_TOOLNAME"), M("TP_LOCALLAB_LOC_CONTRAST"), true), + + // Local contrast specific widgets + localcontMethod(Gtk::manage(new MyComboBoxText())), + lcradius(Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 10, 100, 1, 80))), + lcamount(Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0, 1.0, 0.01, 0))), + lcdarkness(Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0, 3.0, 0.01, 1.0))), + lclightness(Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_LIGHTNESS"), 0, 3.0, 0.01, 1.0))), + contFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTWFRA")))), + sigmalc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + LocalcurveEditorwav(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAV"))), + wavshape(static_cast(LocalcurveEditorwav->addCurve(CT_Flat, "", nullptr, false, false))), + csThreshold(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLD"), 0, 9, 0, 0, 6, 6, 0, false))), + levelwav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LEVELWAV"), 1, 9, 1, 4))), + expresidpyr(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), + residcont(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCONT"), -100, 100, 1, 0))), + residchro(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCHRO"), -100., 100., 1., 0.))), + residsha(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDSHA"), -100., 100., 1., 0.))), + residshathr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDSHATHR"), 0., 100., 1., 30.))), + residhi(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDHI"), -100., 100., 1., 0.))), + residhithr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDHITHR"), 0., 100., 1., 70.))), + gamlc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMW"), 0.5, 3., 0.01, 1.))), + residgam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMSH"), 0.25, 15.0, 0.01, 2.4))), + residslop(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOSH"), 0.0, 500.0, 0.01, 12.92))), + sensilc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + reparw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + clariFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), + clarilres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARILRES"), -20., 100., 0.5, 0.))), + claricres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARICRES"), -20., 100., 0.5, 0.))), + clarisoft(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 1.))), + origlc(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ORIGLC")))), + expcontrastpyr(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), + wavgradl(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_GRALWFRA")))), + sigmalc2(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + strwav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -4.0, 4.0, 0.05, 0.))), + angwav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + wavedg(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EDGFRA")))), + strengthw(Gtk::manage(new Adjuster(M("TP_WAVELET_EDVAL"), 0., 100.0, 0.5, 0.))), + sigmaed(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + LocalcurveEditorwavedg(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVEDG"))), + wavshapeedg(static_cast(LocalcurveEditorwavedg->addCurve(CT_Flat, "", nullptr, false, false))), + gradw(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECT"), 0., 100.0, 0.5, 90.))), + waveshow(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_EDGSHOW")))), + edgsBoxshow(Gtk::manage(new ToolParamBlock())), + radiusw(Gtk::manage(new Adjuster(M("TP_WAVELET_EDRAD"), 5., 100.0, 0.5, 15.))), + detailw(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGTHRESH"), -50., 100.0, 1., 10.))), + localedgMethod(Gtk::manage(new MyComboBoxText())), + tloww(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR"), 0., 100.0, 1., 20.))), + thigw(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR2"), -10., 100.0, 1., 0.))), + edgw(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGESENSI"), 0., 100.0, 1., 60.))), + basew(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0., 100.0, 1., 10.))), + localneiMethod(Gtk::manage(new MyComboBoxText())), + wavblur(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_BLURLEVELFRA")))), + levelblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LEVELBLUR"), 0., 100., 0.5, 0.))), + sigmabl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + chromablu(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMABLU"), 0.0, 5., 0.1, 0.))), + LocalcurveEditorwavlev(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVLEV"))), + wavshapelev(static_cast(LocalcurveEditorwavlev->addCurve(CT_Flat, "", nullptr, false, false))), + residblur(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDBLUR"), 0., 100., 0.5, 0.))), + blurlc(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_BLURLC")))), + expcontrastpyr2(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), + wavcont(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_CONTFRA")))), + sigma(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + offset(Gtk::manage(new Adjuster(M("TP_LOCALLAB_OFFSETWAV"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + chromalev(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMALEV"), 0.1, 5., 0.1, 1.))), + LocalcurveEditorwavcon(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCON"))), + wavshapecon(static_cast(LocalcurveEditorwavcon->addCurve(CT_Flat, "", nullptr, false, false))), + wavcompre(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_COMPREFRA")))), + LocalcurveEditorwavcompre(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCOMPRE"))), + wavshapecompre(static_cast(LocalcurveEditorwavcompre->addCurve(CT_Flat, "", nullptr, false, false))), + sigmadr(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + threswav(Gtk::manage(new Adjuster(M("TP_LOCALLAB_THRESWAV"), 0.9, 2., 0.01, 1.4))), + residcomp(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RESIDCOMP"), -1., 1., 0.01, 0.))), + wavcomp(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_COMPFRA")))), + sigmadc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 3., 0.01, 1.))), + deltad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DELTAD"), -3., 3., 0.1, 0.))),//, Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + LocalcurveEditorwavcomp(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVCOMP"))), + wavshapecomp(static_cast(LocalcurveEditorwavcomp->addCurve(CT_Flat, "", nullptr, false, false))), + //fatres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_FATRES"), 0., 100., 1., 0.))), + fftwlc(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTW")))), + exprecovw(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablew(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablew(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothresw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthresw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthresw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decayw(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + + expmasklc(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWLC")))), + showmasklcMethod(Gtk::manage(new MyComboBoxText())), + enalcMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), +// masklcCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + masklcCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmasklcshape(static_cast(masklcCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmasklcshape(static_cast(masklcCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmasklcshape(static_cast(masklcCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmasklc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmasklc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromasklc(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + mask2lcCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmasklcshape(static_cast(mask2lcCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Local contrast specific widgets + localcontMethod->append(M("TP_LOCALLAB_LOCCONT")); + localcontMethod->append(M("TP_LOCALLAB_WAVE")); + localcontMethod->set_active(0); + localcontMethodConn = localcontMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabContrast::localcontMethodChanged)); + + lcradius->setAdjusterListener(this); + + lcamount->setAdjusterListener(this); + + lcdarkness->setAdjusterListener(this); + + lclightness->setAdjusterListener(this); + + contFrame->set_label_align(0.025, 0.5); + + sigmalc->setAdjusterListener(this); + + LocalcurveEditorwav->setCurveListener(this); + + wavshape->setIdentityValue(0.); + wavshape->setResetCurve(FlatCurveType(defSpot.locwavcurve.at(0)), defSpot.locwavcurve); +// wavshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + LocalcurveEditorwav->curveListComplete(); + + csThreshold->setAdjusterListener(this); + + levelwav->setAdjusterListener(this); + + Gtk::Box* const LresTitleHBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LresLabel = Gtk::manage(new Gtk::Label()); + LresLabel->set_markup(Glib::ustring("") + escapeHtmlChars(M("TP_LOCALLAB_LOC_RESIDPYR")) + Glib::ustring("")); + LresLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + LresTitleHBox->pack_start(*LresLabel, Gtk::PACK_EXPAND_WIDGET, 0); + expresidpyr->setLabel(LresTitleHBox); + setExpandAlignProperties(expresidpyr, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + residcont->setAdjusterListener(this); + + residchro->setAdjusterListener(this); + + residsha->setAdjusterListener(this); + + residshathr->setAdjusterListener(this); + + residhi->setAdjusterListener(this); + + residhithr->setAdjusterListener(this); + + gamlc->setAdjusterListener(this); + + + residgam->setAdjusterListener(this); + + residslop->setAdjusterListener(this); + residslop->setLogScale(16, 0); + + sensilc->setAdjusterListener(this); + + reparw->setAdjusterListener(this); + + clariFrame->set_label_align(0.025, 0.5); + + clarilres->setAdjusterListener(this); + + claricres->setAdjusterListener(this); + + clarisoft->setLogScale(10, 0); + clarisoft->setAdjusterListener(this); + + origlcConn = origlc->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::origlcChanged)); + + Gtk::Box *TittleVBox; + TittleVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBox->set_spacing(2); + + Gtk::Box* const LCTitleHBox = Gtk::manage(new Gtk::Box()); + Gtk::Box* const LCTitleHBox11 = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabel = Gtk::manage(new Gtk::Label()); + Gtk::Label* const LCLabel11 = Gtk::manage(new Gtk::Label()); + + LCLabel->set_markup(Glib::ustring("") + escapeHtmlChars(M("TP_LOCALLAB_LOC_CONTRASTPYR")) + Glib::ustring("")); + LCLabel11->set_markup(escapeHtmlChars(M("TP_LOCALLAB_LOC_CONTRASTPYRLAB"))); + LCLabel->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + LCLabel11->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + LCTitleHBox->pack_start(*LCLabel, Gtk::PACK_EXPAND_WIDGET, 0); + LCTitleHBox11->pack_start(*LCLabel11, Gtk::PACK_EXPAND_WIDGET, 0); + TittleVBox->pack_start(*LCTitleHBox, Gtk::PACK_SHRINK); + TittleVBox->pack_start(*LCTitleHBox11, Gtk::PACK_SHRINK); + expcontrastpyr->setLabel(TittleVBox); + setExpandAlignProperties(expcontrastpyr, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + + wavgradlConn = wavgradl->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavgradlChanged)); + + sigmalc2->setAdjusterListener(this); + + strwav->setAdjusterListener(this); + + angwav->setAdjusterListener(this); + + wavedgConn = wavedg->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavedgChanged)); + + strengthw->setAdjusterListener(this); + + sigmaed->setAdjusterListener(this); + + LocalcurveEditorwavedg->setCurveListener(this); + + wavshapeedg->setIdentityValue(0.); + wavshapeedg->setResetCurve(FlatCurveType(defSpot.locedgwavcurve.at(0)), defSpot.locedgwavcurve); +// wavshapeedg->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + LocalcurveEditorwavedg->curveListComplete(); + + gradw->setAdjusterListener(this); + + waveshowConn = waveshow->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::waveshowChanged)); + + radiusw->setAdjusterListener(this); + + detailw->setAdjusterListener(this); + + localedgMethod->append(M("TP_WAVELET_RE1")); + localedgMethod->append(M("TP_WAVELET_RE2")); + localedgMethod->append(M("TP_WAVELET_RE3")); + localedgMethod->set_active(0); + localedgMethodConn = localedgMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabContrast::localedgMethodChanged)); + + tloww->setAdjusterListener(this); + + thigw->setAdjusterListener(this); + + edgw->setAdjusterListener(this); + + basew->setAdjusterListener(this); + + localneiMethod->append(M("TP_WAVELET_NPNONE")); + localneiMethod->append(M("TP_WAVELET_NPLOW")); + localneiMethod->append(M("TP_WAVELET_NPHIGH")); + localneiMethod->set_active(0); + localneiMethodConn = localneiMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabContrast::localneiMethodChanged)); + + wavblurConn = wavblur->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavblurChanged)); + + levelblur->setAdjusterListener(this); + + sigmabl->setAdjusterListener(this); + + chromablu->setAdjusterListener(this); + + LocalcurveEditorwavlev->setCurveListener(this); + + wavshapelev->setIdentityValue(0.); + wavshapelev->setResetCurve(FlatCurveType(defSpot.loclevwavcurve.at(0)), defSpot.loclevwavcurve); + + LocalcurveEditorwavlev->curveListComplete(); + + residblur->setAdjusterListener(this); + + blurlcConn = blurlc->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::blurlcChanged)); + + Gtk::Box *TittleVBox2; + TittleVBox2 = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBox2->set_spacing(2); + + Gtk::Box* const LCTitleHBox2 = Gtk::manage(new Gtk::Box()); + Gtk::Box* const LCTitleHBox22 = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabel2 = Gtk::manage(new Gtk::Label()); + Gtk::Label* const LCLabel22 = Gtk::manage(new Gtk::Label()); + + LCLabel2->set_markup(Glib::ustring("") + escapeHtmlChars(M("TP_LOCALLAB_LOC_CONTRASTPYR2")) + Glib::ustring("")); + LCLabel22->set_markup(escapeHtmlChars(M("TP_LOCALLAB_LOC_CONTRASTPYR2LAB"))); + LCLabel2->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + LCLabel22->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + LCTitleHBox2->pack_start(*LCLabel2, Gtk::PACK_EXPAND_WIDGET, 0); + LCTitleHBox22->pack_start(*LCLabel22, Gtk::PACK_EXPAND_WIDGET, 0); + TittleVBox2->pack_start(*LCTitleHBox2, Gtk::PACK_SHRINK); + TittleVBox2->pack_start(*LCTitleHBox22, Gtk::PACK_SHRINK); + expcontrastpyr2->setLabel(TittleVBox2); + + setExpandAlignProperties(expcontrastpyr2, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + wavcontConn = wavcont->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavcontChanged)); + + sigma->setAdjusterListener(this); + + offset->setAdjusterListener(this); + + chromalev->setAdjusterListener(this); + + LocalcurveEditorwavcon->setCurveListener(this); + + wavshapecon->setIdentityValue(0.); + wavshapecon->setResetCurve(FlatCurveType(defSpot.locconwavcurve.at(0)), defSpot.locconwavcurve); + + LocalcurveEditorwavcon->curveListComplete(); + + wavcompreConn = wavcompre->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavcompreChanged)); + + LocalcurveEditorwavcompre->setCurveListener(this); + + wavshapecompre->setIdentityValue(0.); + wavshapecompre->setResetCurve(FlatCurveType(defSpot.loccomprewavcurve.at(0)), defSpot.loccomprewavcurve); + wavshapecompre->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + + LocalcurveEditorwavcompre->curveListComplete(); + + sigmadr->setAdjusterListener(this); + + threswav->setAdjusterListener(this); + + residcomp->setAdjusterListener(this); + + wavcompConn = wavcomp->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::wavcompChanged)); + + sigmadc->setAdjusterListener(this); + + deltad->setAdjusterListener(this); + + LocalcurveEditorwavcomp->setCurveListener(this); + + wavshapecomp->setIdentityValue(0.); + wavshapecomp->setResetCurve(FlatCurveType(defSpot.loccompwavcurve.at(0)), defSpot.loccompwavcurve); +// wavshapecomp->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + LocalcurveEditorwavcomp->curveListComplete(); + + //fatres->setAdjusterListener(this); + + fftwlcConn = fftwlc->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::fftwlcChanged)); + + recothresw->setAdjusterListener(this); + lowthresw->setAdjusterListener(this); + higthresw->setAdjusterListener(this); + decayw->setAdjusterListener(this); + setExpandAlignProperties(exprecovw, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + + setExpandAlignProperties(expmasklc, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmasklcMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmasklcMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmasklcMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmasklcMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmasklcMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmasklcMethod->set_active(0); + showmasklcMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmasklcMethodConn = showmasklcMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabContrast::showmasklcMethodChanged)); + + enalcMaskConn = enalcMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabContrast::enalcMaskChanged)); + + masklcCurveEditorG->setCurveListener(this); + + CCmasklcshape->setIdentityValue(0.); + CCmasklcshape->setResetCurve(FlatCurveType(defSpot.CCmasklccurve.at(0)), defSpot.CCmasklccurve); + CCmasklcshape->setBottomBarColorProvider(this, 1); + + LLmasklcshape->setIdentityValue(0.); + LLmasklcshape->setResetCurve(FlatCurveType(defSpot.LLmasklccurve.at(0)), defSpot.LLmasklccurve); +// LLmasklcshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmasklcshape->setIdentityValue(0.); + HHmasklcshape->setResetCurve(FlatCurveType(defSpot.HHmasklccurve.at(0)), defSpot.HHmasklccurve); + HHmasklcshape->setCurveColorProvider(this, 2); + HHmasklcshape->setBottomBarColorProvider(this, 2); + + masklcCurveEditorG->curveListComplete(); + + blendmasklc->setAdjusterListener(this); + + radmasklc->setAdjusterListener(this); + + chromasklc->setAdjusterListener(this); + + mask2lcCurveEditorG->setCurveListener(this); + + Lmasklcshape->setResetCurve(DiagonalCurveType(defSpot.Lmasklccurve.at(0)), defSpot.Lmasklccurve); + Lmasklcshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmasklcshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2lcCurveEditorG->curveListComplete(); + + // Add Local contrast specific widgets to GUI + pack_start(*sensilc); + pack_start(*reparw); + pack_start(*localcontMethod); + pack_start(*lcradius); + pack_start(*lcamount); + pack_start(*lcdarkness); + pack_start(*lclightness); + pack_start(*csThreshold); + ToolParamBlock* const coBox = Gtk::manage(new ToolParamBlock()); + coBox->pack_start(*sigmalc); + coBox->pack_start(*LocalcurveEditorwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + // coBox->pack_start(*csThreshold); + contFrame->add(*coBox); + pack_start(*contFrame); + // pack_start(*levelwav); + ToolParamBlock* const resiBox = Gtk::manage(new ToolParamBlock()); + resiBox->pack_start(*residcont); + resiBox->pack_start(*residchro); + Gtk::Frame* const shresFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SHRESFRA"))); + shresFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const shresBox = Gtk::manage(new ToolParamBlock()); + Gtk::Separator* const separatorsh = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + shresBox->pack_start(*residsha); + shresBox->pack_start(*residshathr); + shresBox->pack_start(*residhi); + shresBox->pack_start(*residhithr); + shresBox->pack_start(*separatorsh); + shresBox->pack_start(*residgam); + shresBox->pack_start(*residslop); + shresFrame->add(*shresBox); + resiBox->pack_start(*shresFrame); + expresidpyr->add(*resiBox, false); + pack_start(*expresidpyr); +// pack_start(*sensilc); + Gtk::Separator* const separatorcontr = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + pack_start(*separatorcontr); + ToolParamBlock* const clariBox = Gtk::manage(new ToolParamBlock()); + clariBox->pack_start(*clarilres); + clariBox->pack_start(*claricres); + clariBox->pack_start(*clarisoft); + clariBox->pack_start(*origlc); + clariFrame->add(*clariBox); + pack_start(*clariFrame); + ToolParamBlock* const blurcontBox = Gtk::manage(new ToolParamBlock()); + Gtk::Frame* const gradwavFrame = Gtk::manage(new Gtk::Frame()); + gradwavFrame->set_label_align(0.025, 0.5); + gradwavFrame->set_label_widget(*wavgradl); + ToolParamBlock* const gradwavBox = Gtk::manage(new ToolParamBlock()); + gradwavBox->pack_start(*sigmalc2); + gradwavBox->pack_start(*strwav); + gradwavBox->pack_start(*angwav); + gradwavFrame->add(*gradwavBox); + blurcontBox->pack_start(*gradwavFrame); + Gtk::Frame* const edgFrame = Gtk::manage(new Gtk::Frame()); + edgFrame->set_label_align(0.025, 0.5); + edgFrame->set_label_widget(*wavedg); + ToolParamBlock* const edgsBox = Gtk::manage(new ToolParamBlock()); + edgsBox->pack_start(*strengthw); + edgsBox->pack_start(*sigmaed); + edgsBox->pack_start(*LocalcurveEditorwavedg, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + edgsBox->pack_start(*gradw); + edgsBox->pack_start(*waveshow); + edgsBoxshow->pack_start(*radiusw); + edgsBoxshow->pack_start(*detailw); + Gtk::Box* const edbox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const labmedgr = Gtk::manage(new Gtk::Label(M("TP_WAVELET_MEDGREINF") + ":")); + edbox->pack_start(*labmedgr, Gtk::PACK_SHRINK, 1); + edbox->pack_start(*localedgMethod); + edgsBoxshow->pack_start(*edbox); + Gtk::Separator* const separatoredg2 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + edgsBoxshow->pack_start(*separatoredg2); + edgsBoxshow->pack_start(*tloww); + edgsBoxshow->pack_start(*thigw); + Gtk::Separator* const separatoredg = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + edgsBoxshow->pack_start(*separatoredg); + edgsBoxshow->pack_start(*edgw); + edgsBoxshow->pack_start(*basew); + Gtk::Box* const ctboxNP = Gtk::manage(new Gtk::Box()); + Gtk::Label* const labmNP = Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":")); + ctboxNP->pack_start(*labmNP, Gtk::PACK_SHRINK, 1); + ctboxNP->pack_start(*localneiMethod); + edgsBoxshow->pack_start(*ctboxNP); + edgsBox->pack_start(*edgsBoxshow); + edgFrame->add(*edgsBox); + blurcontBox->pack_start(*edgFrame); + Gtk::Frame* const blurlevelFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_BLURLEVELFRA"))); + blurlevelFrame->set_label_align(0.025, 0.5); + blurlevelFrame->set_label_widget(*wavblur); + Gtk::Box* const blurlevcontBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + blurlevcontBox->set_spacing(2); + blurlevcontBox->pack_start(*levelblur); + blurlevcontBox->pack_start(*sigmabl); + blurlevcontBox->pack_start(*chromablu); + blurlevcontBox->pack_start(*LocalcurveEditorwavlev, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + Gtk::Separator* const separatorblu = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + blurlevcontBox->pack_start(*separatorblu); + blurlevcontBox->pack_start(*residblur); + blurlevcontBox->pack_start(*blurlc); + blurlevelFrame->add(*blurlevcontBox); + blurcontBox->pack_start(*blurlevelFrame); + expcontrastpyr->add(*blurcontBox, false); + pack_start(*gamlc); + pack_start(*expcontrastpyr); + ToolParamBlock* const blurcontBox2 = Gtk::manage(new ToolParamBlock()); + Gtk::Frame* const contFrame2 = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTFRA"))); + contFrame2->set_label_align(0.025, 0.5); + contFrame2->set_label_widget(*wavcont); + Gtk::Box* const contlevBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + contlevBox->set_spacing(2); + contlevBox->pack_start(*sigma); + contlevBox->pack_start(*offset); + contlevBox->pack_start(*chromalev); + contlevBox->pack_start(*LocalcurveEditorwavcon, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + contFrame2->add(*contlevBox); + blurcontBox2->pack_start(*contFrame2); + Gtk::Frame* const compreFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COMPREFRA"))); + compreFrame->set_label_align(0.025, 0.5); + compreFrame->set_label_widget(*wavcompre); + Gtk::Box* const compreBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + compreBox->set_spacing(2); + compreBox->pack_start(*LocalcurveEditorwavcompre, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + compreBox->pack_start(*sigmadr); + compreBox->pack_start(*threswav); + compreBox->pack_start(*residcomp); + compreFrame->add(*compreBox); + blurcontBox2->pack_start(*compreFrame); + Gtk::Frame* const compFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_COMPFRA"))); + compFrame->set_label_align(0.025, 0.5); + compFrame->set_label_widget(*wavcomp); + Gtk::Box* const compBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + compBox->set_spacing(2); + compBox->pack_start(*sigmadc); + compBox->pack_start(*deltad); + compBox->pack_start(*LocalcurveEditorwavcomp, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + // Gtk::Separator* const separatorcomp = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + // compBox->pack_start(*separatorcomp); + // compBox->pack_start(*fatres); + compFrame->add(*compBox); + blurcontBox2->pack_start(*compFrame); + expcontrastpyr2->add(*blurcontBox2, false); + pack_start(*expcontrastpyr2); + pack_start(*fftwlc); + ToolParamBlock* const wwBox3 = Gtk::manage(new ToolParamBlock()); + wwBox3->pack_start(*maskusablew, Gtk::PACK_SHRINK, 0); + wwBox3->pack_start(*maskunusablew, Gtk::PACK_SHRINK, 0); + wwBox3->pack_start(*recothresw); + wwBox3->pack_start(*lowthresw); + wwBox3->pack_start(*higthresw); + wwBox3->pack_start(*decayw); + // colBox3->pack_start(*invmaskc); + exprecovw->add(*wwBox3, false); + pack_start(*exprecovw, false, false); + + ToolParamBlock* const masklcBox = Gtk::manage(new ToolParamBlock()); + masklcBox->pack_start(*showmasklcMethod, Gtk::PACK_SHRINK, 4); + masklcBox->pack_start(*enalcMask, Gtk::PACK_SHRINK, 0); + masklcBox->pack_start(*masklcCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + masklcBox->pack_start(*blendmasklc, Gtk::PACK_SHRINK, 0); + masklcBox->pack_start(*radmasklc, Gtk::PACK_SHRINK, 0); + masklcBox->pack_start(*chromasklc, Gtk::PACK_SHRINK, 0); + masklcBox->pack_start(*mask2lcCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmasklc->add(*masklcBox, false); + pack_start(*expmasklc, false, false); +} + +LocallabContrast::~LocallabContrast() +{ + delete LocalcurveEditorwav; + delete LocalcurveEditorwavedg; + delete LocalcurveEditorwavlev; + delete LocalcurveEditorwavcon; + delete LocalcurveEditorwavcompre; + delete LocalcurveEditorwavcomp; + delete masklcCurveEditorG; + delete mask2lcCurveEditorG; +} + +bool LocallabContrast::isMaskViewActive() +{ + return (showmasklcMethod->get_active_row_number() != 0); +} + +void LocallabContrast::resetMaskView() +{ + showmasklcMethodConn.block(true); + showmasklcMethod->set_active(0); + showmasklcMethodConn.block(false); +} + +void LocallabContrast::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + lcMask = showmasklcMethod->get_active_row_number(); +} + +void LocallabContrast::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + contFrame->set_tooltip_text(M("TP_LOCALLAB_EXPCONTRAST_TOOLTIP")); + recothresw->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + LocalcurveEditorwav->set_tooltip_markup(M("TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP")); + csThreshold->set_tooltip_markup(M("TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP")); + levelwav->set_tooltip_markup(M("TP_LOCALLAB_LEVELWAV_TOOLTIP")); + clariFrame->set_tooltip_markup(M("TP_LOCALLAB_CLARI_TOOLTIP")); + clarisoft->set_tooltip_markup(M("TP_LOCALLAB_CLARISOFT_TOOLTIP")); + exprecovw->set_tooltip_markup(M("TP_LOCALLAB_MASKRESWAV_TOOLTIP")); + gamlc->set_tooltip_text(M("TP_LOCALLAB_GAMC_TOOLTIP")); + wavshape->setTooltip(M("TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP")); + clarilres->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIL_TOOLTIP")); + claricres->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIC_TOOLTIP")); + sigmalc->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmalc2->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmaed->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmabl->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigma->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmadc->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + sigmadr->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + origlc->set_tooltip_text(M("TP_LOCALLAB_WAT_ORIGLC_TOOLTIP")); + strwav->set_tooltip_text(M("TP_LOCALLAB_WAT_STRWAV_TOOLTIP")); + angwav->set_tooltip_text(M("TP_LOCALLAB_WAT_STRWAV_TOOLTIP")); + strengthw->set_tooltip_text(M("TP_LOCALLAB_WAT_STRENGTHW_TOOLTIP")); + LocalcurveEditorwavedg->set_tooltip_markup(M("TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP")); + wavshapeedg->setTooltip(M("TP_LOCALLAB_WAT_LOCCONTRASTEDG_TOOLTIP")); + gradw->set_tooltip_text(M("TP_LOCALLAB_WAT_GRADW_TOOLTIP")); + waveshow->set_tooltip_text(M("TP_LOCALLAB_WAT_WAVESHOW_TOOLTIP")); + LocalcurveEditorwavlev->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP")); + wavshapelev->setTooltip(M("TP_LOCALLAB_WAT_WAVBLURCURV_TOOLTIP")); + levelblur->set_tooltip_text(M("TP_LOCALLAB_WAT_WAVLEVELBLUR_TOOLTIP")); + residblur->set_tooltip_text(M("TP_LOCALLAB_WAT_RESIDBLUR_TOOLTIP")); + blurlc->set_tooltip_text(M("TP_LOCALLAB_WAT_BLURLC_TOOLTIP")); + offset->set_tooltip_text(M("TP_LOCALLAB_WAT_CONTOFFSET_TOOLTIP")); + chromalev->set_tooltip_text(M("TP_LOCALLAB_WAT_CONTCHROMALEV_TOOLTIP")); + LocalcurveEditorwavcon->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP")); + wavshapecon->setTooltip(M("TP_LOCALLAB_WAT_WAVCBDL_TOOLTIP")); + LocalcurveEditorwavcompre->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVTM_TOOLTIP")); + wavshapecompre->setTooltip(M("TP_LOCALLAB_WAT_WAVTM_TOOLTIP")); + deltad->set_tooltip_text(M("TP_LOCALLAB_WAT_DELTABAL_TOOLTIP")); + LocalcurveEditorwavcomp->set_tooltip_markup(M("TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP")); + wavshapecomp->setTooltip(M("TP_LOCALLAB_WAT_WAVDELTABAL_TOOLTIP")); + threswav->set_tooltip_text(M("TP_LOCALLAB_WAT_BALTHRES_TOOLTIP")); + residcomp->set_tooltip_text(M("TP_LOCALLAB_WAT_RESIDCOMP_TOOLTIP")); + + + expresidpyr->set_tooltip_text(M("TP_LOCALLAB_WAT_EXPRESID_TOOLTIP")); + expcontrastpyr->set_tooltip_text(M("TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP")); + wavgradl->set_tooltip_text(M("TP_LOCALLAB_WAVGRAD_TOOLTIP")); + wavedg->set_tooltip_text(M("TP_LOCALLAB_WAVEEDG_TOOLTIP")); + wavblur->set_tooltip_text(M("TP_LOCALLAB_WAVBLUR_TOOLTIP")); + chromablu->set_tooltip_text(M("TP_LOCALLAB_CHROMABLU_TOOLTIP")); + expcontrastpyr2->set_tooltip_text(M("TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP")); + wavcont->set_tooltip_text(M("TP_LOCALLAB_WAVCONTF_TOOLTIP")); + chromalev->set_tooltip_text(M("TP_LOCALLAB_CHROMABLU_TOOLTIP")); + wavcompre->set_tooltip_text(M("TP_LOCALLAB_WAVCOMPRE_TOOLTIP")); + wavcomp->set_tooltip_text(M("TP_LOCALLAB_WAVCOMP_TOOLTIP")); + fftwlc->set_tooltip_text(M("TP_LOCALLAB_LC_FFTW_TOOLTIP")); + expmasklc->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + CCmasklcshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmasklcshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmasklcshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmasklc->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + mask2lcCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmasklcshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + masklcCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + chromasklc->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + sensilc->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + reparw->set_tooltip_text(M("TP_LOCALLAB_REPARW_TOOLTIP")); + decayw->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthresw->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESWAV_TOOLTIP")); + higthresw->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESWAV_TOOLTIP")); + } else { + contFrame->set_tooltip_text(""); + recothresw->set_tooltip_text(""); + LocalcurveEditorwav->set_tooltip_markup(""); + csThreshold->set_tooltip_markup(""); + expresidpyr->set_tooltip_text(""); + levelwav->set_tooltip_markup(""); + clariFrame->set_tooltip_markup(""); + clarisoft->set_tooltip_markup(""); + expcontrastpyr->set_tooltip_text(""); + wavgradl->set_tooltip_text(""); + wavedg->set_tooltip_text(""); + wavblur->set_tooltip_text(""); + chromablu->set_tooltip_text(""); + expcontrastpyr2->set_tooltip_text(""); + wavcont->set_tooltip_text(""); + chromalev->set_tooltip_text(""); + wavcompre->set_tooltip_text(""); + wavcomp->set_tooltip_text(""); + fftwlc->set_tooltip_text(""); + expmasklc->set_tooltip_markup(""); + CCmasklcshape->setTooltip(""); + LLmasklcshape->setTooltip(""); + HHmasklcshape->setTooltip(""); + blendmasklc->set_tooltip_text(""); + mask2lcCurveEditorG->set_tooltip_text(""); + Lmasklcshape->setTooltip(""); + masklcCurveEditorG->set_tooltip_markup(""); + chromasklc->set_tooltip_text(""); + sensilc->set_tooltip_text(""); + reparw->set_tooltip_text(""); + gamlc->set_tooltip_text(""); + + wavshape->setTooltip(""); + clarilres->set_tooltip_text(""); + claricres->set_tooltip_text(""); + sigmalc->set_tooltip_text(""); + sigmalc2->set_tooltip_text(""); + sigmaed->set_tooltip_text(""); + sigmabl->set_tooltip_text(""); + sigma->set_tooltip_text(""); + sigmadc->set_tooltip_text(""); + sigmadr->set_tooltip_text(""); + origlc->set_tooltip_text(""); + strwav->set_tooltip_text(""); + angwav->set_tooltip_text(""); + strengthw->set_tooltip_text(""); + LocalcurveEditorwavedg->set_tooltip_markup(""); + wavshapeedg->setTooltip(""); + gradw->set_tooltip_text(""); + waveshow->set_tooltip_text(""); + LocalcurveEditorwavlev->set_tooltip_markup(""); + wavshapelev->setTooltip(""); + residblur->set_tooltip_text(""); + blurlc->set_tooltip_text(""); + levelblur->set_tooltip_text(""); + offset->set_tooltip_text(""); + chromalev->set_tooltip_text(""); + LocalcurveEditorwavcon->set_tooltip_markup(""); + wavshapecon->setTooltip(""); + LocalcurveEditorwavcompre->set_tooltip_markup(""); + wavshapecompre->setTooltip(""); + deltad->set_tooltip_text(""); + LocalcurveEditorwavcomp->set_tooltip_markup(""); + wavshapecomp->setTooltip(""); + threswav->set_tooltip_text(""); + residcomp->set_tooltip_text(""); + exprecovw->set_tooltip_markup(""); + decayw->set_tooltip_text(""); + lowthresw->set_tooltip_text(""); + higthresw->set_tooltip_text(""); + + } +} + +void LocallabContrast::setDefaultExpanderVisibility() +{ + expresidpyr->set_expanded(false); + expcontrastpyr->set_expanded(false); + expcontrastpyr2->set_expanded(false); + expmasklc->set_expanded(false); + exprecovw->set_expanded(false); +} + +void LocallabContrast::disableListener() +{ + LocallabTool::disableListener(); + + localcontMethodConn.block(true); + origlcConn.block(true); + wavgradlConn.block(true); + wavedgConn.block(true); + localedgMethodConn.block(true); + waveshowConn.block(true); + localneiMethodConn.block(true); + wavblurConn.block(true); + blurlcConn.block(true); + wavcontConn.block(true); + wavcompreConn.block(true); + wavcompConn.block(true); + fftwlcConn.block(true); + showmasklcMethodConn.block(true); + enalcMaskConn.block(true); +} + +void LocallabContrast::enableListener() +{ + LocallabTool::enableListener(); + + localcontMethodConn.block(false); + origlcConn.block(false); + wavgradlConn.block(false); + wavedgConn.block(false); + localedgMethodConn.block(false); + waveshowConn.block(false); + localneiMethodConn.block(false); + wavblurConn.block(false); + blurlcConn.block(false); + wavcontConn.block(false); + wavcompreConn.block(false); + wavcompConn.block(false); + fftwlcConn.block(false); + showmasklcMethodConn.block(false); + enalcMaskConn.block(false); +} + +void LocallabContrast::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visicontrast); + exp->setEnabled(spot.expcontrast); + complexity->set_active(spot.complexcontrast); + + if (spot.localcontMethod == "loc") { + localcontMethod->set_active(0); + } else if (spot.localcontMethod == "wav") { + localcontMethod->set_active(1); + } + + fftwlc->set_active(spot.fftwlc); + // Update Local contrast GUI according to fftwlc button state + // Note: Contrary to the others, shall be called before setting lcradius value + updateContrastGUI3(); + lcradius->setValue((double)spot.lcradius); + lcamount->setValue(spot.lcamount); + lcdarkness->setValue(spot.lcdarkness); + lclightness->setValue(spot.lclightness); + sigmalc->setValue(spot.sigmalc); + wavshape->setCurve(spot.locwavcurve); + csThreshold->setValue(spot.csthreshold); + levelwav->setValue((double)spot.levelwav); + residcont->setValue(spot.residcont); + residchro->setValue(spot.residchro); + residsha->setValue(spot.residsha); + residshathr->setValue(spot.residshathr); + residhi->setValue(spot.residhi); + residhithr->setValue(spot.residhithr); + gamlc->setValue((double)spot.gamlc); + residgam->setValue(spot.residgam); + residslop->setValue(spot.residslop); + sensilc->setValue((double)spot.sensilc); + reparw->setValue(spot.reparw); + clarilres->setValue(spot.clarilres); + claricres->setValue(spot.claricres); + clarisoft->setValue(spot.clarisoft); + origlc->set_active(spot.origlc); + wavgradl->set_active(spot.wavgradl); + sigmalc2->setValue(spot.sigmalc2); + strwav->setValue(spot.strwav); + angwav->setValue(spot.angwav); + wavedg->set_active(spot.wavedg); + strengthw->setValue(spot.strengthw); + sigmaed->setValue(spot.sigmaed); + wavshapeedg->setCurve(spot.locedgwavcurve); + gradw->setValue(spot.gradw); + waveshow->set_active(spot.waveshow); + radiusw->setValue(spot.radiusw); + detailw->setValue(spot.detailw); + + if (spot.localedgMethod == "fir") { + localedgMethod->set_active(0); + } else if (spot.localedgMethod == "sec") { + localedgMethod->set_active(1); + } else if (spot.localedgMethod == "thr") { + localedgMethod->set_active(2); + } + + tloww->setValue(spot.tloww); + thigw->setValue(spot.thigw); + edgw->setValue(spot.edgw); + basew->setValue(spot.basew); + + if (spot.localneiMethod == "none") { + localneiMethod->set_active(0); + } else if (spot.localneiMethod == "low") { + localneiMethod->set_active(1); + } else if (spot.localneiMethod == "high") { + localneiMethod->set_active(2); + } + + wavblur->set_active(spot.wavblur); + levelblur->setValue(spot.levelblur); + sigmabl->setValue(spot.sigmabl); + chromablu->setValue(spot.chromablu); + wavshapelev->setCurve(spot.loclevwavcurve); + residblur->setValue(spot.residblur); + blurlc->set_active(spot.blurlc); + wavcont->set_active(spot.wavcont); + sigma->setValue(spot.sigma); + offset->setValue(spot.offset); + chromalev->setValue(spot.chromalev); + wavshapecon->setCurve(spot.locconwavcurve); + wavcompre->set_active(spot.wavcompre); + wavshapecompre->setCurve(spot.loccomprewavcurve); + sigmadr->setValue(spot.sigmadr); + threswav->setValue(spot.threswav); + residcomp->setValue(spot.residcomp); + wavcomp->set_active(spot.wavcomp); + sigmadc->setValue(spot.sigmadc); + deltad->setValue(spot.deltad); + wavshapecomp->setCurve(spot.loccompwavcurve); + //fatres->setValue(spot.fatres); + enalcMask->set_active(spot.enalcMask); + CCmasklcshape->setCurve(spot.CCmasklccurve); + LLmasklcshape->setCurve(spot.LLmasklccurve); + HHmasklcshape->setCurve(spot.HHmasklccurve); + blendmasklc->setValue((double)spot.blendmasklc); + radmasklc->setValue(spot.radmasklc); + chromasklc->setValue(spot.chromasklc); + Lmasklcshape->setCurve(spot.Lmasklccurve); + recothresw->setValue((double)spot.recothresw); + lowthresw->setValue((double)spot.lowthresw); + higthresw->setValue((double)spot.higthresw); + decayw->setValue((double)spot.decayw); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update Local contrast GUI according to localcontMethod combobox value + updateContrastGUI1(); + + // Update Local contrast GUI according to waveshow button state + updateContrastGUI2(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabContrast::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expcontrast = exp->getEnabled(); + spot.visicontrast = exp->get_visible(); + spot.complexcontrast = complexity->get_active_row_number(); + + if (localcontMethod->get_active_row_number() == 0) { + spot.localcontMethod = "loc"; + } else if (localcontMethod->get_active_row_number() == 1) { + spot.localcontMethod = "wav"; + } + + spot.lcradius = lcradius->getIntValue(); + spot.lcamount = lcamount->getValue(); + spot.lcdarkness = lcdarkness->getValue(); + spot.lclightness = lclightness->getValue(); + spot.sigmalc = sigmalc->getValue(); + spot.locwavcurve = wavshape->getCurve(); + spot.csthreshold = csThreshold->getValue(); + spot.levelwav = levelwav->getIntValue(); + spot.residcont = residcont->getValue(); + spot.residchro = residchro->getValue(); + spot.residsha = residsha->getValue(); + spot.residshathr = residshathr->getValue(); + spot.residhi = residhi->getValue(); + spot.residhithr = residhithr->getValue(); + spot.gamlc = gamlc->getValue(); + spot.residgam = residgam->getValue(); + spot.residslop = residslop->getValue(); + spot.sensilc = sensilc->getIntValue(); + spot.reparw = reparw->getValue(); + spot.clarilres = clarilres->getValue(); + spot.claricres = claricres->getValue(); + spot.clarisoft = clarisoft->getValue(); + spot.origlc = origlc->get_active(); + spot.wavgradl = wavgradl->get_active(); + spot.sigmalc2 = sigmalc2->getValue(); + spot.strwav = strwav->getValue(); + spot.angwav = angwav->getValue(); + spot.wavedg = wavedg->get_active(); + spot.strengthw = strengthw->getValue(); + spot.sigmaed = sigmaed->getValue(); + spot.locedgwavcurve = wavshapeedg->getCurve(); + spot.gradw = gradw->getValue(); + spot.waveshow = waveshow->get_active(); + spot.radiusw = radiusw->getValue(); + spot.detailw = detailw->getValue(); + + if (localedgMethod->get_active_row_number() == 0) { + spot.localedgMethod = "fir"; + } else if (localedgMethod->get_active_row_number() == 1) { + spot.localedgMethod = "sec"; + } else if (localedgMethod->get_active_row_number() == 2) { + spot.localedgMethod = "thr"; + } + + spot.tloww = tloww->getValue(); + spot.thigw = thigw->getValue(); + spot.edgw = edgw->getValue(); + spot.basew = basew->getValue(); + + if (localneiMethod->get_active_row_number() == 0) { + spot.localneiMethod = "none"; + } else if (localneiMethod->get_active_row_number() == 1) { + spot.localneiMethod = "low"; + } else if (localneiMethod->get_active_row_number() == 2) { + spot.localneiMethod = "high"; + } + + spot.wavblur = wavblur->get_active(); + spot.levelblur = levelblur->getValue(); + spot.sigmabl = sigmabl->getValue(); + spot.chromablu = chromablu->getValue(); + spot.loclevwavcurve = wavshapelev->getCurve(); + spot.residblur = residblur->getValue(); + spot.blurlc = blurlc->get_active(); + spot.wavcont = wavcont->get_active(); + spot.sigma = sigma->getValue(); + spot.offset = offset->getValue(); + spot.chromalev = chromalev->getValue(); + spot.locconwavcurve = wavshapecon->getCurve(); + spot.wavcompre = wavcompre->get_active(); + spot.loccomprewavcurve = wavshapecompre->getCurve(); + spot.sigmadr = sigmadr->getValue(); + spot.threswav = threswav->getValue(); + spot.residcomp = residcomp->getValue(); + spot.wavcomp = wavcomp->get_active(); + spot.sigmadc = sigmadc->getValue(); + spot.deltad = deltad->getValue(); + spot.loccompwavcurve = wavshapecomp->getCurve(); + //spot.fatres = fatres->getValue(); + spot.fftwlc = fftwlc->get_active(); + spot.enalcMask = enalcMask->get_active(); + spot.CCmasklccurve = CCmasklcshape->getCurve(); + spot.LLmasklccurve = LLmasklcshape->getCurve(); + spot.HHmasklccurve = HHmasklcshape->getCurve(); + spot.blendmasklc = blendmasklc->getIntValue(); + spot.radmasklc = radmasklc->getValue(); + spot.chromasklc = chromasklc->getValue(); + spot.Lmasklccurve = Lmasklcshape->getCurve(); + spot.recothresw = recothresw->getValue(); + spot.lowthresw = lowthresw->getValue(); + spot.higthresw = higthresw->getValue(); + spot.decayw = decayw->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabContrast::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster and threshold adjuster widgets + lcradius->setDefault((double)defSpot.lcradius); + lcamount->setDefault(defSpot.lcamount); + lcdarkness->setDefault(defSpot.lcdarkness); + lclightness->setDefault(defSpot.lclightness); + sigmalc->setDefault(defSpot.sigmalc); + levelwav->setDefault((double)defSpot.levelwav); + csThreshold->setDefault(defSpot.csthreshold); + residcont->setDefault(defSpot.residcont); + residchro->setDefault(defSpot.residchro); + residsha->setDefault(defSpot.residsha); + residshathr->setDefault(defSpot.residshathr); + residhi->setDefault(defSpot.residhi); + residhithr->setDefault(defSpot.residhithr); + gamlc->setDefault((double)defSpot.gamlc); + residgam->setDefault(defSpot.residgam); + residslop->setDefault(defSpot.residslop); + sensilc->setDefault((double)defSpot.sensilc); + reparw->setDefault(defSpot.reparw); + clarilres->setDefault(defSpot.clarilres); + claricres->setDefault(defSpot.claricres); + clarisoft->setDefault(defSpot.clarisoft); + sigmalc2->setDefault(defSpot.sigmalc2); + strwav->setDefault(defSpot.strwav); + angwav->setDefault(defSpot.angwav); + strengthw->setDefault(defSpot.strengthw); + sigmaed->setDefault(defSpot.sigmaed); + gradw->setDefault(defSpot.gradw); + radiusw->setDefault(defSpot.radiusw); + detailw->setDefault(defSpot.detailw); + tloww->setDefault(defSpot.tloww); + thigw->setDefault(defSpot.thigw); + edgw->setDefault(defSpot.edgw); + basew->setDefault(defSpot.basew); + levelblur->setDefault(defSpot.levelblur); + sigmabl->setDefault(defSpot.sigmabl); + chromablu->setDefault(defSpot.chromablu); + residblur->setDefault(defSpot.residblur); + sigma->setDefault(defSpot.sigma); + offset->setDefault(defSpot.offset); + chromalev->setDefault(defSpot.chromalev); + sigmadr->setDefault(defSpot.sigmadr); + threswav->setDefault(defSpot.threswav); + residcomp->setDefault(defSpot.residcomp); + sigmadc->setDefault(defSpot.sigmadc); + deltad->setDefault(defSpot.deltad); + //fatres->setDefault(defSpot.fatres); + blendmasklc->setDefault((double)defSpot.blendmasklc); + radmasklc->setDefault(defSpot.radmasklc); + chromasklc->setDefault(defSpot.chromasklc); + recothresw->setDefault((double)defSpot.recothresw); + lowthresw->setDefault((double)defSpot.lowthresw); + higthresw->setDefault((double)defSpot.higthresw); + decayw->setDefault((double)defSpot.decayw); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabContrast::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == lcradius) { + if (listener) { + listener->panelChanged(Evlocallablcradius, + lcradius->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lcamount) { + if (listener) { + listener->panelChanged(Evlocallablcamount, + lcamount->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lcdarkness) { + if (listener) { + listener->panelChanged(Evlocallablcdarkness, + lcdarkness->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lclightness) { + if (listener) { + listener->panelChanged(Evlocallablclightness, + lclightness->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sigmalc) { + if (listener) { + listener->panelChanged(Evlocallabsigmalc, + sigmalc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == levelwav) { + if (listener) { + listener->panelChanged(Evlocallablevelwav, + levelwav->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residcont) { + if (listener) { + listener->panelChanged(Evlocallabresidcont, + residcont->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residchro) { + if (listener) { + listener->panelChanged(Evlocallabresidchro, + residchro->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residsha) { + if (listener) { + listener->panelChanged(Evlocallabresidsha, + residsha->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residshathr) { + if (listener) { + listener->panelChanged(Evlocallabresidshathr, + residshathr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residhi) { + if (listener) { + listener->panelChanged(Evlocallabresidhi, + residhi->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residhithr) { + if (listener) { + listener->panelChanged(Evlocallabresidhithr, + residhithr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gamlc) { + if (listener) { + listener->panelChanged(Evlocallabgamlc, + gamlc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residgam) { + if (listener) { + listener->panelChanged(Evlocallabresidgam, + residgam->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residslop) { + if (listener) { + listener->panelChanged(Evlocallabresidslop, + residslop->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensilc) { + if (listener) { + listener->panelChanged(Evlocallabsensilc, + sensilc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == reparw) { + if (listener) { + listener->panelChanged(Evlocallabreparw, + reparw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == clarilres) { + if (listener) { + listener->panelChanged(Evlocallabclarilres, + clarilres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == claricres) { + if (listener) { + listener->panelChanged(Evlocallabclaricres, + claricres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == clarisoft) { + if (listener) { + listener->panelChanged(Evlocallabclarisoft, + clarisoft->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sigmalc2) { + if (listener) { + listener->panelChanged(Evlocallabsigmalc2, + sigmalc2->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strwav) { + if (listener) { + listener->panelChanged(Evlocallabstrwav, + strwav->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == angwav) { + if (listener) { + listener->panelChanged(Evlocallabangwav, + angwav->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strengthw) { + if (listener) { + listener->panelChanged(Evlocallabstrengthw, + strengthw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sigmaed) { + if (listener) { + listener->panelChanged(Evlocallabsigmaed, + sigmaed->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gradw) { + if (listener) { + listener->panelChanged(Evlocallabgradw, + gradw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radiusw) { + if (listener) { + listener->panelChanged(Evlocallabradiusw, + radiusw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == detailw) { + if (listener) { + listener->panelChanged(Evlocallabdetailw, + detailw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == tloww) { + if (listener) { + listener->panelChanged(Evlocallabtloww, + tloww->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == thigw) { + if (listener) { + listener->panelChanged(Evlocallabthigw, + thigw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == edgw) { + if (listener) { + listener->panelChanged(Evlocallabedgw, + edgw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == basew) { + if (listener) { + listener->panelChanged(Evlocallabbasew, + basew->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == levelblur) { + if (listener) { + listener->panelChanged(Evlocallablevelblur, + levelblur->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sigmabl) { + if (listener) { + listener->panelChanged(Evlocallabsigmabl, + sigmabl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromablu) { + if (listener) { + listener->panelChanged(Evlocallabchromablu, + chromablu->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residblur) { + if (listener) { + listener->panelChanged(Evlocallabresidblur, + residblur->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sigma) { + if (listener) { + listener->panelChanged(Evlocallabsigma, + sigma->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == offset) { + if (listener) { + listener->panelChanged(Evlocallaboffset, + offset->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromalev) { + if (listener) { + listener->panelChanged(Evlocallabchromalev, + chromalev->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sigmadr) { + if (listener) { + listener->panelChanged(Evlocallabsigmadr, + sigmadr->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + if (a == threswav) { + if (listener) { + listener->panelChanged(Evlocallabthreswav, + threswav->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == residcomp) { + if (listener) { + listener->panelChanged(Evlocallabresidcomp, + residcomp->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sigmadc) { + if (listener) { + listener->panelChanged(Evlocallabsigmadc, + sigmadc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == deltad) { + if (listener) { + listener->panelChanged(Evlocallabdeltad, + deltad->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + //if (a == fatres) { + // if (listener) { + // listener->panelChanged(Evlocallabfatres, + // fatres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + // } + //} + + if (a == recothresw) { + + if (listener) { + listener->panelChanged(Evlocallabrecothresw, + recothresw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthresw) { + if (listener) { + listener->panelChanged(Evlocallablowthresw, + lowthresw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthresw) { + if (listener) { + listener->panelChanged(Evlocallabhigthresw, + higthresw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decayw) { + if (listener) { + listener->panelChanged(Evlocallabdecayw, + decayw->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmasklc) { + if (listener) { + listener->panelChanged(Evlocallabblendmasklc, + blendmasklc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmasklc) { + if (listener) { + listener->panelChanged(Evlocallabradmasklc, + radmasklc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromasklc) { + if (listener) { + listener->panelChanged(Evlocallabchromasklc, + chromasklc->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabcsThreshold, + csThreshold->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabContrast::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == wavshape) { + if (listener) { + listener->panelChanged(EvlocallabwavCurve, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavshapeedg) { + if (listener) { + listener->panelChanged(EvlocallabwavCurveedg, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavshapelev) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvelev, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavshapecon) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvecon, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavshapecompre) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvecompre, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavshapecomp) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvecomp, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CCmasklcshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmasklcshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmasklcshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmasklcshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmasklcshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmasklcshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmasklcshape) { + if (listener) { + listener->panelChanged(EvlocallabLmasklcshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenacontrast, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenacontrast, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + gamlc->setValue(defSpot.gamlc); + + // Set hidden GUI widgets in Normal mode to default spot values + origlc->set_active(defSpot.origlc); + wavgradl->set_active(defSpot.wavgradl); + sigmalc2->setValue(defSpot.sigmalc2); + strwav->setValue(defSpot.strwav); + angwav->setValue(defSpot.angwav); + wavedg->set_active(defSpot.wavedg); + strengthw->setValue(defSpot.strengthw); + sigmaed->setValue(defSpot.sigmaed); + wavshapeedg->setCurve(defSpot.locedgwavcurve); + gradw->setValue(defSpot.gradw); + waveshow->set_active(defSpot.waveshow); + radiusw->setValue(defSpot.radiusw); + detailw->setValue(defSpot.detailw); + + if (defSpot.localedgMethod == "fir") { + localedgMethod->set_active(0); + } else if (defSpot.localedgMethod == "sec") { + localedgMethod->set_active(1); + } else if (defSpot.localedgMethod == "thr") { + localedgMethod->set_active(2); + } + + tloww->setValue(defSpot.tloww); + thigw->setValue(defSpot.thigw); + edgw->setValue(defSpot.edgw); + basew->setValue(defSpot.basew); + + if (defSpot.localneiMethod == "none") { + localneiMethod->set_active(0); + } else if (defSpot.localneiMethod == "low") { + localneiMethod->set_active(1); + } else if (defSpot.localneiMethod == "high") { + localneiMethod->set_active(2); + } + + wavblur->set_active(defSpot.wavblur); + levelblur->setValue(defSpot.levelblur); + sigmabl->setValue(defSpot.sigmabl); + chromablu->setValue(defSpot.chromablu); + wavshapelev->setCurve(defSpot.loclevwavcurve); + residblur->setValue(defSpot.residblur); + blurlc->set_active(defSpot.blurlc); + wavcont->set_active(defSpot.wavcont); + sigma->setValue(defSpot.sigma); + offset->setValue(defSpot.offset); + chromalev->setValue(defSpot.chromalev); + wavshapecon->setCurve(defSpot.locconwavcurve); + wavcompre->set_active(defSpot.wavcompre); + wavshapecompre->setCurve(defSpot.loccomprewavcurve); + sigmadr->setValue(defSpot.sigmadr); + threswav->setValue(defSpot.threswav); + residcomp->setValue(defSpot.residcomp); + wavcomp->set_active(defSpot.wavcomp); + sigmadc->setValue(defSpot.sigmadc); + deltad->setValue(defSpot.deltad); + wavshapecomp->setCurve(defSpot.loccompwavcurve); + //fatres->setValue(defSpot.fatres); + fftwlc->set_active(defSpot.fftwlc); + decayw->setValue(defSpot.decayw); + + // Enable all listeners + enableListener(); + + // Update GUI based on converted widget parameters: + // - Update Local contrast GUI according to fftwlc button state + updateContrastGUI3(); +} + +void LocallabContrast::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + gamlc->setValue(defSpot.gamlc); + + // Set hidden specific GUI widgets in Simple mode to default spot values + if (defSpot.localcontMethod == "loc") { + localcontMethod->set_active(0); + } else if (defSpot.localcontMethod == "wav") { + localcontMethod->set_active(1); + } + + showmasklcMethod->set_active(0); + enalcMask->set_active(defSpot.enalcMask); +// CCmasklcshape->setCurve(defSpot.CCmasklccurve); +// LLmasklcshape->setCurve(defSpot.LLmasklccurve); +// HHmasklcshape->setCurve(defSpot.HHmasklccurve); +// blendmasklc->setValue((double)defSpot.blendmasklc); +// radmasklc->setValue(defSpot.radmasklc); +// chromasklc->setValue(defSpot.chromasklc); +// Lmasklcshape->setCurve(defSpot.Lmasklccurve); + + // Enable all listeners + recothresw->setValue(defSpot.recothresw); + lowthresw->setValue(defSpot.lowthresw); + higthresw->setValue(defSpot.higthresw); + decayw->setValue(defSpot.decayw); + + enableListener(); + + // Update GUI based on converted widget parameters: + // - Update Local contrast GUI according to localcontMethod combobox value + updateContrastGUI1(); +} + +void LocallabContrast::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + localcontMethod->hide(); + origlc->hide(); + expcontrastpyr->hide(); + expcontrastpyr2->hide(); + fftwlc->hide(); + expmasklc->hide(); + exprecovw->hide(); + decayw->hide(); + maskusablew->hide(); + maskunusablew->hide(); + gamlc->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + origlc->hide(); + expcontrastpyr->hide(); + expcontrastpyr2->hide(); + fftwlc->hide(); + // Specific Simple mode widgets are shown in Normal mode + localcontMethod->show(); + expmasklc->show(); + exprecovw->show(); + decayw->hide(); + if (enalcMask->get_active()) { + maskusablew->show(); + maskunusablew->hide(); + + } else { + maskusablew->hide(); + maskunusablew->show(); + } + gamlc->hide(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + localcontMethod->show(); + origlc->show(); + + if (localcontMethod->get_active_row_number() != 0) { // Keep widgets hidden when localcontMethod is equal to 0 + expcontrastpyr->show(); + expcontrastpyr2->show(); + gamlc->show(); + } + + if (localcontMethod->get_active_row_number() != 1) { // Keep widget hidden when localcontMethod is equal to 1 + fftwlc->show(); + } + + expmasklc->show(); + exprecovw->show(); + decayw->show(); + if (enalcMask->get_active()) { + maskusablew->show(); + maskunusablew->hide(); + + } else { + maskusablew->hide(); + maskunusablew->show(); + } + + } +} + +void LocallabContrast::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmasklcshape->updateLocallabBackground(normChromar); + LLmasklcshape->updateLocallabBackground(normLumar); + HHmasklcshape->updateLocallabBackground(normHuer); + Lmasklcshape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + +void LocallabContrast::localcontMethodChanged() +{ + // Update Local contrast GUI according to localcontMethod combobox value + updateContrastGUI1(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallablocalcontMethod, + localcontMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabContrast::origlcChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (origlc->get_active()) { + listener->panelChanged(Evlocallaboriglc, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallaboriglc, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::wavgradlChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (wavgradl->get_active()) { + listener->panelChanged(Evlocallabwavgradl, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabwavgradl, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::wavedgChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (wavedg->get_active()) { + listener->panelChanged(Evlocallabwavedg, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabwavedg, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::localedgMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallablocaledgMethod, + localedgMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabContrast::waveshowChanged() +{ + // Update Local contrast GUI according to waveshow button state + updateContrastGUI2(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (waveshow->get_active()) { + listener->panelChanged(Evlocallabwaveshow, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabwaveshow, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::localneiMethodChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallablocalneiMethod, + localneiMethod->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabContrast::wavblurChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (wavblur->get_active()) { + listener->panelChanged(Evlocallabwavblur, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabwavblur, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::blurlcChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (blurlc->get_active()) { + listener->panelChanged(Evlocallabblurlc, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabblurlc, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::wavcontChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (wavcont->get_active()) { + listener->panelChanged(Evlocallabwavcont, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabwavcont, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::wavcompreChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (wavcompre->get_active()) { + listener->panelChanged(Evlocallabwavcompre, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabwavcompre, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::wavcompChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (wavcomp->get_active()) { + listener->panelChanged(Evlocallabwavcomp, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabwavcomp, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::fftwlcChanged() +{ + // Update Local contrast GUI according to fftwlc button state + updateContrastGUI3(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (fftwlc->get_active()) { + listener->panelChanged(Evlocallabfftwlc, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabfftwlc, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::showmasklcMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabContrast::enalcMaskChanged() +{ + if (enalcMask->get_active()) { + maskusablew->show(); + maskunusablew->hide(); + + } else { + maskusablew->hide(); + maskunusablew->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enalcMask->get_active()) { + listener->panelChanged(EvLocallabEnalcMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnalcMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabContrast::updateContrastGUI1() +{ + const int mode = complexity->get_active_row_number(); + + // Update Local contrast GUI according to localcontMethod combobox value + if (localcontMethod->get_active_row_number() == 0) { + lcradius->show(); + lcamount->show(); + lcdarkness->show(); + lclightness->show(); + contFrame->hide(); + csThreshold->hide(); + levelwav->hide(); + expresidpyr->hide(); + clariFrame->hide(); + expcontrastpyr->hide(); + expcontrastpyr2->hide(); + gamlc->hide(); + if (mode == Expert) { // Keep widget hidden in Normal and Simple mode + fftwlc->show(); + } + } else if (localcontMethod->get_active_row_number() == 1) { + lcradius->hide(); + lcamount->hide(); + lcdarkness->hide(); + lclightness->hide(); + contFrame->show(); + csThreshold->show(); + levelwav->show(); + expresidpyr->show(); + clariFrame->show(); + + if (mode == Expert) { // Keep widget hidden in Normal and Simple mode + expcontrastpyr->show(); + expcontrastpyr2->show(); + gamlc->show(); + } + + fftwlc->hide(); + } +} +void LocallabContrast::updateContrastGUI2() +{ + // Update Local contrast GUI according to waveshow button state + if (waveshow->get_active()) { + edgsBoxshow->show(); + } else { + edgsBoxshow->hide(); + } +} + +void LocallabContrast::updateContrastGUI3() +{ + // Update Local contrast GUI according to fftwlc button state + const double temp = lcradius->getValue(); + + if (fftwlc->get_active()) { + lcradius->setLimits(20, 1000, 1, 80); + } else { + lcradius->setLimits(20, 100, 1, 80); + } + + lcradius->setValue(temp); +} + +/* ==== LocallabCBDL ==== */ +LocallabCBDL::LocallabCBDL(): + LocallabTool(this, M("TP_LOCALLAB_CBDL_TOOLNAME"), M("TP_LOCALLAB_CBDL"), true), + + // CBDL specific widgets + levFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LEVFRA")))), + multiplier([]() -> std::array + { + std::array res = {}; + + for (unsigned int i = 0; i < res.size(); ++i) { + Glib::ustring ss = Glib::ustring::format(i); + + if (i == 0) { + ss += Glib::ustring::compose(" (%1)", M("TP_DIRPYREQUALIZER_LUMAFINEST")); + } else if (i == 5) { + ss += Glib::ustring::compose(" (%1)", M("TP_DIRPYREQUALIZER_LUMACOARSEST")); + } + + res[i] = Gtk::manage(new Adjuster(std::move(ss), 0.0, 4.0, 0.01, 1.0)); + } + + return res; + } + ()), + chromacbdl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMACBDL"), 0., 1.5, 0.01, 0.))), + threshold(Gtk::manage(new Adjuster(M("TP_DIRPYREQUALIZER_THRESHOLD"), 0, 1., 0.01, 0.2))), + clarityml(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CLARITYML"), 0.1, 100., 0.1, 0.1))), + contresid(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTRESID"), -100, 100, 1, 0))), + softradiuscb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), + sensicb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + exprecovcb(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablecb(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablecb(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothrescb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 1., 2., 0.01, 1.))), + lowthrescb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthrescb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decaycb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + expmaskcb(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWCB")))), + showmaskcbMethod(Gtk::manage(new MyComboBoxText())), + enacbMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), + // maskcbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskcbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskcbshape(static_cast(maskcbCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskcbshape(static_cast(maskcbCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskcbshape(static_cast(maskcbCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskcb(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + mask2cbCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmaskcbshape(static_cast(mask2cbCurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + + lumacontrastMinusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS")))), + lumaneutralButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMANEUTRAL")))), + lumacontrastPlusButton(Gtk::manage(new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS")))) +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter CBDL specific widgets + for (const auto adj : multiplier) { + adj->setAdjusterListener(this); + } + + chromacbdl->setAdjusterListener(this); + + threshold->setAdjusterListener(this); + + clarityml->setAdjusterListener(this); + + contresid->setAdjusterListener(this); + + softradiuscb->setLogScale(10, 0); + softradiuscb->setAdjusterListener(this); + + sensicb->setAdjusterListener(this); + + recothrescb->setAdjusterListener(this); + lowthrescb->setAdjusterListener(this); + higthrescb->setAdjusterListener(this); + decaycb->setAdjusterListener(this); + setExpandAlignProperties(exprecovcb, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskcbMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskcbMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskcbMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskcbMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskcbMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskcbMethod->set_active(0); + showmaskcbMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskcbMethodConn = showmaskcbMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabCBDL::showmaskcbMethodChanged)); + + enacbMaskConn = enacbMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabCBDL::enacbMaskChanged)); + + maskcbCurveEditorG->setCurveListener(this); + + CCmaskcbshape->setIdentityValue(0.); + CCmaskcbshape->setResetCurve(FlatCurveType(defSpot.CCmaskcbcurve.at(0)), defSpot.CCmaskcbcurve); + CCmaskcbshape->setBottomBarColorProvider(this, 1); + + LLmaskcbshape->setIdentityValue(0.); + LLmaskcbshape->setResetCurve(FlatCurveType(defSpot.LLmaskcbcurve.at(0)), defSpot.LLmaskcbcurve); + LLmaskcbshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskcbshape->setIdentityValue(0.); + HHmaskcbshape->setResetCurve(FlatCurveType(defSpot.HHmaskcbcurve.at(0)), defSpot.HHmaskcbcurve); + HHmaskcbshape->setCurveColorProvider(this, 2); + HHmaskcbshape->setBottomBarColorProvider(this, 2); + + maskcbCurveEditorG->curveListComplete(); + + blendmaskcb->setAdjusterListener(this); + + radmaskcb->setAdjusterListener(this); + + lapmaskcb->setAdjusterListener(this); + + chromaskcb->setAdjusterListener(this); + + gammaskcb->setAdjusterListener(this); + + slomaskcb->setAdjusterListener(this); + + mask2cbCurveEditorG->setCurveListener(this); + + Lmaskcbshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskcbcurve.at(0)), defSpot.Lmaskcbcurve); + Lmaskcbshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmaskcbshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2cbCurveEditorG->curveListComplete(); + + lumacontrastMinusPressedConn = lumacontrastMinusButton->signal_pressed().connect(sigc::mem_fun(*this, &LocallabCBDL::lumacontrastMinusPressed)); + + lumaneutralPressedConn = lumaneutralButton->signal_pressed().connect(sigc::mem_fun(*this, &LocallabCBDL::lumaneutralPressed)); + + lumacontrastPlusPressedConn = lumacontrastPlusButton->signal_pressed().connect(sigc::mem_fun(*this, &LocallabCBDL::lumacontrastPlusPressed)); + pack_start(*sensicb); + + // Add CBDL specific widgets to GUI + ToolParamBlock* const levBox = Gtk::manage(new ToolParamBlock()); + Gtk::Box* buttonBox = Gtk::manage(new Gtk::Box()); + buttonBox->set_spacing(2); + buttonBox->set_homogeneous(true); + buttonBox->pack_start(*lumacontrastMinusButton); + buttonBox->pack_start(*lumaneutralButton); + buttonBox->pack_start(*lumacontrastPlusButton); + levBox->pack_start(*buttonBox); + + for (const auto adj : multiplier) { + levBox->pack_start(*adj); + } + + Gtk::Separator* const separator = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + levBox->pack_start(*separator, Gtk::PACK_SHRINK, 2); + levBox->pack_start(*chromacbdl); + levBox->pack_start(*threshold); + levFrame->add(*levBox); + pack_start(*levFrame); + Gtk::Frame* const residFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_RESID"))); + residFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const residBox = Gtk::manage(new ToolParamBlock()); + residBox->pack_start(*clarityml); + residBox->pack_start(*contresid); + residFrame->add(*residBox); + pack_start(*residFrame); + pack_start(*softradiuscb); +// pack_start(*sensicb); + ToolParamBlock* const cbBox3 = Gtk::manage(new ToolParamBlock()); + cbBox3->pack_start(*maskusablecb, Gtk::PACK_SHRINK, 0); + cbBox3->pack_start(*maskunusablecb, Gtk::PACK_SHRINK, 0); + cbBox3->pack_start(*recothrescb); + cbBox3->pack_start(*lowthrescb); + cbBox3->pack_start(*higthrescb); + cbBox3->pack_start(*decaycb); + // colBox3->pack_start(*invmaskc); + exprecovcb->add(*cbBox3, false); + pack_start(*exprecovcb, false, false); + + ToolParamBlock* const maskcbBox = Gtk::manage(new ToolParamBlock()); + maskcbBox->pack_start(*showmaskcbMethod, Gtk::PACK_SHRINK, 4); + maskcbBox->pack_start(*enacbMask, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*maskcbCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskcbBox->pack_start(*blendmaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*radmaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*lapmaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*chromaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*gammaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*slomaskcb, Gtk::PACK_SHRINK, 0); + maskcbBox->pack_start(*mask2cbCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmaskcb->add(*maskcbBox, false); + pack_start(*expmaskcb, false, false); +} + +LocallabCBDL::~LocallabCBDL() +{ + delete maskcbCurveEditorG; + delete mask2cbCurveEditorG; +} + +bool LocallabCBDL::isMaskViewActive() +{ + return (showmaskcbMethod->get_active_row_number() != 0); +} + + +void LocallabCBDL::resetMaskView() +{ + showmaskcbMethodConn.block(true); + showmaskcbMethod->set_active(0); + showmaskcbMethodConn.block(false); +} + +void LocallabCBDL::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + cbMask = showmaskcbMethod->get_active_row_number(); +} + +void LocallabCBDL::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + levFrame->set_tooltip_text(M("TP_LOCALLAB_EXPCBDL_TOOLTIP")); + + for (const auto adj : multiplier) { + adj->set_tooltip_text(M("TP_LOCALLAB_CBDL_ADJ_TOOLTIP")); + } + + exprecovcb->set_tooltip_markup(M("TP_LOCALLAB_MASKRESCB_TOOLTIP")); + chromacbdl->set_tooltip_text(M("TP_LOCALLAB_CHROMACB_TOOLTIP")); + threshold->set_tooltip_text(M("TP_LOCALLAB_CBDL_THRES_TOOLTIP")); + clarityml->set_tooltip_text(M("TP_LOCALLAB_CBDLCLARI_TOOLTIP")); + sensicb->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + expmaskcb->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + CCmaskcbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskcbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskcbshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmaskcb->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + mask2cbCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmaskcbshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + maskcbCurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + gammaskcb->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromaskcb->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slomaskcb->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + lapmaskcb->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + decaycb->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthrescb->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESCB_TOOLTIP")); + higthrescb->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESCB_TOOLTIP")); + } else { + levFrame->set_tooltip_text(""); + + for (const auto adj : multiplier) { + adj->set_tooltip_text(""); + } + + chromacbdl->set_tooltip_text(""); + threshold->set_tooltip_text(""); + clarityml->set_tooltip_text(""); + sensicb->set_tooltip_text(""); + expmaskcb->set_tooltip_markup(""); + CCmaskcbshape->setTooltip(""); + LLmaskcbshape->setTooltip(""); + HHmaskcbshape->setTooltip(""); + blendmaskcb->set_tooltip_text(""); + radmaskcb->set_tooltip_text(""); + mask2cbCurveEditorG->set_tooltip_text(""); + Lmaskcbshape->setTooltip(""); + maskcbCurveEditorG->set_tooltip_markup(""); + gammaskcb->set_tooltip_text(""); + chromaskcb->set_tooltip_text(""); + slomaskcb->set_tooltip_text(""); + lapmaskcb->set_tooltip_text(""); + exprecovcb->set_tooltip_markup(""); + decaycb->set_tooltip_text(""); + lowthrescb->set_tooltip_text(""); + higthrescb->set_tooltip_text(""); + } +} + +void LocallabCBDL::setDefaultExpanderVisibility() +{ + exprecovcb->set_expanded(false); + expmaskcb->set_expanded(false); +} + +void LocallabCBDL::disableListener() +{ + LocallabTool::disableListener(); + + showmaskcbMethodConn.block(true); + enacbMaskConn.block(true); + + lumacontrastMinusPressedConn.block(true); + lumaneutralPressedConn.block(true); + lumacontrastPlusPressedConn.block(true); +} + +void LocallabCBDL::enableListener() +{ + LocallabTool::enableListener(); + + showmaskcbMethodConn.block(false); + enacbMaskConn.block(false); + + lumacontrastMinusPressedConn.block(false); + lumaneutralPressedConn.block(false); + lumacontrastPlusPressedConn.block(false); +} + +void LocallabCBDL::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visicbdl); + exp->setEnabled(spot.expcbdl); + complexity->set_active(spot.complexcbdl); + + for (int i = 0; i < 6; i++) { + multiplier[i]->setValue(spot.mult[i]); + } + + chromacbdl->setValue(spot.chromacbdl); + threshold->setValue(spot.threshold); + clarityml->setValue(spot.clarityml); + contresid->setValue((double)spot.contresid); + softradiuscb->setValue(spot.softradiuscb); + sensicb->setValue((double)spot.sensicb); + enacbMask->set_active(spot.enacbMask); + CCmaskcbshape->setCurve(spot.CCmaskcbcurve); + LLmaskcbshape->setCurve(spot.LLmaskcbcurve); + HHmaskcbshape->setCurve(spot.HHmaskcbcurve); + blendmaskcb->setValue((double)spot.blendmaskcb); + radmaskcb->setValue(spot.radmaskcb); + lapmaskcb->setValue(spot.lapmaskcb); + chromaskcb->setValue(spot.chromaskcb); + gammaskcb->setValue(spot.gammaskcb); + slomaskcb->setValue(spot.slomaskcb); + Lmaskcbshape->setCurve(spot.Lmaskcbcurve); + recothrescb->setValue((double)spot.recothrescb); + lowthrescb->setValue((double)spot.lowthrescb); + higthrescb->setValue((double)spot.higthrescb); + decaycb->setValue((double)spot.decaycb); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabCBDL::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expcbdl = exp->getEnabled(); + spot.visicbdl = exp->get_visible(); + spot.complexcbdl = complexity->get_active_row_number(); + + for (int i = 0; i < 6; i++) { + spot.mult[i] = multiplier[i]->getValue(); + } + + spot.chromacbdl = chromacbdl->getValue(); + spot.threshold = threshold->getValue(); + spot.clarityml = clarityml->getValue(); + spot.contresid = contresid->getIntValue(); + spot.softradiuscb = softradiuscb->getValue(); + spot.sensicb = sensicb->getIntValue(); + spot.enacbMask = enacbMask->get_active(); + spot.LLmaskcbcurve = LLmaskcbshape->getCurve(); + spot.CCmaskcbcurve = CCmaskcbshape->getCurve(); + spot.HHmaskcbcurve = HHmaskcbshape->getCurve(); + spot.blendmaskcb = blendmaskcb->getIntValue(); + spot.radmaskcb = radmaskcb->getValue(); + spot.lapmaskcb = lapmaskcb->getValue(); + spot.chromaskcb = chromaskcb->getValue(); + spot.gammaskcb = gammaskcb->getValue(); + spot.slomaskcb = slomaskcb->getValue(); + spot.Lmaskcbcurve = Lmaskcbshape->getCurve(); + spot.recothrescb = recothrescb->getValue(); + spot.lowthrescb = lowthrescb->getValue(); + spot.higthrescb = higthrescb->getValue(); + spot.decaycb = decaycb->getValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabCBDL::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default values for adjuster widgets + for (int i = 0; i < 6; i++) { + multiplier[i]->setDefault(defSpot.mult[i]); + } + + chromacbdl->setDefault(defSpot.chromacbdl); + threshold->setDefault(defSpot.threshold); + clarityml->setDefault(defSpot.clarityml); + contresid->setDefault((double)defSpot.contresid); + softradiuscb->setDefault(defSpot.softradiuscb); + sensicb->setDefault((double)defSpot.sensicb); + blendmaskcb->setDefault((double)defSpot.blendmaskcb); + radmaskcb->setDefault(defSpot.radmaskcb); + lapmaskcb->setDefault(defSpot.lapmaskcb); + chromaskcb->setDefault(defSpot.chromaskcb); + gammaskcb->setDefault(defSpot.gammaskcb); + slomaskcb->setDefault(defSpot.slomaskcb); + recothrescb->setDefault((double)defSpot.recothrescb); + lowthrescb->setDefault((double)defSpot.lowthrescb); + higthrescb->setDefault((double)defSpot.higthrescb); + decaycb->setDefault((double)defSpot.decaycb); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabCBDL::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == multiplier[0] || a == multiplier[1] || a == multiplier[2] || a == multiplier[3] || a == multiplier[4] || a == multiplier[5]) { + if (listener) { + listener->panelChanged(EvlocallabEqualizer, + Glib::ustring::compose("%1, %2, %3, %4, %5, %6", + Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[0]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[1]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[2]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[3]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[4]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(2), multiplier[5]->getValue())) + + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromacbdl) { + if (listener) { + listener->panelChanged(Evlocallabchromacbdl, + chromacbdl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == threshold) { + if (listener) { + listener->panelChanged(EvlocallabThresho, + threshold->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == clarityml) { + if (listener) { + listener->panelChanged(EvLocallabclarityml, + clarityml->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == contresid) { + if (listener) { + listener->panelChanged(EvLocallabcontresid, + contresid->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == softradiuscb) { + if (listener) { + listener->panelChanged(Evlocallabsoftradiuscb, + softradiuscb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sensicb) { + if (listener) { + listener->panelChanged(Evlocallabsensicb, + sensicb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothrescb) { + + if (listener) { + listener->panelChanged(Evlocallabrecothrescb, + recothrescb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthrescb) { + if (listener) { + listener->panelChanged(Evlocallablowthrescb, + lowthrescb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthrescb) { + if (listener) { + listener->panelChanged(Evlocallabhigthrescb, + higthrescb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decaycb) { + if (listener) { + listener->panelChanged(Evlocallabdecaycb, + decaycb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskcb) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskcb, + blendmaskcb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskcb) { + if (listener) { + listener->panelChanged(Evlocallabradmaskcb, + radmaskcb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskcb) { + if (listener) { + listener->panelChanged(Evlocallablapmaskcb, + lapmaskcb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskcb) { + if (listener) { + listener->panelChanged(Evlocallabchromaskcb, + chromaskcb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskcb) { + if (listener) { + listener->panelChanged(Evlocallabgammaskcb, + gammaskcb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskcb) { + if (listener) { + listener->panelChanged(Evlocallabslomaskcb, + slomaskcb->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabCBDL::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == CCmaskcbshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskcbshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskcbshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskcbshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskcbshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskcbshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskcbshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskcbshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabCBDL::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenacbdl, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenacbdl, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabCBDL::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + lapmaskcb->setValue(defSpot.lapmaskcb); + decaycb->setValue(defSpot.decaycb); + + // Enable all listeners + enableListener(); +} + +void LocallabCBDL::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + softradiuscb->setValue(defSpot.softradiuscb); + showmaskcbMethod->set_active(0); + enacbMask->set_active(defSpot.enacbMask); +// CCmaskcbshape->setCurve(defSpot.CCmaskcbcurve); +// LLmaskcbshape->setCurve(defSpot.LLmaskcbcurve); +// HHmaskcbshape->setCurve(defSpot.HHmaskcbcurve); +// blendmaskcb->setValue((double)defSpot.blendmaskcb); +// radmaskcb->setValue(defSpot.radmaskcb); +// chromaskcb->setValue(defSpot.chromaskcb); +// gammaskcb->setValue(defSpot.gammaskcb); +// slomaskcb->setValue(defSpot.slomaskcb); +// Lmaskcbshape->setCurve(defSpot.Lmaskcbcurve); + recothrescb->setValue(defSpot.recothrescb); + lowthrescb->setValue(defSpot.lowthrescb); + higthrescb->setValue(defSpot.higthrescb); + decaycb->setValue(defSpot.decaycb); + + // Enable all listers + enableListener(); +} + +void LocallabCBDL::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + softradiuscb->hide(); + expmaskcb->hide(); + exprecovcb->hide(); + decaycb->hide(); + maskusablecb->hide(); + maskunusablecb->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + lapmaskcb->hide(); + // Specific Simple mode widgets are shown in Normal mode + softradiuscb->show(); + expmaskcb->show(); + exprecovcb->show(); + decaycb->hide(); + if (enacbMask->get_active()) { + maskusablecb->show(); + maskunusablecb->hide(); + + } else { + maskusablecb->hide(); + maskunusablecb->show(); + } + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + softradiuscb->show(); + expmaskcb->show(); + lapmaskcb->show(); + exprecovcb->show(); + decaycb->show(); + if (enacbMask->get_active()) { + maskusablecb->show(); + maskunusablecb->hide(); + + } else { + maskusablecb->hide(); + maskunusablecb->show(); + } + } +} + +void LocallabCBDL::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskcbshape->updateLocallabBackground(normChromar); + LLmaskcbshape->updateLocallabBackground(normLumar); + HHmaskcbshape->updateLocallabBackground(normHuer); + Lmaskcbshape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + +void LocallabCBDL::showmaskcbMethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabCBDL::enacbMaskChanged() +{ + if (enacbMask->get_active()) { + maskusablecb->show(); + maskunusablecb->hide(); + } else { + maskusablecb->hide(); + maskunusablecb->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enacbMask->get_active()) { + listener->panelChanged(EvLocallabEnacbMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnacbMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabCBDL::lumacontrastMinusPressed() +{ + for (int i = 0; i < 6; i++) { + float inc = - (5 - i); + multiplier[i]->setValue(multiplier[i]->getValue() + 0.01f * inc); + } + + // Raise event (only for first multiplier because associated event concerns all multipliers) + adjusterChanged(multiplier[0], multiplier[0]->getValue()); // Value isn't used +} + +void LocallabCBDL::lumaneutralPressed() +{ + for (int i = 0; i < 6; i++) { + multiplier[i]->setValue(1.0); + } + + // Raise event (only for first multiplier because associated event concerns all multipliers) + adjusterChanged(multiplier[0], multiplier[0]->getValue()); // Value isn't used +} + +void LocallabCBDL::lumacontrastPlusPressed() +{ + for (int i = 0; i < 6; i++) { + float inc = (5 - i); + multiplier[i]->setValue(multiplier[i]->getValue() + 0.01f * inc); + } + + // Raise event (only for first multiplier because associated event concerns all multipliers) + adjusterChanged(multiplier[0], multiplier[0]->getValue()); // Value isn't used +} + +/* ==== LocallabLog ==== */ +LocallabLog::LocallabLog(): + LocallabTool(this, M("TP_LOCALLAB_LOG_TOOLNAME"), M("TP_LOCALLAB_LOG"), false), + + // Log encoding specific widgets + repar(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + ciecam(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_CIEC")))), + autocompute(Gtk::manage(new Gtk::ToggleButton(M("TP_LOCALLAB_LOGAUTO")))), + logPFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGPFRA")))), + blackEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), + whiteEv(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0., 32.0, 0.1, 10.0))), + fullimage(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FULLIMAGE")))), + logFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA")))), + Autogray(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAY")))), + sourceGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 10.0))), + sourceabs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 2000.0))), + sursour(Gtk::manage (new MyComboBoxText ())), + surHBox(Gtk::manage(new Gtk::Box())), + log1Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG1FRA")))), + log2Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG2FRA")))), + targetGray(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 4.0, 80.0, 0.1, 18.0))), + detail(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 1., 0.01, 0.6))), + catad(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-orange-small.png"))))), + lightl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTL"), -100., 100., 0.5, 0.))), + lightq(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTQ"), -100., 100., 0.5, 0.))), + contl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTL"), -100., 100., 0.5, 0.))), + contq(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONQL"), -100., 100., 0.5, 0.))), + contthres(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTHRES"), -1., 1., 0.01, 0.))), + colorfl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCOLORFL"), -100., 100., 0.5, 0.))), + saturl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATURV"), -100., 100., 0.5, 0.))), + chroml(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROML"), -100., 100., 0.5, 0.))), + expL(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_LOGEXP")))), + //CurveEditorL(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_LOGCONTQ"))), + //LshapeL(static_cast(CurveEditorL->addCurve(CT_Diagonal, "Q(Q)"))), + targabs(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 16.0))), + surround(Gtk::manage (new MyComboBoxText ())), + surrHBox(Gtk::manage(new Gtk::Box())), + baselog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BASELOG"), 1.3, 3., 0.05, 2.))),//, Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + exprecovl(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablel(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablel(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothresl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthresl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthresl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decayl(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + + sensilog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + gradlogFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADLOGFRA")))), + strlog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2.0, 2.0, 0.05, 0.))), + anglog(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180, 180, 0.1, 0.))), + expmaskL(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWC")))), + showmaskLMethod(Gtk::manage(new MyComboBoxText())), + enaLMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), + // maskCurveEditorL(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASKCOL"))), + maskCurveEditorL(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskshapeL(static_cast(maskCurveEditorL->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskshapeL(static_cast(maskCurveEditorL->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskshapeL(static_cast(maskCurveEditorL->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskL(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskL(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskL(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + mask2CurveEditorL(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + LmaskshapeL(static_cast(mask2CurveEditorL->addCurve(CT_Diagonal, "L(L)"))) + + +{ + set_orientation(Gtk::ORIENTATION_VERTICAL); + + // Parameter Log encoding specific widgets + autoconn = autocompute->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::autocomputeToggled)); + const LocallabParams::LocallabSpot defSpot; + repar->setAdjusterListener(this); + + blackEv->setLogScale(2, -8); + blackEv->setAdjusterListener(this); + + whiteEv->setLogScale(16, 0); + whiteEv->setAdjusterListener(this); + ciecamconn = ciecam->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::ciecamChanged)); + + fullimageConn = fullimage->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::fullimageChanged)); + + AutograyConn = Autogray->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::AutograyChanged)); + + sourceGray->setAdjusterListener(this); + sourceGray->setLogScale(10, 18, true); + + sourceabs->setLogScale(500, 0); + + sourceabs->setAdjusterListener(this); + + targetGray->setAdjusterListener(this); + targetGray->setLogScale(10, 18, true); + + detail->setAdjusterListener(this); + + catad->setAdjusterListener(this); + + setExpandAlignProperties(expL, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + saturl->setAdjusterListener(this); + + chroml->setAdjusterListener(this); + + lightl->setAdjusterListener(this); + + lightq->setAdjusterListener(this); + contl->setAdjusterListener(this); + contthres->setAdjusterListener(this); + + contq->setAdjusterListener(this); + colorfl->setAdjusterListener(this); + + //CurveEditorL->setCurveListener(this); + + //LshapeL->setResetCurve(DiagonalCurveType(defSpot.LcurveL.at(0)), defSpot.LcurveL); + //LshapeL->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + //LshapeL->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + //CurveEditorL->curveListComplete(); + + + targabs->setLogScale(500, 0); + + targabs->setAdjusterListener(this); + + baselog->setAdjusterListener(this); + recothresl->setAdjusterListener(this); + lowthresl->setAdjusterListener(this); + higthresl->setAdjusterListener(this); + decayl->setAdjusterListener(this); + setExpandAlignProperties(exprecovl, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + sensilog->setAdjusterListener(this); + + strlog->setAdjusterListener(this); + + anglog->setAdjusterListener(this); + + surHBox->set_spacing (2); + surHBox->set_tooltip_markup (M ("TP_LOCALLAB_LOGSURSOUR_TOOLTIP")); + Gtk::Label* surLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surHBox->pack_start (*surLabel, Gtk::PACK_SHRINK); + sursour->append (M ("TP_COLORAPP_SURROUND_AVER")); + sursour->append (M ("TP_COLORAPP_SURROUND_DIM")); + sursour->append (M ("TP_COLORAPP_SURROUND_DARK")); + sursour->set_active (0); + surHBox->pack_start (*sursour); + sursourconn = sursour->signal_changed().connect ( sigc::mem_fun (*this, &LocallabLog::sursourChanged) ); + + + + surrHBox->set_spacing (2); + surrHBox->set_tooltip_markup (M ("TP_COLORAPP_SURROUND_TOOLTIP")); + Gtk::Label* surrLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surrHBox->pack_start (*surrLabel, Gtk::PACK_SHRINK); + surround->append (M ("TP_COLORAPP_SURROUND_AVER")); + surround->append (M ("TP_COLORAPP_SURROUND_DIM")); + surround->append (M ("TP_COLORAPP_SURROUND_DARK")); + surround->append (M ("TP_COLORAPP_SURROUND_EXDARK")); + surround->set_active (0); + surrHBox->pack_start (*surround); + surroundconn = surround->signal_changed().connect ( sigc::mem_fun (*this, &LocallabLog::surroundChanged) ); + + setExpandAlignProperties(expmaskL, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskLMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskLMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskLMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskLMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskLMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskLMethod->set_active(0); + showmaskLMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskLMethodConn = showmaskLMethod->signal_changed().connect(sigc::mem_fun(*this, &LocallabLog::showmaskLMethodChanged)); + + + enaLMaskConn = enaLMask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabLog::enaLMaskChanged)); + + maskCurveEditorL->setCurveListener(this); + + CCmaskshapeL->setIdentityValue(0.); + CCmaskshapeL->setResetCurve(FlatCurveType(defSpot.CCmaskcurveL.at(0)), defSpot.CCmaskcurveL); + CCmaskshapeL->setBottomBarColorProvider(this, 1); + + LLmaskshapeL->setIdentityValue(0.); + LLmaskshapeL->setResetCurve(FlatCurveType(defSpot.LLmaskcurveL.at(0)), defSpot.LLmaskcurveL); + LLmaskshapeL->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskshapeL->setIdentityValue(0.); + HHmaskshapeL->setResetCurve(FlatCurveType(defSpot.HHmaskcurveL.at(0)), defSpot.HHmaskcurveL); + HHmaskshapeL->setCurveColorProvider(this, 2); + HHmaskshapeL->setBottomBarColorProvider(this, 2); + + maskCurveEditorL->curveListComplete(); + + blendmaskL->setAdjusterListener(this); + radmaskL->setAdjusterListener(this); + chromaskL->setAdjusterListener(this); + + mask2CurveEditorL->setCurveListener(this); + + LmaskshapeL->setResetCurve(DiagonalCurveType(defSpot.LmaskcurveL.at(0)), defSpot.LmaskcurveL); + LmaskshapeL->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + LmaskshapeL->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2CurveEditorL->curveListComplete(); + + // Add Log encoding specific widgets to GUI + pack_start(*sensilog); + pack_start(*repar); + pack_start(*ciecam); + logPFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const logPBox = Gtk::manage(new ToolParamBlock()); + logPBox->pack_start(*autocompute); + logPBox->pack_start(*blackEv); + logPBox->pack_start(*whiteEv); + logPBox->pack_start(*fullimage); + logPFrame->add(*logPBox); + pack_start(*logPFrame); +// Gtk::Frame* const logFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA"))); + logFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const logFBox = Gtk::manage(new ToolParamBlock()); + logFBox->pack_start(*Autogray); + logFBox->pack_start(*sourceGray); + logFBox->pack_start(*sourceabs); + logFBox->pack_start (*surHBox); +// logFBox->pack_start(*baselog); + logFrame->add(*logFBox); + pack_start(*logFrame); + log1Frame->set_label_align(0.025, 0.5); + ToolParamBlock* const logP1Box = Gtk::manage(new ToolParamBlock()); + logP1Box->pack_start(*detail); + logP1Box->pack_start(*contl); + logP1Box->pack_start(*contthres); + logP1Box->pack_start(*saturl); + Gtk::Separator* const separatorchro = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + ToolParamBlock* const logP11Box = Gtk::manage(new ToolParamBlock()); + logP11Box->pack_start(*lightl); + logP11Box->pack_start(*lightq); + logP11Box->pack_start(*contq); + logP11Box->pack_start(*separatorchro); + logP11Box->pack_start(*chroml); + logP11Box->pack_start(*colorfl); + expL->add(*logP11Box, false); + logP1Box->pack_start(*expL, false, false); + +// logP1Box->pack_start(*CurveEditorL, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + log1Frame->add(*logP1Box); + pack_start(*log1Frame); + log2Frame->set_label_align(0.025, 0.5); + ToolParamBlock* const logP2Box = Gtk::manage(new ToolParamBlock()); + logP2Box->pack_start(*targetGray); + logP2Box->pack_start(*targabs); + logP2Box->pack_start(*catad); + logP2Box->pack_start (*surrHBox); + ToolParamBlock* const logBox3 = Gtk::manage(new ToolParamBlock()); + logBox3->pack_start(*maskusablel, Gtk::PACK_SHRINK, 0); + logBox3->pack_start(*maskunusablel, Gtk::PACK_SHRINK, 0); + logBox3->pack_start(*recothresl); + logBox3->pack_start(*lowthresl); + logBox3->pack_start(*higthresl); + logBox3->pack_start(*decayl); + // colBox3->pack_start(*invmaskc); + exprecovl->add(*logBox3, false); + + ToolParamBlock* const logP3Box = Gtk::manage(new ToolParamBlock()); + logP3Box->pack_start(*showmaskLMethod, Gtk::PACK_SHRINK, 4); + logP3Box->pack_start(*enaLMask, Gtk::PACK_SHRINK, 0); + logP3Box->pack_start(*maskCurveEditorL, Gtk::PACK_SHRINK, 4); + logP3Box->pack_start(*blendmaskL); + logP3Box->pack_start(*radmaskL); + logP3Box->pack_start(*chromaskL); + logP3Box->pack_start(*mask2CurveEditorL, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmaskL->add(*logP3Box, false); + + + log2Frame->add(*logP2Box); + pack_start(*log2Frame); + pack_start(*exprecovl, false, false); + +// pack_start(*baselog); +// pack_start(*sensilog); + pack_start(*expmaskL, false, false); + + // Gtk::Frame* const gradlogFrame = Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADLOGFRA"))); + gradlogFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const gradlogBox = Gtk::manage(new ToolParamBlock()); + gradlogBox->pack_start(*strlog); + gradlogBox->pack_start(*anglog); + gradlogFrame->add(*gradlogBox); + pack_start(*gradlogFrame); +} + +LocallabLog::~LocallabLog() +{ + delete maskCurveEditorL; + delete mask2CurveEditorL; + //delete CurveEditorL; + +} + +void LocallabLog::setDefaultExpanderVisibility() +{ + exprecovl->set_expanded(false); + expmaskL->set_expanded(false); + expL->set_expanded(false); + +} + +void LocallabLog::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_text(M("TP_LOCALLAB_LOGENCOD_TOOLTIP")); + repar->set_tooltip_text(M("TP_LOCALLAB_LOGREPART_TOOLTIP")); + recothresl->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + logPFrame->set_tooltip_text(M("TP_LOCALLAB_LOGFRAME_TOOLTIP")); + logFrame->set_tooltip_text(M("TP_LOCALLAB_LOGSCENE_TOOLTIP")); + log1Frame->set_tooltip_text(M("TP_LOCALLAB_LOGIMAGE_TOOLTIP")); + log2Frame->set_tooltip_text(M("TP_LOCALLAB_LOGVIEWING_TOOLTIP")); + autocompute->set_tooltip_text(M("TP_LOCALLAB_LOGAUTO_TOOLTIP")); + Autogray->set_tooltip_text(M("TP_LOCALLAB_LOGAUTOGRAY_TOOLTIP")); + // blackEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); + // whiteEv->set_tooltip_text(M("TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP")); + exprecovl->set_tooltip_markup(M("TP_LOCALLAB_MASKRELOG_TOOLTIP")); + blackEv->set_tooltip_text(""); + whiteEv->set_tooltip_text(""); + sourceGray->set_tooltip_text(M("TP_LOCALLAB_JZLOGYBOUT_TOOLTIP")); + sourceabs->set_tooltip_text(M("TP_COLORAPP_ADAPSCEN_TOOLTIP")); + targabs->set_tooltip_text(M("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); + targetGray->set_tooltip_text(M("TP_COLORAPP_YBOUT_TOOLTIP")); + baselog->set_tooltip_text(M("TP_LOCALLAB_LOGBASE_TOOLTIP")); + strlog->set_tooltip_text(M("TP_LOCALLAB_GRADGEN_TOOLTIP")); + anglog->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + contl->set_tooltip_text(M("TP_LOCALLAB_LOGCONTL_TOOLTIP")); + contq->set_tooltip_text(M("TP_LOCALLAB_LOGCONTQ_TOOLTIP")); + contthres->set_tooltip_text(M("TP_LOCALLAB_LOGCONTTHRES_TOOLTIP")); + colorfl->set_tooltip_text(M("TP_LOCALLAB_LOGCOLORF_TOOLTIP")); + lightl->set_tooltip_text(M("TP_LOCALLAB_LOGLIGHTL_TOOLTIP")); + lightq->set_tooltip_text(M("TP_LOCALLAB_LOGLIGHTQ_TOOLTIP")); + saturl->set_tooltip_text(M("TP_LOCALLAB_LOGSATURL_TOOLTIP")); + chroml->set_tooltip_text(M("TP_COLORAPP_CHROMA_TOOLTIP")); + detail->set_tooltip_text(M("TP_LOCALLAB_LOGDETAIL_TOOLTIP")); + catad->set_tooltip_text(M("TP_LOCALLAB_LOGCATAD_TOOLTIP")); + sensilog->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + fullimage->set_tooltip_text(M("TP_LOCALLAB_FULLIMAGELOG_TOOLTIP")); + ciecam->set_tooltip_text(M("TP_LOCALLAB_CIECAMLOG_TOOLTIP")); + expmaskL->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + CCmaskshapeL->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskshapeL->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskshapeL->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + blendmaskL->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskL->set_tooltip_text(M("TP_LOCALLAB_LAPRAD2_TOOLTIP")); + chromaskL->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); +// mask2CurveEditorL->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + LmaskshapeL->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + decayl->set_tooltip_text(M("TP_LOCALLAB_MASKDECAY_TOOLTIP")); + lowthresl->set_tooltip_text(M("TP_LOCALLAB_MASKLOWTHRESL_TOOLTIP")); + higthresl->set_tooltip_text(M("TP_LOCALLAB_MASKHIGTHRESL_TOOLTIP")); + + + } else { + exp->set_tooltip_text(""); + repar->set_tooltip_text(""); + recothresl->set_tooltip_text(""); + logPFrame->set_tooltip_text(""); + logFrame->set_tooltip_text(""); + log1Frame->set_tooltip_text(""); + log2Frame->set_tooltip_text(""); + exprecovl->set_tooltip_markup(""); + autocompute->set_tooltip_text(""); + blackEv->set_tooltip_text(""); + whiteEv->set_tooltip_text(""); + sourceGray->set_tooltip_text(""); + sourceabs->set_tooltip_text(""); + targabs->set_tooltip_text(""); + targetGray->set_tooltip_text(""); + baselog->set_tooltip_text(""); + strlog->set_tooltip_text(""); + anglog->set_tooltip_text(""); + detail->set_tooltip_text(""); + Autogray->set_tooltip_text(""); + sensilog->set_tooltip_text(""); + fullimage->set_tooltip_text(""); + ciecam->set_tooltip_text(""); + contl->set_tooltip_text(""); + lightl->set_tooltip_text(""); + lightq->set_tooltip_text(""); + contq->set_tooltip_text(""); + contthres->set_tooltip_text(""); + colorfl->set_tooltip_text(""); + saturl->set_tooltip_text(""); + chroml->set_tooltip_text(""); + catad->set_tooltip_text(""); + expmaskL->set_tooltip_markup(""); + CCmaskshapeL->setTooltip(""); + LLmaskshapeL->setTooltip(""); + HHmaskshapeL->setTooltip(""); + blendmaskL->set_tooltip_text(""); + radmaskL->set_tooltip_text(""); + chromaskL->set_tooltip_text(""); + mask2CurveEditorL->set_tooltip_text(""); + LmaskshapeL->setTooltip(""); + decayl->set_tooltip_text(""); + lowthresl->set_tooltip_text(""); + higthresl->set_tooltip_text(""); + + } +} + +void LocallabLog::disableListener() +{ + LocallabTool::disableListener(); + + autoconn.block(true); + fullimageConn.block(true); + ciecamconn.block(true); + enaLMaskConn.block(true); + surroundconn.block (true); + sursourconn.block (true); + AutograyConn.block(true); + showmaskLMethodConn.block(true); +} + +void LocallabLog::enableListener() +{ + LocallabTool::enableListener(); + + autoconn.block(false); + fullimageConn.block(false); + ciecamconn.block(false); + enaLMaskConn.block(false); + surroundconn.block (false); + sursourconn.block (false); + AutograyConn.block(false); + showmaskLMethodConn.block(false); +} + +bool LocallabLog::isMaskViewActive() +{ + return ((showmaskLMethod->get_active_row_number() != 0)); +} + +void LocallabLog::resetMaskView() +{ + showmaskLMethodConn.block(true); + + showmaskLMethod->set_active(0); + + showmaskLMethodConn.block(false); +} + +void LocallabLog::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + logMask = showmaskLMethod->get_active_row_number(); +} + + +void LocallabLog::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visilog); + exp->setEnabled(spot.explog); + complexity->set_active(spot.complexlog); + + autocompute->set_active(spot.autocompute); + blackEv->setValue(spot.blackEv); + repar->setValue(spot.repar); + + whiteEv->setValue(spot.whiteEv); +/* if(whiteEv->getValue() < 1.5){ + whiteEv->setValue(1.5); + } +*/ + if (spot.sursour == "Average") { + sursour->set_active (0); + } else if (spot.sursour == "Dim") { + sursour->set_active (1); + } else if (spot.sursour == "Dark") { + sursour->set_active (2); + } + + + if (spot.surround == "Average") { + surround->set_active (0); + } else if (spot.surround == "Dim") { + surround->set_active (1); + } else if (spot.surround == "Dark") { + surround->set_active (2); + } else if (spot.surround == "ExtremelyDark") { + surround->set_active (3); + } + recothresl->setValue((double)spot.recothresl); + lowthresl->setValue((double)spot.lowthresl); + higthresl->setValue((double)spot.higthresl); + decayl->setValue((double)spot.decayl); + + ciecam->set_active(spot.ciecam); + fullimage->set_active(spot.fullimage); + Autogray->set_active(spot.Autogray); + sourceGray->setValue(spot.sourceGray); + sourceabs->setValue(spot.sourceabs); + catad->setValue(spot.catad); + saturl->setValue(spot.saturl); + chroml->setValue(spot.chroml); + lightl->setValue(spot.lightl); + lightq->setValue(spot.lightq); + contl->setValue(spot.contl); + contthres->setValue(spot.contthres); + contq->setValue(spot.contq); + colorfl->setValue(spot.colorfl); + //LshapeL->setCurve(spot.LcurveL); + targabs->setValue(spot.targabs); + targetGray->setValue(spot.targetGray); + detail->setValue(spot.detail); + baselog->setValue(spot.baselog); + sensilog->setValue((double)spot.sensilog); + strlog->setValue(spot.strlog); + anglog->setValue(spot.anglog); + CCmaskshapeL->setCurve(spot.CCmaskcurveL); + LLmaskshapeL->setCurve(spot.LLmaskcurveL); + HHmaskshapeL->setCurve(spot.HHmaskcurveL); + enaLMask->set_active(spot.enaLMask); + blendmaskL->setValue(spot.blendmaskL); + radmaskL->setValue(spot.radmaskL); + chromaskL->setValue(spot.chromaskL); + LmaskshapeL->setCurve(spot.LmaskcurveL); + + + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Update Log Encoding GUI according to autocompute button state + updateLogGUI(); + updateLogGUI2(); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabLog::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.explog = exp->getEnabled(); + spot.visilog = exp->get_visible(); + spot.complexlog = complexity->get_active_row_number(); + + spot.autocompute = autocompute->get_active(); + spot.repar = repar->getValue(); + spot.blackEv = blackEv->getValue(); + spot.whiteEv = whiteEv->getValue(); + spot.fullimage = fullimage->get_active(); + spot.ciecam = ciecam->get_active(); + spot.Autogray = Autogray->get_active(); + spot.sourceGray = sourceGray->getValue(); + spot.sourceabs = sourceabs->getValue(); + spot.targabs = targabs->getValue(); + spot.targetGray = targetGray->getValue(); + spot.catad = catad->getValue(); + spot.saturl = saturl->getValue(); + spot.chroml = chroml->getValue(); + spot.lightl = lightl->getValue(); + spot.lightq = lightq->getValue(); + spot.contl = contl->getValue(); + spot.contthres = contthres->getValue(); + spot.contq = contq->getValue(); + spot.colorfl = colorfl->getValue(); + //spot.LcurveL = LshapeL->getCurve(); + spot.detail = detail->getValue(); + spot.baselog = baselog->getValue(); + spot.sensilog = sensilog->getIntValue(); + spot.strlog = strlog->getValue(); + spot.anglog = anglog->getValue(); + spot.CCmaskcurveL = CCmaskshapeL->getCurve(); + spot.LLmaskcurveL = LLmaskshapeL->getCurve(); + spot.HHmaskcurveL = HHmaskshapeL->getCurve(); + spot.enaLMask = enaLMask->get_active(); + spot.blendmaskL = blendmaskL->getValue(); + spot.radmaskL = radmaskL->getValue(); + spot.chromaskL = chromaskL->getValue(); + spot.LmaskcurveL = LmaskshapeL->getCurve(); + + spot.recothresl = recothresl->getValue(); + spot.lowthresl = lowthresl->getValue(); + spot.higthresl = higthresl->getValue(); + spot.decayl = decayl->getValue(); + + if (sursour->get_active_row_number() == 0) { + spot.sursour = "Average"; + } else if (sursour->get_active_row_number() == 1) { + spot.sursour = "Dim"; + } else if (sursour->get_active_row_number() == 2) { + spot.sursour = "Dark"; + } + + if (surround->get_active_row_number() == 0) { + spot.surround = "Average"; + } else if (surround->get_active_row_number() == 1) { + spot.surround = "Dim"; + } else if (surround->get_active_row_number() == 2) { + spot.surround = "Dark"; + } else if (surround->get_active_row_number() == 3) { + spot.surround = "ExtremelyDark"; + } + + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabLog::enaLMaskChanged() +{ + if (enaLMask->get_active()) { + maskusablel->show(); + maskunusablel->hide(); + + } else { + maskusablel->hide(); + maskunusablel->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enaLMask->get_active()) { + listener->panelChanged(EvLocallabEnaLMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaLMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + + + +void LocallabLog::updateGUIToMode(const modeType new_type) +{ + + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + ciecam->hide(); + ciecam->set_active(false); + sourceabs->hide(); + targabs->hide(); + saturl->hide(); + chroml->hide(); + contl->hide(); + contthres->hide(); + lightl->hide(); + lightq->hide(); + contq->hide(); + colorfl->hide(); + catad->hide(); + surrHBox->hide(); + expL->hide(); + surHBox->hide(); + expmaskL->hide(); + gradlogFrame->hide(); + exprecovl->hide(); + maskusablel->hide(); + maskunusablel->hide(); + decayl->hide(); + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + ciecam->hide(); + ciecam->set_active(true); + + sourceabs->show(); + targabs->show(); + catad->show(); + saturl->show(); + chroml->show(); + lightl->show(); + lightq->show(); + contl->show(); + contthres->show(); + contq->show(); + colorfl->show(); + surrHBox->show(); + expL->hide(); + surHBox->hide(); + expmaskL->show(); + gradlogFrame->show(); + if (enaLMask->get_active()) { + maskusablel->show(); + maskunusablel->hide(); + + } else { + maskusablel->hide(); + maskunusablel->show(); + } + + exprecovl->show(); + decayl->hide(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + ciecam->hide(); + ciecam->set_active(true); + sourceabs->show(); + targabs->show(); + catad->show(); + saturl->show(); + chroml->show(); + lightl->show(); + lightq->show(); + contl->show(); + contthres->show(); + contq->show(); + colorfl->show(); + surrHBox->show(); + expL->show(); + expmaskL->show(); + gradlogFrame->show(); + surHBox->show(); + if (enaLMask->get_active()) { + maskusablel->show(); + maskunusablel->hide(); + + } else { + maskusablel->hide(); + maskunusablel->show(); + } + exprecovl->show(); + decayl->show(); + + } +} + + + + +void LocallabLog::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + ciecam->set_active(false); + contq->setValue(defSpot.contq); + contthres->setValue(defSpot.contthres); + colorfl->setValue(defSpot.colorfl); + lightl->setValue(defSpot.lightl); + lightq->setValue(defSpot.lightq); + sursour->set_active(0); + strlog->setValue(defSpot.strlog); + anglog->setValue(defSpot.anglog); + enaLMask->set_active(false); + recothresl->setValue(defSpot.recothresl); + lowthresl->setValue(defSpot.lowthresl); + higthresl->setValue(defSpot.higthresl); + decayl->setValue(defSpot.decayl); + // Enable all listeners + enableListener(); +} + + +void LocallabLog::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + ciecam->set_active(true); + contq->setValue(defSpot.contq); + colorfl->setValue(defSpot.colorfl); + lightl->setValue(defSpot.lightl); + lightq->setValue(defSpot.lightq); + sursour->set_active(0); +// enaLMask->set_active(true); + decayl->setValue(defSpot.decayl); + // Enable all listeners + enableListener(); + +} + + + +void LocallabLog::showmaskLMethodChanged() +{ + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabLog::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == HHmaskshapeL) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskshapeL, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskshapeL) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskshapeL, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == CCmaskshapeL) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskshapeL, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LmaskshapeL) { + if (listener) { + listener->panelChanged(EvlocallabLmaskshapeL, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + //if (ce == LshapeL) { + // if (listener) { + // listener->panelChanged(EvlocallabLshapeL, + // M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + // } + //} + + } +} + + +void LocallabLog::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default value for adjuster widgets + repar->setDefault(defSpot.repar); + blackEv->setDefault(defSpot.blackEv); + whiteEv->setDefault(defSpot.whiteEv); + sourceGray->setDefault(defSpot.sourceGray); + sourceabs->setDefault(defSpot.sourceabs); + targabs->setDefault(defSpot.targabs); + targetGray->setDefault(defSpot.targetGray); + catad->setDefault(defSpot.catad); + saturl->setDefault(defSpot.saturl); + chroml->setDefault(defSpot.chroml); + lightl->setDefault(defSpot.lightl); + lightq->setDefault(defSpot.lightq); + contl->setDefault(defSpot.contl); + contthres->setDefault(defSpot.contthres); + contq->setDefault(defSpot.contq); + colorfl->setDefault(defSpot.colorfl); + detail->setDefault(defSpot.detail); + baselog->setDefault(defSpot.baselog); + sensilog->setDefault((double)defSpot.sensilog); + strlog->setDefault(defSpot.strlog); + anglog->setDefault(defSpot.anglog); + blendmaskL->setDefault(defSpot.blendmaskL); + radmaskL->setDefault(defSpot.radmaskL); + chromaskL->setDefault(defSpot.chromaskL); + recothresl->setDefault((double)defSpot.recothresl); + lowthresl->setDefault((double)defSpot.lowthresl); + higthresl->setDefault((double)defSpot.higthresl); + decayl->setDefault((double)defSpot.decayl); + + + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabLog::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == repar) { + if (listener) { + listener->panelChanged(Evlocallabrepar, + repar->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blackEv) { + if (listener) { + listener->panelChanged(EvlocallabblackEv, + blackEv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == whiteEv) { + if (listener) { + listener->panelChanged(EvlocallabwhiteEv, + whiteEv->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sourceGray) { + if (listener) { + listener->panelChanged(EvlocallabsourceGray, + sourceGray->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == sourceabs) { + if (listener) { + listener->panelChanged(Evlocallabsourceabs, + sourceabs->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == targabs) { + if (listener) { + listener->panelChanged(Evlocallabtargabs, + targabs->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == targetGray) { + if (listener) { + listener->panelChanged(EvlocallabtargetGray, + targetGray->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == catad) { + if (listener) { + listener->panelChanged(Evlocallabcatad, + catad->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == saturl) { + if (listener) { + listener->panelChanged(Evlocallabsaturl, + saturl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chroml) { + if (listener) { + listener->panelChanged(Evlocallabchroml, + chroml->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lightl) { + if (listener) { + listener->panelChanged(Evlocallablightl, + lightl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lightq) { + if (listener) { + listener->panelChanged(Evlocallablightq, + lightq->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + if (a == contl) { + if (listener) { + listener->panelChanged(Evlocallabcontl, + contl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == contthres) { + if (listener) { + listener->panelChanged(Evlocallabcontthres, + contthres->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == contq) { + if (listener) { + listener->panelChanged(Evlocallabcontq, + contq->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == colorfl) { + if (listener) { + listener->panelChanged(Evlocallabcolorfl, + colorfl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == detail) { + if (listener) { + listener->panelChanged(Evlocallabdetail, + detail->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == baselog) { + if (listener) { + listener->panelChanged(Evlocallabbaselog, + baselog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothresl) { + + if (listener) { + listener->panelChanged(Evlocallabrecothresl, + recothresl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthresl) { + if (listener) { + listener->panelChanged(Evlocallablowthresl, + lowthresl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthresl) { + if (listener) { + listener->panelChanged(Evlocallabhigthresl, + higthresl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decayl) { + if (listener) { + listener->panelChanged(Evlocallabdecayl, + decayl->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + if (a == sensilog) { + if (listener) { + listener->panelChanged(Evlocallabsensilog, + sensilog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strlog) { + if (listener) { + listener->panelChanged(Evlocallabstrlog, + strlog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == anglog) { + if (listener) { + listener->panelChanged(Evlocallabanglog, + anglog->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskL) { + if (listener) { + listener->panelChanged(EvLocallabblendmaskL, + blendmaskL->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskL) { + if (listener) { + listener->panelChanged(EvLocallabradmaskL, + radmaskL->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskL) { + if (listener) { + listener->panelChanged(EvLocallabchromaskL, + chromaskL->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + } +} + +void LocallabLog::updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1) +{ + if (autocompute->get_active()) { + idle_register.add( + [this, blackev, whiteev, sourceg, sourceab, targetg]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update adjuster values according to autocomputed ones + disableListener(); + + blackEv->setValue(blackev); + whiteEv->setValue(whiteev); + sourceGray->setValue(sourceg); + sourceabs->setValue(sourceab); + targetGray->setValue(targetg); + + enableListener(); + + return false; + } + ); + } +} + +void LocallabLog::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenalog, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenalog, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabLog::sursourChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(Evlocallabsursour, + sursour->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void LocallabLog::surroundChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(Evlocallabsurround, + surround->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabLog::autocomputeToggled() +{ + // Update Log Encoding GUI according to autocompute button state + updateLogGUI(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (autocompute->get_active()) { + listener->panelChanged(EvLocallabAuto, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabAuto, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabLog::ciecamChanged() +{ + /* + if(ciecam->get_active()){ + sourceabs->set_sensitive(true); + targabs->set_sensitive(true); + catad->set_sensitive(true); + surrHBox->set_sensitive(true); + + sourceabs->show(); + targabs->show(); + catad->show(); + saturl->show(); + lightl->show(); + contl->show(); + contq->show(); + surrHBox->show(); + } else { + sourceabs->hide(); + targabs->hide(); + saturl->hide(); + contl->hide(); + lightl->hide(); + contq->hide(); + catad->hide(); + surrHBox->hide(); + } +*/ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (ciecam->get_active()) { + listener->panelChanged(Evlocallabciecam, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabciecam, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + + +void LocallabLog::fullimageChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (fullimage->get_active()) { + listener->panelChanged(Evlocallabfullimage, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabfullimage, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabLog::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmaskshapeL->updateLocallabBackground(normChromar); + LLmaskshapeL->updateLocallabBackground(normLumar); + HHmaskshapeL->updateLocallabBackground(normHuer); + LmaskshapeL->updateLocallabBackground(normLumar); + + return false; + } + ); +} + + + +void LocallabLog::AutograyChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (Autogray->get_active()) { + listener->panelChanged(EvlocallabAutogray, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvlocallabAutogray, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabLog::updateLogGUI2() +{ + /* + if(ciecam->get_active()){ + sourceabs->show(); + targabs->show(); + catad->show(); + saturl->show(); + contl->show(); + lightl->show(); + contq->show(); + surrHBox->show(); + } else { + sourceabs->hide(); + targabs->hide(); + catad->hide(); + saturl->hide(); + lightl->hide(); + contl->hide(); + contq->hide(); + surrHBox->hide(); + } + */ +} + + +void LocallabLog::updateLogGUI() +{ + const int mode = complexity->get_active_row_number(); + + if (autocompute->get_active()) { + blackEv->set_sensitive(false); + whiteEv->set_sensitive(false); + sourceGray->set_sensitive(false); + if (mode == Expert || mode == Normal) { + sourceabs->set_sensitive(false); + } else { + sourceabs->hide(); + } + } else { + blackEv->set_sensitive(true); + whiteEv->set_sensitive(true); + sourceGray->set_sensitive(true); + if (mode == Expert || mode == Normal){ + sourceabs->set_sensitive(true); + } else { + sourceabs->hide(); + } + } + if (mode == Expert || mode == Normal) { // Keep widget hidden in Simple mode + exprecovl->show(); + } + +} + + +/* ==== LocallabMask ==== */ +LocallabMask::LocallabMask(): + LocallabTool(this, M("TP_LOCALLAB_MASKCOM_TOOLNAME"), M("TP_LOCALLAB_MASKCOM"), false), + + // Common mask specific widgets + sensimask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + blendmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKMASK"), -100., 100., 0.1, -10.))), + blendmaskab(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKMASKAB"), -100., 100., 0.1, -10.))), + softradiusmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 1.))), + showmask_Method(Gtk::manage(new MyComboBoxText())), + enamask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), +// mask_CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASKCOL"))), + mask_CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmask_shape(static_cast(mask_CurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmask_shape(static_cast(mask_CurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmask_shape(static_cast(mask_CurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + struFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABSTRUM")))), + strumaskmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_STRUMASKCOL"), 0., 200., 0.1, 0.))), + toolmask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_TOOLCOL")))), + blurFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LABBLURM")))), + fftmask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_FFTCOL_MASK")))), + contmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CONTCOL"), 0., 200., 0.5, 0.))), + blurmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLURCOL"), 0.2, 100., 0.5, 0.2))), + toolmaskFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_TOOLMASK")))), + radmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slopmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + shadmask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SHAMASKCOL"), 0, 100, 1, 0))), + mask_HCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASKH"))), + HHhmask_shape(static_cast(mask_HCurveEditorG->addCurve(CT_Flat, "h(h)", nullptr, false, true))), + mask2CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmask_shape(static_cast(mask2CurveEditorG->addCurve(CT_Diagonal, "L(L)"))), + mask2CurveEditorGwav(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAVMASK"))), + LLmask_shapewav(static_cast(mask2CurveEditorGwav->addCurve(CT_Flat, "L(L)", nullptr, false, false))), + csThresholdmask(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLDBLUR"), 0, 9, 0, 0, 6, 5, 0, false))), + gradFramemask(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_GRADFRA")))), + str_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADSTR"), -2., 2., 0.05, 0.))), + ang_mask(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GRADANG"), -180., 180., 0.1, 0.))) +{ + + set_orientation(Gtk::ORIENTATION_VERTICAL); + + const LocallabParams::LocallabSpot defSpot; + + // Parameter Mask common specific widgets + sensimask->setAdjusterListener(this); + + blendmask->setLogScale(10, 0); + blendmask->setAdjusterListener(this); + + blendmaskab->setLogScale(10, 0); + blendmaskab->setAdjusterListener(this); + + softradiusmask->setAdjusterListener(this); + + showmask_Method->append(M("TP_LOCALLAB_SHOWMNONE")); + showmask_Method->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmask_Method->append(M("TP_LOCALLAB_SHOWMASK")); + showmask_Method->append(M("TP_LOCALLAB_SHOWREF")); + showmask_Method->set_active(0); + showmask_Method->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmask_MethodConn = showmask_Method->signal_changed().connect(sigc::mem_fun(*this, &LocallabMask::showmask_MethodChanged)); + + enamaskConn = enamask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabMask::enamaskChanged)); + + mask_CurveEditorG->setCurveListener(this); + + CCmask_shape->setIdentityValue(0.); + CCmask_shape->setResetCurve(FlatCurveType(defSpot.CCmask_curve.at(0)), defSpot.CCmask_curve); + CCmask_shape->setBottomBarColorProvider(this, 1); + + LLmask_shape->setIdentityValue(0.); + LLmask_shape->setResetCurve(FlatCurveType(defSpot.LLmask_curve.at(0)), defSpot.LLmask_curve); + LLmask_shape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmask_shape->setIdentityValue(0.); + HHmask_shape->setResetCurve(FlatCurveType(defSpot.HHmask_curve.at(0)), defSpot.HHmask_curve); + HHmask_shape->setCurveColorProvider(this, 2); + HHmask_shape->setBottomBarColorProvider(this, 2); + + mask_CurveEditorG->curveListComplete(); + + struFrame->set_label_align(0.025, 0.5); + + strumaskmask->setAdjusterListener(this); + + toolmaskConn = toolmask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabMask::toolmaskChanged)); + + blurFrame->set_label_align(0.025, 0.5); + + fftmaskConn = fftmask->signal_toggled().connect(sigc::mem_fun(*this, &LocallabMask::fftmaskChanged)); + + contmask->setAdjusterListener(this); + + blurmask->setAdjusterListener(this); + + toolmaskFrame->set_label_align(0.025, 0.5); + + radmask->setAdjusterListener(this); + + lapmask->setAdjusterListener(this); + + chromask->setAdjusterListener(this); + + gammask->setAdjusterListener(this); + + slopmask->setAdjusterListener(this); + + shadmask->setAdjusterListener(this); + + mask_HCurveEditorG->setCurveListener(this); + + HHhmask_shape->setIdentityValue(0.); + HHhmask_shape->setResetCurve(FlatCurveType(defSpot.HHhmask_curve.at(0)), defSpot.HHhmask_curve); + HHhmask_shape->setCurveColorProvider(this, 2); + HHhmask_shape->setBottomBarColorProvider(this, 2); + + mask_HCurveEditorG->curveListComplete(); + + mask2CurveEditorG->setCurveListener(this); + + Lmask_shape->setResetCurve(DiagonalCurveType(defSpot.Lmask_curve.at(0)), defSpot.Lmask_curve); + Lmask_shape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmask_shape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2CurveEditorG->curveListComplete(); + + mask2CurveEditorGwav->setCurveListener(this); + + LLmask_shapewav->setIdentityValue(0.); + LLmask_shapewav->setResetCurve(FlatCurveType(defSpot.LLmask_curvewav.at(0)), defSpot.LLmask_curvewav); +// LLmask_shapewav->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2CurveEditorGwav->curveListComplete(); + + csThresholdmask->setAdjusterListener(this); + + gradFramemask->set_label_align(0.025, 0.5); + + str_mask->setAdjusterListener(this); + + ang_mask->setAdjusterListener(this); + ang_mask->set_tooltip_text(M("TP_LOCALLAB_GRADANG_TOOLTIP")); + + // Add Common mask specific widgets to GUI + pack_start(*sensimask); + pack_start(*blendmask); + pack_start(*blendmaskab); + pack_start(*softradiusmask); + pack_start(*showmask_Method); + pack_start(*enamask); + pack_start(*mask_CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + ToolParamBlock* const strumBox = Gtk::manage(new ToolParamBlock()); + strumBox->pack_start(*strumaskmask); + strumBox->pack_start(*toolmask); + struFrame->add(*strumBox); + pack_start(*struFrame); + ToolParamBlock* const blurmBox = Gtk::manage(new ToolParamBlock()); + blurmBox->pack_start(*fftmask, Gtk::PACK_SHRINK, 0); + blurmBox->pack_start(*contmask); + blurmBox->pack_start(*blurmask); + blurFrame->add(*blurmBox); + pack_start(*blurFrame); + ToolParamBlock* const toolmaskBox = Gtk::manage(new ToolParamBlock()); + toolmaskBox->pack_start(*radmask, Gtk::PACK_SHRINK, 0); + toolmaskBox->pack_start(*lapmask, Gtk::PACK_SHRINK, 0); + toolmaskBox->pack_start(*chromask, Gtk::PACK_SHRINK, 0); + toolmaskBox->pack_start(*gammask, Gtk::PACK_SHRINK, 0); + toolmaskBox->pack_start(*slopmask, Gtk::PACK_SHRINK, 0); + toolmaskBox->pack_start(*shadmask, Gtk::PACK_SHRINK, 0); + toolmaskBox->pack_start(*mask_HCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolmaskBox->pack_start(*mask2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolmaskBox->pack_start(*mask2CurveEditorGwav, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + toolmaskBox->pack_start(*csThresholdmask, Gtk::PACK_SHRINK, 0); + ToolParamBlock* const gradmaskBox = Gtk::manage(new ToolParamBlock()); + gradmaskBox->pack_start(*str_mask); + gradmaskBox->pack_start(*ang_mask); + gradFramemask->add(*gradmaskBox); + toolmaskBox->pack_start(*gradFramemask, Gtk::PACK_SHRINK, 0); + toolmaskFrame->add(*toolmaskBox); + pack_start(*toolmaskFrame); +} + +LocallabMask::~LocallabMask() +{ + delete mask_CurveEditorG; + delete mask_HCurveEditorG; + delete mask2CurveEditorG; + delete mask2CurveEditorGwav; +} + +bool LocallabMask::isMaskViewActive() +{ + return ((showmask_Method->get_active_row_number() != 0)); +} + +void LocallabMask::resetMaskView() +{ + showmask_MethodConn.block(true); + showmask_Method->set_active(0); + showmask_MethodConn.block(false); +} + +void LocallabMask::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + maskMask = showmask_Method->get_active_row_number(); +} + +void LocallabMask::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + exp->set_tooltip_text(M("TP_LOCALLAB_MASKCOM_TOOLTIP")); + sensimask->set_tooltip_text(M("TP_LOCALLAB_SENSIMASK_TOOLTIP")); + blendmask->set_tooltip_text(M("TP_LOCALLAB_BLENDMASKMASK_TOOLTIP")); + blendmaskab->set_tooltip_text(M("TP_LOCALLAB_BLENDMASKMASK_TOOLTIP")); + CCmask_shape->setTooltip(M("TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP")); + LLmask_shape->setTooltip(M("TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP")); + HHmask_shape->setTooltip(M("TP_LOCALLAB_CURVEEDITORM_CC_TOOLTIP")); + struFrame->set_tooltip_text(M("TP_LOCALLAB_STRUMASK_TOOLTIP")); + radmask->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + mask_HCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_HHMASK_TOOLTIP")); + mask2CurveEditorG->set_tooltip_text(M("TP_LOCALLAB_WAVMASK_TOOLTIP")); + Lmask_shape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + mask2CurveEditorGwav->set_tooltip_text(M("TP_LOCALLAB_WAVMASK_TOOLTIP")); + LLmask_shapewav->setTooltip(M("TP_LOCALLAB_LMASK_LEVEL_TOOLTIP")); + mask_CurveEditorG->set_tooltip_markup(M("TP_LOCALLAB_MASKCURVE_TOOLTIP")); + strumaskmask->set_tooltip_text(M("TP_LOCALLAB_STRUSTRMASK_TOOLTIP")); + blurFrame->set_tooltip_text(M("TP_LOCALLAB_BLURMASK_TOOLTIP")); + toolmask->set_tooltip_text(M("TP_LOCALLAB_TOOLMASK_TOOLTIP")); + toolmaskFrame->set_tooltip_text(M("TP_LOCALLAB_TOOLCOLFRMASK_TOOLTIP")); + fftmask->set_tooltip_text(M("TP_LOCALLAB_FFTMASK_TOOLTIP")); + gammask->set_tooltip_text(M("TP_LOCALLAB_GAMMASK_TOOLTIP")); + chromask->set_tooltip_text(M("TP_LOCALLAB_CHROMASK_TOOLTIP")); + slopmask->set_tooltip_text(M("TP_LOCALLAB_SLOMASK_TOOLTIP")); + shadmask->set_tooltip_text(M("TP_LOCALLAB_SHADMASK_TOOLTIP")); + contmask->set_tooltip_text(M("TP_LOCALLAB_CONTTHMASK_TOOLTIP")); + blurmask->set_tooltip_text(M("TP_LOCALLAB_BLURRMASK_TOOLTIP")); + lapmask->set_tooltip_text(M("TP_LOCALLAB_LAPRAD1_TOOLTIP")); + csThresholdmask->set_tooltip_text(M("TP_LOCALLAB_WAVEMASK_LEVEL_TOOLTIP")); + } else { + exp->set_tooltip_text(""); + sensimask->set_tooltip_text(""); + blendmask->set_tooltip_text(""); + blendmaskab->set_tooltip_text(""); + CCmask_shape->setTooltip(""); + LLmask_shape->setTooltip(""); + HHmask_shape->setTooltip(""); + struFrame->set_tooltip_text(""); + radmask->set_tooltip_text(""); + mask_HCurveEditorG->set_tooltip_text(""); + mask2CurveEditorG->set_tooltip_text(""); + Lmask_shape->setTooltip(""); + mask2CurveEditorGwav->set_tooltip_text(""); + LLmask_shapewav->setTooltip(""); + mask_CurveEditorG->set_tooltip_markup(""); + strumaskmask->set_tooltip_text(""); + blurFrame->set_tooltip_text(""); + toolmask->set_tooltip_text(""); + toolmaskFrame->set_tooltip_text(""); + fftmask->set_tooltip_text(""); + gammask->set_tooltip_text(""); + chromask->set_tooltip_text(""); + slopmask->set_tooltip_text(""); + shadmask->set_tooltip_text(""); + contmask->set_tooltip_text(""); + blurmask->set_tooltip_text(""); + lapmask->set_tooltip_text(""); + csThresholdmask->set_tooltip_text(""); + } +} + +void LocallabMask::disableListener() +{ + LocallabTool::disableListener(); + + showmask_MethodConn.block(true); + enamaskConn.block(true); + toolmaskConn.block(true); + fftmaskConn.block(true); +} + +void LocallabMask::enableListener() +{ + LocallabTool::enableListener(); + + showmask_MethodConn.block(false); + enamaskConn.block(false); + toolmaskConn.block(false); + fftmaskConn.block(false); +} + +void LocallabMask::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + // Disable all listeners + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visimask); + exp->setEnabled(spot.expmask); + complexity->set_active(spot.complexmask); + + sensimask->setValue((double)spot.sensimask); + blendmask->setValue(spot.blendmask); + blendmaskab->setValue(spot.blendmaskab); + softradiusmask->setValue(spot.softradiusmask); + enamask->set_active(spot.enamask); + CCmask_shape->setCurve(spot.CCmask_curve); + LLmask_shape->setCurve(spot.LLmask_curve); + HHmask_shape->setCurve(spot.HHmask_curve); + strumaskmask->setValue(spot.strumaskmask); + toolmask->set_active(spot.toolmask); + fftmask->set_active(spot.fftmask); + contmask->setValue(spot.contmask); + // Update Common mask GUI according to fftmask button state + // Note: Contrary to the others, shall be called before setting blurmask value + updateMaskGUI(); + blurmask->setValue(spot.blurmask); + radmask->setValue(spot.radmask); + lapmask->setValue(spot.lapmask); + chromask->setValue(spot.chromask); + gammask->setValue(spot.gammask); + slopmask->setValue(spot.slopmask); + shadmask->setValue(spot.shadmask); + HHhmask_shape->setCurve(spot.HHhmask_curve); + Lmask_shape->setCurve(spot.Lmask_curve); + LLmask_shapewav->setCurve(spot.LLmask_curvewav); + csThresholdmask->setValue(spot.csthresholdmask); + str_mask->setValue((double)spot.str_mask); + ang_mask->setValue((double)spot.ang_mask); + } + + // Enable all listeners + enableListener(); + + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabMask::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + spot.expmask = exp->getEnabled(); + spot.visimask = exp->get_visible(); + spot.complexmask = complexity->get_active_row_number(); + + spot.sensimask = sensimask->getIntValue(); + spot.blendmask = blendmask->getValue(); + spot.blendmaskab = blendmaskab->getValue(); + spot.softradiusmask = softradiusmask->getValue(); + spot.enamask = enamask->get_active(); + spot.CCmask_curve = CCmask_shape->getCurve(); + spot.LLmask_curve = LLmask_shape->getCurve(); + spot.HHmask_curve = HHmask_shape->getCurve(); + spot.strumaskmask = strumaskmask->getValue(); + spot.toolmask = toolmask->get_active(); + spot.fftmask = fftmask->get_active(); + spot.contmask = contmask->getValue(); + spot.blurmask = blurmask->getValue(); + spot.radmask = radmask->getValue(); + spot.lapmask = lapmask->getValue(); + spot.chromask = chromask->getValue(); + spot.gammask = gammask->getValue(); + spot.slopmask = slopmask->getValue(); + spot.shadmask = shadmask->getValue(); + spot.HHhmask_curve = HHhmask_shape->getCurve(); + spot.Lmask_curve = Lmask_shape->getCurve(); + spot.LLmask_curvewav = LLmask_shapewav->getCurve(); + spot.csthresholdmask = csThresholdmask->getValue(); + spot.str_mask = str_mask->getIntValue(); + spot.ang_mask = ang_mask->getIntValue(); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabMask::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + // Set default value for adjuster widgets + sensimask->setDefault((double)defSpot.sensimask); + blendmask->setDefault(defSpot.blendmask); + blendmaskab->setDefault(defSpot.blendmaskab); + softradiusmask->setDefault(defSpot.softradiusmask); + strumaskmask->setDefault(defSpot.strumaskmask); + contmask->setDefault(defSpot.contmask); + blurmask->setDefault(defSpot.blurmask); + radmask->setDefault(defSpot.radmask); + lapmask->setDefault(defSpot.lapmask); + chromask->setDefault(defSpot.chromask); + gammask->setDefault(defSpot.lapmask); + slopmask->setDefault(defSpot.slopmask); + shadmask->setDefault(defSpot.shadmask); + csThresholdmask->setDefault(defSpot.csthresholdmask); + str_mask->setDefault((double)defSpot.str_mask); + ang_mask->setDefault((double)defSpot.ang_mask); + } + + // Note: No need to manage pedited as batch mode is deactivated for Locallab +} + +void LocallabMask::adjusterChanged(Adjuster* a, double newval) +{ + if (isLocActivated && exp->getEnabled()) { + + if (a == sensimask) { + if (listener) { + listener->panelChanged(Evlocallabsensimask, + sensimask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmask) { + if (listener) { + listener->panelChanged(Evlocallabblendmask, + blendmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blendmaskab) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskab, + blendmaskab->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == softradiusmask) { + if (listener) { + listener->panelChanged(Evlocallabsoftradiusmask, + softradiusmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == strumaskmask) { + if (listener) { + listener->panelChanged(Evlocallabstrumaskmask, + strumaskmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == contmask) { + if (listener) { + listener->panelChanged(Evlocallabcontmask, + contmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == blurmask) { + if (listener) { + listener->panelChanged(Evlocallabblurmask, + blurmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmask) { + if (listener) { + listener->panelChanged(Evlocallabradmask, + radmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmask) { + if (listener) { + listener->panelChanged(Evlocallablapmask, + lapmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromask) { + if (listener) { + listener->panelChanged(Evlocallabchromask, + chromask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammask) { + if (listener) { + listener->panelChanged(Evlocallabgammask, + gammask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slopmask) { + if (listener) { + listener->panelChanged(Evlocallabslopmask, + slopmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == shadmask) { + if (listener) { + listener->panelChanged(Evlocallabshadmask, + shadmask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == str_mask) { + if (listener) { + listener->panelChanged(Evlocallabstr_mask, + str_mask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == ang_mask) { + if (listener) { + listener->panelChanged(Evlocallabang_mask, + ang_mask->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + } +} + +void LocallabMask::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ + if (isLocActivated && exp->getEnabled()) { + if (a == csThresholdmask) { + if (listener) { + listener->panelChanged(EvlocallabcsThresholdmask, + csThresholdmask->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabMask::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + if (ce == CCmask_shape) { + if (listener) { + listener->panelChanged(EvlocallabCCmask_shape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmask_shape) { + if (listener) { + listener->panelChanged(EvlocallabLLmask_shape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmask_shape) { + if (listener) { + listener->panelChanged(EvlocallabHHmask_shape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHhmask_shape) { + if (listener) { + listener->panelChanged(EvlocallabHHhmask_shape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmask_shape) { + if (listener) { + listener->panelChanged(EvlocallabLmask_shape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmask_shapewav) { + if (listener) { + listener->panelChanged(EvlocallabLLmask_shapewav, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + } +} + +void LocallabMask::complexityModeChanged() +{ + if (complexity->get_active_row_number() == Simple) { // New selected mode is Simple one + // Convert tool widget parameters + convertParamToNormal(); // From Expert mode to Normal mode + convertParamToSimple(); // From Normal mode to Simple mode + // Update GUI based on new mode + updateGUIToMode(Simple); + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_SIMPLE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } else if (complexity->get_active_row_number() == Normal) { // New selected mode is Normal one + // Convert tool widget parameters + convertParamToNormal(); + // Update GUI based on new mode + updateGUIToMode(Normal); + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_NORMAL") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } else if (complexity->get_active_row_number() == Expert) { // New selected mode is Expert one + // Update GUI based on new mode + updateGUIToMode(Expert); + + if (listener && isLocActivated) { + listener->panelChanged(EvlocallabcomplexityWithRefresh, + M("TP_LOCALLAB_MODE_EXPERT") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void LocallabMask::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocena_mask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocena_mask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabMask::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden GUI widgets in Normal mode to default spot values + softradiusmask->setValue(defSpot.softradiusmask); + strumaskmask->setValue(defSpot.strumaskmask); + toolmask->set_active(defSpot.toolmask); + fftmask->set_active(defSpot.fftmask); + contmask->setValue(defSpot.contmask); + blurmask->setValue(defSpot.blurmask); + lapmask->setValue(defSpot.lapmask); + gammask->setValue(defSpot.gammask); + slopmask->setValue(defSpot.slopmask); + shadmask->setValue(defSpot.shadmask); + HHhmask_shape->setCurve(defSpot.HHhmask_curve); + LLmask_shapewav->setCurve(defSpot.LLmask_curvewav); + csThresholdmask->setValue(defSpot.csthresholdmask); + str_mask->setValue((double)defSpot.str_mask); + ang_mask->setValue((double)defSpot.ang_mask); + + // Enable all listeners + enableListener(); + + // Update GUI based on converted widget parameters: + // - Update Common mask GUI according to fftmask button state + updateMaskGUI(); +} + +void LocallabMask::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + + // Set hidden specific GUI widgets in Simple mode to default spot values + gammask->setValue(defSpot.gammask); + slopmask->setValue(defSpot.slopmask); + //Lmask_shape->setCurve(defSpot.Lmask_curve); + + // Enable all listeners + enableListener(); +} + +void LocallabMask::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + // Expert and Normal mode widgets are hidden in Simple mode + softradiusmask->show(); + toolmaskFrame->show(); + struFrame->hide(); + blurFrame->hide(); + gammask->hide(); + slopmask->hide(); + shadmask->hide(); + lapmask->hide(); + mask_HCurveEditorG->hide(); + mask2CurveEditorGwav->hide(); + csThresholdmask->hide(); + gradFramemask->hide(); + + break; + + case Normal: + // Expert mode widgets are hidden in Normal mode + softradiusmask->show(); + struFrame->hide(); + blurFrame->hide(); + lapmask->hide(); + gammask->show(); + slopmask->show(); + shadmask->hide(); + mask_HCurveEditorG->hide(); + mask2CurveEditorGwav->hide(); + csThresholdmask->hide(); + gradFramemask->hide(); + // Specific Simple mode widgets are shown in Normal mode + toolmaskFrame->show(); + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + softradiusmask->show(); + struFrame->show(); + blurFrame->show(); + toolmaskFrame->show(); + lapmask->show(); + gammask->show(); + slopmask->show(); + shadmask->show(); + mask_HCurveEditorG->show(); + mask2CurveEditorGwav->show(); + csThresholdmask->show(); + gradFramemask->show(); + } + +} + +void LocallabMask::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + CCmask_shape->updateLocallabBackground(normChromar); + LLmask_shape->updateLocallabBackground(normLumar); + HHmask_shape->updateLocallabBackground(normHuer); + HHhmask_shape->updateLocallabBackground(normHuer); + Lmask_shape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + +void LocallabMask::showmask_MethodChanged() +{ + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + +void LocallabMask::enamaskChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enamask->get_active()) { + listener->panelChanged(EvLocallabEnaMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnaMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabMask::toolmaskChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (toolmask->get_active()) { + listener->panelChanged(EvLocallabtoolmask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabtoolmask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabMask::fftmaskChanged() +{ + // Update Common mask GUI according to fftmask button state + updateMaskGUI(); + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (fftmask->get_active()) { + listener->panelChanged(EvLocallabfftmask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabfftmask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void LocallabMask::updateMaskGUI() +{ + const double temp = blurmask->getValue(); + + if (fftmask->get_active()) { + blurmask->setLimits(0.2, 1000., 0.5, 0.2); + } else { + blurmask->setLimits(0.2, 100., 0.5, 0.2); + } + + blurmask->setValue(temp); +} + +/*==== Locallabcie ====*/ +Locallabcie::Locallabcie(): + LocallabTool(this, M("TP_LOCALLAB_CIE_TOOLNAME"), M("TP_LOCALLAB_CIE"), false), + // ciecam specific widgets + sensicie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SENSI"), 0, 100, 1, 60))), + reparcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGREPART"), 1.0, 100.0, 1., 100.0))), + jabcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JAB")))), + modecam(Gtk::manage (new MyComboBoxText ())), + modecie(Gtk::manage (new MyComboBoxText ())), + jzFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZFRA")))), + modeHBoxcam(Gtk::manage(new Gtk::Box())), + modeHBoxcie(Gtk::manage(new Gtk::Box())), + cieFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOGFRA")))), + Autograycie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AUTOGRAYCIE")))), + sourceGraycie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_GRAY"), 1.0, 100.0, 0.1, 18.0))), + sourceabscie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 2000.0))), + sursourcie(Gtk::manage (new MyComboBoxText ())), + surHBoxcie(Gtk::manage(new Gtk::Box())), + cie1Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG1FRA")))), + cie1lightFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIELIGHTFRA")))), + cie1contFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIECONTFRA")))), + cie1colorFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIECOLORFRA")))), + czlightFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIELIGHTCONTFRA")))), + czcolorFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CIECOLORFRA")))), + PQFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZPQFRA")))), + qtoj(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZQTOJ")))), + lightlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTL"), -100., 100., 0.01, 0.))), + lightjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZLIGHT"), -100., 100., 0.01, 0.))), + contjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCONT"), -100., 100., 0.5, 0.))), + adapjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZADAP"), 1., 10., 0.05, 4.))), + jz100(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZ100"), 0.10, 0.90, 0.01, 0.25))), + pqremap(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZPQREMAP"), 100., 10000., 0.1, 120.))), + pqremapcam16(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CAM16PQREMAP"), 100., 10000., 0.1, 100.))), + forcejz(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZFORCE")))), + expjz(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), + jzshFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZSHFRA")))), + hljzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), 0., 100., 1., 0.))), + hlthjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_HLTONALW"), 20., 100., 1., 70.))), + shjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_SHADOWS"), 0., 100., 1., 0.))), + shthjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_SHTONALW"), 20., 100., 1., 40.))), + radjzcie(Gtk::manage(new Adjuster(M("TP_SHADOWSHLIGHTS_RADIUS"), 0., 100., 1., 40.))), + expwavjz(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_JZWAVEXP")))), + contFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CONTWFRA")))), + sigmalcjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMAWAV"), 0.2, 2.5, 0.01, 1.))), + LocalcurveEditorwavjz(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_WAV"))), + wavshapejz(static_cast(LocalcurveEditorwavjz->addCurve(CT_Flat, "", nullptr, false, false))), + csThresholdjz(Gtk::manage(new ThresholdAdjuster(M("TP_LOCALLAB_CSTHRESHOLD"), 0, 9, 0, 0, 7, 4, 0, false))), + clariFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_CLARIFRA")))), + clarilresjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCLARILRES"), -20., 100., 0.5, 0.))), + claricresjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCLARICRES"), -20., 100., 0.5, 0.))), + clarisoftjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOFTRADIUSCOL"), 0.0, 100.0, 0.5, 0.))), + + expcam16(Gtk::manage(new MyExpander(false, Gtk::manage(new Gtk::Box())))), + lightqcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTQ"), -100., 100., 0.05, 0.))), + contlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTL"), -100., 100., 0.5, 0.))), + contqcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONQL"), -100., 100., 0.5, 0.))), + contthrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTHRES"), -1., 1., 0.01, 0.))), + + logjzFrame(Gtk::manage(new Gtk::Frame())), + logjz(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZLOG")))), + blackEvjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLACK_EV"), -16.0, 0.0, 0.1, -5.0))), + whiteEvjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_WHITE_EV"), 0., 32.0, 0.1, 10.0))), + targetjz(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZTARGET_EV"), 4., 80.0, 0.1, 18.0))), + bevwevFrame(Gtk::manage(new Gtk::Frame())), + forcebw(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_BWFORCE")))), + + sigmoidFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SIGFRA")))), + sigq(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SIGFRA")))), + sigmoidldacie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDLAMBDA"), 0.0, 1., 0.01, 0.5))), + sigmoidthcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDTH"), 0.1, 4., 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + sigmoidblcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDBL"), 0.5, 1.5, 0.01, 1.))), + sigmoidqjcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SIGMOIDQJ")))), + logcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_LOGCIE")))), + sigmoidjzFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_SIGJZFRA")))), + sigjz(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_SIGJZFRA")))), + sigmoidldajzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDLAMBDA"), 0., 1.0, 0.01, 0.5))), + sigmoidthjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDTH"), 0.1, 4., 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + sigmoidbljzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SIGMOIDBL"), 0.5, 1.5, 0.01, 1.))), + colorflcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCOLORFL"), -100., 100., 0.5, 0.))), + saturlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATURV"), -100., 100., 0.5, 0.))), + rstprotectcie(Gtk::manage(new Adjuster(M("TP_COLORAPP_RSTPRO"), 0., 100., 0.1, 0.))), + chromlcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROML"), -100., 100., 0.5, 0.))), + huecie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_HUECIE"), -100., 100., 0.1, 0.))), + cieCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_CURVES_CIE"))), + toneMethodcie(Gtk::manage(new MyComboBoxText())), + shapecie(static_cast(cieCurveEditorG->addCurve(CT_Diagonal, "", toneMethodcie))), + cieCurveEditorG2(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_COLOR_CIE"))), + toneMethodcie2(Gtk::manage(new MyComboBoxText())), + shapecie2(static_cast(cieCurveEditorG2->addCurve(CT_Diagonal, "", toneMethodcie2))), + + chromjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZCHROM"), -100., 100., 0.5, 0.))), + saturjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZSAT"), -100., 100., 0.5, 0.))), + huejzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZHUECIE"), -100., 100., 0.1, 0.))), + jz1CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + shapejz(static_cast(jz1CurveEditorG->addCurve(CT_Diagonal, "Jz(J)"))), + shapecz(static_cast(jz1CurveEditorG->addCurve(CT_Diagonal, "Cz(C)"))), + + HFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZHFRA")))), + JzHFramejz(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_JZHJZFRA")))), + jz2CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + jz3CurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + shapeczjz(static_cast(jz1CurveEditorG->addCurve(CT_Diagonal, "Cz(J)"))), + HHshapejz(static_cast(jz3CurveEditorG->addCurve(CT_Flat, "Hz(Hz)", nullptr, false, true))), + CHshapejz(static_cast(jz3CurveEditorG->addCurve(CT_Flat, "Cz(Hz)", nullptr, false, true))), + LHshapejz(static_cast(jz2CurveEditorG->addCurve(CT_Flat, "Jz(Hz)", nullptr, false, true))), + softjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZSOFTCIE"), 0., 100., 0.1, 0.))), + thrhjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZTHRHCIE"), 40., 150., 0.5, 60.))), + chjzcie(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_JZCH")))), + strsoftjzcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_JZSTRSOFTCIE"), 0, 100., 0.5, 100.))), + +/* + ciezFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_ZCAMFRA")))), + + lightlzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTL"), -100., 100., 0.5, 0.))), + lightqzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGLIGHTQ"), -100., 100., 0.05, 0.))), + contlzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONTL"), -100., 100., 0.5, 0.))), + contqzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCONQL"), -100., 100., 0.5, 0.))), + contthreszcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_ZCAMTHRES"), 0., 1., 0.01, 0.))), + colorflzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LOGCOLORFL"), -100., 100., 0.5, 0.))), + saturzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SATURV"), -100., 100., 0.5, 0.))), + chromzcam(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROML"), -100., 100., 0.5, 0.))), +*/ + expLcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_CIETOOLEXP")))), + cie2Frame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_LOG2FRA")))), + targetGraycie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_TARGET_GRAY"), 5.0, 80.0, 0.1, 18.0))), + targabscie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SOURCE_ABS"), 0.01, 16384.0, 0.01, 16.0))), + detailcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_DETAIL"), 0., 100., 0.1, 0.))), + catadcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CATAD"), -100., 100., 0.5, 0., Gtk::manage(new RTImage("circle-blue-small.png")), Gtk::manage(new RTImage("circle-orange-small.png"))))), + surroundcie(Gtk::manage (new MyComboBoxText ())), + surrHBoxcie(Gtk::manage(new Gtk::Box())), + exprecovcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_DENOI2_EXP")))), + maskusablecie(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUSABLE")))), + maskunusablecie(Gtk::manage(new Gtk::Label(M("TP_LOCALLAB_MASKUNUSABLE")))), + recothrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKRECOTHRES"), 0., 2., 0.01, 1.))), + lowthrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHRLOW"), 1., 80., 0.5, 12.))), + higthrescie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKLCTHR"), 20., 99., 0.5, 85.))), + decaycie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_MASKDDECAY"), 0.5, 4., 0.1, 2.))), + expmaskcie(Gtk::manage(new MyExpander(false, M("TP_LOCALLAB_SHOWS")))), + showmaskcieMethod(Gtk::manage(new MyComboBoxText())), + enacieMask(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_ENABLE_MASK")))), +// maskSHCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK"))), + maskcieCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, "", 1)), + CCmaskcieshape(static_cast(maskcieCurveEditorG->addCurve(CT_Flat, "C", nullptr, false, false))), + LLmaskcieshape(static_cast(maskcieCurveEditorG->addCurve(CT_Flat, "L", nullptr, false, false))), + HHmaskcieshape(static_cast(maskcieCurveEditorG->addCurve(CT_Flat, "LC(h)", nullptr, false, true))), + blendmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_BLENDMASKCOL"), -100, 100, 1, 0))), + radmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_RADMASKCOL"), 0.0, 100.0, 0.1, 0.))), + lapmaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_LAPMASKCOL"), 0.0, 100.0, 0.1, 0.))), + chromaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_CHROMASKCOL"), -100.0, 100.0, 0.1, 0.))), + gammaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_GAMMASKCOL"), 0.25, 4.0, 0.01, 1.))), + slomaskcie(Gtk::manage(new Adjuster(M("TP_LOCALLAB_SLOMASKCOL"), 0.0, 15.0, 0.1, 0.))), + mask2cieCurveEditorG(new CurveEditorGroup(options.lastlocalCurvesDir, M("TP_LOCALLAB_MASK2"))), + Lmaskcieshape(static_cast(mask2cieCurveEditorG->addCurve(CT_Diagonal, "L(L)"))) + + + { + set_orientation(Gtk::ORIENTATION_VERTICAL); + + // Parameter Ciecam specific widgets + const LocallabParams::LocallabSpot defSpot; + reparcie->setAdjusterListener(this); + sensicie->setAdjusterListener(this); + + + pack_start(*sensicie); + pack_start(*reparcie); + modeHBoxcam->set_spacing (2); + //modeHBoxcam->set_tooltip_markup (M ("TP_LOCALLAB_CAMMODE_TOOLTIP")); + Gtk::Label* modeLabelcam = Gtk::manage (new Gtk::Label (M ("TP_LOCALLAB_CAMMODE") + ":")); + modeHBoxcam->pack_start (*modeLabelcam, Gtk::PACK_SHRINK); + modecam->append (M ("TP_LOCALLAB_CAMMODE_CAM16")); + modecam->append (M ("TP_LOCALLAB_CAMMODE_JZ")); + // modecam->append (M ("TP_LOCALLAB_CAMMODE_ALL")); +// modecam->append (M ("TP_LOCALLAB_CAMMODE_ZCAM")); + modecam->set_active (0); + modeHBoxcam->pack_start (*modecam); + modecamconn = modecam->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::modecamChanged) ); + pack_start(*modeHBoxcam); + + modeHBoxcie->set_spacing (2); + modeHBoxcie->set_tooltip_markup (M ("TP_LOCALLAB_CIEMODE_TOOLTIP")); + Gtk::Label* modeLabel = Gtk::manage (new Gtk::Label (M ("TP_LOCALLAB_CIEMODE") + ":")); + modeHBoxcie->pack_start (*modeLabel, Gtk::PACK_SHRINK); + modecie->append (M ("TP_LOCALLAB_CIEMODE_COM")); + modecie->append (M ("TP_LOCALLAB_CIEMODE_TM")); + modecie->append (M ("TP_LOCALLAB_CIEMODE_WAV")); + modecie->append (M ("TP_LOCALLAB_CIEMODE_DR")); +// modecie->append (M ("TP_LOCALLAB_CIEMODE_LOG")); + modecie->set_active (0); + modeHBoxcie->pack_start (*modecie); + modecieconn = modecie->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::modecieChanged) ); + pack_start(*modeHBoxcie); + + surHBoxcie->set_spacing (2); + surHBoxcie->set_tooltip_markup (M ("TP_LOCALLAB_LOGSURSOUR_TOOLTIP")); + Gtk::Label* surLabel = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surHBoxcie->pack_start (*surLabel, Gtk::PACK_SHRINK); + sursourcie->append (M ("TP_COLORAPP_SURROUND_AVER")); + sursourcie->append (M ("TP_COLORAPP_SURROUND_DIM")); + sursourcie->append (M ("TP_COLORAPP_SURROUND_DARK")); + sursourcie->set_active (0); + surHBoxcie->pack_start (*sursourcie); + sursourcieconn = sursourcie->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::sursourcieChanged) ); + + cieFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const cieFBox = Gtk::manage(new ToolParamBlock()); + cieFBox->pack_start(*Autograycie); + cieFBox->pack_start(*sourceGraycie); + cieFBox->pack_start(*sourceabscie); + cieFBox->pack_start(*pqremapcam16); + PQFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const PQFBox = Gtk::manage(new ToolParamBlock()); + PQFBox->pack_start(*adapjzcie); + PQFBox->pack_start(*jz100); + PQFBox->pack_start(*pqremap); +// PQFBox->pack_start(*forcejz); +// PQFBox->pack_start(*contthreszcam); + PQFrame->add(*PQFBox); + cieFBox->pack_start (*PQFrame); + logjzFrame->set_label_align(0.025, 0.5); + logjzFrame->set_label_widget(*logjz); + // Gtk::Separator* const separatorjz = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + ToolParamBlock* const logjzBox = Gtk::manage(new ToolParamBlock()); + //logjzBox->pack_start(*blackEvjz); + // logjzBox->pack_start(*whiteEvjz); + // logjzBox->pack_start(*separatorjz); + logjzBox->pack_start(*targetjz); + logjzFrame->add(*logjzBox); + cieFBox->pack_start (*logjzFrame); + bevwevFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const bevwevBox = Gtk::manage(new ToolParamBlock()); + bevwevBox->pack_start(*blackEvjz); + bevwevBox->pack_start(*whiteEvjz); + bevwevFrame->add(*bevwevBox); + cieFBox->pack_start (*bevwevFrame); + + sigmoidFrame->set_label_align(0.025, 0.5); + sigmoidFrame->set_label_widget(*sigq); + ToolParamBlock* const sigBox = Gtk::manage(new ToolParamBlock()); + Gtk::Separator* const separatorsig = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + + sigBox->pack_start(*sigmoidldacie); + sigBox->pack_start(*sigmoidthcie); + sigBox->pack_start(*sigmoidblcie); + sigBox->pack_start(*sigmoidqjcie); + sigBox->pack_start(*separatorsig); + sigBox->pack_start(*logcie); + sigmoidFrame->add(*sigBox); + cieFBox->pack_start(*sigmoidFrame); + + + sigmoidjzFrame->set_label_align(0.025, 0.5); + sigmoidjzFrame->set_label_widget(*sigjz); + ToolParamBlock* const sigjzBox = Gtk::manage(new ToolParamBlock()); + sigjzBox->pack_start(*sigmoidldajzcie); + sigjzBox->pack_start(*sigmoidthjzcie); + sigjzBox->pack_start(*sigmoidbljzcie); + sigjzBox->pack_start(*forcebw); + sigmoidjzFrame->add(*sigjzBox); + + // jzBox->pack_start(*sigmoidjzFrame); + cieFBox->pack_start(*sigmoidjzFrame); + + cieFBox->pack_start (*surHBoxcie); + cieFrame->add(*cieFBox); + pack_start(*cieFrame); + + ToolParamBlock* const jzallBox = Gtk::manage(new ToolParamBlock()); + Gtk::Box *TittleVBoxjz; + TittleVBoxjz = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBoxjz->set_spacing(2); + Gtk::Box* const LCTitleHBoxjz = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabeljz = Gtk::manage(new Gtk::Label()); + LCLabeljz->set_markup(Glib::ustring("") + (M("TP_LOCALLAB_JZFRA")) + Glib::ustring("")); + LCTitleHBoxjz->pack_start(*LCLabeljz, Gtk::PACK_SHRINK); + TittleVBoxjz->pack_start(*LCTitleHBoxjz, Gtk::PACK_SHRINK); + expjz->setLabel(TittleVBoxjz); + + setExpandAlignProperties(expjz, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + float R, G, B; + std::vector six_shape; + for (int i = 0; i < 6; i++) { + const float x = static_cast(i) * (1.f / 6.f); + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + six_shape.emplace_back(x, R, G, B); + } + std::vector milestone; + milestone.push_back ( GradientMilestone (0., 0., 0., 0.) ); + milestone.push_back ( GradientMilestone (1., 1., 1., 1.) ); + + jz1CurveEditorG->setCurveListener(this); + shapejz->setResetCurve(DiagonalCurveType(defSpot.jzcurve.at(0)), defSpot.jzcurve); + shapejz->setBottomBarBgGradient (milestone); + shapejz->setLeftBarBgGradient (milestone); + + shapecz->setResetCurve(DiagonalCurveType(defSpot.czcurve.at(0)), defSpot.czcurve); + + std::vector shapeczMilestones; +// float R, G, B; + shapecz->setBottomBarColorProvider (this, 1); + shapecz->setLeftBarColorProvider (this, 1); + shapecz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + for (int i = 0; i < 7; i++) { + float x = float (i) * (1.0f / 6.f); + Color::hsv2rgb01 (x, 0.5f, 0.5f, R, G, B); + shapeczMilestones.push_back ( GradientMilestone (double (x), double (R), double (G), double (B)) ); + } + + shapecz->setBottomBarBgGradient (shapeczMilestones); + shapecz->setLeftBarBgGradient (shapeczMilestones); + shapecz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + shapeczjz->setLeftBarColorProvider (this, 1); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + shapeczjz->setResetCurve(DiagonalCurveType(defSpot.czjzcurve.at(0)), defSpot.czjzcurve); + shapeczjz->setBottomBarBgGradient (milestone); + shapeczjz->setLeftBarBgGradient (shapeczMilestones); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + + jz1CurveEditorG->curveListComplete(); +/* + jz2CurveEditorG->setCurveListener(this); + shapeczjz->setLeftBarColorProvider (this, 1); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + shapeczjz->setResetCurve(DiagonalCurveType(defSpot.czjzcurve.at(0)), defSpot.czjzcurve); + shapeczjz->setBottomBarBgGradient (milestone); + shapeczjz->setLeftBarBgGradient (shapeczMilestones); + shapeczjz->setRangeDefaultMilestones (0.05, 0.2, 0.58); + jz2CurveEditorG->curveListComplete(); +*/ + jz2CurveEditorG->setCurveListener(this); + LHshapejz->setIdentityValue(0.); + LHshapejz->setResetCurve(FlatCurveType(defSpot.LHcurvejz.at(0)), defSpot.LHcurvejz); + // LHshapejz->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + LHshapejz->setCurveColorProvider(this, 3); + LHshapejz->setBottomBarBgGradient(six_shape); + jz2CurveEditorG->curveListComplete(); + + jz3CurveEditorG->setCurveListener(this); + + CHshapejz->setIdentityValue(0.); + CHshapejz->setResetCurve(FlatCurveType(defSpot.CHcurvejz.at(0)), defSpot.CHcurvejz); + // CHshapejz->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + CHshapejz->setCurveColorProvider(this, 3); + CHshapejz->setBottomBarBgGradient(six_shape); + + HHshapejz->setIdentityValue(0.); + HHshapejz->setResetCurve(FlatCurveType(defSpot.HHcurvejz.at(0)), defSpot.HHcurvejz); + // HHshapejz->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP")); + HHshapejz->setCurveColorProvider(this, 3); + HHshapejz->setBottomBarBgGradient(six_shape); + + + jz3CurveEditorG->curveListComplete(); + + jzFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const jzBox = Gtk::manage(new ToolParamBlock()); + jzBox->pack_start(*qtoj); + czlightFrame->set_label_align(0.025, 0.5); + czcolorFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const ciePzlightBox = Gtk::manage(new ToolParamBlock()); + ciePzlightBox->pack_start(*lightjzcie); + ciePzlightBox->pack_start(*contjzcie); + czlightFrame->add(*ciePzlightBox); + jzBox->pack_start(*czlightFrame); + + ToolParamBlock* const ciePzcolorBox = Gtk::manage(new ToolParamBlock()); + ciePzcolorBox->pack_start(*chromjzcie); + ciePzcolorBox->pack_start(*saturjzcie); + ciePzcolorBox->pack_start(*huejzcie); + czcolorFrame->add(*ciePzcolorBox); + jzBox->pack_start(*czcolorFrame); + + jzBox->pack_start(*jz1CurveEditorG, Gtk::PACK_SHRINK, 4); + HFramejz->set_label_align(0.025, 0.5); + ToolParamBlock* const jzHHBox = Gtk::manage(new ToolParamBlock()); + JzHFramejz->set_label_align(0.025, 0.5); + ToolParamBlock* const jzHBox = Gtk::manage(new ToolParamBlock()); + + jzHBox->pack_start(*jz2CurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + jzHBox->pack_start(*thrhjzcie); + JzHFramejz->add(*jzHBox); + jzHHBox->pack_start(*JzHFramejz); + + jzHHBox->pack_start(*jz3CurveEditorG, Gtk::PACK_SHRINK, 4); // jzBox->pack_start(*adapjzcie); + jzHHBox->pack_start(*softjzcie); + HFramejz->add(*jzHHBox); + jzBox->pack_start(*HFramejz); + /* + sigmoidjzFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const sigjzBox = Gtk::manage(new ToolParamBlock()); + sigjzBox->pack_start(*sigmoidldajzcie); + sigjzBox->pack_start(*sigmoidthjzcie); + sigjzBox->pack_start(*sigmoidbljzcie); + sigjzBox->pack_start(*jabcie); + sigmoidjzFrame->add(*sigjzBox); + + // jzBox->pack_start(*sigmoidjzFrame); + */ + jzshFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const jzshBox = Gtk::manage(new ToolParamBlock()); + jzshBox->pack_start(*hljzcie); + jzshBox->pack_start(*hlthjzcie); + jzshBox->pack_start(*shjzcie); + jzshBox->pack_start(*shthjzcie); + jzshBox->pack_start(*radjzcie); + jzshFrame->add(*jzshBox); + jzBox->pack_start(*jzshFrame); + + setExpandAlignProperties(expwavjz, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + contFramejz->set_label_align(0.025, 0.5); + + sigmalcjz->setAdjusterListener(this); + + LocalcurveEditorwavjz->setCurveListener(this); + wavshapejz->setIdentityValue(0.); + wavshapejz->setResetCurve(FlatCurveType(defSpot.locwavcurvejz.at(0)), defSpot.locwavcurvejz); + LocalcurveEditorwavjz->curveListComplete(); + csThresholdjz->setAdjusterListener(this); + + ToolParamBlock* const coBox2jz = Gtk::manage(new ToolParamBlock()); + coBox2jz->pack_start(*csThresholdjz); + ToolParamBlock* const coBoxjz = Gtk::manage(new ToolParamBlock()); + coBoxjz->pack_start(*sigmalcjz); + coBoxjz->pack_start(*LocalcurveEditorwavjz, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + contFramejz->add(*coBoxjz); + coBox2jz->pack_start(*contFramejz); + + clarilresjz->setAdjusterListener(this); + claricresjz->setAdjusterListener(this); + clarisoftjz->setAdjusterListener(this); + + clariFramejz->set_label_align(0.025, 0.5); + ToolParamBlock* const coBox3jz = Gtk::manage(new ToolParamBlock()); + coBox3jz->pack_start(*clarilresjz); + coBox3jz->pack_start(*claricresjz); + coBox3jz->pack_start(*clarisoftjz); + clariFramejz->add(*coBox3jz); + coBox2jz->pack_start(*clariFramejz); + expwavjz->add(*coBox2jz, false); + + jzBox->pack_start(*expwavjz, false, false); + + jzallBox->add(*jzBox); + + expjz->add(*jzallBox, false); + + jabcieConn = jabcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::jabcieChanged)); + AutograycieConn = Autograycie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::AutograycieChanged)); + sigmoidqjcieconn = sigmoidqjcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::sigmoidqjcieChanged)); + logcieconn = logcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::logcieChanged)); + logjzconn = logjz->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::logjzChanged)); + sigjzconn = sigjz->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::sigjzChanged)); + sigqconn = sigq->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::sigqChanged)); + forcejzConn = forcejz->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::forcejzChanged)); + qtojConn = qtoj->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::qtojChanged)); + chjzcieconn = chjzcie->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::chjzcieChanged)); + forcebwConn = forcebw->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::forcebwChanged)); + + sourceGraycie->setAdjusterListener(this); + sourceGraycie->setLogScale(10, 18, true); + + sourceabscie->setLogScale(500, 0); + + sourceabscie->setAdjusterListener(this); + setExpandAlignProperties(expLcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + saturlcie->setAdjusterListener(this); + + rstprotectcie->setAdjusterListener(this); + + chromlcie->setAdjusterListener(this); + huecie->setAdjusterListener(this); + + + cieCurveEditorG->setCurveListener(this); + toneMethodcie->append (M ("TP_COLORAPP_TCMODE_LIGHTNESS")); + toneMethodcie->append (M ("TP_COLORAPP_TCMODE_BRIGHTNESS")); + toneMethodcie->set_active (0); + toneMethodcieConn = toneMethodcie->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::toneMethodcieChanged)); + shapecie->setResetCurve(DiagonalCurveType(defSpot.ciecurve.at(0)), defSpot.ciecurve); + shapecie->setBottomBarBgGradient (milestone); + shapecie->setLeftBarBgGradient (milestone); + cieCurveEditorG->curveListComplete(); + + cieCurveEditorG2->setCurveListener(this); + toneMethodcie2->append (M ("TP_COLORAPP_TCMODE_CHROMA")); + toneMethodcie2->append (M ("TP_COLORAPP_TCMODE_SATUR")); + toneMethodcie2->append (M ("TP_COLORAPP_TCMODE_COLORF")); + toneMethodcie2->set_active (0); + toneMethodcieConn2 = toneMethodcie2->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::toneMethodcie2Changed)); + shapecie2->setResetCurve(DiagonalCurveType(defSpot.ciecurve2.at(0)), defSpot.ciecurve2); + shapecie2->setBottomBarColorProvider (this, 1); + shapecie2->setLeftBarColorProvider (this, 1); + shapecie2->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + std::vector shape2Milestones; +// float R, G, B; + + for (int i = 0; i < 7; i++) { + float x = float (i) * (1.0f / 6.f); + Color::hsv2rgb01 (x, 0.5f, 0.5f, R, G, B); + shape2Milestones.push_back ( GradientMilestone (double (x), double (R), double (G), double (B)) ); + } + + shapecie2->setBottomBarBgGradient (shape2Milestones); + shapecie2->setLeftBarBgGradient (shape2Milestones); + + shapecie2->setRangeDefaultMilestones (0.05, 0.2, 0.58); + + cieCurveEditorG2->curveListComplete(); + + + chromjzcie->setAdjusterListener(this); + saturjzcie->setAdjusterListener(this); + huejzcie->setAdjusterListener(this); + softjzcie->setAdjusterListener(this); + thrhjzcie->setAdjusterListener(this); + strsoftjzcie->setAdjusterListener(this); + + lightlcie->setAdjusterListener(this); + lightjzcie->setAdjusterListener(this); + + lightqcie->setAdjusterListener(this); + contlcie->setAdjusterListener(this); + contjzcie->setAdjusterListener(this); + adapjzcie->setAdjusterListener(this); + jz100->setAdjusterListener(this); + pqremap->setAdjusterListener(this); + pqremapcam16->setAdjusterListener(this); + hljzcie->setAdjusterListener(this); + hlthjzcie->setAdjusterListener(this); + shjzcie->setAdjusterListener(this); + shthjzcie->setAdjusterListener(this); + radjzcie->setAdjusterListener(this); + contthrescie->setAdjusterListener(this); + blackEvjz->setLogScale(2, -8); + blackEvjz->setAdjusterListener(this); + whiteEvjz->setLogScale(16, 0); + whiteEvjz->setAdjusterListener(this); + targetjz->setAdjusterListener(this); + targetjz->setLogScale(10, 18, true); + sigmoidldacie->setAdjusterListener(this); + sigmoidthcie->setAdjusterListener(this); + sigmoidblcie->setAdjusterListener(this); + sigmoidldajzcie->setAdjusterListener(this); + sigmoidthjzcie->setAdjusterListener(this); + sigmoidbljzcie->setAdjusterListener(this); + + contqcie->setAdjusterListener(this); + colorflcie->setAdjusterListener(this); +/* + lightlzcam->setAdjusterListener(this); + lightqzcam->setAdjusterListener(this); + contlzcam->setAdjusterListener(this); + contqzcam->setAdjusterListener(this); + contthreszcam->setAdjusterListener(this); + colorflzcam->setAdjusterListener(this); + saturzcam->setAdjusterListener(this); + chromzcam->setAdjusterListener(this); +*/ + targetGraycie->setAdjusterListener(this); + targetGraycie->setLogScale(10, 18, true); + targabscie->setLogScale(500, 0); + + targabscie->setAdjusterListener(this); + + detailcie->setAdjusterListener(this); + + catadcie->setAdjusterListener(this); + + Gtk::Box *TittleVBoxcam16; + TittleVBoxcam16 = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + TittleVBoxcam16->set_spacing(2); + Gtk::Box* const LCTitleHBoxcam16 = Gtk::manage(new Gtk::Box()); + Gtk::Label* const LCLabelcam16 = Gtk::manage(new Gtk::Label()); + LCLabelcam16->set_markup(Glib::ustring("") + (M("TP_LOCALLAB_CAM16_FRA")) + Glib::ustring("")); + LCTitleHBoxcam16->pack_start(*LCLabelcam16, Gtk::PACK_SHRINK); + TittleVBoxcam16->pack_start(*LCTitleHBoxcam16, Gtk::PACK_SHRINK); + expcam16->setLabel(TittleVBoxcam16); + + setExpandAlignProperties(expcam16, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + surrHBoxcie->set_spacing (2); + surrHBoxcie->set_tooltip_markup (M ("TP_COLORAPP_SURROUND_TOOLTIP")); + Gtk::Label* surrLabelcie = Gtk::manage (new Gtk::Label (M ("TP_COLORAPP_SURROUND") + ":")); + surrHBoxcie->pack_start (*surrLabelcie, Gtk::PACK_SHRINK); + surroundcie->append (M ("TP_COLORAPP_SURROUND_AVER")); + surroundcie->append (M ("TP_COLORAPP_SURROUND_DIM")); + surroundcie->append (M ("TP_COLORAPP_SURROUND_DARK")); +// surroundcie->append (M ("TP_COLORAPP_SURROUND_EXDARK")); + surroundcie->set_active (0); + surrHBoxcie->pack_start (*surroundcie); + surroundcieconn = surroundcie->signal_changed().connect ( sigc::mem_fun (*this, &Locallabcie::surroundcieChanged) ); + + cie1Frame->set_label_align(0.025, 0.5); + cie1lightFrame->set_label_align(0.025, 0.5); + cie1contFrame->set_label_align(0.025, 0.5); + cie1colorFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const cieP1Box = Gtk::manage(new ToolParamBlock()); + ToolParamBlock* const cieP1lightBox = Gtk::manage(new ToolParamBlock()); + cieP1lightBox->pack_start(*lightlcie); + cieP1lightBox->pack_start(*lightqcie); + cie1lightFrame->add(*cieP1lightBox); + cieP1Box->pack_start(*cie1lightFrame); + ToolParamBlock* const cieP1contBox = Gtk::manage(new ToolParamBlock()); + cieP1contBox->pack_start(*detailcie); + cieP1contBox->pack_start(*contlcie); + cieP1contBox->pack_start(*contqcie); + cieP1contBox->pack_start(*contthrescie); + cie1contFrame->add(*cieP1contBox); + cieP1Box->pack_start(*cie1contFrame); + ToolParamBlock* const cieP1colorBox = Gtk::manage(new ToolParamBlock()); + cieP1colorBox->pack_start(*chromlcie); + cieP1colorBox->pack_start(*saturlcie); + cieP1colorBox->pack_start(*colorflcie); + cieP1colorBox->pack_start(*huecie); + cieP1colorBox->pack_start(*rstprotectcie); + cie1colorFrame->add(*cieP1colorBox); + cieP1Box->pack_start(*cie1colorFrame); + // pack_start(*blackEvjz); + // pack_start(*whiteEvjz); +/* + sigmoidFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const sigBox = Gtk::manage(new ToolParamBlock()); + + sigBox->pack_start(*sigmoidldacie); + sigBox->pack_start(*sigmoidthcie); + sigBox->pack_start(*sigmoidblcie); + sigBox->pack_start(*sigmoidqjcie); + sigmoidFrame->add(*sigBox); + cieP1Box->pack_start(*sigmoidFrame); + */ + ToolParamBlock* const cieP11Box = Gtk::manage(new ToolParamBlock()); + cieP11Box->pack_start(*cieCurveEditorG); + cieP11Box->pack_start(*cieCurveEditorG2); + expLcie->add(*cieP11Box, false); + cieP1Box->pack_start(*expLcie, false, false); + // cie1Frame->add(*cieP1Box); + // expcam16->pack_start(*cie1Frame); + expcam16->add(*cieP1Box, false); + + pack_start(*expcam16, false, false); + + pack_start(*expjz, false, false); +/* + ciezFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const ciePzBox = Gtk::manage(new ToolParamBlock()); + ciePzBox->pack_start(*lightlzcam); + ciePzBox->pack_start(*lightqzcam); + ciePzBox->pack_start(*contlzcam); + ciePzBox->pack_start(*contqzcam); +// ciePzBox->pack_start(*contthreszcam); + ciePzBox->pack_start(*colorflzcam); + ciePzBox->pack_start(*saturzcam); + ciePzBox->pack_start(*chromzcam); + ciezFrame->add(*ciePzBox); + pack_start(*ciezFrame); +*/ + + cie2Frame->set_label_align(0.025, 0.5); + ToolParamBlock* const cieP2Box = Gtk::manage(new ToolParamBlock()); + cieP2Box->pack_start(*targetGraycie); + cieP2Box->pack_start(*targabscie); + cieP2Box->pack_start(*catadcie); + cieP2Box->pack_start(*surrHBoxcie); +// cieP2Box->pack_start(*detailcie); +// cieP2Box->pack_start(*jabcie); + + cie2Frame->add(*cieP2Box); + pack_start(*cie2Frame); + + recothrescie->setAdjusterListener(this); + lowthrescie->setAdjusterListener(this); + higthrescie->setAdjusterListener(this); + decaycie->setAdjusterListener(this); + setExpandAlignProperties(exprecovcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + + setExpandAlignProperties(expmaskcie, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMNONE")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMODIF")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMODIFMASK")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWMASK")); + showmaskcieMethod->append(M("TP_LOCALLAB_SHOWREF")); + showmaskcieMethod->set_active(0); + showmaskcieMethod->set_tooltip_markup(M("TP_LOCALLAB_SHOWMASKCOL_TOOLTIP")); + showmaskcieMethodConn = showmaskcieMethod->signal_changed().connect(sigc::mem_fun(*this, &Locallabcie::showmaskcieMethodChanged)); + + enacieMaskConn = enacieMask->signal_toggled().connect(sigc::mem_fun(*this, &Locallabcie::enacieMaskChanged)); + + maskcieCurveEditorG->setCurveListener(this); + CCmaskcieshape->setIdentityValue(0.); + CCmaskcieshape->setResetCurve(FlatCurveType(defSpot.CCmaskciecurve.at(0)), defSpot.CCmaskciecurve); + CCmaskcieshape->setBottomBarColorProvider(this, 1); + + LLmaskcieshape->setIdentityValue(0.); + LLmaskcieshape->setResetCurve(FlatCurveType(defSpot.LLmaskciecurve.at(0)), defSpot.LLmaskciecurve); + LLmaskcieshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + HHmaskcieshape->setIdentityValue(0.); + HHmaskcieshape->setResetCurve(FlatCurveType(defSpot.HHmaskciecurve.at(0)), defSpot.HHmaskciecurve); + HHmaskcieshape->setCurveColorProvider(this, 2); + HHmaskcieshape->setBottomBarColorProvider(this, 2); + + maskcieCurveEditorG->curveListComplete(); + blendmaskcie->setAdjusterListener(this); + + radmaskcie->setAdjusterListener(this); + lapmaskcie->setAdjusterListener(this); + gammaskcie->setAdjusterListener(this); + slomaskcie->setAdjusterListener(this); + + chromaskcie->setAdjusterListener(this); + mask2cieCurveEditorG->setCurveListener(this); + + Lmaskcieshape->setResetCurve(DiagonalCurveType(defSpot.Lmaskciecurve.at(0)), defSpot.Lmaskciecurve); + Lmaskcieshape->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + Lmaskcieshape->setLeftBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + + mask2cieCurveEditorG->curveListComplete(); + + ToolParamBlock* const cieBox3 = Gtk::manage(new ToolParamBlock()); + cieBox3->pack_start(*maskusablecie, Gtk::PACK_SHRINK, 0); + cieBox3->pack_start(*maskunusablecie, Gtk::PACK_SHRINK, 0); + cieBox3->pack_start(*recothrescie); + cieBox3->pack_start(*lowthrescie); + cieBox3->pack_start(*higthrescie); + cieBox3->pack_start(*decaycie); + exprecovcie->add(*cieBox3, false); + pack_start(*exprecovcie, false, false); + + ToolParamBlock* const maskcieBox = Gtk::manage(new ToolParamBlock()); + maskcieBox->pack_start(*showmaskcieMethod, Gtk::PACK_SHRINK, 4); + maskcieBox->pack_start(*enacieMask, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*maskcieCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + maskcieBox->pack_start(*blendmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*radmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*lapmaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*chromaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*gammaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*slomaskcie, Gtk::PACK_SHRINK, 0); + maskcieBox->pack_start(*mask2cieCurveEditorG, Gtk::PACK_SHRINK, 4); // Padding is mandatory to correct behavior of curve editor + expmaskcie->add(*maskcieBox, false); + pack_start(*expmaskcie, false, false); + + + + } +Locallabcie::~Locallabcie() +{ + delete jz1CurveEditorG; + delete jz2CurveEditorG; + delete jz3CurveEditorG; + delete cieCurveEditorG; + delete cieCurveEditorG2; + delete maskcieCurveEditorG; + delete mask2cieCurveEditorG; + delete LocalcurveEditorwavjz; + +} + +bool Locallabcie::isMaskViewActive() +{ + return ((showmaskcieMethod->get_active_row_number() != 0)); +} + +void Locallabcie::resetMaskView() +{ + showmaskcieMethodConn.block(true); + + showmaskcieMethod->set_active(0); + + showmaskcieMethodConn.block(false); +} + +void Locallabcie::getMaskView(int &colorMask, int &colorMaskinv, int &expMask, int &expMaskinv, int &shMask, int &shMaskinv, int &vibMask, int &softMask, int &blMask, int &tmMask, int &retiMask, int &sharMask, int &lcMask, int &cbMask, int &logMask, int &maskMask, int &cieMask) +{ + cieMask = showmaskcieMethod->get_active_row_number(); +} + +void Locallabcie::setDefaultExpanderVisibility() +{ + expLcie->set_expanded(false); + expjz->set_expanded(false); + expwavjz->set_expanded(false); + expcam16->set_expanded(false); + expmaskcie->set_expanded(false); + exprecovcie->set_expanded(false); +} +void Locallabcie::updateAdviceTooltips(const bool showTooltips) +{ + if (showTooltips) { + recothrescie->set_tooltip_text(M("TP_LOCALLAB_RECOTHRES02_TOOLTIP")); + reparcie->set_tooltip_text(M("TP_LOCALLAB_LOGREPART_TOOLTIP")); + cieFrame->set_tooltip_text(M("TP_LOCALLAB_LOGSCENE_TOOLTIP")); + PQFrame->set_tooltip_text(M("TP_LOCALLAB_JZPQFRA_TOOLTIP")); + qtoj->set_tooltip_text(M("TP_LOCALLAB_JZQTOJ_TOOLTIP")); + logcie->set_tooltip_text(M("TP_LOCALLAB_LOGCIE_TOOLTIP")); + modecam->set_tooltip_text(M("TP_LOCALLAB_JZMODECAM_TOOLTIP")); + adapjzcie->set_tooltip_text(M("TP_LOCALLAB_JABADAP_TOOLTIP")); + jz100->set_tooltip_text(M("TP_LOCALLAB_JZ100_TOOLTIP")); + pqremap->set_tooltip_text(M("TP_LOCALLAB_JZPQREMAP_TOOLTIP")); + pqremapcam16->set_tooltip_text(M("TP_LOCALLAB_CAM16PQREMAP_TOOLTIP")); + Autograycie->set_tooltip_text(M("TP_LOCALLAB_LOGAUTOGRAYJZ_TOOLTIP")); + sigmalcjz->set_tooltip_text(M("TP_LOCALLAB_WAT_SIGMALC_TOOLTIP")); + logjzFrame->set_tooltip_text(M("TP_LOCALLAB_JZLOGWB_TOOLTIP")); + blackEvjz->set_tooltip_text(M("TP_LOCALLAB_JZLOGWBS_TOOLTIP")); + whiteEvjz->set_tooltip_text(M("TP_LOCALLAB_JZLOGWBS_TOOLTIP")); + clariFramejz->set_tooltip_markup(M("TP_LOCALLAB_CLARIJZ_TOOLTIP")); + clarilresjz->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIL_TOOLTIP")); + claricresjz->set_tooltip_text(M("TP_LOCALLAB_WAT_CLARIC_TOOLTIP")); + clarisoftjz->set_tooltip_markup(M("TP_LOCALLAB_CLARISOFTJZ_TOOLTIP")); + wavshapejz->setTooltip(M("TP_LOCALLAB_WAT_WAVSHAPE_TOOLTIP")); + LocalcurveEditorwavjz->set_tooltip_markup(M("TP_LOCALLAB_WAT_LEVELLOCCONTRAST_TOOLTIP")); + csThresholdjz->set_tooltip_markup(M("TP_LOCALLAB_WAT_THRESHOLDWAV_TOOLTIP")); + forcejz->set_tooltip_text(M("TP_LOCALLAB_JZFORCE_TOOLTIP")); + sourceGraycie->set_tooltip_text(M("TP_LOCALLAB_JZLOGYBOUT_TOOLTIP")); + sourceabscie->set_tooltip_text(M("TP_COLORAPP_ADAPSCEN_TOOLTIP")); + cie1Frame->set_tooltip_text(M("TP_LOCALLAB_LOGIMAGE_TOOLTIP")); + sigmoidFrame->set_tooltip_text(M("TP_LOCALLAB_SIGMOID_TOOLTIP")); + sigmoidjzFrame->set_tooltip_text(M("TP_LOCALLAB_SIGMOID_TOOLTIP")); + contlcie->set_tooltip_text(M("TP_LOCALLAB_LOGCONTL_TOOLTIP")); + contqcie->set_tooltip_text(M("TP_LOCALLAB_LOGCONTQ_TOOLTIP")); + contthrescie->set_tooltip_text(M("TP_LOCALLAB_LOGCONTTHRES_TOOLTIP")); + colorflcie->set_tooltip_text(M("TP_LOCALLAB_LOGCOLORF_TOOLTIP")); + lightlcie->set_tooltip_text(M("TP_LOCALLAB_LOGLIGHTL_TOOLTIP")); + lightqcie->set_tooltip_text(M("TP_LOCALLAB_LOGLIGHTQ_TOOLTIP")); + saturlcie->set_tooltip_text(M("TP_LOCALLAB_LOGSATURL_TOOLTIP")); + rstprotectcie->set_tooltip_text(M("TP_LOCALLAB_RSTPROTECT_TOOLTIP")); + chromlcie->set_tooltip_text(M("TP_COLORAPP_CHROMA_TOOLTIP")); + targabscie->set_tooltip_text(M("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); + targetGraycie->set_tooltip_text(M("TP_COLORAPP_YBOUT_TOOLTIP")); + detailcie->set_tooltip_text(M("TP_LOCALLAB_LOGDETAIL_TOOLTIP")); + catadcie->set_tooltip_text(M("TP_LOCALLAB_LOGCATAD_TOOLTIP")); + cie2Frame->set_tooltip_text(M("TP_LOCALLAB_LOGVIEWING_TOOLTIP")); + sensicie->set_tooltip_text(M("TP_LOCALLAB_SENSI_TOOLTIP")); + CCmaskcieshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + LLmaskcieshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + HHmaskcieshape->setTooltip(M("TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP")); + expmaskcie->set_tooltip_markup(M("TP_LOCALLAB_MASK_TOOLTIP")); + blendmaskcie->set_tooltip_text(M("TP_LOCALLAB_BLENDMASK_TOOLTIP")); + radmaskcie->set_tooltip_text(M("TP_LOCALLAB_LAPRAD_TOOLTIP")); + mask2cieCurveEditorG->set_tooltip_text(M("TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP")); + Lmaskcieshape->setTooltip(M("TP_LOCALLAB_LMASK_LL_TOOLTIP")); + exprecovcie->set_tooltip_markup(M("TP_LOCALLAB_MASKRESH_TOOLTIP")); + + + } else { + reparcie->set_tooltip_text(""); + recothrescie->set_tooltip_text(""); + cieFrame->set_tooltip_text(""); + PQFrame->set_tooltip_text(""); + modecam->set_tooltip_text(""); + qtoj->set_tooltip_text(""); + logcie->set_tooltip_text(""); + jabcie->set_tooltip_text(""); + adapjzcie->set_tooltip_text(""); + jz100->set_tooltip_text(""); + logjzFrame->set_tooltip_text(""); + blackEvjz->set_tooltip_text(""); + whiteEvjz->set_tooltip_text(""); + pqremap->set_tooltip_text(""); + pqremapcam16->set_tooltip_text(""); + Autograycie->set_tooltip_text(""); + forcejz->set_tooltip_text(""); + sourceGraycie->set_tooltip_text(""); + sourceabscie->set_tooltip_text(""); + cie1Frame->set_tooltip_text(""); + sigmoidFrame->set_tooltip_text(""); + sigmoidjzFrame->set_tooltip_text(""); + contlcie->set_tooltip_text(""); + contqcie->set_tooltip_text(""); + contthrescie->set_tooltip_text(""); + colorflcie->set_tooltip_text(""); + lightlcie->set_tooltip_text(""); + lightqcie->set_tooltip_text(""); + saturlcie->set_tooltip_text(""); + rstprotectcie->set_tooltip_text(""); + chromlcie->set_tooltip_text(""); + targabscie->set_tooltip_text(""); + targetGraycie->set_tooltip_text(""); + detailcie->set_tooltip_text(""); + catadcie->set_tooltip_text(""); + cie2Frame->set_tooltip_text(""); + sensicie->set_tooltip_text(""); + CCmaskcieshape->setTooltip(""); + LLmaskcieshape->setTooltip(""); + HHmaskcieshape->setTooltip(""); + expmaskcie->set_tooltip_markup(""); + blendmaskcie->set_tooltip_text(""); + radmaskcie->set_tooltip_text(""); + mask2cieCurveEditorG->set_tooltip_text(""); + Lmaskcieshape->setTooltip(""); + exprecovcie->set_tooltip_markup(""); + sigmalcjz->set_tooltip_text(""); + clarilresjz->set_tooltip_text(""); + claricresjz->set_tooltip_text(""); + clarisoftjz->set_tooltip_markup(""); + clariFramejz->set_tooltip_markup(""); + wavshapejz->setTooltip(""); + LocalcurveEditorwavjz->set_tooltip_markup(""); + csThresholdjz->set_tooltip_markup(""); + + } +} +void Locallabcie::disableListener() +{ + LocallabTool::disableListener(); + AutograycieConn.block(true); + forcejzConn.block(true); + forcebwConn.block(true); + qtojConn.block(true); + jabcieConn.block(true); + sigmoidqjcieconn.block(true); + logcieconn.block(true); + logjzconn.block(true); + sigjzconn.block(true); + sigqconn.block(true); + chjzcieconn.block(true); + sursourcieconn.block (true); + surroundcieconn.block (true); + modecieconn.block (true); + modecamconn.block (true); + toneMethodcieConn.block(true); + toneMethodcieConn2.block(true); + showmaskcieMethodConn.block(true); + enacieMaskConn.block(true); +} + +void Locallabcie::enableListener() +{ + LocallabTool::enableListener(); + AutograycieConn.block(false); + forcejzConn.block(false); + forcebwConn.block(false); + qtojConn.block(false); + jabcieConn.block(false); + sigmoidqjcieconn.block(false); + logcieconn.block(false); + logjzconn.block(false); + sigjzconn.block(false); + sigqconn.block(false); + chjzcieconn.block(false); + sursourcieconn.block (false); + surroundcieconn.block (false); + modecieconn.block (false); + modecamconn.block (false); + toneMethodcieConn.block(false); + toneMethodcieConn2.block(false); + showmaskcieMethodConn.block(false); + enacieMaskConn.block(false); +} + +void Locallabcie::showmaskcieMethodChanged() +{ + // If mask preview is activated, deactivate other Shadow highlight mask preview + + // If mask preview is activated, deactivate all other tool mask preview + if (locToolListener) { + locToolListener->resetOtherMaskView(this); + } + + if(exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabshowmaskMethod, ""); + } + } +} + + + +void Locallabcie::enacieMaskChanged() +{ + if (enacieMask->get_active()) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (enacieMask->get_active()) { + listener->panelChanged(EvLocallabEnacieMask, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocallabEnacieMask, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener(); + + // Update GUI to selected spot value + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + const LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + + exp->set_visible(spot.visicie); + exp->setEnabled(spot.expcie); + complexity->set_active(spot.complexcie); + + reparcie->setValue(spot.reparcie); + sensicie->setValue(spot.sensicie); + + if (spot.modecam == "cam16") { + modecam->set_active (0); + } else if (spot.modecam == "jz") { + modecam->set_active (1); +// } else if (spot.modecam == "all") { +// modecam->set_active (2); +// } else if (spot.modecam == "zcam") { +// modecam->set_active (3); + } + + if (spot.modecie == "com") { + modecie->set_active (0); + } else if (spot.modecie == "tm") { + modecie->set_active (1); + } else if (spot.modecie == "wav") { + modecie->set_active (2); + } else if (spot.modecie == "dr") { + modecie->set_active (3); +// } else if (spot.modecie == "log") { +// modecie->set_active (4); + } + + if (spot.toneMethodcie == "one") { + toneMethodcie->set_active(0); + } else if (spot.toneMethodcie == "two") { + toneMethodcie->set_active(1); + } + + if (spot.toneMethodcie2 == "onec") { + toneMethodcie2->set_active(0); + } else if (spot.toneMethodcie2 == "twoc") { + toneMethodcie2->set_active(1); + } else if (spot.toneMethodcie2 == "thrc") { + toneMethodcie2->set_active(2); + } + + Autograycie->set_active(spot.Autograycie); + forcejz->set_active(spot.forcejz); + forcebw->set_active(spot.forcebw); + qtoj->set_active(spot.qtoj); + sourceGraycie->setValue(spot.sourceGraycie); + sigmoidqjcie->set_active(spot.sigmoidqjcie); + logcie->set_active(spot.logcie); + logjz->set_active(spot.logjz); + sigjz->set_active(spot.sigjz); + sigq->set_active(spot.sigq); + // chjzcie->set_active(spot.chjzcie); + chjzcie->set_active(true);//force to true to avoid other mode + sourceabscie->setValue(spot.sourceabscie); + jabcie->set_active(spot.jabcie); + jabcieChanged(); + modecamChanged(); + + if(logcie->get_active()) { + sigmoidldacie->set_sensitive(false); + sigmoidthcie->set_sensitive(false); + sigmoidblcie->set_sensitive(false); + sigmoidqjcie->set_sensitive(false); + } else { + sigmoidldacie->set_sensitive(true); + sigmoidthcie->set_sensitive(true); + sigmoidblcie->set_sensitive(true); + sigmoidqjcie->set_sensitive(true); + } + + if (spot.sursourcie == "Average") { + sursourcie->set_active (0); + } else if (spot.sursourcie == "Dim") { + sursourcie->set_active (1); + } else if (spot.sursourcie == "Dark") { + sursourcie->set_active (2); + } + + if (spot.surroundcie == "Average") { + surroundcie->set_active (0); + } else if (spot.surroundcie == "Dim") { + surroundcie->set_active (1); + } else if (spot.surroundcie == "Dark") { + surroundcie->set_active (2); +// } else if (spot.surroundcie == "ExtremelyDark") { +// surroundcie->set_active (3); + } + shapecie->setCurve(spot.ciecurve); + shapecie2->setCurve(spot.ciecurve2); + + shapejz->setCurve(spot.jzcurve); + shapecz->setCurve(spot.czcurve); + shapeczjz->setCurve(spot.czjzcurve); + HHshapejz->setCurve(spot.HHcurvejz); + CHshapejz->setCurve(spot.CHcurvejz); + LHshapejz->setCurve(spot.LHcurvejz); + + saturlcie->setValue(spot.saturlcie); + rstprotectcie->setValue(spot.rstprotectcie); + chromlcie->setValue(spot.chromlcie); + huecie->setValue(spot.huecie); + chromjzcie->setValue(spot.chromjzcie); + saturjzcie->setValue(spot.saturjzcie); + huejzcie->setValue(spot.huejzcie); + softjzcie->setValue(spot.softjzcie); + strsoftjzcie->setValue(spot.strsoftjzcie); + thrhjzcie->setValue(spot.thrhjzcie); + lightlcie->setValue(spot.lightlcie); + lightjzcie->setValue(spot.lightjzcie); + lightqcie->setValue(spot.lightqcie); + contlcie->setValue(spot.contlcie); + contjzcie->setValue(spot.contjzcie); + adapjzcie->setValue(spot.adapjzcie); + jz100->setValue(spot.jz100); + pqremap->setValue(spot.pqremap); + pqremapcam16->setValue(spot.pqremapcam16); + hljzcie->setValue(spot.hljzcie); + hlthjzcie->setValue(spot.hlthjzcie); + shjzcie->setValue(spot.shjzcie); + shthjzcie->setValue(spot.shthjzcie); + radjzcie->setValue(spot.radjzcie); + sigmalcjz->setValue(spot.sigmalcjz); + wavshapejz->setCurve(spot.locwavcurvejz); + csThresholdjz->setValue(spot.csthresholdjz); + clarilresjz->setValue(spot.clarilresjz); + claricresjz->setValue(spot.claricresjz); + clarisoftjz->setValue(spot.clarisoftjz); + contthrescie->setValue(spot.contthrescie); + blackEvjz->setValue(spot.blackEvjz); + whiteEvjz->setValue(spot.whiteEvjz); + targetjz->setValue(spot.targetjz); + sigmoidldacie->setValue(spot.sigmoidldacie); + sigmoidthcie->setValue(spot.sigmoidthcie); + sigmoidblcie->setValue(spot.sigmoidblcie); + sigmoidldajzcie->setValue(spot.sigmoidldajzcie); + sigmoidthjzcie->setValue(spot.sigmoidthjzcie); + sigmoidbljzcie->setValue(spot.sigmoidbljzcie); + contqcie->setValue(spot.contqcie); + colorflcie->setValue(spot.colorflcie); + targabscie->setValue(spot.targabscie); + targetGraycie->setValue(spot.targetGraycie); + detailcie->setValue(spot.detailcie); + catadcie->setValue(spot.catadcie); +/* + lightlzcam->setValue(spot.lightlzcam); + lightqzcam->setValue(spot.lightqzcam); + contlzcam->setValue(spot.contlzcam); + contqzcam->setValue(spot.contqzcam); + contthreszcam->setValue(spot.contthreszcam); + colorflzcam->setValue(spot.colorflzcam); + saturzcam->setValue(spot.saturzcam); + chromzcam->setValue(spot.chromzcam); +*/ + enacieMask->set_active(spot.enacieMask); + CCmaskcieshape->setCurve(spot.CCmaskciecurve); + LLmaskcieshape->setCurve(spot.LLmaskciecurve); + HHmaskcieshape->setCurve(spot.HHmaskciecurve); + blendmaskcie->setValue((double)spot.blendmaskcie); + radmaskcie->setValue(spot.radmaskcie); + chromaskcie->setValue(spot.chromaskcie); + lapmaskcie->setValue(spot.lapmaskcie); + gammaskcie->setValue(spot.gammaskcie); + slomaskcie->setValue(spot.slomaskcie); + Lmaskcieshape->setCurve(spot.Lmaskciecurve); + recothrescie->setValue((double)spot.recothrescie); + lowthrescie->setValue((double)spot.lowthrescie); + higthrescie->setValue((double)spot.higthrescie); + decaycie->setValue((double)spot.decaycie); + + + } + enableListener(); + // Update GUI according to complexity mode + updateGUIToMode(static_cast(complexity->get_active_row_number())); + // Update Ciecam GUI + updatecieGUI(); +} + +void Locallabcie::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + const int index = pp->locallab.selspot; + + if (index < (int)pp->locallab.spots.size()) { + LocallabParams::LocallabSpot& spot = pp->locallab.spots.at(index); + spot.expcie = exp->getEnabled(); + spot.visicie = exp->get_visible(); + spot.complexcie = complexity->get_active_row_number(); + + spot.reparcie = reparcie->getValue(); + spot.sensicie = sensicie->getIntValue(); + + if (modecam->get_active_row_number() == 0) { + spot.modecam = "cam16"; + } else if (modecam->get_active_row_number() == 1) { + spot.modecam = "jz"; +// } else if (modecam->get_active_row_number() == 2) { +// spot.modecam = "all"; +// } else if (modecam->get_active_row_number() == 3) { +// spot.modecam = "zcam"; + } + + if (modecie->get_active_row_number() == 0) { + spot.modecie = "com"; + } else if (modecie->get_active_row_number() == 1) { + spot.modecie = "tm"; + } else if (modecie->get_active_row_number() == 2) { + spot.modecie = "wav"; + } else if (modecie->get_active_row_number() == 3) { + spot.modecie = "dr"; +// } else if (modecie->get_active_row_number() == 4) { +// spot.modecie = "log"; + } + + if (toneMethodcie->get_active_row_number() == 0) { + spot.toneMethodcie = "one"; + } else if (toneMethodcie->get_active_row_number() == 1) { + spot.toneMethodcie = "two"; + } + + if (toneMethodcie2->get_active_row_number() == 0) { + spot.toneMethodcie2 = "onec"; + } else if (toneMethodcie2->get_active_row_number() == 1) { + spot.toneMethodcie2 = "twoc"; + } else if (toneMethodcie2->get_active_row_number() == 2) { + spot.toneMethodcie2 = "thrc"; + } + + spot.Autograycie = Autograycie->get_active(); + spot.forcejz = forcejz->get_active(); + spot.forcebw = forcebw->get_active(); + spot.qtoj = qtoj->get_active(); + spot.jabcie = jabcie->get_active(); + spot.sourceGraycie = sourceGraycie->getValue(); + spot.sourceabscie = sourceabscie->getValue(); + spot.sigmoidqjcie = sigmoidqjcie->get_active(); + spot.logcie = logcie->get_active(); + spot.logjz = logjz->get_active(); + spot.sigjz = sigjz->get_active(); + spot.chjzcie = chjzcie->get_active(); + spot.sigq = sigq->get_active(); + + if(sursourcie->get_active_row_number() == 0) { + spot.sursourcie = "Average"; + } else if (sursourcie->get_active_row_number() == 1) { + spot.sursourcie = "Dim"; + } else if (sursourcie->get_active_row_number() == 2) { + spot.sursourcie = "Dark"; + } + + if (surroundcie->get_active_row_number() == 0) { + spot.surroundcie = "Average"; + } else if (surroundcie->get_active_row_number() == 1) { + spot.surroundcie = "Dim"; + } else if (surroundcie->get_active_row_number() == 2) { + spot.surroundcie = "Dark"; +// } else if (surroundcie->get_active_row_number() == 3) { +// spot.surroundcie = "ExtremelyDark"; + } + spot.jzcurve = shapejz->getCurve(); + spot.czcurve = shapecz->getCurve(); + spot.czjzcurve = shapeczjz->getCurve(); + spot.HHcurvejz = HHshapejz->getCurve(); + spot.CHcurvejz = CHshapejz->getCurve(); + spot.LHcurvejz = LHshapejz->getCurve(); + spot.ciecurve = shapecie->getCurve(); + spot.ciecurve2 = shapecie2->getCurve(); + + spot.saturlcie = saturlcie->getValue(); + spot.rstprotectcie = rstprotectcie->getValue(); + spot.chromlcie = chromlcie->getValue(); + spot.huejzcie = huejzcie->getValue(); + spot.softjzcie = softjzcie->getValue(); + spot.strsoftjzcie = strsoftjzcie->getValue(); + spot.thrhjzcie = thrhjzcie->getValue(); + spot.chromjzcie = chromjzcie->getValue(); + spot.saturjzcie = saturjzcie->getValue(); + spot.huecie = huecie->getValue(); + spot.lightlcie = lightlcie->getValue(); + spot.lightjzcie = lightjzcie->getValue(); + spot.lightqcie = lightqcie->getValue(); + spot.contlcie = contlcie->getValue(); + spot.contjzcie = contjzcie->getValue(); + spot.adapjzcie = adapjzcie->getValue(); + spot.jz100 = jz100->getValue(); + spot.pqremap = pqremap->getValue(); + spot.pqremapcam16 = pqremapcam16->getValue(); + spot.hljzcie = hljzcie->getValue(); + spot.hlthjzcie = hlthjzcie->getValue(); + spot.shjzcie = shjzcie->getValue(); + spot.shthjzcie = shthjzcie->getValue(); + spot.radjzcie = radjzcie->getValue(); + spot.sigmalcjz = sigmalcjz->getValue(); + spot.locwavcurvejz = wavshapejz->getCurve(); + spot.csthresholdjz = csThresholdjz->getValue(); + spot.clarilresjz = clarilresjz->getValue(); + spot.claricresjz = claricresjz->getValue(); + spot.clarisoftjz = clarisoftjz->getValue(); + spot.contthrescie = contthrescie->getValue(); + spot.blackEvjz = blackEvjz->getValue(); + spot.whiteEvjz = whiteEvjz->getValue(); + spot.targetjz = targetjz->getValue(); + spot.sigmoidldacie = sigmoidldacie->getValue(); + spot.sigmoidthcie = sigmoidthcie->getValue(); + spot.sigmoidblcie = sigmoidblcie->getValue(); + spot.sigmoidldajzcie = sigmoidldajzcie->getValue(); + spot.sigmoidthjzcie = sigmoidthjzcie->getValue(); + spot.sigmoidbljzcie = sigmoidbljzcie->getValue(); + spot.contqcie = contqcie->getValue(); + spot.colorflcie = colorflcie->getValue(); + spot.targabscie = targabscie->getValue(); + spot.targetGraycie = targetGraycie->getValue(); + spot.catadcie = catadcie->getValue(); + spot.detailcie = detailcie->getValue(); +/* + spot.lightlzcam = lightlzcam->getValue(); + spot.lightqzcam = lightqzcam->getValue(); + spot.contlzcam = contlzcam->getValue(); + spot.contqzcam = contqzcam->getValue(); + spot.contthreszcam = contthreszcam->getValue(); + spot.colorflzcam = colorflzcam->getValue(); + spot.saturzcam = saturzcam->getValue(); + spot.chromzcam = chromzcam->getValue(); +*/ + spot.enacieMask = enacieMask->get_active(); + spot.LLmaskciecurve = LLmaskcieshape->getCurve(); + spot.CCmaskciecurve = CCmaskcieshape->getCurve(); + spot.HHmaskciecurve = HHmaskcieshape->getCurve(); + spot.blendmaskcie = blendmaskcie->getIntValue(); + spot.radmaskcie = radmaskcie->getValue(); + spot.chromaskcie = chromaskcie->getValue(); + spot.lapmaskcie = lapmaskcie->getValue(); + spot.gammaskcie = gammaskcie->getValue(); + spot.slomaskcie = slomaskcie->getValue(); + spot.Lmaskciecurve = Lmaskcieshape->getCurve(); + spot.recothrescie = recothrescie->getValue(); + spot.lowthrescie = lowthrescie->getValue(); + spot.higthrescie = higthrescie->getValue(); + spot.decaycie = decaycie->getValue(); + + } +} + +void Locallabcie::toneMethodcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabtoneMethodcie, + toneMethodcie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void Locallabcie::toneMethodcie2Changed() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvLocallabtoneMethodcie2, + toneMethodcie2->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void Locallabcie::updateMaskBackground(const double normChromar, const double normLumar, const double normHuer, const double normHuerjz) +{ + idle_register.add( + [this, normHuerjz, normHuer, normLumar, normChromar]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update mask background + HHshapejz->updateLocallabBackground(normHuerjz); + CHshapejz->updateLocallabBackground(normHuerjz); + LHshapejz->updateLocallabBackground(normHuerjz); + shapejz->updateLocallabBackground(normLumar); + shapecz->updateLocallabBackground(normChromar); + shapeczjz->updateLocallabBackground(normLumar); + shapecie->updateLocallabBackground(normLumar); + shapecie2->updateLocallabBackground(normChromar); + CCmaskcieshape->updateLocallabBackground(normChromar); + LLmaskcieshape->updateLocallabBackground(normLumar); + HHmaskcieshape->updateLocallabBackground(normHuer); + Lmaskcieshape->updateLocallabBackground(normLumar); + + return false; + } + ); +} + + +void Locallabcie::updateAutocompute(const float blackev, const float whiteev, const float sourceg, const float sourceab, const float targetg, const float jz1) +{ + + if (Autograycie->get_active()) { + idle_register.add( + [this, blackev, whiteev, sourceg, sourceab, jz1]() -> bool { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + + // Update adjuster values according to autocomputed ones + disableListener(); + blackEvjz->setValue(blackev); + whiteEvjz->setValue(whiteev); + sourceGraycie->setValue(sourceg); + sourceabscie->setValue(sourceab); + float sour = std::min((double) sourceab, 10000.) / 10000.f; + float pal = std::max(10. * (double) sqrt(sour), 1.5); + adapjzcie->setValue(pal);//max = 10 and min 1.5 + jz100->setValue(jz1); + enableListener(); + + return false; + } + ); + } +} + + + +void Locallabcie::AutograycieChanged() +{ + + if (Autograycie->get_active()) { + sourceGraycie->set_sensitive(false); + sourceabscie->set_sensitive(false); + adapjzcie->set_sensitive(false); + jz100->set_sensitive(false); + blackEvjz->set_sensitive(false); + whiteEvjz->set_sensitive(false); + } else { + sourceGraycie->set_sensitive(true); + sourceabscie->set_sensitive(true); + adapjzcie->set_sensitive(true); + jz100->set_sensitive(true); + blackEvjz->set_sensitive(true); + whiteEvjz->set_sensitive(true); + // adapjzcie->set_sensitive(false); + // jz100->set_sensitive(false); + } + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (Autograycie->get_active()) { + listener->panelChanged(EvlocallabAutograycie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvlocallabAutograycie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::forcejzChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (forcejz->get_active()) { + listener->panelChanged(Evlocallabforcejz, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabforcejz, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::forcebwChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (forcebw->get_active()) { + listener->panelChanged(Evlocallabforcebw, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabforcebw, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::qtojChanged() +{ + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (qtoj->get_active()) { + listener->panelChanged(Evlocallabqtoj, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabqtoj, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::jabcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (jabcie->get_active()) { + listener->panelChanged(Evlocallabjabcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabjabcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::sigmoidqjcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (sigmoidqjcie->get_active()) { + listener->panelChanged(Evlocallabsigmoidqjcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsigmoidqjcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::logcieChanged() +{ + + if(logcie->get_active()) { + sigmoidldacie->set_sensitive(false); + sigmoidthcie->set_sensitive(false); + sigmoidblcie->set_sensitive(false); + sigmoidqjcie->set_sensitive(false); + } else { + sigmoidldacie->set_sensitive(true); + sigmoidthcie->set_sensitive(true); + sigmoidblcie->set_sensitive(true); + sigmoidqjcie->set_sensitive(true); + } + + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (logcie->get_active()) { + listener->panelChanged(Evlocallablogcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallablogcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::logjzChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (logjz->get_active()) { + listener->panelChanged(Evlocallablogjz, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallablogjz, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::sigjzChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (sigjz->get_active()) { + listener->panelChanged(Evlocallabsigjz, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsigjz, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::sigqChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (sigq->get_active()) { + listener->panelChanged(Evlocallabsigq, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabsigq, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::chjzcieChanged() +{ + if (chjzcie->get_active()) { + thrhjzcie->set_sensitive(true); + } else { + thrhjzcie->set_sensitive(false); + } + if (isLocActivated && exp->getEnabled()) { + if (listener) { + if (chjzcie->get_active()) { + listener->panelChanged(Evlocallabchjzcie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(Evlocallabchjzcie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} + +void Locallabcie::modecamChanged() +{ + const int mode = complexity->get_active_row_number(); + + if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 2) { + expjz->show(); + jzFrame->show(); + adapjzcie->show(); + jz100->show(); + pqremap->show(); + jabcie->show(); + PQFrame->show(); + logjzFrame->show(); + bevwevFrame->show(); + sigmoidjzFrame->show(); + sigmoidFrame->hide(); + forcejz->hide(); + + } else { + expjz->hide(); + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->hide(); + pqremapcam16->show(); + jabcie->hide(); + PQFrame->hide(); + logjzFrame->hide(); + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + sigmoidFrame->show(); + } + sigmoidjzFrame->hide(); + forcejz->hide(); + catadcie->show(); + } + surHBoxcie->show(); + cie1Frame->show(); + expcam16->show(); + cie2Frame->show(); + sourceGraycie->show(); + cieFrame->show(); + + if (modecam->get_active_row_number() == 1) { + surHBoxcie->show(); + cie1Frame->hide(); + expcam16->hide(); + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + forcejz->hide(); + pqremapcam16->hide(); + catadcie->hide(); + cie2Frame->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + if(mode == Expert) { + exprecovcie->show(); + expmaskcie->show(); + } + + } + if (modecam->get_active_row_number() == 3) { + if(mode == Expert) { + cieFrame->show(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + catadcie->hide(); + cie2Frame->hide(); + + } else { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + catadcie->hide(); + cie2Frame->hide(); + + } + } + + if(mode != Expert) { + expjz->hide(); + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->show(); + jabcie->hide(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + sigmoidFrame->hide(); + bevwevFrame->hide(); + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + sigmoidFrame->show(); + } + + forcejz->hide(); + pqremapcam16->show(); + catadcie->show(); + sourceGraycie->show(); + + if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 3) { + pqremapcam16->hide(); + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + catadcie->hide(); + cie2Frame->hide(); + } + } else { + cieFrame->show(); + cie2Frame->show(); + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + sigmoidjzFrame->hide(); + + } + if (modecam->get_active_row_number() == 1) { + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + forcejz->hide(); + pqremapcam16->hide(); + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + sigmoidFrame->hide(); + bevwevFrame->show(); + catadcie->hide(); + cie2Frame->hide(); + if (chjzcie->get_active()) { + thrhjzcie->set_sensitive(true); + } else { + thrhjzcie->set_sensitive(false); + } + + + } + if (modecam->get_active_row_number() == 3) { + cieFrame->show(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + catadcie->hide(); + cie2Frame->hide(); + } + + } + if (modecam->get_active_row_number() == 0 || modecam->get_active_row_number() == 2) { + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + cie2Frame->show(); + pqremapcam16->show(); + } + + + + if (isLocActivated && exp->getEnabled()) { + + if (listener) { + listener->panelChanged(Evlocallabmodecam, + modecam->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void Locallabcie::modecieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + + const int mode = complexity->get_active_row_number(); + exprecovcie->show(); + expmaskcie->show(); + + if (modecie->get_active_row_number() > 0) { + sensicie->hide(); + reparcie->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + + } else { + sensicie->show(); + reparcie->show(); + if(mode == Expert) { + exprecovcie->show(); + expmaskcie->show(); + } + } + if (mode == Simple || mode == Normal) { // Keep widget hidden in Normal and Simple mode + + modecie->set_active (0); + sensicie->show(); + reparcie->show(); + + } + + if (listener) { + listener->panelChanged(Evlocallabmodecie, + modecie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + + +void Locallabcie::sursourcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(Evlocallabsursourcie, + sursourcie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void Locallabcie::surroundcieChanged() +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(Evlocallabsurroundcie, + surroundcie->get_active_text() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + +void Locallabcie::updateGUIToMode(const modeType new_type) +{ + switch (new_type) { + case Simple: + catadcie->show(); + saturlcie->show(); + rstprotectcie->show(); + chromlcie->hide(); + huecie->hide(); + lightlcie->show(); + lightqcie->hide(); + contlcie->show(); + contthrescie->show(); + contqcie->hide(); + colorflcie->hide(); + surrHBoxcie->show(); + expLcie->hide(); + surHBoxcie->show(); + sourceabscie->show(); + targabscie->show(); + detailcie->hide(); + jabcie->hide(); + modeHBoxcie->hide(); + sensicie->show(); + reparcie->show(); + sigmoidblcie->hide(); + + expjz->hide(); + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->show(); + pqremapcam16->show(); + jabcie->hide(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + forcejz->hide(); + sourceGraycie->show(); + cieFrame->show(); + exprecovcie->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + decaycie->hide(); + expmaskcie->hide(); + expmaskcie->hide(); + + if (modecam->get_active_row_number() == 2) { + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + sigmoidFrame->hide(); + } + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + sigmoidFrame->show(); + } + + if (modecam->get_active_row_number() == 1) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + forcejz->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + logjzFrame->hide(); + bevwevFrame->hide(); + sigmoidjzFrame->hide(); + sigmoidFrame->hide(); + catadcie->hide(); + cie2Frame->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + decaycie->hide(); + expmaskcie->hide(); + } + if (modecam->get_active_row_number() == 3) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + logjzFrame->hide(); + catadcie->hide(); + } + + break; + case Normal: + // Expert mode widgets are hidden in Normal mode + + catadcie->show(); + saturlcie->show(); + rstprotectcie->show(); + chromlcie->hide(); + huecie->hide(); + lightlcie->show(); + lightqcie->hide(); + contlcie->show(); + contthrescie->show(); + contqcie->hide(); + colorflcie->hide(); + surrHBoxcie->show(); + expLcie->hide(); + surHBoxcie->show(); + sourceabscie->show(); + targabscie->show(); + detailcie->hide(); + jabcie->hide(); + modeHBoxcie->hide(); + sensicie->show(); + reparcie->show(); + sigmoidblcie->show(); + expjz->hide(); + forcejz->hide(); + + jzFrame->hide(); + adapjzcie->hide(); + jz100->hide(); + pqremap->show(); + jabcie->hide(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + pqremapcam16->show(); + sourceGraycie->show(); + cieFrame->show(); + exprecovcie->show(); + expmaskcie->show(); + decaycie->hide(); + lapmaskcie->hide(); + gammaskcie->hide(); + slomaskcie->hide(); + if (enacieMask->get_active()) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + sigmoidFrame->show(); + } + + if (modecam->get_active_row_number() == 2) { + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + } + + if (modecam->get_active_row_number() == 1) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + forcejz->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + sigmoidFrame->hide(); + catadcie->hide(); + cie2Frame->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + + } + if (modecam->get_active_row_number() == 3) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + pqremapcam16->hide(); + PQFrame->hide(); + catadcie->hide(); + logjzFrame->hide(); + } + if (modecie->get_active_row_number() > 0) { + exprecovcie->hide(); + expmaskcie->hide(); + } + + break; + + case Expert: + // Show widgets hidden in Normal and Simple mode + catadcie->show(); + saturlcie->show(); + rstprotectcie->show(); + chromlcie->show(); + huecie->show(); + lightlcie->show(); + lightqcie->show(); + contlcie->show(); + contthrescie->show(); + contqcie->show(); + colorflcie->show(); + surrHBoxcie->show(); + expLcie->show(); + surHBoxcie->show(); + sourceabscie->show(); + targabscie->show(); + detailcie->show(); + modeHBoxcie->show(); + sigmoidblcie->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + forcejz->hide(); + pqremapcam16->show(); + sourceGraycie->show(); + cieFrame->show(); + exprecovcie->show(); + decaycie->show(); + lapmaskcie->show(); + gammaskcie->show(); + slomaskcie->show(); + expmaskcie->show(); + exprecovcie->show(); + + if (enacieMask->get_active()) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + } + + if (modecam->get_active_row_number() == 1 || modecam->get_active_row_number() == 2) { + jabcie->show(); + expjz->show(); + jzFrame->show(); + adapjzcie->show(); + jz100->show(); + pqremap->show(); + PQFrame->show(); + logjzFrame->show(); + bevwevFrame->show(); + sigmoidjzFrame->show(); + sigmoidFrame->hide(); + forcejz->hide(); + + } + cieFrame->show(); + cie2Frame->show(); + + if (modecam->get_active_row_number() == 0 || modecam->get_active_row_number() == 2) { + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + pqremapcam16->show(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + sigmoidFrame->show(); + } + + } + if (modecam->get_active_row_number() == 2) { + PQFrame->show(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + bevwevFrame->hide(); + } + + if (modecam->get_active_row_number() == 1) { + surHBoxcie->show(); + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + pqremapcam16->hide(); + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + sigmoidFrame->hide(); + bevwevFrame->show(); + catadcie->hide(); + cie2Frame->hide(); + exprecovcie->show(); + expmaskcie->show(); + maskusablecie->show(); + maskunusablecie->show(); + if (chjzcie->get_active()) { + thrhjzcie->set_sensitive(true); + } else { + thrhjzcie->set_sensitive(false); + } + + } + + if (modecam->get_active_row_number() == 3) { + cieFrame->show(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + catadcie->hide(); + } + if (modecie->get_active_row_number() > 0) { + exprecovcie->hide(); + expmaskcie->hide(); + } + + } +} + +void Locallabcie::updatecieGUI() +{ + const int mode = complexity->get_active_row_number(); + expmaskcie->show(); + exprecovcie->show(); + if (modecie->get_active_row_number() > 0) { + sensicie->hide(); + reparcie->hide(); + exprecovcie->hide(); + expmaskcie->hide(); + } else { + sensicie->show(); + reparcie->show(); + exprecovcie->show(); + expmaskcie->show(); + } + surHBoxcie->show(); + cie1Frame->show(); + cie2Frame->show(); + expcam16->show(); + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + } + + if (modecam->get_active_row_number() == 2 && mode == Expert) { + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + bevwevFrame->show(); + } + sourceGraycie->show(); + cieFrame->show(); + + if (enacieMask->get_active() && mode != Simple) { + maskusablecie->show(); + maskunusablecie->hide(); + + } else { + maskusablecie->hide(); + maskunusablecie->show(); + } + + if (modecam->get_active_row_number() == 1) { + surHBoxcie->show(); + cie1Frame->hide(); + expcam16->hide(); + targetGraycie->hide(); + targabscie->hide(); + surrHBoxcie->hide(); + pqremapcam16->hide(); + PQFrame->show(); + logjzFrame->show(); + sigmoidjzFrame->show(); + bevwevFrame->show(); + sigmoidFrame->hide(); + catadcie->hide(); + cie2Frame->hide(); + if(mode != Expert) { + cieFrame->hide(); + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + PQFrame->hide(); + logjzFrame->hide(); + sigmoidjzFrame->hide(); + sigmoidFrame->hide(); + bevwevFrame->hide(); + if (modecam->get_active_row_number() == 0){ + bevwevFrame->show(); + sigmoidFrame->show(); + } + exprecovcie->hide(); + expmaskcie->hide(); + maskusablecie->hide(); + maskunusablecie->hide(); + } + + } + if (modecam->get_active_row_number() == 3) { + if(mode == Expert) { + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->show(); + targetGraycie->show(); + targabscie->show(); + surrHBoxcie->show(); + cieFrame->show(); + PQFrame->show(); + logjzFrame->show(); + adapjzcie->hide(); + jz100->hide(); + forcejz->hide(); + pqremap->show(); + pqremapcam16->hide(); + PQFrame->show(); + catadcie->hide(); + } else { + cie1Frame->hide(); + expcam16->hide(); + cie2Frame->hide(); + PQFrame->hide(); + logjzFrame->hide(); + } + } + + if (Autograycie->get_active()) { + sourceGraycie->set_sensitive(false); + sourceabscie->set_sensitive(false); + adapjzcie->set_sensitive(false); + jz100->set_sensitive(false); + blackEvjz->set_sensitive(false); + whiteEvjz->set_sensitive(false); + } else { + sourceGraycie->set_sensitive(true); + sourceabscie->set_sensitive(true); + adapjzcie->set_sensitive(true); + blackEvjz->set_sensitive(true); + whiteEvjz->set_sensitive(true); + jz100->set_sensitive(true); + } + + if (mode == Simple || mode == Normal) { // Keep widget hidden in Normal and Simple mode + modecie->set_active (0); + sensicie->show(); + reparcie->show(); + } + if (modecie->get_active_row_number() > 0) { + exprecovcie->hide(); + expmaskcie->hide(); + } + +} + + +void Locallabcie::convertParamToSimple() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + sigmoidblcie->setValue(defSpot.sigmoidblcie); + showmaskcieMethod->set_active(0); + enacieMask->set_active(defSpot.enacieMask); + modecie->set_active(0); + // Enable all listeners + enableListener(); +} + +void Locallabcie::convertParamToNormal() +{ + const LocallabParams::LocallabSpot defSpot; + + // Disable all listeners + disableListener(); + contqcie->setValue(defSpot.contqcie); + colorflcie->setValue(defSpot.colorflcie); + lightqcie->setValue(defSpot.lightqcie); + chromlcie->setValue(defSpot.chromlcie); + huecie->setValue(defSpot.huecie); + detailcie->setValue(defSpot.detailcie); + jabcie->set_active(defSpot.jabcie); + LHshapejz->setCurve(defSpot.LHcurvejz); + CHshapejz->setCurve(defSpot.CHcurvejz); + HHshapejz->setCurve(defSpot.HHcurvejz); + shapejz->setCurve(defSpot.jzcurve); + shapecz->setCurve(defSpot.czcurve); + shapeczjz->setCurve(defSpot.czjzcurve); + shapecie->setCurve(defSpot.ciecurve); + shapecie2->setCurve(defSpot.ciecurve2); + lightjzcie->setValue(defSpot.lightjzcie); + contjzcie->setValue(defSpot.contjzcie); + sigmoidldajzcie->setValue(defSpot.sigmoidldajzcie); + hljzcie->setValue(defSpot.hljzcie); + shjzcie->setValue(defSpot.shjzcie); + chromjzcie->setValue(defSpot.chromjzcie); + saturjzcie->setValue(defSpot.saturjzcie); + huejzcie->setValue(defSpot.huejzcie); + softjzcie->setValue(defSpot.softjzcie); + strsoftjzcie->setValue(defSpot.strsoftjzcie); + thrhjzcie->setValue(defSpot.thrhjzcie); + modecie->set_active(0); + if (modecam->get_active_row_number() == 1) { + showmaskcieMethod->set_active(0); + enacieMask->set_active(defSpot.enacieMask); + logjz->set_active(defSpot.logjz); + sigjz->set_active(defSpot.sigjz); + } + lapmaskcie->setValue(defSpot.lapmaskcie); + gammaskcie->setValue(defSpot.gammaskcie); + slomaskcie->setValue(defSpot.slomaskcie); + + // Enable all listeners + enableListener(); + +} + +void Locallabcie::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + const int index = defParams->locallab.selspot; + + if (index < (int)defParams->locallab.spots.size()) { + const LocallabParams::LocallabSpot& defSpot = defParams->locallab.spots.at(index); + + reparcie->setDefault(defSpot.reparcie); + sensicie->setDefault(defSpot.sensicie); + sourceGraycie->setDefault(defSpot.sourceGraycie); + sourceabscie->setDefault(defSpot.sourceabscie); + saturlcie->setDefault(defSpot.saturlcie); + rstprotectcie->setDefault(defSpot.rstprotectcie); + chromlcie->setDefault(defSpot.chromlcie); + huecie->setDefault(defSpot.huecie); + chromjzcie->setDefault(defSpot.chromjzcie); + saturjzcie->setDefault(defSpot.saturjzcie); + huejzcie->setDefault(defSpot.huejzcie); + softjzcie->setDefault(defSpot.softjzcie); + strsoftjzcie->setDefault(defSpot.strsoftjzcie); + thrhjzcie->setDefault(defSpot.thrhjzcie); + lightlcie->setDefault(defSpot.lightlcie); + lightjzcie->setDefault(defSpot.lightjzcie); + lightqcie->setDefault(defSpot.lightqcie); + contlcie->setDefault(defSpot.contlcie); + contjzcie->setDefault(defSpot.contjzcie); + adapjzcie->setDefault(defSpot.adapjzcie); + jz100->setDefault(defSpot.jz100); + pqremap->setDefault(defSpot.pqremap); + pqremapcam16->setDefault(defSpot.pqremapcam16); + hljzcie->setDefault(defSpot.hljzcie); + hlthjzcie->setDefault(defSpot.hlthjzcie); + shjzcie->setDefault(defSpot.shjzcie); + shthjzcie->setDefault(defSpot.shthjzcie); + radjzcie->setDefault(defSpot.radjzcie); + sigmalcjz->setDefault(defSpot.sigmalcjz); + csThresholdjz->setDefault(defSpot.csthresholdjz); + clarilresjz->setDefault(defSpot.clarilresjz); + claricresjz->setDefault(defSpot.claricresjz); + clarisoftjz->setDefault(defSpot.clarisoftjz); + contthrescie->setDefault(defSpot.contthrescie); + blackEvjz->setDefault(defSpot.blackEvjz); + whiteEvjz->setDefault(defSpot.whiteEvjz); + targetjz->setDefault(defSpot.targetjz); + sigmoidldacie->setDefault(defSpot.sigmoidldacie); + sigmoidthcie->setDefault(defSpot.sigmoidthcie); + sigmoidblcie->setDefault(defSpot.sigmoidblcie); + sigmoidldajzcie->setDefault(defSpot.sigmoidldajzcie); + sigmoidthjzcie->setDefault(defSpot.sigmoidthjzcie); + sigmoidbljzcie->setDefault(defSpot.sigmoidbljzcie); + contqcie->setDefault(defSpot.contqcie); + colorflcie->setDefault(defSpot.colorflcie); + targabscie->setDefault(defSpot.targabscie); + targetGraycie->setDefault(defSpot.targetGraycie); + catadcie->setDefault(defSpot.catadcie); + detailcie->setDefault(defSpot.detailcie); + blendmaskcie->setDefault((double)defSpot.blendmaskcie); + radmaskcie->setDefault(defSpot.radmaskcie); + chromaskcie->setDefault(defSpot.chromaskcie); + lapmaskcie->setDefault(defSpot.lapmaskcie); + gammaskcie->setDefault(defSpot.gammaskcie); + slomaskcie->setDefault(defSpot.slomaskcie); + recothrescie->setDefault((double)defSpot.recothrescie); + lowthrescie->setDefault((double)defSpot.lowthrescie); + higthrescie->setDefault((double)defSpot.higthrescie); + decaycie->setDefault((double)defSpot.decaycie); + + } +} + +void Locallabcie::curveChanged(CurveEditor* ce) +{ + if (isLocActivated && exp->getEnabled()) { + const auto spName = M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"; + if (ce == shapejz) { + if (listener) { + listener->panelChanged(Evlocallabshapejz, spName); + } + } + + if (ce == shapecz) { + if (listener) { + listener->panelChanged(Evlocallabshapecz, spName); + } + } + + if (ce == shapeczjz) { + if (listener) { + listener->panelChanged(Evlocallabshapeczjz, spName); + } + } + + if (ce == HHshapejz) { + if (listener) { + listener->panelChanged(EvlocallabHHshapejz, spName); + } + } + + if (ce == CHshapejz) { + if (listener) { + listener->panelChanged(EvlocallabCHshapejz, spName); + } + } + + if (ce == LHshapejz) { + if (listener) { + listener->panelChanged(EvlocallabLHshapejz, spName); + } + } + + if (ce == shapecie) { + if (listener) { + listener->panelChanged(Evlocallabshapecie, spName); + } + } + + if (ce == shapecie2) { + if (listener) { + listener->panelChanged(Evlocallabshapecie2, spName); + } + } + + if (ce == CCmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabCCmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == LLmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabLLmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == HHmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabHHmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == Lmaskcieshape) { + if (listener) { + listener->panelChanged(EvlocallabLmaskcieshape, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (ce == wavshapejz) { + if (listener) { + listener->panelChanged(EvlocallabwavCurvejz, + M("HISTORY_CUSTOMCURVE") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + + } +} + + +void Locallabcie::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ + if (isLocActivated && exp->getEnabled()) { + if (listener) { + listener->panelChanged(EvlocallabcsThresholdjz, + csThresholdjz->getHistoryString() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } +} + + +void Locallabcie::adjusterChanged(Adjuster* a, double newval) +{ + const LocallabParams::LocallabSpot defSpot; + + if (isLocActivated && exp->getEnabled()) { + const auto spName = " (" + escapeHtmlChars(getSpotName()) + ")"; + if (a == reparcie) { + if (listener) { + listener->panelChanged(Evlocallabreparcie, + reparcie->getTextValue() + spName); + } + } + + if (a == sensicie) { + if (listener) { + listener->panelChanged(Evlocallabsensicie, + sensicie->getTextValue() + spName); + } + } + + if (a == sourceGraycie) { + if (listener) { + listener->panelChanged(EvlocallabsourceGraycie, + sourceGraycie->getTextValue() + spName); + } + } + + if (a == sourceabscie) { + float sour = std::min(sourceabscie->getValue(), 10000.) / 10000.f; + float pal = std::max(10. * (double) sqrt(sour), 1.5); + adapjzcie->setValue(pal);//max to 10 if La > 10000 and mini to 1.5 + jz100->setValue(defSpot.jz100); + + if (listener) { + listener->panelChanged(Evlocallabsourceabscie, + sourceabscie->getTextValue() + spName ); + } + } + + if (a == saturlcie) { + if (listener) { + listener->panelChanged(Evlocallabsaturlcie, + saturlcie->getTextValue() + spName); + } + } + + if (a == rstprotectcie) { + if (listener) { + listener->panelChanged(Evlocallabrstprotectcie, + rstprotectcie->getTextValue() + spName); + } + } + + if (a == chromlcie) { + if (listener) { + listener->panelChanged(Evlocallabchromlcie, + chromlcie->getTextValue() + spName); + } + } + + if (a == chromjzcie) { + if (listener) { + listener->panelChanged(Evlocallabchromjzcie, + chromjzcie->getTextValue() + spName); + } + } + + if (a == saturjzcie) { + if (listener) { + listener->panelChanged(Evlocallabsaturjzcie, + saturjzcie->getTextValue() + spName); + } + } + + if (a == huecie) { + if (listener) { + listener->panelChanged(Evlocallabhuecie, + huecie->getTextValue() + spName); + } + } + + if (a == huejzcie) { + if (listener) { + listener->panelChanged(Evlocallabhuejzcie, + huejzcie->getTextValue() + spName); + } + } + + if (a == softjzcie) { + if (listener) { + listener->panelChanged(Evlocallabsoftjzcie, + softjzcie->getTextValue() + spName); + } + } + + if (a == strsoftjzcie) { + if (listener) { + listener->panelChanged(Evlocallabstrsoftjzcie, + strsoftjzcie->getTextValue() + spName); + } + } + + if (a == thrhjzcie) { + if (listener) { + listener->panelChanged(Evlocallabthrhjzcie, + thrhjzcie->getTextValue() + spName); + } + } + + if (a == lightlcie) { + if (listener) { + listener->panelChanged(Evlocallablightlcie, + lightlcie->getTextValue() + spName); + } + } + + if (a == lightjzcie) { + if (listener) { + listener->panelChanged(Evlocallablightjzcie, + lightjzcie->getTextValue() + spName); + } + } + + if (a == lightqcie) { + if (listener) { + listener->panelChanged(Evlocallablightqcie, + lightqcie->getTextValue() + spName); + } + } + + + if (a == contlcie) { + if (listener) { + listener->panelChanged(Evlocallabcontlcie, + contlcie->getTextValue()+ spName); + } + } + + if (a == contjzcie) { + if (listener) { + listener->panelChanged(Evlocallabcontjzcie, + contjzcie->getTextValue() + spName); + } + } + + if (a == adapjzcie) { + if (listener) { + listener->panelChanged(Evlocallabadapjzcie, + adapjzcie->getTextValue() + spName); + } + } + + if (a == jz100) { + if (listener) { + listener->panelChanged(Evlocallabjz100, + jz100->getTextValue() + spName); + } + } + + if (a == pqremap) { + if (listener) { + listener->panelChanged(Evlocallabpqremap, + pqremap->getTextValue()+ spName ); + } + } + + if (a == pqremapcam16) { + if (listener) { + listener->panelChanged(Evlocallabpqremapcam16, + pqremapcam16->getTextValue()+ spName ); + } + } + + if (a == hljzcie) { + if (listener) { + listener->panelChanged(Evlocallabhljzcie, + hljzcie->getTextValue() + spName); + } + } + + if (a == hlthjzcie) { + if (listener) { + listener->panelChanged(Evlocallabhlthjzcie, + hlthjzcie->getTextValue() + spName); + } + } + + if (a == shjzcie) { + if (listener) { + listener->panelChanged(Evlocallabshjzcie, + shjzcie->getTextValue()+ spName ); + } + } + + if (a == shthjzcie) { + if (listener) { + listener->panelChanged(Evlocallabshthjzcie, + shthjzcie->getTextValue() + spName); + } + } + + if (a == radjzcie) { + if (listener) { + listener->panelChanged(Evlocallabradjzcie, + radjzcie->getTextValue() + spName); + } + } + + if (a == sigmalcjz) { + if (listener) { + listener->panelChanged(Evlocallabsigmalcjz, + sigmalcjz->getTextValue() + spName); + } + } + + if (a == clarilresjz) { + if (listener) { + listener->panelChanged(Evlocallabclarilresjz, + clarilresjz->getTextValue() + spName); + } + } + + if (a == claricresjz) { + if (listener) { + listener->panelChanged(Evlocallabclaricresjz, + claricresjz->getTextValue() + spName); + } + } + + if (a == clarisoftjz) { + if (listener) { + listener->panelChanged(Evlocallabclarisoftjz, + clarisoftjz->getTextValue() + spName); + } + } + + if (a == contthrescie) { + if (listener) { + listener->panelChanged(Evlocallabcontthrescie, + contthrescie->getTextValue() + spName); + } + } + + if (a == blackEvjz) { + if (listener) { + listener->panelChanged(EvlocallabblackEvjz, + blackEvjz->getTextValue() + spName); + } + } + + if (a == whiteEvjz) { + if (listener) { + listener->panelChanged(EvlocallabwhiteEvjz, + whiteEvjz->getTextValue() + spName); + } + } + + if (a == targetjz) { + if (listener) { + listener->panelChanged(Evlocallabtargetjz, + targetjz->getTextValue() + spName); + } + } + + if (a == sigmoidldacie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidldacie, + sigmoidldacie->getTextValue() + spName); + } + } + + if (a == sigmoidldajzcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidldajzcie, + sigmoidldajzcie->getTextValue() + spName); + } + } + + if (a == sigmoidthcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidthcie, + sigmoidthcie->getTextValue() + spName); + } + } + + if (a == sigmoidthjzcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidthjzcie, + sigmoidthjzcie->getTextValue()+ spName ); + } + } + + if (a == sigmoidblcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidblcie, + sigmoidblcie->getTextValue() + spName); + } + } + + if (a == sigmoidbljzcie) { + if (listener) { + listener->panelChanged(Evlocallabsigmoidbljzcie, + sigmoidbljzcie->getTextValue() + spName); + } + } + + if (a == contqcie) { + if (listener) { + listener->panelChanged(Evlocallabcontqcie, + contqcie->getTextValue() + spName); + } + } + + if (a == colorflcie) { + if (listener) { + listener->panelChanged(Evlocallabcolorflcie, + colorflcie->getTextValue()+ spName ); + } + } + +/* + if (a == lightlzcam) { + if (listener) { + listener->panelChanged(Evlocallablightlzcam, + lightlzcam->getTextValue()+ spName ); + } + } + + if (a == lightqzcam) { + if (listener) { + listener->panelChanged(Evlocallablightqzcam, + lightqzcam->getTextValue()+ spName ); + } + } + + if (a == contlzcam) { + if (listener) { + listener->panelChanged(Evlocallabcontlzcam, + contlzcam->getTextValue()+ spName ); + } + } + + if (a == contqzcam) { + if (listener) { + listener->panelChanged(Evlocallabcontqzcam, + contqzcam->getTextValue()+ spName ); + } + } + + if (a == contthreszcam) { + if (listener) { + listener->panelChanged(Evlocallabcontthreszcam, + contthreszcam->getTextValue()+ spName ); + } + } + + if (a == colorflzcam) { + if (listener) { + listener->panelChanged(Evlocallabcolorflzcam, + colorflzcam->getTextValue()+ spName ); + } + } + + if (a == saturzcam) { + if (listener) { + listener->panelChanged(Evlocallabsaturzcam, + saturzcam->getTextValue()+ spName ); + } + } + + if (a == chromzcam) { + if (listener) { + listener->panelChanged(Evlocallabchromzcam, + chromzcam->getTextValue()+ spName ); + } + } +*/ + if (a == targabscie) { + if (listener) { + listener->panelChanged(Evlocallabtargabscie, + targabscie->getTextValue() + spName); + } + } + + if (a == targetGraycie) { + if (listener) { + listener->panelChanged(EvlocallabtargetGraycie, + targetGraycie->getTextValue() + spName); + } + } + + if (a == catadcie) { + if (listener) { + listener->panelChanged(Evlocallabcatadcie, + catadcie->getTextValue() + spName); + } + } + + if (a == detailcie) { + if (listener) { + listener->panelChanged(Evlocallabdetailcie, + detailcie->getTextValue() + spName); + } + } + + if (a == blendmaskcie) { + if (listener) { + listener->panelChanged(Evlocallabblendmaskcie, + blendmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == radmaskcie) { + if (listener) { + listener->panelChanged(Evlocallabradmaskcie, + radmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == chromaskcie) { + if (listener) { + listener->panelChanged(Evlocallabchromaskcie, + chromaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lapmaskcie) { + if (listener) { + listener->panelChanged(Evlocallablapmaskcie, + lapmaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == gammaskcie) { + if (listener) { + listener->panelChanged(Evlocallabgammaskcie, + gammaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == slomaskcie) { + if (listener) { + listener->panelChanged(Evlocallabslomaskcie, + slomaskcie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == recothrescie) { + + if (listener) { + listener->panelChanged(Evlocallabrecothrescie, + recothrescie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == lowthrescie) { + if (listener) { + listener->panelChanged(Evlocallablowthrescie, + lowthrescie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == higthrescie) { + if (listener) { + listener->panelChanged(Evlocallabhigthrescie, + higthrescie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + if (a == decaycie) { + if (listener) { + listener->panelChanged(Evlocallabdecaycie, + decaycie->getTextValue() + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + + } +} + +void Locallabcie::enabledChanged() +{ + if (isLocActivated) { + if (listener) { + if (exp->getEnabled()) { + listener->panelChanged(EvLocenacie, + M("GENERAL_ENABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } else { + listener->panelChanged(EvLocenacie, + M("GENERAL_DISABLED") + " (" + escapeHtmlChars(getSpotName()) + ")"); + } + } + } +} diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index 071847424..c87239b9c 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -20,15 +20,23 @@ #include "lockablecolorpicker.h" #include "options.h" #include "../rtengine/color.h" +#include "../rtengine/improcfun.h" #include "../rtengine/rt_math.h" #include "../rtengine/utils.h" #include "imagearea.h" #include "multilangmgr.h" #include "navigator.h" -LockableColorPicker::LockableColorPicker (CropWindow* cropWindow, Glib::ustring *oProfile, Glib::ustring *wProfile) +namespace +{ + +const rtengine::procparams::ColorManagementParams DEFAULT_CMP; + +} + +LockableColorPicker::LockableColorPicker (CropWindow* cropWindow, rtengine::procparams::ColorManagementParams *color_management_params) : cropWindow(cropWindow), displayedValues(ColorPickerType::RGB), position(0, 0), size(Size::S15), - outputProfile(oProfile), workingProfile(wProfile), validity(Validity::OUTSIDE), + color_management_params(color_management_params), validity(Validity::OUTSIDE), r(0.f), g(0.f), b(0.f), rpreview(0.f), gpreview(0.f), bpreview(0.f), hue(0.f), sat(0.f), val(0.f), L(0.f), a(0.f), bb(0.f) {} @@ -37,7 +45,7 @@ void LockableColorPicker::updateBackBuffer () int newW, newH; // -------------------- setting some key constants --------------------- - constexpr float circlePadding = 3.f; // keep this value odd + constexpr double circlePadding = 3.0; // keep this value odd constexpr double opacity = 0.62; // --------------------------------------------------------------------- @@ -121,18 +129,18 @@ void LockableColorPicker::updateBackBuffer () bbcr->set_antialias (Cairo::ANTIALIAS_SUBPIXEL); bbcr->set_line_width (0.); - float center = (float)size / 2.f + circlePadding; + double center = static_cast(size) / 2.0 + circlePadding; // black background of the whole color picker bbcr->set_line_width (0.); bbcr->set_source_rgba (0., 0., 0., opacity); - bbcr->arc_negative (center, center, center, 0., (double)rtengine::RT_PI); + bbcr->arc_negative (center, center, center, 0., rtengine::RT_PI); bbcr->line_to (0, 2. * center + textHeight); - bbcr->arc_negative (2. * textPadding, 2. * center + textHeight, 2. * textPadding, (double)rtengine::RT_PI, (double)rtengine::RT_PI / 2.); + bbcr->arc_negative (2. * textPadding, 2. * center + textHeight, 2. * textPadding, rtengine::RT_PI, rtengine::RT_PI / 2.); bbcr->line_to (textWidth, 2. * center + textHeight + 2. * textPadding); - bbcr->arc_negative (textWidth, 2. * center + textHeight, 2. * textPadding, (double)rtengine::RT_PI / 2., 0.); + bbcr->arc_negative (textWidth, 2. * center + textHeight, 2. * textPadding, rtengine::RT_PI / 2., 0.); bbcr->line_to (textWidth + 2. * textPadding, 2. * center + 2. * textPadding); - bbcr->arc_negative (textWidth, 2. * center + 2. * textPadding, 2. * textPadding, 0., (double)rtengine::RT_PI * 1.5); + bbcr->arc_negative (textWidth, 2. * center + 2. * textPadding, 2. * textPadding, 0., rtengine::RT_PI * 1.5); bbcr->line_to (2. * center, 2. * center); bbcr->close_path(); bbcr->set_line_join (Cairo::LINE_JOIN_BEVEL); @@ -222,7 +230,7 @@ void LockableColorPicker::updateBackBuffer () bbcr->set_antialias(Cairo::ANTIALIAS_SUBPIXEL); - float center = (float)size / 2.f + circlePadding; + double center = static_cast(size) / 2. + circlePadding; // light grey circle around the color mark bbcr->arc (center, center, center - circlePadding / 2., 0., 2. * (double)rtengine::RT_PI); @@ -277,7 +285,16 @@ void LockableColorPicker::setRGB (const float R, const float G, const float B, c bpreview = previewB; 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? + rtengine::ImProcFunctions::rgb2lab( + static_cast(255 * r), + static_cast(255 * g), + static_cast(255 * b), + L, a, bb, + color_management_params != nullptr ? *color_management_params : DEFAULT_CMP, + true); + L /= 327.68f; + a /= 327.68f; + bb /= 327.68f; if (validity != Validity::OUTSIDE) { setDirty(true); diff --git a/rtgui/lockablecolorpicker.h b/rtgui/lockablecolorpicker.h index 77d2e8e9f..b18a56028 100644 --- a/rtgui/lockablecolorpicker.h +++ b/rtgui/lockablecolorpicker.h @@ -24,6 +24,18 @@ class CropWindow; +namespace rtengine +{ + +namespace procparams +{ + +class ColorManagementParams; + +} + +} + class LockablePickerToolListener { public: @@ -33,7 +45,7 @@ public: virtual void switchPickerVisibility(bool isVisible) = 0; }; -class LockableColorPicker : BackBuffer +class LockableColorPicker final : BackBuffer { public: enum class Size { @@ -60,8 +72,7 @@ private: rtengine::Coord position; // Coordinate in image space rtengine::Coord anchorOffset; Size size; - Glib::ustring *outputProfile; - Glib::ustring *workingProfile; + rtengine::procparams::ColorManagementParams *color_management_params; Validity validity; float r, g, b; // red green blue in [0;1] range float rpreview, gpreview, bpreview; @@ -72,7 +83,7 @@ private: public: - LockableColorPicker (CropWindow* cropWindow, Glib::ustring *oProfile, Glib::ustring *wProfile); + LockableColorPicker (CropWindow* cropWindow, rtengine::procparams::ColorManagementParams *color_management_params); void draw (const Cairo::RefPtr &cr); diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index c60cba070..cebced274 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -148,12 +148,14 @@ int main (int argc, char **argv) } options.rtSettings.lensfunDbDirectory = LENSFUN_DB_PATH; + options.rtSettings.lensfunDbBundleDirectory = LENSFUN_DB_PATH; #else argv0 = DATA_SEARCH_PATH; creditsPath = CREDITS_SEARCH_PATH; licensePath = LICENCE_SEARCH_PATH; options.rtSettings.lensfunDbDirectory = LENSFUN_DB_PATH; + options.rtSettings.lensfunDbBundleDirectory = LENSFUN_DB_PATH; #endif bool quickstart = dontLoadCache (argc, argv); @@ -741,7 +743,7 @@ int processLineParams ( int argc, char **argv ) if (options.defProfRaw == DEFPROFILE_DYNAMIC) { rawParams->deleteInstance(); delete rawParams; - rawParams = ProfileStore::getInstance()->loadDynamicProfile (ii->getMetaData()); + rawParams = ProfileStore::getInstance()->loadDynamicProfile (ii->getMetaData(), inputFile); } std::cout << " Merging default raw processing profile." << std::endl; @@ -750,7 +752,7 @@ int processLineParams ( int argc, char **argv ) if (options.defProfImg == DEFPROFILE_DYNAMIC) { imgParams->deleteInstance(); delete imgParams; - imgParams = ProfileStore::getInstance()->loadDynamicProfile (ii->getMetaData()); + imgParams = ProfileStore::getInstance()->loadDynamicProfile (ii->getMetaData(), inputFile); } std::cout << " Merging default non-raw processing profile." << std::endl; @@ -832,7 +834,7 @@ int processLineParams ( int argc, char **argv ) } ii->decreaseRef(); - resultImage->free(); + delete resultImage; } if (imgParams) { diff --git a/rtgui/main.cc b/rtgui/main.cc index f669bcf4a..30e2d7da6 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -121,6 +121,7 @@ static void myGdkLockLeave() * -1 if there is an error in parameters * -2 if an error occurred during processing * -3 if at least one required procparam file was not found */ +//int processLineParams ( int argc, char **argv ); int processLineParams ( int argc, char **argv ) { int ret = 1; @@ -255,6 +256,7 @@ RTWindow *create_rt_window() //gdk_threads_enter (); RTWindow *rtWindow = new RTWindow(); + rtWindow->setWindowSize(); // Need to be called after RTWindow creation to work with all OS Windows Manager return rtWindow; } @@ -423,12 +425,14 @@ int main (int argc, char **argv) } options.rtSettings.lensfunDbDirectory = LENSFUN_DB_PATH; + options.rtSettings.lensfunDbBundleDirectory = LENSFUN_DB_PATH; #else argv0 = DATA_SEARCH_PATH; creditsPath = CREDITS_SEARCH_PATH; licensePath = LICENCE_SEARCH_PATH; options.rtSettings.lensfunDbDirectory = LENSFUN_DB_PATH; + options.rtSettings.lensfunDbBundleDirectory = LENSFUN_DB_PATH; #endif #ifdef WIN32 @@ -439,7 +443,7 @@ int main (int argc, char **argv) if (argc > 1) { 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); + const bool stdoutRedirecttoConsole = (GetFileType (GetStdHandle (STD_OUTPUT_HANDLE)) == 0x0000); // open console, if stdout is invalid if (stdoutRedirecttoConsole) { // check if parameter -w was passed. @@ -458,7 +462,7 @@ int main (int argc, char **argv) SetConsoleCtrlHandler ( NULL, true ); // Set title of console char consoletitle[128]; - sprintf (consoletitle, "RawTherapee %s Console", RTVERSION); + snprintf(consoletitle, sizeof(consoletitle), "RawTherapee %s Console", RTVERSION); SetConsoleTitle (consoletitle); // increase size of screen buffer COORD c; @@ -471,10 +475,9 @@ int main (int argc, char **argv) cursorInfo.bVisible = false; SetConsoleCursorInfo ( GetStdHandle ( STD_OUTPUT_HANDLE ), &cursorInfo ); - if (stdoutRedirecttoConsole) { // if stdout is Redirect to console, we also redirect stderr to console - freopen ( "CON", "w", stdout ) ; - freopen ( "CON", "w", stderr ) ; - } + // we also redirect stderr to console + freopen ( "CON", "w", stdout ) ; + freopen ( "CON", "w", stderr ) ; freopen ( "CON", "r", stdin ) ; diff --git a/rtgui/md5helper.h b/rtgui/md5helper.h new file mode 100644 index 000000000..17ee70f3a --- /dev/null +++ b/rtgui/md5helper.h @@ -0,0 +1,69 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-201 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#include +#include + +#include +#include + +#ifdef WIN32 +#include +#endif + +namespace { +std::string getMD5 (const Glib::ustring& fname) +{ + + auto file = Gio::File::create_for_path (fname); + + if (file && file->query_exists ()) { + +#ifdef WIN32 + + std::unique_ptr wfname (reinterpret_cast (g_utf8_to_utf16 (fname.c_str (), -1, NULL, NULL, NULL)), g_free); + + WIN32_FILE_ATTRIBUTE_DATA fileAttr; + + if (GetFileAttributesExW (wfname.get (), GetFileExInfoStandard, &fileAttr)) { + // We use name, size and creation time to identify a file. + const auto identifier = Glib::ustring::compose ("%1-%2-%3-%4", fileAttr.nFileSizeLow, fileAttr.ftCreationTime.dwHighDateTime, fileAttr.ftCreationTime.dwLowDateTime, fname); + return Glib::Checksum::compute_checksum (Glib::Checksum::CHECKSUM_MD5, identifier); + } + +#else + + try { + + if (auto info = file->query_info ()) { + // We only use name and size to identify a file. + const auto identifier = Glib::ustring::compose ("%1%2", fname, info->get_size ()); + return Glib::Checksum::compute_checksum (Glib::Checksum::CHECKSUM_MD5, identifier); + } + + } catch (Gio::Error&) {} + +#endif + + } + + return {}; +} + +} diff --git a/rtgui/metadatapanel.cc b/rtgui/metadatapanel.cc index f92152763..e26444ccc 100644 --- a/rtgui/metadatapanel.cc +++ b/rtgui/metadatapanel.cc @@ -28,8 +28,9 @@ using namespace rtengine::procparams; MetaDataPanel::MetaDataPanel() : EvMetaDataMode(ProcEventMapper::getInstance()->newEvent(M_VOID, "HISTORY_MSG_METADATA_MODE")) { + set_orientation(Gtk::ORIENTATION_VERTICAL); - Gtk::HBox *box = Gtk::manage(new Gtk::HBox()); + Gtk::Box *box = Gtk::manage(new Gtk::Box()); box->pack_start(*Gtk::manage(new Gtk::Label(M("TP_METADATA_MODE") + ": ")), Gtk::PACK_SHRINK, 4); metadataMode = Gtk::manage(new MyComboBoxText()); metadataMode->append(M("TP_METADATA_TUNNEL")); diff --git a/rtgui/metadatapanel.h b/rtgui/metadatapanel.h index b39ffd2c1..bc74ac484 100644 --- a/rtgui/metadatapanel.h +++ b/rtgui/metadatapanel.h @@ -24,7 +24,7 @@ #include "exifpanel.h" #include "iptcpanel.h" -class MetaDataPanel: public Gtk::VBox, public ToolPanel { +class MetaDataPanel: public Gtk::Box, public ToolPanel { private: rtengine::ProcEvent EvMetaDataMode; MyComboBoxText *metadataMode; diff --git a/rtgui/multilangmgr.cc b/rtgui/multilangmgr.cc index ecf744519..13f2569c5 100644 --- a/rtgui/multilangmgr.cc +++ b/rtgui/multilangmgr.cc @@ -24,6 +24,9 @@ #include #include #endif +#ifdef __APPLE__ +#include +#endif namespace { @@ -41,33 +44,34 @@ struct LocaleToLang : private std::map, emplace (key ("ca", "ES"), "Catala"); emplace (key ("cs", "CZ"), "Czech"); emplace (key ("da", "DK"), "Dansk"); - emplace (key ("de", "DE"), "Deutsch"); + emplace (key ("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 ("es", "" ), "Espanol (Latin America)"); + emplace (key ("es", "ES"), "Espanol (Castellano)"); emplace (key ("eu", "ES"), "Euskara"); - emplace (key ("fr", "FR"), "Francais"); + emplace (key ("fr", "" ), "Francais"); emplace (key ("el", "GR"), "Greek"); emplace (key ("he", "IL"), "Hebrew"); - emplace (key ("it", "IT"), "Italiano"); + emplace (key ("it", "" ), "Italiano"); emplace (key ("ja", "JP"), "Japanese"); - emplace (key ("lv", "LV"), "Latvian"); - emplace (key ("hu", "HU"), "Magyar"); - emplace (key ("nl", "NL"), "Nederlands"); + emplace (key ("lv", "" ), "Latvian"); + emplace (key ("hu", "" ), "Magyar"); + emplace (key ("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 ("pl", "" ), "Polish"); + emplace (key ("pt", "" ), "Portugues (Brasil)"); + emplace (key ("ru", "" ), "Russian"); emplace (key ("sr", "RS"), "Serbian (Cyrilic Characters)"); - emplace (key ("sk", "SK"), "Slovak"); - emplace (key ("fi", "FI"), "Suomi"); + emplace (key ("sk", "" ), "Slovak"); + emplace (key ("fi", "" ), "Suomi"); emplace (key ("sv", "SE"), "Swedish"); - emplace (key ("tr", "TR"), "Turkish"); + emplace (key ("tr", "" ), "Turkish"); emplace (key ("zh", "CN"), "Chinese (Simplified)"); emplace (key ("zh", "SG"), "Chinese (Traditional)"); } @@ -76,12 +80,15 @@ struct LocaleToLang : private std::map, { Glib::ustring major, minor; + // TODO: Support 3 character language code when needed. if (locale.length () >= 2) { major = locale.substr (0, 2).lowercase (); } if (locale.length () >= 5) { - minor = locale.substr (3, 2).uppercase (); + const Glib::ustring::size_type length = + locale.length() > 5 && g_unichar_isalnum(locale[5]) ? 3 : 2; + minor = locale.substr (3, length).uppercase (); } // Look for matching language and country. @@ -92,7 +99,7 @@ struct LocaleToLang : private std::map, } // Look for matching language only. - iterator = find (key (major, major.uppercase())); + iterator = find (key (major, "")); if (iterator != end ()) { return iterator->second; @@ -122,6 +129,20 @@ void setGtkLanguage(const Glib::ustring &language) { if(language != "default") { // nothing to change when using default std::string lang = localeToLang.getLocale(language); +#ifdef __APPLE__ + + // On MacOS, LANG environment variable is not defined when running app bundle + // So we should set all locale data + const Glib::ustring localeUTF8 = lang + ".UTF-8"; + + lang = lang + ".UTF-8"; // According to Apple documentation, UTF-8 is a built-in encoding on all platforms on which macOS runs + + g_setenv("LANG", lang.c_str(), true); + setlocale(LC_ALL, lang.c_str()); + setlocale (LC_NUMERIC, "C"); // Force decimal point to dot. + +#else + const gchar *env_langc = g_getenv("LANG"); if(env_langc) { const std::string env_lang(env_langc); @@ -134,6 +155,8 @@ void setGtkLanguage(const Glib::ustring &language) } g_setenv("LANG", lang.c_str(), true); + +#endif } } @@ -228,7 +251,7 @@ Glib::ustring MultiLangMgr::getOSUserLanguage () langName = localeToLang (localeName); -#elif defined (__linux__) || defined (__APPLE__) +#elif defined (__linux__) // Query the current locale and force decimal point to dot. const char *locale = getenv("LANG"); @@ -238,6 +261,51 @@ Glib::ustring MultiLangMgr::getOSUserLanguage () setlocale (LC_NUMERIC, "C"); +#elif defined (__APPLE__) + + // "LANG" environment variable is not defined. Retrieving it from CoreFundation API + // Get used Mac string encoding + CFStringEncoding strEncoding = CFStringGetSystemEncoding(); + // Get user locale data + CFLocaleRef cfLocale = CFLocaleCopyCurrent(); + // Get locale language code + CFStringRef langCodeStr = (CFStringRef)CFLocaleGetValue(cfLocale, kCFLocaleLanguageCode); + Glib::ustring langCode(""); + + if (langCodeStr != NULL) { + const auto langCodeStrLength = CFStringGetLength(langCodeStr) + 1; + char langCodeBuffer[langCodeStrLength]; + CFStringGetCString(langCodeStr, langCodeBuffer, langCodeStrLength, strEncoding); + langCode = Glib::ustring(langCodeBuffer); + } + + // Get locale country code + CFStringRef countryCodeStr = (CFStringRef)CFLocaleGetValue(cfLocale, kCFLocaleCountryCode); + Glib::ustring countryCode(""); + + if (countryCodeStr != NULL) { + const auto countryCodeStrLength = CFStringGetLength(countryCodeStr) + 1; + char countryCodeBuffer[countryCodeStrLength]; + CFStringGetCString(countryCodeStr, countryCodeBuffer, countryCodeStrLength, strEncoding); + countryCode = Glib::ustring(countryCodeBuffer); + } + + // Concatenate locale data + Glib::ustring locale = langCode + "_" + countryCode; + + // Release user locale data + CFRelease(cfLocale); + CFRelease(langCodeStr); + CFRelease(countryCodeStr); + + // Set locale environment data + locale = locale + ".UTF-8"; // According to Apple documentation, UTF-8 is a built-in encoding on all platforms on which macOS runs + g_setenv("LANG", locale.c_str(), true); + setlocale(LC_ALL, locale.c_str()); + setlocale (LC_NUMERIC, "C"); // Force decimal point to dot. + + langName = localeToLang(locale); + #endif return langName; diff --git a/rtgui/mycurve.cc b/rtgui/mycurve.cc index 7401570c8..d460713fb 100644 --- a/rtgui/mycurve.cc +++ b/rtgui/mycurve.cc @@ -183,7 +183,7 @@ float MyCurve::getVal(LUTf &curve, int x) if (size_t(graphW) == curve.getSize()) { return curve[x]; } else { - return curve.getVal01(float(x) / graphW); + return curve.getVal01(x / graphW); } } diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index abd339ce0..4f9422c69 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -39,7 +39,9 @@ MyDiagonalCurve::MyDiagonalCurve () : ugpX(0.0), ugpY(0.0), activeParam(-1), - bghistvalid(false) + bghistvalid(false), + locallabRef(0.0) + { grab_point = -1; @@ -129,6 +131,36 @@ std::vector MyDiagonalCurve::get_vector (int veclen) return vector; } +void MyDiagonalCurve::updateLocallabBackground(double ref) +{ + locallabRef = ref; + + mcih->pending++; + + idle_register.add( + [this]() -> bool + { + if (mcih->destroyed) { + if (mcih->pending == 1) { + delete mcih; + } else { + --mcih->pending; + } + + return false; + } + + mcih->clearPixmap(); + mcih->myCurve->queue_draw(); + + --mcih->pending; + + return false; + } + ); +} + + void MyDiagonalCurve::get_LUT (LUTf &lut) { @@ -260,6 +292,20 @@ void MyDiagonalCurve::draw (int handle) cr->set_line_width (1.0 * s); + // Draw Locallab reference value in the background + if (locallabRef > 0.0) { + cr->set_line_width(1.0); + cr->move_to(double(graphX + 1), double(graphY - 1)); + c = style->get_color(state); + cr->set_source_rgba(c.get_red(), c.get_green(), c.get_blue(), 0.2); + cr->line_to(double(graphX + 1), double(graphY - 1) - double(graphH - 2)); + cr->line_to(double(graphX) + 1.5 + locallabRef*double(graphW -2), double(graphY - 1) - double(graphH - 2)); + cr->line_to(double(graphX) + 1.5 + locallabRef*double(graphW -2), double(graphY - 1)); + cr->close_path(); + cr->fill(); + cr->stroke(); + } + // draw the left colored bar if (leftBar) { // first the background @@ -323,7 +369,7 @@ void MyDiagonalCurve::draw (int handle) // draw the grid lines: cr->set_line_width (1.0 * s); c = style->get_border_color(state); - cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); + cr->set_source_rgba (c.get_red(), c.get_green(), c.get_blue(), 0.3); cr->set_antialias (Cairo::ANTIALIAS_NONE); for (int i = 0; i <= 10; i++) { @@ -358,14 +404,14 @@ void MyDiagonalCurve::draw (int handle) // draw upper and lower bounds if (curve.type == DCT_Parametric && activeParam > 0 && lpoint.getUpperBound() > 1 && upoint.getUpperBound() > 1) { cr->set_source_rgba (1.0, 1.0, 1.0, 0.1); - cr->move_to (graphX, getVal(upoint, 0) * -graphH + graphY); + cr->move_to (graphX, static_cast(getVal(upoint, 0)) * -graphH + graphY); for (int i = 1; i < graphW - 2; ++i) { - cr->line_to ((double)i + graphX, getVal(upoint, i) * -graphH + graphY); + cr->line_to ((double)i + graphX, static_cast(getVal(upoint, i)) * -graphH + graphY); } for (int i = graphW - 3; i >= 0; --i) { - cr->line_to ((double)i + graphX, getVal(lpoint, i) * -graphH + graphY); + cr->line_to ((double)i + graphX, static_cast(getVal(lpoint, i)) * -graphH + graphY); } cr->fill (); @@ -390,21 +436,21 @@ void MyDiagonalCurve::draw (int handle) if (n > 1) { if (pipetteR > -1.f) { cr->set_source_rgba (1., 0., 0., 0.5); // WARNING: assuming that red values are stored in pipetteR, which might not be the case! - cr->move_to (graphX + graphW*pipetteR, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteR), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); } if (pipetteG > -1.f) { cr->set_source_rgba (0., 1., 0., 0.5); // WARNING: assuming that green values are stored in pipetteG, which might not be the case! - cr->move_to (graphX + graphW*pipetteG, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteG), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); } if (pipetteB > -1.f) { cr->set_source_rgba (0., 0., 1., 0.5); // WARNING: assuming that blue values are stored in pipetteB, which might not be the case! - cr->move_to (graphX + graphW*pipetteB, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteB), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); } @@ -414,7 +460,7 @@ void MyDiagonalCurve::draw (int handle) cr->set_line_width (2. * s); c = style->get_color (state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->move_to (graphX + graphW*pipetteVal, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteVal), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); cr->set_line_width (1. * s); @@ -460,7 +506,7 @@ void MyDiagonalCurve::draw (int handle) // draw curve cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->move_to (graphX, getVal(point, 0) * -graphH + graphY); + cr->move_to (graphX, static_cast(getVal(point, 0)) * -graphH + graphY); for (int i = 1; i < graphW; ++i) { cr->line_to ((double)i + graphX, (double)getVal(point, i) * -graphH + graphY); diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index b38373006..0eb173f70 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -41,7 +41,7 @@ public: std::vector x, y; // in case of parametric curves the curve parameters are stored in vector x. In other cases these vectors store the coordinates of the bullets. }; -class MyDiagonalCurve : public MyCurve +class MyDiagonalCurve final : public MyCurve { private: IdleRegister idle_register; @@ -62,6 +62,7 @@ protected: int activeParam; unsigned int* bghist; // histogram values bool bghistvalid; + double locallabRef; // Locallab reference value to display in the background void draw (int handle); void interpolate (); @@ -91,6 +92,7 @@ public: bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey) override; void pipetteButton1Released(EditDataProvider *provider) override; void pipetteDrag(EditDataProvider *provider, int modifierKey) override; + void updateLocallabBackground(double ref); void setPos(double pos, int chanIdx) override; void stopNumericalAdjustment() override; diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index 362d34f35..11d89ebd8 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -46,7 +46,8 @@ MyFlatCurve::MyFlatCurve () : deletedPointX(0.0), leftTanHandle({0.0, 0.0}), rightTanHandle({0.0, 0.0}), - draggingElement(false) + draggingElement(false), + locallabRef(0.0) { lit_point = -1; @@ -169,6 +170,20 @@ void MyFlatCurve::draw () cr->set_line_width (1.0 * s); + // Draw Locallab reference value in the background + if (locallabRef > 0.0) { + cr->set_line_width(1.0); + cr->move_to(double(graphX + 1), double(graphY - 1)); + c = style->get_color(state); + cr->set_source_rgba(c.get_red(), c.get_green(), c.get_blue(), 0.2); + cr->line_to(double(graphX + 1), double(graphY - 1) - double(graphH - 2)); + cr->line_to(double(graphX) + 1.5 + locallabRef*double(graphW -2), double(graphY - 1) - double(graphH - 2)); + cr->line_to(double(graphX) + 1.5 + locallabRef*double(graphW -2), double(graphY - 1)); + cr->close_path(); + cr->fill(); + cr->stroke(); + } + // draw the left colored bar if (leftBar) { // first the background @@ -233,21 +248,21 @@ void MyFlatCurve::draw () if (n > 1) { if (pipetteR > -1.f) { cr->set_source_rgba (1., 0., 0., 0.5); // WARNING: assuming that red values are stored in pipetteR, which might not be the case! - cr->move_to (graphX + graphW*pipetteR, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteR), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); } if (pipetteG > -1.f) { cr->set_source_rgba (0., 1., 0., 0.5); // WARNING: assuming that green values are stored in pipetteG, which might not be the case! - cr->move_to (graphX + graphW*pipetteG, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteG), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); } if (pipetteB > -1.f) { cr->set_source_rgba (0., 0., 1., 0.5); // WARNING: assuming that blue values are stored in pipetteB, which might not be the case! - cr->move_to (graphX + graphW*pipetteB, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteB), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); } @@ -257,7 +272,7 @@ void MyFlatCurve::draw () cr->set_line_width (2. * s); c = style->get_color (state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->move_to (graphX + graphW*pipetteVal, graphY + 1. * s); + cr->move_to (graphX + graphW * static_cast(pipetteVal), graphY + 1. * s); cr->rel_line_to (0, -graphH - 1. * s); cr->stroke (); cr->set_line_width (1. * s); @@ -437,10 +452,10 @@ void MyFlatCurve::draw () // draw curve c = style->get_color(state); cr->set_source_rgb (c.get_red(), c.get_green(), c.get_blue()); - cr->move_to (graphX, getVal(point, 0) * -graphH + graphY); + cr->move_to (graphX, static_cast(getVal(point, 0)) * -graphH + graphY); for (int i = 1; i < graphW; ++i) { - cr->line_to ((double)i + graphX, (double)getVal(point, i) * -graphH + graphY); + cr->line_to ((double)i + graphX, static_cast(getVal(point, i)) * -graphH + graphY); } cr->stroke (); @@ -1870,6 +1885,35 @@ void MyFlatCurve::stopNumericalAdjustment() } } +void MyFlatCurve::updateLocallabBackground(double ref) +{ + locallabRef = ref; + + mcih->pending++; + + idle_register.add( + [this]() -> bool + { + if (mcih->destroyed) { + if (mcih->pending == 1) { + delete mcih; + } else { + --mcih->pending; + } + + return false; + } + + mcih->clearPixmap(); + mcih->myCurve->queue_draw(); + + --mcih->pending; + + return false; + } + ); +} + void MyFlatCurve::setType (FlatCurveType t) { diff --git a/rtgui/myflatcurve.h b/rtgui/myflatcurve.h index 88d651a05..f51586567 100644 --- a/rtgui/myflatcurve.h +++ b/rtgui/myflatcurve.h @@ -66,8 +66,10 @@ public: double centerY; }; -class MyFlatCurve : public MyCurve +class MyFlatCurve final : public MyCurve { +private: + IdleRegister idle_register; protected: FlatCurveDescr curve; @@ -95,6 +97,7 @@ protected: enum EditedHandle editedHandle; bool draggingElement; enum MouseOverAreas area; + double locallabRef; // Locallab reference value to display in the background void draw (); void movePoint(bool moveX, bool moveY, bool pipetteDrag = false); @@ -129,4 +132,6 @@ public: void setPos(double pos, int chanIdx) override; void stopNumericalAdjustment() override; + + void updateLocallabBackground(double ref); }; diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 619ea0cfd..042f57a00 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -21,19 +21,78 @@ #include "previewwindow.h" #include "toolpanel.h" #include "../rtengine/color.h" +#include "../rtengine/improcfun.h" #include "../rtengine/rt_math.h" #include "options.h" using namespace rtengine; -Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(options.navHSVUnit) +namespace { +const rtengine::procparams::ColorManagementParams DEFAULT_CMP; + +} + +Navigator::Navigator() : + pointer_moved_delayed_call(50, 100), + currentRGBUnit(options.navRGBUnit), + currentHSVUnit(options.navHSVUnit) +{ + pointer_moved_delayed_call.setFunction( + [this](bool validPos, const rtengine::procparams::ColorManagementParams *cmp, int x, int y, int r, int g, int b, bool isRaw) + { + if (!validPos) { + setInvalid (x, y); + } else { + Glib::ustring s1, s2, s3; + + position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); + + 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); + + ImProcFunctions::rgb2lab( + static_cast(r), + static_cast(g), + static_cast(b), + LAB_l, LAB_a, LAB_b, + cmp != nullptr ? *cmp : DEFAULT_CMP, + true); + LAB_l /= 327.68f; + LAB_a /= 327.68f; + LAB_b /= 327.68f; + 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); + } + } + } + ); + set_label (M("MAIN_MSG_NAVIGATOR")); - Gtk::VBox* mbox = Gtk::manage (new Gtk::VBox ()); - mbox->set_name("Navigator"); + set_name("Navigator"); + Gtk::Box* mbox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); previewWindow = Gtk::manage (new PreviewWindow ()); - mbox->pack_start (*previewWindow, Gtk::PACK_SHRINK, 2); + mbox->pack_start (*previewWindow, Gtk::PACK_EXPAND_WIDGET, 2); dimension = Gtk::manage (new Gtk::Label ()); mbox->pack_start (*dimension, Gtk::PACK_SHRINK, 2); position = Gtk::manage (new Gtk::Label ()); @@ -60,6 +119,17 @@ Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(opt lLAB_A->set_alignment(Gtk::ALIGN_START); lLAB_B->set_alignment(Gtk::ALIGN_START); lLAB_L->set_alignment(Gtk::ALIGN_START); + + // expand labels + lR->set_hexpand(); + lG->set_hexpand(); + lB->set_hexpand(); + lH->set_hexpand(); + lS->set_hexpand(); + lV->set_hexpand(); + lLAB_A->set_hexpand(); + lLAB_B->set_hexpand(); + lLAB_L->set_hexpand(); //values R = Gtk::manage (new Gtk::Label ()); @@ -130,78 +200,77 @@ Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(opt */ // setup the tables - Gtk::Table* table0 = Gtk::manage (new Gtk::Table (1, 3)); //rows, cols The main table container + Gtk::Grid* table0 = Gtk::manage (new Gtk::Grid()); //rows, cols The main table container // let's pack tables1,2-3 into table0 // RGB Gtk::EventBox *evBox1 = Gtk::manage (new Gtk::EventBox()); - Gtk::HBox* hbox1 = Gtk::manage (new Gtk::HBox ()); // container - Gtk::Table* table1 = Gtk::manage (new Gtk::Table (3, 2)); - - table1->attach (*lR, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table1->attach (*R, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - - table1->attach (*lG, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table1->attach (*G, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - - table1->attach (*lB, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table1->attach (*B, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); + Gtk::Box* hbox1 = Gtk::manage (new Gtk::Box ()); + Gtk::Grid* table1 = Gtk::manage (new Gtk::Grid()); + + table1->attach(*lR, 0, 0, 1, 1); + table1->attach(*R, 1, 0, 1, 1); + table1->attach(*lG, 0, 1, 1, 1); + table1->attach(*G, 1, 1, 1, 1); + table1->attach(*lB, 0, 2, 1, 1); + table1->attach(*B, 1, 2, 1, 1); evBox1->add (*table1); evBox1->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &Navigator::cycleUnitsRGB)); hbox1->pack_start (*evBox1, Gtk::PACK_EXPAND_WIDGET, 4); - hbox1->pack_start (*Gtk::manage (new Gtk::VSeparator()), Gtk::PACK_SHRINK, 4); - table0->attach (*hbox1, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); + hbox1->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK, 4); + table0->attach(*hbox1, 0, 0, 1, 1); // HSV Gtk::EventBox *evBox2 = Gtk::manage (new Gtk::EventBox()); - Gtk::HBox* hbox2 = Gtk::manage (new Gtk::HBox ()); // container - Gtk::Table* table2 = Gtk::manage (new Gtk::Table (3, 2)); + Gtk::Box* hbox2 = Gtk::manage (new Gtk::Box ()); + Gtk::Grid* table2 = Gtk::manage (new Gtk::Grid()); - table2->attach (*lH, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table2->attach (*H, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - - table2->attach (*lS, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table2->attach (*S, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - - table2->attach (*lV, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table2->attach (*V, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); + table2->attach(*lH, 0, 0, 1, 1); + table2->attach(*H, 1, 0, 1, 1); + table2->attach(*lS, 0, 1, 1, 1); + table2->attach(*S, 1, 1, 1, 1); + table2->attach(*lV, 0, 2, 1, 1); + table2->attach(*V, 1, 2, 1, 1); evBox2->add (*table2); evBox2->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &Navigator::cycleUnitsHSV)); hbox2->pack_start (*evBox2, Gtk::PACK_EXPAND_WIDGET, 4); - hbox2->pack_start (*Gtk::manage (new Gtk::VSeparator()), Gtk::PACK_SHRINK, 4); - table0->attach (*hbox2, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); + hbox2->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK, 4); + table0->attach(*hbox2, 1, 0, 1, 1); // LAB - Gtk::HBox* hbox3 = Gtk::manage (new Gtk::HBox ()); // container - Gtk::Table* table3 = Gtk::manage (new Gtk::Table (3, 2)); + Gtk::Box* hbox3 = Gtk::manage (new Gtk::Box ()); + Gtk::Grid* table3 = Gtk::manage (new Gtk::Grid()); - table3->attach (*lLAB_L, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table3->attach (*LAB_L, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - - table3->attach (*lLAB_A, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table3->attach (*LAB_A, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - - table3->attach (*lLAB_B, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 4, 0); - table3->attach (*LAB_B, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); + table3->attach(*lLAB_L, 0, 0, 1, 1); + table3->attach(*LAB_L, 1, 0, 1, 1); + table3->attach(*lLAB_A, 0, 1, 1, 1); + table3->attach(*LAB_A, 1, 1, 1, 1); + table3->attach(*lLAB_B, 0, 2, 1, 1); + table3->attach(*LAB_B, 1, 2, 1, 1); hbox3->pack_start (*table3, Gtk::PACK_EXPAND_WIDGET, 4); - hbox3->pack_start (*Gtk::manage (new Gtk::HBox()), Gtk::PACK_SHRINK, 2); - table0->attach (*hbox3, 2, 3, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); + hbox3->pack_start (*Gtk::manage (new Gtk::Box()), Gtk::PACK_SHRINK, 2); + table0->attach(*hbox3, 2, 0, 1, 1); - table0->set_homogeneous(true); // all cells will be the same size as the largest cell. + table0->set_column_homogeneous(true); // all cells will have equal width - mbox->pack_start (*table0, Gtk::PACK_EXPAND_WIDGET, 2); + mbox->pack_start (*table0, Gtk::PACK_SHRINK, 2); add (*mbox); setInvalid (); show_all (); } +Navigator::~Navigator() +{ + pointer_moved_delayed_call.cancel(); +} + void Navigator::setInvalid (int fullWidth, int fullHeight) { if (fullWidth > 0 && fullHeight > 0) { @@ -276,43 +345,9 @@ 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, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) +void Navigator::pointerMoved (bool validPos, const rtengine::procparams::ColorManagementParams &cmp, int x, int y, int r, int g, int b, bool isRaw) { - - if (!validPos) { - setInvalid (x, y); - } else { - Glib::ustring s1, s2, s3; - - position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); - - 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::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); - } - } + pointer_moved_delayed_call(validPos, &cmp, x, y, r, g, b, isRaw); } void Navigator::cycleUnitsRGB (GdkEventButton *event) { diff --git a/rtgui/navigator.h b/rtgui/navigator.h index c1c23c6dc..c16bf7ac7 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -20,12 +20,13 @@ #include +#include "delayed.h" #include "options.h" #include "pointermotionlistener.h" class PreviewWindow; -class Navigator : +class Navigator final : public Gtk::Frame, public PointerMotionListener { @@ -33,6 +34,8 @@ class Navigator : typedef const double (*TMatrix)[3]; private: + DelayedCall pointer_moved_delayed_call; + Options::NavigatorUnit currentRGBUnit; Options::NavigatorUnit currentHSVUnit; void cycleUnitsRGB (GdkEventButton *event); @@ -53,11 +56,12 @@ protected: public: PreviewWindow* previewWindow; - Navigator (); + Navigator(); + ~Navigator() override; // pointermotionlistener interface // void pointerMoved (bool validPos, 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 pointerMoved(bool validPos, const rtengine::procparams::ColorManagementParams &cmp, 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, bool isRaw = false) override; diff --git a/rtgui/options.cc b/rtgui/options.cc index dcb16e1ea..e89fcd647 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -19,7 +19,11 @@ #include "options.h" #include #include +#include +#include #include +#include +#include #include #include #include "multilangmgr.h" @@ -177,6 +181,10 @@ void Options::updatePaths() lastWaveletCurvesDir = preferredPath; } + if (lastlocalCurvesDir.empty() || !Glib::file_test(lastlocalCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastlocalCurvesDir, Glib::FILE_TEST_IS_DIR)) { + lastlocalCurvesDir = preferredPath; + } + if (lastPFCurvesDir.empty() || !Glib::file_test(lastPFCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastPFCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastPFCurvesDir = preferredPath; } @@ -294,7 +302,6 @@ void Options::setDefaults() windowMaximized = true; windowMonitor = 0; meowMonitor = -1; - meowFullScreen = false; meowMaximized = true; meowWidth = 1200; meowHeight = 680; @@ -310,6 +317,7 @@ void Options::setDefaults() saveFormat.tiffBits = 16; saveFormat.tiffFloat = false; saveFormat.tiffUncompressed = true; + saveFormat.bigTiff = false; saveFormat.saveParams = true; saveFormatBatch.format = "jpg"; @@ -396,6 +404,7 @@ void Options::setDefaults() overwriteOutputFile = false; // if TRUE, existing output JPGs/PNGs are overwritten, instead of adding ..-1.jpg, -2.jpg etc. theme = "RawTherapee"; maxThumbnailHeight = 250; + maxThumbnailWidth = 800; maxCacheEntries = 20000; thumbInterp = 1; autoSuffix = true; @@ -408,14 +417,21 @@ void Options::setDefaults() gimpDir = ""; psDir = ""; customEditorProg = ""; + externalEditors.clear(); + externalEditorIndex = -1; CPBKeys = CPBKT_TID; editorToSendTo = 1; + editor_out_dir = EDITOR_OUT_DIR_TEMP; + editor_custom_out_dir = ""; + editor_float32 = false; + editor_bypass_output_profile = false; favoriteDirs.clear(); tpOpen.clear(); autoSaveTpOpen = true; //crvOpen.clear (); parseExtensions.clear(); favorites.clear(); + cloneFavoriteTools = false; parseExtensionsEnabled.clear(); parsedExtensions.clear(); parsedExtensionsSet.clear(); @@ -442,12 +458,18 @@ void Options::setDefaults() histogramBlue = true; histogramLuma = false; histogramChroma = false; - histogramRAW = false; histogramBar = true; histogramHeight = 200; histogramDrawMode = 0; + histogramScopeType = ScopeType::HISTOGRAM; + histogramShowOptionButtons = false; + histogramTraceBrightness = 1; curvebboxpos = 1; + complexity = 2; + inspectorWindow = false; + zoomOnScroll = true; prevdemo = PD_Sidecar; + rgbDenoiseThreadLimit = 0; #if defined( _OPENMP ) && defined( __x86_64__ ) clutCacheSize = omp_get_num_procs(); @@ -473,6 +495,7 @@ void Options::setDefaults() menuGroupFileOperations = true; menuGroupProfileOperations = true; menuGroupExtProg = true; + showtooltip = false; ICCPC_primariesPreset = "sRGB", ICCPC_redPrimaryX = 0.6400; @@ -523,6 +546,8 @@ void Options::setDefaults() fastexport_resize_dataspec = 3; fastexport_resize_width = 900; fastexport_resize_height = 900; + fastexport_resize_longedge = 900; + fastexport_resize_shortedge = 900; fastexport_use_fast_pipeline = true; clutsDir = "./cluts"; @@ -549,6 +574,9 @@ void Options::setDefaults() rtSettings.darkFramesPath = ""; rtSettings.flatFieldsPath = ""; + rtSettings.cameraProfilesPath = ""; + rtSettings.lensProfilesPath = ""; + #ifdef WIN32 const gchar* sysRoot = g_getenv("SystemRoot"); // Returns e.g. "c:\Windows" @@ -573,10 +601,12 @@ void Options::setDefaults() rtSettings.monitorProfile = Glib::ustring(); rtSettings.monitorIntent = rtengine::RI_RELATIVE; rtSettings.monitorBPC = true; + rtSettings.autocielab = false; rtSettings.autoMonitorProfile = false; 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.DCIP3 = "RTv2_DCIP3"; rtSettings.srgb = "RTv4_sRGB"; rtSettings.bruce = "RTv2_Bruce"; rtSettings.beta = "RTv2_Beta"; @@ -588,13 +618,30 @@ void Options::setDefaults() rtSettings.gamutICC = true; rtSettings.gamutLch = true; rtSettings.amchroma = 40;//between 20 and 140 low values increase effect..and also artifacts, high values reduces + rtSettings.amchromajz = 40;//between 5 and 100 low values increase effect..and also artifacts, high values reduces rtSettings.level0_cbdl = 0; rtSettings.level123_cbdl = 30; +//locallab + rtSettings.cropsleep = 50;//generate a pause of 50 µs for dcrop (100%)to avoid crash when moving window, between 0 to ?? + rtSettings.reduchigh = 0.85;//transition for luminance in scope + rtSettings.reduclow = 0.85;//transition for luminance out scope + rtSettings.detectshape = true;//experimental new detection shape + rtSettings.previewselection = 5;//between 1 to 40 + rtSettings.cbdlsensi = 1.0;//between 0.001 to 1 + rtSettings.fftwsigma = true; //choice between sigma^2 or empirical formula +// end locallab + rtSettings.itcwb_enable = true; + +//wavelet + rtSettings.edghi = 3.0;//1.1 and 5. + rtSettings.edglo = 0.5;//0.1 and 0.95 + rtSettings.limrad = 20.;//1 and 60 + rtSettings.protectred = 60; rtSettings.protectredh = 0.3; rtSettings.CRI_color = 0; - rtSettings.autocielab = true; + // rtSettings.autocielab = true; rtSettings.denoiselabgamma = 2; rtSettings.HistogramWorking = false; @@ -611,13 +658,15 @@ void Options::setDefaults() rtSettings.leveldnliss = 0; rtSettings.leveldnautsimpl = 0; -// rtSettings.colortoningab =0.7; -//rtSettings.decaction =0.3; +// rtSettings.colortoningab =0.7; +// rtSettings.decaction =0.3; // rtSettings.ciebadpixgauss=false; rtSettings.rgbcurveslumamode_gamut = true; lastIccDir = rtSettings.iccDirectory; lastDarkframeDir = rtSettings.darkFramesPath; lastFlatfieldDir = rtSettings.flatFieldsPath; + lastCameraProfilesDir = rtSettings.cameraProfilesPath; + lastLensProfilesDir = rtSettings.lensProfilesPath; // rtSettings.bw_complementary = true; // There is no reasonable default for curves. We can still suppose that they will take place // in a subdirectory of the user's own ProcParams presets, i.e. in a subdirectory @@ -629,6 +678,7 @@ void Options::setDefaults() lastRetinexDir = ""; lastDenoiseCurvesDir = ""; lastWaveletCurvesDir = ""; + lastlocalCurvesDir = ""; lastPFCurvesDir = ""; lastHsvCurvesDir = ""; lastToneCurvesDir = ""; @@ -639,6 +689,8 @@ void Options::setDefaults() lastICCProfCreatorDir = ""; gimpPluginShowInfoDialog = true; maxRecentFolders = 15; + sortMethod = SORT_BY_NAME; + sortDescending = false; rtSettings.lensfunDbDirectory = ""; // set also in main.cc and main-cli.cc cropGuides = CROP_GUIDE_FULL; cropAutoFit = false; @@ -727,6 +779,9 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("General", "Language")) { language = keyFile.get_string("General", "Language"); + if (!language.compare("Espanol")) { + language = "Espanol (Latin America)"; + } } if (keyFile.has_key("General", "LanguageAutoDetect")) { @@ -745,11 +800,40 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.flatFieldsPath = keyFile.get_string("General", "FlatFieldsPath"); } + if (keyFile.has_key("General", "CameraProfilesPath")) { + rtSettings.cameraProfilesPath = keyFile.get_string("General", "CameraProfilesPath"); + } + + if (keyFile.has_key("General", "LensProfilesPath")) { + rtSettings.lensProfilesPath = keyFile.get_string("General", "LensProfilesPath"); + } + if (keyFile.has_key("General", "Verbose")) { rtSettings.verbose = keyFile.get_boolean("General", "Verbose"); } + + if (keyFile.has_key("General", "Detectshape")) { + rtSettings.detectshape = keyFile.get_boolean("General", "Detectshape"); + } + + if (keyFile.has_key("General", "Fftwsigma")) { + rtSettings.fftwsigma = keyFile.get_boolean("General", "Fftwsigma"); + } + + if (keyFile.has_key("General", "Cropsleep")) { + rtSettings.cropsleep = keyFile.get_integer("General", "Cropsleep"); + } + + if (keyFile.has_key("General", "Reduchigh")) { + rtSettings.reduchigh = keyFile.get_double("General", "Reduchigh"); + } + + if (keyFile.has_key("General", "Reduclow")) { + rtSettings.reduclow = keyFile.get_double("General", "Reduclow"); + } } + // TODO: Remove. if (keyFile.has_group("External Editor")) { if (keyFile.has_key("External Editor", "EditorKind")) { editorToSendTo = keyFile.get_integer("External Editor", "EditorKind"); @@ -766,6 +850,188 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("External Editor", "CustomEditor")) { customEditorProg = keyFile.get_string("External Editor", "CustomEditor"); } + + if (keyFile.has_key("External Editor", "OutputDir")) { + int v = keyFile.get_integer("External Editor", "OutputDir"); + if (v < int(EDITOR_OUT_DIR_TEMP) || v > int(EDITOR_OUT_DIR_CUSTOM)) { + editor_out_dir = EDITOR_OUT_DIR_TEMP; + } else { + editor_out_dir = EditorOutDir(v); + } + } + + if (keyFile.has_key("External Editor", "CustomOutputDir")) { + editor_custom_out_dir = keyFile.get_string("External Editor", "CustomOutputDir"); + } + + if (keyFile.has_key("External Editor", "Float32")) { + editor_float32 = keyFile.get_boolean("External Editor", "Float32"); + } + + if (keyFile.has_key("External Editor", "BypassOutputProfile")) { + editor_bypass_output_profile = keyFile.get_boolean("External Editor", "BypassOutputProfile"); + } + + } + + if (keyFile.has_group("External Editor")) { + if (keyFile.has_key("External Editor", "Names") + || keyFile.has_key("External Editor", "Commands") + || keyFile.has_key("External Editor", "NativeCommands") + || keyFile.has_key("External Editor", "IconsSerialized")) { + // Multiple external editors. + + const auto & names = + !keyFile.has_key("External Editor", "Names") ? + std::vector() : + static_cast>( + keyFile.get_string_list("External Editor", "Names")); + const auto & commands = + !keyFile.has_key("External Editor", "Commands") ? + std::vector() : + static_cast>( + keyFile.get_string_list("External Editor", "Commands")); + const auto & native_commands = + !keyFile.has_key("External Editor", "NativeCommands") ? + std::vector() : + static_cast>( + keyFile.get_boolean_list("External Editor", "NativeCommands")); + const auto & icons_serialized = + !keyFile.has_key("External Editor", "IconsSerialized") ? + std::vector() : + static_cast>( + keyFile.get_string_list("External Editor", "IconsSerialized")); + externalEditors = std::vector(std::max(std::max( + names.size(), commands.size()), icons_serialized.size())); + for (unsigned i = 0; i < names.size(); i++) { + externalEditors[i].name = names[i]; + } + for (unsigned i = 0; i < commands.size(); i++) { + externalEditors[i].command = commands[i]; + } + for (unsigned i = 0; i < native_commands.size(); i++) { + externalEditors[i].native_command = native_commands[i]; + } + for (unsigned i = 0; i < icons_serialized.size(); i++) { + externalEditors[i].icon_serialized = icons_serialized[i]; + } + + if (keyFile.has_key("External Editor", "EditorIndex")) { + int index = keyFile.get_integer("External Editor", "EditorIndex"); + externalEditorIndex = std::min( + std::max(-1, index), + static_cast(externalEditors.size()) + ); + } + } else if (keyFile.has_key("External Editor", "EditorKind")) { + // Legacy fixed external editors. Convert to flexible. + + // GIMP == 1, Photoshop == 2, Custom == 3. + editorToSendTo = keyFile.get_integer("External Editor", "EditorKind"); + +#ifdef WIN32 + auto getIconSerialized = [](const Glib::ustring &executable) { + // Backslashes and quotes must be escaped in the text representation of GVariant strings. + // See https://www.freedesktop.org/software/gstreamer-sdk/data/docs/2012.5/glib/gvariant-text.html#gvariant-text-strings + Glib::ustring exec_escaped = ""; + for (const auto character : executable) { + if (character == '\\' || character == '\'') { + exec_escaped += '\\'; + } + exec_escaped += character; + } + return Glib::ustring::compose("('themed', <['%1,0', '%1,0-symbolic']>)", exec_escaped); + }; + Glib::ustring gimpDir = ""; + if (keyFile.has_key("External Editor", "GimpDir")) { + gimpDir = keyFile.get_string("External Editor", "GimpDir"); + } + auto executable = Glib::build_filename(options.gimpDir, "bin", "gimp-win-remote"); + if (Glib::file_test(executable, Glib::FILE_TEST_IS_EXECUTABLE)) { + if (editorToSendTo == 1) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("GIMP", executable, true, getIconSerialized(executable)); + } else { + for (auto ver = 12; ver >= 0; --ver) { + executable = Glib::build_filename(gimpDir, "bin", Glib::ustring::compose(Glib::ustring("gimp-2.%1.exe"), ver)); + if (Glib::file_test(executable, Glib::FILE_TEST_IS_EXECUTABLE)) { + if (editorToSendTo == 1) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("GIMP", executable, true, getIconSerialized(executable)); + break; + } + } + } + + Glib::ustring psDir = ""; + if (keyFile.has_key("External Editor", "PhotoshopDir")) { + psDir = keyFile.get_string("External Editor", "PhotoshopDir"); + } + executable = Glib::build_filename(psDir, "Photoshop.exe"); + if (Glib::file_test(executable, Glib::FILE_TEST_IS_EXECUTABLE)) { + if (editorToSendTo == 2) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("Photoshop", executable, true, getIconSerialized(executable)); + } + + if (keyFile.has_key("External Editor", "CustomEditor")) { + executable = keyFile.get_string("External Editor", "CustomEditor"); + if (!executable.empty()) { + if (editorToSendTo == 3) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("-", executable, true, ""); + } + } +#elif defined __APPLE__ + if (editorToSendTo == 1) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("GIMP", "open -a GIMP", true, ""); + externalEditors.emplace_back("GIMP-dev", "open -a GIMP-dev", true, ""); + + if (editorToSendTo == 2) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("Photoshop", "open -a Photoshop", true, ""); + + if (keyFile.has_key("External Editor", "CustomEditor")) { + auto executable = keyFile.get_string("External Editor", "CustomEditor"); + if (!executable.empty()) { + if (editorToSendTo == 3) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("-", executable, true, ""); + } + } +#else + const Glib::ustring gimp_icon_serialized = "('themed', <['gimp', 'gimp-symbolic']>)"; + if (Glib::find_program_in_path("gimp").compare("")) { + if (editorToSendTo == 1) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("GIMP", "gimp", true, gimp_icon_serialized); + } else if (Glib::find_program_in_path("gimp-remote").compare("")) { + if (editorToSendTo == 1) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("GIMP", "gimp-remote", true, gimp_icon_serialized); + } + + if (keyFile.has_key("External Editor", "CustomEditor")) { + auto executable = keyFile.get_string("External Editor", "CustomEditor"); + if (!executable.empty()) { + if (editorToSendTo == 3) { + externalEditorIndex = externalEditors.size(); + } + externalEditors.emplace_back("-", executable, true, ""); + } + } +#endif + } } if (keyFile.has_group("Output")) { @@ -789,14 +1055,18 @@ void Options::readFromFile(Glib::ustring fname) saveFormat.tiffBits = keyFile.get_integer("Output", "TiffBps"); } - if (keyFile.has_key ("Output", "TiffFloat")) { - saveFormat.tiffFloat = keyFile.get_boolean ("Output", "TiffFloat"); + if (keyFile.has_key("Output", "TiffFloat")) { + saveFormat.tiffFloat = keyFile.get_boolean("Output", "TiffFloat"); } if (keyFile.has_key("Output", "TiffUncompressed")) { saveFormat.tiffUncompressed = keyFile.get_boolean("Output", "TiffUncompressed"); } + if (keyFile.has_key("Output", "BigTiff")) { + saveFormat.bigTiff = keyFile.get_boolean("Output", "BigTiff"); + } + if (keyFile.has_key("Output", "SaveProcParams")) { saveFormat.saveParams = keyFile.get_boolean("Output", "SaveProcParams"); } @@ -822,8 +1092,8 @@ void Options::readFromFile(Glib::ustring fname) saveFormatBatch.tiffBits = keyFile.get_integer("Output", "TiffBpsBatch"); } - if (keyFile.has_key ("Output", "TiffFloatBatch")) { - saveFormatBatch.tiffFloat = keyFile.get_boolean ("Output", "TiffFloatBatch"); + if (keyFile.has_key("Output", "TiffFloatBatch")) { + saveFormatBatch.tiffFloat = keyFile.get_boolean("Output", "TiffFloatBatch"); } if (keyFile.has_key("Output", "TiffUncompressedBatch")) { @@ -964,6 +1234,10 @@ void Options::readFromFile(Glib::ustring fname) maxThumbnailHeight = keyFile.get_integer("File Browser", "MaxPreviewHeight"); } + if (keyFile.has_key("File Browser", "MaxPreviewWidth")) { + maxThumbnailWidth = keyFile.get_integer("File Browser", "MaxPreviewWidth"); + } + if (keyFile.has_key("File Browser", "MaxCacheEntries")) { maxCacheEntries = keyFile.get_integer("File Browser", "MaxCacheEntries"); } @@ -1055,6 +1329,19 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("File Browser", "RecentFolders")) { recentFolders = keyFile.get_string_list("File Browser", "RecentFolders"); } + + if (keyFile.has_key("File Browser", "SortMethod")) { + int v = keyFile.get_integer("File Browser", "SortMethod"); + if (v < int(0) || v >= int(SORT_METHOD_COUNT)) { + sortMethod = SORT_BY_NAME; + } else { + sortMethod = SortMethod(v); + } + } + + if (keyFile.has_key("File Browser", "SortDescending")) { + sortDescending = keyFile.get_boolean("File Browser", "SortDescending"); + } } if (keyFile.has_group("Clipping Indication")) { @@ -1130,6 +1417,10 @@ void Options::readFromFile(Glib::ustring fname) favorites = keyFile.get_string_list("GUI", "Favorites"); } + if (keyFile.has_key("GUI", "FavoritesCloneTools")) { + cloneFavoriteTools = keyFile.get_boolean("GUI", "FavoritesCloneTools"); + } + if (keyFile.has_key("GUI", "WindowWidth")) { windowWidth = keyFile.get_integer("GUI", "WindowWidth"); } @@ -1154,10 +1445,6 @@ void Options::readFromFile(Glib::ustring fname) meowMonitor = keyFile.get_integer("GUI", "MeowMonitor"); } - if (keyFile.has_key("GUI", "MeowFullScreen")) { - meowFullScreen = keyFile.get_boolean("GUI", "MeowFullScreen"); - } - if (keyFile.has_key("GUI", "MeowMaximized")) { meowMaximized = keyFile.get_boolean("GUI", "MeowMaximized"); } @@ -1364,19 +1651,34 @@ void Options::readFromFile(Glib::ustring fname) } if (keyFile.has_key("GUI", "HistogramRAW")) { - histogramRAW = keyFile.get_boolean("GUI", "HistogramRAW"); + // Legacy option, replaced by HistogramScopeType. + if (keyFile.get_boolean("GUI", "HistogramRAW")) { + histogramScopeType = ScopeType::HISTOGRAM_RAW; + } } if (keyFile.has_key("GUI", "HistogramBar")) { histogramBar = keyFile.get_boolean("GUI", "HistogramBar"); } - if (keyFile.has_key ("GUI", "HistogramHeight")) { - histogramHeight = keyFile.get_integer ("GUI", "HistogramHeight"); + if (keyFile.has_key("GUI", "HistogramHeight")) { + histogramHeight = keyFile.get_integer("GUI", "HistogramHeight"); } - if (keyFile.has_key ("GUI", "HistogramDrawMode")) { - histogramDrawMode = keyFile.get_integer ("GUI", "HistogramDrawMode"); + if (keyFile.has_key("GUI", "HistogramDrawMode")) { + histogramDrawMode = keyFile.get_integer("GUI", "HistogramDrawMode"); + } + + if (keyFile.has_key("GUI", "HistogramScopeType")) { + histogramScopeType = static_cast(keyFile.get_integer("GUI", "HistogramScopeType")); + } + + if (keyFile.has_key("GUI", "HistogramShowOptionButtons")) { + histogramShowOptionButtons = keyFile.get_boolean("GUI", "HistogramShowOptionButtons"); + } + + if (keyFile.has_key("GUI", "HistogramTraceBrightness")) { + histogramTraceBrightness = keyFile.get_double("GUI", "HistogramTraceBrightness"); } if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { @@ -1387,10 +1689,15 @@ void Options::readFromFile(Glib::ustring fname) navHSVUnit = (NavigatorUnit)keyFile.get_integer("GUI", "NavigatorHSVUnit"); } + if (keyFile.has_key("GUI", "ShowFilmStripToolBar")) { showFilmStripToolBar = keyFile.get_boolean("GUI", "ShowFilmStripToolBar"); } + if (keyFile.has_key("GUI", "Showtooltip")) {//show tooltip in locallab + showtooltip = keyFile.get_boolean("GUI", "Showtooltip"); + } + if (keyFile.has_key("GUI", "FileBrowserToolbarSingleRow")) { FileBrowserToolbarSingleRow = keyFile.get_boolean("GUI", "FileBrowserToolbarSingleRow"); } @@ -1406,6 +1713,18 @@ void Options::readFromFile(Glib::ustring fname) if (keyFile.has_key("GUI", "CurveBBoxPosition")) { curvebboxpos = keyFile.get_integer("GUI", "CurveBBoxPosition"); } + + if (keyFile.has_key("GUI", "Complexity")) { + complexity = keyFile.get_integer("GUI", "Complexity"); + } + + if (keyFile.has_key("GUI", "InspectorWindow")) { + inspectorWindow = keyFile.get_boolean("GUI", "InspectorWindow"); + } + + if (keyFile.has_key("GUI", "ZoomOnScroll")) { + zoomOnScroll = keyFile.get_boolean("GUI", "ZoomOnScroll"); + } } if (keyFile.has_group("Crop Settings")) { @@ -1447,9 +1766,6 @@ void Options::readFromFile(Glib::ustring fname) 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", "RGBcurvesLumamode_Gamut")) { rtSettings.rgbcurveslumamode_gamut = keyFile.get_boolean("Color Management", "RGBcurvesLumamode_Gamut"); @@ -1463,6 +1779,10 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.monitorBPC = keyFile.get_boolean("Color Management", "MonitorBPC"); } + if (keyFile.has_key("Color Management", "Autocielab")) { + rtSettings.autocielab = keyFile.get_boolean("Color Management", "Autocielab"); + } + if (keyFile.has_key("Color Management", "CRI")) { rtSettings.CRI_color = keyFile.get_integer("Color Management", "CRI"); } @@ -1494,6 +1814,11 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.level123_cbdl = keyFile.get_double("Color Management", "CBDLlevel123"); } + if (keyFile.has_key("Color Management", "Itcwb_enable")) { + rtSettings.itcwb_enable = keyFile.get_boolean("Color Management", "Itcwb_enable"); + } + + //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"); @@ -1526,6 +1851,13 @@ void Options::readFromFile(Glib::ustring fname) } } + if (keyFile.has_key("Color Management", "DCIP3")) { + rtSettings.DCIP3 = keyFile.get_string("Color Management", "DCIP3"); + if (rtSettings.DCIP3 == "RTv4_DCIP3") { + rtSettings.DCIP3 = "RTv2_DCIP3"; + } + } + if (keyFile.has_key("Color Management", "sRGB")) { rtSettings.srgb = keyFile.get_string("Color Management", "sRGB"); if (rtSettings.srgb == "RT_sRGB" || rtSettings.srgb == "RTv2_sRGB") { @@ -1593,57 +1925,101 @@ void Options::readFromFile(Glib::ustring fname) rtSettings.amchroma = keyFile.get_integer("Color Management", "Amountchroma"); } + if (keyFile.has_key("Color Management", "JzAmountchroma")) { + rtSettings.amchromajz = keyFile.get_integer("Color Management", "JzAmountchroma"); + } + 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_key("Color Management", "Previewselection")) {//Intensity of preview selection deltaE + rtSettings.previewselection = keyFile.get_integer("Color Management", "Previewselection"); + } + + + if (keyFile.has_key("Color Management", "Cbdlsensi")) {//sensibility to crash for cbdl + rtSettings.cbdlsensi = keyFile.get_double("Color Management", "Cbdlsensi"); + } + + } + if (keyFile.has_group("Wavelet")) { + if (keyFile.has_key("Wavelet", "Edghi")) { + rtSettings.edghi = keyFile.get_double("Wavelet", "Edghi"); + } + + if (keyFile.has_key("Wavelet", "Edglo")) { + rtSettings.edglo = keyFile.get_double("Wavelet", "Edglo"); + } + + if (keyFile.has_key("Wavelet", "Limrad")) { + rtSettings.limrad = keyFile.get_double("Wavelet", "Limrad"); + } + + } + + 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"); } @@ -1822,6 +2198,14 @@ void Options::readFromFile(Glib::ustring fname) fastexport_resize_height = keyFile.get_integer("Fast Export", "fastexport_resize_height"); } + if (keyFile.has_key("Fast Export", "fastexport_resize_longedge")) { + fastexport_resize_longedge = keyFile.get_integer("Fast Export", "fastexport_resize_longedge"); + } + + if (keyFile.has_key("Fast Export", "fastexport_resize_shortedge")) { + fastexport_resize_shortedge = keyFile.get_integer("Fast Export", "fastexport_resize_shortedge"); + } + if (keyFile.has_key("Fast Export", "fastexport_use_fast_pipeline")) { fastexport_use_fast_pipeline = keyFile.get_integer("Fast Export", "fastexport_use_fast_pipeline"); } @@ -1831,11 +2215,15 @@ void Options::readFromFile(Glib::ustring fname) safeDirGet(keyFile, "Dialogs", "LastIccDir", lastIccDir); safeDirGet(keyFile, "Dialogs", "LastDarkframeDir", lastDarkframeDir); safeDirGet(keyFile, "Dialogs", "LastFlatfieldDir", lastFlatfieldDir); + safeDirGet(keyFile, "Dialogs", "LastCameraProfilesDir", lastCameraProfilesDir); + safeDirGet(keyFile, "Dialogs", "LastLensProfilesDir", lastLensProfilesDir); 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", "LastlocalCurvesDir", lastlocalCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastPFCurvesDir", lastPFCurvesDir); safeDirGet(keyFile, "Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); safeDirGet(keyFile, "Dialogs", "LastBWCurvesDir", lastBWCurvesDir); @@ -1932,11 +2320,45 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_string("General", "Version", RTVERSION); keyFile.set_string("General", "DarkFramesPath", rtSettings.darkFramesPath); keyFile.set_string("General", "FlatFieldsPath", rtSettings.flatFieldsPath); + keyFile.set_string("General", "CameraProfilesPath", rtSettings.cameraProfilesPath); + keyFile.set_string("General", "LensProfilesPath", rtSettings.lensProfilesPath); keyFile.set_boolean("General", "Verbose", rtSettings.verbose); + keyFile.set_integer("General", "Cropsleep", rtSettings.cropsleep); + keyFile.set_double("General", "Reduchigh", rtSettings.reduchigh); + keyFile.set_double("General", "Reduclow", rtSettings.reduclow); + keyFile.set_boolean("General", "Detectshape", rtSettings.detectshape); + keyFile.set_boolean("General", "Fftwsigma", rtSettings.fftwsigma); + + // TODO: Remove. 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_integer("External Editor", "OutputDir", int(editor_out_dir)); + keyFile.set_string("External Editor", "CustomOutputDir", editor_custom_out_dir); + keyFile.set_boolean("External Editor", "Float32", editor_float32); + keyFile.set_boolean("External Editor", "BypassOutputProfile", editor_bypass_output_profile); + + { + std::vector names; + std::vector commands; + std::vector native_commands; + std::vector icons_serialized; + + for (const auto & editor : externalEditors) { + names.push_back(editor.name); + commands.push_back(editor.command); + native_commands.push_back(editor.native_command); + icons_serialized.push_back(editor.icon_serialized); + } + + keyFile.set_string_list("External Editor", "Names", names); + keyFile.set_string_list("External Editor", "Commands", commands); + keyFile.set_boolean_list("External Editor", "NativeCommands", native_commands); + keyFile.set_string_list("External Editor", "IconsSerialized", icons_serialized); + + keyFile.set_integer("External Editor", "EditorIndex", externalEditorIndex); + } keyFile.set_boolean("File Browser", "BrowseOnlyRaw", fbOnlyRaw); keyFile.set_boolean("File Browser", "BrowserShowsDate", fbShowDateTime); @@ -1950,6 +2372,7 @@ void Options::saveToFile(Glib::ustring fname) 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", "MaxPreviewWidth", maxThumbnailWidth); keyFile.set_integer("File Browser", "MaxCacheEntries", maxCacheEntries); Glib::ArrayHandle pext = parseExtensions; keyFile.set_string_list("File Browser", "ParseExtensions", pext); @@ -1985,6 +2408,8 @@ void Options::saveToFile(Glib::ustring fname) keyFile.set_string_list("File Browser", "RecentFolders", temp); } + keyFile.set_integer("File Browser", "SortMethod", sortMethod); + keyFile.set_boolean("File Browser", "SortDescending", sortDescending); keyFile.set_integer("Clipping Indication", "HighlightThreshold", highlightThreshold); keyFile.set_integer("Clipping Indication", "ShadowThreshold", shadowThreshold); keyFile.set_boolean("Clipping Indication", "BlinkClipped", blinkClipped); @@ -2003,6 +2428,7 @@ void Options::saveToFile(Glib::ustring fname) 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); @@ -2010,6 +2436,7 @@ void Options::saveToFile(Glib::ustring fname) 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", "BigTiff", saveFormat.bigTiff); keyFile.set_boolean("Output", "SaveProcParams", saveFormat.saveParams); keyFile.set_string("Output", "FormatBatch", saveFormatBatch.format); @@ -2044,13 +2471,13 @@ void Options::saveToFile(Glib::ustring fname) Glib::ArrayHandle ahfavorites = favorites; keyFile.set_string_list("GUI", "Favorites", ahfavorites); + keyFile.set_boolean("GUI", "FavoritesCloneTools", cloneFavoriteTools); 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); @@ -2092,28 +2519,34 @@ void Options::saveToFile(Glib::ustring fname) 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); - keyFile.set_integer ("GUI", "MultiDisplayMode", multiDisplayMode); - 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_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", "HistogramWorking", rtSettings.HistogramWorking); - keyFile.set_integer ("GUI", "CurveBBoxPosition", curvebboxpos); + keyFile.set_integer_list("GUI", "ToolPanelsExpanded", tpopen); + keyFile.set_boolean("GUI", "ToolPanelsExpandedAutoSave", autoSaveTpOpen); + keyFile.set_integer("GUI", "MultiDisplayMode", multiDisplayMode); + 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", "HistogramBar", histogramBar); + keyFile.set_integer("GUI", "HistogramHeight", histogramHeight); + keyFile.set_integer("GUI", "HistogramDrawMode", histogramDrawMode); + keyFile.set_integer("GUI", "HistogramScopeType", rtengine::toUnderlying(histogramScopeType)); + keyFile.set_boolean("GUI", "HistogramShowOptionButtons", histogramShowOptionButtons); + keyFile.set_double("GUI", "HistogramTraceBrightness", histogramTraceBrightness); + 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", "HistogramWorking", rtSettings.HistogramWorking); + keyFile.set_integer("GUI", "CurveBBoxPosition", curvebboxpos); + keyFile.set_boolean("GUI", "Showtooltip", showtooltip); + keyFile.set_integer("GUI", "Complexity", complexity); + keyFile.set_boolean("GUI", "InspectorWindow", inspectorWindow); + keyFile.set_boolean("GUI", "ZoomOnScroll", zoomOnScroll); //Glib::ArrayHandle crvopen = crvOpen; //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); @@ -2133,6 +2566,8 @@ void Options::saveToFile(Glib::ustring fname) 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); @@ -2140,6 +2575,7 @@ void Options::saveToFile(Glib::ustring fname) 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", "DCIP3", rtSettings.DCIP3); keyFile.set_string("Color Management", "sRGB", rtSettings.srgb); keyFile.set_string("Color Management", "Beta", rtSettings.beta); keyFile.set_string("Color Management", "Best", rtSettings.best); @@ -2152,15 +2588,25 @@ void Options::saveToFile(Glib::ustring fname) 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_integer("Color Management", "JzAmountchroma", rtSettings.amchromajz); 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", "CBDLlevel0", rtSettings.level0_cbdl); keyFile.set_double("Color Management", "CBDLlevel123", rtSettings.level123_cbdl); + keyFile.set_boolean("Color Management", "Itcwb_enable", rtSettings.itcwb_enable); + //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_integer("Color Management", "Previewselection", rtSettings.previewselection); + keyFile.set_double("Color Management", "Cbdlsensi", rtSettings.cbdlsensi); + + keyFile.set_double("Wavelet", "Edghi", rtSettings.edghi); + keyFile.set_double("Wavelet", "Edglo", rtSettings.edglo); + keyFile.set_double("Wavelet", "Limrad", rtSettings.limrad); + keyFile.set_string("ICC Profile Creator", "PimariesPreset", ICCPC_primariesPreset); keyFile.set_double("ICC Profile Creator", "RedPrimaryX", ICCPC_redPrimaryX); @@ -2221,16 +2667,21 @@ void Options::saveToFile(Glib::ustring fname) 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_resize_longedge", fastexport_resize_longedge); + keyFile.set_integer("Fast Export", "fastexport_resize_shortedge", fastexport_resize_shortedge); 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", "LastCameraProfilesDir", lastCameraProfilesDir); + keyFile.set_string("Dialogs", "LastLensProfilesDir", lastLensProfilesDir); 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", "LastlocalCurvesDir", lastlocalCurvesDir); keyFile.set_string("Dialogs", "LastPFCurvesDir", lastPFCurvesDir); keyFile.set_string("Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); keyFile.set_string("Dialogs", "LastBWCurvesDir", lastBWCurvesDir); @@ -2280,6 +2731,7 @@ void Options::load(bool lightweight) throw Error(msg); } } else { + #ifdef WIN32 WCHAR pathW[MAX_PATH] = {0}; @@ -2290,7 +2742,11 @@ void Options::load(bool lightweight) } #else + #ifdef __APPLE__ + rtdir = Glib::build_filename(Glib::ustring(g_get_home_dir()), "/Library/Application Support/", Glib::ustring(CACHEFOLDERNAME), "/config/"); + #else rtdir = Glib::build_filename(Glib::ustring(g_get_user_config_dir()), Glib::ustring(CACHEFOLDERNAME)); + #endif #endif } @@ -2312,7 +2768,7 @@ void Options::load(bool lightweight) rtdir = Glib::build_filename(argv0, "mysettings"); } - // Modify the path of the cache folder to the one provided in RT_CACHE environment variable + // Modify the path of the cache folder to the one provided in RT_CACHE environment variable. path = g_getenv("RT_CACHE"); if (path != nullptr) { @@ -2323,12 +2779,17 @@ void Options::load(bool lightweight) throw Error(msg); } } + // 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"); #else + #ifdef __APPLE__ + cacheBaseDir = Glib::build_filename(Glib::ustring(g_get_home_dir()), "/Library/Application Support/", Glib::ustring(CACHEFOLDERNAME), "/cache/"); + #else cacheBaseDir = Glib::build_filename(Glib::ustring(g_get_user_cache_dir()), Glib::ustring(CACHEFOLDERNAME)); + #endif #endif } @@ -2564,3 +3025,19 @@ Glib::ustring Options::getICCProfileCopyright() now.set_time_current(); return Glib::ustring::compose("Copyright RawTherapee %1, CC0", now.get_year()); } + +ExternalEditor::ExternalEditor() = default; + +ExternalEditor::ExternalEditor( + const Glib::ustring &name, const Glib::ustring &command, bool native_command, const Glib::ustring &icon_serialized +): name(name), command(command), native_command(native_command), icon_serialized(icon_serialized) {} + +bool ExternalEditor::operator==(const ExternalEditor &other) const +{ + return this->name == other.name && this->command == other.command && this->native_command == other.native_command && this->icon_serialized == other.icon_serialized; +} + +bool ExternalEditor::operator!=(const ExternalEditor &other) const +{ + return !(*this == other); +} diff --git a/rtgui/options.h b/rtgui/options.h index c0ed2138b..78059357e 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -20,7 +20,15 @@ #include #include +#if defined __has_include +#if __has_include() #include +#else +#include +#endif +#else +#include +#endif #include "../rtengine/settings.h" #include @@ -44,6 +52,18 @@ // Special name for the Dynamic profile #define DEFPROFILE_DYNAMIC "Dynamic" +struct ExternalEditor { + ExternalEditor(); + ExternalEditor(const Glib::ustring &name, const Glib::ustring &command, bool native_command, const Glib::ustring &icon_serialized); + Glib::ustring name; + Glib::ustring command; + bool native_command; + Glib::ustring icon_serialized; + + bool operator==(const ExternalEditor & other) const; + bool operator!=(const ExternalEditor & other) const; +}; + struct SaveFormat { SaveFormat( const Glib::ustring& _format, @@ -53,6 +73,7 @@ struct SaveFormat { int _tiff_bits, bool _tiff_float, bool _tiff_uncompressed, + bool _big_tiff, bool _save_params ) : format(_format), @@ -62,6 +83,7 @@ struct SaveFormat { tiffBits(_tiff_bits), tiffFloat(_tiff_float), tiffUncompressed(_tiff_uncompressed), + bigTiff(_big_tiff), saveParams(_save_params) { } @@ -79,6 +101,7 @@ struct SaveFormat { _tiff_bits, _tiff_float, true, + false, true ) { @@ -95,6 +118,7 @@ struct SaveFormat { int tiffBits; bool tiffFloat; bool tiffUncompressed; + bool bigTiff; bool saveParams; }; @@ -160,13 +184,23 @@ private: const Glib::ustring& entryName, Glib::ustring& destination); public: - enum class NavigatorUnit { PERCENT, R0_255, R0_1, _COUNT }; + + enum class ScopeType { + NONE = -1, + HISTOGRAM, + HISTOGRAM_RAW, + PARADE, + VECTORSCOPE_HC, + VECTORSCOPE_HS, + WAVEFORM + }; + bool savesParamsAtExit; SaveFormat saveFormat, saveFormatBatch; Glib::ustring savePathTemplate; @@ -201,7 +235,6 @@ public: bool windowMaximized; int windowMonitor; int meowMonitor; - bool meowFullScreen; bool meowMaximized; int meowWidth; int meowHeight; @@ -259,10 +292,23 @@ public: Glib::ustring gimpDir; Glib::ustring psDir; Glib::ustring customEditorProg; + std::vector externalEditors; + int externalEditorIndex; Glib::ustring CPBPath; // Custom Profile Builder's path CPBKeyType CPBKeys; // Custom Profile Builder's key type int editorToSendTo; + enum EditorOutDir { + EDITOR_OUT_DIR_TEMP, + EDITOR_OUT_DIR_CURRENT, + EDITOR_OUT_DIR_CUSTOM + }; + EditorOutDir editor_out_dir; // output directory for "open in external editor" + Glib::ustring editor_custom_out_dir; + bool editor_float32; + bool editor_bypass_output_profile; + int maxThumbnailHeight; + int maxThumbnailWidth; std::size_t maxCacheEntries; int thumbInterp; // 0: nearest, 1: bilinear std::vector parseExtensions; // List containing all extensions type @@ -274,12 +320,15 @@ public: //std::vector crvOpen; std::vector baBehav; rtengine::Settings rtSettings; - + bool showtooltip; std::vector favoriteDirs; std::vector renameTemplates; bool renameUseTemplates; bool internalThumbIfUntouched; bool overwriteOutputFile; + int complexity; + bool inspectorWindow; // open inspector in spearate window + bool zoomOnScroll; // translate scroll events to zoom std::vector thumbnailZoomRatios; bool overlayedFileNames; @@ -299,10 +348,13 @@ public: int histogramPosition; // 0=disabled, 1=left pane, 2=right pane bool histogramRed, histogramGreen, histogramBlue; - bool histogramLuma, histogramChroma, histogramRAW; + bool histogramLuma, histogramChroma; bool histogramBar; int histogramHeight; int histogramDrawMode; + ScopeType histogramScopeType; + bool histogramShowOptionButtons; + float histogramTraceBrightness; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; int whiteBalanceSpotSize; @@ -389,18 +441,24 @@ public: int fastexport_resize_dataspec; int fastexport_resize_width; int fastexport_resize_height; + int fastexport_resize_longedge; + int fastexport_resize_shortedge; bool fastexport_use_fast_pipeline; std::vector favorites; + bool cloneFavoriteTools; // Dialog settings Glib::ustring lastIccDir; Glib::ustring lastDarkframeDir; Glib::ustring lastFlatfieldDir; + Glib::ustring lastCameraProfilesDir; + Glib::ustring lastLensProfilesDir; Glib::ustring lastRgbCurvesDir; Glib::ustring lastLabCurvesDir; Glib::ustring lastRetinexDir; Glib::ustring lastDenoiseCurvesDir; Glib::ustring lastWaveletCurvesDir; + Glib::ustring lastlocalCurvesDir; Glib::ustring lastPFCurvesDir; Glib::ustring lastHsvCurvesDir; Glib::ustring lastToneCurvesDir; @@ -415,6 +473,17 @@ public: size_t maxRecentFolders; // max. number of recent folders stored in options file std::vector recentFolders; // List containing all recent folders + enum SortMethod { + SORT_BY_NAME, + SORT_BY_DATE, + SORT_BY_EXIF, + SORT_BY_RANK, + SORT_BY_LABEL, + SORT_METHOD_COUNT, + }; + SortMethod sortMethod; // remembers current state of file browser + bool sortDescending; + Options (); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 82132008a..adf462d84 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -47,6 +47,8 @@ void ParamsEdited::set(bool v) toneCurve.saturation = v; toneCurve.shcompr = v; toneCurve.hlcompr = v; + toneCurve.hlbl = v; + toneCurve.hlth = v; toneCurve.hlcomprthresh = v; toneCurve.autoexp = v; toneCurve.clip = v; @@ -60,6 +62,7 @@ void ParamsEdited::set(bool v) retinex.mapcurve = v; retinex.cdHcurve = v; retinex.lhcurve = v; + retinex.complexmethod = v; retinex.retinexMethod = v; retinex.mapMethod = v; retinex.viewMethod = v; @@ -102,7 +105,7 @@ void ParamsEdited::set(bool v) labCurve.brightness = v; labCurve.contrast = v; labCurve.chromaticity = v; - labCurve.avoidcolorshift = v; + labCurve.gamutmunselmethod = v; labCurve.rstprotection = v; labCurve.lcredsk = v; localContrast.enabled = v; @@ -219,6 +222,7 @@ void ParamsEdited::set(bool v) colorappearance.adaplum = v; colorappearance.badpixsl = v; colorappearance.wbmodel = v; + colorappearance.illum = v; colorappearance.algo = v; colorappearance.jlight = v; @@ -242,7 +246,11 @@ void ParamsEdited::set(bool v) colorappearance.curveMode = v; colorappearance.curveMode2 = v; colorappearance.curveMode3 = v; + colorappearance.complexmethod = v; + colorappearance.modelmethod = v; + colorappearance.catmethod = v; colorappearance.tempout = v; + colorappearance.autotempout = v; colorappearance.greenout = v; colorappearance.ybout = v; colorappearance.tempsc = v; @@ -258,6 +266,17 @@ void ParamsEdited::set(bool v) wb.temperature = v; wb.equal = v; wb.tempBias = v; + wb.observer = v; + wb.itcwb_thres = v; + wb.itcwb_precis = v; + wb.itcwb_size = v; + wb.itcwb_delta = v; + wb.itcwb_fgreen = v; + wb.itcwb_rgreen = v; + wb.itcwb_nopurple = v; + wb.itcwb_sorted = v; + wb.itcwb_forceextra = v; + wb.itcwb_sampling = v; //colorShift.a = v; //colorShift.b = v; //lumaDenoise.enabled = v; @@ -309,6 +328,11 @@ void ParamsEdited::set(bool v) sh.stonalwidth = v; sh.radius = v; sh.lab = v; + toneEqualizer.enabled = v; + toneEqualizer.bands.fill(v); + toneEqualizer.regularization = v; + toneEqualizer.show_colormap = v; + toneEqualizer.pivot = v; crop.enabled = v; crop.x = v; crop.y = v; @@ -321,6 +345,7 @@ void ParamsEdited::set(bool v) coarse.rotate = v; coarse.hflip = v; coarse.vflip = v; + commonTrans.method = v; commonTrans.autofill = v; rotate.degree = v; distortion.amount = v; @@ -334,14 +359,36 @@ void ParamsEdited::set(bool v) lensProf.lfCameraMake = v; lensProf.lfCameraModel = v; lensProf.lfLens = v; + perspective.method = v; perspective.horizontal = v; perspective.vertical = v; + perspective.camera_crop_factor = v; + perspective.camera_focal_length = v; + perspective.camera_pitch = v; + perspective.camera_roll = v; + perspective.camera_shift_horiz = v; + perspective.camera_shift_vert = v; + perspective.camera_yaw = v; + perspective.projection_pitch = v; + perspective.projection_rotate = v; + perspective.projection_shift_horiz = v; + perspective.projection_shift_vert = v; + perspective.projection_yaw = v; + perspective.control_lines = v; gradient.enabled = v; gradient.degree = v; gradient.feather = v; gradient.strength = v; gradient.centerX = v; gradient.centerY = v; + + locallab.enabled = v; + locallab.selspot = v; + + for (size_t i = 0; i < locallab.spots.size(); i++) { + locallab.spots.at(i).set(v); + } + pcvignette.enabled = v; pcvignette.strength = v; pcvignette.feather = v; @@ -394,7 +441,13 @@ void ParamsEdited::set(bool v) resize.dataspec = v; resize.width = v; resize.height = v; + resize.longedge = v; + resize.shortedge = v; resize.enabled = v; + + spot.enabled = v; + spot.entries = v; + resize.allowUpscaling = v; icm.inputProfile = v; icm.toneCurve = v; @@ -408,7 +461,27 @@ void ParamsEdited::set(bool v) icm.outputBPC = v; icm.workingTRCGamma = v; icm.workingTRCSlope = v; + icm.redx = v; + icm.redy = v; + icm.grex = v; + icm.grey = v; + icm.blux = v; + icm.bluy = v; + icm.preser = v; + icm.fbw = v; + icm.gamut = v; + icm.labgridcieALow = v; + icm.labgridcieBLow = v; + icm.labgridcieAHigh = v; + icm.labgridcieBHigh = v; + icm.labgridcieGx = v; + icm.labgridcieGy = v; + icm.labgridcieWx = v; + icm.labgridcieWy = v; + icm.aRendIntent = v; icm.workingTRC = v; + icm.will = v; + icm.wprim = v; raw.bayersensor.method = v; raw.bayersensor.border = v; raw.bayersensor.imageNum = v; @@ -431,6 +504,7 @@ void ParamsEdited::set(bool v) raw.bayersensor.pixelShiftShowMotionMaskOnly = v; raw.bayersensor.pixelShiftHoleFill = v; raw.bayersensor.pixelShiftMedian = v; + raw.bayersensor.pixelShiftAverage = v; raw.bayersensor.pixelShiftGreen = v; raw.bayersensor.pixelShiftBlur = v; raw.bayersensor.pixelShiftSmooth = v; @@ -462,6 +536,7 @@ void ParamsEdited::set(bool v) raw.df_autoselect = v; raw.ff_file = v; raw.ff_AutoSelect = v; + raw.ff_FromMetaData = v; raw.ff_BlurRadius = v; raw.ff_BlurType = v; raw.ff_AutoClipControl = v; @@ -471,6 +546,12 @@ void ParamsEdited::set(bool v) wavelet.strength = v; wavelet.balance = v; wavelet.iter = v; + wavelet.sigmafin = v; + wavelet.sigmaton = v; + wavelet.sigmacol = v; + wavelet.sigmadir = v; + wavelet.rangeab = v; + wavelet.protab = v; wavelet.median = v; wavelet.medianlev = v; wavelet.linkedg = v; @@ -482,13 +563,36 @@ void ParamsEdited::set(bool v) wavelet.bluemed = v; wavelet.bluelow = v; wavelet.lipst = v; + wavelet.ballum = v; + wavelet.sigm = v; + wavelet.levden = v; + wavelet.thrden = v; + wavelet.limden = v; + wavelet.balchrom = v; + wavelet.chromfi = v; + wavelet.chromco = v; + wavelet.mergeL = v; + wavelet.mergeC = v; + wavelet.softrad = v; + wavelet.softradend = v; + wavelet.strend = v; + wavelet.detend = v; + wavelet.thrend = v; wavelet.Medgreinf = v; + wavelet.ushamethod = v; wavelet.avoid = v; + wavelet.showmask = v; + wavelet.oldsh = v; wavelet.tmr = v; wavelet.Lmethod = v; wavelet.CLmethod = v; wavelet.Backmethod = v; wavelet.Tilesmethod = v; + wavelet.complexmethod = v; + //wavelet.denmethod = v; + wavelet.mixmethod = v; + wavelet.slimethod = v; + wavelet.quamethod = v; wavelet.daubcoeffmethod = v; wavelet.CHmethod = v; wavelet.CHSLmethod = v; @@ -498,10 +602,17 @@ void ParamsEdited::set(bool v) wavelet.TMmethod = v; wavelet.HSmethod = v; wavelet.Dirmethod = v; + wavelet.sigma = v; + wavelet.offset = v; + wavelet.lowthr = v; wavelet.rescon = v; wavelet.resconH = v; wavelet.reschro = v; + wavelet.resblur = v; + wavelet.resblurc = v; wavelet.tmrs = v; + wavelet.edgs = v; + wavelet.scale = v; wavelet.gamma = v; wavelet.sup = v; wavelet.sky = v; @@ -517,26 +628,38 @@ void ParamsEdited::set(bool v) wavelet.chro = v; wavelet.contrast = v; wavelet.edgrad = v; + wavelet.edgeffect = v; wavelet.edgval = v; wavelet.edgthresh = v; wavelet.thr = v; wavelet.thrH = v; + wavelet.radius = v; wavelet.skinprotect = v; wavelet.hueskin = v; wavelet.hueskin2 = v; wavelet.hllev = v; wavelet.bllev = v; wavelet.edgcont = v; + wavelet.chrwav = v; + wavelet.bluwav = v; wavelet.level0noise = v; wavelet.level1noise = v; wavelet.level2noise = v; wavelet.level3noise = v; + wavelet.leveldenoise = v; + wavelet.levelsigm = v; wavelet.ccwcurve = v; + wavelet.blcurve = v; + //wavelet.opacityCurveSH = v; wavelet.opacityCurveRG = v; wavelet.opacityCurveBY = v; + wavelet.wavdenoise = v; + wavelet.wavdenoiseh = v; wavelet.opacityCurveW = v; wavelet.opacityCurveWL = v; wavelet.hhcurve = v; + wavelet.wavguidcurve = v; + wavelet.wavhuecurve = v; wavelet.Chcurve = v; wavelet.wavclCurve = v; @@ -547,12 +670,18 @@ void ParamsEdited::set(bool v) // wavelet.enaedge = v; // wavelet.enares = v; wavelet.expfinal = v; + wavelet.expclari = v; wavelet.expcontrast = v; wavelet.expchroma = v; wavelet.expedge = v; + wavelet.expbl = v; wavelet.expresid = v; wavelet.exptoning = v; wavelet.expnoise = v; + wavelet.labgridALow = v; + wavelet.labgridBLow = v; + wavelet.labgridAHigh = v; + wavelet.labgridBHigh = v; for (int i = 0; i < 9; i++) { wavelet.c[i] = v; @@ -588,12 +717,16 @@ void ParamsEdited::set(bool v) dehaze.strength = v; dehaze.showDepthMap = v; dehaze.depth = v; - dehaze.luminance = v; + dehaze.saturation = v; metadata.mode = v; filmNegative.enabled = v; filmNegative.redRatio = v; filmNegative.greenExp = v; filmNegative.blueRatio = v; + filmNegative.refInput = v; + filmNegative.refOutput = v; + filmNegative.colorSpace = v; + raw.preprocessWB.mode = v; exif = v; iptc = v; @@ -613,6 +746,13 @@ void ParamsEdited::initFrom(const std::vector& const ProcParams& p = src[0]; + // Resize LocallabSpotEdited according to src[0] + locallab.spots.clear(); + locallab.spots.resize(p.locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); + + // Variable used to determined if Locallab spots number is equal and so spots can be combined + bool isSpotNumberEqual = true; + for (size_t i = 1; i < src.size(); i++) { const ProcParams& other = src[i]; toneCurve.curve = toneCurve.curve && p.toneCurve.curve == other.toneCurve.curve; @@ -625,6 +765,8 @@ void ParamsEdited::initFrom(const std::vector& toneCurve.saturation = toneCurve.saturation && p.toneCurve.saturation == other.toneCurve.saturation; toneCurve.shcompr = toneCurve.shcompr && p.toneCurve.shcompr == other.toneCurve.shcompr; toneCurve.hlcompr = toneCurve.hlcompr && p.toneCurve.hlcompr == other.toneCurve.hlcompr; + toneCurve.hlbl = toneCurve.hlbl && p.toneCurve.hlbl == other.toneCurve.hlbl; + toneCurve.hlth = toneCurve.hlth && p.toneCurve.hlth == other.toneCurve.hlth; toneCurve.hlcomprthresh = toneCurve.hlcomprthresh && p.toneCurve.hlcomprthresh == other.toneCurve.hlcomprthresh; toneCurve.autoexp = toneCurve.autoexp && p.toneCurve.autoexp == other.toneCurve.autoexp; toneCurve.clip = toneCurve.clip && p.toneCurve.clip == other.toneCurve.clip; @@ -640,6 +782,7 @@ void ParamsEdited::initFrom(const std::vector& retinex.lhcurve = retinex.lhcurve && p.retinex.lhcurve == other.retinex.lhcurve; retinex.transmissionCurve = retinex.transmissionCurve && p.retinex.transmissionCurve == other.retinex.transmissionCurve; retinex.gaintransmissionCurve = retinex.gaintransmissionCurve && p.retinex.gaintransmissionCurve == other.retinex.gaintransmissionCurve; + retinex.complexmethod = retinex.complexmethod && p.retinex.complexmethod == other.retinex.complexmethod; retinex.retinexMethod = retinex.retinexMethod && p.retinex.retinexMethod == other.retinex.retinexMethod; retinex.mapMethod = retinex.mapMethod && p.retinex.mapMethod == other.retinex.mapMethod; retinex.viewMethod = retinex.viewMethod && p.retinex.viewMethod == other.retinex.viewMethod; @@ -679,7 +822,7 @@ void ParamsEdited::initFrom(const std::vector& labCurve.brightness = labCurve.brightness && p.labCurve.brightness == other.labCurve.brightness; labCurve.contrast = labCurve.contrast && p.labCurve.contrast == other.labCurve.contrast; labCurve.chromaticity = labCurve.chromaticity && p.labCurve.chromaticity == other.labCurve.chromaticity; - labCurve.avoidcolorshift = labCurve.avoidcolorshift && p.labCurve.avoidcolorshift == other.labCurve.avoidcolorshift; + labCurve.gamutmunselmethod = labCurve.gamutmunselmethod && p.labCurve.gamutmunselmethod == other.labCurve.gamutmunselmethod; labCurve.rstprotection = labCurve.rstprotection && p.labCurve.rstprotection == other.labCurve.rstprotection; labCurve.lcredsk = labCurve.lcredsk && p.labCurve.lcredsk == other.labCurve.lcredsk; @@ -783,7 +926,6 @@ void ParamsEdited::initFrom(const std::vector& vibrance.avoidcolorshift = vibrance.avoidcolorshift && p.vibrance.avoidcolorshift == other.vibrance.avoidcolorshift; vibrance.pastsattog = vibrance.pastsattog && p.vibrance.pastsattog == other.vibrance.pastsattog; vibrance.skintonescurve = vibrance.skintonescurve && p.vibrance.skintonescurve == other.vibrance.skintonescurve; - colorappearance.enabled = colorappearance.enabled && p.colorappearance.enabled == other.colorappearance.enabled; colorappearance.degree = colorappearance.degree && p.colorappearance.degree == other.colorappearance.degree; colorappearance.autodegree = colorappearance.autodegree && p.colorappearance.autodegree == other.colorappearance.autodegree; @@ -798,6 +940,7 @@ void ParamsEdited::initFrom(const std::vector& colorappearance.adaplum = colorappearance.adaplum && p.colorappearance.adaplum == other.colorappearance.adaplum; colorappearance.badpixsl = colorappearance.badpixsl && p.colorappearance.badpixsl == other.colorappearance.badpixsl; colorappearance.wbmodel = colorappearance.wbmodel && p.colorappearance.wbmodel == other.colorappearance.wbmodel; + colorappearance.illum = colorappearance.illum && p.colorappearance.illum == other.colorappearance.illum; colorappearance.algo = colorappearance.algo && p.colorappearance.algo == other.colorappearance.algo; colorappearance.jlight = colorappearance.jlight && p.colorappearance.jlight == other.colorappearance.jlight; colorappearance.qbright = colorappearance.qbright && p.colorappearance.qbright == other.colorappearance.qbright; @@ -820,7 +963,11 @@ void ParamsEdited::initFrom(const std::vector& colorappearance.curveMode = colorappearance.curveMode && p.colorappearance.curveMode == other.colorappearance.curveMode; colorappearance.curveMode2 = colorappearance.curveMode2 && p.colorappearance.curveMode2 == other.colorappearance.curveMode2; colorappearance.curveMode3 = colorappearance.curveMode3 && p.colorappearance.curveMode3 == other.colorappearance.curveMode3; + colorappearance.complexmethod = colorappearance.complexmethod && p.colorappearance.complexmethod == other.colorappearance.complexmethod; + colorappearance.modelmethod = colorappearance.modelmethod && p.colorappearance.modelmethod == other.colorappearance.modelmethod; + colorappearance.catmethod = colorappearance.catmethod && p.colorappearance.catmethod == other.colorappearance.catmethod; colorappearance.tempout = colorappearance.tempout && p.colorappearance.tempout == other.colorappearance.tempout; + colorappearance.autotempout = colorappearance.autotempout && p.colorappearance.autotempout == other.colorappearance.autotempout; colorappearance.greenout = colorappearance.greenout && p.colorappearance.greenout == other.colorappearance.greenout; colorappearance.ybout = colorappearance.ybout && p.colorappearance.ybout == other.colorappearance.ybout; colorappearance.tempsc = colorappearance.tempsc && p.colorappearance.tempsc == other.colorappearance.tempsc; @@ -836,6 +983,17 @@ void ParamsEdited::initFrom(const std::vector& wb.equal = wb.equal && p.wb.equal == other.wb.equal; wb.temperature = wb.temperature && p.wb.temperature == other.wb.temperature; wb.tempBias = wb.tempBias && p.wb.tempBias == other.wb.tempBias; + wb.observer = wb.observer && p.wb.observer == other.wb.observer; + wb.itcwb_thres = wb.itcwb_thres && p.wb.itcwb_thres == other.wb.itcwb_thres; + wb.itcwb_precis = wb.itcwb_precis && p.wb.itcwb_precis == other.wb.itcwb_precis; + wb.itcwb_size = wb.itcwb_size && p.wb.itcwb_size == other.wb.itcwb_size; + wb.itcwb_delta = wb.itcwb_delta && p.wb.itcwb_delta == other.wb.itcwb_delta; + wb.itcwb_fgreen = wb.itcwb_fgreen && p.wb.itcwb_fgreen == other.wb.itcwb_fgreen; + wb.itcwb_rgreen = wb.itcwb_rgreen && p.wb.itcwb_rgreen == other.wb.itcwb_rgreen; + wb.itcwb_nopurple = wb.itcwb_nopurple && p.wb.itcwb_nopurple == other.wb.itcwb_nopurple; + wb.itcwb_sorted = wb.itcwb_sorted && p.wb.itcwb_sorted == other.wb.itcwb_sorted; + wb.itcwb_forceextra = wb.itcwb_forceextra && p.wb.itcwb_forceextra == other.wb.itcwb_forceextra; + wb.itcwb_sampling = wb.itcwb_sampling && p.wb.itcwb_sampling == other.wb.itcwb_sampling; //colorShift.a = colorShift.a && p.colorShift.a == other.colorShift.a; //colorShift.b = colorShift.b && p.colorShift.b == other.colorShift.b; //lumaDenoise.enabled = lumaDenoise.enabled && p.lumaDenoise.enabled == other.lumaDenoise.enabled; @@ -901,9 +1059,17 @@ void ParamsEdited::initFrom(const std::vector& crop.ratio = crop.ratio && p.crop.ratio == other.crop.ratio; crop.orientation = crop.orientation && p.crop.orientation == other.crop.orientation; crop.guide = crop.guide && p.crop.guide == other.crop.guide; + toneEqualizer.enabled = toneEqualizer.enabled && p.toneEqualizer.enabled == other.toneEqualizer.enabled; + for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) { + toneEqualizer.bands[i] = toneEqualizer.bands[i] && p.toneEqualizer.bands[i] == other.toneEqualizer.bands[i]; + } + toneEqualizer.regularization = toneEqualizer.regularization && p.toneEqualizer.regularization == other.toneEqualizer.regularization; + toneEqualizer.show_colormap = toneEqualizer.show_colormap && p.toneEqualizer.show_colormap == other.toneEqualizer.show_colormap; + toneEqualizer.pivot = toneEqualizer.pivot && p.toneEqualizer.pivot == other.toneEqualizer.pivot; coarse.rotate = coarse.rotate && p.coarse.rotate == other.coarse.rotate; coarse.hflip = coarse.hflip && p.coarse.hflip == other.coarse.hflip; coarse.vflip = coarse.vflip && p.coarse.vflip == other.coarse.vflip; + commonTrans.method = commonTrans.method && p.commonTrans.method == other.commonTrans.method; commonTrans.autofill = commonTrans.autofill && p.commonTrans.autofill == other.commonTrans.autofill; rotate.degree = rotate.degree && p.rotate.degree == other.rotate.degree; distortion.amount = distortion.amount && p.distortion.amount == other.distortion.amount; @@ -917,14 +1083,746 @@ void ParamsEdited::initFrom(const std::vector& lensProf.lfCameraMake = lensProf.lfCameraMake && p.lensProf.lfCameraMake == other.lensProf.lfCameraMake; lensProf.lfCameraModel = lensProf.lfCameraModel && p.lensProf.lfCameraModel == other.lensProf.lfCameraModel; lensProf.lfLens = lensProf.lfLens && p.lensProf.lfLens == other.lensProf.lfLens; + perspective.method = perspective.method && p.perspective.method == other.perspective.method; perspective.horizontal = perspective.horizontal && p.perspective.horizontal == other.perspective.horizontal; perspective.vertical = perspective.vertical && p.perspective.vertical == other.perspective.vertical; + perspective.camera_crop_factor = perspective.camera_crop_factor && p.perspective.camera_crop_factor == other.perspective.camera_crop_factor; + perspective.camera_focal_length = perspective.camera_focal_length && p.perspective.camera_focal_length == other.perspective.camera_focal_length; + perspective.camera_pitch = perspective.camera_pitch && p.perspective.camera_pitch == other.perspective.camera_pitch; + perspective.camera_roll = perspective.camera_roll && p.perspective.camera_roll == other.perspective.camera_roll; + perspective.camera_shift_horiz = perspective.camera_shift_horiz && p.perspective.camera_shift_horiz == other.perspective.camera_shift_horiz; + perspective.camera_shift_vert = perspective.camera_shift_vert && p.perspective.camera_shift_vert == other.perspective.camera_shift_vert; + perspective.projection_pitch = perspective.projection_pitch && p.perspective.projection_pitch == other.perspective.projection_pitch; + perspective.camera_yaw = perspective.camera_yaw && p.perspective.camera_yaw == other.perspective.camera_yaw; + perspective.projection_rotate = perspective.projection_rotate && p.perspective.projection_rotate == other.perspective.projection_rotate; + perspective.projection_shift_horiz = perspective.projection_shift_horiz && p.perspective.projection_shift_horiz == other.perspective.projection_shift_horiz; + perspective.projection_shift_vert = perspective.projection_shift_vert && p.perspective.projection_shift_vert == other.perspective.projection_shift_vert; + perspective.projection_yaw = perspective.projection_yaw && p.perspective.projection_yaw == other.perspective.projection_yaw; + perspective.control_lines = perspective.control_lines && p.perspective.control_line_values == other.perspective.control_line_values && p.perspective.control_line_types == other.perspective.control_line_types; gradient.enabled = gradient.enabled && p.gradient.enabled == other.gradient.enabled; gradient.degree = gradient.degree && p.gradient.degree == other.gradient.degree; gradient.feather = gradient.feather && p.gradient.feather == other.gradient.feather; gradient.strength = gradient.strength && p.gradient.strength == other.gradient.strength; gradient.centerX = gradient.centerX && p.gradient.centerX == other.gradient.centerX; gradient.centerY = gradient.centerY && p.gradient.centerY == other.gradient.centerY; + + locallab.enabled = locallab.enabled && p.locallab.enabled == other.locallab.enabled; + isSpotNumberEqual = isSpotNumberEqual && p.locallab.spots.size() == other.locallab.spots.size(); + locallab.selspot = locallab.selspot && p.locallab.selspot == other.locallab.selspot; + + if (isSpotNumberEqual) { + for (size_t j = 0; j < locallab.spots.size() && j < p.locallab.spots.size() && j < other.locallab.spots.size(); j++) { + const LocallabParams::LocallabSpot& pSpot = p.locallab.spots.at(j); + const LocallabParams::LocallabSpot& otherSpot = other.locallab.spots.at(j); + // Control spot settings + locallab.spots.at(j).name = locallab.spots.at(j).name && pSpot.name == otherSpot.name; + locallab.spots.at(j).isvisible = locallab.spots.at(j).isvisible && pSpot.isvisible == otherSpot.isvisible; + locallab.spots.at(j).prevMethod = locallab.spots.at(j).prevMethod && pSpot.prevMethod == otherSpot.prevMethod; + locallab.spots.at(j).shape = locallab.spots.at(j).shape && pSpot.shape == otherSpot.shape; + locallab.spots.at(j).spotMethod = locallab.spots.at(j).spotMethod && pSpot.spotMethod == otherSpot.spotMethod; + locallab.spots.at(j).wavMethod = locallab.spots.at(j).wavMethod && pSpot.wavMethod == otherSpot.wavMethod; + locallab.spots.at(j).sensiexclu = locallab.spots.at(j).sensiexclu && pSpot.sensiexclu == otherSpot.sensiexclu; + locallab.spots.at(j).structexclu = locallab.spots.at(j).structexclu && pSpot.structexclu == otherSpot.structexclu; + locallab.spots.at(j).struc = locallab.spots.at(j).struc && pSpot.struc == otherSpot.struc; + locallab.spots.at(j).shapeMethod = locallab.spots.at(j).shapeMethod && pSpot.shapeMethod == otherSpot.shapeMethod; + locallab.spots.at(j).avoidgamutMethod = locallab.spots.at(j).avoidgamutMethod && pSpot.avoidgamutMethod == otherSpot.avoidgamutMethod; + locallab.spots.at(j).loc = locallab.spots.at(j).loc && pSpot.loc == otherSpot.loc; + locallab.spots.at(j).centerX = locallab.spots.at(j).centerX && pSpot.centerX == otherSpot.centerX; + locallab.spots.at(j).centerY = locallab.spots.at(j).centerY && pSpot.centerY == otherSpot.centerY; + locallab.spots.at(j).circrad = locallab.spots.at(j).circrad && pSpot.circrad == otherSpot.circrad; + locallab.spots.at(j).qualityMethod = locallab.spots.at(j).qualityMethod && pSpot.qualityMethod == otherSpot.qualityMethod; + locallab.spots.at(j).complexMethod = locallab.spots.at(j).complexMethod && pSpot.complexMethod == otherSpot.complexMethod; + locallab.spots.at(j).transit = locallab.spots.at(j).transit && pSpot.transit == otherSpot.transit; + locallab.spots.at(j).feather = locallab.spots.at(j).feather && pSpot.feather == otherSpot.feather; + locallab.spots.at(j).thresh = locallab.spots.at(j).thresh && pSpot.thresh == otherSpot.thresh; + locallab.spots.at(j).iter = locallab.spots.at(j).iter && pSpot.iter == otherSpot.iter; + locallab.spots.at(j).balan = locallab.spots.at(j).balan && pSpot.balan == otherSpot.balan; + locallab.spots.at(j).balanh = locallab.spots.at(j).balanh && pSpot.balanh == otherSpot.balanh; + locallab.spots.at(j).colorde = locallab.spots.at(j).colorde && pSpot.colorde == otherSpot.colorde; + locallab.spots.at(j).colorscope = locallab.spots.at(j).colorscope && pSpot.colorscope == otherSpot.colorscope; + locallab.spots.at(j).avoidrad = locallab.spots.at(j).avoidrad && pSpot.avoidrad == otherSpot.avoidrad; + locallab.spots.at(j).transitweak = locallab.spots.at(j).transitweak && pSpot.transitweak == otherSpot.transitweak; + locallab.spots.at(j).transitgrad = locallab.spots.at(j).transitgrad && pSpot.transitgrad == otherSpot.transitgrad; + locallab.spots.at(j).hishow = locallab.spots.at(j).hishow && pSpot.hishow == otherSpot.hishow; + locallab.spots.at(j).activ = locallab.spots.at(j).activ && pSpot.activ == otherSpot.activ; + locallab.spots.at(j).blwh = locallab.spots.at(j).blwh && pSpot.blwh == otherSpot.blwh; + locallab.spots.at(j).recurs = locallab.spots.at(j).recurs && pSpot.recurs == otherSpot.recurs; + locallab.spots.at(j).laplac = locallab.spots.at(j).laplac && pSpot.laplac == otherSpot.laplac; + locallab.spots.at(j).deltae = locallab.spots.at(j).deltae && pSpot.deltae == otherSpot.deltae; + locallab.spots.at(j).shortc = locallab.spots.at(j).shortc && pSpot.shortc == otherSpot.shortc; + locallab.spots.at(j).savrest = locallab.spots.at(j).savrest && pSpot.savrest == otherSpot.savrest; + locallab.spots.at(j).scopemask = locallab.spots.at(j).scopemask && pSpot.scopemask == otherSpot.scopemask; + locallab.spots.at(j).denoichmask = locallab.spots.at(j).denoichmask && pSpot.denoichmask == otherSpot.denoichmask; + locallab.spots.at(j).lumask = locallab.spots.at(j).lumask && pSpot.lumask == otherSpot.lumask; + // Color & Light + locallab.spots.at(j).visicolor = locallab.spots.at(j).visicolor && pSpot.visicolor == otherSpot.visicolor; + locallab.spots.at(j).expcolor = locallab.spots.at(j).expcolor && pSpot.expcolor == otherSpot.expcolor; + locallab.spots.at(j).complexcolor = locallab.spots.at(j).complexcolor && pSpot.complexcolor == otherSpot.complexcolor; + locallab.spots.at(j).curvactiv = locallab.spots.at(j).curvactiv && pSpot.curvactiv == otherSpot.curvactiv; + locallab.spots.at(j).reparcol = locallab.spots.at(j).reparcol && pSpot.reparcol == otherSpot.reparcol; + locallab.spots.at(j).gamc = locallab.spots.at(j).gamc && pSpot.gamc == otherSpot.gamc; + locallab.spots.at(j).lightness = locallab.spots.at(j).lightness && pSpot.lightness == otherSpot.lightness; + locallab.spots.at(j).contrast = locallab.spots.at(j).contrast && pSpot.contrast == otherSpot.contrast; + locallab.spots.at(j).chroma = locallab.spots.at(j).chroma && pSpot.chroma == otherSpot.chroma; + locallab.spots.at(j).labgridALow = locallab.spots.at(j).labgridALow && pSpot.labgridALow == otherSpot.labgridALow; + locallab.spots.at(j).labgridBLow = locallab.spots.at(j).labgridBLow && pSpot.labgridBLow == otherSpot.labgridBLow; + locallab.spots.at(j).labgridAHigh = locallab.spots.at(j).labgridAHigh && pSpot.labgridAHigh == otherSpot.labgridAHigh; + locallab.spots.at(j).labgridBHigh = locallab.spots.at(j).labgridBHigh && pSpot.labgridBHigh == otherSpot.labgridBHigh; + locallab.spots.at(j).labgridALowmerg = locallab.spots.at(j).labgridALowmerg && pSpot.labgridALowmerg == otherSpot.labgridALowmerg; + locallab.spots.at(j).labgridBLowmerg = locallab.spots.at(j).labgridBLowmerg && pSpot.labgridBLowmerg == otherSpot.labgridBLowmerg; + locallab.spots.at(j).labgridAHighmerg = locallab.spots.at(j).labgridAHighmerg && pSpot.labgridAHighmerg == otherSpot.labgridAHighmerg; + locallab.spots.at(j).labgridBHighmerg = locallab.spots.at(j).labgridBHighmerg && pSpot.labgridBHighmerg == otherSpot.labgridBHighmerg; + locallab.spots.at(j).strengthgrid = locallab.spots.at(j).strengthgrid && pSpot.strengthgrid == otherSpot.strengthgrid; + locallab.spots.at(j).sensi = locallab.spots.at(j).sensi && pSpot.sensi == otherSpot.sensi; + locallab.spots.at(j).structcol = locallab.spots.at(j).structcol && pSpot.structcol == otherSpot.structcol; + locallab.spots.at(j).strcol = locallab.spots.at(j).strcol && pSpot.strcol == otherSpot.strcol; + locallab.spots.at(j).strcolab = locallab.spots.at(j).strcolab && pSpot.strcolab == otherSpot.strcolab; + locallab.spots.at(j).strcolh = locallab.spots.at(j).strcolh && pSpot.strcolh == otherSpot.strcolh; + locallab.spots.at(j).angcol = locallab.spots.at(j).angcol && pSpot.angcol == otherSpot.angcol; + locallab.spots.at(j).blurcolde = locallab.spots.at(j).blurcolde && pSpot.blurcolde == otherSpot.blurcolde; + locallab.spots.at(j).blurcol = locallab.spots.at(j).blurcol && pSpot.blurcol == otherSpot.blurcol; + locallab.spots.at(j).contcol = locallab.spots.at(j).contcol && pSpot.contcol == otherSpot.contcol; + locallab.spots.at(j).blendmaskcol = locallab.spots.at(j).blendmaskcol && pSpot.blendmaskcol == otherSpot.blendmaskcol; + locallab.spots.at(j).radmaskcol = locallab.spots.at(j).radmaskcol && pSpot.radmaskcol == otherSpot.radmaskcol; + locallab.spots.at(j).chromaskcol = locallab.spots.at(j).chromaskcol && pSpot.chromaskcol == otherSpot.chromaskcol; + locallab.spots.at(j).gammaskcol = locallab.spots.at(j).gammaskcol && pSpot.gammaskcol == otherSpot.gammaskcol; + locallab.spots.at(j).slomaskcol = locallab.spots.at(j).slomaskcol && pSpot.slomaskcol == otherSpot.slomaskcol; + locallab.spots.at(j).shadmaskcol = locallab.spots.at(j).shadmaskcol && pSpot.shadmaskcol == otherSpot.shadmaskcol; + locallab.spots.at(j).strumaskcol = locallab.spots.at(j).strumaskcol && pSpot.strumaskcol == otherSpot.strumaskcol; + locallab.spots.at(j).lapmaskcol = locallab.spots.at(j).lapmaskcol && pSpot.lapmaskcol == otherSpot.lapmaskcol; + locallab.spots.at(j).qualitycurveMethod = locallab.spots.at(j).qualitycurveMethod && pSpot.qualitycurveMethod == otherSpot.qualitycurveMethod; + locallab.spots.at(j).gridMethod = locallab.spots.at(j).gridMethod && pSpot.gridMethod == otherSpot.gridMethod; + locallab.spots.at(j).merMethod = locallab.spots.at(j).merMethod && pSpot.merMethod == otherSpot.merMethod; + locallab.spots.at(j).toneMethod = locallab.spots.at(j).toneMethod && pSpot.toneMethod == otherSpot.toneMethod; + locallab.spots.at(j).mergecolMethod = locallab.spots.at(j).mergecolMethod && pSpot.mergecolMethod == otherSpot.mergecolMethod; + locallab.spots.at(j).llcurve = locallab.spots.at(j).llcurve && pSpot.llcurve == otherSpot.llcurve; + locallab.spots.at(j).lccurve = locallab.spots.at(j).lccurve && pSpot.lccurve == otherSpot.lccurve; + locallab.spots.at(j).cccurve = locallab.spots.at(j).cccurve && pSpot.cccurve == otherSpot.cccurve; + locallab.spots.at(j).clcurve = locallab.spots.at(j).clcurve && pSpot.cccurve == otherSpot.clcurve; + locallab.spots.at(j).rgbcurve = locallab.spots.at(j).rgbcurve && pSpot.rgbcurve == otherSpot.rgbcurve; + locallab.spots.at(j).LHcurve = locallab.spots.at(j).LHcurve && pSpot.LHcurve == otherSpot.LHcurve; + locallab.spots.at(j).HHcurve = locallab.spots.at(j).HHcurve && pSpot.HHcurve == otherSpot.HHcurve; + locallab.spots.at(j).CHcurve = locallab.spots.at(j).CHcurve && pSpot.CHcurve == otherSpot.CHcurve; + locallab.spots.at(j).invers = locallab.spots.at(j).invers && pSpot.invers == otherSpot.invers; + locallab.spots.at(j).special = locallab.spots.at(j).special && pSpot.special == otherSpot.special; + locallab.spots.at(j).toolcol = locallab.spots.at(j).toolcol && pSpot.toolcol == otherSpot.toolcol; + locallab.spots.at(j).enaColorMask = locallab.spots.at(j).enaColorMask && pSpot.enaColorMask == otherSpot.enaColorMask; + locallab.spots.at(j).fftColorMask = locallab.spots.at(j).fftColorMask && pSpot.fftColorMask == otherSpot.fftColorMask; + locallab.spots.at(j).CCmaskcurve = locallab.spots.at(j).CCmaskcurve && pSpot.CCmaskcurve == otherSpot.CCmaskcurve; + locallab.spots.at(j).LLmaskcurve = locallab.spots.at(j).LLmaskcurve && pSpot.LLmaskcurve == otherSpot.LLmaskcurve; + locallab.spots.at(j).HHmaskcurve = locallab.spots.at(j).HHmaskcurve && pSpot.HHmaskcurve == otherSpot.HHmaskcurve; + locallab.spots.at(j).HHhmaskcurve = locallab.spots.at(j).HHhmaskcurve && pSpot.HHhmaskcurve == otherSpot.HHhmaskcurve; + locallab.spots.at(j).softradiuscol = locallab.spots.at(j).softradiuscol && pSpot.softradiuscol == otherSpot.softradiuscol; + locallab.spots.at(j).opacol = locallab.spots.at(j).opacol && pSpot.opacol == otherSpot.opacol; + locallab.spots.at(j).mercol = locallab.spots.at(j).mercol && pSpot.mercol == otherSpot.mercol; + locallab.spots.at(j).merlucol = locallab.spots.at(j).merlucol && pSpot.merlucol == otherSpot.merlucol; + locallab.spots.at(j).conthrcol = locallab.spots.at(j).conthrcol && pSpot.conthrcol == otherSpot.conthrcol; + locallab.spots.at(j).Lmaskcurve = locallab.spots.at(j).Lmaskcurve && pSpot.Lmaskcurve == otherSpot.Lmaskcurve; + locallab.spots.at(j).LLmaskcolcurvewav = locallab.spots.at(j).LLmaskcolcurvewav && pSpot.LLmaskcolcurvewav == otherSpot.LLmaskcolcurvewav; + locallab.spots.at(j).csthresholdcol = locallab.spots.at(j).csthresholdcol && pSpot.csthresholdcol == otherSpot.csthresholdcol; + locallab.spots.at(j).recothresc = locallab.spots.at(j).recothresc && pSpot.recothresc == otherSpot.recothresc; + locallab.spots.at(j).lowthresc = locallab.spots.at(j).lowthresc && pSpot.lowthresc == otherSpot.lowthresc; + locallab.spots.at(j).higthresc = locallab.spots.at(j).higthresc && pSpot.higthresc == otherSpot.higthresc; + locallab.spots.at(j).decayc = locallab.spots.at(j).decayc && pSpot.decayc == otherSpot.decayc; + // Exposure + locallab.spots.at(j).visiexpose = locallab.spots.at(j).visiexpose && pSpot.visiexpose == otherSpot.visiexpose; + locallab.spots.at(j).expexpose = locallab.spots.at(j).expexpose && pSpot.expexpose == otherSpot.expexpose; + locallab.spots.at(j).complexexpose = locallab.spots.at(j).complexexpose && pSpot.complexexpose == otherSpot.complexexpose; + locallab.spots.at(j).expcomp = locallab.spots.at(j).expcomp && pSpot.expcomp == otherSpot.expcomp; + locallab.spots.at(j).hlcompr = locallab.spots.at(j).hlcompr && pSpot.hlcompr == otherSpot.hlcompr; + locallab.spots.at(j).hlcomprthresh = locallab.spots.at(j).hlcomprthresh && pSpot.hlcomprthresh == otherSpot.hlcomprthresh; + locallab.spots.at(j).black = locallab.spots.at(j).black && pSpot.black == otherSpot.black; + locallab.spots.at(j).shadex = locallab.spots.at(j).shadex && pSpot.shadex == otherSpot.shadex; + locallab.spots.at(j).shcompr = locallab.spots.at(j).shcompr && pSpot.shcompr == otherSpot.shcompr; + locallab.spots.at(j).expchroma = locallab.spots.at(j).expchroma && pSpot.expchroma == otherSpot.expchroma; + locallab.spots.at(j).sensiex = locallab.spots.at(j).sensiex && pSpot.sensiex == otherSpot.sensiex; + locallab.spots.at(j).structexp = locallab.spots.at(j).structexp && pSpot.structexp == otherSpot.structexp; + locallab.spots.at(j).gamex = locallab.spots.at(j).gamex && pSpot.gamex == otherSpot.gamex; + locallab.spots.at(j).blurexpde = locallab.spots.at(j).blurexpde && pSpot.blurexpde == otherSpot.blurexpde; + locallab.spots.at(j).strexp = locallab.spots.at(j).strexp && pSpot.strexp == otherSpot.strexp; + locallab.spots.at(j).angexp = locallab.spots.at(j).angexp && pSpot.angexp == otherSpot.angexp; + locallab.spots.at(j).excurve = locallab.spots.at(j).excurve && pSpot.excurve == otherSpot.excurve; + locallab.spots.at(j).norm = locallab.spots.at(j).norm && pSpot.norm == otherSpot.norm; + locallab.spots.at(j).inversex = locallab.spots.at(j).inversex && pSpot.inversex == otherSpot.inversex; + locallab.spots.at(j).enaExpMask = locallab.spots.at(j).enaExpMask && pSpot.enaExpMask == otherSpot.enaExpMask; + locallab.spots.at(j).enaExpMaskaft = locallab.spots.at(j).enaExpMaskaft && pSpot.enaExpMaskaft == otherSpot.enaExpMaskaft; + locallab.spots.at(j).CCmaskexpcurve = locallab.spots.at(j).CCmaskexpcurve && pSpot.CCmaskexpcurve == otherSpot.CCmaskexpcurve; + locallab.spots.at(j).LLmaskexpcurve = locallab.spots.at(j).LLmaskexpcurve && pSpot.LLmaskexpcurve == otherSpot.LLmaskexpcurve; + locallab.spots.at(j).HHmaskexpcurve = locallab.spots.at(j).HHmaskexpcurve && pSpot.HHmaskexpcurve == otherSpot.HHmaskexpcurve; + locallab.spots.at(j).blendmaskexp = locallab.spots.at(j).blendmaskexp && pSpot.blendmaskexp == otherSpot.blendmaskexp; + locallab.spots.at(j).radmaskexp = locallab.spots.at(j).radmaskexp && pSpot.radmaskexp == otherSpot.radmaskexp; + locallab.spots.at(j).chromaskexp = locallab.spots.at(j).chromaskexp && pSpot.chromaskexp == otherSpot.chromaskexp; + locallab.spots.at(j).gammaskexp = locallab.spots.at(j).gammaskexp && pSpot.gammaskexp == otherSpot.gammaskexp; + locallab.spots.at(j).slomaskexp = locallab.spots.at(j).slomaskexp && pSpot.slomaskexp == otherSpot.slomaskexp; + locallab.spots.at(j).lapmaskexp = locallab.spots.at(j).lapmaskexp && pSpot.lapmaskexp == otherSpot.lapmaskexp; + locallab.spots.at(j).strmaskexp = locallab.spots.at(j).strmaskexp && pSpot.strmaskexp == otherSpot.strmaskexp; + locallab.spots.at(j).angmaskexp = locallab.spots.at(j).angmaskexp && pSpot.angmaskexp == otherSpot.angmaskexp; + locallab.spots.at(j).softradiusexp = locallab.spots.at(j).softradiusexp && pSpot.softradiusexp == otherSpot.softradiusexp; + locallab.spots.at(j).Lmaskexpcurve = locallab.spots.at(j).Lmaskexpcurve && pSpot.Lmaskexpcurve == otherSpot.Lmaskexpcurve; + locallab.spots.at(j).expMethod = locallab.spots.at(j).expMethod && pSpot.expMethod == otherSpot.expMethod; + locallab.spots.at(j).exnoiseMethod = locallab.spots.at(j).exnoiseMethod && pSpot.exnoiseMethod == otherSpot.exnoiseMethod; + locallab.spots.at(j).laplacexp = locallab.spots.at(j).laplacexp && pSpot.laplacexp == otherSpot.laplacexp; + locallab.spots.at(j).reparexp = locallab.spots.at(j).reparexp && pSpot.reparexp == otherSpot.reparexp; + locallab.spots.at(j).balanexp = locallab.spots.at(j).balanexp && pSpot.balanexp == otherSpot.balanexp; + locallab.spots.at(j).linear = locallab.spots.at(j).linear && pSpot.linear == otherSpot.linear; + locallab.spots.at(j).gamm = locallab.spots.at(j).gamm && pSpot.gamm == otherSpot.gamm; + locallab.spots.at(j).fatamount = locallab.spots.at(j).fatamount && pSpot.fatamount == otherSpot.fatamount; + locallab.spots.at(j).fatdetail = locallab.spots.at(j).fatdetail && pSpot.fatdetail == otherSpot.fatdetail; + locallab.spots.at(j).fatanchor = locallab.spots.at(j).fatanchor && pSpot.fatanchor == otherSpot.fatanchor; + locallab.spots.at(j).fatlevel = locallab.spots.at(j).fatlevel && pSpot.fatlevel == otherSpot.fatlevel; + locallab.spots.at(j).recothrese = locallab.spots.at(j).recothrese && pSpot.recothrese == otherSpot.recothrese; + locallab.spots.at(j).lowthrese = locallab.spots.at(j).lowthrese && pSpot.lowthrese == otherSpot.lowthrese; + locallab.spots.at(j).higthrese = locallab.spots.at(j).higthrese && pSpot.higthrese == otherSpot.higthrese; + locallab.spots.at(j).decaye = locallab.spots.at(j).decaye && pSpot.decaye == otherSpot.decaye; + // Shadow highlight + locallab.spots.at(j).visishadhigh = locallab.spots.at(j).visishadhigh && pSpot.visishadhigh == otherSpot.visishadhigh; + locallab.spots.at(j).expshadhigh = locallab.spots.at(j).expshadhigh && pSpot.expshadhigh == otherSpot.expshadhigh; + locallab.spots.at(j).complexshadhigh = locallab.spots.at(j).complexshadhigh && pSpot.complexshadhigh == otherSpot.complexshadhigh; + locallab.spots.at(j).shMethod = locallab.spots.at(j).shMethod && pSpot.shMethod == otherSpot.shMethod; + + for (int k = 0; k < 5; k++) { + locallab.spots.at(j).multsh[k] = locallab.spots.at(j).multsh[k] && pSpot.multsh[k] == otherSpot.multsh[k]; + } + + locallab.spots.at(j).highlights = locallab.spots.at(j).highlights && pSpot.highlights == otherSpot.highlights; + locallab.spots.at(j).h_tonalwidth = locallab.spots.at(j).h_tonalwidth && pSpot.h_tonalwidth == otherSpot.h_tonalwidth; + locallab.spots.at(j).shadows = locallab.spots.at(j).shadows && pSpot.shadows == otherSpot.shadows; + locallab.spots.at(j).s_tonalwidth = locallab.spots.at(j).s_tonalwidth && pSpot.s_tonalwidth == otherSpot.s_tonalwidth; + locallab.spots.at(j).sh_radius = locallab.spots.at(j).sh_radius && pSpot.sh_radius == otherSpot.sh_radius; + locallab.spots.at(j).sensihs = locallab.spots.at(j).sensihs && pSpot.sensihs == otherSpot.sensihs; + locallab.spots.at(j).enaSHMask = locallab.spots.at(j).enaSHMask && pSpot.enaSHMask == otherSpot.enaSHMask; + locallab.spots.at(j).CCmaskSHcurve = locallab.spots.at(j).CCmaskSHcurve && pSpot.CCmaskSHcurve == otherSpot.CCmaskSHcurve; + locallab.spots.at(j).LLmaskSHcurve = locallab.spots.at(j).LLmaskSHcurve && pSpot.LLmaskSHcurve == otherSpot.LLmaskSHcurve; + locallab.spots.at(j).HHmaskSHcurve = locallab.spots.at(j).HHmaskSHcurve && pSpot.HHmaskSHcurve == otherSpot.HHmaskSHcurve; + locallab.spots.at(j).blendmaskSH = locallab.spots.at(j).blendmaskSH && pSpot.blendmaskSH == otherSpot.blendmaskSH; + locallab.spots.at(j).radmaskSH = locallab.spots.at(j).radmaskSH && pSpot.radmaskSH == otherSpot.radmaskSH; + locallab.spots.at(j).blurSHde = locallab.spots.at(j).blurSHde && pSpot.blurSHde == otherSpot.blurSHde; + locallab.spots.at(j).strSH = locallab.spots.at(j).strSH && pSpot.strSH == otherSpot.strSH; + locallab.spots.at(j).angSH = locallab.spots.at(j).angSH && pSpot.angSH == otherSpot.angSH; + locallab.spots.at(j).inverssh = locallab.spots.at(j).inverssh && pSpot.inverssh == otherSpot.inverssh; + locallab.spots.at(j).chromaskSH = locallab.spots.at(j).chromaskSH && pSpot.chromaskSH == otherSpot.chromaskSH; + locallab.spots.at(j).gammaskSH = locallab.spots.at(j).gammaskSH && pSpot.gammaskSH == otherSpot.gammaskSH; + locallab.spots.at(j).slomaskSH = locallab.spots.at(j).slomaskSH && pSpot.slomaskSH == otherSpot.slomaskSH; + locallab.spots.at(j).lapmaskSH = locallab.spots.at(j).lapmaskSH && pSpot.lapmaskSH == otherSpot.lapmaskSH; + locallab.spots.at(j).detailSH = locallab.spots.at(j).detailSH && pSpot.detailSH == otherSpot.detailSH; + locallab.spots.at(j).tePivot = locallab.spots.at(j).tePivot && pSpot.tePivot == otherSpot.tePivot; + locallab.spots.at(j).reparsh = locallab.spots.at(j).reparsh && pSpot.reparsh == otherSpot.reparsh; + locallab.spots.at(j).LmaskSHcurve = locallab.spots.at(j).LmaskSHcurve && pSpot.LmaskSHcurve == otherSpot.LmaskSHcurve; + locallab.spots.at(j).fatamountSH = locallab.spots.at(j).fatamountSH && pSpot.fatamountSH == otherSpot.fatamountSH; + locallab.spots.at(j).fatanchorSH = locallab.spots.at(j).fatanchorSH && pSpot.fatanchorSH == otherSpot.fatanchorSH; + locallab.spots.at(j).gamSH = locallab.spots.at(j).gamSH && pSpot.gamSH == otherSpot.gamSH; + locallab.spots.at(j).sloSH = locallab.spots.at(j).sloSH && pSpot.sloSH == otherSpot.sloSH; + locallab.spots.at(j).recothress = locallab.spots.at(j).recothress && pSpot.recothress == otherSpot.recothress; + locallab.spots.at(j).lowthress = locallab.spots.at(j).lowthress && pSpot.lowthress == otherSpot.lowthress; + locallab.spots.at(j).higthress = locallab.spots.at(j).higthress && pSpot.higthress == otherSpot.higthress; + locallab.spots.at(j).decays = locallab.spots.at(j).decays && pSpot.decays == otherSpot.decays; + // Vibrance + locallab.spots.at(j).visivibrance = locallab.spots.at(j).visivibrance && pSpot.visivibrance == otherSpot.visivibrance; + locallab.spots.at(j).expvibrance = locallab.spots.at(j).expvibrance && pSpot.expvibrance == otherSpot.expvibrance; + locallab.spots.at(j).complexvibrance = locallab.spots.at(j).complexvibrance && pSpot.complexvibrance == otherSpot.complexvibrance; + locallab.spots.at(j).saturated = locallab.spots.at(j).saturated && pSpot.saturated == otherSpot.saturated; + locallab.spots.at(j).pastels = locallab.spots.at(j).pastels && pSpot.pastels == otherSpot.pastels; + locallab.spots.at(j).vibgam = locallab.spots.at(j).vibgam && pSpot.vibgam == otherSpot.vibgam; + locallab.spots.at(j).warm = locallab.spots.at(j).warm && pSpot.warm == otherSpot.warm; + locallab.spots.at(j).psthreshold = locallab.spots.at(j).psthreshold && pSpot.psthreshold == otherSpot.psthreshold; + locallab.spots.at(j).protectskins = locallab.spots.at(j).protectskins && pSpot.protectskins == otherSpot.protectskins; + locallab.spots.at(j).avoidcolorshift = locallab.spots.at(j).avoidcolorshift && pSpot.avoidcolorshift == otherSpot.avoidcolorshift; + locallab.spots.at(j).pastsattog = locallab.spots.at(j).pastsattog && pSpot.pastsattog == otherSpot.pastsattog; + locallab.spots.at(j).sensiv = locallab.spots.at(j).sensiv && pSpot.sensiv == otherSpot.sensiv; + locallab.spots.at(j).skintonescurve = locallab.spots.at(j).skintonescurve && pSpot.skintonescurve == otherSpot.skintonescurve; + locallab.spots.at(j).CCmaskvibcurve = locallab.spots.at(j).CCmaskvibcurve && pSpot.CCmaskvibcurve == otherSpot.CCmaskvibcurve; + locallab.spots.at(j).LLmaskvibcurve = locallab.spots.at(j).LLmaskvibcurve && pSpot.LLmaskvibcurve == otherSpot.LLmaskvibcurve; + locallab.spots.at(j).HHmaskvibcurve = locallab.spots.at(j).HHmaskvibcurve && pSpot.HHmaskvibcurve == otherSpot.HHmaskvibcurve; + locallab.spots.at(j).enavibMask = locallab.spots.at(j).enavibMask && pSpot.enavibMask == otherSpot.enavibMask; + locallab.spots.at(j).blendmaskvib = locallab.spots.at(j).blendmaskvib && pSpot.blendmaskvib == otherSpot.blendmaskvib; + locallab.spots.at(j).radmaskvib = locallab.spots.at(j).radmaskvib && pSpot.radmaskvib == otherSpot.radmaskvib; + locallab.spots.at(j).chromaskvib = locallab.spots.at(j).chromaskvib && pSpot.chromaskvib == otherSpot.chromaskvib; + locallab.spots.at(j).gammaskvib = locallab.spots.at(j).gammaskvib && pSpot.gammaskvib == otherSpot.gammaskvib; + locallab.spots.at(j).slomaskvib = locallab.spots.at(j).slomaskvib && pSpot.slomaskvib == otherSpot.slomaskvib; + locallab.spots.at(j).lapmaskvib = locallab.spots.at(j).lapmaskvib && pSpot.lapmaskvib == otherSpot.lapmaskvib; + locallab.spots.at(j).strvib = locallab.spots.at(j).strvib && pSpot.strvib == otherSpot.strvib; + locallab.spots.at(j).strvibab = locallab.spots.at(j).strvibab && pSpot.strvibab == otherSpot.strvibab; + locallab.spots.at(j).strvibh = locallab.spots.at(j).strvibh && pSpot.strvibh == otherSpot.strvibh; + locallab.spots.at(j).angvib = locallab.spots.at(j).angvib && pSpot.angvib == otherSpot.angvib; + locallab.spots.at(j).Lmaskvibcurve = locallab.spots.at(j).Lmaskvibcurve && pSpot.Lmaskvibcurve == otherSpot.Lmaskvibcurve; + locallab.spots.at(j).recothresv = locallab.spots.at(j).recothresv && pSpot.recothresv == otherSpot.recothresv; + locallab.spots.at(j).lowthresv = locallab.spots.at(j).lowthresv && pSpot.lowthresv == otherSpot.lowthresv; + locallab.spots.at(j).higthresv = locallab.spots.at(j).higthresv && pSpot.higthresv == otherSpot.higthresv; + locallab.spots.at(j).decayv = locallab.spots.at(j).decayv && pSpot.decayv == otherSpot.decayv; + // Soft Light + locallab.spots.at(j).visisoft = locallab.spots.at(j).visisoft && pSpot.visisoft == otherSpot.visisoft; + locallab.spots.at(j).expsoft = locallab.spots.at(j).expsoft && pSpot.expsoft == otherSpot.expsoft; + locallab.spots.at(j).complexsoft = locallab.spots.at(j).complexsoft && pSpot.complexsoft == otherSpot.complexsoft; + locallab.spots.at(j).streng = locallab.spots.at(j).streng && pSpot.streng == otherSpot.streng; + locallab.spots.at(j).sensisf = locallab.spots.at(j).sensisf && pSpot.sensisf == otherSpot.sensisf; + locallab.spots.at(j).laplace = locallab.spots.at(j).laplace && pSpot.laplace == otherSpot.laplace; + locallab.spots.at(j).softMethod = locallab.spots.at(j).softMethod && pSpot.softMethod == otherSpot.softMethod; + // Blur & Noise + locallab.spots.at(j).visiblur = locallab.spots.at(j).visiblur && pSpot.visiblur == otherSpot.visiblur; + locallab.spots.at(j).expblur = locallab.spots.at(j).expblur && pSpot.expblur == otherSpot.expblur; + locallab.spots.at(j).complexblur = locallab.spots.at(j).complexblur && pSpot.complexblur == otherSpot.complexblur; + locallab.spots.at(j).radius = locallab.spots.at(j).radius && pSpot.radius == otherSpot.radius; + locallab.spots.at(j).strength = locallab.spots.at(j).strength && pSpot.strength == otherSpot.strength; + locallab.spots.at(j).sensibn = locallab.spots.at(j).sensibn && pSpot.sensibn == otherSpot.sensibn; + locallab.spots.at(j).itera = locallab.spots.at(j).itera && pSpot.itera == otherSpot.itera; + locallab.spots.at(j).guidbl = locallab.spots.at(j).guidbl && pSpot.guidbl == otherSpot.guidbl; + locallab.spots.at(j).strbl = locallab.spots.at(j).strbl && pSpot.strbl == otherSpot.strbl; + locallab.spots.at(j).recothres = locallab.spots.at(j).recothres && pSpot.recothres == otherSpot.recothres; + locallab.spots.at(j).lowthres = locallab.spots.at(j).lowthres && pSpot.lowthres == otherSpot.lowthres; + locallab.spots.at(j).higthres = locallab.spots.at(j).higthres && pSpot.higthres == otherSpot.higthres; + locallab.spots.at(j).recothresd = locallab.spots.at(j).recothresd && pSpot.recothresd == otherSpot.recothresd; + locallab.spots.at(j).lowthresd = locallab.spots.at(j).lowthresd && pSpot.lowthresd == otherSpot.lowthresd; + locallab.spots.at(j).midthresd = locallab.spots.at(j).midthresd && pSpot.midthresd == otherSpot.midthresd; + locallab.spots.at(j).midthresdch = locallab.spots.at(j).midthresdch && pSpot.midthresdch == otherSpot.midthresdch; + locallab.spots.at(j).higthresd = locallab.spots.at(j).higthresd && pSpot.higthresd == otherSpot.higthresd; + locallab.spots.at(j).decayd = locallab.spots.at(j).decayd && pSpot.decayd == otherSpot.decayd; + locallab.spots.at(j).isogr = locallab.spots.at(j).isogr && pSpot.isogr == otherSpot.isogr; + locallab.spots.at(j).strengr = locallab.spots.at(j).strengr && pSpot.strengr == otherSpot.strengr; + locallab.spots.at(j).scalegr = locallab.spots.at(j).scalegr && pSpot.scalegr == otherSpot.scalegr; + locallab.spots.at(j).divgr = locallab.spots.at(j).divgr && pSpot.divgr == otherSpot.divgr; + locallab.spots.at(j).epsbl = locallab.spots.at(j).epsbl && pSpot.epsbl == otherSpot.epsbl; + locallab.spots.at(j).blMethod = locallab.spots.at(j).blMethod && pSpot.blMethod == otherSpot.blMethod; + locallab.spots.at(j).chroMethod = locallab.spots.at(j).chroMethod && pSpot.chroMethod == otherSpot.chroMethod; + locallab.spots.at(j).quamethod = locallab.spots.at(j).quamethod && pSpot.quamethod == otherSpot.quamethod; + locallab.spots.at(j).blurMethod = locallab.spots.at(j).blurMethod && pSpot.blurMethod == otherSpot.blurMethod; + locallab.spots.at(j).usemask = locallab.spots.at(j).usemask && pSpot.usemask == otherSpot.usemask; + locallab.spots.at(j).invmaskd = locallab.spots.at(j).invmaskd && pSpot.invmaskd == otherSpot.invmaskd; + locallab.spots.at(j).invmask = locallab.spots.at(j).invmask && pSpot.invmask == otherSpot.invmask; + locallab.spots.at(j).levelthr = locallab.spots.at(j).levelthr && pSpot.levelthr == otherSpot.levelthr; + locallab.spots.at(j).lnoiselow = locallab.spots.at(j).lnoiselow && pSpot.lnoiselow == otherSpot.lnoiselow; + locallab.spots.at(j).levelthrlow = locallab.spots.at(j).levelthrlow && pSpot.levelthrlow == otherSpot.levelthrlow; + locallab.spots.at(j).medMethod = locallab.spots.at(j).medMethod && pSpot.medMethod == otherSpot.medMethod; + locallab.spots.at(j).activlum = locallab.spots.at(j).activlum && pSpot.activlum == otherSpot.activlum; + locallab.spots.at(j).noiselumf = locallab.spots.at(j).noiselumf && pSpot.noiselumf == otherSpot.noiselumf; + locallab.spots.at(j).noiselumf0 = locallab.spots.at(j).noiselumf0 && pSpot.noiselumf0 == otherSpot.noiselumf0; + locallab.spots.at(j).noiselumf2 = locallab.spots.at(j).noiselumf2 && pSpot.noiselumf2 == otherSpot.noiselumf2; + locallab.spots.at(j).noiselumc = locallab.spots.at(j).noiselumc && pSpot.noiselumc == otherSpot.noiselumc; + locallab.spots.at(j).noiselumdetail = locallab.spots.at(j).noiselumdetail && pSpot.noiselumdetail == otherSpot.noiselumdetail; + locallab.spots.at(j).noiselequal = locallab.spots.at(j).noiselequal && pSpot.noiselequal == otherSpot.noiselequal; + locallab.spots.at(j).noisegam = locallab.spots.at(j).noisegam && pSpot.noisegam == otherSpot.noisegam; + locallab.spots.at(j).noisechrof = locallab.spots.at(j).noisechrof && pSpot.noisechrof == otherSpot.noisechrof; + locallab.spots.at(j).noisechroc = locallab.spots.at(j).noisechroc && pSpot.noisechroc == otherSpot.noisechroc; + locallab.spots.at(j).noisechrodetail = locallab.spots.at(j).noisechrodetail && pSpot.noisechrodetail == otherSpot.noisechrodetail; + locallab.spots.at(j).adjblur = locallab.spots.at(j).adjblur && pSpot.adjblur == otherSpot.adjblur; + locallab.spots.at(j).bilateral = locallab.spots.at(j).bilateral && pSpot.bilateral == otherSpot.bilateral; + locallab.spots.at(j).nlstr = locallab.spots.at(j).nlstr && pSpot.nlstr == otherSpot.nlstr; + locallab.spots.at(j).nldet = locallab.spots.at(j).nldet && pSpot.nldet == otherSpot.nldet; + locallab.spots.at(j).nlpat = locallab.spots.at(j).nlpat && pSpot.nlpat == otherSpot.nlpat; + locallab.spots.at(j).nlrad = locallab.spots.at(j).nlrad && pSpot.nlrad == otherSpot.nlrad; + locallab.spots.at(j).nlgam = locallab.spots.at(j).nlgam && pSpot.nlgam == otherSpot.nlgam; + locallab.spots.at(j).sensiden = locallab.spots.at(j).sensiden && pSpot.sensiden == otherSpot.sensiden; + locallab.spots.at(j).reparden = locallab.spots.at(j).reparden && pSpot.reparden == otherSpot.reparden; + locallab.spots.at(j).detailthr = locallab.spots.at(j).detailthr && pSpot.detailthr == otherSpot.detailthr; + locallab.spots.at(j).locwavcurveden = locallab.spots.at(j).locwavcurveden && pSpot.locwavcurveden == otherSpot.locwavcurveden; + locallab.spots.at(j).locwavcurvehue = locallab.spots.at(j).locwavcurvehue && pSpot.locwavcurvehue == otherSpot.locwavcurvehue; + locallab.spots.at(j).showmaskblMethodtyp = locallab.spots.at(j).showmaskblMethodtyp && pSpot.showmaskblMethodtyp == otherSpot.showmaskblMethodtyp; + locallab.spots.at(j).CCmaskblcurve = locallab.spots.at(j).CCmaskblcurve && pSpot.CCmaskblcurve == otherSpot.CCmaskblcurve; + locallab.spots.at(j).LLmaskblcurve = locallab.spots.at(j).LLmaskblcurve && pSpot.LLmaskblcurve == otherSpot.LLmaskblcurve; + locallab.spots.at(j).HHmaskblcurve = locallab.spots.at(j).HHmaskblcurve && pSpot.HHmaskblcurve == otherSpot.HHmaskblcurve; + locallab.spots.at(j).enablMask = locallab.spots.at(j).enablMask && pSpot.enablMask == otherSpot.enablMask; + locallab.spots.at(j).fftwbl = locallab.spots.at(j).fftwbl && pSpot.fftwbl == otherSpot.fftwbl; + locallab.spots.at(j).invbl = locallab.spots.at(j).invbl && pSpot.invbl == otherSpot.invbl; + locallab.spots.at(j).toolbl = locallab.spots.at(j).toolbl && pSpot.toolbl == otherSpot.toolbl; + locallab.spots.at(j).blendmaskbl = locallab.spots.at(j).blendmaskbl && pSpot.blendmaskbl == otherSpot.blendmaskbl; + locallab.spots.at(j).radmaskbl = locallab.spots.at(j).radmaskbl && pSpot.radmaskbl == otherSpot.radmaskbl; + locallab.spots.at(j).chromaskbl = locallab.spots.at(j).chromaskbl && pSpot.chromaskbl == otherSpot.chromaskbl; + locallab.spots.at(j).gammaskbl = locallab.spots.at(j).gammaskbl && pSpot.gammaskbl == otherSpot.gammaskbl; + locallab.spots.at(j).slomaskbl = locallab.spots.at(j).slomaskbl && pSpot.slomaskbl == otherSpot.slomaskbl; + locallab.spots.at(j).lapmaskbl = locallab.spots.at(j).lapmaskbl && pSpot.lapmaskbl == otherSpot.lapmaskbl; + locallab.spots.at(j).shadmaskbl = locallab.spots.at(j).shadmaskbl && pSpot.shadmaskbl == otherSpot.shadmaskbl; + locallab.spots.at(j).shadmaskblsha = locallab.spots.at(j).shadmaskblsha && pSpot.shadmaskblsha == otherSpot.shadmaskblsha; + locallab.spots.at(j).strumaskbl = locallab.spots.at(j).strumaskbl && pSpot.strumaskbl == otherSpot.strumaskbl; + locallab.spots.at(j).Lmaskblcurve = locallab.spots.at(j).Lmaskblcurve && pSpot.Lmaskblcurve == otherSpot.Lmaskblcurve; + locallab.spots.at(j).LLmaskblcurvewav = locallab.spots.at(j).LLmaskblcurvewav && pSpot.LLmaskblcurvewav == otherSpot.LLmaskblcurvewav; + locallab.spots.at(j).csthresholdblur = locallab.spots.at(j).csthresholdblur && pSpot.csthresholdblur == otherSpot.csthresholdblur; + // Tone Mapping + locallab.spots.at(j).visitonemap = locallab.spots.at(j).visitonemap && pSpot.visitonemap == otherSpot.visitonemap; + locallab.spots.at(j).exptonemap = locallab.spots.at(j).exptonemap && pSpot.exptonemap == otherSpot.exptonemap; + locallab.spots.at(j).complextonemap = locallab.spots.at(j).complextonemap && pSpot.complextonemap == otherSpot.complextonemap; + locallab.spots.at(j).stren = locallab.spots.at(j).stren && pSpot.stren == otherSpot.stren; + locallab.spots.at(j).gamma = locallab.spots.at(j).gamma && pSpot.gamma == otherSpot.gamma; + locallab.spots.at(j).estop = locallab.spots.at(j).estop && pSpot.estop == otherSpot.estop; + locallab.spots.at(j).scaltm = locallab.spots.at(j).scaltm && pSpot.scaltm == otherSpot.scaltm; + locallab.spots.at(j).repartm = locallab.spots.at(j).repartm && pSpot.repartm == otherSpot.repartm; + locallab.spots.at(j).rewei = locallab.spots.at(j).rewei && pSpot.rewei == otherSpot.rewei; + locallab.spots.at(j).satur = locallab.spots.at(j).satur && pSpot.satur == otherSpot.satur; + locallab.spots.at(j).sensitm = locallab.spots.at(j).sensitm && pSpot.sensitm == otherSpot.sensitm; + locallab.spots.at(j).softradiustm = locallab.spots.at(j).softradiustm && pSpot.softradiustm == otherSpot.softradiustm; + locallab.spots.at(j).amount = locallab.spots.at(j).amount && pSpot.amount == otherSpot.amount; + locallab.spots.at(j).equiltm = locallab.spots.at(j).equiltm && pSpot.equiltm == otherSpot.equiltm; + locallab.spots.at(j).CCmasktmcurve = locallab.spots.at(j).CCmasktmcurve && pSpot.CCmasktmcurve == otherSpot.CCmasktmcurve; + locallab.spots.at(j).LLmasktmcurve = locallab.spots.at(j).LLmasktmcurve && pSpot.LLmasktmcurve == otherSpot.LLmasktmcurve; + locallab.spots.at(j).HHmasktmcurve = locallab.spots.at(j).HHmasktmcurve && pSpot.HHmasktmcurve == otherSpot.HHmasktmcurve; + locallab.spots.at(j).enatmMask = locallab.spots.at(j).enatmMask && pSpot.enatmMask == otherSpot.enatmMask; + locallab.spots.at(j).enatmMaskaft = locallab.spots.at(j).enatmMaskaft && pSpot.enatmMaskaft == otherSpot.enatmMaskaft; + locallab.spots.at(j).blendmasktm = locallab.spots.at(j).blendmasktm && pSpot.blendmasktm == otherSpot.blendmasktm; + locallab.spots.at(j).radmasktm = locallab.spots.at(j).radmasktm && pSpot.radmasktm == otherSpot.radmasktm; + locallab.spots.at(j).chromasktm = locallab.spots.at(j).chromasktm && pSpot.chromasktm == otherSpot.chromasktm; + locallab.spots.at(j).gammasktm = locallab.spots.at(j).gammasktm && pSpot.gammasktm == otherSpot.gammasktm; + locallab.spots.at(j).slomasktm = locallab.spots.at(j).slomasktm && pSpot.slomasktm == otherSpot.slomasktm; + locallab.spots.at(j).lapmasktm = locallab.spots.at(j).lapmasktm && pSpot.lapmasktm == otherSpot.lapmasktm; + locallab.spots.at(j).Lmasktmcurve = locallab.spots.at(j).Lmasktmcurve && pSpot.Lmasktmcurve == otherSpot.Lmasktmcurve; + locallab.spots.at(j).recothrest = locallab.spots.at(j).recothrest && pSpot.recothrest == otherSpot.recothrest; + locallab.spots.at(j).lowthrest = locallab.spots.at(j).lowthrest && pSpot.lowthrest == otherSpot.lowthrest; + locallab.spots.at(j).higthrest = locallab.spots.at(j).higthrest && pSpot.higthrest == otherSpot.higthrest; + locallab.spots.at(j).decayt = locallab.spots.at(j).decayt && pSpot.decayt == otherSpot.decayt; + // Retinex + locallab.spots.at(j).visireti = locallab.spots.at(j).visireti && pSpot.visireti == otherSpot.visireti; + locallab.spots.at(j).expreti = locallab.spots.at(j).expreti && pSpot.expreti == otherSpot.expreti; + locallab.spots.at(j).complexreti = locallab.spots.at(j).complexreti && pSpot.complexreti == otherSpot.complexreti; + locallab.spots.at(j).retinexMethod = locallab.spots.at(j).retinexMethod && pSpot.retinexMethod == otherSpot.retinexMethod; + locallab.spots.at(j).str = locallab.spots.at(j).str && pSpot.str == otherSpot.str; + locallab.spots.at(j).chrrt = locallab.spots.at(j).chrrt && pSpot.chrrt == otherSpot.chrrt; + locallab.spots.at(j).neigh = locallab.spots.at(j).neigh && pSpot.neigh == otherSpot.neigh; + locallab.spots.at(j).vart = locallab.spots.at(j).vart && pSpot.vart == otherSpot.vart; + locallab.spots.at(j).offs = locallab.spots.at(j).offs && pSpot.offs == otherSpot.offs; + locallab.spots.at(j).dehaz = locallab.spots.at(j).dehaz && pSpot.dehaz == otherSpot.dehaz; + locallab.spots.at(j).depth = locallab.spots.at(j).depth && pSpot.depth == otherSpot.depth; + locallab.spots.at(j).sensih = locallab.spots.at(j).sensih && pSpot.sensih == otherSpot.sensih; + locallab.spots.at(j).localTgaincurve = locallab.spots.at(j).localTgaincurve && pSpot.localTgaincurve == otherSpot.localTgaincurve; + locallab.spots.at(j).localTtranscurve = locallab.spots.at(j).localTtranscurve && pSpot.localTtranscurve == otherSpot.localTtranscurve; + locallab.spots.at(j).inversret = locallab.spots.at(j).inversret && pSpot.inversret == otherSpot.inversret; + locallab.spots.at(j).equilret = locallab.spots.at(j).equilret && pSpot.equilret == otherSpot.equilret; + locallab.spots.at(j).loglin = locallab.spots.at(j).loglin && pSpot.loglin == otherSpot.loglin; + locallab.spots.at(j).dehazeSaturation = locallab.spots.at(j).dehazeSaturation && pSpot.dehazeSaturation == otherSpot.dehazeSaturation; + locallab.spots.at(j).softradiusret = locallab.spots.at(j).softradiusret && pSpot.softradiusret == otherSpot.softradiusret; + locallab.spots.at(j).CCmaskreticurve = locallab.spots.at(j).CCmaskreticurve && pSpot.CCmaskreticurve == otherSpot.CCmaskreticurve; + locallab.spots.at(j).LLmaskreticurve = locallab.spots.at(j).LLmaskreticurve && pSpot.LLmaskreticurve == otherSpot.LLmaskreticurve; + locallab.spots.at(j).HHmaskreticurve = locallab.spots.at(j).HHmaskreticurve && pSpot.HHmaskreticurve == otherSpot.HHmaskreticurve; + locallab.spots.at(j).enaretiMask = locallab.spots.at(j).enaretiMask && pSpot.enaretiMask == otherSpot.enaretiMask; + locallab.spots.at(j).enaretiMasktmap = locallab.spots.at(j).enaretiMasktmap && pSpot.enaretiMasktmap == otherSpot.enaretiMasktmap; + locallab.spots.at(j).blendmaskreti = locallab.spots.at(j).blendmaskreti && pSpot.blendmaskreti == otherSpot.blendmaskreti; + locallab.spots.at(j).radmaskreti = locallab.spots.at(j).radmaskreti && pSpot.radmaskreti == otherSpot.radmaskreti; + locallab.spots.at(j).chromaskreti = locallab.spots.at(j).chromaskreti && pSpot.chromaskreti == otherSpot.chromaskreti; + locallab.spots.at(j).gammaskreti = locallab.spots.at(j).gammaskreti && pSpot.gammaskreti == otherSpot.gammaskreti; + locallab.spots.at(j).slomaskreti = locallab.spots.at(j).slomaskreti && pSpot.slomaskreti == otherSpot.slomaskreti; + locallab.spots.at(j).lapmaskreti = locallab.spots.at(j).lapmaskreti && pSpot.lapmaskreti == otherSpot.lapmaskreti; + locallab.spots.at(j).scalereti = locallab.spots.at(j).scalereti && pSpot.scalereti == otherSpot.scalereti; + locallab.spots.at(j).darkness = locallab.spots.at(j).darkness && pSpot.darkness == otherSpot.darkness; + locallab.spots.at(j).lightnessreti = locallab.spots.at(j).lightnessreti && pSpot.lightnessreti == otherSpot.lightnessreti; + locallab.spots.at(j).limd = locallab.spots.at(j).limd && pSpot.limd == otherSpot.limd; + locallab.spots.at(j).cliptm = locallab.spots.at(j).cliptm && pSpot.cliptm == otherSpot.cliptm; + locallab.spots.at(j).fftwreti = locallab.spots.at(j).fftwreti && pSpot.fftwreti == otherSpot.fftwreti; + locallab.spots.at(j).Lmaskreticurve = locallab.spots.at(j).Lmaskreticurve && pSpot.Lmaskreticurve == otherSpot.Lmaskreticurve; + locallab.spots.at(j).recothresr = locallab.spots.at(j).recothresr && pSpot.recothresr == otherSpot.recothresr; + locallab.spots.at(j).lowthresr = locallab.spots.at(j).lowthresr && pSpot.lowthresr == otherSpot.lowthresr; + locallab.spots.at(j).higthresr = locallab.spots.at(j).higthresr && pSpot.higthresr == otherSpot.higthresr; + locallab.spots.at(j).decayr = locallab.spots.at(j).decayr && pSpot.decayr == otherSpot.decayr; + // Sharpening + locallab.spots.at(j).visisharp = locallab.spots.at(j).visisharp && pSpot.visisharp == otherSpot.visisharp; + locallab.spots.at(j).expsharp = locallab.spots.at(j).expsharp && pSpot.expsharp == otherSpot.expsharp; + locallab.spots.at(j).complexsharp = locallab.spots.at(j).complexsharp && pSpot.complexsharp == otherSpot.complexsharp; + locallab.spots.at(j).sharcontrast = locallab.spots.at(j).sharcontrast && pSpot.sharcontrast == otherSpot.sharcontrast; + locallab.spots.at(j).sharradius = locallab.spots.at(j).sharradius && pSpot.sharradius == otherSpot.sharradius; + locallab.spots.at(j).sharamount = locallab.spots.at(j).sharamount && pSpot.sharamount == otherSpot.sharamount; + locallab.spots.at(j).shardamping = locallab.spots.at(j).shardamping && pSpot.shardamping == otherSpot.shardamping; + locallab.spots.at(j).shariter = locallab.spots.at(j).shariter && pSpot.shariter == otherSpot.shariter; + locallab.spots.at(j).sharblur = locallab.spots.at(j).sharblur && pSpot.sharblur == otherSpot.sharblur; + locallab.spots.at(j).shargam = locallab.spots.at(j).shargam && pSpot.shargam == otherSpot.shargam; + locallab.spots.at(j).sensisha = locallab.spots.at(j).sensisha && pSpot.sensisha == otherSpot.sensisha; + locallab.spots.at(j).inverssha = locallab.spots.at(j).inverssha && pSpot.inverssha == otherSpot.inverssha; + // Local Contrast + locallab.spots.at(j).visicontrast = locallab.spots.at(j).visicontrast && pSpot.visicontrast == otherSpot.visicontrast; + locallab.spots.at(j).expcontrast = locallab.spots.at(j).expcontrast && pSpot.expcontrast == otherSpot.expcontrast; + locallab.spots.at(j).complexcontrast = locallab.spots.at(j).complexcontrast && pSpot.complexcontrast == otherSpot.complexcontrast; + locallab.spots.at(j).lcradius = locallab.spots.at(j).lcradius && pSpot.lcradius == otherSpot.lcradius; + locallab.spots.at(j).lcamount = locallab.spots.at(j).lcamount && pSpot.lcamount == otherSpot.lcamount; + locallab.spots.at(j).lcdarkness = locallab.spots.at(j).lcdarkness && pSpot.lcdarkness == otherSpot.lcdarkness; + locallab.spots.at(j).lclightness = locallab.spots.at(j).lclightness && pSpot.lclightness == otherSpot.lclightness; + locallab.spots.at(j).sigmalc = locallab.spots.at(j).sigmalc && pSpot.sigmalc == otherSpot.sigmalc; + locallab.spots.at(j).levelwav = locallab.spots.at(j).levelwav && pSpot.levelwav == otherSpot.levelwav; + locallab.spots.at(j).residcont = locallab.spots.at(j).residcont && pSpot.residcont == otherSpot.residcont; + locallab.spots.at(j).residsha = locallab.spots.at(j).residsha && pSpot.residsha == otherSpot.residsha; + locallab.spots.at(j).residshathr = locallab.spots.at(j).residshathr && pSpot.residshathr == otherSpot.residshathr; + locallab.spots.at(j).residhi = locallab.spots.at(j).residhi && pSpot.residhi == otherSpot.residhi; + locallab.spots.at(j).residhithr = locallab.spots.at(j).residhithr && pSpot.residhithr == otherSpot.residhithr; + locallab.spots.at(j).gamlc = locallab.spots.at(j).gamlc && pSpot.gamlc == otherSpot.gamlc; + locallab.spots.at(j).residgam = locallab.spots.at(j).residgam && pSpot.residgam == otherSpot.residgam; + locallab.spots.at(j).residslop = locallab.spots.at(j).residslop && pSpot.residslop == otherSpot.residslop; + locallab.spots.at(j).residblur = locallab.spots.at(j).residblur && pSpot.residblur == otherSpot.residblur; + locallab.spots.at(j).levelblur = locallab.spots.at(j).levelblur && pSpot.levelblur == otherSpot.levelblur; + locallab.spots.at(j).sigmabl = locallab.spots.at(j).sigmabl && pSpot.sigmabl == otherSpot.sigmabl; + locallab.spots.at(j).residchro = locallab.spots.at(j).residchro && pSpot.residchro == otherSpot.residchro; + locallab.spots.at(j).residcomp = locallab.spots.at(j).residcomp && pSpot.residcomp == otherSpot.residcomp; + locallab.spots.at(j).sigma = locallab.spots.at(j).sigma && pSpot.sigma == otherSpot.sigma; + locallab.spots.at(j).offset = locallab.spots.at(j).offset && pSpot.offset == otherSpot.offset; + locallab.spots.at(j).sigmadr = locallab.spots.at(j).sigmadr && pSpot.sigmadr == otherSpot.sigmadr; + locallab.spots.at(j).threswav = locallab.spots.at(j).threswav && pSpot.threswav == otherSpot.threswav; + locallab.spots.at(j).chromalev = locallab.spots.at(j).chromalev && pSpot.chromalev == otherSpot.chromalev; + locallab.spots.at(j).chromablu = locallab.spots.at(j).chromablu && pSpot.chromablu == otherSpot.chromablu; + locallab.spots.at(j).sigmadc = locallab.spots.at(j).sigmadc && pSpot.sigmadc == otherSpot.sigmadc; + locallab.spots.at(j).deltad = locallab.spots.at(j).deltad && pSpot.deltad == otherSpot.deltad; + locallab.spots.at(j).fatres = locallab.spots.at(j).fatres && pSpot.fatres == otherSpot.fatres; + locallab.spots.at(j).clarilres = locallab.spots.at(j).clarilres && pSpot.clarilres == otherSpot.clarilres; + locallab.spots.at(j).claricres = locallab.spots.at(j).claricres && pSpot.claricres == otherSpot.claricres; + locallab.spots.at(j).clarisoft = locallab.spots.at(j).clarisoft && pSpot.clarisoft == otherSpot.clarisoft; + locallab.spots.at(j).sigmalc2 = locallab.spots.at(j).sigmalc2 && pSpot.sigmalc2 == otherSpot.sigmalc2; + locallab.spots.at(j).strwav = locallab.spots.at(j).strwav && pSpot.strwav == otherSpot.strwav; + locallab.spots.at(j).angwav = locallab.spots.at(j).angwav && pSpot.angwav == otherSpot.angwav; + locallab.spots.at(j).strengthw = locallab.spots.at(j).strengthw && pSpot.strengthw == otherSpot.strengthw; + locallab.spots.at(j).sigmaed = locallab.spots.at(j).sigmaed && pSpot.sigmaed == otherSpot.sigmaed; + locallab.spots.at(j).radiusw = locallab.spots.at(j).radiusw && pSpot.radiusw == otherSpot.radiusw; + locallab.spots.at(j).detailw = locallab.spots.at(j).detailw && pSpot.detailw == otherSpot.detailw; + locallab.spots.at(j).gradw = locallab.spots.at(j).gradw && pSpot.gradw == otherSpot.gradw; + locallab.spots.at(j).tloww = locallab.spots.at(j).tloww && pSpot.tloww == otherSpot.tloww; + locallab.spots.at(j).thigw = locallab.spots.at(j).thigw && pSpot.thigw == otherSpot.thigw; + locallab.spots.at(j).edgw = locallab.spots.at(j).edgw && pSpot.edgw == otherSpot.edgw; + locallab.spots.at(j).basew = locallab.spots.at(j).basew && pSpot.basew == otherSpot.basew; + locallab.spots.at(j).sensilc = locallab.spots.at(j).sensilc && pSpot.sensilc == otherSpot.sensilc; + locallab.spots.at(j).reparw = locallab.spots.at(j).reparw && pSpot.reparw == otherSpot.reparw; + locallab.spots.at(j).fftwlc = locallab.spots.at(j).fftwlc && pSpot.fftwlc == otherSpot.fftwlc; + locallab.spots.at(j).blurlc = locallab.spots.at(j).blurlc && pSpot.blurlc == otherSpot.blurlc; + locallab.spots.at(j).wavblur = locallab.spots.at(j).wavblur && pSpot.wavblur == otherSpot.wavblur; + locallab.spots.at(j).wavedg = locallab.spots.at(j).wavedg && pSpot.wavedg == otherSpot.wavedg; + locallab.spots.at(j).waveshow = locallab.spots.at(j).waveshow && pSpot.waveshow == otherSpot.waveshow; + locallab.spots.at(j).wavcont = locallab.spots.at(j).wavcont && pSpot.wavcont == otherSpot.wavcont; + locallab.spots.at(j).wavcomp = locallab.spots.at(j).wavcomp && pSpot.wavcomp == otherSpot.wavcomp; + locallab.spots.at(j).wavgradl = locallab.spots.at(j).wavgradl && pSpot.wavgradl == otherSpot.wavgradl; + locallab.spots.at(j).wavcompre = locallab.spots.at(j).wavcompre && pSpot.wavcompre == otherSpot.wavcompre; + locallab.spots.at(j).origlc = locallab.spots.at(j).origlc && pSpot.origlc == otherSpot.origlc; + locallab.spots.at(j).localcontMethod = locallab.spots.at(j).localcontMethod && pSpot.localcontMethod == otherSpot.localcontMethod; + locallab.spots.at(j).localedgMethod = locallab.spots.at(j).localedgMethod && pSpot.localedgMethod == otherSpot.localedgMethod; + locallab.spots.at(j).localneiMethod = locallab.spots.at(j).localneiMethod && pSpot.localneiMethod == otherSpot.localneiMethod; + locallab.spots.at(j).locwavcurve = locallab.spots.at(j).locwavcurve && pSpot.locwavcurve == otherSpot.locwavcurve; + locallab.spots.at(j).csthreshold = locallab.spots.at(j).csthreshold && pSpot.csthreshold == otherSpot.csthreshold; + locallab.spots.at(j).loclevwavcurve = locallab.spots.at(j).loclevwavcurve && pSpot.loclevwavcurve == otherSpot.loclevwavcurve; + locallab.spots.at(j).locconwavcurve = locallab.spots.at(j).locconwavcurve && pSpot.locconwavcurve == otherSpot.locconwavcurve; + locallab.spots.at(j).loccompwavcurve = locallab.spots.at(j).loccompwavcurve && pSpot.loccompwavcurve == otherSpot.loccompwavcurve; + locallab.spots.at(j).loccomprewavcurve = locallab.spots.at(j).loccomprewavcurve && pSpot.loccomprewavcurve == otherSpot.loccomprewavcurve; + locallab.spots.at(j).locedgwavcurve = locallab.spots.at(j).locedgwavcurve && pSpot.locedgwavcurve == otherSpot.locedgwavcurve; + locallab.spots.at(j).CCmasklccurve = locallab.spots.at(j).CCmasklccurve && pSpot.CCmasklccurve == otherSpot.CCmasklccurve; + locallab.spots.at(j).LLmasklccurve = locallab.spots.at(j).LLmasklccurve && pSpot.LLmasklccurve == otherSpot.LLmasklccurve; + locallab.spots.at(j).HHmasklccurve = locallab.spots.at(j).HHmasklccurve && pSpot.HHmasklccurve == otherSpot.HHmasklccurve; + locallab.spots.at(j).enalcMask = locallab.spots.at(j).enalcMask && pSpot.enalcMask == otherSpot.enalcMask; + locallab.spots.at(j).blendmasklc = locallab.spots.at(j).blendmasklc && pSpot.blendmasklc == otherSpot.blendmasklc; + locallab.spots.at(j).radmasklc = locallab.spots.at(j).radmasklc && pSpot.radmaskcb == otherSpot.radmasklc; + locallab.spots.at(j).chromasklc = locallab.spots.at(j).chromasklc && pSpot.chromasklc == otherSpot.chromasklc; + locallab.spots.at(j).Lmasklccurve = locallab.spots.at(j).Lmasklccurve && pSpot.Lmasklccurve == otherSpot.Lmasklccurve; + locallab.spots.at(j).recothresw = locallab.spots.at(j).recothresw && pSpot.recothresw == otherSpot.recothresw; + locallab.spots.at(j).lowthresw = locallab.spots.at(j).lowthresw && pSpot.lowthresw == otherSpot.lowthresw; + locallab.spots.at(j).higthresw = locallab.spots.at(j).higthresw && pSpot.higthresw == otherSpot.higthresw; + locallab.spots.at(j).decayw = locallab.spots.at(j).decayw && pSpot.decayw == otherSpot.decayw; + // Contrast by detail levels + locallab.spots.at(j).visicbdl = locallab.spots.at(j).visicbdl && pSpot.visicbdl == otherSpot.visicbdl; + locallab.spots.at(j).expcbdl = locallab.spots.at(j).expcbdl && pSpot.expcbdl == otherSpot.expcbdl; + locallab.spots.at(j).complexcbdl = locallab.spots.at(j).complexcbdl && pSpot.complexcbdl == otherSpot.complexcbdl; + + for (int k = 0; k < 6; k++) { + locallab.spots.at(j).mult[k] = locallab.spots.at(j).mult[k] && pSpot.mult[k] == otherSpot.mult[k]; + } + + locallab.spots.at(j).chromacbdl = locallab.spots.at(j).chromacbdl && pSpot.chromacbdl == otherSpot.chromacbdl; + locallab.spots.at(j).threshold = locallab.spots.at(j).threshold && pSpot.threshold == otherSpot.threshold; + locallab.spots.at(j).sensicb = locallab.spots.at(j).sensicb && pSpot.sensicb == otherSpot.sensicb; + locallab.spots.at(j).clarityml = locallab.spots.at(j).clarityml && pSpot.clarityml == otherSpot.clarityml; + locallab.spots.at(j).contresid = locallab.spots.at(j).contresid && pSpot.contresid == otherSpot.contresid; + locallab.spots.at(j).softradiuscb = locallab.spots.at(j).softradiuscb && pSpot.softradiuscb == otherSpot.softradiuscb; + locallab.spots.at(j).enacbMask = locallab.spots.at(j).enacbMask && pSpot.enacbMask == otherSpot.enacbMask; + locallab.spots.at(j).CCmaskcbcurve = locallab.spots.at(j).CCmaskcbcurve && pSpot.CCmaskcbcurve == otherSpot.CCmaskcbcurve; + locallab.spots.at(j).LLmaskcbcurve = locallab.spots.at(j).LLmaskcbcurve && pSpot.LLmaskcbcurve == otherSpot.LLmaskcbcurve; + locallab.spots.at(j).HHmaskcbcurve = locallab.spots.at(j).HHmaskcbcurve && pSpot.HHmaskcbcurve == otherSpot.HHmaskcbcurve; + locallab.spots.at(j).blendmaskcb = locallab.spots.at(j).blendmaskcb && pSpot.blendmaskcb == otherSpot.blendmaskcb; + locallab.spots.at(j).radmaskcb = locallab.spots.at(j).radmaskcb && pSpot.radmaskcb == otherSpot.radmaskcb; + locallab.spots.at(j).chromaskcb = locallab.spots.at(j).chromaskcb && pSpot.chromaskcb == otherSpot.chromaskcb; + locallab.spots.at(j).gammaskcb = locallab.spots.at(j).gammaskcb && pSpot.gammaskcb == otherSpot.gammaskcb; + locallab.spots.at(j).slomaskcb = locallab.spots.at(j).slomaskcb && pSpot.slomaskcb == otherSpot.slomaskcb; + locallab.spots.at(j).lapmaskcb = locallab.spots.at(j).lapmaskcb && pSpot.lapmaskcb == otherSpot.lapmaskcb; + locallab.spots.at(j).Lmaskcbcurve = locallab.spots.at(j).Lmaskcbcurve && pSpot.Lmaskcbcurve == otherSpot.Lmaskcbcurve; + locallab.spots.at(j).recothrescb = locallab.spots.at(j).recothrescb && pSpot.recothrescb == otherSpot.recothrescb; + locallab.spots.at(j).lowthrescb = locallab.spots.at(j).lowthrescb && pSpot.lowthrescb == otherSpot.lowthrescb; + locallab.spots.at(j).higthrescb = locallab.spots.at(j).higthrescb && pSpot.higthrescb == otherSpot.higthrescb; + locallab.spots.at(j).decaycb = locallab.spots.at(j).decaycb && pSpot.decaycb == otherSpot.decaycb; + // Log encoding + locallab.spots.at(j).visilog = locallab.spots.at(j).visilog && pSpot.visilog == otherSpot.visilog; + locallab.spots.at(j).explog = locallab.spots.at(j).explog && pSpot.explog == otherSpot.explog; + locallab.spots.at(j).complexlog = locallab.spots.at(j).complexlog && pSpot.complexlog == otherSpot.complexlog; + locallab.spots.at(j).autocompute = locallab.spots.at(j).autocompute && pSpot.autocompute == otherSpot.autocompute; + locallab.spots.at(j).sourceGray = locallab.spots.at(j).sourceGray && pSpot.sourceGray == otherSpot.sourceGray; + locallab.spots.at(j).sourceabs = locallab.spots.at(j).sourceabs && pSpot.sourceabs == otherSpot.sourceabs; + locallab.spots.at(j).targabs = locallab.spots.at(j).targabs && pSpot.targabs == otherSpot.targabs; + locallab.spots.at(j).targetGray = locallab.spots.at(j).targetGray && pSpot.targetGray == otherSpot.targetGray; + locallab.spots.at(j).catad = locallab.spots.at(j).catad && pSpot.catad == otherSpot.catad; + locallab.spots.at(j).saturl = locallab.spots.at(j).saturl && pSpot.saturl == otherSpot.saturl; + locallab.spots.at(j).chroml = locallab.spots.at(j).chroml && pSpot.chroml == otherSpot.chroml; + locallab.spots.at(j).lightl = locallab.spots.at(j).lightl && pSpot.lightl == otherSpot.lightl; + locallab.spots.at(j).lightq = locallab.spots.at(j).lightq && pSpot.lightq == otherSpot.lightq; + locallab.spots.at(j).contl = locallab.spots.at(j).contl && pSpot.contl == otherSpot.contl; + locallab.spots.at(j).contthres = locallab.spots.at(j).contthres && pSpot.contthres == otherSpot.contthres; + locallab.spots.at(j).contq = locallab.spots.at(j).contq && pSpot.contq == otherSpot.contq; + locallab.spots.at(j).colorfl = locallab.spots.at(j).colorfl && pSpot.colorfl == otherSpot.colorfl; + locallab.spots.at(j).LcurveL = locallab.spots.at(j).LcurveL && pSpot.LcurveL == otherSpot.LcurveL; + locallab.spots.at(j).Autogray = locallab.spots.at(j).Autogray && pSpot.Autogray == otherSpot.Autogray; + locallab.spots.at(j).fullimage = locallab.spots.at(j).fullimage && pSpot.fullimage == otherSpot.fullimage; + locallab.spots.at(j).ciecam = locallab.spots.at(j).ciecam && pSpot.ciecam == otherSpot.ciecam; + locallab.spots.at(j).enaLMask = locallab.spots.at(j).enaLMask && pSpot.enaLMask == otherSpot.enaLMask; + locallab.spots.at(j).repar = locallab.spots.at(j).repar && pSpot.repar == otherSpot.repar; + locallab.spots.at(j).blackEv = locallab.spots.at(j).blackEv && pSpot.blackEv == otherSpot.blackEv; + locallab.spots.at(j).whiteEv = locallab.spots.at(j).whiteEv && pSpot.whiteEv == otherSpot.whiteEv; + locallab.spots.at(j).detail = locallab.spots.at(j).detail && pSpot.detail == otherSpot.detail; + locallab.spots.at(j).sursour = locallab.spots.at(j).sursour && pSpot.sursour == otherSpot.sursour; + locallab.spots.at(j).surround = locallab.spots.at(j).surround && pSpot.surround == otherSpot.surround; + locallab.spots.at(j).sensilog = locallab.spots.at(j).sensilog && pSpot.sensilog == otherSpot.sensilog; + locallab.spots.at(j).baselog = locallab.spots.at(j).baselog && pSpot.baselog == otherSpot.baselog; + locallab.spots.at(j).strlog = locallab.spots.at(j).strlog && pSpot.strlog == otherSpot.strlog; + locallab.spots.at(j).anglog = locallab.spots.at(j).anglog && pSpot.anglog == otherSpot.anglog; + locallab.spots.at(j).CCmaskcurveL = locallab.spots.at(j).CCmaskcurveL && pSpot.CCmaskcurveL == otherSpot.CCmaskcurveL; + locallab.spots.at(j).LLmaskcurveL = locallab.spots.at(j).LLmaskcurveL && pSpot.LLmaskcurveL == otherSpot.LLmaskcurveL; + locallab.spots.at(j).HHmaskcurveL = locallab.spots.at(j).HHmaskcurveL && pSpot.HHmaskcurveL == otherSpot.HHmaskcurveL; + locallab.spots.at(j).blendmaskL = locallab.spots.at(j).blendmaskL && pSpot.blendmaskL == otherSpot.blendmaskL; + locallab.spots.at(j).radmaskL = locallab.spots.at(j).radmaskL && pSpot.radmaskL == otherSpot.radmaskL; + locallab.spots.at(j).chromaskL = locallab.spots.at(j).chromaskL && pSpot.chromaskL == otherSpot.chromaskL; + locallab.spots.at(j).LmaskcurveL = locallab.spots.at(j).LmaskcurveL && pSpot.LmaskcurveL == otherSpot.LmaskcurveL; + locallab.spots.at(j).recothresl = locallab.spots.at(j).recothresl && pSpot.recothresl == otherSpot.recothresl; + locallab.spots.at(j).lowthresl = locallab.spots.at(j).lowthresl && pSpot.lowthresl == otherSpot.lowthresl; + locallab.spots.at(j).higthresl = locallab.spots.at(j).higthresl && pSpot.higthresl == otherSpot.higthresl; + locallab.spots.at(j).decayl = locallab.spots.at(j).decayl && pSpot.decayl == otherSpot.decayl; + + + //mask + locallab.spots.at(j).visimask = locallab.spots.at(j).visimask && pSpot.visimask == otherSpot.visimask; + locallab.spots.at(j).complexmask = locallab.spots.at(j).complexmask && pSpot.complexmask == otherSpot.complexmask; + locallab.spots.at(j).expmask = locallab.spots.at(j).expmask && pSpot.expmask == otherSpot.expmask; + locallab.spots.at(j).sensimask = locallab.spots.at(j).sensimask && pSpot.sensimask == otherSpot.sensimask; + locallab.spots.at(j).blendmask = locallab.spots.at(j).blendmask && pSpot.blendmask == otherSpot.blendmask; + locallab.spots.at(j).blendmaskab = locallab.spots.at(j).blendmaskab && pSpot.blendmaskab == otherSpot.blendmaskab; + locallab.spots.at(j).softradiusmask = locallab.spots.at(j).softradiusmask && pSpot.softradiusmask == otherSpot.softradiusmask; + locallab.spots.at(j).enamask = locallab.spots.at(j).enamask && pSpot.enamask == otherSpot.enamask; + locallab.spots.at(j).fftmask = locallab.spots.at(j).fftmask && pSpot.fftmask == otherSpot.fftmask; + locallab.spots.at(j).blurmask = locallab.spots.at(j).blurmask && pSpot.blurmask == otherSpot.blurmask; + locallab.spots.at(j).contmask = locallab.spots.at(j).contmask && pSpot.contmask == otherSpot.contmask; + locallab.spots.at(j).CCmask_curve = locallab.spots.at(j).CCmask_curve && pSpot.CCmask_curve == otherSpot.CCmask_curve; + locallab.spots.at(j).LLmask_curve = locallab.spots.at(j).LLmask_curve && pSpot.LLmask_curve == otherSpot.LLmask_curve; + locallab.spots.at(j).HHmask_curve = locallab.spots.at(j).HHmask_curve && pSpot.HHmask_curve == otherSpot.HHmask_curve; + locallab.spots.at(j).strumaskmask = locallab.spots.at(j).strumaskmask && pSpot.strumaskmask == otherSpot.strumaskmask; + locallab.spots.at(j).toolmask = locallab.spots.at(j).toolmask && pSpot.toolmask == otherSpot.toolmask; + locallab.spots.at(j).radmask = locallab.spots.at(j).radmask && pSpot.radmask == otherSpot.radmask; + locallab.spots.at(j).lapmask = locallab.spots.at(j).lapmask && pSpot.lapmask == otherSpot.lapmask; + locallab.spots.at(j).chromask = locallab.spots.at(j).chromask && pSpot.chromask == otherSpot.chromask; + locallab.spots.at(j).gammask = locallab.spots.at(j).gammask && pSpot.gammask == otherSpot.gammask; + locallab.spots.at(j).slopmask = locallab.spots.at(j).slopmask && pSpot.slopmask == otherSpot.slopmask; + locallab.spots.at(j).shadmask = locallab.spots.at(j).shadmask && pSpot.shadmask == otherSpot.shadmask; + locallab.spots.at(j).str_mask = locallab.spots.at(j).str_mask && pSpot.str_mask == otherSpot.str_mask; + locallab.spots.at(j).ang_mask = locallab.spots.at(j).ang_mask && pSpot.ang_mask == otherSpot.ang_mask; + locallab.spots.at(j).HHhmask_curve = locallab.spots.at(j).HHhmask_curve && pSpot.HHhmask_curve == otherSpot.HHhmask_curve; + locallab.spots.at(j).Lmask_curve = locallab.spots.at(j).Lmask_curve && pSpot.Lmask_curve == otherSpot.Lmask_curve; + locallab.spots.at(j).LLmask_curvewav = locallab.spots.at(j).LLmask_curvewav && pSpot.LLmask_curvewav == otherSpot.LLmask_curvewav; + locallab.spots.at(j).csthresholdmask = locallab.spots.at(j).csthresholdmask && pSpot.csthresholdmask == otherSpot.csthresholdmask; + + //ciecam + locallab.spots.at(j).visicie = locallab.spots.at(j).visicie && pSpot.visicie == otherSpot.visicie; + locallab.spots.at(j).expcie = locallab.spots.at(j).expcie && pSpot.expcie == otherSpot.expcie; + locallab.spots.at(j).complexcie = locallab.spots.at(j).complexcie && pSpot.complexcie == otherSpot.complexcie; + locallab.spots.at(j).reparcie = locallab.spots.at(j).reparcie && pSpot.reparcie == otherSpot.reparcie; + locallab.spots.at(j).sensicie = locallab.spots.at(j).sensicie && pSpot.sensicie == otherSpot.sensicie; + locallab.spots.at(j).Autograycie = locallab.spots.at(j).Autograycie && pSpot.Autograycie == otherSpot.Autograycie; + locallab.spots.at(j).forcejz = locallab.spots.at(j).forcejz && pSpot.forcejz == otherSpot.forcejz; + locallab.spots.at(j).forcebw = locallab.spots.at(j).forcebw && pSpot.forcebw == otherSpot.forcebw; + locallab.spots.at(j).qtoj = locallab.spots.at(j).qtoj && pSpot.qtoj == otherSpot.qtoj; + locallab.spots.at(j).jabcie = locallab.spots.at(j).jabcie && pSpot.jabcie == otherSpot.jabcie; + locallab.spots.at(j).sigmoidqjcie = locallab.spots.at(j).sigmoidqjcie && pSpot.sigmoidqjcie == otherSpot.sigmoidqjcie; + locallab.spots.at(j).logcie = locallab.spots.at(j).logcie && pSpot.logcie == otherSpot.logcie; + locallab.spots.at(j).logjz = locallab.spots.at(j).logjz && pSpot.logjz == otherSpot.logjz; + locallab.spots.at(j).sigjz = locallab.spots.at(j).sigjz && pSpot.sigjz == otherSpot.sigjz; + locallab.spots.at(j).sigq = locallab.spots.at(j).sigq && pSpot.sigq == otherSpot.sigq; + locallab.spots.at(j).chjzcie = locallab.spots.at(j).chjzcie && pSpot.chjzcie == otherSpot.chjzcie; + locallab.spots.at(j).sourceGraycie = locallab.spots.at(j).sourceGraycie && pSpot.sourceGraycie == otherSpot.sourceGraycie; + locallab.spots.at(j).sourceabscie = locallab.spots.at(j).sourceabscie && pSpot.sourceabscie == otherSpot.sourceabscie; + locallab.spots.at(j).sursourcie = locallab.spots.at(j).sursourcie && pSpot.sursourcie == otherSpot.sursourcie; + locallab.spots.at(j).modecam = locallab.spots.at(j).modecam && pSpot.modecam == otherSpot.modecam; + locallab.spots.at(j).modecie = locallab.spots.at(j).modecie && pSpot.modecie == otherSpot.modecie; + locallab.spots.at(j).saturlcie = locallab.spots.at(j).saturlcie && pSpot.saturlcie == otherSpot.saturlcie; + locallab.spots.at(j).rstprotectcie = locallab.spots.at(j).rstprotectcie && pSpot.rstprotectcie == otherSpot.rstprotectcie; + locallab.spots.at(j).chromlcie = locallab.spots.at(j).chromlcie && pSpot.chromlcie == otherSpot.chromlcie; + locallab.spots.at(j).huecie = locallab.spots.at(j).huecie && pSpot.huecie == otherSpot.huecie; + locallab.spots.at(j).toneMethodcie = locallab.spots.at(j).toneMethodcie && pSpot.toneMethodcie == otherSpot.toneMethodcie; + locallab.spots.at(j).ciecurve = locallab.spots.at(j).ciecurve && pSpot.ciecurve == otherSpot.ciecurve; + locallab.spots.at(j).toneMethodcie2 = locallab.spots.at(j).toneMethodcie2 && pSpot.toneMethodcie2 == otherSpot.toneMethodcie2; + locallab.spots.at(j).ciecurve2 = locallab.spots.at(j).ciecurve2 && pSpot.ciecurve2 == otherSpot.ciecurve2; + locallab.spots.at(j).chromjzcie = locallab.spots.at(j).chromjzcie && pSpot.chromjzcie == otherSpot.chromjzcie; + locallab.spots.at(j).saturjzcie = locallab.spots.at(j).saturjzcie && pSpot.saturjzcie == otherSpot.saturjzcie; + locallab.spots.at(j).huejzcie = locallab.spots.at(j).huejzcie && pSpot.huejzcie == otherSpot.huejzcie; + locallab.spots.at(j).softjzcie = locallab.spots.at(j).softjzcie && pSpot.softjzcie == otherSpot.softjzcie; + locallab.spots.at(j).strsoftjzcie = locallab.spots.at(j).strsoftjzcie && pSpot.strsoftjzcie == otherSpot.strsoftjzcie; + locallab.spots.at(j).thrhjzcie = locallab.spots.at(j).thrhjzcie && pSpot.thrhjzcie == otherSpot.thrhjzcie; + locallab.spots.at(j).jzcurve = locallab.spots.at(j).jzcurve && pSpot.jzcurve == otherSpot.jzcurve; + locallab.spots.at(j).czcurve = locallab.spots.at(j).czcurve && pSpot.czcurve == otherSpot.czcurve; + locallab.spots.at(j).czjzcurve = locallab.spots.at(j).czjzcurve && pSpot.czjzcurve == otherSpot.czjzcurve; + locallab.spots.at(j).HHcurvejz = locallab.spots.at(j).HHcurvejz && pSpot.HHcurvejz == otherSpot.HHcurvejz; + locallab.spots.at(j).CHcurvejz = locallab.spots.at(j).CHcurvejz && pSpot.CHcurvejz == otherSpot.CHcurvejz; + locallab.spots.at(j).LHcurvejz = locallab.spots.at(j).LHcurvejz && pSpot.LHcurvejz == otherSpot.LHcurvejz; + locallab.spots.at(j).lightlcie = locallab.spots.at(j).lightlcie && pSpot.lightlcie == otherSpot.lightlcie; + locallab.spots.at(j).lightjzcie = locallab.spots.at(j).lightjzcie && pSpot.lightjzcie == otherSpot.lightjzcie; + locallab.spots.at(j).lightqcie = locallab.spots.at(j).lightqcie && pSpot.lightqcie == otherSpot.lightqcie; + locallab.spots.at(j).contlcie = locallab.spots.at(j).contlcie && pSpot.contlcie == otherSpot.contlcie; + locallab.spots.at(j).contjzcie = locallab.spots.at(j).contjzcie && pSpot.contjzcie == otherSpot.contjzcie; + locallab.spots.at(j).adapjzcie = locallab.spots.at(j).adapjzcie && pSpot.adapjzcie == otherSpot.adapjzcie; + locallab.spots.at(j).jz100 = locallab.spots.at(j).jz100 && pSpot.jz100 == otherSpot.jz100; + locallab.spots.at(j).pqremap = locallab.spots.at(j).pqremap && pSpot.pqremap == otherSpot.pqremap; + locallab.spots.at(j).pqremapcam16 = locallab.spots.at(j).pqremapcam16 && pSpot.pqremapcam16 == otherSpot.pqremapcam16; + locallab.spots.at(j).hljzcie = locallab.spots.at(j).hljzcie && pSpot.hljzcie == otherSpot.hljzcie; + locallab.spots.at(j).hlthjzcie = locallab.spots.at(j).hlthjzcie && pSpot.hlthjzcie == otherSpot.hlthjzcie; + locallab.spots.at(j).shjzcie = locallab.spots.at(j).shjzcie && pSpot.shjzcie == otherSpot.shjzcie; + locallab.spots.at(j).shthjzcie = locallab.spots.at(j).shthjzcie && pSpot.shthjzcie == otherSpot.shthjzcie; + locallab.spots.at(j).radjzcie = locallab.spots.at(j).radjzcie && pSpot.radjzcie == otherSpot.radjzcie; + locallab.spots.at(j).contthrescie = locallab.spots.at(j).contthrescie && pSpot.contthrescie == otherSpot.contthrescie; + locallab.spots.at(j).blackEvjz = locallab.spots.at(j).blackEvjz && pSpot.blackEvjz == otherSpot.blackEvjz; + locallab.spots.at(j).whiteEvjz = locallab.spots.at(j).whiteEvjz && pSpot.whiteEvjz == otherSpot.whiteEvjz; + locallab.spots.at(j).targetjz = locallab.spots.at(j).targetjz && pSpot.targetjz == otherSpot.targetjz; + locallab.spots.at(j).sigmoidldacie = locallab.spots.at(j).sigmoidldacie && pSpot.sigmoidldacie == otherSpot.sigmoidldacie; + locallab.spots.at(j).sigmoidthcie = locallab.spots.at(j).sigmoidthcie && pSpot.sigmoidthcie == otherSpot.sigmoidthcie; + locallab.spots.at(j).sigmoidblcie = locallab.spots.at(j).sigmoidblcie && pSpot.sigmoidblcie == otherSpot.sigmoidblcie; + locallab.spots.at(j).sigmoidldajzcie = locallab.spots.at(j).sigmoidldajzcie && pSpot.sigmoidldajzcie == otherSpot.sigmoidldajzcie; + locallab.spots.at(j).sigmoidthjzcie = locallab.spots.at(j).sigmoidthjzcie && pSpot.sigmoidthjzcie == otherSpot.sigmoidthjzcie; + locallab.spots.at(j).sigmoidbljzcie = locallab.spots.at(j).sigmoidbljzcie && pSpot.sigmoidbljzcie == otherSpot.sigmoidbljzcie; + locallab.spots.at(j).contqcie = locallab.spots.at(j).contqcie && pSpot.contqcie == otherSpot.contqcie; + locallab.spots.at(j).colorflcie = locallab.spots.at(j).colorflcie && pSpot.colorflcie == otherSpot.colorflcie; + locallab.spots.at(j).targabscie = locallab.spots.at(j).targabscie && pSpot.targabscie == otherSpot.targabscie; + locallab.spots.at(j).targetGraycie = locallab.spots.at(j).targetGraycie && pSpot.targetGraycie == otherSpot.targetGraycie; + locallab.spots.at(j).catadcie = locallab.spots.at(j).catadcie && pSpot.catadcie == otherSpot.catadcie; + locallab.spots.at(j).detailcie = locallab.spots.at(j).detailcie && pSpot.detailcie == otherSpot.detailcie; + locallab.spots.at(j).surroundcie = locallab.spots.at(j).surroundcie && pSpot.surroundcie == otherSpot.surroundcie; +/* + locallab.spots.at(j).lightlzcam = locallab.spots.at(j).lightlzcam && pSpot.lightlzcam == otherSpot.lightlzcam; + locallab.spots.at(j).lightqzcam = locallab.spots.at(j).lightqzcam && pSpot.lightqzcam == otherSpot.lightqzcam; + locallab.spots.at(j).contlzcam = locallab.spots.at(j).contlzcam && pSpot.contlzcam == otherSpot.contlzcam; + locallab.spots.at(j).contqzcam = locallab.spots.at(j).contqzcam && pSpot.contqzcam == otherSpot.contqzcam; + locallab.spots.at(j).contthreszcam = locallab.spots.at(j).contthreszcam && pSpot.contthreszcam == otherSpot.contthreszcam; + locallab.spots.at(j).colorflzcam = locallab.spots.at(j).colorflzcam && pSpot.colorflzcam == otherSpot.colorflzcam; + locallab.spots.at(j).saturzcam = locallab.spots.at(j).saturzcam && pSpot.saturzcam == otherSpot.saturzcam; + locallab.spots.at(j).chromzcam = locallab.spots.at(j).chromzcam && pSpot.chromzcam == otherSpot.chromzcam; +*/ + locallab.spots.at(j).enacieMask = locallab.spots.at(j).enaSHMask && pSpot.enaSHMask == otherSpot.enaSHMask; + locallab.spots.at(j).CCmaskciecurve = locallab.spots.at(j).CCmaskciecurve && pSpot.CCmaskciecurve == otherSpot.CCmaskciecurve; + locallab.spots.at(j).LLmaskciecurve = locallab.spots.at(j).LLmaskciecurve && pSpot.LLmaskciecurve == otherSpot.LLmaskciecurve; + locallab.spots.at(j).HHmaskciecurve = locallab.spots.at(j).HHmaskciecurve && pSpot.HHmaskciecurve == otherSpot.HHmaskciecurve; + locallab.spots.at(j).blendmaskcie = locallab.spots.at(j).blendmaskcie && pSpot.blendmaskcie == otherSpot.blendmaskcie; + locallab.spots.at(j).radmaskcie = locallab.spots.at(j).radmaskcie && pSpot.radmaskcie == otherSpot.radmaskcie; + locallab.spots.at(j).chromaskcie = locallab.spots.at(j).chromaskcie && pSpot.chromaskcie == otherSpot.chromaskcie; + locallab.spots.at(j).lapmaskcie = locallab.spots.at(j).lapmaskcie && pSpot.lapmaskcie == otherSpot.lapmaskcie; + locallab.spots.at(j).gammaskcie = locallab.spots.at(j).gammaskcie && pSpot.gammaskcie == otherSpot.gammaskcie; + locallab.spots.at(j).slomaskcie = locallab.spots.at(j).slomaskcie && pSpot.slomaskcie == otherSpot.slomaskcie; + locallab.spots.at(j).Lmaskciecurve = locallab.spots.at(j).Lmaskciecurve && pSpot.Lmaskciecurve == otherSpot.Lmaskciecurve; + locallab.spots.at(j).recothrescie = locallab.spots.at(j).recothrescie && pSpot.recothrescie == otherSpot.recothrescie; + locallab.spots.at(j).lowthrescie = locallab.spots.at(j).lowthrescie && pSpot.lowthrescie == otherSpot.lowthrescie; + locallab.spots.at(j).higthrescie = locallab.spots.at(j).higthrescie && pSpot.higthrescie == otherSpot.higthrescie; + locallab.spots.at(j).decaycie = locallab.spots.at(j).decaycie && pSpot.decaycie == otherSpot.decaycie; + locallab.spots.at(j).locwavcurvejz = locallab.spots.at(j).locwavcurvejz && pSpot.locwavcurvejz == otherSpot.locwavcurvejz; + locallab.spots.at(j).csthresholdjz = locallab.spots.at(j).csthresholdjz && pSpot.csthresholdjz == otherSpot.csthresholdjz; + locallab.spots.at(j).sigmalcjz = locallab.spots.at(j).sigmalcjz && pSpot.sigmalcjz == otherSpot.sigmalcjz; + locallab.spots.at(j).clarilresjz = locallab.spots.at(j).clarilresjz && pSpot.clarilresjz == otherSpot.clarilresjz; + locallab.spots.at(j).claricresjz = locallab.spots.at(j).claricresjz && pSpot.claricresjz == otherSpot.claricresjz; + locallab.spots.at(j).clarisoftjz = locallab.spots.at(j).clarisoftjz && pSpot.clarisoftjz == otherSpot.clarisoftjz; + + + } + } + + if (!isSpotNumberEqual) { + // All LocallabSpotEdited are set to false because cannot be combined + locallab.spots.clear(); + locallab.spots.resize(p.locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(false)); + } + pcvignette.enabled = pcvignette.enabled && p.pcvignette.enabled == other.pcvignette.enabled; pcvignette.strength = pcvignette.strength && p.pcvignette.strength == other.pcvignette.strength; pcvignette.feather = pcvignette.feather && p.pcvignette.feather == other.pcvignette.feather; @@ -975,7 +1873,11 @@ void ParamsEdited::initFrom(const std::vector& resize.dataspec = resize.dataspec && p.resize.dataspec == other.resize.dataspec; resize.width = resize.width && p.resize.width == other.resize.width; resize.height = resize.height && p.resize.height == other.resize.height; + resize.longedge = resize.longedge && p.resize.longedge == other.resize.longedge; + resize.shortedge = resize.shortedge && p.resize.shortedge == other.resize.shortedge; 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; 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; @@ -989,7 +1891,27 @@ void ParamsEdited::initFrom(const std::vector& icm.outputBPC = icm.outputBPC && p.icm.outputBPC == other.icm.outputBPC ; icm.workingTRCGamma = icm.workingTRCGamma && p.icm.workingTRCGamma == other.icm.workingTRCGamma; icm.workingTRCSlope = icm.workingTRCSlope && p.icm.workingTRCSlope == other.icm.workingTRCSlope; + icm.redx = icm.redx && p.icm.redx == other.icm.redx; + icm.redy = icm.redy && p.icm.redy == other.icm.redy; + icm.grex = icm.grex && p.icm.grex == other.icm.grex; + icm.grey = icm.grey && p.icm.grey == other.icm.grey; + icm.blux = icm.blux && p.icm.blux == other.icm.blux; + icm.bluy = icm.bluy && p.icm.bluy == other.icm.bluy; + icm.labgridcieALow = icm.labgridcieALow && p.icm.labgridcieALow == other.icm.labgridcieALow; + icm.labgridcieBLow = icm.labgridcieBLow && p.icm.labgridcieBLow == other.icm.labgridcieBLow; + icm.labgridcieAHigh = icm.labgridcieAHigh && p.icm.labgridcieAHigh == other.icm.labgridcieAHigh; + icm.labgridcieBHigh = icm.labgridcieBHigh && p.icm.labgridcieBHigh == other.icm.labgridcieBHigh; + icm.labgridcieGx = icm.labgridcieGx && p.icm.labgridcieGx == other.icm.labgridcieGx; + icm.labgridcieGy = icm.labgridcieGy && p.icm.labgridcieGy == other.icm.labgridcieGy; + icm.labgridcieWx = icm.labgridcieWx && p.icm.labgridcieWx == other.icm.labgridcieWx; + icm.labgridcieWy = icm.labgridcieWy && p.icm.labgridcieWy == other.icm.labgridcieWy; + icm.preser = icm.preser && p.icm.preser == other.icm.preser; + icm.fbw = icm.fbw && p.icm.fbw == other.icm.fbw; + icm.gamut = icm.gamut && p.icm.gamut == other.icm.gamut; + icm.aRendIntent = icm.aRendIntent && p.icm.aRendIntent == other.icm.aRendIntent; icm.workingTRC = icm.workingTRC && p.icm.workingTRC == other.icm.workingTRC; + icm.will = icm.will && p.icm.will == other.icm.will; + icm.wprim = icm.wprim && p.icm.wprim == other.icm.wprim; 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; @@ -1012,6 +1934,7 @@ void ParamsEdited::initFrom(const std::vector& raw.bayersensor.pixelShiftShowMotionMaskOnly = raw.bayersensor.pixelShiftShowMotionMaskOnly && p.raw.bayersensor.pixelShiftShowMotionMaskOnly == other.raw.bayersensor.pixelShiftShowMotionMaskOnly; 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.pixelShiftAverage = raw.bayersensor.pixelShiftAverage && p.raw.bayersensor.pixelShiftAverage == other.raw.bayersensor.pixelShiftAverage; 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; @@ -1043,6 +1966,7 @@ void ParamsEdited::initFrom(const std::vector& raw.df_autoselect = raw.df_autoselect && p.raw.df_autoselect == other.raw.df_autoselect; raw.ff_file = raw.ff_file && p.raw.ff_file == other.raw.ff_file; raw.ff_AutoSelect = raw.ff_AutoSelect && p.raw.ff_AutoSelect == other.raw.ff_AutoSelect; + raw.ff_FromMetaData = raw.ff_FromMetaData && p.raw.ff_FromMetaData == other.raw.ff_FromMetaData; raw.ff_BlurRadius = raw.ff_BlurRadius && p.raw.ff_BlurRadius == other.raw.ff_BlurRadius; raw.ff_BlurType = raw.ff_BlurType && p.raw.ff_BlurType == other.raw.ff_BlurType; raw.ff_AutoClipControl = raw.ff_AutoClipControl && p.raw.ff_AutoClipControl == other.raw.ff_AutoClipControl; @@ -1052,6 +1976,12 @@ void ParamsEdited::initFrom(const std::vector& wavelet.strength = wavelet.strength && p.wavelet.strength == other.wavelet.strength; wavelet.balance = wavelet.balance && p.wavelet.balance == other.wavelet.balance; wavelet.iter = wavelet.iter && p.wavelet.iter == other.wavelet.iter; + wavelet.sigmafin = wavelet.sigmafin && p.wavelet.sigmafin == other.wavelet.sigmafin; + wavelet.sigmaton = wavelet.sigmaton && p.wavelet.sigmaton == other.wavelet.sigmaton; + wavelet.sigmacol = wavelet.sigmacol && p.wavelet.sigmacol == other.wavelet.sigmacol; + wavelet.sigmadir = wavelet.sigmadir && p.wavelet.sigmadir == other.wavelet.sigmadir; + wavelet.rangeab = wavelet.rangeab && p.wavelet.rangeab == other.wavelet.rangeab; + wavelet.protab = wavelet.protab && p.wavelet.protab == other.wavelet.protab; wavelet.median = wavelet.median && p.wavelet.median == other.wavelet.median; wavelet.medianlev = wavelet.medianlev && p.wavelet.medianlev == other.wavelet.medianlev; wavelet.linkedg = wavelet.linkedg && p.wavelet.linkedg == other.wavelet.linkedg; @@ -1063,13 +1993,36 @@ void ParamsEdited::initFrom(const std::vector& wavelet.greenlow = wavelet.greenlow && p.wavelet.greenlow == other.wavelet.greenlow; wavelet.bluelow = wavelet.bluelow && p.wavelet.bluelow == other.wavelet.bluelow; wavelet.lipst = wavelet.lipst && p.wavelet.lipst == other.wavelet.lipst; - wavelet.Medgreinf = wavelet.Medgreinf && p.wavelet.Medgreinf == other.wavelet.Medgreinf; + wavelet.bluehigh = wavelet.bluehigh && p.wavelet.bluehigh == other.wavelet.bluehigh; + wavelet.ballum = wavelet.ballum && p.wavelet.ballum == other.wavelet.ballum; + wavelet.sigm = wavelet.sigm && p.wavelet.sigm == other.wavelet.sigm; + wavelet.levden = wavelet.levden && p.wavelet.levden == other.wavelet.levden; + wavelet.thrden = wavelet.thrden && p.wavelet.thrden == other.wavelet.thrden; + wavelet.limden = wavelet.limden && p.wavelet.limden == other.wavelet.limden; + wavelet.balchrom = wavelet.balchrom && p.wavelet.balchrom == other.wavelet.balchrom; + wavelet.chromfi = wavelet.chromfi && p.wavelet.chromfi == other.wavelet.chromfi; + wavelet.chromco = wavelet.chromco && p.wavelet.chromco == other.wavelet.chromco; + wavelet.mergeL = wavelet.mergeL && p.wavelet.mergeL == other.wavelet.mergeL; + wavelet.mergeC = wavelet.mergeC && p.wavelet.mergeC == other.wavelet.mergeC; + wavelet.softrad = wavelet.softrad && p.wavelet.softrad == other.wavelet.softrad; + wavelet.softradend = wavelet.softradend && p.wavelet.softradend == other.wavelet.softradend; + wavelet.strend = wavelet.strend && p.wavelet.strend == other.wavelet.strend; + wavelet.detend = wavelet.detend && p.wavelet.detend == other.wavelet.detend; + wavelet.thrend = wavelet.thrend && p.wavelet.thrend == other.wavelet.thrend; + wavelet.ushamethod = wavelet.ushamethod && p.wavelet.ushamethod == other.wavelet.ushamethod; wavelet.avoid = wavelet.avoid && p.wavelet.avoid == other.wavelet.avoid; + wavelet.showmask = wavelet.showmask && p.wavelet.showmask == other.wavelet.showmask; + wavelet.oldsh = wavelet.oldsh && p.wavelet.oldsh == other.wavelet.oldsh; wavelet.tmr = wavelet.tmr && p.wavelet.tmr == other.wavelet.tmr; wavelet.Lmethod = wavelet.Lmethod && p.wavelet.Lmethod == other.wavelet.Lmethod; wavelet.CLmethod = wavelet.CLmethod && p.wavelet.CLmethod == other.wavelet.CLmethod; wavelet.Backmethod = wavelet.Backmethod && p.wavelet.Backmethod == other.wavelet.Backmethod; wavelet.Tilesmethod = wavelet.Tilesmethod && p.wavelet.Tilesmethod == other.wavelet.Tilesmethod; + wavelet.complexmethod = wavelet.complexmethod && p.wavelet.complexmethod == other.wavelet.complexmethod; + //wavelet.denmethod = wavelet.denmethod && p.wavelet.denmethod == other.wavelet.denmethod; + wavelet.mixmethod = wavelet.mixmethod && p.wavelet.mixmethod == other.wavelet.mixmethod; + wavelet.slimethod = wavelet.slimethod && p.wavelet.slimethod == other.wavelet.slimethod; + wavelet.quamethod = wavelet.quamethod && p.wavelet.quamethod == other.wavelet.quamethod; wavelet.daubcoeffmethod = wavelet.daubcoeffmethod && p.wavelet.daubcoeffmethod == other.wavelet.daubcoeffmethod; wavelet.CHmethod = wavelet.CHmethod && p.wavelet.CHmethod == other.wavelet.CHmethod; wavelet.CHSLmethod = wavelet.CHSLmethod && p.wavelet.CHSLmethod == other.wavelet.CHSLmethod; @@ -1079,10 +2032,17 @@ void ParamsEdited::initFrom(const std::vector& wavelet.TMmethod = wavelet.TMmethod && p.wavelet.TMmethod == other.wavelet.TMmethod; wavelet.HSmethod = wavelet.HSmethod && p.wavelet.HSmethod == other.wavelet.HSmethod; wavelet.Dirmethod = wavelet.Dirmethod && p.wavelet.Dirmethod == other.wavelet.Dirmethod; + wavelet.sigma = wavelet.sigma && p.wavelet.sigma == other.wavelet.sigma; + wavelet.offset = wavelet.offset && p.wavelet.offset == other.wavelet.offset; + wavelet.lowthr = wavelet.lowthr && p.wavelet.lowthr == other.wavelet.lowthr; wavelet.rescon = wavelet.rescon && p.wavelet.rescon == other.wavelet.rescon; wavelet.resconH = wavelet.resconH && p.wavelet.resconH == other.wavelet.resconH; wavelet.reschro = wavelet.reschro && p.wavelet.reschro == other.wavelet.reschro; + wavelet.resblur = wavelet.resblur && p.wavelet.resblur == other.wavelet.resblur; + wavelet.resblurc = wavelet.resblurc && p.wavelet.resblurc == other.wavelet.resblurc; wavelet.tmrs = wavelet.tmrs && p.wavelet.tmrs == other.wavelet.tmrs; + wavelet.edgs = wavelet.edgs && p.wavelet.edgs == other.wavelet.edgs; + wavelet.scale = wavelet.scale && p.wavelet.scale == other.wavelet.scale; wavelet.gamma = wavelet.gamma && p.wavelet.gamma == other.wavelet.gamma; wavelet.sup = wavelet.sup && p.wavelet.sup == other.wavelet.sup; wavelet.sky = wavelet.sky && p.wavelet.sky == other.wavelet.sky; @@ -1098,38 +2058,56 @@ void ParamsEdited::initFrom(const std::vector& wavelet.chro = wavelet.chro && p.wavelet.chro == other.wavelet.chro; wavelet.contrast = wavelet.contrast && p.wavelet.contrast == other.wavelet.contrast; wavelet.edgrad = wavelet.edgrad && p.wavelet.edgrad == other.wavelet.edgrad; + wavelet.edgeffect = wavelet.edgeffect && p.wavelet.edgeffect == other.wavelet.edgeffect; wavelet.edgval = wavelet.edgval && p.wavelet.edgval == other.wavelet.edgval; wavelet.edgthresh = wavelet.edgthresh && p.wavelet.edgthresh == other.wavelet.edgthresh; wavelet.thr = wavelet.thr && p.wavelet.thr == other.wavelet.thr; wavelet.thrH = wavelet.thrH && p.wavelet.thrH == other.wavelet.thrH; + wavelet.radius = wavelet.radius && p.wavelet.radius == other.wavelet.radius; wavelet.hueskin = wavelet.hueskin && p.wavelet.hueskin == other.wavelet.hueskin; wavelet.hueskin2 = wavelet.hueskin2 && p.wavelet.hueskin2 == other.wavelet.hueskin2; wavelet.hllev = wavelet.hllev && p.wavelet.hllev == other.wavelet.hllev; wavelet.bllev = wavelet.bllev && p.wavelet.bllev == other.wavelet.bllev; wavelet.edgcont = wavelet.edgcont && p.wavelet.edgcont == other.wavelet.edgcont; + wavelet.chrwav = wavelet.chrwav && p.wavelet.chrwav == other.wavelet.chrwav; + wavelet.bluwav = wavelet.bluwav && p.wavelet.bluwav == other.wavelet.bluwav; wavelet.level0noise = wavelet.level0noise && p.wavelet.level0noise == other.wavelet.level0noise; wavelet.level1noise = wavelet.level1noise && p.wavelet.level1noise == other.wavelet.level1noise; wavelet.level2noise = wavelet.level2noise && p.wavelet.level2noise == other.wavelet.level2noise; wavelet.level3noise = wavelet.level3noise && p.wavelet.level3noise == other.wavelet.level3noise; + wavelet.leveldenoise = wavelet.leveldenoise && p.wavelet.leveldenoise == other.wavelet.leveldenoise; + wavelet.levelsigm = wavelet.levelsigm && p.wavelet.levelsigm == other.wavelet.levelsigm; wavelet.pastlev = wavelet.pastlev && p.wavelet.pastlev == other.wavelet.pastlev; wavelet.satlev = wavelet.satlev && p.wavelet.satlev == other.wavelet.satlev; wavelet.ccwcurve = wavelet.ccwcurve && p.wavelet.ccwcurve == other.wavelet.ccwcurve; + wavelet.blcurve = wavelet.blcurve && p.wavelet.blcurve == other.wavelet.blcurve; + //wavelet.opacityCurveSH = wavelet.opacityCurveSH && p.wavelet.opacityCurveSH == other.wavelet.opacityCurveSH; wavelet.opacityCurveRG = wavelet.opacityCurveRG && p.wavelet.opacityCurveRG == other.wavelet.opacityCurveRG; wavelet.opacityCurveBY = wavelet.opacityCurveBY && p.wavelet.opacityCurveBY == other.wavelet.opacityCurveBY; + wavelet.wavdenoise = wavelet.wavdenoise && p.wavelet.wavdenoise == other.wavelet.wavdenoise; + wavelet.wavdenoiseh = wavelet.wavdenoiseh && p.wavelet.wavdenoiseh == other.wavelet.wavdenoiseh; wavelet.opacityCurveW = wavelet.opacityCurveW && p.wavelet.opacityCurveW == other.wavelet.opacityCurveW; wavelet.opacityCurveWL = wavelet.opacityCurveWL && p.wavelet.opacityCurveWL == other.wavelet.opacityCurveWL; wavelet.wavclCurve = wavelet.wavclCurve && p.wavelet.wavclCurve == other.wavelet.wavclCurve; wavelet.hhcurve = wavelet.hhcurve && p.wavelet.hhcurve == other.wavelet.hhcurve; + wavelet.wavguidcurve = wavelet.wavguidcurve && p.wavelet.wavguidcurve == other.wavelet.wavguidcurve; + wavelet.wavhuecurve = wavelet.wavhuecurve && p.wavelet.wavhuecurve == other.wavelet.wavhuecurve; wavelet.Chcurve = wavelet.Chcurve && p.wavelet.Chcurve == other.wavelet.Chcurve; wavelet.skinprotect = wavelet.skinprotect && p.wavelet.skinprotect == other.wavelet.skinprotect; // wavelet.enacont = wavelet.enacont && p.wavelet.enacont == other.wavelet.enacont; wavelet.expcontrast = wavelet.expcontrast && p.wavelet.expcontrast == other.wavelet.expcontrast; wavelet.expchroma = wavelet.expchroma && p.wavelet.expchroma == other.wavelet.expchroma; wavelet.expedge = wavelet.expedge && p.wavelet.expedge == other.wavelet.expedge; + wavelet.expbl = wavelet.expbl && p.wavelet.expbl == other.wavelet.expbl; wavelet.expresid = wavelet.expresid && p.wavelet.expresid == other.wavelet.expresid; wavelet.expfinal = wavelet.expfinal && p.wavelet.expfinal == other.wavelet.expfinal; wavelet.exptoning = wavelet.exptoning && p.wavelet.exptoning == other.wavelet.exptoning; wavelet.expnoise = wavelet.expnoise && p.wavelet.expnoise == other.wavelet.expnoise; + wavelet.expclari = wavelet.expclari && p.wavelet.expclari == other.wavelet.expclari; + wavelet.labgridALow = wavelet.labgridALow && p.wavelet.labgridALow == other.wavelet.labgridALow; + wavelet.labgridBLow = wavelet.labgridBLow && p.wavelet.labgridBLow == other.wavelet.labgridBLow; + wavelet.labgridAHigh = wavelet.labgridAHigh && p.wavelet.labgridAHigh == other.wavelet.labgridAHigh; + wavelet.labgridBHigh = wavelet.labgridBHigh && p.wavelet.labgridBHigh == other.wavelet.labgridBHigh; for (int level = 0; level < 9; ++level) { wavelet.c[level] = wavelet.c[level] && p.wavelet.c[level] == other.wavelet.c[level]; @@ -1161,12 +2139,16 @@ void ParamsEdited::initFrom(const std::vector& 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; - dehaze.luminance = dehaze.luminance && p.dehaze.luminance == other.dehaze.luminance; + dehaze.saturation = dehaze.saturation && p.dehaze.saturation == other.dehaze.saturation; metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; filmNegative.enabled = filmNegative.enabled && p.filmNegative.enabled == other.filmNegative.enabled; filmNegative.redRatio = filmNegative.redRatio && p.filmNegative.redRatio == other.filmNegative.redRatio; filmNegative.greenExp = filmNegative.greenExp && p.filmNegative.greenExp == other.filmNegative.greenExp; filmNegative.blueRatio = filmNegative.blueRatio && p.filmNegative.blueRatio == other.filmNegative.blueRatio; + filmNegative.refInput = filmNegative.refInput && p.filmNegative.refInput == other.filmNegative.refInput; + filmNegative.refOutput = filmNegative.refOutput && p.filmNegative.refOutput == other.filmNegative.refOutput; + filmNegative.colorSpace = filmNegative.colorSpace && p.filmNegative.colorSpace == other.filmNegative.colorSpace; + raw.preprocessWB.mode = raw.preprocessWB.mode && p.raw.preprocessWB.mode == other.raw.preprocessWB.mode; // How the hell can we handle that??? // exif = exif && p.exif==other.exif @@ -1243,6 +2225,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.toneCurve.method = mods.toneCurve.method; } + if (toneCurve.hlbl) { + toEdit.toneCurve.hlbl = mods.toneCurve.hlbl; + } + + if (toneCurve.hlth) { + toEdit.toneCurve.hlth = mods.toneCurve.hlth; + } + if (toneCurve.histmatching) { toEdit.toneCurve.histmatching = mods.toneCurve.histmatching; } @@ -1283,6 +2273,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.retinex.gaintransmissionCurve = mods.retinex.gaintransmissionCurve; } + if (retinex.complexmethod) { + toEdit.retinex.complexmethod = mods.retinex.complexmethod; + } + if (retinex.retinexMethod) { toEdit.retinex.retinexMethod = mods.retinex.retinexMethod; } @@ -1437,8 +2431,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.labCurve.chromaticity = dontforceSet && options.baBehav[ADDSET_LC_CHROMATICITY] ? toEdit.labCurve.chromaticity + mods.labCurve.chromaticity : mods.labCurve.chromaticity; } - if (labCurve.avoidcolorshift) { - toEdit.labCurve.avoidcolorshift = mods.labCurve.avoidcolorshift; + if (labCurve.gamutmunselmethod) { + toEdit.labCurve.gamutmunselmethod = mods.labCurve.gamutmunselmethod; } if (labCurve.rstprotection) { @@ -1621,7 +2615,7 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng if (colorToning.labregionsShowMask) { toEdit.colorToning.labregionsShowMask = mods.colorToning.labregionsShowMask; } - + if (sharpenEdge.enabled) { toEdit.sharpenEdge.enabled = mods.sharpenEdge.enabled; } @@ -1870,6 +2864,50 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wb.tempBias = dontforceSet && options.baBehav[ADDSET_WB_TEMPBIAS] ? toEdit.wb.tempBias + mods.wb.tempBias : mods.wb.tempBias; } + if (wb.observer) { + toEdit.wb.observer = mods.wb.observer; + } + + if (wb.itcwb_thres) { + toEdit.wb.itcwb_thres = mods.wb.itcwb_thres; + } + + if (wb.itcwb_precis) { + toEdit.wb.itcwb_precis = mods.wb.itcwb_precis; + } + + if (wb.itcwb_size) { + toEdit.wb.itcwb_size = mods.wb.itcwb_size; + } + + if (wb.itcwb_delta) { + toEdit.wb.itcwb_delta = mods.wb.itcwb_delta; + } + + if (wb.itcwb_fgreen) { + toEdit.wb.itcwb_fgreen = mods.wb.itcwb_fgreen; + } + + if (wb.itcwb_rgreen) { + toEdit.wb.itcwb_rgreen = mods.wb.itcwb_rgreen; + } + + if (wb.itcwb_nopurple) { + toEdit.wb.itcwb_nopurple = mods.wb.itcwb_nopurple; + } + + if (wb.itcwb_sorted) { + toEdit.wb.itcwb_sorted = mods.wb.itcwb_sorted; + } + + if (wb.itcwb_forceextra) { + toEdit.wb.itcwb_forceextra = mods.wb.itcwb_forceextra; + } + + if (wb.itcwb_sampling) { + toEdit.wb.itcwb_sampling = mods.wb.itcwb_sampling; + } + if (wb.green) { toEdit.wb.green = dontforceSet && options.baBehav[ADDSET_WB_GREEN] ? toEdit.wb.green + mods.wb.green : mods.wb.green; } @@ -1926,6 +2964,18 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorappearance.curveMode3 = mods.colorappearance.curveMode3; } + if (colorappearance.complexmethod) { + toEdit.colorappearance.complexmethod = mods.colorappearance.complexmethod; + } + + if (colorappearance.modelmethod) { + toEdit.colorappearance.modelmethod = mods.colorappearance.modelmethod; + } + + if (colorappearance.catmethod) { + toEdit.colorappearance.catmethod = mods.colorappearance.catmethod; + } + if (colorappearance.enabled) { toEdit.colorappearance.enabled = mods.colorappearance.enabled; } @@ -1939,7 +2989,7 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng } if (colorappearance.degreeout) { - toEdit.colorappearance.degreeout = mods.colorappearance.degreeout; + toEdit.colorappearance.degreeout = dontforceSet && options.baBehav[ADDSET_CAT_DEGREEOUT] ? toEdit.colorappearance.degreeout + mods.colorappearance.degreeout : mods.colorappearance.degreeout; } if (colorappearance.autodegreeout) { @@ -1982,12 +3032,20 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorappearance.wbmodel = mods.colorappearance.wbmodel; } + if (colorappearance.illum) { + toEdit.colorappearance.illum = mods.colorappearance.illum; + } + if (colorappearance.algo) { toEdit.colorappearance.algo = mods.colorappearance.algo; } if (colorappearance.tempout) { - toEdit.colorappearance.tempout = mods.colorappearance.tempout; + toEdit.colorappearance.tempout = dontforceSet && options.baBehav[ADDSET_CAT_TEMPOUT] ? toEdit.colorappearance.tempout + mods.colorappearance.tempout : mods.colorappearance.tempout; + } + + if (colorappearance.autotempout) { + toEdit.colorappearance.autotempout = mods.colorappearance.autotempout; } if (colorappearance.greenout) { @@ -2059,6 +3117,7 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.colorappearance.tonecie = mods.colorappearance.tonecie; } + // if (colorappearance.sharpcie) toEdit.colorappearance.sharpcie = mods.colorappearance.sharpcie; if (impulseDenoise.enabled) { toEdit.impulseDenoise.enabled = mods.impulseDenoise.enabled; @@ -2217,6 +3276,37 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.sh.lab = mods.sh.lab; } + if (toneEqualizer.enabled) { + toEdit.toneEqualizer.enabled = mods.toneEqualizer.enabled; + } + + for (size_t i = 0; i < toneEqualizer.bands.size(); ++i) { + if (toneEqualizer.bands[i]) { + toEdit.toneEqualizer.bands[i] = + dontforceSet && options.baBehav[ADDSET_TONE_EQUALIZER_BANDS] + ? toEdit.toneEqualizer.bands[i] + mods.toneEqualizer.bands[i] + : mods.toneEqualizer.bands[i]; + } + } + + if (toneEqualizer.regularization) { + toEdit.toneEqualizer.regularization = + dontforceSet && options.baBehav[ADDSET_TONE_EQUALIZER_REGULARIZATION] + ? toEdit.toneEqualizer.regularization + mods.toneEqualizer.regularization + : mods.toneEqualizer.regularization; + } + + if (toneEqualizer.show_colormap) { + toEdit.toneEqualizer.show_colormap = mods.toneEqualizer.show_colormap; + } + + if (toneEqualizer.pivot) { + toEdit.toneEqualizer.pivot = + dontforceSet && options.baBehav[ADDSET_TONE_EQUALIZER_PIVOT] + ? toEdit.toneEqualizer.pivot + mods.toneEqualizer.pivot + : mods.toneEqualizer.pivot; + } + if (crop.enabled) { toEdit.crop.enabled = mods.crop.enabled; } @@ -2265,6 +3355,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.coarse.vflip = mods.coarse.vflip; } + if (commonTrans.method) { + toEdit.commonTrans.method = mods.commonTrans.method; + } + if (commonTrans.autofill) { toEdit.commonTrans.autofill = mods.commonTrans.autofill; } @@ -2309,6 +3403,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.lensProf.lfLens = mods.lensProf.lfLens; } + if (perspective.method) { + toEdit.perspective.method = mods.perspective.method; + } + if (perspective.horizontal) { toEdit.perspective.horizontal = dontforceSet && options.baBehav[ADDSET_PERSPECTIVE] ? toEdit.perspective.horizontal + mods.perspective.horizontal : mods.perspective.horizontal; } @@ -2317,6 +3415,59 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.perspective.vertical = dontforceSet && options.baBehav[ADDSET_PERSPECTIVE] ? toEdit.perspective.vertical + mods.perspective.vertical : mods.perspective.vertical; } + if (perspective.camera_crop_factor) { + toEdit.perspective.camera_crop_factor = dontforceSet && options.baBehav[ADDSET_PERSP_CAM_FOCAL_LENGTH] ? toEdit.perspective.camera_crop_factor + mods.perspective.camera_crop_factor : mods.perspective.camera_crop_factor; + } + + if (perspective.camera_focal_length) { + toEdit.perspective.camera_focal_length = dontforceSet && options.baBehav[ADDSET_PERSP_CAM_FOCAL_LENGTH] ? toEdit.perspective.camera_focal_length + mods.perspective.camera_focal_length : mods.perspective.camera_focal_length; + } + + if (perspective.camera_pitch) { + toEdit.perspective.camera_pitch = dontforceSet && options.baBehav[ADDSET_PERSP_CAM_ANGLE] ? toEdit.perspective.camera_pitch + mods.perspective.camera_pitch : mods.perspective.camera_pitch; + } + + if (perspective.camera_roll) { + toEdit.perspective.camera_roll = dontforceSet && options.baBehav[ADDSET_PERSP_CAM_ANGLE] ? toEdit.perspective.camera_roll + mods.perspective.camera_roll : mods.perspective.camera_roll; + } + + if (perspective.camera_shift_horiz) { + toEdit.perspective.camera_shift_horiz = dontforceSet && options.baBehav[ADDSET_PERSP_CAM_SHIFT] ? toEdit.perspective.camera_shift_horiz + mods.perspective.camera_shift_horiz : mods.perspective.camera_shift_horiz; + } + + if (perspective.camera_shift_vert) { + toEdit.perspective.camera_shift_vert = dontforceSet && options.baBehav[ADDSET_PERSP_CAM_SHIFT] ? toEdit.perspective.camera_shift_vert + mods.perspective.camera_shift_vert : mods.perspective.camera_shift_vert; + } + + if (perspective.camera_yaw) { + toEdit.perspective.camera_yaw = dontforceSet && options.baBehav[ADDSET_PERSP_CAM_ANGLE] ? toEdit.perspective.camera_yaw + mods.perspective.camera_yaw : mods.perspective.camera_yaw; + } + + if (perspective.projection_pitch) { + toEdit.perspective.projection_pitch = dontforceSet && options.baBehav[ADDSET_PERSP_PROJ_ANGLE] ? toEdit.perspective.projection_pitch + mods.perspective.projection_pitch : mods.perspective.projection_pitch; + } + + if (perspective.projection_rotate) { + toEdit.perspective.projection_rotate = dontforceSet && options.baBehav[ADDSET_PERSP_PROJ_ROTATE] ? toEdit.perspective.projection_rotate + mods.perspective.projection_rotate : mods.perspective.projection_rotate; + } + + if (perspective.projection_shift_horiz) { + toEdit.perspective.projection_shift_horiz = dontforceSet && options.baBehav[ADDSET_PERSP_PROJ_SHIFT] ? toEdit.perspective.projection_shift_horiz + mods.perspective.projection_shift_horiz : mods.perspective.projection_shift_horiz; + } + + if (perspective.projection_shift_vert) { + toEdit.perspective.projection_shift_vert = dontforceSet && options.baBehav[ADDSET_PERSP_PROJ_SHIFT] ? toEdit.perspective.projection_shift_vert + mods.perspective.projection_shift_vert : mods.perspective.projection_shift_vert; + } + + if (perspective.projection_yaw) { + toEdit.perspective.projection_yaw = dontforceSet && options.baBehav[ADDSET_PERSP_PROJ_ANGLE] ? toEdit.perspective.projection_yaw + mods.perspective.projection_yaw : mods.perspective.projection_yaw; + } + + if (perspective.control_lines) { + toEdit.perspective.control_line_values = mods.perspective.control_line_values; + toEdit.perspective.control_line_types = mods.perspective.control_line_types; + } + if (gradient.enabled) { toEdit.gradient.enabled = mods.gradient.enabled; } @@ -2341,6 +3492,2733 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.gradient.centerY = dontforceSet && options.baBehav[ADDSET_GRADIENT_CENTER] ? toEdit.gradient.centerY + mods.gradient.centerY : mods.gradient.centerY; } + + if (locallab.enabled) { + toEdit.locallab.enabled = mods.locallab.enabled; + + // In that case, locallab is impacted by the combine: + // Resizing locallab spots vector according to pedited + toEdit.locallab.spots.resize(locallab.spots.size()); + } + + if (locallab.selspot) { + toEdit.locallab.selspot = mods.locallab.selspot; + } + + // Updating each locallab spot according to pedited + for (size_t i = 0; i < toEdit.locallab.spots.size() && i < mods.locallab.spots.size() && i < locallab.spots.size(); i++) { + // Control spot settings + if (locallab.spots.at(i).name) { + toEdit.locallab.spots.at(i).name = mods.locallab.spots.at(i).name; + } + + if (locallab.spots.at(i).isvisible) { + toEdit.locallab.spots.at(i).isvisible = mods.locallab.spots.at(i).isvisible; + } + + if (locallab.spots.at(i).prevMethod) { + toEdit.locallab.spots.at(i).prevMethod = mods.locallab.spots.at(i).prevMethod; + } + + if (locallab.spots.at(i).shape) { + toEdit.locallab.spots.at(i).shape = mods.locallab.spots.at(i).shape; + } + + if (locallab.spots.at(i).spotMethod) { + toEdit.locallab.spots.at(i).spotMethod = mods.locallab.spots.at(i).spotMethod; + } + + if (locallab.spots.at(i).wavMethod) { + toEdit.locallab.spots.at(i).wavMethod = mods.locallab.spots.at(i).wavMethod; + } + + if (locallab.spots.at(i).sensiexclu) { + toEdit.locallab.spots.at(i).sensiexclu = mods.locallab.spots.at(i).sensiexclu; + } + + if (locallab.spots.at(i).structexclu) { + toEdit.locallab.spots.at(i).structexclu = mods.locallab.spots.at(i).structexclu; + } + + if (locallab.spots.at(i).struc) { + toEdit.locallab.spots.at(i).struc = mods.locallab.spots.at(i).struc; + } + + if (locallab.spots.at(i).shapeMethod) { + toEdit.locallab.spots.at(i).shapeMethod = mods.locallab.spots.at(i).shapeMethod; + } + + if (locallab.spots.at(i).avoidgamutMethod) { + toEdit.locallab.spots.at(i).avoidgamutMethod = mods.locallab.spots.at(i).avoidgamutMethod; + } + + if (locallab.spots.at(i).loc) { + toEdit.locallab.spots.at(i).loc = mods.locallab.spots.at(i).loc; + } + + if (locallab.spots.at(i).centerX) { + toEdit.locallab.spots.at(i).centerX = mods.locallab.spots.at(i).centerX; + } + + if (locallab.spots.at(i).centerY) { + toEdit.locallab.spots.at(i).centerY = mods.locallab.spots.at(i).centerY; + } + + if (locallab.spots.at(i).circrad) { + toEdit.locallab.spots.at(i).circrad = mods.locallab.spots.at(i).circrad; + } + + if (locallab.spots.at(i).qualityMethod) { + toEdit.locallab.spots.at(i).qualityMethod = mods.locallab.spots.at(i).qualityMethod; + } + + if (locallab.spots.at(i).complexMethod) { + toEdit.locallab.spots.at(i).complexMethod = mods.locallab.spots.at(i).complexMethod; + } + + if (locallab.spots.at(i).transit) { + toEdit.locallab.spots.at(i).transit = mods.locallab.spots.at(i).transit; + } + + if (locallab.spots.at(i).feather) { + toEdit.locallab.spots.at(i).feather = mods.locallab.spots.at(i).feather; + } + + if (locallab.spots.at(i).thresh) { + toEdit.locallab.spots.at(i).thresh = mods.locallab.spots.at(i).thresh; + } + + if (locallab.spots.at(i).iter) { + toEdit.locallab.spots.at(i).iter = mods.locallab.spots.at(i).iter; + } + + if (locallab.spots.at(i).balan) { + toEdit.locallab.spots.at(i).balan = mods.locallab.spots.at(i).balan; + } + + if (locallab.spots.at(i).balanh) { + toEdit.locallab.spots.at(i).balanh = mods.locallab.spots.at(i).balanh; + } + + if (locallab.spots.at(i).colorde) { + toEdit.locallab.spots.at(i).colorde = mods.locallab.spots.at(i).colorde; + } + + if (locallab.spots.at(i).colorscope) { + toEdit.locallab.spots.at(i).colorscope = mods.locallab.spots.at(i).colorscope; + } + + if (locallab.spots.at(i).avoidrad) { + toEdit.locallab.spots.at(i).avoidrad = mods.locallab.spots.at(i).avoidrad; + } + + if (locallab.spots.at(i).transitweak) { + toEdit.locallab.spots.at(i).transitweak = mods.locallab.spots.at(i).transitweak; + } + + if (locallab.spots.at(i).transitgrad) { + toEdit.locallab.spots.at(i).transitgrad = mods.locallab.spots.at(i).transitgrad; + } + + if (locallab.spots.at(i).hishow) { + toEdit.locallab.spots.at(i).hishow = mods.locallab.spots.at(i).hishow; + } + + if (locallab.spots.at(i).activ) { + toEdit.locallab.spots.at(i).activ = mods.locallab.spots.at(i).activ; + } + + if (locallab.spots.at(i).blwh) { + toEdit.locallab.spots.at(i).blwh = mods.locallab.spots.at(i).blwh; + } + + if (locallab.spots.at(i).recurs) { + toEdit.locallab.spots.at(i).recurs = mods.locallab.spots.at(i).recurs; + } + + if (locallab.spots.at(i).laplac) { + toEdit.locallab.spots.at(i).laplac = mods.locallab.spots.at(i).laplac; + } + + if (locallab.spots.at(i).deltae) { + toEdit.locallab.spots.at(i).deltae = mods.locallab.spots.at(i).deltae; + } + + if (locallab.spots.at(i).shortc) { + toEdit.locallab.spots.at(i).shortc = mods.locallab.spots.at(i).shortc; + } + + if (locallab.spots.at(i).savrest) { + toEdit.locallab.spots.at(i).savrest = mods.locallab.spots.at(i).savrest; + } + + if (locallab.spots.at(i).denoichmask) { + toEdit.locallab.spots.at(i).denoichmask = mods.locallab.spots.at(i).denoichmask; + } + + if (locallab.spots.at(i).scopemask) { + toEdit.locallab.spots.at(i).scopemask = mods.locallab.spots.at(i).scopemask; + } + + if (locallab.spots.at(i).lumask) { + toEdit.locallab.spots.at(i).lumask = mods.locallab.spots.at(i).lumask; + } + + // Color & Light + if (locallab.spots.at(i).visicolor) { + toEdit.locallab.spots.at(i).visicolor = mods.locallab.spots.at(i).visicolor; + } + + if (locallab.spots.at(i).expcolor) { + toEdit.locallab.spots.at(i).expcolor = mods.locallab.spots.at(i).expcolor; + } + + if (locallab.spots.at(i).complexcolor) { + toEdit.locallab.spots.at(i).complexcolor = mods.locallab.spots.at(i).complexcolor; + } + + if (locallab.spots.at(i).curvactiv) { + toEdit.locallab.spots.at(i).curvactiv = mods.locallab.spots.at(i).curvactiv; + } + + if (locallab.spots.at(i).lightness) { + toEdit.locallab.spots.at(i).lightness = mods.locallab.spots.at(i).lightness; + } + + if (locallab.spots.at(i).reparcol) { + toEdit.locallab.spots.at(i).reparcol = mods.locallab.spots.at(i).reparcol; + } + + if (locallab.spots.at(i).gamc) { + toEdit.locallab.spots.at(i).gamc = mods.locallab.spots.at(i).gamc; + } + + if (locallab.spots.at(i).contrast) { + toEdit.locallab.spots.at(i).contrast = mods.locallab.spots.at(i).contrast; + } + + if (locallab.spots.at(i).chroma) { + toEdit.locallab.spots.at(i).chroma = mods.locallab.spots.at(i).chroma; + } + + if (locallab.spots.at(i).labgridALow) { + toEdit.locallab.spots.at(i).labgridALow = mods.locallab.spots.at(i).labgridALow; + } + + if (locallab.spots.at(i).labgridBLow) { + toEdit.locallab.spots.at(i).labgridBLow = mods.locallab.spots.at(i).labgridBLow; + } + + if (locallab.spots.at(i).labgridAHigh) { + toEdit.locallab.spots.at(i).labgridAHigh = mods.locallab.spots.at(i).labgridAHigh; + } + + if (locallab.spots.at(i).labgridBHigh) { + toEdit.locallab.spots.at(i).labgridBHigh = mods.locallab.spots.at(i).labgridBHigh; + } + + if (locallab.spots.at(i).labgridALowmerg) { + toEdit.locallab.spots.at(i).labgridALowmerg = mods.locallab.spots.at(i).labgridALowmerg; + } + + if (locallab.spots.at(i).labgridBLowmerg) { + toEdit.locallab.spots.at(i).labgridBLowmerg = mods.locallab.spots.at(i).labgridBLowmerg; + } + + if (locallab.spots.at(i).labgridAHighmerg) { + toEdit.locallab.spots.at(i).labgridAHighmerg = mods.locallab.spots.at(i).labgridAHighmerg; + } + + if (locallab.spots.at(i).labgridBHighmerg) { + toEdit.locallab.spots.at(i).labgridBHighmerg = mods.locallab.spots.at(i).labgridBHighmerg; + } + + if (locallab.spots.at(i).strengthgrid) { + toEdit.locallab.spots.at(i).strengthgrid = mods.locallab.spots.at(i).strengthgrid; + } + + if (locallab.spots.at(i).sensi) { + toEdit.locallab.spots.at(i).sensi = mods.locallab.spots.at(i).sensi; + } + + if (locallab.spots.at(i).structcol) { + toEdit.locallab.spots.at(i).structcol = mods.locallab.spots.at(i).structcol; + } + + if (locallab.spots.at(i).strcol) { + toEdit.locallab.spots.at(i).strcol = mods.locallab.spots.at(i).strcol; + } + + if (locallab.spots.at(i).strcolab) { + toEdit.locallab.spots.at(i).strcolab = mods.locallab.spots.at(i).strcolab; + } + + if (locallab.spots.at(i).strcolh) { + toEdit.locallab.spots.at(i).strcolh = mods.locallab.spots.at(i).strcolh; + } + + if (locallab.spots.at(i).angcol) { + toEdit.locallab.spots.at(i).angcol = mods.locallab.spots.at(i).angcol; + } + + if (locallab.spots.at(i).blurcolde) { + toEdit.locallab.spots.at(i).blurcolde = mods.locallab.spots.at(i).blurcolde; + } + + if (locallab.spots.at(i).blurcol) { + toEdit.locallab.spots.at(i).blurcol = mods.locallab.spots.at(i).blurcol; + } + + if (locallab.spots.at(i).contcol) { + toEdit.locallab.spots.at(i).contcol = mods.locallab.spots.at(i).contcol; + } + + if (locallab.spots.at(i).blendmaskcol) { + toEdit.locallab.spots.at(i).blendmaskcol = mods.locallab.spots.at(i).blendmaskcol; + } + + if (locallab.spots.at(i).radmaskcol) { + toEdit.locallab.spots.at(i).radmaskcol = mods.locallab.spots.at(i).radmaskcol; + } + + if (locallab.spots.at(i).chromaskcol) { + toEdit.locallab.spots.at(i).chromaskcol = mods.locallab.spots.at(i).chromaskcol; + } + + if (locallab.spots.at(i).gammaskcol) { + toEdit.locallab.spots.at(i).gammaskcol = mods.locallab.spots.at(i).gammaskcol; + } + + if (locallab.spots.at(i).slomaskcol) { + toEdit.locallab.spots.at(i).slomaskcol = mods.locallab.spots.at(i).slomaskcol; + } + + if (locallab.spots.at(i).shadmaskcol) { + toEdit.locallab.spots.at(i).shadmaskcol = mods.locallab.spots.at(i).shadmaskcol; + } + + if (locallab.spots.at(i).strumaskcol) { + toEdit.locallab.spots.at(i).strumaskcol = mods.locallab.spots.at(i).strumaskcol; + } + + if (locallab.spots.at(i).lapmaskcol) { + toEdit.locallab.spots.at(i).lapmaskcol = mods.locallab.spots.at(i).lapmaskcol; + } + + if (locallab.spots.at(i).qualitycurveMethod) { + toEdit.locallab.spots.at(i).qualitycurveMethod = mods.locallab.spots.at(i).qualitycurveMethod; + } + + if (locallab.spots.at(i).gridMethod) { + toEdit.locallab.spots.at(i).gridMethod = mods.locallab.spots.at(i).gridMethod; + } + + if (locallab.spots.at(i).merMethod) { + toEdit.locallab.spots.at(i).merMethod = mods.locallab.spots.at(i).merMethod; + } + + if (locallab.spots.at(i).toneMethod) { + toEdit.locallab.spots.at(i).toneMethod = mods.locallab.spots.at(i).toneMethod; + } + + if (locallab.spots.at(i).mergecolMethod) { + toEdit.locallab.spots.at(i).mergecolMethod = mods.locallab.spots.at(i).mergecolMethod; + } + + if (locallab.spots.at(i).llcurve) { + toEdit.locallab.spots.at(i).llcurve = mods.locallab.spots.at(i).llcurve; + } + + if (locallab.spots.at(i).lccurve) { + toEdit.locallab.spots.at(i).lccurve = mods.locallab.spots.at(i).lccurve; + } + + if (locallab.spots.at(i).cccurve) { + toEdit.locallab.spots.at(i).cccurve = mods.locallab.spots.at(i).cccurve; + } + + if (locallab.spots.at(i).clcurve) { + toEdit.locallab.spots.at(i).clcurve = mods.locallab.spots.at(i).clcurve; + } + + if (locallab.spots.at(i).rgbcurve) { + toEdit.locallab.spots.at(i).rgbcurve = mods.locallab.spots.at(i).rgbcurve; + } + + if (locallab.spots.at(i).LHcurve) { + toEdit.locallab.spots.at(i).LHcurve = mods.locallab.spots.at(i).LHcurve; + } + + if (locallab.spots.at(i).HHcurve) { + toEdit.locallab.spots.at(i).HHcurve = mods.locallab.spots.at(i).HHcurve; + } + + if (locallab.spots.at(i).CHcurve) { + toEdit.locallab.spots.at(i).CHcurve = mods.locallab.spots.at(i).CHcurve; + } + + if (locallab.spots.at(i).invers) { + toEdit.locallab.spots.at(i).invers = mods.locallab.spots.at(i).invers; + } + + if (locallab.spots.at(i).special) { + toEdit.locallab.spots.at(i).special = mods.locallab.spots.at(i).special; + } + + if (locallab.spots.at(i).toolcol) { + toEdit.locallab.spots.at(i).toolcol = mods.locallab.spots.at(i).toolcol; + } + + if (locallab.spots.at(i).enaColorMask) { + toEdit.locallab.spots.at(i).enaColorMask = mods.locallab.spots.at(i).enaColorMask; + } + + if (locallab.spots.at(i).fftColorMask) { + toEdit.locallab.spots.at(i).fftColorMask = mods.locallab.spots.at(i).fftColorMask; + } + + if (locallab.spots.at(i).CCmaskcurve) { + toEdit.locallab.spots.at(i).CCmaskcurve = mods.locallab.spots.at(i).CCmaskcurve; + } + + if (locallab.spots.at(i).LLmaskcurve) { + toEdit.locallab.spots.at(i).LLmaskcurve = mods.locallab.spots.at(i).LLmaskcurve; + } + + if (locallab.spots.at(i).HHmaskcurve) { + toEdit.locallab.spots.at(i).HHmaskcurve = mods.locallab.spots.at(i).HHmaskcurve; + } + + if (locallab.spots.at(i).HHhmaskcurve) { + toEdit.locallab.spots.at(i).HHhmaskcurve = mods.locallab.spots.at(i).HHhmaskcurve; + } + + if (locallab.spots.at(i).softradiuscol) { + toEdit.locallab.spots.at(i).softradiuscol = mods.locallab.spots.at(i).softradiuscol; + } + + if (locallab.spots.at(i).opacol) { + toEdit.locallab.spots.at(i).opacol = mods.locallab.spots.at(i).opacol; + } + + if (locallab.spots.at(i).mercol) { + toEdit.locallab.spots.at(i).mercol = mods.locallab.spots.at(i).mercol; + } + + if (locallab.spots.at(i).merlucol) { + toEdit.locallab.spots.at(i).merlucol = mods.locallab.spots.at(i).merlucol; + } + + if (locallab.spots.at(i).conthrcol) { + toEdit.locallab.spots.at(i).conthrcol = mods.locallab.spots.at(i).conthrcol; + } + + if (locallab.spots.at(i).Lmaskcurve) { + toEdit.locallab.spots.at(i).Lmaskcurve = mods.locallab.spots.at(i).Lmaskcurve; + } + + if (locallab.spots.at(i).LLmaskcolcurvewav) { + toEdit.locallab.spots.at(i).LLmaskcolcurvewav = mods.locallab.spots.at(i).LLmaskcolcurvewav; + } + + if (locallab.spots.at(i).csthresholdcol) { + toEdit.locallab.spots.at(i).csthresholdcol = mods.locallab.spots.at(i).csthresholdcol; + } + + if (locallab.spots.at(i).recothresc) { + toEdit.locallab.spots.at(i).recothresc = mods.locallab.spots.at(i).recothresc; + } + + if (locallab.spots.at(i).lowthresc) { + toEdit.locallab.spots.at(i).lowthresc = mods.locallab.spots.at(i).lowthresc; + } + + if (locallab.spots.at(i).higthresc) { + toEdit.locallab.spots.at(i).higthresc = mods.locallab.spots.at(i).higthresc; + } + + if (locallab.spots.at(i).decayc) { + toEdit.locallab.spots.at(i).decayc = mods.locallab.spots.at(i).decayc; + } + + // Exposure + if (locallab.spots.at(i).visiexpose) { + toEdit.locallab.spots.at(i).visiexpose = mods.locallab.spots.at(i).visiexpose; + } + + if (locallab.spots.at(i).expexpose) { + toEdit.locallab.spots.at(i).expexpose = mods.locallab.spots.at(i).expexpose; + } + + if (locallab.spots.at(i).complexexpose) { + toEdit.locallab.spots.at(i).complexexpose = mods.locallab.spots.at(i).complexexpose; + } + + if (locallab.spots.at(i).expcomp) { + toEdit.locallab.spots.at(i).expcomp = mods.locallab.spots.at(i).expcomp; + } + + if (locallab.spots.at(i).hlcompr) { + toEdit.locallab.spots.at(i).hlcompr = mods.locallab.spots.at(i).hlcompr; + } + + if (locallab.spots.at(i).hlcomprthresh) { + toEdit.locallab.spots.at(i).hlcomprthresh = mods.locallab.spots.at(i).hlcomprthresh; + } + + if (locallab.spots.at(i).black) { + toEdit.locallab.spots.at(i).black = mods.locallab.spots.at(i).black; + } + + if (locallab.spots.at(i).shadex) { + toEdit.locallab.spots.at(i).shadex = mods.locallab.spots.at(i).shadex; + } + + if (locallab.spots.at(i).shcompr) { + toEdit.locallab.spots.at(i).shcompr = mods.locallab.spots.at(i).shcompr; + } + + if (locallab.spots.at(i).expchroma) { + toEdit.locallab.spots.at(i).expchroma = mods.locallab.spots.at(i).expchroma; + } + + if (locallab.spots.at(i).sensiex) { + toEdit.locallab.spots.at(i).sensiex = mods.locallab.spots.at(i).sensiex; + } + + if (locallab.spots.at(i).structexp) { + toEdit.locallab.spots.at(i).structexp = mods.locallab.spots.at(i).structexp; + } + + if (locallab.spots.at(i).gamex) { + toEdit.locallab.spots.at(i).gamex = mods.locallab.spots.at(i).gamex; + } + + if (locallab.spots.at(i).blurexpde) { + toEdit.locallab.spots.at(i).blurexpde = mods.locallab.spots.at(i).blurexpde; + } + + if (locallab.spots.at(i).gamex) { + toEdit.locallab.spots.at(i).gamex = mods.locallab.spots.at(i).gamex; + } + + if (locallab.spots.at(i).strexp) { + toEdit.locallab.spots.at(i).strexp = mods.locallab.spots.at(i).strexp; + } + + if (locallab.spots.at(i).angexp) { + toEdit.locallab.spots.at(i).angexp = mods.locallab.spots.at(i).angexp; + } + + if (locallab.spots.at(i).excurve) { + toEdit.locallab.spots.at(i).excurve = mods.locallab.spots.at(i).excurve; + } + + if (locallab.spots.at(i).norm) { + toEdit.locallab.spots.at(i).norm = mods.locallab.spots.at(i).norm; + } + + if (locallab.spots.at(i).inversex) { + toEdit.locallab.spots.at(i).inversex = mods.locallab.spots.at(i).inversex; + } + + if (locallab.spots.at(i).enaExpMask) { + toEdit.locallab.spots.at(i).enaExpMask = mods.locallab.spots.at(i).enaExpMask; + } + + if (locallab.spots.at(i).enaExpMaskaft) { + toEdit.locallab.spots.at(i).enaExpMaskaft = mods.locallab.spots.at(i).enaExpMaskaft; + } + + if (locallab.spots.at(i).CCmaskexpcurve) { + toEdit.locallab.spots.at(i).CCmaskexpcurve = mods.locallab.spots.at(i).CCmaskexpcurve; + } + + if (locallab.spots.at(i).LLmaskexpcurve) { + toEdit.locallab.spots.at(i).LLmaskexpcurve = mods.locallab.spots.at(i).LLmaskexpcurve; + } + + if (locallab.spots.at(i).HHmaskexpcurve) { + toEdit.locallab.spots.at(i).HHmaskexpcurve = mods.locallab.spots.at(i).HHmaskexpcurve; + } + + if (locallab.spots.at(i).blendmaskexp) { + toEdit.locallab.spots.at(i).blendmaskexp = mods.locallab.spots.at(i).blendmaskexp; + } + + if (locallab.spots.at(i).radmaskexp) { + toEdit.locallab.spots.at(i).radmaskexp = mods.locallab.spots.at(i).radmaskexp; + } + + if (locallab.spots.at(i).chromaskexp) { + toEdit.locallab.spots.at(i).chromaskexp = mods.locallab.spots.at(i).chromaskexp; + } + + if (locallab.spots.at(i).gammaskexp) { + toEdit.locallab.spots.at(i).gammaskexp = mods.locallab.spots.at(i).gammaskexp; + } + + if (locallab.spots.at(i).slomaskexp) { + toEdit.locallab.spots.at(i).slomaskexp = mods.locallab.spots.at(i).slomaskexp; + } + + if (locallab.spots.at(i).lapmaskexp) { + toEdit.locallab.spots.at(i).lapmaskexp = mods.locallab.spots.at(i).lapmaskexp; + } + + if (locallab.spots.at(i).strmaskexp) { + toEdit.locallab.spots.at(i).strmaskexp = mods.locallab.spots.at(i).strmaskexp; + } + + if (locallab.spots.at(i).angmaskexp) { + toEdit.locallab.spots.at(i).angmaskexp = mods.locallab.spots.at(i).angmaskexp; + } + + if (locallab.spots.at(i).softradiusexp) { + toEdit.locallab.spots.at(i).softradiusexp = mods.locallab.spots.at(i).softradiusexp; + } + + if (locallab.spots.at(i).Lmaskexpcurve) { + toEdit.locallab.spots.at(i).Lmaskexpcurve = mods.locallab.spots.at(i).Lmaskexpcurve; + } + + if (locallab.spots.at(i).expMethod) { + toEdit.locallab.spots.at(i).expMethod = mods.locallab.spots.at(i).expMethod; + } + + if (locallab.spots.at(i).exnoiseMethod) { + toEdit.locallab.spots.at(i).exnoiseMethod = mods.locallab.spots.at(i).exnoiseMethod; + } + + if (locallab.spots.at(i).laplacexp) { + toEdit.locallab.spots.at(i).laplacexp = mods.locallab.spots.at(i).laplacexp; + } + + if (locallab.spots.at(i).laplacexp) { + toEdit.locallab.spots.at(i).laplacexp = mods.locallab.spots.at(i).laplacexp; + } + + if (locallab.spots.at(i).reparexp) { + toEdit.locallab.spots.at(i).reparexp = mods.locallab.spots.at(i).reparexp; + } + + if (locallab.spots.at(i).linear) { + toEdit.locallab.spots.at(i).linear = mods.locallab.spots.at(i).linear; + } + + if (locallab.spots.at(i).gamm) { + toEdit.locallab.spots.at(i).gamm = mods.locallab.spots.at(i).gamm; + } + + if (locallab.spots.at(i).fatamount) { + toEdit.locallab.spots.at(i).fatamount = mods.locallab.spots.at(i).fatamount; + } + + if (locallab.spots.at(i).fatdetail) { + toEdit.locallab.spots.at(i).fatdetail = mods.locallab.spots.at(i).fatdetail; + } + + if (locallab.spots.at(i).fatanchor) { + toEdit.locallab.spots.at(i).fatanchor = mods.locallab.spots.at(i).fatanchor; + } + + if (locallab.spots.at(i).fatlevel) { + toEdit.locallab.spots.at(i).fatlevel = mods.locallab.spots.at(i).fatlevel; + } + + if (locallab.spots.at(i).recothrese) { + toEdit.locallab.spots.at(i).recothrese = mods.locallab.spots.at(i).recothrese; + } + + if (locallab.spots.at(i).lowthrese) { + toEdit.locallab.spots.at(i).lowthrese = mods.locallab.spots.at(i).lowthrese; + } + + if (locallab.spots.at(i).higthrese) { + toEdit.locallab.spots.at(i).higthrese = mods.locallab.spots.at(i).higthrese; + } + + if (locallab.spots.at(i).decaye) { + toEdit.locallab.spots.at(i).decaye = mods.locallab.spots.at(i).decaye; + } + + // Shadow highlight + if (locallab.spots.at(i).visishadhigh) { + toEdit.locallab.spots.at(i).visishadhigh = mods.locallab.spots.at(i).visishadhigh; + } + + if (locallab.spots.at(i).expshadhigh) { + toEdit.locallab.spots.at(i).expshadhigh = mods.locallab.spots.at(i).expshadhigh; + } + + if (locallab.spots.at(i).complexshadhigh) { + toEdit.locallab.spots.at(i).complexshadhigh = mods.locallab.spots.at(i).complexshadhigh; + } + + if (locallab.spots.at(i).shMethod) { + toEdit.locallab.spots.at(i).shMethod = mods.locallab.spots.at(i).shMethod; + } + + for (int j = 0; j < 5; j++) { + if (locallab.spots.at(i).multsh[j]) { + toEdit.locallab.spots.at(i).multsh[j] = mods.locallab.spots.at(i).multsh[j]; + } + } + + if (locallab.spots.at(i).highlights) { + toEdit.locallab.spots.at(i).highlights = mods.locallab.spots.at(i).highlights; + } + + if (locallab.spots.at(i).h_tonalwidth) { + toEdit.locallab.spots.at(i).h_tonalwidth = mods.locallab.spots.at(i).h_tonalwidth; + } + + if (locallab.spots.at(i).shadows) { + toEdit.locallab.spots.at(i).shadows = mods.locallab.spots.at(i).shadows; + } + + if (locallab.spots.at(i).s_tonalwidth) { + toEdit.locallab.spots.at(i).s_tonalwidth = mods.locallab.spots.at(i).s_tonalwidth; + } + + if (locallab.spots.at(i).sh_radius) { + toEdit.locallab.spots.at(i).sh_radius = mods.locallab.spots.at(i).sh_radius; + } + + if (locallab.spots.at(i).sensihs) { + toEdit.locallab.spots.at(i).sensihs = mods.locallab.spots.at(i).sensihs; + } + + if (locallab.spots.at(i).enaSHMask) { + toEdit.locallab.spots.at(i).enaSHMask = mods.locallab.spots.at(i).enaSHMask; + } + + if (locallab.spots.at(i).CCmaskSHcurve) { + toEdit.locallab.spots.at(i).CCmaskSHcurve = mods.locallab.spots.at(i).CCmaskSHcurve; + } + + if (locallab.spots.at(i).LLmaskSHcurve) { + toEdit.locallab.spots.at(i).LLmaskSHcurve = mods.locallab.spots.at(i).LLmaskSHcurve; + } + + if (locallab.spots.at(i).HHmaskSHcurve) { + toEdit.locallab.spots.at(i).HHmaskSHcurve = mods.locallab.spots.at(i).HHmaskSHcurve; + } + + if (locallab.spots.at(i).blendmaskSH) { + toEdit.locallab.spots.at(i).blendmaskSH = mods.locallab.spots.at(i).blendmaskSH; + } + + if (locallab.spots.at(i).radmaskSH) { + toEdit.locallab.spots.at(i).radmaskSH = mods.locallab.spots.at(i).radmaskSH; + } + + if (locallab.spots.at(i).blurSHde) { + toEdit.locallab.spots.at(i).blurSHde = mods.locallab.spots.at(i).blurSHde; + } + + if (locallab.spots.at(i).strSH) { + toEdit.locallab.spots.at(i).strSH = mods.locallab.spots.at(i).strSH; + } + + if (locallab.spots.at(i).angSH) { + toEdit.locallab.spots.at(i).angSH = mods.locallab.spots.at(i).angSH; + } + + if (locallab.spots.at(i).inverssh) { + toEdit.locallab.spots.at(i).inverssh = mods.locallab.spots.at(i).inverssh; + } + + if (locallab.spots.at(i).chromaskSH) { + toEdit.locallab.spots.at(i).chromaskSH = mods.locallab.spots.at(i).chromaskSH; + } + + if (locallab.spots.at(i).gammaskSH) { + toEdit.locallab.spots.at(i).gammaskSH = mods.locallab.spots.at(i).gammaskSH; + } + + if (locallab.spots.at(i).slomaskSH) { + toEdit.locallab.spots.at(i).slomaskSH = mods.locallab.spots.at(i).slomaskSH; + } + + if (locallab.spots.at(i).lapmaskSH) { + toEdit.locallab.spots.at(i).lapmaskSH = mods.locallab.spots.at(i).lapmaskSH; + } + + if (locallab.spots.at(i).detailSH) { + toEdit.locallab.spots.at(i).detailSH = mods.locallab.spots.at(i).detailSH; + } + + if (locallab.spots.at(i).tePivot) { + toEdit.locallab.spots.at(i).tePivot = mods.locallab.spots.at(i).tePivot; + } + + if (locallab.spots.at(i).reparsh) { + toEdit.locallab.spots.at(i).reparsh = mods.locallab.spots.at(i).reparsh; + } + + if (locallab.spots.at(i).LmaskSHcurve) { + toEdit.locallab.spots.at(i).LmaskSHcurve = mods.locallab.spots.at(i).LmaskSHcurve; + } + + if (locallab.spots.at(i).fatamountSH) { + toEdit.locallab.spots.at(i).fatamountSH = mods.locallab.spots.at(i).fatamountSH; + } + + if (locallab.spots.at(i).fatanchorSH) { + toEdit.locallab.spots.at(i).fatanchorSH = mods.locallab.spots.at(i).fatanchorSH; + } + + if (locallab.spots.at(i).gamSH) { + toEdit.locallab.spots.at(i).gamSH = mods.locallab.spots.at(i).gamSH; + } + + if (locallab.spots.at(i).sloSH) { + toEdit.locallab.spots.at(i).sloSH = mods.locallab.spots.at(i).sloSH; + } + + if (locallab.spots.at(i).recothress) { + toEdit.locallab.spots.at(i).recothress = mods.locallab.spots.at(i).recothress; + } + + if (locallab.spots.at(i).lowthress) { + toEdit.locallab.spots.at(i).lowthress = mods.locallab.spots.at(i).lowthress; + } + + if (locallab.spots.at(i).higthress) { + toEdit.locallab.spots.at(i).higthress = mods.locallab.spots.at(i).higthress; + } + + if (locallab.spots.at(i).decays) { + toEdit.locallab.spots.at(i).decays = mods.locallab.spots.at(i).decays; + } + + // Vibrance + if (locallab.spots.at(i).visivibrance) { + toEdit.locallab.spots.at(i).visivibrance = mods.locallab.spots.at(i).visivibrance; + } + + if (locallab.spots.at(i).expvibrance) { + toEdit.locallab.spots.at(i).expvibrance = mods.locallab.spots.at(i).expvibrance; + } + + if (locallab.spots.at(i).complexvibrance) { + toEdit.locallab.spots.at(i).complexvibrance = mods.locallab.spots.at(i).complexvibrance; + } + + if (locallab.spots.at(i).saturated) { + toEdit.locallab.spots.at(i).saturated = mods.locallab.spots.at(i).saturated; + } + + if (locallab.spots.at(i).pastels) { + toEdit.locallab.spots.at(i).pastels = mods.locallab.spots.at(i).pastels; + } + + if (locallab.spots.at(i).vibgam) { + toEdit.locallab.spots.at(i).vibgam = mods.locallab.spots.at(i).vibgam; + } + + if (locallab.spots.at(i).warm) { + toEdit.locallab.spots.at(i).warm = mods.locallab.spots.at(i).warm; + } + + if (locallab.spots.at(i).psthreshold) { + toEdit.locallab.spots.at(i).psthreshold = mods.locallab.spots.at(i).psthreshold; + } + + if (locallab.spots.at(i).protectskins) { + toEdit.locallab.spots.at(i).protectskins = mods.locallab.spots.at(i).protectskins; + } + + if (locallab.spots.at(i).avoidcolorshift) { + toEdit.locallab.spots.at(i).avoidcolorshift = mods.locallab.spots.at(i).avoidcolorshift; + } + + if (locallab.spots.at(i).pastsattog) { + toEdit.locallab.spots.at(i).pastsattog = mods.locallab.spots.at(i).pastsattog; + } + + if (locallab.spots.at(i).sensiv) { + toEdit.locallab.spots.at(i).sensiv = mods.locallab.spots.at(i).sensiv; + } + + if (locallab.spots.at(i).skintonescurve) { + toEdit.locallab.spots.at(i).skintonescurve = mods.locallab.spots.at(i).skintonescurve; + } + + if (locallab.spots.at(i).CCmaskvibcurve) { + toEdit.locallab.spots.at(i).CCmaskvibcurve = mods.locallab.spots.at(i).CCmaskvibcurve; + } + + if (locallab.spots.at(i).LLmaskvibcurve) { + toEdit.locallab.spots.at(i).LLmaskvibcurve = mods.locallab.spots.at(i).LLmaskvibcurve; + } + + if (locallab.spots.at(i).HHmaskvibcurve) { + toEdit.locallab.spots.at(i).HHmaskvibcurve = mods.locallab.spots.at(i).HHmaskvibcurve; + } + + if (locallab.spots.at(i).enavibMask) { + toEdit.locallab.spots.at(i).enavibMask = mods.locallab.spots.at(i).enavibMask; + } + + if (locallab.spots.at(i).blendmaskvib) { + toEdit.locallab.spots.at(i).blendmaskvib = mods.locallab.spots.at(i).blendmaskvib; + } + + if (locallab.spots.at(i).radmaskvib) { + toEdit.locallab.spots.at(i).radmaskvib = mods.locallab.spots.at(i).radmaskvib; + } + + if (locallab.spots.at(i).chromaskvib) { + toEdit.locallab.spots.at(i).chromaskvib = mods.locallab.spots.at(i).chromaskvib; + } + + if (locallab.spots.at(i).gammaskvib) { + toEdit.locallab.spots.at(i).gammaskvib = mods.locallab.spots.at(i).gammaskvib; + } + + if (locallab.spots.at(i).slomaskvib) { + toEdit.locallab.spots.at(i).slomaskvib = mods.locallab.spots.at(i).slomaskvib; + } + + if (locallab.spots.at(i).lapmaskvib) { + toEdit.locallab.spots.at(i).lapmaskvib = mods.locallab.spots.at(i).lapmaskvib; + } + + if (locallab.spots.at(i).strvib) { + toEdit.locallab.spots.at(i).strvib = mods.locallab.spots.at(i).strvib; + } + + if (locallab.spots.at(i).strvibab) { + toEdit.locallab.spots.at(i).strvibab = mods.locallab.spots.at(i).strvibab; + } + + if (locallab.spots.at(i).strvibh) { + toEdit.locallab.spots.at(i).strvibh = mods.locallab.spots.at(i).strvibh; + } + + if (locallab.spots.at(i).angvib) { + toEdit.locallab.spots.at(i).angvib = mods.locallab.spots.at(i).angvib; + } + + if (locallab.spots.at(i).Lmaskvibcurve) { + toEdit.locallab.spots.at(i).Lmaskvibcurve = mods.locallab.spots.at(i).Lmaskvibcurve; + } + + if (locallab.spots.at(i).recothresv) { + toEdit.locallab.spots.at(i).recothresv = mods.locallab.spots.at(i).recothresv; + } + + if (locallab.spots.at(i).lowthresv) { + toEdit.locallab.spots.at(i).lowthresv = mods.locallab.spots.at(i).lowthresv; + } + + if (locallab.spots.at(i).higthresv) { + toEdit.locallab.spots.at(i).higthresv = mods.locallab.spots.at(i).higthresv; + } + + if (locallab.spots.at(i).decayv) { + toEdit.locallab.spots.at(i).decayv = mods.locallab.spots.at(i).decayv; + } + + // Soft Light + if (locallab.spots.at(i).visisoft) { + toEdit.locallab.spots.at(i).visisoft = mods.locallab.spots.at(i).visisoft; + } + + if (locallab.spots.at(i).expsoft) { + toEdit.locallab.spots.at(i).expsoft = mods.locallab.spots.at(i).expsoft; + } + + if (locallab.spots.at(i).complexsoft) { + toEdit.locallab.spots.at(i).complexsoft = mods.locallab.spots.at(i).complexsoft; + } + + if (locallab.spots.at(i).streng) { + toEdit.locallab.spots.at(i).streng = mods.locallab.spots.at(i).streng; + } + + if (locallab.spots.at(i).sensisf) { + toEdit.locallab.spots.at(i).sensisf = mods.locallab.spots.at(i).sensisf; + } + + if (locallab.spots.at(i).laplace) { + toEdit.locallab.spots.at(i).laplace = mods.locallab.spots.at(i).laplace; + } + + if (locallab.spots.at(i).softMethod) { + toEdit.locallab.spots.at(i).softMethod = mods.locallab.spots.at(i).softMethod; + } + + // Blur & Noise + if (locallab.spots.at(i).visiblur) { + toEdit.locallab.spots.at(i).visiblur = mods.locallab.spots.at(i).visiblur; + } + + if (locallab.spots.at(i).expblur) { + toEdit.locallab.spots.at(i).expblur = mods.locallab.spots.at(i).expblur; + } + + if (locallab.spots.at(i).complexblur) { + toEdit.locallab.spots.at(i).complexblur = mods.locallab.spots.at(i).complexblur; + } + + if (locallab.spots.at(i).radius) { + toEdit.locallab.spots.at(i).radius = mods.locallab.spots.at(i).radius; + } + + if (locallab.spots.at(i).strength) { + toEdit.locallab.spots.at(i).strength = mods.locallab.spots.at(i).strength; + } + + if (locallab.spots.at(i).sensibn) { + toEdit.locallab.spots.at(i).sensibn = mods.locallab.spots.at(i).sensibn; + } + + if (locallab.spots.at(i).itera) { + toEdit.locallab.spots.at(i).itera = mods.locallab.spots.at(i).itera; + } + + if (locallab.spots.at(i).guidbl) { + toEdit.locallab.spots.at(i).guidbl = mods.locallab.spots.at(i).guidbl; + } + + if (locallab.spots.at(i).strbl) { + toEdit.locallab.spots.at(i).strbl = mods.locallab.spots.at(i).strbl; + } + + if (locallab.spots.at(i).recothres) { + toEdit.locallab.spots.at(i).recothres = mods.locallab.spots.at(i).recothres; + } + + if (locallab.spots.at(i).lowthres) { + toEdit.locallab.spots.at(i).lowthres = mods.locallab.spots.at(i).lowthres; + } + + if (locallab.spots.at(i).higthres) { + toEdit.locallab.spots.at(i).higthres = mods.locallab.spots.at(i).higthres; + } + + if (locallab.spots.at(i).recothresd) { + toEdit.locallab.spots.at(i).recothresd = mods.locallab.spots.at(i).recothresd; + } + + if (locallab.spots.at(i).lowthresd) { + toEdit.locallab.spots.at(i).lowthresd = mods.locallab.spots.at(i).lowthresd; + } + + if (locallab.spots.at(i).midthresd) { + toEdit.locallab.spots.at(i).midthresd = mods.locallab.spots.at(i).midthresd; + } + + if (locallab.spots.at(i).midthresdch) { + toEdit.locallab.spots.at(i).midthresdch = mods.locallab.spots.at(i).midthresdch; + } + + if (locallab.spots.at(i).higthresd) { + toEdit.locallab.spots.at(i).higthresd = mods.locallab.spots.at(i).higthresd; + } + + if (locallab.spots.at(i).decayd) { + toEdit.locallab.spots.at(i).decayd = mods.locallab.spots.at(i).decayd; + } + + if (locallab.spots.at(i).isogr) { + toEdit.locallab.spots.at(i).isogr = mods.locallab.spots.at(i).isogr; + } + + if (locallab.spots.at(i).strengr) { + toEdit.locallab.spots.at(i).strengr = mods.locallab.spots.at(i).strengr; + } + + if (locallab.spots.at(i).scalegr) { + toEdit.locallab.spots.at(i).scalegr = mods.locallab.spots.at(i).scalegr; + } + + if (locallab.spots.at(i).divgr) { + toEdit.locallab.spots.at(i).divgr = mods.locallab.spots.at(i).divgr; + } + + if (locallab.spots.at(i).epsbl) { + toEdit.locallab.spots.at(i).epsbl = mods.locallab.spots.at(i).epsbl; + } + + if (locallab.spots.at(i).blMethod) { + toEdit.locallab.spots.at(i).blMethod = mods.locallab.spots.at(i).blMethod; + } + + if (locallab.spots.at(i).chroMethod) { + toEdit.locallab.spots.at(i).chroMethod = mods.locallab.spots.at(i).chroMethod; + } + + if (locallab.spots.at(i).quamethod) { + toEdit.locallab.spots.at(i).quamethod = mods.locallab.spots.at(i).quamethod; + } + + if (locallab.spots.at(i).blurMethod) { + toEdit.locallab.spots.at(i).blurMethod = mods.locallab.spots.at(i).blurMethod; + } + + if (locallab.spots.at(i).usemask) { + toEdit.locallab.spots.at(i).usemask = mods.locallab.spots.at(i).usemask; + } + + if (locallab.spots.at(i).invmaskd) { + toEdit.locallab.spots.at(i).invmaskd = mods.locallab.spots.at(i).invmaskd; + } + + if (locallab.spots.at(i).invmask) { + toEdit.locallab.spots.at(i).invmask = mods.locallab.spots.at(i).invmask; + } + + if (locallab.spots.at(i).levelthr) { + toEdit.locallab.spots.at(i).levelthr = mods.locallab.spots.at(i).levelthr; + } + + if (locallab.spots.at(i).lnoiselow) { + toEdit.locallab.spots.at(i).lnoiselow = mods.locallab.spots.at(i).lnoiselow; + } + + if (locallab.spots.at(i).levelthrlow) { + toEdit.locallab.spots.at(i).levelthrlow = mods.locallab.spots.at(i).levelthrlow; + } + + if (locallab.spots.at(i).medMethod) { + toEdit.locallab.spots.at(i).medMethod = mods.locallab.spots.at(i).medMethod; + } + + if (locallab.spots.at(i).activlum) { + toEdit.locallab.spots.at(i).activlum = mods.locallab.spots.at(i).activlum; + } + + if (locallab.spots.at(i).noiselumf) { + toEdit.locallab.spots.at(i).noiselumf = mods.locallab.spots.at(i).noiselumf; + } + + if (locallab.spots.at(i).noiselumf0) { + toEdit.locallab.spots.at(i).noiselumf0 = mods.locallab.spots.at(i).noiselumf0; + } + + if (locallab.spots.at(i).noiselumf2) { + toEdit.locallab.spots.at(i).noiselumf2 = mods.locallab.spots.at(i).noiselumf2; + } + + if (locallab.spots.at(i).noiselumc) { + toEdit.locallab.spots.at(i).noiselumc = mods.locallab.spots.at(i).noiselumc; + } + + if (locallab.spots.at(i).noiselumdetail) { + toEdit.locallab.spots.at(i).noiselumdetail = mods.locallab.spots.at(i).noiselumdetail; + } + + if (locallab.spots.at(i).noiselequal) { + toEdit.locallab.spots.at(i).noiselequal = mods.locallab.spots.at(i).noiselequal; + } + + if (locallab.spots.at(i).noisegam) { + toEdit.locallab.spots.at(i).noisegam = mods.locallab.spots.at(i).noisegam; + } + + if (locallab.spots.at(i).noisechrof) { + toEdit.locallab.spots.at(i).noisechrof = mods.locallab.spots.at(i).noisechrof; + } + + if (locallab.spots.at(i).noisechroc) { + toEdit.locallab.spots.at(i).noisechroc = mods.locallab.spots.at(i).noisechroc; + } + + if (locallab.spots.at(i).noisechrodetail) { + toEdit.locallab.spots.at(i).noisechrodetail = mods.locallab.spots.at(i).noisechrodetail; + } + + if (locallab.spots.at(i).adjblur) { + toEdit.locallab.spots.at(i).adjblur = mods.locallab.spots.at(i).adjblur; + } + + if (locallab.spots.at(i).bilateral) { + toEdit.locallab.spots.at(i).bilateral = mods.locallab.spots.at(i).bilateral; + } + + if (locallab.spots.at(i).nlstr) { + toEdit.locallab.spots.at(i).nlstr = mods.locallab.spots.at(i).nlstr; + } + + if (locallab.spots.at(i).nldet) { + toEdit.locallab.spots.at(i).nldet = mods.locallab.spots.at(i).nldet; + } + + if (locallab.spots.at(i).nlpat) { + toEdit.locallab.spots.at(i).nlpat = mods.locallab.spots.at(i).nlpat; + } + + if (locallab.spots.at(i).nlrad) { + toEdit.locallab.spots.at(i).nlrad = mods.locallab.spots.at(i).nlrad; + } + + if (locallab.spots.at(i).nlgam) { + toEdit.locallab.spots.at(i).nlgam = mods.locallab.spots.at(i).nlgam; + } + + if (locallab.spots.at(i).sensiden) { + toEdit.locallab.spots.at(i).sensiden = mods.locallab.spots.at(i).sensiden; + } + + if (locallab.spots.at(i).reparden) { + toEdit.locallab.spots.at(i).reparden = mods.locallab.spots.at(i).reparden; + } + + if (locallab.spots.at(i).detailthr) { + toEdit.locallab.spots.at(i).detailthr = mods.locallab.spots.at(i).detailthr; + } + + if (locallab.spots.at(i).locwavcurveden) { + toEdit.locallab.spots.at(i).locwavcurveden = mods.locallab.spots.at(i).locwavcurveden; + } + + if (locallab.spots.at(i).locwavcurvehue) { + toEdit.locallab.spots.at(i).locwavcurvehue = mods.locallab.spots.at(i).locwavcurvehue; + } + + + if (locallab.spots.at(i).showmaskblMethodtyp) { + toEdit.locallab.spots.at(i).showmaskblMethodtyp = mods.locallab.spots.at(i).showmaskblMethodtyp; + } + + if (locallab.spots.at(i).CCmaskblcurve) { + toEdit.locallab.spots.at(i).CCmaskblcurve = mods.locallab.spots.at(i).CCmaskblcurve; + } + + if (locallab.spots.at(i).LLmaskblcurve) { + toEdit.locallab.spots.at(i).LLmaskblcurve = mods.locallab.spots.at(i).LLmaskblcurve; + } + + if (locallab.spots.at(i).HHmaskblcurve) { + toEdit.locallab.spots.at(i).HHmaskblcurve = mods.locallab.spots.at(i).HHmaskblcurve; + } + + if (locallab.spots.at(i).enablMask) { + toEdit.locallab.spots.at(i).enablMask = mods.locallab.spots.at(i).enablMask; + } + + if (locallab.spots.at(i).fftwbl) { + toEdit.locallab.spots.at(i).fftwbl = mods.locallab.spots.at(i).fftwbl; + } + + if (locallab.spots.at(i).invbl) { + toEdit.locallab.spots.at(i).invbl = mods.locallab.spots.at(i).invbl; + } + + if (locallab.spots.at(i).toolbl) { + toEdit.locallab.spots.at(i).toolbl = mods.locallab.spots.at(i).toolbl; + } + + if (locallab.spots.at(i).blendmaskbl) { + toEdit.locallab.spots.at(i).blendmaskbl = mods.locallab.spots.at(i).blendmaskbl; + } + + if (locallab.spots.at(i).radmaskbl) { + toEdit.locallab.spots.at(i).radmaskbl = mods.locallab.spots.at(i).radmaskbl; + } + + if (locallab.spots.at(i).chromaskbl) { + toEdit.locallab.spots.at(i).chromaskbl = mods.locallab.spots.at(i).chromaskbl; + } + + if (locallab.spots.at(i).gammaskbl) { + toEdit.locallab.spots.at(i).gammaskbl = mods.locallab.spots.at(i).gammaskbl; + } + + if (locallab.spots.at(i).slomaskbl) { + toEdit.locallab.spots.at(i).slomaskbl = mods.locallab.spots.at(i).slomaskbl; + } + + if (locallab.spots.at(i).lapmaskbl) { + toEdit.locallab.spots.at(i).lapmaskbl = mods.locallab.spots.at(i).lapmaskbl; + } + + if (locallab.spots.at(i).shadmaskbl) { + toEdit.locallab.spots.at(i).shadmaskbl = mods.locallab.spots.at(i).shadmaskbl; + } + + if (locallab.spots.at(i).shadmaskblsha) { + toEdit.locallab.spots.at(i).shadmaskblsha = mods.locallab.spots.at(i).shadmaskblsha; + } + + if (locallab.spots.at(i).strumaskbl) { + toEdit.locallab.spots.at(i).strumaskbl = mods.locallab.spots.at(i).strumaskbl; + } + + if (locallab.spots.at(i).Lmaskblcurve) { + toEdit.locallab.spots.at(i).Lmaskblcurve = mods.locallab.spots.at(i).Lmaskblcurve; + } + + if (locallab.spots.at(i).LLmaskblcurvewav) { + toEdit.locallab.spots.at(i).LLmaskblcurvewav = mods.locallab.spots.at(i).LLmaskblcurvewav; + } + + if (locallab.spots.at(i).csthresholdblur) { + toEdit.locallab.spots.at(i).csthresholdblur = mods.locallab.spots.at(i).csthresholdblur; + } + + // Tone Mapping + if (locallab.spots.at(i).visitonemap) { + toEdit.locallab.spots.at(i).visitonemap = mods.locallab.spots.at(i).visitonemap; + } + + if (locallab.spots.at(i).exptonemap) { + toEdit.locallab.spots.at(i).exptonemap = mods.locallab.spots.at(i).exptonemap; + } + + if (locallab.spots.at(i).complextonemap) { + toEdit.locallab.spots.at(i).complextonemap = mods.locallab.spots.at(i).complextonemap; + } + + if (locallab.spots.at(i).stren) { + toEdit.locallab.spots.at(i).stren = mods.locallab.spots.at(i).stren; + } + + if (locallab.spots.at(i).gamma) { + toEdit.locallab.spots.at(i).gamma = mods.locallab.spots.at(i).gamma; + } + + if (locallab.spots.at(i).estop) { + toEdit.locallab.spots.at(i).estop = mods.locallab.spots.at(i).estop; + } + + if (locallab.spots.at(i).scaltm) { + toEdit.locallab.spots.at(i).scaltm = mods.locallab.spots.at(i).scaltm; + } + + if (locallab.spots.at(i).repartm) { + toEdit.locallab.spots.at(i).repartm = mods.locallab.spots.at(i).repartm; + } + + if (locallab.spots.at(i).rewei) { + toEdit.locallab.spots.at(i).rewei = mods.locallab.spots.at(i).rewei; + } + + if (locallab.spots.at(i).satur) { + toEdit.locallab.spots.at(i).satur = mods.locallab.spots.at(i).satur; + } + + if (locallab.spots.at(i).sensitm) { + toEdit.locallab.spots.at(i).sensitm = mods.locallab.spots.at(i).sensitm; + } + + if (locallab.spots.at(i).softradiustm) { + toEdit.locallab.spots.at(i).softradiustm = mods.locallab.spots.at(i).softradiustm; + } + + if (locallab.spots.at(i).amount) { + toEdit.locallab.spots.at(i).amount = mods.locallab.spots.at(i).amount; + } + + if (locallab.spots.at(i).equiltm) { + toEdit.locallab.spots.at(i).equiltm = mods.locallab.spots.at(i).equiltm; + } + + if (locallab.spots.at(i).CCmasktmcurve) { + toEdit.locallab.spots.at(i).CCmasktmcurve = mods.locallab.spots.at(i).CCmasktmcurve; + } + + if (locallab.spots.at(i).LLmasktmcurve) { + toEdit.locallab.spots.at(i).LLmasktmcurve = mods.locallab.spots.at(i).LLmasktmcurve; + } + + if (locallab.spots.at(i).HHmasktmcurve) { + toEdit.locallab.spots.at(i).HHmasktmcurve = mods.locallab.spots.at(i).HHmasktmcurve; + } + + if (locallab.spots.at(i).enatmMask) { + toEdit.locallab.spots.at(i).enatmMask = mods.locallab.spots.at(i).enatmMask; + } + + if (locallab.spots.at(i).enatmMaskaft) { + toEdit.locallab.spots.at(i).enatmMaskaft = mods.locallab.spots.at(i).enatmMaskaft; + } + + if (locallab.spots.at(i).blendmasktm) { + toEdit.locallab.spots.at(i).blendmasktm = mods.locallab.spots.at(i).blendmasktm; + } + + if (locallab.spots.at(i).radmasktm) { + toEdit.locallab.spots.at(i).radmasktm = mods.locallab.spots.at(i).radmasktm; + } + + if (locallab.spots.at(i).chromasktm) { + toEdit.locallab.spots.at(i).chromasktm = mods.locallab.spots.at(i).chromasktm; + } + + if (locallab.spots.at(i).gammasktm) { + toEdit.locallab.spots.at(i).gammasktm = mods.locallab.spots.at(i).gammasktm; + } + + if (locallab.spots.at(i).slomasktm) { + toEdit.locallab.spots.at(i).slomasktm = mods.locallab.spots.at(i).slomasktm; + } + + if (locallab.spots.at(i).lapmasktm) { + toEdit.locallab.spots.at(i).lapmasktm = mods.locallab.spots.at(i).lapmasktm; + } + + if (locallab.spots.at(i).Lmasktmcurve) { + toEdit.locallab.spots.at(i).Lmasktmcurve = mods.locallab.spots.at(i).Lmasktmcurve; + } + + if (locallab.spots.at(i).recothrest) { + toEdit.locallab.spots.at(i).recothrest = mods.locallab.spots.at(i).recothrest; + } + + if (locallab.spots.at(i).lowthrest) { + toEdit.locallab.spots.at(i).lowthrest = mods.locallab.spots.at(i).lowthrest; + } + + if (locallab.spots.at(i).higthrest) { + toEdit.locallab.spots.at(i).higthrest = mods.locallab.spots.at(i).higthrest; + } + + if (locallab.spots.at(i).decayt) { + toEdit.locallab.spots.at(i).decayt = mods.locallab.spots.at(i).decayt; + } + + // Retinex + if (locallab.spots.at(i).visireti) { + toEdit.locallab.spots.at(i).visireti = mods.locallab.spots.at(i).visireti; + } + + if (locallab.spots.at(i).expreti) { + toEdit.locallab.spots.at(i).expreti = mods.locallab.spots.at(i).expreti; + } + + if (locallab.spots.at(i).complexreti) { + toEdit.locallab.spots.at(i).complexreti = mods.locallab.spots.at(i).complexreti; + } + + if (locallab.spots.at(i).retinexMethod) { + toEdit.locallab.spots.at(i).retinexMethod = mods.locallab.spots.at(i).retinexMethod; + } + + if (locallab.spots.at(i).str) { + toEdit.locallab.spots.at(i).str = mods.locallab.spots.at(i).str; + } + + if (locallab.spots.at(i).chrrt) { + toEdit.locallab.spots.at(i).chrrt = mods.locallab.spots.at(i).chrrt; + } + + if (locallab.spots.at(i).neigh) { + toEdit.locallab.spots.at(i).neigh = mods.locallab.spots.at(i).neigh; + } + + if (locallab.spots.at(i).vart) { + toEdit.locallab.spots.at(i).vart = mods.locallab.spots.at(i).vart; + } + + if (locallab.spots.at(i).offs) { + toEdit.locallab.spots.at(i).offs = mods.locallab.spots.at(i).offs; + } + + if (locallab.spots.at(i).dehaz) { + toEdit.locallab.spots.at(i).dehaz = mods.locallab.spots.at(i).dehaz; + } + + if (locallab.spots.at(i).depth) { + toEdit.locallab.spots.at(i).depth = mods.locallab.spots.at(i).depth; + } + + if (locallab.spots.at(i).sensih) { + toEdit.locallab.spots.at(i).sensih = mods.locallab.spots.at(i).sensih; + } + + if (locallab.spots.at(i).localTgaincurve) { + toEdit.locallab.spots.at(i).localTgaincurve = mods.locallab.spots.at(i).localTgaincurve; + } + + if (locallab.spots.at(i).localTtranscurve) { + toEdit.locallab.spots.at(i).localTtranscurve = mods.locallab.spots.at(i).localTtranscurve; + } + + if (locallab.spots.at(i).inversret) { + toEdit.locallab.spots.at(i).inversret = mods.locallab.spots.at(i).inversret; + } + + if (locallab.spots.at(i).equilret) { + toEdit.locallab.spots.at(i).equilret = mods.locallab.spots.at(i).equilret; + } + + if (locallab.spots.at(i).loglin) { + toEdit.locallab.spots.at(i).loglin = mods.locallab.spots.at(i).loglin; + } + + if (locallab.spots.at(i).dehazeSaturation) { + toEdit.locallab.spots.at(i).dehazeSaturation = mods.locallab.spots.at(i).dehazeSaturation; + } + + if (locallab.spots.at(i).softradiusret) { + toEdit.locallab.spots.at(i).softradiusret = mods.locallab.spots.at(i).softradiusret; + } + + if (locallab.spots.at(i).CCmaskreticurve) { + toEdit.locallab.spots.at(i).CCmaskreticurve = mods.locallab.spots.at(i).CCmaskreticurve; + } + + if (locallab.spots.at(i).LLmaskreticurve) { + toEdit.locallab.spots.at(i).LLmaskreticurve = mods.locallab.spots.at(i).LLmaskreticurve; + } + + if (locallab.spots.at(i).HHmaskreticurve) { + toEdit.locallab.spots.at(i).HHmaskreticurve = mods.locallab.spots.at(i).HHmaskreticurve; + } + + if (locallab.spots.at(i).enaretiMask) { + toEdit.locallab.spots.at(i).enaretiMask = mods.locallab.spots.at(i).enaretiMask; + } + + if (locallab.spots.at(i).enaretiMasktmap) { + toEdit.locallab.spots.at(i).enaretiMasktmap = mods.locallab.spots.at(i).enaretiMasktmap; + } + + if (locallab.spots.at(i).blendmaskreti) { + toEdit.locallab.spots.at(i).blendmaskreti = mods.locallab.spots.at(i).blendmaskreti; + } + + if (locallab.spots.at(i).radmaskreti) { + toEdit.locallab.spots.at(i).radmaskreti = mods.locallab.spots.at(i).radmaskreti; + } + + if (locallab.spots.at(i).chromaskreti) { + toEdit.locallab.spots.at(i).chromaskreti = mods.locallab.spots.at(i).chromaskreti; + } + + if (locallab.spots.at(i).gammaskreti) { + toEdit.locallab.spots.at(i).gammaskreti = mods.locallab.spots.at(i).gammaskreti; + } + + if (locallab.spots.at(i).slomaskreti) { + toEdit.locallab.spots.at(i).slomaskreti = mods.locallab.spots.at(i).slomaskreti; + } + + if (locallab.spots.at(i).lapmaskreti) { + toEdit.locallab.spots.at(i).lapmaskreti = mods.locallab.spots.at(i).lapmaskreti; + } + + if (locallab.spots.at(i).scalereti) { + toEdit.locallab.spots.at(i).scalereti = mods.locallab.spots.at(i).scalereti; + } + + if (locallab.spots.at(i).darkness) { + toEdit.locallab.spots.at(i).darkness = mods.locallab.spots.at(i).darkness; + } + + if (locallab.spots.at(i).lightnessreti) { + toEdit.locallab.spots.at(i).lightnessreti = mods.locallab.spots.at(i).lightnessreti; + } + + if (locallab.spots.at(i).limd) { + toEdit.locallab.spots.at(i).limd = mods.locallab.spots.at(i).limd; + } + + if (locallab.spots.at(i).cliptm) { + toEdit.locallab.spots.at(i).cliptm = mods.locallab.spots.at(i).cliptm; + } + + if (locallab.spots.at(i).fftwreti) { + toEdit.locallab.spots.at(i).fftwreti = mods.locallab.spots.at(i).fftwreti; + } + + if (locallab.spots.at(i).Lmaskreticurve) { + toEdit.locallab.spots.at(i).Lmaskreticurve = mods.locallab.spots.at(i).Lmaskreticurve; + } + + if (locallab.spots.at(i).recothresr) { + toEdit.locallab.spots.at(i).recothresr = mods.locallab.spots.at(i).recothresr; + } + + if (locallab.spots.at(i).lowthresr) { + toEdit.locallab.spots.at(i).lowthresr = mods.locallab.spots.at(i).lowthresr; + } + + if (locallab.spots.at(i).higthresr) { + toEdit.locallab.spots.at(i).higthresr = mods.locallab.spots.at(i).higthresr; + } + + if (locallab.spots.at(i).decayr) { + toEdit.locallab.spots.at(i).decayr = mods.locallab.spots.at(i).decayr; + } + + // Sharpening + if (locallab.spots.at(i).visisharp) { + toEdit.locallab.spots.at(i).visisharp = mods.locallab.spots.at(i).visisharp; + } + + if (locallab.spots.at(i).expsharp) { + toEdit.locallab.spots.at(i).expsharp = mods.locallab.spots.at(i).expsharp; + } + + if (locallab.spots.at(i).complexsharp) { + toEdit.locallab.spots.at(i).complexsharp = mods.locallab.spots.at(i).complexsharp; + } + + if (locallab.spots.at(i).sharcontrast) { + toEdit.locallab.spots.at(i).sharcontrast = mods.locallab.spots.at(i).sharcontrast; + } + + if (locallab.spots.at(i).sharradius) { + toEdit.locallab.spots.at(i).sharradius = mods.locallab.spots.at(i).sharradius; + } + + if (locallab.spots.at(i).sharamount) { + toEdit.locallab.spots.at(i).sharamount = mods.locallab.spots.at(i).sharamount; + } + + if (locallab.spots.at(i).shardamping) { + toEdit.locallab.spots.at(i).shardamping = mods.locallab.spots.at(i).shardamping; + } + + if (locallab.spots.at(i).shariter) { + toEdit.locallab.spots.at(i).shariter = mods.locallab.spots.at(i).shariter; + } + + if (locallab.spots.at(i).sharblur) { + toEdit.locallab.spots.at(i).sharblur = mods.locallab.spots.at(i).sharblur; + } + + if (locallab.spots.at(i).shargam) { + toEdit.locallab.spots.at(i).shargam = mods.locallab.spots.at(i).shargam; + } + + if (locallab.spots.at(i).sensisha) { + toEdit.locallab.spots.at(i).sensisha = mods.locallab.spots.at(i).sensisha; + } + + if (locallab.spots.at(i).inverssha) { + toEdit.locallab.spots.at(i).inverssha = mods.locallab.spots.at(i).inverssha; + } + + // Local Contrast + if (locallab.spots.at(i).visicontrast) { + toEdit.locallab.spots.at(i).visicontrast = mods.locallab.spots.at(i).visicontrast; + } + + if (locallab.spots.at(i).expcontrast) { + toEdit.locallab.spots.at(i).expcontrast = mods.locallab.spots.at(i).expcontrast; + } + + if (locallab.spots.at(i).complexcontrast) { + toEdit.locallab.spots.at(i).complexcontrast = mods.locallab.spots.at(i).complexcontrast; + } + + if (locallab.spots.at(i).lcradius) { + toEdit.locallab.spots.at(i).lcradius = mods.locallab.spots.at(i).lcradius; + } + + if (locallab.spots.at(i).lcamount) { + toEdit.locallab.spots.at(i).lcamount = mods.locallab.spots.at(i).lcamount; + } + + if (locallab.spots.at(i).lcdarkness) { + toEdit.locallab.spots.at(i).lcdarkness = mods.locallab.spots.at(i).lcdarkness; + } + + if (locallab.spots.at(i).lclightness) { + toEdit.locallab.spots.at(i).lclightness = mods.locallab.spots.at(i).lclightness; + } + + if (locallab.spots.at(i).sigmalc) { + toEdit.locallab.spots.at(i).sigmalc = mods.locallab.spots.at(i).sigmalc; + } + + if (locallab.spots.at(i).levelwav) { + toEdit.locallab.spots.at(i).levelwav = mods.locallab.spots.at(i).levelwav; + } + + if (locallab.spots.at(i).residcont) { + toEdit.locallab.spots.at(i).residcont = mods.locallab.spots.at(i).residcont; + } + + if (locallab.spots.at(i).residsha) { + toEdit.locallab.spots.at(i).residsha = mods.locallab.spots.at(i).residsha; + } + + if (locallab.spots.at(i).residshathr) { + toEdit.locallab.spots.at(i).residshathr = mods.locallab.spots.at(i).residshathr; + } + + if (locallab.spots.at(i).residhi) { + toEdit.locallab.spots.at(i).residhi = mods.locallab.spots.at(i).residhi; + } + + if (locallab.spots.at(i).residhithr) { + toEdit.locallab.spots.at(i).residhithr = mods.locallab.spots.at(i).residhithr; + } + + if (locallab.spots.at(i).gamlc) { + toEdit.locallab.spots.at(i).gamlc = mods.locallab.spots.at(i).gamlc; + } + + if (locallab.spots.at(i).residgam) { + toEdit.locallab.spots.at(i).residgam = mods.locallab.spots.at(i).residgam; + } + + if (locallab.spots.at(i).residslop) { + toEdit.locallab.spots.at(i).residslop = mods.locallab.spots.at(i).residslop; + } + + if (locallab.spots.at(i).residblur) { + toEdit.locallab.spots.at(i).residblur = mods.locallab.spots.at(i).residblur; + } + + if (locallab.spots.at(i).levelblur) { + toEdit.locallab.spots.at(i).levelblur = mods.locallab.spots.at(i).levelblur; + } + + if (locallab.spots.at(i).sigmabl) { + toEdit.locallab.spots.at(i).sigmabl = mods.locallab.spots.at(i).sigmabl; + } + + if (locallab.spots.at(i).residchro) { + toEdit.locallab.spots.at(i).residchro = mods.locallab.spots.at(i).residchro; + } + + if (locallab.spots.at(i).residcomp) { + toEdit.locallab.spots.at(i).residcomp = mods.locallab.spots.at(i).residcomp; + } + + + if (locallab.spots.at(i).sigma) { + toEdit.locallab.spots.at(i).sigma = mods.locallab.spots.at(i).sigma; + } + + if (locallab.spots.at(i).offset) { + toEdit.locallab.spots.at(i).offset = mods.locallab.spots.at(i).offset; + } + + if (locallab.spots.at(i).sigmadr) { + toEdit.locallab.spots.at(i).sigmadr = mods.locallab.spots.at(i).sigmadr; + } + + if (locallab.spots.at(i).threswav) { + toEdit.locallab.spots.at(i).threswav = mods.locallab.spots.at(i).threswav; + } + + if (locallab.spots.at(i).chromalev) { + toEdit.locallab.spots.at(i).chromalev = mods.locallab.spots.at(i).chromalev; + } + + if (locallab.spots.at(i).chromablu) { + toEdit.locallab.spots.at(i).chromablu = mods.locallab.spots.at(i).chromablu; + } + + if (locallab.spots.at(i).sigmadc) { + toEdit.locallab.spots.at(i).sigmadc = mods.locallab.spots.at(i).sigmadc; + } + + if (locallab.spots.at(i).deltad) { + toEdit.locallab.spots.at(i).deltad = mods.locallab.spots.at(i).deltad; + } + + if (locallab.spots.at(i).fatres) { + toEdit.locallab.spots.at(i).fatres = mods.locallab.spots.at(i).fatres; + } + + if (locallab.spots.at(i).clarilres) { + toEdit.locallab.spots.at(i).clarilres = mods.locallab.spots.at(i).clarilres; + } + + if (locallab.spots.at(i).claricres) { + toEdit.locallab.spots.at(i).claricres = mods.locallab.spots.at(i).claricres; + } + + if (locallab.spots.at(i).clarisoft) { + toEdit.locallab.spots.at(i).clarisoft = mods.locallab.spots.at(i).clarisoft; + } + + if (locallab.spots.at(i).sigmalc2) { + toEdit.locallab.spots.at(i).sigmalc2 = mods.locallab.spots.at(i).sigmalc2; + } + + if (locallab.spots.at(i).strwav) { + toEdit.locallab.spots.at(i).strwav = mods.locallab.spots.at(i).strwav; + } + + if (locallab.spots.at(i).angwav) { + toEdit.locallab.spots.at(i).angwav = mods.locallab.spots.at(i).angwav; + } + + if (locallab.spots.at(i).strengthw) { + toEdit.locallab.spots.at(i).strengthw = mods.locallab.spots.at(i).strengthw; + } + + if (locallab.spots.at(i).sigmaed) { + toEdit.locallab.spots.at(i).sigmaed = mods.locallab.spots.at(i).sigmaed; + } + + if (locallab.spots.at(i).radiusw) { + toEdit.locallab.spots.at(i).radiusw = mods.locallab.spots.at(i).radiusw; + } + + if (locallab.spots.at(i).detailw) { + toEdit.locallab.spots.at(i).detailw = mods.locallab.spots.at(i).detailw; + } + + if (locallab.spots.at(i).gradw) { + toEdit.locallab.spots.at(i).gradw = mods.locallab.spots.at(i).gradw; + } + + if (locallab.spots.at(i).tloww) { + toEdit.locallab.spots.at(i).tloww = mods.locallab.spots.at(i).tloww; + } + + if (locallab.spots.at(i).thigw) { + toEdit.locallab.spots.at(i).thigw = mods.locallab.spots.at(i).thigw; + } + + if (locallab.spots.at(i).edgw) { + toEdit.locallab.spots.at(i).edgw = mods.locallab.spots.at(i).edgw; + } + + if (locallab.spots.at(i).basew) { + toEdit.locallab.spots.at(i).basew = mods.locallab.spots.at(i).basew; + } + + if (locallab.spots.at(i).sensilc) { + toEdit.locallab.spots.at(i).sensilc = mods.locallab.spots.at(i).sensilc; + } + + if (locallab.spots.at(i).reparw) { + toEdit.locallab.spots.at(i).reparw = mods.locallab.spots.at(i).reparw; + } + + if (locallab.spots.at(i).fftwlc) { + toEdit.locallab.spots.at(i).fftwlc = mods.locallab.spots.at(i).fftwlc; + } + + if (locallab.spots.at(i).blurlc) { + toEdit.locallab.spots.at(i).blurlc = mods.locallab.spots.at(i).blurlc; + } + + if (locallab.spots.at(i).wavblur) { + toEdit.locallab.spots.at(i).wavblur = mods.locallab.spots.at(i).wavblur; + } + + if (locallab.spots.at(i).wavedg) { + toEdit.locallab.spots.at(i).wavedg = mods.locallab.spots.at(i).wavedg; + } + + if (locallab.spots.at(i).waveshow) { + toEdit.locallab.spots.at(i).waveshow = mods.locallab.spots.at(i).waveshow; + } + + if (locallab.spots.at(i).wavcont) { + toEdit.locallab.spots.at(i).wavcont = mods.locallab.spots.at(i).wavcont; + } + + if (locallab.spots.at(i).wavcomp) { + toEdit.locallab.spots.at(i).wavcomp = mods.locallab.spots.at(i).wavcomp; + } + + if (locallab.spots.at(i).wavgradl) { + toEdit.locallab.spots.at(i).wavgradl = mods.locallab.spots.at(i).wavgradl; + } + + if (locallab.spots.at(i).wavcompre) { + toEdit.locallab.spots.at(i).wavcompre = mods.locallab.spots.at(i).wavcompre; + } + + if (locallab.spots.at(i).origlc) { + toEdit.locallab.spots.at(i).origlc = mods.locallab.spots.at(i).origlc; + } + + if (locallab.spots.at(i).localcontMethod) { + toEdit.locallab.spots.at(i).localcontMethod = mods.locallab.spots.at(i).localcontMethod; + } + + if (locallab.spots.at(i).localedgMethod) { + toEdit.locallab.spots.at(i).localedgMethod = mods.locallab.spots.at(i).localedgMethod; + } + + if (locallab.spots.at(i).localneiMethod) { + toEdit.locallab.spots.at(i).localneiMethod = mods.locallab.spots.at(i).localneiMethod; + } + + if (locallab.spots.at(i).locwavcurve) { + toEdit.locallab.spots.at(i).locwavcurve = mods.locallab.spots.at(i).locwavcurve; + } + + if (locallab.spots.at(i).csthreshold) { + toEdit.locallab.spots.at(i).csthreshold = mods.locallab.spots.at(i).csthreshold; + } + + if (locallab.spots.at(i).loclevwavcurve) { + toEdit.locallab.spots.at(i).loclevwavcurve = mods.locallab.spots.at(i).loclevwavcurve; + } + + if (locallab.spots.at(i).locconwavcurve) { + toEdit.locallab.spots.at(i).locconwavcurve = mods.locallab.spots.at(i).locconwavcurve; + } + + if (locallab.spots.at(i).loccompwavcurve) { + toEdit.locallab.spots.at(i).loccompwavcurve = mods.locallab.spots.at(i).loccompwavcurve; + } + + if (locallab.spots.at(i).loccomprewavcurve) { + toEdit.locallab.spots.at(i).loccomprewavcurve = mods.locallab.spots.at(i).loccomprewavcurve; + } + + if (locallab.spots.at(i).locedgwavcurve) { + toEdit.locallab.spots.at(i).locedgwavcurve = mods.locallab.spots.at(i).locedgwavcurve; + } + + if (locallab.spots.at(i).CCmasklccurve) { + toEdit.locallab.spots.at(i).CCmasklccurve = mods.locallab.spots.at(i).CCmasklccurve; + } + + if (locallab.spots.at(i).LLmasklccurve) { + toEdit.locallab.spots.at(i).LLmasklccurve = mods.locallab.spots.at(i).LLmasklccurve; + } + + if (locallab.spots.at(i).HHmasklccurve) { + toEdit.locallab.spots.at(i).HHmasklccurve = mods.locallab.spots.at(i).HHmasklccurve; + } + + if (locallab.spots.at(i).enalcMask) { + toEdit.locallab.spots.at(i).enalcMask = mods.locallab.spots.at(i).enalcMask; + } + + if (locallab.spots.at(i).blendmasklc) { + toEdit.locallab.spots.at(i).blendmasklc = mods.locallab.spots.at(i).blendmasklc; + } + + if (locallab.spots.at(i).radmasklc) { + toEdit.locallab.spots.at(i).radmasklc = mods.locallab.spots.at(i).radmasklc; + } + + if (locallab.spots.at(i).chromasklc) { + toEdit.locallab.spots.at(i).chromasklc = mods.locallab.spots.at(i).chromasklc; + } + + if (locallab.spots.at(i).Lmasklccurve) { + toEdit.locallab.spots.at(i).Lmasklccurve = mods.locallab.spots.at(i).Lmasklccurve; + } + + if (locallab.spots.at(i).recothresw) { + toEdit.locallab.spots.at(i).recothresw = mods.locallab.spots.at(i).recothresw; + } + + if (locallab.spots.at(i).lowthresw) { + toEdit.locallab.spots.at(i).lowthresw = mods.locallab.spots.at(i).lowthresw; + } + + if (locallab.spots.at(i).higthresw) { + toEdit.locallab.spots.at(i).higthresw = mods.locallab.spots.at(i).higthresw; + } + + if (locallab.spots.at(i).decayw) { + toEdit.locallab.spots.at(i).decayw = mods.locallab.spots.at(i).decayw; + } + + // Contrast by detail levels + if (locallab.spots.at(i).visicbdl) { + toEdit.locallab.spots.at(i).visicbdl = mods.locallab.spots.at(i).visicbdl; + } + + if (locallab.spots.at(i).expcbdl) { + toEdit.locallab.spots.at(i).expcbdl = mods.locallab.spots.at(i).expcbdl; + } + + if (locallab.spots.at(i).complexcbdl) { + toEdit.locallab.spots.at(i).complexcbdl = mods.locallab.spots.at(i).complexcbdl; + } + + for (int j = 0; j < 6; j++) { + if (locallab.spots.at(i).mult[j]) { + toEdit.locallab.spots.at(i).mult[j] = mods.locallab.spots.at(i).mult[j]; + } + } + + if (locallab.spots.at(i).chromacbdl) { + toEdit.locallab.spots.at(i).chromacbdl = mods.locallab.spots.at(i).chromacbdl; + } + + if (locallab.spots.at(i).threshold) { + toEdit.locallab.spots.at(i).threshold = mods.locallab.spots.at(i).threshold; + } + + if (locallab.spots.at(i).sensicb) { + toEdit.locallab.spots.at(i).sensicb = mods.locallab.spots.at(i).sensicb; + } + + if (locallab.spots.at(i).clarityml) { + toEdit.locallab.spots.at(i).clarityml = mods.locallab.spots.at(i).clarityml; + } + + if (locallab.spots.at(i).contresid) { + toEdit.locallab.spots.at(i).contresid = mods.locallab.spots.at(i).contresid; + } + + if (locallab.spots.at(i).softradiuscb) { + toEdit.locallab.spots.at(i).softradiuscb = mods.locallab.spots.at(i).softradiuscb; + } + + if (locallab.spots.at(i).enacbMask) { + toEdit.locallab.spots.at(i).enacbMask = mods.locallab.spots.at(i).enacbMask; + } + + if (locallab.spots.at(i).CCmaskcbcurve) { + toEdit.locallab.spots.at(i).CCmaskcbcurve = mods.locallab.spots.at(i).CCmaskcbcurve; + } + + if (locallab.spots.at(i).LLmaskcbcurve) { + toEdit.locallab.spots.at(i).LLmaskcbcurve = mods.locallab.spots.at(i).LLmaskcbcurve; + } + + if (locallab.spots.at(i).HHmaskcbcurve) { + toEdit.locallab.spots.at(i).HHmaskcbcurve = mods.locallab.spots.at(i).HHmaskcbcurve; + } + + if (locallab.spots.at(i).blendmaskcb) { + toEdit.locallab.spots.at(i).blendmaskcb = mods.locallab.spots.at(i).blendmaskcb; + } + + if (locallab.spots.at(i).radmaskcb) { + toEdit.locallab.spots.at(i).radmaskcb = mods.locallab.spots.at(i).radmaskcb; + } + + if (locallab.spots.at(i).chromaskcb) { + toEdit.locallab.spots.at(i).chromaskcb = mods.locallab.spots.at(i).chromaskcb; + } + + if (locallab.spots.at(i).gammaskcb) { + toEdit.locallab.spots.at(i).gammaskcb = mods.locallab.spots.at(i).gammaskcb; + } + + if (locallab.spots.at(i).slomaskcb) { + toEdit.locallab.spots.at(i).slomaskcb = mods.locallab.spots.at(i).slomaskcb; + } + + if (locallab.spots.at(i).lapmaskcb) { + toEdit.locallab.spots.at(i).lapmaskcb = mods.locallab.spots.at(i).lapmaskcb; + } + + if (locallab.spots.at(i).Lmaskcbcurve) { + toEdit.locallab.spots.at(i).Lmaskcbcurve = mods.locallab.spots.at(i).Lmaskcbcurve; + } + + if (locallab.spots.at(i).recothrescb) { + toEdit.locallab.spots.at(i).recothrescb = mods.locallab.spots.at(i).recothrescb; + } + + if (locallab.spots.at(i).lowthrescb) { + toEdit.locallab.spots.at(i).lowthrescb = mods.locallab.spots.at(i).lowthrescb; + } + + if (locallab.spots.at(i).higthrescb) { + toEdit.locallab.spots.at(i).higthrescb = mods.locallab.spots.at(i).higthrescb; + } + + if (locallab.spots.at(i).decaycb) { + toEdit.locallab.spots.at(i).decaycb = mods.locallab.spots.at(i).decaycb; + } + + // Log encoding + if (locallab.spots.at(i).visilog) { + toEdit.locallab.spots.at(i).visilog = mods.locallab.spots.at(i).visilog; + } + + if (locallab.spots.at(i).explog) { + toEdit.locallab.spots.at(i).explog = mods.locallab.spots.at(i).explog; + } + + if (locallab.spots.at(i).complexlog) { + toEdit.locallab.spots.at(i).complexlog = mods.locallab.spots.at(i).complexlog; + } + + if (locallab.spots.at(i).autocompute) { + toEdit.locallab.spots.at(i).autocompute = mods.locallab.spots.at(i).autocompute; + } + + if (locallab.spots.at(i).sourceGray) { + toEdit.locallab.spots.at(i).sourceGray = mods.locallab.spots.at(i).sourceGray; + } + + if (locallab.spots.at(i).sourceabs) { + toEdit.locallab.spots.at(i).sourceabs = mods.locallab.spots.at(i).sourceabs; + } + + if (locallab.spots.at(i).targabs) { + toEdit.locallab.spots.at(i).targabs = mods.locallab.spots.at(i).targabs; + } + + if (locallab.spots.at(i).targetGray) { + toEdit.locallab.spots.at(i).targetGray = mods.locallab.spots.at(i).targetGray; + } + + if (locallab.spots.at(i).catad) { + toEdit.locallab.spots.at(i).catad = mods.locallab.spots.at(i).catad; + } + + if (locallab.spots.at(i).saturl) { + toEdit.locallab.spots.at(i).saturl = mods.locallab.spots.at(i).saturl; + } + + if (locallab.spots.at(i).chroml) { + toEdit.locallab.spots.at(i).chroml = mods.locallab.spots.at(i).chroml; + } + + if (locallab.spots.at(i).lightl) { + toEdit.locallab.spots.at(i).lightl = mods.locallab.spots.at(i).lightl; + } + + if (locallab.spots.at(i).lightq) { + toEdit.locallab.spots.at(i).lightq = mods.locallab.spots.at(i).lightq; + } + + if (locallab.spots.at(i).contl) { + toEdit.locallab.spots.at(i).contl = mods.locallab.spots.at(i).contl; + } + + if (locallab.spots.at(i).contthres) { + toEdit.locallab.spots.at(i).contthres = mods.locallab.spots.at(i).contthres; + } + + if (locallab.spots.at(i).contq) { + toEdit.locallab.spots.at(i).contq = mods.locallab.spots.at(i).contq; + } + + if (locallab.spots.at(i).colorfl) { + toEdit.locallab.spots.at(i).colorfl = mods.locallab.spots.at(i).colorfl; + } + + if (locallab.spots.at(i).LcurveL) { + toEdit.locallab.spots.at(i).LcurveL = mods.locallab.spots.at(i).LcurveL; + } + + if (locallab.spots.at(i).Autogray) { + toEdit.locallab.spots.at(i).Autogray = mods.locallab.spots.at(i).Autogray; + } + + if (locallab.spots.at(i).fullimage) { + toEdit.locallab.spots.at(i).fullimage = mods.locallab.spots.at(i).fullimage; + } + + if (locallab.spots.at(i).ciecam) { + toEdit.locallab.spots.at(i).ciecam = mods.locallab.spots.at(i).ciecam; + } + + if (locallab.spots.at(i).enaLMask) { + toEdit.locallab.spots.at(i).enaLMask = mods.locallab.spots.at(i).enaLMask; + } + + if (locallab.spots.at(i).repar) { + toEdit.locallab.spots.at(i).repar = mods.locallab.spots.at(i).repar; + } + + if (locallab.spots.at(i).blackEv) { + toEdit.locallab.spots.at(i).blackEv = mods.locallab.spots.at(i).blackEv; + } + + if (locallab.spots.at(i).whiteEv) { + toEdit.locallab.spots.at(i).whiteEv = mods.locallab.spots.at(i).whiteEv; + } + + if (locallab.spots.at(i).detail) { + toEdit.locallab.spots.at(i).detail = mods.locallab.spots.at(i).detail; + } + + if (locallab.spots.at(i).sensilog) { + toEdit.locallab.spots.at(i).sensilog = mods.locallab.spots.at(i).sensilog; + } + + if (locallab.spots.at(i).baselog) { + toEdit.locallab.spots.at(i).baselog = mods.locallab.spots.at(i).baselog; + } + + if (locallab.spots.at(i).sursour) { + toEdit.locallab.spots.at(i).sursour = mods.locallab.spots.at(i).sursour; + } + + if (locallab.spots.at(i).surround) { + toEdit.locallab.spots.at(i).surround = mods.locallab.spots.at(i).surround; + } + + if (locallab.spots.at(i).strlog) { + toEdit.locallab.spots.at(i).strlog = mods.locallab.spots.at(i).strlog; + } + + if (locallab.spots.at(i).anglog) { + toEdit.locallab.spots.at(i).anglog = mods.locallab.spots.at(i).anglog; + } + + if (locallab.spots.at(i).CCmaskcurveL) { + toEdit.locallab.spots.at(i).CCmaskcurveL = mods.locallab.spots.at(i).CCmaskcurveL; + } + + if (locallab.spots.at(i).LLmaskcurveL) { + toEdit.locallab.spots.at(i).LLmaskcurveL = mods.locallab.spots.at(i).LLmaskcurveL; + } + + if (locallab.spots.at(i).HHmaskcurveL) { + toEdit.locallab.spots.at(i).HHmaskcurveL = mods.locallab.spots.at(i).HHmaskcurveL; + } + + if (locallab.spots.at(i).blendmaskL) { + toEdit.locallab.spots.at(i).blendmaskL = mods.locallab.spots.at(i).blendmaskL; + } + + if (locallab.spots.at(i).radmaskL) { + toEdit.locallab.spots.at(i).radmaskL = mods.locallab.spots.at(i).radmaskL; + } + + if (locallab.spots.at(i).chromaskL) { + toEdit.locallab.spots.at(i).chromaskL = mods.locallab.spots.at(i).chromaskL; + } + + if (locallab.spots.at(i).LmaskcurveL) { + toEdit.locallab.spots.at(i).LmaskcurveL = mods.locallab.spots.at(i).LmaskcurveL; + } + + if (locallab.spots.at(i).recothresl) { + toEdit.locallab.spots.at(i).recothresl = mods.locallab.spots.at(i).recothresl; + } + + if (locallab.spots.at(i).lowthresl) { + toEdit.locallab.spots.at(i).lowthresl = mods.locallab.spots.at(i).lowthresl; + } + + if (locallab.spots.at(i).higthresl) { + toEdit.locallab.spots.at(i).higthresl = mods.locallab.spots.at(i).higthresl; + } + + if (locallab.spots.at(i).decayl) { + toEdit.locallab.spots.at(i).decayl = mods.locallab.spots.at(i).decayl; + } + + // mask + if (locallab.spots.at(i).visimask) { + toEdit.locallab.spots.at(i).visimask = mods.locallab.spots.at(i).visimask; + } + + if (locallab.spots.at(i).complexmask) { + toEdit.locallab.spots.at(i).complexmask = mods.locallab.spots.at(i).complexmask; + } + + if (locallab.spots.at(i).expmask) { + toEdit.locallab.spots.at(i).expmask = mods.locallab.spots.at(i).expmask; + } + + if (locallab.spots.at(i).sensimask) { + toEdit.locallab.spots.at(i).sensimask = mods.locallab.spots.at(i).sensimask; + } + + if (locallab.spots.at(i).blendmask) { + toEdit.locallab.spots.at(i).blendmask = mods.locallab.spots.at(i).blendmask; + } + + if (locallab.spots.at(i).blendmaskab) { + toEdit.locallab.spots.at(i).blendmaskab = mods.locallab.spots.at(i).blendmaskab; + } + + if (locallab.spots.at(i).softradiusmask) { + toEdit.locallab.spots.at(i).softradiusmask = mods.locallab.spots.at(i).softradiusmask; + } + + if (locallab.spots.at(i).enamask) { + toEdit.locallab.spots.at(i).enamask = mods.locallab.spots.at(i).enamask; + } + + if (locallab.spots.at(i).fftmask) { + toEdit.locallab.spots.at(i).fftmask = mods.locallab.spots.at(i).fftmask; + } + + if (locallab.spots.at(i).blurmask) { + toEdit.locallab.spots.at(i).blurmask = mods.locallab.spots.at(i).blurmask; + } + + if (locallab.spots.at(i).contmask) { + toEdit.locallab.spots.at(i).contmask = mods.locallab.spots.at(i).contmask; + } + + if (locallab.spots.at(i).CCmask_curve) { + toEdit.locallab.spots.at(i).CCmask_curve = mods.locallab.spots.at(i).CCmask_curve; + } + + if (locallab.spots.at(i).LLmask_curve) { + toEdit.locallab.spots.at(i).LLmask_curve = mods.locallab.spots.at(i).LLmask_curve; + } + + if (locallab.spots.at(i).HHmask_curve) { + toEdit.locallab.spots.at(i).HHmask_curve = mods.locallab.spots.at(i).HHmask_curve; + } + + if (locallab.spots.at(i).strumaskmask) { + toEdit.locallab.spots.at(i).strumaskmask = mods.locallab.spots.at(i).strumaskmask; + } + + if (locallab.spots.at(i).toolmask) { + toEdit.locallab.spots.at(i).toolmask = mods.locallab.spots.at(i).toolmask; + } + + if (locallab.spots.at(i).radmask) { + toEdit.locallab.spots.at(i).radmask = mods.locallab.spots.at(i).radmask; + } + + if (locallab.spots.at(i).lapmask) { + toEdit.locallab.spots.at(i).lapmask = mods.locallab.spots.at(i).lapmask; + } + + if (locallab.spots.at(i).chromask) { + toEdit.locallab.spots.at(i).chromask = mods.locallab.spots.at(i).chromask; + } + + if (locallab.spots.at(i).gammask) { + toEdit.locallab.spots.at(i).gammask = mods.locallab.spots.at(i).gammask; + } + + if (locallab.spots.at(i).slopmask) { + toEdit.locallab.spots.at(i).slopmask = mods.locallab.spots.at(i).slopmask; + } + + if (locallab.spots.at(i).shadmask) { + toEdit.locallab.spots.at(i).shadmask = mods.locallab.spots.at(i).shadmask; + } + + if (locallab.spots.at(i).str_mask) { + toEdit.locallab.spots.at(i).str_mask = mods.locallab.spots.at(i).str_mask; + } + + if (locallab.spots.at(i).ang_mask) { + toEdit.locallab.spots.at(i).ang_mask = mods.locallab.spots.at(i).ang_mask; + } + + if (locallab.spots.at(i).HHhmask_curve) { + toEdit.locallab.spots.at(i).HHhmask_curve = mods.locallab.spots.at(i).HHhmask_curve; + } + + if (locallab.spots.at(i).Lmask_curve) { + toEdit.locallab.spots.at(i).Lmask_curve = mods.locallab.spots.at(i).Lmask_curve; + } + + if (locallab.spots.at(i).LLmask_curvewav) { + toEdit.locallab.spots.at(i).LLmask_curvewav = mods.locallab.spots.at(i).LLmask_curvewav; + } + + if (locallab.spots.at(i).csthresholdmask) { + toEdit.locallab.spots.at(i).csthresholdmask = mods.locallab.spots.at(i).csthresholdmask; + } + + //ciecam + if (locallab.spots.at(i).visicie) { + toEdit.locallab.spots.at(i).visicie = mods.locallab.spots.at(i).visicie; + } + + if (locallab.spots.at(i).expcie) { + toEdit.locallab.spots.at(i).expcie = mods.locallab.spots.at(i).expcie; + } + + if (locallab.spots.at(i).complexcie) { + toEdit.locallab.spots.at(i).complexcie = mods.locallab.spots.at(i).complexcie; + } + + if (locallab.spots.at(i).reparcie) { + toEdit.locallab.spots.at(i).reparcie = mods.locallab.spots.at(i).reparcie; + } + + if (locallab.spots.at(i).sensicie) { + toEdit.locallab.spots.at(i).sensicie = mods.locallab.spots.at(i).sensicie; + } + + if (locallab.spots.at(i).Autograycie) { + toEdit.locallab.spots.at(i).Autograycie = mods.locallab.spots.at(i).Autograycie; + } + + if (locallab.spots.at(i).forcejz) { + toEdit.locallab.spots.at(i).forcejz = mods.locallab.spots.at(i).forcejz; + } + + if (locallab.spots.at(i).forcebw) { + toEdit.locallab.spots.at(i).forcebw = mods.locallab.spots.at(i).forcebw; + } + + if (locallab.spots.at(i).qtoj) { + toEdit.locallab.spots.at(i).qtoj = mods.locallab.spots.at(i).qtoj; + } + + if (locallab.spots.at(i).jabcie) { + toEdit.locallab.spots.at(i).jabcie = mods.locallab.spots.at(i).jabcie; + } + + if (locallab.spots.at(i).sigmoidqjcie) { + toEdit.locallab.spots.at(i).sigmoidqjcie = mods.locallab.spots.at(i).sigmoidqjcie; + } + + if (locallab.spots.at(i).logcie) { + toEdit.locallab.spots.at(i).logcie = mods.locallab.spots.at(i).logcie; + } + + if (locallab.spots.at(i).logjz) { + toEdit.locallab.spots.at(i).logjz = mods.locallab.spots.at(i).logjz; + } + + if (locallab.spots.at(i).sigjz) { + toEdit.locallab.spots.at(i).sigjz = mods.locallab.spots.at(i).sigjz; + } + + if (locallab.spots.at(i).sigq) { + toEdit.locallab.spots.at(i).sigq = mods.locallab.spots.at(i).sigq; + } + + if (locallab.spots.at(i).chjzcie) { + toEdit.locallab.spots.at(i).chjzcie = mods.locallab.spots.at(i).chjzcie; + } + + if (locallab.spots.at(i).sourceGraycie) { + toEdit.locallab.spots.at(i).sourceGraycie = mods.locallab.spots.at(i).sourceGraycie; + } + + if (locallab.spots.at(i).sourceabscie) { + toEdit.locallab.spots.at(i).sourceabscie = mods.locallab.spots.at(i).sourceabscie; + } + + if (locallab.spots.at(i).sursourcie) { + toEdit.locallab.spots.at(i).sursourcie = mods.locallab.spots.at(i).sursourcie; + } + + if (locallab.spots.at(i).modecam) { + toEdit.locallab.spots.at(i).modecam = mods.locallab.spots.at(i).modecam; + } + + if (locallab.spots.at(i).modecie) { + toEdit.locallab.spots.at(i).modecie = mods.locallab.spots.at(i).modecie; + } + + if (locallab.spots.at(i).saturlcie) { + toEdit.locallab.spots.at(i).saturlcie = mods.locallab.spots.at(i).saturlcie; + } + + if (locallab.spots.at(i).rstprotectcie) { + toEdit.locallab.spots.at(i).rstprotectcie = mods.locallab.spots.at(i).rstprotectcie; + } + + if (locallab.spots.at(i).chromlcie) { + toEdit.locallab.spots.at(i).chromlcie = mods.locallab.spots.at(i).chromlcie; + } + + if (locallab.spots.at(i).huecie) { + toEdit.locallab.spots.at(i).huecie = mods.locallab.spots.at(i).huecie; + } + + if (locallab.spots.at(i).toneMethodcie) { + toEdit.locallab.spots.at(i).toneMethodcie = mods.locallab.spots.at(i).toneMethodcie; + } + + if (locallab.spots.at(i).toneMethodcie2) { + toEdit.locallab.spots.at(i).toneMethodcie2 = mods.locallab.spots.at(i).toneMethodcie2; + } + + if (locallab.spots.at(i).chromjzcie) { + toEdit.locallab.spots.at(i).chromjzcie = mods.locallab.spots.at(i).chromjzcie; + } + + if (locallab.spots.at(i).saturjzcie) { + toEdit.locallab.spots.at(i).saturjzcie = mods.locallab.spots.at(i).saturjzcie; + } + + if (locallab.spots.at(i).huejzcie) { + toEdit.locallab.spots.at(i).huejzcie = mods.locallab.spots.at(i).huejzcie; + } + + if (locallab.spots.at(i).softjzcie) { + toEdit.locallab.spots.at(i).softjzcie = mods.locallab.spots.at(i).softjzcie; + } + + if (locallab.spots.at(i).strsoftjzcie) { + toEdit.locallab.spots.at(i).strsoftjzcie = mods.locallab.spots.at(i).strsoftjzcie; + } + + if (locallab.spots.at(i).thrhjzcie) { + toEdit.locallab.spots.at(i).thrhjzcie = mods.locallab.spots.at(i).thrhjzcie; + } + + if (locallab.spots.at(i).ciecurve) { + toEdit.locallab.spots.at(i).ciecurve = mods.locallab.spots.at(i).ciecurve; + } + + if (locallab.spots.at(i).ciecurve2) { + toEdit.locallab.spots.at(i).ciecurve2 = mods.locallab.spots.at(i).ciecurve2; + } + + if (locallab.spots.at(i).jzcurve) { + toEdit.locallab.spots.at(i).jzcurve = mods.locallab.spots.at(i).jzcurve; + } + + if (locallab.spots.at(i).czjzcurve) { + toEdit.locallab.spots.at(i).czjzcurve = mods.locallab.spots.at(i).czjzcurve; + } + + if (locallab.spots.at(i).HHcurvejz) { + toEdit.locallab.spots.at(i).HHcurvejz = mods.locallab.spots.at(i).HHcurvejz; + } + + if (locallab.spots.at(i).CHcurvejz) { + toEdit.locallab.spots.at(i).CHcurvejz = mods.locallab.spots.at(i).CHcurvejz; + } + + if (locallab.spots.at(i).LHcurvejz) { + toEdit.locallab.spots.at(i).LHcurvejz = mods.locallab.spots.at(i).LHcurvejz; + } + + if (locallab.spots.at(i).lightlcie) { + toEdit.locallab.spots.at(i).lightlcie = mods.locallab.spots.at(i).lightlcie; + } + + if (locallab.spots.at(i).lightjzcie) { + toEdit.locallab.spots.at(i).lightjzcie = mods.locallab.spots.at(i).lightjzcie; + } + + if (locallab.spots.at(i).lightqcie) { + toEdit.locallab.spots.at(i).lightqcie = mods.locallab.spots.at(i).lightqcie; + } + + if (locallab.spots.at(i).contlcie) { + toEdit.locallab.spots.at(i).contlcie = mods.locallab.spots.at(i).contlcie; + } + + if (locallab.spots.at(i).contjzcie) { + toEdit.locallab.spots.at(i).contjzcie = mods.locallab.spots.at(i).contjzcie; + } + + if (locallab.spots.at(i).adapjzcie) { + toEdit.locallab.spots.at(i).adapjzcie = mods.locallab.spots.at(i).adapjzcie; + } + + if (locallab.spots.at(i).jz100) { + toEdit.locallab.spots.at(i).jz100 = mods.locallab.spots.at(i).jz100; + } + + if (locallab.spots.at(i).pqremap) { + toEdit.locallab.spots.at(i).pqremap = mods.locallab.spots.at(i).pqremap; + } + + if (locallab.spots.at(i).pqremapcam16) { + toEdit.locallab.spots.at(i).pqremapcam16 = mods.locallab.spots.at(i).pqremapcam16; + } + + if (locallab.spots.at(i).hljzcie) { + toEdit.locallab.spots.at(i).hljzcie = mods.locallab.spots.at(i).hljzcie; + } + + if (locallab.spots.at(i).hlthjzcie) { + toEdit.locallab.spots.at(i).hlthjzcie = mods.locallab.spots.at(i).hlthjzcie; + } + + if (locallab.spots.at(i).shjzcie) { + toEdit.locallab.spots.at(i).shjzcie = mods.locallab.spots.at(i).shjzcie; + } + + if (locallab.spots.at(i).shthjzcie) { + toEdit.locallab.spots.at(i).shthjzcie = mods.locallab.spots.at(i).shthjzcie; + } + + if (locallab.spots.at(i).radjzcie) { + toEdit.locallab.spots.at(i).radjzcie = mods.locallab.spots.at(i).radjzcie; + } + + if (locallab.spots.at(i).contthrescie) { + toEdit.locallab.spots.at(i).contthrescie = mods.locallab.spots.at(i).contthrescie; + } + + if (locallab.spots.at(i).blackEvjz) { + toEdit.locallab.spots.at(i).blackEvjz = mods.locallab.spots.at(i).blackEvjz; + } + + if (locallab.spots.at(i).whiteEvjz) { + toEdit.locallab.spots.at(i).whiteEvjz = mods.locallab.spots.at(i).whiteEvjz; + } + + if (locallab.spots.at(i).targetjz) { + toEdit.locallab.spots.at(i).targetjz = mods.locallab.spots.at(i).targetjz; + } + + if (locallab.spots.at(i).sigmoidldacie) { + toEdit.locallab.spots.at(i).sigmoidldacie = mods.locallab.spots.at(i).sigmoidldacie; + } + + if (locallab.spots.at(i).sigmoidthcie) { + toEdit.locallab.spots.at(i).sigmoidthcie = mods.locallab.spots.at(i).sigmoidthcie; + } + + if (locallab.spots.at(i).sigmoidblcie) { + toEdit.locallab.spots.at(i).sigmoidblcie = mods.locallab.spots.at(i).sigmoidblcie; + } + + if (locallab.spots.at(i).sigmoidldajzcie) { + toEdit.locallab.spots.at(i).sigmoidldajzcie = mods.locallab.spots.at(i).sigmoidldajzcie; + } + + if (locallab.spots.at(i).sigmoidthjzcie) { + toEdit.locallab.spots.at(i).sigmoidthjzcie = mods.locallab.spots.at(i).sigmoidthjzcie; + } + + if (locallab.spots.at(i).sigmoidbljzcie) { + toEdit.locallab.spots.at(i).sigmoidbljzcie = mods.locallab.spots.at(i).sigmoidbljzcie; + } + + + if (locallab.spots.at(i).contqcie) { + toEdit.locallab.spots.at(i).contqcie = mods.locallab.spots.at(i).contqcie; + } + + if (locallab.spots.at(i).colorflcie) { + toEdit.locallab.spots.at(i).colorflcie = mods.locallab.spots.at(i).colorflcie; + } +/* + if (locallab.spots.at(i).lightlzcam) { + toEdit.locallab.spots.at(i).lightlzcam = mods.locallab.spots.at(i).lightlzcam; + } + + if (locallab.spots.at(i).lightqzcam) { + toEdit.locallab.spots.at(i).lightqzcam = mods.locallab.spots.at(i).lightqzcam; + } + + if (locallab.spots.at(i).contlzcam) { + toEdit.locallab.spots.at(i).contlzcam = mods.locallab.spots.at(i).contlzcam; + } + + if (locallab.spots.at(i).contqzcam) { + toEdit.locallab.spots.at(i).contqzcam = mods.locallab.spots.at(i).contqzcam; + } + + if (locallab.spots.at(i).contthreszcam) { + toEdit.locallab.spots.at(i).contthreszcam = mods.locallab.spots.at(i).contthreszcam; + } + + if (locallab.spots.at(i).colorflzcam) { + toEdit.locallab.spots.at(i).colorflzcam = mods.locallab.spots.at(i).colorflzcam; + } + + if (locallab.spots.at(i).saturzcam) { + toEdit.locallab.spots.at(i).saturzcam = mods.locallab.spots.at(i).saturzcam; + } + + if (locallab.spots.at(i).chromzcam) { + toEdit.locallab.spots.at(i).chromzcam = mods.locallab.spots.at(i).chromzcam; + } +*/ + if (locallab.spots.at(i).targabscie) { + toEdit.locallab.spots.at(i).targabscie = mods.locallab.spots.at(i).targabscie; + } + + if (locallab.spots.at(i).targetGraycie) { + toEdit.locallab.spots.at(i).targetGraycie = mods.locallab.spots.at(i).targetGraycie; + } + + if (locallab.spots.at(i).catadcie) { + toEdit.locallab.spots.at(i).catadcie = mods.locallab.spots.at(i).catadcie; + } + + if (locallab.spots.at(i).locwavcurvejz) { + toEdit.locallab.spots.at(i).locwavcurvejz = mods.locallab.spots.at(i).locwavcurvejz; + } + + if (locallab.spots.at(i).csthresholdjz) { + toEdit.locallab.spots.at(i).csthresholdjz = mods.locallab.spots.at(i).csthresholdjz; + } + + if (locallab.spots.at(i).sigmalcjz) { + toEdit.locallab.spots.at(i).sigmalcjz = mods.locallab.spots.at(i).sigmalcjz; + } + + if (locallab.spots.at(i).clarilresjz) { + toEdit.locallab.spots.at(i).clarilresjz = mods.locallab.spots.at(i).clarilresjz; + } + + if (locallab.spots.at(i).claricresjz) { + toEdit.locallab.spots.at(i).claricresjz = mods.locallab.spots.at(i).claricresjz; + } + + if (locallab.spots.at(i).clarisoftjz) { + toEdit.locallab.spots.at(i).clarisoftjz = mods.locallab.spots.at(i).clarisoftjz; + } + + if (locallab.spots.at(i).detailcie) { + toEdit.locallab.spots.at(i).detailcie = mods.locallab.spots.at(i).detailcie; + } + + if (locallab.spots.at(i).surroundcie) { + toEdit.locallab.spots.at(i).surroundcie = mods.locallab.spots.at(i).surroundcie; + } + + if (locallab.spots.at(i).enacieMask) { + toEdit.locallab.spots.at(i).enacieMask = mods.locallab.spots.at(i).enacieMask; + } + + if (locallab.spots.at(i).CCmaskciecurve) { + toEdit.locallab.spots.at(i).CCmaskciecurve = mods.locallab.spots.at(i).CCmaskciecurve; + } + + if (locallab.spots.at(i).LLmaskciecurve) { + toEdit.locallab.spots.at(i).LLmaskciecurve = mods.locallab.spots.at(i).LLmaskciecurve; + } + + if (locallab.spots.at(i).HHmaskciecurve) { + toEdit.locallab.spots.at(i).HHmaskciecurve = mods.locallab.spots.at(i).HHmaskciecurve; + } + + if (locallab.spots.at(i).blendmaskcie) { + toEdit.locallab.spots.at(i).blendmaskcie = mods.locallab.spots.at(i).blendmaskcie; + } + + if (locallab.spots.at(i).radmaskcie) { + toEdit.locallab.spots.at(i).radmaskcie = mods.locallab.spots.at(i).radmaskcie; + } + + if (locallab.spots.at(i).chromaskcie) { + toEdit.locallab.spots.at(i).chromaskcie = mods.locallab.spots.at(i).chromaskcie; + } + + if (locallab.spots.at(i).lapmaskcie) { + toEdit.locallab.spots.at(i).lapmaskcie = mods.locallab.spots.at(i).lapmaskcie; + } + + if (locallab.spots.at(i).gammaskcie) { + toEdit.locallab.spots.at(i).gammaskcie = mods.locallab.spots.at(i).gammaskcie; + } + + if (locallab.spots.at(i).slomaskcie) { + toEdit.locallab.spots.at(i).slomaskcie = mods.locallab.spots.at(i).slomaskcie; + } + + if (locallab.spots.at(i).Lmaskciecurve) { + toEdit.locallab.spots.at(i).Lmaskciecurve = mods.locallab.spots.at(i).Lmaskciecurve; + } + + if (locallab.spots.at(i).recothrescie) { + toEdit.locallab.spots.at(i).recothrescie = mods.locallab.spots.at(i).recothrescie; + } + + if (locallab.spots.at(i).lowthrescie) { + toEdit.locallab.spots.at(i).lowthrescie = mods.locallab.spots.at(i).lowthrescie; + } + + if (locallab.spots.at(i).higthrescie) { + toEdit.locallab.spots.at(i).higthrescie = mods.locallab.spots.at(i).higthrescie; + } + + if (locallab.spots.at(i).decaycie) { + toEdit.locallab.spots.at(i).decaycie = mods.locallab.spots.at(i).decaycie; + } + + } + + if (spot.enabled) { + toEdit.spot.enabled = mods.spot.enabled; + } + + if (spot.entries) { + toEdit.spot.entries = mods.spot.entries; + } + if (pcvignette.enabled) { toEdit.pcvignette.enabled = mods.pcvignette.enabled; } @@ -2519,6 +6397,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.resize.height = mods.resize.height; } + if (resize.longedge) { + toEdit.resize.longedge = mods.resize.longedge; + } + + if (resize.shortedge) { + toEdit.resize.shortedge = mods.resize.shortedge; + } + if (resize.enabled) { toEdit.resize.enabled = mods.resize.enabled; } @@ -2575,10 +6461,90 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.icm.workingTRCSlope = mods.icm.workingTRCSlope; } + if (icm.redx) { + toEdit.icm.redx = mods.icm.redx; + } + + if (icm.redy) { + toEdit.icm.redy = mods.icm.redy; + } + + if (icm.grex) { + toEdit.icm.grex = mods.icm.grex; + } + + if (icm.grey) { + toEdit.icm.grey = mods.icm.grey; + } + + if (icm.blux) { + toEdit.icm.blux = mods.icm.blux; + } + + if (icm.bluy) { + toEdit.icm.bluy = mods.icm.bluy; + } + + if (icm.preser) { + toEdit.icm.preser = mods.icm.preser; + } + + if (icm.fbw) { + toEdit.icm.fbw = mods.icm.fbw; + } + + if (icm.gamut) { + toEdit.icm.gamut = mods.icm.gamut; + } + + if (icm.labgridcieALow) { + toEdit.icm.labgridcieALow = mods.icm.labgridcieALow; + } + + if (icm.labgridcieBLow) { + toEdit.icm.labgridcieBLow = mods.icm.labgridcieBLow; + } + + if (icm.labgridcieAHigh) { + toEdit.icm.labgridcieAHigh = mods.icm.labgridcieAHigh; + } + + if (icm.labgridcieBHigh) { + toEdit.icm.labgridcieBHigh = mods.icm.labgridcieBHigh; + } + + if (icm.labgridcieGx) { + toEdit.icm.labgridcieGx = mods.icm.labgridcieGx; + } + + if (icm.labgridcieGy) { + toEdit.icm.labgridcieGy = mods.icm.labgridcieGy; + } + + if (icm.labgridcieWx) { + toEdit.icm.labgridcieWx = mods.icm.labgridcieWx; + } + + if (icm.labgridcieWy) { + toEdit.icm.labgridcieWy = mods.icm.labgridcieWy; + } + + if (icm.aRendIntent) { + toEdit.icm.aRendIntent = mods.icm.aRendIntent; + } + if (icm.workingTRC) { toEdit.icm.workingTRC = mods.icm.workingTRC; } + if (icm.will) { + toEdit.icm.will = mods.icm.will; + } + + if (icm.wprim) { + toEdit.icm.wprim = mods.icm.wprim; + } + if (raw.bayersensor.method) { toEdit.raw.bayersensor.method = mods.raw.bayersensor.method; } @@ -2663,6 +6629,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.raw.bayersensor.pixelShiftMedian = mods.raw.bayersensor.pixelShiftMedian; } + if (raw.bayersensor.pixelShiftAverage) { + toEdit.raw.bayersensor.pixelShiftAverage = mods.raw.bayersensor.pixelShiftAverage; + } + if (raw.bayersensor.pixelShiftGreen) { toEdit.raw.bayersensor.pixelShiftGreen = mods.raw.bayersensor.pixelShiftGreen; } @@ -2791,6 +6761,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.raw.ff_AutoSelect = mods.raw.ff_AutoSelect; } + if (raw.ff_FromMetaData) { + toEdit.raw.ff_FromMetaData = mods.raw.ff_FromMetaData; + } + if (raw.ff_BlurRadius) { toEdit.raw.ff_BlurRadius = mods.raw.ff_BlurRadius; } @@ -2811,6 +6785,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.enabled = mods.wavelet.enabled; } + if (wavelet.labgridALow) { + toEdit.wavelet.labgridALow = mods.wavelet.labgridALow; + } + + if (wavelet.labgridBLow) { + toEdit.wavelet.labgridBLow = mods.wavelet.labgridBLow; + } + + if (wavelet.labgridAHigh) { + toEdit.wavelet.labgridAHigh = mods.wavelet.labgridAHigh; + } + + if (wavelet.labgridBHigh) { + toEdit.wavelet.labgridBHigh = mods.wavelet.labgridBHigh; + } + if (wavelet.strength) { toEdit.wavelet.strength = mods.wavelet.strength; } @@ -2819,6 +6809,30 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.balance = mods.wavelet.balance; } + if (wavelet.sigmafin) { + toEdit.wavelet.sigmafin = mods.wavelet.sigmafin; + } + + if (wavelet.sigmaton) { + toEdit.wavelet.sigmaton = mods.wavelet.sigmaton; + } + + if (wavelet.sigmacol) { + toEdit.wavelet.sigmacol = mods.wavelet.sigmacol; + } + + if (wavelet.sigmadir) { + toEdit.wavelet.sigmadir = mods.wavelet.sigmadir; + } + + if (wavelet.rangeab) { + toEdit.wavelet.rangeab = mods.wavelet.rangeab; + } + + if (wavelet.protab) { + toEdit.wavelet.protab = mods.wavelet.protab; + } + if (wavelet.iter) { toEdit.wavelet.iter = mods.wavelet.iter; } @@ -2863,6 +6877,66 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.bluelow = mods.wavelet.bluelow; } + if (wavelet.ballum) { + toEdit.wavelet.ballum = mods.wavelet.ballum; + } + + if (wavelet.sigm) { + toEdit.wavelet.sigm = mods.wavelet.sigm; + } + + if (wavelet.levden) { + toEdit.wavelet.levden = mods.wavelet.levden; + } + + if (wavelet.thrden) { + toEdit.wavelet.thrden = mods.wavelet.thrden; + } + + if (wavelet.limden) { + toEdit.wavelet.limden = mods.wavelet.limden; + } + + if (wavelet.balchrom) { + toEdit.wavelet.balchrom = mods.wavelet.balchrom; + } + + if (wavelet.chromfi) { + toEdit.wavelet.chromfi = mods.wavelet.chromfi; + } + + if (wavelet.chromco) { + toEdit.wavelet.chromco = mods.wavelet.chromco; + } + + if (wavelet.mergeL) { + toEdit.wavelet.mergeL = mods.wavelet.mergeL; + } + + if (wavelet.mergeC) { + toEdit.wavelet.mergeC = mods.wavelet.mergeC; + } + + if (wavelet.softrad) { + toEdit.wavelet.softrad = mods.wavelet.softrad; + } + + if (wavelet.softradend) { + toEdit.wavelet.softradend = mods.wavelet.softradend; + } + + if (wavelet.strend) { + toEdit.wavelet.strend = mods.wavelet.strend; + } + + if (wavelet.detend) { + toEdit.wavelet.detend = mods.wavelet.detend; + } + + if (wavelet.thrend) { + toEdit.wavelet.thrend = mods.wavelet.thrend; + } + if (wavelet.lipst) { toEdit.wavelet.lipst = mods.wavelet.lipst; } @@ -2871,10 +6945,22 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.Medgreinf = mods.wavelet.Medgreinf; } + if (wavelet.ushamethod) { + toEdit.wavelet.ushamethod = mods.wavelet.ushamethod; + } + if (wavelet.avoid) { toEdit.wavelet.avoid = mods.wavelet.avoid; } + if (wavelet.showmask) { + toEdit.wavelet.showmask = mods.wavelet.showmask; + } + + if (wavelet.oldsh) { + toEdit.wavelet.oldsh = mods.wavelet.oldsh; + } + if (wavelet.tmr) { toEdit.wavelet.tmr = mods.wavelet.tmr; } @@ -2895,6 +6981,26 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.Tilesmethod = mods.wavelet.Tilesmethod; } + if (wavelet.complexmethod) { + toEdit.wavelet.complexmethod = mods.wavelet.complexmethod; + } + + //if (wavelet.denmethod) { + // toEdit.wavelet.denmethod = mods.wavelet.denmethod; + //} + + if (wavelet.mixmethod) { + toEdit.wavelet.mixmethod = mods.wavelet.mixmethod; + } + + if (wavelet.slimethod) { + toEdit.wavelet.slimethod = mods.wavelet.slimethod; + } + + if (wavelet.quamethod) { + toEdit.wavelet.quamethod = mods.wavelet.quamethod; + } + if (wavelet.daubcoeffmethod) { toEdit.wavelet.daubcoeffmethod = mods.wavelet.daubcoeffmethod; } @@ -2947,6 +7053,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.thrH = dontforceSet && options.baBehav[ADDSET_WA_THRRH] ? toEdit.wavelet.thrH + mods.wavelet.thrH : mods.wavelet.thrH; } + if (wavelet.radius) { + toEdit.wavelet.radius = dontforceSet && options.baBehav[ADDSET_WA_RADIUS] ? toEdit.wavelet.radius + mods.wavelet.radius : mods.wavelet.radius; + } + if (wavelet.sup) { toEdit.wavelet.sup = mods.wavelet.sup; } @@ -2963,6 +7073,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.edgcont = mods.wavelet.edgcont; } + if (wavelet.chrwav) { + toEdit.wavelet.chrwav = mods.wavelet.chrwav; + } + + if (wavelet.bluwav) { + toEdit.wavelet.bluwav = mods.wavelet.bluwav; + } + if (wavelet.level0noise) { toEdit.wavelet.level0noise = mods.wavelet.level0noise; } @@ -2979,6 +7097,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.level3noise = mods.wavelet.level3noise; } + if (wavelet.leveldenoise) { + toEdit.wavelet.leveldenoise = mods.wavelet.leveldenoise; + } + + if (wavelet.levelsigm) { + toEdit.wavelet.levelsigm = mods.wavelet.levelsigm; + } + if (wavelet.pastlev) { toEdit.wavelet.pastlev = mods.wavelet.pastlev; } @@ -2991,6 +7117,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.ccwcurve = mods.wavelet.ccwcurve; } + if (wavelet.blcurve) { + toEdit.wavelet.blcurve = mods.wavelet.blcurve; + } + + //if (wavelet.opacityCurveSH) { + // toEdit.wavelet.opacityCurveSH = mods.wavelet.opacityCurveSH; + //} + if (wavelet.opacityCurveRG) { toEdit.wavelet.opacityCurveRG = mods.wavelet.opacityCurveRG; } @@ -2999,6 +7133,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.opacityCurveBY = mods.wavelet.opacityCurveBY; } + if (wavelet.wavdenoise) { + toEdit.wavelet.wavdenoise = mods.wavelet.wavdenoise; + } + + if (wavelet.wavdenoiseh) { + toEdit.wavelet.wavdenoiseh = mods.wavelet.wavdenoiseh; + } + if (wavelet.opacityCurveW) { toEdit.wavelet.opacityCurveW = mods.wavelet.opacityCurveW; } @@ -3011,6 +7153,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.hhcurve = mods.wavelet.hhcurve; } + if (wavelet.wavguidcurve) { + toEdit.wavelet.wavguidcurve = mods.wavelet.wavguidcurve; + } + + if (wavelet.wavhuecurve) { + toEdit.wavelet.wavhuecurve = mods.wavelet.wavhuecurve; + } + if (wavelet.Chcurve) { toEdit.wavelet.Chcurve = mods.wavelet.Chcurve; } @@ -3032,6 +7182,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.expedge = mods.wavelet.expedge; } + if (wavelet.expbl) { + toEdit.wavelet.expbl = mods.wavelet.expbl; + } + if (wavelet.expresid) { toEdit.wavelet.expresid = mods.wavelet.expresid; } @@ -3040,6 +7194,10 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.expfinal = mods.wavelet.expfinal; } + if (wavelet.expclari) { + toEdit.wavelet.expclari = mods.wavelet.expclari; + } + if (wavelet.exptoning) { toEdit.wavelet.exptoning = mods.wavelet.exptoning; } @@ -3080,6 +7238,30 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.edgeampli = mods.wavelet.edgeampli; } + if (wavelet.sigma) { + toEdit.wavelet.sigma = mods.wavelet.sigma; + } + + if (wavelet.offset) { + toEdit.wavelet.offset = mods.wavelet.offset; + } + + if (wavelet.lowthr) { + toEdit.wavelet.lowthr = mods.wavelet.lowthr; + } + + if (wavelet.resblur) { + toEdit.wavelet.resblur = mods.wavelet.resblur; + } + + if (wavelet.edgeffect) { + toEdit.wavelet.edgeffect = mods.wavelet.edgeffect; + } + + if (wavelet.resblurc) { + toEdit.wavelet.resblurc = mods.wavelet.resblurc; + } + if (wavelet.resconH) { toEdit.wavelet.resconH = dontforceSet && options.baBehav[ADDSET_WA_RESCONH] ? toEdit.wavelet.resconH + mods.wavelet.resconH : mods.wavelet.resconH; } @@ -3092,6 +7274,14 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.wavelet.tmrs = dontforceSet && options.baBehav[ADDSET_WA_TMRS] ? toEdit.wavelet.tmrs + mods.wavelet.tmrs : mods.wavelet.tmrs; } + if (wavelet.edgs) { + toEdit.wavelet.edgs = dontforceSet && options.baBehav[ADDSET_WA_EDGS] ? toEdit.wavelet.edgs + mods.wavelet.edgs : mods.wavelet.edgs; + } + + if (wavelet.scale) { + toEdit.wavelet.scale = dontforceSet && options.baBehav[ADDSET_WA_SCALE] ? toEdit.wavelet.scale + mods.wavelet.scale : mods.wavelet.scale; + } + if (wavelet.gamma) { toEdit.wavelet.gamma = dontforceSet && options.baBehav[ADDSET_WA_GAMMA] ? toEdit.wavelet.gamma + mods.wavelet.gamma : mods.wavelet.gamma; } @@ -3223,7 +7413,7 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng 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; } @@ -3232,8 +7422,8 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.dehaze.showDepthMap = mods.dehaze.showDepthMap; } - if (dehaze.luminance) { - toEdit.dehaze.luminance = mods.dehaze.luminance; + if (dehaze.saturation) { + toEdit.dehaze.saturation = mods.dehaze.saturation; } if (metadata.mode) { @@ -3256,6 +7446,25 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng toEdit.filmNegative.blueRatio = mods.filmNegative.blueRatio; } + if (filmNegative.refInput) { + toEdit.filmNegative.refInput = mods.filmNegative.refInput; + } + + if (filmNegative.refOutput) { + toEdit.filmNegative.refOutput = mods.filmNegative.refOutput; + } + + if (filmNegative.colorSpace) { + toEdit.filmNegative.colorSpace = mods.filmNegative.colorSpace; + } + + // BackCompat param cannot be managed via the GUI, and it's always copied + toEdit.filmNegative.backCompat = mods.filmNegative.backCompat; + + if (raw.preprocessWB.mode) { + toEdit.raw.preprocessWB.mode = mods.raw.preprocessWB.mode; + } + // Exif changes are added to the existing ones if (exif) { for (procparams::ExifPairs::const_iterator i = mods.exif.begin(); i != mods.exif.end(); ++i) { @@ -3275,7 +7484,7 @@ bool RAWParamsEdited::BayerSensor::isUnchanged() const { 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 + && pixelShiftHoleFill && pixelShiftMedian && pixelShiftAverage && pixelShiftNonGreenCross && pixelShiftDemosaicMethod && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftEqualBright && pixelShiftEqualBrightChannel && linenoise && linenoiseDirection && pdafLinesFilter && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen; } @@ -3287,7 +7496,7 @@ bool RAWParamsEdited::XTransSensor::isUnchanged() const bool RAWParamsEdited::isUnchanged() const { 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; + && df_autoselect && ff_file && ff_AutoSelect && ff_FromMetaData && ff_BlurRadius && ff_BlurType && exPos && ff_AutoClipControl && ff_clipControl; } bool LensProfParamsEdited::isUnchanged() const @@ -3302,10 +7511,1405 @@ bool RetinexParamsEdited::isUnchanged() const bool FilmNegativeParamsEdited::isUnchanged() const { - return enabled && redRatio && greenExp && blueRatio; + return enabled && redRatio && greenExp && blueRatio && refInput && refOutput && colorSpace; +} + +LocallabParamsEdited::LocallabSpotEdited::LocallabSpotEdited(bool v) : + // Control spot settings + name(v), + isvisible(v), + prevMethod(v), + shape(v), + spotMethod(v), + wavMethod(v), + sensiexclu(v), + structexclu(v), + struc(v), + shapeMethod(v), + avoidgamutMethod(v), + loc(v), + centerX(v), + centerY(v), + circrad(v), + qualityMethod(v), + complexMethod(v), + transit(v), + feather(v), + thresh(v), + iter(v), + balan(v), + balanh(v), + colorde(v), + colorscope(v), + avoidrad(v), + transitweak(v), + transitgrad(v), + hishow(v), + activ(v), + blwh(v), + recurs(v), + laplac(v), + deltae(v), + shortc(v), + savrest(v), + scopemask(v), + denoichmask(v), + lumask(v), + // Color & Light + visicolor(v), + expcolor(v), + complexcolor(v), + curvactiv(v), + lightness(v), + reparcol(v), + gamc(v), + contrast(v), + chroma(v), + labgridALow(v), + labgridBLow(v), + labgridAHigh(v), + labgridBHigh(v), + labgridALowmerg(v), + labgridBLowmerg(v), + labgridAHighmerg(v), + labgridBHighmerg(v), + strengthgrid(v), + sensi(v), + structcol(v), + strcol(v), + strcolab(v), + strcolh(v), + angcol(v), + blurcolde(v), + blurcol(v), + contcol(v), + blendmaskcol(v), + radmaskcol(v), + chromaskcol(v), + gammaskcol(v), + slomaskcol(v), + shadmaskcol(v), + strumaskcol(v), + lapmaskcol(v), + qualitycurveMethod(v), + gridMethod(v), + merMethod(v), + toneMethod(v), + mergecolMethod(v), + llcurve(v), + lccurve(v), + cccurve(v), + clcurve(v), + rgbcurve(v), + LHcurve(v), + HHcurve(v), + CHcurve(v), + invers(v), + special(v), + toolcol(v), + enaColorMask(v), + fftColorMask(v), + CCmaskcurve(v), + LLmaskcurve(v), + HHmaskcurve(v), + HHhmaskcurve(v), + softradiuscol(v), + opacol(v), + mercol(v), + merlucol(v), + conthrcol(v), + Lmaskcurve(v), + LLmaskcolcurvewav(v), + csthresholdcol(v), + recothresc(v), + lowthresc(v), + higthresc(v), + decayc(v), + // Exposure + visiexpose(v), + expexpose(v), + complexexpose(v), + expcomp(v), + hlcompr(v), + hlcomprthresh(v), + black(v), + shadex(v), + shcompr(v), + expchroma(v), + sensiex(v), + structexp(v), + gamex(v), + blurexpde(v), + strexp(v), + angexp(v), + excurve(v), + norm(v), + inversex(v), + enaExpMask(v), + enaExpMaskaft(v), + CCmaskexpcurve(v), + LLmaskexpcurve(v), + HHmaskexpcurve(v), + blendmaskexp(v), + radmaskexp(v), + chromaskexp(v), + gammaskexp(v), + slomaskexp(v), + lapmaskexp(v), + strmaskexp(v), + angmaskexp(v), + softradiusexp(v), + Lmaskexpcurve(v), + expMethod(v), + exnoiseMethod(v), + laplacexp(v), + reparexp(v), + balanexp(v), + linear(v), + gamm(v), + fatamount(v), + fatdetail(v), + fatanchor(v), + fatlevel(v), + recothrese(v), + lowthrese(v), + higthrese(v), + decaye(v), + // Shadow highlight + visishadhigh(v), + expshadhigh(v), + complexshadhigh(v), + shMethod(v), + multsh{v, v, v, v, v, v}, + highlights(v), + h_tonalwidth(v), + shadows(v), + s_tonalwidth(v), + sh_radius(v), + sensihs(v), + enaSHMask(v), + CCmaskSHcurve(v), + LLmaskSHcurve(v), + HHmaskSHcurve(v), + blendmaskSH(v), + radmaskSH(v), + blurSHde(v), + strSH(v), + angSH(v), + inverssh(v), + chromaskSH(v), + gammaskSH(v), + slomaskSH(v), + lapmaskSH(v), + detailSH(v), + tePivot(v), + reparsh(v), + LmaskSHcurve(v), + fatamountSH(v), + fatanchorSH(v), + gamSH(v), + sloSH(v), + recothress(v), + lowthress(v), + higthress(v), + decays(v), + // Vibrance + visivibrance(v), + expvibrance(v), + complexvibrance(v), + saturated(v), + pastels(v), + vibgam(v), + warm(v), + psthreshold(v), + protectskins(v), + avoidcolorshift(v), + pastsattog(v), + sensiv(v), + skintonescurve(v), + CCmaskvibcurve(v), + LLmaskvibcurve(v), + HHmaskvibcurve(v), + enavibMask(v), + blendmaskvib(v), + radmaskvib(v), + chromaskvib(v), + gammaskvib(v), + slomaskvib(v), + lapmaskvib(v), + strvib(v), + strvibab(v), + strvibh(v), + angvib(v), + Lmaskvibcurve(v), + recothresv(v), + lowthresv(v), + higthresv(v), + decayv(v), + // Soft Light + visisoft(v), + expsoft(v), + complexsoft(v), + streng(v), + sensisf(v), + laplace(v), + softMethod(v), + // Blur & Noise + visiblur(v), + expblur(v), + complexblur(v), + radius(v), + strength(v), + sensibn(v), + itera(v), + guidbl(v), + strbl(v), + recothres(v), + lowthres(v), + higthres(v), + recothresd(v), + lowthresd(v), + midthresd(v), + midthresdch(v), + higthresd(v), + decayd(v), + isogr(v), + strengr(v), + scalegr(v), + divgr(v), + epsbl(v), + blMethod(v), + chroMethod(v), + quamethod(v), + usemask(v), + invmaskd(v), + invmask(v), + levelthr(v), + lnoiselow(v), + levelthrlow(v), + blurMethod(v), + medMethod(v), + activlum(v), + noiselumf(v), + noiselumf0(v), + noiselumf2(v), + noiselumc(v), + noiselumdetail(v), + noiselequal(v), + noisegam(v), + noisechrof(v), + noisechroc(v), + noisechrodetail(v), + adjblur(v), + bilateral(v), + nlstr(v), + nldet(v), + nlpat(v), + nlrad(v), + nlgam(v), + sensiden(v), + reparden(v), + detailthr(v), + locwavcurveden(v), + locwavcurvehue(v), + showmaskblMethodtyp(v), + CCmaskblcurve(v), + LLmaskblcurve(v), + HHmaskblcurve(v), + enablMask(v), + fftwbl(v), + invbl(v), + toolbl(v), + blendmaskbl(v), + radmaskbl(v), + chromaskbl(v), + gammaskbl(v), + slomaskbl(v), + lapmaskbl(v), + shadmaskbl(v), + shadmaskblsha(v), + strumaskbl(v), + Lmaskblcurve(v), + LLmaskblcurvewav(v), + csthresholdblur(v), + // Tone Mapping + visitonemap(v), + exptonemap(v), + complextonemap(v), + stren(v), + gamma(v), + estop(v), + scaltm(v), + repartm(v), + rewei(v), + satur(v), + sensitm(v), + softradiustm(v), + amount(v), + equiltm(v), + CCmasktmcurve(v), + LLmasktmcurve(v), + HHmasktmcurve(v), + enatmMask(v), + enatmMaskaft(v), + blendmasktm(v), + radmasktm(v), + chromasktm(v), + gammasktm(v), + slomasktm(v), + lapmasktm(v), + Lmasktmcurve(v), + recothrest(v), + lowthrest(v), + higthrest(v), + decayt(v), + // Retinex + visireti(v), + expreti(v), + complexreti(v), + retinexMethod(v), + str(v), + chrrt(v), + neigh(v), + vart(v), + offs(v), + dehaz(v), + depth(v), + sensih(v), + localTgaincurve(v), + localTtranscurve(v), + inversret(v), + equilret(v), + loglin(v), + dehazeSaturation(v), + softradiusret(v), + CCmaskreticurve(v), + LLmaskreticurve(v), + HHmaskreticurve(v), + enaretiMask(v), + enaretiMasktmap(v), + blendmaskreti(v), + radmaskreti(v), + chromaskreti(v), + gammaskreti(v), + slomaskreti(v), + lapmaskreti(v), + scalereti(v), + darkness(v), + lightnessreti(v), + limd(v), + cliptm(v), + fftwreti(v), + Lmaskreticurve(v), + recothresr(v), + lowthresr(v), + higthresr(v), + decayr(v), + // Sharpening + visisharp(v), + expsharp(v), + complexsharp(v), + sharcontrast(v), + sharradius(v), + sharamount(v), + shardamping(v), + shariter(v), + sharblur(v), + shargam(v), + sensisha(v), + inverssha(v), + // Local Contrast + visicontrast(v), + expcontrast(v), + complexcontrast(v), + lcradius(v), + lcamount(v), + lcdarkness(v), + lclightness(v), + sigmalc(v), + levelwav(v), + residcont(v), + residsha(v), + residshathr(v), + residhi(v), + residhithr(v), + gamlc(v), + residgam(v), + residslop(v), + residblur(v), + levelblur(v), + sigmabl(v), + residchro(v), + residcomp(v), + sigma(v), + offset(v), + sigmadr(v), + threswav(v), + chromalev(v), + chromablu(v), + sigmadc(v), + deltad(v), + fatres(v), + clarilres(v), + claricres(v), + clarisoft(v), + sigmalc2(v), + strwav(v), + angwav(v), + strengthw(v), + sigmaed(v), + radiusw(v), + detailw(v), + gradw(v), + tloww(v), + thigw(v), + edgw(v), + basew(v), + sensilc(v), + reparw(v), + fftwlc(v), + blurlc(v), + wavblur(v), + wavedg(v), + waveshow(v), + wavcont(v), + wavcomp(v), + wavgradl(v), + wavcompre(v), + origlc(v), + localcontMethod(v), + localedgMethod(v), + localneiMethod(v), + locwavcurve(v), + csthreshold(v), + loclevwavcurve(v), + locconwavcurve(v), + loccompwavcurve(v), + loccomprewavcurve(v), + locedgwavcurve(v), + CCmasklccurve(v), + LLmasklccurve(v), + HHmasklccurve(v), + enalcMask(v), + blendmasklc(v), + radmasklc(v), + chromasklc(v), + Lmasklccurve(v), + recothresw(v), + lowthresw(v), + higthresw(v), + decayw(v), + // Contrast by detail levels + visicbdl(v), + expcbdl(v), + complexcbdl(v), + mult{v, v, v, v, v, v}, + chromacbdl(v), + threshold(v), + sensicb(v), + clarityml(v), + contresid(v), + softradiuscb(v), + enacbMask(v), + CCmaskcbcurve(v), + LLmaskcbcurve(v), + HHmaskcbcurve(v), + blendmaskcb(v), + radmaskcb(v), + chromaskcb(v), + gammaskcb(v), + slomaskcb(v), + lapmaskcb(v), + Lmaskcbcurve(v), + recothrescb(v), + lowthrescb(v), + higthrescb(v), + decaycb(v), + // Log encoding + visilog(v), + explog(v), + complexlog(v), + autocompute(v), + sourceGray(v), + sourceabs(v), + targabs(v), + targetGray(v), + catad(v), + saturl(v), + chroml(v), + lightl(v), + lightq(v), + contl(v), + contthres(v), + contq(v), + colorfl(v), + LcurveL(v), + Autogray(v), + fullimage(v), + repar(v), + ciecam(v), + blackEv(v), + whiteEv(v), + detail(v), + sursour(v), + surround(v), + sensilog(v), + baselog(v), + strlog(v), + anglog(v), + CCmaskcurveL(v), + LLmaskcurveL(v), + HHmaskcurveL(v), + enaLMask(v), + blendmaskL(v), + radmaskL(v), + chromaskL(v), + LmaskcurveL(v), + recothresl(v), + lowthresl(v), + higthresl(v), + decayl(v), + // mask + visimask(v), + complexmask(v), + expmask(v), + sensimask(v), + blendmask(v), + blendmaskab(v), + softradiusmask(v), + enamask(v), + fftmask(v), + blurmask(v), + contmask(v), + CCmask_curve(v), + LLmask_curve(v), + HHmask_curve(v), + strumaskmask(v), + toolmask(v), + radmask(v), + lapmask(v), + chromask(v), + gammask(v), + slopmask(v), + shadmask(v), + str_mask(v), + ang_mask(v), + HHhmask_curve(v), + Lmask_curve(v), + LLmask_curvewav(v), + csthresholdmask(v), + //ciecam + visicie(v), + complexcie(v), + expcie(v), + reparcie(v), + sensicie(v), + Autograycie(v), + forcejz(v), + forcebw(v), + qtoj(v), + jabcie(v), + sigmoidqjcie(v), + logcie(v), + logjz(v), + sigjz(v), + sigq(v), + chjzcie(v), + sourceGraycie(v), + sourceabscie(v), + sursourcie(v), + modecam(v), + modecie(v), + saturlcie(v), + rstprotectcie(v), + chromlcie(v), + huecie(v), + toneMethodcie(v), + ciecurve(v), + toneMethodcie2(v), + ciecurve2(v), + chromjzcie(v), + saturjzcie(v), + huejzcie(v), + softjzcie(v), + strsoftjzcie(v), + thrhjzcie(v), + jzcurve(v), + czcurve(v), + czjzcurve(v), + HHcurvejz(v), + CHcurvejz(v), + LHcurvejz(v), + lightlcie(v), + lightjzcie(v), + lightqcie(v), + contlcie(v), + contjzcie(v), + adapjzcie(v), + jz100(v), + pqremap(v), + pqremapcam16(v), + hljzcie(v), + hlthjzcie(v), + shjzcie(v), + shthjzcie(v), + radjzcie(v), + contthrescie(v), + blackEvjz(v), + whiteEvjz(v), + targetjz(v), + sigmoidldacie(v), + sigmoidthcie(v), + sigmoidblcie(v), + sigmoidldajzcie(v), + sigmoidthjzcie(v), + sigmoidbljzcie(v), + contqcie(v), + colorflcie(v), +/* + lightlzcam(v), + lightqzcam(v), + contlzcam(v), + contqzcam(v), + contthreszcam(v), + colorflzcam(v), + saturzcam(v), + chromzcam(v), +*/ + targabscie(v), + targetGraycie(v), + catadcie(v), + detailcie(v), + surroundcie(v), + enacieMask(v), + CCmaskciecurve(v), + LLmaskciecurve(v), + HHmaskciecurve(v), + blendmaskcie(v), + radmaskcie(v), + sigmalcjz(v), + clarilresjz(v), + claricresjz(v), + clarisoftjz(v), + locwavcurvejz(v), + csthresholdjz(v), + chromaskcie(v), + lapmaskcie(v), + gammaskcie(v), + slomaskcie(v), + Lmaskciecurve(v), + recothrescie(v), + lowthrescie(v), + higthrescie(v), + decaycie(v) + +{ +} + +void LocallabParamsEdited::LocallabSpotEdited::set(bool v) +{ + name = v; + isvisible = v; + prevMethod = v; + shape = v; + spotMethod = v; + wavMethod = v; + sensiexclu = v; + structexclu = v; + struc = v; + shapeMethod = v; + avoidgamutMethod = v; + loc = v; + centerX = v; + centerY = v; + circrad = v; + qualityMethod = v; + complexMethod = v; + transit = v; + feather = v; + thresh = v; + iter = v; + balan = v; + balanh = v; + colorde = v; + colorscope = v; + avoidrad = v; + transitweak = v; + transitgrad = v; + hishow = v; + activ = v; + blwh = v; + recurs = v; + laplac = v; + deltae = v; + shortc = v; + savrest = v; + scopemask = v; + denoichmask = v; + lumask = v; + // Color & Light + visicolor = v; + expcolor = v; + complexcolor = v; + curvactiv = v; + lightness = v; + reparcol = v; + gamc = v; + contrast = v; + chroma = v; + labgridALow = v; + labgridBLow = v; + labgridAHigh = v; + labgridBHigh = v; + labgridALowmerg = v; + labgridBLowmerg = v; + labgridAHighmerg = v; + labgridBHighmerg = v; + strengthgrid = v; + sensi = v; + structcol = v; + strcol = v; + strcolab = v; + strcolh = v; + angcol = v; + blurcolde = v; + blurcol = v; + contcol = v; + blendmaskcol = v; + radmaskcol = v; + chromaskcol = v; + gammaskcol = v; + slomaskcol = v; + shadmaskcol = v; + strumaskcol = v; + lapmaskcol = v; + qualitycurveMethod = v; + gridMethod = v; + merMethod = v; + toneMethod = v; + mergecolMethod = v; + llcurve = v; + lccurve = v; + cccurve = v; + clcurve = v; + rgbcurve = v; + LHcurve = v; + HHcurve = v; + CHcurve = v; + invers = v; + special = v; + toolcol = v; + enaColorMask = v; + fftColorMask = v; + CCmaskcurve = v; + LLmaskcurve = v; + HHmaskcurve = v; + HHhmaskcurve = v; + softradiuscol = v; + opacol = v; + mercol = v; + merlucol = v; + conthrcol = v; + Lmaskcurve = v; + LLmaskcolcurvewav = v; + csthresholdcol = v; + recothresc = v; + lowthresc = v; + higthresc = v; + decayc = v; + // Exposure + visiexpose = v; + expexpose = v; + complexexpose = v; + expcomp = v; + hlcompr = v; + hlcomprthresh = v; + black = v; + shadex = v; + shcompr = v; + expchroma = v; + sensiex = v; + structexp = v; + gamex = v; + blurexpde = v; + strexp = v; + angexp = v; + excurve = v; + norm = v; + inversex = v; + enaExpMask = v; + enaExpMaskaft = v; + CCmaskexpcurve = v; + LLmaskexpcurve = v; + HHmaskexpcurve = v; + blendmaskexp = v; + radmaskexp = v; + chromaskexp = v; + gammaskexp = v; + slomaskexp = v; + lapmaskexp = v; + strmaskexp = v; + angmaskexp = v; + softradiusexp = v; + Lmaskexpcurve = v; + expMethod = v; + exnoiseMethod = v; + laplacexp = v; + reparexp = v; + balanexp = v; + linear = v; + gamm = v; + fatamount = v; + fatdetail = v; + fatanchor = v; + fatlevel = v; + recothrese = v; + lowthrese = v; + higthrese = v; + decaye = v; + // Shadow highlight + visishadhigh = v; + expshadhigh = v; + complexshadhigh = v; + shMethod = v; + + for (int i = 0; i < 5; i++) { + multsh[i] = v; + } + + highlights = v; + h_tonalwidth = v; + shadows = v; + s_tonalwidth = v; + sh_radius = v; + sensihs = v; + enaSHMask = v; + CCmaskSHcurve = v; + LLmaskSHcurve = v; + HHmaskSHcurve = v; + blendmaskSH = v; + radmaskSH = v; + blurSHde = v; + strSH = v; + angSH = v; + inverssh = v; + chromaskSH = v; + gammaskSH = v; + slomaskSH = v; + lapmaskSH = v; + detailSH = v; + tePivot = v; + reparsh = v; + LmaskSHcurve = v; + fatamountSH = v; + fatanchorSH = v; + gamSH = v; + sloSH = v; + recothress = v; + lowthress = v; + higthress = v; + decays = v; + // Vibrance + visivibrance = v; + expvibrance = v; + complexvibrance = v; + saturated = v; + pastels = v; + vibgam = v; + warm = v; + psthreshold = v; + protectskins = v; + avoidcolorshift = v; + pastsattog = v; + sensiv = v; + skintonescurve = v; + CCmaskvibcurve = v; + LLmaskvibcurve = v; + HHmaskvibcurve = v; + enavibMask = v; + blendmaskvib = v; + radmaskvib = v; + chromaskvib = v; + gammaskvib = v; + slomaskvib = v; + lapmaskvib = v; + strvib = v; + strvibab = v; + strvibh = v; + angvib = v; + Lmaskvibcurve = v; + recothresv = v; + lowthresv = v; + higthresv = v; + decayv = v; + // Soft Light + visisoft = v; + expsoft = v; + complexsoft = v; + streng = v; + sensisf = v; + laplace = v; + softMethod = v; + // Blur & Noise + visiblur = v; + expblur = v; + complexblur = v; + radius = v; + strength = v; + sensibn = v; + itera = v; + guidbl = v; + strbl = v; + recothres = v; + lowthres = v; + higthres = v; + recothresd = v; + lowthresd = v; + midthresd = v; + midthresdch = v; + higthresd = v; + decayd = v; + isogr = v; + strengr = v; + scalegr = v; + divgr = v; + epsbl = v; + blMethod = v; + chroMethod = v; + quamethod = v; + usemask = v; + invmaskd = v; + invmask = v; + levelthr = v; + lnoiselow = v; + levelthrlow = v; + blurMethod = v; + medMethod = v; + activlum = v; + noiselumf = v; + noiselumf0 = v; + noiselumf2 = v; + noiselumc = v; + noiselumdetail = v; + noiselequal = v; + noisegam = v; + noisechrof = v; + noisechroc = v; + noisechrodetail = v; + adjblur = v; + bilateral = v; + nlstr = v; + nldet = v; + nlpat = v; + nlrad = v; + nlgam = v; + sensiden = v; + reparden = v; + detailthr = v; + locwavcurveden = v; + showmaskblMethodtyp = v; + CCmaskblcurve = v; + LLmaskblcurve = v; + HHmaskblcurve = v; + enablMask = v; + fftwbl = v; + invbl = v; + toolbl = v; + blendmaskbl = v; + radmaskbl = v; + chromaskbl = v; + gammaskbl = v; + slomaskbl = v; + lapmaskbl = v; + shadmaskbl = v; + shadmaskblsha = v; + strumaskbl = v; + Lmaskblcurve = v; + LLmaskblcurvewav = v; + csthresholdblur = v; + // Tone Mapping + visitonemap = v; + exptonemap = v; + complextonemap = v; + stren = v; + gamma = v; + estop = v; + scaltm = v; + repartm = v; + rewei = v; + satur = v; + sensitm = v; + softradiustm = v; + amount = v; + equiltm = v; + CCmasktmcurve = v; + LLmasktmcurve = v; + HHmasktmcurve = v; + enatmMask = v; + enatmMaskaft = v; + blendmasktm = v; + radmasktm = v; + chromasktm = v; + gammasktm = v; + slomasktm = v; + lapmasktm = v; + Lmasktmcurve = v; + recothrest = v; + lowthrest = v; + higthrest = v; + decayt = v; + // Retinex + visireti = v; + expreti = v; + complexreti = v; + retinexMethod = v; + str = v; + chrrt = v; + neigh = v; + vart = v; + offs = v; + dehaz = v; + depth = v; + sensih = v; + localTgaincurve = v; + localTtranscurve = v; + inversret = v; + equilret = v; + loglin = v; + dehazeSaturation = v; + softradiusret = v; + CCmaskreticurve = v; + LLmaskreticurve = v; + HHmaskreticurve = v; + enaretiMask = v; + enaretiMasktmap = v; + blendmaskreti = v; + radmaskreti = v; + chromaskreti = v; + gammaskreti = v; + slomaskreti = v; + lapmaskreti = v; + scalereti = v; + darkness = v; + lightnessreti = v; + limd = v; + cliptm = v; + fftwreti = v; + Lmaskreticurve = v; + recothresr = v; + lowthresr = v; + higthresr = v; + decayr = v; + // Sharpening + visisharp = v; + expsharp = v; + complexsharp = v; + sharcontrast = v; + sharradius = v; + sharamount = v; + shardamping = v; + shariter = v; + sharblur = v; + shargam = v; + sensisha = v; + inverssha = v; + // Local Contrast + visicontrast = v; + expcontrast = v; + complexcontrast = v; + lcradius = v; + lcamount = v; + lcdarkness = v; + lclightness = v; + sigmalc = v; + levelwav = v; + residcont = v; + residsha = v; + residshathr = v; + residhi = v; + residhithr = v; + gamlc = v; + residgam = v; + residslop = v; + residblur = v; + levelblur = v; + sigmabl = v; + residchro = v; + residcomp = v; + sigma = v; + offset = v; + sigmadr = v; + threswav = v; + chromalev = v; + chromablu = v; + sigmadc = v; + deltad = v; + fatres = v; + clarilres = v; + claricres = v; + clarisoft = v; + sigmalc2 = v; + strwav = v; + angwav = v; + strengthw = v; + sigmaed = v; + radiusw = v; + detailw = v; + gradw = v; + tloww = v; + thigw = v; + edgw = v; + basew = v; + sensilc = v; + reparw = v; + fftwlc = v; + blurlc = v; + wavblur = v; + wavedg = v; + waveshow = v; + wavcont = v; + wavcomp = v; + wavgradl = v; + wavcompre = v; + origlc = v; + localcontMethod = v; + localedgMethod = v; + localneiMethod = v; + locwavcurve = v; + csthreshold = v; + loclevwavcurve = v; + locconwavcurve = v; + loccompwavcurve = v; + loccomprewavcurve = v; + locedgwavcurve = v; + CCmasklccurve = v; + LLmasklccurve = v; + HHmasklccurve = v; + enalcMask = v; + blendmasklc = v; + radmasklc = v; + chromasklc = v; + Lmasklccurve = v; + recothresw = v; + lowthresw = v; + higthresw = v; + decayw = v; + // Contrast by detail levels + visicbdl = v; + expcbdl = v; + complexcbdl = v; + + for (int i = 0; i < 6; i++) { + mult[i] = v; + } + + chromacbdl = v; + threshold = v; + sensicb = v; + clarityml = v; + contresid = v; + softradiuscb = v; + enacbMask = v; + CCmaskcbcurve = v; + LLmaskcbcurve = v; + HHmaskcbcurve = v; + blendmaskcb = v; + radmaskcb = v; + chromaskcb = v; + gammaskcb = v; + slomaskcb = v; + lapmaskcb = v; + Lmaskcbcurve = v; + recothrescb = v; + lowthrescb = v; + higthrescb = v; + decaycb = v; + // Log encoding + visilog = v; + explog = v; + complexlog = v; + autocompute = v; + sourceGray = v; + sourceabs = v; + targabs = v; + targetGray = v; + catad = v; + saturl = v; + chroml = v; + lightl = v; + lightq = v; + contl = v; + contthres = v; + contq = v; + colorfl = v; + LcurveL = v; + Autogray = v; + fullimage = v; + repar = v; + ciecam = v; + blackEv = v; + whiteEv = v; + detail = v; + sursour = v; + surround = v; + sensilog = v; + baselog = v; + strlog = v; + anglog = v; + CCmaskcurveL = v; + LLmaskcurveL = v; + HHmaskcurveL = v; + enaLMask = v; + blendmaskL = v; + radmaskL = v; + chromaskL = v; + LmaskcurveL = v; + recothresl = v; + lowthresl = v; + higthresl = v; + decayl = v; + // mask + visimask = v; + complexmask = v; + expmask = v; + sensimask = v; + blendmask = v; + blendmaskab = v; + softradiusmask = v; + enamask = v; + fftmask = v; + blurmask = v; + contmask = v; + CCmask_curve = v; + LLmask_curve = v; + HHmask_curve = v; + strumaskmask = v; + toolmask = v; + radmask = v; + lapmask = v; + chromask = v; + gammask = v; + slopmask = v; + shadmask = v; + str_mask = v; + ang_mask = v; + HHhmask_curve = v; + Lmask_curve = v; + LLmask_curvewav = v; + csthresholdmask = v; + //ciecam + visicie= v; + complexcie= v; + expcie = v; + reparcie = v; + sensicie = v; + Autograycie = v; + forcejz = v; + forcebw = v; + qtoj = v; + jabcie = v; + sigmoidqjcie = v; + logcie = v; + logjz = v; + sigjz = v; + sigq = v; + chjzcie = v; + sourceGraycie = v; + sourceabscie = v; + sursourcie = v; + modecam = v; + modecie = v; + saturlcie = v; + rstprotectcie = v; + chromlcie = v; + huecie = v; + toneMethodcie = v; + ciecurve = v; + toneMethodcie2 = v; + ciecurve2 = v; + chromjzcie = v; + saturjzcie = v; + huejzcie = v; + softjzcie = v; + strsoftjzcie = v; + thrhjzcie = v; + jzcurve = v; + czcurve = v; + czjzcurve = v; + HHcurvejz = v; + CHcurvejz = v; + LHcurvejz = v; + lightlcie = v; + lightjzcie = v; + lightqcie = v; + contlcie = v; + contjzcie = v; + adapjzcie = v; + jz100 = v; + pqremap = v; + pqremapcam16 = v; + hljzcie = v; + hlthjzcie = v; + shjzcie = v; + shthjzcie = v; + radjzcie = v; + contthrescie = v; + blackEvjz = v; + whiteEvjz = v; + targetjz = v; + sigmoidldacie = v; + sigmoidthcie = v; + sigmoidblcie = v; + sigmoidldajzcie = v; + sigmoidthjzcie = v; + sigmoidbljzcie = v; + contqcie = v; + colorflcie = v; +/* + lightlzcam = v; + lightqzcam = v; + contlzcam = v; + contqzcam = v; + contthreszcam = v; + colorflzcam = v; + saturzcam = v; + chromzcam = v; +*/ + targabscie = v; + targetGraycie = v; + catadcie = v; + detailcie = v; + surroundcie = v; + enacieMask = v; + CCmaskciecurve = v; + LLmaskciecurve = v; + HHmaskciecurve = v; + blendmaskcie = v; + radmaskcie = v; + sigmalcjz = v; + clarilresjz = v; + claricresjz = v; + clarisoftjz = v; + locwavcurvejz = v; + csthresholdjz = v; + chromaskcie = v; + lapmaskcie = v; + gammaskcie = v; + slomaskcie = v; + Lmaskciecurve = v; + recothrescie = v; + lowthrescie = v; + higthrescie = v; + decaycie = v; + } bool CaptureSharpeningParamsEdited::isUnchanged() const { return enabled && contrast && autoContrast && autoRadius && deconvradius && deconvradiusOffset && deconviter && deconvitercheck; -} \ No newline at end of file +} + +bool RAWParamsEdited::PreprocessWBParamsEdited::isUnchanged() const +{ + return mode; +} diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 01a3e4efe..3c8a70b74 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -18,6 +18,7 @@ */ #pragma once +#include #include namespace rtengine @@ -51,6 +52,8 @@ struct ToneCurveParamsEdited { bool saturation; bool shcompr; bool hlcompr; + bool hlbl; + bool hlth; bool hlcomprthresh; bool autoexp; bool clip; @@ -73,6 +76,7 @@ struct RetinexParamsEdited { bool slope; bool neigh; bool offs; + bool complexmethod; bool retinexMethod; bool mapMethod; bool viewMethod; @@ -107,7 +111,7 @@ struct LCurveParamsEdited { bool brightness; bool contrast; bool chromaticity; - bool avoidcolorshift; + bool gamutmunselmethod; bool rstprotection; bool lcurve; bool acurve; @@ -169,6 +173,10 @@ struct ColorToningEdited { bool labgridBLow; bool labgridAHigh; bool labgridBHigh; + bool labgridALowmerg; + bool labgridBLowmerg; + bool labgridAHighmerg; + bool labgridBHighmerg; bool labregions; bool labregionsShowMask; }; @@ -239,7 +247,19 @@ struct WBParamsEdited { bool temperature; bool green; bool equal; + bool observer; bool tempBias; + bool itcwb_thres; + bool itcwb_precis; + bool itcwb_size; + bool itcwb_delta; + bool itcwb_fgreen; + bool itcwb_rgreen; + bool itcwb_nopurple; + bool itcwb_sorted; + bool itcwb_forceextra; + bool itcwb_sampling; + }; struct DefringeParamsEdited { @@ -261,6 +281,9 @@ struct ColorAppearanceParamsEdited { bool curveMode; bool curveMode2; bool curveMode3; + bool complexmethod; + bool modelmethod; + bool catmethod; bool enabled; bool degree; bool autodegree; @@ -275,6 +298,7 @@ struct ColorAppearanceParamsEdited { bool ybscen; bool badpixsl; bool wbmodel; + bool illum; bool algo; bool jlight; bool qbright; @@ -290,6 +314,7 @@ struct ColorAppearanceParamsEdited { bool datacie; bool tonecie; bool tempout; + bool autotempout; bool greenout; bool ybout; bool tempsc; @@ -346,6 +371,14 @@ struct SHParamsEdited { bool lab; }; +struct ToneEqualizerParamsEdited { + bool enabled; + std::array bands; + bool regularization; + bool show_colormap; + bool pivot; +}; + struct CropParamsEdited { bool enabled; bool x; @@ -365,6 +398,7 @@ struct CoarseTransformParamsEdited { }; struct CommonTransformParamsEdited { + bool method; bool autofill; }; @@ -375,6 +409,707 @@ struct RotateParamsEdited { struct DistortionParamsEdited { bool amount; }; +class LocallabParamsEdited +{ +public: + struct LocallabSpotEdited { + // Control spot settings + bool name; + bool isvisible; + bool prevMethod; + bool shape; + bool spotMethod; + bool wavMethod; + bool sensiexclu; + bool structexclu; + bool struc; + bool shapeMethod; + bool avoidgamutMethod; + bool loc; + bool centerX; + bool centerY; + bool circrad; + bool qualityMethod; + bool complexMethod; + bool transit; + bool feather; + bool thresh; + bool iter; + bool balan; + bool balanh; + bool colorde; + bool colorscope; + bool avoidrad; + bool transitweak; + bool transitgrad; + bool hishow; + bool activ; + bool blwh; + bool recurs; + bool laplac; + bool deltae; + bool shortc; + bool savrest; + bool scopemask; + bool denoichmask; + bool lumask; + // Color & Light + bool visicolor; + bool expcolor; + bool complexcolor; + bool curvactiv; + bool lightness; + bool reparcol; + bool gamc; + bool contrast; + bool chroma; + bool labgridALow; + bool labgridBLow; + bool labgridAHigh; + bool labgridBHigh; + bool labgridALowmerg; + bool labgridBLowmerg; + bool labgridAHighmerg; + bool labgridBHighmerg; + bool strengthgrid; + bool sensi; + bool structcol; + bool strcol; + bool strcolab; + bool strcolh; + bool angcol; + bool blurcolde; + bool blurcol; + bool contcol; + bool blendmaskcol; + bool radmaskcol; + bool chromaskcol; + bool gammaskcol; + bool slomaskcol; + bool shadmaskcol; + bool strumaskcol; + bool lapmaskcol; + bool qualitycurveMethod; + bool gridMethod; + bool merMethod; + bool toneMethod; + bool mergecolMethod; + bool llcurve; + bool lccurve; + bool cccurve; + bool clcurve; + bool rgbcurve; + bool LHcurve; + bool HHcurve; + bool CHcurve; + bool invers; + bool special; + bool toolcol; + bool enaColorMask; + bool fftColorMask; + bool CCmaskcurve; + bool LLmaskcurve; + bool HHmaskcurve; + bool HHhmaskcurve; + bool softradiuscol; + bool opacol; + bool mercol; + bool merlucol; + bool conthrcol; + bool Lmaskcurve; + bool LLmaskcolcurvewav; + bool csthresholdcol; + bool recothresc; + bool lowthresc; + bool higthresc; + bool decayc; + // Exposure + bool visiexpose; + bool expexpose; + bool complexexpose; + bool expcomp; + bool hlcompr; + bool hlcomprthresh; + bool black; + bool shadex; + bool shcompr; + bool expchroma; + bool sensiex; + bool structexp; + bool gamex; + bool blurexpde; + bool strexp; + bool angexp; + bool excurve; + bool norm; + bool inversex; + bool enaExpMask; + bool enaExpMaskaft; + bool CCmaskexpcurve; + bool LLmaskexpcurve; + bool HHmaskexpcurve; + bool blendmaskexp; + bool radmaskexp; + bool chromaskexp; + bool gammaskexp; + bool slomaskexp; + bool lapmaskexp; + bool strmaskexp; + bool angmaskexp; + bool softradiusexp; + bool Lmaskexpcurve; + bool expMethod; + bool exnoiseMethod; + bool laplacexp; + bool reparexp; + bool balanexp; + bool linear; + bool gamm; + bool fatamount; + bool fatdetail; + bool fatanchor; + bool fatlevel; + bool recothrese; + bool lowthrese; + bool higthrese; + bool decaye; + // Shadow highlight + bool visishadhigh; + bool expshadhigh; + bool complexshadhigh; + bool shMethod; + bool multsh[6]; + bool highlights; + bool h_tonalwidth; + bool shadows; + bool s_tonalwidth; + bool sh_radius; + bool sensihs; + bool enaSHMask; + bool CCmaskSHcurve; + bool LLmaskSHcurve; + bool HHmaskSHcurve; + bool blendmaskSH; + bool radmaskSH; + bool blurSHde; + bool strSH; + bool angSH; + bool inverssh; + bool chromaskSH; + bool gammaskSH; + bool slomaskSH; + bool lapmaskSH; + bool detailSH; + bool tePivot; + bool reparsh; + bool LmaskSHcurve; + bool fatamountSH; + bool fatanchorSH; + bool gamSH; + bool sloSH; + bool recothress; + bool lowthress; + bool higthress; + bool decays; + // Vibrance + bool visivibrance; + bool expvibrance; + bool complexvibrance; + bool saturated; + bool pastels; + bool vibgam; + bool warm; + bool psthreshold; + bool protectskins; + bool avoidcolorshift; + bool pastsattog; + bool sensiv; + bool skintonescurve; + bool CCmaskvibcurve; + bool LLmaskvibcurve; + bool HHmaskvibcurve; + bool enavibMask; + bool blendmaskvib; + bool radmaskvib; + bool chromaskvib; + bool gammaskvib; + bool slomaskvib; + bool lapmaskvib; + bool strvib; + bool strvibab; + bool strvibh; + bool angvib; + bool Lmaskvibcurve; + bool recothresv; + bool lowthresv; + bool higthresv; + bool decayv; + // Soft Light + bool visisoft; + bool expsoft; + bool complexsoft; + bool streng; + bool sensisf; + bool laplace; + bool softMethod; + // Blur & Noise + bool visiblur; + bool expblur; + bool complexblur; + bool radius; + bool strength; + bool sensibn; + bool itera; + bool guidbl; + bool strbl; + bool recothres; + bool lowthres; + bool higthres; + bool recothresd; + bool lowthresd; + bool midthresd; + bool midthresdch; + bool higthresd; + bool decayd; + bool isogr; + bool strengr; + bool scalegr; + bool divgr; + bool epsbl; + bool blMethod; + bool chroMethod; + bool quamethod; + bool usemask; + bool invmaskd; + bool invmask; + bool levelthr; + bool lnoiselow; + bool levelthrlow; + bool blurMethod; + bool medMethod; + bool activlum; + bool noiselumf; + bool noiselumf0; + bool noiselumf2; + bool noiselumc; + bool noiselumdetail; + bool noiselequal; + bool noisegam; + bool noisechrof; + bool noisechroc; + bool noisechrodetail; + bool adjblur; + bool bilateral; + bool nlstr; + bool nldet; + bool nlpat; + bool nlrad; + bool nlgam; + bool sensiden; + bool reparden; + bool detailthr; + bool locwavcurveden; + bool locwavcurvehue; + bool showmaskblMethodtyp; + bool CCmaskblcurve; + bool LLmaskblcurve; + bool HHmaskblcurve; + bool enablMask; + bool fftwbl; + bool invbl; + bool toolbl; + bool blendmaskbl; + bool radmaskbl; + bool chromaskbl; + bool gammaskbl; + bool slomaskbl; + bool lapmaskbl; + bool shadmaskbl; + bool shadmaskblsha; + bool strumaskbl; + bool Lmaskblcurve; + bool LLmaskblcurvewav; + bool csthresholdblur; + // Tone Mapping + bool visitonemap; + bool exptonemap; + bool complextonemap; + bool stren; + bool gamma; + bool estop; + bool scaltm; + bool repartm; + bool rewei; + bool satur; + bool sensitm; + bool softradiustm; + bool amount; + bool equiltm; + bool CCmasktmcurve; + bool LLmasktmcurve; + bool HHmasktmcurve; + bool enatmMask; + bool enatmMaskaft; + bool blendmasktm; + bool radmasktm; + bool chromasktm; + bool gammasktm; + bool slomasktm; + bool lapmasktm; + bool Lmasktmcurve; + bool recothrest; + bool lowthrest; + bool higthrest; + bool decayt; + // Retinex + bool visireti; + bool expreti; + bool complexreti; + bool retinexMethod; + bool str; + bool chrrt; + bool neigh; + bool vart; + bool offs; + bool dehaz; + bool depth; + bool sensih; + bool localTgaincurve; + bool localTtranscurve; + bool inversret; + bool equilret; + bool loglin; + bool dehazeSaturation; + bool softradiusret; + bool CCmaskreticurve; + bool LLmaskreticurve; + bool HHmaskreticurve; + bool enaretiMask; + bool enaretiMasktmap; + bool blendmaskreti; + bool radmaskreti; + bool chromaskreti; + bool gammaskreti; + bool slomaskreti; + bool lapmaskreti; + bool scalereti; + bool darkness; + bool lightnessreti; + bool limd; + bool cliptm; + bool fftwreti; + bool Lmaskreticurve; + bool recothresr; + bool lowthresr; + bool higthresr; + bool decayr; + // Sharpening + bool visisharp; + bool expsharp; + bool complexsharp; + bool sharcontrast; + bool sharradius; + bool sharamount; + bool shardamping; + bool shariter; + bool sharblur; + bool shargam; + bool sensisha; + bool inverssha; + // Local Contrast + bool visicontrast; + bool expcontrast; + bool complexcontrast; + bool lcradius; + bool lcamount; + bool lcdarkness; + bool lclightness; + bool sigmalc; + bool levelwav; + bool residcont; + bool residsha; + bool residshathr; + bool residhi; + bool residhithr; + bool gamlc; + bool residgam; + bool residslop; + bool residblur; + bool levelblur; + bool sigmabl; + bool residchro; + bool residcomp; + bool sigma; + bool offset; + bool sigmadr; + bool threswav; + bool chromalev; + bool chromablu; + bool sigmadc; + bool deltad; + bool fatres; + bool clarilres; + bool claricres; + bool clarisoft; + bool sigmalc2; + bool strwav; + bool angwav; + bool strengthw; + bool sigmaed; + bool radiusw; + bool detailw; + bool gradw; + bool tloww; + bool thigw; + bool edgw; + bool basew; + bool sensilc; + bool reparw; + bool fftwlc; + bool blurlc; + bool wavblur; + bool wavedg; + bool waveshow; + bool wavcont; + bool wavcomp; + bool wavgradl; + bool wavcompre; + bool origlc; + bool localcontMethod; + bool localedgMethod; + bool localneiMethod; + bool locwavcurve; + bool csthreshold; + bool loclevwavcurve; + bool locconwavcurve; + bool loccompwavcurve; + bool loccomprewavcurve; + bool locedgwavcurve; + bool CCmasklccurve; + bool LLmasklccurve; + bool HHmasklccurve; + bool enalcMask; + bool blendmasklc; + bool radmasklc; + bool chromasklc; + bool Lmasklccurve; + bool recothresw; + bool lowthresw; + bool higthresw; + bool decayw; + // Contrast by detail levels + bool visicbdl; + bool expcbdl; + bool complexcbdl; + bool mult[6]; + bool chromacbdl; + bool threshold; + bool sensicb; + bool clarityml; + bool contresid; + bool softradiuscb; + bool enacbMask; + bool CCmaskcbcurve; + bool LLmaskcbcurve; + bool HHmaskcbcurve; + bool blendmaskcb; + bool radmaskcb; + bool chromaskcb; + bool gammaskcb; + bool slomaskcb; + bool lapmaskcb; + bool Lmaskcbcurve; + bool recothrescb; + bool lowthrescb; + bool higthrescb; + bool decaycb; + // Log encoding + bool visilog; + bool explog; + bool complexlog; + bool autocompute; + bool sourceGray; + bool sourceabs; + bool targabs; + bool targetGray; + bool catad; + bool saturl; + bool chroml; + bool lightl; + bool lightq; + bool contl; + bool contthres; + bool contq; + bool colorfl; + bool LcurveL; + bool Autogray; + bool fullimage; + bool repar; + bool ciecam; + bool blackEv; + bool whiteEv; + bool detail; + bool sursour; + bool surround; + bool sensilog; + bool baselog; + bool strlog; + bool anglog; + bool CCmaskcurveL; + bool LLmaskcurveL; + bool HHmaskcurveL; + bool enaLMask; + bool blendmaskL; + bool radmaskL; + bool chromaskL; + bool LmaskcurveL; + bool recothresl; + bool lowthresl; + bool higthresl; + bool decayl; + //mask + bool visimask; + bool complexmask; + bool expmask; + bool sensimask; + bool blendmask; + bool blendmaskab; + bool softradiusmask; + bool enamask; + bool fftmask; + bool blurmask; + bool contmask; + bool CCmask_curve; + bool LLmask_curve; + bool HHmask_curve; + bool strumaskmask; + bool toolmask; + bool radmask; + bool lapmask; + bool chromask; + bool gammask; + bool slopmask; + bool shadmask; + bool str_mask; + bool ang_mask; + bool HHhmask_curve; + bool Lmask_curve; + bool LLmask_curvewav; + bool csthresholdmask; + //locallabcie + bool visicie; + bool complexcie; + bool expcie; + bool reparcie; + bool sensicie; + bool Autograycie; + bool forcejz; + bool forcebw; + bool qtoj; + bool jabcie; + bool sigmoidqjcie; + bool logcie; + bool logjz; + bool sigjz; + bool sigq; + bool chjzcie; + bool sourceGraycie; + bool sourceabscie; + bool sursourcie; + bool modecam; + bool modecie; + bool saturlcie; + bool rstprotectcie; + bool chromlcie; + bool huecie; + bool toneMethodcie; + bool ciecurve; + bool toneMethodcie2; + bool ciecurve2; + bool chromjzcie; + bool saturjzcie; + bool huejzcie; + bool softjzcie; + bool strsoftjzcie; + bool thrhjzcie; + bool jzcurve; + bool czcurve; + bool czjzcurve; + bool HHcurvejz; + bool CHcurvejz; + bool LHcurvejz; + bool lightlcie; + bool lightjzcie; + bool lightqcie; + bool contlcie; + bool contjzcie; + bool adapjzcie; + bool jz100; + bool pqremap; + bool pqremapcam16; + bool hljzcie; + bool hlthjzcie; + bool shjzcie; + bool shthjzcie; + bool radjzcie; + bool contthrescie; + bool blackEvjz; + bool whiteEvjz; + bool targetjz; + bool sigmoidldacie; + bool sigmoidthcie; + bool sigmoidblcie; + bool sigmoidldajzcie; + bool sigmoidthjzcie; + bool sigmoidbljzcie; + bool contqcie; + bool colorflcie; +/* + bool lightlzcam; + bool lightqzcam; + bool contlzcam; + bool contqzcam; + bool contthreszcam; + bool colorflzcam; + bool saturzcam; + bool chromzcam; +*/ + bool targabscie; + bool targetGraycie; + bool catadcie; + bool detailcie; + bool surroundcie; + bool enacieMask; + bool CCmaskciecurve; + bool LLmaskciecurve; + bool HHmaskciecurve; + bool blendmaskcie; + bool radmaskcie; + bool sigmalcjz; + bool clarilresjz; + bool claricresjz; + bool clarisoftjz; + bool locwavcurvejz; + bool csthresholdjz; + bool chromaskcie; + bool lapmaskcie; + bool gammaskcie; + bool slomaskcie; + bool Lmaskciecurve; + bool recothrescie; + bool lowthrescie; + bool higthrescie; + bool decaycie; + + LocallabSpotEdited(bool v); + + void set(bool v); + }; + + bool enabled; + bool selspot; + std::vector spots; +}; struct LensProfParamsEdited { bool lcpFile; @@ -394,8 +1129,22 @@ struct LensProfParamsEdited { }; struct PerspectiveParamsEdited { + bool method; bool horizontal; bool vertical; + bool camera_crop_factor; + bool camera_focal_length; + bool camera_pitch; + bool camera_roll; + bool camera_shift_horiz; + bool camera_shift_vert; + bool camera_yaw; + bool projection_pitch; + bool projection_rotate; + bool projection_shift_horiz; + bool projection_shift_vert; + bool projection_yaw; + bool control_lines; }; struct GradientParamsEdited { @@ -468,10 +1217,19 @@ struct ResizeParamsEdited { bool dataspec; bool width; bool height; + bool longedge; + bool shortedge; bool enabled; bool allowUpscaling; }; +class SpotParamsEdited +{ +public: + bool enabled; + bool entries; +}; + struct ColorManagementParamsEdited { bool inputProfile; bool toneCurve; @@ -484,7 +1242,26 @@ struct ColorManagementParamsEdited { bool workingTRC; bool workingTRCGamma; bool workingTRCSlope; - + bool will; + bool wprim; + bool redx; + bool redy; + bool grex; + bool grey; + bool blux; + bool bluy; + bool preser; + bool fbw; + bool gamut; + bool labgridcieALow; + bool labgridcieBLow; + bool labgridcieAHigh; + bool labgridcieBHigh; + bool labgridcieGx; + bool labgridcieGy; + bool labgridcieWx; + bool labgridcieWy; + bool aRendIntent; bool outputProfile; bool outputIntent; bool outputBPC; @@ -495,13 +1272,22 @@ struct WaveletParamsEdited { bool strength; bool balance; bool iter; + bool sigmafin; + bool sigmaton; + bool sigmacol; + bool sigmadir; + bool rangeab; + bool protab; bool median; bool medianlev; bool linkedg; bool cbenab; bool lipst; bool Medgreinf; + bool ushamethod; bool avoid; + bool showmask; + bool oldsh; bool tmr; bool c[9]; bool ch[9]; @@ -516,12 +1302,24 @@ struct WaveletParamsEdited { bool CLmethod; bool Backmethod; bool Tilesmethod; + bool complexmethod; + //bool denmethod; + bool mixmethod; + bool slimethod; + bool quamethod; bool daubcoeffmethod; bool Dirmethod; + bool sigma; + bool offset; + bool lowthr; bool rescon; bool resconH; bool reschro; + bool resblur; + bool resblurc; bool tmrs; + bool edgs; + bool scale; bool gamma; bool sup; bool sky; @@ -537,26 +1335,38 @@ struct WaveletParamsEdited { bool chroma; bool contrast; bool edgrad; + bool edgeffect; bool edgval; bool edgthresh; bool thr; bool thrH; + bool radius; bool skinprotect; bool hueskin; bool hueskin2; bool hllev; bool bllev; bool edgcont; + bool chrwav; + bool bluwav; bool level0noise; bool level1noise; bool level2noise; bool level3noise; + bool leveldenoise; + bool levelsigm; bool ccwcurve; + bool blcurve; + //bool opacityCurveSH; bool opacityCurveBY; + bool wavdenoise; + bool wavdenoiseh; bool opacityCurveRG; bool opacityCurveW; bool opacityCurveWL; bool hhcurve; + bool wavguidcurve; + bool wavhuecurve; bool Chcurve; bool pastlev; bool satlev; @@ -567,13 +1377,34 @@ struct WaveletParamsEdited { bool bluemed; bool greenhigh; bool bluehigh; + bool ballum; + bool sigm; + bool levden; + bool thrden; + bool limden; + bool balchrom; + bool chromfi; + bool chromco; + bool mergeL; + bool mergeC; + bool softrad; + bool softradend; + bool strend; + bool detend; + bool thrend; bool expcontrast; bool expchroma; bool expedge; + bool expbl; bool expresid; bool expfinal; bool exptoning; bool expnoise; + bool expclari; + bool labgridALow; + bool labgridBLow; + bool labgridAHigh; + bool labgridBHigh; }; struct DirPyrEqualizerParamsEdited { @@ -609,7 +1440,7 @@ struct DehazeParamsEdited { bool strength; bool showDepthMap; bool depth; - bool luminance; + bool saturation; }; struct RAWParamsEdited { @@ -635,6 +1466,7 @@ struct RAWParamsEdited { bool pixelShiftShowMotionMaskOnly; bool pixelShiftHoleFill; bool pixelShiftMedian; + bool pixelShiftAverage; bool pixelShiftGreen; bool pixelShiftBlur; bool pixelShiftSmooth; @@ -679,12 +1511,21 @@ struct RAWParamsEdited { bool df_autoselect; bool ff_file; bool ff_AutoSelect; + bool ff_FromMetaData; bool ff_BlurRadius; bool ff_BlurType; bool ff_AutoClipControl; bool ff_clipControl; bool exPos; + struct PreprocessWBParamsEdited { + bool mode; + + bool isUnchanged() const; + }; + + PreprocessWBParamsEdited preprocessWB; + bool isUnchanged() const; }; @@ -698,6 +1539,9 @@ struct FilmNegativeParamsEdited { bool redRatio; bool greenExp; bool blueRatio; + bool refInput; + bool refOutput; + bool colorSpace; bool isUnchanged() const; }; @@ -724,6 +1568,7 @@ struct ParamsEdited { FattalToneMappingParamsEdited fattal; ImpulseDenoiseParamsEdited impulseDenoise; SHParamsEdited sh; + ToneEqualizerParamsEdited toneEqualizer; CropParamsEdited crop; CoarseTransformParamsEdited coarse; CommonTransformParamsEdited commonTrans; @@ -732,12 +1577,14 @@ struct ParamsEdited { LensProfParamsEdited lensProf; PerspectiveParamsEdited perspective; GradientParamsEdited gradient; + LocallabParamsEdited locallab; PCVignetteParamsEdited pcvignette; CACorrParamsEdited cacorrection; VignettingParamsEdited vignetting; ChannelMixerParamsEdited chmixer; BlackWhiteParamsEdited blackwhite; ResizeParamsEdited resize; + SpotParamsEdited spot; ColorManagementParamsEdited icm; RAWParamsEdited raw; DirPyrEqualizerParamsEdited dirpyrequalizer; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 22f608ae4..3f03d81f6 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -17,10 +17,177 @@ * along with RawTherapee. If not, see . */ #include "partialpastedlg.h" + +#include "guiutils.h" #include "multilangmgr.h" #include "paramsedited.h" -#include "guiutils.h" +#include "../rtengine/procparams.h" + +using namespace rtengine::procparams; + +/* ==== PartialSpotWidget ==== */ +PartialSpotWidget::PartialSpotWidget(): + // Widget GUI elements + treeview(Gtk::manage(new Gtk::TreeView())), + treemodel(Gtk::ListStore::create(spotRow)), + + // Widget listener + selListener(nullptr) +{ + + set_orientation(Gtk::ORIENTATION_VERTICAL); + + // Configure tree view + treeview->set_model(treemodel); + treeview->set_enable_search(false); + treeview->set_headers_visible(false); + + // Add tree view columns + auto cell1 = Gtk::manage(new Gtk::CellRendererToggle()); + cell1->signal_toggled().connect( + sigc::mem_fun( + *this, &PartialSpotWidget::keepToggled)); + int cols_count = treeview->append_column("", *cell1); + auto col = treeview->get_column(cols_count - 1); + + if (col) { + col->set_cell_data_func( + *cell1, sigc::mem_fun( + *this, &PartialSpotWidget::render_keep)); + } + + auto cell2 = Gtk::manage(new Gtk::CellRendererText()); + cols_count = treeview->append_column("", *cell2); + col = treeview->get_column(cols_count - 1); + + if (col) { + col->set_cell_data_func( + *cell2, sigc::mem_fun( + *this, &PartialSpotWidget::render_spotname)); + } + + // Create and configure scrolled window + Gtk::ScrolledWindow* const scrolledwindows = Gtk::manage(new Gtk::ScrolledWindow()); + scrolledwindows->add(*treeview); + scrolledwindows->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + scrolledwindows->set_min_content_height(100); + + // Add widgets to VBox + pack_start(*scrolledwindows); + show_all(); +} + +void PartialSpotWidget::updateSpotWidget(const rtengine::procparams::ProcParams* pp, const bool defValue) +{ + treeviewconn.block(true); + + // Clear tree model + treemodel->clear(); + + // Add tree model element according to pp + Gtk::TreeRow newspot; + + for (size_t i = 0; i < pp->locallab.spots.size(); i++) { + newspot = *(treemodel->append()); + newspot[spotRow.keep] = defValue; + newspot[spotRow.spotname] = pp->locallab.spots.at(i).name; + } + + treeviewconn.block(false); +} + +void PartialSpotWidget::enableAll() +{ + treeviewconn.block(true); + + for (auto &spot : treemodel->children()) { + spot[spotRow.keep] = true; + } + + treeviewconn.block(false); +} + +void PartialSpotWidget::disableAll() +{ + treeviewconn.block(true); + + for (auto &spot : treemodel->children()) { + spot[spotRow.keep] = false; + } + + treeviewconn.block(false); +} + +std::vector PartialSpotWidget::getSelectionStatus() +{ + std::vector keepVect; + + for (auto &spot : treemodel->children()) { + keepVect.push_back(spot[spotRow.keep]); + } + + return keepVect; +} + +void PartialSpotWidget::render_keep(Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter) +{ + const auto spot = *iter; + Gtk::CellRendererToggle* const ct = static_cast(cell); + + // Render cell toggle + ct->property_active() = spot[spotRow.keep]; +} + +void PartialSpotWidget::render_spotname(Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter) +{ + const auto spot = *iter; + Gtk::CellRendererText* const ct = static_cast(cell); + + // Render cell toggle + ct->property_text() = spot[spotRow.spotname]; +} + +void PartialSpotWidget::keepToggled(const Glib::ustring &path) +{ + PartialSpotWidgetListener::UpdateStatus status; + + // Get clicked row + const auto selRow = *(treemodel->get_iter(path)); + + // Update treeview according to selected row + selRow[spotRow.keep] = !selRow[spotRow.keep]; + + // Count total number of spot + const int totalnb = (int)treemodel->children().size(); + + // Count number of toggled elements + int togglednb = 0; + + for (auto &spot : treemodel->children()) { + if (spot[spotRow.keep]) { + togglednb++; + } + } + + // Compute status + if (togglednb == 0) { // No spot toggled + status = PartialSpotWidgetListener::UpdateStatus::NoSelection; + } else { + if (togglednb == totalnb) { // All spot toggled + status = PartialSpotWidgetListener::UpdateStatus::AllSelection; + } else { // Partial number of spots toggled + status = PartialSpotWidgetListener::UpdateStatus::PartialSelection; + } + } + + // Propagate event to listener + if (selListener) { + selListener->partialSpotUpdated(status); + } +} + +/* ==== PartialPasteDlg ==== */ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* parent) : Gtk::Dialog (title, *parent, true) { @@ -45,11 +212,14 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren raw ->set_name("PartialPasteHeader"); advanced = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ADVANCEDGROUP"))); advanced ->set_name("PartialPasteHeader"); + locallab = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LOCALLABGROUP"))); + locallab ->set_name("PartialPasteHeader"); // Basic Settings: wb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE"))); exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); + toneEqualizer = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TONE_EQUALIZER"))); epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD"))); fattal = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TM_FATTAL"))); pcvignette = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PCVIGNETTE"))); @@ -57,6 +227,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren labcurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE"))); // Detail Settings: + spot = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SPOT"))); 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"))); @@ -103,6 +274,10 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren exifch = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXIFCHANGES"))); iptc = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IPTCINFO"))); + // Locallab: + spots = Gtk::manage(new PartialSpotWidget()); + spots->setPartialSpotWidgetListener(this); + // Raw Settings: raw_method = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DMETHOD"))); raw_imagenum = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_IMAGENUM"))); @@ -127,6 +302,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren //--- ff_file = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDFILE"))); ff_AutoSelect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDAUTOSELECT"))); + ff_FromMetaData = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDFROMMETADATA"))); ff_BlurType = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURTYPE"))); ff_BlurRadius = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURRADIUS"))); ff_ClipControl = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDCLIPCONTROL"))); @@ -134,18 +310,20 @@ 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"))); - //--- + //... filmNegative = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FILMNEGATIVE")) ); //--- captureSharpening = Gtk::manage (new Gtk::CheckButton (M("TP_PDSHARPENING_LABEL")) ); + //--- + raw_preprocwb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCWB"))); - Gtk::VBox* vboxes[8]; - Gtk::HSeparator* hseps[8]; + Gtk::Box* vboxes[9]; + Gtk::Separator* hseps[9]; - for (int i = 0; i < 8; i++) { - vboxes[i] = Gtk::manage (new Gtk::VBox ()); + for (int i = 0; i < 9; i++) { + vboxes[i] = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); vboxes[i]->set_name("PartialPasteGroupContainer"); - hseps[i] = Gtk::manage (new Gtk::HSeparator ()); + hseps[i] = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); hseps[i]->set_name("PartialPasteHeaderSep"); } @@ -155,6 +333,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[0]->pack_start (*wb, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2); + vboxes[0]->pack_start (*toneEqualizer, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*fattal, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*pcvignette, Gtk::PACK_SHRINK, 2); @@ -164,8 +343,9 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren //DETAIL vboxes[1]->pack_start (*detail, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*hseps[1], Gtk::PACK_SHRINK, 2); + vboxes[1]->pack_start (*spot, 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 (*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); @@ -183,6 +363,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 (*filmNegative, 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); @@ -213,78 +394,77 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[5]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*wavelet, Gtk::PACK_SHRINK, 2); - //META - vboxes[6]->pack_start (*meta, Gtk::PACK_SHRINK, 2); + //LOCALLAB + vboxes[6]->pack_start(*locallab, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start(*spots, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*hseps[6], Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start(*metadata, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*exifch, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*iptc, Gtk::PACK_SHRINK, 2); - //RAW - vboxes[7]->pack_start (*raw, Gtk::PACK_SHRINK, 2); + //META + vboxes[7]->pack_start (*meta, 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); - vboxes[7]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[7]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*raw_hotpix_filt, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*raw_deadpix_filt, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*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_black, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[7]->pack_start (*df_file, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*df_AutoSelect, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[7]->pack_start (*ff_file, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*ff_AutoSelect, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*ff_BlurType, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*ff_BlurRadius, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*ff_ClipControl, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[7]->pack_start (*raw_ca_autocorrect, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*raw_caredblue, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*raw_ca_avoid_colourshift, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[7]->pack_start (*filmNegative, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*captureSharpening, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_border, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_pixelshift, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0); + vboxes[8]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_hotpix_filt, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_deadpix_filt, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_pdaf_lines_filter, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0); + vboxes[8]->pack_start (*raw_expos, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_black, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_preprocwb, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0); + vboxes[8]->pack_start (*df_file, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*df_AutoSelect, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0); + vboxes[8]->pack_start (*ff_file, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*ff_AutoSelect, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*ff_FromMetaData, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*ff_BlurType, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*ff_BlurRadius, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*ff_ClipControl, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0); + vboxes[8]->pack_start (*raw_ca_autocorrect, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_caredblue, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*raw_ca_avoid_colourshift, Gtk::PACK_SHRINK, 2); + vboxes[8]->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0); + vboxes[8]->pack_start (*captureSharpening, Gtk::PACK_SHRINK, 2); - Gtk::VBox* vbCol1 = Gtk::manage (new Gtk::VBox ()); - Gtk::VBox* vbCol2 = Gtk::manage (new Gtk::VBox ()); - Gtk::VBox* vbCol3 = Gtk::manage (new Gtk::VBox ()); + Gtk::Box* vbCol1 = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* vbCol2 = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* vbCol3 = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); for (int i = 0; i < 3; i++) { vbCol1->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } - for (int i = 3; i < 7; i++) { + for (int i = 3; i < 8; i++) { vbCol2->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } - for (int i = 7; i < 8; i++) { + for (int i = 8; i < 9; i++) { vbCol3->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } - Gtk::VBox* vbtop = Gtk::manage (new Gtk::VBox ()); + Gtk::Box* vbtop = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); vbtop->pack_start (*everything, Gtk::PACK_SHRINK, 2); Gtk::Dialog::get_content_area()->pack_start (*vbtop, Gtk::PACK_SHRINK, 2); - Gtk::HBox* hbmain = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hbmain = Gtk::manage (new Gtk::Box ()); hbmain->pack_start (*vbCol1); - Gtk::VSeparator *vsep1 = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator *vsep1 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); setExpandAlignProperties(vsep1, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); hbmain->pack_start (*vsep1); hbmain->pack_start (*vbCol2); - Gtk::VSeparator *vsep2 = Gtk::manage (new Gtk::VSeparator ()); + Gtk::Separator *vsep2 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); setExpandAlignProperties(vsep2, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); hbmain->pack_start (*vsep2); hbmain->pack_start (*vbCol3); @@ -314,11 +494,13 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren metaConn = meta->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::metaToggled)); rawConn = raw->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::rawToggled)); advancedConn = advanced->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::advancedToggled)); + locallabConn = locallab->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::locallabToggled)); // Basic Settings wbConn = wb->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); + toneEqualizerConn = toneEqualizer->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)); pcvignetteConn = pcvignette->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); @@ -326,6 +508,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren labcurveConn = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); // Detail Settings: + spotConn = spot->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); 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)); @@ -396,6 +579,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren //--- ff_fileConn = ff_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_AutoSelectConn = ff_AutoSelect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + ff_FromMetaDataConn = ff_FromMetaData->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_BlurTypeConn = ff_BlurType->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_BlurRadiusConn = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_ClipControlConn = ff_ClipControl->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); @@ -407,6 +591,8 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren filmNegativeConn = filmNegative->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); //--- captureSharpeningConn = captureSharpening->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- + raw_preprocwbConn = raw_preprocwb->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); @@ -426,6 +612,7 @@ void PartialPasteDlg::everythingToggled () ConnectionBlocker metaBlocker(metaConn); ConnectionBlocker rawBlocker(rawConn); ConnectionBlocker advancedBlocker(advancedConn); + ConnectionBlocker locallabBlocker(locallabConn); everything->set_inconsistent (false); @@ -438,6 +625,7 @@ void PartialPasteDlg::everythingToggled () meta->set_active(everything->get_active()); raw->set_active(everything->get_active()); advanced->set_active(everything->get_active()); + locallab->set_active(everything->get_active()); //toggle group children PartialPasteDlg::basicToggled (); @@ -448,6 +636,7 @@ void PartialPasteDlg::everythingToggled () PartialPasteDlg::metaToggled (); PartialPasteDlg::rawToggled (); PartialPasteDlg::advancedToggled (); + PartialPasteDlg::locallabToggled(); } void PartialPasteDlg::rawToggled () @@ -472,14 +661,15 @@ void PartialPasteDlg::rawToggled () ConnectionBlocker df_AutoSelectBlocker(df_AutoSelectConn); ConnectionBlocker ff_fileBlocker(ff_fileConn); ConnectionBlocker ff_AutoSelectBlocker(ff_AutoSelectConn); + ConnectionBlocker ff_FromMetaDataBlocker(ff_FromMetaDataConn); ConnectionBlocker ff_BlurTypeBlocker(ff_BlurTypeConn); ConnectionBlocker ff_BlurRadiusBlocker(ff_BlurRadiusConn); ConnectionBlocker ff_ClipControlBlocker(ff_ClipControlConn); ConnectionBlocker raw_ca_autocorrectBlocker(raw_ca_autocorrectConn); ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn); ConnectionBlocker raw_ca_avoid_colourshiftBlocker(raw_ca_avoid_colourshiftconn); - ConnectionBlocker filmNegativeBlocker(filmNegativeConn); ConnectionBlocker captureSharpeningBlocker(captureSharpeningConn); + ConnectionBlocker raw_preprocwbBlocker(raw_preprocwbConn); raw->set_inconsistent (false); @@ -502,14 +692,15 @@ void PartialPasteDlg::rawToggled () df_AutoSelect->set_active (raw->get_active ()); ff_file->set_active (raw->get_active ()); ff_AutoSelect->set_active (raw->get_active ()); + ff_FromMetaData->set_active (raw->get_active ()); ff_BlurType->set_active (raw->get_active ()); ff_BlurRadius->set_active (raw->get_active ()); ff_ClipControl->set_active (raw->get_active ()); raw_ca_autocorrect->set_active (raw->get_active ()); raw_caredblue->set_active (raw->get_active ()); raw_ca_avoid_colourshift->set_active (raw->get_active ()); - filmNegative->set_active (raw->get_active()); captureSharpening->set_active (raw->get_active()); + raw_preprocwb->set_active (raw->get_active()); } void PartialPasteDlg::basicToggled () @@ -518,6 +709,7 @@ void PartialPasteDlg::basicToggled () ConnectionBlocker wbBlocker(wbConn); ConnectionBlocker exposureBlocker(exposureConn); ConnectionBlocker shBlocker(shConn); + ConnectionBlocker toneEqualizerBlocker(toneEqualizerConn); ConnectionBlocker epdBlocker(epdConn); ConnectionBlocker fattalBlocker(fattalConn); ConnectionBlocker pcvignetteBlocker(pcvignetteConn); @@ -529,6 +721,7 @@ void PartialPasteDlg::basicToggled () wb->set_active (basic->get_active ()); exposure->set_active (basic->get_active ()); sh->set_active (basic->get_active ()); + toneEqualizer->set_active (basic->get_active ()); epd->set_active (basic->get_active ()); fattal->set_active (basic->get_active ()); pcvignette->set_active (basic->get_active ()); @@ -539,6 +732,7 @@ void PartialPasteDlg::basicToggled () void PartialPasteDlg::detailToggled () { + ConnectionBlocker spotBlocker(spotConn); ConnectionBlocker sharpenBlocker(sharpenConn); ConnectionBlocker localcontrastBlocker(localcontrastConn); ConnectionBlocker gradsharpenBlocker(gradsharpenConn); @@ -551,6 +745,7 @@ void PartialPasteDlg::detailToggled () detail->set_inconsistent (false); + spot->set_active (detail->get_active ()); sharpen->set_active (detail->get_active ()); localcontrast->set_active(detail->get_active()); sharpenedge->set_active (detail->get_active ()); @@ -585,6 +780,7 @@ void PartialPasteDlg::colorToggled () ConnectionBlocker chmixerbwBlocker(chmixerbwConn); ConnectionBlocker hsveqBlocker(hsveqConn); ConnectionBlocker filmSimulationBlocker(filmSimulationConn); + ConnectionBlocker filmNegativeBlocker(filmNegativeConn); ConnectionBlocker softlightBlocker(softlightConn); ConnectionBlocker rgbcurvesBlocker(rgbcurvesConn); ConnectionBlocker colortoningBlocker(colortoningConn); @@ -597,6 +793,7 @@ void PartialPasteDlg::colorToggled () blackwhite->set_active (color->get_active ()); hsveq->set_active (color->get_active ()); filmSimulation->set_active (color->get_active ()); + filmNegative->set_active (color->get_active()); softlight->set_active (color->get_active ()); rgbcurves->set_active (color->get_active ()); colortoning->set_active(color->get_active ()); @@ -654,6 +851,17 @@ void PartialPasteDlg::metaToggled () iptc->set_active (meta->get_active ()); } +void PartialPasteDlg::locallabToggled() +{ + locallab->set_inconsistent (false); + + if (locallab->get_active()) { + spots->enableAll(); + } else { + spots->disableAll(); + } +} + /* * Copies the selected items from the source ProcParams+ParamsEdited(optional) @@ -663,7 +871,9 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param { ParamsEdited falsePE; // falsePE is a workaround to set a group of ParamsEdited to false + falsePE.locallab.spots.resize(srcPP->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(false)); ParamsEdited filterPE(true); // Contains the initial information about the loaded values + filterPE.locallab.spots.resize(srcPP->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); if (srcPE) { filterPE = *srcPE; @@ -689,6 +899,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.sh = falsePE.sh; } + if (!toneEqualizer->get_active ()) { + filterPE.toneEqualizer = falsePE.toneEqualizer; + } + if (!epd->get_active ()) { filterPE.epd = falsePE.epd; } @@ -717,6 +931,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.colorappearance = falsePE.colorappearance; } + if (!spot->get_active ()) { + filterPE.spot = falsePE.spot; + } + if (!sharpen->get_active ()) { filterPE.sharpening = falsePE.sharpening; } @@ -780,7 +998,7 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param if (!dehaze->get_active ()) { filterPE.dehaze = falsePE.dehaze; } - + if (!rgbcurves->get_active ()) { filterPE.rgbCurves = falsePE.rgbCurves; } @@ -901,6 +1119,7 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.raw.bayersensor.pixelShiftHoleFill = falsePE.raw.bayersensor.pixelShiftHoleFill; filterPE.raw.bayersensor.pixelShiftDemosaicMethod = falsePE.raw.bayersensor.pixelShiftDemosaicMethod; filterPE.raw.bayersensor.pixelShiftMedian = falsePE.raw.bayersensor.pixelShiftMedian; + filterPE.raw.bayersensor.pixelShiftAverage = falsePE.raw.bayersensor.pixelShiftAverage; filterPE.raw.bayersensor.pixelShiftMotionCorrectionMethod = falsePE.raw.bayersensor.pixelShiftMotionCorrectionMethod; filterPE.raw.bayersensor.pixelShiftNonGreenCross = falsePE.raw.bayersensor.pixelShiftNonGreenCross; filterPE.raw.bayersensor.pixelShiftSigma = falsePE.raw.bayersensor.pixelShiftSigma; @@ -968,6 +1187,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.raw.ff_AutoSelect = falsePE.raw.ff_AutoSelect; } + if (!ff_FromMetaData->get_active ()) { + filterPE.raw.ff_FromMetaData = falsePE.raw.ff_FromMetaData; + } + if (!ff_BlurRadius->get_active ()) { filterPE.raw.ff_BlurRadius = falsePE.raw.ff_BlurRadius; } @@ -986,6 +1209,9 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.filmNegative.redRatio = falsePE.filmNegative.redRatio; filterPE.filmNegative.greenExp = falsePE.filmNegative.greenExp; filterPE.filmNegative.blueRatio = falsePE.filmNegative.blueRatio; + filterPE.filmNegative.refInput = falsePE.filmNegative.refInput; + filterPE.filmNegative.refOutput = falsePE.filmNegative.refOutput; + filterPE.filmNegative.colorSpace = falsePE.filmNegative.colorSpace; } if (!captureSharpening->get_active ()) { @@ -999,10 +1225,79 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.pdsharpening.deconvitercheck = falsePE.pdsharpening.deconvitercheck; } - if (dstPE) { - *dstPE = filterPE; + if (!raw_preprocwb->get_active ()) { + filterPE.raw.preprocessWB.mode = falsePE.raw.preprocessWB.mode; } - // Apply the filter! - filterPE.combine(*dstPP, *srcPP, true); + // Locallab shall be kept in last position + if (!locallab->get_active () && !locallab->get_inconsistent()) { + filterPE.locallab = falsePE.locallab; + + if (dstPE) { + *dstPE = filterPE; + } + + // Apply the filter! + filterPE.combine(*dstPP, *srcPP, true); + } else { // Update PE and PP according to chosen spot + // Get chosen spots + std::vector chosenSpots = spots->getSelectionStatus(); + + // Create temporary PP and PE based on scrPP and scrPE + rtengine::procparams::ProcParams tmpPP = rtengine::procparams::ProcParams(*srcPP); + ParamsEdited tmpPE = ParamsEdited(filterPE); + + // Update tmpPP and tmpPE according to chosen spots + for (int i = ((int)chosenSpots.size() - 1); i >= 0; i--) { + if (!chosenSpots.at(i)) { + tmpPP.locallab.spots.erase(tmpPP.locallab.spots.begin() + i); + tmpPE.locallab.spots.erase(tmpPE.locallab.spots.begin() + i); + + // Locallab Selspot param shall be kept in vector size limit + tmpPP.locallab.selspot = std::max(0, std::min(tmpPP.locallab.selspot, (int)tmpPP.locallab.spots.size() - 1)); + } + } + + if (dstPE) { + *dstPE = tmpPE; + } + + // Apply the filter! + tmpPE.combine(*dstPP, tmpPP, true); + } +} + +void PartialPasteDlg::updateSpotWidget(const rtengine::procparams::ProcParams* pp) +{ + locallab->set_inconsistent(false); + + if (pp->locallab.spots.size() > 0) { + spots->set_visible(true); + spots->updateSpotWidget(pp, locallab->get_active()); + } else { + spots->set_visible(false); // Hide widget if there is no locallab spot + } +} + +void PartialPasteDlg::partialSpotUpdated(const UpdateStatus status) +{ + locallabConn.block(true); + + switch (status) { + case (AllSelection): + locallab->set_active(true); + locallab->set_inconsistent(false); + break; + + case (NoSelection): + locallab->set_active(false); + locallab->set_inconsistent(false); + break; + + case (PartialSelection): + locallab->set_active(false); + locallab->set_inconsistent(true); + } + + locallabConn.block(false); } diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index 1403e7c1b..1dee55a6e 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -34,7 +34,81 @@ class ProcParams; struct ParamsEdited; -class PartialPasteDlg : public Gtk::Dialog +/* ==== PartialSpotWidgetListener ==== */ +class PartialSpotWidget; +class PartialSpotWidgetListener +{ +public: + enum UpdateStatus { + AllSelection = 1, + NoSelection = 2, + PartialSelection = 3 + }; + +public: + PartialSpotWidgetListener() {}; + virtual ~PartialSpotWidgetListener() {}; + + virtual void partialSpotUpdated(const UpdateStatus status) = 0; +}; + +/* ==== PartialSpotWidget ==== */ +class PartialSpotWidget: + public Gtk::Box +{ +private: + // Tree model to manage spot selection widget + class SpotRow: + public Gtk::TreeModel::ColumnRecord + { + public: + Gtk::TreeModelColumn keep; + Gtk::TreeModelColumn spotname; + + SpotRow() + { + add(keep); + add(spotname); + } + }; + + // Spot selection widgets + Gtk::TreeView* const treeview; + sigc::connection treeviewconn; + SpotRow spotRow; + Glib::RefPtr treemodel; + + // Spot selection listener + PartialSpotWidgetListener* selListener; + +public: + PartialSpotWidget(); + + // Setter for spot selection listener + void setPartialSpotWidgetListener(PartialSpotWidgetListener* pswl) + { + selListener = pswl; + } + + // Spot selection widget management functions + void updateSpotWidget(const rtengine::procparams::ProcParams* pp, const bool defValue); + void enableAll(); + void disableAll(); + std::vector getSelectionStatus(); + +private: + // GUI aspect management functions + void render_keep(Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); + void render_spotname(Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); + + // Event management function + void keepToggled(const Glib::ustring &path); +}; + +/* ==== PartialPasteDlg ==== */ +class PartialPasteDlg final: + public Gtk::Dialog, + public PartialSpotWidgetListener { public: @@ -52,12 +126,14 @@ public: Gtk::CheckButton* meta; Gtk::CheckButton* raw; Gtk::CheckButton* advanced; + Gtk::CheckButton* locallab; // options in basic: Gtk::CheckButton* wb; Gtk::CheckButton* exposure; Gtk::CheckButton* localcontrast; Gtk::CheckButton* sh; + Gtk::CheckButton* toneEqualizer; Gtk::CheckButton* epd; Gtk::CheckButton* fattal; Gtk::CheckButton* retinex; @@ -67,6 +143,7 @@ public: Gtk::CheckButton* colorappearance; // options in detail: + Gtk::CheckButton* spot; Gtk::CheckButton* sharpen; Gtk::CheckButton* sharpenedge; Gtk::CheckButton* sharpenmicro; @@ -111,6 +188,8 @@ public: Gtk::CheckButton* exifch; Gtk::CheckButton* iptc; + // options in locallab: + PartialSpotWidget* spots; // options in raw: Gtk::CheckButton* raw_expos; @@ -136,25 +215,29 @@ public: Gtk::CheckButton* df_AutoSelect; Gtk::CheckButton* ff_file; Gtk::CheckButton* ff_AutoSelect; + Gtk::CheckButton* ff_FromMetaData; Gtk::CheckButton* ff_BlurRadius; Gtk::CheckButton* ff_BlurType; Gtk::CheckButton* ff_ClipControl; Gtk::CheckButton* filmNegative; Gtk::CheckButton* captureSharpening; + Gtk::CheckButton* raw_preprocwb; sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, advancedConn; - + sigc::connection locallabConn; sigc::connection wbConn, exposureConn, localcontrastConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn; - sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, fattalConn, dirpyreqConn, waveletConn, retinexConn, dehazeConn; + sigc::connection toneEqualizerConn; + sigc::connection spotConn, 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 df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_FromMetaDataConn, ff_BlurRadiusConn, ff_BlurTypeConn, ff_ClipControlConn; 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; sigc::connection filmNegativeConn; sigc::connection captureSharpeningConn; + sigc::connection raw_preprocwbConn; public: PartialPasteDlg (const Glib::ustring &title, Gtk::Window* parent); @@ -170,4 +253,8 @@ public: void metaToggled (); void rawToggled (); void advancedToggled (); + void locallabToggled (); + + void updateSpotWidget(const rtengine::procparams::ProcParams* pp); + void partialSpotUpdated(const UpdateStatus status); }; diff --git a/rtgui/pcvignette.cc b/rtgui/pcvignette.cc index 9c141d618..1ed7446b1 100644 --- a/rtgui/pcvignette.cc +++ b/rtgui/pcvignette.cc @@ -8,7 +8,9 @@ using namespace rtengine; using namespace rtengine::procparams; -PCVignette::PCVignette () : FoldableToolPanel(this, "pcvignette", M("TP_PCVIGNETTE_LABEL"), false, true) +const Glib::ustring PCVignette::TOOL_NAME = "pcvignette"; + +PCVignette::PCVignette () : FoldableToolPanel(this, TOOL_NAME, M("TP_PCVIGNETTE_LABEL"), false, true) { strength = Gtk::manage (new Adjuster (M("TP_PCVIGNETTE_STRENGTH"), -6, 6, 0.01, 0)); strength->set_tooltip_text (M("TP_PCVIGNETTE_STRENGTH_TOOLTIP")); diff --git a/rtgui/pcvignette.h b/rtgui/pcvignette.h index 87915703f..825654630 100644 --- a/rtgui/pcvignette.h +++ b/rtgui/pcvignette.h @@ -20,6 +20,7 @@ protected: Adjuster* roundness; public: + static const Glib::ustring TOOL_NAME; PCVignette (); diff --git a/rtgui/pdsharpening.cc b/rtgui/pdsharpening.cc index 18fa7aa2a..57133048c 100644 --- a/rtgui/pdsharpening.cc +++ b/rtgui/pdsharpening.cc @@ -31,8 +31,10 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring PdSharpening::TOOL_NAME = "capturesharpening"; + PdSharpening::PdSharpening() : - FoldableToolPanel(this, "capturesharpening", M("TP_PDSHARPENING_LABEL"), false, true), + FoldableToolPanel(this, TOOL_NAME, M("TP_PDSHARPENING_LABEL"), false, true), lastAutoContrast(true), lastAutoRadius(true) { @@ -45,7 +47,7 @@ PdSharpening::PdSharpening() : EvPdShrAutoContrast = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST"); EvPdShrAutoRadius = m->newEvent(CAPTURESHARPEN, "HISTORY_MSG_PDSHARPEN_AUTO_RADIUS"); - Gtk::HBox* hb = Gtk::manage(new Gtk::HBox()); + Gtk::Box* hb = Gtk::manage(new Gtk::Box()); hb->show(); contrast = Gtk::manage(new Adjuster(M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 10)); contrast->setAdjusterListener(this); @@ -57,8 +59,8 @@ PdSharpening::PdSharpening() : pack_start(*hb); - Gtk::VBox* rld = Gtk::manage(new Gtk::VBox()); - dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS"), 0.4, 1.15, 0.01, 0.75)); + Gtk::Box* rld = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + dradius = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS"), 0.4, 2.0, 0.01, 0.75)); dradius->addAutoButton(); dradius->setAutoValue(true); dradiusOffset = Gtk::manage(new Adjuster(M("TP_SHARPENING_RADIUS_BOOST"), -0.5, 0.5, 0.01, 0.0)); @@ -81,10 +83,10 @@ PdSharpening::PdSharpening() : dradiusOffset->setAdjusterListener(this); diter->setAdjusterListener(this); - contrast->delay = std::max(contrast->delay, options.adjusterMaxDelay); - dradius->delay = std::max(dradius->delay, options.adjusterMaxDelay); - dradiusOffset->delay = std::max(dradiusOffset->delay, options.adjusterMaxDelay); - diter->delay = std::max(diter->delay, options.adjusterMaxDelay); + contrast->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + dradius->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + dradiusOffset->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); + diter->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); } PdSharpening::~PdSharpening() diff --git a/rtgui/pdsharpening.h b/rtgui/pdsharpening.h index eb0576ceb..c4902e4b6 100644 --- a/rtgui/pdsharpening.h +++ b/rtgui/pdsharpening.h @@ -50,6 +50,7 @@ protected: IdleRegister idle_register; public: + static const Glib::ustring TOOL_NAME; PdSharpening (); ~PdSharpening () override; diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index b86da6a52..648db44be 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -16,34 +16,292 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include "eventmapper.h" #include "perspective.h" #include "rtimage.h" +#include "rtsurface.h" #include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; -PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M("TP_PERSPECTIVE_LABEL")) +const Glib::ustring PerspCorrection::TOOL_NAME = "perspective"; + +namespace { +void controlLinesToValues(const std::vector& lines, + std::vector& values, std::vector& types) +{ + values.clear(); + types.clear(); + + for (auto&& line : lines) { + values.push_back(line.x1); + values.push_back(line.y1); + values.push_back(line.x2); + values.push_back(line.y2); + + int type = -1; + switch (line.type) { + case rtengine::ControlLine::VERTICAL: + type = 0; + break; + case rtengine::ControlLine::HORIZONTAL: + type = 1; + break; + } + types.push_back(type); + } +} + +std::vector valuesToControlLines( + const std::vector& values, const std::vector& types) +{ + int line_count = min(values.size() / 4, types.size()); + std::vector lines(line_count); + + auto values_iter = values.begin(); + auto types_iter = types.begin(); + for (auto&& line : lines) { + line.x1 = *(values_iter++); + line.y1 = *(values_iter++); + line.x2 = *(values_iter++); + line.y2 = *(values_iter++); + + switch (*(types_iter++)) { + case 0: + line.type = rtengine::ControlLine::VERTICAL; + break; + case 1: + line.type = rtengine::ControlLine::HORIZONTAL; + break; + } + } + + return lines; +} + +} + +PerspCorrection::PerspCorrection () : FoldableToolPanel(this, TOOL_NAME, M("TP_PERSPECTIVE_LABEL")) +{ + + auto mapper = ProcEventMapper::getInstance(); + // Normal events. + EvPerspCamAngle = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_CAM_ANGLE"); + EvPerspCamFocalLength = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_CAM_FL"); + EvPerspCamShift = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_CAM_SHIFT"); + EvPerspMethod = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_METHOD"); + EvPerspProjAngle = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_ANGLE"); + EvPerspProjRotate = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_ROTATE"); + EvPerspProjShift = mapper->newEvent(TRANSFORM, "HISTORY_MSG_PERSP_PROJ_SHIFT"); + EvPerspRender = mapper->newEvent(TRANSFORM, "GENERAL_NA"); + // Void events. + EvPerspCamAngleVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CAM_ANGLE"); + EvPerspCamFocalLengthVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CAM_FL"); + EvPerspCamShiftVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CAM_SHIFT"); + EvPerspProjAngleVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_ANGLE"); + EvPerspProjRotateVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_ROTATE"); + EvPerspProjShiftVoid = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_PROJ_SHIFT"); + setCamBasedEventsActive(); + EvPerspControlLines = mapper->newEvent(M_VOID, "HISTORY_MSG_PERSP_CTRL_LINE"); + + lens_geom_listener = nullptr; + panel_listener = nullptr; + metadata = nullptr; + + Gtk::Image* ipers_draw(new RTImage ("draw.png")); + Gtk::Image* ipers_trash = Gtk::manage (new RTImage ("trash-empty.png")); + Gtk::Image* ipers_apply = Gtk::manage (new RTImage ("tick.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); + Gtk::Image* ipers_auto_pitch = Gtk::manage (new RTImage ("perspective-vertical-bottom.png")); + Gtk::Image* ipers_auto_yaw = Gtk::manage (new RTImage ("perspective-horizontal-left.png")); + Gtk::Image* ipers_auto_pitch_yaw = Gtk::manage (new RTImage ("perspective-horizontal-vertical.png")); + + Gtk::Image* ipers_cam_yaw_left = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); + Gtk::Image* ipers_cam_yaw_right = Gtk::manage (new RTImage ("perspective-horizontal-right-small.png")); + Gtk::Image* ipers_cam_pitch_left = Gtk::manage (new RTImage ("perspective-vertical-bottom-small.png")); + Gtk::Image* ipers_cam_pitch_right = Gtk::manage (new RTImage ("perspective-vertical-top-small.png")); + Gtk::Image* ipers_proj_yaw_left = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); + Gtk::Image* ipers_proj_yaw_right = Gtk::manage (new RTImage ("perspective-horizontal-right-small.png")); + Gtk::Image* ipers_proj_pitch_left = Gtk::manage (new RTImage ("perspective-vertical-bottom-small.png")); + Gtk::Image* ipers_proj_pitch_right = Gtk::manage (new RTImage ("perspective-vertical-top-small.png")); + Gtk::Image* ipers_rotate_left = Gtk::manage(new RTImage("rotate-right-small.png")); + Gtk::Image* ipers_rotate_right = Gtk::manage(new RTImage("rotate-left-small.png")); + + Gtk::Box* method_hbox = Gtk::manage (new Gtk::Box()); + Gtk::Label* method_label = Gtk::manage (new Gtk::Label (M("TP_PERSPECTIVE_METHOD") + ": ")); + method = Gtk::manage (new MyComboBoxText ()); + method->append (M("TP_PERSPECTIVE_METHOD_SIMPLE")); + method->append (M("TP_PERSPECTIVE_METHOD_CAMERA_BASED")); + method_hbox->pack_start(*method_label, Gtk::PACK_SHRINK); + method_hbox->pack_start(*method); + pack_start(*method_hbox); + + simple = Gtk::manage( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); vert = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_VERTICAL"), -100, 100, 0.1, 0, ipersVL, ipersVR)); vert->setAdjusterListener (this); - pack_start (*horiz); - pack_start (*vert); + horiz = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_HORIZONTAL"), -100, 100, 0.1, 0, ipersHL, ipersHR)); + horiz->setAdjusterListener (this); + + camera_based = Gtk::manage( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); + + Gtk::Frame* camera_frame = Gtk::manage (new Gtk::Frame + (M("TP_PERSPECTIVE_CAMERA_FRAME"))); + camera_frame->set_label_align(0.025, 0.5); + + Gtk::Box* camera_vbox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + + camera_focal_length = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH"), 0.5, 2000, 0.01, PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH)); + camera_focal_length->setAdjusterListener (this); + + camera_crop_factor = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_CROP_FACTOR"), 0.1, 30, 0.01, PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR)); + camera_crop_factor->setAdjusterListener (this); + + camera_shift_horiz = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL"), -50, 50, 0.01, 0)); + camera_shift_horiz->setAdjusterListener (this); + + camera_shift_vert = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL"), -50, 50, 0.01, 0)); + camera_shift_vert->setAdjusterListener (this); + + camera_roll = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_ROLL"), -45, 45, 0.01, 0)); + camera_roll->setAdjusterListener (this); + + camera_pitch = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_PITCH"), + -60, 60, 0.1, 0, ipers_cam_pitch_left, ipers_cam_pitch_right)); + camera_pitch->setAdjusterListener (this); + + camera_yaw = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_YAW"), + -60, 60, 0.1, 0, ipers_cam_yaw_left, ipers_cam_yaw_right)); + camera_yaw->setAdjusterListener (this); + + // Begin control lines interface. + lines_button_apply = Gtk::manage (new Gtk::Button()); + lines_button_apply->set_image(*ipers_apply); + lines_button_apply->set_tooltip_text(M("GENERAL_APPLY")); + lines_button_apply->set_sensitive(false); + lines_button_apply->signal_pressed().connect(sigc::mem_fun( + *this, &::PerspCorrection::linesApplyButtonPressed)); + + lines_button_edit = Gtk::manage (new Gtk::ToggleButton()); + lines_button_edit->set_image(*ipers_draw); + lines_button_edit->set_tooltip_text(M("GENERAL_EDIT")); + lines_button_edit->signal_toggled().connect(sigc::mem_fun( + *this, &::PerspCorrection::linesEditButtonPressed)); + + lines_button_erase = Gtk::manage (new Gtk::Button()); + lines_button_erase->set_image(*ipers_trash); + lines_button_erase->set_tooltip_text(M("GENERAL_DELETE_ALL")); + lines_button_erase->set_sensitive(false); + lines_button_erase->signal_pressed().connect(sigc::mem_fun( + *this, &::PerspCorrection::linesEraseButtonPressed)); + + lines = std::unique_ptr(new ControlLineManager()); + lines->callbacks = std::make_shared(this); + + Gtk::Box* control_lines_box = Gtk::manage (new Gtk::Box()); + Gtk::Label* control_lines_label = Gtk::manage (new Gtk::Label (M("TP_PERSPECTIVE_CONTROL_LINES") + ": ")); + control_lines_label->set_tooltip_markup( M("TP_PERSPECTIVE_CONTROL_LINES_TOOLTIP") ); + control_lines_box->pack_start(*control_lines_label, Gtk::PACK_SHRINK); + control_lines_box->pack_start(*lines_button_edit); + control_lines_box->pack_start(*lines_button_apply); + control_lines_box->pack_start(*lines_button_erase); + // End control lines interface. + + auto_pitch = Gtk::manage (new Gtk::Button ()); + auto_pitch->set_image(*ipers_auto_pitch); + auto_pitch->signal_pressed().connect( sigc::bind(sigc::mem_fun(*this, &PerspCorrection::autoCorrectionPressed), auto_pitch) ); + + auto_yaw = Gtk::manage (new Gtk::Button ()); + auto_yaw->set_image(*ipers_auto_yaw); + auto_yaw->signal_pressed().connect( sigc::bind(sigc::mem_fun(*this, &PerspCorrection::autoCorrectionPressed), auto_yaw) ); + + auto_pitch_yaw = Gtk::manage (new Gtk::Button ()); + auto_pitch_yaw->set_image(*ipers_auto_pitch_yaw); + auto_pitch_yaw->signal_pressed().connect( sigc::bind(sigc::mem_fun(*this, &PerspCorrection::autoCorrectionPressed), auto_pitch_yaw) ); + + Gtk::Box* auto_hbox = Gtk::manage (new Gtk::Box()); + Gtk::Label* auto_label = Gtk::manage (new Gtk::Label (M("GENERAL_AUTO") + ": ")); + auto_hbox->pack_start(*auto_label, Gtk::PACK_SHRINK); + + Gtk::Frame* pca_frame = Gtk::manage (new Gtk::Frame + (M("TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME"))); + pca_frame->set_label_align(0.025, 0.5); + + Gtk::Box* pca_vbox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + + projection_shift_horiz = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL"), -100, 100, 0.01, 0)); + projection_shift_horiz->setAdjusterListener (this); + + projection_shift_vert = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL"), -100, 100, 0.01, 0)); + projection_shift_vert->setAdjusterListener (this); + + projection_rotate = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_PROJECTION_ROTATE"), -45, 45, 0.01, 0, ipers_rotate_left, ipers_rotate_right)); + projection_rotate->setAdjusterListener (this); + + Gtk::Frame* recovery_frame = Gtk::manage (new Gtk::Frame + (M("TP_PERSPECTIVE_RECOVERY_FRAME"))); + recovery_frame->set_label_align(0.025, 0.5); + + Gtk::Box* recovery_vbox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + + projection_pitch = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_PROJECTION_PITCH"), -60, 60, 0.1, 0, ipers_proj_pitch_left, ipers_proj_pitch_right)); + projection_pitch->setAdjusterListener (this); + + projection_yaw = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_PROJECTION_YAW"), -60, 60, 0.1, 0, ipers_proj_yaw_left, ipers_proj_yaw_right)); + projection_yaw->setAdjusterListener (this); + + simple->pack_start (*horiz); + simple->pack_start (*vert); + + auto_hbox->pack_start (*auto_pitch); + auto_hbox->pack_start (*auto_yaw); + auto_hbox->pack_start (*auto_pitch_yaw); + + camera_vbox->pack_start (*camera_focal_length); + camera_vbox->pack_start (*camera_crop_factor); + camera_vbox->pack_start (*camera_shift_horiz); + camera_vbox->pack_start (*camera_shift_vert); + camera_vbox->pack_start (*camera_roll); + camera_vbox->pack_start (*camera_pitch); + camera_vbox->pack_start (*camera_yaw); + camera_vbox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); + camera_vbox->pack_start (*control_lines_box); + camera_vbox->pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); + camera_vbox->pack_start (*auto_hbox); + camera_frame->add(*camera_vbox); + camera_based->pack_start(*camera_frame); + + pca_vbox->pack_start (*projection_shift_horiz); + pca_vbox->pack_start (*projection_shift_vert); + pca_vbox->pack_start (*projection_rotate); + pca_frame->add(*pca_vbox); + camera_based->pack_start(*pca_frame); + + recovery_vbox->pack_start (*projection_yaw); + recovery_vbox->pack_start (*projection_pitch); + recovery_frame->add(*recovery_vbox); + camera_based->pack_start(*recovery_frame); + + pack_start(*simple); + pack_start(*camera_based); horiz->setLogScale(2, 0); vert->setLogScale(2, 0); + camera_focal_length->setLogScale(4000, 0.5); + camera_crop_factor->setLogScale(300, 0.1); + + method->signal_changed().connect(sigc::mem_fun(*this, &PerspCorrection::methodChanged)); show_all(); } @@ -56,23 +314,115 @@ void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited) if (pedited) { horiz->setEditedState (pedited->perspective.horizontal ? Edited : UnEdited); vert->setEditedState (pedited->perspective.vertical ? Edited : UnEdited); + camera_crop_factor->setEditedState (pedited->perspective.camera_crop_factor ? Edited : UnEdited); + camera_focal_length->setEditedState (pedited->perspective.camera_focal_length ? Edited : UnEdited); + camera_pitch->setEditedState (pedited->perspective.camera_pitch ? Edited : UnEdited); + camera_roll->setEditedState (pedited->perspective.camera_roll ? Edited : UnEdited); + camera_shift_horiz->setEditedState (pedited->perspective.camera_shift_horiz ? Edited : UnEdited); + camera_shift_vert->setEditedState (pedited->perspective.camera_shift_vert ? Edited : UnEdited); + camera_yaw->setEditedState (pedited->perspective.camera_yaw ? Edited : UnEdited); + projection_pitch->setEditedState (pedited->perspective.projection_pitch ? Edited : UnEdited); + projection_rotate->setEditedState (pedited->perspective.projection_rotate ? Edited : UnEdited); + projection_shift_horiz->setEditedState (pedited->perspective.projection_shift_horiz ? Edited : UnEdited); + projection_shift_vert->setEditedState (pedited->perspective.projection_shift_vert ? Edited : UnEdited); + projection_yaw->setEditedState (pedited->perspective.projection_yaw ? Edited : UnEdited); + lines->setEdited (pedited->perspective.control_lines); } horiz->setValue (pp->perspective.horizontal); vert->setValue (pp->perspective.vertical); + setFocalLengthValue (pp, metadata); + camera_pitch->setValue (pp->perspective.camera_pitch); + camera_roll->setValue (pp->perspective.camera_roll); + camera_shift_horiz->setValue (pp->perspective.camera_shift_horiz); + camera_shift_vert->setValue (pp->perspective.camera_shift_vert); + camera_yaw->setValue (pp->perspective.camera_yaw); + projection_pitch->setValue (pp->perspective.projection_pitch); + projection_rotate->setValue (pp->perspective.projection_rotate); + projection_shift_horiz->setValue (pp->perspective.projection_shift_horiz); + projection_shift_vert->setValue (pp->perspective.projection_shift_vert); + projection_yaw->setValue (pp->perspective.projection_yaw); + lines->setLines(valuesToControlLines(pp->perspective.control_line_values, + pp->perspective.control_line_types)); + + if (pedited && !pedited->perspective.method) { + method->set_active (2); + } else if (pp->perspective.method == "simple") { + method->set_active (0); + } else if (pp->perspective.method == "camera_based") { + method->set_active (1); + } + + updateApplyDeleteButtons(); enableListener (); } void PerspCorrection::write (ProcParams* pp, ParamsEdited* pedited) { + // If any of these are non-zero, the focal length and crop factor must be + // updated to ensure they won't be auto-filled from metadata later. This + // prevents surprise changes to the perspective correction results. + const bool update_fl = camera_pitch->getValue() != 0 || + camera_yaw->getValue() != 0 || + projection_pitch->getValue() != 0 || + projection_yaw->getValue() != 0; + + pp->perspective.render = render; pp->perspective.horizontal = horiz->getValue (); pp->perspective.vertical = vert->getValue (); + if (update_fl || pp->perspective.camera_crop_factor > 0 || + std::abs(camera_crop_factor->getValue() - PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR) > 1e-5) { + // Update if update_fl is true or the crop factor has previously been + // set or if the adjuster has changed from the default value. + pp->perspective.camera_crop_factor = camera_crop_factor->getValue (); + } + if (update_fl || pp->perspective.camera_focal_length > 0 || + std::abs(camera_focal_length->getValue() - PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH) > 1e-4) { + // Update if update_fl is true or the focal length has previously been + // set or if the adjuster has changed from the default value. + pp->perspective.camera_focal_length = camera_focal_length->getValue (); + } + pp->perspective.camera_pitch = camera_pitch->getValue (); + pp->perspective.camera_roll = camera_roll->getValue (); + pp->perspective.camera_shift_horiz = camera_shift_horiz->getValue (); + pp->perspective.camera_shift_vert = camera_shift_vert->getValue (); + pp->perspective.camera_yaw = camera_yaw->getValue (); + pp->perspective.projection_pitch = projection_pitch->getValue (); + pp->perspective.projection_rotate = projection_rotate->getValue (); + pp->perspective.projection_shift_horiz = projection_shift_horiz->getValue (); + pp->perspective.projection_shift_vert = projection_shift_vert->getValue (); + pp->perspective.projection_yaw = projection_yaw->getValue (); + + std::vector control_lines; + lines->toControlLines(control_lines); + controlLinesToValues(control_lines, pp->perspective.control_line_values, + pp->perspective.control_line_types); + + if (method->get_active_row_number() == 0) { + pp->perspective.method = "simple"; + } else if (method->get_active_row_number() == 1) { + pp->perspective.method = "camera_based"; + } if (pedited) { + pedited->perspective.method = method->get_active_row_number() != 2; pedited->perspective.horizontal = horiz->getEditedState (); pedited->perspective.vertical = vert->getEditedState (); + pedited->perspective.camera_crop_factor= camera_crop_factor->getEditedState (); + pedited->perspective.camera_focal_length = camera_focal_length->getEditedState (); + pedited->perspective.camera_pitch = camera_pitch->getEditedState(); + pedited->perspective.camera_roll = camera_roll->getEditedState(); + pedited->perspective.camera_shift_horiz = camera_shift_horiz->getEditedState(); + pedited->perspective.camera_shift_vert = camera_shift_vert->getEditedState(); + pedited->perspective.camera_yaw = camera_yaw->getEditedState(); + pedited->perspective.projection_pitch = projection_pitch->getEditedState(); + pedited->perspective.projection_rotate = projection_rotate->getEditedState(); + pedited->perspective.projection_shift_horiz = projection_shift_horiz->getEditedState(); + pedited->perspective.projection_shift_vert = projection_shift_vert->getEditedState(); + pedited->perspective.projection_yaw = projection_yaw->getEditedState(); + pedited->perspective.control_lines = lines->getEdited(); } } @@ -81,28 +431,227 @@ void PerspCorrection::setDefaults (const ProcParams* defParams, const ParamsEdit horiz->setDefault (defParams->perspective.horizontal); vert->setDefault (defParams->perspective.vertical); + camera_crop_factor->setDefault(defParams->perspective.camera_crop_factor > 0 + ? defParams->perspective.camera_crop_factor + : PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR); + camera_focal_length->setDefault(defParams->perspective.camera_focal_length > 0 + ? defParams->perspective.camera_focal_length + : PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH); + camera_pitch->setDefault (defParams->perspective.camera_pitch); + camera_roll->setDefault (defParams->perspective.camera_roll); + camera_shift_horiz->setDefault (defParams->perspective.camera_shift_horiz); + camera_shift_vert->setDefault (defParams->perspective.camera_shift_vert); + camera_yaw->setDefault (defParams->perspective.camera_yaw); + projection_pitch->setDefault (defParams->perspective.projection_pitch); + projection_rotate->setDefault (defParams->perspective.projection_rotate); + projection_shift_horiz->setDefault (defParams->perspective.projection_shift_horiz); + projection_shift_vert->setDefault (defParams->perspective.projection_shift_vert); + projection_yaw->setDefault (defParams->perspective.projection_yaw); if (pedited) { horiz->setDefaultEditedState (pedited->perspective.horizontal ? Edited : UnEdited); vert->setDefaultEditedState (pedited->perspective.vertical ? Edited : UnEdited); + camera_crop_factor->setDefaultEditedState (pedited->perspective.camera_crop_factor ? Edited : UnEdited); + camera_focal_length->setDefaultEditedState (pedited->perspective.camera_focal_length ? Edited : UnEdited); + camera_pitch->setDefaultEditedState (pedited->perspective.camera_pitch ? Edited : UnEdited); + camera_roll->setDefaultEditedState (pedited->perspective.camera_roll ? Edited : UnEdited); + camera_shift_horiz->setDefaultEditedState (pedited->perspective.camera_shift_horiz ? Edited : UnEdited); + camera_shift_vert->setDefaultEditedState (pedited->perspective.camera_shift_vert ? Edited : UnEdited); + camera_yaw->setDefaultEditedState (pedited->perspective.camera_yaw ? Edited : UnEdited); + projection_pitch->setDefaultEditedState (pedited->perspective.projection_pitch ? Edited : UnEdited); + projection_rotate->setDefaultEditedState (pedited->perspective.projection_rotate ? Edited : UnEdited); + projection_shift_horiz->setDefaultEditedState (pedited->perspective.projection_shift_horiz ? Edited : UnEdited); + projection_shift_vert->setDefaultEditedState (pedited->perspective.projection_shift_vert ? Edited : UnEdited); + projection_yaw->setDefaultEditedState (pedited->perspective.projection_yaw ? Edited : UnEdited); } else { horiz->setDefaultEditedState (Irrelevant); vert->setDefaultEditedState (Irrelevant); + camera_crop_factor->setDefaultEditedState (Irrelevant); + camera_focal_length->setDefaultEditedState (Irrelevant); + camera_pitch->setDefaultEditedState (Irrelevant); + camera_roll->setDefaultEditedState (Irrelevant); + camera_shift_horiz->setDefaultEditedState (Irrelevant); + camera_shift_vert->setDefaultEditedState (Irrelevant); + camera_yaw->setDefaultEditedState (Irrelevant); + projection_pitch->setDefaultEditedState (Irrelevant); + projection_rotate->setDefaultEditedState (Irrelevant); + projection_shift_horiz->setDefaultEditedState (Irrelevant); + projection_shift_vert->setDefaultEditedState (Irrelevant); + projection_yaw->setDefaultEditedState (Irrelevant); } } 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())); + if (a == horiz || a == vert) { + listener->panelChanged (EvPerspCorr, + Glib::ustring::compose("%1=%2\n%3=%4", + M("TP_PERSPECTIVE_HORIZONTAL"), + horiz->getValue(), + M("TP_PERSPECTIVE_VERTICAL"), + vert->getValue())); + } else if (a == camera_focal_length || a == camera_crop_factor) { + listener->panelChanged (*event_persp_cam_focal_length, + Glib::ustring::compose("%1=%2\n%3=%4", + M("TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH"), + camera_focal_length->getValue(), + M("TP_PERSPECTIVE_CAMERA_CROP_FACTOR"), + camera_crop_factor->getValue())); + } else if (a == camera_shift_horiz || a == camera_shift_vert) { + listener->panelChanged (*event_persp_cam_shift, + Glib::ustring::compose("%1=%2\n%3=%4", + M("TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL"), + camera_shift_horiz->getValue(), + M("TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL"), + camera_shift_vert->getValue())); + } else if (a == camera_pitch || a == camera_roll|| a == camera_yaw) { + listener->panelChanged (*event_persp_cam_angle, + Glib::ustring::compose("%1=%2\n%3=%4\n%5=%6", + M("TP_PERSPECTIVE_CAMERA_ROLL"), + camera_roll->getValue(), + M("TP_PERSPECTIVE_CAMERA_YAW"), + camera_yaw->getValue(), + M("TP_PERSPECTIVE_CAMERA_PITCH"), + camera_pitch->getValue())); + } else if (a == projection_shift_horiz || a == projection_shift_vert) { + listener->panelChanged (*event_persp_proj_shift, + Glib::ustring::compose("%1=%2\n%3=%4", + M("TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL"), + projection_shift_horiz->getValue(), + M("TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL"), + projection_shift_vert->getValue())); + } else if (a == projection_rotate) { + listener->panelChanged (*event_persp_proj_rotate, + Glib::ustring::format(projection_rotate->getValue())); + } else if (a == projection_pitch || a == projection_yaw) { + listener->panelChanged (*event_persp_proj_angle, + Glib::ustring::compose("%1=%2\n%3=%4", + M("TP_PERSPECTIVE_PROJECTION_PITCH"), + projection_pitch->getValue(), + M("TP_PERSPECTIVE_PROJECTION_YAW"), + projection_yaw->getValue())); + } } } -void PerspCorrection::setAdjusterBehavior (bool badd) +void PerspCorrection::applyControlLines(void) +{ + if (!lens_geom_listener) { + return; + } + + std::vector control_lines; + double rot = camera_roll->getValue(); + double pitch = camera_pitch->getValue(); + double yaw = camera_yaw->getValue(); + + lines->toControlLines(control_lines); + + lens_geom_listener->autoPerspRequested( + lines->getVerticalCount() >= MIN_VERT_LINES, + lines->getHorizontalCount() >= MIN_HORIZ_LINES, + rot, pitch, yaw, &control_lines); + + disableListener(); + camera_pitch->setValue(pitch); + camera_roll->setValue(rot); + camera_yaw->setValue(yaw); + enableListener(); + + adjusterChanged(camera_pitch, pitch); +} + +void PerspCorrection::tweakParams(rtengine::procparams::ProcParams &pparams) +{ + pparams.perspective.render = render; +} + +void PerspCorrection::autoCorrectionPressed(Gtk::Button* b) +{ + if (!lens_geom_listener) { + return; + } + + double rot = 0; + double pitch = 0; + double yaw = 0; + + if (b == auto_pitch) { + lens_geom_listener->autoPerspRequested(true, false, rot, pitch, yaw); + } else if (b == auto_yaw) { + lens_geom_listener->autoPerspRequested(false, true, rot, pitch, yaw); + } else if (b == auto_pitch_yaw) { + lens_geom_listener->autoPerspRequested(true, true, rot, pitch, yaw); + } + + disableListener(); + camera_pitch->setValue(pitch); + camera_roll->setValue(rot); + camera_yaw->setValue(yaw); + enableListener(); + + adjusterChanged(camera_pitch, pitch); +} + +void PerspCorrection::methodChanged (void) +{ + + if (!batchMode) { + removeIfThere (this, simple, false); + removeIfThere (this, camera_based, false); + + if (method->get_active_row_number() == 0) { + pack_start (*simple); + } else if (method->get_active_row_number() == 1) { + pack_start (*camera_based); + } + + // If no longer in camera-based mode and control lines are being edited. + if (method->get_active_row_number() != 1 && lines_button_edit->get_active()) { + lines_button_edit->set_active(false); + } + } + + if (listener) { + listener->panelChanged (EvPerspMethod, method->get_active_text ()); + } + +} + +void PerspCorrection::setAdjusterBehavior (bool badd, bool camera_focal_length_add, bool camera_shift_add, bool camera_angle_add, bool projection_angle_add, bool projection_shift_add, bool projection_rotate_add) { horiz->setAddMode(badd); vert->setAddMode(badd); + camera_crop_factor->setAddMode(camera_focal_length_add); + camera_focal_length->setAddMode(camera_focal_length_add); + camera_pitch->setAddMode(camera_angle_add); + camera_roll->setAddMode(camera_angle_add); + camera_shift_horiz->setAddMode(camera_shift_add); + camera_shift_vert->setAddMode(camera_shift_add); + camera_yaw->setAddMode(camera_angle_add); + projection_pitch->setAddMode(projection_angle_add); + projection_rotate->setAddMode(projection_rotate_add); + projection_shift_horiz->setAddMode(projection_shift_add); + projection_shift_vert->setAddMode(projection_shift_add); + projection_yaw->setAddMode(projection_angle_add); +} + +void PerspCorrection::setControlLineEditMode(bool active) +{ + // Only camera-based mode supports control lines, so the mode must be + // switched if not in camera-based mode. + if (method->get_active_row_number() != 1) { + method->set_active(1); + } + + lines_button_edit->set_active(active); +} + +void PerspCorrection::setMetadata (const rtengine::FramesMetaData* metadata) +{ + this->metadata = metadata; } void PerspCorrection::trimValues (rtengine::procparams::ProcParams* pp) @@ -110,6 +659,23 @@ void PerspCorrection::trimValues (rtengine::procparams::ProcParams* pp) horiz->trimValue(pp->perspective.horizontal); vert->trimValue(pp->perspective.vertical); + // Only update crop factor and focal length if they have been manually set. + if (pp->perspective.camera_crop_factor > 0) { + camera_crop_factor->trimValue(pp->perspective.camera_crop_factor); + } + if (pp->perspective.camera_focal_length > 0) { + camera_focal_length->trimValue(pp->perspective.camera_focal_length); + } + camera_pitch->trimValue(pp->perspective.camera_pitch); + camera_roll->trimValue(pp->perspective.camera_roll); + camera_shift_horiz->trimValue(pp->perspective.camera_shift_horiz); + camera_shift_vert->trimValue(pp->perspective.camera_shift_vert); + camera_yaw->trimValue(pp->perspective.camera_yaw); + projection_pitch->trimValue(pp->perspective.projection_pitch); + projection_rotate->trimValue(pp->perspective.projection_rotate); + projection_shift_horiz->trimValue(pp->perspective.projection_shift_horiz); + projection_shift_vert->trimValue(pp->perspective.projection_shift_vert); + projection_yaw->trimValue(pp->perspective.projection_yaw); } void PerspCorrection::setBatchMode (bool batchMode) @@ -118,4 +684,215 @@ void PerspCorrection::setBatchMode (bool batchMode) ToolPanel::setBatchMode (batchMode); horiz->showEditedCB (); vert->showEditedCB (); + camera_crop_factor->showEditedCB (); + camera_focal_length->showEditedCB (); + camera_pitch->showEditedCB (); + camera_roll->showEditedCB (); + camera_shift_horiz->showEditedCB (); + camera_shift_vert->showEditedCB (); + camera_yaw->showEditedCB (); + projection_pitch->showEditedCB (); + projection_rotate->showEditedCB (); + projection_shift_horiz->showEditedCB (); + projection_shift_vert->showEditedCB (); + projection_yaw->showEditedCB (); + + lines_button_edit->set_sensitive(false); + auto_pitch->set_sensitive(false); + auto_yaw->set_sensitive(false); + auto_pitch_yaw->set_sensitive(false); + + method->append (M("GENERAL_UNCHANGED")); +} + +void PerspCorrection::setFocalLengthValue (const ProcParams* pparams, const FramesMetaData* metadata) +{ + double pp_crop_factor = pparams->perspective.camera_crop_factor; + double pp_focal_length = pparams->perspective.camera_focal_length; + double default_crop_factor = PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR; + double default_focal_length = PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH; + + // If any of these values are non-zero, don't set the crop factor or focal + // length from metadata to avoid a surprise change in perspective correction + // results. + if (pparams->perspective.camera_pitch != 0 || + pparams->perspective.camera_yaw != 0 || + pparams->perspective.projection_pitch != 0 || + pparams->perspective.projection_yaw != 0) { + if (pp_crop_factor <= 0) { + pp_crop_factor = PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR; + } + if (pp_focal_length <= 0) { + pp_focal_length = PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH; + } + } + + // Defaults from metadata. + if (metadata && (pp_crop_factor <= 0 || pp_focal_length <= 0)) { + const double fl = metadata->getFocalLen(); + const double fl35 = metadata->getFocalLen35mm(); + + if (fl <= 0) { + if (fl35 <= 0) { + // No focal length data. + } else { + // 35mm focal length available. + default_focal_length = fl35; + } + } else { + if (fl35 <= 0) { + // Focal length available. + default_focal_length = fl; + } else { + // Focal length and 35mm equivalent available. + default_focal_length = fl; + default_crop_factor = fl35 / fl; + } + } + } + + // Change value if those from the ProcParams are invalid. + if (pp_crop_factor > 0) { + camera_crop_factor->setValue(pp_crop_factor); + } else { + camera_crop_factor->setDefault(default_crop_factor); + camera_crop_factor->setValue(default_crop_factor); + } + if (pp_focal_length > 0) { + camera_focal_length->setValue(pp_focal_length); + } else { + camera_focal_length->setDefault(default_focal_length); + camera_focal_length->setValue(default_focal_length); + } +} + +void PerspCorrection::switchOffEditMode(void) +{ + lines_button_edit->set_active(false); +} + +void PerspCorrection::setEditProvider(EditDataProvider* provider) +{ + lines->setEditProvider(provider); +} + +void PerspCorrection::lineChanged(void) +{ + updateApplyDeleteButtons(); + + if (listener) { + listener->panelChanged(EvPerspControlLines, M("HISTORY_CHANGED")); + } +} + +void PerspCorrection::updateApplyDeleteButtons() +{ + if (batchMode) { + return; + } + + bool edit_mode = lines_button_edit->get_active(); + bool enough_lines = lines->getHorizontalCount() >= MIN_HORIZ_LINES || lines->getVerticalCount() >= MIN_VERT_LINES; + const auto tooltip = M("GENERAL_APPLY") + + ((edit_mode && !enough_lines) ? "\n\n" + M("TP_PERSPECTIVE_CONTROL_LINE_APPLY_INVALID_TOOLTIP") : ""); + + lines_button_apply->set_sensitive(edit_mode && enough_lines); + lines_button_apply->set_tooltip_text(tooltip); + lines_button_erase->set_sensitive(edit_mode && lines->size() > 0); +} + +void PerspCorrection::linesApplyButtonPressed(void) +{ + if (method->get_active_row_number() == 1) { + // Calculate perspective distortion if in camera-based mode. + applyControlLines(); + } + lines_button_edit->set_active(false); +} + +void PerspCorrection::linesEditButtonPressed(void) +{ + if (lines_button_edit->get_active()) { // Enter edit mode. + lines->setActive(true); + lines->setDrawMode(true); + render = false; + if (listener) { + listener->setTweakOperator(this); + listener->refreshPreview(EvPerspRender); + } + lines_button_apply->set_sensitive(true); + lines_button_erase->set_sensitive(true); + setCamBasedEventsActive(false); + if (panel_listener) { + panel_listener->controlLineEditModeChanged(true); + } + } else { // Leave edit mode. + setCamBasedEventsActive(true); + lines_button_apply->set_sensitive(false); + lines_button_erase->set_sensitive(false); + render = true; + if (listener) { + listener->unsetTweakOperator(this); + listener->refreshPreview(EvPerspRender); + } + lines->releaseEdit(); + lines->setDrawMode(false); + lines->setActive(false); + if (panel_listener) { + panel_listener->controlLineEditModeChanged(false); + } + } + updateApplyDeleteButtons(); +} + +void PerspCorrection::linesEraseButtonPressed(void) +{ + lines->removeAll(); +} + +void PerspCorrection::requestApplyControlLines(void) +{ + if (lines_button_apply->is_sensitive()) { + linesApplyButtonPressed(); + } else if (lines_button_edit->get_active()) { + lines_button_edit->set_active(false); + } +} + +void PerspCorrection::setCamBasedEventsActive(bool active) +{ + if (active) { + event_persp_cam_focal_length = &EvPerspCamFocalLength; + event_persp_cam_shift = &EvPerspCamShift; + event_persp_cam_angle = &EvPerspCamAngle; + event_persp_proj_shift = &EvPerspProjShift; + event_persp_proj_rotate = &EvPerspProjRotate; + event_persp_proj_angle = &EvPerspProjAngle; + } else { + event_persp_cam_focal_length = &EvPerspCamFocalLengthVoid; + event_persp_cam_shift = &EvPerspCamShiftVoid; + event_persp_cam_angle = &EvPerspCamAngleVoid; + event_persp_proj_shift = &EvPerspProjShiftVoid; + event_persp_proj_rotate = &EvPerspProjRotateVoid; + event_persp_proj_angle = &EvPerspProjAngleVoid; + } +} + +LinesCallbacks::LinesCallbacks(PerspCorrection* tool): + tool(tool) +{ +} + +void LinesCallbacks::lineChanged(void) +{ + if (tool) { + tool->lineChanged(); + } +} + +void LinesCallbacks::switchOffEditMode(void) +{ + if (tool) { + tool->switchOffEditMode(); + } } diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 0564479de..6ca2381e3 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -21,20 +21,91 @@ #include #include "adjuster.h" +#include "controllines.h" +#include "lensgeomlistener.h" #include "toolpanel.h" +#include "../rtengine/tweakoperator.h" + +class PerspCorrectionPanelListener +{ +public: + virtual ~PerspCorrectionPanelListener() = default; + + virtual void controlLineEditModeChanged(bool active) = 0; +}; class PerspCorrection final : + public rtengine::TweakOperator, public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { protected: + bool render = true; + MyComboBoxText* method; + Gtk::Box* simple; Adjuster* horiz; Adjuster* vert; + Gtk::Button* auto_pitch; + Gtk::Button* auto_yaw; + Gtk::Button* auto_pitch_yaw; + Gtk::Box* camera_based; + Adjuster* camera_crop_factor; + Adjuster* camera_focal_length; + Adjuster* camera_pitch; + Adjuster* camera_roll; + Adjuster* camera_shift_horiz; + Adjuster* camera_shift_vert; + Adjuster* camera_yaw; + std::unique_ptr lines; + Gtk::Button* lines_button_apply; + Gtk::ToggleButton* lines_button_edit; + Gtk::Button* lines_button_erase; + Adjuster* projection_pitch; + Adjuster* projection_rotate; + Adjuster* projection_shift_horiz; + Adjuster* projection_shift_vert; + Adjuster* projection_yaw; + rtengine::ProcEvent EvPerspCamFocalLength; + rtengine::ProcEvent EvPerspCamShift; + rtengine::ProcEvent EvPerspCamAngle; + rtengine::ProcEvent EvPerspControlLines; + rtengine::ProcEvent EvPerspMethod; + rtengine::ProcEvent EvPerspProjShift; + rtengine::ProcEvent EvPerspProjRotate; + rtengine::ProcEvent EvPerspProjAngle; + rtengine::ProcEvent EvPerspRender; + rtengine::ProcEvent EvPerspCamFocalLengthVoid; + rtengine::ProcEvent EvPerspCamShiftVoid; + rtengine::ProcEvent EvPerspCamAngleVoid; + rtengine::ProcEvent EvPerspProjShiftVoid; + rtengine::ProcEvent EvPerspProjRotateVoid; + rtengine::ProcEvent EvPerspProjAngleVoid; + rtengine::ProcEvent* event_persp_cam_focal_length; + rtengine::ProcEvent* event_persp_cam_shift; + rtengine::ProcEvent* event_persp_cam_angle; + rtengine::ProcEvent* event_persp_proj_shift; + rtengine::ProcEvent* event_persp_proj_rotate; + rtengine::ProcEvent* event_persp_proj_angle; + LensGeomListener* lens_geom_listener; + PerspCorrectionPanelListener* panel_listener; + const rtengine::FramesMetaData* metadata; + + void applyControlLines (void); + void tweakParams(rtengine::procparams::ProcParams &pparams) override; + void setCamBasedEventsActive (bool active = true); + void setFocalLengthValue (const rtengine::procparams::ProcParams* pparams, const rtengine::FramesMetaData* metadata); + void updateApplyDeleteButtons(); public: + /** Minimum number of horizontal lines for horizontal/full correction. */ + static constexpr std::size_t MIN_HORIZ_LINES = 2; + /** Minimum number of vertical lines for vertical/full correction. */ + static constexpr std::size_t MIN_VERT_LINES = 2; + static const Glib::ustring TOOL_NAME; + PerspCorrection (); void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; @@ -43,6 +114,36 @@ public: void setBatchMode (bool batchMode) override; void adjusterChanged (Adjuster* a, double newval) override; - void setAdjusterBehavior (bool badd); + void autoCorrectionPressed (Gtk::Button* b); + void lineChanged (void); + void linesApplyButtonPressed (void); + void linesEditButtonPressed (void); + void linesEraseButtonPressed (void); + void methodChanged (void); + void requestApplyControlLines(void); + void setAdjusterBehavior (bool badd, bool camera_focal_length_add, bool camera_shift_add, bool camera_angle_add, bool projection_angle_add, bool projection_shift_add, bool projection_rotate_add); + void setControlLineEditMode(bool active); + void setEditProvider (EditDataProvider* provider) override; + void setLensGeomListener (LensGeomListener* listener) + { + lens_geom_listener = listener; + } + void setPerspCorrectionPanelListener(PerspCorrectionPanelListener* listener) + { + panel_listener = listener; + } + void setMetadata (const rtengine::FramesMetaData* metadata); + void switchOffEditMode (void); void trimValues (rtengine::procparams::ProcParams* pp) override; }; + +class LinesCallbacks: public ControlLineManager::Callbacks +{ +protected: + PerspCorrection* tool; + +public: + explicit LinesCallbacks(PerspCorrection* tool); + void lineChanged (void) override; + void switchOffEditMode (void) override; +}; diff --git a/rtgui/placesbrowser.cc b/rtgui/placesbrowser.cc index f1450cea2..3440080f8 100644 --- a/rtgui/placesbrowser.cc +++ b/rtgui/placesbrowser.cc @@ -31,7 +31,8 @@ PlacesBrowser::PlacesBrowser () { - + set_orientation(Gtk::ORIENTATION_VERTICAL); + scrollw = Gtk::manage (new Gtk::ScrolledWindow ()); scrollw->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); pack_start (*scrollw); diff --git a/rtgui/placesbrowser.h b/rtgui/placesbrowser.h index d4640fff4..64cd30e3c 100644 --- a/rtgui/placesbrowser.h +++ b/rtgui/placesbrowser.h @@ -23,7 +23,7 @@ #include class PlacesBrowser : - public Gtk::VBox + public Gtk::Box { public: typedef sigc::slot DirSelectionSlot; diff --git a/rtgui/pointermotionlistener.h b/rtgui/pointermotionlistener.h index 26ca994b0..f9fda419c 100644 --- a/rtgui/pointermotionlistener.h +++ b/rtgui/pointermotionlistener.h @@ -18,6 +18,23 @@ */ #pragma once +#include +#include + + +namespace rtengine +{ + +namespace procparams +{ + +class ColorManagementParams; + +} + +} + + class PointerMotionListener { protected: @@ -26,7 +43,7 @@ protected: public: virtual ~PointerMotionListener() = default; - 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 pointerMoved(bool validPos, const rtengine::procparams::ColorManagementParams &cmp, 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 87b1b73a6..a67339a9f 100644 --- a/rtgui/popupbutton.h +++ b/rtgui/popupbutton.h @@ -24,7 +24,7 @@ #include "popupcommon.h" -class PopUpButton : +class PopUpButton final : public Gtk::Button, public PopUpCommon { diff --git a/rtgui/popupcommon.cc b/rtgui/popupcommon.cc index 8c4c9dda1..a6d9b6046 100644 --- a/rtgui/popupcommon.cc +++ b/rtgui/popupcommon.cc @@ -27,7 +27,7 @@ PopUpCommon::PopUpCommon (Gtk::Button* thisButton, const Glib::ustring& label) : buttonImage (nullptr) - , menu (nullptr) + , menu(new Gtk::Menu()) , selected (-1) // -1 means that the button is invalid { button = thisButton; @@ -48,59 +48,153 @@ PopUpCommon::PopUpCommon (Gtk::Button* thisButton, const Glib::ustring& label) 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"); + + // Create the image for the button + buttonImage = Gtk::manage(new RTImage()); + setExpandAlignProperties(buttonImage, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + imageContainer->attach_next_to(*buttonImage, Gtk::POS_RIGHT, 1, 1); + buttonImage->set_no_show_all(); + + // Create the button for showing the pop-up. + arrowButton = Gtk::manage(new Gtk::Button()); + 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); + arrowImage->show(); + buttonGroup->attach_next_to(*arrowButton, *button, Gtk::POS_RIGHT, 1, 1); + arrowButton->signal_button_release_event().connect_notify(sigc::mem_fun(*this, &PopUpCommon::showMenu)); + arrowButton->get_style_context()->add_class("Right"); + arrowButton->get_style_context()->add_class("popupbutton-arrow"); + arrowButton->set_no_show_all(); } PopUpCommon::~PopUpCommon () { - delete menu; - delete buttonImage; } -bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring& label) +bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup) { - if (label.empty ()) - return false; + return insertEntry(getEntryCount(), fileName, label, radioGroup); +} + +bool PopUpCommon::insertEntry(int position, const Glib::ustring& fileName, const Glib::ustring& label, Gtk::RadioButtonGroup *radioGroup) +{ + RTImage* image = nullptr; + if (!fileName.empty()) { + image = Gtk::manage(new RTImage(fileName)); + } + bool success = insertEntryImpl(position, fileName, Glib::RefPtr(), image, label, radioGroup); + if (!success && image) { + delete image; + } + return success; +} + +bool PopUpCommon::insertEntry(int position, const Glib::RefPtr& gIcon, const Glib::ustring& label, Gtk::RadioButtonGroup *radioGroup) +{ + RTImage* image = Gtk::manage(new RTImage(gIcon, Gtk::ICON_SIZE_BUTTON)); + bool success = insertEntryImpl(position, "", gIcon, image, label, radioGroup); + if (!success) { + delete image; + } + return success; +} + +bool PopUpCommon::insertEntryImpl(int position, const Glib::ustring& fileName, const Glib::RefPtr& gIcon, RTImage* image, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup) +{ + if (label.empty() || position < 0 || position > getEntryCount()) + return false; // Create the menu item and image - MyImageMenuItem* newItem = Gtk::manage (new MyImageMenuItem (label, fileName)); - imageFilenames.push_back (fileName); - images.push_back (newItem->getImage ()); - - if (selected == -1) { - // Create the menu on the first item - menu = new Gtk::Menu (); - // Create the image for the button - buttonImage = new RTImage(fileName); - setExpandAlignProperties(buttonImage, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - // Use the first image by default - imageContainer->attach_next_to(*buttonImage, Gtk::POS_RIGHT, 1, 1); - selected = 0; + Gtk::MenuItem *newItem; + if (radioGroup) { + newItem = Gtk::manage(new MyRadioImageMenuItem(label, image, *radioGroup)); } + else { + newItem = Gtk::manage(new MyImageMenuItem(label, image)); + } + imageIcons.insert(imageIcons.begin() + position, gIcon); + imageFilenames.insert(imageFilenames.begin() + position, fileName); + images.insert(images.begin() + position, image); // When there is at least 1 choice, we add the arrow button if (images.size() == 1) { - Gtk::Button* arrowButton = Gtk::manage( new Gtk::Button() ); - 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); - arrowButton->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &PopUpCommon::showMenu) ); + changeImage(fileName, gIcon); + buttonImage->show(); + selected = 0; button->get_style_context()->add_class("Left"); - arrowButton->get_style_context()->add_class("Right"); - arrowButton->get_style_context()->add_class("popupbutton-arrow"); + arrowButton->show(); hasMenu = true; + } else if (position <= selected) { + selected++; } - newItem->signal_activate ().connect (sigc::bind (sigc::mem_fun (*this, &PopUpCommon::entrySelected), images.size () - 1)); - menu->append (*newItem); - + void (PopUpCommon::*entrySelectedFunc)(Gtk::Widget *) = &PopUpCommon::entrySelected; + newItem->signal_activate ().connect (sigc::bind (sigc::mem_fun (*this, entrySelectedFunc), newItem)); + menu->insert(*newItem, position); return true; } -// TODO: 'PopUpCommon::removeEntry' method to be created... +void PopUpCommon::removeEntry(int position) +{ + if (position < 0 || position >= getEntryCount()) { + return; + } -void PopUpCommon::entrySelected (int i) + if (getEntryCount() == 1) { // Last of the entries. + // Hide the arrow button. + button->get_style_context()->remove_class("Left"); + arrowButton->hide(); + hasMenu = false; + // Remove the button image. + buttonImage->hide(); + selected = -1; + } + else if (position < selected) { + selected--; + } + else if (position == selected) { // Select a different entry before removing. + int nextSelection = position + (position == getEntryCount() - 1 ? -1 : 1); + changeImage(nextSelection); + setButtonHint(); + } + + std::unique_ptr menuItem(menu->get_children()[position]); + menu->remove(*menuItem); + imageIcons.erase(imageIcons.begin() + position); + imageFilenames.erase(imageFilenames.begin() + position); + images.erase(images.begin() + position); +} + +void PopUpCommon::changeImage(int position) +{ + changeImage(imageFilenames.at(position), imageIcons.at(position)); +} + +void PopUpCommon::changeImage(const Glib::ustring& fileName, const Glib::RefPtr& gIcon) +{ + if (!fileName.empty()) { + buttonImage->changeImage(fileName); + } else { + buttonImage->changeImage(gIcon, static_cast(Gtk::ICON_SIZE_BUTTON)); + } +} + +void PopUpCommon::entrySelected(Gtk::Widget* widget) +{ + int i = 0; + for (const auto & child : menu->get_children()) { + if (widget == child) { + break; + } + i++; + } + + entrySelected(i); +} + +void PopUpCommon::entrySelected(int i) { // Emit a signal if the selected item has changed if (setSelected (posToIndex(i))) @@ -130,9 +224,15 @@ bool PopUpCommon::setSelected (int entryNum) return false; } else { // Maybe we could do something better than loading the image file each time the selection is changed !? - buttonImage->changeImage(imageFilenames.at(entryNum)); + changeImage(entryNum); selected = entryNum; setButtonHint(); + + auto radioMenuItem = dynamic_cast(menu->get_children()[entryNum]); + if (radioMenuItem && menu->get_active() != radioMenuItem) { + radioMenuItem->set_active(); + } + return true; } } @@ -159,10 +259,10 @@ void PopUpCommon::setButtonHint() if (selected > -1) { auto widget = menu->get_children ()[selected]; - auto item = dynamic_cast(widget); + auto item = dynamic_cast(widget); if (item) { - hint += item->getLabel ()->get_text (); + hint += escapeHtmlChars(item->getLabel()->get_text()); } } diff --git a/rtgui/popupcommon.h b/rtgui/popupcommon.h index b4cf4d7e0..9ca6b2030 100644 --- a/rtgui/popupcommon.h +++ b/rtgui/popupcommon.h @@ -20,12 +20,19 @@ */ #pragma once +#include "glibmm/refptr.h" +#include #include #include #include +namespace Gio +{ +class Icon; +} + namespace Gtk { @@ -33,6 +40,8 @@ class Grid; class Menu; class Button; class ImageMenuItem; +class RadioButtonGroup; +class Widget; } @@ -52,10 +61,13 @@ public: explicit PopUpCommon (Gtk::Button* button, const Glib::ustring& label = ""); virtual ~PopUpCommon (); - bool addEntry (const Glib::ustring& fileName, const Glib::ustring& label); + bool addEntry (const Glib::ustring& fileName, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup = nullptr); + bool insertEntry(int position, const Glib::ustring& fileName, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup = nullptr); + bool insertEntry(int position, const Glib::RefPtr& gIcon, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup = nullptr); int getEntryCount () const; bool setSelected (int entryNum); int getSelected () const; + void removeEntry(int position); void setButtonHint(); void show (); void set_tooltip_text (const Glib::ustring &text); @@ -65,16 +77,22 @@ private: type_signal_changed messageChanged; type_signal_item_selected messageItemSelected; + std::vector> imageIcons; std::vector imageFilenames; std::vector images; Glib::ustring buttonHint; RTImage* buttonImage; Gtk::Grid* imageContainer; - Gtk::Menu* menu; + std::unique_ptr menu; Gtk::Button* button; + Gtk::Button* arrowButton; int selected; bool hasMenu; + void changeImage(int position); + void changeImage(const Glib::ustring& fileName, const Glib::RefPtr& gIcon); + void entrySelected(Gtk::Widget* menuItem); + bool insertEntryImpl(int position, const Glib::ustring& fileName, const Glib::RefPtr& gIcon, RTImage* image, const Glib::ustring& label, Gtk::RadioButtonGroup* radioGroup); void showMenu(GdkEventButton* event); protected: diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index 89f93ed44..f2455699c 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,11 +1,19 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 346 +#define PPVERSION 350 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 350 2023-03-05 + introduced white balance standard observer + 349 2020-10-29 + replaced Haze removal Luminance checkbox with an adjuster to blend between luminance and normal mode + 348 2018-09-25 + Added Locallab tool parameters + 347 2019-11-17 + added special values in filmNegative for backwards compatibility with previous channel scaling method 346 2019-01-01 changed microcontrast uniformity 345 2018-10-21 diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 68ef3b9ce..c9737704e 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -10,13 +10,14 @@ * * 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. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ #include +#include "externaleditorpreferences.h" #include "preferences.h" #include "multilangmgr.h" #include "splash.h" @@ -29,13 +30,14 @@ #include #include "rtimage.h" #include "rtwindow.h" +#include "toollocationpref.h" #ifdef _OPENMP #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 () ); + Gtk::Box* HB = Gtk::manage ( new Gtk::Box () ); HB->set_spacing (4); if (!toolTip.empty()) { HB->set_tooltip_text (M (toolTip)); @@ -56,52 +58,55 @@ extern Glib::ustring argv0; Glib::RefPtr themecss; Glib::RefPtr fontcss; -Preferences::Preferences (RTWindow *rtwindow) - : Gtk::Dialog (M ("MAIN_BUTTON_PREFERENCES"), *rtwindow, true) +Preferences::Preferences(RTWindow *rtwindow) + : Gtk::Dialog(M("MAIN_BUTTON_PREFERENCES"), *rtwindow, true) , regex(Glib::Regex::create (THEMEREGEXSTR, Glib::RegexCompileFlags::REGEX_CASELESS)) - , splash (nullptr) - , rprofiles (nullptr) - , iprofiles (nullptr) - , parent (rtwindow) - , newFont (false) - , newCPFont (false) + , splash(nullptr) + , rprofiles(nullptr) + , iprofiles(nullptr) + , parent(rtwindow) + , newFont(false) + , newCPFont(false) + , toolLocationPreference(nullptr) + , swFavorites(nullptr) { - moptions.copyFrom (&options); + moptions.copyFrom(&options); - set_size_request (650, -1); - set_default_size (options.preferencesWidth, options.preferencesHeight); + set_size_request(650, -1); + set_default_size(options.preferencesWidth, options.preferencesHeight); - Pango::FontDescription defaultFont = get_style_context ()->get_font(); - initialFontFamily = defaultFont.get_family (); - initialFontSize = defaultFont.get_size () / Pango::SCALE; + Pango::FontDescription defaultFont = get_style_context()->get_font(); + initialFontFamily = defaultFont.get_family(); + initialFontSize = defaultFont.get_size() / Pango::SCALE; - Gtk::Box* mainBox = get_content_area (); + Gtk::Box* mainBox = get_content_area(); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 - mainBox->set_spacing (8); + mainBox->set_spacing(8); #endif //GTK318 - Gtk::Notebook* nb = Gtk::manage (new Gtk::Notebook ()); + Gtk::Notebook* nb = Gtk::manage(new Gtk::Notebook()); nb->set_scrollable(true); - nb->set_name ("PrefNotebook"); - mainBox->pack_start (*nb); + nb->set_name("PrefNotebook"); + mainBox->pack_start(*nb); - Gtk::Button* about = Gtk::manage (new Gtk::Button (M ("GENERAL_ABOUT"))); - Gtk::Button* ok = Gtk::manage (new Gtk::Button (M ("GENERAL_OK"))); - Gtk::Button* cancel = Gtk::manage (new Gtk::Button (M ("GENERAL_CANCEL"))); + Gtk::Button* about = Gtk::manage(new Gtk::Button(M("GENERAL_ABOUT"))); + Gtk::Button* ok = Gtk::manage(new Gtk::Button(M("GENERAL_OK"))); + Gtk::Button* cancel = Gtk::manage(new Gtk::Button(M("GENERAL_CANCEL"))); - about->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::aboutPressed) ); - ok->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::okPressed) ); - cancel->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::cancelPressed) ); + about->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::aboutPressed)); + ok->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::okPressed)); + cancel->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::cancelPressed)); - get_action_area()->pack_start (*about); - get_action_area()->pack_end (*ok); - get_action_area()->pack_end (*cancel); + get_action_area()->pack_start(*about); + get_action_area()->pack_end(*ok); + get_action_area()->pack_end(*cancel); nb->append_page(*getGeneralPanel(), M("PREFERENCES_TAB_GENERAL")); nb->append_page(*getImageProcessingPanel(), M("PREFERENCES_TAB_IMPROC")); + nb->append_page(*getFavoritesPanel(), M("PREFERENCES_TAB_FAVORITES")); nb->append_page(*getDynamicProfilePanel(), M("PREFERENCES_TAB_DYNAMICPROFILE")); nb->append_page(*getFileBrowserPanel(), M("PREFERENCES_TAB_BROWSER")); nb->append_page(*getColorManPanel(), M("PREFERENCES_TAB_COLORMGR")); @@ -111,29 +116,29 @@ Preferences::Preferences (RTWindow *rtwindow) #if defined(WIN32) || defined(__linux__) nb->append_page(*getSoundsPanel(), M("PREFERENCES_TAB_SOUND")); #endif - nb->set_current_page (0); + nb->set_current_page(0); - ProfileStore::getInstance()->addListener (this); + ProfileStore::getInstance()->addListener(this); - fillPreferences (); + fillPreferences(); - show_all_children (); + show_all_children(); } -Preferences::~Preferences () +Preferences::~Preferences() { - ProfileStore::getInstance()->removeListener (this); - get_size (options.preferencesWidth, options.preferencesHeight); + ProfileStore::getInstance()->removeListener(this); + get_size(options.preferencesWidth, options.preferencesHeight); } int Preferences::getThemeRowNumber (const Glib::ustring& longThemeFName) { - if (regex->match (longThemeFName + ".css", matchInfo)) { + if (regex->match(longThemeFName + ".css", matchInfo)) { for (size_t i = 0 ; i < themeFNames.size(); ++i) { - if (themeFNames.at (i).longFName == longThemeFName) { + if (themeFNames.at(i).longFName == longThemeFName) { return (int)i; } } @@ -142,43 +147,43 @@ int Preferences::getThemeRowNumber (const Glib::ustring& longThemeFName) return -1; } -Gtk::Widget* Preferences::getBatchProcPanel () +Gtk::Widget* Preferences::getBatchProcPanel() { swBatchProc = Gtk::manage(new Gtk::ScrolledWindow()); swBatchProc->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* vbBatchProc = Gtk::manage (new Gtk::VBox ()); + Gtk::Box* vbBatchProc = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - Gtk::ScrolledWindow* behscrollw = Gtk::manage (new Gtk::ScrolledWindow ()); - behscrollw->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - behscrollw->set_size_request (-1, 60); - Gtk::VBox* vbbeh = Gtk::manage ( new Gtk::VBox () ); - vbbeh->pack_start (*behscrollw, Gtk::PACK_EXPAND_WIDGET); - Gtk::Frame* behFrame = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_BEHAVIOR"))); - behFrame->add (*vbbeh); + Gtk::ScrolledWindow* behscrollw = Gtk::manage(new Gtk::ScrolledWindow()); + behscrollw->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + behscrollw->set_size_request(-1, 60); + Gtk::Box* vbbeh = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + vbbeh->pack_start(*behscrollw, Gtk::PACK_EXPAND_WIDGET); + Gtk::Frame* behFrame = Gtk::manage(new Gtk::Frame(M("PREFERENCES_BEHAVIOR"))); + behFrame->add(*vbbeh); vbBatchProc->pack_start (*behFrame, Gtk::PACK_EXPAND_WIDGET, 4); - Gtk::TreeView* behTreeView = Gtk::manage (new Gtk::TreeView ()); - behscrollw->add (*behTreeView); + Gtk::TreeView* behTreeView = Gtk::manage(new Gtk::TreeView()); + behscrollw->add(*behTreeView); - behModel = Gtk::TreeStore::create (behavColumns); - behTreeView->set_model (behModel); + behModel = Gtk::TreeStore::create(behavColumns); + behTreeView->set_model(behModel); - behTreeView->append_column (M ("PREFERENCES_PROPERTY"), behavColumns.label); - behTreeView->append_column_editable (M ("PREFERENCES_ADD"), behavColumns.badd); - behTreeView->append_column_editable (M ("PREFERENCES_SET"), behavColumns.bset); + behTreeView->append_column(M("PREFERENCES_PROPERTY"), behavColumns.label); + behTreeView->append_column_editable(M("PREFERENCES_ADD"), behavColumns.badd); + behTreeView->append_column_editable(M("PREFERENCES_SET"), behavColumns.bset); - Gtk::CellRendererToggle* cr_add = static_cast (behTreeView->get_column (1)->get_first_cell()); - Gtk::CellRendererToggle* cr_set = static_cast (behTreeView->get_column (2)->get_first_cell()); + Gtk::CellRendererToggle* cr_add = static_cast(behTreeView->get_column(1)->get_first_cell()); + Gtk::CellRendererToggle* cr_set = static_cast(behTreeView->get_column(2)->get_first_cell()); - cr_add->set_radio (true); - cr_add->set_property ("xalign", 0.0f); - sigc::connection addc = cr_add->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::behAddRadioToggled)); - cr_set->set_radio (true); - cr_set->set_property ("xalign", 0.0f); - sigc::connection setc = cr_set->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::behSetRadioToggled)); + cr_add->set_radio(true); + cr_add->set_property("xalign", 0.0f); + sigc::connection addc = cr_add->signal_toggled().connect(sigc::mem_fun(*this, &Preferences::behAddRadioToggled)); + cr_set->set_radio(true); + cr_set->set_property("xalign", 0.0f); + sigc::connection setc = cr_set->signal_toggled().connect(sigc::mem_fun(*this, &Preferences::behSetRadioToggled)); - behTreeView->get_column (1)->add_attribute (*cr_add, "visible", behavColumns.visible); - behTreeView->get_column (2)->add_attribute (*cr_set, "visible", behavColumns.visible); + behTreeView->get_column(1)->add_attribute(*cr_add, "visible", behavColumns.visible); + behTreeView->get_column(2)->add_attribute(*cr_set, "visible", behavColumns.visible); // fill model Gtk::TreeModel::iterator mi, ci; @@ -186,62 +191,68 @@ Gtk::Widget* Preferences::getBatchProcPanel () /* * The TRUE/FALSE values of appendBehavList are replaced by the one defined in options.cc, */ - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_EXPOSURE_LABEL")); - appendBehavList (mi, M ("TP_EXPOSURE_EXPCOMP"), ADDSET_TC_EXPCOMP, false); - appendBehavList (mi, M ("TP_EXPOSURE_COMPRHIGHLIGHTS"), ADDSET_TC_HLCOMPAMOUNT, false); - appendBehavList (mi, M ("TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD"), ADDSET_TC_HLCOMPTHRESH, false); - appendBehavList (mi, M ("TP_EXPOSURE_BLACKLEVEL"), ADDSET_TC_BLACKLEVEL, false); - appendBehavList (mi, M ("TP_EXPOSURE_COMPRSHADOWS"), ADDSET_TC_SHCOMP, false); - appendBehavList (mi, M ("TP_EXPOSURE_BRIGHTNESS"), ADDSET_TC_BRIGHTNESS, false); - 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_EXPOSURE_LABEL")); + appendBehavList(mi, M("TP_EXPOSURE_EXPCOMP"), ADDSET_TC_EXPCOMP, false); + appendBehavList(mi, M("TP_EXPOSURE_COMPRHIGHLIGHTS"), ADDSET_TC_HLCOMPAMOUNT, false); + appendBehavList(mi, M("TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD"), ADDSET_TC_HLCOMPTHRESH, false); + appendBehavList(mi, M("TP_EXPOSURE_BLACKLEVEL"), ADDSET_TC_BLACKLEVEL, false); + appendBehavList(mi, M("TP_EXPOSURE_COMPRSHADOWS"), ADDSET_TC_SHCOMP, false); + appendBehavList(mi, M("TP_EXPOSURE_BRIGHTNESS"), ADDSET_TC_BRIGHTNESS, false); + 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_EPD_LABEL")); - appendBehavList (mi, M ("TP_EPD_STRENGTH"), ADDSET_EPD_STRENGTH, false); - appendBehavList (mi, M ("TP_EPD_GAMMA"), ADDSET_EPD_GAMMA, false); - appendBehavList (mi, M ("TP_EPD_EDGESTOPPING"), ADDSET_EPD_EDGESTOPPING, false); - appendBehavList (mi, M ("TP_EPD_SCALE"), ADDSET_EPD_SCALE, false); - appendBehavList (mi, M ("TP_EPD_REWEIGHTINGITERATES"), ADDSET_EPD_REWEIGHTINGITERATES, false); + mi->set_value(behavColumns.label, M("TP_EPD_LABEL")); + appendBehavList(mi, M("TP_EPD_STRENGTH"), ADDSET_EPD_STRENGTH, false); + appendBehavList(mi, M("TP_EPD_GAMMA"), ADDSET_EPD_GAMMA, false); + appendBehavList(mi, M("TP_EPD_EDGESTOPPING"), ADDSET_EPD_EDGESTOPPING, false); + appendBehavList(mi, M("TP_EPD_SCALE"), ADDSET_EPD_SCALE, false); + appendBehavList(mi, M("TP_EPD_REWEIGHTINGITERATES"), ADDSET_EPD_REWEIGHTINGITERATES, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_TM_FATTAL_LABEL")); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_TM_FATTAL_LABEL")); appendBehavList (mi, M ("TP_TM_FATTAL_AMOUNT"), ADDSET_FATTAL_AMOUNT, false); appendBehavList (mi, M ("TP_TM_FATTAL_THRESHOLD"), ADDSET_FATTAL_THRESHOLD, false); appendBehavList (mi, M ("TP_TM_FATTAL_ANCHOR"), ADDSET_FATTAL_ANCHOR, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_RETINEX_LABEL")); - appendBehavList (mi, M ("TP_RETINEX_STRENGTH"), ADDSET_RETI_STR, false); - appendBehavList (mi, M ("TP_RETINEX_NEIGHBOR"), ADDSET_RETI_NEIGH, false); - appendBehavList (mi, M ("TP_RETINEX_VARIANCE"), ADDSET_RETI_VART, false); - appendBehavList (mi, M ("TP_RETINEX_GAMMA"), ADDSET_RETI_GAM, false); - appendBehavList (mi, M ("TP_RETINEX_SLOPE"), ADDSET_RETI_SLO, false); - appendBehavList (mi, M ("TP_RETINEX_GAIN"), ADDSET_RETI_GAIN, false); - appendBehavList (mi, M ("TP_RETINEX_OFFSET"), ADDSET_RETI_OFFS, false); - appendBehavList (mi, M ("TP_RETINEX_THRESHOLD"), ADDSET_RETI_LIMD, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_RETINEX_LABEL")); + appendBehavList(mi, M("TP_RETINEX_STRENGTH"), ADDSET_RETI_STR, false); + appendBehavList(mi, M("TP_RETINEX_NEIGHBOR"), ADDSET_RETI_NEIGH, false); + appendBehavList(mi, M("TP_RETINEX_VARIANCE"), ADDSET_RETI_VART, false); + appendBehavList(mi, M("TP_RETINEX_GAMMA"), ADDSET_RETI_GAM, false); + appendBehavList(mi, M("TP_RETINEX_SLOPE"), ADDSET_RETI_SLO, false); + appendBehavList(mi, M("TP_RETINEX_GAIN"), ADDSET_RETI_GAIN, false); + appendBehavList(mi, M("TP_RETINEX_OFFSET"), ADDSET_RETI_OFFS, false); + appendBehavList(mi, M("TP_RETINEX_THRESHOLD"), ADDSET_RETI_LIMD, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_SHADOWSHLIGHTS_LABEL")); - appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false); - appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_SHADOWS"), ADDSET_SH_SHADOWS, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_SHADOWSHLIGHTS_LABEL")); + appendBehavList(mi, M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false); + appendBehavList(mi, M("TP_SHADOWSHLIGHTS_SHADOWS"), ADDSET_SH_SHADOWS, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_LABCURVE_LABEL")); - appendBehavList (mi, M ("TP_LABCURVE_BRIGHTNESS"), ADDSET_LC_BRIGHTNESS, false); - appendBehavList (mi, M ("TP_LABCURVE_CONTRAST"), ADDSET_LC_CONTRAST, false); - appendBehavList (mi, M ("TP_LABCURVE_CHROMATICITY"), ADDSET_LC_CHROMATICITY, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_TONE_EQUALIZER_LABEL")); + appendBehavList(mi, M("TP_TONE_EQUALIZER_BANDS"), ADDSET_TONE_EQUALIZER_BANDS, false); + appendBehavList(mi, M("TP_TONE_EQUALIZER_PIVOT"), ADDSET_TONE_EQUALIZER_PIVOT, false); + appendBehavList(mi, M("TP_TONE_EQUALIZER_DETAIL"), ADDSET_TONE_EQUALIZER_REGULARIZATION, false); - mi = behModel->append (); // Used for both Resize and Post-Resize sharpening - mi->set_value (behavColumns.label, M ("TP_SHARPENING_LABEL")); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_LABCURVE_LABEL")); + appendBehavList(mi, M("TP_LABCURVE_BRIGHTNESS"), ADDSET_LC_BRIGHTNESS, false); + appendBehavList(mi, M("TP_LABCURVE_CONTRAST"), ADDSET_LC_CONTRAST, false); + appendBehavList(mi, M("TP_LABCURVE_CHROMATICITY"), ADDSET_LC_CHROMATICITY, false); + + 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); - appendBehavList (mi, M ("TP_SHARPENING_RLD_ITERATIONS"), ADDSET_SHARP_ITER, false); - appendBehavList (mi, M ("TP_SHARPENING_EDTOLERANCE"), ADDSET_SHARP_EDGETOL, false); - appendBehavList (mi, M ("TP_SHARPENING_HALOCONTROL"), ADDSET_SHARP_HALOCTRL, 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); + appendBehavList(mi, M("TP_SHARPENING_RLD_ITERATIONS"), ADDSET_SHARP_ITER, false); + 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")); @@ -250,19 +261,19 @@ Gtk::Widget* Preferences::getBatchProcPanel () 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); - appendBehavList (mi, M ("TP_SHARPENEDGE_AMOUNT"), ADDSET_SHARPENEDGE_AMOUNT, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_SHARPENEDGE_LABEL")); + appendBehavList(mi, M("TP_SHARPENEDGE_PASSES"), ADDSET_SHARPENEDGE_PASS, false); + appendBehavList(mi, M("TP_SHARPENEDGE_AMOUNT"), ADDSET_SHARPENEDGE_AMOUNT, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_SHARPENMICRO_LABEL")); - appendBehavList (mi, M ("TP_SHARPENMICRO_AMOUNT"), ADDSET_SHARPENMICRO_AMOUNT, false); + 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); + appendBehavList(mi, M("TP_SHARPENMICRO_UNIFORMITY"), ADDSET_SHARPENMICRO_UNIFORMITY, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_DIRPYRDENOISE_LABEL")); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_DIRPYRDENOISE_LABEL")); 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); @@ -271,133 +282,145 @@ Gtk::Widget* Preferences::getBatchProcPanel () 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 = 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")); - appendBehavList (mi, M ("TP_WBALANCE_TEMPERATURE"), ADDSET_WB_TEMPERATURE, true); - appendBehavList (mi, M ("TP_WBALANCE_GREEN"), ADDSET_WB_GREEN, true); - appendBehavList (mi, M ("TP_WBALANCE_EQBLUERED"), ADDSET_WB_EQUAL, true); - appendBehavList (mi, M ("TP_WBALANCE_TEMPBIAS"), ADDSET_WB_TEMPBIAS, true); + mi->set_value(behavColumns.label, M("TP_WBALANCE_LABEL")); + appendBehavList(mi, M("TP_WBALANCE_TEMPERATURE"), ADDSET_WB_TEMPERATURE, true); + appendBehavList(mi, M("TP_WBALANCE_GREEN"), ADDSET_WB_GREEN, true); + appendBehavList(mi, M("TP_WBALANCE_EQBLUERED"), ADDSET_WB_EQUAL, true); + appendBehavList(mi, M("TP_WBALANCE_TEMPBIAS"), ADDSET_WB_TEMPBIAS, true); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_COLORAPP_LABEL")); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_COLORAPP_LABEL")); 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_HUE"), ADDSET_CAT_HUE, true); - appendBehavList (mi, M ("TP_COLORAPP_BADPIXSL"), ADDSET_CAT_BADPIX, true); + appendBehavList(mi, M("TP_COLORAPP_CIECAT_DEGREE"), ADDSET_CAT_DEGREE, 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_HUE"), ADDSET_CAT_HUE, true); + appendBehavList(mi, M("TP_COLORAPP_CIECAT_DEGREEOUT"), ADDSET_CAT_DEGREEOUT, true); + appendBehavList(mi, M("TP_WBALANCE_TEMPERATURE"), ADDSET_CAT_TEMPOUT, true); + appendBehavList(mi, M("TP_COLORAPP_BADPIXSL"), ADDSET_CAT_BADPIX, true); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_VIBRANCE_LABEL")); - 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_VIBRANCE_LABEL")); + 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_CHMIXER_LABEL")); - appendBehavList (mi, M ("TP_CHMIXER_RED") + ", " + M ("TP_CHMIXER_GREEN") + ", " + M ("TP_CHMIXER_BLUE"), ADDSET_CHMIXER, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_CHMIXER_LABEL")); + appendBehavList(mi, M("TP_CHMIXER_RED") + ", " + M("TP_CHMIXER_GREEN") + ", " + M("TP_CHMIXER_BLUE"), ADDSET_CHMIXER, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_BWMIX_LABEL")); - appendBehavList (mi, M ("TP_BWMIX_MIXC"), ADDSET_BLACKWHITE_HUES, false); - appendBehavList (mi, M ("TP_BWMIX_GAMMA"), ADDSET_BLACKWHITE_GAMMA, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_BWMIX_LABEL")); + appendBehavList(mi, M("TP_BWMIX_MIXC"), ADDSET_BLACKWHITE_HUES, false); + appendBehavList(mi, M("TP_BWMIX_GAMMA"), ADDSET_BLACKWHITE_GAMMA, false); - mi = behModel->append (); - 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_FILMSIMULATION_LABEL")); + appendBehavList(mi, M("TP_FILMSIMULATION_STRENGTH"), ADDSET_FILMSIMULATION_STRENGTH, true); - mi = behModel->append (); + 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); - appendBehavList (mi, M ("TP_COLORTONING_SATURATIONTHRESHOLD"), ADDSET_COLORTONING_SATTHRESHOLD, true); - appendBehavList (mi, M ("TP_COLORTONING_SATURATEDOPACITY"), ADDSET_COLORTONING_SATOPACITY, true); - appendBehavList (mi, M ("TP_COLORTONING_BALANCE"), ADDSET_COLORTONING_BALANCE, true); - appendBehavList (mi, M ("TP_COLORTONING_STRENGTH"), ADDSET_COLORTONING_STRENGTH, true); + mi->set_value(behavColumns.label, M("TP_COLORTONING_LABEL")); + appendBehavList(mi, M("TP_COLORTONING_SPLITCOCO"), ADDSET_COLORTONING_SPLIT, true); + appendBehavList(mi, M("TP_COLORTONING_SATURATIONTHRESHOLD"), ADDSET_COLORTONING_SATTHRESHOLD, true); + appendBehavList(mi, M("TP_COLORTONING_SATURATEDOPACITY"), ADDSET_COLORTONING_SATOPACITY, true); + appendBehavList(mi, M("TP_COLORTONING_BALANCE"), ADDSET_COLORTONING_BALANCE, true); + appendBehavList(mi, M("TP_COLORTONING_STRENGTH"), ADDSET_COLORTONING_STRENGTH, true); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_ROTATE_LABEL")); - appendBehavList (mi, M ("TP_ROTATE_DEGREE"), ADDSET_ROTATE_DEGREE, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_ROTATE_LABEL")); + appendBehavList(mi, M("TP_ROTATE_DEGREE"), ADDSET_ROTATE_DEGREE, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_RESIZE_LABEL")); - appendBehavList (mi, M ("TP_RESIZE_SCALE"), ADDSET_RESIZE_SCALE, true); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_RESIZE_LABEL")); + appendBehavList(mi, M("TP_RESIZE_SCALE"), ADDSET_RESIZE_SCALE, true); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_DISTORTION_LABEL")); - appendBehavList (mi, M ("TP_DISTORTION_AMOUNT"), ADDSET_DIST_AMOUNT, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_DISTORTION_LABEL")); + appendBehavList(mi, M("TP_DISTORTION_AMOUNT"), ADDSET_DIST_AMOUNT, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_PERSPECTIVE_LABEL")); - appendBehavList (mi, M ("TP_PERSPECTIVE_HORIZONTAL") + ", " + M ("TP_PERSPECTIVE_VERTICAL"), ADDSET_PERSPECTIVE, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_PERSPECTIVE_LABEL")); + appendBehavList(mi, M("TP_PERSPECTIVE_METHOD_SIMPLE") + " - " + M("TP_PERSPECTIVE_HORIZONTAL") + ", " + M("TP_PERSPECTIVE_VERTICAL"), ADDSET_PERSPECTIVE, false); + appendBehavList(mi, M("TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH") + ", " + M("TP_PERSPECTIVE_CAMERA_CROP_FACTOR"), ADDSET_PERSP_CAM_FOCAL_LENGTH, false); + appendBehavList(mi, M("TP_PERSPECTIVE_CAMERA_FRAME") + " - " + M("TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL") + ", " + M("TP_PERSPECTIVE_CAMERA_SHIFT_VERTICAL"), ADDSET_PERSP_CAM_SHIFT, false); + appendBehavList(mi, M("TP_PERSPECTIVE_CAMERA_FRAME") + " - " + M("TP_PERSPECTIVE_CAMERA_ROLL") + ", " + M("TP_PERSPECTIVE_CAMERA_YAW") + ", " + M("TP_PERSPECTIVE_CAMERA_PITCH"), ADDSET_PERSP_CAM_ANGLE, false); + appendBehavList(mi, M("TP_PERSPECTIVE_POST_CORRECTION_ADJUSTMENT_FRAME") + " - " + M("TP_PERSPECTIVE_PROJECTION_SHIFT_HORIZONTAL") + ", " + M("TP_PERSPECTIVE_PROJECTION_SHIFT_VERTICAL"), ADDSET_PERSP_PROJ_SHIFT, false); + appendBehavList(mi, M("TP_PERSPECTIVE_PROJECTION_ROTATE"), ADDSET_PERSP_PROJ_ROTATE, false); + appendBehavList(mi, M("TP_PERSPECTIVE_RECOVERY_FRAME") + " - " + M("TP_PERSPECTIVE_PROJECTION_YAW") + ", " + M("TP_PERSPECTIVE_PROJECTION_PITCH"), ADDSET_PERSP_PROJ_ANGLE, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_GRADIENT_LABEL")); - appendBehavList (mi, M ("TP_GRADIENT_DEGREE"), ADDSET_GRADIENT_DEGREE, false); - appendBehavList (mi, M ("TP_GRADIENT_FEATHER"), ADDSET_GRADIENT_FEATHER, false); - appendBehavList (mi, M ("TP_GRADIENT_STRENGTH"), ADDSET_GRADIENT_STRENGTH, false); - appendBehavList (mi, M ("TP_GRADIENT_CENTER_X") + ", " + M ("TP_GRADIENT_CENTER_Y"), ADDSET_GRADIENT_CENTER, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_GRADIENT_LABEL")); + appendBehavList(mi, M("TP_GRADIENT_DEGREE"), ADDSET_GRADIENT_DEGREE, false); + appendBehavList(mi, M("TP_GRADIENT_FEATHER"), ADDSET_GRADIENT_FEATHER, false); + appendBehavList(mi, M("TP_GRADIENT_STRENGTH"), ADDSET_GRADIENT_STRENGTH, false); + appendBehavList(mi, M("TP_GRADIENT_CENTER_X") + ", " + M("TP_GRADIENT_CENTER_Y"), ADDSET_GRADIENT_CENTER, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_PCVIGNETTE_LABEL")); - appendBehavList (mi, M ("TP_PCVIGNETTE_STRENGTH"), ADDSET_PCVIGNETTE_STRENGTH, false); - appendBehavList (mi, M ("TP_PCVIGNETTE_FEATHER"), ADDSET_PCVIGNETTE_FEATHER, false); - appendBehavList (mi, M ("TP_PCVIGNETTE_ROUNDNESS"), ADDSET_PCVIGNETTE_ROUNDNESS, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_PCVIGNETTE_LABEL")); + appendBehavList(mi, M("TP_PCVIGNETTE_STRENGTH"), ADDSET_PCVIGNETTE_STRENGTH, false); + appendBehavList(mi, M("TP_PCVIGNETTE_FEATHER"), ADDSET_PCVIGNETTE_FEATHER, false); + appendBehavList(mi, M("TP_PCVIGNETTE_ROUNDNESS"), ADDSET_PCVIGNETTE_ROUNDNESS, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_CACORRECTION_LABEL")); - appendBehavList (mi, M ("TP_CACORRECTION_BLUE") + ", " + M ("TP_CACORRECTION_RED"), ADDSET_CA, true); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_CACORRECTION_LABEL")); + appendBehavList(mi, M("TP_CACORRECTION_BLUE") + ", " + M("TP_CACORRECTION_RED"), ADDSET_CA, true); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_VIGNETTING_LABEL")); - appendBehavList (mi, M ("TP_VIGNETTING_AMOUNT"), ADDSET_VIGN_AMOUNT, false); - appendBehavList (mi, M ("TP_VIGNETTING_RADIUS"), ADDSET_VIGN_RADIUS, false); - appendBehavList (mi, M ("TP_VIGNETTING_STRENGTH"), ADDSET_VIGN_STRENGTH, false); - appendBehavList (mi, M ("TP_VIGNETTING_CENTER_X") + ", " + M ("TP_VIGNETTING_CENTER_Y"), ADDSET_VIGN_CENTER, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_VIGNETTING_LABEL")); + appendBehavList(mi, M("TP_VIGNETTING_AMOUNT"), ADDSET_VIGN_AMOUNT, false); + appendBehavList(mi, M("TP_VIGNETTING_RADIUS"), ADDSET_VIGN_RADIUS, false); + appendBehavList(mi, M("TP_VIGNETTING_STRENGTH"), ADDSET_VIGN_STRENGTH, false); + appendBehavList(mi, M("TP_VIGNETTING_CENTER_X") + ", " + M("TP_VIGNETTING_CENTER_Y"), ADDSET_VIGN_CENTER, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_DIRPYREQUALIZER_LABEL")); - appendBehavList (mi, M ("TP_EXPOSURE_CONTRAST"), ADDSET_DIRPYREQ, true); - appendBehavList (mi, M ("TP_DIRPYREQUALIZER_THRESHOLD"), ADDSET_DIRPYREQ_THRESHOLD, true); - appendBehavList (mi, M ("TP_DIRPYREQUALIZER_SKIN"), ADDSET_DIRPYREQ_SKINPROTECT, true); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_DIRPYREQUALIZER_LABEL")); + appendBehavList(mi, M("TP_EXPOSURE_CONTRAST"), ADDSET_DIRPYREQ, true); + appendBehavList(mi, M("TP_DIRPYREQUALIZER_THRESHOLD"), ADDSET_DIRPYREQ_THRESHOLD, true); + appendBehavList(mi, M("TP_DIRPYREQUALIZER_SKIN"), ADDSET_DIRPYREQ_SKINPROTECT, true); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_WAVELET_LABEL")); - appendBehavList (mi, M ("TP_WAVELET_LEVELS"), ADDSET_WA_THRES, true); - appendBehavList (mi, M ("TP_WAVELET_THRESHOLD"), ADDSET_WA_THRESHOLD, true); - appendBehavList (mi, M ("TP_WAVELET_THRESHOLD2"), ADDSET_WA_THRESHOLD2, true); - appendBehavList (mi, M ("TP_WAVELET_CHRO"), ADDSET_WA_CHRO, true); - appendBehavList (mi, M ("TP_WAVELET_CHR"), ADDSET_WA_CHROMA, true); - appendBehavList (mi, M ("TP_WAVELET_SKIN"), ADDSET_WA_SKINPROTECT, true); - appendBehavList (mi, M ("TP_WAVELET_EDRAD"), ADDSET_WA_EDGRAD, true); - appendBehavList (mi, M ("TP_WAVELET_EDVAL"), ADDSET_WA_EDGVAL, true); - appendBehavList (mi, M ("TP_WAVELET_RESCON"), ADDSET_WA_RESCON, true); - appendBehavList (mi, M ("TP_WAVELET_THR"), ADDSET_WA_THRR, true); - appendBehavList (mi, M ("TP_WAVELET_RESCONH"), ADDSET_WA_RESCONH, true); - appendBehavList (mi, M ("TP_WAVELET_THRH"), ADDSET_WA_THRRH, true); - appendBehavList (mi, M ("TP_WAVELET_RESCHRO"), ADDSET_WA_RESCHRO, true); - appendBehavList (mi, M ("TP_WAVELET_TMSTRENGTH"), ADDSET_WA_TMRS, true); - appendBehavList (mi, M ("TP_WAVELET_SKY"), ADDSET_WA_SKYPROTECT, true); - appendBehavList (mi, M ("TP_WAVELET_CONTRA"), ADDSET_WA_CONTRAST, true); - appendBehavList (mi, M ("TP_WAVELET_STRENGTH"), ADDSET_WA_STRENGTH, true); - appendBehavList (mi, M ("TP_WAVELET_COMPGAMMA"), ADDSET_WA_GAMMA, true); - appendBehavList (mi, M ("TP_WAVELET_EDGEDETECT"), ADDSET_WA_EDGEDETECT, true); - 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_WAVELET_LABEL")); + appendBehavList(mi, M("TP_WAVELET_LEVELS"), ADDSET_WA_THRES, true); + appendBehavList(mi, M("TP_WAVELET_THRESHOLD"), ADDSET_WA_THRESHOLD, true); + appendBehavList(mi, M("TP_WAVELET_THRESHOLD2"), ADDSET_WA_THRESHOLD2, true); + appendBehavList(mi, M("TP_WAVELET_CHRO"), ADDSET_WA_CHRO, true); + appendBehavList(mi, M("TP_WAVELET_CHR"), ADDSET_WA_CHROMA, true); + appendBehavList(mi, M("TP_WAVELET_SKIN"), ADDSET_WA_SKINPROTECT, true); + appendBehavList(mi, M("TP_WAVELET_EDRAD"), ADDSET_WA_EDGRAD, true); + appendBehavList(mi, M("TP_WAVELET_EDVAL"), ADDSET_WA_EDGVAL, true); + appendBehavList(mi, M("TP_WAVELET_RESCON"), ADDSET_WA_RESCON, true); + appendBehavList(mi, M("TP_WAVELET_THR"), ADDSET_WA_THRR, true); + appendBehavList(mi, M("TP_WAVELET_RESCONH"), ADDSET_WA_RESCONH, true); + appendBehavList(mi, M("TP_WAVELET_THRH"), ADDSET_WA_THRRH, true); + appendBehavList (mi, M ("TP_WAVELET_RADIUS"), ADDSET_WA_RADIUS, true); + appendBehavList(mi, M("TP_WAVELET_RESCHRO"), ADDSET_WA_RESCHRO, true); + appendBehavList(mi, M("TP_WAVELET_TMSTRENGTH"), ADDSET_WA_TMRS, true); + appendBehavList (mi, M ("TP_WAVELET_TMEDGS"), ADDSET_WA_EDGS, true); + appendBehavList (mi, M ("TP_WAVELET_TMSCALE"), ADDSET_WA_SCALE, true); + appendBehavList(mi, M("TP_WAVELET_SKY"), ADDSET_WA_SKYPROTECT, true); + appendBehavList(mi, M("TP_WAVELET_CONTRA"), ADDSET_WA_CONTRAST, true); + appendBehavList(mi, M("TP_WAVELET_STRENGTH"), ADDSET_WA_STRENGTH, true); + appendBehavList(mi, M("TP_WAVELET_COMPGAMMA"), ADDSET_WA_GAMMA, true); + appendBehavList(mi, M("TP_WAVELET_EDGEDETECT"), ADDSET_WA_EDGEDETECT, true); + 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("MAIN_TAB_RAW") + " - " + M("TP_RAW_SENSOR_BAYER_LABEL")); @@ -433,63 +456,75 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi->set_value (behavColumns.label, M("MAIN_TAB_RAW") + " - " + M("TP_RAWCACORR_LABEL")); appendBehavList (mi, M ("TP_RAWCACORR_CARED") + ", " + M ("TP_RAWCACORR_CABLUE"), ADDSET_RAWCACORR, true); - behTreeView->expand_all (); + behTreeView->expand_all(); - behAddAll = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_BEHADDALL")) ); - behSetAll = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_BEHSETALL")) ); - behAddAll->set_tooltip_markup (M ("PREFERENCES_BEHADDALLHINT")); - behSetAll->set_tooltip_markup (M ("PREFERENCES_BEHSETALLHINT")); + behAddAll = Gtk::manage(new Gtk::Button(M("PREFERENCES_BEHADDALL"))); + behSetAll = Gtk::manage(new Gtk::Button(M("PREFERENCES_BEHSETALL"))); + behAddAll->set_tooltip_markup(M("PREFERENCES_BEHADDALLHINT")); + behSetAll->set_tooltip_markup(M("PREFERENCES_BEHSETALLHINT")); - behAddAll->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::behAddAllPressed) ); - behSetAll->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::behSetAllPressed) ); + behAddAll->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::behAddAllPressed)); + behSetAll->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::behSetAllPressed)); - Gtk::HBox* buttonpanel1 = Gtk::manage (new Gtk::HBox ()); - buttonpanel1->pack_end (*behSetAll, Gtk::PACK_SHRINK, 4); - buttonpanel1->pack_end (*behAddAll, Gtk::PACK_SHRINK, 4); - vbbeh->pack_start (*buttonpanel1, Gtk::PACK_SHRINK, 4); + Gtk::Box* buttonpanel1 = Gtk::manage(new Gtk::Box()); + 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")) ); + chOverwriteOutputFile = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_OVERWRITEOUTPUTFILE"))); vbBatchProc->pack_start (*chOverwriteOutputFile, Gtk::PACK_SHRINK, 4); swBatchProc->add(*vbBatchProc); return swBatchProc; } -void Preferences::appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set) +void Preferences::appendBehavList(Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set) { - Gtk::TreeModel::iterator ci = behModel->append (parent->children()); - ci->set_value (behavColumns.label, label); - ci->set_value (behavColumns.visible, true); - ci->set_value (behavColumns.badd, !set); - ci->set_value (behavColumns.bset, set); - ci->set_value (behavColumns.addsetid, id); + Gtk::TreeModel::iterator ci = behModel->append(parent->children()); + ci->set_value(behavColumns.label, label); + ci->set_value(behavColumns.visible, true); + ci->set_value(behavColumns.badd, !set); + ci->set_value(behavColumns.bset, set); + ci->set_value(behavColumns.addsetid, id); } -void Preferences::behAddSetRadioToggled (const Glib::ustring& path, bool add) +void Preferences::behAddSetRadioToggled(const Glib::ustring& path, bool add) { - Gtk::TreeModel::iterator iter = behModel->get_iter (path); + Gtk::TreeModel::iterator iter = behModel->get_iter(path); iter->set_value(behavColumns.badd, add); iter->set_value(behavColumns.bset, !add); } -void Preferences::behAddRadioToggled (const Glib::ustring& path) +void Preferences::behAddRadioToggled(const Glib::ustring& path) { behAddSetRadioToggled(path, true); } -void Preferences::behSetRadioToggled (const Glib::ustring& path) +void Preferences::behSetRadioToggled(const Glib::ustring& path) { behAddSetRadioToggled(path, false); } +Gtk::Widget *Preferences::getFavoritesPanel() +{ + if (!toolLocationPreference) { + toolLocationPreference = Gtk::manage(new ToolLocationPreference(moptions)); + } + if (!swFavorites) { + swFavorites = Gtk::manage(new Gtk::ScrolledWindow()); + swFavorites->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER); + swFavorites->add(*toolLocationPreference); + } + return swFavorites; +} Gtk::Widget *Preferences::getDynamicProfilePanel() { swDynamicProfile = Gtk::manage(new Gtk::ScrolledWindow()); swDynamicProfile->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - dynProfilePanel = Gtk::manage (new DynamicProfilePanel()); + dynProfilePanel = Gtk::manage(new DynamicProfilePanel()); swDynamicProfile->add(*dynProfilePanel); return swDynamicProfile; @@ -501,81 +536,91 @@ Gtk::Widget* Preferences::getImageProcessingPanel () swImageProcessing = Gtk::manage(new Gtk::ScrolledWindow()); swImageProcessing->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* vbImageProcessing = Gtk::manage (new Gtk::VBox ()); + Gtk::Box* vbImageProcessing = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - Gtk::Frame* fpp = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_IMPROCPARAMS"))); - Gtk::VBox* vbpp = Gtk::manage (new Gtk::VBox ()); - Gtk::Label* drlab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_FORRAW") + ":", Gtk::ALIGN_START)); - rprofiles = Gtk::manage (new ProfileStoreComboBox ()); + Gtk::Frame* fpp = Gtk::manage(new Gtk::Frame(M("PREFERENCES_IMPROCPARAMS"))); + Gtk::Box* vbpp = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Label* drlab = Gtk::manage(new Gtk::Label(M("PREFERENCES_FORRAW") + ":", Gtk::ALIGN_START)); + rprofiles = Gtk::manage(new ProfileStoreComboBox()); const ProfileStoreEntry* dynpse = ProfileStore::getInstance()->getInternalDynamicPSE(); - rprofiles->addRow (dynpse); - setExpandAlignProperties (rprofiles, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - rprofiles->set_size_request (50, -1); - rpconn = rprofiles->signal_changed().connect ( sigc::mem_fun (*this, &Preferences::forRAWComboChanged) ); - Gtk::Label* drimg = Gtk::manage (new Gtk::Label (M ("PREFERENCES_FORIMAGE") + ":", Gtk::ALIGN_START)); - iprofiles = Gtk::manage (new ProfileStoreComboBox ()); - iprofiles->addRow (dynpse); - iprofiles->set_size_request (50, -1); - setExpandAlignProperties (iprofiles, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - ipconn = iprofiles->signal_changed().connect ( sigc::mem_fun (*this, &Preferences::forImageComboChanged) ); - Gtk::Table* defpt = Gtk::manage (new Gtk::Table (2, 2)); - defpt->attach (*drlab, 0, 1, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 2); - defpt->attach (*rprofiles, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - defpt->attach (*drimg, 0, 1, 1, 2, Gtk::FILL, Gtk::SHRINK, 2, 2); - defpt->attach (*iprofiles, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - vbpp->pack_start (*defpt, Gtk::PACK_SHRINK, 4); - useBundledProfiles = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_USEBUNDLEDPROFILES"))); - bpconn = useBundledProfiles->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::bundledProfilesChanged) ); - vbpp->pack_start (*useBundledProfiles, Gtk::PACK_SHRINK, 4); - fpp->add (*vbpp); + rprofiles->addRow(dynpse); + setExpandAlignProperties(rprofiles, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + rprofiles->set_size_request(50, -1); + rpconn = rprofiles->signal_changed().connect(sigc::mem_fun(*this, &Preferences::forRAWComboChanged)); + Gtk::Label* drimg = Gtk::manage(new Gtk::Label(M("PREFERENCES_FORIMAGE") + ":", Gtk::ALIGN_START)); + iprofiles = Gtk::manage(new ProfileStoreComboBox()); + iprofiles->addRow(dynpse); + iprofiles->set_size_request(50, -1); + setExpandAlignProperties(iprofiles, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + ipconn = iprofiles->signal_changed().connect(sigc::mem_fun(*this, &Preferences::forImageComboChanged)); + + Gtk::Grid* defpt = Gtk::manage(new Gtk::Grid()); + defpt->set_row_spacing(2); + defpt->attach(*drlab, 0, 0, 1, 1); + defpt->attach(*rprofiles, 1, 0, 1, 1); + defpt->attach(*drimg, 0, 1, 1, 1); + defpt->attach(*iprofiles, 1, 1, 1, 1); + vbpp->pack_start(*defpt, Gtk::PACK_SHRINK, 4); + + useBundledProfiles = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_USEBUNDLEDPROFILES"))); + bpconn = useBundledProfiles->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::bundledProfilesChanged)); + vbpp->pack_start(*useBundledProfiles, Gtk::PACK_SHRINK, 4); + fpp->add(*vbpp); vbImageProcessing->pack_start (*fpp, Gtk::PACK_SHRINK, 4); // Custom profile builder box - Gtk::Frame* cpfrm = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CUSTPROFBUILD")) ); - Gtk::Label* cplab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CUSTPROFBUILDPATH") + ":", Gtk::ALIGN_START) ); - txtCustProfBuilderPath = Gtk::manage ( new Gtk::Entry () ); - txtCustProfBuilderPath->set_tooltip_markup (M ("PREFERENCES_CUSTPROFBUILDHINT")); - Gtk::Label* cpltypelab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CUSTPROFBUILDKEYFORMAT") + ":", Gtk::ALIGN_START) ); - custProfBuilderLabelType = Gtk::manage (new Gtk::ComboBoxText ()); - custProfBuilderLabelType->append (M ("PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID")); - custProfBuilderLabelType->append (M ("PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME")); - custProfBuilderLabelType->append (M ("PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID") + "_" + M ("PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME")); - Gtk::Table* cpbt = Gtk::manage (new Gtk::Table (2, 2)); - cpbt->attach (*cplab, 0, 1, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 2); - cpbt->attach (*txtCustProfBuilderPath, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - 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); + Gtk::Frame* cpfrm = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CUSTPROFBUILD"))); + Gtk::Label* cplab = Gtk::manage(new Gtk::Label(M("PREFERENCES_CUSTPROFBUILDPATH") + ":", Gtk::ALIGN_START)); + txtCustProfBuilderPath = Gtk::manage(new Gtk::Entry()); + txtCustProfBuilderPath->set_tooltip_markup(M("PREFERENCES_CUSTPROFBUILDHINT")); + txtCustProfBuilderPath->set_hexpand(); + Gtk::Label* cpltypelab = Gtk::manage(new Gtk::Label(M("PREFERENCES_CUSTPROFBUILDKEYFORMAT") + ":", Gtk::ALIGN_START)); + custProfBuilderLabelType = Gtk::manage(new Gtk::ComboBoxText()); + custProfBuilderLabelType->append(M("PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID")); + custProfBuilderLabelType->append(M("PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME")); + custProfBuilderLabelType->append(M("PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID") + "_" + M("PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME")); + Gtk::Grid* cpbt = Gtk::manage(new Gtk::Grid()); + cpbt->set_row_spacing(2); + cpbt->attach(*cplab, 0, 0, 1, 1); + cpbt->attach(*txtCustProfBuilderPath, 1, 0, 1, 1); + cpbt->attach(*cpltypelab, 0, 1, 1, 1); + cpbt->attach(*custProfBuilderLabelType, 1, 1, 1, 1); + cpfrm->add(*cpbt); 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)); - saveParamsPreference = Gtk::manage (new Gtk::ComboBoxText ()); - saveParamsPreference->append (M ("PREFERENCES_PROFILESAVEINPUT")); - saveParamsPreference->append (M ("PREFERENCES_PROFILESAVECACHE")); - saveParamsPreference->append (M ("PREFERENCES_PROFILESAVEBOTH")); + Gtk::Frame* fdp = Gtk::manage(new Gtk::Frame(M("PREFERENCES_PROFILEHANDLING"))); + Gtk::Grid* vbdp = Gtk::manage(new Gtk::Grid()); + saveParamsPreference = Gtk::manage(new Gtk::ComboBoxText()); + saveParamsPreference->append(M("PREFERENCES_PROFILESAVEINPUT")); + saveParamsPreference->append(M("PREFERENCES_PROFILESAVECACHE")); + saveParamsPreference->append(M("PREFERENCES_PROFILESAVEBOTH")); Gtk::Label *splab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_PROFILESAVELOCATION") + ":", Gtk::ALIGN_START)); - vbdp->attach (*splab, 0, 1, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 2); - vbdp->attach (*saveParamsPreference, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); Gtk::Label* lplab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_PROFILELOADPR") + ":", Gtk::ALIGN_START)); - loadParamsPreference = Gtk::manage (new Gtk::ComboBoxText ()); - loadParamsPreference->append (M ("PREFERENCES_PROFILEPRCACHE")); - loadParamsPreference->append (M ("PREFERENCES_PROFILEPRFILE")); - 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); + loadParamsPreference = Gtk::manage(new Gtk::ComboBoxText()); + loadParamsPreference->append(M("PREFERENCES_PROFILEPRCACHE")); + loadParamsPreference->append(M("PREFERENCES_PROFILEPRFILE")); + vbdp->set_row_spacing(2); + vbdp->attach(*splab, 0, 0, 1, 1); + vbdp->attach(*saveParamsPreference, 1, 0, 1, 1); + vbdp->attach(*lplab, 0, 1, 1, 1); + vbdp->attach(*loadParamsPreference, 1, 1, 1, 1); + fdp->add(*vbdp); vbImageProcessing->pack_start (*fdp, Gtk::PACK_SHRINK, 4); +// Gtk::Frame* fdf = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_DARKFRAME")) ); +// Gtk::Box* hb42 = Gtk::manage (new Gtk::Box ()); +// darkFrameDir = Gtk::manage (new Gtk::FileChooserButton (M ("PREFERENCES_DIRDARKFRAMES"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); // Directories - Gtk::Frame* cdf = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_DIRECTORIES")) ); - Gtk::Grid* dirgrid = Gtk::manage (new Gtk::Grid ()); + Gtk::Frame* cdf = Gtk::manage(new Gtk::Frame(M("PREFERENCES_DIRECTORIES"))); + Gtk::Grid* dirgrid = Gtk::manage(new Gtk::Grid()); setExpandAlignProperties(dirgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Label *dfLab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_DIRDARKFRAMES") + ":")); + // Dark Frames Dir + Gtk::Label *dfLab = Gtk::manage(new Gtk::Label(M("PREFERENCES_DIRDARKFRAMES") + ":")); setExpandAlignProperties(dfLab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - darkFrameDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_DIRDARKFRAMES"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + darkFrameDir = Gtk::manage(new MyFileChooserButton(M("PREFERENCES_DIRDARKFRAMES"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); setExpandAlignProperties(darkFrameDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - dfLabel = Gtk::manage (new Gtk::Label ("Found:")); + dfLabel = Gtk::manage(new Gtk::Label("Found:")); setExpandAlignProperties(dfLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); dirgrid->attach_next_to(*dfLab, Gtk::POS_TOP, 1, 1); @@ -584,12 +629,12 @@ Gtk::Widget* Preferences::getImageProcessingPanel () dfconn = darkFrameDir->signal_selection_changed().connect ( sigc::mem_fun (*this, &Preferences::darkFrameChanged)); - // FLATFIELD - Gtk::Label *ffLab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_FLATFIELDSDIR") + ":")); + // Flatfield Dir + Gtk::Label *ffLab = Gtk::manage(new Gtk::Label(M("PREFERENCES_FLATFIELDSDIR") + ":")); setExpandAlignProperties(ffLab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - flatFieldDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_FLATFIELDSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + flatFieldDir = Gtk::manage(new MyFileChooserButton(M("PREFERENCES_FLATFIELDSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); setExpandAlignProperties(flatFieldDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - ffLabel = Gtk::manage (new Gtk::Label ("Found:")); + ffLabel = Gtk::manage(new Gtk::Label("Found:")); setExpandAlignProperties(ffLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); dirgrid->attach_next_to(*ffLab, *dfLab, Gtk::POS_BOTTOM, 1, 1); @@ -599,22 +644,42 @@ Gtk::Widget* Preferences::getImageProcessingPanel () 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") + ":")); + Gtk::Label *clutsDirLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_CLUTSDIR") + ":")); setExpandAlignProperties(clutsDirLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - clutsDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_CLUTSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + clutsDir = Gtk::manage(new MyFileChooserButton(M("PREFERENCES_CLUTSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); setExpandAlignProperties(clutsDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Label* clutsRestartNeeded = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); + Gtk::Label* clutsRestartNeeded = Gtk::manage(new Gtk::Label(Glib::ustring(" (") + M("PREFERENCES_APPLNEXTSTARTUP") + ")")); setExpandAlignProperties(clutsRestartNeeded, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); dirgrid->attach_next_to(*clutsDirLabel, *ffLab, Gtk::POS_BOTTOM, 1, 1); dirgrid->attach_next_to(*clutsDir, *clutsDirLabel, Gtk::POS_RIGHT, 1, 1); dirgrid->attach_next_to(*clutsRestartNeeded, *clutsDir, Gtk::POS_RIGHT, 1, 1); + //Camera Profiles Dir + Gtk::Label *cameraProfilesDirLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_CAMERAPROFILESDIR") + ":")); + setExpandAlignProperties(cameraProfilesDirLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + cameraProfilesDir = Gtk::manage(new MyFileChooserButton(M("PREFERENCES_CAMERAPROFILESDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + setExpandAlignProperties(cameraProfilesDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + dirgrid->attach_next_to(*cameraProfilesDirLabel, *clutsDirLabel, Gtk::POS_BOTTOM, 1, 1); + dirgrid->attach_next_to(*cameraProfilesDir, *cameraProfilesDirLabel, Gtk::POS_RIGHT, 1, 1); + + //Lens Profiles Dir + Gtk::Label *lensProfilesDirLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_LENSPROFILESDIR") + ":")); + setExpandAlignProperties(lensProfilesDirLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + lensProfilesDir = Gtk::manage(new MyFileChooserButton(M("PREFERENCES_LENSPROFILESDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + setExpandAlignProperties(lensProfilesDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + dirgrid->attach_next_to(*lensProfilesDirLabel, *cameraProfilesDirLabel, Gtk::POS_BOTTOM, 1, 1); + dirgrid->attach_next_to(*lensProfilesDir, *lensProfilesDirLabel, Gtk::POS_RIGHT, 1, 1); + + //Pack directories to Image Processing panel cdf->add(*dirgrid); vbImageProcessing->pack_start (*cdf, Gtk::PACK_SHRINK, 4 ); // Crop Gtk::Frame *cropFrame = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CROP"))); + cropFrame->set_label_align (0.025, 0.5); Gtk::Grid *cropGrid = Gtk::manage(new Gtk::Grid()); Gtk::Label *cropGuidesLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_GUIDES") + ": ", Gtk::ALIGN_START)); cropGuidesCombo = Gtk::manage(new Gtk::ComboBoxText()); @@ -636,35 +701,37 @@ Gtk::Widget* Preferences::getImageProcessingPanel () return swImageProcessing; } -Gtk::Widget* Preferences::getPerformancePanel () +Gtk::Widget* Preferences::getPerformancePanel() { swPerformance = Gtk::manage(new Gtk::ScrolledWindow()); swPerformance->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* vbPerformance = Gtk::manage ( new Gtk::VBox () ); + Gtk::Box* vbPerformance = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); 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)); + Gtk::Frame* fprevdemo = Gtk::manage(new Gtk::Frame(M("PREFERENCES_PREVDEMO"))); + Gtk::Box* hbprevdemo = Gtk::manage(new Gtk::Box()); + hbprevdemo->set_spacing(4); Gtk::Label* lprevdemo = Gtk::manage (new Gtk::Label (M("PREFERENCES_PREVDEMO_LABEL"), Gtk::ALIGN_START)); - cprevdemo = Gtk::manage (new Gtk::ComboBoxText ()); - cprevdemo->append (M ("PREFERENCES_PREVDEMO_FAST")); - cprevdemo->append (M ("PREFERENCES_PREVDEMO_SIDECAR")); - cprevdemo->set_active (1); - hbprevdemo->pack_start (*lprevdemo, Gtk::PACK_SHRINK); - hbprevdemo->pack_start (*cprevdemo); - fprevdemo->add (*hbprevdemo); + cprevdemo = Gtk::manage(new Gtk::ComboBoxText()); + cprevdemo->append(M("PREFERENCES_PREVDEMO_FAST")); + cprevdemo->append(M("PREFERENCES_PREVDEMO_SIDECAR")); + cprevdemo->set_active(1); + hbprevdemo->pack_start(*lprevdemo, Gtk::PACK_SHRINK); + hbprevdemo->pack_start(*cprevdemo); + fprevdemo->add(*hbprevdemo); 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)); - ctiffserialize = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_SERIALIZE_TIFF_READ_LABEL")) ); - ctiffserialize->set_tooltip_text (M ("PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP")); - htiffserialize->pack_start (*ctiffserialize); - ftiffserialize->add (*htiffserialize); + Gtk::Frame* ftiffserialize = Gtk::manage(new Gtk::Frame(M("PREFERENCES_SERIALIZE_TIFF_READ"))); + Gtk::Box* htiffserialize = Gtk::manage(new Gtk::Box()); + htiffserialize->set_spacing(4); + ctiffserialize = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_SERIALIZE_TIFF_READ_LABEL"))); + ctiffserialize->set_tooltip_text(M("PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP")); + htiffserialize->pack_start(*ctiffserialize); + ftiffserialize->add(*htiffserialize); vbPerformance->pack_start (*ftiffserialize, Gtk::PACK_SHRINK, 4); - Gtk::Frame* fclut = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CLUTSCACHE")) ); + Gtk::Frame* fclut = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CLUTSCACHE"))); #ifdef _OPENMP placeSpinBox(fclut, clutCacheSizeSB, "PREFERENCES_CLUTSCACHE_LABEL", 0, 1, 5, 2, 1, 3 * omp_get_num_procs()); #else @@ -673,9 +740,10 @@ Gtk::Widget* Preferences::getPerformancePanel () 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 () ); + fchunksize->set_label_align(0.025, 0.5); + Gtk::Box* chunkSizeVB = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); - Gtk::HBox* measureHB = Gtk::manage ( new Gtk::HBox () ); + Gtk::Box* measureHB = Gtk::manage ( new Gtk::Box () ); measureHB->set_spacing (4); measureCB = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_PERFORMANCE_MEASURE")) ); measureCB->set_tooltip_text (M ("PREFERENCES_PERFORMANCE_MEASURE_HINT")); @@ -693,10 +761,11 @@ Gtk::Widget* Preferences::getPerformancePanel () vbPerformance->pack_start (*fchunksize, Gtk::PACK_SHRINK, 4); Gtk::Frame* finspect = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_INSPECT_LABEL")) ); - Gtk::VBox *inspectorvb = Gtk::manage(new Gtk::VBox()); + finspect->set_label_align(0.025, 0.5); + Gtk::Box* inspectorvb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); placeSpinBox(inspectorvb, maxInspectorBuffersSB, "PREFERENCES_INSPECT_MAXBUFFERS_LABEL", 0, 1, 5, 2, 1, 12, "PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP"); - Gtk::HBox *insphb = Gtk::manage(new Gtk::HBox()); + Gtk::Box* insphb = Gtk::manage(new Gtk::Box()); thumbnailInspectorMode = Gtk::manage(new Gtk::ComboBoxText()); thumbnailInspectorMode->append(M("PREFERENCES_THUMBNAIL_INSPECTOR_JPEG")); thumbnailInspectorMode->append(M("PREFERENCES_THUMBNAIL_INSPECTOR_RAW")); @@ -708,7 +777,8 @@ Gtk::Widget* Preferences::getPerformancePanel () 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) ); + threadsFrame->set_label_align(0.025, 0.5); + Gtk::Box* threadsVBox = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); #ifdef _OPENMP int maxThreadNumber = omp_get_max_threads(); @@ -716,6 +786,7 @@ Gtk::Widget* Preferences::getPerformancePanel () int maxThreadNumber = 10; #endif + placeSpinBox(threadsVBox, threadsSpinBtn, "PREFERENCES_PERFORMANCE_THREADS_LABEL", 0, 1, 5, 2, 0, maxThreadNumber); threadsFrame->add (*threadsVBox); @@ -731,51 +802,52 @@ Gtk::Widget* Preferences::getColorManPanel () swColorMan = Gtk::manage(new Gtk::ScrolledWindow()); swColorMan->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* vbColorMan = Gtk::manage (new Gtk::VBox ()); + Gtk::Box* vbColorMan = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); 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); - Gtk::Label* pdlabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_ICCDIR") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (pdlabel, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + iccDir = Gtk::manage(new MyFileChooserButton(M("PREFERENCES_ICCDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + setExpandAlignProperties(iccDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + Gtk::Label* pdlabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_ICCDIR") + ":", Gtk::ALIGN_START)); + setExpandAlignProperties(pdlabel, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Grid* iccdgrid = Gtk::manage (new Gtk::Grid ()); - setExpandAlignProperties (iccdgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - iccdgrid->set_column_spacing (4); + Gtk::Grid* iccdgrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(iccdgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + iccdgrid->set_column_spacing(4); Gtk::Label* monProfileRestartNeeded = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); setExpandAlignProperties(monProfileRestartNeeded, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - iccdgrid->attach (*pdlabel, 0, 0, 1, 1); - iccdgrid->attach (*iccDir, 1, 0, 1, 1); + iccdgrid->attach(*pdlabel, 0, 0, 1, 1); + iccdgrid->attach(*iccDir, 1, 0, 1, 1); iccdgrid->attach (*monProfileRestartNeeded, 2, 0, 1, 1); - iccDir->signal_selection_changed ().connect (sigc::mem_fun (this, &Preferences::iccDirChanged)); + iccDir->signal_selection_changed().connect(sigc::mem_fun(this, &Preferences::iccDirChanged)); vbColorMan->pack_start (*iccdgrid, Gtk::PACK_SHRINK); + //------------------------- MONITOR ---------------------- - Gtk::Frame* fmonitor = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_MONITOR")) ); - Gtk::Grid* gmonitor = Gtk::manage ( new Gtk::Grid () ); - gmonitor->set_column_spacing (4); + Gtk::Frame* fmonitor = Gtk::manage(new Gtk::Frame(M("PREFERENCES_MONITOR"))); + Gtk::Grid* gmonitor = Gtk::manage(new Gtk::Grid()); + gmonitor->set_column_spacing(4); - monProfile = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (monProfile, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Label* mplabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_MONPROFILE") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (mplabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + monProfile = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(monProfile, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + Gtk::Label* mplabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_MONPROFILE") + ":", Gtk::ALIGN_START)); + setExpandAlignProperties(mplabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - monIntent = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (monIntent, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Label* milabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_MONINTENT") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (milabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + monIntent = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(monIntent, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + Gtk::Label* milabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_MONINTENT") + ":", Gtk::ALIGN_START)); + setExpandAlignProperties(milabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - monProfile->append (M ("PREFERENCES_PROFILE_NONE")); - monProfile->set_active (0); + monProfile->append(M("PREFERENCES_PROFILE_NONE")); + monProfile->set_active(0); - const std::vector profiles = rtengine::ICCStore::getInstance ()->getProfiles (rtengine::ICCStore::ProfileType::MONITOR); + const std::vector profiles = rtengine::ICCStore::getInstance()->getProfiles(rtengine::ICCStore::ProfileType::MONITOR); - for (const auto profile : profiles) { + for (const auto& profile : profiles) { if (profile.find("file:") != 0) { std::string fileis_RTv4 = profile.substr(0, 4); @@ -787,97 +859,113 @@ Gtk::Widget* Preferences::getColorManPanel () } // same order as the enum - monIntent->append (M ("PREFERENCES_INTENT_PERCEPTUAL")); - monIntent->append (M ("PREFERENCES_INTENT_RELATIVE")); - monIntent->append (M ("PREFERENCES_INTENT_ABSOLUTE")); - monIntent->set_active (1); - monIntent->set_size_request (120, -1); + monIntent->append(M("PREFERENCES_INTENT_PERCEPTUAL")); + monIntent->append(M("PREFERENCES_INTENT_RELATIVE")); + monIntent->append(M("PREFERENCES_INTENT_ABSOLUTE")); + monIntent->set_active(1); + monIntent->set_size_request(120, -1); - monBPC = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_CMMBPC"))); - setExpandAlignProperties (monBPC, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - monBPC->set_active (true); + monBPC = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_CMMBPC"))); + setExpandAlignProperties(monBPC, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + monBPC->set_active(true); - 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)); + 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)); int row = 0; - gmonitor->attach (*mplabel, 0, row, 1, 1); + gmonitor->attach(*mplabel, 0, row, 1, 1); #if defined(__APPLE__) // monitor profile not supported on apple - Gtk::Label *osxwarn = Gtk::manage (new Gtk::Label (M ("PREFERENCES_MONPROFILE_WARNOSX"), Gtk::ALIGN_START)); - setExpandAlignProperties (osxwarn, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - gmonitor->attach (*osxwarn, 1, row, 1, 1); + Gtk::Label *osxwarn = Gtk::manage(new Gtk::Label(M("PREFERENCES_MONPROFILE_WARNOSX"), Gtk::ALIGN_START)); + setExpandAlignProperties(osxwarn, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + gmonitor->attach(*osxwarn, 1, row, 1, 1); #else - gmonitor->attach (*monProfile, 1, row, 1, 1); + gmonitor->attach(*monProfile, 1, row, 1, 1); #endif ++row; - gmonitor->attach (*cbAutoMonProfile, 1, row, 1, 1); + gmonitor->attach(*cbAutoMonProfile, 1, row, 1, 1); ++row; - gmonitor->attach (*milabel, 0, row, 1, 1); - gmonitor->attach (*monIntent, 1, row, 1, 1); + gmonitor->attach(*milabel, 0, row, 1, 1); + gmonitor->attach(*monIntent, 1, row, 1, 1); ++row; - gmonitor->attach (*monBPC, 0, row, 2, 1); + gmonitor->attach(*monBPC, 0, row, 2, 1); autoMonProfileToggled(); - fmonitor->add (*gmonitor); + fmonitor->add(*gmonitor); vbColorMan->pack_start (*fmonitor, Gtk::PACK_SHRINK); //------------------------- PRINTER ---------------------- - Gtk::Frame* fprinter = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_PRINTER")) ); - Gtk::Grid* gprinter = Gtk::manage ( new Gtk::Grid () ); - gprinter->set_column_spacing (4); - prtProfile = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (prtProfile, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Label* pplabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_PRTPROFILE") + ":")); - setExpandAlignProperties (pplabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Frame* fprinter = Gtk::manage(new Gtk::Frame(M("PREFERENCES_PRINTER"))); + Gtk::Grid* gprinter = Gtk::manage(new Gtk::Grid()); + gprinter->set_column_spacing(4); + prtProfile = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(prtProfile, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + Gtk::Label* pplabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_PRTPROFILE") + ":")); + setExpandAlignProperties(pplabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - prtIntent = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (prtIntent, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Label* pilabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_PRTINTENT") + ":")); - setExpandAlignProperties (pilabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + prtIntent = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(prtIntent, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + Gtk::Label* pilabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_PRTINTENT") + ":")); + setExpandAlignProperties(pilabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - prtProfile->append (M ("PREFERENCES_PROFILE_NONE")); - prtProfile->set_active (0); + prtProfile->append(M("PREFERENCES_PROFILE_NONE")); + prtProfile->set_active(0); - const std::vector prtprofiles = rtengine::ICCStore::getInstance ()->getProfiles (rtengine::ICCStore::ProfileType::PRINTER); + const std::vector prtprofiles = rtengine::ICCStore::getInstance()->getProfiles(rtengine::ICCStore::ProfileType::PRINTER); - for (const auto prtprofile : prtprofiles) { - prtProfile->append (prtprofile); + for (const auto& prtprofile : prtprofiles) { + prtProfile->append(prtprofile); } // same order as the enum - prtIntent->append (M ("PREFERENCES_INTENT_PERCEPTUAL")); - prtIntent->append (M ("PREFERENCES_INTENT_RELATIVE")); - prtIntent->append (M ("PREFERENCES_INTENT_ABSOLUTE")); - prtIntent->set_active (1); + prtIntent->append(M("PREFERENCES_INTENT_PERCEPTUAL")); + prtIntent->append(M("PREFERENCES_INTENT_RELATIVE")); + prtIntent->append(M("PREFERENCES_INTENT_ABSOLUTE")); + prtIntent->set_active(1); - prtBPC = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_CMMBPC"))); - setExpandAlignProperties (prtBPC, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - prtBPC->set_active (true); + prtBPC = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_CMMBPC"))); + setExpandAlignProperties(prtBPC, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + prtBPC->set_active(true); row = 0; - gprinter->attach (*pplabel, 0, row, 1, 1); - gprinter->attach (*prtProfile, 1, row, 1, 1); + gprinter->attach(*pplabel, 0, row, 1, 1); + gprinter->attach(*prtProfile, 1, row, 1, 1); ++row; - gprinter->attach (*pilabel, 0, row, 1, 1); - gprinter->attach (*prtIntent, 1, row, 1, 1); + gprinter->attach(*pilabel, 0, row, 1, 1); + gprinter->attach(*prtIntent, 1, row, 1, 1); ++row; - gprinter->attach (*prtBPC, 0, row, 2, 1); + gprinter->attach(*prtBPC, 0, row, 2, 1); autoMonProfileToggled(); - fprinter->add (*gprinter); + fprinter->add(*gprinter); vbColorMan->pack_start (*fprinter, Gtk::PACK_SHRINK); + + //-------------CIECAM + Gtk::Frame* fcie = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CIE"))); + Gtk::Grid* gcie = Gtk::manage(new Gtk::Grid()); + gcie->set_column_spacing(4); + mcie = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_CIEARTIF"))); + setExpandAlignProperties(mcie, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + mcie->set_active(true); + int rowc = 0; + gcie->attach(*mcie, 0, rowc, 1, 1); + fcie->add(*gcie); + + vbColorMan->pack_start (*fcie, Gtk::PACK_SHRINK); + + + //------------- swColorMan->add(*vbColorMan); return swColorMan; } -Gtk::Widget* Preferences::getGeneralPanel () +Gtk::Widget* Preferences::getGeneralPanel() { swGeneral = Gtk::manage(new Gtk::ScrolledWindow()); swGeneral->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); @@ -886,114 +974,140 @@ Gtk::Widget* Preferences::getGeneralPanel () 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); - Gtk::Grid* workflowGrid = Gtk::manage (new Gtk::Grid()); - workflowGrid->set_column_spacing (4); - workflowGrid->set_row_spacing (4); - setExpandAlignProperties (workflowGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + Gtk::Frame* fworklflow = Gtk::manage(new Gtk::Frame(M("PREFERENCES_WORKFLOW"))); + setExpandAlignProperties(fworklflow, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + Gtk::Grid* workflowGrid = Gtk::manage(new Gtk::Grid()); + workflowGrid->set_column_spacing(4); + workflowGrid->set_row_spacing(4); + setExpandAlignProperties(workflowGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - Gtk::Label* flayoutlab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_EDITORLAYOUT") + ":")); - setExpandAlignProperties (flayoutlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + Gtk::Label* flayoutlab = Gtk::manage(new Gtk::Label(M("PREFERENCES_EDITORLAYOUT") + ":")); + setExpandAlignProperties(flayoutlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); editorLayout = Gtk::manage (new MyComboBoxText ()); - setExpandAlignProperties (editorLayout, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - editorLayout->append (M ("PREFERENCES_SINGLETAB")); - editorLayout->append (M ("PREFERENCES_SINGLETABVERTAB")); - editorLayout->append (M ("PREFERENCES_MULTITAB")); - editorLayout->append (M ("PREFERENCES_MULTITABDUALMON")); - editorLayout->set_active (2); - Gtk::CellRendererText* cellRenderer = dynamic_cast (editorLayout->get_first_cell()); + setExpandAlignProperties(editorLayout, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + editorLayout->append(M("PREFERENCES_SINGLETAB")); + editorLayout->append(M("PREFERENCES_SINGLETABVERTAB")); + editorLayout->append(M("PREFERENCES_MULTITAB")); + editorLayout->append(M("PREFERENCES_MULTITABDUALMON")); + editorLayout->set_active(2); + Gtk::CellRendererText* cellRenderer = dynamic_cast(editorLayout->get_first_cell()); cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; cellRenderer->property_ellipsize_set() = true; - editorLayout->signal_changed().connect (sigc::mem_fun (*this, &Preferences::layoutComboChanged)); + editorLayout->signal_changed().connect(sigc::mem_fun(*this, &Preferences::layoutComboChanged)); layoutComboChanged(); // update the tooltip - Gtk::Label* lNextStart = Gtk::manage ( new Gtk::Label (Glib::ustring ("(") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); - setExpandAlignProperties (lNextStart, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - workflowGrid->attach_next_to (*flayoutlab, Gtk::POS_LEFT, 1, 1); - workflowGrid->attach_next_to (*editorLayout, *flayoutlab, Gtk::POS_RIGHT, 1, 1); - workflowGrid->attach_next_to (*lNextStart, *editorLayout, Gtk::POS_RIGHT, 1, 1); + Gtk::Label* lNextStart = Gtk::manage(new Gtk::Label(Glib::ustring("(") + M("PREFERENCES_APPLNEXTSTARTUP") + ")")); + setExpandAlignProperties(lNextStart, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*flayoutlab, Gtk::POS_LEFT, 1, 1); + workflowGrid->attach_next_to(*editorLayout, *flayoutlab, Gtk::POS_RIGHT, 1, 1); + workflowGrid->attach_next_to(*lNextStart, *editorLayout, Gtk::POS_RIGHT, 1, 1); - Gtk::Label* curveBBoxPosL = Gtk::manage (new Gtk::Label (M ("PREFERENCES_CURVEBBOXPOS") + ":")); - setExpandAlignProperties (curveBBoxPosL, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - curveBBoxPosC = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (curveBBoxPosC, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - curveBBoxPosC->append (M ("PREFERENCES_CURVEBBOXPOS_ABOVE")); - curveBBoxPosC->append (M ("PREFERENCES_CURVEBBOXPOS_RIGHT")); - curveBBoxPosC->append (M ("PREFERENCES_CURVEBBOXPOS_BELOW")); - curveBBoxPosC->append (M ("PREFERENCES_CURVEBBOXPOS_LEFT")); - curveBBoxPosC->set_active (1); - Gtk::Label* curveBBoxPosRestartL = Gtk::manage (new Gtk::Label (Glib::ustring ("(") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")")); - setExpandAlignProperties (curveBBoxPosRestartL, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - workflowGrid->attach_next_to (*curveBBoxPosL, *flayoutlab, Gtk::POS_BOTTOM, 1, 1); - workflowGrid->attach_next_to (*curveBBoxPosC, *editorLayout, Gtk::POS_BOTTOM, 1, 1); - workflowGrid->attach_next_to (*curveBBoxPosRestartL, *lNextStart, Gtk::POS_BOTTOM, 1, 1); + Gtk::Label* curveBBoxPosL = Gtk::manage(new Gtk::Label(M("PREFERENCES_CURVEBBOXPOS") + ":")); + setExpandAlignProperties(curveBBoxPosL, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + curveBBoxPosC = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(curveBBoxPosC, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + curveBBoxPosC->append(M("PREFERENCES_CURVEBBOXPOS_ABOVE")); + curveBBoxPosC->append(M("PREFERENCES_CURVEBBOXPOS_RIGHT")); + curveBBoxPosC->append(M("PREFERENCES_CURVEBBOXPOS_BELOW")); + curveBBoxPosC->append(M("PREFERENCES_CURVEBBOXPOS_LEFT")); + curveBBoxPosC->set_active(1); + Gtk::Label* curveBBoxPosRestartL = Gtk::manage(new Gtk::Label(Glib::ustring("(") + M("PREFERENCES_APPLNEXTSTARTUP") + ")")); + setExpandAlignProperties(curveBBoxPosRestartL, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*curveBBoxPosL, *flayoutlab, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*curveBBoxPosC, *editorLayout, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*curveBBoxPosRestartL, *lNextStart, Gtk::POS_BOTTOM, 1, 1); - ckbHistogramPositionLeft = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_HISTOGRAMPOSITIONLEFT")) ); - setExpandAlignProperties (ckbHistogramPositionLeft, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - workflowGrid->attach_next_to (*ckbHistogramPositionLeft, *curveBBoxPosL, Gtk::POS_BOTTOM, 1, 1); + Gtk::Label* complexityL = Gtk::manage(new Gtk::Label(M("PREFERENCES_COMPLEXITYLOC") + ":")); + setExpandAlignProperties(complexityL, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + complexitylocal = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(complexitylocal, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + complexitylocal->append(M("PREFERENCES_COMPLEXITY_EXP")); + complexitylocal->append(M("PREFERENCES_COMPLEXITY_NORM")); + complexitylocal->append(M("PREFERENCES_COMPLEXITY_SIMP")); + complexitylocal->set_active(2); + workflowGrid->attach_next_to(*complexityL, *curveBBoxPosL, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*complexitylocal, *curveBBoxPosC, Gtk::POS_BOTTOM, 1, 1); - ckbFileBrowserToolbarSingleRow = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_FILEBROWSERTOOLBARSINGLEROW")) ); - setExpandAlignProperties (ckbFileBrowserToolbarSingleRow, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); - ckbShowFilmStripToolBar = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_SHOWFILMSTRIPTOOLBAR")) ); - setExpandAlignProperties (ckbShowFilmStripToolBar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); - workflowGrid->attach_next_to (*ckbFileBrowserToolbarSingleRow, *ckbHistogramPositionLeft, Gtk::POS_BOTTOM, 1, 1); - workflowGrid->attach_next_to (*ckbShowFilmStripToolBar, *curveBBoxPosC, Gtk::POS_BOTTOM, 2, 1); + zoomOnScrollCB = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_ZOOMONSCROLL"))); + setExpandAlignProperties(zoomOnScrollCB, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*zoomOnScrollCB, *complexityL, Gtk::POS_BOTTOM, 1, 1); - Gtk::Label* hb4label = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_TP_LABEL")) ); - setExpandAlignProperties (hb4label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - ckbHideTPVScrollbar = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_VSCROLLBAR")) ); - setExpandAlignProperties (ckbHideTPVScrollbar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - workflowGrid->attach_next_to (*hb4label, *ckbFileBrowserToolbarSingleRow, Gtk::POS_BOTTOM, 1, 1); - workflowGrid->attach_next_to (*ckbHideTPVScrollbar, *hb4label, 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"))); - setExpandAlignProperties (btnSaveTpOpenNow, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - workflowGrid->attach_next_to (*btnSaveTpOpenNow, *ckbAutoSaveTpOpen, Gtk::POS_RIGHT, 1, 1); + inspectorWindowCB = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_INSPECTORWINDOW"))); + setExpandAlignProperties(inspectorWindowCB, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*inspectorWindowCB, *complexitylocal, Gtk::POS_BOTTOM, 1, 1); + Gtk::Label* inspectorNextStartL = Gtk::manage(new Gtk::Label(Glib::ustring("(") + M("PREFERENCES_APPLNEXTSTARTUP") + ")")); + setExpandAlignProperties(inspectorNextStartL, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*inspectorNextStartL, *inspectorWindowCB, Gtk::POS_RIGHT, 1, 1); + + ckbHistogramPositionLeft = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_HISTOGRAMPOSITIONLEFT"))); + setExpandAlignProperties(ckbHistogramPositionLeft, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*ckbHistogramPositionLeft, *zoomOnScrollCB, Gtk::POS_BOTTOM, 1, 1); + + ckbFileBrowserToolbarSingleRow = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_FILEBROWSERTOOLBARSINGLEROW"))); + setExpandAlignProperties(ckbFileBrowserToolbarSingleRow, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + ckbShowFilmStripToolBar = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_SHOWFILMSTRIPTOOLBAR"))); + setExpandAlignProperties(ckbShowFilmStripToolBar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + workflowGrid->attach_next_to(*ckbFileBrowserToolbarSingleRow, *ckbHistogramPositionLeft, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*ckbShowFilmStripToolBar, *inspectorWindowCB, Gtk::POS_BOTTOM, 2, 1); + + Gtk::Label* hb4label = Gtk::manage(new Gtk::Label(M("PREFERENCES_TP_LABEL"))); + setExpandAlignProperties(hb4label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + ckbHideTPVScrollbar = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_TP_VSCROLLBAR"))); + setExpandAlignProperties(ckbHideTPVScrollbar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*hb4label, *ckbFileBrowserToolbarSingleRow, Gtk::POS_BOTTOM, 1, 1); + workflowGrid->attach_next_to(*ckbHideTPVScrollbar, *hb4label, 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"))); + setExpandAlignProperties(btnSaveTpOpenNow, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to(*btnSaveTpOpenNow, *ckbAutoSaveTpOpen, Gtk::POS_RIGHT, 1, 1); auto save_tp_open_now = [&]() -> void { - parent->writeToolExpandedStatus (moptions.tpOpen); + parent->writeToolExpandedStatus(moptions.tpOpen); }; - btnSaveTpOpenNow->signal_clicked().connect (save_tp_open_now); + btnSaveTpOpenNow->signal_clicked().connect(save_tp_open_now); - fworklflow->add (*workflowGrid); + ckbshowtooltiplocallab = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_SHOWTOOLTIP"))); + setExpandAlignProperties(ckbshowtooltiplocallab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + workflowGrid->attach_next_to(*ckbshowtooltiplocallab, *ckbFileBrowserToolbarSingleRow, Gtk::POS_RIGHT, 1, 1); + + fworklflow->add(*workflowGrid); vbGeneral->attach_next_to (*fworklflow, Gtk::POS_TOP, 2, 1); // --------------------------------------------- - Gtk::Frame* flang = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_LANG")) ); - setExpandAlignProperties (flang, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - Gtk::Grid* langGrid = Gtk::manage ( new Gtk::Grid() ); - langGrid->set_column_spacing (4); - langGrid->set_row_spacing (4); - setExpandAlignProperties (langGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + Gtk::Frame* flang = Gtk::manage(new Gtk::Frame(M("PREFERENCES_LANG"))); + setExpandAlignProperties(flang, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + Gtk::Grid* langGrid = Gtk::manage(new Gtk::Grid()); + langGrid->set_column_spacing(4); + langGrid->set_row_spacing(4); + setExpandAlignProperties(langGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - ckbLangAutoDetect = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_LANGAUTODETECT")) ); - setExpandAlignProperties (ckbLangAutoDetect, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + ckbLangAutoDetect = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_LANGAUTODETECT"))); + setExpandAlignProperties(ckbLangAutoDetect, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - Gtk::Label* langlab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_SELECTLANG") + ":") ); - setExpandAlignProperties (langlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - languages = Gtk::manage ( new Gtk::ComboBoxText () ); - setExpandAlignProperties (languages, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + Gtk::Label* langlab = Gtk::manage(new Gtk::Label(M("PREFERENCES_SELECTLANG") + ":")); + setExpandAlignProperties(langlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + languages = Gtk::manage(new Gtk::ComboBoxText()); + setExpandAlignProperties(languages, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); std::vector langs; - parseDir (argv0 + "/languages", langs, ""); + parseDir(argv0 + "/languages", langs, ""); for (size_t i = 0; i < langs.size(); i++) { if ("default" != langs[i] && "README" != langs[i] && "LICENSE" != langs[i]) { - languages->append (langs[i]); + languages->append(langs[i]); } } - Gtk::Label* langw = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); - setExpandAlignProperties (langw, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - langGrid->attach_next_to (*ckbLangAutoDetect, Gtk::POS_LEFT, 3, 1); - langGrid->attach_next_to (*langlab, *ckbLangAutoDetect, Gtk::POS_BOTTOM, 1, 1); - 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); + Gtk::Label* langw = Gtk::manage(new Gtk::Label(Glib::ustring(" (") + M("PREFERENCES_APPLNEXTSTARTUP") + ")")); + setExpandAlignProperties(langw, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + langGrid->attach_next_to(*ckbLangAutoDetect, Gtk::POS_LEFT, 3, 1); + langGrid->attach_next_to(*langlab, *ckbLangAutoDetect, Gtk::POS_BOTTOM, 1, 1); + 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); vbGeneral->attach_next_to (*flang, *fworklflow, Gtk::POS_BOTTOM, 2, 1); // Appearance --------------------------------------------- @@ -1053,7 +1167,8 @@ Gtk::Widget* Preferences::getGeneralPanel () pseudoHiDPI = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_APPEARANCE_PSEUDOHIDPI") + Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")")); setExpandAlignProperties(pseudoHiDPI, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - Gtk::VSeparator *vSep = Gtk::manage(new Gtk::VSeparator()); + Gtk::Separator *vSep = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)); + appearanceGrid->attach(*themeLbl, 0, 0, 1, 1); appearanceGrid->attach(*themeCBT, 1, 0, 1, 1); @@ -1074,129 +1189,117 @@ Gtk::Widget* Preferences::getGeneralPanel () // --------------------------------------------- - Gtk::Frame* fclip = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CLIPPINGIND"))); - setExpandAlignProperties (fclip, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - Gtk::Grid* clipGrid = Gtk::manage ( new Gtk::Grid() ); - clipGrid->set_column_spacing (4); - clipGrid->set_row_spacing (4); - setExpandAlignProperties (clipGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + Gtk::Frame* fclip = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CLIPPINGIND"))); + setExpandAlignProperties(fclip, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + Gtk::Grid* clipGrid = Gtk::manage(new Gtk::Grid()); + clipGrid->set_column_spacing(4); + clipGrid->set_row_spacing(4); + setExpandAlignProperties(clipGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - Gtk::Label* hll = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_HLTHRESHOLD") + ": ")); - setExpandAlignProperties (hll, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - hlThresh = Gtk::manage ( new Gtk::SpinButton () ); - setExpandAlignProperties (hlThresh, false, false, Gtk::ALIGN_END, Gtk::ALIGN_BASELINE); - hlThresh->set_digits (0); - hlThresh->set_increments (1, 10); - hlThresh->set_range (0, 255); - clipGrid->attach_next_to (*hll, Gtk::POS_LEFT, 1, 1); - clipGrid->attach_next_to (*hlThresh, *hll, Gtk::POS_RIGHT, 1, 1); + Gtk::Label* hll = Gtk::manage(new Gtk::Label(M("PREFERENCES_HLTHRESHOLD") + ": ")); + setExpandAlignProperties(hll, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + hlThresh = Gtk::manage(new Gtk::SpinButton()); + setExpandAlignProperties(hlThresh, false, false, Gtk::ALIGN_END, Gtk::ALIGN_BASELINE); + hlThresh->set_digits(0); + hlThresh->set_increments(1, 10); + hlThresh->set_range(0, 255); + clipGrid->attach_next_to(*hll, Gtk::POS_LEFT, 1, 1); + clipGrid->attach_next_to(*hlThresh, *hll, Gtk::POS_RIGHT, 1, 1); - Gtk::Label* shl = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_SHTHRESHOLD") + ": ") ); - setExpandAlignProperties (shl, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - shThresh = Gtk::manage ( new Gtk::SpinButton () ); - setExpandAlignProperties (shThresh, false, false, Gtk::ALIGN_END, Gtk::ALIGN_BASELINE); - shThresh->show (); - shThresh->set_digits (0); - shThresh->set_increments (1, 10); - shThresh->set_range (0, 255); - clipGrid->attach_next_to (*shl, *hll, Gtk::POS_BOTTOM, 1, 1); - clipGrid->attach_next_to (*shThresh, *shl, Gtk::POS_RIGHT, 1, 1); + Gtk::Label* shl = Gtk::manage(new Gtk::Label(M("PREFERENCES_SHTHRESHOLD") + ": ")); + setExpandAlignProperties(shl, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + shThresh = Gtk::manage(new Gtk::SpinButton()); + setExpandAlignProperties(shThresh, false, false, Gtk::ALIGN_END, Gtk::ALIGN_BASELINE); + shThresh->show(); + shThresh->set_digits(0); + shThresh->set_increments(1, 10); + shThresh->set_range(0, 255); + clipGrid->attach_next_to(*shl, *hll, Gtk::POS_BOTTOM, 1, 1); + clipGrid->attach_next_to(*shThresh, *shl, Gtk::POS_RIGHT, 1, 1); - fclip->add (*clipGrid); + fclip->add(*clipGrid); vbGeneral->attach_next_to (*fclip, *appearanceFrame, Gtk::POS_BOTTOM, 1, 1); // --------------------------------------------- - Gtk::Frame* fnav = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_NAVIGATIONFRAME")) ); - setExpandAlignProperties (fclip, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - Gtk::Grid* navigationGrid = Gtk::manage ( new Gtk::Grid() ); - navigationGrid->set_column_spacing (4); - navigationGrid->set_row_spacing (4); - setExpandAlignProperties (fclip, false, false, Gtk::ALIGN_START, Gtk::ALIGN_FILL); + Gtk::Frame* fnav = Gtk::manage(new Gtk::Frame(M("PREFERENCES_NAVIGATIONFRAME"))); + setExpandAlignProperties(fclip, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + Gtk::Grid* navigationGrid = Gtk::manage(new Gtk::Grid()); + navigationGrid->set_column_spacing(4); + navigationGrid->set_row_spacing(4); + setExpandAlignProperties(fclip, false, false, Gtk::ALIGN_START, Gtk::ALIGN_FILL); - Gtk::Label* panFactorLabel = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_PANFACTORLABEL") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (panFactorLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - panFactor = Gtk::manage ( new Gtk::SpinButton () ); - setExpandAlignProperties (panFactor, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - panFactor->set_digits (0); - panFactor->set_increments (1, 5); - panFactor->set_range (1, 10); - navigationGrid->attach_next_to (*panFactorLabel, Gtk::POS_LEFT, 1, 1); - navigationGrid->attach_next_to (*panFactor, *panFactorLabel, Gtk::POS_RIGHT, 1, 1); + Gtk::Label* panFactorLabel = Gtk::manage(new Gtk::Label(M("PREFERENCES_PANFACTORLABEL") + ":", Gtk::ALIGN_START)); + setExpandAlignProperties(panFactorLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + panFactor = Gtk::manage(new Gtk::SpinButton()); + setExpandAlignProperties(panFactor, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + panFactor->set_digits(0); + panFactor->set_increments(1, 5); + panFactor->set_range(1, 10); + navigationGrid->attach_next_to(*panFactorLabel, Gtk::POS_LEFT, 1, 1); + navigationGrid->attach_next_to(*panFactor, *panFactorLabel, Gtk::POS_RIGHT, 1, 1); - rememberZoomPanCheckbutton = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_REMEMBERZOOMPAN")) ); - setExpandAlignProperties (rememberZoomPanCheckbutton, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - rememberZoomPanCheckbutton->set_tooltip_text (M ("PREFERENCES_REMEMBERZOOMPAN_TOOLTIP")); + rememberZoomPanCheckbutton = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_REMEMBERZOOMPAN"))); + setExpandAlignProperties(rememberZoomPanCheckbutton, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + rememberZoomPanCheckbutton->set_tooltip_text(M("PREFERENCES_REMEMBERZOOMPAN_TOOLTIP")); - navigationGrid->attach_next_to (*rememberZoomPanCheckbutton, *panFactorLabel, Gtk::POS_BOTTOM, 2, 1); + navigationGrid->attach_next_to(*rememberZoomPanCheckbutton, *panFactorLabel, Gtk::POS_BOTTOM, 2, 1); - fnav->add (*navigationGrid); + fnav->add(*navigationGrid); vbGeneral->attach_next_to (*fnav, *fclip, Gtk::POS_RIGHT, 1, 1); // --------------------------------------------- - Gtk::Frame* fdg = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_EXTERNALEDITOR")) ); - setExpandAlignProperties (fdg, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - Gtk::Grid* externaleditorGrid = Gtk::manage ( new Gtk::Grid() ); - externaleditorGrid->set_column_spacing (4); - externaleditorGrid->set_row_spacing (4); - setExpandAlignProperties (externaleditorGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + Gtk::Frame* fdg = Gtk::manage(new Gtk::Frame(M("PREFERENCES_EXTERNALEDITOR"))); + setExpandAlignProperties(fdg, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - edOther = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_EDITORCMDLINE") + ":")); - setExpandAlignProperties (edOther, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - editorToSendTo = Gtk::manage ( new Gtk::Entry () ); - setExpandAlignProperties (editorToSendTo, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - Gtk::RadioButton::Group ge = edOther->get_group(); + externalEditors = Gtk::manage(new ExternalEditorPreferences()); + externalEditors->set_size_request(-1, 200); -#ifdef __APPLE__ - edGimp = Gtk::manage ( new Gtk::RadioButton ("GIMP") ); - setExpandAlignProperties (edGimp, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - edGimp->set_group (ge); - externaleditorGrid->attach_next_to (*edGimp, Gtk::POS_TOP, 2, 1); + // fdg->add(*externaleditorGrid); + editor_dir_temp = Gtk::manage(new Gtk::RadioButton(M("PREFERENCES_EXTEDITOR_DIR_TEMP"))); + editor_dir_current = Gtk::manage(new Gtk::RadioButton(M("PREFERENCES_EXTEDITOR_DIR_CURRENT"))); + editor_dir_custom = Gtk::manage(new Gtk::RadioButton(M("PREFERENCES_EXTEDITOR_DIR_CUSTOM") + ": ")); + editor_dir_custom_path = Gtk::manage(new MyFileChooserButton("", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + Gtk::RadioButton::Group ge; + ge = editor_dir_temp->get_group(); + editor_dir_current->set_group(ge); + editor_dir_custom->set_group(ge); - edPS = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_PSPATH") + ":")); - setExpandAlignProperties (edPS, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - psDir = Gtk::manage ( new MyFileChooserButton (M ("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); - setExpandAlignProperties (psDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - externaleditorGrid->attach_next_to (*edPS, *edGimp, Gtk::POS_BOTTOM, 1, 1); - externaleditorGrid->attach_next_to (*psDir, *edPS, Gtk::POS_RIGHT, 1, 1); - edPS->set_group (ge); + editor_float32 = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_EXTEDITOR_FLOAT32"))); + editor_bypass_output_profile = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_EXTEDITOR_BYPASS_OUTPUT_PROFILE"))); + { + Gtk::Frame *f = Gtk::manage(new Gtk::Frame(M("PREFERENCES_EXTEDITOR_DIR"))); + setExpandAlignProperties(f, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + Gtk::Box *vb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + vb->pack_start(*editor_dir_temp); + vb->pack_start(*editor_dir_current); + Gtk::Box *hb = Gtk::manage(new Gtk::Box()); + hb->pack_start(*editor_dir_custom, Gtk::PACK_SHRINK); + hb->pack_start(*editor_dir_custom_path, Gtk::PACK_EXPAND_WIDGET, 2); + vb->pack_start(*hb); + f->add(*vb); + + hb = Gtk::manage(new Gtk::Box()); + hb->pack_start(*externalEditors); + hb->pack_start(*f, Gtk::PACK_EXPAND_WIDGET, 4); - externaleditorGrid->attach_next_to (*edOther, *edPS, Gtk::POS_BOTTOM, 1, 1); - externaleditorGrid->attach_next_to (*editorToSendTo, *edOther, Gtk::POS_RIGHT, 1, 1); -#elif defined WIN32 - edGimp = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_GIMPPATH") + ":") ); - setExpandAlignProperties (edGimp, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - gimpDir = Gtk::manage ( new MyFileChooserButton (M ("PREFERENCES_GIMPPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); - setExpandAlignProperties (gimpDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - externaleditorGrid->attach_next_to (*edGimp, Gtk::POS_TOP, 1, 1); - externaleditorGrid->attach_next_to (*gimpDir, *edGimp, Gtk::POS_RIGHT, 1, 1); - edGimp->set_group (ge); + vb = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + vb->pack_start(*hb); + hb = Gtk::manage(new Gtk::Box()); + //I disabled these 2 functionalities...easy to enable +// hb->pack_start(*editor_float32, Gtk::PACK_SHRINK); +// hb->pack_start(*editor_bypass_output_profile, Gtk::PACK_SHRINK, 4); + vb->pack_start(*hb, Gtk::PACK_SHRINK, 4); - edPS = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_PSPATH") + ":") ); - setExpandAlignProperties (edPS, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - psDir = Gtk::manage ( new MyFileChooserButton (M ("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); - setExpandAlignProperties (psDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - externaleditorGrid->attach_next_to (*edPS, *edGimp, Gtk::POS_BOTTOM, 1, 1); - externaleditorGrid->attach_next_to (*psDir, *edPS, Gtk::POS_RIGHT, 1, 1); - edPS->set_group (ge); - - externaleditorGrid->attach_next_to (*edOther, *edPS, Gtk::POS_BOTTOM, 1, 1); - externaleditorGrid->attach_next_to (*editorToSendTo, *edOther, Gtk::POS_RIGHT, 1, 1); -#else - edGimp = Gtk::manage ( new Gtk::RadioButton ("GIMP") ); - setExpandAlignProperties (edGimp, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - externaleditorGrid->attach_next_to (*edGimp, Gtk::POS_TOP, 2, 1); - edGimp->set_group (ge); - - externaleditorGrid->attach_next_to (*edOther, *edGimp, Gtk::POS_BOTTOM, 1, 1); - externaleditorGrid->attach_next_to (*editorToSendTo, *edOther, Gtk::POS_RIGHT, 1, 1); -#endif - - fdg->add (*externaleditorGrid); + vb->show_all_children(); + vb->show(); + fdg->add(*vb); + } + + vbGeneral->attach_next_to (*fdg, *fclip, Gtk::POS_BOTTOM, 2, 1); - - langAutoDetectConn = ckbLangAutoDetect->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::langAutoDetectToggled)); + langAutoDetectConn = ckbLangAutoDetect->signal_toggled().connect(sigc::mem_fun(*this, &Preferences::langAutoDetectToggled)); 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) ); @@ -1205,103 +1308,103 @@ Gtk::Widget* Preferences::getGeneralPanel () return swGeneral; } -Gtk::Widget* Preferences::getFileBrowserPanel () +Gtk::Widget* Preferences::getFileBrowserPanel() { swFileBrowser = Gtk::manage(new Gtk::ScrolledWindow()); swFileBrowser->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* vbFileBrowser = Gtk::manage ( new Gtk::VBox () ); + Gtk::Box* vbFileBrowser = Gtk::manage ( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) ); - Gtk::Frame* fsd = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_STARTUPIMDIR")) ); + Gtk::Frame* fsd = Gtk::manage(new Gtk::Frame(M("PREFERENCES_STARTUPIMDIR"))); - sdcurrent = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_DIRSOFTWARE")) ); - sdlast = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_DIRLAST")) ); - sdhome = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_DIRHOME")) ); - sdother = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_DIROTHER") + ": ") ); - startupdir = Gtk::manage ( new Gtk::Entry () ); + sdcurrent = Gtk::manage(new Gtk::RadioButton(M("PREFERENCES_DIRSOFTWARE"))); + sdlast = Gtk::manage(new Gtk::RadioButton(M("PREFERENCES_DIRLAST"))); + sdhome = Gtk::manage(new Gtk::RadioButton(M("PREFERENCES_DIRHOME"))); + sdother = Gtk::manage(new Gtk::RadioButton(M("PREFERENCES_DIROTHER") + ": ")); + startupdir = Gtk::manage(new Gtk::Entry()); - Gtk::Button* sdselect = Gtk::manage ( new Gtk::Button () ); + Gtk::Button* sdselect = Gtk::manage(new Gtk::Button()); sdselect->set_image (*Gtk::manage (new RTImage ("folder-open-small.png"))); Gtk::RadioButton::Group opts = sdcurrent->get_group(); - sdlast->set_group (opts); - sdhome->set_group (opts); - sdother->set_group (opts); + sdlast->set_group(opts); + sdhome->set_group(opts); + sdother->set_group(opts); - Gtk::VBox* vbsd = Gtk::manage ( new Gtk::VBox () ); - vbsd->pack_start (*sdcurrent, Gtk::PACK_SHRINK, 0); - vbsd->pack_start (*sdlast, Gtk::PACK_SHRINK, 0); - vbsd->pack_start (*sdhome, Gtk::PACK_SHRINK, 0); - Gtk::HBox* otherbox = Gtk::manage ( new Gtk::HBox () ); - otherbox->pack_start (*sdother, Gtk::PACK_SHRINK); - otherbox->pack_start (*startupdir); - otherbox->pack_end (*sdselect, Gtk::PACK_SHRINK, 4); - vbsd->pack_start (*otherbox, Gtk::PACK_SHRINK, 0); + Gtk::Box* vbsd = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + vbsd->pack_start(*sdcurrent, Gtk::PACK_SHRINK, 0); + vbsd->pack_start(*sdlast, Gtk::PACK_SHRINK, 0); + vbsd->pack_start(*sdhome, Gtk::PACK_SHRINK, 0); + Gtk::Box* otherbox = Gtk::manage(new Gtk::Box()); + otherbox->pack_start(*sdother, Gtk::PACK_SHRINK); + otherbox->pack_start(*startupdir); + otherbox->pack_end(*sdselect, Gtk::PACK_SHRINK, 4); + vbsd->pack_start(*otherbox, Gtk::PACK_SHRINK, 0); - fsd->add (*vbsd); + fsd->add(*vbsd); vbFileBrowser->pack_start (*fsd, Gtk::PACK_SHRINK, 4); - sdselect->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::selectStartupDir) ); + sdselect->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::selectStartupDir)); //--- - Gtk::Frame* fro = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_FBROWSEROPTS")) ); - showDateTime = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_SHOWDATETIME")) ); - showBasicExif = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_SHOWBASICEXIF")) ); - showExpComp = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_SHOWEXPOSURECOMPENSATION")) ); - Gtk::VBox* vbro = Gtk::manage ( new Gtk::VBox () ); - Gtk::HBox* hbro1 = Gtk::manage ( new Gtk::HBox () ); - Gtk::HBox* hbro0 = Gtk::manage ( new Gtk::HBox () ); - overlayedFileNames = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_OVERLAY_FILENAMES")) ); - filmStripOverlayedFileNames = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP")) ); - sameThumbSize = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT")) ); - sameThumbSize->set_tooltip_text (M ("PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT")); - ckbInternalThumbIfUntouched = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_INTERNALTHUMBIFUNTOUCHED"))); + Gtk::Frame* fro = Gtk::manage(new Gtk::Frame(M("PREFERENCES_FBROWSEROPTS"))); + showDateTime = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_SHOWDATETIME"))); + showBasicExif = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_SHOWBASICEXIF"))); + showExpComp = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_SHOWEXPOSURECOMPENSATION"))); + Gtk::Box* vbro = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* hbro1 = Gtk::manage(new Gtk::Box()); + Gtk::Box* hbro0 = Gtk::manage(new Gtk::Box()); + overlayedFileNames = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_OVERLAY_FILENAMES"))); + filmStripOverlayedFileNames = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP"))); + sameThumbSize = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT"))); + sameThumbSize->set_tooltip_text(M("PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT")); + ckbInternalThumbIfUntouched = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_INTERNALTHUMBIFUNTOUCHED"))); - vbro->pack_start (*showDateTime, Gtk::PACK_SHRINK, 0); - Gtk::Label* dflab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_DATEFORMAT") + ":", Gtk::ALIGN_START)); - dateformat = Gtk::manage ( new Gtk::Entry () ); - dateformat->set_tooltip_markup (M ("PREFERENCES_DATEFORMATHINT")); - dflab->set_tooltip_markup (M ("PREFERENCES_DATEFORMATHINT")); - hbro0->pack_start (*dflab, Gtk::PACK_SHRINK, 4); - hbro0->pack_start (*dateformat, Gtk::PACK_SHRINK, 0); + vbro->pack_start(*showDateTime, Gtk::PACK_SHRINK, 0); + Gtk::Label* dflab = Gtk::manage(new Gtk::Label(M("PREFERENCES_DATEFORMAT") + ":", Gtk::ALIGN_START)); + dateformat = Gtk::manage(new Gtk::Entry()); + dateformat->set_tooltip_markup(M("PREFERENCES_DATEFORMATHINT")); + dflab->set_tooltip_markup(M("PREFERENCES_DATEFORMATHINT")); + hbro0->pack_start(*dflab, Gtk::PACK_SHRINK, 4); + hbro0->pack_start(*dateformat, Gtk::PACK_SHRINK, 0); - vbro->pack_start (*hbro0, Gtk::PACK_SHRINK, 0); - hbro1->pack_start (*showBasicExif, Gtk::PACK_SHRINK, 0); - hbro1->pack_start (*showExpComp, Gtk::PACK_SHRINK, 4); - vbro->pack_start (*hbro1, Gtk::PACK_SHRINK, 0); - vbro->pack_start (*overlayedFileNames, Gtk::PACK_SHRINK, 0); - vbro->pack_start (*filmStripOverlayedFileNames, Gtk::PACK_SHRINK, 0); - vbro->pack_start (*sameThumbSize, Gtk::PACK_SHRINK, 0); - vbro->pack_start (*ckbInternalThumbIfUntouched, Gtk::PACK_SHRINK, 0); + vbro->pack_start(*hbro0, Gtk::PACK_SHRINK, 0); + hbro1->pack_start(*showBasicExif, Gtk::PACK_SHRINK, 0); + hbro1->pack_start(*showExpComp, Gtk::PACK_SHRINK, 4); + vbro->pack_start(*hbro1, Gtk::PACK_SHRINK, 0); + vbro->pack_start(*overlayedFileNames, Gtk::PACK_SHRINK, 0); + vbro->pack_start(*filmStripOverlayedFileNames, Gtk::PACK_SHRINK, 0); + vbro->pack_start(*sameThumbSize, Gtk::PACK_SHRINK, 0); + vbro->pack_start(*ckbInternalThumbIfUntouched, Gtk::PACK_SHRINK, 0); - Gtk::HBox* hbrecent = Gtk::manage ( new Gtk::HBox () ); + Gtk::Box* hbrecent = Gtk::manage(new Gtk::Box()); Gtk::Label* labrecent = Gtk::manage (new Gtk::Label (M("PREFERENCES_MAXRECENTFOLDERS") + ":", Gtk::ALIGN_START)); - maxRecentFolders = Gtk::manage ( new Gtk::SpinButton () ); - hbrecent->pack_start (*labrecent, Gtk::PACK_SHRINK, 4); - hbrecent->pack_start (*maxRecentFolders, Gtk::PACK_SHRINK, 4); - maxRecentFolders->set_digits (0); - maxRecentFolders->set_increments (1, 5); - maxRecentFolders->set_range (1, 25); - vbro->pack_start (*hbrecent, Gtk::PACK_SHRINK, 4); + maxRecentFolders = Gtk::manage(new Gtk::SpinButton()); + hbrecent->pack_start(*labrecent, Gtk::PACK_SHRINK, 4); + hbrecent->pack_start(*maxRecentFolders, Gtk::PACK_SHRINK, 4); + maxRecentFolders->set_digits(0); + maxRecentFolders->set_increments(1, 5); + maxRecentFolders->set_range(1, 25); + vbro->pack_start(*hbrecent, Gtk::PACK_SHRINK, 4); - fro->add (*vbro); + fro->add(*vbro); - Gtk::Frame* frmnu = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_MENUOPTIONS")) ); + 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")) ); + 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")) ); + 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")) ); + ckbmenuGroupProfileOperations = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_MENUGROUPPROFILEOPERATIONS"))); + ckbmenuGroupExtProg = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_MENUGROUPEXTPROGS"))); Gtk::Label* groupRestartNeeded = Gtk::manage(new Gtk::Label (Glib::ustring ("(") + M("PREFERENCES_APPLNEXTSTARTUP") + ")", Gtk::ALIGN_START)); @@ -1315,54 +1418,54 @@ Gtk::Widget* Preferences::getFileBrowserPanel () frmnu->add (*menuGrid); - Gtk::Frame* fre = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_PARSEDEXT")) ); - Gtk::VBox* vbre = Gtk::manage ( new Gtk::VBox () ); - Gtk::HBox* hb0 = Gtk::manage ( new Gtk::HBox () ); + Gtk::Frame* fre = Gtk::manage(new Gtk::Frame(M("PREFERENCES_PARSEDEXT"))); + Gtk::Box* vbre = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* hb0 = Gtk::manage(new Gtk::Box()); Gtk::Label* elab = Gtk::manage (new Gtk::Label (M("PREFERENCES_PARSEDEXTADD") + ":", Gtk::ALIGN_START)); - hb0->pack_start (*elab, Gtk::PACK_SHRINK, 4); - extension = Gtk::manage ( new Gtk::Entry () ); - extension->set_width_chars (5); - extension->set_max_width_chars (5); - hb0->pack_start (*extension); - addExt = Gtk::manage ( new Gtk::Button () ); - delExt = Gtk::manage ( new Gtk::Button () ); - moveExtUp = Gtk::manage ( new Gtk::Button () ); - moveExtDown = Gtk::manage ( new Gtk::Button () ); - addExt->set_tooltip_text (M ("PREFERENCES_PARSEDEXTADDHINT")); - delExt->set_tooltip_text (M ("PREFERENCES_PARSEDEXTDELHINT")); - moveExtUp->set_tooltip_text (M ("PREFERENCES_PARSEDEXTUPHINT")); - moveExtDown->set_tooltip_text (M ("PREFERENCES_PARSEDEXTDOWNHINT")); + hb0->pack_start(*elab, Gtk::PACK_SHRINK, 4); + extension = Gtk::manage(new Gtk::Entry()); + extension->set_width_chars(5); + extension->set_max_width_chars(5); + hb0->pack_start(*extension); + addExt = Gtk::manage(new Gtk::Button()); + delExt = Gtk::manage(new Gtk::Button()); + moveExtUp = Gtk::manage(new Gtk::Button()); + moveExtDown = Gtk::manage(new Gtk::Button()); + addExt->set_tooltip_text(M("PREFERENCES_PARSEDEXTADDHINT")); + 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 ("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); - delExt->add (*delExtImg); - moveExtUp->set_image (*moveExtUpImg); - moveExtDown->set_image (*moveExtDownImg); - hb0->pack_end (*moveExtDown, Gtk::PACK_SHRINK, 4); - hb0->pack_end (*moveExtUp, Gtk::PACK_SHRINK, 4); - hb0->pack_end (*delExt, Gtk::PACK_SHRINK, 4); - hb0->pack_end (*addExt, Gtk::PACK_SHRINK, 4); - extensions = Gtk::manage ( new Gtk::TreeView () ); - Gtk::ScrolledWindow* hscrollw = Gtk::manage ( new Gtk::ScrolledWindow () ); - hscrollw->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); - hscrollw->add (*extensions); - extensionModel = Gtk::ListStore::create (extensionColumns); - extensions->set_model (extensionModel); - extensions->append_column_editable ("Enabled", extensionColumns.enabled); - extensions->append_column ("Extension", extensionColumns.ext); - extensions->set_headers_visible (false); - vbre->pack_start (*hscrollw); - vbre->pack_start (*hb0, Gtk::PACK_SHRINK, 4); + 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); + delExt->add(*delExtImg); + moveExtUp->set_image(*moveExtUpImg); + moveExtDown->set_image(*moveExtDownImg); + hb0->pack_end(*moveExtDown, Gtk::PACK_SHRINK, 4); + hb0->pack_end(*moveExtUp, Gtk::PACK_SHRINK, 4); + hb0->pack_end(*delExt, Gtk::PACK_SHRINK, 4); + hb0->pack_end(*addExt, Gtk::PACK_SHRINK, 4); + extensions = Gtk::manage(new Gtk::TreeView()); + Gtk::ScrolledWindow* hscrollw = Gtk::manage(new Gtk::ScrolledWindow()); + hscrollw->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); + hscrollw->add(*extensions); + extensionModel = Gtk::ListStore::create(extensionColumns); + extensions->set_model(extensionModel); + extensions->append_column_editable("Enabled", extensionColumns.enabled); + extensions->append_column("Extension", extensionColumns.ext); + extensions->set_headers_visible(false); + vbre->pack_start(*hscrollw); + vbre->pack_start(*hb0, Gtk::PACK_SHRINK, 4); - fre->add (*vbre); + fre->add(*vbre); // Cache Gtk::Frame* frc = Gtk::manage (new Gtk::Frame(M("PREFERENCES_CACHEOPTS"))); - Gtk::VBox* vbc = Gtk::manage (new Gtk::VBox()); - frc->add (*vbc); + Gtk::Box* vbc = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + frc->add(*vbc); Gtk::Grid* cacheGrid = Gtk::manage(new Gtk::Grid()); cacheGrid->get_style_context()->add_class("grid-spacing"); @@ -1384,7 +1487,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () // 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()); + Gtk::Separator *cacheSeparator = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); cacheSeparator->get_style_context()->add_class("grid-row-separator"); Gtk::Label* clearThumbsLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ALLBUTPROFILES"))); @@ -1420,23 +1523,23 @@ Gtk::Widget* Preferences::getFileBrowserPanel () 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 () ); + Gtk::Box* hb6 = Gtk::manage(new Gtk::Box()); + Gtk::Box* vb6 = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - vb6->pack_start (*fro); - vb6->pack_start (*frmnu); - vb6->pack_end (*frc); - hb6->pack_start (*vb6); - hb6->pack_start (*fre); - hb6->set_spacing (4); + vb6->pack_start(*fro); + vb6->pack_start(*frmnu); + vb6->pack_end(*frc); + hb6->pack_start(*vb6); + hb6->pack_start(*fre); + hb6->set_spacing(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) ); + 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)); clearThumbsBtn->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearThumbImagesPressed) ); if (moptions.saveParamsCache) { clearProfilesBtn->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::clearProfilesPressed)); @@ -1452,46 +1555,46 @@ Gtk::Widget* Preferences::getSoundsPanel () swSounds = Gtk::manage(new Gtk::ScrolledWindow()); swSounds->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* vbSounds = Gtk::manage(new Gtk::VBox ()); + Gtk::Box* vbSounds = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - ckbSndEnable = Gtk::manage ( new Gtk::CheckButton (M ("GENERAL_ENABLE"))); - sndEnableConn = ckbSndEnable->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::sndEnableToggled)); + ckbSndEnable = Gtk::manage(new Gtk::CheckButton(M("GENERAL_ENABLE"))); + sndEnableConn = ckbSndEnable->signal_toggled().connect(sigc::mem_fun(*this, &Preferences::sndEnableToggled)); vbSounds->pack_start (*ckbSndEnable, Gtk::PACK_SHRINK, 4); - Gtk::HBox* hblSndHelp = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hblSndHelp = Gtk::manage(new Gtk::Box()); Gtk::Label* lSndHelp = Gtk::manage (new Gtk::Label (M("PREFERENCES_SND_HELP"), Gtk::ALIGN_START)); - hblSndHelp->pack_start (*lSndHelp, Gtk::PACK_SHRINK, 4); + hblSndHelp->pack_start(*lSndHelp, Gtk::PACK_SHRINK, 4); vbSounds->pack_start (*hblSndHelp, Gtk::PACK_SHRINK, 4); // BatchQueueDone - Gtk::HBox* pBatchQueueDone = Gtk::manage ( new Gtk::HBox() ); + Gtk::Box* pBatchQueueDone = Gtk::manage(new Gtk::Box()); Gtk::Label* lSndBatchQueueDone = Gtk::manage (new Gtk::Label (M("PREFERENCES_SND_QUEUEDONE") + Glib::ustring (":"), Gtk::ALIGN_START)); pBatchQueueDone->pack_start (*lSndBatchQueueDone, Gtk::PACK_SHRINK, 4); - txtSndBatchQueueDone = Gtk::manage (new Gtk::Entry()); - pBatchQueueDone->pack_end (*txtSndBatchQueueDone, Gtk::PACK_EXPAND_WIDGET, 4); + txtSndBatchQueueDone = Gtk::manage(new Gtk::Entry()); + pBatchQueueDone->pack_end(*txtSndBatchQueueDone, Gtk::PACK_EXPAND_WIDGET, 4); vbSounds->pack_start (*pBatchQueueDone, Gtk::PACK_SHRINK, 4); // LngEditProcDone - Gtk::HBox* pSndLngEditProcDone = Gtk::manage ( new Gtk::HBox() ); + Gtk::Box* pSndLngEditProcDone = Gtk::manage(new Gtk::Box()); Gtk::Label* lSndLngEditProcDone = Gtk::manage (new Gtk::Label (M("PREFERENCES_SND_LNGEDITPROCDONE") + Glib::ustring (":"), Gtk::ALIGN_START)); - pSndLngEditProcDone->pack_start (*lSndLngEditProcDone, Gtk::PACK_SHRINK, 4); + pSndLngEditProcDone->pack_start(*lSndLngEditProcDone, Gtk::PACK_SHRINK, 4); - txtSndLngEditProcDone = Gtk::manage (new Gtk::Entry()); - pSndLngEditProcDone->pack_start (*txtSndLngEditProcDone, Gtk::PACK_EXPAND_WIDGET, 4); + 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_THRESHOLDSECS") + Glib::ustring (":"), Gtk::ALIGN_START)); - pSndLngEditProcDone->pack_start (*lSndLngEditProcDoneSecs, Gtk::PACK_SHRINK, 12); + pSndLngEditProcDone->pack_start(*lSndLngEditProcDoneSecs, Gtk::PACK_SHRINK, 12); - spbSndLngEditProcDoneSecs = Gtk::manage ( new Gtk::SpinButton () ); - spbSndLngEditProcDoneSecs->set_digits (1); - spbSndLngEditProcDoneSecs->set_increments (0.5, 1); - spbSndLngEditProcDoneSecs->set_range (0, 10); - pSndLngEditProcDone->pack_end (*spbSndLngEditProcDoneSecs, Gtk::PACK_SHRINK, 4); + spbSndLngEditProcDoneSecs = Gtk::manage(new Gtk::SpinButton()); + spbSndLngEditProcDoneSecs->set_digits(1); + spbSndLngEditProcDoneSecs->set_increments(0.5, 1); + spbSndLngEditProcDoneSecs->set_range(0, 10); + pSndLngEditProcDone->pack_end(*spbSndLngEditProcDoneSecs, Gtk::PACK_SHRINK, 4); vbSounds->pack_start (*pSndLngEditProcDone, Gtk::PACK_SHRINK, 4); @@ -1501,7 +1604,7 @@ Gtk::Widget* Preferences::getSoundsPanel () return swSounds; } -void Preferences::parseDir (Glib::ustring dirname, std::vector& items, Glib::ustring ext) +void Preferences::parseDir(Glib::ustring dirname, std::vector& items, Glib::ustring ext) { if (dirname.empty()) { @@ -1512,26 +1615,26 @@ void Preferences::parseDir (Glib::ustring dirname, std::vector& i Glib::Dir* dir = nullptr; try { - dir = new Glib::Dir (dirname); + dir = new Glib::Dir(dirname); } catch (const Glib::Error& e) { return; } for (Glib::DirIterator i = dir->begin(); i != dir->end(); ++i) { - Glib::ustring fname = Glib::build_filename (dirname, *i); + Glib::ustring fname = Glib::build_filename(dirname, *i); Glib::ustring sname = *i; // ignore directories - if (!Glib::file_test (fname, Glib::FILE_TEST_IS_DIR) && sname.size() >= ext.size() && sname.substr (sname.size() - ext.size(), ext.size()).casefold() == ext) { - items.push_back (sname.substr (0, sname.size() - ext.size())); + if (!Glib::file_test(fname, Glib::FILE_TEST_IS_DIR) && sname.size() >= ext.size() && sname.substr(sname.size() - ext.size(), ext.size()).casefold() == ext) { + items.push_back(sname.substr(0, sname.size() - ext.size())); } } - std::sort (items.begin(), items.end()); + std::sort(items.begin(), items.end()); delete dir; } -void Preferences::parseThemeDir (Glib::ustring dirname) +void Preferences::parseThemeDir(Glib::ustring dirname) { if (dirname.empty()) { @@ -1542,24 +1645,24 @@ void Preferences::parseThemeDir (Glib::ustring dirname) Glib::Dir* dir = nullptr; try { - dir = new Glib::Dir (dirname); + dir = new Glib::Dir(dirname); } catch (const Glib::Error& e) { return; } for (Glib::DirIterator i = dir->begin(); i != dir->end(); ++i) { - Glib::ustring fname = Glib::build_filename (dirname, *i); + Glib::ustring fname = Glib::build_filename(dirname, *i); Glib::ustring sname = *i; // ignore directories and filter out unsupported theme - if (regex->match (sname, matchInfo) && !Glib::file_test (fname, Glib::FILE_TEST_IS_DIR) && sname.size() >= 4) { + if (regex->match(sname, matchInfo) && !Glib::file_test(fname, Glib::FILE_TEST_IS_DIR) && sname.size() >= 4) { bool keepIt = false; - Glib::ustring fname2 = matchInfo.fetch (1); - Glib::ustring minMinor = matchInfo.fetch (2); - Glib::ustring maxMinor = matchInfo.fetch (3); + Glib::ustring fname2 = matchInfo.fetch(1); + Glib::ustring minMinor = matchInfo.fetch(2); + Glib::ustring maxMinor = matchInfo.fetch(3); if (!minMinor.empty()) { - guint64 minMinorVal = g_ascii_strtoll (minMinor.c_str(), 0, 0); + guint64 minMinorVal = g_ascii_strtoll(minMinor.c_str(), 0, 0); if ((guint64)GTK_MINOR_VERSION >= minMinorVal) { keepIt = true; @@ -1567,7 +1670,7 @@ void Preferences::parseThemeDir (Glib::ustring dirname) } if (!maxMinor.empty()) { - guint64 maxMinorVal = g_ascii_strtoll (maxMinor.c_str(), 0, 0); + guint64 maxMinorVal = g_ascii_strtoll(maxMinor.c_str(), 0, 0); if ((guint64)GTK_MINOR_VERSION <= maxMinorVal) { keepIt = true; @@ -1575,19 +1678,19 @@ void Preferences::parseThemeDir (Glib::ustring dirname) } if (keepIt) { - themeFNames.push_back (ThemeFilename (matchInfo.fetch (1), sname.substr (0, sname.size() - 4))); + themeFNames.push_back(ThemeFilename(matchInfo.fetch(1), sname.substr(0, sname.size() - 4))); } } } - std::sort (themeFNames.begin(), themeFNames.end(), [] (const ThemeFilename & firstDir, const ThemeFilename & secondDir) { + std::sort(themeFNames.begin(), themeFNames.end(), [](const ThemeFilename & firstDir, const ThemeFilename & secondDir) { return firstDir.longFName < secondDir.longFName; }); delete dir; } -void Preferences::storePreferences () +void Preferences::storePreferences() { // With the new mechanism, we can't be sure of the availability of the DEFPROFILE_RAW & DEFPROFILE_IMG profiles, @@ -1608,18 +1711,18 @@ void Preferences::storePreferences () moptions.dateFormat = dateformat->get_text(); moptions.panAccelFactor = (int)panFactor->get_value(); moptions.rememberZoomAndPan = rememberZoomPanCheckbutton->get_active(); - moptions.fbShowDateTime = showDateTime->get_active (); - moptions.fbShowBasicExif = showBasicExif->get_active (); - moptions.fbShowExpComp = showExpComp->get_active (); + moptions.fbShowDateTime = showDateTime->get_active(); + moptions.fbShowBasicExif = showBasicExif->get_active(); + moptions.fbShowExpComp = showExpComp->get_active(); moptions.menuGroupRank = ckbmenuGroupRank->get_active(); moptions.menuGroupLabel = ckbmenuGroupLabel->get_active(); moptions.menuGroupFileOperations = ckbmenuGroupFileOperations->get_active(); moptions.menuGroupProfileOperations = ckbmenuGroupProfileOperations->get_active(); moptions.menuGroupExtProg = ckbmenuGroupExtProg->get_active(); - moptions.highlightThreshold = (int)hlThresh->get_value (); - moptions.shadowThreshold = (int)shThresh->get_value (); - moptions.language = languages->get_active_text (); - moptions.languageAutoDetect = ckbLangAutoDetect->get_active (); + moptions.highlightThreshold = (int)hlThresh->get_value(); + moptions.shadowThreshold = (int)shThresh->get_value(); + moptions.language = languages->get_active_text(); + moptions.languageAutoDetect = ckbLangAutoDetect->get_active(); moptions.theme = themeFNames.at (themeCBT->get_active_row_number ()).longFName; Gdk::RGBA cropCol = cropMaskColorCB->get_rgba(); @@ -1633,9 +1736,9 @@ void Preferences::storePreferences () moptions.navGuideBrush[1] = NavGuideCol.get_green(); moptions.navGuideBrush[2] = NavGuideCol.get_blue(); moptions.navGuideBrush[3] = navGuideColorCB->get_alpha() / 65535.0; - Pango::FontDescription fd (mainFontFB->get_font_name()); + if (newFont) { moptions.fontFamily = fd.get_family(); moptions.fontSize = fd.get_size() / Pango::SCALE; @@ -1650,43 +1753,40 @@ void Preferences::storePreferences () moptions.pseudoHiDPISupport = pseudoHiDPI->get_active(); -#ifdef WIN32 - moptions.gimpDir = gimpDir->get_filename (); - moptions.psDir = psDir->get_filename (); -#elif defined __APPLE__ - moptions.psDir = psDir->get_filename (); -#endif - moptions.customEditorProg = editorToSendTo->get_text (); - - if (edGimp->get_active ()) { - moptions.editorToSendTo = 1; + const std::vector &editors = externalEditors->getEditors(); + moptions.externalEditors.resize(editors.size()); + moptions.externalEditorIndex = -1; + for (unsigned i = 0; i < editors.size(); i++) { + moptions.externalEditors[i] = (ExternalEditor( + editors[i].name, editors[i].command, editors[i].native_command, editors[i].icon_serialized)); + if (editors[i].other_data.selected) { + // The current editor was marked before the list was edited. We + // found the mark, so this is the editor that was active. + moptions.externalEditorIndex = i; + } } -#ifdef WIN32 - else if (edPS->get_active ()) { - moptions.editorToSendTo = 2; - } - -#elif defined __APPLE__ - else if (edPS->get_active ()) { - moptions.editorToSendTo = 2; - } - -#endif - else if (edOther->get_active ()) { - moptions.editorToSendTo = 3; + if (editor_dir_temp->get_active()) { + moptions.editor_out_dir = Options::EDITOR_OUT_DIR_TEMP; + } else if (editor_dir_current->get_active()) { + moptions.editor_out_dir = Options::EDITOR_OUT_DIR_CURRENT; + } else { + moptions.editor_out_dir = Options::EDITOR_OUT_DIR_CUSTOM; } + moptions.editor_custom_out_dir = editor_dir_custom_path->get_filename(); + moptions.editor_float32 = editor_float32->get_active(); + moptions.editor_bypass_output_profile = editor_bypass_output_profile->get_active(); moptions.CPBPath = txtCustProfBuilderPath->get_text(); - moptions.CPBKeys = CPBKeyType (custProfBuilderLabelType->get_active_row_number()); + moptions.CPBKeys = CPBKeyType(custProfBuilderLabelType->get_active_row_number()); if (!prtProfile->get_active_row_number()) { moptions.rtSettings.printerProfile = ""; } else { - moptions.rtSettings.printerProfile = prtProfile->get_active_text (); + moptions.rtSettings.printerProfile = prtProfile->get_active_text(); } - switch (prtIntent->get_active_row_number ()) { + switch (prtIntent->get_active_row_number()) { default: case 0: moptions.rtSettings.printerIntent = rtengine::RI_PERCEPTUAL; @@ -1701,17 +1801,17 @@ void Preferences::storePreferences () break; } - moptions.rtSettings.printerBPC = prtBPC->get_active (); + moptions.rtSettings.printerBPC = prtBPC->get_active(); #if !defined(__APPLE__) // monitor profile not supported on apple if (!monProfile->get_active_row_number()) { moptions.rtSettings.monitorProfile = ""; } else { - moptions.rtSettings.monitorProfile = monProfile->get_active_text (); + moptions.rtSettings.monitorProfile = monProfile->get_active_text(); } - switch (monIntent->get_active_row_number ()) { + switch (monIntent->get_active_row_number()) { default: case 0: moptions.rtSettings.monitorIntent = rtengine::RI_PERCEPTUAL; @@ -1726,59 +1826,62 @@ void Preferences::storePreferences () break; } - moptions.rtSettings.monitorBPC = monBPC->get_active (); - moptions.rtSettings.autoMonitorProfile = cbAutoMonProfile->get_active (); + moptions.rtSettings.monitorBPC = monBPC->get_active(); + moptions.rtSettings.autoMonitorProfile = cbAutoMonProfile->get_active(); + moptions.rtSettings.autocielab = mcie->get_active(); + #endif - moptions.rtSettings.iccDirectory = iccDir->get_filename (); + moptions.rtSettings.iccDirectory = iccDir->get_filename(); moptions.prevdemo = (prevdemo_t)cprevdemo->get_active_row_number (); moptions.serializeTiffRead = ctiffserialize->get_active(); - if (sdcurrent->get_active ()) { + if (sdcurrent->get_active()) { moptions.startupDir = STARTUPDIR_CURRENT; - } else if (sdhome->get_active ()) { + } else if (sdhome->get_active()) { moptions.startupDir = STARTUPDIR_HOME; - } else if (sdlast->get_active ()) { + } else if (sdlast->get_active()) { moptions.startupDir = STARTUPDIR_LAST; - } else if (sdother->get_active ()) { + } else if (sdother->get_active()) { moptions.startupDir = STARTUPDIR_CUSTOM; moptions.startupPath = startupdir->get_text(); } - moptions.parseExtensions.clear (); - moptions.parseExtensionsEnabled.clear (); - Gtk::TreeNodeChildren c = extensionModel->children (); + moptions.parseExtensions.clear(); + moptions.parseExtensionsEnabled.clear(); + Gtk::TreeNodeChildren c = extensionModel->children(); for (size_t i = 0; i < c.size(); i++) { - moptions.parseExtensions.push_back (c[i][extensionColumns.ext]); - moptions.parseExtensionsEnabled.push_back (c[i][extensionColumns.enabled]); + moptions.parseExtensions.push_back(c[i][extensionColumns.ext]); + moptions.parseExtensionsEnabled.push_back(c[i][extensionColumns.enabled]); } moptions.maxRecentFolders = (int)maxRecentFolders->get_value(); moptions.maxThumbnailHeight = (int)maxThumbHeightSB->get_value (); moptions.maxCacheEntries = (int)maxCacheEntriesSB->get_value (); - moptions.overlayedFileNames = overlayedFileNames->get_active (); + moptions.overlayedFileNames = overlayedFileNames->get_active(); moptions.filmStripOverlayedFileNames = filmStripOverlayedFileNames->get_active(); moptions.sameThumbSize = sameThumbSize->get_active(); - moptions.internalThumbIfUntouched = ckbInternalThumbIfUntouched->get_active (); + moptions.internalThumbIfUntouched = ckbInternalThumbIfUntouched->get_active(); auto save_where = saveParamsPreference->get_active_row_number(); moptions.saveParamsFile = save_where == 0 || save_where == 2; moptions.saveParamsCache = save_where == 1 || save_where == 2; - moptions.paramsLoadLocation = (PPLoadLocation)loadParamsPreference->get_active_row_number (); - moptions.useBundledProfiles = useBundledProfiles->get_active (); + moptions.paramsLoadLocation = (PPLoadLocation)loadParamsPreference->get_active_row_number(); + moptions.useBundledProfiles = useBundledProfiles->get_active(); moptions.rtSettings.darkFramesPath = darkFrameDir->get_filename(); moptions.rtSettings.flatFieldsPath = flatFieldDir->get_filename(); - moptions.clutsDir = clutsDir->get_filename(); + moptions.rtSettings.cameraProfilesPath = cameraProfilesDir->get_filename(); + moptions.rtSettings.lensProfilesPath = lensProfilesDir->get_filename(); - moptions.baBehav.resize (ADDSET_PARAM_NUM); + moptions.baBehav.resize(ADDSET_PARAM_NUM); for (Gtk::TreeIter sections = behModel->children().begin(); sections != behModel->children().end(); sections++) for (Gtk::TreeIter adjs = sections->children().begin(); adjs != sections->children().end(); adjs++) { - moptions.baBehav[adjs->get_value (behavColumns.addsetid)] = adjs->get_value (behavColumns.badd); + moptions.baBehav[adjs->get_value(behavColumns.addsetid)] = adjs->get_value(behavColumns.badd); } int editorMode = editorLayout->get_active_row_number(); @@ -1787,11 +1890,15 @@ void Preferences::storePreferences () moptions.mainNBVertical = editorMode == 1; moptions.curvebboxpos = curveBBoxPosC->get_active_row_number(); + moptions.complexity = complexitylocal->get_active_row_number(); + moptions.inspectorWindow = inspectorWindowCB->get_active(); + moptions.zoomOnScroll = zoomOnScrollCB->get_active(); moptions.histogramPosition = ckbHistogramPositionLeft->get_active() ? 1 : 2; moptions.FileBrowserToolbarSingleRow = ckbFileBrowserToolbarSingleRow->get_active(); moptions.showFilmStripToolBar = ckbShowFilmStripToolBar->get_active(); moptions.hideTPVScrollbar = ckbHideTPVScrollbar->get_active(); - moptions.overwriteOutputFile = chOverwriteOutputFile->get_active (); + moptions.overwriteOutputFile = chOverwriteOutputFile->get_active(); + moptions.showtooltip = ckbshowtooltiplocallab->get_active(); moptions.autoSaveTpOpen = ckbAutoSaveTpOpen->get_active(); @@ -1808,97 +1915,100 @@ void Preferences::storePreferences () // Sounds only on Windows and Linux #if defined(WIN32) || defined(__linux__) - moptions.sndEnable = ckbSndEnable->get_active (); - moptions.sndBatchQueueDone = txtSndBatchQueueDone->get_text (); - moptions.sndLngEditProcDone = txtSndLngEditProcDone->get_text (); - moptions.sndLngEditProcDoneSecs = spbSndLngEditProcDoneSecs->get_value (); + moptions.sndEnable = ckbSndEnable->get_active(); + moptions.sndBatchQueueDone = txtSndBatchQueueDone->get_text(); + moptions.sndLngEditProcDone = txtSndLngEditProcDone->get_text(); + moptions.sndLngEditProcDoneSecs = spbSndLngEditProcDoneSecs->get_value(); #endif moptions.cropGuides = Options::CropGuidesMode(cropGuidesCombo->get_active_row_number()); moptions.cropAutoFit = cropAutoFitCB->get_active(); + + toolLocationPreference->updateOptions(); } -void Preferences::fillPreferences () +void Preferences::fillPreferences() { - tconn.block (true); - fconn.block (true); - cpfconn.block (true); - sconn.block (true); - dfconn.block (true); - ffconn.block (true); - rpconn.block (true); - ipconn.block (true); - bpconn.block (true); + tconn.block(true); + fconn.block(true); + cpfconn.block(true); + sconn.block(true); + dfconn.block(true); + ffconn.block(true); + rpconn.block(true); + ipconn.block(true); + bpconn.block(true); - rprofiles->setActiveRowFromFullPath (moptions.defProfRaw); + rprofiles->setActiveRowFromFullPath(moptions.defProfRaw); forRAWComboChanged(); // update the tooltip - iprofiles->setActiveRowFromFullPath (moptions.defProfImg); + iprofiles->setActiveRowFromFullPath(moptions.defProfImg); forImageComboChanged(); // update the tooltip - dateformat->set_text (moptions.dateFormat); - panFactor->set_value (moptions.panAccelFactor); - rememberZoomPanCheckbutton->set_active (moptions.rememberZoomAndPan); - ctiffserialize->set_active (moptions.serializeTiffRead); + dateformat->set_text(moptions.dateFormat); + panFactor->set_value(moptions.panAccelFactor); + rememberZoomPanCheckbutton->set_active(moptions.rememberZoomAndPan); + ctiffserialize->set_active(moptions.serializeTiffRead); - setActiveTextOrIndex (*prtProfile, moptions.rtSettings.printerProfile, 0); + setActiveTextOrIndex(*prtProfile, moptions.rtSettings.printerProfile, 0); switch (moptions.rtSettings.printerIntent) { default: case rtengine::RI_PERCEPTUAL: - prtIntent->set_active (0); + prtIntent->set_active(0); break; case rtengine::RI_RELATIVE: - prtIntent->set_active (1); + prtIntent->set_active(1); break; case rtengine::RI_ABSOLUTE: - prtIntent->set_active (2); + prtIntent->set_active(2); break; } - prtBPC->set_active (moptions.rtSettings.printerBPC); + prtBPC->set_active(moptions.rtSettings.printerBPC); #if !defined(__APPLE__) // monitor profile not supported on apple - setActiveTextOrIndex (*monProfile, moptions.rtSettings.monitorProfile, 0); + setActiveTextOrIndex(*monProfile, moptions.rtSettings.monitorProfile, 0); switch (moptions.rtSettings.monitorIntent) { default: case rtengine::RI_PERCEPTUAL: - monIntent->set_active (0); + monIntent->set_active(0); break; case rtengine::RI_RELATIVE: - monIntent->set_active (1); + monIntent->set_active(1); break; case rtengine::RI_ABSOLUTE: - monIntent->set_active (2); + monIntent->set_active(2); break; } - monBPC->set_active (moptions.rtSettings.monitorBPC); - cbAutoMonProfile->set_active (moptions.rtSettings.autoMonitorProfile); + monBPC->set_active(moptions.rtSettings.monitorBPC); + mcie->set_active(moptions.rtSettings.autocielab); + + cbAutoMonProfile->set_active(moptions.rtSettings.autoMonitorProfile); #endif - if (Glib::file_test (moptions.rtSettings.iccDirectory, Glib::FILE_TEST_IS_DIR)) { - iccDir->set_current_folder (moptions.rtSettings.iccDirectory); + if (Glib::file_test(moptions.rtSettings.iccDirectory, Glib::FILE_TEST_IS_DIR)) { + iccDir->set_current_folder(moptions.rtSettings.iccDirectory); } cprevdemo->set_active (moptions.prevdemo); - - languages->set_active_text (moptions.language); - ckbLangAutoDetect->set_active (moptions.languageAutoDetect); - int themeNbr = getThemeRowNumber (moptions.theme); + languages->set_active_text(moptions.language); + ckbLangAutoDetect->set_active(moptions.languageAutoDetect); + int themeNbr = getThemeRowNumber(moptions.theme); themeCBT->set_active (themeNbr == -1 ? 0 : themeNbr); Gdk::RGBA cropCol; - cropCol.set_rgba (moptions.cutOverlayBrush[0], moptions.cutOverlayBrush[1], moptions.cutOverlayBrush[2]); + cropCol.set_rgba(moptions.cutOverlayBrush[0], moptions.cutOverlayBrush[1], moptions.cutOverlayBrush[2]); 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]); + NavGuideCol.set_rgba(moptions.navGuideBrush[0], moptions.navGuideBrush[1], moptions.navGuideBrush[2]); navGuideColorCB->set_rgba (NavGuideCol); navGuideColorCB->set_alpha ( (unsigned short) (moptions.navGuideBrush[3] * 65535.0)); @@ -1916,63 +2026,55 @@ void Preferences::fillPreferences () pseudoHiDPI->set_active(options.pseudoHiDPISupport); - showDateTime->set_active (moptions.fbShowDateTime); - showBasicExif->set_active (moptions.fbShowBasicExif); - showExpComp->set_active (moptions.fbShowExpComp); - ckbmenuGroupRank->set_active (moptions.menuGroupRank); - ckbmenuGroupLabel->set_active (moptions.menuGroupLabel); - ckbmenuGroupFileOperations->set_active (moptions.menuGroupFileOperations); - ckbmenuGroupProfileOperations->set_active (moptions.menuGroupProfileOperations); - ckbmenuGroupExtProg->set_active (moptions.menuGroupExtProg); + showDateTime->set_active(moptions.fbShowDateTime); + showBasicExif->set_active(moptions.fbShowBasicExif); + showExpComp->set_active(moptions.fbShowExpComp); + ckbmenuGroupRank->set_active(moptions.menuGroupRank); + ckbmenuGroupLabel->set_active(moptions.menuGroupLabel); + ckbmenuGroupFileOperations->set_active(moptions.menuGroupFileOperations); + ckbmenuGroupProfileOperations->set_active(moptions.menuGroupProfileOperations); + ckbmenuGroupExtProg->set_active(moptions.menuGroupExtProg); - hlThresh->set_value (moptions.highlightThreshold); - shThresh->set_value (moptions.shadowThreshold); + hlThresh->set_value(moptions.highlightThreshold); + shThresh->set_value(moptions.shadowThreshold); - edGimp->set_active (moptions.editorToSendTo == 1); - edOther->set_active (moptions.editorToSendTo == 3); -#ifdef WIN32 - edPS->set_active (moptions.editorToSendTo == 2); - - if (Glib::file_test (moptions.gimpDir, Glib::FILE_TEST_IS_DIR)) { - gimpDir->set_current_folder (moptions.gimpDir); - } else { - gimpDir->set_current_folder (Glib::get_home_dir()); + std::vector editorInfos; + for (const auto &editor : moptions.externalEditors) { + editorInfos.emplace_back(editor.name, editor.command, editor.icon_serialized, editor.native_command); } - - if (Glib::file_test (moptions.psDir, Glib::FILE_TEST_IS_DIR)) { - psDir->set_current_folder (moptions.psDir); - } else { - psDir->set_current_folder (Glib::get_home_dir()); + if (moptions.externalEditorIndex >= 0) { + // Mark the current editor so we can track it. + editorInfos[moptions.externalEditorIndex].other_data.selected = true; } + externalEditors->setEditors(editorInfos); -#elif defined __APPLE__ - edPS->set_active (moptions.editorToSendTo == 2); - - if (Glib::file_test (moptions.psDir, Glib::FILE_TEST_IS_DIR)) { - psDir->set_current_folder (moptions.psDir); + editor_dir_temp->set_active(moptions.editor_out_dir == Options::EDITOR_OUT_DIR_TEMP); + editor_dir_current->set_active(moptions.editor_out_dir == Options::EDITOR_OUT_DIR_CURRENT); + editor_dir_custom->set_active(moptions.editor_out_dir == Options::EDITOR_OUT_DIR_CUSTOM); + if (Glib::file_test(moptions.editor_custom_out_dir, Glib::FILE_TEST_IS_DIR)) { + editor_dir_custom_path->set_current_folder(moptions.editor_custom_out_dir); } else { - psDir->set_current_folder (Glib::get_home_dir()); + editor_dir_custom_path->set_current_folder(Glib::get_tmp_dir()); } + editor_float32->set_active(moptions.editor_float32); + editor_bypass_output_profile->set_active(moptions.editor_bypass_output_profile); -#endif - editorToSendTo->set_text (moptions.customEditorProg); - - txtCustProfBuilderPath->set_text (moptions.CPBPath); - custProfBuilderLabelType->set_active (moptions.CPBKeys); + txtCustProfBuilderPath->set_text(moptions.CPBPath); + custProfBuilderLabelType->set_active(moptions.CPBKeys); if (moptions.startupDir == STARTUPDIR_CURRENT) { - sdcurrent->set_active (); + sdcurrent->set_active(); } else if (moptions.startupDir == STARTUPDIR_LAST) { - sdlast->set_active (); + sdlast->set_active(); } else if (moptions.startupDir == STARTUPDIR_HOME) { - sdhome->set_active (); + sdhome->set_active(); } else if (moptions.startupDir == STARTUPDIR_CUSTOM) { - sdother->set_active (); - startupdir->set_text (moptions.startupPath); + sdother->set_active(); + startupdir->set_text(moptions.startupPath); } - extensionModel->clear (); + extensionModel->clear(); for (size_t i = 0; i < moptions.parseExtensions.size(); i++) { Gtk::TreeRow row = * (extensionModel->append()); @@ -1980,32 +2082,36 @@ void Preferences::fillPreferences () row[extensionColumns.ext] = moptions.parseExtensions[i]; } - maxRecentFolders->set_value (moptions.maxRecentFolders); + maxRecentFolders->set_value(moptions.maxRecentFolders); 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); - ckbInternalThumbIfUntouched->set_active (moptions.internalThumbIfUntouched); + overlayedFileNames->set_active(moptions.overlayedFileNames); + filmStripOverlayedFileNames->set_active(moptions.filmStripOverlayedFileNames); + sameThumbSize->set_active(moptions.sameThumbSize); + ckbInternalThumbIfUntouched->set_active(moptions.internalThumbIfUntouched); - saveParamsPreference->set_active (moptions.saveParamsFile ? (moptions.saveParamsCache ? 2 : 0) : 1); + saveParamsPreference->set_active(moptions.saveParamsFile ? (moptions.saveParamsCache ? 2 : 0) : 1); - loadParamsPreference->set_active (moptions.paramsLoadLocation); - useBundledProfiles->set_active (moptions.useBundledProfiles); + loadParamsPreference->set_active(moptions.paramsLoadLocation); + useBundledProfiles->set_active(moptions.useBundledProfiles); if (!moptions.tabbedUI) { - editorLayout->set_active (moptions.mainNBVertical ? 1 : 0); + editorLayout->set_active(moptions.mainNBVertical ? 1 : 0); } else { - editorLayout->set_active (moptions.multiDisplayMode ? 3 : 2); + editorLayout->set_active(moptions.multiDisplayMode ? 3 : 2); } - curveBBoxPosC->set_active (moptions.curvebboxpos); - ckbHistogramPositionLeft->set_active (moptions.histogramPosition == 1); - ckbFileBrowserToolbarSingleRow->set_active (moptions.FileBrowserToolbarSingleRow); - ckbShowFilmStripToolBar->set_active (moptions.showFilmStripToolBar); - ckbHideTPVScrollbar->set_active (moptions.hideTPVScrollbar); + curveBBoxPosC->set_active(moptions.curvebboxpos); + complexitylocal->set_active(moptions.complexity); + inspectorWindowCB->set_active(moptions.inspectorWindow); + zoomOnScrollCB->set_active(moptions.zoomOnScroll); - ckbAutoSaveTpOpen->set_active (moptions.autoSaveTpOpen); + ckbHistogramPositionLeft->set_active(moptions.histogramPosition == 1); + ckbFileBrowserToolbarSingleRow->set_active(moptions.FileBrowserToolbarSingleRow); + ckbShowFilmStripToolBar->set_active(moptions.showFilmStripToolBar); + ckbHideTPVScrollbar->set_active(moptions.hideTPVScrollbar); + ckbshowtooltiplocallab->set_active(moptions.showtooltip); + ckbAutoSaveTpOpen->set_active(moptions.autoSaveTpOpen); threadsSpinBtn->set_value (moptions.rgbDenoiseThreadLimit); clutCacheSizeSB->set_value (moptions.clutCacheSize); @@ -2018,50 +2124,54 @@ void Preferences::fillPreferences () maxInspectorBuffersSB->set_value (moptions.maxInspectorBuffers); thumbnailInspectorMode->set_active(int(moptions.rtSettings.thumbnail_inspector_mode)); - darkFrameDir->set_current_folder ( moptions.rtSettings.darkFramesPath ); - darkFrameChanged (); + darkFrameDir->set_current_folder(moptions.rtSettings.darkFramesPath); + darkFrameChanged(); - flatFieldDir->set_current_folder ( moptions.rtSettings.flatFieldsPath ); - flatFieldChanged (); + flatFieldDir->set_current_folder(moptions.rtSettings.flatFieldsPath); + flatFieldChanged(); - clutsDir->set_current_folder ( moptions.clutsDir ); + clutsDir->set_current_folder(moptions.clutsDir); + + cameraProfilesDir->set_current_folder(moptions.rtSettings.cameraProfilesPath); + + lensProfilesDir->set_current_folder(moptions.rtSettings.lensProfilesPath); - addc.block (true); - setc.block (true); + addc.block(true); + setc.block(true); - moptions.baBehav.resize (ADDSET_PARAM_NUM); + moptions.baBehav.resize(ADDSET_PARAM_NUM); for (Gtk::TreeIter sections = behModel->children().begin(); sections != behModel->children().end(); ++sections) { for (Gtk::TreeIter adjs = sections->children().begin(); adjs != sections->children().end(); ++adjs) { const bool add = moptions.baBehav[adjs->get_value(behavColumns.addsetid)]; - adjs->set_value (behavColumns.badd, add); - adjs->set_value (behavColumns.bset, !add); + adjs->set_value(behavColumns.badd, add); + adjs->set_value(behavColumns.bset, !add); } } cropGuidesCombo->set_active(moptions.cropGuides); cropAutoFitCB->set_active(moptions.cropAutoFit); - addc.block (false); - setc.block (false); - cpfconn.block (false); - fconn.block (false); - tconn.block (false); - sconn.block (false); - dfconn.block (false); - ffconn.block (false); - rpconn.block (true); - ipconn.block (true); - bpconn.block (false); + addc.block(false); + setc.block(false); + cpfconn.block(false); + fconn.block(false); + tconn.block(false); + sconn.block(false); + dfconn.block(false); + ffconn.block(false); + rpconn.block(true); + ipconn.block(true); + bpconn.block(false); - chOverwriteOutputFile->set_active (moptions.overwriteOutputFile); + chOverwriteOutputFile->set_active(moptions.overwriteOutputFile); // Sounds only on Windows and Linux #if defined(WIN32) || defined(__linux__) - ckbSndEnable->set_active (moptions.sndEnable); - txtSndBatchQueueDone->set_text (moptions.sndBatchQueueDone); - txtSndLngEditProcDone->set_text (moptions.sndLngEditProcDone); - spbSndLngEditProcDoneSecs->set_value (moptions.sndLngEditProcDoneSecs); + ckbSndEnable->set_active(moptions.sndEnable); + txtSndBatchQueueDone->set_text(moptions.sndBatchQueueDone); + txtSndLngEditProcDone->set_text(moptions.sndLngEditProcDone); + spbSndLngEditProcDoneSecs->set_value(moptions.sndLngEditProcDoneSecs); #endif } @@ -2080,9 +2190,9 @@ void Preferences::savePressed () { } */ -void Preferences::autoMonProfileToggled () +void Preferences::autoMonProfileToggled() { - monProfile->set_sensitive (!cbAutoMonProfile->get_active()); + monProfile->set_sensitive(!cbAutoMonProfile->get_active()); } /* @@ -2091,43 +2201,43 @@ void Preferences::autocielabToggled () { } */ -void Preferences::sndEnableToggled () +void Preferences::sndEnableToggled() { - txtSndBatchQueueDone->set_sensitive (ckbSndEnable->get_active()); - txtSndLngEditProcDone->set_sensitive (ckbSndEnable->get_active()); - spbSndLngEditProcDoneSecs->set_sensitive (ckbSndEnable->get_active()); + txtSndBatchQueueDone->set_sensitive(ckbSndEnable->get_active()); + txtSndLngEditProcDone->set_sensitive(ckbSndEnable->get_active()); + spbSndLngEditProcDoneSecs->set_sensitive(ckbSndEnable->get_active()); } -void Preferences::langAutoDetectToggled () +void Preferences::langAutoDetectToggled() { - languages->set_sensitive (!ckbLangAutoDetect->get_active()); + languages->set_sensitive(!ckbLangAutoDetect->get_active()); } -void Preferences::okPressed () +void Preferences::okPressed() { - storePreferences (); + storePreferences(); workflowUpdate(); - options.copyFrom (&moptions); + options.copyFrom(&moptions); options.filterOutParsedExtensions(); try { - Options::save (); + Options::save(); } catch (Options::Error &e) { - Gtk::MessageDialog msgd (getToplevelWindow (this), e.get_msg(), true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_CLOSE, true); + Gtk::MessageDialog msgd(getToplevelWindow(this), e.get_msg(), true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_CLOSE, true); msgd.run(); } dynProfilePanel->save(); - hide (); + hide(); } -void Preferences::cancelPressed () +void Preferences::cancelPressed() { // set the initial theme back if (themeFNames.at (themeCBT->get_active_row_number ()).longFName != options.theme) { RTImage::updateImages(); - switchThemeTo (options.theme); + switchThemeTo(options.theme); } // set the initial font back @@ -2135,59 +2245,59 @@ void Preferences::cancelPressed () if (fd.get_family() != options.fontFamily && (fd.get_size() / Pango::SCALE) != options.fontSize) { if (options.fontFamily == "default") { - switchFontTo (initialFontFamily, initialFontSize); + switchFontTo(initialFontFamily, initialFontSize); } else { - switchFontTo (options.fontFamily, options.fontSize); + switchFontTo(options.fontFamily, options.fontSize); } } // update the profileStore - if (useBundledProfiles->get_active () != options.useBundledProfiles) { + if (useBundledProfiles->get_active() != options.useBundledProfiles) { // we have to rescan with the old value - bpconn.block (true); - useBundledProfiles->set_active (false); + bpconn.block(true); + useBundledProfiles->set_active(false); bundledProfilesChanged(); - bpconn.block (false); + bpconn.block(false); } - hide (); + hide(); } -void Preferences::selectStartupDir () +void Preferences::selectStartupDir() { - Gtk::FileChooserDialog dialog (getToplevelWindow (this), M ("PREFERENCES_DIRSELECTDLG"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); + Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("PREFERENCES_DIRSELECTDLG"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); //dialog.set_transient_for(*this); //Add response buttons to the dialog: - dialog.add_button (M ("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); - dialog.add_button (M ("GENERAL_OPEN"), Gtk::RESPONSE_OK); + dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); + dialog.add_button(M("GENERAL_OPEN"), Gtk::RESPONSE_OK); int result = dialog.run(); if (result == Gtk::RESPONSE_OK) { - startupdir->set_text (dialog.get_filename()); + startupdir->set_text(dialog.get_filename()); } } -void Preferences::aboutPressed () +void Preferences::aboutPressed() { - splash = new Splash (*this); - splash->set_transient_for (*this); - splash->signal_delete_event().connect ( sigc::mem_fun (*this, &Preferences::splashClosed) ); - splash->show (); + splash = new Splash(*this); + splash->set_transient_for(*this); + splash->signal_delete_event().connect(sigc::mem_fun(*this, &Preferences::splashClosed)); + splash->show(); } -void Preferences::themeChanged () +void Preferences::themeChanged() { moptions.theme = themeFNames.at (themeCBT->get_active_row_number ()).longFName; RTImage::updateImages(); - switchThemeTo (moptions.theme); + switchThemeTo(moptions.theme); } -void Preferences::forRAWComboChanged () +void Preferences::forRAWComboChanged() { if (!rprofiles) { return; @@ -2200,17 +2310,17 @@ void Preferences::forRAWComboChanged () } if (selectedEntry->type == PSET_FOLDER) { - rpconn.block (true); - rprofiles->set_active (currRawRow); - rpconn.block (false); + rpconn.block(true); + rprofiles->set_active(currRawRow); + rpconn.block(false); } else { currRawRow = rprofiles->get_active(); } - rprofiles->set_tooltip_text (selectedEntry->label); + rprofiles->set_tooltip_text(selectedEntry->label); } -void Preferences::forImageComboChanged () +void Preferences::forImageComboChanged() { if (!iprofiles) { return; @@ -2223,29 +2333,29 @@ void Preferences::forImageComboChanged () } if (selectedEntry->type == PSET_FOLDER) { - ipconn.block (true); - iprofiles->set_active (currImgRow); - ipconn.block (false); + ipconn.block(true); + iprofiles->set_active(currImgRow); + ipconn.block(false); } else { currImgRow = rprofiles->get_active(); } - iprofiles->set_tooltip_text (iprofiles->getSelectedEntry()->label); + iprofiles->set_tooltip_text(iprofiles->getSelectedEntry()->label); } -void Preferences::layoutComboChanged () +void Preferences::layoutComboChanged() { - editorLayout->set_tooltip_text (editorLayout->get_active_text()); + editorLayout->set_tooltip_text(editorLayout->get_active_text()); } -void Preferences::bundledProfilesChanged () +void Preferences::bundledProfilesChanged() { - rpconn.block (true); - ipconn.block (true); + rpconn.block(true); + ipconn.block(true); // parseProfiles does use options.useBundledProfiles, so we temporarily change its value bool currValue = options.useBundledProfiles; - options.useBundledProfiles = useBundledProfiles->get_active (); + options.useBundledProfiles = useBundledProfiles->get_active(); // rescan the file's tree ProfileStore::getInstance()->parseProfiles(); // This will call Preferences::updateProfileList in return @@ -2253,24 +2363,24 @@ void Preferences::bundledProfilesChanged () // restoring back the old value options.useBundledProfiles = currValue; - ipconn.block (false); - rpconn.block (false); + ipconn.block(false); + rpconn.block(false); } -void Preferences::iccDirChanged () +void Preferences::iccDirChanged() { - const auto currentSelection = monProfile->get_active_text (); - const auto profiles = rtengine::ICCStore::getInstance ()->getProfilesFromDir (iccDir->get_filename ()); + const auto currentSelection = monProfile->get_active_text(); + const auto profiles = rtengine::ICCStore::getInstance()->getProfilesFromDir(iccDir->get_filename()); monProfile->remove_all(); - monProfile->append (M ("PREFERENCES_PROFILE_NONE")); + monProfile->append(M("PREFERENCES_PROFILE_NONE")); for (const auto& profile : profiles) { - monProfile->append (profile); + monProfile->append(profile); } - setActiveTextOrIndex (*monProfile, currentSelection, 0); + setActiveTextOrIndex(*monProfile, currentSelection, 0); } void Preferences::storeCurrentValue() @@ -2285,26 +2395,26 @@ void Preferences::updateProfileList() rprofiles->updateProfileList(); iprofiles->updateProfileList(); const ProfileStoreEntry* dynpse = ProfileStore::getInstance()->getInternalDynamicPSE(); - rprofiles->addRow (dynpse); - iprofiles->addRow (dynpse); + rprofiles->addRow(dynpse); + iprofiles->addRow(dynpse); } void Preferences::restoreValue() { - if (!rprofiles->setActiveRowFromFullPath (storedValueRaw)) { + if (!rprofiles->setActiveRowFromFullPath(storedValueRaw)) { moptions.defProfRaw = DEFPROFILE_INTERNAL; - rpconn.block (true); + rpconn.block(true); rprofiles->setInternalEntry(); - rpconn.block (false); + rpconn.block(false); } currRawRow = rprofiles->get_active(); - if (!iprofiles->setActiveRowFromFullPath (storedValueImg)) { + if (!iprofiles->setActiveRowFromFullPath(storedValueImg)) { moptions.defProfImg = DEFPROFILE_INTERNAL; - ipconn.block (true); + ipconn.block(true); iprofiles->setInternalEntry(); - ipconn.block (false); + ipconn.block(false); } currImgRow = iprofiles->get_active(); @@ -2313,48 +2423,47 @@ void Preferences::restoreValue() storedValueImg = ""; } -void Preferences::switchThemeTo (Glib::ustring newTheme) +void Preferences::switchThemeTo(Glib::ustring newTheme) { - Glib::ustring filename (Glib::build_filename (argv0, "themes", newTheme + ".css")); + Glib::ustring filename(Glib::build_filename(argv0, "themes", newTheme + ".css")); if (!themecss) { themecss = Gtk::CssProvider::create(); Glib::RefPtr screen = Gdk::Screen::get_default(); - Gtk::StyleContext::add_provider_for_screen (screen, themecss, GTK_STYLE_PROVIDER_PRIORITY_USER); + Gtk::StyleContext::add_provider_for_screen(screen, themecss, GTK_STYLE_PROVIDER_PRIORITY_USER); } try { - themecss->load_from_path (filename); + themecss->load_from_path(filename); } catch (Glib::Error &err) { - printf ("Error: Can't load css file \"%s\"\nMessage: %s\n", filename.c_str(), err.what().c_str()); + printf("Error: Can't load css file \"%s\"\nMessage: %s\n", filename.c_str(), err.what().c_str()); } catch (...) { - printf ("Error: Can't load css file \"%s\"\n", filename.c_str()); + printf("Error: Can't load css file \"%s\"\n", filename.c_str()); } } -void Preferences::fontChanged () +void Preferences::fontChanged() { - newFont = true; Pango::FontDescription fd (mainFontFB->get_font_name()); - switchFontTo (fd.get_family(), fd.get_size() / Pango::SCALE); + switchFontTo(fd.get_family(), fd.get_size() / Pango::SCALE); } -void Preferences::cpFontChanged () +void Preferences::cpFontChanged() { newCPFont = true; } -void Preferences::switchFontTo (const Glib::ustring &newFontFamily, const int newFontSize) +void Preferences::switchFontTo(const Glib::ustring &newFontFamily, const int newFontSize) { if (newFontFamily != "default") { if (!fontcss) { fontcss = Gtk::CssProvider::create(); Glib::RefPtr screen = Gdk::Screen::get_default(); - Gtk::StyleContext::add_provider_for_screen (screen, fontcss, GTK_STYLE_PROVIDER_PRIORITY_USER); + Gtk::StyleContext::add_provider_for_screen(screen, fontcss, GTK_STYLE_PROVIDER_PRIORITY_USER); } try { @@ -2366,105 +2475,135 @@ void Preferences::switchFontTo (const Glib::ustring &newFontFamily, const int ne //#endif //GTK318 } catch (Glib::Error &err) { - printf ("Error: \"%s\"\n", err.what().c_str()); + printf("Error: \"%s\"\n", err.what().c_str()); } catch (...) { - printf ("Error: Can't find the font named \"%s\"\n", newFontFamily.c_str()); + printf("Error: Can't find the font named \"%s\"\n", newFontFamily.c_str()); } } else { if (fontcss) { fontcss = Gtk::CssProvider::create(); Glib::RefPtr screen = Gdk::Screen::get_default(); - Gtk::StyleContext::remove_provider_for_screen (screen, fontcss); + Gtk::StyleContext::remove_provider_for_screen(screen, fontcss); } } } -void Preferences::workflowUpdate () +void Preferences::workflowUpdate() { if (moptions.tabbedUI != options.tabbedUI) { - parent->setEditorMode (moptions.tabbedUI); + parent->setEditorMode(moptions.tabbedUI); } if (moptions.hideTPVScrollbar != options.hideTPVScrollbar) { // Update the tool panels - parent->updateTPVScrollbar (moptions.hideTPVScrollbar); + parent->updateTPVScrollbar(moptions.hideTPVScrollbar); } if (moptions.FileBrowserToolbarSingleRow != options.FileBrowserToolbarSingleRow) { // Update the position of the Query toolbar - parent->updateFBQueryTB (moptions.FileBrowserToolbarSingleRow); + parent->updateFBQueryTB(moptions.FileBrowserToolbarSingleRow); } if (moptions.showFilmStripToolBar != options.showFilmStripToolBar) { // Update the visibility of FB toolbar - parent->updateFBToolBarVisibility (moptions.showFilmStripToolBar); + parent->updateFBToolBarVisibility(moptions.showFilmStripToolBar); + } + + if (moptions.showtooltip != options.showtooltip) { + // Update the visibility of tooltip + parent->updateShowtooltipVisibility(moptions.showtooltip); } if (moptions.histogramPosition != options.histogramPosition) { // Update the position of the Histogram - parent->updateHistogramPosition (options.histogramPosition, moptions.histogramPosition); + parent->updateHistogramPosition(options.histogramPosition, moptions.histogramPosition); } - if ( moptions.rtSettings.printerProfile != options.rtSettings.printerProfile + if (moptions.rtSettings.printerProfile != options.rtSettings.printerProfile || moptions.rtSettings.printerBPC != options.rtSettings.printerBPC || moptions.rtSettings.printerIntent != options.rtSettings.printerIntent) { // Update the position of the Histogram parent->updateProfiles (moptions.rtSettings.printerProfile, rtengine::RenderingIntent(moptions.rtSettings.printerIntent), moptions.rtSettings.printerBPC); } + bool changed = moptions.externalEditorIndex != options.externalEditorIndex + || moptions.externalEditors.size() != options.externalEditors.size(); + if (!changed) { + auto &editors = options.externalEditors; + auto &meditors = moptions.externalEditors; + for (unsigned i = 0; i < editors.size(); i++) { + if (editors[i] != meditors[i]) { + changed = true; + break; + } + } + } + if (changed) { + // Update the send to external editor widget. + int selected_index = moptions.externalEditorIndex >= 0 + ? moptions.externalEditorIndex + : static_cast(moptions.externalEditors.size()); + parent->updateExternalEditorWidget(selected_index, moptions.externalEditors); + } + + if (moptions.cloneFavoriteTools != options.cloneFavoriteTools || + moptions.favorites != options.favorites) { + parent->updateToolPanelToolLocations( + moptions.favorites, moptions.cloneFavoriteTools); + } } -void Preferences::addExtPressed () +void Preferences::addExtPressed() { - Gtk::TreeNodeChildren c = extensionModel->children (); + Gtk::TreeNodeChildren c = extensionModel->children(); for (size_t i = 0; i < c.size(); i++) - if (c[i][extensionColumns.ext] == extension->get_text ()) { + if (c[i][extensionColumns.ext] == extension->get_text()) { return; } Gtk::TreeRow row = * (extensionModel->append()); row[extensionColumns.enabled] = true; - row[extensionColumns.ext] = extension->get_text (); + row[extensionColumns.ext] = extension->get_text(); } -void Preferences::delExtPressed () +void Preferences::delExtPressed() { - extensionModel->erase (extensions->get_selection()->get_selected ()); + extensionModel->erase(extensions->get_selection()->get_selected()); } -void Preferences::moveExtUpPressed () +void Preferences::moveExtUpPressed() { - const Glib::RefPtr selection = extensions->get_selection (); + const Glib::RefPtr selection = extensions->get_selection(); if (!selection) { return; } - const Gtk::TreeModel::iterator selected = selection->get_selected (); + const Gtk::TreeModel::iterator selected = selection->get_selected(); - if (!selected || selected == extensionModel->children ().begin ()) { + if (!selected || selected == extensionModel->children().begin()) { return; } Gtk::TreeModel::iterator previous = selected; --previous; - extensionModel->iter_swap (selected, previous); + extensionModel->iter_swap(selected, previous); } -void Preferences::moveExtDownPressed () +void Preferences::moveExtDownPressed() { - const Glib::RefPtr selection = extensions->get_selection (); + const Glib::RefPtr selection = extensions->get_selection(); if (!selection) { return; } - const Gtk::TreeModel::iterator selected = selection->get_selected (); + const Gtk::TreeModel::iterator selected = selection->get_selected(); if (!selected) { return; @@ -2473,44 +2612,45 @@ void Preferences::moveExtDownPressed () Gtk::TreeModel::iterator next = selected; if (++next) { - extensionModel->iter_swap (selected, next); + extensionModel->iter_swap(selected, next); } } -void Preferences::clearProfilesPressed () +void Preferences::clearProfilesPressed() { - cacheMgr->clearProfiles (); + cacheMgr->clearProfiles(); } -void Preferences::clearThumbImagesPressed () + +void Preferences::clearThumbImagesPressed() { - cacheMgr->clearImages (); + cacheMgr->clearImages(); } -void Preferences::clearAllPressed () +void Preferences::clearAllPressed() { - cacheMgr->clearAll (); + cacheMgr->clearAll(); } -void Preferences::darkFrameChanged () +void Preferences::darkFrameChanged() { //Glib::ustring s(darkFrameDir->get_filename()); - Glib::ustring s (darkFrameDir->get_current_folder()); - //if( s.compare( rtengine::dfm.getPathname()) !=0 ){ - rtengine::dfm.init ( s ); + Glib::ustring s(darkFrameDir->get_current_folder()); + //if( s.compare( rtengine::DFManager::getInstance().getPathname()) !=0 ){ + rtengine::DFManager::getInstance().init(s); updateDFinfos(); //} } -void Preferences::flatFieldChanged () +void Preferences::flatFieldChanged() { //Glib::ustring s(flatFieldDir->get_filename()); - Glib::ustring s (flatFieldDir->get_current_folder()); + Glib::ustring s(flatFieldDir->get_current_folder()); //if( s.compare( rtengine::ffm.getPathname()) !=0 ){ - rtengine::ffm.init ( s ); + rtengine::ffm.init(s); updateFFinfos(); //} } @@ -2518,29 +2658,30 @@ void Preferences::flatFieldChanged () void Preferences::updateDFinfos() { int t1, t2; - rtengine::dfm.getStat (t1, t2); - Glib::ustring s = Glib::ustring::compose ("%1: %2 %3, %4 %5", M ("PREFERENCES_DARKFRAMEFOUND"), t1, M ("PREFERENCES_DARKFRAMESHOTS"), t2, M ("PREFERENCES_DARKFRAMETEMPLATES")); - dfLabel->set_text (s); + rtengine::DFManager::getInstance().getStat(t1, t2); + Glib::ustring s = Glib::ustring::compose("%1: %2 %3, %4 %5", M("PREFERENCES_DARKFRAMEFOUND"), t1, M("PREFERENCES_DARKFRAMESHOTS"), t2, M("PREFERENCES_DARKFRAMETEMPLATES")); + dfLabel->set_text(s); } void Preferences::updateFFinfos() { int t1, t2; - rtengine::ffm.getStat (t1, t2); - Glib::ustring s = Glib::ustring::compose ("%1: %2 %3, %4 %5", M ("PREFERENCES_FLATFIELDFOUND"), t1, M ("PREFERENCES_FLATFIELDSHOTS"), t2, M ("PREFERENCES_FLATFIELDTEMPLATES")); - ffLabel->set_text (s); + rtengine::ffm.getStat(t1, t2); + Glib::ustring s = Glib::ustring::compose("%1: %2 %3, %4 %5", M("PREFERENCES_FLATFIELDFOUND"), t1, M("PREFERENCES_FLATFIELDSHOTS"), t2, M("PREFERENCES_FLATFIELDTEMPLATES")); + ffLabel->set_text(s); } -bool Preferences::splashClosed (GdkEventAny* event) +bool Preferences::splashClosed(GdkEventAny* event) { delete splash; splash = nullptr; return true; } -void Preferences::behAddSetAllPressed (bool add) +void Preferences::behAddSetAllPressed(bool add) { moptions.baBehav.assign(ADDSET_PARAM_NUM, add); + for (Gtk::TreeIter sections = behModel->children().begin(); sections != behModel->children().end(); ++sections) { for (Gtk::TreeIter adjs = sections->children().begin(); adjs != sections->children().end(); ++adjs) { adjs->set_value(behavColumns.badd, add); @@ -2549,12 +2690,12 @@ void Preferences::behAddSetAllPressed (bool add) } } -void Preferences::behAddAllPressed () +void Preferences::behAddAllPressed() { behAddSetAllPressed(true); } -void Preferences::behSetAllPressed () +void Preferences::behSetAllPressed() { behAddSetAllPressed(false); } diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 76a104ffa..6e31761a4 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -26,10 +26,12 @@ #include "options.h" #include "../rtengine/profilestore.h" +class ExternalEditorPreferences; class RTWindow; class Splash; +class ToolLocationPreference; -class Preferences : +class Preferences final : public Gtk::Dialog, public ProfileStoreListener { @@ -101,9 +103,20 @@ class Preferences : Gtk::RadioButton* edGimp; Gtk::RadioButton* edPS; Gtk::RadioButton* edOther; + ExternalEditorPreferences *externalEditors; + + Gtk::RadioButton *editor_dir_temp; + Gtk::RadioButton *editor_dir_current; + Gtk::RadioButton *editor_dir_custom; + MyFileChooserButton *editor_dir_custom_path; + Gtk::CheckButton *editor_float32; + Gtk::CheckButton *editor_bypass_output_profile; + MyFileChooserButton* darkFrameDir; MyFileChooserButton* flatFieldDir; MyFileChooserButton* clutsDir; + MyFileChooserButton* cameraProfilesDir; + MyFileChooserButton* lensProfilesDir; Gtk::Label *dfLabel; Gtk::Label *ffLabel; @@ -117,12 +130,22 @@ class Preferences : Gtk::CheckButton* prtBPC; Gtk::ComboBoxText* monProfile; Gtk::ComboBoxText* monIntent; + Gtk::CheckButton* mcie; Gtk::CheckButton* monBPC; Gtk::CheckButton* cbAutoMonProfile; //Gtk::CheckButton* cbAutocielab; Gtk::CheckButton* cbdaubech; Gtk::SpinButton* hlThresh; Gtk::SpinButton* shThresh; +// Gtk::CheckButton* mwbacorr; + // Gtk::CheckButton* mwbaforc; + // Gtk::CheckButton* mwbanopurp; + +// Gtk::CheckButton* mwbasort; +// Gtk::SpinButton* wbacorrnb; +// Gtk::SpinButton* wbaprecis; +// Gtk::SpinButton* wbasizeref; +// Gtk::SpinButton* wbagreendelta; Gtk::SpinButton* panFactor; Gtk::CheckButton* rememberZoomPanCheckbutton; @@ -138,7 +161,7 @@ class Preferences : Gtk::ComboBoxText* dnliss; Gtk::Frame* waveletFrame; - Gtk::HBox* waveletTileSizeHBox; + Gtk::Box* waveletTileSizeHBox; Gtk::Label* waveletTileSizeLabel; Gtk::ComboBoxText* waveletTileSizeCombo; @@ -146,6 +169,11 @@ class Preferences : Gtk::CheckButton* ctiffserialize; Gtk::ComboBoxText* curveBBoxPosC; + Gtk::ComboBoxText* complexitylocal; + + Gtk::CheckButton* inspectorWindowCB; + Gtk::CheckButton* zoomOnScrollCB; + Gtk::ComboBoxText* themeCBT; Gtk::FontButton* mainFontFB; Gtk::FontButton* colorPickerFontFB; @@ -208,6 +236,7 @@ class Preferences : Gtk::CheckButton* ckbFileBrowserToolbarSingleRow; Gtk::CheckButton* ckbShowFilmStripToolBar; Gtk::CheckButton* ckbHideTPVScrollbar; + Gtk::CheckButton* ckbshowtooltiplocallab; Gtk::CheckButton* ckbAutoSaveTpOpen; Gtk::Button* btnSaveTpOpenNow; @@ -222,13 +251,15 @@ class Preferences : Options moptions; sigc::connection tconn, sconn, fconn, cpfconn, addc, setc, dfconn, ffconn, bpconn, rpconn, ipconn; - sigc::connection autoMonProfileConn, sndEnableConn, langAutoDetectConn, autocielabConn; + sigc::connection autoMonProfileConn, sndEnableConn, langAutoDetectConn, autocielabConn, observer10Conn; Glib::ustring initialTheme; Glib::ustring initialFontFamily; int initialFontSize; bool newFont; bool newCPFont; + ToolLocationPreference *toolLocationPreference; + void fillPreferences (); void storePreferences (); void parseDir (Glib::ustring dirname, std::vector& items, Glib::ustring ext); @@ -254,6 +285,7 @@ class Preferences : Gtk::ScrolledWindow *swGeneral; Gtk::ScrolledWindow *swImageProcessing; + Gtk::ScrolledWindow *swFavorites; Gtk::ScrolledWindow *swDynamicProfile; Gtk::ScrolledWindow *swFileBrowser; Gtk::ScrolledWindow *swColorMan; @@ -263,6 +295,7 @@ class Preferences : Gtk::Widget *getGeneralPanel(); Gtk::Widget *getImageProcessingPanel(); + Gtk::Widget *getFavoritesPanel(); Gtk::Widget *getDynamicProfilePanel(); Gtk::Widget *getFileBrowserPanel(); Gtk::Widget *getColorManPanel(); @@ -283,6 +316,7 @@ public: void sndEnableToggled (); void langAutoDetectToggled (); void autocielabToggled (); + void observer10Toggled (); void selectStartupDir (); void addExtPressed (); diff --git a/rtgui/preprocess.cc b/rtgui/preprocess.cc index 4a663ad07..4d7df213c 100644 --- a/rtgui/preprocess.cc +++ b/rtgui/preprocess.cc @@ -28,10 +28,12 @@ using namespace rtengine; using namespace rtengine::procparams; -PreProcess::PreProcess () : FoldableToolPanel(this, "preprocess", M("TP_PREPROCESS_LABEL"), options.prevdemo != PD_Sidecar) +const Glib::ustring PreProcess::TOOL_NAME = "preprocess"; + +PreProcess::PreProcess () : FoldableToolPanel(this, TOOL_NAME, M("TP_PREPROCESS_LABEL"), options.prevdemo != PD_Sidecar) { - Gtk::HBox* hotdeadPixel = Gtk::manage( new Gtk::HBox () ); + Gtk::Box* hotdeadPixel = Gtk::manage( new Gtk::Box () ); hotdeadPixel->set_spacing(4); hotPixel = Gtk::manage(new Gtk::CheckButton((M("TP_PREPROCESS_HOTPIXFILT")))); deadPixel = Gtk::manage(new Gtk::CheckButton((M("TP_PREPROCESS_DEADPIXFILT")))); @@ -46,9 +48,7 @@ PreProcess::PreProcess () : FoldableToolPanel(this, "preprocess", M("TP_PREPROCE hdThreshold->set_tooltip_markup (M("TP_RAW_HD_TOOLTIP")); hdThreshold->setAdjusterListener (this); - if (hdThreshold->delay < options.adjusterMaxDelay) { - hdThreshold->delay = options.adjusterMaxDelay; - } + hdThreshold->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); hdThreshold->show(); pack_start( *hdThreshold, Gtk::PACK_SHRINK, 4); diff --git a/rtgui/preprocess.h b/rtgui/preprocess.h index d10ff5223..047413bdb 100644 --- a/rtgui/preprocess.h +++ b/rtgui/preprocess.h @@ -38,6 +38,7 @@ protected: sigc::connection dpixelconn; Adjuster* hdThreshold; public: + static const Glib::ustring TOOL_NAME; PreProcess (); diff --git a/rtgui/preprocesswb.cc b/rtgui/preprocesswb.cc new file mode 100644 index 000000000..9251f9440 --- /dev/null +++ b/rtgui/preprocesswb.cc @@ -0,0 +1,99 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2020 Alberto Romei + * + * 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 "preprocesswb.h" +#include "eventmapper.h" + +#include "guiutils.h" +#include "options.h" + +#include "../rtengine/procparams.h" + +using namespace rtengine; +using namespace rtengine::procparams; + +const Glib::ustring PreprocessWB::TOOL_NAME = "preprocesswb"; + +PreprocessWB::PreprocessWB() : + FoldableToolPanel(this, TOOL_NAME, M("TP_PREPROCWB_LABEL")), + evPreprocessWBMode(ProcEventMapper::getInstance()->newEvent(FIRST, "HISTORY_MSG_PREPROCWB_MODE")), + mode(Gtk::manage(new MyComboBoxText())) +{ + Gtk::Box *hb = Gtk::manage(new Gtk::Box()); + hb->pack_start(*Gtk::manage(new Gtk::Label(M("TP_PREPROCWB_MODE") + ": ")), Gtk::PACK_SHRINK, 0); + + mode->append(M("TP_PREPROCWB_MODE_CAMERA")); + mode->append(M("TP_PREPROCWB_MODE_AUTO")); + + hb->pack_start(*mode); + + mode->set_active(0); + mode->signal_changed().connect(sigc::mem_fun(*this, &PreprocessWB::modeChanged)); + + mode->show(); + + pack_start(*hb, Gtk::PACK_SHRINK, 4); +} + +void PreprocessWB::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener(); + + mode->set_active(int(pp->raw.preprocessWB.mode)); + + enableListener(); +} + +void PreprocessWB::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + if (mode->get_active_row_number() != 2) { + pp->raw.preprocessWB.mode = RAWParams::PreprocessWB::Mode(mode->get_active_row_number()); + } + + if (pedited) { + pedited->raw.preprocessWB.mode = mode->get_active_row_number() != 2; // UNCHANGED entry, see setBatchMode + } + +} + +void PreprocessWB::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + + if (batchMode) { + mode->append(M("GENERAL_UNCHANGED")); + mode->set_active_text(M("GENERAL_UNCHANGED")); + } +} + +void PreprocessWB::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ +} + +void PreprocessWB::trimValues(rtengine::procparams::ProcParams* pp) +{ +} + +void PreprocessWB::modeChanged() +{ + if (listener) { + listener->panelChanged(evPreprocessWBMode, mode->get_active_text()); + } +} diff --git a/rtgui/preprocesswb.h b/rtgui/preprocesswb.h new file mode 100644 index 000000000..08e1dc468 --- /dev/null +++ b/rtgui/preprocesswb.h @@ -0,0 +1,48 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2020 Alberto Romei + * + * 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 PreprocessWB final: + public ToolParamBlock, + public FoldableToolPanel +{ + +private: + const rtengine::ProcEvent evPreprocessWBMode; + + MyComboBoxText* mode; + +public: + static const Glib::ustring TOOL_NAME; + + PreprocessWB(); + + 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 add); + void trimValues(rtengine::procparams::ProcParams* pp) override; + void modeChanged(); +}; diff --git a/rtgui/previewhandler.cc b/rtgui/previewhandler.cc index 1dad0676e..76def26b4 100644 --- a/rtgui/previewhandler.cc +++ b/rtgui/previewhandler.cc @@ -110,7 +110,7 @@ void PreviewHandler::delImage(IImage8* i) oldImg->getMutex().unlock(); } - i->free(); + delete i; pih->phandler->previewImgMutex.lock(); pih->phandler->previewImg.clear(); pih->phandler->previewImgMutex.unlock(); diff --git a/rtgui/previewhandler.h b/rtgui/previewhandler.h index d9c91f6ad..4fd9a1e82 100644 --- a/rtgui/previewhandler.h +++ b/rtgui/previewhandler.h @@ -44,7 +44,7 @@ struct PreviewHandlerIdleHelper { int pending; }; -class PreviewHandler : public rtengine::PreviewImageListener, public rtengine::NonCopyable +class PreviewHandler final : public rtengine::PreviewImageListener, public rtengine::NonCopyable { private: friend int setImageUI (void* data); diff --git a/rtgui/previewloader.h b/rtgui/previewloader.h index 9a74ee2eb..a8032fcaf 100644 --- a/rtgui/previewloader.h +++ b/rtgui/previewloader.h @@ -20,10 +20,15 @@ #include -#include - #include "../rtengine/noncopyable.h" +namespace Glib +{ + +class ustring; + +} + class FileBrowserEntry; class PreviewLoaderListener diff --git a/rtgui/previewmodepanel.cc b/rtgui/previewmodepanel.cc index 37b3f6468..586923173 100644 --- a/rtgui/previewmodepanel.cc +++ b/rtgui/previewmodepanel.cc @@ -105,7 +105,7 @@ PreviewModePanel::PreviewModePanel (ImageArea* ia) : imageArea(ia) pack_start (*backColor3, Gtk::PACK_SHRINK, 0); pack_start (*backColor2, Gtk::PACK_SHRINK, 0); - pack_start (*Gtk::manage (new Gtk::VSeparator ()), Gtk::PACK_SHRINK, 2); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK, 2); pack_start (*previewR, Gtk::PACK_SHRINK, 0); pack_start (*previewG, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/previewmodepanel.h b/rtgui/previewmodepanel.h index 4121dfb92..d475fd4a4 100644 --- a/rtgui/previewmodepanel.h +++ b/rtgui/previewmodepanel.h @@ -22,7 +22,7 @@ class ImageArea; class PreviewModePanel : - public Gtk::HBox + public Gtk::Box { protected: diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 67fa87e0c..90d0a7b4b 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -93,10 +93,10 @@ void PreviewWindow::updatePreviewImage () rtengine::procparams::CropParams cparams = previewHandler->getCropParams(); switch (options.cropGuides) { case Options::CROP_GUIDE_NONE: - cparams.guide = "None"; + cparams.guide = rtengine::procparams::CropParams::Guide::NONE; break; case Options::CROP_GUIDE_FRAME: - cparams.guide = "Frame"; + cparams.guide = rtengine::procparams::CropParams::Guide::FRAME; break; default: break; diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index 4c8e30e44..8ce9055d0 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -56,7 +56,7 @@ ProfilePanel::ProfilePanel () : storedPProfile(nullptr), lastSavedPSE(nullptr), fillMode->set_active(options.filledProfile); fillMode->add( options.filledProfile ? *profileFillModeOnImage : *profileFillModeOffImage ); fillMode->signal_toggled().connect ( sigc::mem_fun(*this, &ProfilePanel::profileFillModeToggled) ); - fillMode->set_tooltip_text(M("PROFILEPANEL_MODE_TIP")); + fillMode->set_tooltip_text(M("PROFILEPANEL_MODE_TOOLTIP")); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 fillMode->set_margin_right(2); @@ -273,11 +273,21 @@ void ProfilePanel::restoreValue () void ProfilePanel::save_clicked (GdkEventButton* event) { - if (event->button != 1) { return; } + const PartialProfile* toSave; + + if (isCustomSelected()) { + toSave = custom; + } else if (isLastSavedSelected()) { + toSave = lastsaved; + } else { + const auto entry = profiles->getSelectedEntry(); + toSave = entry ? ProfileStore::getInstance()->getProfile(entry) : nullptr; + } + // If it's a partial profile, it's more intuitive to first allow the user // to choose which parameters to save before showing the Save As dialog // #5491 @@ -288,6 +298,7 @@ void ProfilePanel::save_clicked (GdkEventButton* event) } partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); + partialProfileDlg->updateSpotWidget(toSave->pparams); const auto response = partialProfileDlg->run(); partialProfileDlg->hide(); @@ -342,23 +353,13 @@ void ProfilePanel::save_clicked (GdkEventButton* event) lastFilename = Glib::path_get_basename(fname); - const PartialProfile* toSave; - - if (isCustomSelected()) { - toSave = custom; - } else if (isLastSavedSelected()) { - toSave = lastsaved; - } else { - const auto entry = profiles->getSelectedEntry(); - toSave = entry ? ProfileStore::getInstance()->getProfile(entry) : nullptr; - } - if (toSave) { int retCode; + if (isPartial) { // Build partial profile PartialProfile ppTemp(true); - partialProfileDlg->applyPaste(ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); + partialProfileDlg->applyPaste(ppTemp.pparams, ppTemp.pedited, toSave->pparams, nullptr); // Save partial profile retCode = ppTemp.pparams->save(fname, "", true, ppTemp.pedited); // Cleanup @@ -410,6 +411,7 @@ void ProfilePanel::copy_clicked (GdkEventButton* event) partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); } partialProfileDlg->set_title(M("PROFILEPANEL_COPYPPASTE")); + partialProfileDlg->updateSpotWidget(toSave->pparams); int i = partialProfileDlg->run(); partialProfileDlg->hide(); @@ -473,20 +475,7 @@ void ProfilePanel::load_clicked (GdkEventButton* event) if (result == Gtk::RESPONSE_OK) { Glib::ustring fname = dialog.get_filename(); - - if (event->state & Gdk::CONTROL_MASK) { - // opening the partial paste dialog window - if(!partialProfileDlg) { - partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); - } - partialProfileDlg->set_title(M("PROFILEPANEL_LOADPPASTE")); - int i = partialProfileDlg->run(); - partialProfileDlg->hide(); - - if (i != Gtk::RESPONSE_OK) { - return; - } - } + printf("fname=%s\n", fname.c_str()); bool customCreated = false; @@ -502,6 +491,15 @@ void ProfilePanel::load_clicked (GdkEventButton* event) if (!err) { if (!customCreated && fillMode->get_active()) { custom->pparams->setDefaults(); + + // Clearing all LocallabSpotEdited to be compliant with default pparams + custom->pedited->locallab.spots.clear(); + } + + // For each Locallab spot, loaded profile pp only contains activated tools params + // Missing tool params in pe shall be also set to true to avoid a "spot merge" issue + for (int i = 0; i < (int)pe.locallab.spots.size(); i++) { + pe.locallab.spots.at(i).set(true); } custom->set(true); @@ -521,6 +519,17 @@ void ProfilePanel::load_clicked (GdkEventButton* event) if(!partialProfileDlg) { partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); } + + // opening the partial paste dialog window + partialProfileDlg->set_title(M("PROFILEPANEL_LOADPPASTE")); + partialProfileDlg->updateSpotWidget(&pp); + int i = partialProfileDlg->run(); + partialProfileDlg->hide(); + + if (i != Gtk::RESPONSE_OK) { + return; + } + partialProfileDlg->applyPaste (custom->pparams, !fillMode->get_active() ? custom->pedited : nullptr, &pp, &pe); } else { // custom.pparams = loadedFile.pparams filtered by ( loadedFile.pedited ) @@ -528,6 +537,9 @@ void ProfilePanel::load_clicked (GdkEventButton* event) if (!fillMode->get_active()) { *custom->pedited = pe; + } else { + // Resize custom->pedited to be compliant with pe spot size + custom->pedited->locallab.spots.resize(pe.locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); } } @@ -557,32 +569,27 @@ void ProfilePanel::paste_clicked (GdkEventButton* event) return; } - if (event->state & Gdk::CONTROL_MASK) { - if(!partialProfileDlg) { - partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); - } - partialProfileDlg->set_title(M("PROFILEPANEL_PASTEPPASTE")); - int i = partialProfileDlg->run(); - partialProfileDlg->hide(); - - if (i != Gtk::RESPONSE_OK) { - return; - } - } - bool prevState = changeconn.block(true); if (!custom) { - custom = new PartialProfile (true); + custom = new PartialProfile (true); // custom pedited is initialized to false if (isLastSavedSelected()) { *custom->pparams = *lastsaved->pparams; + + // Setting LocallabSpotEdited number coherent with spots number in lastsaved->pparams + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(custom->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(false)); } else { const ProfileStoreEntry* entry = profiles->getSelectedEntry(); if (entry) { const PartialProfile* partProfile = ProfileStore::getInstance()->getProfile (entry); *custom->pparams = *partProfile->pparams; + + // Setting LocallabSpotEdited number coherent with spots number in partProfile->pparams + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(custom->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(false)); } } @@ -591,15 +598,26 @@ void ProfilePanel::paste_clicked (GdkEventButton* event) } else { if (fillMode->get_active()) { custom->pparams->setDefaults(); + + // Clear all LocallabSpotEdited to be compliant with default pparams + custom->pedited->locallab.spots.clear(); } else if (!isCustomSelected ()) { if (isLastSavedSelected()) { *custom->pparams = *lastsaved->pparams; + + // Setting LocallabSpotEdited number coherent with spots number in lastsaved->pparams + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(custom->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); } else { const ProfileStoreEntry* entry = profiles->getSelectedEntry(); if (entry) { const PartialProfile* partProfile = ProfileStore::getInstance()->getProfile (entry); *custom->pparams = *partProfile->pparams; + + // Setting LocallabSpotEdited number coherent with spots number in partProfile->pparams + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(custom->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); } } } @@ -626,6 +644,16 @@ void ProfilePanel::paste_clicked (GdkEventButton* event) if(!partialProfileDlg) { partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); } + + partialProfileDlg->set_title(M("PROFILEPANEL_PASTEPPASTE")); + partialProfileDlg->updateSpotWidget(&pp); + int i = partialProfileDlg->run(); + partialProfileDlg->hide(); + + if (i != Gtk::RESPONSE_OK) { + return; + } + partialProfileDlg->applyPaste (custom->pparams, !fillMode->get_active() ? custom->pedited : nullptr, &pp, &pe); } else { // custom.pparams = clipboard.pparams filtered by ( clipboard.pedited ) @@ -633,6 +661,10 @@ void ProfilePanel::paste_clicked (GdkEventButton* event) if (!fillMode->get_active()) { *custom->pedited = pe; + } else { + // Setting LocallabSpotEdited number coherent with spots number in custom->pparams + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(custom->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); } } } else { @@ -642,10 +674,28 @@ void ProfilePanel::paste_clicked (GdkEventButton* event) if(!partialProfileDlg) { partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); } + + partialProfileDlg->set_title(M("PROFILEPANEL_PASTEPPASTE")); + partialProfileDlg->updateSpotWidget(&pp); + int i = partialProfileDlg->run(); + partialProfileDlg->hide(); + + if (i != Gtk::RESPONSE_OK) { + return; + } + partialProfileDlg->applyPaste (custom->pparams, nullptr, &pp, nullptr); + + // Setting LocallabSpotEdited number coherent with spots number in custom->pparams + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(custom->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); } else { // custom.pparams = clipboard.pparams non filtered *custom->pparams = pp; + + // Setting LocallabSpotEdited number coherent with spots number in custom->pparams + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(custom->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); } } @@ -693,6 +743,10 @@ void ProfilePanel::selection_changed () if (s) { if (fillMode->get_active() && s->pedited) { ParamsEdited pe(true); + + // Setting LocallabSpotEdited number coherent with spots number in s->pparams + pe.locallab.spots.resize(s->pparams->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); + PartialProfile s2(s->pparams, &pe, false); changeTo (&s2, pse->label + "+"); } else { @@ -731,6 +785,10 @@ void ProfilePanel::procParamsChanged( } *custom->pparams = *p; + + // Setting LocallabSpotEdited number coherent with spots number in p + custom->pedited->locallab.spots.clear(); + custom->pedited->locallab.spots.resize(p->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); } void ProfilePanel::clearParamChanges() @@ -766,6 +824,8 @@ void ProfilePanel::initProfile (const Glib::ustring& profileFullPath, ProcParams if (lastSaved) { ParamsEdited* pe = new ParamsEdited(true); + // Setting LocallabSpotEdited number coherent with lastSaved->locallab spots number (initialized at true such as pe) + pe->locallab.spots.resize(lastSaved->locallab.spots.size(), LocallabParamsEdited::LocallabSpotEdited(true)); // copying the provided last saved profile to ProfilePanel::lastsaved lastsaved = new PartialProfile(lastSaved, pe); } diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index b3c968682..c3a125c49 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -49,7 +49,7 @@ class PartialProfile; } class RTImage; -class ProfilePanel : +class ProfilePanel final : public Gtk::Grid, public PParamsChangeListener, public ProfileStoreListener, diff --git a/rtgui/profilestorecombobox.cc b/rtgui/profilestorecombobox.cc index bb294189f..a6085e7a9 100644 --- a/rtgui/profilestorecombobox.cc +++ b/rtgui/profilestorecombobox.cc @@ -182,7 +182,7 @@ Gtk::TreeIter ProfileStoreComboBox::findRowFromEntry (const ProfileStoreEntry *p Gtk::TreeIter ProfileStoreComboBox::findRowFromFullPath_ (Gtk::TreeModel::Children childs, int parentFolderId, const Glib::ustring &name) const { - for (const auto iter : childs) { + for (const auto& iter : childs) { const Gtk::TreeModel::Row row = *iter; // Hombre: is there a smarter way of knowing if this row has childs? const ProfileStoreEntry *pse = row[methodColumns.profileStoreEntry]; @@ -309,7 +309,7 @@ Gtk::TreeIter ProfileStoreComboBox::getRowFromLabel (const Glib::ustring &name) const Gtk::TreeModel::Children childs = refTreeModel->children(); if (!name.empty()) { - for (const auto iter : childs) { + for (const auto& iter : childs) { const Gtk::TreeModel::Row currRow = *iter; const ProfileStoreEntry *pse = currRow[methodColumns.profileStoreEntry]; diff --git a/rtgui/progressconnector.h b/rtgui/progressconnector.h index f4d1d8f7e..90c9f67f0 100644 --- a/rtgui/progressconnector.h +++ b/rtgui/progressconnector.h @@ -28,7 +28,7 @@ #undef THREAD_PRIORITY_NORMAL -class PLDBridge : +class PLDBridge final : public rtengine::ProgressListener { public: diff --git a/rtgui/prsharpening.cc b/rtgui/prsharpening.cc index d065dbc07..d3c936fa2 100644 --- a/rtgui/prsharpening.cc +++ b/rtgui/prsharpening.cc @@ -23,7 +23,9 @@ using namespace rtengine; using namespace rtengine::procparams; -PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PRSHARPENING_LABEL"), false, true) +const Glib::ustring PrSharpening::TOOL_NAME = "prsharpening"; + +PrSharpening::PrSharpening () : FoldableToolPanel(this, TOOL_NAME, M("TP_PRSHARPENING_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); @@ -35,7 +37,7 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR //setEnabledTooltipMarkup(M("TP_PRSHARPENING_TOOLTIP")); - Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb = Gtk::manage (new Gtk::Box ()); hb->show (); contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 15)); contrast->setAdjusterListener (this); @@ -52,7 +54,7 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR hb->pack_start(*method); pack_start (*hb); - rld = new Gtk::VBox (); + rld = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.45)); 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)); @@ -67,10 +69,10 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR diter->show (); rld->show (); - usm = new Gtk::VBox (); + usm = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); usm->show (); - Gtk::HSeparator *hsep6a = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* hsep6a = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); amount = Gtk::manage (new Adjuster (M("TP_SHARPENING_AMOUNT"), 1, 1000, 1, 200)); radius = Gtk::manage (new Adjuster (M("TP_SHARPENING_RADIUS"), 0.3, 3, 0.01, 0.5)); threshold = Gtk::manage (new ThresholdAdjuster (M("TP_SHARPENING_THRESHOLD"), 0., 2000., 20., 80., 2000., 1200., 0, false)); @@ -88,10 +90,10 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR amount->show (); threshold->show (); - Gtk::HSeparator *hsep6 = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* hsep6 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); edgesonly = Gtk::manage (new Gtk::CheckButton (M("TP_SHARPENING_ONLYEDGES"))); edgesonly->set_active (false); - edgebox = new Gtk::VBox (); + edgebox = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); eradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.5, 2.5, 0.1, 1.9)); etolerance = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDTOLERANCE"), 10, 10000, 100, 1800)); usm->pack_start(*hsep6, Gtk::PACK_SHRINK, 2); @@ -99,7 +101,7 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR edgebox->pack_start(*eradius); edgebox->pack_start(*etolerance); edgebox->show (); - edgebin = Gtk::manage (new Gtk::VBox ()); + edgebin = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); usm->pack_start (*edgebin); edgebin->show (); hsep6->show(); @@ -107,16 +109,16 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR eradius->show(); etolerance->show(); - Gtk::HSeparator *hsep6b = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* hsep6b = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); halocontrol = Gtk::manage (new Gtk::CheckButton (M("TP_SHARPENING_HALOCONTROL"))); halocontrol->set_active (false); - hcbox = new Gtk::VBox (); + hcbox = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); hcamount = Gtk::manage (new Adjuster (M("TP_SHARPENING_HCAMOUNT"), 1, 100, 1, 75)); usm->pack_start(*hsep6b, Gtk::PACK_SHRINK, 2); usm->pack_start(*halocontrol); hcbox->pack_start(*hcamount); hcbox->show (); - hcbin = Gtk::manage (new Gtk::VBox ()); + hcbin = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); usm->pack_start (*hcbin); hcbin->show (); hsep6b->show (); diff --git a/rtgui/prsharpening.h b/rtgui/prsharpening.h index 9738a5cd4..ea22234f8 100644 --- a/rtgui/prsharpening.h +++ b/rtgui/prsharpening.h @@ -38,18 +38,18 @@ protected: Adjuster* damount; Adjuster* ddamping; Adjuster* diter; - Gtk::VBox* usm; - Gtk::VBox* rld; + Gtk::Box* usm; + Gtk::Box* rld; Adjuster* radius; Adjuster* amount; Adjuster* eradius; Adjuster* etolerance; Adjuster* hcamount; - Gtk::VBox* edgebin; - Gtk::VBox* hcbin; - Gtk::VBox* edgebox; - Gtk::VBox* hcbox; + Gtk::Box* edgebin; + Gtk::Box* hcbin; + Gtk::Box* edgebox; + Gtk::Box* hcbox; ThresholdAdjuster* threshold; Gtk::CheckButton* edgesonly; bool lastEdgesOnly; @@ -59,6 +59,7 @@ protected: sigc::connection hcConn; rtengine::ProcEvent EvPrShrContrast; public: + static const Glib::ustring TOOL_NAME; PrSharpening (); ~PrSharpening () override; diff --git a/rtgui/rawcacorrection.cc b/rtgui/rawcacorrection.cc index 9e5c592ef..473ca2ed3 100644 --- a/rtgui/rawcacorrection.cc +++ b/rtgui/rawcacorrection.cc @@ -28,7 +28,9 @@ using namespace rtengine; using namespace rtengine::procparams; -RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_RAWCACORR_LABEL")) +const Glib::ustring RAWCACorr::TOOL_NAME = "rawcacorrection"; + +RAWCACorr::RAWCACorr () : FoldableToolPanel(this, TOOL_NAME, M("TP_RAWCACORR_LABEL")) { auto m = ProcEventMapper::getInstance(); EvPreProcessCAAutoiterations = m->newEvent(DARKFRAME, "HISTORY_MSG_RAWCACORR_AUTOIT"); @@ -47,24 +49,18 @@ RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_RAWCA caAutoiterations->setAdjusterListener (this); caAutoiterations->set_tooltip_markup(M("TP_RAWCACORR_AUTOIT_TOOLTIP")); - if (caAutoiterations->delay < options.adjusterMaxDelay) { - caAutoiterations->delay = options.adjusterMaxDelay; - } + caAutoiterations->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); caRed = Gtk::manage(new Adjuster (M("TP_RAWCACORR_CARED"), -4.0, 4.0, 0.1, 0, icaredL, icaredR)); caRed->setAdjusterListener (this); - if (caRed->delay < options.adjusterMaxDelay) { - caRed->delay = options.adjusterMaxDelay; - } + caRed->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); caRed->show(); 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) { - caBlue->delay = options.adjusterMaxDelay; - } + caBlue->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); caBlue->show(); diff --git a/rtgui/rawcacorrection.h b/rtgui/rawcacorrection.h index 3c95602a7..88b65528e 100644 --- a/rtgui/rawcacorrection.h +++ b/rtgui/rawcacorrection.h @@ -43,6 +43,7 @@ protected: rtengine::ProcEvent EvPreProcessCAColourshiftHistory; public: + static const Glib::ustring TOOL_NAME; RAWCACorr (); diff --git a/rtgui/rawexposure.cc b/rtgui/rawexposure.cc index 7548bf4be..778283b75 100644 --- a/rtgui/rawexposure.cc +++ b/rtgui/rawexposure.cc @@ -28,14 +28,14 @@ using namespace rtengine; using namespace rtengine::procparams; -RAWExposure::RAWExposure () : FoldableToolPanel(this, "rawexposure", M("TP_EXPOS_WHITEPOINT_LABEL")) +const Glib::ustring RAWExposure::TOOL_NAME = "rawexposure"; + +RAWExposure::RAWExposure () : FoldableToolPanel(this, TOOL_NAME, M("TP_EXPOS_WHITEPOINT_LABEL")) { PexPos = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_LINEAR"), 0.1, 16.0, 0.01, 1)); PexPos->setAdjusterListener (this); - if (PexPos->delay < options.adjusterMaxDelay) { - PexPos->delay = options.adjusterMaxDelay; - } + PexPos->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexPos->show(); pack_start( *PexPos, Gtk::PACK_SHRINK, 4);//exposi diff --git a/rtgui/rawexposure.h b/rtgui/rawexposure.h index 33c897113..ca839d230 100644 --- a/rtgui/rawexposure.h +++ b/rtgui/rawexposure.h @@ -33,6 +33,7 @@ protected: Adjuster* PexPos; public: + static const Glib::ustring TOOL_NAME; RAWExposure (); diff --git a/rtgui/recentbrowser.cc b/rtgui/recentbrowser.cc index fca97cafa..9d3cc1f12 100644 --- a/rtgui/recentbrowser.cc +++ b/rtgui/recentbrowser.cc @@ -24,10 +24,12 @@ using namespace rtengine; RecentBrowser::RecentBrowser () { - + set_orientation(Gtk::ORIENTATION_VERTICAL); + recentDirs = Gtk::manage (new MyComboBoxText ()); Gtk::Frame* frame = Gtk::manage (new Gtk::Frame (M("MAIN_FRAME_RECENT"))); + frame->set_label_align(0.025, 0.5); frame->add (*recentDirs); for(size_t i = 0; i < options.recentFolders.size(); i++) { diff --git a/rtgui/recentbrowser.h b/rtgui/recentbrowser.h index bc8374087..68b3359b2 100644 --- a/rtgui/recentbrowser.h +++ b/rtgui/recentbrowser.h @@ -23,7 +23,7 @@ #include "guiutils.h" class RecentBrowser : - public Gtk::VBox + public Gtk::Box { public: typedef sigc::slot DirSelectionSlot; diff --git a/rtgui/renamedlg.cc b/rtgui/renamedlg.cc index 8908d3419..e35c6268d 100644 --- a/rtgui/renamedlg.cc +++ b/rtgui/renamedlg.cc @@ -25,21 +25,26 @@ RenameDialog::RenameDialog (Gtk::Window* parent) : Gtk::Dialog (M("FILEBROWSER_RENAMEDLGLABEL"), *parent, true), p(parent), imageData(nullptr) { - Gtk::Table* names = Gtk::manage (new Gtk::Table (2, 2)); + Gtk::Grid* names = Gtk::manage (new Gtk::Grid()); Gtk::Label* onlab = Gtk::manage (new Gtk::Label (M("FILEBROWSER_CURRENT_NAME"))); + onlab->set_halign(Gtk::ALIGN_START); Gtk::Label* nnlab = Gtk::manage (new Gtk::Label (M("FILEBROWSER_NEW_NAME"))); - oldName = Gtk::manage (new Gtk::Label ("alma")); - newName = Gtk::manage (new Gtk::Entry ()); - - names->attach (*onlab, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 2, 2); - names->attach (*oldName, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); - names->attach (*nnlab, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 2, 2); - names->attach (*newName, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + nnlab->set_halign(Gtk::ALIGN_START); + oldName = Gtk::manage (new Gtk::Label("alma")); + oldName->set_halign(Gtk::ALIGN_START); + newName = Gtk::manage (new Gtk::Entry()); + newName->set_hexpand(); + newName->set_halign(Gtk::ALIGN_FILL); + + names->attach(*onlab, 0, 0, 1, 1); + names->attach(*oldName, 1, 0, 1, 1); + names->attach(*nnlab, 0, 1, 1, 1); + names->attach(*newName, 1, 1, 1, 1); get_content_area()->pack_start (*names, Gtk::PACK_SHRINK, 4); // Issue 316 -// Gtk::HBox* tbox = Gtk::manage (new Gtk::HBox()); +// Gtk::Box* tbox = Gtk::manage (new Gtk::Box()); // useTmpl = Gtk::manage (new Gtk::CheckButton (M("FILEBROWSER_USETEMPLATE"))); // templates = Gtk::manage (new MyComboBox ()); // templateModel = Gtk::ListStore::create (templateColumns); @@ -51,8 +56,8 @@ RenameDialog::RenameDialog (Gtk::Window* parent) // get_content_area()->pack_start (*tbox, Gtk::PACK_SHRINK, 4); - add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); - add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + add_button ("_OK", Gtk::RESPONSE_OK); + add_button ("_Cancel", Gtk::RESPONSE_CANCEL); // Issue 316 // all = add_button ("All", RESPONSE_ALL); diff --git a/rtgui/renamedlg.h b/rtgui/renamedlg.h index f9447fbac..3c92965f8 100644 --- a/rtgui/renamedlg.h +++ b/rtgui/renamedlg.h @@ -26,7 +26,7 @@ class CacheImageData; -class RenameDialog : +class RenameDialog final : public Gtk::Dialog { diff --git a/rtgui/resize.cc b/rtgui/resize.cc index a65875426..de9f6b4d1 100644 --- a/rtgui/resize.cc +++ b/rtgui/resize.cc @@ -29,45 +29,61 @@ using namespace rtengine; using namespace rtengine::procparams; -Resize::Resize () : FoldableToolPanel(this, "resize", M("TP_RESIZE_LABEL"), false, true), maxw(100000), maxh(100000) +const Glib::ustring Resize::TOOL_NAME = "resize"; + +Resize::Resize () : FoldableToolPanel(this, TOOL_NAME, M("TP_RESIZE_LABEL"), false, true), maxw(100000), maxh(100000) { auto m = ProcEventMapper::getInstance(); EvResizeAllowUpscaling = m->newEvent(RESIZE, "HISTORY_MSG_RESIZE_ALLOWUPSCALING"); + EvResizeLongedge = m->newEvent (RESIZE, "HISTORY_MSG_RESIZE_LONGEDGE"); + EvResizeShortedge = m->newEvent (RESIZE, "HISTORY_MSG_RESIZE_SHORTEDGE"); cropw = 0; croph = 0; - Gtk::Table* combos = Gtk::manage (new Gtk::Table (2, 2)); + Gtk::Grid* combos = Gtk::manage (new Gtk::Grid()); + combos->set_row_spacing(4); appliesTo = Gtk::manage (new MyComboBoxText ()); appliesTo->append (M("TP_RESIZE_CROPPEDAREA")); appliesTo->append (M("TP_RESIZE_FULLIMAGE")); appliesTo->set_active (0); + appliesTo->set_hexpand(); + appliesTo->set_halign(Gtk::ALIGN_FILL); Gtk::Label *label = Gtk::manage (new Gtk::Label (M("TP_RESIZE_APPLIESTO"), Gtk::ALIGN_START)); - combos->attach (*label, 0, 1, 0, 1, Gtk::SHRINK | Gtk::FILL, Gtk::SHRINK, 2, 2); - combos->attach (*appliesTo, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + + combos->attach(*label, 0, 0, 1, 1); + combos->attach(*appliesTo, 1, 0, 1, 1); // See Resize::methodChanged() when adding a new method. method = Gtk::manage (new MyComboBoxText ()); method->append (M("TP_RESIZE_LANCZOS")); method->append (M("TP_RESIZE_NEAREST")); method->set_active (0); + method->set_hexpand(); + method->set_halign(Gtk::ALIGN_FILL); label = Gtk::manage (new Gtk::Label (M("TP_RESIZE_METHOD"), Gtk::ALIGN_START)); - combos->attach (*label, 0, 1, 1, 2, Gtk::SHRINK | Gtk::FILL, Gtk::SHRINK, 2, 2); - combos->attach (*method, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + + combos->attach(*label, 0, 1, 1, 1); + combos->attach(*method, 1, 1, 1, 1); spec = Gtk::manage (new MyComboBoxText ()); spec->append (M("TP_RESIZE_SCALE")); spec->append (M("TP_RESIZE_WIDTH")); spec->append (M("TP_RESIZE_HEIGHT")); spec->append (M("TP_RESIZE_FITBOX")); + spec->append (M("TP_RESIZE_LONG")); + spec->append (M("TP_RESIZE_SHORT")); spec->set_active (0); + spec->set_hexpand(); + spec->set_halign(Gtk::ALIGN_FILL); label = Gtk::manage (new Gtk::Label (M("TP_RESIZE_SPECIFY"), Gtk::ALIGN_START)); - combos->attach (*label, 0, 1, 2, 3, Gtk::SHRINK | Gtk::FILL, Gtk::SHRINK, 2, 2); - combos->attach (*spec, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 2, 2); + + combos->attach(*label, 0, 2, 1, 1); + combos->attach(*spec, 1, 2, 1, 1); pack_start (*combos, Gtk::PACK_SHRINK, 4); @@ -76,24 +92,51 @@ Resize::Resize () : FoldableToolPanel(this, "resize", M("TP_RESIZE_LABEL"), fals pack_start (*scale, Gtk::PACK_SHRINK, 4); - sizeBox = Gtk::manage (new Gtk::VBox ()); + sizeBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - Gtk::HBox* sbox = Gtk::manage (new Gtk::HBox ()); - Gtk::HBox* wbox = Gtk::manage (new Gtk::HBox ()); - Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* sbox = Gtk::manage (new Gtk::Box ()); + Gtk::Box* wbox = Gtk::manage (new Gtk::Box ()); + Gtk::Box* hbox = Gtk::manage (new Gtk::Box ()); + Gtk::Box* ebox = Gtk::manage (new Gtk::Box ()); + Gtk::Box* lebox = Gtk::manage (new Gtk::Box ()); + Gtk::Box* sebox = Gtk::manage (new Gtk::Box ()); + w = Gtk::manage (new MySpinButton ()); + w->set_width_chars(5); + setExpandAlignProperties(w, false, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); h = Gtk::manage (new MySpinButton ()); - wbox->set_spacing(3); + h->set_width_chars(5); + setExpandAlignProperties(h, false, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + le = Gtk::manage (new MySpinButton ()); + le->set_width_chars(5); + setExpandAlignProperties(le, false, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + se = Gtk::manage (new MySpinButton ()); + se->set_width_chars(5); + setExpandAlignProperties(se, false, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + wbox->pack_start (*Gtk::manage (new Gtk::Label (M("TP_RESIZE_W"))), Gtk::PACK_SHRINK, 0); wbox->pack_start (*w); hbox->set_spacing(3); hbox->pack_start (*Gtk::manage (new Gtk::Label (M("TP_RESIZE_H"))), Gtk::PACK_SHRINK, 0); hbox->pack_start (*h); + lebox->set_spacing(3); + lebox->pack_start (*Gtk::manage (new Gtk::Label (M("TP_RESIZE_LE"))), Gtk::PACK_SHRINK, 0); + lebox->pack_start (*le); + sebox->set_spacing(3); + sebox->pack_start (*Gtk::manage (new Gtk::Label (M("TP_RESIZE_SE"))), Gtk::PACK_SHRINK, 0); + sebox->pack_start (*se); + sbox->set_spacing(4); sbox->pack_start (*wbox); sbox->pack_start (*hbox); - + sbox->set_homogeneous(); + ebox->set_spacing(4); + ebox->pack_start (*lebox); + ebox->pack_start (*sebox); + ebox->set_homogeneous(); + sizeBox->pack_start (*sbox, Gtk::PACK_SHRINK, 0); + sizeBox->pack_start (*ebox, Gtk::PACK_SHRINK, 0); sizeBox->show_all (); sizeBox->reference (); @@ -103,24 +146,34 @@ Resize::Resize () : FoldableToolPanel(this, "resize", M("TP_RESIZE_LABEL"), fals w->set_digits (0); w->set_increments (1, 100); - w->set_value (800); w->set_range (32, MAX_SCALE * maxw); + w->set_value (800); // Doesn't seem to have any effect (overwritten in Resize::read) h->set_digits (0); h->set_increments (1, 100); - h->set_value (600); h->set_range (32, MAX_SCALE * maxh); + h->set_value (600); // Doesn't seem to have any effect (overwritten in Resize::read) + + le->set_digits (0); + le->set_increments (1, 100); + le->set_range (32, MAX_SCALE * maxw); + le->set_value (900); + + se->set_digits (0); + se->set_increments (1, 100); + se->set_range (32, MAX_SCALE * maxh); + se->set_value (900); 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); + leconn = le->signal_value_changed().connect ( sigc::mem_fun(*this, &Resize::entryLEChanged), true); + seconn = se->signal_value_changed().connect ( sigc::mem_fun(*this, &Resize::entrySEChanged), true); aconn = appliesTo->signal_changed().connect ( sigc::mem_fun(*this, &Resize::appliesToChanged) ); method->signal_changed().connect ( sigc::mem_fun(*this, &Resize::methodChanged) ); sconn = spec->signal_changed().connect ( sigc::mem_fun(*this, &Resize::specChanged) ); - packBox = Gtk::manage (new ToolParamBlock ()); - pack_end (*packBox); - packBox->hide(); - packBox->set_tooltip_markup (M("TP_PRSHARPENING_TOOLTIP")); + getSubToolsContainer()->hide(); + getSubToolsContainer()->set_tooltip_markup (M("TP_PRSHARPENING_TOOLTIP")); show_all(); } @@ -139,15 +192,20 @@ void Resize::read (const ProcParams* pp, const ParamsEdited* pedited) aconn.block (true); wconn.block (true); hconn.block (true); + leconn.block (true); + seconn.block (true); sconn.block (true); scale->block(true); scale->setValue (pp->resize.scale); w->set_value (pp->resize.width); h->set_value (pp->resize.height); + le->set_value (pp->resize.longedge); + se->set_value (pp->resize.shortedge); setEnabled (pp->resize.enabled); spec->set_active (pp->resize.dataspec); allowUpscaling->set_active(pp->resize.allowUpscaling); + setDimensions(); // Sets Width/Height in the GUI according to value of Specify after loading a .pp3 profile (same behavior as if changed manually) updateGUI(); appliesTo->set_active (0); @@ -168,10 +226,14 @@ void Resize::read (const ProcParams* pp, const ParamsEdited* pedited) wDirty = false; hDirty = false; + leDirty = false; + seDirty = false; if (pedited) { wDirty = pedited->resize.width; hDirty = pedited->resize.height; + leDirty = pedited->resize.longedge; + seDirty = pedited->resize.shortedge; scale->setEditedState (pedited->resize.scale ? Edited : UnEdited); if (!pedited->resize.appliesTo) { @@ -183,17 +245,21 @@ void Resize::read (const ProcParams* pp, const ParamsEdited* pedited) } if (!pedited->resize.dataspec) { - spec->set_active (4); + spec->set_active (6); } allowUpscaling->set_inconsistent(!pedited->resize.allowUpscaling); set_inconsistent (multiImage && !pedited->resize.enabled); } + setDimensions(); // fixes the issue that values in GUI are not recomputed when loading profile + scale->block(false); sconn.block (false); wconn.block (false); hconn.block (false); + leconn.block (false); + seconn.block (false); aconn.block (false); enableListener (); } @@ -201,7 +267,7 @@ void Resize::read (const ProcParams* pp, const ParamsEdited* pedited) void Resize::write (ProcParams* pp, ParamsEdited* pedited) { int dataSpec = spec->get_active_row_number(); - + pp->resize.scale = scale->getValue(); pp->resize.appliesTo = "Cropped area"; @@ -223,6 +289,8 @@ void Resize::write (ProcParams* pp, ParamsEdited* pedited) pp->resize.dataspec = dataSpec; pp->resize.width = w->get_value_as_int (); pp->resize.height = h->get_value_as_int (); + pp->resize.longedge = le->get_value_as_int (); + pp->resize.shortedge = se->get_value_as_int (); pp->resize.enabled = getEnabled (); //printf(" L:%d H:%d\n", pp->resize.width, pp->resize.height); @@ -230,7 +298,7 @@ void Resize::write (ProcParams* pp, ParamsEdited* pedited) if (pedited) { pedited->resize.enabled = !get_inconsistent(); - pedited->resize.dataspec = dataSpec != MAX_SCALE; + pedited->resize.dataspec = dataSpec != 6; pedited->resize.appliesTo = appliesTo->get_active_row_number() != 2; pedited->resize.method = method->get_active_row_number() != 3; @@ -238,10 +306,14 @@ void Resize::write (ProcParams* pp, ParamsEdited* pedited) pedited->resize.scale = scale->getEditedState (); pedited->resize.width = wDirty; pedited->resize.height = hDirty; + pedited->resize.longedge = leDirty; + pedited->resize.shortedge = seDirty; } else { pedited->resize.scale = false; pedited->resize.width = false; pedited->resize.height = false; + pedited->resize.longedge = false; + pedited->resize.shortedge = false; } pedited->resize.allowUpscaling = !allowUpscaling->get_inconsistent(); } @@ -275,31 +347,31 @@ void Resize::adjusterChanged(Adjuster* a, double newval) } } -int Resize::getComputedWidth() +int Resize::getComputedWidth(double height) { if (cropw && appliesTo->get_active_row_number() == 0) // we use the crop dimensions { - return (int)((double)(cropw) * (h->get_value() / (double)(croph)) + 0.5); + return (int)((double)(cropw) * (height / (double)(croph)) + 0.5); } else // we use the image dimensions { - return (int)((double)(maxw) * (h->get_value() / (double)(maxh)) + 0.5); + return (int)((double)(maxw) * (height / (double)(maxh)) + 0.5); } } -int Resize::getComputedHeight() +int Resize::getComputedHeight(double width) { if (croph && appliesTo->get_active_row_number() == 0) // we use the crop dimensions { - return (int)((double)(croph) * (w->get_value() / (double)(cropw)) + 0.5); + return (int)((double)(croph) * (width / (double)(cropw)) + 0.5); } else // we use the image dimensions { - return (int)((double)(maxh) * (w->get_value() / (double)(maxw)) + 0.5); + return (int)((double)(maxh) * (width / (double)(maxw)) + 0.5); } } @@ -324,9 +396,9 @@ void Resize::methodChanged () // Post-resize Sharpening assumes the image is in Lab space, and currently Lanczos is the only method which uses that space, and Lanczos is on row 0. if (method->get_active_row_number() == 0) { - packBox->set_sensitive(true); + getSubToolsContainer()->set_sensitive(true); } else { - packBox->set_sensitive(false); + getSubToolsContainer()->set_sensitive(false); } } @@ -369,8 +441,10 @@ void Resize::setDimensions () { wconn.block(true); hconn.block(true); + leconn.block(true); + seconn.block(true); scale->block(true); - + int refw, refh; if (appliesTo->get_active_row_number() == 0 && cropw) { @@ -421,6 +495,34 @@ void Resize::setDimensions () break; } + case 4: { + // Long edge mode + if (refw > refh) { + const double tmp_scale = le->get_value() / static_cast(refw); + scale->setValue(tmp_scale); + se->set_value(static_cast(static_cast(static_cast(refh) * tmp_scale + 0.5))); + } else { + const double tmp_scale = le->get_value() / static_cast(refh); + scale->setValue(tmp_scale); + se->set_value(static_cast(static_cast(static_cast(refw) * tmp_scale + 0.5))); + } + break; + } + + case 5: { + // Short edge mode + if (refw > refh) { + const double tmp_scale = se->get_value() / static_cast(refh); + scale->setValue(tmp_scale); + le->set_value(static_cast(static_cast(static_cast(refw) * tmp_scale + 0.5))); + } else { + const double tmp_scale = se->get_value() / static_cast(refw); + scale->setValue(tmp_scale); + le->set_value(static_cast(static_cast(static_cast(refh) * tmp_scale + 0.5))); + } + break; + } + default: { break; } @@ -429,6 +531,8 @@ void Resize::setDimensions () scale->block(false); wconn.block(false); hconn.block(false); + leconn.block(false); + seconn.block(false); return false; } @@ -479,7 +583,7 @@ void Resize::entryWChanged () hconn.block (true); scale->block (true); - h->set_value ((double)(getComputedHeight())); + h->set_value ((double)(getComputedHeight(w->get_value()))); scale->setValue (w->get_value () / (cropw && appliesTo->get_active_row_number() == 0 ? (double)cropw : (double)maxw)); scale->block (false); @@ -512,7 +616,7 @@ void Resize::entryHChanged () wconn.block (true); scale->block (true); - w->set_value ((double)(getComputedWidth())); + w->set_value ((double)(getComputedWidth(h->get_value()))); scale->setValue (h->get_value () / (croph && appliesTo->get_active_row_number() == 0 ? (double)croph : (double)maxh)); scale->block (false); @@ -531,25 +635,107 @@ void Resize::entryHChanged () } } +void Resize::entryLEChanged () +{ + + leDirty = true; + + // updating long edge + if (!batchMode && listener) { + int refw, refh; + + seconn.block (true); + scale->block (true); + + if (cropw && appliesTo->get_active_row_number() == 0) { + // we use the crop dimensions + refw = cropw; + refh = croph; + } else { + // we use the image dimensions + refw = maxw; + refh = maxh; + } + + if (refw > refh) { + se->set_value ((double) (getComputedHeight(le->get_value()))); + scale->setValue (le->get_value () / (cropw && appliesTo->get_active_row_number() == 0 ? (double)cropw : (double)maxw)); + } else { + se->set_value ((double)(getComputedWidth(le->get_value()))); + scale->setValue (le->get_value () / (croph && appliesTo->get_active_row_number() == 0 ? (double)croph : (double)maxh)); + } + + scale->block (false); + seconn.block (false); + } + + if (listener) { + if (getEnabled () || batchMode) { + listener->panelChanged (EvResizeLongedge, Glib::ustring::format (le->get_value_as_int())); + } + } +} + +void Resize::entrySEChanged () +{ + + seDirty = true; + + // updating short edge + if (!batchMode && listener) { + int refw, refh; + + leconn.block (true); + scale->block (true); + + if (cropw && appliesTo->get_active_row_number() == 0) { + // we use the crop dimensions + refw = cropw; + refh = croph; + } else { + // we use the image dimensions + refw = maxw; + refh = maxh; + } + + if (refw > refh) { + le->set_value ((double)(getComputedWidth(se->get_value()))); + scale->setValue (se->get_value () / (croph && appliesTo->get_active_row_number() == 0 ? (double)croph : (double)maxh)); + } else { + le->set_value ((double)(getComputedHeight(se->get_value()))); + scale->setValue (se->get_value () / (cropw && appliesTo->get_active_row_number() == 0 ? (double)cropw : (double)maxw)); + } + + scale->block (false); + leconn.block (false); + } + + if (listener) { + if (getEnabled () || batchMode) { + listener->panelChanged (EvResizeShortedge, Glib::ustring::format (se->get_value_as_int())); + } + } +} + void Resize::specChanged () { switch (spec->get_active_row_number()) { case (0): // Scale mode - scale->sliderChanged (); + scale->sliderChanged(); break; case (1): // Width mode - w->set_value((double)(getComputedWidth())); - entryWChanged (); + w->set_value((double)(getComputedWidth(h->get_value()))); + entryWChanged(); break; case (2): // Height mode - h->set_value((double)(getComputedHeight())); - entryHChanged (); + h->set_value((double)(getComputedHeight(w->get_value()))); + entryHChanged(); break; case (3): @@ -557,6 +743,16 @@ void Resize::specChanged () notifyBBox(); break; + case (4): + // Long edge mode + entryLEChanged(); + break; + + case (5): + // Short edge mode + entrySEChanged(); + break; + default: break; } @@ -583,6 +779,8 @@ void Resize::updateGUI () reorder_child(*allowUpscaling, 4); w->set_sensitive (true); h->set_sensitive (false); + w->get_parent()->get_parent()->show(); + le->get_parent()->get_parent()->hide(); break; case (2): @@ -591,6 +789,8 @@ void Resize::updateGUI () reorder_child(*allowUpscaling, 4); w->set_sensitive (false); h->set_sensitive (true); + w->get_parent()->get_parent()->show(); + le->get_parent()->get_parent()->hide(); break; case (3): @@ -599,6 +799,28 @@ void Resize::updateGUI () reorder_child(*allowUpscaling, 4); w->set_sensitive (true); h->set_sensitive (true); + w->get_parent()->get_parent()->show(); + le->get_parent()->get_parent()->hide(); + break; + + case (4): + // Long edge mode + pack_start (*sizeBox, Gtk::PACK_SHRINK, 4); + reorder_child(*allowUpscaling, 4); + le->set_sensitive (true); + se->set_sensitive (false); + w->get_parent()->get_parent()->hide(); + le->get_parent()->get_parent()->show(); + break; + + case (5): + // Short edge mode + pack_start (*sizeBox, Gtk::PACK_SHRINK, 4); + reorder_child(*allowUpscaling, 4); + le->set_sensitive (false); + se->set_sensitive (true); + w->get_parent()->get_parent()->hide(); + le->get_parent()->get_parent()->show(); break; default: diff --git a/rtgui/resize.h b/rtgui/resize.h index 41b54509e..674bbb34f 100644 --- a/rtgui/resize.h +++ b/rtgui/resize.h @@ -32,14 +32,11 @@ class Resize final : public rtengine::SizeListener { public: + static const Glib::ustring TOOL_NAME; + Resize (); ~Resize () override; - Gtk::Box* getPackBox () - { - return packBox; - } - 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; @@ -48,6 +45,8 @@ public: void adjusterChanged (Adjuster* a, double newval) override; void entryWChanged (); void entryHChanged (); + void entryLEChanged (); + void entrySEChanged (); void appliesToChanged (); void methodChanged (); void specChanged (); @@ -62,26 +61,29 @@ public: private: void fitBoxScale (); - int getComputedWidth (); - int getComputedHeight (); + int getComputedWidth (double height); + int getComputedHeight (double width); void notifyBBox (); void updateGUI (); void allowUpscalingChanged(); rtengine::ProcEvent EvResizeAllowUpscaling; + rtengine::ProcEvent EvResizeLongedge; + rtengine::ProcEvent EvResizeShortedge; Adjuster* scale; - Gtk::VBox* sizeBox; + Gtk::Box* sizeBox; MyComboBoxText* appliesTo; MyComboBoxText* method; MyComboBoxText* spec; MySpinButton* w; MySpinButton* h; + MySpinButton* le; + MySpinButton* se; Gtk::CheckButton *allowUpscaling; int maxw, maxh; int cropw, croph; - sigc::connection sconn, aconn, wconn, hconn; - bool wDirty, hDirty; - ToolParamBlock* packBox; + sigc::connection sconn, aconn, wconn, hconn, leconn, seconn; + bool wDirty, hDirty, leDirty, seDirty; IdleRegister idle_register; static constexpr int MAX_SCALE = 16; // 16 to match the main preview max scale of 1600% diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index c78be375f..a1a0ebf7c 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -9,11 +9,14 @@ #include "rtimage.h" #include "options.h" #include "../rtengine/color.h" +#include "eventmapper.h" using namespace rtengine; using namespace rtengine::procparams; -Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL"), false, true), lastmedianmap (false) +const Glib::ustring Retinex::TOOL_NAME = "retinex"; + +Retinex::Retinex () : FoldableToolPanel (this, TOOL_NAME, M ("TP_RETINEX_LABEL"), false, true), lastmedianmap (false) { CurveListener::setMulti (true); std::vector milestones; @@ -25,13 +28,26 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") nextsigma = 0.; nextminT = 0.; nextmaxT = 0.; + auto m = ProcEventMapper::getInstance(); + EvReticomplex = m->newEvent(DEMOSAIC, "HISTORY_MSG_COMPLEXRETI"); + const RetinexParams default_params; // MAIN Expander ================================================================== + complexmethod = Gtk::manage (new MyComboBoxText ()); + complexmethod->append(M("TP_WAVELET_COMPNORMAL")); + complexmethod->append(M("TP_WAVELET_COMPEXPERT")); + complexmethodconn = complexmethod->signal_changed().connect(sigc::mem_fun(*this, &Retinex::complexmethodChanged)); + complexmethod->set_tooltip_text(M("TP_WAVELET_COMPLEX_TOOLTIP")); + Gtk::Box* const complexHBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const complexLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_COMPLEXLAB") + ":")); + complexHBox->pack_start(*complexLabel, Gtk::PACK_SHRINK, 4); + complexHBox->pack_start(*complexmethod); + pack_start(*complexHBox); Gtk::Grid *retinexGrid = Gtk::manage ( new Gtk::Grid()); @@ -116,7 +132,9 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") // MAP (MASK) Frame --------------------------------------------------------------- - Gtk::Frame *maskFrame = Gtk::manage (new Gtk::Frame (M ("TP_RETINEX_LABEL_MASK")) ); + // Gtk::Frame *maskFrame = Gtk::manage (new Gtk::Frame (M ("TP_RETINEX_LABEL_MASK")) ); + maskFrame = Gtk::manage (new Gtk::Frame (M ("TP_RETINEX_LABEL_MASK")) ); + maskFrame->set_label_align(0.025, 0.5); setExpandAlignProperties (maskFrame, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); Gtk::Grid *maskGrid = Gtk::manage ( new Gtk::Grid()); @@ -227,6 +245,7 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") equalFrame = Gtk::manage (new Gtk::Frame (M ("TP_RETINEX_EQUAL"))); + equalFrame->set_label_align(0.025, 0.5); setExpandAlignProperties (equalFrame, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 @@ -278,7 +297,7 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") for (int i = 0; i < 7; i++) { float R, G, B; - float x = float (i) * (1.0f / 6.0); + float x = i / 6.0; Color::hsv2rgb01 (x, 0.5f, 0.5f, R, G, B); milestones.push_back ( GradientMilestone (double (x), double (R), double (G), double (B)) ); } @@ -330,6 +349,7 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") iterFrame = Gtk::manage (new Gtk::Frame (M ("TP_RETINEX_ITERF"))); + iterFrame->set_label_align(0.025, 0.5); setExpandAlignProperties (iterFrame, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 @@ -374,6 +394,7 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") tranFrame = Gtk::manage (new Gtk::Frame (M ("TP_RETINEX_TRANF"))); + tranFrame->set_label_align(0.025, 0.5); setExpandAlignProperties (tranFrame, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 @@ -384,7 +405,6 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") Gtk::Grid *tranGrid = Gtk::manage (new Gtk::Grid()); setExpandAlignProperties (tranGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - const RetinexParams default_params; // Transmission map curve transmissionCurveEditorG = new CurveEditorGroup (options.lastRetinexDir, M ("TP_RETINEX_TRANSMISSION")); @@ -430,6 +450,7 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") gainFrame = Gtk::manage (new Gtk::Frame (M ("TP_RETINEX_GAINOFFS"))); + gainFrame->set_label_align(0.025, 0.5); setExpandAlignProperties (gainFrame, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 @@ -475,7 +496,7 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") 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")); + neutral->set_tooltip_text (M ("TP_RETINEX_NEUTRAL_TOOLTIP")); neutralconn = neutral->signal_pressed().connect ( sigc::mem_fun (*this, &Retinex::neutral_pressed) ); neutral->show(); @@ -488,112 +509,58 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") str->setAdjusterListener (this); - - if (str->delay < 200) { - str->delay = 200; - } + str->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); scal->setAdjusterListener (this); - - if (scal->delay < 200) { - scal->delay = 200; - } + scal->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); iter->setAdjusterListener (this); - - if (iter->delay < 200) { - iter->delay = 200; - } + iter->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); grad->setAdjusterListener (this); - - if (grad->delay < 200) { - grad->delay = 200; - } + grad->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); grads->setAdjusterListener (this); - - if (grads->delay < 200) { - grads->delay = 200; - } + grads->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); gam->setAdjusterListener (this); - - if (gam->delay < 500) { - gam->delay = 500; - } + gam->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay) * 2.5f); slope->setAdjusterListener (this); - - if (slope->delay < 500) { - slope->delay = 500; - } + slope->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay) * 2.5f); neigh->setAdjusterListener (this); - - if (neigh->delay < 200) { - neigh->delay = 200; - } + neigh->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); offs->setAdjusterListener (this); - - if (offs->delay < 200) { - offs->delay = 200; - } + offs->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); vart->setAdjusterListener (this); - - if (vart->delay < 200) { - vart->delay = 200; - } + offs->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); limd->setAdjusterListener (this); - - if (limd->delay < 200) { - limd->delay = 200; - } + limd->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); highl->setAdjusterListener (this); - - if (highl->delay < 200) { - highl->delay = 200; - } + highl->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); radius->setAdjusterListener (this); - - if (radius->delay < 200) { - radius->delay = 200; - } + radius->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); highlights->setAdjusterListener (this); - - if (highlights->delay < 200) { - highlights->delay = 200; - } + highlights->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); h_tonalwidth->setAdjusterListener (this); - - if (h_tonalwidth->delay < 200) { - h_tonalwidth->delay = 200; - } + h_tonalwidth->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); shadows->setAdjusterListener (this); - - if (shadows->delay < 200) { - shadows->delay = 200; - } + shadows->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); s_tonalwidth->setAdjusterListener (this); - - if (s_tonalwidth->delay < 200) { - s_tonalwidth->delay = 200; - } + s_tonalwidth->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); skal->setAdjusterListener (this); - - if (skal->delay < 200) { - skal->delay = 200; - } + skal->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); disableListener(); retinexColorSpaceChanged(); @@ -628,12 +595,14 @@ void Retinex::neutral_pressed () limd->resetValue (false); highl->resetValue (false); gam->resetValue (false); + skal->resetValue (false); slope->resetValue (false); highlights->resetValue (false); h_tonalwidth->resetValue (false); shadows->resetValue (false); s_tonalwidth->resetValue (false); radius->resetValue (false); + medianmap->set_active (false); mapMethod->set_active (0); viewMethod->set_active (0); retinexMethod->set_active (2); @@ -659,10 +628,16 @@ void Retinex::writeOptions (std::vector &tpOpen) tpOpen.push_back (expsettings->get_expanded ()); } -void Retinex::updateToolState (std::vector &tpOpen) +void Retinex::updateToolState(const std::vector& tpOpen) { + if (tpOpen.empty()) { + expsettings->set_expanded(false); + + return; + } + if (tpOpen.size() >= 10) { - expsettings->set_expanded (tpOpen.at (9)); + expsettings->set_expanded(tpOpen[9]); } } @@ -736,7 +711,53 @@ void Retinex::updateTrans () } } +void Retinex::convertParamToNormal() +{ + const RetinexParams def_params; + disableListener(); + iter->setValue(def_params.iter); + viewMethod->set_active(0); + mapMethod->set_active(0); + cdshape->reset(); + cdshapeH->reset(); + lhshape->reset(); + transmissionShape->reset(); + medianmap->set_active(def_params.medianmap); + enableListener(); +} +void Retinex::updateGUIToMode(int mode) +{ + + if(mode ==0) { + iterFrame->hide(); + maskFrame->hide(); + equalFrame->hide(); + viewMethod->hide(); + mapMethod->hide(); + transmissionCurveEditorG->hide(); + medianmap->hide(); + } else { + iterFrame->show(); + maskFrame->show(); + equalFrame->show(); + viewMethod->show(); + transmissionCurveEditorG->show(); + medianmap->show(); + mapMethod->show(); + if (iter->getIntValue() > 1) { + grad->set_sensitive (true); + scal->set_sensitive (true); + grads->set_sensitive (true); + } else { + grad->set_sensitive (false); + scal->set_sensitive (false); + grads->set_sensitive (false); + } + + } + +} void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) { @@ -746,6 +767,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) gammaretinexConn.block (true); mapMethodConn.block (true); viewMethodConn.block (true); + complexmethodconn.block (true); if (pedited) { @@ -769,6 +791,9 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) shadows->setEditedState (pedited->retinex.shadows ? Edited : UnEdited); s_tonalwidth->setEditedState (pedited->retinex.stonalwidth ? Edited : UnEdited); + if (!pedited->retinex.complexmethod) { + complexmethod->set_active_text (M ("GENERAL_UNCHANGED")); + } if (!pedited->retinex.retinexMethod) { retinexMethod->set_active_text (M ("GENERAL_UNCHANGED")); @@ -838,6 +863,13 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) medianmapConn.block (false); lastmedianmap = pp->retinex.medianmap; + if (pp->retinex.complexmethod == "normal") { + complexmethod->set_active(0); + } else if (pp->retinex.complexmethod == "expert") { + complexmethod->set_active(1); + } + + if (pp->retinex.retinexMethod == "low") { retinexMethod->set_active (0); } else if (pp->retinex.retinexMethod == "uni") { @@ -900,6 +932,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) mapMethodChanged (); viewMethodChanged (); + medianmapConn.block (true); medianmapChanged (); medianmapConn.block (false); @@ -908,7 +941,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) cdshapeH->setCurve (pp->retinex.cdHcurve); lhshape->setCurve (pp->retinex.lhcurve); mapshape->setCurve (pp->retinex.mapcurve); - + retinexMethodConn.block (false); retinexColorSpaceConn.block (false); gammaretinexConn.block (false); @@ -917,8 +950,18 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) transmissionShape->setCurve (pp->retinex.transmissionCurve); gaintransmissionShape->setCurve (pp->retinex.gaintransmissionCurve); + complexmethodconn.block (false); enableListener (); + + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + // convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + } @@ -955,6 +998,7 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited) pp->retinex.stonalwidth = (int)s_tonalwidth->getValue (); if (pedited) { + pedited->retinex.complexmethod = complexmethod->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->retinex.retinexMethod = retinexMethod->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->retinex.retinexcolorspace = retinexcolorspace->get_active_text() != M ("GENERAL_UNCHANGED"); pedited->retinex.gammaretinex = gammaretinex->get_active_text() != M ("GENERAL_UNCHANGED"); @@ -992,6 +1036,12 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited) } + if (complexmethod->get_active_row_number() == 0) { + pp->retinex.complexmethod = "normal"; + } else if (complexmethod->get_active_row_number() == 1) { + pp->retinex.complexmethod = "expert"; + } + if (retinexMethod->get_active_row_number() == 0) { pp->retinex.retinexMethod = "low"; } else if (retinexMethod->get_active_row_number() == 1) { @@ -1050,6 +1100,27 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited) } +void Retinex::complexmethodChanged() +{ + + if (!batchMode) { + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + } + + if (listener) { + listener->panelChanged(EvReticomplex, complexmethod->get_active_text()); + } + +} + + + void Retinex::retinexMethodChanged() { @@ -1132,8 +1203,11 @@ void Retinex::viewMethodChanged() limd->show(); transmissionCurveEditorG->show(); medianmap->show(); - - iterFrame->show(); + if (complexmethod->get_active_row_number() == 0) { + iterFrame->hide(); + } else { + iterFrame->show(); + } /* iter->show(); scal->show(); @@ -1516,6 +1590,7 @@ void Retinex::setBatchMode (bool batchMode) h_tonalwidth->showEditedCB (); shadows->showEditedCB (); s_tonalwidth->showEditedCB (); + // complexmethod->append(M("GENERAL_UNCHANGED")); skal->showEditedCB (); curveEditorGD->setBatchMode (batchMode); diff --git a/rtgui/retinex.h b/rtgui/retinex.h index ff524f854..bdcbcc466 100644 --- a/rtgui/retinex.h +++ b/rtgui/retinex.h @@ -28,6 +28,7 @@ class Retinex final : { private: IdleRegister idle_register; + rtengine::ProcEvent EvReticomplex; protected: CurveEditorGroup* curveEditorGD; @@ -72,6 +73,9 @@ protected: MyComboBoxText* mapMethod; MyComboBoxText* viewMethod; Gtk::CheckButton* medianmap; + MyComboBoxText* complexmethod; + sigc::connection complexmethodconn; + double nextmin; double nextmax; double nextminiT; @@ -87,6 +91,7 @@ protected: Gtk::Frame *gainFrame; Gtk::Frame *tranFrame; Gtk::Frame *iterFrame; + Gtk::Frame *maskFrame; Gtk::Frame *equalFrame; DiagonalCurveEditor* cdshape; @@ -104,32 +109,34 @@ protected: sigc::connection medianmapConn; public: - Retinex (); - ~Retinex () override; + static const Glib::ustring TOOL_NAME; - 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 autoOpenCurve () override; - void medianmapChanged (); - 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 (); + Retinex(); + ~Retinex() override; - void enabledChanged () override; - void curveChanged (CurveEditor* ce) 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 autoOpenCurve() override; + void medianmapChanged(); + 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() override; + void curveChanged(CurveEditor* ce) override; void retinexMethodChanged(); void mapMethodChanged(); void viewMethodChanged(); void retinexColorSpaceChanged(); void gammaretinexChanged(); void ColorSpaceUpdateUI(); - void writeOptions (std::vector &tpOpen); - void updateToolState (std::vector &tpOpen); + void writeOptions(std::vector &tpOpen); + void updateToolState(const std::vector& tpOpen); void setAdjusterBehavior (bool strAdd, bool neighAdd, bool limdAdd, bool offsAdd, bool vartAdd, bool gamAdd, bool slopeAdd); void updateCurveBackgroundHistogram( const LUTu& histToneCurve, @@ -144,9 +151,11 @@ public: const LUTu& histLRETI ); - void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; + void colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; private: - void foldAllButMe (GdkEventButton* event, MyExpander *expander); - + void foldAllButMe(GdkEventButton* event, MyExpander *expander); + void convertParamToNormal(); + void updateGUIToMode(int mode); + void complexmethodChanged(); }; diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc index d501cf449..0dd6805fe 100644 --- a/rtgui/rgbcurves.cc +++ b/rtgui/rgbcurves.cc @@ -27,7 +27,9 @@ using namespace rtengine; using namespace rtengine::procparams; -RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL"), false, true), lastLumamode(false) +const Glib::ustring RGBCurves::TOOL_NAME = "rgbcurves"; + +RGBCurves::RGBCurves () : FoldableToolPanel(this, TOOL_NAME, M("TP_RGBCURVES_LABEL"), false, true), lastLumamode(false) { lumamode = Gtk::manage (new Gtk::CheckButton (M("TP_RGBCURVES_LUMAMODE"))); @@ -36,7 +38,7 @@ RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_L lumamode->show (); pack_start (*lumamode); - Gtk::HSeparator *hsep1 = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator *hsep1 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); hsep1->show (); pack_start (*hsep1); diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index edc80eb41..d7e3c3853 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -45,6 +45,7 @@ protected: sigc::connection lumamodeConn; public: + static const Glib::ustring TOOL_NAME; RGBCurves (); ~RGBCurves () override; diff --git a/rtgui/rotate.cc b/rtgui/rotate.cc index 06c53cd4e..944c54e6d 100644 --- a/rtgui/rotate.cc +++ b/rtgui/rotate.cc @@ -29,7 +29,9 @@ using namespace rtengine; using namespace rtengine::procparams; -Rotate::Rotate () : FoldableToolPanel(this, "rotate", M("TP_ROTATE_LABEL")) +const Glib::ustring Rotate::TOOL_NAME = "rotate"; + +Rotate::Rotate () : FoldableToolPanel(this, TOOL_NAME, M("TP_ROTATE_LABEL")) { rlistener = nullptr; diff --git a/rtgui/rotate.h b/rtgui/rotate.h index 41e10eb4d..26db33ffd 100644 --- a/rtgui/rotate.h +++ b/rtgui/rotate.h @@ -36,6 +36,7 @@ protected: LensGeomListener* rlistener; public: + static const Glib::ustring TOOL_NAME; Rotate (); diff --git a/rtgui/rtappchooserdialog.cc b/rtgui/rtappchooserdialog.cc new file mode 100644 index 000000000..50a71ee38 --- /dev/null +++ b/rtgui/rtappchooserdialog.cc @@ -0,0 +1,77 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Lawrence Lee + * + * 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 "rtappchooserdialog.h" + +#if !(defined WIN32 || defined __APPLE__) +#define GTKMM_APPCHOOSERDIALOG +#endif + +RTAppChooserDialog::~RTAppChooserDialog() {} + +#ifdef GTKMM_APPCHOOSERDIALOG // Use Gtk::AppChooserDialog directly. + +RTAppChooserDialog::RTAppChooserDialog(const Glib::ustring &content_type) : + Gtk::AppChooserDialog(content_type) +{ +} + +Glib::RefPtr RTAppChooserDialog::get_app_info() +{ + return Gtk::AppChooserDialog::get_app_info(); +} + +Glib::RefPtr RTAppChooserDialog::get_app_info() const +{ + return Gtk::AppChooserDialog::get_app_info(); +} + +#else // Work around bugs with GLib and glibmm. + +RTAppChooserDialog::RTAppChooserDialog(const Glib::ustring &content_type) : + Gtk::AppChooserDialog(content_type) +{ + // GTK calls a faulty GLib function to update the most recently selected + // application after an application is selected. This removes all signal + // handlers to prevent the function call. + auto signal_id = g_signal_lookup("response", GTK_TYPE_APP_CHOOSER_DIALOG); + while (true) { + auto handler_id = g_signal_handler_find(gobj(), G_SIGNAL_MATCH_ID, signal_id, GQuark(), nullptr, nullptr, nullptr); + if (!handler_id) { + break; + } + g_signal_handler_disconnect(gobj(), handler_id); + } +} + +Glib::RefPtr RTAppChooserDialog::get_app_info() +{ + // glibmm wrapping of GAppInfo does not work on some platforms. Manually + // wrap it here. + GAppInfo *gAppInfo = gtk_app_chooser_get_app_info(GTK_APP_CHOOSER(gobj())); + return Glib::wrap(gAppInfo, true); +} + +Glib::RefPtr RTAppChooserDialog::get_app_info() const +{ + GAppInfo *gAppInfo = gtk_app_chooser_get_app_info(GTK_APP_CHOOSER( + const_cast(gobj()))); + return Glib::wrap(gAppInfo, true); +} + +#endif diff --git a/rtgui/rtappchooserdialog.h b/rtgui/rtappchooserdialog.h new file mode 100644 index 000000000..9d0e3b041 --- /dev/null +++ b/rtgui/rtappchooserdialog.h @@ -0,0 +1,39 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Lawrence Lee + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#pragma once + +#include +#include +#include +#include + +/** + * Custom version of gtkmm's Gtk::AppChooserDialog to work around crashes + * (https://gitlab.gnome.org/GNOME/glib/-/issues/1104 and + * https://gitlab.gnome.org/GNOME/glibmm/-/issues/94). + */ +class RTAppChooserDialog : public Gtk::AppChooserDialog +{ +public: + RTAppChooserDialog(const Glib::ustring &content_type); + ~RTAppChooserDialog(); + + Glib::RefPtr get_app_info(); + Glib::RefPtr get_app_info() const; +}; diff --git a/rtgui/rtimage.cc b/rtgui/rtimage.cc index 44078ed3b..98e61b897 100644 --- a/rtgui/rtimage.cc +++ b/rtgui/rtimage.cc @@ -22,12 +22,40 @@ #include #include +#include +#include #include "../rtengine/settings.h" namespace { +struct GIconKey { + Glib::RefPtr icon; + /** + * Icon size in pixels. + */ + int icon_size; + + GIconKey() {} + GIconKey(const Glib::RefPtr &icon, int icon_size): icon(icon), icon_size(icon_size) {} + + bool operator==(const GIconKey &other) const + { + bool icons_match = (icon.get() == nullptr && other.icon.get() == nullptr) || (icon.get() != nullptr && icon->equal(Glib::RefPtr::cast_const(other.icon))); + return icons_match && icon_size == other.icon_size; + } +}; + +struct GIconKeyHash { + size_t operator()(const GIconKey &key) const + { + const size_t icon_hash = key.icon ? key.icon->hash() : 0; + return icon_hash ^ std::hash()(key.icon_size); + } +}; + +std::unordered_map, GIconKeyHash> gIconPixbufCache; std::map > pixbufCache; std::map > surfaceCache; @@ -44,6 +72,8 @@ RTImage::RTImage (RTImage &other) : surface(other.surface), pixbuf(other.pixbuf) set(pixbuf); } else if (surface) { set(surface); + } else if (other.gIcon) { + changeImage(other.gIcon, other.gIconSize); } } @@ -80,13 +110,27 @@ RTImage::RTImage (Glib::RefPtr &other) if (other->get_surface()) { surface = other->get_surface(); set(surface); - } else { + } else if (other->pixbuf) { pixbuf = other->get_pixbuf(); set(pixbuf); + } else if (other->gIcon) { + changeImage(other->gIcon, other->gIconSize); } } } +RTImage::RTImage(const Glib::RefPtr &gIcon, Gtk::IconSize size) +{ + changeImage(gIcon, size); +} + +int RTImage::iconSizeToPixels(Gtk::IconSize size) const +{ + int width, height; + Gtk::IconSize::lookup(size, width, height); + return std::round(getTweakedDPI() / baseDPI * std::max(width, height)); +} + void RTImage::setImage (const Glib::ustring& fileName, const Glib::ustring& rtlFileName) { Glib::ustring imageName; @@ -113,10 +157,41 @@ void RTImage::setDPInScale (const double newDPI, const int newScale) } } +void RTImage::changeImage(const Glib::RefPtr &gIcon, int size) +{ + clear(); + + pixbuf.reset(); + surface.clear(); + this->gIcon = gIcon; + + if (!gIcon) { + return; + } + + gIconSize = size; + GIconKey key(gIcon, gIconSize); + auto iterator = gIconPixbufCache.find(key); + + if (iterator == gIconPixbufCache.end()) { + auto icon_pixbuf = createPixbufFromGIcon(gIcon, gIconSize); + iterator = gIconPixbufCache.emplace(key, icon_pixbuf).first; + } + + set(iterator->second); +} + +void RTImage::changeImage(const Glib::RefPtr &gIcon, Gtk::IconSize size) +{ + changeImage(gIcon, iconSizeToPixels(size)); +} + void RTImage::changeImage (const Glib::ustring& imageName) { clear (); + gIcon.reset(); + if (imageName.empty()) { return; } @@ -150,6 +225,11 @@ int RTImage::get_width() if (pixbuf) { return pixbuf->get_width(); } + + if (gIcon) { + return this->get_pixbuf()->get_width(); + } + return -1; } @@ -161,6 +241,11 @@ int RTImage::get_height() if (pixbuf) { return pixbuf->get_height(); } + + if (gIcon) { + return this->get_pixbuf()->get_height(); + } + return -1; } @@ -178,6 +263,11 @@ void RTImage::cleanup(bool all) for (auto& entry : surfaceCache) { entry.second.clear(); } + + for (auto& entry : gIconPixbufCache) { + entry.second.reset(); + } + RTScalable::cleanup(all); } @@ -189,6 +279,10 @@ void RTImage::updateImages() for (auto& entry : surfaceCache) { entry.second = createImgSurfFromFile(entry.first); } + + for (auto& entry : gIconPixbufCache) { + entry.second = createPixbufFromGIcon(entry.first.icon, entry.first.icon_size); + } } Glib::RefPtr RTImage::createPixbufFromFile (const Glib::ustring& fileName) @@ -197,6 +291,17 @@ Glib::RefPtr RTImage::createPixbufFromFile (const Glib::ustring& fi return Gdk::Pixbuf::create(imgSurf, 0, 0, imgSurf->get_width(), imgSurf->get_height()); } +Glib::RefPtr RTImage::createPixbufFromGIcon(const Glib::RefPtr &icon, int size) +{ + // TODO: Listen for theme changes and update icon, remove from cache. + Gtk::IconInfo iconInfo = Gtk::IconTheme::get_default()->lookup_icon(icon, size, Gtk::ICON_LOOKUP_FORCE_SIZE); + try { + return iconInfo.load_icon(); + } catch (Glib::Exception &e) { + return Glib::RefPtr(); + } +} + Cairo::RefPtr RTImage::createImgSurfFromFile (const Glib::ustring& fileName) { Cairo::RefPtr surf; diff --git a/rtgui/rtimage.h b/rtgui/rtimage.h index b68becd82..183a83a94 100644 --- a/rtgui/rtimage.h +++ b/rtgui/rtimage.h @@ -25,7 +25,7 @@ /** * @brief A derived class of Gtk::Image in order to handle theme-related icon sets. */ -class RTImage : public Gtk::Image, public RTScalable +class RTImage final : public Gtk::Image, public RTScalable { static double dpiBack; // used to keep track of master dpi change static int scaleBack; // used to keep track of master scale change @@ -34,6 +34,11 @@ class RTImage : public Gtk::Image, public RTScalable protected: Cairo::RefPtr surface; Glib::RefPtr pixbuf; + Glib::RefPtr gIcon; + int gIconSize; + + void changeImage(const Glib::RefPtr &gIcon, int size); + int iconSizeToPixels(Gtk::IconSize size) const; public: RTImage (); @@ -42,9 +47,11 @@ public: explicit RTImage (Cairo::RefPtr &surf); explicit RTImage(Cairo::RefPtr other); explicit RTImage (Glib::RefPtr &other); + explicit RTImage(const Glib::RefPtr &gIcon, Gtk::IconSize size); explicit RTImage (const Glib::ustring& fileName, const Glib::ustring& rtlFileName = Glib::ustring()); void setImage (const Glib::ustring& fileName, const Glib::ustring& rtlFileName = Glib::ustring()); + void changeImage(const Glib::RefPtr &gIcon, Gtk::IconSize size); void changeImage (const Glib::ustring& imageName); Cairo::RefPtr get_surface(); int get_width(); @@ -58,6 +65,7 @@ public: static void setScale (const int newScale); static Glib::RefPtr createPixbufFromFile (const Glib::ustring& fileName); + static Glib::RefPtr createPixbufFromGIcon(const Glib::RefPtr &icon, int size); static Cairo::RefPtr createImgSurfFromFile (const Glib::ustring& fileName); }; diff --git a/rtgui/rtscalable.cc b/rtgui/rtscalable.cc index a48a95fd2..78202326a 100644 --- a/rtgui/rtscalable.cc +++ b/rtgui/rtscalable.cc @@ -68,7 +68,7 @@ double RTScalable::getDPI () double RTScalable::getTweakedDPI () { - return dpi * fontScale; + return dpi * static_cast(fontScale); } int RTScalable::getScale () diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc old mode 100644 new mode 100755 index 514685a16..d588d6aa5 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -99,6 +99,8 @@ RTWindow::RTWindow () , bpanel (nullptr) , splash (nullptr) , btn_fullscreen (nullptr) + , iFullscreen (nullptr) + , iFullscreen_exit (nullptr) , epanel (nullptr) , fpanel (nullptr) { @@ -179,7 +181,7 @@ RTWindow::RTWindow () fontScale = options.fontSize / (float)RTScalable::baseFontSize; } if (rtengine::settings->verbose) { - printf("\"Non-Default\" font size(%d) * scale(%d) / fontScale(%.3f)\n", options.fontSize, (int)initialGdkScale, fontScale); + printf("\"Non-Default\" font size(%d) * scale(%d) / fontScale(%.3f)\n", options.fontSize, (int)initialGdkScale, static_cast(fontScale)); } } else { Glib::RefPtr style = Gtk::StyleContext::create(); @@ -209,7 +211,7 @@ RTWindow::RTWindow () if ((int)initialGdkScale > 1 || pt != RTScalable::baseFontSize) { css = Glib::ustring::compose ("* { font-size: %1pt}", pt * (int)initialGdkScale); if (rtengine::settings->verbose) { - printf("\"Default\" font size(%d) * scale(%d) / fontScale(%.3f)\n", pt, (int)initialGdkScale, fontScale); + printf("\"Default\" font size(%d) * scale(%d) / fontScale(%.3f)\n", pt, (int)initialGdkScale, static_cast(fontScale)); } } } @@ -278,28 +280,14 @@ RTWindow::RTWindow () set_default_size (options.windowWidth, options.windowHeight); set_modal (false); - Gdk::Rectangle lMonitorRect; - get_screen()->get_monitor_geometry (std::min (options.windowMonitor, Gdk::Screen::get_default()->get_n_monitors() - 1), lMonitorRect); - - if (options.windowMaximized) { - move (lMonitorRect.get_x(), lMonitorRect.get_y()); - maximize(); - } else { - unmaximize(); - resize (options.windowWidth, options.windowHeight); - - if (options.windowX <= lMonitorRect.get_x() + lMonitorRect.get_width() && options.windowY <= lMonitorRect.get_y() + lMonitorRect.get_height()) { - move (options.windowX, options.windowY); - } else { - move (lMonitorRect.get_x(), lMonitorRect.get_y()); - } - } - on_delete_has_run = false; is_fullscreen = false; + is_minimized = false; property_destroy_with_parent().set_value (false); signal_window_state_event().connect ( sigc::mem_fun (*this, &RTWindow::on_window_state_event) ); + onConfEventConn = signal_configure_event().connect ( sigc::mem_fun (*this, &RTWindow::on_configure_event) ); signal_key_press_event().connect ( sigc::mem_fun (*this, &RTWindow::keyPressed) ); + signal_key_release_event().connect(sigc::mem_fun(*this, &RTWindow::keyReleased)); if (simpleEditor) { epanel = Gtk::manage ( new EditorPanel (nullptr) ); @@ -369,7 +357,7 @@ RTWindow::RTWindow () mainNB->set_current_page (mainNB->page_num (*fpanel)); - //Gtk::VBox* mainBox = Gtk::manage (new Gtk::VBox ()); + //Gtk::Box* mainBox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); //mainBox->pack_start (*mainNB); // filling bottom box @@ -513,22 +501,22 @@ 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); + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_DEFRAW_MISSING"), escapeHtmlChars(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); + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_BUNDLED_MISSING"), escapeHtmlChars(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); + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_DEFIMG_MISSING"), escapeHtmlChars(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); + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_BUNDLED_MISSING"), escapeHtmlChars(options.defProfImg)), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); options.defProfImg = DEFPROFILE_INTERNAL; } @@ -536,7 +524,7 @@ void RTWindow::showErrors() bool RTWindow::on_configure_event (GdkEventConfigure* event) { - if (!is_maximized() && is_visible()) { + if (!options.windowMaximized && !is_fullscreen && !is_minimized) { get_size (options.windowWidth, options.windowHeight); get_position (options.windowX, options.windowY); } @@ -549,10 +537,11 @@ bool RTWindow::on_configure_event (GdkEventConfigure* event) bool RTWindow::on_window_state_event (GdkEventWindowState* event) { - if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) { - options.windowMaximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED; - } - + // Retrieve RT window states + options.windowMaximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED; + is_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + is_fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN; + return Gtk::Widget::on_window_state_event (event); } @@ -591,8 +580,10 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) { if (options.multiDisplayMode > 0) { EditWindow * wndEdit = EditWindow::getInstance (this); - wndEdit->show(); wndEdit->addEditorPanel (ep, name); + wndEdit->show_all(); + wndEdit->restoreWindow(); // Need to be called after RTWindow creation to work with all OS Windows Manager + ep->setAspect(); wndEdit->toFront(); } else { ep->setParent (this); @@ -771,6 +762,14 @@ bool RTWindow::keyPressed (GdkEventKey* event) return false; } +bool RTWindow::keyReleased(GdkEventKey *event) +{ + if (fpanel && mainNB->get_current_page() == mainNB->page_num(*fpanel)) { + return fpanel->handleShortcutKeyRelease(event); + } + return false; +} + void RTWindow::addBatchQueueJob (BatchQueueEntry* bqe, bool head) { @@ -801,7 +800,7 @@ bool RTWindow::on_delete_event (GdkEventAny* event) if (isSingleTabMode() || simpleEditor) { isProcessing = epanel->getIsProcessing(); } else if (options.multiDisplayMode > 0) { - editWindow = EditWindow::getInstance (this, false); + editWindow = EditWindow::getInstance (this); isProcessing = editWindow->isProcessing(); } else { int pageCount = mainNB->get_n_pages(); @@ -869,12 +868,22 @@ bool RTWindow::on_delete_event (GdkEventAny* event) FileBrowserEntry::hdr.reset(); FileBrowserEntry::ps.reset(); - if (!options.windowMaximized) { + if (!options.windowMaximized && !is_fullscreen && !is_minimized) { get_size (options.windowWidth, options.windowHeight); get_position (options.windowX, options.windowY); } - options.windowMonitor = get_screen()->get_monitor_at_window (get_window()); + // Retrieve window monitor ID + options.windowMonitor = 0; + const auto display = get_screen()->get_display(); + const int monitor_nb = display->get_n_monitors(); + + for (int id = 0; id < monitor_nb; id++) { + if (display->get_monitor_at_window(get_window()) == display->get_monitor(id)) { + options.windowMonitor = id; + break; + } + } try { Options::save (); @@ -987,25 +996,25 @@ void RTWindow::error(const Glib::ustring& descr) void RTWindow::toggle_fullscreen () { + onConfEventConn.block(true); // Avoid getting size and position while window is getting fullscreen + if (is_fullscreen) { unfullscreen(); - is_fullscreen = false; if (btn_fullscreen) { - //btn_fullscreen->set_label(M("MAIN_BUTTON_FULLSCREEN")); btn_fullscreen->set_tooltip_markup (M ("MAIN_BUTTON_FULLSCREEN")); btn_fullscreen->set_image (*iFullscreen); } } else { fullscreen(); - is_fullscreen = true; if (btn_fullscreen) { - //btn_fullscreen->set_label(M("MAIN_BUTTON_UNFULLSCREEN")); btn_fullscreen->set_tooltip_markup (M ("MAIN_BUTTON_UNFULLSCREEN")); btn_fullscreen->set_image (*iFullscreen_exit); } } + + onConfEventConn.block(false); } void RTWindow::SetEditorCurrent() @@ -1045,6 +1054,13 @@ void RTWindow::MoveFileBrowserToEditor() } } +void RTWindow::updateExternalEditorWidget(int selectedIndex, const std::vector & editors) +{ + if (epanel) { + epanel->updateExternalEditorWidget(selectedIndex, editors); + } +} + void RTWindow::updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC) { if (epanel) { @@ -1079,6 +1095,17 @@ void RTWindow::updateFBToolBarVisibility (bool showFilmStripToolBar) fpanel->fileCatalog->updateFBToolBarVisibility (showFilmStripToolBar); } +void RTWindow::updateShowtooltipVisibility (bool showtooltip) +{ + if (epanel) { + epanel->updateShowtooltipVisibility (showtooltip); + } + + for (auto panel : epanels) { + panel.second->updateShowtooltipVisibility (showtooltip); + } +} + void RTWindow::updateHistogramPosition (int oldPosition, int newPosition) { if (epanel) { @@ -1090,6 +1117,27 @@ void RTWindow::updateHistogramPosition (int oldPosition, int newPosition) } } +void RTWindow::updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools) +{ + if (fpanel) { + fpanel->updateToolPanelToolLocations(favorites, cloneFavoriteTools); + } + + if (epanel) { + epanel->updateToolPanelToolLocations(favorites, cloneFavoriteTools); + } + + for (const auto &panel : epanels) { + panel.second->updateToolPanelToolLocations(favorites, cloneFavoriteTools); + } + + if (options.multiDisplayMode > 0) { + EditWindow::getInstance(this) + ->updateToolPanelToolLocations(favorites, cloneFavoriteTools); + } +} + bool RTWindow::splashClosed (GdkEventAny* event) { delete splash; @@ -1098,6 +1146,74 @@ bool RTWindow::splashClosed (GdkEventAny* event) return true; } +void RTWindow::setWindowSize () +{ + onConfEventConn.block(true); // Avoid getting size and position while window is being moved, maximized, ... + + Gdk::Rectangle lMonitorRect; + const auto display = get_screen()->get_display(); + display->get_monitor (std::min (options.windowMonitor, display->get_n_monitors() - 1))->get_geometry(lMonitorRect); + +#ifdef __APPLE__ + // Get macOS menu bar height + Gdk::Rectangle lWorkAreaRect; + display->get_monitor (std::min (options.windowMonitor, display->get_n_monitors() - 1))->get_workarea(lWorkAreaRect); + const int macMenuBarHeight = lWorkAreaRect.get_y(); + + // Place RT window to saved one in options file + if (options.windowX <= lMonitorRect.get_x() + lMonitorRect.get_width() + && options.windowX >= 0 + && options.windowY <= lMonitorRect.get_y() + lMonitorRect.get_height() - macMenuBarHeight + && options.windowY >= 0) { + move (options.windowX, options.windowY + macMenuBarHeight); + } else { + move (lMonitorRect.get_x(), lMonitorRect.get_y() + macMenuBarHeight); + } +#else + // Place RT window to saved one in options file + if (options.windowX <= lMonitorRect.get_x() + lMonitorRect.get_width() + && options.windowX >= 0 + && options.windowY <= lMonitorRect.get_y() + lMonitorRect.get_height() + && options.windowY >= 0) { + move (options.windowX, options.windowY); + } else { + move (lMonitorRect.get_x(), lMonitorRect.get_y()); + } +#endif + + // Maximize RT window according to options file + if (options.windowMaximized) { + maximize(); + } else { + unmaximize(); + resize (options.windowWidth, options.windowHeight); + } + + onConfEventConn.block(false); +} + +void RTWindow::get_position(int& x, int& y) const +{ + // Call native function + Gtk::Window::get_position (x, y); + + // Retrieve display (concatenation of all monitors) size + int width = 0, height = 0; + const auto display = get_screen()->get_display(); + const int nbMonitors = display->get_n_monitors(); + + for (int i = 0; i < nbMonitors; i++) { + Gdk::Rectangle lMonitorRect; + display->get_monitor(i)->get_geometry(lMonitorRect); + width = std::max(width, lMonitorRect.get_x() + lMonitorRect.get_width()); + height = std::max(height, lMonitorRect.get_y() + lMonitorRect.get_height()); + } + + // Saturate position at monitor limits to avoid unexpected behavior (fixes #6233) + x = std::min(width, std::max(0, x)); + y = std::min(height, std::max(0, y)); +} + void RTWindow::set_title_decorated (Glib::ustring fname) { Glib::ustring subtitle; diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h old mode 100644 new mode 100755 index 4791ac6c1..922588a19 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -33,9 +33,10 @@ class BatchQueueEntry; class BatchQueuePanel; class EditorPanel; +struct ExternalEditor; class FilePanel; class PLDBridge; -class RTWindow : +class RTWindow final : public Gtk::Window, public rtengine::ProgressListener, public rtengine::NonCopyable @@ -51,6 +52,8 @@ private: Gtk::ProgressBar prProgBar; PLDBridge* pldBridge; bool is_fullscreen; + bool is_minimized; + sigc::connection onConfEventConn; bool on_delete_has_run; Gtk::Button * btn_fullscreen; @@ -85,6 +88,7 @@ public: void addBatchQueueJobs (const std::vector& entries); bool keyPressed (GdkEventKey* event); + bool keyReleased(GdkEventKey *event); bool on_configure_event (GdkEventConfigure* event) override; bool on_delete_event (GdkEventAny* event) override; bool on_window_state_event (GdkEventWindowState* event) override; @@ -95,6 +99,7 @@ public: void showPreferences (); void on_realize () override; void toggle_fullscreen (); + void get_position(int& x, int& y) const; void setProgress(double p) override; void setProgressStr(const Glib::ustring& str) override; @@ -114,15 +119,20 @@ public: void MoveFileBrowserToEditor(); void MoveFileBrowserToMain(); + void updateExternalEditorWidget(int selectedIndex, const std::vector &editors); void updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC); void updateTPVScrollbar (bool hide); void updateHistogramPosition (int oldPosition, int newPosition); void updateFBQueryTB (bool singleRow); void updateFBToolBarVisibility (bool showFilmStripToolBar); + void updateShowtooltipVisibility (bool showtooltip); + void updateToolPanelToolLocations( + const std::vector &favorites, bool cloneFavoriteTools); bool getIsFullscreen() { return is_fullscreen; } + void setWindowSize (); void set_title_decorated (Glib::ustring fname); void closeOpenEditors(); void setEditorMode (bool tabbedUI); diff --git a/rtgui/saveasdlg.cc b/rtgui/saveasdlg.cc index ebf2f5b4a..1e361411c 100644 --- a/rtgui/saveasdlg.cc +++ b/rtgui/saveasdlg.cc @@ -120,29 +120,29 @@ SaveAsDialog::SaveAsDialog (const Glib::ustring &initialDir, Gtk::Window* parent Gtk::Button* ok = Gtk::manage( new Gtk::Button (M("GENERAL_OK")) ); Gtk::Button* cancel = Gtk::manage( new Gtk::Button (M("GENERAL_CANCEL")) ); - ok->set_tooltip_markup (M("TP_SAVEDIALOG_OK_TIP")); + ok->set_tooltip_markup (M("TP_SAVEDIALOG_OK_TOOLTIP")); ok->signal_clicked().connect( sigc::mem_fun(*this, &SaveAsDialog::okPressed) ); cancel->signal_clicked().connect( sigc::mem_fun(*this, &SaveAsDialog::cancelPressed) ); // pack everything // ~~~~~~~~~~~~~~~ - Gtk::VBox* vbox_bottomRight = Gtk::manage(new Gtk::VBox ()); + Gtk::Box* vbox_bottomRight = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); // There is no queue in simple mode, so no need to choose if (!simpleEditor) { vbox_bottomRight->pack_start (*saveMethod[0], Gtk::PACK_SHRINK, 2); vbox_bottomRight->pack_start (*saveMethod[1], Gtk::PACK_SHRINK, 2); vbox_bottomRight->pack_start (*saveMethod[2], Gtk::PACK_SHRINK, 2); - vbox_bottomRight->pack_start (*Gtk::manage(new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 5); + vbox_bottomRight->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 5); } vbox_bottomRight->pack_start (*forceFormatOpts, Gtk::PACK_SHRINK, 4); vbox_bottomRight->pack_start (*autoSuffix, Gtk::PACK_SHRINK, 4); - Gtk::HBox* hbox_bottom = Gtk::manage( new Gtk::HBox() ); + Gtk::Box* hbox_bottom = Gtk::manage( new Gtk::Box() ); hbox_bottom->pack_start (*formatOpts, Gtk::PACK_EXPAND_WIDGET, 2); - hbox_bottom->pack_start (*Gtk::manage(new Gtk::VSeparator ()), Gtk::PACK_SHRINK, 2); + hbox_bottom->pack_start (*Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_VERTICAL)), Gtk::PACK_SHRINK, 2); hbox_bottom->pack_start (*vbox_bottomRight, Gtk::PACK_EXPAND_WIDGET, 2); box->pack_start (*fchooser); @@ -281,9 +281,9 @@ void SaveAsDialog::okPressed () + ": " + M("SAVEDLG_WARNFILENAME") + " \"" - + Glib::path_get_basename (fname) + + escapeHtmlChars(Glib::path_get_basename (fname)) + '.' - + formatOpts->getFormat().format + + escapeHtmlChars(formatOpts->getFormat().format) + "\"", true, Gtk::MESSAGE_WARNING, diff --git a/rtgui/saveasdlg.h b/rtgui/saveasdlg.h index 448b37fd7..445452a54 100644 --- a/rtgui/saveasdlg.h +++ b/rtgui/saveasdlg.h @@ -22,7 +22,7 @@ #include "saveformatpanel.h" -class SaveAsDialog : +class SaveAsDialog final : public Gtk::Dialog, public FormatChangeListener { diff --git a/rtgui/saveformatpanel.cc b/rtgui/saveformatpanel.cc index 00f6e7b2b..d9b04e8fe 100644 --- a/rtgui/saveformatpanel.cc +++ b/rtgui/saveformatpanel.cc @@ -71,7 +71,7 @@ SaveFormatPanel::SaveFormatPanel () : listener (nullptr) jpegOpts->set_row_spacing(5); setExpandAlignProperties(jpegOpts, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - jpegQual = new Adjuster (M("SAVEDLG_JPEGQUAL"), 0, 100, 1, 100); + jpegQual = Gtk::manage (new Adjuster (M("SAVEDLG_JPEGQUAL"), 0, 100, 1, 100) ); setExpandAlignProperties(jpegQual, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); jpegQual->setAdjusterListener (this); @@ -95,11 +95,16 @@ SaveFormatPanel::SaveFormatPanel () : listener (nullptr) // --------------------- TIFF OPTIONS - tiffUncompressed = new Gtk::CheckButton (M("SAVEDLG_TIFFUNCOMPRESSED")); + tiffUncompressed = Gtk::manage (new Gtk::CheckButton (M("SAVEDLG_TIFFUNCOMPRESSED")) ); setExpandAlignProperties(tiffUncompressed, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); tiffUncompressed->signal_toggled().connect( sigc::mem_fun(*this, &SaveFormatPanel::formatChanged)); tiffUncompressed->show_all(); + bigTiff = Gtk::manage (new Gtk::CheckButton (M("SAVEDLG_BIGTIFF")) ); + setExpandAlignProperties(bigTiff, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + bigTiff->signal_toggled().connect( sigc::mem_fun(*this, &SaveFormatPanel::formatChanged)); + bigTiff->show_all(); + // --------------------- MAIN BOX @@ -114,13 +119,11 @@ SaveFormatPanel::SaveFormatPanel () : listener (nullptr) attach (*hb1, 0, 0, 1, 1); attach (*jpegOpts, 0, 1, 1, 1); attach (*tiffUncompressed, 0, 2, 1, 1); + attach (*bigTiff, 0, 3, 1, 1); attach (*savesPP, 0, 4, 1, 2); } -SaveFormatPanel::~SaveFormatPanel () -{ - delete jpegQual; - delete tiffUncompressed; -} + +SaveFormatPanel::~SaveFormatPanel () = default; void SaveFormatPanel::init (SaveFormat &sf) { @@ -158,6 +161,7 @@ void SaveFormatPanel::init (SaveFormat &sf) jpegQual->setValue(sf.jpegQuality); savesPP->set_active(sf.saveParams); tiffUncompressed->set_active(sf.tiffUncompressed); + bigTiff->set_active(sf.bigTiff); listener = tmp; } @@ -175,6 +179,7 @@ SaveFormat SaveFormatPanel::getFormat () sf.jpegQuality = jpegQual->getValue(); sf.jpegSubSamp = jpegSubSamp->get_active_row_number() + 1; sf.tiffUncompressed = tiffUncompressed->get_active(); + sf.bigTiff = bigTiff->get_active(); sf.saveParams = savesPP->get_active(); return sf; @@ -193,12 +198,15 @@ void SaveFormatPanel::formatChanged () if (fr == "jpg") { jpegOpts->show_all(); tiffUncompressed->hide(); + bigTiff->hide(); } else if (fr == "png") { jpegOpts->hide(); tiffUncompressed->hide(); + bigTiff->hide(); } else if (fr == "tif") { jpegOpts->hide(); tiffUncompressed->show_all(); + bigTiff->show_all(); } if (listener) { diff --git a/rtgui/saveformatpanel.h b/rtgui/saveformatpanel.h index af9baa58a..9d9f6266e 100644 --- a/rtgui/saveformatpanel.h +++ b/rtgui/saveformatpanel.h @@ -39,6 +39,7 @@ class SaveFormatPanel : public Gtk::Grid, public AdjusterListener, public rtengi protected: Adjuster* jpegQual; Gtk::CheckButton* tiffUncompressed; + Gtk::CheckButton* bigTiff; MyComboBoxText* format; MyComboBoxText* jpegSubSamp; Gtk::Grid* formatOpts; diff --git a/rtgui/sensorbayer.cc b/rtgui/sensorbayer.cc index 39ed5cb91..70537f666 100644 --- a/rtgui/sensorbayer.cc +++ b/rtgui/sensorbayer.cc @@ -20,11 +20,10 @@ #include "guiutils.h" #include "rtimage.h" -SensorBayer::SensorBayer () : FoldableToolPanel(this, "sensorbayer", M("TP_RAW_SENSOR_BAYER_LABEL")) -{ +const Glib::ustring SensorBayer::TOOL_NAME = "sensorbayer"; - packBox = Gtk::manage (new ToolParamBlock ()); - pack_start (*packBox); +SensorBayer::SensorBayer () : FoldableToolPanel(this, TOOL_NAME, M("TP_RAW_SENSOR_BAYER_LABEL")) +{ show_all (); } diff --git a/rtgui/sensorbayer.h b/rtgui/sensorbayer.h index 2401bf760..d3d867ace 100644 --- a/rtgui/sensorbayer.h +++ b/rtgui/sensorbayer.h @@ -27,15 +27,8 @@ class SensorBayer final : public FoldableToolPanel { -protected: - ToolParamBlock* packBox; - public: + static const Glib::ustring TOOL_NAME; SensorBayer (); - - Gtk::Box* getPackBox () - { - return packBox; - } }; diff --git a/rtgui/sensorxtrans.cc b/rtgui/sensorxtrans.cc index f13e6607f..45e5d57e4 100644 --- a/rtgui/sensorxtrans.cc +++ b/rtgui/sensorxtrans.cc @@ -20,11 +20,10 @@ #include "guiutils.h" #include "rtimage.h" -SensorXTrans::SensorXTrans () : FoldableToolPanel(this, "sensorxtrans", M("TP_RAW_SENSOR_XTRANS_LABEL")) -{ +const Glib::ustring SensorXTrans::TOOL_NAME = "sensorxtrans"; - packBox = Gtk::manage (new ToolParamBlock ()); - pack_start (*packBox); +SensorXTrans::SensorXTrans () : FoldableToolPanel(this, TOOL_NAME, M("TP_RAW_SENSOR_XTRANS_LABEL")) +{ show_all (); } diff --git a/rtgui/sensorxtrans.h b/rtgui/sensorxtrans.h index eee014f6c..2e5c10483 100644 --- a/rtgui/sensorxtrans.h +++ b/rtgui/sensorxtrans.h @@ -27,15 +27,8 @@ class SensorXTrans final: public FoldableToolPanel { -protected: - ToolParamBlock* packBox; - public: + static const Glib::ustring TOOL_NAME; SensorXTrans (); - - Gtk::Box* getPackBox () - { - return packBox; - } }; diff --git a/rtgui/shadowshighlights.cc b/rtgui/shadowshighlights.cc index 3e3c277c7..3c821d863 100644 --- a/rtgui/shadowshighlights.cc +++ b/rtgui/shadowshighlights.cc @@ -25,12 +25,14 @@ using namespace rtengine; using namespace rtengine::procparams; -ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, "shadowshighlights", M("TP_SHADOWSHLIGHTS_LABEL"), false, true) +const Glib::ustring ShadowsHighlights::TOOL_NAME = "shadowshighlights"; + +ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, TOOL_NAME, M("TP_SHADOWSHLIGHTS_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); - EvSHColorspace = m->newEvent(RGBCURVE, "HISTORY_MSG_SH_COLORSPACE"); + EvSHColorspace = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_SH_COLORSPACE"); - Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* hb = Gtk::manage (new Gtk::Box ()); 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")); @@ -38,21 +40,21 @@ ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, "shadowshighli hb->pack_start(*colorspace); pack_start(*hb); - pack_start (*Gtk::manage (new Gtk::HSeparator())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); 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, 70)); pack_start (*highlights); pack_start (*h_tonalwidth); - pack_start (*Gtk::manage (new Gtk::HSeparator())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); 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, 30)); pack_start (*shadows); pack_start (*s_tonalwidth); - pack_start (*Gtk::manage (new Gtk::HSeparator())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); radius = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_RADIUS"), 1, 100, 1, 40)); pack_start (*radius); diff --git a/rtgui/shadowshighlights.h b/rtgui/shadowshighlights.h index 7bb0bb01c..fd8b30a6a 100644 --- a/rtgui/shadowshighlights.h +++ b/rtgui/shadowshighlights.h @@ -40,6 +40,7 @@ protected: rtengine::ProcEvent EvSHColorspace; public: + static const Glib::ustring TOOL_NAME; ShadowsHighlights (); diff --git a/rtgui/sharpenedge.cc b/rtgui/sharpenedge.cc index f4415bb15..247a8a5d7 100644 --- a/rtgui/sharpenedge.cc +++ b/rtgui/sharpenedge.cc @@ -23,29 +23,25 @@ #include "guiutils.h" #include "options.h" - #include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring SharpenEdge::TOOL_NAME = "sharpenedge"; -SharpenEdge::SharpenEdge () : FoldableToolPanel(this, "sharpenedge", M("TP_SHARPENEDGE_LABEL"), true, true) +SharpenEdge::SharpenEdge () : FoldableToolPanel(this, TOOL_NAME, M("TP_SHARPENEDGE_LABEL"), true, true) { passes = Gtk::manage(new Adjuster (M("TP_SHARPENEDGE_PASSES"), 1, 4, 1, 2)); passes->setAdjusterListener (this); - if (passes->delay < options.adjusterMaxDelay) { - passes->delay = options.adjusterMaxDelay; - } + passes->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); amount = Gtk::manage(new Adjuster (M("TP_SHARPENEDGE_AMOUNT"), 0, 100, 1, 50)); amount->setAdjusterListener (this); - if (amount->delay < options.adjusterMaxDelay) { - amount->delay = options.adjusterMaxDelay; - } + amount->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); threechannels = Gtk::manage(new Gtk::CheckButton((M("TP_SHARPENEDGE_THREE"))));// L + a + b threechannels->set_active (false); diff --git a/rtgui/sharpenedge.h b/rtgui/sharpenedge.h index a813d86e1..bfb48b408 100644 --- a/rtgui/sharpenedge.h +++ b/rtgui/sharpenedge.h @@ -44,6 +44,7 @@ protected: bool lastchanthree; public: + static const Glib::ustring TOOL_NAME; SharpenEdge (); diff --git a/rtgui/sharpening.cc b/rtgui/sharpening.cc index e16511279..ba39ac97c 100644 --- a/rtgui/sharpening.cc +++ b/rtgui/sharpening.cc @@ -23,13 +23,15 @@ using namespace rtengine; using namespace rtengine::procparams; -Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENING_LABEL"), true, true) +const Glib::ustring Sharpening::TOOL_NAME = "sharpening"; + +Sharpening::Sharpening () : FoldableToolPanel(this, TOOL_NAME, 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 ()); + Gtk::Box* hb = Gtk::manage (new Gtk::Box ()); hb->show (); contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 20)); contrast->setAdjusterListener (this); @@ -50,7 +52,7 @@ Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENI hb->pack_start(*method); pack_start (*hb); - rld = new Gtk::VBox (); + rld = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); 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, 100)); ddamping = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_DAMPING"), 0, 100, 1, 0)); @@ -65,11 +67,11 @@ Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENI diter->show (); rld->show (); - usm = new Gtk::VBox (); + usm = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); usm->show (); - Gtk::HSeparator *hsep6a = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* hsep6a = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); amount = Gtk::manage (new Adjuster (M("TP_SHARPENING_AMOUNT"), 1, 1000, 1, 200)); radius = Gtk::manage (new Adjuster (M("TP_SHARPENING_RADIUS"), 0.3, 3, 0.01, 0.5)); threshold = Gtk::manage (new ThresholdAdjuster (M("TP_SHARPENING_THRESHOLD"), 0., 2000., 20., 80., 2000., 1200., 0, false)); @@ -86,10 +88,10 @@ Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENI threshold->show (); amount->show (); - Gtk::HSeparator *hsep6 = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* hsep6 = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); edgesonly = Gtk::manage (new Gtk::CheckButton (M("TP_SHARPENING_ONLYEDGES"))); edgesonly->set_active (false); - edgebox = new Gtk::VBox (); + edgebox = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); eradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.5, 2.5, 0.1, 1.9)); etolerance = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDTOLERANCE"), 10, 10000, 100, 1800)); usm->pack_start(*hsep6, Gtk::PACK_SHRINK, 2); @@ -97,7 +99,7 @@ Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENI edgebox->pack_start(*eradius); edgebox->pack_start(*etolerance); edgebox->show (); - edgebin = Gtk::manage (new Gtk::VBox ()); + edgebin = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); usm->pack_start (*edgebin); edgebin->show (); hsep6->show(); @@ -105,16 +107,16 @@ Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENI eradius->show(); etolerance->show(); - Gtk::HSeparator *hsep6b = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* hsep6b = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); halocontrol = Gtk::manage (new Gtk::CheckButton (M("TP_SHARPENING_HALOCONTROL"))); halocontrol->set_active (false); - hcbox = new Gtk::VBox (); + hcbox = new Gtk::Box(Gtk::ORIENTATION_VERTICAL); hcamount = Gtk::manage (new Adjuster (M("TP_SHARPENING_HCAMOUNT"), 1, 100, 1, 75)); usm->pack_start(*hsep6b, Gtk::PACK_SHRINK, 2); usm->pack_start(*halocontrol); hcbox->pack_start(*hcamount); hcbox->show (); - hcbin = Gtk::manage (new Gtk::VBox ()); + hcbin = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); usm->pack_start (*hcbin); hcbin->show (); hsep6b->show (); diff --git a/rtgui/sharpening.h b/rtgui/sharpening.h index bd5e6f1b7..e30db3dd2 100644 --- a/rtgui/sharpening.h +++ b/rtgui/sharpening.h @@ -39,18 +39,18 @@ protected: Adjuster* damount; Adjuster* ddamping; Adjuster* diter; - Gtk::VBox* usm; - Gtk::VBox* rld; + Gtk::Box* usm; + Gtk::Box* rld; Adjuster* radius; Adjuster* amount; Adjuster* eradius; Adjuster* etolerance; Adjuster* hcamount; - Gtk::VBox* edgebin; - Gtk::VBox* hcbin; - Gtk::VBox* edgebox; - Gtk::VBox* hcbox; + Gtk::Box* edgebin; + Gtk::Box* hcbin; + Gtk::Box* edgebox; + Gtk::Box* hcbox; ThresholdAdjuster* threshold; Gtk::CheckButton* edgesonly; bool lastEdgesOnly; @@ -62,6 +62,7 @@ protected: rtengine::ProcEvent EvSharpenContrast; rtengine::ProcEvent EvSharpenBlur; public: + static const Glib::ustring TOOL_NAME; Sharpening (); ~Sharpening () override; diff --git a/rtgui/sharpenmicro.cc b/rtgui/sharpenmicro.cc index 78228d27c..527d146d7 100644 --- a/rtgui/sharpenmicro.cc +++ b/rtgui/sharpenmicro.cc @@ -29,8 +29,9 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring SharpenMicro::TOOL_NAME = "sharpenmicro"; -SharpenMicro::SharpenMicro () : FoldableToolPanel(this, "sharpenmicro", M("TP_SHARPENMICRO_LABEL"), true, true) +SharpenMicro::SharpenMicro () : FoldableToolPanel(this, TOOL_NAME, M("TP_SHARPENMICRO_LABEL"), true, true) { auto m = ProcEventMapper::getInstance(); diff --git a/rtgui/sharpenmicro.h b/rtgui/sharpenmicro.h index 23224dd60..876117e68 100644 --- a/rtgui/sharpenmicro.h +++ b/rtgui/sharpenmicro.h @@ -47,6 +47,7 @@ protected: bool lastmatrix; public: + static const Glib::ustring TOOL_NAME; SharpenMicro (); diff --git a/rtgui/shcselector.cc b/rtgui/shcselector.cc index e8aca4071..ad2c28aaa 100644 --- a/rtgui/shcselector.cc +++ b/rtgui/shcselector.cc @@ -321,7 +321,7 @@ bool SHCSelector::on_motion_notify_event (GdkEventMotion* event) return true; } -void SHCSelector::styleChanged (const Glib::RefPtr& style) +void SHCSelector::styleChanged (const Glib::RefPtr& style) { setDirty(true); diff --git a/rtgui/shcselector.h b/rtgui/shcselector.h index 5c4421e0a..2422fdf56 100644 --- a/rtgui/shcselector.h +++ b/rtgui/shcselector.h @@ -29,7 +29,7 @@ public: virtual void shcChanged() = 0; }; -class SHCSelector : public Gtk::DrawingArea, BackBuffer +class SHCSelector final : public Gtk::DrawingArea, BackBuffer { protected: @@ -78,7 +78,7 @@ public: void setDefaults (double spos, double cpos, double hpos); void setPositions (double spos, double cpos, double hpos); void getPositions (double& spos, double& cpos, double& hpos); - void styleChanged (const Glib::RefPtr& style); + void styleChanged (const Glib::RefPtr& style); bool reset (); void refresh(); }; diff --git a/rtgui/softlight.cc b/rtgui/softlight.cc index 84461f169..3a7f84985 100644 --- a/rtgui/softlight.cc +++ b/rtgui/softlight.cc @@ -29,7 +29,9 @@ using namespace rtengine; using namespace rtengine::procparams; -SoftLight::SoftLight(): FoldableToolPanel(this, "softlight", M("TP_SOFTLIGHT_LABEL"), false, true) +const Glib::ustring SoftLight::TOOL_NAME = "softlight"; + +SoftLight::SoftLight(): FoldableToolPanel(this, TOOL_NAME, M("TP_SOFTLIGHT_LABEL"), false, true) { auto m = ProcEventMapper::getInstance(); EvSoftLightEnabled = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_SOFTLIGHT_ENABLED"); diff --git a/rtgui/softlight.h b/rtgui/softlight.h index 710da4e34..3b9ff5399 100644 --- a/rtgui/softlight.h +++ b/rtgui/softlight.h @@ -32,6 +32,7 @@ private: rtengine::ProcEvent EvSoftLightStrength; public: + static const Glib::ustring TOOL_NAME; SoftLight(); diff --git a/rtgui/soundman.cc b/rtgui/soundman.cc index a4cf5337b..d038ffd72 100644 --- a/rtgui/soundman.cc +++ b/rtgui/soundman.cc @@ -26,7 +26,7 @@ #include #endif -#ifdef __linux__ +#if defined(__linux__) && defined(USE_CANBERRA) #include #endif @@ -67,7 +67,7 @@ void SoundManager::playSoundAsync(const Glib::ustring &sound) wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (sound.c_str(), -1, NULL, NULL, NULL); PlaySoundW(wfilename, NULL, sndParam); g_free( wfilename ); -#elif defined(__linux__) +#elif defined(__linux__) && defined(USE_CANBERRA) ca_context_play(ca_gtk_context_get(), 0, CA_PROP_EVENT_ID, sound.c_str(), CA_PROP_MEDIA_FILENAME, sound.c_str(), NULL); #endif } diff --git a/rtgui/splash.cc b/rtgui/splash.cc index 7ae5bf4d7..42b276a2e 100644 --- a/rtgui/splash.cc +++ b/rtgui/splash.cc @@ -178,7 +178,7 @@ Splash::Splash (Gtk::Window& parent) : Gtk::Dialog(M("GENERAL_ABOUT"), parent, t } // Tab 4: the license - std::string licenseFileName = Glib::build_filename (licensePath, "LICENSE.txt"); + std::string licenseFileName = Glib::build_filename (licensePath, "LICENSE"); if ( Glib::file_test(licenseFileName, (Glib::FILE_TEST_EXISTS)) ) { FILE *f = g_fopen (licenseFileName.c_str (), "rt"); diff --git a/rtgui/splash.h b/rtgui/splash.h index 363c51489..bc63cef91 100644 --- a/rtgui/splash.h +++ b/rtgui/splash.h @@ -20,7 +20,7 @@ #include -class SplashImage : +class SplashImage final : public Gtk::DrawingArea { @@ -39,7 +39,7 @@ public: }; //class Splash : public Gtk::Window { -class Splash : public Gtk::Dialog +class Splash final : public Gtk::Dialog { private: diff --git a/rtgui/spot.cc b/rtgui/spot.cc new file mode 100644 index 000000000..46e646945 --- /dev/null +++ b/rtgui/spot.cc @@ -0,0 +1,896 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 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 "editcallbacks.h" +#include "spot.h" +#include "rtimage.h" +#include +#include "../rtengine/rt_math.h" +#include "guiutils.h" +#include "eventmapper.h" +#include "../rtengine/refreshmap.h" + +using namespace rtengine; +using namespace rtengine::procparams; + +namespace +{ + +enum GeometryIndex { + MO_TARGET_DISK, + MO_SOURCE_DISC, + MO_TARGET_CIRCLE, + MO_SOURCE_CIRCLE, + MO_TARGET_FEATHER_CIRCLE, + MO_SOURCE_FEATHER_CIRCLE, + MO_OBJECT_COUNT, + + VISIBLE_SOURCE_ICON = 0, + VISIBLE_SOURCE_FEATHER_CIRCLE, + VISIBLE_LINK, + VISIBLE_SOURCE_CIRCLE, + VISIBLE_TARGET_FEATHER_CIRCLE, + VISIBLE_TARGET_CIRCLE, + VISIBLE_OBJECT_COUNT +}; + +} + +const Glib::ustring Spot::TOOL_NAME = "spot"; + +Spot::Spot() : + FoldableToolPanel(this, TOOL_NAME, M ("TP_SPOT_LABEL"), true, true), + EditSubscriber(ET_OBJECTS), + draggedSide(DraggedSide::NONE), + lastObject(-1), + activeSpot(-1), + sourceIcon("spot-normal.png", "spot-active.png", "spot-prelight.png", "", "", Geometry::DP_CENTERCENTER), + editedCheckBox(nullptr) +{ + countLabel = Gtk::manage (new Gtk::Label (Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), 0))); + + edit = Gtk::manage (new Gtk::ToggleButton()); + edit->add (*Gtk::manage (new RTImage ("edit-point.png"))); + editConn = edit->signal_toggled().connect ( sigc::mem_fun (*this, &Spot::editToggled) ); + edit->set_tooltip_text(M("TP_SPOT_HINT")); + + reset = Gtk::manage (new Gtk::Button ()); + reset->add (*Gtk::manage (new RTImage ("undo-small.png"))); + reset->set_relief (Gtk::RELIEF_NONE); + reset->set_border_width (0); + reset->signal_clicked().connect ( sigc::mem_fun (*this, &Spot::resetPressed) ); + + spotSize = Gtk::manage(new Adjuster(M("TP_SPOT_DEFAULT_SIZE"), SpotParams::minRadius, SpotParams::maxRadius, 1, 25)); + + labelBox = Gtk::manage (new Gtk::Box()); + labelBox->set_spacing (2); + labelBox->pack_start (*countLabel, false, false, 0); + labelBox->pack_end (*edit, false, false, 0); + labelBox->pack_end (*reset, false, false, 0); + labelBox->pack_end (*spotSize, false, false, 0); + pack_start (*labelBox); + + sourceIcon.datum = Geometry::IMAGE; + sourceIcon.setActive (false); + sourceIcon.state = Geometry::ACTIVE; + sourceCircle.datum = Geometry::IMAGE; + sourceCircle.setActive (false); + sourceCircle.radiusInImageSpace = true; + sourceCircle.setDashed(true); + sourceMODisc.datum = Geometry::IMAGE; + sourceMODisc.setActive (false); + sourceMODisc.radiusInImageSpace = true; + sourceMODisc.filled = true; + sourceMODisc.innerLineWidth = 0.; + targetCircle.datum = Geometry::IMAGE; + targetCircle.setActive (false); + targetCircle.radiusInImageSpace = true; + targetMODisc.datum = Geometry::IMAGE; + targetMODisc.setActive (false); + targetMODisc.radiusInImageSpace = true; + targetMODisc.filled = true; + targetMODisc.innerLineWidth = 0.; + sourceFeatherCircle.datum = Geometry::IMAGE; + sourceFeatherCircle.setActive (false); + sourceFeatherCircle.radiusInImageSpace = true; + sourceFeatherCircle.setDashed(true); + sourceFeatherCircle.innerLineWidth = 0.7; + targetFeatherCircle.datum = Geometry::IMAGE; + targetFeatherCircle.setActive (false); + targetFeatherCircle.radiusInImageSpace = true; + targetFeatherCircle.innerLineWidth = 0.7; + link.datum = Geometry::IMAGE; + link.setActive (false); + + auto m = ProcEventMapper::getInstance(); + EvSpotEnabled = m->newEvent(ALLNORAW, "HISTORY_MSG_SPOT"); + EvSpotEnabledOPA = m->newEvent(SPOTADJUST, "HISTORY_MSG_SPOT"); + EvSpotEntry = m->newEvent(SPOTADJUST, "HISTORY_MSG_SPOT_ENTRY"); + EvSpotEntryOPA = m->newEvent(SPOTADJUST, "HISTORY_MSG_SPOT_ENTRY"); + + show_all(); +} + +Spot::~Spot() +{ + // delete all dynamically allocated geometry + if (EditSubscriber::visibleGeometry.size()) { + for (size_t i = 0; i < EditSubscriber::visibleGeometry.size() - VISIBLE_OBJECT_COUNT; ++i) { // static visible geometry at the end of the list + delete EditSubscriber::visibleGeometry.at (i); + } + } + + // We do not delete the mouseOverGeometry, because the referenced objects are either + // shared with visibleGeometry or instantiated by the class's ctor +} + +void Spot::read (const ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener (); + + size_t oldSize = spots.size(); + spots = pp->spot.entries; + + if (pedited) { + set_inconsistent (multiImage && !pedited->spot.enabled); + } + + setEnabled (pp->spot.enabled); + lastEnabled = pp->spot.enabled; + activeSpot = -1; + lastObject = -1; + + if (batchMode) { + editedCheckBox->set_label(Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), spots.size())); + } + else { + if (spots.size() != oldSize) { + createGeometry(); + } + + updateGeometry(); + } + + enableListener (); +} + +void Spot::write (ProcParams* pp, ParamsEdited* pedited) +{ + pp->spot.enabled = getEnabled(); + pp->spot.entries = spots; + + if (pedited) { + pedited->spot.enabled = !get_inconsistent(); + pedited->spot.entries = editedCheckBox->get_active(); + } +} + +void Spot::resetPressed() +{ + if (batchMode) { + // no need to handle the Geometry in batch mode, since point editing is disabled + spots.clear(); + editedConn.block (true); + editedCheckBox->set_active (true); + editedConn.block (false); + + editedCheckBox->set_label(Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), spots.size())); + + if (listener) { + listener->panelChanged (EvSpotEntry, Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), 0)); + } + } else { + if (!spots.empty()) { + EditSubscriber::action = EditSubscriber::Action::NONE; + spots.clear(); + activeSpot = -1; + lastObject = -1; + createGeometry(); + updateGeometry(); + + if (listener) { + listener->panelChanged (edit->get_active() ? EvSpotEntryOPA : EvSpotEntry, Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), 0)); + } + } + } +} + +/** + * Release anything that's currently being dragged. + */ +void Spot::releaseEdit() +{ + Geometry *loGeom = getVisibleGeometryFromMO (lastObject); + + EditSubscriber::action = EditSubscriber::Action::NONE; + + if (!loGeom) { + return; + } + + loGeom->state = Geometry::NORMAL; + sourceIcon.state = Geometry::NORMAL; + draggedSide = DraggedSide::NONE; + updateGeometry(); +} + +void Spot::setBatchMode (bool batchMode) +{ + ToolPanel::setBatchMode (batchMode); + + if (batchMode) { + removeIfThere (labelBox, edit, false); + + if (!editedCheckBox) { + removeIfThere (labelBox, countLabel, false); + countLabel = nullptr; + editedCheckBox = Gtk::manage (new Gtk::CheckButton (Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), 0))); + labelBox->pack_start (*editedCheckBox, Gtk::PACK_SHRINK, 2); + labelBox->reorder_child (*editedCheckBox, 0); + editedConn = editedCheckBox->signal_toggled().connect ( sigc::mem_fun (*this, &Spot::editedToggled) ); + editedCheckBox->show(); + } + } +} + +void Spot::editedToggled () +{ + if (listener) { + listener->panelChanged (EvSpotEntry, !editedCheckBox->get_active() ? M ("GENERAL_UNCHANGED") : Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), spots.size())); + } +} + +void Spot::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (edit->get_active() ? EvSpotEnabledOPA : EvSpotEnabled, M ("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (edit->get_active() ? EvSpotEnabledOPA : EvSpotEnabled, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (edit->get_active() ? EvSpotEnabledOPA : EvSpotEnabled, M ("GENERAL_DISABLED")); + } + } +} + +void Spot::setEditProvider (EditDataProvider* provider) +{ + EditSubscriber::setEditProvider (provider); +} + +void Spot::editToggled () +{ + if (listener) { + if (edit->get_active()) { + listener->setTweakOperator(this); + listener->refreshPreview(EvSpotEnabledOPA); // reprocess the preview w/o creating History entry + subscribe(); + } else { + releaseEdit(); + unsubscribe(); + listener->unsetTweakOperator(this); + listener->refreshPreview(EvSpotEnabled); // reprocess the preview w/o creating History entry + } + } +} + +Geometry* Spot::getVisibleGeometryFromMO (int MOID) +{ + if (MOID == -1) { + return nullptr; + } + + if (MOID == MO_TARGET_DISK) { + return getActiveSpotIcon(); + } + + if (MOID == MO_SOURCE_DISC) { + return &sourceIcon; + } + + if (MOID > MO_OBJECT_COUNT) { + return EditSubscriber::visibleGeometry.at(MOID - MO_OBJECT_COUNT); + } + + return EditSubscriber::mouseOverGeometry.at (MOID); +} + +void Spot::createGeometry () +{ + int nbrEntry = spots.size(); + + if (!batchMode) { + countLabel->set_text (Glib::ustring::compose (M ("TP_SPOT_COUNTLABEL"), nbrEntry)); + } + + //printf("CreateGeometry(%d)\n", nbrEntry); + // delete all dynamically allocated geometry + if (EditSubscriber::visibleGeometry.size() > VISIBLE_OBJECT_COUNT) + for (size_t i = 0; i < EditSubscriber::visibleGeometry.size() - VISIBLE_OBJECT_COUNT; ++i) { // static visible geometry at the end of the list + delete EditSubscriber::visibleGeometry.at (i); + } + + // mouse over geometry starts with the static geometry, then the spot's icon geometry + EditSubscriber::mouseOverGeometry.resize (MO_OBJECT_COUNT + nbrEntry); + // visible geometry starts with the spot's icon geometry, then the static geometry + EditSubscriber::visibleGeometry.resize (nbrEntry + VISIBLE_OBJECT_COUNT); + + size_t i = 0, j = 0; + assert(i == MO_TARGET_DISK); + EditSubscriber::mouseOverGeometry.at (i++) = &targetMODisc; // MO_OBJECT_COUNT + 0 + assert(i == MO_SOURCE_DISC); + EditSubscriber::mouseOverGeometry.at (i++) = &sourceMODisc; // MO_OBJECT_COUNT + 1 + assert(i == MO_TARGET_CIRCLE); + EditSubscriber::mouseOverGeometry.at (i++) = &targetCircle; // MO_OBJECT_COUNT + 2 + assert(i == MO_SOURCE_CIRCLE); + EditSubscriber::mouseOverGeometry.at (i++) = &sourceCircle; // MO_OBJECT_COUNT + 3 + assert(i == MO_TARGET_FEATHER_CIRCLE); + EditSubscriber::mouseOverGeometry.at (i++) = &targetFeatherCircle; // MO_OBJECT_COUNT + 4 + assert(i == MO_SOURCE_FEATHER_CIRCLE); + EditSubscriber::mouseOverGeometry.at (i++) = &sourceFeatherCircle; // MO_OBJECT_COUNT + 5 + + // recreate all spots geometry + Cairo::RefPtr normalImg = sourceIcon.getNormalImg(); + Cairo::RefPtr prelightImg = sourceIcon.getPrelightImg(); + Cairo::RefPtr activeImg = sourceIcon.getActiveImg(); + + for (; j < EditSubscriber::visibleGeometry.size() - VISIBLE_OBJECT_COUNT; ++i, ++j) { + EditSubscriber::mouseOverGeometry.at (i) = EditSubscriber::visibleGeometry.at (j) = new OPIcon (normalImg, activeImg, prelightImg, Cairo::RefPtr (nullptr), Cairo::RefPtr (nullptr), Geometry::DP_CENTERCENTER); + EditSubscriber::visibleGeometry.at (j)->setActive (true); + EditSubscriber::visibleGeometry.at (j)->datum = Geometry::IMAGE; + EditSubscriber::visibleGeometry.at (j)->state = Geometry::NORMAL; + //printf("mouseOverGeometry.at(%d) = %p\n", (unsigned int)i, (void*)EditSubscriber::mouseOverGeometry.at(i)); + } + + int visibleOffset = j; + assert(j - visibleOffset == VISIBLE_SOURCE_ICON); + EditSubscriber::visibleGeometry.at (j++) = &sourceIcon; // VISIBLE_OBJECT_COUNT + 0 + assert(j - visibleOffset == VISIBLE_SOURCE_FEATHER_CIRCLE); + EditSubscriber::visibleGeometry.at (j++) = &sourceFeatherCircle; // VISIBLE_OBJECT_COUNT + 1 + assert(j - visibleOffset == VISIBLE_LINK); + EditSubscriber::visibleGeometry.at (j++) = &link; // VISIBLE_OBJECT_COUNT + 2 + assert(j - visibleOffset == VISIBLE_SOURCE_CIRCLE); + EditSubscriber::visibleGeometry.at (j++) = &sourceCircle; // VISIBLE_OBJECT_COUNT + 3 + assert(j - visibleOffset == VISIBLE_TARGET_FEATHER_CIRCLE); + EditSubscriber::visibleGeometry.at (j++) = &targetFeatherCircle; // VISIBLE_OBJECT_COUNT + 4 + assert(j - visibleOffset == VISIBLE_TARGET_CIRCLE); + EditSubscriber::visibleGeometry.at (j++) = &targetCircle; // VISIBLE_OBJECT_COUNT + 5 + static_cast(visibleOffset); +} + +void Spot::updateGeometry() +{ + EditDataProvider* dataProvider = getEditProvider(); + + if (dataProvider) { + int imW, imH; + dataProvider->getImageSize (imW, imH); + + if (activeSpot > -1) { + // Target point circle + targetCircle.center = spots.at (activeSpot).targetPos; + targetCircle.radius = spots.at (activeSpot).radius; + targetCircle.setActive (true); + + // Target point Mouse Over disc + targetMODisc.center = targetCircle.center; + targetMODisc.radius = targetCircle.radius; + targetMODisc.setActive (true); + + // Source point Icon + sourceIcon.position = spots.at (activeSpot).sourcePos; + sourceIcon.setActive (true); + + // Source point circle + sourceCircle.center = spots.at (activeSpot).sourcePos; + sourceCircle.radius = spots.at (activeSpot).radius; + sourceCircle.setActive (true); + + // Source point Mouse Over disc + sourceMODisc.center = sourceCircle.center; + sourceMODisc.radius = sourceCircle.radius; + sourceMODisc.setActive (true); + + // Target point feather circle + targetFeatherCircle.center = spots.at (activeSpot).targetPos; + targetFeatherCircle.radius = float (spots.at (activeSpot).radius) * (1.f + spots.at (activeSpot).feather); + targetFeatherCircle.radiusInImageSpace = true; + targetFeatherCircle.setActive (true); + + // Source point feather circle + sourceFeatherCircle.center = spots.at (activeSpot).sourcePos; + sourceFeatherCircle.radius = targetFeatherCircle.radius; + sourceFeatherCircle.setActive (true); + + // Link line + PolarCoord p; + p = targetCircle.center - sourceCircle.center; + + if (p.radius > sourceCircle.radius + targetCircle.radius) { + PolarCoord p2 (sourceCircle.radius, p.angle); + Coord p3; + p3 = p2; + link.begin = sourceCircle.center + p3; + p2.set (targetCircle.radius, p.angle + 180); + p3 = p2; + link.end = targetCircle.center + p3; + link.setActive (draggedSide == DraggedSide::NONE); + } else { + link.setActive (false); + } + + sourceCircle.setVisible(draggedSide != DraggedSide::SOURCE); + targetCircle.setVisible(draggedSide != DraggedSide::TARGET); + } else { + targetCircle.state = Geometry::NORMAL; + sourceCircle.state = Geometry::NORMAL; + targetFeatherCircle.state = Geometry::NORMAL; + sourceFeatherCircle.state = Geometry::NORMAL; + + targetCircle.setActive (false); + targetMODisc.setActive (false); + sourceIcon.setActive (false); + sourceCircle.setActive (false); + sourceMODisc.setActive (false); + targetFeatherCircle.setActive (false); + sourceFeatherCircle.setActive (false); + link.setActive (false); + } + + for (size_t i = 0; i < spots.size(); ++i) { + // Target point icon + OPIcon* geom = static_cast (EditSubscriber::visibleGeometry.at (i)); + geom->position = spots.at (i).targetPos; + geom->setActive (true); + + if (int (i) == activeSpot) { + geom->setHoverable (false); + } + } + } +} + +OPIcon *Spot::getActiveSpotIcon() +{ + if (activeSpot > -1) { + return static_cast (EditSubscriber::visibleGeometry.at (activeSpot)); + } + + return nullptr; +} + +void Spot::addNewEntry() +{ + EditDataProvider* editProvider = getEditProvider(); + // we create a new entry + SpotEntry se; + se.radius = spotSize->getIntValue(); + se.targetPos = editProvider->posImage; + se.sourcePos = se.targetPos; + spots.push_back (se); // this make a copy of se ... + activeSpot = spots.size() - 1; + lastObject = MO_SOURCE_DISC; + + //printf("ActiveSpot = %d\n", activeSpot); + + createGeometry(); + updateGeometry(); + EditSubscriber::visibleGeometry.at (activeSpot)->state = Geometry::ACTIVE; + sourceIcon.state = Geometry::DRAGGED; + // TODO: find a way to disable the active spot's Mouse Over geometry but still displaying its location... + + if (listener) { + listener->panelChanged (EvSpotEntryOPA, M ("TP_SPOT_ENTRYCHANGED")); + } +} + +void Spot::deleteSelectedEntry() +{ + // delete the activeSpot + if (activeSpot > -1) { + std::vector::iterator i = spots.begin(); + + for (int j = 0; j < activeSpot; ++j) { + ++i; + } + + spots.erase (i); + } + + lastObject = -1; + activeSpot = -1; + + createGeometry(); + updateGeometry(); + + if (listener) { + listener->panelChanged (EvSpotEntry, M ("TP_SPOT_ENTRYCHANGED")); + } +} + +CursorShape Spot::getCursor (int objectID, int xPos, int yPos) const +{ + const EditDataProvider* editProvider = getEditProvider(); + if (editProvider && activeSpot > -1) { + if (draggedSide != DraggedSide::NONE) { + return CSEmpty; + } + + if (objectID == MO_TARGET_DISK || objectID == MO_SOURCE_DISC) { + return CSMove2D; + } + if (objectID >= MO_TARGET_CIRCLE && objectID <= MO_SOURCE_FEATHER_CIRCLE) { + Coord delta(Coord(xPos, yPos) - ((objectID == MO_SOURCE_CIRCLE || objectID == MO_SOURCE_FEATHER_CIRCLE) ? spots.at(activeSpot).sourcePos : spots.at(activeSpot).targetPos)); + PolarCoord polarPos(delta); + if (polarPos.angle < 0.) { + polarPos.angle += 180.; + } + if (polarPos.angle < 22.5 || polarPos.angle >= 157.5) { + return CSMove1DH; + } + if (polarPos.angle < 67.5) { + return CSResizeBottomRight; + } + if (polarPos.angle < 112.5) { + return CSMove1DV; + } + return CSResizeBottomLeft; + } + } + return CSCrosshair; +} + +bool Spot::mouseOver (int modifierKey) +{ + EditDataProvider* editProvider = getEditProvider(); + + if (editProvider && editProvider->getObject() != lastObject) { + if (lastObject > -1) { + if (EditSubscriber::mouseOverGeometry.at (lastObject) == &targetMODisc) { + getVisibleGeometryFromMO (lastObject)->state = Geometry::ACTIVE; + } else { + getVisibleGeometryFromMO (lastObject)->state = Geometry::NORMAL; + } + + sourceIcon.state = Geometry::ACTIVE; + } + + if (editProvider->getObject() > -1) { + getVisibleGeometryFromMO (editProvider->getObject())->state = Geometry::PRELIGHT; + + if (editProvider->getObject() >= MO_OBJECT_COUNT) { + // a Spot is being edited + int oldActiveSpot = activeSpot; + activeSpot = editProvider->getObject() - MO_OBJECT_COUNT; + + if (activeSpot != oldActiveSpot) { + if (oldActiveSpot > -1) { + EditSubscriber::visibleGeometry.at (oldActiveSpot)->state = Geometry::NORMAL; + EditSubscriber::mouseOverGeometry.at (oldActiveSpot + MO_OBJECT_COUNT)->state = Geometry::NORMAL; + } + + EditSubscriber::visibleGeometry.at (activeSpot)->state = Geometry::PRELIGHT; + EditSubscriber::mouseOverGeometry.at (activeSpot + MO_OBJECT_COUNT)->state = Geometry::PRELIGHT; + //printf("ActiveSpot = %d (was %d before)\n", activeSpot, oldActiveSpot); + } + } + } + + lastObject = editProvider->getObject(); + + if (lastObject > -1 && EditSubscriber::mouseOverGeometry.at (lastObject) == getActiveSpotIcon()) { + lastObject = MO_TARGET_DISK; + } + + updateGeometry(); + return true; + } + + return false; +} + +// Create a new Target and Source point or start the drag of a Target point under the cursor +bool Spot::button1Pressed (int modifierKey) +{ + EditDataProvider* editProvider = getEditProvider(); + + if (editProvider) { + if (lastObject == -1 && (modifierKey & GDK_CONTROL_MASK)) { + int imW, imH; + const auto startPos = editProvider->posImage; + editProvider->getImageSize(imW, imH); + if (startPos.x < 0 || startPos.y < 0 || startPos.x > imW || startPos.y > imH) { + return false; // Outside of image area. + } + draggedSide = DraggedSide::SOURCE; + addNewEntry(); + EditSubscriber::action = EditSubscriber::Action::DRAGGING; + return true; + } else if (lastObject > -1) { + draggedSide = lastObject == MO_TARGET_DISK ? DraggedSide::TARGET : lastObject == MO_SOURCE_DISC ? DraggedSide::SOURCE : DraggedSide::NONE; + getVisibleGeometryFromMO (lastObject)->state = Geometry::DRAGGED; + EditSubscriber::action = EditSubscriber::Action::DRAGGING; + return true; + } + } + + return false; +} + +// End the drag of a Target point +bool Spot::button1Released() +{ + Geometry *loGeom = getVisibleGeometryFromMO (lastObject); + + if (!loGeom) { + EditSubscriber::action = EditSubscriber::Action::NONE; + return false; + } + + loGeom->state = Geometry::PRELIGHT; + EditSubscriber::action = EditSubscriber::Action::NONE; + draggedSide = DraggedSide::NONE; + updateGeometry(); + return true; +} + +// Delete a point +bool Spot::button2Pressed (int modifierKey) +{ + EditDataProvider* editProvider = getEditProvider(); + + if (!editProvider || lastObject == -1 || activeSpot == -1) { + return false; + } + + if (! (modifierKey & (GDK_SHIFT_MASK | GDK_SHIFT_MASK))) { + EditSubscriber::action = EditSubscriber::Action::PICKING; + } + + return false; +} + +// Create a new Target and Source point or start the drag of a Target point under the cursor +bool Spot::button3Pressed (int modifierKey) +{ + EditDataProvider* editProvider = getEditProvider(); + + if (!editProvider || lastObject == -1 || activeSpot == -1) { + return false; + } + + if ((modifierKey & GDK_CONTROL_MASK) && (EditSubscriber::mouseOverGeometry.at (lastObject) == &targetMODisc || lastObject >= MO_OBJECT_COUNT)) { + lastObject = MO_SOURCE_DISC; + sourceIcon.state = Geometry::DRAGGED; + EditSubscriber::action = EditSubscriber::Action::DRAGGING; + draggedSide = DraggedSide::SOURCE; + return true; + } else if (! (modifierKey & (GDK_SHIFT_MASK | GDK_SHIFT_MASK))) { + EditSubscriber::action = EditSubscriber::Action::PICKING; + return true; + } + + return false; +} + +bool Spot::button3Released() +{ + Geometry *loGeom = getVisibleGeometryFromMO (lastObject); + + if (!loGeom) { + EditSubscriber::action = EditSubscriber::Action::NONE; + return false; + } + + lastObject = -1; + sourceIcon.state = Geometry::ACTIVE; + draggedSide = DraggedSide::NONE; + updateGeometry(); + EditSubscriber::action = EditSubscriber::Action::NONE; + return true; +} + +bool Spot::drag1 (int modifierKey) +{ + if (EditSubscriber::action != EditSubscriber::Action::DRAGGING) { + return false; + } + + EditDataProvider *editProvider = getEditProvider(); + int imW, imH; + editProvider->getImageSize (imW, imH); + bool modified = false; + + //printf("Drag1 / LastObject=%d\n", lastObject); + + Geometry *loGeom = EditSubscriber::mouseOverGeometry.at (lastObject); + + if (loGeom == &sourceMODisc) { + //printf("sourceMODisc / deltaPrevImage = %d / %d\n", editProvider->deltaPrevImage.x, editProvider->deltaPrevImage.y); + rtengine::Coord currPos = spots.at (activeSpot).sourcePos; + spots.at (activeSpot).sourcePos += editProvider->deltaPrevImage; + spots.at (activeSpot).sourcePos.clip (imW, imH); + + if (spots.at (activeSpot).sourcePos != currPos) { + modified = true; + } + + EditSubscriber::mouseOverGeometry.at (activeSpot + MO_OBJECT_COUNT)->state = Geometry::DRAGGED; + } else if (loGeom == &targetMODisc || lastObject >= MO_OBJECT_COUNT) { + //printf("targetMODisc / deltaPrevImage = %d / %d\n", editProvider->deltaPrevImage.x, editProvider->deltaPrevImage.y); + rtengine::Coord currPos = spots.at (activeSpot).targetPos; + spots.at (activeSpot).targetPos += editProvider->deltaPrevImage; + spots.at (activeSpot).targetPos.clip (imW, imH); + + if (spots.at (activeSpot).targetPos != currPos) { + modified = true; + } + } else if (loGeom == &sourceCircle) { + //printf("sourceCircle / deltaPrevImage = %d / %d\n", editProvider->deltaImage.x, editProvider->deltaImage.y); + int lastRadius = spots.at (activeSpot).radius; + rtengine::Coord currPos = editProvider->posImage + editProvider->deltaImage; + rtengine::PolarCoord currPolar (currPos - spots.at (activeSpot).sourcePos); + spots.at (activeSpot).radius = LIM (int (currPolar.radius), SpotParams::minRadius, SpotParams::maxRadius); + + if (spots.at (activeSpot).radius != lastRadius) { + modified = true; + } + } else if (loGeom == &targetCircle) { + //printf("targetCircle / deltaPrevImage = %d / %d\n", editProvider->deltaImage.x, editProvider->deltaImage.y); + int lastRadius = spots.at (activeSpot).radius; + rtengine::Coord currPos = editProvider->posImage + editProvider->deltaImage; + rtengine::PolarCoord currPolar (currPos - spots.at (activeSpot).targetPos); + spots.at (activeSpot).radius = LIM (int (currPolar.radius), SpotParams::minRadius, SpotParams::maxRadius); + + if (spots.at (activeSpot).radius != lastRadius) { + modified = true; + } + } else if (loGeom == &sourceFeatherCircle) { + //printf("sourceFeatherCircle / deltaPrevImage = %d / %d\n", editProvider->deltaImage.x, editProvider->deltaImage.y); + float currFeather = spots.at (activeSpot).feather; + rtengine::Coord currPos = editProvider->posImage + editProvider->deltaImage; + rtengine::PolarCoord currPolar (currPos - spots.at (activeSpot).sourcePos); + spots.at (activeSpot).feather = LIM01 ((currPolar.radius - double (spots.at (activeSpot).radius)) / double (spots.at (activeSpot).radius)); + + if (spots.at (activeSpot).feather != currFeather) { + modified = true; + } + } else if (loGeom == &targetFeatherCircle) { + //printf("targetFeatherCircle / deltaPrevImage = %d / %d\n", editProvider->deltaImage.x, editProvider->deltaImage.y); + float currFeather = spots.at (activeSpot).feather; + rtengine::Coord currPos = editProvider->posImage + editProvider->deltaImage; + rtengine::PolarCoord currPolar (currPos - spots.at (activeSpot).targetPos); + spots.at (activeSpot).feather = LIM01 ((currPolar.radius - double (spots.at (activeSpot).radius)) / double (spots.at (activeSpot).radius)); + + if (spots.at (activeSpot).feather != currFeather) { + modified = true; + } + } + + if (listener && modified) { + updateGeometry(); + listener->panelChanged (EvSpotEntry, M ("TP_SPOT_ENTRYCHANGED")); + } + + return modified; +} + +bool Spot::drag3 (int modifierKey) +{ + if (EditSubscriber::action != EditSubscriber::Action::DRAGGING) { + return false; + } + + EditDataProvider *editProvider = getEditProvider(); + int imW, imH; + editProvider->getImageSize (imW, imH); + bool modified = false; + + Geometry *loGeom = EditSubscriber::mouseOverGeometry.at (lastObject); + + if (loGeom == &sourceMODisc) { + rtengine::Coord currPos = spots.at (activeSpot).sourcePos; + spots.at (activeSpot).sourcePos += editProvider->deltaPrevImage; + spots.at (activeSpot).sourcePos.clip (imW, imH); + + if (spots.at (activeSpot).sourcePos != currPos) { + modified = true; + } + } + + if (listener) { + updateGeometry(); + listener->panelChanged (EvSpotEntry, M ("TP_SPOT_ENTRYCHANGED")); + } + + return modified; +} + +bool Spot::pick2 (bool picked) +{ + return pick3 (picked); +} + +bool Spot::pick3 (bool picked) +{ + EditDataProvider* editProvider = getEditProvider(); + + if (!picked) { + if (editProvider->getObject() != lastObject) { + return false; + } + } + + // Object is picked, we delete it + deleteSelectedEntry(); + EditSubscriber::action = EditSubscriber::Action::NONE; + updateGeometry(); + return true; +} + + +void Spot::switchOffEditMode () +{ + if (edit->get_active()) { + // switching off the toggle button + bool wasBlocked = editConn.block (true); + edit->set_active (false); + + if (!wasBlocked) { + editConn.block (false); + } + } + + EditSubscriber::switchOffEditMode(); // disconnect + listener->unsetTweakOperator(this); + listener->refreshPreview(EvSpotEnabled); // reprocess the preview w/o creating History entry +} + + +void Spot::tweakParams(procparams::ProcParams& pparams) +{ + //params->raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); + //params->raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); + + // -> disabling all transform + //pparams.coarse = CoarseTransformParams(); + pparams.lensProf = LensProfParams(); + pparams.cacorrection = CACorrParams(); + pparams.distortion = DistortionParams(); + pparams.rotate = RotateParams(); + pparams.perspective = PerspectiveParams(); + pparams.vignetting = VignettingParams(); + + // -> disabling standard crop + pparams.crop.enabled = false; + + // -> disabling time consuming and unnecessary tool + pparams.sh.enabled = false; + pparams.blackwhite.enabled = false; + pparams.dehaze.enabled = false; + pparams.wavelet.enabled = false; + pparams.filmSimulation.enabled = false; + pparams.sharpenEdge.enabled = false; + pparams.sharpenMicro.enabled = false; + pparams.sharpening.enabled = false; + pparams.softlight.enabled = false; + pparams.gradient.enabled = false; + pparams.pcvignette.enabled = false; + pparams.colorappearance.enabled = false; +} diff --git a/rtgui/spot.h b/rtgui/spot.h new file mode 100644 index 000000000..236cd36ad --- /dev/null +++ b/rtgui/spot.h @@ -0,0 +1,139 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2019 Jean-Christophe FRISCH + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#ifndef _SPOT_H_ +#define _SPOT_H_ + +#include +#include "toolpanel.h" +#include "editwidgets.h" +#include "adjuster.h" +#include "../rtengine/procparams.h" +#include "../rtengine/tweakoperator.h" + +/** + * @brief Let the user create/edit/delete points for Spot Removal tool + * + * User Interface: + * + * For the rest of this documentation, T represent a "target" point (where the image is edited) and + * S represent the "source" location (where the edition takes its source data). + * + * When the edit button is active, all T points are shown by a small "dot". When the user + * move the cursor over one of them, a circle is displayed to show the radius of the brush, as well + * as a second circle representing the source data (S point). The user can then use the left mouse button + * over the icon to drag the T point. The left mouse button can be used over the S circle or the right + * mouse button can be used over the T point to move the S point. + * + * Using the left mouse button over the circle of the T point will let the user adjust its radius. + * + * Using the left mouse button over the feather circle will let the user adjust its radius by setting + * a coefficient (0.0 = same radius than the inner circle ; 1.0 = 2 times the inner radius). + * + * To create a new point, just move over a free area, and press the left mouse button while holding + * the CTRL key. This will create a new S and T pair of points. The CTRL key can be released, but keep + * the left mouse button pressed and move away to position the S point. + * + * 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). + */ + +class Spot : public ToolParamBlock, public FoldableToolPanel, public rtengine::TweakOperator, public EditSubscriber +{ + +private: + enum class DraggedSide { + NONE, + SOURCE, + TARGET + }; + + DraggedSide draggedSide; // tells which of source or target is being dragged + int lastObject; // current object that is hovered + int activeSpot; // currently active spot, being edited + std::vector spots; // list of edited spots + OPIcon sourceIcon; // to show the source location + Circle sourceCircle; // to show and change the Source radius + Circle sourceMODisc; // to change the Source position + Circle targetCircle; // to show and change the Target radius + Circle targetMODisc; // to change the Target position + Circle sourceFeatherCircle; // to show the Feather radius at the Source position + Circle targetFeatherCircle; // to show the Feather radius at the Target position + Line link; // to show the link between the Source and Target position + + OPIcon *getActiveSpotIcon (); + void updateGeometry (); + void createGeometry (); + void addNewEntry (); + void deleteSelectedEntry (); + void resetPressed (); + void releaseEdit(); + +protected: + Gtk::Box* labelBox; + Gtk::CheckButton* editedCheckBox; + Gtk::Label* countLabel; + Gtk::ToggleButton* edit; + Gtk::Button* reset; + Adjuster* spotSize; + sigc::connection editConn, editedConn; + + void editToggled (); + void editedToggled (); + Geometry* getVisibleGeometryFromMO (int MOID); + +public: + static const Glib::ustring TOOL_NAME; + + Spot (); + ~Spot (); + + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + + void enabledChanged () override; + + void setEditProvider (EditDataProvider* provider) override; + + void setBatchMode (bool batchMode) override; + + // EditSubscriber interface + CursorShape getCursor (int objectID, int xPos, int yPos) const override; + bool mouseOver (int modifierKey) override; + bool button1Pressed (int modifierKey) override; + bool button1Released () override; + bool button2Pressed (int modifierKey) override; + bool button3Pressed (int modifierKey) override; + bool button3Released () override; + bool drag1 (int modifierKey) override; + bool drag3 (int modifierKey) override; + bool pick2 (bool picked) override; + bool pick3 (bool picked) override; + void switchOffEditMode () override; + + //TweakOperator interface + void tweakParams(rtengine::procparams::ProcParams& pparams) override; + + rtengine::ProcEvent EvSpotEnabled; + rtengine::ProcEvent EvSpotEnabledOPA; // used to toggle-on the Spot 'On Preview Adjustment' mode + rtengine::ProcEvent EvSpotEntry; + rtengine::ProcEvent EvSpotEntryOPA; +}; + +#endif diff --git a/rtgui/thresholdadjuster.cc b/rtgui/thresholdadjuster.cc index c6ba96111..1f8b1c967 100644 --- a/rtgui/thresholdadjuster.cc +++ b/rtgui/thresholdadjuster.cc @@ -34,6 +34,7 @@ ThresholdAdjuster::ThresholdAdjuster (Glib::ustring label, : tSelector(minValueBottom, maxValueBottom, defBottom, labelBottom, precisionBottom, minValueTop, maxValueTop, defTop, labelTop, precisionTop, curveProvider) { + set_orientation(Gtk::ORIENTATION_VERTICAL); initialDefaultVal[ThresholdSelector::TS_BOTTOMLEFT] = defBottom; initialDefaultVal[ThresholdSelector::TS_TOPLEFT] = defTop; initialDefaultVal[ThresholdSelector::TS_BOTTOMRIGHT] = 0.; // unused @@ -46,6 +47,7 @@ ThresholdAdjuster::ThresholdAdjuster (Glib::ustring label, double minValue, doub double defTop, unsigned int precision, bool startAtOne, bool editedCheckBox) : tSelector(minValue, maxValue, defBottom, defTop, precision, startAtOne) { + set_orientation(Gtk::ORIENTATION_VERTICAL); initialDefaultVal[ThresholdSelector::TS_BOTTOMLEFT] = defBottom; initialDefaultVal[ThresholdSelector::TS_TOPLEFT] = defTop; initialDefaultVal[ThresholdSelector::TS_BOTTOMRIGHT] = maxValue; @@ -60,6 +62,7 @@ ThresholdAdjuster::ThresholdAdjuster (Glib::ustring label, double minValue, doub : tSelector(minValue, maxValue, defBottomLeft, defTopLeft, defBottomRight, defTopRight, precision, startAtOne) { + set_orientation(Gtk::ORIENTATION_VERTICAL); initialDefaultVal[ThresholdSelector::TS_BOTTOMLEFT] = defBottomLeft; initialDefaultVal[ThresholdSelector::TS_TOPLEFT] = defTopLeft; initialDefaultVal[ThresholdSelector::TS_BOTTOMRIGHT] = defBottomRight; @@ -81,7 +84,7 @@ void ThresholdAdjuster::initObject (Glib::ustring label, bool editedcb) set_name("ThresholdAdjuster"); - hbox = Gtk::manage (new Gtk::HBox ()); + hbox = Gtk::manage (new Gtk::Box ()); this->label = Gtk::manage (new Gtk::Label (label, Gtk::ALIGN_START)); diff --git a/rtgui/thresholdadjuster.h b/rtgui/thresholdadjuster.h index b28f68dee..8f67d5ef5 100644 --- a/rtgui/thresholdadjuster.h +++ b/rtgui/thresholdadjuster.h @@ -46,11 +46,11 @@ public: }; -class ThresholdAdjuster : public Gtk::VBox +class ThresholdAdjuster : public Gtk::Box { protected: - Gtk::HBox* hbox; + Gtk::Box* hbox; Gtk::Label* label; ThresholdSelector tSelector; //MySpinButton* spin; diff --git a/rtgui/thresholdselector.cc b/rtgui/thresholdselector.cc index 35d08279c..61043525c 100644 --- a/rtgui/thresholdselector.cc +++ b/rtgui/thresholdselector.cc @@ -714,7 +714,7 @@ void ThresholdSelector::findSecondaryMovedCursor(guint state) } } -void ThresholdSelector::styleChanged (const Glib::RefPtr& style) +void ThresholdSelector::styleChanged (const Glib::RefPtr& style) { queue_draw (); diff --git a/rtgui/thresholdselector.h b/rtgui/thresholdselector.h index f948b56ad..bf1d7c952 100644 --- a/rtgui/thresholdselector.h +++ b/rtgui/thresholdselector.h @@ -113,10 +113,10 @@ protected: void updateBackBuffer(); 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 get_preferred_height_vfunc (int& minimum_height, int& natural_height) const final; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const final; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const final; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const final; void on_realize () override; bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; bool on_button_press_event (GdkEventButton* event) override; @@ -215,7 +215,7 @@ public: { return doubleThresh; } - void styleChanged (const Glib::RefPtr& style); + void styleChanged (const Glib::RefPtr& style); unsigned int getPrecision () { return precisionTop; diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 5f75ab413..8f3499c2a 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -34,6 +34,9 @@ ThumbBrowserBase::ThumbBrowserBase () { inW = -1; inH = -1; + + hscroll.set_orientation(Gtk::ORIENTATION_HORIZONTAL); + vscroll.set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(&internal, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); setExpandAlignProperties(&hscroll, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); @@ -87,7 +90,16 @@ void ThumbBrowserBase::scroll (int direction, double deltaX, double deltaY) } //GDK_SCROLL_SMOOTH can come in as many events with small deltas, don't quantize these to +/-1.0 so trackpads work well double coef; + double scroll_unit; + if (arrangement == TB_Vertical) { + scroll_unit = vscroll.get_adjustment()->get_step_increment(); + } else { + scroll_unit = hscroll.get_adjustment()->get_step_increment(); + } if(direction == GDK_SCROLL_SMOOTH) { +#ifdef GDK_WINDOWING_QUARTZ + scroll_unit = 1.0; +#endif coef = delta; } else if (direction == GDK_SCROLL_DOWN) { coef = +1.0; @@ -99,7 +111,7 @@ void ThumbBrowserBase::scroll (int direction, double deltaX, double deltaY) 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(), + double newValue = rtengine::LIM(currValue + coef * scroll_unit, vscroll.get_adjustment()->get_lower (), vscroll.get_adjustment()->get_upper()); if (newValue != currValue) { @@ -107,7 +119,7 @@ void ThumbBrowserBase::scroll (int direction, double deltaX, double deltaY) } } else { double currValue = hscroll.get_value(); - double newValue = rtengine::LIM(currValue + coef * hscroll.get_adjustment()->get_step_increment(), + double newValue = rtengine::LIM(currValue + coef * scroll_unit, hscroll.get_adjustment()->get_lower(), hscroll.get_adjustment()->get_upper()); if (newValue != currValue) { @@ -1079,6 +1091,25 @@ bool ThumbBrowserBase::Internal::on_scroll_event (GdkEventScroll* event) } +void ThumbBrowserBase::resort () +{ + { + MYWRITERLOCK(l, entryRW); + + std::sort( + fd.begin(), + fd.end(), + [](const ThumbBrowserEntryBase* a, const ThumbBrowserEntryBase* b) + { + bool lt = a->compare(*b, options.sortMethod); + return options.sortDescending ? !lt : lt; + } + ); + } + + redraw (); +} + void ThumbBrowserBase::redraw (ThumbBrowserEntryBase* entry) { @@ -1206,9 +1237,30 @@ void ThumbBrowserBase::enableTabMode(bool enable) } } -void ThumbBrowserBase::initEntry (ThumbBrowserEntryBase* entry) +void ThumbBrowserBase::insertEntry (ThumbBrowserEntryBase* entry) { - entry->setOffset ((int)(hscroll.get_value()), (int)(vscroll.get_value())); + // find place in sort order + { + MYWRITERLOCK(l, entryRW); + + fd.insert( + std::lower_bound( + fd.begin(), + fd.end(), + entry, + [](const ThumbBrowserEntryBase* a, const ThumbBrowserEntryBase* b) + { + bool lt = a->compare(*b, options.sortMethod); + return options.sortDescending ? !lt : lt; + } + ), + entry + ); + + entry->setOffset ((int)(hscroll.get_value()), (int)(vscroll.get_value())); + } + + redraw (); } void ThumbBrowserBase::getScrollPosition (double& h, double& v) diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index b4caac0a9..8c1ec49c8 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -60,10 +60,10 @@ class ThumbBrowserBase : 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; + void get_preferred_height_vfunc (int &minimum_height, int &natural_height) const final; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const final; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const final; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const final; bool on_button_press_event (GdkEventButton* event) override; bool on_button_release_event (GdkEventButton* event) override; @@ -116,8 +116,8 @@ protected: virtual int getThumbnailHeight () = 0; Internal internal; - Gtk::HScrollbar hscroll; - Gtk::VScrollbar vscroll; + Gtk::Scrollbar hscroll; + Gtk::Scrollbar vscroll; int inW, inH; @@ -208,12 +208,13 @@ public: return fd; } void on_style_updated () override; + void resort (); // re-apply sort method void redraw (ThumbBrowserEntryBase* entry = nullptr); // 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 void refreshEditedState (const std::set& efiles); - void initEntry (ThumbBrowserEntryBase* entry); + void insertEntry (ThumbBrowserEntryBase* entry); void getScrollPosition (double& h, double& v); void setScrollPosition (double h, double v); diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 3840c8bf9..3d1e6bdc4 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -119,7 +119,7 @@ Glib::ustring getPaddedName(const Glib::ustring& name) } -ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : +ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname, Thumbnail *thm) : fnlabw(0), fnlabh(0), dtlabw(0), @@ -135,7 +135,6 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : textGap(6), sideMargin(8), lowerMargin(8), - preview(nullptr), dispname(Glib::path_get_basename(fname)), buttonSet(nullptr), width(0), @@ -154,7 +153,8 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : bbPreview(nullptr), cursor_type(CSUndefined), collate_name(getPaddedName(dispname).casefold_collate_key()), - thumbnail(nullptr), + collate_exif(getPaddedName(thm->getExifString()).casefold_collate_key()), + thumbnail(thm), filename(fname), selected(false), drawable(false), @@ -171,7 +171,6 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : ThumbBrowserEntryBase::~ThumbBrowserEntryBase () { - delete[] preview; delete buttonSet; } @@ -207,7 +206,7 @@ void ThumbBrowserEntryBase::updateBackBuffer () bbSelected = selected; bbFramed = framed; - bbPreview = preview; + bbPreview = preview.data(); Cairo::RefPtr cc = Cairo::Context::create(surface); @@ -237,16 +236,20 @@ void ThumbBrowserEntryBase::updateBackBuffer () if (buttonSet) { int tmp; - buttonSet->getAllocatedDimensions (tmp, bsHeight); + buttonSet->getAllocatedDimensions(tmp, bsHeight); } + int infow, infoh; + getTextSizes(infow, infoh); + // draw preview frame //backBuffer->draw_rectangle (cc, false, (exp_width-prew)/2, upperMargin+bsHeight, prew+1, preh+1); // draw thumbnail image - if (preview) { + if (!preview.empty()) { prex = borderWidth + (exp_width - prew) / 2; - prey = upperMargin + bsHeight + borderWidth; - backBuffer->copyRGBCharData(preview, 0, 0, prew, preh, prew * 3, prex, prey); + const int hh = exp_height - (upperMargin + bsHeight + borderWidth + infoh + lowerMargin); + prey = upperMargin + bsHeight + borderWidth + std::max((hh - preh) / 2, 0); + backBuffer->copyRGBCharData(preview.data(), 0, 0, prew, preh, prew * 3, prex, prey); } customBackBufferUpdate (cc); @@ -255,9 +258,6 @@ void ThumbBrowserEntryBase::updateBackBuffer () bbIcons = getIconsOnImageArea (); bbSpecificityIcons = getSpecificityIconsOnImageArea (); - int infow, infoh; - getTextSizes (infow, infoh); - int iofs_x = 4, iofs_y = 4; int istartx = prex; int istarty = prey; @@ -356,7 +356,7 @@ void ThumbBrowserEntryBase::updateBackBuffer () textposx_dt = 0; } - textposy = upperMargin + bsHeight + 2 * borderWidth + preh + borderWidth + textGap; + textposy = exp_height - lowerMargin - infoh; textw = exp_width - 2 * textGap; if (selected) { @@ -447,7 +447,7 @@ void ThumbBrowserEntryBase::getTextSizes (int& infow, int& infoh) Glib::RefPtr fn = w->create_pango_layout(dispname); fn->get_pixel_size (fnlabw, fnlabh); - // calculate cummulated height of all info fields + // calculate cumulated height of all info fields infoh = fnlabh; infow = 0; @@ -556,10 +556,7 @@ void ThumbBrowserEntryBase::resize (int h) } if (preh != old_preh || prew != old_prew) { // if new thumbnail height or new orientation - if (preview) { - delete [] preview; - preview = nullptr; - } + preview.clear(); refreshThumbnailImage (); } else if (backBuffer) { backBuffer->setDirty(true); // This will force a backBuffer update on queue_draw @@ -620,7 +617,7 @@ void ThumbBrowserEntryBase::draw (Cairo::RefPtr cc) bbHeight = backBuffer->getHeight(); } - if (!backBuffer || selected != bbSelected || framed != bbFramed || preview != bbPreview + if (!backBuffer || selected != bbSelected || framed != bbFramed || preview.data() != bbPreview || exp_width != bbWidth || exp_height != bbHeight || getIconsOnImageArea () != bbIcons || getSpecificityIconsOnImageArea() != bbSpecificityIcons || backBuffer->isDirty()) { @@ -680,7 +677,7 @@ rtengine::Coord2D ThumbBrowserEntryBase::getPosInImgSpace (int x, int y) const { rtengine::Coord2D coord(-1., -1.); - if (preview) { + if (!preview.empty()) { x -= ofsX + startx; y -= ofsY + starty; diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index dbc6cf73e..3db03a96e 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -26,6 +26,8 @@ #include "guiutils.h" #include "lwbuttonset.h" #include "threadutils.h" +#include "options.h" +#include "thumbnail.h" #include "../rtengine/coord2d.h" @@ -59,7 +61,7 @@ protected: MyRWMutex lockRW; // Locks access to all image thumb changing actions - guint8* preview; // holds the preview image. used in updateBackBuffer. TODO Olli: Make a cache to reduce mem significantly + std::vector preview; // holds the preview image. used in updateBackBuffer. Glib::ustring dispname; @@ -95,6 +97,7 @@ protected: private: const std::string collate_name; + const std::string collate_exif; public: @@ -117,7 +120,7 @@ public: bool updatepriority; eWithFilename withFilename; - explicit ThumbBrowserEntryBase (const Glib::ustring& fname); + explicit ThumbBrowserEntryBase (const Glib::ustring& fname, Thumbnail *thm); virtual ~ThumbBrowserEntryBase (); void setParent (ThumbBrowserBase* l) @@ -174,9 +177,32 @@ public: void setPosition (int x, int y, int w, int h); void setOffset (int x, int y); - bool operator <(const ThumbBrowserEntryBase& other) const + bool compare (const ThumbBrowserEntryBase& other, Options::SortMethod method) const { - return collate_name < other.collate_name; + int cmp = 0; + switch (method){ + case Options::SORT_BY_NAME: + return collate_name < other.collate_name; + case Options::SORT_BY_DATE: + cmp = thumbnail->getDateTime().compare(other.thumbnail->getDateTime()); + break; + case Options::SORT_BY_EXIF: + cmp = collate_exif.compare(other.collate_exif); + break; + case Options::SORT_BY_RANK: + cmp = thumbnail->getRank() - other.thumbnail->getRank(); + break; + case Options::SORT_BY_LABEL: + cmp = thumbnail->getColorLabel() - other.thumbnail->getColorLabel(); + break; + case Options::SORT_METHOD_COUNT: abort(); + } + + // Always fall back to sorting by name + if (!cmp) + cmp = collate_name.compare(other.collate_name); + + return cmp < 0; } virtual void refreshThumbnailImage () = 0; diff --git a/rtgui/thumbimageupdater.cc b/rtgui/thumbimageupdater.cc index 554ccee40..65958797e 100644 --- a/rtgui/thumbimageupdater.cc +++ b/rtgui/thumbimageupdater.cc @@ -47,8 +47,8 @@ public: Job(ThumbBrowserEntryBase* tbe, bool* priority, bool upgrade, ThumbImageUpdateListener* listener): tbe_(tbe), - /*pparams_(pparams), - height_(height), */ + /*pparams_(pparams), + height_(height), */ priority_(priority), upgrade_(upgrade), listener_(listener) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 5295b9d61..96a8bf849 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -31,6 +31,7 @@ #include "../rtengine/procparams.h" #include "../rtengine/rtthumbnail.h" #include +#include #include "../rtengine/dynamicprofile.h" #include "../rtengine/profilestore.h" @@ -39,6 +40,7 @@ #include "guiutils.h" #include "batchqueue.h" #include "extprog.h" +#include "md5helper.h" #include "pathutils.h" #include "paramsedited.h" #include "procparamchangers.h" @@ -120,7 +122,7 @@ void Thumbnail::_generateThumbnailImage () tpp = nullptr; delete [] lastImg; lastImg = nullptr; - tw = -1; + tw = options.maxThumbnailWidth; th = options.maxThumbnailHeight; imgRatio = -1.; @@ -137,20 +139,20 @@ void Thumbnail::_generateThumbnailImage () if (ext == "jpg" || ext == "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, pparams->wb.observer); if (tpp) { cfs.format = FT_Jpeg; } } else if (ext == "png") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams->wb.equal); + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); if (tpp) { cfs.format = FT_Png; } } else if (ext == "tif" || ext == "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, pparams->wb.observer); if (tpp) { cfs.format = FT_Tiff; @@ -171,7 +173,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, pparams->wb.observer, TRUE); } cfs.sensortype = sensorType; @@ -193,7 +195,7 @@ void Thumbnail::_generateThumbnailImage () } } -bool Thumbnail::isSupported () +bool Thumbnail::isSupported () const { return cfs.supported; } @@ -214,11 +216,11 @@ const ProcParams& Thumbnail::getProcParamsU () if (pparams->wb.method == "Camera") { double ct; - getCamWB (ct, pparams->wb.green); + getCamWB (ct, pparams->wb.green, pparams->wb.observer); pparams->wb.temperature = ct; - } else if (pparams->wb.method == "Auto") { + } else if (pparams->wb.method == "autold") { double ct; - getAutoWB (ct, pparams->wb.green, pparams->wb.equal, pparams->wb.tempBias); + getAutoWB (ct, pparams->wb.green, pparams->wb.equal, pparams->wb.observer, pparams->wb.tempBias); pparams->wb.temperature = ct; } } @@ -265,7 +267,7 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu // Should we ask all frame's MetaData ? imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true); } - PartialProfile *pp = ProfileStore::getInstance()->loadDynamicProfile(imageMetaData); + PartialProfile *pp = ProfileStore::getInstance()->loadDynamicProfile(imageMetaData, fname); delete imageMetaData; int err = pp->pparams->save(outFName); pp->deleteInstance(); @@ -450,6 +452,7 @@ void Thumbnail::setProcParams (const ProcParams& pp, ParamsEdited* pe, int whoCh const bool needsReprocessing = resetToDefault || pparams->toneCurve != pp.toneCurve + || pparams->locallab != pp.locallab || pparams->labCurve != pp.labCurve || pparams->localContrast != pp.localContrast || pparams->rgbCurves != pp.rgbCurves @@ -460,6 +463,7 @@ void Thumbnail::setProcParams (const ProcParams& pp, ParamsEdited* pe, int whoCh || pparams->epd != pp.epd || pparams->fattal != pp.fattal || pparams->sh != pp.sh + || pparams->toneEqualizer != pp.toneEqualizer || pparams->crop != pp.crop || pparams->coarse != pp.coarse || pparams->commonTrans != pp.commonTrans @@ -587,10 +591,13 @@ void Thumbnail::decreaseRef () cachemgr->closeThumbnail (this); } -int Thumbnail::getThumbnailWidth (const int h, const rtengine::procparams::ProcParams *pparams) const +void Thumbnail::getThumbnailSize(int &w, int &h, const rtengine::procparams::ProcParams *pparams) { + MyMutex::MyLock lock(mutex); + int tw_ = tw; int th_ = th; + float imgRatio_ = imgRatio; if (pparams) { @@ -615,10 +622,16 @@ int Thumbnail::getThumbnailWidth (const int h, const rtengine::procparams::ProcP } } - if (imgRatio_ > 0.f) { - return imgRatio_ * h; + if (imgRatio_ > 0.) { + w = imgRatio_ * static_cast(h); } else { - return tw_ * h / th_; + w = tw_ * h / th_; + } + + if (w > options.maxThumbnailWidth) { + const float s = static_cast(options.maxThumbnailWidth) / w; + w = options.maxThumbnailWidth; + h = std::max(h * s, 1); } } @@ -644,7 +657,7 @@ void Thumbnail::getFinalSize (const rtengine::procparams::ProcParams& pparams, i } } -void Thumbnail::getOriginalSize (int& w, int& h) +void Thumbnail::getOriginalSize (int& w, int& h) const { w = tw; h = th; @@ -707,11 +720,44 @@ rtengine::IImage8* Thumbnail::upgradeThumbImage (const rtengine::procparams::Pro void Thumbnail::generateExifDateTimeStrings () { + if (cfs.timeValid) { + std::string dateFormat = options.dateFormat; + std::ostringstream ostr; + bool spec = false; - exifString = ""; - dateTimeString = ""; + for (size_t i = 0; i < dateFormat.size(); i++) + if (spec && dateFormat[i] == 'y') { + ostr << cfs.year; + spec = false; + } else if (spec && dateFormat[i] == 'm') { + ostr << (int)cfs.month; + spec = false; + } else if (spec && dateFormat[i] == 'd') { + ostr << (int)cfs.day; + spec = false; + } else if (dateFormat[i] == '%') { + spec = true; + } else { + ostr << (char)dateFormat[i]; + spec = false; + } + + ostr << " " << (int)cfs.hour; + ostr << ":" << std::setw(2) << std::setfill('0') << (int)cfs.min; + ostr << ":" << std::setw(2) << std::setfill('0') << (int)cfs.sec; + + dateTimeString = ostr.str (); + dateTime = Glib::DateTime::create_local(cfs.year, cfs.month, cfs.day, + cfs.hour, cfs.min, cfs.sec); + } + + if (!dateTime.gobj() || !cfs.timeValid) { + dateTimeString = ""; + dateTime = Glib::DateTime::create_now_utc(0); + } if (!cfs.exifValid) { + exifString = ""; return; } @@ -720,33 +766,6 @@ void Thumbnail::generateExifDateTimeStrings () if (options.fbShowExpComp && cfs.expcomp != "0.00" && !cfs.expcomp.empty()) { // don't show exposure compensation if it is 0.00EV;old cache files do not have ExpComp, so value will not be displayed. exifString = Glib::ustring::compose ("%1 %2EV", exifString, cfs.expcomp); // append exposure compensation to exifString } - - std::string dateFormat = options.dateFormat; - std::ostringstream ostr; - bool spec = false; - - for (size_t i = 0; i < dateFormat.size(); i++) - if (spec && dateFormat[i] == 'y') { - ostr << cfs.year; - spec = false; - } else if (spec && dateFormat[i] == 'm') { - ostr << (int)cfs.month; - spec = false; - } else if (spec && dateFormat[i] == 'd') { - ostr << (int)cfs.day; - spec = false; - } else if (dateFormat[i] == '%') { - spec = true; - } else { - ostr << (char)dateFormat[i]; - spec = false; - } - - ostr << " " << (int)cfs.hour; - ostr << ":" << std::setw(2) << std::setfill('0') << (int)cfs.min; - ostr << ":" << std::setw(2) << std::setfill('0') << (int)cfs.sec; - - dateTimeString = ostr.str (); } const Glib::ustring& Thumbnail::getExifString () const @@ -761,10 +780,16 @@ const Glib::ustring& Thumbnail::getDateTimeString () const return dateTimeString; } -void Thumbnail::getAutoWB (double& temp, double& green, double equal, double tempBias) +const Glib::DateTime& Thumbnail::getDateTime () const +{ + + return dateTime; +} + +void Thumbnail::getAutoWB (double& temp, double& green, double equal, rtengine::StandardObserver observer, double tempBias) { if (cfs.redAWBMul != -1.0) { - rtengine::ColorTemp ct(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul, equal); + rtengine::ColorTemp ct(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul, equal, observer); temp = ct.getTemp(); green = ct.getGreen(); } else { @@ -773,7 +798,7 @@ void Thumbnail::getAutoWB (double& temp, double& green, double equal, double tem } -ThFileType Thumbnail::getType () +ThFileType Thumbnail::getType () const { return (ThFileType) cfs.format; @@ -791,6 +816,16 @@ int Thumbnail::infoFromImage (const Glib::ustring& fname, std::unique_ptrgetDateTimeAsTS() > 0) { + cfs.year = 1900 + idata->getDateTime().tm_year; + cfs.month = idata->getDateTime().tm_mon + 1; + cfs.day = idata->getDateTime().tm_mday; + cfs.hour = idata->getDateTime().tm_hour; + cfs.min = idata->getDateTime().tm_min; + cfs.sec = idata->getDateTime().tm_sec; + cfs.timeValid = true; + } + if (idata->hasExif()) { cfs.shutter = idata->getShutterSpeed (); cfs.fnumber = idata->getFNumber (); @@ -803,18 +838,11 @@ int Thumbnail::infoFromImage (const Glib::ustring& fname, std::unique_ptrgetPixelShift (); cfs.frameCount = idata->getFrameCount (); cfs.sampleFormat = idata->getSampleFormat (); - cfs.year = 1900 + idata->getDateTime().tm_year; - cfs.month = idata->getDateTime().tm_mon + 1; - cfs.day = idata->getDateTime().tm_mday; - cfs.hour = idata->getDateTime().tm_hour; - cfs.min = idata->getDateTime().tm_min; - cfs.sec = idata->getDateTime().tm_sec; - cfs.timeValid = true; - cfs.exifValid = true; cfs.lens = idata->getLens(); cfs.camMake = idata->getMake(); cfs.camModel = idata->getModel(); cfs.rating = idata->getRating(); + cfs.exifValid = true; if (idata->getOrientation() == "Rotate 90 CW") { deg = 90; @@ -873,7 +901,7 @@ void Thumbnail::_loadThumbnail(bool firstTrial) if (!succ && firstTrial) { _generateThumbnailImage (); - if (cfs.supported && firstTrial) { + if (cfs.supported) { _loadThumbnail (false); } @@ -887,11 +915,6 @@ void Thumbnail::_loadThumbnail(bool firstTrial) } if ( cfs.thumbImgType == CacheImageData::FULL_THUMBNAIL ) { - if(!tpp->isAeValid()) { - // load aehistogram - tpp->readAEHistogram (getCacheFileName ("aehistograms", "")); - } - // load embedded profile tpp->readEmbProfile (getCacheFileName ("embprofiles", ".icc")); @@ -903,20 +926,6 @@ void Thumbnail::_loadThumbnail(bool firstTrial) } } -/* - * Read all thumbnail's data from the cache; build and save them if doesn't exist - MUTEX PROTECTED - * This includes: - * - image's bitmap (*.rtti) - * - auto exposure's histogram (full thumbnail only) - * - embedded profile (full thumbnail only) - * - LiveThumbData section of the data file - */ -void Thumbnail::loadThumbnail (bool firstTrial) -{ - MyMutex::MyLock lock(mutex); - _loadThumbnail(firstTrial); -} - /* * Save thumbnail's data to the cache - NON PROTECTED * This includes: @@ -937,10 +946,6 @@ void Thumbnail::_saveThumbnail () // save thumbnail image tpp->writeImage (getCacheFileName ("images", "")); - if(!tpp->isAeValid()) { - // save aehistogram - tpp->writeAEHistogram (getCacheFileName ("aehistograms", "")); - } // save embedded profile tpp->writeEmbProfile (getCacheFileName ("embprofiles", ".icc")); @@ -1002,7 +1007,7 @@ void Thumbnail::setFileName (const Glib::ustring &fn) { fname = fn; - cfs.md5 = cachemgr->getMD5 (fname); + cfs.md5 = ::getMD5 (fname); } int Thumbnail::getRank () const @@ -1151,10 +1156,10 @@ bool Thumbnail::imageLoad(bool loading) return false; } -void Thumbnail::getCamWB(double& temp, double& green) const +void Thumbnail::getCamWB(double& temp, double& green, rtengine::StandardObserver observer) const { if (tpp) { - tpp->getCamWB (temp, green); + tpp->getCamWB (temp, green, observer); } else { temp = green = -1.0; } @@ -1176,7 +1181,7 @@ void Thumbnail::applyAutoExp (rtengine::procparams::ProcParams& pparams) } } -const CacheImageData* Thumbnail::getCacheImageData() +const CacheImageData* Thumbnail::getCacheImageData() const { return &cfs; } diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index c22c80cea..4d0355747 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -22,6 +22,7 @@ #include #include +#include #include "cacheimagedata.h" #include "threadutils.h" @@ -73,6 +74,7 @@ class Thumbnail // exif & date/time strings Glib::ustring exifString; Glib::ustring dateTimeString; + Glib::DateTime dateTime; bool initial_; @@ -83,7 +85,6 @@ class Thumbnail void _saveThumbnail (); void _generateThumbnailImage (); int infoFromImage (const Glib::ustring& fname, std::unique_ptr rml = nullptr); - void loadThumbnail (bool firstTrial = true); void generateExifDateTimeStrings (); Glib::ustring getCacheFileName (const Glib::ustring& subdir, const Glib::ustring& fext) const; @@ -119,27 +120,28 @@ public: // 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); - int getThumbnailWidth (int h, const rtengine::procparams::ProcParams *pparams = nullptr) const; + 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); + void getOriginalSize (int& w, int& h) const; const Glib::ustring& getExifString () const; const Glib::ustring& getDateTimeString () const; - void getCamWB (double& temp, double& green) const; - void getAutoWB (double& temp, double& green, double equal, double tempBias); + const Glib::DateTime& getDateTime () const; + void getCamWB (double& temp, double& green, rtengine::StandardObserver observer) const; + void getAutoWB (double& temp, double& green, double equal, rtengine::StandardObserver observer, double tempBias); void getSpotWB (int x, int y, int rect, double& temp, double& green); void applyAutoExp (rtengine::procparams::ProcParams& pparams); - ThFileType getType (); + ThFileType getType () const; Glib::ustring getFileName () const { return fname; } void setFileName (const Glib::ustring &fn); - bool isSupported (); + bool isSupported () const; - const CacheImageData* getCacheImageData(); + const CacheImageData* getCacheImageData() const; std::string getMD5 () const; int getRank () const; diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index dc9b17fa9..bf81c6f22 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -21,12 +21,9 @@ #include #include "tonecurve.h" - -#include "adjuster.h" #include "curveeditor.h" #include "curveeditorgroup.h" #include "eventmapper.h" -#include "ppversion.h" #include "options.h" #include "../rtengine/procparams.h" @@ -36,135 +33,153 @@ using namespace rtengine; using namespace rtengine::procparams; -ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LABEL")) +const Glib::ustring ToneCurve::TOOL_NAME = "tonecurve"; + +ToneCurve::ToneCurve() : FoldableToolPanel(this, TOOL_NAME, M("TP_EXPOSURE_LABEL")) { 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"); + EvHLbl = m->newEvent(DEMOSAIC, "HISTORY_MSG_HLBL"); + EvHLth = m->newEvent(DEMOSAIC, "HISTORY_MSG_HLTH"); CurveListener::setMulti(true); std::vector bottomMilestones; - bottomMilestones.push_back( GradientMilestone(0., 0., 0., 0.) ); - bottomMilestones.push_back( GradientMilestone(1., 1., 1., 1.) ); + 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())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); clampOOG->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::clampOOGChanged)); //----------- Auto Levels ---------------------------------- - abox = Gtk::manage (new Gtk::HBox ()); + abox = Gtk::manage (new Gtk::Box ()); abox->set_spacing (4); - autolevels = Gtk::manage (new Gtk::ToggleButton (M("TP_EXPOSURE_AUTOLEVELS"))); - autolevels->set_tooltip_markup (M("TP_EXPOSURE_AUTOLEVELS_TIP")); - autoconn = autolevels->signal_toggled().connect( sigc::mem_fun(*this, &ToneCurve::autolevels_toggled) ); + autolevels = Gtk::manage(new Gtk::ToggleButton(M("TP_EXPOSURE_AUTOLEVELS"))); + autolevels->set_tooltip_markup(M("TP_EXPOSURE_AUTOLEVELS_TOOLTIP")); + autoconn = autolevels->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::autolevels_toggled)); - lclip = Gtk::manage (new Gtk::Label (M("TP_EXPOSURE_CLIP"))); - lclip->set_tooltip_text (M("TP_EXPOSURE_CLIP_TIP")); + lclip = Gtk::manage(new Gtk::Label(M("TP_EXPOSURE_CLIP"))); + lclip->set_tooltip_text(M("TP_EXPOSURE_CLIP_TOOLTIP")); - sclip = Gtk::manage (new MySpinButton ()); - sclip->set_range (0.0, 0.99); - sclip->set_increments (0.01, 0.10); - sclip->set_value (0.02); - sclip->set_digits (2); + sclip = Gtk::manage(new MySpinButton()); + sclip->set_range(0.0, 0.99); + sclip->set_increments(0.01, 0.10); + sclip->set_value(0.02); + sclip->set_digits(2); sclip->set_width_chars(4); sclip->set_max_width_chars(4); - sclip->signal_value_changed().connect( sigc::mem_fun(*this, &ToneCurve::clip_changed) ); + sclip->signal_value_changed().connect(sigc::mem_fun(*this, &ToneCurve::clip_changed)); - neutral = Gtk::manage (new Gtk::Button (M("TP_NEUTRAL"))); - neutral->set_tooltip_text (M("TP_NEUTRAL_TIP")); - neutralconn = neutral->signal_pressed().connect( sigc::mem_fun(*this, &ToneCurve::neutral_pressed) ); + neutral = Gtk::manage(new Gtk::Button(M("TP_NEUTRAL"))); + neutral->set_tooltip_text(M("TP_NEUTRAL_TOOLTIP")); + neutralconn = neutral->signal_pressed().connect(sigc::mem_fun(*this, &ToneCurve::neutral_pressed)); neutral->show(); - abox->pack_start (*autolevels, true, true, 0); + abox->pack_start(*autolevels, true, true, 0); // pack_end is used for these controls as autolevels is replaceable using pack_start in batchmode - abox->pack_end (*neutral, true, true, 0); - abox->pack_end (*sclip, false, false, 0); - abox->pack_end (*lclip, false, false, 0); - pack_start (*abox); + abox->pack_end(*neutral, true, true, 0); + abox->pack_end(*sclip, false, false, 0); + abox->pack_end(*lclip, false, false, 0); + pack_start(*abox); //-------------- Highlight Reconstruction ----------------- - pack_start (*Gtk::manage (new Gtk::HSeparator())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); hrenabled = Gtk::manage (new Gtk::CheckButton (M("TP_HLREC_LABEL"))); hrenabled->set_active (false); hrenabled->set_tooltip_markup (M("TP_HLREC_ENA_TOOLTIP")); - pack_start (*hrenabled); method = Gtk::manage (new MyComboBoxText ()); method->append (M("TP_HLREC_LUMINANCE")); method->append (M("TP_HLREC_CIELAB")); - method->append (M("TP_HLREC_COLOR")); method->append (M("TP_HLREC_BLEND")); + method->append (M("TP_HLREC_COLOR")); + method->append (M("TP_HLREC_COLOROPP")); + Gtk::Box *hrVBox; + hrVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + hrVBox->set_spacing(2); - method->set_active (0); - hlrbox = Gtk::manage (new Gtk::HBox ()); + method->set_active(4); + Gtk::Frame* const hrFrame = Gtk::manage(new Gtk::Frame()); + hrFrame->set_label_align(0.025, 0.5); + hrFrame->set_label_widget(*hrenabled); + + hlrbox = Gtk::manage (new Gtk::Box ()); Gtk::Label* lab = Gtk::manage (new Gtk::Label (M("TP_HLREC_METHOD"))); - hlrbox->pack_start (*lab, Gtk::PACK_SHRINK, 4); + hlrbox->pack_start (*lab, Gtk::PACK_SHRINK); hlrbox->pack_start (*method); - pack_start (*hlrbox); + hlbl = Gtk::manage(new Adjuster(M("TP_HLREC_HLBLUR"), 0, 4, 1, 0)); + hlth = Gtk::manage(new Adjuster(M("TP_HLREC_HLTH"), 0.25, 1.75, 0.01, 1.)); + + hrVBox->pack_start(*hlrbox, Gtk::PACK_SHRINK); + hrVBox->pack_start(*hlbl); + hrVBox->pack_start(*hlth); + hrFrame->add(*hrVBox); + pack_start(*hrFrame); enaconn = hrenabled->signal_toggled().connect( sigc::mem_fun(*this, &ToneCurve::hrenabledChanged) ); methconn = method->signal_changed().connect ( sigc::mem_fun(*this, &ToneCurve::methodChanged) ); //----------- Exposure Compensation --------------------- - pack_start (*Gtk::manage (new Gtk::HSeparator())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); - expcomp = Gtk::manage (new Adjuster (M("TP_EXPOSURE_EXPCOMP"), -5, 12, 0.05, 0)); + expcomp = Gtk::manage(new Adjuster(M("TP_EXPOSURE_EXPCOMP"), -5, 12, 0.05, 0)); expcomp->setLogScale(2, 0, true); - pack_start (*expcomp); + 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, 0)); - pack_start (*hlcomprthresh); + 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, 0)); + pack_start(*hlcomprthresh); //----------- Black Level & Compression ------------------- - black = Gtk::manage (new Adjuster (M("TP_EXPOSURE_BLACKLEVEL"), -16384, 32768, 50, 0)); + 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); + pack_start(*black); + shcompr = Gtk::manage(new Adjuster(M("TP_EXPOSURE_COMPRSHADOWS"), 0, 100, 1, 50)); + pack_start(*shcompr); - pack_start (*Gtk::manage (new Gtk::HSeparator())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); //---------Brightness / Contrast ------------------------- - brightness = Gtk::manage (new Adjuster (M("TP_EXPOSURE_BRIGHTNESS"), -100, 100, 1, 0)); - pack_start (*brightness); - contrast = Gtk::manage (new Adjuster (M("TP_EXPOSURE_CONTRAST"), -100, 100, 1, 0)); - pack_start (*contrast); - saturation = Gtk::manage (new Adjuster (M("TP_EXPOSURE_SATURATION"), -100, 100, 1, 0)); - pack_start (*saturation); + brightness = Gtk::manage(new Adjuster(M("TP_EXPOSURE_BRIGHTNESS"), -100, 100, 1, 0)); + pack_start(*brightness); + contrast = Gtk::manage(new Adjuster(M("TP_EXPOSURE_CONTRAST"), -100, 100, 1, 0)); + pack_start(*contrast); + 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())); + pack_start (*Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))); histmatching = Gtk::manage(new Gtk::ToggleButton(M("TP_EXPOSURE_HISTMATCHING"))); histmatching->set_tooltip_markup(M("TP_EXPOSURE_HISTMATCHING_TOOLTIP")); histmatchconn = histmatching->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::histmatchingToggled)); pack_start(*histmatching, true, true, 2); - toneCurveMode = Gtk::manage (new MyComboBoxText ()); - toneCurveMode->append (M("TP_EXPOSURE_TCMODE_STANDARD")); - toneCurveMode->append (M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); - toneCurveMode->append (M("TP_EXPOSURE_TCMODE_FILMLIKE")); - toneCurveMode->append (M("TP_EXPOSURE_TCMODE_SATANDVALBLENDING")); - toneCurveMode->append (M("TP_EXPOSURE_TCMODE_LUMINANCE")); - toneCurveMode->append (M("TP_EXPOSURE_TCMODE_PERCEPTUAL")); - toneCurveMode->set_active (0); + toneCurveMode = Gtk::manage(new MyComboBoxText()); + toneCurveMode->append(M("TP_EXPOSURE_TCMODE_STANDARD")); + toneCurveMode->append(M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); + toneCurveMode->append(M("TP_EXPOSURE_TCMODE_FILMLIKE")); + toneCurveMode->append(M("TP_EXPOSURE_TCMODE_SATANDVALBLENDING")); + toneCurveMode->append(M("TP_EXPOSURE_TCMODE_LUMINANCE")); + toneCurveMode->append(M("TP_EXPOSURE_TCMODE_PERCEPTUAL")); + toneCurveMode->set_active(0); toneCurveMode->set_tooltip_text(M("TP_EXPOSURE_TCMODE_LABEL1")); - curveEditorG = new CurveEditorGroup (options.lastToneCurvesDir, M("TP_EXPOSURE_CURVEEDITOR1")); - curveEditorG->setCurveListener (this); + curveEditorG = new CurveEditorGroup(options.lastToneCurvesDir, M("TP_EXPOSURE_CURVEEDITOR1")); + curveEditorG->setCurveListener(this); shape = static_cast(curveEditorG->addCurve(CT_Diagonal, "", toneCurveMode)); shape->setEditID(EUID_ToneCurve1, BT_IMAGEFLOAT); @@ -174,24 +189,24 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA // This will add the reset button at the end of the curveType buttons curveEditorG->curveListComplete(); - pack_start( *curveEditorG, Gtk::PACK_SHRINK, 2); + pack_start(*curveEditorG, Gtk::PACK_SHRINK, 2); - tcmodeconn = toneCurveMode->signal_changed().connect( sigc::mem_fun(*this, &ToneCurve::curveMode1Changed), true ); + tcmodeconn = toneCurveMode->signal_changed().connect(sigc::mem_fun(*this, &ToneCurve::curveMode1Changed), true); //----------- Curve 2 ------------------------------ - toneCurveMode2 = Gtk::manage (new MyComboBoxText ()); - toneCurveMode2->append (M("TP_EXPOSURE_TCMODE_STANDARD")); - toneCurveMode2->append (M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); - toneCurveMode2->append (M("TP_EXPOSURE_TCMODE_FILMLIKE")); - toneCurveMode2->append (M("TP_EXPOSURE_TCMODE_SATANDVALBLENDING")); - toneCurveMode2->append (M("TP_EXPOSURE_TCMODE_LUMINANCE")); - toneCurveMode2->append (M("TP_EXPOSURE_TCMODE_PERCEPTUAL")); - toneCurveMode2->set_active (0); + toneCurveMode2 = Gtk::manage(new MyComboBoxText()); + toneCurveMode2->append(M("TP_EXPOSURE_TCMODE_STANDARD")); + toneCurveMode2->append(M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); + toneCurveMode2->append(M("TP_EXPOSURE_TCMODE_FILMLIKE")); + toneCurveMode2->append(M("TP_EXPOSURE_TCMODE_SATANDVALBLENDING")); + toneCurveMode2->append(M("TP_EXPOSURE_TCMODE_LUMINANCE")); + toneCurveMode2->append(M("TP_EXPOSURE_TCMODE_PERCEPTUAL")); + toneCurveMode2->set_active(0); toneCurveMode2->set_tooltip_text(M("TP_EXPOSURE_TCMODE_LABEL2")); - curveEditorG2 = new CurveEditorGroup (options.lastToneCurvesDir, M("TP_EXPOSURE_CURVEEDITOR2")); - curveEditorG2->setCurveListener (this); + curveEditorG2 = new CurveEditorGroup(options.lastToneCurvesDir, M("TP_EXPOSURE_CURVEEDITOR2")); + curveEditorG2->setCurveListener(this); shape2 = static_cast(curveEditorG2->addCurve(CT_Diagonal, "", toneCurveMode2)); shape2->setEditID(EUID_ToneCurve2, BT_IMAGEFLOAT); @@ -202,22 +217,24 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA curveEditorG2->curveListComplete(); curveEditorG2->setTooltip(M("TP_EXPOSURE_CURVEEDITOR2_TOOLTIP")); - pack_start( *curveEditorG2, Gtk::PACK_SHRINK, 2); + pack_start(*curveEditorG2, Gtk::PACK_SHRINK, 2); - tcmode2conn = toneCurveMode2->signal_changed().connect( sigc::mem_fun(*this, &ToneCurve::curveMode2Changed), true ); + tcmode2conn = toneCurveMode2->signal_changed().connect(sigc::mem_fun(*this, &ToneCurve::curveMode2Changed), true); // --------- Set Up Listeners ------------- - expcomp->setAdjusterListener (this); - brightness->setAdjusterListener (this); - black->setAdjusterListener (this); - hlcompr->setAdjusterListener (this); - hlcomprthresh->setAdjusterListener (this); - shcompr->setAdjusterListener (this); - contrast->setAdjusterListener (this); - saturation->setAdjusterListener (this); + expcomp->setAdjusterListener(this); + brightness->setAdjusterListener(this); + black->setAdjusterListener(this); + hlcompr->setAdjusterListener(this); + hlbl->setAdjusterListener(this); + hlth->setAdjusterListener(this); + hlcomprthresh->setAdjusterListener(this); + shcompr->setAdjusterListener(this); + contrast->setAdjusterListener(this); + saturation->setAdjusterListener(this); } -ToneCurve::~ToneCurve () +ToneCurve::~ToneCurve() { idle_register.destroy(); @@ -225,38 +242,40 @@ ToneCurve::~ToneCurve () delete curveEditorG2; } -void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) +void ToneCurve::read(const ProcParams* pp, const ParamsEdited* pedited) { - disableListener (); + disableListener(); tcmodeconn.block(true); tcmode2conn.block(true); - autoconn.block (true); + autoconn.block(true); - autolevels->set_active (pp->toneCurve.autoexp); + autolevels->set_active(pp->toneCurve.autoexp); lastAuto = pp->toneCurve.autoexp; - sclip->set_value (pp->toneCurve.clip); + sclip->set_value(pp->toneCurve.clip); - expcomp->setValue (pp->toneCurve.expcomp); - black->setValue (pp->toneCurve.black); - hlcompr->setValue (pp->toneCurve.hlcompr); - hlcomprthresh->setValue (pp->toneCurve.hlcomprthresh); - shcompr->setValue (pp->toneCurve.shcompr); + expcomp->setValue(pp->toneCurve.expcomp); + black->setValue(pp->toneCurve.black); + hlcompr->setValue(pp->toneCurve.hlcompr); + hlbl->setValue(pp->toneCurve.hlbl); + hlth->setValue(pp->toneCurve.hlth); + hlcomprthresh->setValue(pp->toneCurve.hlcomprthresh); + shcompr->setValue(pp->toneCurve.shcompr); if (!black->getAddMode() && !batchMode) { - shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect + 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 + 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); - shape->setCurve (pp->toneCurve.curve); - shape2->setCurve (pp->toneCurve.curve2); + brightness->setValue(pp->toneCurve.brightness); + contrast->setValue(pp->toneCurve.contrast); + saturation->setValue(pp->toneCurve.saturation); + shape->setCurve(pp->toneCurve.curve); + shape2->setCurve(pp->toneCurve.curve2); toneCurveMode->set_active(rtengine::toUnderlying(pp->toneCurve.curveMode)); toneCurveMode2->set_active(rtengine::toUnderlying(pp->toneCurve.curveMode2)); @@ -266,19 +285,21 @@ void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) clampOOG->set_active(pp->toneCurve.clampOOG); if (pedited) { - expcomp->setEditedState (pedited->toneCurve.expcomp ? Edited : UnEdited); - black->setEditedState (pedited->toneCurve.black ? Edited : UnEdited); - hlcompr->setEditedState (pedited->toneCurve.hlcompr ? Edited : UnEdited); - hlcomprthresh->setEditedState (pedited->toneCurve.hlcomprthresh ? Edited : UnEdited); - shcompr->setEditedState (pedited->toneCurve.shcompr ? Edited : UnEdited); - brightness->setEditedState (pedited->toneCurve.brightness ? Edited : UnEdited); - contrast->setEditedState (pedited->toneCurve.contrast ? Edited : UnEdited); - saturation->setEditedState (pedited->toneCurve.saturation ? Edited : UnEdited); - autolevels->set_inconsistent (!pedited->toneCurve.autoexp); + expcomp->setEditedState(pedited->toneCurve.expcomp ? Edited : UnEdited); + black->setEditedState(pedited->toneCurve.black ? Edited : UnEdited); + hlcompr->setEditedState(pedited->toneCurve.hlcompr ? Edited : UnEdited); + hlbl->setEditedState(pedited->toneCurve.hlbl ? Edited : UnEdited); + hlth->setEditedState(pedited->toneCurve.hlth ? Edited : UnEdited); + hlcomprthresh->setEditedState(pedited->toneCurve.hlcomprthresh ? Edited : UnEdited); + shcompr->setEditedState(pedited->toneCurve.shcompr ? Edited : UnEdited); + brightness->setEditedState(pedited->toneCurve.brightness ? Edited : UnEdited); + contrast->setEditedState(pedited->toneCurve.contrast ? Edited : UnEdited); + saturation->setEditedState(pedited->toneCurve.saturation ? Edited : UnEdited); + autolevels->set_inconsistent(!pedited->toneCurve.autoexp); clipDirty = pedited->toneCurve.clip; - shape->setUnChanged (!pedited->toneCurve.curve); - shape2->setUnChanged (!pedited->toneCurve.curve2); - hrenabled->set_inconsistent (!pedited->toneCurve.hrenabled); + shape->setUnChanged(!pedited->toneCurve.curve); + shape2->setUnChanged(!pedited->toneCurve.curve2); + hrenabled->set_inconsistent(!pedited->toneCurve.hrenabled); if (!pedited->toneCurve.curveMode) { toneCurveMode->set_active(6); @@ -292,70 +313,68 @@ void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) clampOOG->set_inconsistent(!pedited->toneCurve.clampOOG); } - enaconn.block (true); - hrenabled->set_active (pp->toneCurve.hrenabled); - enaconn.block (false); + enaconn.block(true); + hrenabled->set_active(pp->toneCurve.hrenabled); + enaconn.block(false); - if (pedited && !pedited->toneCurve.method) { - method->set_active (4); - } else if (pp->toneCurve.method == "Luminance") { - method->set_active (0); + if (pedited && !pedited->toneCurve.method) { + method->set_active(5); + } else if (pp->toneCurve.method == "Luminance") { + method->set_active(0); } else if (pp->toneCurve.method == "CIELab blending") { - method->set_active (1); - } else if (pp->toneCurve.method == "Color") { - method->set_active (2); + method->set_active(1); } else if (pp->toneCurve.method == "Blend") { - method->set_active (3); + method->set_active(2); + } else if (pp->toneCurve.method == "Color") { + method->set_active(3); + } else if (pp->toneCurve.method == "Coloropp") { + method->set_active(4); } - if (!batchMode) { - if (hrenabled->get_active()) { - hlrbox->show(); - } else { - hlrbox->hide(); - } - } + hrenabledChanged(); lasthrEnabled = pp->toneCurve.hrenabled; - autoconn.block (false); + autoconn.block(false); tcmode2conn.block(false); tcmodeconn.block(false); - enableListener (); + enableListener(); } -void ToneCurve::autoOpenCurve () +void ToneCurve::autoOpenCurve() { shape->openIfNonlinear(); shape2->openIfNonlinear(); } -void ToneCurve::setEditProvider (EditDataProvider *provider) +void ToneCurve::setEditProvider(EditDataProvider *provider) { shape->setEditProvider(provider); shape2->setEditProvider(provider); } -void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) +void ToneCurve::write(ProcParams* pp, ParamsEdited* pedited) { pp->toneCurve.autoexp = autolevels->get_active(); - pp->toneCurve.clip = sclip->get_value (); - pp->toneCurve.expcomp = expcomp->getValue (); - pp->toneCurve.black = (int)black->getValue (); - pp->toneCurve.hlcompr = (int)hlcompr->getValue (); - pp->toneCurve.hlcomprthresh = (int)hlcomprthresh->getValue (); - pp->toneCurve.shcompr = (int)shcompr->getValue (); - pp->toneCurve.brightness = (int)brightness->getValue (); - pp->toneCurve.contrast = (int)contrast->getValue (); - pp->toneCurve.saturation = (int)saturation->getValue (); - pp->toneCurve.curve = shape->getCurve (); - pp->toneCurve.curve2 = shape2->getCurve (); + pp->toneCurve.clip = sclip->get_value(); + pp->toneCurve.expcomp = expcomp->getValue(); + pp->toneCurve.black = black->getValue(); + pp->toneCurve.hlcompr = hlcompr->getValue(); + pp->toneCurve.hlbl = hlbl->getValue(); + pp->toneCurve.hlth = hlth->getValue(); + pp->toneCurve.hlcomprthresh = hlcomprthresh->getValue(); + pp->toneCurve.shcompr = shcompr->getValue(); + pp->toneCurve.brightness = brightness->getValue(); + pp->toneCurve.contrast = contrast->getValue(); + pp->toneCurve.saturation = saturation->getValue(); + pp->toneCurve.curve = shape->getCurve(); + pp->toneCurve.curve2 = shape2->getCurve(); int tcMode = toneCurveMode->get_active_row_number(); - if (tcMode == 0) { + if (tcMode == 0) { pp->toneCurve.curveMode = ToneCurveMode::STD; } else if (tcMode == 1) { pp->toneCurve.curveMode = ToneCurveMode::WEIGHTEDSTD; @@ -371,7 +390,7 @@ void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) tcMode = toneCurveMode2->get_active_row_number(); - if (tcMode == 0) { + if (tcMode == 0) { pp->toneCurve.curveMode2 = ToneCurveMode::STD; } else if (tcMode == 1) { pp->toneCurve.curveMode2 = ToneCurveMode::WEIGHTEDSTD; @@ -390,22 +409,24 @@ void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) pp->toneCurve.clampOOG = clampOOG->get_active(); if (pedited) { - pedited->toneCurve.expcomp = expcomp->getEditedState (); - pedited->toneCurve.black = black->getEditedState (); - pedited->toneCurve.hlcompr = hlcompr->getEditedState (); - pedited->toneCurve.hlcomprthresh = hlcomprthresh->getEditedState (); - pedited->toneCurve.shcompr = shcompr->getEditedState (); - pedited->toneCurve.brightness = brightness->getEditedState (); - pedited->toneCurve.contrast = contrast->getEditedState (); - pedited->toneCurve.saturation = saturation->getEditedState (); - pedited->toneCurve.autoexp = !autolevels->get_inconsistent(); - pedited->toneCurve.clip = clipDirty; - pedited->toneCurve.curve = !shape->isUnChanged (); - pedited->toneCurve.curve2 = !shape2->isUnChanged (); - pedited->toneCurve.curveMode = toneCurveMode->get_active_row_number() != 6; + pedited->toneCurve.expcomp = expcomp->getEditedState(); + pedited->toneCurve.black = black->getEditedState(); + pedited->toneCurve.hlcompr = hlcompr->getEditedState(); + pedited->toneCurve.hlbl = hlbl->getEditedState(); + pedited->toneCurve.hlth = hlth->getEditedState(); + pedited->toneCurve.hlcomprthresh = hlcomprthresh->getEditedState(); + pedited->toneCurve.shcompr = shcompr->getEditedState(); + pedited->toneCurve.brightness = brightness->getEditedState(); + pedited->toneCurve.contrast = contrast->getEditedState(); + pedited->toneCurve.saturation = saturation->getEditedState(); + pedited->toneCurve.autoexp = !autolevels->get_inconsistent(); + pedited->toneCurve.clip = clipDirty; + pedited->toneCurve.curve = !shape->isUnChanged(); + pedited->toneCurve.curve2 = !shape2->isUnChanged(); + pedited->toneCurve.curveMode = toneCurveMode->get_active_row_number() != 6; pedited->toneCurve.curveMode2 = toneCurveMode2->get_active_row_number() != 6; - pedited->toneCurve.method = method->get_active_row_number() != 4; - pedited->toneCurve.hrenabled = !hrenabled->get_inconsistent(); + pedited->toneCurve.method = method->get_active_row_number() != 5; + pedited->toneCurve.hrenabled = !hrenabled->get_inconsistent(); pedited->toneCurve.histmatching = !histmatching->get_inconsistent(); pedited->toneCurve.fromHistMatching = true; pedited->toneCurve.clampOOG = !clampOOG->get_inconsistent(); @@ -418,66 +439,91 @@ void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) } else if (method->get_active_row_number() == 1) { pp->toneCurve.method = "CIELab blending"; } else if (method->get_active_row_number() == 2) { - pp->toneCurve.method = "Color"; - } else if (method->get_active_row_number() == 3) { pp->toneCurve.method = "Blend"; + } else if (method->get_active_row_number() == 3) { + pp->toneCurve.method = "Color"; + } else if (method->get_active_row_number() == 4) { + pp->toneCurve.method = "Coloropp"; } } -void ToneCurve::hrenabledChanged () +void ToneCurve::hrenabledChanged() { if (multiImage) { if (hrenabled->get_inconsistent()) { - hrenabled->set_inconsistent (false); - enaconn.block (true); - hrenabled->set_active (false); - enaconn.block (false); + hrenabled->set_inconsistent(false); + enaconn.block(true); + hrenabled->set_active(false); + enaconn.block(false); } else if (lasthrEnabled) { - hrenabled->set_inconsistent (true); + hrenabled->set_inconsistent(true); } - lasthrEnabled = hrenabled->get_active (); + lasthrEnabled = hrenabled->get_active(); } if (!batchMode) { if (hrenabled->get_active()) { hlrbox->show(); + hlrbox->set_sensitive(true); + if (method->get_active_row_number() == 3) { + hlbl->show(); + hlth->hide(); + } else if (method->get_active_row_number() == 4){ + hlbl->hide(); + hlth->show(); + } else { + hlbl->hide(); + hlth->hide(); + } } else { - hlrbox->hide(); + hlrbox->show(); + hlrbox->set_sensitive(false); + hlbl->hide(); + hlth->hide(); } - } + } if (listener) { // Switch off auto exposure if user changes enabled manually - if (autolevels->get_active() ) { + if (autolevels->get_active()) { autoconn.block(true); - autolevels->set_active (false); + autolevels->set_active(false); autoconn.block(false); - autolevels->set_inconsistent (false); + autolevels->set_inconsistent(false); } setHistmatching(false); - if (hrenabled->get_active ()) { - listener->panelChanged (EvHREnabled, M("GENERAL_ENABLED")); + if (hrenabled->get_active()) { + listener->panelChanged(EvHREnabled, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvHREnabled, M("GENERAL_DISABLED")); + listener->panelChanged(EvHREnabled, M("GENERAL_DISABLED")); } } } -void ToneCurve::methodChanged () +void ToneCurve::methodChanged() { + if (method->get_active_row_number() == 3) { + hlbl->show(); + hlth->hide(); + } else if (method->get_active_row_number() == 4){ + hlbl->hide(); + hlth->show(); + } else { + hlbl->hide(); + hlth->hide(); + } if (listener) { setHistmatching(false); - if (hrenabled->get_active ()) { - listener->panelChanged (EvHRMethod, method->get_active_text ()); + if (hrenabled->get_active()) { + listener->panelChanged(EvHRMethod, method->get_active_text()); } } } - void ToneCurve::clampOOGChanged() { if (listener) { @@ -485,96 +531,100 @@ void ToneCurve::clampOOGChanged() } } - - -void ToneCurve::setRaw (bool raw) +void ToneCurve::setRaw(bool raw) { - disableListener (); - method->set_sensitive (raw); - hrenabled->set_sensitive (raw); + disableListener(); + method->set_sensitive(raw); + hlbl->set_sensitive(raw); + hlth->set_sensitive(raw); + hrenabled->set_sensitive(raw); histmatching->set_sensitive(raw); - enableListener (); + enableListener(); } - -void ToneCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +void ToneCurve::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { - expcomp->setDefault (defParams->toneCurve.expcomp); - brightness->setDefault (defParams->toneCurve.brightness); - black->setDefault (defParams->toneCurve.black); - hlcompr->setDefault (defParams->toneCurve.hlcompr); - hlcomprthresh->setDefault (defParams->toneCurve.hlcomprthresh); - shcompr->setDefault (defParams->toneCurve.shcompr); - contrast->setDefault (defParams->toneCurve.contrast); - saturation->setDefault (defParams->toneCurve.saturation); + expcomp->setDefault(defParams->toneCurve.expcomp); + brightness->setDefault(defParams->toneCurve.brightness); + black->setDefault(defParams->toneCurve.black); + hlcompr->setDefault(defParams->toneCurve.hlcompr); + hlbl->setDefault(defParams->toneCurve.hlbl); + hlth->setDefault(defParams->toneCurve.hlth); + hlcomprthresh->setDefault(defParams->toneCurve.hlcomprthresh); + shcompr->setDefault(defParams->toneCurve.shcompr); + contrast->setDefault(defParams->toneCurve.contrast); + saturation->setDefault(defParams->toneCurve.saturation); if (pedited) { - expcomp->setDefaultEditedState (pedited->toneCurve.expcomp ? Edited : UnEdited); - black->setDefaultEditedState (pedited->toneCurve.black ? Edited : UnEdited); - hlcompr->setDefaultEditedState (pedited->toneCurve.hlcompr ? Edited : UnEdited); - hlcomprthresh->setDefaultEditedState (pedited->toneCurve.hlcomprthresh ? Edited : UnEdited); - shcompr->setDefaultEditedState (pedited->toneCurve.shcompr ? Edited : UnEdited); - brightness->setDefaultEditedState (pedited->toneCurve.brightness ? Edited : UnEdited); - contrast->setDefaultEditedState (pedited->toneCurve.contrast ? Edited : UnEdited); - saturation->setDefaultEditedState (pedited->toneCurve.saturation ? Edited : UnEdited); + expcomp->setDefaultEditedState(pedited->toneCurve.expcomp ? Edited : UnEdited); + black->setDefaultEditedState(pedited->toneCurve.black ? Edited : UnEdited); + hlcompr->setDefaultEditedState(pedited->toneCurve.hlcompr ? Edited : UnEdited); + hlbl->setDefaultEditedState(pedited->toneCurve.hlbl ? Edited : UnEdited); + hlth->setDefaultEditedState(pedited->toneCurve.hlth ? Edited : UnEdited); + hlcomprthresh->setDefaultEditedState(pedited->toneCurve.hlcomprthresh ? Edited : UnEdited); + shcompr->setDefaultEditedState(pedited->toneCurve.shcompr ? Edited : UnEdited); + brightness->setDefaultEditedState(pedited->toneCurve.brightness ? Edited : UnEdited); + contrast->setDefaultEditedState(pedited->toneCurve.contrast ? Edited : UnEdited); + saturation->setDefaultEditedState(pedited->toneCurve.saturation ? Edited : UnEdited); } else { - expcomp->setDefaultEditedState (Irrelevant); - black->setDefaultEditedState (Irrelevant); - hlcompr->setDefaultEditedState (Irrelevant); - hlcomprthresh->setDefaultEditedState (Irrelevant); - shcompr->setDefaultEditedState (Irrelevant); - brightness->setDefaultEditedState (Irrelevant); - contrast->setDefaultEditedState (Irrelevant); - saturation->setDefaultEditedState (Irrelevant); + expcomp->setDefaultEditedState(Irrelevant); + black->setDefaultEditedState(Irrelevant); + hlcompr->setDefaultEditedState(Irrelevant); + hlbl->setDefaultEditedState(Irrelevant); + hlth->setDefaultEditedState(Irrelevant); + hlcomprthresh->setDefaultEditedState(Irrelevant); + shcompr->setDefaultEditedState(Irrelevant); + brightness->setDefaultEditedState(Irrelevant); + contrast->setDefaultEditedState(Irrelevant); + saturation->setDefaultEditedState(Irrelevant); } + } -void ToneCurve::curveChanged (CurveEditor* ce) +void ToneCurve::curveChanged(CurveEditor* ce) { if (listener) { setHistmatching(false); if (ce == shape) { - listener->panelChanged (EvToneCurve1, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvToneCurve1, M("HISTORY_CUSTOMCURVE")); } else if (ce == shape2) { - listener->panelChanged (EvToneCurve2, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvToneCurve2, M("HISTORY_CUSTOMCURVE")); } } } -void ToneCurve::curveMode1Changed () +void ToneCurve::curveMode1Changed() { - //if (listener) listener->panelChanged (EvToneCurveMode, toneCurveMode->get_active_text()); if (listener) { setHistmatching(false); - Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::curveMode1Changed_)); + Glib::signal_idle().connect(sigc::mem_fun(*this, &ToneCurve::curveMode1Changed_)); } } -bool ToneCurve::curveMode1Changed_ () +bool ToneCurve::curveMode1Changed_() { if (listener) { - listener->panelChanged (EvToneCurveMode1, toneCurveMode->get_active_text()); + listener->panelChanged(EvToneCurveMode1, toneCurveMode->get_active_text()); } return false; } -void ToneCurve::curveMode2Changed () +void ToneCurve::curveMode2Changed() { - //if (listener) listener->panelChanged (EvToneCurveMode, toneCurveMode->get_active_text()); if (listener) { setHistmatching(false); - Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::curveMode2Changed_)); + Glib::signal_idle().connect(sigc::mem_fun(*this, &ToneCurve::curveMode2Changed_)); } } -bool ToneCurve::curveMode2Changed_ () +bool ToneCurve::curveMode2Changed_() { if (listener) { - listener->panelChanged (EvToneCurveMode2, toneCurveMode2->get_active_text()); + listener->panelChanged(EvToneCurveMode2, toneCurveMode2->get_active_text()); } return false; @@ -601,9 +651,9 @@ 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); - autolevels->set_active (false); + autolevels->set_active(false); autoconn.block(false); - autolevels->set_inconsistent (false); + autolevels->set_inconsistent(false); } if (!listener) { @@ -617,39 +667,43 @@ void ToneCurve::adjusterChanged(Adjuster* a, double newval) Glib::ustring costr; if (a == expcomp) { - costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); + costr = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), a->getValue()); } else { - costr = Glib::ustring::format ((int)a->getValue()); + costr = Glib::ustring::format((int)a->getValue()); } if (a == expcomp) { - listener->panelChanged (EvExpComp, costr); + listener->panelChanged(EvExpComp, costr); } else if (a == brightness) { - listener->panelChanged (EvBrightness, costr); + listener->panelChanged(EvBrightness, costr); } else if (a == black) { - listener->panelChanged (EvBlack, costr); + listener->panelChanged(EvBlack, costr); if (!black->getAddMode() && !batchMode) { - shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect + shcompr->set_sensitive(!((int)black->getValue() == 0)); //at black=0 shcompr value has no effect } } else if (a == contrast) { - listener->panelChanged (EvContrast, costr); + listener->panelChanged(EvContrast, costr); } else if (a == saturation) { - listener->panelChanged (EvSaturation, costr); + listener->panelChanged(EvSaturation, costr); + } else if (a == hlbl) { + listener->panelChanged(EvHLbl, costr); + } else if (a == hlth) { + listener->panelChanged(EvHLth, costr); } else if (a == hlcompr) { - listener->panelChanged (EvHLCompr, costr); + listener->panelChanged(EvHLCompr, costr); if (!hlcompr->getAddMode() && !batchMode) { - hlcomprthresh->set_sensitive(!((int)hlcompr->getValue () == 0)); //at hlcompr=0 hlcomprthresh value has no effect + hlcomprthresh->set_sensitive(!((int)hlcompr->getValue() == 0)); //at hlcompr=0 hlcomprthresh value has no effect } } else if (a == hlcomprthresh) { - listener->panelChanged (EvHLComprThreshold, costr); + listener->panelChanged(EvHLComprThreshold, costr); } else if (a == shcompr) { - listener->panelChanged (EvSHCompr, costr); + listener->panelChanged(EvSHCompr, costr); } } -void ToneCurve::neutral_pressed () +void ToneCurve::neutral_pressed() { // This method deselects auto levels and HL reconstruction auto // and sets neutral values to params in exposure panel @@ -657,215 +711,228 @@ void ToneCurve::neutral_pressed () setHistmatching(false); if (batchMode) { - autolevels->set_inconsistent (false); - autoconn.block (true); - autolevels->set_active (false); - autoconn.block (false); + autolevels->set_inconsistent(false); + autoconn.block(true); + autolevels->set_active(false); + autoconn.block(false); - lastAuto = autolevels->get_active (); + lastAuto = autolevels->get_active(); } else { //!batchMode - autolevels->set_active (false); - autolevels->set_inconsistent (false); + autolevels->set_active(false); + autolevels->set_inconsistent(false); } expcomp->setValue(0); hlcompr->setValue(0); + hlbl->setValue(0); + hlth->setValue(1.0); hlcomprthresh->setValue(0); brightness->setValue(0); black->setValue(0); shcompr->setValue(50); - enaconn.block (true); - hrenabled->set_active (false); - enaconn.block (false); + enaconn.block(true); + hrenabled->set_active(false); + enaconn.block(false); if (!batchMode) { - hlrbox->hide(); + hlrbox->show(); + hlrbox->set_sensitive(false); + hlbl->hide(); + hlth->hide(); } if (!black->getAddMode() && !batchMode) { - shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect + 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 + hlcomprthresh->set_sensitive(!((int)hlcompr->getValue() == 0)); //at hlcompr=0 hlcomprthresh value has no effect } contrast->setValue(0); //saturation->setValue(0); - listener->panelChanged (EvNeutralExp, M("GENERAL_ENABLED")); + listener->panelChanged(EvNeutralExp, M("GENERAL_ENABLED")); } -void ToneCurve::autolevels_toggled () + +void ToneCurve::autolevels_toggled() { setHistmatching(false); - if (batchMode) { if (autolevels->get_inconsistent()) { - autolevels->set_inconsistent (false); - autoconn.block (true); - autolevels->set_active (false); - autoconn.block (false); + autolevels->set_inconsistent(false); + autoconn.block(true); + autolevels->set_active(false); + autoconn.block(false); } else if (lastAuto) { - autolevels->set_inconsistent (true); + autolevels->set_inconsistent(true); } - lastAuto = autolevels->get_active (); + lastAuto = autolevels->get_active(); - expcomp->setEditedState (UnEdited); - brightness->setEditedState (UnEdited); - contrast->setEditedState (UnEdited); - black->setEditedState (UnEdited); - hlcompr->setEditedState (UnEdited); - hlcomprthresh->setEditedState (UnEdited); + expcomp->setEditedState(UnEdited); + brightness->setEditedState(UnEdited); + contrast->setEditedState(UnEdited); + black->setEditedState(UnEdited); + hlcompr->setEditedState(UnEdited); + hlcomprthresh->setEditedState(UnEdited); if (expcomp->getAddMode()) { - expcomp->setValue (0); + expcomp->setValue(0); } if (brightness->getAddMode()) { - brightness->setValue (0); + brightness->setValue(0); } if (contrast->getAddMode()) { - contrast->setValue (0); + contrast->setValue(0); } if (black->getAddMode()) { - black->setValue (0); + black->setValue(0); } if (hlcompr->getAddMode()) { - hlcompr->setValue (0); + hlcompr->setValue(0); } if (hlcomprthresh->getAddMode()) { - hlcomprthresh->setValue (0); + hlcomprthresh->setValue(0); } if (listener) { if (!autolevels->get_inconsistent()) { - if (autolevels->get_active ()) { - listener->panelChanged (EvAutoExp, M("GENERAL_ENABLED")); + if (autolevels->get_active()) { + listener->panelChanged(EvAutoExp, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvFixedExp, M("GENERAL_DISABLED")); + listener->panelChanged(EvFixedExp, M("GENERAL_DISABLED")); } } } } else if (/* !batchMode && */ listener) { if (autolevels->get_active()) { - listener->panelChanged (EvAutoExp, M("GENERAL_ENABLED")); - waitForAutoExp (); + listener->panelChanged(EvAutoExp, M("GENERAL_ENABLED")); + waitForAutoExp(); if (!black->getAddMode()) { - shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect + 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 + hlcomprthresh->set_sensitive(!((int)hlcompr->getValue() == 0)); //at hlcompr=0 hlcomprthresh value has no effect } } else { - listener->panelChanged (EvFixedExp, M("GENERAL_DISABLED")); + listener->panelChanged(EvFixedExp, M("GENERAL_DISABLED")); } } } -void ToneCurve::clip_changed () +void ToneCurve::clip_changed() { clipDirty = true; if (autolevels->get_active() && listener) { - Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::clip_changed_)); + Glib::signal_idle().connect(sigc::mem_fun(*this, &ToneCurve::clip_changed_)); } } -bool ToneCurve::clip_changed_ () +bool ToneCurve::clip_changed_() { if (listener) { - listener->panelChanged (EvClip, Glib::ustring::format (std::setprecision(5), sclip->get_value())); + listener->panelChanged(EvClip, Glib::ustring::format(std::setprecision(5), sclip->get_value())); if (!batchMode) { - waitForAutoExp (); + waitForAutoExp(); } } return false; } -void ToneCurve::waitForAutoExp () +void ToneCurve::waitForAutoExp() { - sclip->set_sensitive (false); - expcomp->setEnabled (false); - brightness->setEnabled (false); - contrast->setEnabled (false); - black->setEnabled (false); - hlcompr->setEnabled (false); - hlcomprthresh->setEnabled (false); - shcompr->setEnabled (false); - contrast->setEnabled (false); - saturation->setEnabled (false); - curveEditorG->set_sensitive (false); - toneCurveMode->set_sensitive (false); - curveEditorG2->set_sensitive (false); - toneCurveMode2->set_sensitive (false); + sclip->set_sensitive(false); + expcomp->setEnabled(false); + brightness->setEnabled(false); + contrast->setEnabled(false); + black->setEnabled(false); + hlcompr->setEnabled(false); + hlcomprthresh->setEnabled(false); + shcompr->setEnabled(false); + contrast->setEnabled(false); + saturation->setEnabled(false); + curveEditorG->set_sensitive(false); + toneCurveMode->set_sensitive(false); + curveEditorG2->set_sensitive(false); + toneCurveMode2->set_sensitive(false); hrenabled->set_sensitive(false); method->set_sensitive(false); + hlbl->set_sensitive(false); + hlth->set_sensitive(false); histmatching->set_sensitive(false); } -void ToneCurve::enableAll () +void ToneCurve::enableAll() { - sclip->set_sensitive (true); - expcomp->setEnabled (true); - brightness->setEnabled (true); - black->setEnabled (true); - hlcompr->setEnabled (true); - hlcomprthresh->setEnabled (true); - shcompr->setEnabled (true); - contrast->setEnabled (true); - saturation->setEnabled (true); - curveEditorG->set_sensitive (true); - toneCurveMode->set_sensitive (true); - curveEditorG2->set_sensitive (true); - toneCurveMode2->set_sensitive (true); + sclip->set_sensitive(true); + expcomp->setEnabled(true); + brightness->setEnabled(true); + black->setEnabled(true); + hlcompr->setEnabled(true); + hlbl->setEnabled(true); + hlth->setEnabled(true); + hlcomprthresh->setEnabled(true); + shcompr->setEnabled(true); + contrast->setEnabled(true); + saturation->setEnabled(true); + curveEditorG->set_sensitive(true); + toneCurveMode->set_sensitive(true); + curveEditorG2->set_sensitive(true); + toneCurveMode2->set_sensitive(true); hrenabled->set_sensitive(true); method->set_sensitive(true); + hlbl->set_sensitive(true); + hlth->set_sensitive(true); histmatching->set_sensitive(true); } -void ToneCurve::setBatchMode (bool batchMode) +void ToneCurve::setBatchMode(bool batchMode) { - ToolPanel::setBatchMode (batchMode); - method->append (M("GENERAL_UNCHANGED")); + ToolPanel::setBatchMode(batchMode); + method->append(M("GENERAL_UNCHANGED")); - removeIfThere (abox, autolevels, false); - autolevels = Gtk::manage (new Gtk::CheckButton (M("TP_EXPOSURE_AUTOLEVELS"))); - autolevels->set_tooltip_markup (M("TP_EXPOSURE_AUTOLEVELS_TIP")); - autoconn = autolevels->signal_toggled().connect( sigc::mem_fun(*this, &ToneCurve::autolevels_toggled) ); - abox->pack_start (*autolevels); + removeIfThere(abox, autolevels, false); + autolevels = Gtk::manage(new Gtk::CheckButton(M("TP_EXPOSURE_AUTOLEVELS"))); + autolevels->set_tooltip_markup(M("TP_EXPOSURE_AUTOLEVELS_TOOLTIP")); + autoconn = autolevels->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::autolevels_toggled)); + abox->pack_start(*autolevels); - ToolPanel::setBatchMode (batchMode); - expcomp->showEditedCB (); - black->showEditedCB (); - hlcompr->showEditedCB (); - hlcomprthresh->showEditedCB (); - shcompr->showEditedCB (); - brightness->showEditedCB (); - contrast->showEditedCB (); - saturation->showEditedCB (); + ToolPanel::setBatchMode(batchMode); + expcomp->showEditedCB(); + black->showEditedCB(); + hlcompr->showEditedCB(); + hlbl->showEditedCB(); + hlth->showEditedCB(); + hlcomprthresh->showEditedCB(); + shcompr->showEditedCB(); + brightness->showEditedCB(); + contrast->showEditedCB(); + saturation->showEditedCB(); - toneCurveMode->append (M("GENERAL_UNCHANGED")); - toneCurveMode2->append (M("GENERAL_UNCHANGED")); + toneCurveMode->append(M("GENERAL_UNCHANGED")); + toneCurveMode2->append(M("GENERAL_UNCHANGED")); - curveEditorG->setBatchMode (batchMode); - curveEditorG2->setBatchMode (batchMode); + curveEditorG->setBatchMode(batchMode); + curveEditorG2->setBatchMode(batchMode); } -void ToneCurve::setAdjusterBehavior (bool expadd, bool hlcompadd, bool hlcompthreshadd, bool bradd, bool blackadd, bool shcompadd, bool contradd, bool satadd) +void ToneCurve::setAdjusterBehavior(bool expadd, bool hlcompadd, bool hlcompthreshadd, bool bradd, bool blackadd, bool shcompadd, bool contradd, bool satadd) { expcomp->setAddMode(expadd); @@ -878,7 +945,7 @@ void ToneCurve::setAdjusterBehavior (bool expadd, bool hlcompadd, bool hlcompthr saturation->setAddMode(satadd); } -void ToneCurve::trimValues (rtengine::procparams::ProcParams* pp) +void ToneCurve::trimValues(rtengine::procparams::ProcParams* pp) { expcomp->trimValue(pp->toneCurve.expcomp); @@ -907,7 +974,6 @@ void ToneCurve::updateCurveBackgroundHistogram( shape->updateBackgroundHistogram(histToneCurve); } - void ToneCurve::setHistmatching(bool enabled) { fromHistMatching = enabled; @@ -919,7 +985,6 @@ void ToneCurve::setHistmatching(bool enabled) } } - void ToneCurve::histmatchingToggled() { if (listener) { @@ -966,9 +1031,23 @@ void ToneCurve::autoExpChanged(double expcomp, int bright, int contr, int black, if (nextHLRecons) { hlrbox->show(); + hlrbox->set_sensitive(true); + if (method->get_active_row_number() == 3) { + hlbl->show(); + hlth->hide(); + } else if (method->get_active_row_number() == 4){ + hlbl->hide(); + hlth->show(); + } else { + hlbl->hide(); + hlth->hide(); + } } else if (!batchMode) { - hlrbox->hide(); - } + hlrbox->show(); + hlrbox->set_sensitive(false); + hlbl->hide(); + hlth->hide(); + } if (!this->black->getAddMode() && !batchMode) { shcompr->set_sensitive(static_cast(this->black->getValue())); //at black=0 shcompr value has no effect @@ -1007,7 +1086,7 @@ void ToneCurve::autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveMode hlcomprthresh->set_sensitive(static_cast(hlcompr->getValue())); //at hlcompr=0 hlcomprthresh value has no effect } - if (autolevels->get_active() ) { + if (autolevels->get_active()) { expcomp->setValue(0); autoconn.block(true); autolevels->set_active(false); diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index e0482c5da..7f0f1ef69 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -47,9 +47,11 @@ protected: sigc::connection methconn; sigc::connection enaconn; bool lasthrEnabled; + Adjuster* hlbl; + Adjuster* hlth; - Gtk::HBox* abox; - Gtk::HBox* hlrbox; + Gtk::Box* abox; + Gtk::Box* hlrbox; Gtk::ToggleButton* autolevels; Gtk::Label* lclip; @@ -80,6 +82,8 @@ protected: rtengine::ProcEvent EvHistMatching; rtengine::ProcEvent EvHistMatchingBatch; rtengine::ProcEvent EvClampOOG; + rtengine::ProcEvent EvHLbl; + rtengine::ProcEvent EvHLth; // used temporarily in eventing double nextExpcomp; @@ -95,6 +99,8 @@ protected: void setHistmatching(bool enabled); public: + static const Glib::ustring TOOL_NAME; + ToneCurve (); ~ToneCurve () override; diff --git a/rtgui/toneequalizer.cc b/rtgui/toneequalizer.cc new file mode 100644 index 000000000..d524bdc05 --- /dev/null +++ b/rtgui/toneequalizer.cc @@ -0,0 +1,237 @@ +/* + * Adapted from ART. + * + * 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 "eventmapper.h" +#include "toneequalizer.h" +#include "rtimage.h" + +using namespace rtengine; +using namespace rtengine::procparams; + +const Glib::ustring ToneEqualizer::TOOL_NAME = "toneequalizer"; + +ToneEqualizer::ToneEqualizer(): FoldableToolPanel(this, TOOL_NAME, M("TP_TONE_EQUALIZER_LABEL"), false, true) +{ + auto m = ProcEventMapper::getInstance(); + EvEnabled = m->newEvent(AUTOEXP, "HISTORY_MSG_TONE_EQUALIZER_ENABLED"); + EvBands = m->newEvent(AUTOEXP, "HISTORY_MSG_TONE_EQUALIZER_BANDS"); + EvRegularization = m->newEvent(AUTOEXP, "HISTORY_MSG_TONE_EQUALIZER_REGULARIZATION"); + EvColormap = m->newEvent(AUTOEXP, "HISTORY_MSG_TONE_EQUALIZER_SHOW_COLOR_MAP"); + EvPivot = m->newEvent(AUTOEXP, "HISTORY_MSG_TONE_EQUALIZER_PIVOT"); + + std::array images = { + "purple", + "blue", + "gray", + "yellow", + "red" + }; + for (size_t i = 0; i < bands.size(); ++i) { + bands[i] = Gtk::manage(new Adjuster(M("TP_TONE_EQUALIZER_BAND_" + std::to_string(i)), -100, 100, 1, 0, Gtk::manage(new RTImage(Glib::ustring("circle-") + images[i] + "-small.png")))); + bands[i]->setAdjusterListener(this); + pack_start(*bands[i]); + bands[i]->showIcons(false); + } + + pivot = Gtk::manage(new Adjuster(M("TP_TONE_EQUALIZER_PIVOT"), -12, 12, 0.05, 0)); + pivot->setLogScale(64, 0, true); + pivot->setAdjusterListener(this); + pack_start(*pivot); + + pack_start(*Gtk::manage(new Gtk::HSeparator())); + regularization = Gtk::manage(new Adjuster(M("TP_TONE_EQUALIZER_DETAIL"), -5, 5, 1, 0)); + regularization->setAdjusterListener(this); + pack_start(*regularization); + + show_colormap = Gtk::manage(new CheckBox(M("TP_TONE_EQUALIZER_SHOW_COLOR_MAP"), multiImage)); + pack_start(*show_colormap); + show_colormap->setCheckBoxListener(this); + + show_all_children (); +} + + +void ToneEqualizer::read(const ProcParams *pp, const ParamsEdited* pedited) +{ + disableListener(); + + if (pedited) { + set_inconsistent(multiImage && !pedited->toneEqualizer.enabled); + for (size_t i = 0; i < bands.size(); ++i) { + bands[i]->setEditedState(pedited->toneEqualizer.bands[i] ? Edited : UnEdited); + } + regularization->setEditedState(pedited->toneEqualizer.regularization ? Edited : UnEdited); + pivot->setEditedState(pedited->toneEqualizer.pivot ? Edited : UnEdited); + show_colormap->setEdited(pedited->toneEqualizer.show_colormap ? Edited : UnEdited); + } + + setEnabled(pp->toneEqualizer.enabled); + + for (size_t i = 0; i < bands.size(); ++i) { + bands[i]->setValue(pp->toneEqualizer.bands[i]); + bands[i]->showIcons(pp->toneEqualizer.show_colormap); + } + regularization->setValue(pp->toneEqualizer.regularization); + + pivot->setValue(pp->toneEqualizer.pivot); + show_colormap->setValue(pp->toneEqualizer.show_colormap); + + enableListener(); +} + + +void ToneEqualizer::write(ProcParams *pp, ParamsEdited* pedited) +{ + for (size_t i = 0; i < bands.size(); ++i) { + pp->toneEqualizer.bands[i] = bands[i]->getValue(); + } + pp->toneEqualizer.enabled = getEnabled(); + pp->toneEqualizer.regularization = regularization->getValue(); + pp->toneEqualizer.show_colormap = show_colormap->getLastActive(); + pp->toneEqualizer.pivot = pivot->getValue(); + + if (pedited) { + auto &edited = pedited->toneEqualizer; + edited.enabled = !get_inconsistent(); + for (size_t i = 0; i < bands.size(); ++i) { + edited.bands[i] = bands[i]->getEditedState(); + } + edited.regularization = regularization->getEditedState(); + edited.pivot = pivot->getEditedState(); + edited.show_colormap = show_colormap->getEdited(); + } +} + + +void ToneEqualizer::setDefaults(const ProcParams *defParams, const ParamsEdited* pedited) +{ + for (size_t i = 0; i < bands.size(); ++i) { + bands[i]->setDefault(defParams->toneEqualizer.bands[i]); + } + regularization->setDefault(defParams->toneEqualizer.regularization); + + pivot->setDefault(defParams->toneEqualizer.pivot); + inital_params = defParams->toneEqualizer; + + if (pedited) { + auto &edited = pedited->toneEqualizer; + for (size_t i = 0; i < bands.size(); ++i) { + bands[i]->setDefaultEditedState(edited.bands[i] ? Edited : UnEdited); + } + regularization->setDefaultEditedState(edited.regularization ? Edited : UnEdited); + pivot->setDefaultEditedState(edited.pivot ? Edited : UnEdited); + } else { + for (auto band : bands) { + band->setDefaultEditedState(Irrelevant); + } + regularization->setDefaultEditedState(Irrelevant); + pivot->setDefaultEditedState(Irrelevant); + } +} + + +void ToneEqualizer::adjusterChanged(Adjuster *a, double newval) +{ + if (listener && getEnabled()) { + if (a == regularization) { + listener->panelChanged(EvRegularization, Glib::ustring::format(a->getValue())); + } else if (a == pivot) { + listener->panelChanged(EvPivot, Glib::ustring::format(a->getValue())); + } else { + Glib::ustring s; + for (size_t i = 0; i < bands.size(); ++i) { + s += Glib::ustring::format((int)bands[i]->getValue()) + " "; + } + listener->panelChanged(EvBands, s); + } + } +} + + +void ToneEqualizer::adjusterAutoToggled(Adjuster *a) +{ +} + + +void ToneEqualizer::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvEnabled, M("GENERAL_DISABLED")); + } + } +} + + +void ToneEqualizer::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + if (batchMode) { + for (auto band : bands) { + band->showEditedCB(); + } + regularization->showEditedCB(); + pivot->showEditedCB(); + } +} + + +void ToneEqualizer::setAdjusterBehavior(bool bands_add, bool regularization_add, bool pivot_add) +{ + for (auto band : bands) { + band->setAddMode(bands_add); + } + regularization->setAddMode(regularization_add); + pivot->setAddMode(pivot_add); +} + + +void ToneEqualizer::checkBoxToggled(CheckBox *c, CheckValue newval) +{ + if (c == show_colormap) { + colormapToggled(); + } +} + + +void ToneEqualizer::colormapToggled() +{ + for (size_t i = 0; i < bands.size(); ++i) { + bands[i]->showIcons(show_colormap->getLastActive()); + } + if (listener && getEnabled()) { + listener->panelChanged(EvColormap, show_colormap->getLastActive() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + + +void ToneEqualizer::trimValues(rtengine::procparams::ProcParams *pp) +{ + for (size_t i = 0; i < bands.size(); ++i) { + bands[i]->trimValue(pp->toneEqualizer.bands[i]); + } + regularization->trimValue(pp->toneEqualizer.regularization); + pivot->trimValue(pp->toneEqualizer.pivot); +} + diff --git a/rtgui/toneequalizer.h b/rtgui/toneequalizer.h new file mode 100644 index 000000000..88a275799 --- /dev/null +++ b/rtgui/toneequalizer.h @@ -0,0 +1,62 @@ +/* -*- C++ -*- + * + * Adapted from ART. + * + * 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "checkbox.h" +#include "toolpanel.h" + +class ToneEqualizer: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public CheckBoxListener { +public: + static const Glib::ustring TOOL_NAME; + + ToneEqualizer(); + + 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 adjusterChanged(Adjuster *a, double newval) override; + void adjusterAutoToggled(Adjuster *a) override; + void enabledChanged() override; + void setBatchMode(bool batchMode) override; + void setAdjusterBehavior(bool bands_add, bool regularization_add, bool pivot_add); + void checkBoxToggled(CheckBox* c, CheckValue newval) override; + + void trimValues(rtengine::procparams::ProcParams *pp) override; + +private: + void colormapToggled(); + + std::array bands; + Adjuster *regularization; + Adjuster *pivot; + CheckBox *show_colormap; + + rtengine::ProcEvent EvEnabled; + rtengine::ProcEvent EvBands; + rtengine::ProcEvent EvRegularization; + rtengine::ProcEvent EvColormap; + rtengine::ProcEvent EvPivot; + + rtengine::procparams::ToneEqualizerParams inital_params; +}; diff --git a/rtgui/toolbar.cc b/rtgui/toolbar.cc index 99c4196c6..5cdfc2787 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -77,6 +77,12 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*straTool); + perspTool = Gtk::manage(new Gtk::ToggleButton()); + Gtk::Image* perspimg = Gtk::manage(new RTImage("perspective-vertical-bottom.png")); + perspTool->set_image(*perspimg); + perspTool->set_relief(Gtk::RELIEF_NONE); + pack_start(*perspTool); + handTool->set_active (true); current = TMHand; @@ -87,12 +93,14 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n cpConn = colPickerTool->signal_button_press_event().connect_notify( sigc::mem_fun(*this, &ToolBar::colPicker_pressed)); cropConn = cropTool->signal_toggled().connect( sigc::mem_fun(*this, &ToolBar::crop_pressed)); straConn = straTool->signal_toggled().connect( sigc::mem_fun(*this, &ToolBar::stra_pressed)); + perspConn = perspTool->signal_toggled().connect( sigc::mem_fun(*this, &ToolBar::persp_pressed)); handTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_HAND")); wbTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_WB")); colPickerTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_COLORPICKER")); cropTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_CROP")); straTool->set_tooltip_markup (M("TOOLBAR_TOOLTIP_STRAIGHTEN")); + perspTool->set_tooltip_markup(M("TOOLBAR_TOOLTIP_PERSPECTIVE")); } // @@ -107,9 +115,10 @@ void ToolBar::setTool (ToolMode tool) ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); - stopEdit = tool == TMHand && handTool->get_active() && editingMode; + stopEdit = tool == TMHand && (handTool->get_active() || (perspTool && perspTool->get_active())) && editingMode && !blockEdit; handTool->set_active (false); @@ -122,6 +131,9 @@ void ToolBar::setTool (ToolMode tool) if (colPickerTool) { colPickerTool->set_active (false); } + if (perspTool) { + perspTool->set_active(false); + } if (tool == TMHand) { handTool->set_active (true); @@ -138,6 +150,12 @@ void ToolBar::setTool (ToolMode tool) if (colPickerTool) { colPickerTool->set_active (true); } + } else if (tool == TMPerspective) { + if (perspTool) { + perspTool->set_active(true); + // Perspective is a hand tool, but has its own button. + handTool->set_image(*handimg); + } } current = tool; @@ -160,6 +178,7 @@ void ToolBar::startEditMode() ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (current != TMHand) { @@ -172,6 +191,9 @@ void ToolBar::startEditMode() cropTool->set_active (false); straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } current = TMHand; } handTool->set_active (true); @@ -204,9 +226,10 @@ void ToolBar::hand_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); - if (editingMode) { + if (editingMode && !blockEdit) { stopEditMode(); if (listener) { listener->editModeSwitchedOff (); @@ -222,6 +245,9 @@ void ToolBar::hand_pressed () cropTool->set_active (false); straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } handTool->set_active (true); if (current != TMHand) { @@ -244,6 +270,7 @@ void ToolBar::wb_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (current != TMSpotWB) { @@ -256,6 +283,9 @@ void ToolBar::wb_pressed () handTool->set_active (false); cropTool->set_active (false); straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } if (colPickerTool) { colPickerTool->set_active(false); } @@ -288,10 +318,13 @@ void ToolBar::colPicker_pressed (GdkEventButton* event) wbTool->set_active (false); } straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } if (current != TMColorPicker) { // Disabling all other tools, enabling the Picker tool and entering the "visible pickers" mode - if (editingMode) { + if (editingMode && !blockEdit) { stopEditMode(); if (listener) { listener->editModeSwitchedOff (); @@ -359,6 +392,7 @@ void ToolBar::crop_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (editingMode) { @@ -376,6 +410,9 @@ void ToolBar::crop_pressed () } straTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } cropTool->set_active (true); if (current != TMCropSelect) { @@ -399,6 +436,7 @@ void ToolBar::stra_pressed () ConnectionBlocker handBlocker(handConn); ConnectionBlocker straBlocker(straConn); ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); if (editingMode) { @@ -416,6 +454,9 @@ void ToolBar::stra_pressed () } cropTool->set_active (false); + if (perspTool) { + perspTool->set_active(false); + } straTool->set_active (true); if (current != TMStraighten) { @@ -432,6 +473,35 @@ void ToolBar::stra_pressed () } } +void ToolBar::persp_pressed () +{ + if (listener && !perspTool->get_active()) { + listener->toolDeselected(TMPerspective); + return; + } + + // Unlike other modes, mode switching is handled by the perspective panel. + { + ConnectionBlocker handBlocker(handConn); + ConnectionBlocker straBlocker(straConn); + ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker perspBlocker(perspConn); + ConnectionBlocker wbWasBlocked(wbTool, wbConn), cpWasBlocked(colPickerTool, cpConn); + + if (editingMode) { + stopEditMode(); + if (listener) { + listener->editModeSwitchedOff(); + } + } + + } + + if (listener) { + listener->toolSelected(TMPerspective); + } +} + bool ToolBar::handleShortcutKey (GdkEventKey* event) { @@ -485,6 +555,11 @@ void ToolBar::setBatchMode() removeIfThere(this, colPickerTool, false); colPickerTool = nullptr; } + if (perspTool) { + perspConn.disconnect(); + removeIfThere(this, perspTool, false); + perspTool = nullptr; + } allowNoTool = true; switch (current) { diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index 8ec6bb615..41ae2c680 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -30,6 +30,8 @@ class ToolBarListener public: virtual ~ToolBarListener() = default; + /// Callback when a tool is deselected. WARNING: Not yet called for most tools. + virtual void toolDeselected(ToolMode tool) = 0; /// Callback when a tool is selected virtual void toolSelected(ToolMode tool) = 0; @@ -37,7 +39,7 @@ public: virtual void editModeSwitchedOff() = 0; }; -class ToolBar final : public Gtk::HBox +class ToolBar final : public Gtk::Box { private: std::unique_ptr handimg; @@ -51,6 +53,7 @@ private: void colPicker_pressed (GdkEventButton* event); void crop_pressed (); void stra_pressed (); + void persp_pressed (); bool showColorPickers(bool showCP); void switchColorPickersVisibility(); @@ -60,16 +63,19 @@ protected: Gtk::ToggleButton* colPickerTool; Gtk::ToggleButton* cropTool; Gtk::ToggleButton* straTool; + Gtk::ToggleButton* perspTool; ToolBarListener* listener; LockablePickerToolListener* pickerListener; ToolMode current; bool allowNoTool; bool editingMode; // true if the cursor is being used to remotely edit tool's values + bool blockEdit; // true if edit tool shouldn't be disabled when pressing hand button or h/H key sigc::connection handConn; sigc::connection wbConn; sigc::connection cpConn; sigc::connection cropConn; sigc::connection straConn; + sigc::connection perspConn; public: ToolBar (); @@ -99,4 +105,9 @@ public: bool handleShortcutKey (GdkEventKey* event); void setBatchMode(); + + void blockEditDeactivation(bool cond = true) + { + blockEdit = cond; + } }; diff --git a/rtgui/toolenum.h b/rtgui/toolenum.h index c3bc873f1..424afca87 100644 --- a/rtgui/toolenum.h +++ b/rtgui/toolenum.h @@ -18,4 +18,4 @@ */ #pragma once -enum ToolMode {TMNone = -1, TMHand = 0, TMSpotWB = 1, TMCropSelect = 2, TMStraighten = 3, TMColorPicker = 4}; +enum ToolMode {TMNone = -1, TMHand = 0, TMSpotWB = 1, TMCropSelect = 2, TMStraighten = 3, TMColorPicker = 4, TMPerspective = 5}; diff --git a/rtgui/toollocationpref.cc b/rtgui/toollocationpref.cc new file mode 100644 index 000000000..a2e2c9480 --- /dev/null +++ b/rtgui/toollocationpref.cc @@ -0,0 +1,762 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Lawrence Lee + * + * 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 "guiutils.h" +#include "options.h" +#include "rtimage.h" +#include "rtscalable.h" +#include "toollocationpref.h" +#include "toolpanelcoord.h" + +using Tool = ToolPanelCoordinator::Tool; +using Favorites = std::unordered_set; + +namespace +{ + +/** + * Returns the language key for the panel's title. + */ +Glib::ustring getToolPanelTitleKey(ToolPanelCoordinator::Panel panel) +{ + switch (panel) { + case ToolPanelCoordinator::Panel::FAVORITE: + return "MAIN_TAB_FAVORITES"; + case ToolPanelCoordinator::Panel::EXPOSURE: + return "MAIN_TAB_EXPOSURE"; + case ToolPanelCoordinator::Panel::DETAILS: + return "MAIN_TAB_DETAIL"; + case ToolPanelCoordinator::Panel::COLOR: + return "MAIN_TAB_COLOR"; + case ToolPanelCoordinator::Panel::ADVANCED: + return "MAIN_TAB_ADVANCED"; + case ToolPanelCoordinator::Panel::LOCALLAB: + return "MAIN_TAB_LOCALLAB"; + case ToolPanelCoordinator::Panel::TRANSFORM_PANEL: + return "MAIN_TAB_TRANSFORM"; + case ToolPanelCoordinator::Panel::RAW: + return "MAIN_TAB_RAW"; + } + assert(false); + return ""; +} + +/** + * Returns the language key for the tool's title. + */ +Glib::ustring getToolTitleKey(Tool tool) +{ + using Tool = Tool; + switch (tool) { + case Tool::TONE_CURVE: + return "TP_EXPOSURE_LABEL"; + case Tool::SHADOWS_HIGHLIGHTS: + return "TP_SHADOWSHLIGHTS_LABEL"; + case Tool::TONE_EQUALIZER: + return "TP_TONE_EQUALIZER_LABEL"; + case Tool::IMPULSE_DENOISE: + return "TP_IMPULSEDENOISE_LABEL"; + case Tool::DEFRINGE_TOOL: + return "TP_DEFRINGE_LABEL"; + case Tool::SPOT: + return "TP_SPOT_LABEL"; + case Tool::DIR_PYR_DENOISE: + return "TP_DIRPYRDENOISE_LABEL"; + case Tool::EPD: + return "TP_EPD_LABEL"; + case Tool::SHARPENING_TOOL: + return "TP_SHARPENING_LABEL"; + case Tool::LOCAL_CONTRAST: + return "TP_LOCALCONTRAST_LABEL"; + case Tool::SHARPEN_EDGE: + return "TP_SHARPENEDGE_LABEL"; + case Tool::SHARPEN_MICRO: + return "TP_SHARPENMICRO_LABEL"; + case Tool::L_CURVE: + return "TP_LABCURVE_LABEL"; + case Tool::RGB_CURVES: + return "TP_RGBCURVES_LABEL"; + case Tool::COLOR_TONING: + return "TP_COLORTONING_LABEL"; + case Tool::LENS_GEOM: + return "TP_LENSGEOM_LABEL"; + case Tool::LENS_PROF: + return "TP_LENSPROFILE_LABEL"; + case Tool::DISTORTION: + return "TP_DISTORTION_LABEL"; + case Tool::ROTATE: + return "TP_ROTATE_LABEL"; + case Tool::VIBRANCE: + return "TP_VIBRANCE_LABEL"; + case Tool::COLOR_APPEARANCE: + return "TP_COLORAPP_LABEL"; + case Tool::WHITE_BALANCE: + return "TP_WBALANCE_LABEL"; + case Tool::VIGNETTING: + return "TP_VIGNETTING_LABEL"; + case Tool::RETINEX_TOOL: + return "TP_RETINEX_LABEL"; + case Tool::GRADIENT: + return "TP_GRADIENT_LABEL"; + case Tool::LOCALLAB: + return "TP_LOCALLAB_LABEL"; + case Tool::PC_VIGNETTE: + return "TP_PCVIGNETTE_LABEL"; + case Tool::PERSPECTIVE: + return "TP_PERSPECTIVE_LABEL"; + case Tool::CA_CORRECTION: + return "TP_CACORRECTION_LABEL"; + case Tool::CH_MIXER: + return "TP_CHMIXER_LABEL"; + case Tool::BLACK_WHITE: + return "TP_BWMIX_LABEL"; + case Tool::RESIZE_TOOL: + return "TP_RESIZE_LABEL"; + case Tool::PR_SHARPENING: + return "TP_PRSHARPENING_LABEL"; + case Tool::CROP_TOOL: + return "TP_CROP_LABEL"; + case Tool::ICM: + return "TP_ICM_LABEL"; + case Tool::WAVELET: + return "TP_WAVELET_LABEL"; + case Tool::DIR_PYR_EQUALIZER: + return "TP_DIRPYREQUALIZER_LABEL"; + case Tool::HSV_EQUALIZER: + return "TP_HSVEQUALIZER_LABEL"; + case Tool::FILM_SIMULATION: + return "TP_FILMSIMULATION_LABEL"; + case Tool::SOFT_LIGHT: + return "TP_SOFTLIGHT_LABEL"; + case Tool::DEHAZE: + return "TP_DEHAZE_LABEL"; + case Tool::SENSOR_BAYER: + return "TP_RAW_SENSOR_BAYER_LABEL"; + case Tool::SENSOR_XTRANS: + return "TP_RAW_SENSOR_XTRANS_LABEL"; + case Tool::BAYER_PROCESS: + return "TP_RAW_LABEL"; + case Tool::XTRANS_PROCESS: + return "TP_RAW_LABEL"; + case Tool::BAYER_PREPROCESS: + return "TP_PREPROCESS_LABEL"; + case Tool::PREPROCESS: + return "TP_PREPROCESS_LABEL"; + case Tool::DARKFRAME_TOOL: + return "TP_DARKFRAME_LABEL"; + case Tool::FLATFIELD_TOOL: + return "TP_FLATFIELD_LABEL"; + case Tool::RAW_CA_CORRECTION: + return "TP_RAWCACORR_LABEL"; + case Tool::RAW_EXPOSURE: + return "TP_EXPOS_WHITEPOINT_LABEL"; + case Tool::PREPROCESS_WB: + return "TP_PREPROCWB_LABEL"; + case Tool::BAYER_RAW_EXPOSURE: + return "TP_EXPOS_BLACKPOINT_LABEL"; + case Tool::XTRANS_RAW_EXPOSURE: + return "TP_EXPOS_BLACKPOINT_LABEL"; + case Tool::FATTAL: + return "TP_TM_FATTAL_LABEL"; + case Tool::FILM_NEGATIVE: + return "TP_FILMNEGATIVE_LABEL"; + case Tool::PD_SHARPENING: + return "TP_PDSHARPENING_LABEL"; + }; + assert(false); + return ""; +} + +/** + * A widget with buttons (packed vertically) for modifying a list store with a + * tree view. + * + * Includes buttons for moving single rows up or down and a button for removing + * selected rows. + */ +class ListEditButtons : public Gtk::Box +{ +private: + Gtk::TreeView &list; + Glib::RefPtr listStore; + Gtk::Button buttonUp; + Gtk::Button buttonDown; + Gtk::Button buttonRemove; + + sigc::signal &> signalRowsPreErase; + + void onButtonDownPressed(); + void onButtonRemovePressed(); + void onButtonUpPressed(); + void onListSelectionChanged(); + void updateButtonSensitivity(); + +public: + /** + * Constructs an edit buttons widget for modifying the provided list store. + * + * @param list The tree view for which selections are made in. The tree + * view's model MUST be the list store. + * @param listStore The list store that the widget will modify. + */ + explicit ListEditButtons(Gtk::TreeView &list, Glib::RefPtr listStore); + + /** + * Returns the signal that gets emitted right before this widget removes + * rows from its list store. + * + * The signal contains a vector of tree model paths of the rows that will be + * erased. + */ + sigc::signal &> getSignalRowsPreErase() const; +}; + +/** + * Model columns for the favorites list. + */ +class FavoritesColumns : public Gtk::TreeModelColumnRecord +{ +public: + /** The tool's display name. */ + Gtk::TreeModelColumn toolName; + /** The tool. */ + Gtk::TreeModelColumn tool; + + FavoritesColumns() + { + add(toolName); + add(tool); + } +}; + +/** + * Model columns for the available tools list. + */ +class ToolListColumns : public Gtk::TreeModelColumnRecord +{ +public: + /** The tool's display name. */ + Gtk::TreeModelColumn toolName; + /** The tool. */ + Gtk::TreeModelColumn tool; + /** Is the tool added to favorites. */ + Gtk::TreeModelColumn isFavorite; + /** Can the tool be added to favorites. */ + Gtk::TreeModelColumn isEditable; + + ToolListColumns() + { + add(toolName); + add(tool); + add(isFavorite); + add(isEditable); + } +}; + +ListEditButtons::ListEditButtons(Gtk::TreeView &list, Glib::RefPtr listStore) : + Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL), + list(list), + listStore(listStore) +{ + assert(list.get_model() == listStore); + + // Set button images. + RTImage *image_button_up = Gtk::manage(new RTImage("arrow-up-small.png")); + RTImage *image_button_down = Gtk::manage(new RTImage("arrow-down-small.png")); + RTImage *image_button_remove = Gtk::manage(new RTImage("remove-small.png")); + buttonUp.set_image(*image_button_up); + buttonDown.set_image(*image_button_down); + buttonRemove.set_image(*image_button_remove); + + // Connect signals for changing button sensitivity. + const auto on_list_sel_changed_fun = sigc::mem_fun( + *this, &ListEditButtons::onListSelectionChanged); + const auto on_row_deleted_fun = sigc::hide(on_list_sel_changed_fun); + const auto on_row_inserted_fun = sigc::hide(on_row_deleted_fun); + list.get_selection()->signal_changed().connect(on_list_sel_changed_fun); + listStore->signal_row_deleted().connect(on_row_deleted_fun); + listStore->signal_row_inserted().connect(on_row_inserted_fun); + + // Connect signals for buttons. + buttonUp.signal_pressed().connect(sigc::mem_fun( + *this, &ListEditButtons::onButtonUpPressed)); + buttonDown.signal_pressed().connect(sigc::mem_fun( + *this, &ListEditButtons::onButtonDownPressed)); + buttonRemove.signal_pressed().connect(sigc::mem_fun( + *this, &ListEditButtons::onButtonRemovePressed)); + + updateButtonSensitivity(); + + add(buttonUp); + add(buttonDown); + add(buttonRemove); +} + +void ListEditButtons::onButtonDownPressed() +{ + const auto list_children = listStore->children(); + const std::vector selected = + list.get_selection()->get_selected_rows(); + + if (selected.size() != 1) { // Only one can be selected. + return; + } + + // Get the selected row and next row. + const auto selected_row_iter = listStore->get_iter(selected[0]); + auto next_row_iter = selected_row_iter; + next_row_iter++; + + if (next_row_iter == list_children.end()) { // Can't be last row. + return; + } + + // Move the selected row down and update the buttons. + listStore->iter_swap(selected_row_iter, next_row_iter); + updateButtonSensitivity(); +} + +void ListEditButtons::onButtonRemovePressed() +{ + const std::vector selected_paths = + list.get_selection()->get_selected_rows(); + std::vector selected(selected_paths.size()); + + // Get row references, which are valid until the row is removed. + std::transform( + selected_paths.begin(), + selected_paths.end(), + selected.begin(), + [this](const Gtk::TreeModel::Path &row_path) { + return Gtk::TreeModel::RowReference(listStore, row_path); + }); + + signalRowsPreErase.emit(selected_paths); + + // Remove the selected rows. + for (const auto &row_ref : selected) { + const auto row_path = row_ref.get_path(); + if (row_path) { + listStore->erase(listStore->get_iter(row_path)); + } else if (rtengine::settings->verbose) { + std::cout << "Unable to remove row because it does not exist anymore." << std::endl; + } + } + + updateButtonSensitivity(); +} + +void ListEditButtons::onButtonUpPressed() +{ + const auto list_children = listStore->children(); + const std::vector selected = + list.get_selection()->get_selected_rows(); + + if (selected.size() != 1) { // Only one can be selected. + return; + } + + const auto selected_row_iter = listStore->get_iter(selected[0]); + + if (selected_row_iter == list_children.begin()) { // Can't be first row. + return; + } + + // Swap selected row with the previous row. + auto prev_row_iter = selected_row_iter; + prev_row_iter--; + listStore->iter_swap(selected_row_iter, prev_row_iter); + updateButtonSensitivity(); +} + +void ListEditButtons::onListSelectionChanged() +{ + updateButtonSensitivity(); +} + +void ListEditButtons::updateButtonSensitivity() +{ + assert(list.get_model() == listStore); + + const std::vector selected = + list.get_selection()->get_selected_rows(); + + // Update sensitivity of the move up/down buttons. + if (selected.size() != 1) { + // Items can only be moved if one row is selected. + buttonDown.set_sensitive(false); + buttonUp.set_sensitive(false); + } else { + // Up button cannot be used on the first row. Down button cannot be used + // on the last row. + auto selected_row_iter = list.get_model()->get_iter(selected[0]); + const auto list_children = listStore->children(); + buttonUp.set_sensitive(!selected_row_iter->equal(list_children.begin())); + buttonDown.set_sensitive(!(++selected_row_iter)->equal(list_children.end())); + } + + // Update sensitivity of the remove button. + buttonRemove.set_sensitive(selected.size() > 0); +} + +sigc::signal &> +ListEditButtons::getSignalRowsPreErase() const +{ + return signalRowsPreErase; +} + +} + +struct ToolLocationPreference::Impl { + Options &options; + + // General options. + Gtk::CheckButton *cloneFavoriteToolsToggleWidget; + + // Tool list. + ToolListColumns toolListColumns; + Glib::RefPtr toolListModelPtr; + Gtk::CellRendererToggle toolListCellRendererFavorite; + Gtk::CellRendererText toolListCellRendererToolName; + Gtk::TreeViewColumn toolListViewColumnFavorite; + Gtk::TreeViewColumn toolListViewColumnToolName; + Gtk::TreeView *toolListViewPtr; + std::unordered_map + toolListToolToRowIterMap; + + // Favorites list. + FavoritesColumns favoritesColumns; + Glib::RefPtr favoritesModelPtr; + Gtk::CellRendererText favoritesCellRendererToolName; + Gtk::TreeViewColumn favoritesViewColumnToolName; + Gtk::TreeView *favoritesViewPtr; + ListEditButtons favoritesListEditButtons; + + /** + * Constructs an implementation that gets values from and updates the + * provided options object. + */ + explicit Impl(Options &options); + + /** + * Adds the tools in the tool tree as a child in the provided row. + * + * @param tools The tool tree. + * @param parentRowIter An iterator to the row under which to add the tools. + * @param favorites The tools which are currently marked as favorites. + */ + void addToolListRowGroup( + const std::vector &tools, + const Gtk::TreeIter &parentRowIter, + const Favorites &favorites); + /** + * Toggles the tool list favorite column and updates the favorites list. + * + * @param row_path Path to the tool list model row. + */ + void favoriteToggled(const Glib::ustring &row_path); + /** + * Initializes the favorites list. + * + * @param favorites Tools that are currently marked as favorites. + */ + void initFavoritesRows(const std::vector &favorites); + /** + * Initializes the available tools list. + * + * @param favorites Tools that are currently marked as favorites. + */ + void initToolListRows(const std::vector &favorites); + /** + * Updates the favorites column of the available tools list when tools are + * about to be removed from the favorites list. + * + * @param paths Paths in the favorites list pointing to the rows that are + * about to be removed. + */ + void onFavoritesRowsPreRemove(const std::vector &paths); + /** + * Converts tool names to their corresponding tools. + * + * @param tool_names The tool names that need to be converted. + * @return The tools. + */ + std::vector toolNamesToTools( + const std::vector &tool_names) const; + /** + * Updates the options object associated with this object with the current + * favorites preferences. + */ + void updateOptions(); +}; + +ToolLocationPreference::Impl::Impl(Options &options) : + options(options), + + // General options. + cloneFavoriteToolsToggleWidget(Gtk::manage( + new Gtk::CheckButton(M("PREFERENCES_TOOLPANEL_CLONE_FAVORITES")))), + + // Tool list. + toolListModelPtr(Gtk::TreeStore::create(toolListColumns)), + toolListViewColumnFavorite( + Gtk::TreeViewColumn(M("PREFERENCES_TOOLPANEL_FAVORITE"))), + toolListViewColumnToolName( + Gtk::TreeViewColumn(M("PREFERENCES_TOOLPANEL_TOOL"))), + toolListViewPtr(Gtk::manage(new Gtk::TreeView(toolListModelPtr))), + + // Favorites list. + favoritesModelPtr(Gtk::ListStore::create(favoritesColumns)), + favoritesViewColumnToolName( + Gtk::TreeViewColumn(M("PREFERENCES_TOOLPANEL_TOOL"))), + favoritesViewPtr(Gtk::manage(new Gtk::TreeView(favoritesModelPtr))), + favoritesListEditButtons(*favoritesViewPtr, favoritesModelPtr) +{ + const std::vector favorites = toolNamesToTools(options.favorites); + + // General options. + cloneFavoriteToolsToggleWidget->set_active(options.cloneFavoriteTools); + cloneFavoriteToolsToggleWidget->set_tooltip_text( + M("PREFERENCES_TOOLPANEL_CLONE_FAVORITES_TOOLTIP")); + + // Tool list. + toolListViewPtr->append_column(toolListViewColumnToolName); + toolListViewColumnToolName.pack_start(toolListCellRendererToolName); + toolListViewColumnToolName.set_expand(); + toolListViewColumnToolName.set_renderer( + toolListCellRendererToolName, toolListColumns.toolName); + toolListViewPtr->append_column(toolListViewColumnFavorite); + toolListViewColumnFavorite.pack_start(toolListCellRendererFavorite); + toolListViewColumnFavorite.set_expand(false); + toolListViewColumnFavorite.set_renderer( + toolListCellRendererFavorite, toolListColumns.isFavorite); + toolListViewColumnFavorite.add_attribute( + toolListCellRendererFavorite.property_visible(), toolListColumns.isEditable); + toolListCellRendererFavorite.signal_toggled().connect( + sigc::mem_fun(*this, &ToolLocationPreference::Impl::favoriteToggled)); + initToolListRows(favorites); + toolListViewPtr->expand_all(); + + // Favorites list. + favoritesViewPtr->append_column(favoritesViewColumnToolName); + favoritesViewPtr->set_reorderable(true); + favoritesViewColumnToolName.pack_start(favoritesCellRendererToolName); + favoritesViewColumnToolName.set_renderer( + favoritesCellRendererToolName, favoritesColumns.toolName); + favoritesListEditButtons.getSignalRowsPreErase().connect(sigc::mem_fun( + *this, &ToolLocationPreference::Impl::onFavoritesRowsPreRemove)); + favoritesViewPtr->get_selection()->set_mode( + Gtk::SelectionMode::SELECTION_MULTIPLE); + initFavoritesRows(favorites); +} + +void ToolLocationPreference::Impl::favoriteToggled(const Glib::ustring &row_path) +{ + auto row_iter = toolListModelPtr->get_iter(row_path); + const bool is_favorite = !row_iter->get_value(toolListColumns.isFavorite); + const Tool tool = row_iter->get_value(toolListColumns.tool); + + // Update favorite column in the tool list. + row_iter->set_value(toolListColumns.isFavorite, is_favorite); + + // Update the favorites list. + if (is_favorite) { + // Add to favorites list. + const auto new_favorite_row_iter = favoritesModelPtr->append(); + new_favorite_row_iter->set_value( + favoritesColumns.toolName, + M(getToolTitleKey(tool))); + new_favorite_row_iter->set_value(favoritesColumns.tool, tool); + } else { + // Remove from favorites list. + const auto favorites_rows = favoritesModelPtr->children(); + auto row = favorites_rows.begin(); + while ( + row != favorites_rows.end() && + row->get_value(favoritesColumns.tool) != tool) { + row++; + } + if (row != favorites_rows.end()) { + favoritesModelPtr->erase(row); + } + } +} + +void ToolLocationPreference::Impl::initFavoritesRows( + const std::vector &favorites) +{ + // Add the favorites to the favorites list store. + for (const auto tool : favorites) { + const auto favorite_row_iter = favoritesModelPtr->append(); + favorite_row_iter->set_value( + favoritesColumns.toolName, + M(getToolTitleKey(tool))); + favorite_row_iter->set_value(favoritesColumns.tool, tool); + } +} + +void ToolLocationPreference::Impl::addToolListRowGroup( + const std::vector &tools, + const Gtk::TreeIter &parentRowIter, + const Favorites &favorites) +{ + // Recursively add the tool and its children to the tool list tree store. + for (const ToolPanelCoordinator::ToolTree &tool : tools) { + const auto tool_row_iter = + toolListModelPtr->append(parentRowIter->children()); + tool_row_iter->set_value( + toolListColumns.toolName, + M(getToolTitleKey(tool.id))); + tool_row_iter->set_value(toolListColumns.tool, tool.id); + tool_row_iter->set_value( + toolListColumns.isFavorite, + favorites.count(tool.id) > 0); + tool_row_iter->set_value( + toolListColumns.isEditable, + ToolPanelCoordinator::isFavoritable(tool.id)); + toolListToolToRowIterMap[tool.id] = tool_row_iter; + addToolListRowGroup(tool.children, tool_row_iter, favorites); + } +}; + +void ToolLocationPreference::Impl::initToolListRows(const std::vector &favorites) +{ + const auto panel_tools = ToolPanelCoordinator::getDefaultToolLayout(); + Favorites favorites_set; + + // Convert the favorites vector into a set for fast lookup. + for (const auto &tool : favorites) { + favorites_set.insert(tool); + } + + // Add each panel and their children to the tool list. + for (const auto panel : { + ToolPanelCoordinator::Panel::EXPOSURE, + ToolPanelCoordinator::Panel::DETAILS, + ToolPanelCoordinator::Panel::COLOR, + ToolPanelCoordinator::Panel::ADVANCED, + ToolPanelCoordinator::Panel::LOCALLAB, + ToolPanelCoordinator::Panel::TRANSFORM_PANEL, + ToolPanelCoordinator::Panel::RAW, + }) { + const auto tool_group_iter = toolListModelPtr->append(); + tool_group_iter->set_value( + toolListColumns.toolName, + M(getToolPanelTitleKey(panel))); + addToolListRowGroup(panel_tools.at(panel), tool_group_iter, favorites_set); + } +} + +void ToolLocationPreference::Impl::onFavoritesRowsPreRemove( + const std::vector &paths) +{ + // Unset the favorite column in the tools list for tools about to be removed + // from the favorites list. + for (const auto &path : paths) { + const auto &row_iter = toolListToolToRowIterMap.at( + favoritesModelPtr->get_iter(path)->get_value(favoritesColumns.tool)); + row_iter->set_value(toolListColumns.isFavorite, false); + } +} + +std::vector ToolLocationPreference::Impl::toolNamesToTools( + const std::vector &tool_names) const +{ + std::vector tool_set; + + for (const auto &tool_name : tool_names) { + Tool tool; + try { + tool = ToolPanelCoordinator::getToolFromName(tool_name); + } catch (const std::out_of_range &e) { + if (rtengine::settings->verbose) { + std::cerr + << "Unrecognized tool name \"" << tool_name << "\"." + << std::endl; + } + assert(false); + continue; + } + tool_set.push_back(tool); + } + + return tool_set; +} + +void ToolLocationPreference::Impl::updateOptions() +{ + options.cloneFavoriteTools = cloneFavoriteToolsToggleWidget->get_active(); + + const auto favorites_rows = favoritesModelPtr->children(); + options.favorites.resize(favorites_rows.size()); + for (Gtk::TreeNodeChildren::size_type i = 0; i < favorites_rows.size(); i++) { + const Tool tool = favorites_rows[i].get_value(favoritesColumns.tool); + options.favorites[i] = ToolPanelCoordinator::getToolName(tool); + } +} + +ToolLocationPreference::ToolLocationPreference(Options &options) : + impl(new Impl(options)) +{ + // Layout grid. + Gtk::Grid *layout_grid = Gtk::manage(new Gtk::Grid()); + layout_grid->set_column_spacing(4); + layout_grid->set_row_spacing(4); + add(*layout_grid); + + // Tool list. + Gtk::Frame *tool_list_frame = Gtk::manage(new Gtk::Frame( + M("PREFERENCES_TOOLPANEL_AVAILABLETOOLS"))); + Gtk::ScrolledWindow *tool_list_scrolled_window = + Gtk::manage(new Gtk::ScrolledWindow()); + tool_list_scrolled_window->set_min_content_width( + 400 * (RTScalable::getTweakedDPI() / RTScalable::baseDPI)); + layout_grid->attach_next_to(*tool_list_frame, Gtk::PositionType::POS_RIGHT, 1, 1); + tool_list_frame->add(*tool_list_scrolled_window); + tool_list_scrolled_window->add(*impl->toolListViewPtr); + setExpandAlignProperties( + tool_list_frame, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); + + // Favorites list. + Gtk::Frame *favorites_frame = Gtk::manage(new Gtk::Frame( + M("PREFERENCES_TOOLPANEL_FAVORITESPANEL"))); + Gtk::Box *favorites_box = Gtk::manage(new Gtk::Box()); + Gtk::ScrolledWindow *favorites_list_scrolled_window = + Gtk::manage(new Gtk::ScrolledWindow()); + favorites_list_scrolled_window->set_min_content_width( + 300 * (RTScalable::getTweakedDPI() / RTScalable::baseDPI)); + layout_grid->attach_next_to(*favorites_frame, Gtk::PositionType::POS_RIGHT, 1, 1); + favorites_box->pack_start(impl->favoritesListEditButtons, false, false); + favorites_box->pack_start(*favorites_list_scrolled_window, false, false); + favorites_frame->add(*favorites_box); + favorites_list_scrolled_window->add(*impl->favoritesViewPtr); + setExpandAlignProperties( + favorites_frame, false, true, Gtk::ALIGN_START, Gtk::ALIGN_FILL); + + // General options. + layout_grid->attach_next_to( + *impl->cloneFavoriteToolsToggleWidget, Gtk::PositionType::POS_BOTTOM, 2, 1); +} + +void ToolLocationPreference::updateOptions() +{ + impl->updateOptions(); +} diff --git a/rtgui/toollocationpref.h b/rtgui/toollocationpref.h new file mode 100644 index 000000000..c7bee8695 --- /dev/null +++ b/rtgui/toollocationpref.h @@ -0,0 +1,45 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2021 Lawrence Lee + * + * 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 + +class Options; + +/** + * Widget for configuring the location of tools in the tool panel tabs. + */ +class ToolLocationPreference : public Gtk::Box +{ +private: + struct Impl; + std::unique_ptr impl; + +public: + /** + * Constructs a tool location preference widget that gets values from and + * updates the provided options object. + */ + explicit ToolLocationPreference(Options &options); + /** + * Updates the options object associated with this object with the current + * favorites preferences. + */ + void updateOptions(); +}; diff --git a/rtgui/toolpanel.cc b/rtgui/toolpanel.cc index b1282f523..46899f1a2 100644 --- a/rtgui/toolpanel.cc +++ b/rtgui/toolpanel.cc @@ -27,6 +27,7 @@ using namespace rtengine::procparams; ToolVBox::ToolVBox() { + set_orientation(Gtk::ORIENTATION_VERTICAL); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 set_spacing(1); // Vertical space between tools @@ -36,6 +37,8 @@ ToolVBox::ToolVBox() { } ToolParamBlock::ToolParamBlock() { + set_orientation(Gtk::ORIENTATION_VERTICAL); + get_style_context()->add_class("ToolParamBlock"); //GTK318 #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 set_spacing(2); // Vertical space between parameters in a single tool @@ -44,6 +47,11 @@ ToolParamBlock::ToolParamBlock() { //GTK318 } +Gtk::SizeRequestMode ToolParamBlock::get_request_mode_vfunc () const +{ + return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; +} + FoldableToolPanel::FoldableToolPanel(Gtk::Box* content, Glib::ustring toolName, Glib::ustring UILabel, bool need11, bool useEnabled) : ToolPanel(toolName, need11), parentContainer(nullptr), exp(nullptr), lastEnabled(true) { if (!content) { @@ -52,10 +60,10 @@ FoldableToolPanel::FoldableToolPanel(Gtk::Box* content, Glib::ustring toolName, // exp->set_use_markup (true); if (need11) { - Gtk::HBox *titleHBox = Gtk::manage(new Gtk::HBox()); + Gtk::Box *titleHBox = Gtk::manage(new Gtk::Box()); Gtk::Label *label = Gtk::manage(new Gtk::Label()); - label->set_markup(Glib::ustring("") + escapeHtmlChars(UILabel) + Glib::ustring("")); + label->set_markup(escapeHtmlChars(UILabel)); label->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); titleHBox->pack_start(*label, Gtk::PACK_EXPAND_WIDGET, 0); @@ -71,7 +79,15 @@ FoldableToolPanel::FoldableToolPanel(Gtk::Box* content, Glib::ustring toolName, exp->signal_button_release_event().connect_notify( sigc::mem_fun(this, &FoldableToolPanel::foldThemAll) ); enaConn = signal_enabled_toggled().connect( sigc::mem_fun(*this, &FoldableToolPanel::enabled_toggled) ); - exp->add (*content); + Gtk::Box *expanderContents = Gtk::manage( + new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + subToolsContainer = Gtk::manage(new ToolParamBlock()); + subToolsContainer->get_style_context()->add_class("SubToolsContainer"); + expanderContents->get_style_context()->add_class("ExpanderContents"); + expanderContents->pack_start(*content, false, false, 0); + expanderContents->pack_start(*subToolsContainer, false, false, 0); + + exp->add(*expanderContents, false); exp->show (); } diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index aecf1f39f..f22f6f771 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -39,17 +39,26 @@ namespace procparams class ProcParams; } } +class EditDataProvider; class ToolPanelListener { public: virtual ~ToolPanelListener() = default; + + /// @brief Ask to refresh the preview not triggered by a parameter change (e.g. 'On Preview' editing). + virtual void refreshPreview(const rtengine::ProcEvent& event) = 0; + /// @brief Used to notify all listeners that a parameters has been effectively changed virtual void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) = 0; + /// @brief Set the TweakOperator to the StagedImageProcessor, to let some tool enter into special modes + virtual void setTweakOperator (rtengine::TweakOperator *tOperator) = 0; + /// @brief Unset the TweakOperator to the StagedImageProcessor + virtual void unsetTweakOperator (rtengine::TweakOperator *tOperator) = 0; }; /// @brief This class control the space around the group of tools inside a tab, as well as the space separating each tool. */ class ToolVBox : - public Gtk::VBox + public Gtk::Box { public: ToolVBox(); @@ -57,10 +66,11 @@ public: /// @brief This class control the space around a tool's block of parameter. */ class ToolParamBlock : - public Gtk::VBox + public Gtk::Box { public: ToolParamBlock(); + Gtk::SizeRequestMode get_request_mode_vfunc () const override; }; class ToolPanel : @@ -89,6 +99,10 @@ public: { return nullptr; } + virtual ToolParamBlock *getSubToolsContainer() const + { + return nullptr; + } virtual void setExpanded (bool expanded) {} virtual bool getExpanded () { @@ -143,7 +157,7 @@ public: this->batchMode = batchMode; } - virtual Glib::ustring getToolName () { + Glib::ustring getToolName () { return toolName; } }; @@ -155,6 +169,7 @@ class FoldableToolPanel : protected: Gtk::Box* parentContainer; MyExpander* exp; + ToolParamBlock *subToolsContainer; bool lastEnabled; sigc::connection enaConn; void foldThemAll (GdkEventButton* event); @@ -164,11 +179,17 @@ public: FoldableToolPanel(Gtk::Box* content, Glib::ustring toolName, Glib::ustring UILabel, bool need11 = false, bool useEnabled = false); - MyExpander* getExpander() override + MyExpander* getExpander() final { return exp; } - void setExpanded (bool expanded) override + + ToolParamBlock *getSubToolsContainer() const final + { + return subToolsContainer; + } + + void setExpanded (bool expanded) final { if (exp) { exp->set_expanded( expanded ); @@ -186,7 +207,7 @@ public: exp->show(); } } - bool getExpanded () override + bool getExpanded () final { if (exp) { return exp->get_expanded(); @@ -194,11 +215,11 @@ public: return false; } - void setParent (Gtk::Box* parent) override + void setParent (Gtk::Box* parent) final { parentContainer = parent; } - Gtk::Box* getParent () override + Gtk::Box* getParent () final { return parentContainer; } diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 57f61a09c..e9b0ce5cc 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -16,6 +16,8 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include + #include "multilangmgr.h" #include "toolpanelcoord.h" #include "metadatapanel.h" @@ -26,12 +28,253 @@ #include "../rtengine/dfmanager.h" #include "../rtengine/ffmanager.h" #include "../rtengine/improcfun.h" +#include "../rtengine/perspectivecorrection.h" #include "../rtengine/procevents.h" #include "../rtengine/refreshmap.h" using namespace rtengine::procparams; -ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favoritePanelSW(nullptr), hasChanged (false), editDataProvider (nullptr) +using Tool = ToolPanelCoordinator::Tool; +using ToolTree = ToolPanelCoordinator::ToolTree; + +const std::vector EXPOSURE_PANEL_TOOLS = { + { + .id = Tool::TONE_CURVE, + }, + { + .id = Tool::SHADOWS_HIGHLIGHTS, + }, + { + .id = Tool::TONE_EQUALIZER, + }, + { + .id = Tool::EPD, + }, + { + .id = Tool::FATTAL, + }, + { + .id = Tool::PC_VIGNETTE, + }, + { + .id = Tool::GRADIENT, + }, + { + .id = Tool::L_CURVE, + }, +}; + +const std::vector DETAILS_PANEL_TOOLS = { + { + .id = Tool::SPOT, + }, + { + .id = Tool::SHARPENING_TOOL, + }, + { + .id = Tool::LOCAL_CONTRAST, + }, + { + .id = Tool::SHARPEN_EDGE, + }, + { + .id = Tool::SHARPEN_MICRO, + }, + { + .id = Tool::IMPULSE_DENOISE, + }, + { + .id = Tool::DIR_PYR_DENOISE, + }, + { + .id = Tool::DEFRINGE_TOOL, + }, + { + .id = Tool::DIR_PYR_EQUALIZER, + }, + { + .id = Tool::DEHAZE, + }, +}; + +const std::vector COLOR_PANEL_TOOLS = { + { + .id = Tool::WHITE_BALANCE, + }, + { + .id = Tool::VIBRANCE, + }, + { + .id = Tool::CH_MIXER, + }, + { + .id = Tool::BLACK_WHITE, + }, + { + .id = Tool::HSV_EQUALIZER, + }, + { + .id = Tool::FILM_SIMULATION, + }, + { + .id = Tool::FILM_NEGATIVE, + }, + { + .id = Tool::SOFT_LIGHT, + }, + { + .id = Tool::RGB_CURVES, + }, + { + .id = Tool::COLOR_TONING, + }, + { + .id = Tool::ICM, + }, +}; + +const std::vector ADVANCED_PANEL_TOOLS = { + { + .id = Tool::RETINEX_TOOL, + }, + { + .id = Tool::COLOR_APPEARANCE, + }, + { + .id = Tool::WAVELET, + }, +}; + +const std::vector LOCALLAB_PANEL_TOOLS = { + { + .id = Tool::LOCALLAB, + }, +}; + +const std::vector TRANSFORM_PANEL_TOOLS = { + { + .id = Tool::CROP_TOOL, + }, + { + .id = Tool::RESIZE_TOOL, + .children = { + { + .id = Tool::PR_SHARPENING, + }, + }, + }, + { + .id = Tool::LENS_GEOM, + .children = { + { + .id = Tool::ROTATE, + }, + { + .id = Tool::PERSPECTIVE, + }, + { + .id = Tool::LENS_PROF, + }, + { + .id = Tool::DISTORTION, + }, + { + .id = Tool::CA_CORRECTION, + }, + { + .id = Tool::VIGNETTING, + }, + }, + }, +}; + +const std::vector RAW_PANEL_TOOLS = { + { + .id = Tool::SENSOR_BAYER, + .children = { + { + { + .id = Tool::BAYER_PROCESS, + }, + { + .id = Tool::BAYER_RAW_EXPOSURE, + }, + { + .id = Tool::BAYER_PREPROCESS, + }, + { + .id = Tool::RAW_CA_CORRECTION, + }, + }, + }, + }, + { + .id = Tool::SENSOR_XTRANS, + .children = { + { + { + .id = Tool::XTRANS_PROCESS, + }, + { + .id = Tool::XTRANS_RAW_EXPOSURE, + }, + }, + }, + }, + { + .id = Tool::RAW_EXPOSURE, + }, + { + .id = Tool::PREPROCESS_WB, + }, + { + .id = Tool::PREPROCESS, + }, + { + .id = Tool::DARKFRAME_TOOL, + }, + { + .id = Tool::FLATFIELD_TOOL, + }, + { + .id = Tool::PD_SHARPENING, + }, +}; + +const ToolPanelCoordinator::ToolLayout PANEL_TOOLS = { + { + ToolPanelCoordinator::Panel::EXPOSURE, + EXPOSURE_PANEL_TOOLS + }, + { + ToolPanelCoordinator::Panel::DETAILS, + DETAILS_PANEL_TOOLS + }, + { + ToolPanelCoordinator::Panel::COLOR, + COLOR_PANEL_TOOLS + }, + { + ToolPanelCoordinator::Panel::ADVANCED, + ADVANCED_PANEL_TOOLS + }, + { + ToolPanelCoordinator::Panel::LOCALLAB, + LOCALLAB_PANEL_TOOLS + }, + { + ToolPanelCoordinator::Panel::TRANSFORM_PANEL, + TRANSFORM_PANEL_TOOLS + }, + { + ToolPanelCoordinator::Panel::RAW, + RAW_PANEL_TOOLS + }, +}; + +std::unordered_map ToolPanelCoordinator::toolNamesReverseMap; + +ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favoritePanelSW(nullptr), hasChanged (false), batch(batch), editDataProvider (nullptr), photoLoadedOnce(false) { favoritePanel = Gtk::manage (new ToolVBox ()); @@ -41,61 +284,66 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit transformPanel = Gtk::manage (new ToolVBox ()); rawPanel = Gtk::manage (new ToolVBox ()); advancedPanel = Gtk::manage (new ToolVBox ()); + locallabPanel = Gtk::manage(new ToolVBox()); coarse = Gtk::manage (new CoarsePanel ()); toneCurve = Gtk::manage (new ToneCurve ()); shadowshighlights = Gtk::manage (new ShadowsHighlights ()); + toneEqualizer = Gtk::manage (new ToneEqualizer ()); 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 ()); - rgbcurves = Gtk::manage (new RGBCurves ()); - colortoning = Gtk::manage (new ColorToning ()); - lensgeom = Gtk::manage (new LensGeometry ()); - lensProf = Gtk::manage (new LensProfilePanel ()); - distortion = Gtk::manage (new Distortion ()); - rotate = Gtk::manage (new Rotate ()); - vibrance = Gtk::manage (new Vibrance ()); - colorappearance = Gtk::manage (new ColorAppearance ()); - whitebalance = Gtk::manage (new WhiteBalance ()); - vignetting = Gtk::manage (new Vignetting ()); - retinex = Gtk::manage (new Retinex ()); - gradient = Gtk::manage (new Gradient ()); - pcvignette = Gtk::manage (new PCVignette ()); - perspective = Gtk::manage (new PerspCorrection ()); - cacorrection = Gtk::manage (new CACorrection ()); - chmixer = Gtk::manage (new ChMixer ()); - blackwhite = Gtk::manage (new BlackWhite ()); - resize = Gtk::manage (new Resize ()); - prsharpening = Gtk::manage (new PrSharpening()); - crop = Gtk::manage (new Crop ()); - icm = Gtk::manage (new ICMPanel ()); + sharpenEdge = Gtk::manage(new SharpenEdge()); + sharpenMicro = Gtk::manage(new SharpenMicro()); + lcurve = Gtk::manage(new LCurve()); + rgbcurves = Gtk::manage(new RGBCurves()); + colortoning = Gtk::manage(new ColorToning()); + lensgeom = Gtk::manage(new LensGeometry()); + lensProf = Gtk::manage(new LensProfilePanel()); + distortion = Gtk::manage(new Distortion()); + rotate = Gtk::manage(new Rotate()); + vibrance = Gtk::manage(new Vibrance()); + colorappearance = Gtk::manage(new ColorAppearance()); + whitebalance = Gtk::manage(new WhiteBalance()); + vignetting = Gtk::manage(new Vignetting()); + retinex = Gtk::manage(new Retinex()); + gradient = Gtk::manage(new Gradient()); + locallab = Gtk::manage(new Locallab()); + pcvignette = Gtk::manage(new PCVignette()); + perspective = Gtk::manage(new PerspCorrection()); + cacorrection = Gtk::manage(new CACorrection()); + chmixer = Gtk::manage(new ChMixer()); + blackwhite = Gtk::manage(new BlackWhite()); + resize = Gtk::manage(new Resize()); + prsharpening = Gtk::manage(new PrSharpening()); + crop = Gtk::manage(new Crop()); + icm = Gtk::manage(new ICMPanel()); metadata = Gtk::manage(new MetaDataPanel()); - wavelet = Gtk::manage (new Wavelet ()); - dirpyrequalizer = Gtk::manage (new DirPyrEqualizer ()); - hsvequalizer = Gtk::manage (new HSVEqualizer ()); - filmSimulation = Gtk::manage (new FilmSimulation ()); + wavelet = Gtk::manage(new Wavelet()); + 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 ()); - xtransprocess = Gtk::manage (new XTransProcess ()); - bayerpreprocess = Gtk::manage (new BayerPreProcess ()); - preprocess = Gtk::manage (new PreProcess ()); - darkframe = Gtk::manage (new DarkFrame ()); - flatfield = Gtk::manage (new FlatField ()); - rawcacorrection = Gtk::manage (new RAWCACorr ()); - rawexposure = Gtk::manage (new RAWExposure ()); - bayerrawexposure = Gtk::manage (new BayerRAWExposure ()); - xtransrawexposure = Gtk::manage (new XTransRAWExposure ()); - fattal = Gtk::manage (new FattalToneMapping ()); - filmNegative = Gtk::manage (new FilmNegative ()); + sensorbayer = Gtk::manage(new SensorBayer()); + sensorxtrans = Gtk::manage(new SensorXTrans()); + bayerprocess = Gtk::manage(new BayerProcess()); + xtransprocess = Gtk::manage(new XTransProcess()); + bayerpreprocess = Gtk::manage(new BayerPreProcess()); + preprocess = Gtk::manage(new PreProcess()); + darkframe = Gtk::manage(new DarkFrame()); + flatfield = Gtk::manage(new FlatField()); + rawcacorrection = Gtk::manage(new RAWCACorr()); + rawexposure = Gtk::manage(new RAWExposure()); + preprocessWB = Gtk::manage (new PreprocessWB ()); + bayerrawexposure = Gtk::manage(new BayerRAWExposure()); + xtransrawexposure = Gtk::manage(new XTransRAWExposure()); + fattal = Gtk::manage(new FattalToneMapping()); + filmNegative = Gtk::manage (new FilmNegative()); pdSharpening = Gtk::manage (new PdSharpening()); // So Demosaic, Line noise filter, Green Equilibration, Ca-Correction (garder le nom de section identique!) and Black-Level will be moved in a "Bayer sensor" tool, // and a separate Demosaic and Black Level tool will be created in an "X-Trans sensor" tool @@ -105,249 +353,610 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favorit // Valeurs par dfaut: // Best -> low ISO // Medium -> High ISO - favorites.resize(options.favorites.size(), nullptr); - addfavoritePanel (colorPanel, whitebalance); - addfavoritePanel (exposurePanel, toneCurve); - addfavoritePanel (colorPanel, vibrance); - addfavoritePanel (colorPanel, chmixer); - addfavoritePanel (colorPanel, blackwhite); - addfavoritePanel (exposurePanel, shadowshighlights); - 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); - 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); - addfavoritePanel (rawPanel, filmNegative); - addfavoritePanel (rawPanel, pdSharpening); + for (const auto &panel_tool_layout : getDefaultToolLayout()) { + const auto &panel_tools = panel_tool_layout.second; + std::vector unprocessed_tools(panel_tools.size()); - int favoriteCount = 0; - for(auto it = favorites.begin(); it != favorites.end(); ++it) { - if (*it) { - addPanel(favoritePanel, *it); - ++favoriteCount; + // Start with the root tools for every panel. + std::transform( + panel_tools.begin(), + panel_tools.end(), + unprocessed_tools.begin(), + [](const ToolTree &tool_tree) { return &tool_tree; }); + + // Process each tool. + while (!unprocessed_tools.empty()) { + // Pop from stack of unprocessed. + const ToolTree *cur_tool = unprocessed_tools.back(); + unprocessed_tools.pop_back(); + // Add tool to list of expanders and tool panels. + FoldableToolPanel *const tool_panel = getFoldableToolPanel(*cur_tool); + expList.push_back(tool_panel->getExpander()); + toolPanels.push_back(tool_panel); + expanderToToolPanelMap[tool_panel->getExpander()] = tool_panel; + toolToDefaultToolTreeMap[cur_tool->id] = cur_tool; + // Show all now, since they won't be attached to a parent. + tool_panel->getExpander()->show_all(); + // Add children to unprocessed. + for (const auto &child_tool : cur_tool->children) { + unprocessed_tools.push_back(&child_tool); + } } } toolPanels.push_back (coarse); toolPanels.push_back(metadata); - toolPanelNotebook = new Gtk::Notebook (); - toolPanelNotebook->set_name ("ToolPanelNotebook"); - + toolPanelNotebook = new Gtk::Notebook(); + toolPanelNotebook->set_name("ToolPanelNotebook"); + favoritePanelSW.reset(new MyScrolledWindow()); 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 ()); + locallabPanelSW = Gtk::manage(new MyScrolledWindow()); // load panel endings - for (int i = 0; i < 7; i++) { - vbPanelEnd[i] = Gtk::manage (new Gtk::VBox ()); + for (int i = 0; i < 8; i++) { + vbPanelEnd[i] = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); imgPanelEnd[i] = Gtk::manage (new RTImage ("ornament1.png")); - imgPanelEnd[i]->show (); - vbPanelEnd[i]->pack_start (*imgPanelEnd[i], Gtk::PACK_SHRINK); + imgPanelEnd[i]->show(); + vbPanelEnd[i]->get_style_context()->add_class("PanelEnding"); + 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); - } updateVScrollbars(options.hideTPVScrollbar); - exposurePanelSW->add (*exposurePanel); - exposurePanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - exposurePanel->pack_start (*vbPanelEnd[1], Gtk::PACK_SHRINK, 4); + Gtk::Box *favoritePanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + Gtk::Box *exposurePanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + Gtk::Box *detailsPanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + Gtk::Box *colorPanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + Gtk::Box *advancedPanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + Gtk::Box *locallabPanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + Gtk::Box *transformPanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); + Gtk::Box *rawPanelContainer = + Gtk::manage(new Gtk::Box(Gtk::Orientation::ORIENTATION_VERTICAL)); - detailsPanelSW->add (*detailsPanel); - detailsPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - detailsPanel->pack_start (*vbPanelEnd[2], Gtk::PACK_SHRINK, 4); + favoritePanelSW->add(*favoritePanelContainer); + favoritePanelContainer->pack_start(*favoritePanel, Gtk::PACK_SHRINK); + favoritePanelContainer->pack_start(*vbPanelEnd[0], Gtk::PACK_SHRINK); + favoritePanelSW->show_all(); - colorPanelSW->add (*colorPanel); - colorPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - colorPanel->pack_start (*vbPanelEnd[3], Gtk::PACK_SHRINK, 4); + exposurePanelSW->add (*exposurePanelContainer); + exposurePanelContainer->pack_start(*exposurePanel, Gtk::PACK_SHRINK); + exposurePanelContainer->pack_start (*vbPanelEnd[1], Gtk::PACK_SHRINK); - advancedPanelSW->add (*advancedPanel); - advancedPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - advancedPanel->pack_start (*vbPanelEnd[6], Gtk::PACK_SHRINK, 0); + detailsPanelSW->add (*detailsPanelContainer); + detailsPanelContainer->pack_start(*detailsPanel, Gtk::PACK_SHRINK); + detailsPanelContainer->pack_start (*vbPanelEnd[2], Gtk::PACK_SHRINK); - transformPanelSW->add (*transformPanel); - transformPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - transformPanel->pack_start (*vbPanelEnd[4], Gtk::PACK_SHRINK, 4); + colorPanelSW->add (*colorPanelContainer); + colorPanelContainer->pack_start(*colorPanel, Gtk::PACK_SHRINK); + colorPanelContainer->pack_start (*vbPanelEnd[3], Gtk::PACK_SHRINK); - rawPanelSW->add (*rawPanel); - rawPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - rawPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); + advancedPanelSW->add (*advancedPanelContainer); + advancedPanelContainer->pack_start(*advancedPanel, Gtk::PACK_SHRINK); + advancedPanelContainer->pack_start (*vbPanelEnd[6], Gtk::PACK_SHRINK); - toiF = Gtk::manage (new TextOrIcon ("star.png", M ("MAIN_TAB_FAVORITES"), M ("MAIN_TAB_FAVORITES_TOOLTIP"))); + locallabPanelSW->add(*locallabPanelContainer); + locallabPanelContainer->pack_start(*locallabPanel, Gtk::PACK_SHRINK); + locallabPanelContainer->pack_start(*vbPanelEnd[7], Gtk::PACK_SHRINK); + + transformPanelSW->add (*transformPanelContainer); + transformPanelContainer->pack_start(*transformPanel, Gtk::PACK_SHRINK); + transformPanelContainer->pack_start (*vbPanelEnd[4], Gtk::PACK_SHRINK); + + rawPanelSW->add (*rawPanelContainer); + rawPanelContainer->pack_start(*rawPanel, Gtk::PACK_SHRINK); + rawPanelContainer->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK); + + toiF.reset(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"))); + toiL = Gtk::manage(new TextOrIcon("hand-open.png", M("MAIN_TAB_LOCALLAB"), M("MAIN_TAB_LOCALLAB_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"))); - - if (favoritePanelSW) { - toolPanelNotebook->append_page (*favoritePanelSW, *toiF); + toiF->show_all(); + if (options.favorites.size()) { + toolPanelNotebook->append_page(*favoritePanelSW, *toiF); } toolPanelNotebook->append_page (*exposurePanelSW, *toiE); toolPanelNotebook->append_page (*detailsPanelSW, *toiD); toolPanelNotebook->append_page (*colorPanelSW, *toiC); toolPanelNotebook->append_page (*advancedPanelSW, *toiW); + + // Locallab notebook is hidden in batch mode + if (!batch) { + toolPanelNotebook->append_page(*locallabPanelSW, *toiL); + } + toolPanelNotebook->append_page (*transformPanelSW, *toiT); toolPanelNotebook->append_page (*rawPanelSW, *toiR); toolPanelNotebook->append_page (*metadata, *toiM); - toolPanelNotebook->set_current_page (0); + toolPanelNotebook->set_scrollable(); + toolPanelNotebook->show_all(); + updateToolLocations(options.favorites, options.cloneFavoriteTools); - toolPanelNotebook->set_scrollable (); - toolPanelNotebook->show_all (); + notebookconn = toolPanelNotebook->signal_switch_page().connect( + sigc::mem_fun(*this, &ToolPanelCoordinator::notebookPageChanged)); + + // In batch mode, notebookPageChanged method is blocked because it's useless to display spots + if (batch) { + notebookconn.block(true); + } for (auto toolPanel : toolPanels) { - toolPanel->setListener (this); + toolPanel->setListener(this); } - whitebalance->setWBProvider (this); - whitebalance->setSpotWBListener (this); - darkframe->setDFProvider (this); - flatfield->setFFProvider (this); - lensgeom->setLensGeomListener (this); - rotate->setLensGeomListener (this); - distortion->setLensGeomListener (this); - crop->setCropPanelListener (this); - icm->setICMPanelListener (this); - filmNegative->setFilmNegProvider (this); + whitebalance->setWBProvider(this); + whitebalance->setSpotWBListener(this); + darkframe->setDFProvider(this); + flatfield->setFFProvider(this); + lensgeom->setLensGeomListener(this); + rotate->setLensGeomListener(this); + perspective->setLensGeomListener(this); + perspective->setPerspCorrectionPanelListener(this); + distortion->setLensGeomListener(this); + crop->setCropPanelListener(this); + icm->setICMPanelListener(this); + filmNegative->setFilmNegProvider(this); - toolBar = new ToolBar (); - toolBar->setToolBarListener (this); + toolBar = new ToolBar(); + toolBar->setToolBarListener(this); + + prevPage = toolPanelNotebook->get_nth_page(0); } -void ToolPanelCoordinator::addPanel (Gtk::Box* where, FoldableToolPanel* panel, int level) +const ToolPanelCoordinator::ToolLayout &ToolPanelCoordinator::getDefaultToolLayout() { - - panel->setParent (where); - panel->setLevel (level); - - expList.push_back (panel->getExpander()); - where->pack_start (*panel->getExpander(), false, false); - toolPanels.push_back (panel); + return PANEL_TOOLS; } -void ToolPanelCoordinator::addfavoritePanel (Gtk::Box* where, FoldableToolPanel* panel, int level) +Tool ToolPanelCoordinator::getToolFromName(const std::string &name) { - 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; + if (toolNamesReverseMap.empty()) { + // Create the name to tool mapping. + + const auto panels = ToolPanelCoordinator::getDefaultToolLayout(); + std::vector unprocessed_tool_trees; + + // Get the root tools from each panel. + for (const auto &panel_tools : panels) { + for (const auto &tool : panel_tools.second) { + unprocessed_tool_trees.push_back(&tool); + } + } + + // Process all the tools, including their children. + while (unprocessed_tool_trees.size() > 0) { + const ToolPanelCoordinator::ToolTree *tool_tree = + unprocessed_tool_trees.back(); + unprocessed_tool_trees.pop_back(); + toolNamesReverseMap[getToolName(tool_tree->id)] = tool_tree->id; + for (const auto &child_tree : tool_tree->children) { + unprocessed_tool_trees.push_back(&child_tree); + } + } + } + + return toolNamesReverseMap.at(name); +} + +std::string ToolPanelCoordinator::getToolName(Tool tool) +{ + switch (tool) { + case Tool::TONE_CURVE: + return ToneCurve::TOOL_NAME; + case Tool::SHADOWS_HIGHLIGHTS: + return ShadowsHighlights::TOOL_NAME; + case Tool::TONE_EQUALIZER: + return ToneEqualizer::TOOL_NAME; + case Tool::IMPULSE_DENOISE: + return ImpulseDenoise::TOOL_NAME; + case Tool::DEFRINGE_TOOL: + return Defringe::TOOL_NAME; + case Tool::SPOT: + return Spot::TOOL_NAME; + case Tool::DIR_PYR_DENOISE: + return DirPyrDenoise::TOOL_NAME; + case Tool::EPD: + return EdgePreservingDecompositionUI::TOOL_NAME; + case Tool::SHARPENING_TOOL: + return Sharpening::TOOL_NAME; + case Tool::LOCAL_CONTRAST: + return LocalContrast::TOOL_NAME; + case Tool::SHARPEN_EDGE: + return SharpenEdge::TOOL_NAME; + case Tool::SHARPEN_MICRO: + return SharpenMicro::TOOL_NAME; + case Tool::L_CURVE: + return LCurve::TOOL_NAME; + case Tool::RGB_CURVES: + return RGBCurves::TOOL_NAME; + case Tool::COLOR_TONING: + return ColorToning::TOOL_NAME; + case Tool::LENS_GEOM: + return LensGeometry::TOOL_NAME; + case Tool::LENS_PROF: + return LensProfilePanel::TOOL_NAME; + case Tool::DISTORTION: + return Distortion::TOOL_NAME; + case Tool::ROTATE: + return Rotate::TOOL_NAME; + case Tool::VIBRANCE: + return Vibrance::TOOL_NAME; + case Tool::COLOR_APPEARANCE: + return ColorAppearance::TOOL_NAME; + case Tool::WHITE_BALANCE: + return WhiteBalance::TOOL_NAME; + case Tool::VIGNETTING: + return Vignetting::TOOL_NAME; + case Tool::RETINEX_TOOL: + return Retinex::TOOL_NAME; + case Tool::GRADIENT: + return Gradient::TOOL_NAME; + case Tool::LOCALLAB: + return Locallab::TOOL_NAME; + case Tool::PC_VIGNETTE: + return PCVignette::TOOL_NAME; + case Tool::PERSPECTIVE: + return PerspCorrection::TOOL_NAME; + case Tool::CA_CORRECTION: + return CACorrection::TOOL_NAME; + case Tool::CH_MIXER: + return ChMixer::TOOL_NAME; + case Tool::BLACK_WHITE: + return BlackWhite::TOOL_NAME; + case Tool::RESIZE_TOOL: + return Resize::TOOL_NAME; + case Tool::PR_SHARPENING: + return PrSharpening::TOOL_NAME; + case Tool::CROP_TOOL: + return Crop::TOOL_NAME; + case Tool::ICM: + return ICMPanel::TOOL_NAME; + case Tool::WAVELET: + return Wavelet::TOOL_NAME; + case Tool::DIR_PYR_EQUALIZER: + return DirPyrEqualizer::TOOL_NAME; + case Tool::HSV_EQUALIZER: + return HSVEqualizer::TOOL_NAME; + case Tool::FILM_SIMULATION: + return FilmSimulation::TOOL_NAME; + case Tool::SOFT_LIGHT: + return SoftLight::TOOL_NAME; + case Tool::DEHAZE: + return Dehaze::TOOL_NAME; + case Tool::SENSOR_BAYER: + return SensorBayer::TOOL_NAME; + case Tool::SENSOR_XTRANS: + return SensorXTrans::TOOL_NAME; + case Tool::BAYER_PROCESS: + return BayerProcess::TOOL_NAME; + case Tool::XTRANS_PROCESS: + return XTransProcess::TOOL_NAME; + case Tool::BAYER_PREPROCESS: + return BayerPreProcess::TOOL_NAME; + case Tool::PREPROCESS: + return PreProcess::TOOL_NAME; + case Tool::DARKFRAME_TOOL: + return DarkFrame::TOOL_NAME; + case Tool::FLATFIELD_TOOL: + return FlatField::TOOL_NAME; + case Tool::RAW_CA_CORRECTION: + return RAWCACorr::TOOL_NAME; + case Tool::RAW_EXPOSURE: + return RAWExposure::TOOL_NAME; + case Tool::PREPROCESS_WB: + return PreprocessWB::TOOL_NAME; + case Tool::BAYER_RAW_EXPOSURE: + return BayerRAWExposure::TOOL_NAME; + case Tool::XTRANS_RAW_EXPOSURE: + return XTransRAWExposure::TOOL_NAME; + case Tool::FATTAL: + return FattalToneMapping::TOOL_NAME; + case Tool::FILM_NEGATIVE: + return FilmNegative::TOOL_NAME; + case Tool::PD_SHARPENING: + return PdSharpening::TOOL_NAME; + }; + assert(false); + return ""; +}; + +bool ToolPanelCoordinator::isFavoritable(Tool tool) +{ + switch (tool) { + case Tool::PR_SHARPENING: + return false; + default: + return true; + } +} + +void ToolPanelCoordinator::notebookPageChanged(Gtk::Widget* page, guint page_num) +{ + updatePanelTools(page, options.favorites, options.cloneFavoriteTools); + + // Locallab spot curves are set visible if at least one photo has been loaded (to avoid + // segfault) and locallab panel is active + if (photoLoadedOnce) { + if (page == locallabPanelSW) { + toolBar->blockEditDeactivation(); // Avoid edit tool deactivation when Locallab page is active (except if pressing other tools button) + locallab->subscribe(); + } + + if (prevPage == locallabPanelSW) { // To deactivate Locallab only when switching from Locallab page + toolBar->blockEditDeactivation(false); + locallab->unsubscribe(); + } + + prevPage = page; + } +} + +void ToolPanelCoordinator::updateFavoritesPanel( + const std::vector &favoritesNames, + bool cloneFavoriteTools) +{ + std::unordered_set favorites_set; + std::vector> favorites_tool_tree; + + for (const auto &tool_name : favoritesNames) { + Tool tool; + try { + tool = getToolFromName(tool_name.raw()); + } catch (const std::out_of_range &e) { + if (rtengine::settings->verbose) { + std::cerr + << "Unrecognized favorite tool \"" << tool_name << "\"" + << std::endl; + } + continue; + } + if (isFavoritable(tool)) { + favorites_set.insert(tool); + favorites_tool_tree.push_back( + std::ref(*(toolToDefaultToolTreeMap.at(tool)))); + } + } + + updateToolPanel( + favoritePanel, favorites_tool_tree, 1, favorites_set, cloneFavoriteTools); +} + +void ToolPanelCoordinator::updatePanelTools( + Gtk::Widget *page, + const std::vector &favorites, + bool cloneFavoriteTools) +{ + if (page == favoritePanelSW.get()) { + updateFavoritesPanel(favorites, cloneFavoriteTools); + return; + } + + ToolVBox *panel = nullptr; + const std::vector *default_panel_tools = nullptr; + if (page == exposurePanelSW) { + panel = exposurePanel; + default_panel_tools = &EXPOSURE_PANEL_TOOLS; + } else if (page == detailsPanelSW) { + panel = detailsPanel; + default_panel_tools = &DETAILS_PANEL_TOOLS; + } else if (page == colorPanelSW) { + panel = colorPanel; + default_panel_tools = &COLOR_PANEL_TOOLS; + } else if (page == transformPanelSW) { + panel = transformPanel; + default_panel_tools = &TRANSFORM_PANEL_TOOLS; + } else if (page == rawPanelSW) { + panel = rawPanel; + default_panel_tools = &RAW_PANEL_TOOLS; + } else if (page == advancedPanelSW) { + panel = advancedPanel; + default_panel_tools = &ADVANCED_PANEL_TOOLS; + } else if (page == locallabPanelSW) { + panel = locallabPanel; + default_panel_tools = &LOCALLAB_PANEL_TOOLS; } else { - addPanel(where, panel, level); + return; } + assert(panel && default_panel_tools); + + std::unordered_set favoriteTools; + for (const auto &tool_name : favorites) { + Tool tool; + try { + tool = getToolFromName(tool_name.raw()); + } catch (const std::out_of_range &e) { + if (rtengine::settings->verbose) { + std::cerr + << "Unrecognized favorite tool \"" << tool_name << "\"" + << std::endl; + } + continue; + } + if (isFavoritable(tool)) { + favoriteTools.insert(tool); + } + } + + updateToolPanel(panel, *default_panel_tools, 1, favoriteTools, cloneFavoriteTools); +} + +template +typename std::enable_if::value, void>::type +ToolPanelCoordinator::updateToolPanel( + Gtk::Box *panelBox, + const std::vector &children, + int level, + const std::unordered_set &favorites, + bool cloneFavoriteTools) +{ + const bool is_favorite_panel = panelBox == favoritePanel; + const bool skip_favorites = !cloneFavoriteTools && !is_favorite_panel; + const std::vector old_tool_panels = panelBox->get_children(); + auto old_widgets_iter = old_tool_panels.begin(); + auto new_tool_trees_iter = children.begin(); + + // Indicates if this tool should not be added. Favorite tools are skipped + // if they are sub-tools within the favorites panel, or if tool cloning is + // off and they are not within the favorites panel. + const auto should_skip_tool = + [this, skip_favorites, &favorites](const ToolTree &tool_tree) { + return (skip_favorites && favorites.count(tool_tree.id)) || + (batch && tool_tree.id == Tool::LOCALLAB); + }; + + // Keep tools that are already correct. + while ( + old_widgets_iter != old_tool_panels.end() && + new_tool_trees_iter != children.end()) { + if (should_skip_tool(*new_tool_trees_iter)) { + ++new_tool_trees_iter; + continue; + } + if (*old_widgets_iter != + getFoldableToolPanel(*new_tool_trees_iter)->getExpander()) { + break; + } + ++new_tool_trees_iter; + ++old_widgets_iter; + } + + // Remove incorrect tools. + for (auto iter = old_tool_panels.end(); iter != old_widgets_iter;) { + --iter; + FoldableToolPanel *old_tool_panel = expanderToToolPanelMap.at(*iter); + assert(*iter == old_tool_panel->getExpander()); + panelBox->remove(**iter); + old_tool_panel->setParent(nullptr); + } + + // Add correct tools. + for (; new_tool_trees_iter != children.end(); new_tool_trees_iter++) { + if (should_skip_tool(*new_tool_trees_iter)) { + continue; + } + FoldableToolPanel *tool_panel = + getFoldableToolPanel(*new_tool_trees_iter); + if (tool_panel->getParent()) { + tool_panel->getParent()->remove(*tool_panel->getExpander()); + } + addPanel(panelBox, tool_panel, level); + } + + // Update the child tools. + for (const ToolTree &tool_tree : children) { + const FoldableToolPanel *tool_panel = getFoldableToolPanel(tool_tree); + updateToolPanel( + tool_panel->getSubToolsContainer(), + tool_tree.children, + level + 1, + favorites, + cloneFavoriteTools && !is_favorite_panel); + } +} + +void ToolPanelCoordinator::addPanel(Gtk::Box* where, FoldableToolPanel* panel, int level) +{ + + panel->setParent(where); + panel->setLevel(level); + where->pack_start(*panel->getExpander(), false, false); } ToolPanelCoordinator::~ToolPanelCoordinator () { idle_register.destroy(); - closeImage (); + closeImage(); + + // When deleting toolPanelNotebook, pages removal activates notebookPageChanged function + // which is responsible of segfault if listener isn't deactivated before + notebookconn.block(true); + + // Foldable tool panels manage (Gtk::manage) their expanders. Each expander + // will only be automatically deleted if attached to a parent and the parent + // is deleted. This is a hack in lieu of a potentially tedious refactoring + // of FoldableToolPanel. + std::unique_ptr hidden_tool_panel_parent(new Gtk::Box()); + for (const auto expander : expList) { + if (!expander->get_parent()) { + hidden_tool_panel_parent->add(*expander); + } + } delete toolPanelNotebook; delete toolBar; } -void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono) +void ToolPanelCoordinator::imageTypeChanged(bool isRaw, bool isBayer, bool isXtrans, bool isMono, bool isGainMapSupported) { if (isRaw) { if (isBayer) { idle_register.add( - [this]() -> bool + [this, isGainMapSupported]() -> bool { rawPanelSW->set_sensitive(true); sensorxtrans->FoldableToolPanel::hide(); xtransprocess->FoldableToolPanel::hide(); + bayerrawexposure->FoldableToolPanel::show(); xtransrawexposure->FoldableToolPanel::hide(); sensorbayer->FoldableToolPanel::show(); bayerprocess->FoldableToolPanel::show(); bayerpreprocess->FoldableToolPanel::show(); rawcacorrection->FoldableToolPanel::show(); + preprocessWB->FoldableToolPanel::show(); preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); - filmNegative->FoldableToolPanel::show(); + flatfield->setGainMap(isGainMapSupported); pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); return false; } ); - } - else if (isXtrans) { + } else if (isXtrans) { idle_register.add( - [this]() -> bool + [this, isGainMapSupported]() -> bool { rawPanelSW->set_sensitive(true); sensorxtrans->FoldableToolPanel::show(); xtransprocess->FoldableToolPanel::show(); xtransrawexposure->FoldableToolPanel::show(); + bayerrawexposure->FoldableToolPanel::hide(); sensorbayer->FoldableToolPanel::hide(); bayerprocess->FoldableToolPanel::hide(); bayerpreprocess->FoldableToolPanel::hide(); rawcacorrection->FoldableToolPanel::hide(); + preprocessWB->FoldableToolPanel::show(); preprocess->FoldableToolPanel::show(); flatfield->FoldableToolPanel::show(); - filmNegative->FoldableToolPanel::show(); + flatfield->setGainMap(isGainMapSupported); pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); return false; } ); - } - else if (isMono) { + } else if (isMono) { idle_register.add( - [this]() -> bool + [this, isGainMapSupported]() -> bool { rawPanelSW->set_sensitive(true); sensorbayer->FoldableToolPanel::hide(); @@ -357,9 +966,10 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt sensorxtrans->FoldableToolPanel::hide(); xtransprocess->FoldableToolPanel::hide(); xtransrawexposure->FoldableToolPanel::hide(); + preprocessWB->FoldableToolPanel::hide(); preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::show(); - filmNegative->FoldableToolPanel::hide(); + flatfield->setGainMap(isGainMapSupported); pdSharpening->FoldableToolPanel::show(); retinex->FoldableToolPanel::setGrayedOut(false); return false; @@ -377,9 +987,9 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt sensorxtrans->FoldableToolPanel::hide(); xtransprocess->FoldableToolPanel::hide(); xtransrawexposure->FoldableToolPanel::hide(); + preprocessWB->FoldableToolPanel::hide(); preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::hide(); - filmNegative->FoldableToolPanel::hide(); pdSharpening->FoldableToolPanel::hide(); retinex->FoldableToolPanel::setGrayedOut(false); return false; @@ -398,9 +1008,9 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt sensorxtrans->FoldableToolPanel::hide(); xtransprocess->FoldableToolPanel::hide(); xtransrawexposure->FoldableToolPanel::hide(); + preprocessWB->FoldableToolPanel::hide(); preprocess->FoldableToolPanel::hide(); flatfield->FoldableToolPanel::hide(); - filmNegative->FoldableToolPanel::hide(); pdSharpening->FoldableToolPanel::hide(); retinex->FoldableToolPanel::setGrayedOut(true); return false; @@ -410,6 +1020,33 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXt } +void ToolPanelCoordinator::setTweakOperator (rtengine::TweakOperator *tOperator) +{ + if (ipc && tOperator) { + ipc->setTweakOperator(tOperator); + } +} + +void ToolPanelCoordinator::unsetTweakOperator (rtengine::TweakOperator *tOperator) +{ + if (ipc && tOperator) { + ipc->unsetTweakOperator(tOperator); + } +} + +void ToolPanelCoordinator::refreshPreview (const rtengine::ProcEvent& event) +{ + if (!ipc) { + return; + } + + ProcParams* params = ipc->beginUpdateParams (); + for (auto toolPanel : toolPanels) { + toolPanel->write (params); + } + + ipc->endUpdateParams (event); // starts the IPC processing +} void ToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) { @@ -419,18 +1056,18 @@ void ToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const int changeFlags = rtengine::RefreshMapper::getInstance()->getAction(event); - ProcParams* params = ipc->beginUpdateParams (); + ProcParams* params = ipc->beginUpdateParams(); for (auto toolPanel : toolPanels) { - toolPanel->write (params); + toolPanel->write(params); } // Compensate rotation on flip if (event == rtengine::EvCTHFlip || event == rtengine::EvCTVFlip) { - if (fabs (params->rotate.degree) > 0.001) { + if (fabs(params->rotate.degree) > 0.001) { params->rotate.degree *= -1; changeFlags |= rtengine::RefreshMapper::getInstance()->getAction(rtengine::EvROTDegree); - rotate->read (params); + rotate->read(params); } } @@ -448,34 +1085,78 @@ void ToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const if (event == rtengine::EvPhotoLoaded || event == rtengine::EvProfileChanged || event == rtengine::EvHistoryBrowsed || event == rtengine::EvCTRotate) { // updating the "on preview" geometry int fw, fh; - ipc->getInitialImage()->getImageSource()->getFullSize (fw, fh, tr); - gradient->updateGeometry (params->gradient.centerX, params->gradient.centerY, params->gradient.feather, params->gradient.degree, fw, fh); + ipc->getInitialImage()->getImageSource()->getFullSize(fw, fh, tr); + gradient->updateGeometry(params->gradient.centerX, params->gradient.centerY, params->gradient.feather, params->gradient.degree, fw, fh); } // some transformations make the crop change for convenience if (event == rtengine::EvCTHFlip) { - crop->hFlipCrop (); - crop->write (params); + crop->hFlipCrop(); + crop->write(params); } else if (event == rtengine::EvCTVFlip) { - crop->vFlipCrop (); - crop->write (params); + crop->vFlipCrop(); + crop->write(params); } else if (event == rtengine::EvCTRotate) { - crop->rotateCrop (params->coarse.rotate, params->coarse.hflip, params->coarse.vflip); - crop->write (params); - resize->update (params->crop.enabled, params->crop.w, params->crop.h, ipc->getFullWidth(), ipc->getFullHeight()); - resize->write (params); + crop->rotateCrop(params->coarse.rotate, params->coarse.hflip, params->coarse.vflip); + crop->write(params); + resize->update(params->crop.enabled, params->crop.w, params->crop.h, ipc->getFullWidth(), ipc->getFullHeight()); + resize->write(params); } else if (event == rtengine::EvCrop) { - resize->update (params->crop.enabled, params->crop.w, params->crop.h); - resize->write (params); + resize->update(params->crop.enabled, params->crop.w, params->crop.h); + resize->write(params); } - ipc->endUpdateParams (changeFlags); // starts the IPC processing + /* + * Manage Locallab mask visibility: + * - Mask preview is updated when choosing a mask preview method + * - Mask preview is also updated when modifying (to avoid hiding a potentially visible mask combobox): + * - Color&Light invers + * - Exposure inversex + * - Shadow Highlight inverssh + * - Soft Light softMethod + * - Mask preview is stopped when creating, deleting or selecting a spot + * - Mask preview is also stopped when removing a spot or resetting all mask visibility + */ + if (event == rtengine::EvlocallabshowmaskMethod) { + const Locallab::llMaskVisibility maskStruc = locallab->getMaskVisibility(); + ipc->setLocallabMaskVisibility(maskStruc.previewDeltaE, maskStruc.colorMask, maskStruc.colorMaskinv, maskStruc.expMask, maskStruc.expMaskinv, + maskStruc.SHMask, maskStruc.SHMaskinv, maskStruc.vibMask, maskStruc.softMask, + maskStruc.blMask, maskStruc.tmMask, maskStruc.retiMask, maskStruc.sharMask, + maskStruc.lcMask, maskStruc.cbMask, maskStruc.logMask, maskStruc.maskMask, maskStruc.cieMask); + } else if (event == rtengine::EvLocallabSpotCreated || event == rtengine::EvLocallabSpotSelectedWithMask || + event == rtengine::EvLocallabSpotDeleted /*|| event == rtengine::Evlocallabshowreset*/ || + event == rtengine::EvlocallabToolRemovedWithRefresh) { + locallab->resetMaskVisibility(); + ipc->setLocallabMaskVisibility(false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + + ipc->endUpdateParams(changeFlags); // starts the IPC processing hasChanged = true; for (auto paramcListener : paramcListeners) { - paramcListener->procParamsChanged (params, event, descr); + paramcListener->procParamsChanged(params, event, descr); } + + // Locallab spot curves are set visible if at least one photo has been loaded (to avoid + // segfault) and locallab panel is active + // When a new photo is loaded, Locallab spot curves need to be set visible again +const auto func = + [this]() -> bool + { + if (photoLoadedOnce && (toolPanelNotebook->get_nth_page(toolPanelNotebook->get_current_page()) == locallabPanelSW)) { + locallab->subscribe(); + } + + return false; + }; + +if (event == rtengine::EvPhotoLoaded) { + idle_register.add(func); +} + + photoLoadedOnce = true; + } void ToolPanelCoordinator::profileChange( @@ -492,7 +1173,7 @@ void ToolPanelCoordinator::profileChange( return; } - ProcParams *params = ipc->beginUpdateParams (); + ProcParams *params = ipc->beginUpdateParams(); ProcParams *mergedParams = new ProcParams(); // Copy the current params as default values for the fusion @@ -505,19 +1186,19 @@ void ToolPanelCoordinator::profileChange( } // And apply the partial profile nparams to mergedParams - nparams->applyTo (mergedParams, fromLastSave); + 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; if (event != rtengine::EvPhotoLoaded) { - ParamsEdited pe (true); - std::vector lParams (2); + ParamsEdited pe(true); + std::vector lParams(2); lParams[0] = *params; lParams[1] = *mergedParams; - pe.initFrom (lParams); + pe.initFrom(lParams); - filterRawRefresh = pe.raw.isUnchanged() && pe.lensProf.isUnchanged() && pe.retinex.isUnchanged() && pe.filmNegative.isUnchanged() && pe.pdsharpening.isUnchanged(); + filterRawRefresh = pe.raw.isUnchanged() && pe.lensProf.isUnchanged() && pe.retinex.isUnchanged() && pe.pdsharpening.isUnchanged(); } *params = *mergedParams; @@ -534,35 +1215,61 @@ void ToolPanelCoordinator::profileChange( } // trimming overflowing cropped area - ipc->getInitialImage()->getImageSource()->getFullSize (fw, fh, tr); - crop->trim (params, fw, fh); + ipc->getInitialImage()->getImageSource()->getFullSize(fw, fh, tr); + crop->trim(params, fw, fh); // updating the GUI with updated values for (auto toolPanel : toolPanels) { - toolPanel->read (params); + toolPanel->read(params); if (event == rtengine::EvPhotoLoaded || event == rtengine::EvProfileChanged) { toolPanel->autoOpenCurve(); + + // For Locallab, reset tool expanders visibility only when a photo or profile is loaded + locallab->openAllTools(); } } if (event == rtengine::EvPhotoLoaded || event == rtengine::EvProfileChanged || event == rtengine::EvHistoryBrowsed || event == rtengine::EvCTRotate) { // updating the "on preview" geometry - gradient->updateGeometry (params->gradient.centerX, params->gradient.centerY, params->gradient.feather, params->gradient.degree, fw, fh); + gradient->updateGeometry(params->gradient.centerX, params->gradient.centerY, params->gradient.feather, params->gradient.degree, fw, fh); } + // Reset Locallab mask visibility + locallab->resetMaskVisibility(); + ipc->setLocallabMaskVisibility(false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + // start the IPC processing if (filterRawRefresh) { - ipc->endUpdateParams ( rtengine::RefreshMapper::getInstance()->getAction(event) & ALLNORAW ); + ipc->endUpdateParams(rtengine::RefreshMapper::getInstance()->getAction(event) & ALLNORAW); } else { - ipc->endUpdateParams (event); + ipc->endUpdateParams(event); } hasChanged = event != rtengine::EvProfileChangeNotification; for (auto paramcListener : paramcListeners) { - paramcListener->procParamsChanged (params, event, descr); + paramcListener->procParamsChanged(params, event, descr); } + + // Locallab spot curves are set visible if at least one photo has been loaded (to avoid + // segfault) and locallab panel is active + // When a new photo is loaded, Locallab spot curves need to be set visible again +const auto func = + [this]() -> bool + { + if (photoLoadedOnce && (toolPanelNotebook->get_nth_page(toolPanelNotebook->get_current_page()) == locallabPanelSW)) { + locallab->subscribe(); + } + + return false; + }; + +if (event == rtengine::EvPhotoLoaded) { + idle_register.add(func); +} + + photoLoadedOnce = true; } void ToolPanelCoordinator::setDefaults(const ProcParams* defparams) @@ -574,128 +1281,151 @@ void ToolPanelCoordinator::setDefaults(const ProcParams* defparams) } } -CropGUIListener* ToolPanelCoordinator::getCropGUIListener () +CropGUIListener* ToolPanelCoordinator::getCropGUIListener() { return crop; } -void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool raw) +void ToolPanelCoordinator::initImage(rtengine::StagedImageProcessor* ipc_, bool raw) { ipc = ipc_; - toneCurve->disableListener (); - toneCurve->enableAll (); - toneCurve->enableListener (); + toneCurve->disableListener(); + toneCurve->enableAll(); + toneCurve->enableListener(); if (ipc) { const rtengine::FramesMetaData* pMetaData = ipc->getInitialImage()->getMetaData(); metadata->setImageData(pMetaData); - ipc->setAutoExpListener (toneCurve); - ipc->setAutoCamListener (colorappearance); - ipc->setAutoBWListener (blackwhite); - ipc->setFrameCountListener (bayerprocess); + ipc->setAutoExpListener(toneCurve); + ipc->setAutoCamListener(colorappearance); + ipc->setAutoBWListener(blackwhite); + ipc->setFrameCountListener(bayerprocess); ipc->setFlatFieldAutoClipListener (flatfield); ipc->setBayerAutoContrastListener (bayerprocess); ipc->setXtransAutoContrastListener (xtransprocess); ipc->setpdSharpenAutoContrastListener (pdSharpening); ipc->setpdSharpenAutoRadiusListener (pdSharpening); - ipc->setAutoWBListener (whitebalance); - ipc->setAutoColorTonListener (colortoning); - ipc->setAutoChromaListener (dirpyrdenoise); - ipc->setWaveletListener (wavelet); - ipc->setRetinexListener (retinex); - ipc->setSizeListener (crop); - ipc->setSizeListener (resize); - ipc->setImageTypeListener (this); - flatfield->setShortcutPath (Glib::path_get_dirname (ipc->getInitialImage()->getFileName())); + ipc->setAutoWBListener(whitebalance); + ipc->setAutoColorTonListener(colortoning); + ipc->setAutoprimListener(icm); + ipc->setAutoChromaListener(dirpyrdenoise); + ipc->setWaveletListener(wavelet); + ipc->setRetinexListener(retinex); + ipc->setSizeListener(crop); + ipc->setSizeListener(resize); + ipc->setLocallabListener(locallab); + ipc->setImageTypeListener(this); + ipc->setFilmNegListener(filmNegative); + flatfield->setShortcutPath(Glib::path_get_dirname(ipc->getInitialImage()->getFileName())); - icm->setRawMeta (raw, (const rtengine::FramesData*)pMetaData); - lensProf->setRawMeta (raw, pMetaData); + icm->setRawMeta(raw, (const rtengine::FramesData*)pMetaData); + lensProf->setRawMeta(raw, pMetaData); + perspective->setMetadata(pMetaData); } - toneCurve->setRaw (raw); + toneCurve->setRaw(raw); hasChanged = true; } -void ToolPanelCoordinator::closeImage () +void ToolPanelCoordinator::closeImage() { if (ipc) { - ipc->stopProcessing (); + ipc->stopProcessing(); ipc = nullptr; } } void ToolPanelCoordinator::closeAllTools() { - - for (size_t i = 0; i < options.tpOpen.size(); i++) + for (size_t i = 0; i < options.tpOpen.size(); ++i) { if (i < expList.size()) { - expList.at (i)->set_expanded (false); + expList[i]->set_expanded(false); } + } } void ToolPanelCoordinator::openAllTools() { - - for (size_t i = 0; i < options.tpOpen.size(); i++) + for (size_t i = 0; i < options.tpOpen.size(); ++i) { if (i < expList.size()) { - expList.at (i)->set_expanded (true); + expList[i]->set_expanded(true); } + } } void ToolPanelCoordinator::updateToolState() { - - for (size_t i = 0; i < options.tpOpen.size(); i++) - if (i < expList.size()) { - expList.at (i)->set_expanded (options.tpOpen.at (i)); + if (options.tpOpen.empty()) { + for (auto expander : expList) { + expander->set_expanded(false); } + wavelet->updateToolState({}); + retinex->updateToolState({}); + + return; + } + + for (size_t i = 0; i < options.tpOpen.size(); ++i) { + if (i < expList.size()) { + expList[i]->set_expanded(options.tpOpen[i]); + } + } + if (options.tpOpen.size() > expList.size()) { - size_t sizeWavelet = options.tpOpen.size() - expList.size(); + const size_t sizeWavelet = options.tpOpen.size() - expList.size(); + std::vector temp; - for (size_t i = 0; i < sizeWavelet; i++) { - temp.push_back (options.tpOpen.at (i + expList.size())); + for (size_t i = 0; i < sizeWavelet; ++i) { + temp.push_back(options.tpOpen[i + expList.size()]); } - wavelet->updateToolState (temp); - retinex->updateToolState (temp); + wavelet->updateToolState(temp); + retinex->updateToolState(temp); } } -void ToolPanelCoordinator::readOptions () +void ToolPanelCoordinator::readOptions() { - crop->readOptions (); + crop->readOptions(); } -void ToolPanelCoordinator::writeOptions () +void ToolPanelCoordinator::writeOptions() { - crop->writeOptions (); + crop->writeOptions(); if (options.autoSaveTpOpen) { - writeToolExpandedStatus (options.tpOpen); + writeToolExpandedStatus(options.tpOpen); } } -void ToolPanelCoordinator::writeToolExpandedStatus (std::vector &tpOpen) +void ToolPanelCoordinator::writeToolExpandedStatus(std::vector &tpOpen) { - tpOpen.clear (); + tpOpen.clear(); for (size_t i = 0; i < expList.size(); i++) { - tpOpen.push_back (expList.at (i)->get_expanded ()); + tpOpen.push_back(expList.at(i)->get_expanded()); } - wavelet->writeOptions (tpOpen); - retinex->writeOptions (tpOpen); + wavelet->writeOptions(tpOpen); + retinex->writeOptions(tpOpen); + +} + + +void ToolPanelCoordinator::updateShowtooltipVisibility (bool showtooltip) +{ + locallab->updateShowtooltipVisibility(showtooltip); } @@ -706,15 +1436,15 @@ void ToolPanelCoordinator::spotWBselected(int x, int y, Thumbnail* thm) } // toolBar->setTool (TOOL_HAND); - int rect = whitebalance->getSize (); + int rect = whitebalance->getSize(); int ww = ipc->getFullWidth(); int hh = ipc->getFullHeight(); if (x - rect > 0 && y - rect > 0 && x + rect < ww && y + rect < hh) { double temp; double green; - ipc->getSpotWB (x, y, rect, temp, green); - whitebalance->setWB (temp, green); + ipc->getSpotWB(x, y, rect, temp, green); + whitebalance->setWB(temp, green); } } @@ -723,7 +1453,8 @@ void ToolPanelCoordinator::sharpMaskSelected(bool sharpMask) if (!ipc) { return; } - ipc->beginUpdateParams (); + + ipc->beginUpdateParams(); ipc->endUpdateParams (ipc->setSharpMask(sharpMask)); } @@ -764,7 +1495,7 @@ CropGUIListener* ToolPanelCoordinator::startCropEditing(Thumbnail* thm) return crop; } -void ToolPanelCoordinator::autoCropRequested () +void ToolPanelCoordinator::autoCropRequested() { if (!ipc) { @@ -772,15 +1503,15 @@ void ToolPanelCoordinator::autoCropRequested () } int x1, y1, x2, y2, w, h; - ipc->getAutoCrop (crop->getRatio(), x1, y1, w, h); + ipc->getAutoCrop(crop->getRatio(), x1, y1, w, h); x2 = x1 + w - 1; y2 = y1 + h - 1; - crop->cropInit (x1, y1, w, h); - crop->cropResized (x1, y1, x2, y2); - crop->cropManipReady (); + crop->cropInit(x1, y1, w, h); + crop->cropResized(x1, y1, x2, y2); + crop->cropManipReady(); } -rtengine::RawImage* ToolPanelCoordinator::getDF() +const rtengine::RawImage* ToolPanelCoordinator::getDF() { if (!ipc) { return nullptr; @@ -791,11 +1522,11 @@ rtengine::RawImage* ToolPanelCoordinator::getDF() if (imd) { int iso = imd->getISOSpeed(); double shutter = imd->getShutterSpeed(); - std::string maker ( imd->getMake() ); - std::string model ( imd->getModel() ); + std::string maker(imd->getMake()); + std::string model(imd->getModel()); time_t timestamp = imd->getDateTimeAsTS(); - return rtengine::dfm.searchDarkFrame ( maker, model, iso, shutter, timestamp); + return rtengine::DFManager::getInstance().searchDarkFrame(maker, model, iso, shutter, timestamp); } return nullptr; @@ -814,12 +1545,12 @@ rtengine::RawImage* ToolPanelCoordinator::getFF() // double shutter = imd->getShutterSpeed(); temporarily removed because unused double aperture = imd->getFNumber(); double focallength = imd->getFocalLen(); - std::string maker ( imd->getMake() ); - std::string model ( imd->getModel() ); - std::string lens ( imd->getLens() ); + std::string maker(imd->getMake()); + std::string model(imd->getModel()); + std::string lens(imd->getLens()); time_t timestamp = imd->getDateTimeAsTS(); - return rtengine::ffm.searchFlatField ( maker, model, lens, focallength, aperture, timestamp); + return rtengine::ffm.searchFlatField(maker, model, lens, focallength, aperture, timestamp); } return nullptr; @@ -834,49 +1565,90 @@ Glib::ustring ToolPanelCoordinator::GetCurrentImageFilePath() return ipc->getInitialImage()->getFileName(); } -void ToolPanelCoordinator::straightenRequested () +void ToolPanelCoordinator::straightenRequested() { if (!ipc) { return; } - toolBar->setTool (TMStraighten); + toolBar->setTool(TMStraighten); } -double ToolPanelCoordinator::autoDistorRequested () +void ToolPanelCoordinator::autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector *lines) +{ + if (!(ipc && (corr_pitch || corr_yaw))) { + return; + } + + rtengine::ImageSource *src = dynamic_cast(ipc->getInitialImage()); + if (!src) { + return; + } + + rtengine::procparams::ProcParams params; + ipc->getParams(¶ms); + + // If focal length or crop factor are undetermined, use the defaults. + if (params.perspective.camera_focal_length <= 0) { + params.perspective.camera_focal_length = + PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH; + } + if (params.perspective.camera_crop_factor <= 0) { + params.perspective.camera_crop_factor = + PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR; + } + + auto res = rtengine::PerspectiveCorrection::autocompute(src, corr_pitch, corr_yaw, ¶ms, src->getMetaData(), lines); + rot = res.angle; + pitch = res.pitch; + yaw = res.yaw; +} + +double ToolPanelCoordinator::autoDistorRequested() { if (!ipc) { return 0.0; } - return rtengine::ImProcFunctions::getAutoDistor (ipc->getInitialImage()->getFileName(), 400); + return rtengine::ImProcFunctions::getAutoDistor(ipc->getInitialImage()->getFileName(), 400); } -void ToolPanelCoordinator::spotWBRequested (int size) +void ToolPanelCoordinator::spotWBRequested(int size) { if (!ipc) { return; } - toolBar->setTool (TMSpotWB); + toolBar->setTool(TMSpotWB); } -void ToolPanelCoordinator::cropSelectRequested () +void ToolPanelCoordinator::cropSelectRequested() { if (!ipc) { return; } - toolBar->setTool (TMCropSelect); + toolBar->setTool(TMCropSelect); +} + +void ToolPanelCoordinator::controlLineEditModeChanged(bool active) +{ + if (!ipc) { + return; + } + + if (active) { + toolBar->setTool(TMPerspective); + } } void ToolPanelCoordinator::saveInputICCReference(const Glib::ustring& fname, bool apply_wb) { if (ipc) { - ipc->saveInputICCReference (fname, apply_wb); + ipc->saveInputICCReference(fname, apply_wb); } } @@ -900,7 +1672,7 @@ void ToolPanelCoordinator::updateCurveBackgroundHistogram( retinex->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); } -void ToolPanelCoordinator::foldAllButOne (Gtk::Box* parent, FoldableToolPanel* openedSection) +void ToolPanelCoordinator::foldAllButOne(Gtk::Box* parent, FoldableToolPanel* openedSection) { for (auto toolPanel : toolPanels) { @@ -910,10 +1682,10 @@ void ToolPanelCoordinator::foldAllButOne (Gtk::Box* parent, FoldableToolPanel* o if (currentTP->getParent() == parent) { // Section in the same tab, we unfold it if it's not the one that has been clicked if (currentTP != openedSection) { - currentTP->setExpanded (false); + currentTP->setExpanded(false); } else { if (!currentTP->getExpanded()) { - currentTP->setExpanded (true); + currentTP->setExpanded(true); } } } @@ -921,7 +1693,44 @@ void ToolPanelCoordinator::foldAllButOne (Gtk::Box* parent, FoldableToolPanel* o } } -bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) +void ToolPanelCoordinator::updateToolLocations( + const std::vector &favorites, bool cloneFavoriteTools) +{ + const int fav_page_num = toolPanelNotebook->page_num(*favoritePanelSW); + + // Add or remove favorites tab if necessary. + if (favorites.empty() && fav_page_num != -1) { + toolPanelNotebook->remove_page(fav_page_num); + } else if (!favorites.empty() && fav_page_num == -1) { + toolPanelNotebook->prepend_page(*favoritePanelSW, *toiF); + } + + // Update favorite tool panels list. + favoritesToolPanels.clear(); + for (const auto &favorite_name : favorites) { + Tool tool; + try { + tool = getToolFromName(favorite_name.raw()); + } catch (const std::out_of_range &e) { + if (rtengine::settings->verbose) { + std::cerr + << "Unrecognized favorite tool \"" << favorite_name << "\"" + << std::endl; + } + continue; + } + if (isFavoritable(tool)) { + favoritesToolPanels.push_back(getFoldableToolPanel(tool)); + } + } + + int cur_page_num = toolPanelNotebook->get_current_page(); + Gtk::Widget *const cur_page = toolPanelNotebook->get_nth_page(cur_page_num); + + updatePanelTools(cur_page, favorites, cloneFavoriteTools); +} + +bool ToolPanelCoordinator::handleShortcutKey(GdkEventKey* event) { //bool ctrl = event->state & GDK_CONTROL_MASK; temporarily removed because unused @@ -931,37 +1740,41 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) if (alt) { switch (event->keyval) { case GDK_KEY_u: - if (favoritePanelSW) { + if (toolPanelNotebook->page_num(*favoritePanelSW) >= 0) { toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*favoritePanelSW)); } return true; case GDK_KEY_e: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*exposurePanelSW)); + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*exposurePanelSW)); return true; case GDK_KEY_d: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*detailsPanelSW)); + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*detailsPanelSW)); return true; case GDK_KEY_c: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*colorPanelSW)); + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*colorPanelSW)); return true; case GDK_KEY_t: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*transformPanelSW)); + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*transformPanelSW)); return true; case GDK_KEY_r: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*rawPanelSW)); + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*rawPanelSW)); return true; case GDK_KEY_a: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*advancedPanelSW)); + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*advancedPanelSW)); + return true; + + case GDK_KEY_o: + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*locallabPanelSW)); return true; case GDK_KEY_m: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*metadata)); + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*metadata)); return true; } } @@ -969,36 +1782,43 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) return false; } -void ToolPanelCoordinator::updateVScrollbars (bool hide) +void ToolPanelCoordinator::updateVScrollbars(bool hide) { 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); - } + 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); transformPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); rawPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); advancedPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); + locallabPanelSW->set_policy(Gtk::POLICY_AUTOMATIC, policy); for (auto currExp : expList) { - currExp->updateVScrollbars (hide); + currExp->updateVScrollbars(hide); } } -void ToolPanelCoordinator::updateTPVScrollbar (bool hide) +void ToolPanelCoordinator::updateTPVScrollbar(bool hide) { - updateVScrollbars (hide); + updateVScrollbars(hide); } -void ToolPanelCoordinator::toolSelected (ToolMode tool) +void ToolPanelCoordinator::toolDeselected(ToolMode tool) +{ + if (tool == TMPerspective) { + perspective->requestApplyControlLines(); + } +} + +void ToolPanelCoordinator::toolSelected(ToolMode tool) { GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + notebookconn.block(true); // "signal_switch_page" event is blocked to avoid unsubscribing Locallab (allows a correct behavior when switching to another tool using toolbar) auto checkFavorite = [this](FoldableToolPanel* tool) { - for (auto fav : favorites) { + for (auto fav : favoritesToolPanels) { if (fav == tool) { return true; } @@ -1008,18 +1828,23 @@ void ToolPanelCoordinator::toolSelected (ToolMode tool) switch (tool) { case TMCropSelect: { + toolBar->blockEditDeactivation(false); // To allow deactivating Locallab when switching to another tool using toolbar crop->setExpanded(true); toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(checkFavorite(crop) ? *favoritePanelSW : *transformPanelSW)); + prevPage = toolPanelNotebook->get_nth_page(toolPanelNotebook->get_current_page()); // Updating prevPage as "signal_switch_page" event break; } case TMSpotWB: { + toolBar->blockEditDeactivation(false); // To allow deactivating Locallab when switching to another tool using toolbar whitebalance->setExpanded(true); toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(checkFavorite(whitebalance) ? *favoritePanelSW : *colorPanelSW)); + prevPage = toolPanelNotebook->get_nth_page(toolPanelNotebook->get_current_page()); // Updating prevPage as "signal_switch_page" event break; } case TMStraighten: { + toolBar->blockEditDeactivation(false); // To allow deactivating Locallab when switching to another tool using toolbar rotate->setExpanded(true); bool isFavorite = checkFavorite(rotate); if (!isFavorite) { @@ -1027,37 +1852,183 @@ void ToolPanelCoordinator::toolSelected (ToolMode tool) lensgeom->setExpanded(true); } toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(isFavorite ? *favoritePanelSW : *transformPanelSW)); + prevPage = toolPanelNotebook->get_nth_page(toolPanelNotebook->get_current_page()); // Updating prevPage as "signal_switch_page" event + break; + } + + case TMPerspective: { + toolBar->blockEditDeactivation(false); // To allow deactivating Locallab when switching to another tool using toolbar + perspective->setControlLineEditMode(true); + perspective->setExpanded(true); + bool isFavorite = checkFavorite(perspective); + if (!isFavorite) { + isFavorite = checkFavorite(lensgeom); + lensgeom->setExpanded(true); + } + toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(isFavorite ? *favoritePanelSW : *transformPanelSW)); + prevPage = toolPanelNotebook->get_nth_page(toolPanelNotebook->get_current_page()); // Updating prevPage as "signal_switch_page" event break; } default: break; } + + updateToolLocations(options.favorites, options.cloneFavoriteTools); + + notebookconn.block(false); } -void ToolPanelCoordinator::editModeSwitchedOff () +void ToolPanelCoordinator::editModeSwitchedOff() { if (editDataProvider) { editDataProvider->switchOffEditMode(); } } -void ToolPanelCoordinator::dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile) +void ToolPanelCoordinator::dirSelected(const Glib::ustring& dirname, const Glib::ustring& openfile) { - flatfield->setShortcutPath (dirname); + flatfield->setShortcutPath(dirname); } -void ToolPanelCoordinator::setEditProvider (EditDataProvider *provider) +void ToolPanelCoordinator::setEditProvider(EditDataProvider *provider) { editDataProvider = provider; for (size_t i = 0; i < toolPanels.size(); i++) { - toolPanels.at (i)->setEditProvider (provider); + toolPanels.at(i)->setEditProvider(provider); } } -bool ToolPanelCoordinator::getFilmNegativeExponents(rtengine::Coord spotA, rtengine::Coord spotB, std::array& newExps) +bool ToolPanelCoordinator::getFilmNegativeSpot(rtengine::Coord spot, int spotSize, RGB &refInput, RGB &refOutput) { - return ipc && ipc->getFilmNegativeExponents(spotA.x, spotA.y, spotB.x, spotB.y, newExps); + return ipc && ipc->getFilmNegativeSpot(spot.x, spot.y, spotSize, refInput, refOutput); +} + +FoldableToolPanel *ToolPanelCoordinator::getFoldableToolPanel(Tool tool) const +{ + switch (tool) { + case Tool::TONE_CURVE: + return toneCurve; + case Tool::SHADOWS_HIGHLIGHTS: + return shadowshighlights; + case Tool::TONE_EQUALIZER: + return toneEqualizer; + case Tool::IMPULSE_DENOISE: + return impulsedenoise; + case Tool::DEFRINGE_TOOL: + return defringe; + case Tool::SPOT: + return spot; + case Tool::DIR_PYR_DENOISE: + return dirpyrdenoise; + case Tool::EPD: + return epd; + case Tool::SHARPENING_TOOL: + return sharpening; + case Tool::LOCAL_CONTRAST: + return localContrast; + case Tool::SHARPEN_EDGE: + return sharpenEdge; + case Tool::SHARPEN_MICRO: + return sharpenMicro; + case Tool::L_CURVE: + return lcurve; + case Tool::RGB_CURVES: + return rgbcurves; + case Tool::COLOR_TONING: + return colortoning; + case Tool::LENS_GEOM: + return lensgeom; + case Tool::LENS_PROF: + return lensProf; + case Tool::DISTORTION: + return distortion; + case Tool::ROTATE: + return rotate; + case Tool::VIBRANCE: + return vibrance; + case Tool::COLOR_APPEARANCE: + return colorappearance; + case Tool::WHITE_BALANCE: + return whitebalance; + case Tool::VIGNETTING: + return vignetting; + case Tool::RETINEX_TOOL: + return retinex; + case Tool::GRADIENT: + return gradient; + case Tool::LOCALLAB: + return locallab; + case Tool::PC_VIGNETTE: + return pcvignette; + case Tool::PERSPECTIVE: + return perspective; + case Tool::CA_CORRECTION: + return cacorrection; + case Tool::CH_MIXER: + return chmixer; + case Tool::BLACK_WHITE: + return blackwhite; + case Tool::RESIZE_TOOL: + return resize; + case Tool::PR_SHARPENING: + return prsharpening; + case Tool::CROP_TOOL: + return crop; + case Tool::ICM: + return icm; + case Tool::WAVELET: + return wavelet; + case Tool::DIR_PYR_EQUALIZER: + return dirpyrequalizer; + case Tool::HSV_EQUALIZER: + return hsvequalizer; + case Tool::FILM_SIMULATION: + return filmSimulation; + case Tool::SOFT_LIGHT: + return softlight; + case Tool::DEHAZE: + return dehaze; + case Tool::SENSOR_BAYER: + return sensorbayer; + case Tool::SENSOR_XTRANS: + return sensorxtrans; + case Tool::BAYER_PROCESS: + return bayerprocess; + case Tool::XTRANS_PROCESS: + return xtransprocess; + case Tool::BAYER_PREPROCESS: + return bayerpreprocess; + case Tool::PREPROCESS: + return preprocess; + case Tool::DARKFRAME_TOOL: + return darkframe; + case Tool::FLATFIELD_TOOL: + return flatfield; + case Tool::RAW_CA_CORRECTION: + return rawcacorrection; + case Tool::RAW_EXPOSURE: + return rawexposure; + case Tool::PREPROCESS_WB: + return preprocessWB; + case Tool::BAYER_RAW_EXPOSURE: + return bayerrawexposure; + case Tool::XTRANS_RAW_EXPOSURE: + return xtransrawexposure; + case Tool::FATTAL: + return fattal; + case Tool::FILM_NEGATIVE: + return filmNegative; + case Tool::PD_SHARPENING: + return pdSharpening; + }; + assert(false); + return nullptr; +} + +FoldableToolPanel *ToolPanelCoordinator::getFoldableToolPanel(const ToolTree &toolTree) const +{ + return getFoldableToolPanel(toolTree.id); } diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 4313f6d12..95350c5e8 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -18,6 +18,7 @@ */ #pragma once +#include #include #include @@ -54,11 +55,13 @@ #include "lensgeomlistener.h" #include "lensprofile.h" #include "localcontrast.h" +#include "locallab.h" #include "pcvignette.h" #include "pdsharpening.h" #include "perspective.h" #include "pparamschangelistener.h" #include "preprocess.h" +#include "preprocesswb.h" #include "profilechangelistener.h" #include "prsharpening.h" #include "rawcacorrection.h" @@ -74,7 +77,9 @@ #include "sharpening.h" #include "sharpenmicro.h" #include "softlight.h" +#include "spot.h" #include "tonecurve.h" +#include "toneequalizer.h" #include "toolbar.h" #include "toolpanel.h" #include "vibrance.h" @@ -100,6 +105,7 @@ class ToolPanelCoordinator : public LensGeomListener, public SpotWBListener, public CropPanelListener, + public PerspCorrectionPanelListener, public ICMPanelListener, public ImageAreaToolListener, public rtengine::ImageTypeListener, @@ -110,6 +116,7 @@ protected: WhiteBalance* whitebalance; Vignetting* vignetting; Gradient* gradient; + Locallab* locallab; Retinex* retinex; PCVignette* pcvignette; LensGeometry* lensgeom; @@ -128,7 +135,9 @@ protected: Crop* crop; ToneCurve* toneCurve; ShadowsHighlights* shadowshighlights; + ToneEqualizer* toneEqualizer; LocalContrast *localContrast; + Spot* spot; Defringe* defringe; ImpulseDenoise* impulsedenoise; DirPyrDenoise* dirpyrdenoise; @@ -155,6 +164,7 @@ protected: FlatField* flatfield; RAWCACorr* rawcacorrection; RAWExposure* rawexposure; + PreprocessWB* preprocessWB; BayerRAWExposure* bayerrawexposure; XTransRAWExposure* xtransrawexposure; FattalToneMapping *fattal; @@ -162,11 +172,13 @@ protected: FilmNegative* filmNegative; PdSharpening* pdSharpening; std::vector paramcListeners; + std::unordered_map + expanderToToolPanelMap; rtengine::StagedImageProcessor* ipc; std::vector toolPanels; - std::vector favorites; + std::vector favoritesToolPanels; ToolVBox* favoritePanel; ToolVBox* exposurePanel; ToolVBox* detailsPanel; @@ -174,9 +186,10 @@ protected: ToolVBox* transformPanel; ToolVBox* rawPanel; ToolVBox* advancedPanel; + ToolVBox* locallabPanel; ToolBar* toolBar; - TextOrIcon* toiF; + std::unique_ptr toiF; TextOrIcon* toiE; TextOrIcon* toiD; TextOrIcon* toiC; @@ -184,38 +197,145 @@ protected: TextOrIcon* toiR; TextOrIcon* toiM; TextOrIcon* toiW; + TextOrIcon* toiL; - Gtk::Image* imgPanelEnd[7]; - Gtk::VBox* vbPanelEnd[7]; + Gtk::Image* imgPanelEnd[8]; + Gtk::Box* vbPanelEnd[8]; - Gtk::ScrolledWindow* favoritePanelSW; + std::unique_ptr favoritePanelSW; Gtk::ScrolledWindow* exposurePanelSW; Gtk::ScrolledWindow* detailsPanelSW; Gtk::ScrolledWindow* colorPanelSW; Gtk::ScrolledWindow* transformPanelSW; Gtk::ScrolledWindow* rawPanelSW; Gtk::ScrolledWindow* advancedPanelSW; + Gtk::ScrolledWindow* locallabPanelSW; std::vector expList; bool hasChanged; + bool batch; - void addPanel (Gtk::Box* where, FoldableToolPanel* panel, int level = 1); - void foldThemAll (GdkEventButton* event); - void updateVScrollbars (bool hide); + void addPanel(Gtk::Box* where, FoldableToolPanel* panel, int level = 1); + void foldThemAll(GdkEventButton* event); + void updateVScrollbars(bool hide); void addfavoritePanel (Gtk::Box* where, FoldableToolPanel* panel, int level = 1); + void notebookPageChanged(Gtk::Widget* page, guint page_num); + void updatePanelTools( + Gtk::Widget *page, + const std::vector &favorites, + bool cloneFavoriteTools); private: EditDataProvider *editDataProvider; + sigc::connection notebookconn; + bool photoLoadedOnce; // Used to indicated that a photo has been loaded yet + Gtk::Widget* prevPage; public: + enum class Panel { + FAVORITE, + EXPOSURE, + DETAILS, + COLOR, + ADVANCED, + LOCALLAB, + TRANSFORM_PANEL, + RAW, + }; + + enum class Tool { + TONE_CURVE, + SHADOWS_HIGHLIGHTS, + TONE_EQUALIZER, + IMPULSE_DENOISE, + DEFRINGE_TOOL, + SPOT, + DIR_PYR_DENOISE, + EPD, + SHARPENING_TOOL, + LOCAL_CONTRAST, + SHARPEN_EDGE, + SHARPEN_MICRO, + L_CURVE, + RGB_CURVES, + COLOR_TONING, + LENS_GEOM, + LENS_PROF, + DISTORTION, + ROTATE, + VIBRANCE, + COLOR_APPEARANCE, + WHITE_BALANCE, + VIGNETTING, + RETINEX_TOOL, + GRADIENT, + LOCALLAB, + PC_VIGNETTE, + PERSPECTIVE, + CA_CORRECTION, + CH_MIXER, + BLACK_WHITE, + RESIZE_TOOL, + PR_SHARPENING, + CROP_TOOL, + ICM, + WAVELET, + DIR_PYR_EQUALIZER, + HSV_EQUALIZER, + FILM_SIMULATION, + SOFT_LIGHT, + DEHAZE, + SENSOR_BAYER, + SENSOR_XTRANS, + BAYER_PROCESS, + XTRANS_PROCESS, + BAYER_PREPROCESS, + PREPROCESS, + DARKFRAME_TOOL, + FLATFIELD_TOOL, + RAW_CA_CORRECTION, + RAW_EXPOSURE, + PREPROCESS_WB, + BAYER_RAW_EXPOSURE, + XTRANS_RAW_EXPOSURE, + FATTAL, + FILM_NEGATIVE, + PD_SHARPENING, + }; + + struct ToolTree { + Tool id; + std::vector children; + }; + + using ToolLayout = std::unordered_map &, ScopedEnumHash>; + CoarsePanel* coarse; Gtk::Notebook* toolPanelNotebook; - ToolPanelCoordinator (bool batch = false); + ToolPanelCoordinator(bool batch = false); ~ToolPanelCoordinator () override; - bool getChangedState () + static const ToolLayout &getDefaultToolLayout(); + /** + * Gets the tool with the provided tool name. + * + * @param name The tool name as a raw string. + * @return The tool. + * @throws std::out_of_range If the name is not recognized. + */ + static Tool getToolFromName(const std::string &name); + /** + * Gets the tool name for the tool's ToolPanel as a string. + * + * @param tool The name as a raw string, or an empty string if the tool is + * unknown. + */ + static std::string getToolName(Tool tool); + static bool isFavoritable(Tool tool); + + bool getChangedState() { return hasChanged; } @@ -231,18 +351,24 @@ public: const LUTu& histLuma, const LUTu& histLRETI ); - void foldAllButOne (Gtk::Box* parent, FoldableToolPanel* openedSection); + void foldAllButOne(Gtk::Box* parent, FoldableToolPanel* openedSection); + void updateToolLocations( + const std::vector &favorites, bool cloneFavoriteTools); // multiple listeners can be added that are notified on changes (typical: profile panel and the history) - void addPParamsChangeListener (PParamsChangeListener* pp) + void addPParamsChangeListener(PParamsChangeListener* pp) { - paramcListeners.push_back (pp); + paramcListeners.push_back(pp); } // toolpanellistener interface + void refreshPreview(const rtengine::ProcEvent& event) override; void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) override; + void setTweakOperator (rtengine::TweakOperator *tOperator) override; + void unsetTweakOperator (rtengine::TweakOperator *tOperator) override; - void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono = false) override; + // FilmNegProvider interface + void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono = false, bool isGainMapSupported = false) override; // profilechangelistener interface void profileChange( @@ -255,52 +381,53 @@ public: void setDefaults(const rtengine::procparams::ProcParams* defparams) override; // DirSelectionListener interface - void dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile); + void dirSelected(const Glib::ustring& dirname, const Glib::ustring& openfile); // to support the GUI: - CropGUIListener* getCropGUIListener (); // through the CropGUIListener the editor area can notify the "crop" ToolPanel when the crop selection changes + CropGUIListener* getCropGUIListener(); // through the CropGUIListener the editor area can notify the "crop" ToolPanel when the crop selection changes // init the toolpanelcoordinator with an image & close it - void initImage (rtengine::StagedImageProcessor* ipc_, bool israw); - void closeImage (); + void initImage(rtengine::StagedImageProcessor* ipc_, bool israw); + void closeImage(); // update the "expanded" state of the Tools - void updateToolState (); - void openAllTools (); - void closeAllTools (); + void updateToolState(); + void openAllTools(); + void closeAllTools(); // read/write the "expanded" state of the expanders & read/write the crop panel settings (ratio, guide type, etc.) - void readOptions (); - void writeOptions (); - void writeToolExpandedStatus (std::vector &tpOpen); - + void readOptions(); + void writeOptions(); + void writeToolExpandedStatus(std::vector &tpOpen); + void updateShowtooltipVisibility (bool showtooltip); // wbprovider interface - void getAutoWB (double& temp, double& green, double equal, double tempBias) override + void getAutoWB (double& temp, double& green, double equal, rtengine::StandardObserver observer, double tempBias) override { if (ipc) { - ipc->getAutoWB (temp, green, equal, tempBias); + ipc->getAutoWB(temp, green, equal, observer, tempBias); } } - void getCamWB (double& temp, double& green) override + void getCamWB (double& temp, double& green, rtengine::StandardObserver observer) override { if (ipc) { - ipc->getCamWB (temp, green); + ipc->getCamWB(temp, green, observer); } } //DFProvider interface - rtengine::RawImage* getDF() override; + const rtengine::RawImage* getDF() override; //FFProvider interface rtengine::RawImage* getFF() override; Glib::ustring GetCurrentImageFilePath() override; // FilmNegProvider interface - bool getFilmNegativeExponents(rtengine::Coord spotA, rtengine::Coord spotB, std::array& newExps) override; + bool getFilmNegativeSpot(rtengine::Coord spot, int spotSize, RGB &refInput, RGB &refOutput) override; // rotatelistener interface void straightenRequested () override; void autoCropRequested () override; + void autoPerspRequested (bool corr_pitch, bool corr_yaw, double& rot, double& pitch, double& yaw, const std::vector *lines = nullptr) override; double autoDistorRequested () override; // spotwblistener interface @@ -309,26 +436,49 @@ public: // croppanellistener interface void cropSelectRequested () override; + // PerspCorrectionPanelListener interface + void controlLineEditModeChanged(bool active) override; + // icmpanellistener interface void saveInputICCReference(const Glib::ustring& fname, bool apply_wb) override; // imageareatoollistener interface void spotWBselected(int x, int y, Thumbnail* thm = nullptr) override; - void sharpMaskSelected(bool sharpMask) override; + void sharpMaskSelected(bool sharpMask) override final; int getSpotWBRectSize() const override; void cropSelectionReady() override; void rotateSelectionReady(double rotate_deg, Thumbnail* thm = nullptr) override; - ToolBar* getToolBar() const override; + ToolBar* getToolBar() const final; CropGUIListener* startCropEditing(Thumbnail* thm = nullptr) override; - void updateTPVScrollbar (bool hide); - bool handleShortcutKey (GdkEventKey* event); + void updateTPVScrollbar(bool hide); + bool handleShortcutKey(GdkEventKey* event); // ToolBarListener interface + void toolDeselected(ToolMode tool) override; void toolSelected (ToolMode tool) override; - void editModeSwitchedOff () override; + void editModeSwitchedOff () final; - void setEditProvider (EditDataProvider *provider); + void setEditProvider(EditDataProvider *provider); + +protected: + static std::unordered_map toolNamesReverseMap; + + std::unordered_map + toolToDefaultToolTreeMap; + + FoldableToolPanel *getFoldableToolPanel(Tool tool) const; + FoldableToolPanel *getFoldableToolPanel(const ToolTree &tool) const; + void updateFavoritesPanel( + const std::vector &favorites, bool cloneFavoriteTools); + template + typename std::enable_if::value, void>::type + updateToolPanel( + Gtk::Box *panelBox, + const std::vector &children, + int level, + const std::unordered_set &favorites, + bool cloneFavoriteTools); private: IdleRegister idle_register; diff --git a/rtgui/vibrance.cc b/rtgui/vibrance.cc index 4a9fab3d3..f2eb8fc4e 100644 --- a/rtgui/vibrance.cc +++ b/rtgui/vibrance.cc @@ -27,7 +27,9 @@ using namespace rtengine; using namespace rtengine::procparams; -Vibrance::Vibrance () : FoldableToolPanel(this, "vibrance", M("TP_VIBRANCE_LABEL"), false, true) +const Glib::ustring Vibrance::TOOL_NAME = "vibrance"; + +Vibrance::Vibrance () : FoldableToolPanel(this, TOOL_NAME, M("TP_VIBRANCE_LABEL"), false, true) { std::vector milestones; diff --git a/rtgui/vibrance.h b/rtgui/vibrance.h index 12acc7948..ee3d029ee 100644 --- a/rtgui/vibrance.h +++ b/rtgui/vibrance.h @@ -57,6 +57,7 @@ protected: sigc::connection pastsattogconn; public: + static const Glib::ustring TOOL_NAME; Vibrance (); ~Vibrance () override; diff --git a/rtgui/vignetting.cc b/rtgui/vignetting.cc index 04a350b99..c2652de42 100644 --- a/rtgui/vignetting.cc +++ b/rtgui/vignetting.cc @@ -23,7 +23,9 @@ using namespace rtengine; using namespace rtengine::procparams; -Vignetting::Vignetting () : FoldableToolPanel(this, "vignetting", M("TP_VIGNETTING_LABEL")) +const Glib::ustring Vignetting::TOOL_NAME = "vignetting"; + +Vignetting::Vignetting () : FoldableToolPanel(this, TOOL_NAME, M("TP_VIGNETTING_LABEL")) { amount = Gtk::manage (new Adjuster (M("TP_VIGNETTING_AMOUNT"), -100, 100, 1, 0)); diff --git a/rtgui/vignetting.h b/rtgui/vignetting.h index be7765094..bcb7f9d19 100644 --- a/rtgui/vignetting.h +++ b/rtgui/vignetting.h @@ -37,6 +37,7 @@ protected: Adjuster* centerY; public: + static const Glib::ustring TOOL_NAME; Vignetting (); diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 3981457e6..765386529 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * 2014 Jacques Desmis + * 2014 - 2020 Jacques Desmis */ #include "wavelet.h" @@ -26,48 +26,59 @@ #include "guiutils.h" #include "rtimage.h" #include "options.h" +#include "eventmapper.h" +#include "labgrid.h" #include "../rtengine/color.h" +#include using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring Wavelet::TOOL_NAME = "wavelet"; + namespace { - GradientMilestone makeHsvGm(double position, float h, float s, float v) - { - float r; - float g; - float b; - Color::hsv2rgb01(h, s, v, r, g, b); - return GradientMilestone(position, r, g, b); +GradientMilestone makeHsvGm(double position, float h, float s, float v) +{ + float r; + float g; + float b; + Color::hsv2rgb01(h, s, v, r, g, b); + return GradientMilestone(position, r, g, b); +} + +std::vector makeWholeHueRange() +{ + std::vector res; + res.reserve(7); + + for (int i = 0; i < 7; ++i) { + const float x = static_cast(i) / 6.0f; + res.push_back(makeHsvGm(x, x, 0.5f, 0.5f)); } - std::vector makeWholeHueRange() - { - std::vector res; - res.reserve(7); - - for (int i = 0; i < 7; ++i) { - const float x = static_cast(i) / 6.0f; - res.push_back(makeHsvGm(x, x, 0.5f, 0.5f)); - } - - return res; - } + return res; +} } Wavelet::Wavelet() : - FoldableToolPanel(this, "wavelet", M("TP_WAVELET_LABEL"), true, true), + FoldableToolPanel(this, TOOL_NAME, M("TP_WAVELET_LABEL"), true, true), curveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CONTEDIT"))), + //curveEditorC(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CONTRASTEDIT"))), CCWcurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_CCURVE"))), + curveEditorbl(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_BLCURVE"))), curveEditorRES(new CurveEditorGroup(options.lastWaveletCurvesDir)), curveEditorGAM(new CurveEditorGroup(options.lastWaveletCurvesDir)), - separatorNeutral(Gtk::manage(new Gtk::HSeparator())), - separatoredge(Gtk::manage(new Gtk::HSeparator())), + separatorNeutral(Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))), + separatoredge(Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL))), opaCurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_COLORT"))), opacityCurveEditorG(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_OPACITY"))), + CurveEditorwavnoise(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISE"))), + CurveEditorwavnoiseh(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISEH"))), + CurveEditorwavguid(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISEGUID"))), + CurveEditorwavhue(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_DENOISEHUE"))), opacityCurveEditorW(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_OPACITYW"))), opacityCurveEditorWL(new CurveEditorGroup(options.lastWaveletCurvesDir, M("TP_WAVELET_OPACITYWL"))), median(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_MEDI")))), @@ -77,27 +88,45 @@ Wavelet::Wavelet() : lipst(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_LIPST")))), avoid(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_AVOID")))), tmr(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_BALCHRO")))), + showmask(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_SHOWMASK")))), + oldsh(Gtk::manage(new Gtk::CheckButton(M("TP_WAVELET_OLDSH")))), neutralchButton(Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL")))), + sigma(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMA"), 0.05, 2.5, 0.01, 1.))), + offset(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVOFFSET"), 0.33, 1.66, 0.01, 1., Gtk::manage(new RTImage("circle-black-small.png")), Gtk::manage(new RTImage("circle-white-small.png"))))), + lowthr(Gtk::manage(new Adjuster(M("TP_WAVELET_WAVLOWTHR"), 20., 100., 0.5, 40.))), rescon(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCON"), -100, 100, 1, 0))), - resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), -100, 100, 1, 0))), + resconH(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCONH"), 0, 100, 1, 0))), reschro(Gtk::manage(new Adjuster(M("TP_WAVELET_RESCHRO"), -100, 100, 1, 0))), + resblur(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLUR"), 0, 100, 1, 0))), + resblurc(Gtk::manage(new Adjuster(M("TP_WAVELET_RESBLURC"), 0, 100, 1, 0))), + bluwav(Gtk::manage(new Adjuster(M("TP_WAVELET_BLUWAV"), 0.05, 2.5, 0.5, 1.))), tmrs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSTRENGTH"), -1.0, 2.0, 0.01, 0.0))), + edgs(Gtk::manage(new Adjuster(M("TP_WAVELET_TMEDGS"), 0.1, 4.0, 0.01, 1.4))), + scale(Gtk::manage(new Adjuster(M("TP_WAVELET_TMSCALE"), 0.1, 10.0, 0.01, 1.0))), gamma(Gtk::manage(new Adjuster(M("TP_WAVELET_COMPGAMMA"), 0.4, 2.0, 0.01, 1.0))), sup(Gtk::manage(new Adjuster(M("TP_WAVELET_SUPE"), -100, 350, 1, 0))), sky(Gtk::manage(new Adjuster(M("TP_WAVELET_SKY"), -100., 100.0, 1., 0.))), - thres(Gtk::manage(new Adjuster(M("TP_WAVELET_LEVELS"), 4, 9, 1, 7))),//3 + thres(Gtk::manage(new Adjuster(M("TP_WAVELET_LEVELS"), 5, 9, 1, 7))),//3 chroma(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRO"), 1, 9, 1, 5))), chro(Gtk::manage(new Adjuster(M("TP_WAVELET_CHR"), 0., 100., 1., 0.))), contrast(Gtk::manage(new Adjuster(M("TP_WAVELET_CONTRA"), -100, 100, 1, 0))), - thr(Gtk::manage(new Adjuster(M("TP_WAVELET_THR"), 0, 100, 1, 35))), - thrH(Gtk::manage(new Adjuster(M("TP_WAVELET_THRH"), 0, 100, 1, 65))), - skinprotect(Gtk::manage( new Adjuster(M("TP_WAVELET_SKIN"), -100, 100, 1, 0.) )), - edgrad(Gtk::manage( new Adjuster(M("TP_WAVELET_EDRAD"), 0, 100, 1, 15) )), - edgval(Gtk::manage( new Adjuster(M("TP_WAVELET_EDVAL"), 0, 100, 1, 0) )), - edgthresh(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGTHRESH"), -50, 100, 1, 10 ))), + thr(Gtk::manage(new Adjuster(M("TP_WAVELET_THR"), 0, 100, 1, 30))), + thrH(Gtk::manage(new Adjuster(M("TP_WAVELET_THRH"), 0, 100, 1, 70))), + radius(Gtk::manage(new Adjuster(M("TP_WAVELET_RADIUS"), 0, 100, 1, 40))), + skinprotect(Gtk::manage(new Adjuster(M("TP_WAVELET_SKIN"), -100, 100, 1, 0.))), + edgrad(Gtk::manage(new Adjuster(M("TP_WAVELET_EDRAD"), 0, 100, 1, 15))), + edgeffect(Gtk::manage(new Adjuster(M("TP_WAVELET_EDEFFECT"), 0.05, 2.5, 0.01, 1.))), + edgval(Gtk::manage(new Adjuster(M("TP_WAVELET_EDVAL"), 0, 100, 1, 0))), + edgthresh(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGTHRESH"), -50, 100, 1, 10))), strength(Gtk::manage(new Adjuster(M("TP_WAVELET_STRENGTH"), 0, 100, 1, 100))), balance(Gtk::manage(new Adjuster(M("TP_WAVELET_BALANCE"), -30, 100, 1, 0))), iter(Gtk::manage(new Adjuster(M("TP_WAVELET_ITER"), -3, 3, 1, 0))), + sigmafin(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + sigmaton(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + sigmacol(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + sigmadir(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGMAFIN"), 0.025, 2.5, 0.01, 1.))), + rangeab(Gtk::manage(new Adjuster(M("TP_WAVELET_RANGEAB"), 0., 100., 0.1, 20.))), + protab(Gtk::manage(new Adjuster(M("TP_WAVELET_PROTAB"), 0., 100., 0.5, 0.))), hueskin(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKIN"), -314., 314., -5., 25., 170., 120., 0, false))), hueskin2(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HUESKY"), -314., 314., -260., -250, -130., -140., 0, false))), hllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_HIGHLIGHT"), 0., 100., 50., 75., 100., 98., 0, false))), @@ -109,13 +138,32 @@ Wavelet::Wavelet() : level1noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVONE"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level2noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTWO"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level3noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTHRE"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), - threshold(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD"), 1, 9, 1, 5))), - threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 1, 9, 1, 4))), + leveldenoise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVFOUR"), 0., 100., 0., M("TP_WAVELET_DEN5THR"), 1, 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), + levelsigm(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVELSIGM"), 0.05, 3., 1., M("TP_WAVELET_LEVELHIGH"), 1, 0.05, 3., 1., M("TP_WAVELET_LEVELLOW"), 1., nullptr, false))), + sigm(Gtk::manage(new Adjuster(M("TP_WAVELET_SIGM"), 0.05, 3.5, 0.01, 1.))), + levden(Gtk::manage(new Adjuster(M("TP_WAVELET_LEVDEN"), 0., 100., 0.5, 0.))), + thrden(Gtk::manage(new Adjuster(M("TP_WAVELET_DENLH"), 0., 100., 0.5, 0.))), + limden(Gtk::manage(new Adjuster(M("TP_WAVELET_LIMDEN"), 0., 1., 0.01, 0.))), + threshold(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD"), 1, 9, 1, 4))), + // threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 1, 9, 1, 4))), + threshold2(Gtk::manage(new Adjuster(M("TP_WAVELET_THRESHOLD2"), 3, 9, 1, 5))), edgedetect(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECT"), 0, 100, 1, 90))), edgedetectthr(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR"), 0, 100, 1, 20))), edgedetectthr2(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEDETECTTHR2"), -10, 100, 1, 0))), edgesensi(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGESENSI"), 0, 100, 1, 60))), edgeampli(Gtk::manage(new Adjuster(M("TP_WAVELET_EDGEAMPLI"), 0, 100, 1, 10))), + ballum(Gtk::manage(new Adjuster(M("TP_WAVELET_BALLUM"), -2., 10., 0.5, 7., Gtk::manage(new RTImage("circle-white-small.png")), Gtk::manage(new RTImage("circle-black-small.png"))))), + balchrom(Gtk::manage(new Adjuster(M("TP_WAVELET_BALCHROM"), -100., 100., 1., 0., Gtk::manage(new RTImage("circle-blue-yellow-small.png")), Gtk::manage(new RTImage("circle-red-green-small.png"))))), + chromfi(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMFI"), 0.0, 150., 0.01, 0.))), + chromco(Gtk::manage(new Adjuster(M("TP_WAVELET_CHROMCO"), 0, 100., 0.01, 0.))), + mergeL(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEL"), -50, 100, 1, 20))), + mergeC(Gtk::manage(new Adjuster(M("TP_WAVELET_MERGEC"), -50, 100, 1, 20))), + softrad(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 100., 0.5, 0.))), + softradend(Gtk::manage(new Adjuster(M("TP_WAVELET_SOFTRAD"), 0.0, 1000., 1., 0.))), + strend(Gtk::manage(new Adjuster(M("TP_WAVELET_STREND"), 0.0, 100., 1.0, 50.))), + detend(Gtk::manage(new Adjuster(M("TP_WAVELET_DETEND"), -10, 10, 1, 0))), + thrend(Gtk::manage(new Adjuster(M("TP_WAVELET_THREND"), 0.0, 100., 0.5, 0.))), + chrwav(Gtk::manage(new Adjuster(M("TP_WAVELET_CHRWAV"), 0., 100., 0.5, 0.))), Lmethod(Gtk::manage(new MyComboBoxText())), CHmethod(Gtk::manage(new MyComboBoxText())), CHSLmethod(Gtk::manage(new MyComboBoxText())), @@ -126,16 +174,32 @@ Wavelet::Wavelet() : HSmethod(Gtk::manage(new MyComboBoxText())), CLmethod(Gtk::manage(new MyComboBoxText())), Backmethod(Gtk::manage(new MyComboBoxText())), + complexmethod(Gtk::manage(new MyComboBoxText())), Tilesmethod(Gtk::manage(new MyComboBoxText())), daubcoeffmethod(Gtk::manage(new MyComboBoxText())), Dirmethod(Gtk::manage(new MyComboBoxText())), Medgreinf(Gtk::manage(new MyComboBoxText())), + ushamethod(Gtk::manage(new MyComboBoxText())), + //denmethod(Gtk::manage(new MyComboBoxText())), + mixmethod(Gtk::manage(new MyComboBoxText())), + quamethod(Gtk::manage(new MyComboBoxText())), + slimethod(Gtk::manage(new MyComboBoxText())), chanMixerHLFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_HIGHLIGHT")))), chanMixerMidFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_MIDTONES")))), chanMixerShadowsFrame(Gtk::manage(new Gtk::Frame(M("TP_COLORTONING_SHADOWS")))), + shFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_SHFRAME")))), + contFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CONTFRAME")))), + blurFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_BLURFRAME")))), + chromaFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROMAFRAME")))), + chroFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_CHROFRAME")))), + fincFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_FINCFRAME")))), + dirFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_DIRFRAME")))), + tonFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_TONFRAME")))), + guidFrame(Gtk::manage(new Gtk::Frame(M("TP_WAVELET_GUIDFRAME")))), wavLabels(Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER))), labmC(Gtk::manage(new Gtk::Label(M("TP_WAVELET_CTYPE") + ":"))), labmNP(Gtk::manage(new Gtk::Label(M("TP_WAVELET_NPTYPE") + ":"))), + usharpLabel(Gtk::manage(new Gtk::Label(M("TP_WAVELET_USHARP") + ":"))), expchroma(Gtk::manage(new MyExpander(true, M("TP_WAVELET_LEVCH")))), expcontrast(Gtk::manage(new MyExpander(true, M("TP_WAVELET_LEVF")))), expedge(Gtk::manage(new MyExpander(true, M("TP_WAVELET_EDGE")))), @@ -145,110 +209,191 @@ Wavelet::Wavelet() : expresid(Gtk::manage(new MyExpander(true, M("TP_WAVELET_RESID")))), expsettings(Gtk::manage(new MyExpander(false, M("TP_WAVELET_SETTINGS")))), exptoning(Gtk::manage(new MyExpander(true, M("TP_WAVELET_TON")))), - neutrHBox(Gtk::manage(new Gtk::HBox())) + expclari(Gtk::manage(new MyExpander(true, M("TP_WAVELET_CLARI")))), + expbl(Gtk::manage(new MyExpander(true, M("TP_WAVELET_BL")))), + neutrHBox(Gtk::manage(new Gtk::Box())), + usharpHBox(Gtk::manage(new Gtk::Box())), + ctboxch(Gtk::manage(new Gtk::Box())), + quaHBox(Gtk::manage(new Gtk::Box())), + sliHBox(Gtk::manage(new Gtk::Box())), + //denHBox(Gtk::manage(new Gtk::Box())), + mixHBox(Gtk::manage(new Gtk::Box())), + ctboxBA(Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL))) + { CurveListener::setMulti(true); + auto m = ProcEventMapper::getInstance(); + EvWavenaclari = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCLARI"); + EvWavushamet = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVUSHAMET"); + EvWavballum = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBALLUM"); + EvWavbalchrom = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBALCHROM"); + EvWavchromfi = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCHROMFI"); + EvWavchromco = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCHROMCO"); + EvWavmergeL = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMERGEL"); + EvWavmergeC = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMERGEC"); + EvWavsoftrad = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRAD"); + EvWavsoftradend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSOFTRADEND"); + EvWavshowmask = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSHOWMASK"); + EvWavedgs = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVEDGS"); + EvWavscale = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSCALE"); + EvWavradius = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVRADIUS"); + EvWavsigma = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGMA"); + EvWavenabl = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVBL"); + EvWavchrwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVCHR"); + EvWavoldsh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOLDSH"); + EvWavoffset = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVOFFSET"); + EvWavlowthr = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLOWTHR"); + EvWavbluwav = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLUWAV"); + EvWavblshape = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLSHAPE"); + EvWavresblur = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURWAV"); + EvWavresblurc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_BLURCWAV"); + EvWavedgeffect = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_EDGEFFECT"); + EvWavsigmafin = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMAFIN"); + EvWavsigmaton = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMATON"); + EvWavsigmacol = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMACOL"); + EvWavsigmadir = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_SIGMADIR"); + EvWavLabGridValue = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLABGRID_VALUE"); + EvWavrangeab = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_RANGEAB"); + EvWavprotab = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_PROTAB"); + //EvWavlevelshc = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_LEVELSHC"); + EvWavcomplexmet = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_COMPLEX"); + EvWavsigm = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSIGM"); + EvWavdenoise = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENOISE"); + //EvWavdenmethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENMET"); + EvWavmixmethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVMIXMET"); + EvWavquamethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVQUAMET"); + EvWavlevden = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLEVDEN"); + EvWavdenoiseh = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENOISEH"); + EvWavstrend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSTREND"); + EvWavdetend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDETEND"); + EvWavlevdenois = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVDENLH"); + EvWavslimethod = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVSLIMET"); + EvWavthrend = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVTHREND"); + EvWavguid = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVGUIDH"); + EvWavhue = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVHUE"); + EvWavthrden = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVTHRDEN"); + EvWavlevelsigm = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLEVELSIGM"); + EvWavlimden = m->newEvent(DIRPYREQUALIZER, "HISTORY_MSG_WAVLIMDEN"); - expsettings->signal_button_release_event().connect_notify( sigc::bind( sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings) ); - expcontrast->signal_button_release_event().connect_notify( sigc::bind( sigc::mem_fun(this, &Wavelet::foldAllButMe), expcontrast) ); - enableContrastConn = expcontrast->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expcontrast) ); + labgrid = Gtk::manage(new LabGrid(EvWavLabGridValue, M("TP_WAVELET_LABGRID_VALUES"))); - expchroma->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expchroma) ); - enableChromaConn = expchroma->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expchroma) ); + expsettings->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings)); - exptoning->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), exptoning) ); - enableToningConn = exptoning->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), exptoning) ); + expcontrast->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expcontrast)); + enableContrastConn = expcontrast->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expcontrast)); - expnoise->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expnoise) ); - enableNoiseConn = expnoise->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expnoise) ); + expchroma->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expchroma)); + enableChromaConn = expchroma->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expchroma)); - expedge->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expedge) ); - enableEdgeConn = expedge->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expedge) ); + exptoning->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), exptoning)); + enableToningConn = exptoning->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), exptoning)); - expgamut->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expgamut) ); + expnoise->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expnoise)); + enableNoiseConn = expnoise->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expnoise)); - expresid->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expresid) ); - enableResidConn = expresid->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expresid) ); + expedge->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expedge)); + enableEdgeConn = expedge->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expedge)); - expfinal->signal_button_release_event().connect_notify( sigc::bind ( sigc::mem_fun(this, &Wavelet::foldAllButMe), expfinal) ); - enableFinalConn = expfinal->signal_enabled_toggled().connect ( sigc::bind( sigc::mem_fun(this, &Wavelet::enableToggled), expfinal) ); + expbl->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expbl)); + enabletmConn = expbl->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expbl)); + + expgamut->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expgamut)); + + expresid->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expresid)); + enableResidConn = expresid->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expresid)); + + expfinal->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expfinal)); + enableFinalConn = expfinal->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expfinal)); + + expclari->signal_button_release_event().connect_notify(sigc::bind(sigc::mem_fun(this, &Wavelet::foldAllButMe), expclari)); + enableclariConn = expclari->signal_enabled_toggled().connect(sigc::bind(sigc::mem_fun(this, &Wavelet::enableToggled), expclari)); // Wavelet Settings - ToolParamBlock* const settingsBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const settingsBox = Gtk::manage(new ToolParamBlock()); - strength->setAdjusterListener (this); + strength->setAdjusterListener(this); - thres->set_tooltip_text (M("TP_WAVELET_LEVELS_TOOLTIP")); - thres->setAdjusterListener (this); + thres->set_tooltip_text(M("TP_WAVELET_LEVELS_TOOLTIP")); + thres->setAdjusterListener(this); - Tilesmethod->append (M("TP_WAVELET_TILESFULL")); - Tilesmethod->append (M("TP_WAVELET_TILESBIG")); - Tilesmethod->append (M("TP_WAVELET_TILESLIT")); - Tilesmethodconn = Tilesmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::TilesmethodChanged) ); - Tilesmethod->set_tooltip_text (M("TP_WAVELET_TILES_TOOLTIP")); - Gtk::HBox* const tilesizeHBox = Gtk::manage(new Gtk::HBox()); + complexmethod->append(M("TP_WAVELET_COMPNORMAL")); + complexmethod->append(M("TP_WAVELET_COMPEXPERT")); + complexmethodconn = complexmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::complexmethodChanged)); + complexmethod->set_tooltip_text(M("TP_WAVELET_COMPLEX_TOOLTIP")); + Gtk::Box* const complexHBox = Gtk::manage(new Gtk::Box()); + Gtk::Label* const complexLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_COMPLEXLAB") + ":")); + complexHBox->pack_start(*complexLabel, Gtk::PACK_SHRINK, 4); + complexHBox->pack_start(*complexmethod); + + + Tilesmethod->append(M("TP_WAVELET_TILESFULL")); + Tilesmethod->append(M("TP_WAVELET_TILESBIG")); +// Tilesmethod->append(M("TP_WAVELET_TILESLIT")); + Tilesmethodconn = Tilesmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::TilesmethodChanged)); + Tilesmethod->set_tooltip_text(M("TP_WAVELET_TILES_TOOLTIP")); + Gtk::Box* const tilesizeHBox = Gtk::manage(new Gtk::Box()); Gtk::Label* const tilesizeLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_TILESIZE") + ":")); tilesizeHBox->pack_start(*tilesizeLabel, Gtk::PACK_SHRINK, 4); tilesizeHBox->pack_start(*Tilesmethod); daubcoeffmethod->set_sensitive(true); - daubcoeffmethod->append (M("TP_WAVELET_DAUB2")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB4")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB6")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB10")); - daubcoeffmethod->append (M("TP_WAVELET_DAUB14")); - daubcoeffmethodconn = daubcoeffmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::daubcoeffmethodChanged) ); - daubcoeffmethod->set_tooltip_text (M("TP_WAVELET_DAUB_TOOLTIP")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB2")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB4")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB6")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB10")); + daubcoeffmethod->append(M("TP_WAVELET_DAUB14")); + daubcoeffmethodconn = daubcoeffmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::daubcoeffmethodChanged)); + daubcoeffmethod->set_tooltip_text(M("TP_WAVELET_DAUB_TOOLTIP")); Gtk::Label* const daubcoeffLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DAUB") + ":")); - Gtk::HBox* const daubcoeffHBox = Gtk::manage(new Gtk::HBox()); + Gtk::Box* const daubcoeffHBox = Gtk::manage(new Gtk::Box()); daubcoeffHBox->pack_start(*daubcoeffLabel, Gtk::PACK_SHRINK, 4); daubcoeffHBox->pack_start(*daubcoeffmethod); - Backmethod->append (M("TP_WAVELET_B0")); - Backmethod->append (M("TP_WAVELET_B1")); - Backmethod->append (M("TP_WAVELET_B2")); - Backmethodconn = Backmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::BackmethodChanged) ); - Gtk::HBox* const backgroundHBox = Gtk::manage(new Gtk::HBox()); + Backmethod->append(M("TP_WAVELET_B0")); + Backmethod->append(M("TP_WAVELET_B1")); + Backmethod->append(M("TP_WAVELET_B2")); + Backmethodconn = Backmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::BackmethodChanged)); + Gtk::Box* const backgroundHBox = Gtk::manage(new Gtk::Box()); Gtk::Label* const backgroundLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_BACKGROUND") + ":")); backgroundHBox->pack_start(*backgroundLabel, Gtk::PACK_SHRINK, 4); backgroundHBox->pack_start(*Backmethod); - CLmethod->append (M("TP_WAVELET_LEVDIR_ONE")); - CLmethod->append (M("TP_WAVELET_LEVDIR_INF")); - CLmethod->append (M("TP_WAVELET_LEVDIR_SUP")); - CLmethod->append (M("TP_WAVELET_LEVDIR_ALL")); - CLmethodconn = CLmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::CLmethodChanged) ); - Gtk::HBox* const levdirMainHBox = Gtk::manage(new Gtk::HBox()); + CLmethod->append(M("TP_WAVELET_LEVDIR_ONE")); + CLmethod->append(M("TP_WAVELET_LEVDIR_INF")); + CLmethod->append(M("TP_WAVELET_LEVDIR_SUP")); + CLmethod->append(M("TP_WAVELET_LEVDIR_ALL")); + CLmethodconn = CLmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::CLmethodChanged)); + Gtk::Box* const levdirMainHBox = Gtk::manage(new Gtk::Box()); Gtk::Label* const levdirMainLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_PROC") + ":")); levdirMainHBox->pack_start(*levdirMainLabel, Gtk::PACK_SHRINK, 4); levdirMainHBox->pack_start(*CLmethod); //same Lmethod->set_sensitive(false); - Lmethod->set_sensitive(false); - Lmethod->append (M("TP_WAVELET_1")); - Lmethod->append (M("TP_WAVELET_2")); - Lmethod->append (M("TP_WAVELET_3")); - Lmethod->append (M("TP_WAVELET_4")); - Lmethod->append (M("TP_WAVELET_5")); - Lmethod->append (M("TP_WAVELET_6")); - Lmethod->append (M("TP_WAVELET_7")); - Lmethod->append (M("TP_WAVELET_8")); - Lmethod->append (M("TP_WAVELET_9")); - Lmethod->append (M("TP_WAVELET_SUPE")); - Lmethod->append (M("TP_WAVELET_RESID")); + Lmethod->append(M("TP_WAVELET_1")); + Lmethod->append(M("TP_WAVELET_2")); + Lmethod->append(M("TP_WAVELET_3")); + Lmethod->append(M("TP_WAVELET_4")); + Lmethod->append(M("TP_WAVELET_5")); + Lmethod->append(M("TP_WAVELET_6")); + Lmethod->append(M("TP_WAVELET_7")); + Lmethod->append(M("TP_WAVELET_8")); + Lmethod->append(M("TP_WAVELET_9")); + Lmethod->append(M("TP_WAVELET_SUPE")); + Lmethod->append(M("TP_WAVELET_RESID")); Lmethod->set_active(0); Dirmethod->set_sensitive(false); - Dirmethod->append (M("TP_WAVELET_DONE")); - Dirmethod->append (M("TP_WAVELET_DTWO")); - Dirmethod->append (M("TP_WAVELET_DTHR")); - Dirmethod->append (M("TP_WAVELET_DALL")); - Lmethodconn = Lmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::LmethodChanged) ); - Dirmethodconn = Dirmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::DirmethodChanged) ); - Gtk::HBox* const levdirSubHBox = Gtk::manage(new Gtk::HBox()); + Dirmethod->append(M("TP_WAVELET_DONE")); + Dirmethod->append(M("TP_WAVELET_DTWO")); + Dirmethod->append(M("TP_WAVELET_DTHR")); + Dirmethod->append(M("TP_WAVELET_DALL")); + Lmethodconn = Lmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::LmethodChanged)); + Dirmethodconn = Dirmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::DirmethodChanged)); + Gtk::Box* const levdirSubHBox = Gtk::manage(new Gtk::Box()); levdirSubHBox->pack_start(*Lmethod); levdirSubHBox->pack_start(*Dirmethod, Gtk::PACK_EXPAND_WIDGET, 2); // same, but 2 not 4? + settingsBox->pack_start(*complexHBox); settingsBox->pack_start(*strength); settingsBox->pack_start(*thres); settingsBox->pack_start(*tilesizeHBox); @@ -258,147 +403,179 @@ Wavelet::Wavelet() : settingsBox->pack_start(*levdirSubHBox); // Contrast - ToolParamBlock* const levBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const levBox = Gtk::manage(new ToolParamBlock()); - Gtk::HBox* const buttonBox = Gtk::manage (new Gtk::HBox(true, 10)); + Gtk::Box* const buttonBox = Gtk::manage(new Gtk::Box()); + buttonBox->set_spacing(10); + buttonBox->set_homogeneous(true); levBox->pack_start(*buttonBox, Gtk::PACK_SHRINK, 2); - Gtk::Button* const contrastMinusButton = Gtk::manage (new Gtk::Button(M("TP_WAVELET_CONTRAST_MINUS"))); + Gtk::Button* const contrastMinusButton = Gtk::manage(new Gtk::Button(M("TP_WAVELET_CONTRAST_MINUS"))); buttonBox->pack_start(*contrastMinusButton); - contrastMinusPressedConn = contrastMinusButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::contrastMinusPressed)); + contrastMinusPressedConn = contrastMinusButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::contrastMinusPressed)); - Gtk::Button* const neutralButton = Gtk::manage (new Gtk::Button(M("TP_WAVELET_NEUTRAL"))); + Gtk::Button* const neutralButton = Gtk::manage(new Gtk::Button(M("TP_WAVELET_NEUTRAL"))); buttonBox->pack_start(*neutralButton); - neutralPressedConn = neutralButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::neutralPressed)); + neutralPressedConn = neutralButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutralPressed)); - Gtk::Button* const contrastPlusButton = Gtk::manage (new Gtk::Button(M("TP_WAVELET_CONTRAST_PLUS"))); + Gtk::Button* const contrastPlusButton = Gtk::manage(new Gtk::Button(M("TP_WAVELET_CONTRAST_PLUS"))); buttonBox->pack_start(*contrastPlusButton); - contrastPlusPressedConn = contrastPlusButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::contrastPlusPressed)); + contrastPlusPressedConn = contrastPlusButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::contrastPlusPressed)); buttonBox->show_all_children(); - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { Glib::ustring ss; - switch( i ) { - case 0: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); - break; + switch (i) { + case 0: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); + break; - case 8: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); - break; + case 8: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); + break; - default: - ss = Glib::ustring::compose( "%1", (i + 1)); + default: + ss = Glib::ustring::compose("%1", (i + 1)); } correction[i] = Gtk::manage(new Adjuster(std::move(ss), -100, 350, 1, 0)); correction[i]->setAdjusterListener(this); levBox->pack_start(*correction[i]); } - levBox->pack_start(*sup); - sup->setAdjusterListener (this); - wavLabels->show(); - levBox->pack_start (*wavLabels); + sup->setAdjusterListener(this); + Gtk::Separator* const separatorcont = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); + levBox->pack_start(*separatorcont); - Gtk::VBox* const contrastSHVBox = Gtk::manage(new Gtk::VBox); + sigma->setAdjusterListener(this); + levBox->pack_start(*sigma, Gtk::PACK_SHRINK); + offset->setAdjusterListener(this); + levBox->pack_start(*offset, Gtk::PACK_SHRINK); + sigma->set_tooltip_text(M("TP_WAVELET_SIGMA_TOOLTIP")); + offset->set_tooltip_text(M("TP_WAVELET_OFFSET_TOOLTIP")); + lowthr->setAdjusterListener(this); + lowthr->set_tooltip_text(M("TP_WAVELET_LOWTHR_TOOLTIP")); + levBox->pack_start(*lowthr, Gtk::PACK_SHRINK); + + wavLabels->show(); + levBox->pack_start(*wavLabels); + + Gtk::Box* const contrastSHVBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); contrastSHVBox->set_spacing(2); - HSmethod->append (M("TP_WAVELET_HS1")); - HSmethod->append (M("TP_WAVELET_HS2")); - HSmethodconn = HSmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::HSmethodChanged) ); + HSmethod->append(M("TP_WAVELET_HS1")); + HSmethod->append(M("TP_WAVELET_HS2")); + HSmethodconn = HSmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::HSmethodChanged)); const std::vector milestones2 = { GradientMilestone(0.0, 0.0, 0.0, 0.0), GradientMilestone(1.0, 1.0, 1.0, 1.0) }; - hllev->setAdjusterListener (this); + hllev->setAdjusterListener(this); hllev->setBgGradient(milestones2); - threshold->setAdjusterListener (this); - threshold->set_tooltip_text (M("TP_WAVELET_THRESHOLD_TOOLTIP")); + threshold->setAdjusterListener(this); + threshold->set_tooltip_text(M("TP_WAVELET_THRESHOLD_TOOLTIP")); - bllev->setAdjusterListener (this); + bllev->setAdjusterListener(this); bllev->setBgGradient(milestones2); - threshold2->setAdjusterListener (this); - threshold2->set_tooltip_text (M("TP_WAVELET_THRESHOLD2_TOOLTIP")); + threshold2->setAdjusterListener(this); + threshold2->set_tooltip_text(M("TP_WAVELET_THRESHOLD2_TOOLTIP")); + + const WaveletParams default_params; + + //curveEditorC->setCurveListener(this); + //curveEditorC->set_tooltip_text(M("TP_WAVELET_FINCOAR_TOOLTIP")); + + + //opacityShapeSH = static_cast(curveEditorC->addCurve(CT_Flat, "", nullptr, false, false)); + //opacityShapeSH->setIdentityValue(0.); + //opacityShapeSH->setResetCurve(FlatCurveType(default_params.opacityCurveSH.at(0)), default_params.opacityCurveSH); + + //curveEditorC->curveListComplete(); + //curveEditorC->show(); contrastSHVBox->pack_start(*HSmethod); contrastSHVBox->pack_start(*hllev); contrastSHVBox->pack_start(*threshold); contrastSHVBox->pack_start(*bllev); contrastSHVBox->pack_start(*threshold2); + // contrastSHVBox->pack_start(*curveEditorC); Gtk::Frame* const contrastSHFrame = Gtk::manage(new Gtk::Frame(M("TP_WAVELET_APPLYTO"))); contrastSHFrame->add(*contrastSHVBox); levBox->pack_start(*contrastSHFrame); // Chromaticity - ToolParamBlock* const chBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const chBox = Gtk::manage(new ToolParamBlock()); Gtk::Label* const labmch = Gtk::manage(new Gtk::Label(M("TP_WAVELET_CHTYPE") + ":")); - Gtk::HBox* const ctboxch = Gtk::manage(new Gtk::HBox()); - ctboxch->pack_start (*labmch, Gtk::PACK_SHRINK, 1); +// Gtk::Box* const ctboxch = Gtk::manage(new Gtk::Box()); + ctboxch->pack_start(*labmch, Gtk::PACK_SHRINK, 1); - CHmethod->append (M("TP_WAVELET_CH1")); - CHmethod->append (M("TP_WAVELET_CH2")); - CHmethod->append (M("TP_WAVELET_CH3")); - CHmethodconn = CHmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::CHmethodChanged) ); + CHmethod->append(M("TP_WAVELET_CH1")); + CHmethod->append(M("TP_WAVELET_CH2")); + CHmethod->append(M("TP_WAVELET_CH3")); + CHmethodconn = CHmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::CHmethodChanged)); ctboxch->pack_start(*CHmethod); chBox->pack_start(*ctboxch); - Gtk::HBox* const ctboxCH = Gtk::manage(new Gtk::HBox()); - ctboxCH->pack_start (*labmC, Gtk::PACK_SHRINK, 1); + Gtk::Box* const ctboxCH = Gtk::manage(new Gtk::Box()); + ctboxCH->pack_start(*labmC, Gtk::PACK_SHRINK, 1); - CHSLmethod->append (M("TP_WAVELET_CHSL")); - CHSLmethod->append (M("TP_WAVELET_CHCU")); - CHSLmethodconn = CHSLmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::CHSLmethodChanged) ); + CHSLmethod->append(M("TP_WAVELET_CHSL")); + CHSLmethod->append(M("TP_WAVELET_CHCU")); + CHSLmethodconn = CHSLmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::CHSLmethodChanged)); ctboxCH->pack_start(*CHSLmethod); - Gtk::HSeparator* const separatorChromaMethod = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* const separatorChromaMethod = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); chBox->pack_start(*separatorChromaMethod, Gtk::PACK_SHRINK, 2); - chroma->set_tooltip_text (M("TP_WAVELET_CHRO_TOOLTIP")); + chroma->set_tooltip_text(M("TP_WAVELET_CHRO_TOOLTIP")); chBox->pack_start(*chroma); - chroma->setAdjusterListener (this); + chroma->setAdjusterListener(this); - satlev->setAdjusterListener (this); + satlev->setAdjusterListener(this); satlev->setBgGradient(milestones2); - pastlev->setAdjusterListener (this); + pastlev->setAdjusterListener(this); pastlev->setBgGradient(milestones2); chBox->pack_start(*pastlev); chBox->pack_start(*satlev); - chro->set_tooltip_text (M("TP_WAVELET_CHR_TOOLTIP")); + chro->set_tooltip_text(M("TP_WAVELET_CHR_TOOLTIP")); + chro->setAdjusterListener(this); + sigmacol->setAdjusterListener(this); chBox->pack_start(*chro); - chro->setAdjusterListener (this); + chBox->pack_start(*sigmacol); - Gtk::HBox* const buttonchBox = Gtk::manage (new Gtk::HBox(true, 10)); - neutralchPressedConn = neutralchButton->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::neutralchPressed)); + Gtk::Box* const buttonchBox = Gtk::manage(new Gtk::Box()); + buttonchBox->set_spacing(10); + buttonchBox->set_homogeneous(true); + neutralchPressedConn = neutralchButton->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutralchPressed)); chBox->pack_start(*separatorNeutral, Gtk::PACK_SHRINK, 2); buttonchBox->pack_start(*neutralchButton); buttonchBox->show_all_children(); chBox->pack_start(*buttonchBox, Gtk::PACK_SHRINK, 2); - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { Glib::ustring ss; - switch( i ) { - case 0: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); - break; + switch (i) { + case 0: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_FINEST")); + break; - case 8: - ss = Glib::ustring::compose( "%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); - break; + case 8: + ss = Glib::ustring::compose("%1 (%2)", (i + 1), M("TP_WAVELET_LARGEST")); + break; - default: - ss = Glib::ustring::compose( "%1", (i + 1)); + default: + ss = Glib::ustring::compose("%1", (i + 1)); } correctionch[i] = Gtk::manage(new Adjuster(std::move(ss), -100, 100, 1, 0)); @@ -407,101 +584,275 @@ Wavelet::Wavelet() : } // Toning - ToolParamBlock* const tonBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const tonBox = Gtk::manage(new ToolParamBlock()); + sigmaton->setAdjusterListener(this); + rangeab->setAdjusterListener(this); + protab->setAdjusterListener(this); - opaCurveEditorG->setCurveListener (this); + opaCurveEditorG->setCurveListener(this); - const WaveletParams default_params; +// const WaveletParams default_params; opacityShapeRG = static_cast(opaCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeRG->setIdentityValue(0.); opacityShapeRG->setResetCurve(FlatCurveType(default_params.opacityCurveRG.at(0)), default_params.opacityCurveRG); + //from green to magenta + std::vector mileston = { + GradientMilestone(0., 0., 1., 0.), + GradientMilestone(1., 1., 0., 1.) + }; + opacityShapeRG->setLeftBarBgGradient(mileston); opaCurveEditorG->curveListComplete(); opaCurveEditorG->show(); + tonBox->pack_start(*sigmaton); + + tonFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const ton2Box = Gtk::manage(new ToolParamBlock()); + ton2Box->pack_start(*labgrid, Gtk::PACK_EXPAND_WIDGET, 2); + ton2Box->pack_start(*rangeab); + ton2Box->pack_start(*protab); + tonFrame->add(*ton2Box); + tonBox->pack_start(*tonFrame); - tonBox->pack_start( *opaCurveEditorG, Gtk::PACK_SHRINK, 2); + tonBox->pack_start(*opaCurveEditorG, Gtk::PACK_SHRINK, 2); - opacityCurveEditorG->setCurveListener (this); + opacityCurveEditorG->setCurveListener(this); opacityShapeBY = static_cast(opacityCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeBY->setIdentityValue(0.); opacityShapeBY->setResetCurve(FlatCurveType(default_params.opacityCurveBY.at(0)), default_params.opacityCurveBY); + //from blue to yellow + mileston = { + GradientMilestone(0., 0., 0., 1.), + GradientMilestone(1., 1., 1., 0.) + }; + opacityShapeBY->setLeftBarBgGradient(mileston); opacityCurveEditorG->curveListComplete(); opacityCurveEditorG->show(); - tonBox->pack_start( *opacityCurveEditorG, Gtk::PACK_SHRINK, 2); + tonBox->pack_start(*opacityCurveEditorG, Gtk::PACK_SHRINK, 2); // Denoise and Refine - ToolParamBlock* const noiseBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const noiseBox = Gtk::manage(new ToolParamBlock()); - linkedg->set_active (true); - linkedgConn = linkedg->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::linkedgToggled) ); + linkedg->set_active(false); + linkedgConn = linkedg->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::linkedgToggled)); noiseBox->pack_start(*linkedg); - level0noise->setAdjusterListener (this); + level0noise->setAdjusterListener(this); level0noise->setUpdatePolicy(RTUP_DYNAMIC); - level1noise->setAdjusterListener (this); + level1noise->setAdjusterListener(this); level1noise->setUpdatePolicy(RTUP_DYNAMIC); - level2noise->setAdjusterListener (this); + level2noise->setAdjusterListener(this); level2noise->setUpdatePolicy(RTUP_DYNAMIC); - level3noise->setAdjusterListener (this); + level3noise->setAdjusterListener(this); level3noise->setUpdatePolicy(RTUP_DYNAMIC); - noiseBox->pack_start( *level0noise, Gtk::PACK_SHRINK, 0); - noiseBox->pack_start( *level1noise, Gtk::PACK_SHRINK, 0); - noiseBox->pack_start( *level2noise, Gtk::PACK_SHRINK, 0); - noiseBox->pack_start( *level3noise, Gtk::PACK_SHRINK, 0); + leveldenoise->setAdjusterListener(this); + leveldenoise->setUpdatePolicy(RTUP_DYNAMIC); + + levelsigm->setAdjusterListener(this); + levelsigm->setUpdatePolicy(RTUP_DYNAMIC); + + ballum->setAdjusterListener(this); + sigm->setAdjusterListener(this); + levden->setAdjusterListener(this); + thrden->setAdjusterListener(this); + limden->setAdjusterListener(this); + CurveEditorwavnoise->setCurveListener(this); + CurveEditorwavnoiseh->setCurveListener(this); + CurveEditorwavguid->setCurveListener(this); + CurveEditorwavhue->setCurveListener(this); + + quamethod->append(M("TP_WAVELET_QUACONSER")); + quamethod->append(M("TP_WAVELET_QUAAGRES")); + quamethodconn = quamethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::quamethodChanged)); +// quamethod->set_tooltip_text(M("TP_WAVELET_DENQUA_TOOLTIP")); + Gtk::Label* const quaLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENQUA") + ":")); + quaHBox->pack_start(*quaLabel, Gtk::PACK_SHRINK, 4); + quaHBox->pack_start(*quamethod); + + slimethod->append(M("TP_WAVELET_DENSLI")); + slimethod->append(M("TP_WAVELET_DENCURV")); + slimethodconn = slimethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::slimethodChanged)); +// slimethod->set_tooltip_text(M("TP_WAVELET_DENSLI_TOOLTIP")); + Gtk::Label* const sliLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENSLILAB") + ":")); + sliHBox->pack_start(*sliLabel, Gtk::PACK_SHRINK, 4); + sliHBox->pack_start(*slimethod); + + + //denmethod->append(M("TP_WAVELET_DENEQUAL")); + //denmethod->append(M("TP_WAVELET_DEN14PLUS")); + //denmethod->append(M("TP_WAVELET_DEN14LOW")); + //denmethod->append(M("TP_WAVELET_DEN12PLUS")); + //denmethod->append(M("TP_WAVELET_DEN12LOW")); + //denmethodconn = denmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::denmethodChanged)); + //denmethod->set_tooltip_text(M("TP_WAVELET_DENEQUAL_TOOLTIP")); +// Gtk::Box* const denHBox = Gtk::manage(new Gtk::Box()); + //Gtk::Label* const denLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_DENCONTRAST") + ":")); + //denHBox->pack_start(*denLabel, Gtk::PACK_SHRINK, 4); + //denHBox->pack_start(*denmethod); + + mixmethod->append(M("TP_WAVELET_MIXNOISE")); + mixmethod->append(M("TP_WAVELET_MIXMIX")); + mixmethod->append(M("TP_WAVELET_MIXMIX70")); + mixmethod->append(M("TP_WAVELET_MIXDENOISE")); + mixmethodconn = mixmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::mixmethodChanged)); + mixmethod->set_tooltip_text(M("TP_WAVELET_DENMIX_TOOLTIP")); + Gtk::Label* const mixLabel = Gtk::manage(new Gtk::Label(M("TP_WAVELET_MIXCONTRAST") + ":")); + mixHBox->pack_start(*mixLabel, Gtk::PACK_SHRINK, 4); + mixHBox->pack_start(*mixmethod); + + wavdenoise = static_cast(CurveEditorwavnoise->addCurve(CT_Flat, "", nullptr, false, false)); + wavdenoise->setIdentityValue(0.); + wavdenoise->setResetCurve(FlatCurveType(default_params.wavdenoise.at(0)), default_params.wavdenoise); + CurveEditorwavnoise->set_tooltip_text(M("TP_WAVELET_DENLOCAL_TOOLTIP")); + + CurveEditorwavnoise->curveListComplete(); + CurveEditorwavnoise->show(); + const std::vector milestones4 = makeWholeHueRange(); + + wavdenoiseh = static_cast(CurveEditorwavnoiseh->addCurve(CT_Flat, "", nullptr, false, false)); + wavdenoiseh->setIdentityValue(0.); + wavdenoiseh->setResetCurve(FlatCurveType(default_params.wavdenoiseh.at(0)), default_params.wavdenoiseh); + CurveEditorwavnoiseh->set_tooltip_text(M("TP_WAVELET_DENLOCAL_TOOLTIP")); + CurveEditorwavnoiseh->curveListComplete(); + CurveEditorwavnoiseh->show(); + + wavhue = static_cast(CurveEditorwavhue->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); +// wavhue->setTooltip(M("TP_WAVELET_WAVHUE_HH_TOOLTIP")); + wavhue->setCurveColorProvider(this, 5); + CurveEditorwavhue->set_tooltip_text(M("TP_WAVELET_DENWAVHUE_TOOLTIP")); + CurveEditorwavhue->curveListComplete(); + wavhue->setBottomBarBgGradient(milestones4); + + + + + wavguidf = static_cast(CurveEditorwavguid->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); +// wavguidf->setTooltip(M("TP_WAVELET_WAVGUID_HH_TOOLTIP")); + wavguidf->setCurveColorProvider(this, 5); + CurveEditorwavguid->set_tooltip_text(M("TP_WAVELET_DENWAVGUID_TOOLTIP")); + CurveEditorwavguid->curveListComplete(); + wavguidf->setBottomBarBgGradient(milestones4); + + + + levelsigm->set_tooltip_text(M("TP_WAVELET_DENSIGMA_TOOLTIP")); +// levden->set_tooltip_text(M("TP_WAVELET_DENLEV_TOOLTIP")); + thrden->set_tooltip_text(M("TP_WAVELET_THRDEN_TOOLTIP")); +// limden->set_tooltip_text(M("TP_WAVELET_LIMDEN_TOOLTIP")); + + noiseBox->pack_start(*ballum); + noiseBox->pack_start(*CurveEditorwavhue); + noiseBox->pack_start(*level0noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*level1noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*level2noise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*level3noise, Gtk::PACK_SHRINK, 0); + // noiseBox->pack_start(*levden); + noiseBox->pack_start(*leveldenoise, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*thrden); + noiseBox->pack_start(*quaHBox); + noiseBox->pack_start(*sliHBox); + //noiseBox->pack_start(*denHBox); + noiseBox->pack_start(*mixHBox); + noiseBox->pack_start(*levelsigm, Gtk::PACK_SHRINK, 0); + noiseBox->pack_start(*limden); + noiseBox->pack_start(*sigm); + noiseBox->pack_start(*CurveEditorwavnoise); +// noiseBox->pack_start(*CurveEditorwavnoiseh); + + + balchrom->setAdjusterListener(this); + chromfi->setAdjusterListener(this); + chromco->setAdjusterListener(this); + + chroFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const chroBox = Gtk::manage(new ToolParamBlock()); + chroBox->pack_start(*balchrom); + chroBox->pack_start(*chromfi); + chroBox->pack_start(*chromco); + chroFrame->add(*chroBox); + noiseBox->pack_start(*chroFrame); +// noiseBox->set_tooltip_text(M("TP_WAVELET_NOISE_TOOLTIP")); + + +//Clarity + mergeL->setAdjusterListener(this); + mergeC->setAdjusterListener(this); + softrad->setAdjusterListener(this); + showmask->set_active(false); + showmaskConn = showmask->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::showmaskToggled)); + + ToolParamBlock* const clariBox = Gtk::manage(new ToolParamBlock()); + // ushamethod->append(M("TP_WAVELET_USH")); + ushamethod->append(M("TP_WAVELET_SHA")); + ushamethod->append(M("TP_WAVELET_CLA")); + ushamethodconn = ushamethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::ushamethodChanged)); + ushamethod->set_tooltip_text(M("TP_WAVELET_USH_TOOLTIP")); + usharpHBox->pack_start(*usharpLabel, Gtk::PACK_SHRINK, 0); + usharpHBox->pack_start(*ushamethod); + + clariBox->pack_start(*usharpHBox); + clariBox->pack_start(*mergeL); + clariBox->pack_start(*mergeC); + clariBox->pack_start(*softrad); + clariBox->pack_start(*showmask); // Edge Sharpness - ToolParamBlock* const edgBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const edgBox = Gtk::manage(new ToolParamBlock()); edgval->setAdjusterListener(this); edgBox->pack_start(*edgval); + edgeffect->setAdjusterListener(this); + edgBox->pack_start(*edgeffect); + edgeffect->set_tooltip_markup(M("TP_WAVELET_EDEFFECT_TOOLTIP")); + edgrad->setAdjusterListener(this); edgBox->pack_start(*edgrad); - edgrad->set_tooltip_markup (M("TP_WAVELET_EDRAD_TOOLTIP")); + edgrad->set_tooltip_markup(M("TP_WAVELET_EDRAD_TOOLTIP")); - edgthresh->setAdjusterListener (this); - edgthresh->set_tooltip_markup (M("TP_WAVELET_EDGTHRESH_TOOLTIP")); - edgBox->pack_start (*edgthresh); + edgthresh->setAdjusterListener(this); + edgthresh->set_tooltip_markup(M("TP_WAVELET_EDGTHRESH_TOOLTIP")); + edgBox->pack_start(*edgthresh); Gtk::Label* const labmedgr = Gtk::manage(new Gtk::Label(M("TP_WAVELET_MEDGREINF") + ":")); - Gtk::HBox* const edbox = Gtk::manage(new Gtk::HBox()); - edbox->pack_start (*labmedgr, Gtk::PACK_SHRINK, 1); + Gtk::Box* const edbox = Gtk::manage(new Gtk::Box()); + edbox->pack_start(*labmedgr, Gtk::PACK_SHRINK, 1); - Medgreinf->append (M("TP_WAVELET_RE1")); - Medgreinf->append (M("TP_WAVELET_RE2")); - Medgreinf->append (M("TP_WAVELET_RE3")); - MedgreinfConn = Medgreinf->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::MedgreinfChanged) ); - Medgreinf->set_tooltip_markup (M("TP_WAVELET_EDGREINF_TOOLTIP")); + Medgreinf->append(M("TP_WAVELET_RE1")); + Medgreinf->append(M("TP_WAVELET_RE2")); + Medgreinf->append(M("TP_WAVELET_RE3")); + MedgreinfConn = Medgreinf->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::MedgreinfChanged)); + Medgreinf->set_tooltip_markup(M("TP_WAVELET_EDGREINF_TOOLTIP")); edbox->pack_start(*Medgreinf); edgBox->pack_start(*edbox); - Gtk::HSeparator* const separatorlc = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* const separatorlc = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); edgBox->pack_start(*separatorlc, Gtk::PACK_SHRINK, 2); Gtk::Label* const labmED = Gtk::manage(new Gtk::Label(M("TP_WAVELET_EDTYPE") + ":")); - Gtk::HBox* const ctboxED = Gtk::manage(new Gtk::HBox()); - ctboxED->pack_start (*labmED, Gtk::PACK_SHRINK, 1); + Gtk::Box* const ctboxED = Gtk::manage(new Gtk::Box()); + ctboxED->pack_start(*labmED, Gtk::PACK_SHRINK, 1); - EDmethod->append (M("TP_WAVELET_EDSL")); - EDmethod->append (M("TP_WAVELET_EDCU")); - EDmethodconn = EDmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::EDmethodChanged) ); + EDmethod->append(M("TP_WAVELET_EDSL")); + EDmethod->append(M("TP_WAVELET_EDCU")); + EDmethodconn = EDmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::EDmethodChanged)); ctboxED->pack_start(*EDmethod); - edgBox->pack_start (*ctboxED); + // edgBox->pack_start(*ctboxED); - edgcont->setAdjusterListener (this); + edgcont->setAdjusterListener(this); edgcont->setBgGradient(milestones2); - edgcont->set_tooltip_markup (M("TP_WAVELET_EDGCONT_TOOLTIP")); + edgcont->set_tooltip_markup(M("TP_WAVELET_EDGCONT_TOOLTIP")); // <-- Edge Sharpness Local Contrast curve - CCWcurveEditorG->setCurveListener (this); + CCWcurveEditorG->setCurveListener(this); ccshape = static_cast(CCWcurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); @@ -513,70 +864,94 @@ Wavelet::Wavelet() : CCWcurveEditorG->show(); // --> - edgBox->pack_start (*edgcont); + edgBox->pack_start(*edgcont); edgBox->pack_start(*CCWcurveEditorG, Gtk::PACK_SHRINK, 4); - medianlev->set_active (true); - medianlevConn = medianlev->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::medianlevToggled) ); - medianlev->set_tooltip_text (M("TP_WAVELET_MEDILEV_TOOLTIP")); + medianlev->set_active(true); + medianlevConn = medianlev->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::medianlevToggled)); + medianlev->set_tooltip_text(M("TP_WAVELET_MEDILEV_TOOLTIP")); - Gtk::HSeparator* const separatored1 = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* const separatored1 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); edgBox->pack_start(*separatored1, Gtk::PACK_SHRINK, 2); - Gtk::HBox* const eddebox = Gtk::manage(new Gtk::HBox()); - edgBox->pack_start (*eddebox); + Gtk::Box* const eddebox = Gtk::manage(new Gtk::Box()); + edgBox->pack_start(*eddebox); edgBox->pack_start(*medianlev); - edgedetect->setAdjusterListener (this); - edgedetect->set_tooltip_text (M("TP_WAVELET_EDGEDETECT_TOOLTIP")); + edgedetect->setAdjusterListener(this); + edgedetect->set_tooltip_text(M("TP_WAVELET_EDGEDETECT_TOOLTIP")); edgBox->pack_start(*edgedetect); - edgedetectthr->setAdjusterListener (this); - edgedetectthr->set_tooltip_text (M("TP_WAVELET_EDGEDETECTTHR_TOOLTIP")); + edgedetectthr->setAdjusterListener(this); + edgedetectthr->set_tooltip_text(M("TP_WAVELET_EDGEDETECTTHR_TOOLTIP")); edgBox->pack_start(*edgedetectthr); - edgedetectthr2->setAdjusterListener (this); + edgedetectthr2->setAdjusterListener(this); edgBox->pack_start(*edgedetectthr2); edgBox->pack_start(*separatoredge, Gtk::PACK_SHRINK, 2); - lipst->set_active (true); - lipstConn = lipst->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::lipstToggled) ); + lipst->set_active(true); + lipstConn = lipst->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::lipstToggled)); // lipst->set_tooltip_text (M("TP_WAVELET_LIPST_TOOLTIP")); edgBox->pack_start(*lipst); - edgesensi->setAdjusterListener (this); + edgesensi->setAdjusterListener(this); edgBox->pack_start(*edgesensi); - edgeampli->setAdjusterListener (this); + edgeampli->setAdjusterListener(this); edgBox->pack_start(*edgeampli); - Gtk::VBox* const ctboxES = Gtk::manage (new Gtk::VBox()); + Gtk::Box* const ctboxES = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); ctboxES->set_spacing(2); - Gtk::HBox* const ctboxNP = Gtk::manage(new Gtk::HBox()); - ctboxNP->pack_start (*labmNP, Gtk::PACK_SHRINK, 1); + Gtk::Box* const ctboxNP = Gtk::manage(new Gtk::Box()); + ctboxNP->pack_start(*labmNP, Gtk::PACK_SHRINK, 1); - NPmethod->append (M("TP_WAVELET_NPNONE")); - NPmethod->append (M("TP_WAVELET_NPLOW")); - NPmethod->append (M("TP_WAVELET_NPHIGH")); - NPmethodconn = NPmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::NPmethodChanged) ); - NPmethod->set_tooltip_text (M("TP_WAVELET_NPTYPE_TOOLTIP")); + NPmethod->append(M("TP_WAVELET_NPNONE")); + NPmethod->append(M("TP_WAVELET_NPLOW")); + NPmethod->append(M("TP_WAVELET_NPHIGH")); + NPmethodconn = NPmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::NPmethodChanged)); + NPmethod->set_tooltip_text(M("TP_WAVELET_NPTYPE_TOOLTIP")); ctboxNP->pack_start(*NPmethod); ctboxES->pack_start(*ctboxNP); edgBox->pack_start(*ctboxES); -// Gamut - ToolParamBlock* const conBox = Gtk::manage (new ToolParamBlock()); +//Blur Wavelet + ToolParamBlock* const blBox = Gtk::manage(new ToolParamBlock()); + + curveEditorbl->setCurveListener(this); - median->set_active (true); - medianConn = median->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::medianToggled) ); + blshape = static_cast(curveEditorbl->addCurve(CT_Flat, "", nullptr, false, false)); + + blshape->setIdentityValue(0.); + blshape->setResetCurve(FlatCurveType(default_params.blcurve.at(0)), default_params.blcurve); + blshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_BL_TOOLTIP")); + + curveEditorbl->curveListComplete(); + curveEditorbl->show(); + + blBox->pack_start(*bluwav); + bluwav->setAdjusterListener(this); + blBox->pack_start(*curveEditorbl, Gtk::PACK_SHRINK, 4); + + + chrwav->setAdjusterListener(this); + blBox->pack_start(*chrwav); + + + +// Gamut + ToolParamBlock* const conBox = Gtk::manage(new ToolParamBlock()); + + median->set_active(true); + medianConn = median->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::medianToggled)); conBox->pack_start(*median); - hueskin->set_tooltip_markup (M("TP_WAVELET_HUESKIN_TOOLTIP")); + hueskin->set_tooltip_markup(M("TP_WAVELET_HUESKIN_TOOLTIP")); //from -PI to +PI (radians) convert to hsv and draw bottombar const std::vector milestones = { @@ -599,13 +974,13 @@ Wavelet::Wavelet() : hueskin->setBgGradient(milestones); conBox->pack_start(*hueskin); - hueskin->setAdjusterListener (this); + hueskin->setAdjusterListener(this); skinprotect->setAdjusterListener(this); conBox->pack_start(*skinprotect); - skinprotect->set_tooltip_markup (M("TP_WAVELET_SKIN_TOOLTIP")); + skinprotect->set_tooltip_markup(M("TP_WAVELET_SKIN_TOOLTIP")); - curveEditorGAM->setCurveListener (this); + curveEditorGAM->setCurveListener(this); Chshape = static_cast(curveEditorGAM->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_CH"))); Chshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CH_TOOLTIP")); @@ -613,74 +988,118 @@ Wavelet::Wavelet() : curveEditorGAM->curveListComplete(); Chshape->setBottomBarBgGradient(milestones); - conBox->pack_start (*curveEditorGAM, Gtk::PACK_SHRINK, 4); + conBox->pack_start(*curveEditorGAM, Gtk::PACK_SHRINK, 4); - avoid->set_active (true); - avoidConn = avoid->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::avoidToggled) ); + avoid->set_active(true); + avoidConn = avoid->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::avoidToggled)); conBox->pack_start(*avoid); // Residual Image - ToolParamBlock* const resBox = Gtk::manage (new ToolParamBlock()); + ToolParamBlock* const resBox = Gtk::manage(new ToolParamBlock()); + oldsh->set_active(true); + oldshConn = oldsh->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::oldshToggled)); - rescon->setAdjusterListener (this); - resBox->pack_start(*rescon, Gtk::PACK_SHRINK); - resBox->pack_start(*thr); - thr->setAdjusterListener (this); + rescon->setAdjusterListener(this); - resconH->setAdjusterListener (this); - resBox->pack_start(*resconH, Gtk::PACK_SHRINK); + thr->setAdjusterListener(this); - thrH->setAdjusterListener (this); - resBox->pack_start(*thrH, Gtk::PACK_SHRINK); + resconH->setAdjusterListener(this); - contrast->set_tooltip_text (M("TP_WAVELET_CONTRA_TOOLTIP")); - contrast->setAdjusterListener (this); - resBox->pack_start(*contrast); //keep the possibility to reinstall + thrH->setAdjusterListener(this); - reschro->setAdjusterListener (this); - resBox->pack_start(*reschro); + radius->setAdjusterListener(this); +// radius->hide(); + shFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const shBox = Gtk::manage(new ToolParamBlock()); + shBox->pack_start(*oldsh); + shBox->pack_start(*rescon, Gtk::PACK_SHRINK); + shBox->pack_start(*thr); + shBox->pack_start(*resconH, Gtk::PACK_SHRINK); + shBox->pack_start(*thrH, Gtk::PACK_SHRINK); + shBox->pack_start(*radius, Gtk::PACK_SHRINK); + shFrame->add(*shBox); + resBox->pack_start(*shFrame); + + + contrast->set_tooltip_text(M("TP_WAVELET_CONTRA_TOOLTIP")); + contrast->setAdjusterListener(this); + + reschro->setAdjusterListener(this); + resblur->setAdjusterListener(this); + resblurc->setAdjusterListener(this); + + blurFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const blurBox = Gtk::manage(new ToolParamBlock()); + blurBox->pack_start(*resblur); + blurBox->pack_start(*resblurc); + blurFrame->add(*blurBox); + resblur->set_tooltip_text(M("TP_WAVELET_RESBLUR_TOOLTIP")); + resblurc->set_tooltip_text(M("TP_WAVELET_RESBLUR_TOOLTIP")); + + chromaFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const chromaBox = Gtk::manage(new ToolParamBlock()); + chromaBox->pack_start(*reschro); + chromaBox->pack_start(*hueskin2); + chromaBox->pack_start(*sky); + chromaFrame->add(*chromaBox); Gtk::Label* const labmTM = Gtk::manage(new Gtk::Label(M("TP_WAVELET_TMTYPE") + ":")); - Gtk::HBox* const ctboxTM = Gtk::manage(new Gtk::HBox()); - ctboxTM->pack_start (*labmTM, Gtk::PACK_SHRINK, 1); + Gtk::Box* const ctboxTM = Gtk::manage(new Gtk::Box()); + ctboxTM->pack_start(*labmTM, Gtk::PACK_SHRINK, 1); - Gtk::HSeparator* const separatorR0 = Gtk::manage (new Gtk::HSeparator()); - resBox->pack_start(*separatorR0, Gtk::PACK_SHRINK, 2); +// Gtk::Separator* const separatorR0 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); +// resBox->pack_start(*separatorR0, Gtk::PACK_SHRINK, 2); - TMmethod->append (M("TP_WAVELET_COMPCONT")); - TMmethod->append (M("TP_WAVELET_COMPTM")); - TMmethodconn = TMmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::TMmethodChanged) ); + TMmethod->append(M("TP_WAVELET_COMPCONT")); + TMmethod->append(M("TP_WAVELET_COMPTM")); + TMmethodconn = TMmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::TMmethodChanged)); ctboxTM->pack_start(*TMmethod); - resBox->pack_start (*ctboxTM); - tmrs->set_tooltip_text (M("TP_WAVELET_TMSTRENGTH_TOOLTIP")); + tmrs->set_tooltip_text(M("TP_WAVELET_TMSTRENGTH_TOOLTIP")); - resBox->pack_start(*tmrs); - tmrs->setAdjusterListener (this); + tmrs->setAdjusterListener(this); - gamma->set_tooltip_text (M("TP_WAVELET_COMPGAMMA_TOOLTIP")); - resBox->pack_start(*gamma); - gamma->setAdjusterListener (this); + gamma->set_tooltip_text(M("TP_WAVELET_COMPGAMMA_TOOLTIP")); + gamma->setAdjusterListener(this); - Gtk::HSeparator* const separatorR1 = Gtk::manage (new Gtk::HSeparator()); - resBox->pack_start(*separatorR1, Gtk::PACK_SHRINK, 2); + //edgs->set_tooltip_text(M("TP_WAVELET_TMEDGS_TOOLTIP")); - hueskin2->set_tooltip_markup (M("TP_WAVELET_HUESKY_TOOLTIP")); + edgs->setAdjusterListener(this); + + //scale->set_tooltip_text(M("TP_WAVELET_TMSCALE_TOOLTIP")); + + scale->setAdjusterListener(this); + + contFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const contBox = Gtk::manage(new ToolParamBlock()); + contBox->pack_start(*contrast); //keep the possibility to reinstall + contBox->pack_start(*ctboxTM); + contBox->pack_start(*tmrs); + contBox->pack_start(*gamma); + contBox->pack_start(*edgs); + contBox->pack_start(*scale); + contFrame->add(*contBox); + resBox->pack_start(*contFrame); + +// Gtk::Separator* const separatorR1 = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); +// resBox->pack_start(*separatorR1, Gtk::PACK_SHRINK, 2); + + hueskin2->set_tooltip_markup(M("TP_WAVELET_HUESKY_TOOLTIP")); hueskin2->setBgGradient(milestones); - resBox->pack_start(*hueskin2); - hueskin2->setAdjusterListener (this); + hueskin2->setAdjusterListener(this); - sky->set_tooltip_text (M("TP_WAVELET_SKY_TOOLTIP")); - sky->setAdjusterListener (this); + sky->set_tooltip_text(M("TP_WAVELET_SKY_TOOLTIP")); + sky->setAdjusterListener(this); - resBox->pack_start(*sky); // whole hue range const std::vector milestones3 = makeWholeHueRange(); - curveEditorRES->setCurveListener (this); + curveEditorRES->setCurveListener(this); + resBox->pack_start(*blurFrame); + resBox->pack_start(*chromaFrame); hhshape = static_cast(curveEditorRES->addCurve(CT_Flat, M("TP_WAVELET_CURVEEDITOR_HH"))); hhshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_HH_TOOLTIP")); @@ -688,54 +1107,54 @@ Wavelet::Wavelet() : curveEditorRES->curveListComplete(); hhshape->setBottomBarBgGradient(milestones3); - resBox->pack_start (*curveEditorRES, Gtk::PACK_SHRINK, 4); + resBox->pack_start(*curveEditorRES, Gtk::PACK_SHRINK, 4); // Toning and Color Balance - Gtk::HSeparator* const separatorCB = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator* const separatorCB = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); - Gtk::VBox* const chanMixerHLBox = Gtk::manage (new Gtk::VBox()); - Gtk::VBox* const chanMixerMidBox = Gtk::manage (new Gtk::VBox()); - Gtk::VBox* const chanMixerShadowsBox = Gtk::manage (new Gtk::VBox()); + Gtk::Box* const chanMixerHLBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* const chanMixerMidBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + Gtk::Box* const chanMixerShadowsBox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - cbenab->set_active (true); - cbenabConn = cbenab->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::cbenabToggled) ); - cbenab->set_tooltip_text (M("TP_WAVELET_CB_TOOLTIP")); + cbenab->set_active(true); + 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 ("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 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 ("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 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 ("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")); + 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)); - greenmed = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., igreenRm, imagLm)); - bluemed = Gtk::manage (new Adjuster ("", -100., 100., 1., 0. , iblueRm , iyelLm)); - greenlow = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., igreenR, imagL)); - bluelow = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., iblueR , iyelL)); + greenhigh = Gtk::manage(new Adjuster("", -100., 100., 1., 0., igreenRh, imagLh)); + bluehigh = Gtk::manage(new Adjuster("", -100., 100., 1., 0., iblueRh, iyelLh)); + greenmed = Gtk::manage(new Adjuster("", -100., 100., 1., 0., igreenRm, imagLm)); + bluemed = Gtk::manage(new Adjuster("", -100., 100., 1., 0., iblueRm, iyelLm)); + greenlow = Gtk::manage(new Adjuster("", -100., 100., 1., 0., igreenR, imagL)); + bluelow = Gtk::manage(new Adjuster("", -100., 100., 1., 0., iblueR, iyelL)); - chanMixerHLBox->pack_start (*greenhigh); - chanMixerHLBox->pack_start (*bluehigh); - chanMixerMidBox->pack_start (*greenmed); - chanMixerMidBox->pack_start (*bluemed); - chanMixerShadowsBox->pack_start (*greenlow); - chanMixerShadowsBox->pack_start (*bluelow); + chanMixerHLBox->pack_start(*greenhigh); + chanMixerHLBox->pack_start(*bluehigh); + chanMixerMidBox->pack_start(*greenmed); + chanMixerMidBox->pack_start(*bluemed); + chanMixerShadowsBox->pack_start(*greenlow); + chanMixerShadowsBox->pack_start(*bluelow); - greenlow->setAdjusterListener (this); - bluelow->setAdjusterListener (this); - greenmed->setAdjusterListener (this); - bluemed->setAdjusterListener (this); - greenhigh->setAdjusterListener (this); - bluehigh->setAdjusterListener (this); + greenlow->setAdjusterListener(this); + bluelow->setAdjusterListener(this); + greenmed->setAdjusterListener(this); + bluemed->setAdjusterListener(this); + greenhigh->setAdjusterListener(this); + bluehigh->setAdjusterListener(this); resBox->pack_start(*separatorCB, Gtk::PACK_SHRINK); @@ -751,35 +1170,39 @@ Wavelet::Wavelet() : //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")); - neutralconn = neutral->signal_pressed().connect( sigc::mem_fun(*this, &Wavelet::neutral_pressed) ); + neutral->set_tooltip_text(M("TP_COLORTONING_NEUTRAL_TOOLTIP")); + neutralconn = neutral->signal_pressed().connect(sigc::mem_fun(*this, &Wavelet::neutral_pressed)); neutral->show(); - neutrHBox->pack_start (*neutral, Gtk::PACK_EXPAND_WIDGET); + neutrHBox->pack_start(*neutral, Gtk::PACK_EXPAND_WIDGET); - resBox->pack_start (*neutrHBox); + resBox->pack_start(*neutrHBox); // Final Touchup - Gtk::VBox* const ctboxBA = Gtk::manage (new Gtk::VBox()); + // Gtk::Box* const ctboxBA = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); ctboxBA->set_spacing(2); - //Gtk::HSeparator *separatorfin = Gtk::manage (new Gtk::HSeparator()); + //Gtk::Separator *separatorfin = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); //ctboxBA->pack_start(*separatorfin, Gtk::PACK_SHRINK, 2); Gtk::Label* const labmBA = Gtk::manage(new Gtk::Label(M("TP_WAVELET_BATYPE") + ":")); - Gtk::HBox* const ctboxFI = Gtk::manage(new Gtk::HBox()); - ctboxFI->pack_start (*labmBA, Gtk::PACK_SHRINK, 1); + Gtk::Box* const ctboxFI = Gtk::manage(new Gtk::Box()); + ctboxFI->pack_start(*labmBA, Gtk::PACK_SHRINK, 1); - BAmethod->append (M("TP_WAVELET_BANONE")); - BAmethod->append (M("TP_WAVELET_BASLI")); - BAmethod->append (M("TP_WAVELET_BACUR")); - BAmethodconn = BAmethod->signal_changed().connect ( sigc::mem_fun(*this, &Wavelet::BAmethodChanged) ); + BAmethod->append(M("TP_WAVELET_BANONE")); + BAmethod->append(M("TP_WAVELET_BASLI")); + BAmethod->append(M("TP_WAVELET_BACUR")); + BAmethodconn = BAmethod->signal_changed().connect(sigc::mem_fun(*this, &Wavelet::BAmethodChanged)); ctboxFI->pack_start(*BAmethod); ctboxBA->pack_start(*ctboxFI); - balance->setAdjusterListener (this); - balance->set_tooltip_text (M("TP_WAVELET_BALANCE_TOOLTIP")); + balance->setAdjusterListener(this); + balance->set_tooltip_text(M("TP_WAVELET_BALANCE_TOOLTIP")); + softradend->setAdjusterListener(this); + strend->setAdjusterListener(this); + detend->setAdjusterListener(this); + thrend->setAdjusterListener(this); - opacityCurveEditorW->setCurveListener (this); + opacityCurveEditorW->setCurveListener(this); opacityShape = static_cast(opacityCurveEditorW->addCurve(CT_Flat, "", nullptr, false, false)); opacityShape->setIdentityValue(0.); @@ -790,23 +1213,26 @@ Wavelet::Wavelet() : opacityCurveEditorW->curveListComplete(); opacityCurveEditorW->show(); - iter->setAdjusterListener (this); - iter->set_tooltip_text (M("TP_WAVELET_ITER_TOOLTIP")); + iter->setAdjusterListener(this); + iter->set_tooltip_text(M("TP_WAVELET_ITER_TOOLTIP")); + sigmadir->setAdjusterListener(this); - Gtk::HSeparator* const separatorbalend = Gtk::manage (new Gtk::HSeparator()); +// Gtk::Separator* const separatorbalend = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); - opacityCurveEditorWL->setCurveListener (this); + opacityCurveEditorWL->setCurveListener(this); opacityShapeWL = static_cast(opacityCurveEditorWL->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeWL->setIdentityValue(0.); opacityShapeWL->setResetCurve(FlatCurveType(default_params.opacityCurveWL.at(0)), default_params.opacityCurveWL); opacityShapeWL->setTooltip(M("TP_WAVELET_OPACITYWL_TOOLTIP")); + opacityShapeWL->setBottomBarBgGradient({{0., 0., 0., 0.}, {1., 1., 1., 1.}}); + sigmafin->setAdjusterListener(this); // This will add the reset button at the end of the curveType buttons opacityCurveEditorWL->curveListComplete(); opacityCurveEditorWL->show(); - curveEditorG->setCurveListener (this); + curveEditorG->setCurveListener(this); clshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_WAVELET_CURVEEDITOR_CL"))); clshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CL_TOOLTIP")); @@ -815,54 +1241,84 @@ Wavelet::Wavelet() : curveEditorG->curveListComplete(); - tmr->set_active (true); - tmr->set_tooltip_text (M("TP_WAVELET_BALCHRO_TOOLTIP")); - tmrConn = tmr->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::tmrToggled) ); + tmr->set_active(true); + tmr->set_tooltip_text(M("TP_WAVELET_BALCHRO_TOOLTIP")); + tmrConn = tmr->signal_toggled().connect(sigc::mem_fun(*this, &Wavelet::tmrToggled)); - ToolParamBlock* const finalBox = Gtk::manage (new ToolParamBlock()); + fincFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const fincBox = Gtk::manage(new ToolParamBlock()); + fincBox->pack_start(*opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); + fincBox->pack_start(*sigmafin); + fincFrame->add(*fincBox); - finalBox->pack_start (*ctboxBA); - finalBox->pack_start(*balance); + dirFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const dirBox = Gtk::manage(new ToolParamBlock()); + dirBox->pack_start(*ctboxBA); + dirBox->pack_start(*balance); + dirBox->pack_start(*opacityCurveEditorW, Gtk::PACK_SHRINK, 2); + dirBox->pack_start(*iter); + dirBox->pack_start(*sigmadir); + dirBox->pack_start(*tmr); + dirFrame->add(*dirBox); - finalBox->pack_start( *opacityCurveEditorW, Gtk::PACK_SHRINK, 2); + ToolParamBlock* const finalBox = Gtk::manage(new ToolParamBlock()); + finalBox->pack_start(*dirFrame); - finalBox->pack_start(*iter); + finalBox->pack_start(*fincFrame); + finalBox->pack_start(*curveEditorG, Gtk::PACK_SHRINK, 4); + thrend->set_tooltip_text(M("TP_WAVELET_FINTHR_TOOLTIP")); - finalBox->pack_start(*tmr); - finalBox->pack_start(*separatorbalend, Gtk::PACK_SHRINK, 2); - finalBox->pack_start( *opacityCurveEditorWL, Gtk::PACK_SHRINK, 2); - - finalBox->pack_start (*curveEditorG, Gtk::PACK_SHRINK, 4); + guidFrame->set_label_align(0.025, 0.5); + ToolParamBlock* const guidBox = Gtk::manage(new ToolParamBlock()); + guidBox->pack_start(*softradend); + guidBox->pack_start(*strend); + guidBox->pack_start(*detend); + guidBox->pack_start(*thrend); + guidBox->pack_start(*CurveEditorwavguid); + guidFrame->add(*guidBox); + finalBox->pack_start(*guidFrame); + //----------------------------- + + expsettings->add(*settingsBox, false); expsettings->setLevel(2); - pack_start (*expsettings); + pack_start(*expsettings); expcontrast->add(*levBox, false); expcontrast->setLevel(2); - pack_start (*expcontrast); + pack_start(*expcontrast); expchroma->add(*chBox, false); expchroma->setLevel(2); - pack_start (*expchroma); - - exptoning->add(*tonBox, false); - exptoning->setLevel(2); - pack_start (*exptoning); - - expnoise->add(*noiseBox, false); - expnoise->setLevel(2); - pack_start (*expnoise); - - expedge->add(*edgBox, false); - expedge->setLevel(2); - pack_start (*expedge); + pack_start(*expchroma); expgamut->add(*conBox, false); expgamut->setLevel(2); - pack_start (*expgamut); + pack_start(*expgamut); + + exptoning->add(*tonBox, false); + exptoning->setLevel(2); + pack_start(*exptoning); + + expnoise->add(*noiseBox, false); + expnoise->setLevel(2); + pack_start(*expnoise); + + expedge->add(*edgBox, false); + expedge->setLevel(2); + pack_start(*expedge); + + expbl->add(*blBox, false); + expbl->setLevel(2); + pack_start(*expbl); + + expclari->add(*clariBox, false); + expclari->setLevel(2); + pack_start(*expclari); + expresid->add(*resBox, false); expresid->setLevel(2); @@ -873,12 +1329,18 @@ Wavelet::Wavelet() : pack_start(*expfinal); } -Wavelet::~Wavelet () +Wavelet::~Wavelet() { idle_register.destroy(); delete opaCurveEditorG; + //delete curveEditorC; delete opacityCurveEditorG; + delete CurveEditorwavnoise; + delete CurveEditorwavnoiseh; + delete CurveEditorwavguid; + delete CurveEditorwavhue; + delete curveEditorbl; delete CCWcurveEditorG; delete curveEditorRES; delete curveEditorGAM; @@ -888,27 +1350,44 @@ Wavelet::~Wavelet () } -void Wavelet::wavChanged (double nlevel) +void Wavelet::updateGUI() +{ + const int temp2 = threshold2->getValue(); + const int temp = threshold->getValue(); + const int maxlev = thres->getValue(); + threshold2->setLimits(temp + 1, maxlev, 1, maxlev + 1); + threshold2 ->setValue(temp2); +} + +void Wavelet::updateGUImaxlev() +{ + const int temp4 = threshold->getValue(); + const int temp3 = thres->getValue(); + threshold->setLimits(1, temp3, 1, temp3); + threshold ->setValue(temp4); +} + + +void Wavelet::wavChanged(double nlevel) { if (!batchMode) { 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; - } + [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 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 () +void Wavelet::neutral_pressed() { disableListener(); greenlow->resetValue(false); @@ -921,11 +1400,18 @@ void Wavelet::neutral_pressed () enableListener(); if (listener && getEnabled()) { - listener->panelChanged (EvWavNeutral, M("GENERAL_RESET")); + listener->panelChanged(EvWavNeutral, M("GENERAL_RESET")); } } -void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) +void Wavelet::setListener(ToolPanelListener *tpl) +{ + ToolPanel::setListener(tpl); + labgrid->setListener(tpl); +} + + +void Wavelet::read(const ProcParams* pp, const ParamsEdited* pedited) { /***************************************************************************************************** @@ -934,11 +1420,16 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) * *****************************************************************************************************/ - disableListener (); + disableListener(); Lmethodconn.block(true); CLmethodconn.block(true); Backmethodconn.block(true); Tilesmethodconn.block(true); + complexmethodconn.block(true); + //denmethodconn.block(true); + mixmethodconn.block(true); + slimethodconn.block(true); + quamethodconn.block(true); daubcoeffmethodconn.block(true); Dirmethodconn.block(true); CHmethodconn.block(true); @@ -949,6 +1440,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) TMmethodconn.block(true); HSmethodconn.block(true); MedgreinfConn.block(true); + ushamethodconn.block(true); cbenabConn.block(true); enableChromaConn.block(true); enableContrastConn.block(true); @@ -966,65 +1458,75 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) //HSmethod->set_active (1); // Note: default values are controlled in rtengine::ProcParams::SetDefaults if (pp->wavelet.HSmethod == "without") { - HSmethod->set_active (0); + HSmethod->set_active(0); } else if (pp->wavelet.HSmethod == "with") { - HSmethod->set_active (1); + HSmethod->set_active(1); } //CHmethod->set_active (1); if (pp->wavelet.CHmethod == "without") { - CHmethod->set_active (0); + CHmethod->set_active(0); } else if (pp->wavelet.CHmethod == "with") { - CHmethod->set_active (1); + CHmethod->set_active(1); } else if (pp->wavelet.CHmethod == "link") { - CHmethod->set_active (2); + CHmethod->set_active(2); } //Medgreinf->set_active (1); if (pp->wavelet.Medgreinf == "more") { - Medgreinf->set_active (0); + Medgreinf->set_active(0); } else if (pp->wavelet.Medgreinf == "none") { - Medgreinf->set_active (1); + Medgreinf->set_active(1); } else if (pp->wavelet.Medgreinf == "less") { - Medgreinf->set_active (2); + Medgreinf->set_active(2); + } + + //ushamethod +// if (pp->wavelet.ushamethod == "none") { +// ushamethod->set_active(0); +// } else + if (pp->wavelet.ushamethod == "sharp") { + ushamethod->set_active(0); + } else if (pp->wavelet.ushamethod == "clari") { + ushamethod->set_active(1); } //CHSLmethod->set_active (1); if (pp->wavelet.CHSLmethod == "SL") { - CHSLmethod->set_active (0); + CHSLmethod->set_active(0); } else if (pp->wavelet.CHSLmethod == "CU") { - CHSLmethod->set_active (1); + CHSLmethod->set_active(1); } //EDmethod->set_active (1); if (pp->wavelet.EDmethod == "SL") { - EDmethod->set_active (0); + EDmethod->set_active(0); } else if (pp->wavelet.EDmethod == "CU") { - EDmethod->set_active (1); + EDmethod->set_active(1); } if (pp->wavelet.NPmethod == "none") { - NPmethod->set_active (0); + NPmethod->set_active(0); } else if (pp->wavelet.NPmethod == "low") { - NPmethod->set_active (1); + NPmethod->set_active(1); } else if (pp->wavelet.NPmethod == "high") { - NPmethod->set_active (2); + NPmethod->set_active(2); } //BAmethod->set_active (0); if (pp->wavelet.BAmethod == "none") { - BAmethod->set_active (0); + BAmethod->set_active(0); } else if (pp->wavelet.BAmethod == "sli") { - BAmethod->set_active (1); + BAmethod->set_active(1); } else if (pp->wavelet.BAmethod == "cur") { - BAmethod->set_active (2); + BAmethod->set_active(2); } //TMmethod->set_active (1); if (pp->wavelet.TMmethod == "cont") { - TMmethod->set_active (0); + TMmethod->set_active(0); } else if (pp->wavelet.TMmethod == "tm") { - TMmethod->set_active (1); + TMmethod->set_active(1); } // else if (pp->wavelet.TMmethod=="both") @@ -1032,99 +1534,152 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) //Backmethod->set_active (3); if (pp->wavelet.Backmethod == "black") { - Backmethod->set_active (0); + Backmethod->set_active(0); } else if (pp->wavelet.Backmethod == "grey") { - Backmethod->set_active (1); + Backmethod->set_active(1); } else if (pp->wavelet.Backmethod == "resid") { - Backmethod->set_active (2); + Backmethod->set_active(2); } //CLmethod->set_active (3); if (pp->wavelet.CLmethod == "one") { - CLmethod->set_active (0); + CLmethod->set_active(0); } else if (pp->wavelet.CLmethod == "inf") { - CLmethod->set_active (1); + CLmethod->set_active(1); } else if (pp->wavelet.CLmethod == "sup") { - CLmethod->set_active (2); + CLmethod->set_active(2); } else if (pp->wavelet.CLmethod == "all") { - CLmethod->set_active (3); + CLmethod->set_active(3); + } + if (pp->wavelet.complexmethod == "normal") { + complexmethod->set_active(0); + } else if (pp->wavelet.complexmethod == "expert") { + complexmethod->set_active(1); + } + + //if (pp->wavelet.denmethod == "equ") { + // denmethod->set_active(0); + //} else if (pp->wavelet.denmethod == "high") { + // denmethod->set_active(1); + //} else if (pp->wavelet.denmethod == "low") { + // denmethod->set_active(2); + //} else if (pp->wavelet.denmethod == "12high") { + // denmethod->set_active(3); + //} else if (pp->wavelet.denmethod == "12low") { + // denmethod->set_active(4); + //} + + if (pp->wavelet.mixmethod == "nois") { + mixmethod->set_active(0); + } else if (pp->wavelet.mixmethod == "mix") { + mixmethod->set_active(1); + } else if (pp->wavelet.mixmethod == "mix7") { + mixmethod->set_active(2); + } else if (pp->wavelet.mixmethod == "den") { + mixmethod->set_active(3); + } + + if (pp->wavelet.slimethod == "sli") { + slimethod->set_active(0); + } else if (pp->wavelet.slimethod == "cur") { + slimethod->set_active(1); + } + + if (pp->wavelet.quamethod == "cons") { + quamethod->set_active(0); + } else if (pp->wavelet.quamethod == "agre") { + quamethod->set_active(1); } //Tilesmethod->set_active (2); if (pp->wavelet.Tilesmethod == "full") { - Tilesmethod->set_active (0); + Tilesmethod->set_active(0); } else if (pp->wavelet.Tilesmethod == "big") { - Tilesmethod->set_active (1); - } else if (pp->wavelet.Tilesmethod == "lit") { - Tilesmethod->set_active (2); + Tilesmethod->set_active(1); +// } else if (pp->wavelet.Tilesmethod == "lit") { +// Tilesmethod->set_active(2); } //daubcoeffmethod->set_active (4); if (pp->wavelet.daubcoeffmethod == "2_") { - daubcoeffmethod->set_active (0); + daubcoeffmethod->set_active(0); } else if (pp->wavelet.daubcoeffmethod == "4_") { - daubcoeffmethod->set_active (1); + daubcoeffmethod->set_active(1); } else if (pp->wavelet.daubcoeffmethod == "6_") { - daubcoeffmethod->set_active (2); + daubcoeffmethod->set_active(2); } else if (pp->wavelet.daubcoeffmethod == "10_") { - daubcoeffmethod->set_active (3); + daubcoeffmethod->set_active(3); } else if (pp->wavelet.daubcoeffmethod == "14_") { - daubcoeffmethod->set_active (4); + daubcoeffmethod->set_active(4); } //Dirmethod->set_active (3); if (pp->wavelet.Dirmethod == "one") { - Dirmethod->set_active (0); + Dirmethod->set_active(0); } else if (pp->wavelet.Dirmethod == "two") { - Dirmethod->set_active (1); + Dirmethod->set_active(1); } else if (pp->wavelet.Dirmethod == "thr") { - Dirmethod->set_active (2); + Dirmethod->set_active(2); } else if (pp->wavelet.Dirmethod == "all") { - Dirmethod->set_active (3); + Dirmethod->set_active(3); } int selectedLevel = pp->wavelet.Lmethod - 1; - Lmethod->set_active (selectedLevel == -1 ? 4 : selectedLevel); + Lmethod->set_active(selectedLevel == -1 ? 4 : selectedLevel); - ccshape->setCurve (pp->wavelet.ccwcurve); - opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG); - opacityShapeBY->setCurve (pp->wavelet.opacityCurveBY); - opacityShape->setCurve (pp->wavelet.opacityCurveW); - opacityShapeWL->setCurve (pp->wavelet.opacityCurveWL); - hhshape->setCurve (pp->wavelet.hhcurve); - Chshape->setCurve (pp->wavelet.Chcurve); - clshape->setCurve (pp->wavelet.wavclCurve); - expcontrast->setEnabled (pp->wavelet.expcontrast); - expchroma->setEnabled (pp->wavelet.expchroma); - expedge->setEnabled (pp->wavelet.expedge); - expresid->setEnabled (pp->wavelet.expresid); - expfinal->setEnabled (pp->wavelet.expfinal); - exptoning->setEnabled (pp->wavelet.exptoning); - expnoise->setEnabled (pp->wavelet.expnoise); + ccshape->setCurve(pp->wavelet.ccwcurve); + blshape->setCurve(pp->wavelet.blcurve); + opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); + wavdenoise->setCurve(pp->wavelet.wavdenoise); + wavdenoiseh->setCurve(pp->wavelet.wavdenoiseh); + //opacityShapeSH->setCurve(pp->wavelet.opacityCurveSH); + opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); + opacityShape->setCurve(pp->wavelet.opacityCurveW); + opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); + hhshape->setCurve(pp->wavelet.hhcurve); + wavguidf->setCurve(pp->wavelet.wavguidcurve); + wavhue->setCurve(pp->wavelet.wavhuecurve); + Chshape->setCurve(pp->wavelet.Chcurve); + clshape->setCurve(pp->wavelet.wavclCurve); + expcontrast->setEnabled(pp->wavelet.expcontrast); + expchroma->setEnabled(pp->wavelet.expchroma); + expedge->setEnabled(pp->wavelet.expedge); + expbl->setEnabled(pp->wavelet.expbl); + expresid->setEnabled(pp->wavelet.expresid); + expfinal->setEnabled(pp->wavelet.expfinal); + exptoning->setEnabled(pp->wavelet.exptoning); + expnoise->setEnabled(pp->wavelet.expnoise); + expclari->setEnabled(pp->wavelet.expclari); setEnabled(pp->wavelet.enabled); - avoidConn.block (true); - avoid->set_active (pp->wavelet.avoid); - avoidConn.block (false); - tmrConn.block (true); - tmr->set_active (pp->wavelet.tmr); - tmrConn.block (false); - medianConn.block (true); - median->set_active (pp->wavelet.median); - medianConn.block (false); - medianlevConn.block (true); - medianlev->set_active (pp->wavelet.medianlev); - medianlevConn.block (false); - linkedgConn.block (true); - linkedg->set_active (pp->wavelet.linkedg); - linkedgConn.block (false); - cbenabConn.block (true); - cbenab->set_active (pp->wavelet.cbenab); - cbenabConn.block (false); + avoidConn.block(true); + avoid->set_active(pp->wavelet.avoid); + avoidConn.block(false); + showmaskConn.block(true); + showmask->set_active(pp->wavelet.showmask); + showmaskConn.block(false); + oldshConn.block(true); + oldsh->set_active(pp->wavelet.oldsh); + oldshConn.block(false); + tmrConn.block(true); + tmr->set_active(pp->wavelet.tmr); + tmrConn.block(false); + medianConn.block(true); + median->set_active(pp->wavelet.median); + medianConn.block(false); + medianlevConn.block(true); + medianlev->set_active(pp->wavelet.medianlev); + medianlevConn.block(false); + linkedgConn.block(true); + linkedg->set_active(pp->wavelet.linkedg); + linkedgConn.block(false); + cbenabConn.block(true); + cbenab->set_active(pp->wavelet.cbenab); + cbenabConn.block(false); - lipstConn.block (true); - lipst->set_active (pp->wavelet.lipst); - lipstConn.block (false); + lipstConn.block(true); + lipst->set_active(pp->wavelet.lipst); + lipstConn.block(false); //edgreinfConn.block (true); //edgreinf->set_active (pp->wavelet.edgreinf); //edgreinfConn.block (false); @@ -1135,27 +1690,40 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) lastcbenab = pp->wavelet.cbenab; lastlipst = pp->wavelet.lipst; lastavoid = pp->wavelet.avoid; + lastshowmask = pp->wavelet.showmask; + lastoldsh = pp->wavelet.oldsh; lasttmr = pp->wavelet.tmr; - rescon->setValue (pp->wavelet.rescon); - resconH->setValue (pp->wavelet.resconH); - reschro->setValue (pp->wavelet.reschro); - tmrs->setValue (pp->wavelet.tmrs); - gamma->setValue (pp->wavelet.gamma); - sup->setValue (pp->wavelet.sup); - sky->setValue (pp->wavelet.sky); - thres->setValue (pp->wavelet.thres); - chroma->setValue (pp->wavelet.chroma); - chro->setValue (pp->wavelet.chro); - contrast->setValue (pp->wavelet.contrast); - edgrad->setValue (pp->wavelet.edgrad); - edgval->setValue (pp->wavelet.edgval); - edgthresh->setValue (pp->wavelet.edgthresh); - thr->setValue (pp->wavelet.thr); - thrH->setValue (pp->wavelet.thrH); + sigma->setValue(pp->wavelet.sigma); + offset->setValue(pp->wavelet.offset); + lowthr->setValue(pp->wavelet.lowthr); + rescon->setValue(pp->wavelet.rescon); + resconH->setValue(pp->wavelet.resconH); + reschro->setValue(pp->wavelet.reschro); + resblur->setValue(pp->wavelet.resblur); + resblurc->setValue(pp->wavelet.resblurc); + tmrs->setValue(pp->wavelet.tmrs); + edgs->setValue(pp->wavelet.edgs); + scale->setValue(pp->wavelet.scale); + gamma->setValue(pp->wavelet.gamma); + sup->setValue(pp->wavelet.sup); + sky->setValue(pp->wavelet.sky); + thres->setValue(pp->wavelet.thres); + chroma->setValue(pp->wavelet.chroma); + chro->setValue(pp->wavelet.chro); + contrast->setValue(pp->wavelet.contrast); + edgrad->setValue(pp->wavelet.edgrad); + edgeffect->setValue(pp->wavelet.edgeffect); + edgval->setValue(pp->wavelet.edgval); + edgthresh->setValue(pp->wavelet.edgthresh); + thr->setValue(pp->wavelet.thr); + thrH->setValue(pp->wavelet.thrH); + radius->setValue(pp->wavelet.radius); skinprotect->setValue(pp->wavelet.skinprotect); hueskin->setValue(pp->wavelet.hueskin); hueskin2->setValue(pp->wavelet.hueskin2); + updateGUImaxlev(); threshold->setValue(pp->wavelet.threshold); + updateGUI(); threshold2->setValue(pp->wavelet.threshold2); edgedetect->setValue(pp->wavelet.edgedetect); edgedetectthr->setValue(pp->wavelet.edgedetectthr); @@ -1167,21 +1735,47 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) pastlev->setValue(pp->wavelet.pastlev); satlev->setValue(pp->wavelet.satlev); edgcont->setValue(pp->wavelet.edgcont); + chrwav->setValue(pp->wavelet.chrwav); + bluwav->setValue(pp->wavelet.bluwav); - greenlow->setValue (pp->wavelet.greenlow); - bluelow->setValue (pp->wavelet.bluelow); - greenmed->setValue (pp->wavelet.greenmed); - bluemed->setValue (pp->wavelet.bluemed); - greenhigh->setValue (pp->wavelet.greenhigh); - bluehigh->setValue (pp->wavelet.bluehigh); + greenlow->setValue(pp->wavelet.greenlow); + bluelow->setValue(pp->wavelet.bluelow); + greenmed->setValue(pp->wavelet.greenmed); + bluemed->setValue(pp->wavelet.bluemed); + greenhigh->setValue(pp->wavelet.greenhigh); + bluehigh->setValue(pp->wavelet.bluehigh); + mergeL->setValue(pp->wavelet.mergeL); + mergeC->setValue(pp->wavelet.mergeC); + softrad->setValue(pp->wavelet.softrad); + softradend->setValue(pp->wavelet.softradend); + strend->setValue(pp->wavelet.strend); + detend->setValue(pp->wavelet.detend); + thrend->setValue(pp->wavelet.thrend); + labgrid->setParams(pp->wavelet.labgridALow / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridBLow / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridAHigh / WaveletParams::LABGRID_CORR_MAX, pp->wavelet.labgridBHigh / WaveletParams::LABGRID_CORR_MAX, 0, 0, 0, 0, false); + sigm->setValue(pp->wavelet.sigm); + levden->setValue(pp->wavelet.levden); + thrden->setValue(pp->wavelet.thrden); + limden->setValue(pp->wavelet.limden); + ballum->setValue(pp->wavelet.ballum); + balchrom->setValue(pp->wavelet.balchrom); + chromfi->setValue(pp->wavelet.chromfi); + chromco->setValue(pp->wavelet.chromco); level0noise->setValue(pp->wavelet.level0noise); level1noise->setValue(pp->wavelet.level1noise); level2noise->setValue(pp->wavelet.level2noise); level3noise->setValue(pp->wavelet.level3noise); + leveldenoise->setValue(pp->wavelet.leveldenoise); + levelsigm->setValue(pp->wavelet.levelsigm); strength->setValue(pp->wavelet.strength); balance->setValue(pp->wavelet.balance); iter->setValue(pp->wavelet.iter); + sigmafin->setValue(pp->wavelet.sigmafin); + sigmaton->setValue(pp->wavelet.sigmaton); + sigmacol->setValue(pp->wavelet.sigmacol); + sigmadir->setValue(pp->wavelet.sigmadir); + rangeab->setValue(pp->wavelet.rangeab); + protab->setValue(pp->wavelet.protab); for (int i = 0; i < 9; i++) { correction[i]->setValue(pp->wavelet.c[i]); @@ -1210,6 +1804,26 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) Backmethod->set_active_text(M("GENERAL_UNCHANGED")); } + if (!pedited->wavelet.complexmethod) { + complexmethod->set_active_text(M("GENERAL_UNCHANGED")); + } + + //if (!pedited->wavelet.denmethod) { + // denmethod->set_active_text(M("GENERAL_UNCHANGED")); + //} + + if (!pedited->wavelet.mixmethod) { + mixmethod->set_active_text(M("GENERAL_UNCHANGED")); + } + + if (!pedited->wavelet.slimethod) { + slimethod->set_active_text(M("GENERAL_UNCHANGED")); + } + + if (!pedited->wavelet.quamethod) { + quamethod->set_active_text(M("GENERAL_UNCHANGED")); + } + if (!pedited->wavelet.Tilesmethod) { Tilesmethod->set_active_text(M("GENERAL_UNCHANGED")); } @@ -1254,83 +1868,133 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) Medgreinf->set_active_text(M("GENERAL_UNCHANGED")); } - set_inconsistent (multiImage && !pedited->wavelet.enabled); - ccshape->setUnChanged (!pedited->wavelet.ccwcurve); - expcontrast->set_inconsistent (!pedited->wavelet.expcontrast); - expchroma->set_inconsistent (!pedited->wavelet.expchroma); - expedge->set_inconsistent (!pedited->wavelet.expedge); - expresid->set_inconsistent (!pedited->wavelet.expresid); - expfinal->set_inconsistent (!pedited->wavelet.expfinal); - exptoning->set_inconsistent (!pedited->wavelet.exptoning); - expnoise->set_inconsistent (!pedited->wavelet.expnoise); - opacityShapeRG->setCurve (pp->wavelet.opacityCurveRG); - opacityShapeBY->setCurve (pp->wavelet.opacityCurveBY); - opacityShape->setCurve (pp->wavelet.opacityCurveW); - opacityShapeWL->setCurve (pp->wavelet.opacityCurveWL); - hhshape->setUnChanged (!pedited->wavelet.hhcurve); - Chshape->setUnChanged (!pedited->wavelet.Chcurve); - clshape->setUnChanged (!pedited->wavelet.wavclCurve); - avoid->set_inconsistent (!pedited->wavelet.avoid); - tmr->set_inconsistent (!pedited->wavelet.tmr); - edgthresh->setEditedState (pedited->wavelet.edgthresh ? Edited : UnEdited); - rescon->setEditedState (pedited->wavelet.rescon ? Edited : UnEdited); - resconH->setEditedState (pedited->wavelet.resconH ? Edited : UnEdited); - reschro->setEditedState (pedited->wavelet.reschro ? Edited : UnEdited); - tmrs->setEditedState (pedited->wavelet.tmrs ? Edited : UnEdited); - gamma->setEditedState (pedited->wavelet.gamma ? Edited : UnEdited); - sup->setEditedState (pedited->wavelet.sup ? Edited : UnEdited); - sky->setEditedState (pedited->wavelet.sky ? Edited : UnEdited); - thres->setEditedState (pedited->wavelet.thres ? Edited : UnEdited); - balance->setEditedState (pedited->wavelet.balance ? Edited : UnEdited); - iter->setEditedState (pedited->wavelet.iter ? Edited : UnEdited); - threshold->setEditedState (pedited->wavelet.threshold ? Edited : UnEdited); - threshold2->setEditedState (pedited->wavelet.threshold2 ? Edited : UnEdited); - edgedetect->setEditedState (pedited->wavelet.edgedetect ? Edited : UnEdited); - edgedetectthr->setEditedState (pedited->wavelet.edgedetectthr ? Edited : UnEdited); - edgedetectthr2->setEditedState (pedited->wavelet.edgedetectthr2 ? Edited : UnEdited); - edgesensi->setEditedState (pedited->wavelet.edgesensi ? Edited : UnEdited); - edgeampli->setEditedState (pedited->wavelet.edgeampli ? Edited : UnEdited); - chroma->setEditedState (pedited->wavelet.chroma ? Edited : UnEdited); - chro->setEditedState (pedited->wavelet.chro ? Edited : UnEdited); + if (!pedited->wavelet.ushamethod) { + ushamethod->set_active_text(M("GENERAL_UNCHANGED")); + } + labgrid->setEdited(pedited->wavelet.labgridALow || pedited->wavelet.labgridBLow || pedited->wavelet.labgridAHigh || pedited->wavelet.labgridBHigh); - greenlow->setEditedState (pedited->wavelet.greenlow ? Edited : UnEdited); - bluelow->setEditedState (pedited->wavelet.bluelow ? Edited : UnEdited); - greenmed->setEditedState (pedited->wavelet.greenmed ? Edited : UnEdited); - bluemed->setEditedState (pedited->wavelet.bluemed ? Edited : UnEdited); - greenhigh->setEditedState (pedited->wavelet.greenhigh ? Edited : UnEdited); - bluehigh->setEditedState (pedited->wavelet.bluehigh ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->wavelet.enabled); + ccshape->setUnChanged(!pedited->wavelet.ccwcurve); + blshape->setUnChanged(!pedited->wavelet.blcurve); + expcontrast->set_inconsistent(!pedited->wavelet.expcontrast); + expchroma->set_inconsistent(!pedited->wavelet.expchroma); + expedge->set_inconsistent(!pedited->wavelet.expedge); + expbl->set_inconsistent(!pedited->wavelet.expbl); + expresid->set_inconsistent(!pedited->wavelet.expresid); + expfinal->set_inconsistent(!pedited->wavelet.expfinal); + expclari->set_inconsistent(!pedited->wavelet.expclari); + exptoning->set_inconsistent(!pedited->wavelet.exptoning); + expnoise->set_inconsistent(!pedited->wavelet.expnoise); + opacityShapeRG->setCurve(pp->wavelet.opacityCurveRG); + //opacityShapeSH->setCurve(pp->wavelet.opacityCurveSH); + opacityShapeBY->setCurve(pp->wavelet.opacityCurveBY); + wavdenoise->setCurve(pp->wavelet.wavdenoise); + wavdenoiseh->setCurve(pp->wavelet.wavdenoiseh); + opacityShape->setCurve(pp->wavelet.opacityCurveW); + opacityShapeWL->setCurve(pp->wavelet.opacityCurveWL); + hhshape->setUnChanged(!pedited->wavelet.hhcurve); + wavguidf->setUnChanged(!pedited->wavelet.wavguidcurve); + wavhue->setUnChanged(!pedited->wavelet.wavhuecurve); + Chshape->setUnChanged(!pedited->wavelet.Chcurve); + clshape->setUnChanged(!pedited->wavelet.wavclCurve); + avoid->set_inconsistent(!pedited->wavelet.avoid); + showmask->set_inconsistent(!pedited->wavelet.showmask); + oldsh->set_inconsistent(!pedited->wavelet.oldsh); + tmr->set_inconsistent(!pedited->wavelet.tmr); + edgthresh->setEditedState(pedited->wavelet.edgthresh ? Edited : UnEdited); + rescon->setEditedState(pedited->wavelet.rescon ? Edited : UnEdited); + sigma->setEditedState(pedited->wavelet.sigma ? Edited : UnEdited); + offset->setEditedState(pedited->wavelet.offset ? Edited : UnEdited); + lowthr->setEditedState(pedited->wavelet.lowthr ? Edited : UnEdited); + resconH->setEditedState(pedited->wavelet.resconH ? Edited : UnEdited); + reschro->setEditedState(pedited->wavelet.reschro ? Edited : UnEdited); + resblur->setEditedState(pedited->wavelet.resblur ? Edited : UnEdited); + resblurc->setEditedState(pedited->wavelet.resblurc ? Edited : UnEdited); + tmrs->setEditedState(pedited->wavelet.tmrs ? Edited : UnEdited); + edgs->setEditedState(pedited->wavelet.edgs ? Edited : UnEdited); + scale->setEditedState(pedited->wavelet.scale ? Edited : UnEdited); + gamma->setEditedState(pedited->wavelet.gamma ? Edited : UnEdited); + sup->setEditedState(pedited->wavelet.sup ? Edited : UnEdited); + sky->setEditedState(pedited->wavelet.sky ? Edited : UnEdited); + thres->setEditedState(pedited->wavelet.thres ? Edited : UnEdited); + balance->setEditedState(pedited->wavelet.balance ? Edited : UnEdited); + iter->setEditedState(pedited->wavelet.iter ? Edited : UnEdited); + sigmafin->setEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); + sigmaton->setEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); + sigmacol->setEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); + sigmadir->setEditedState(pedited->wavelet.sigmadir ? Edited : UnEdited); + rangeab->setEditedState(pedited->wavelet.rangeab ? Edited : UnEdited); + protab->setEditedState(pedited->wavelet.protab ? Edited : UnEdited); + threshold->setEditedState(pedited->wavelet.threshold ? Edited : UnEdited); + threshold2->setEditedState(pedited->wavelet.threshold2 ? Edited : UnEdited); + edgedetect->setEditedState(pedited->wavelet.edgedetect ? Edited : UnEdited); + edgedetectthr->setEditedState(pedited->wavelet.edgedetectthr ? Edited : UnEdited); + edgedetectthr2->setEditedState(pedited->wavelet.edgedetectthr2 ? Edited : UnEdited); + edgesensi->setEditedState(pedited->wavelet.edgesensi ? Edited : UnEdited); + edgeampli->setEditedState(pedited->wavelet.edgeampli ? Edited : UnEdited); + chroma->setEditedState(pedited->wavelet.chroma ? Edited : UnEdited); + chro->setEditedState(pedited->wavelet.chro ? Edited : UnEdited); - median->set_inconsistent (!pedited->wavelet.median); - medianlev->set_inconsistent (!pedited->wavelet.medianlev); - linkedg->set_inconsistent (!pedited->wavelet.linkedg); + greenlow->setEditedState(pedited->wavelet.greenlow ? Edited : UnEdited); + bluelow->setEditedState(pedited->wavelet.bluelow ? Edited : UnEdited); + greenmed->setEditedState(pedited->wavelet.greenmed ? Edited : UnEdited); + bluemed->setEditedState(pedited->wavelet.bluemed ? Edited : UnEdited); + greenhigh->setEditedState(pedited->wavelet.greenhigh ? Edited : UnEdited); + bluehigh->setEditedState(pedited->wavelet.bluehigh ? Edited : UnEdited); + mergeL->setEditedState(pedited->wavelet.mergeL ? Edited : UnEdited); + mergeC->setEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); + softrad->setEditedState(pedited->wavelet.softrad ? Edited : UnEdited); + softradend->setEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + strend->setEditedState(pedited->wavelet.strend ? Edited : UnEdited); + detend->setEditedState(pedited->wavelet.detend ? Edited : UnEdited); + thrend->setEditedState(pedited->wavelet.thrend ? Edited : UnEdited); + + sigm->setEditedState(pedited->wavelet.sigm ? Edited : UnEdited); + levden->setEditedState(pedited->wavelet.levden ? Edited : UnEdited); + thrden->setEditedState(pedited->wavelet.thrden ? Edited : UnEdited); + limden->setEditedState(pedited->wavelet.limden ? Edited : UnEdited); + ballum->setEditedState(pedited->wavelet.ballum ? Edited : UnEdited); + balchrom->setEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); + chromfi->setEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); + chromco->setEditedState(pedited->wavelet.chromco ? Edited : UnEdited); + + median->set_inconsistent(!pedited->wavelet.median); + medianlev->set_inconsistent(!pedited->wavelet.medianlev); + linkedg->set_inconsistent(!pedited->wavelet.linkedg); // edgreinf->set_inconsistent (!pedited->wavelet.edgreinf); - cbenab->set_inconsistent (!pedited->wavelet.cbenab); - lipst->set_inconsistent (!pedited->wavelet.lipst); - contrast->setEditedState (pedited->wavelet.contrast ? Edited : UnEdited); - edgrad->setEditedState (pedited->wavelet.edgrad ? Edited : UnEdited); - edgval->setEditedState (pedited->wavelet.edgval ? Edited : UnEdited); - thr->setEditedState (pedited->wavelet.thr ? Edited : UnEdited); - thrH->setEditedState (pedited->wavelet.thrH ? Edited : UnEdited); - skinprotect->setEditedState (pedited->wavelet.skinprotect ? Edited : UnEdited); - hueskin->setEditedState (pedited->wavelet.hueskin ? Edited : UnEdited); - hueskin2->setEditedState (pedited->wavelet.hueskin2 ? Edited : UnEdited); - hllev->setEditedState (pedited->wavelet.hllev ? Edited : UnEdited); - bllev->setEditedState (pedited->wavelet.bllev ? Edited : UnEdited); - pastlev->setEditedState (pedited->wavelet.pastlev ? Edited : UnEdited); - satlev->setEditedState (pedited->wavelet.satlev ? Edited : UnEdited); + cbenab->set_inconsistent(!pedited->wavelet.cbenab); + lipst->set_inconsistent(!pedited->wavelet.lipst); + contrast->setEditedState(pedited->wavelet.contrast ? Edited : UnEdited); + edgrad->setEditedState(pedited->wavelet.edgrad ? Edited : UnEdited); + edgeffect->setEditedState(pedited->wavelet.edgeffect ? Edited : UnEdited); + edgval->setEditedState(pedited->wavelet.edgval ? Edited : UnEdited); + thr->setEditedState(pedited->wavelet.thr ? Edited : UnEdited); + thrH->setEditedState(pedited->wavelet.thrH ? Edited : UnEdited); + radius->setEditedState(pedited->wavelet.radius ? Edited : UnEdited); + skinprotect->setEditedState(pedited->wavelet.skinprotect ? Edited : UnEdited); + hueskin->setEditedState(pedited->wavelet.hueskin ? Edited : UnEdited); + hueskin2->setEditedState(pedited->wavelet.hueskin2 ? Edited : UnEdited); + hllev->setEditedState(pedited->wavelet.hllev ? Edited : UnEdited); + bllev->setEditedState(pedited->wavelet.bllev ? Edited : UnEdited); + pastlev->setEditedState(pedited->wavelet.pastlev ? Edited : UnEdited); + satlev->setEditedState(pedited->wavelet.satlev ? Edited : UnEdited); strength->setEditedState(pedited->wavelet.strength ? Edited : UnEdited); - edgcont->setEditedState (pedited->wavelet.edgcont ? Edited : UnEdited); - level0noise->setEditedState (pedited->wavelet.level0noise ? Edited : UnEdited); - level1noise->setEditedState (pedited->wavelet.level1noise ? Edited : UnEdited); - level2noise->setEditedState (pedited->wavelet.level2noise ? Edited : UnEdited); - level3noise->setEditedState (pedited->wavelet.level3noise ? Edited : UnEdited); + edgcont->setEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); + chrwav->setEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); + bluwav->setEditedState(pedited->wavelet.bluwav ? Edited : UnEdited); + level0noise->setEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); + level1noise->setEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); + level2noise->setEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); + level3noise->setEditedState(pedited->wavelet.level3noise ? Edited : UnEdited); + leveldenoise->setEditedState(pedited->wavelet.leveldenoise ? Edited : UnEdited); + levelsigm->setEditedState(pedited->wavelet.levelsigm ? Edited : UnEdited); - for(int i = 0; i < 9; i++) { - correction[i]->setEditedState (pedited->wavelet.c[i] ? Edited : UnEdited); + for (int i = 0; i < 9; i++) { + correction[i]->setEditedState(pedited->wavelet.c[i] ? Edited : UnEdited); } - for(int i = 0; i < 9; i++) { - correctionch[i]->setEditedState (pedited->wavelet.ch[i] ? Edited : UnEdited); + for (int i = 0; i < 9; i++) { + correctionch[i]->setEditedState(pedited->wavelet.ch[i] ? Edited : UnEdited); } } @@ -1345,20 +2009,20 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correction[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correction[z]->show(); } if (pp->wavelet.CHSLmethod == "SL") { - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } } @@ -1374,20 +2038,30 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) TMmethodUpdateUI(); //BackmethodUpdateUI(); CLmethodUpdateUI(); - lipstUpdateUI (); + lipstUpdateUI(); + oldshToggled(); //TilesmethodUpdateUI(); //daubcoeffmethodUpdateUI(); //DirmethodUpdateUI(); //LmethodUpdateUI(); - enabledUpdateUI (); - medianlevUpdateUI (); - cbenabUpdateUI (); + enabledUpdateUI(); + medianlevUpdateUI(); + cbenabUpdateUI(); - if(z == 9) { + if (z == 9) { sup->show(); } else { sup->hide(); } + + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + } /***************************************************************************************************** @@ -1400,6 +2074,11 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) CLmethodconn.block(false); Backmethodconn.block(false); Tilesmethodconn.block(false); + complexmethodconn.block(false); + //denmethodconn.block(false); + mixmethodconn.block(false); + slimethodconn.block(false); + quamethodconn.block(false); daubcoeffmethodconn.block(false); CHmethodconn.block(false); CHSLmethodconn.block(false); @@ -1410,6 +2089,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) HSmethodconn.block(false); Dirmethodconn.block(false); MedgreinfConn.block(false); + ushamethodconn.block(false); enableChromaConn.block(false); enableContrastConn.block(false); enableEdgeConn.block(false); @@ -1418,56 +2098,74 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) enableResidConn.block(false); enableToningConn.block(false); - enableListener (); + enableListener(); } -void Wavelet::setEditProvider (EditDataProvider *provider) +void Wavelet::setEditProvider(EditDataProvider *provider) { ccshape->setEditProvider(provider); + blshape->setEditProvider(provider); opacityShapeRG->setEditProvider(provider); + //opacityShapeSH->setEditProvider(provider); opacityShapeBY->setEditProvider(provider); + wavdenoise->setEditProvider(provider); + wavdenoiseh->setEditProvider(provider); opacityShape->setEditProvider(provider); opacityShapeWL->setEditProvider(provider); hhshape->setEditProvider(provider); + wavguidf->setEditProvider(provider); + wavhue->setEditProvider(provider); Chshape->setEditProvider(provider); clshape->setEditProvider(provider); } -void Wavelet::autoOpenCurve () +void Wavelet::autoOpenCurve() { ccshape->openIfNonlinear(); + blshape->openIfNonlinear(); //opacityShapeRG->openIfNonlinear(); //opacityShapeBY->openIfNonlinear(); } -void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) +void Wavelet::write(ProcParams* pp, ParamsEdited* pedited) { pp->wavelet.enabled = getEnabled(); - pp->wavelet.avoid = avoid->get_active (); - pp->wavelet.tmr = tmr->get_active (); + pp->wavelet.avoid = avoid->get_active(); + pp->wavelet.showmask = showmask->get_active(); + pp->wavelet.oldsh = oldsh->get_active(); + pp->wavelet.tmr = tmr->get_active(); + pp->wavelet.sigma = sigma->getValue(); + pp->wavelet.offset = offset->getValue(); + pp->wavelet.lowthr = lowthr->getValue(); pp->wavelet.rescon = rescon->getValue(); pp->wavelet.resconH = resconH->getValue(); pp->wavelet.reschro = reschro->getValue(); + pp->wavelet.resblur = resblur->getValue(); + pp->wavelet.resblurc = resblurc->getValue(); pp->wavelet.tmrs = tmrs->getValue(); + pp->wavelet.edgs = edgs->getValue(); + pp->wavelet.scale = scale->getValue(); pp->wavelet.gamma = gamma->getValue(); pp->wavelet.sup = sup->getValue(); pp->wavelet.sky = sky->getValue(); pp->wavelet.thres = thres->getValue(); pp->wavelet.chroma = chroma->getValue(); pp->wavelet.chro = chro->getValue(); - pp->wavelet.median = median->get_active (); - pp->wavelet.medianlev = medianlev->get_active (); - pp->wavelet.linkedg = linkedg->get_active (); + pp->wavelet.median = median->get_active(); + pp->wavelet.medianlev = medianlev->get_active(); + pp->wavelet.linkedg = linkedg->get_active(); // pp->wavelet.edgreinf = edgreinf->get_active (); - pp->wavelet.cbenab = cbenab->get_active (); - pp->wavelet.lipst = lipst->get_active (); + pp->wavelet.cbenab = cbenab->get_active(); + pp->wavelet.lipst = lipst->get_active(); pp->wavelet.contrast = contrast->getValue(); pp->wavelet.edgrad = edgrad->getValue(); + pp->wavelet.edgeffect = edgeffect->getValue(); pp->wavelet.edgval = edgval->getValue(); pp->wavelet.edgthresh = edgthresh->getValue(); pp->wavelet.thr = thr->getValue(); pp->wavelet.thrH = thrH->getValue(); + pp->wavelet.radius = radius->getValue(); pp->wavelet.hueskin = hueskin->getValue (); pp->wavelet.hueskin2 = hueskin2->getValue (); pp->wavelet.skinprotect = skinprotect->getValue(); @@ -1481,38 +2179,78 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.hllev = hllev->getValue (); pp->wavelet.bllev = bllev->getValue (); pp->wavelet.edgcont = edgcont->getValue (); + pp->wavelet.chrwav = chrwav->getValue(); + pp->wavelet.bluwav = bluwav->getValue(); pp->wavelet.level0noise = level0noise->getValue (); pp->wavelet.level1noise = level1noise->getValue (); pp->wavelet.level2noise = level2noise->getValue (); pp->wavelet.level3noise = level3noise->getValue (); - pp->wavelet.ccwcurve = ccshape->getCurve (); - pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve (); - pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve (); - pp->wavelet.opacityCurveW = opacityShape->getCurve (); - pp->wavelet.opacityCurveWL = opacityShapeWL->getCurve (); - pp->wavelet.hhcurve = hhshape->getCurve (); - pp->wavelet.Chcurve = Chshape->getCurve (); + pp->wavelet.leveldenoise = leveldenoise->getValue (); + pp->wavelet.levelsigm = levelsigm->getValue (); + pp->wavelet.ccwcurve = ccshape->getCurve(); + pp->wavelet.blcurve = blshape->getCurve(); + pp->wavelet.opacityCurveRG = opacityShapeRG->getCurve(); + //pp->wavelet.opacityCurveSH = opacityShapeSH->getCurve(); + pp->wavelet.opacityCurveBY = opacityShapeBY->getCurve(); + pp->wavelet.wavdenoise = wavdenoise->getCurve(); + pp->wavelet.wavdenoiseh = wavdenoiseh->getCurve(); + pp->wavelet.opacityCurveW = opacityShape->getCurve(); + pp->wavelet.opacityCurveWL = opacityShapeWL->getCurve(); + pp->wavelet.hhcurve = hhshape->getCurve(); + pp->wavelet.wavguidcurve = wavguidf->getCurve(); + pp->wavelet.wavhuecurve = wavhue->getCurve(); + pp->wavelet.Chcurve = Chshape->getCurve(); pp->wavelet.pastlev = pastlev->getValue (); pp->wavelet.satlev = satlev->getValue (); pp->wavelet.strength = (int) strength->getValue(); pp->wavelet.balance = (int) balance->getValue(); + pp->wavelet.balchrom = balchrom->getValue(); + pp->wavelet.sigm = sigm->getValue(); + pp->wavelet.levden = levden->getValue(); + pp->wavelet.thrden = thrden->getValue(); + pp->wavelet.limden = limden->getValue(); + pp->wavelet.ballum = ballum->getValue(); + pp->wavelet.chromfi = chromfi->getValue(); + pp->wavelet.chromco = chromco->getValue(); + double zerox = 0.; + double zeroy = 0.; + labgrid->getParams(pp->wavelet.labgridALow, pp->wavelet.labgridBLow, pp->wavelet.labgridAHigh, pp->wavelet.labgridBHigh, zerox, zeroy, zerox, zeroy); + pp->wavelet.labgridALow *= WaveletParams::LABGRID_CORR_MAX; + pp->wavelet.labgridAHigh *= WaveletParams::LABGRID_CORR_MAX; + pp->wavelet.labgridBLow *= WaveletParams::LABGRID_CORR_MAX; + pp->wavelet.labgridBHigh *= WaveletParams::LABGRID_CORR_MAX; - pp->wavelet.greenlow = greenlow->getValue (); - pp->wavelet.bluelow = bluelow->getValue (); - pp->wavelet.greenmed = greenmed->getValue (); - pp->wavelet.bluemed = bluemed->getValue (); - pp->wavelet.greenhigh = greenhigh->getValue (); - pp->wavelet.bluehigh = bluehigh->getValue (); + pp->wavelet.greenlow = greenlow->getValue(); + pp->wavelet.bluelow = bluelow->getValue(); + pp->wavelet.greenmed = greenmed->getValue(); + pp->wavelet.bluemed = bluemed->getValue(); + pp->wavelet.greenhigh = greenhigh->getValue(); + pp->wavelet.bluehigh = bluehigh->getValue(); + pp->wavelet.mergeL = mergeL->getValue(); + pp->wavelet.mergeC = mergeC->getValue(); + pp->wavelet.softrad = softrad->getValue(); + pp->wavelet.softradend = softradend->getValue(); + pp->wavelet.strend = strend->getValue(); + pp->wavelet.detend = detend->getIntValue(); + pp->wavelet.thrend = thrend->getValue(); pp->wavelet.expcontrast = expcontrast->getEnabled(); pp->wavelet.expchroma = expchroma->getEnabled(); pp->wavelet.expedge = expedge->getEnabled(); + pp->wavelet.expbl = expbl->getEnabled(); pp->wavelet.expresid = expresid->getEnabled(); pp->wavelet.expfinal = expfinal->getEnabled(); pp->wavelet.exptoning = exptoning->getEnabled(); pp->wavelet.expnoise = expnoise->getEnabled(); + pp->wavelet.expclari = expclari->getEnabled(); pp->wavelet.iter = (int) iter->getValue(); - pp->wavelet.wavclCurve = clshape->getCurve (); + pp->wavelet.wavclCurve = clshape->getCurve(); + pp->wavelet.sigmafin = sigmafin->getValue(); + pp->wavelet.sigmaton = sigmaton->getValue(); + pp->wavelet.sigmacol = sigmacol->getValue(); + pp->wavelet.sigmadir = sigmadir->getValue(); + pp->wavelet.rangeab = rangeab->getValue(); + pp->wavelet.protab = protab->getValue(); for (int i = 0; i < 9; i++) { pp->wavelet.c[i] = (int) correction[i]->getValue(); @@ -1525,6 +2263,8 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) if (pedited) { pedited->wavelet.enabled = !get_inconsistent(); pedited->wavelet.avoid = !avoid->get_inconsistent(); + pedited->wavelet.showmask = !showmask->get_inconsistent(); + pedited->wavelet.oldsh = !oldsh->get_inconsistent(); pedited->wavelet.tmr = !tmr->get_inconsistent(); pedited->wavelet.median = !median->get_inconsistent(); pedited->wavelet.medianlev = !medianlev->get_inconsistent(); @@ -1532,10 +2272,16 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.cbenab = !cbenab->get_inconsistent(); pedited->wavelet.lipst = !lipst->get_inconsistent(); pedited->wavelet.Medgreinf = Medgreinf->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.ushamethod = ushamethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Lmethod = Lmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.CLmethod = CLmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Backmethod = Backmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Tilesmethod = Tilesmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.complexmethod = complexmethod->get_active_text() != M("GENERAL_UNCHANGED"); + //pedited->wavelet.denmethod = denmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.mixmethod = mixmethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.slimethod = slimethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->wavelet.quamethod = quamethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.daubcoeffmethod = daubcoeffmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.CHmethod = CHmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.CHSLmethod = CHSLmethod->get_active_text() != M("GENERAL_UNCHANGED"); @@ -1546,10 +2292,17 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.HSmethod = HSmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.Dirmethod = Dirmethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->wavelet.edgthresh = edgthresh->getEditedState(); + pedited->wavelet.sigma = sigma->getEditedState(); + pedited->wavelet.offset = offset->getEditedState(); + pedited->wavelet.lowthr = lowthr->getEditedState(); pedited->wavelet.rescon = rescon->getEditedState(); pedited->wavelet.resconH = resconH->getEditedState(); pedited->wavelet.reschro = reschro->getEditedState(); + pedited->wavelet.resblur = resblur->getEditedState(); + pedited->wavelet.resblurc = resblurc->getEditedState(); pedited->wavelet.tmrs = tmrs->getEditedState(); + pedited->wavelet.edgs = edgs->getEditedState(); + pedited->wavelet.scale = scale->getEditedState(); pedited->wavelet.gamma = gamma->getEditedState(); pedited->wavelet.sup = sup->getEditedState(); pedited->wavelet.sky = sky->getEditedState(); @@ -1565,51 +2318,87 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pedited->wavelet.chro = chro->getEditedState(); pedited->wavelet.contrast = contrast->getEditedState(); pedited->wavelet.edgrad = edgrad->getEditedState(); + pedited->wavelet.edgeffect = edgeffect->getEditedState(); pedited->wavelet.edgval = edgval->getEditedState(); pedited->wavelet.thr = thr->getEditedState(); pedited->wavelet.thrH = thrH->getEditedState(); - pedited->wavelet.hueskin = hueskin->getEditedState (); - pedited->wavelet.hueskin2 = hueskin2->getEditedState (); + pedited->wavelet.radius = radius->getEditedState(); + pedited->wavelet.hueskin = hueskin->getEditedState(); + pedited->wavelet.hueskin2 = hueskin2->getEditedState(); pedited->wavelet.skinprotect = skinprotect->getEditedState(); - pedited->wavelet.hllev = hllev->getEditedState (); - pedited->wavelet.ccwcurve = !ccshape->isUnChanged (); - pedited->wavelet.edgcont = edgcont->getEditedState (); - pedited->wavelet.level0noise = level0noise->getEditedState (); - pedited->wavelet.level1noise = level1noise->getEditedState (); - pedited->wavelet.level2noise = level2noise->getEditedState (); - pedited->wavelet.level3noise = level3noise->getEditedState (); - pedited->wavelet.opacityCurveRG = !opacityShapeRG->isUnChanged (); - pedited->wavelet.opacityCurveBY = !opacityShapeBY->isUnChanged (); - pedited->wavelet.opacityCurveW = !opacityShape->isUnChanged (); - pedited->wavelet.opacityCurveWL = !opacityShapeWL->isUnChanged (); - pedited->wavelet.hhcurve = !hhshape->isUnChanged (); - pedited->wavelet.Chcurve = !Chshape->isUnChanged (); - pedited->wavelet.bllev = bllev->getEditedState (); - pedited->wavelet.pastlev = pastlev->getEditedState (); - pedited->wavelet.satlev = satlev->getEditedState (); - pedited->wavelet.strength = strength->getEditedState (); - pedited->wavelet.greenlow = greenlow->getEditedState (); - pedited->wavelet.bluelow = bluelow->getEditedState (); - pedited->wavelet.greenmed = greenmed->getEditedState (); - pedited->wavelet.bluemed = bluemed->getEditedState (); - pedited->wavelet.greenhigh = greenhigh->getEditedState (); - pedited->wavelet.bluehigh = bluehigh->getEditedState (); - pedited->wavelet.balance = balance->getEditedState (); - pedited->wavelet.iter = iter->getEditedState (); - pedited->wavelet.wavclCurve = !clshape->isUnChanged (); + pedited->wavelet.hllev = hllev->getEditedState(); + pedited->wavelet.ccwcurve = !ccshape->isUnChanged(); + pedited->wavelet.blcurve = !blshape->isUnChanged(); + pedited->wavelet.edgcont = edgcont->getEditedState(); + pedited->wavelet.chrwav = chrwav->getEditedState(); + pedited->wavelet.bluwav = bluwav->getEditedState(); + pedited->wavelet.level0noise = level0noise->getEditedState(); + pedited->wavelet.level1noise = level1noise->getEditedState(); + pedited->wavelet.level2noise = level2noise->getEditedState(); + pedited->wavelet.level3noise = level3noise->getEditedState(); + pedited->wavelet.leveldenoise = leveldenoise->getEditedState(); + pedited->wavelet.levelsigm = levelsigm->getEditedState(); + pedited->wavelet.opacityCurveRG = !opacityShapeRG->isUnChanged(); + //pedited->wavelet.opacityCurveSH = !opacityShapeSH->isUnChanged(); + pedited->wavelet.opacityCurveBY = !opacityShapeBY->isUnChanged(); + pedited->wavelet.wavdenoise = !wavdenoise->isUnChanged(); + pedited->wavelet.wavdenoiseh = !wavdenoiseh->isUnChanged(); + pedited->wavelet.opacityCurveW = !opacityShape->isUnChanged(); + pedited->wavelet.opacityCurveWL = !opacityShapeWL->isUnChanged(); + pedited->wavelet.hhcurve = !hhshape->isUnChanged(); + pedited->wavelet.wavguidcurve = !wavguidf->isUnChanged(); + pedited->wavelet.wavhuecurve = !wavhue->isUnChanged(); + pedited->wavelet.Chcurve = !Chshape->isUnChanged(); + pedited->wavelet.bllev = bllev->getEditedState(); + pedited->wavelet.pastlev = pastlev->getEditedState(); + pedited->wavelet.satlev = satlev->getEditedState(); + pedited->wavelet.strength = strength->getEditedState(); + pedited->wavelet.greenlow = greenlow->getEditedState(); + pedited->wavelet.bluelow = bluelow->getEditedState(); + pedited->wavelet.greenmed = greenmed->getEditedState(); + pedited->wavelet.bluemed = bluemed->getEditedState(); + pedited->wavelet.greenhigh = greenhigh->getEditedState(); + pedited->wavelet.bluehigh = bluehigh->getEditedState(); + pedited->wavelet.sigm = sigm->getEditedState(); + pedited->wavelet.levden = levden->getEditedState(); + pedited->wavelet.thrden = thrden->getEditedState(); + pedited->wavelet.limden = limden->getEditedState(); + pedited->wavelet.ballum = ballum->getEditedState(); + pedited->wavelet.balchrom = balchrom->getEditedState(); + pedited->wavelet.chromfi = chromfi->getEditedState(); + pedited->wavelet.chromco = chromco->getEditedState(); + pedited->wavelet.mergeL = mergeL->getEditedState(); + pedited->wavelet.mergeC = mergeC->getEditedState(); + pedited->wavelet.softrad = softrad->getEditedState(); + pedited->wavelet.softradend = softradend->getEditedState(); + pedited->wavelet.strend = strend->getEditedState(); + pedited->wavelet.detend = detend->getEditedState(); + pedited->wavelet.thrend = thrend->getEditedState(); + pedited->wavelet.balance = balance->getEditedState(); + pedited->wavelet.iter = iter->getEditedState(); + pedited->wavelet.sigmafin = sigmafin->getEditedState(); + pedited->wavelet.sigmaton = sigmaton->getEditedState(); + pedited->wavelet.sigmacol = sigmacol->getEditedState(); + pedited->wavelet.sigmadir = sigmadir->getEditedState(); + pedited->wavelet.rangeab = rangeab->getEditedState(); + pedited->wavelet.protab = protab->getEditedState(); + pedited->wavelet.wavclCurve = !clshape->isUnChanged(); pedited->wavelet.expcontrast = !expcontrast->get_inconsistent(); pedited->wavelet.expchroma = !expchroma->get_inconsistent(); pedited->wavelet.expedge = !expedge->get_inconsistent(); + pedited->wavelet.expbl = !expbl->get_inconsistent(); pedited->wavelet.expresid = !expresid->get_inconsistent(); pedited->wavelet.expfinal = !expfinal->get_inconsistent(); pedited->wavelet.exptoning = !exptoning->get_inconsistent(); pedited->wavelet.expnoise = !expnoise->get_inconsistent(); + pedited->wavelet.expclari = !expclari->get_inconsistent(); + pedited->wavelet.labgridALow = pedited->wavelet.labgridBLow = pedited->wavelet.labgridAHigh = pedited->wavelet.labgridBHigh = labgrid->getEdited(); - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { pedited->wavelet.c[i] = correction[i]->getEditedState(); } - for(int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) { pedited->wavelet.ch[i] = correctionch[i]->getEditedState(); } @@ -1631,6 +2420,15 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Medgreinf = "less"; } +// if (ushamethod->get_active_row_number() == 0) { +// pp->wavelet.ushamethod = "none"; +// } else + if (ushamethod->get_active_row_number() == 0) { + pp->wavelet.ushamethod = "sharp"; + } else if (ushamethod->get_active_row_number() == 1) { + pp->wavelet.ushamethod = "clari"; + } + if (CHSLmethod->get_active_row_number() == 0) { pp->wavelet.CHSLmethod = "SL"; } else if (CHSLmethod->get_active_row_number() == 1) { @@ -1696,8 +2494,48 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Tilesmethod = "full"; } else if (Tilesmethod->get_active_row_number() == 1) { pp->wavelet.Tilesmethod = "big"; - } else if (Tilesmethod->get_active_row_number() == 2) { - pp->wavelet.Tilesmethod = "lit"; +// } else if (Tilesmethod->get_active_row_number() == 2) { +// pp->wavelet.Tilesmethod = "lit"; + } + + if (complexmethod->get_active_row_number() == 0) { + pp->wavelet.complexmethod = "normal"; + } else if (complexmethod->get_active_row_number() == 1) { + pp->wavelet.complexmethod = "expert"; + } + + //if (denmethod->get_active_row_number() == 0) { + // pp->wavelet.denmethod = "equ"; + //} else if (denmethod->get_active_row_number() == 1) { + // pp->wavelet.denmethod = "high"; + //} else if (denmethod->get_active_row_number() == 2) { + // pp->wavelet.denmethod = "low"; + //} else if (denmethod->get_active_row_number() == 3) { + // pp->wavelet.denmethod = "12high"; + //} else if (denmethod->get_active_row_number() == 4) { + // pp->wavelet.denmethod = "12low"; + //} + + if (mixmethod->get_active_row_number() == 0) { + pp->wavelet.mixmethod = "nois"; + } else if (mixmethod->get_active_row_number() == 1) { + pp->wavelet.mixmethod = "mix"; + } else if (mixmethod->get_active_row_number() == 2) { + pp->wavelet.mixmethod = "mix7"; + } else if (mixmethod->get_active_row_number() == 3) { + pp->wavelet.mixmethod = "den"; + } + + if (slimethod->get_active_row_number() == 0) { + pp->wavelet.slimethod = "sli"; + } else if (slimethod->get_active_row_number() == 1) { + pp->wavelet.slimethod = "cur"; + } + + if (quamethod->get_active_row_number() == 0) { + pp->wavelet.quamethod = "cons"; + } else if (quamethod->get_active_row_number() == 1) { + pp->wavelet.quamethod = "agre"; } if (daubcoeffmethod->get_active_row_number() == 0) { @@ -1725,31 +2563,43 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) pp->wavelet.Lmethod = Lmethod->get_active_row_number() + 1; } -void Wavelet::curveChanged (CurveEditor* ce) +void Wavelet::curveChanged(CurveEditor* ce) { if (listener && getEnabled()) { if (ce == ccshape) { - listener->panelChanged (EvWavCCCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavCCCurve, M("HISTORY_CUSTOMCURVE")); + } else if (ce == blshape) { + listener->panelChanged(EvWavblshape, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeRG) { - listener->panelChanged (EvWavColor, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavColor, M("HISTORY_CUSTOMCURVE")); + //} else if (ce == opacityShapeSH) { + // listener->panelChanged(EvWavlevelshc, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeBY) { - listener->panelChanged (EvWavOpac, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavOpac, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavdenoise) { + listener->panelChanged(EvWavdenoise, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavdenoiseh) { + listener->panelChanged(EvWavdenoiseh, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShape) { - listener->panelChanged (EvWavopacity, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavopacity, M("HISTORY_CUSTOMCURVE")); } else if (ce == opacityShapeWL) { - listener->panelChanged (EvWavopacityWL, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavopacityWL, M("HISTORY_CUSTOMCURVE")); } else if (ce == hhshape) { - listener->panelChanged (EvWavHHCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavHHCurve, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavguidf) { + listener->panelChanged(EvWavguid, M("HISTORY_CUSTOMCURVE")); + } else if (ce == wavhue) { + listener->panelChanged(EvWavhue, M("HISTORY_CUSTOMCURVE")); } else if (ce == Chshape) { - listener->panelChanged (EvWavCHCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavCHCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == clshape) { - listener->panelChanged (EvWavCLCurve, M("HISTORY_CUSTOMCURVE")); + listener->panelChanged(EvWavCLCurve, M("HISTORY_CUSTOMCURVE")); } } } -void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +void Wavelet::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { for (int i = 0; i < 9; i++) { @@ -1760,32 +2610,47 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi correctionch[i]->setDefault(defParams->wavelet.ch[i]); } - strength->setDefault(defParams->wavelet.strength ); - balance->setDefault(defParams->wavelet.balance ); - iter->setDefault(defParams->wavelet.iter ); - rescon->setDefault (defParams->wavelet.rescon); - resconH->setDefault (defParams->wavelet.resconH); - reschro->setDefault (defParams->wavelet.reschro); - tmrs->setDefault (defParams->wavelet.tmrs); - gamma->setDefault (defParams->wavelet.gamma); - sup->setDefault (defParams->wavelet.sup); - sky->setDefault (defParams->wavelet.sky); - thres->setDefault (defParams->wavelet.thres); - threshold->setDefault (defParams->wavelet.threshold); - threshold2->setDefault (defParams->wavelet.threshold2); - edgedetect->setDefault (defParams->wavelet.edgedetect); - edgedetectthr->setDefault (defParams->wavelet.edgedetectthr); - edgedetectthr2->setDefault (defParams->wavelet.edgedetectthr2); - edgesensi->setDefault (defParams->wavelet.edgesensi); - edgeampli->setDefault (defParams->wavelet.edgeampli); - chroma->setDefault (defParams->wavelet.chroma); - chro->setDefault (defParams->wavelet.chro); - contrast->setDefault (defParams->wavelet.contrast); - edgrad->setDefault (defParams->wavelet.edgrad); - edgval->setDefault (defParams->wavelet.edgval); - edgthresh->setDefault (defParams->wavelet.edgthresh); - thr->setDefault (defParams->wavelet.thr); - thrH->setDefault (defParams->wavelet.thrH); + strength->setDefault(defParams->wavelet.strength); + balance->setDefault(defParams->wavelet.balance); + iter->setDefault(defParams->wavelet.iter); + sigmafin->setDefault(defParams->wavelet.sigmafin); + sigmaton->setDefault(defParams->wavelet.sigmaton); + sigmacol->setDefault(defParams->wavelet.sigmacol); + sigmadir->setDefault(defParams->wavelet.sigmadir); + sigma->setDefault(defParams->wavelet.sigma); + rangeab->setDefault(defParams->wavelet.rangeab); + protab->setDefault(defParams->wavelet.protab); + offset->setDefault(defParams->wavelet.offset); + lowthr->setDefault(defParams->wavelet.lowthr); + rescon->setDefault(defParams->wavelet.rescon); + resconH->setDefault(defParams->wavelet.resconH); + reschro->setDefault(defParams->wavelet.reschro); + resblur->setDefault(defParams->wavelet.resblur); + resblurc->setDefault(defParams->wavelet.resblurc); + tmrs->setDefault(defParams->wavelet.tmrs); + edgs->setDefault(defParams->wavelet.edgs); + scale->setDefault(defParams->wavelet.scale); + gamma->setDefault(defParams->wavelet.gamma); + sup->setDefault(defParams->wavelet.sup); + sky->setDefault(defParams->wavelet.sky); + thres->setDefault(defParams->wavelet.thres); + threshold->setDefault(defParams->wavelet.threshold); + threshold2->setDefault(defParams->wavelet.threshold2); + edgedetect->setDefault(defParams->wavelet.edgedetect); + edgedetectthr->setDefault(defParams->wavelet.edgedetectthr); + edgedetectthr2->setDefault(defParams->wavelet.edgedetectthr2); + edgesensi->setDefault(defParams->wavelet.edgesensi); + edgeampli->setDefault(defParams->wavelet.edgeampli); + chroma->setDefault(defParams->wavelet.chroma); + chro->setDefault(defParams->wavelet.chro); + contrast->setDefault(defParams->wavelet.contrast); + edgrad->setDefault(defParams->wavelet.edgrad); + edgeffect->setDefault(defParams->wavelet.edgeffect); + edgval->setDefault(defParams->wavelet.edgval); + edgthresh->setDefault(defParams->wavelet.edgthresh); + thr->setDefault(defParams->wavelet.thr); + thrH->setDefault(defParams->wavelet.thrH); + radius->setDefault(defParams->wavelet.radius); hueskin->setDefault (defParams->wavelet.hueskin); hueskin2->setDefault (defParams->wavelet.hueskin2); hllev->setDefault (defParams->wavelet.hllev); @@ -1793,32 +2658,75 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi pastlev->setDefault (defParams->wavelet.pastlev); satlev->setDefault (defParams->wavelet.satlev); edgcont->setDefault (defParams->wavelet.edgcont); + chrwav->setDefault(defParams->wavelet.chrwav); + bluwav->setDefault(defParams->wavelet.bluwav); level0noise->setDefault (defParams->wavelet.level0noise); level1noise->setDefault (defParams->wavelet.level1noise); level2noise->setDefault (defParams->wavelet.level2noise); level3noise->setDefault (defParams->wavelet.level3noise); + leveldenoise->setDefault (defParams->wavelet.leveldenoise); + levelsigm->setDefault (defParams->wavelet.levelsigm); + sigm->setDefault(defParams->wavelet.sigm); + levden->setDefault(defParams->wavelet.levden); + thrden->setDefault(defParams->wavelet.thrden); + limden->setDefault(defParams->wavelet.limden); + ballum->setDefault(defParams->wavelet.ballum); + balchrom->setDefault(defParams->wavelet.balchrom); + chromfi->setDefault(defParams->wavelet.chromfi); + chromco->setDefault(defParams->wavelet.chromco); + labgrid->setDefault(defParams->wavelet.labgridALow / WaveletParams::LABGRID_CORR_MAX, defParams->wavelet.labgridBLow / WaveletParams::LABGRID_CORR_MAX, defParams->wavelet.labgridAHigh / WaveletParams::LABGRID_CORR_MAX, defParams->wavelet.labgridBHigh / WaveletParams::LABGRID_CORR_MAX, 0, 0, 0, 0); - greenlow->setDefault (defParams->wavelet.greenlow); - bluelow->setDefault (defParams->wavelet.bluelow); - greenmed->setDefault (defParams->wavelet.greenmed); - bluemed->setDefault (defParams->wavelet.bluemed); - greenhigh->setDefault (defParams->wavelet.greenhigh); - bluehigh->setDefault (defParams->wavelet.bluehigh); + greenlow->setDefault(defParams->wavelet.greenlow); + bluelow->setDefault(defParams->wavelet.bluelow); + greenmed->setDefault(defParams->wavelet.greenmed); + bluemed->setDefault(defParams->wavelet.bluemed); + greenhigh->setDefault(defParams->wavelet.greenhigh); + bluehigh->setDefault(defParams->wavelet.bluehigh); + mergeL->setDefault(defParams->wavelet.mergeL); + mergeC->setDefault(defParams->wavelet.mergeC); + softrad->setDefault(defParams->wavelet.softrad); + softradend->setDefault(defParams->wavelet.softradend); + strend->setDefault(defParams->wavelet.strend); + detend->setDefault(defParams->wavelet.detend); + thrend->setDefault(defParams->wavelet.thrend); if (pedited) { - greenlow->setDefaultEditedState (pedited->wavelet.greenlow ? Edited : UnEdited); - bluelow->setDefaultEditedState (pedited->wavelet.bluelow ? Edited : UnEdited); - greenmed->setDefaultEditedState (pedited->wavelet.greenmed ? Edited : UnEdited); - bluemed->setDefaultEditedState (pedited->wavelet.bluemed ? Edited : UnEdited); - greenhigh->setDefaultEditedState (pedited->wavelet.greenhigh ? Edited : UnEdited); - bluehigh->setDefaultEditedState (pedited->wavelet.bluehigh ? Edited : UnEdited); + greenlow->setDefaultEditedState(pedited->wavelet.greenlow ? Edited : UnEdited); + bluelow->setDefaultEditedState(pedited->wavelet.bluelow ? Edited : UnEdited); + greenmed->setDefaultEditedState(pedited->wavelet.greenmed ? Edited : UnEdited); + bluemed->setDefaultEditedState(pedited->wavelet.bluemed ? Edited : UnEdited); + greenhigh->setDefaultEditedState(pedited->wavelet.greenhigh ? Edited : UnEdited); + bluehigh->setDefaultEditedState(pedited->wavelet.bluehigh ? Edited : UnEdited); + mergeL->setDefaultEditedState(pedited->wavelet.mergeL ? Edited : UnEdited); + mergeC->setDefaultEditedState(pedited->wavelet.mergeC ? Edited : UnEdited); + softrad->setDefaultEditedState(pedited->wavelet.softrad ? Edited : UnEdited); + softradend->setDefaultEditedState(pedited->wavelet.softradend ? Edited : UnEdited); + strend->setDefaultEditedState(pedited->wavelet.strend ? Edited : UnEdited); + detend->setDefaultEditedState(pedited->wavelet.detend ? Edited : UnEdited); + thrend->setDefaultEditedState(pedited->wavelet.thrend ? Edited : UnEdited); + sigm->setDefaultEditedState(pedited->wavelet.sigm ? Edited : UnEdited); + levden->setDefaultEditedState(pedited->wavelet.levden ? Edited : UnEdited); + thrden->setDefaultEditedState(pedited->wavelet.thrden ? Edited : UnEdited); + limden->setDefaultEditedState(pedited->wavelet.limden ? Edited : UnEdited); + ballum->setDefaultEditedState(pedited->wavelet.ballum ? Edited : UnEdited); + balchrom->setDefaultEditedState(pedited->wavelet.balchrom ? Edited : UnEdited); + chromfi->setDefaultEditedState(pedited->wavelet.chromfi ? Edited : UnEdited); + chromco->setDefaultEditedState(pedited->wavelet.chromco ? Edited : UnEdited); + labgrid->setEdited((pedited->wavelet.labgridALow || pedited->wavelet.labgridBLow || pedited->wavelet.labgridAHigh || pedited->wavelet.labgridBHigh) ? Edited : UnEdited); - rescon->setDefault (defParams->wavelet.rescon); - resconH->setDefault (defParams->wavelet.resconH); - reschro->setDefault (defParams->wavelet.reschro); - tmrs->setDefault (defParams->wavelet.tmrs); - gamma->setDefault (defParams->wavelet.gamma); - sup->setDefault (defParams->wavelet.sup); + sigma->setDefault(defParams->wavelet.sigma); + offset->setDefault(defParams->wavelet.offset); + lowthr->setDefault(defParams->wavelet.lowthr); + rescon->setDefault(defParams->wavelet.rescon); + resconH->setDefault(defParams->wavelet.resconH); + reschro->setDefault(defParams->wavelet.reschro); + resblur->setDefault(defParams->wavelet.resblur); + resblurc->setDefault(defParams->wavelet.resblurc); + tmrs->setDefault(defParams->wavelet.tmrs); + edgs->setDefault(defParams->wavelet.edgs); + scale->setDefault(defParams->wavelet.scale); + gamma->setDefault(defParams->wavelet.gamma); + sup->setDefault(defParams->wavelet.sup); sky->setDefaultEditedState(pedited->wavelet.sky ? Edited : UnEdited); thres->setDefaultEditedState(pedited->wavelet.thres ? Edited : UnEdited); threshold->setDefaultEditedState(pedited->wavelet.threshold ? Edited : UnEdited); @@ -1832,10 +2740,12 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi chro->setDefaultEditedState(pedited->wavelet.chro ? Edited : UnEdited); contrast->setDefaultEditedState(pedited->wavelet.contrast ? Edited : UnEdited); edgrad->setDefaultEditedState(pedited->wavelet.edgrad ? Edited : UnEdited); + edgeffect->setDefaultEditedState(pedited->wavelet.edgeffect ? Edited : UnEdited); edgval->setDefaultEditedState(pedited->wavelet.edgval ? Edited : UnEdited); - edgthresh->setDefault (defParams->wavelet.edgthresh); + edgthresh->setDefault(defParams->wavelet.edgthresh); thr->setDefaultEditedState(pedited->wavelet.thr ? Edited : UnEdited); thrH->setDefaultEditedState(pedited->wavelet.thrH ? Edited : UnEdited); + radius->setDefaultEditedState(pedited->wavelet.radius ? Edited : UnEdited); skinprotect->setDefaultEditedState(pedited->wavelet.skinprotect ? Edited : UnEdited); hueskin->setDefaultEditedState(pedited->wavelet.hueskin ? Edited : UnEdited); hueskin2->setDefaultEditedState(pedited->wavelet.hueskin2 ? Edited : UnEdited); @@ -1844,13 +2754,23 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi pastlev->setDefaultEditedState(pedited->wavelet.pastlev ? Edited : UnEdited); satlev->setDefaultEditedState(pedited->wavelet.satlev ? Edited : UnEdited); edgcont->setDefaultEditedState(pedited->wavelet.edgcont ? Edited : UnEdited); + chrwav->setDefaultEditedState(pedited->wavelet.chrwav ? Edited : UnEdited); + bluwav->setDefaultEditedState(pedited->wavelet.bluwav ? Edited : UnEdited); strength->setDefaultEditedState(pedited->wavelet.strength ? Edited : UnEdited); balance->setDefaultEditedState(pedited->wavelet.balance ? Edited : UnEdited); iter->setDefaultEditedState(pedited->wavelet.iter ? Edited : UnEdited); + sigmafin->setDefaultEditedState(pedited->wavelet.sigmafin ? Edited : UnEdited); + sigmaton->setDefaultEditedState(pedited->wavelet.sigmaton ? Edited : UnEdited); + sigmacol->setDefaultEditedState(pedited->wavelet.sigmacol ? Edited : UnEdited); + sigmadir->setDefaultEditedState(pedited->wavelet.sigmadir ? Edited : UnEdited); + rangeab->setDefaultEditedState(pedited->wavelet.rangeab ? Edited : UnEdited); + protab->setDefaultEditedState(pedited->wavelet.protab ? Edited : UnEdited); level0noise->setDefaultEditedState(pedited->wavelet.level0noise ? Edited : UnEdited); level1noise->setDefaultEditedState(pedited->wavelet.level1noise ? Edited : UnEdited); level2noise->setDefaultEditedState(pedited->wavelet.level2noise ? Edited : UnEdited); level3noise->setDefaultEditedState(pedited->wavelet.level3noise ? Edited : UnEdited); + leveldenoise->setDefaultEditedState(pedited->wavelet.leveldenoise ? Edited : UnEdited); + levelsigm->setDefaultEditedState(pedited->wavelet.levelsigm ? Edited : UnEdited); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(pedited->wavelet.c[i] ? Edited : UnEdited); @@ -1860,10 +2780,17 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi correctionch[i]->setDefaultEditedState(pedited->wavelet.ch[i] ? Edited : UnEdited); } } else { + sigma->setDefaultEditedState(Irrelevant); + offset->setDefaultEditedState(Irrelevant); + lowthr->setDefaultEditedState(Irrelevant); rescon->setDefaultEditedState(Irrelevant); resconH->setDefaultEditedState(Irrelevant); reschro->setDefaultEditedState(Irrelevant); + resblur->setDefaultEditedState(Irrelevant); + resblurc->setDefaultEditedState(Irrelevant); tmrs->setDefaultEditedState(Irrelevant); + edgs->setDefaultEditedState(Irrelevant); + scale->setDefaultEditedState(Irrelevant); gamma->setDefaultEditedState(Irrelevant); sup->setDefaultEditedState(Irrelevant); sky->setDefaultEditedState(Irrelevant); @@ -1879,25 +2806,38 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi chro->setDefaultEditedState(Irrelevant); contrast->setDefaultEditedState(Irrelevant); edgrad->setDefaultEditedState(Irrelevant); + edgeffect->setDefaultEditedState(Irrelevant); edgval->setDefaultEditedState(Irrelevant); edgthresh->setDefaultEditedState(Irrelevant); thr->setDefaultEditedState(Irrelevant); thrH->setDefaultEditedState(Irrelevant); + radius->setDefaultEditedState(Irrelevant); skinprotect->setDefaultEditedState(Irrelevant); - hueskin->setDefaultEditedState (Irrelevant); - hueskin2->setDefaultEditedState (Irrelevant); - hllev->setDefaultEditedState (Irrelevant); - bllev->setDefaultEditedState (Irrelevant); - edgcont->setDefaultEditedState (Irrelevant); - level0noise->setDefaultEditedState (Irrelevant); - level1noise->setDefaultEditedState (Irrelevant); - level2noise->setDefaultEditedState (Irrelevant); - level3noise->setDefaultEditedState (Irrelevant); - pastlev->setDefaultEditedState (Irrelevant); - satlev->setDefaultEditedState (Irrelevant); - strength->setDefaultEditedState (Irrelevant); - balance->setDefaultEditedState (Irrelevant); - iter->setDefaultEditedState (Irrelevant); + hueskin->setDefaultEditedState(Irrelevant); + hueskin2->setDefaultEditedState(Irrelevant); + hllev->setDefaultEditedState(Irrelevant); + bllev->setDefaultEditedState(Irrelevant); + edgcont->setDefaultEditedState(Irrelevant); + chrwav->setDefaultEditedState(Irrelevant); + bluwav->setDefaultEditedState(Irrelevant); + level0noise->setDefaultEditedState(Irrelevant); + level1noise->setDefaultEditedState(Irrelevant); + level2noise->setDefaultEditedState(Irrelevant); + level3noise->setDefaultEditedState(Irrelevant); + leveldenoise->setDefaultEditedState(Irrelevant); + levelsigm->setDefaultEditedState(Irrelevant); + pastlev->setDefaultEditedState(Irrelevant); + satlev->setDefaultEditedState(Irrelevant); + strength->setDefaultEditedState(Irrelevant); + balance->setDefaultEditedState(Irrelevant); + iter->setDefaultEditedState(Irrelevant); + sigmafin->setDefaultEditedState(Irrelevant); + sigmaton->setDefaultEditedState(Irrelevant); + sigmacol->setDefaultEditedState(Irrelevant); + sigmadir->setDefaultEditedState(Irrelevant); + rangeab->setDefaultEditedState(Irrelevant); + protab->setDefaultEditedState(Irrelevant); + labgrid->setEdited(Edited); for (int i = 0; i < 9; i++) { correction[i]->setDefaultEditedState(Irrelevant); @@ -1911,19 +2851,26 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi void Wavelet::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) { - if (listener && (multiImage || getEnabled()) ) { - if(a == level0noise) { - listener->panelChanged (EvWavlev0nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); - } else if(a == level1noise) { - listener->panelChanged (EvWavlev1nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); - } else if(a == level2noise) { - listener->panelChanged (EvWavlev2nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); - } else if(a == level3noise) { - listener->panelChanged (EvWavlev3nois, - Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + if (listener && (multiImage || getEnabled())) { + if (a == level0noise) { + listener->panelChanged(EvWavlev0nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == level1noise) { + listener->panelChanged(EvWavlev1nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == level2noise) { + listener->panelChanged(EvWavlev2nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == level3noise) { + listener->panelChanged(EvWavlev3nois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_STREN") + ": %2"), int(newTop), int(newBottom))); + } else if (a == leveldenoise) { + listener->panelChanged(EvWavlevdenois, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_NOIS") + ": %1" + "\n" + M("TP_WAVELET_DEN5THR") + ": %2"), int(newTop), int(newBottom))); + } else if (a == levelsigm) { + usleep(150); + listener->panelChanged(EvWavlevelsigm, + Glib::ustring::compose(Glib::ustring(M("TP_WAVELET_LEVELLOW") + ": %1" + "\n" + M("TP_WAVELET_LEVELHIGH") + ": %2"), (newTop), (newBottom))); } } @@ -1943,21 +2890,21 @@ void Wavelet::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTo void Wavelet::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) { - if (listener && (multiImage || getEnabled()) ) { - if(a == hueskin) { - listener->panelChanged (EvWavHueskin, hueskin->getHistoryString()); - } else if(a == hueskin2) { - listener->panelChanged (EvWavHueskin2, hueskin2->getHistoryString()); - } else if(a == hllev) { - listener->panelChanged (EvWavlhl, hllev->getHistoryString()); - } else if(a == bllev) { - listener->panelChanged (EvWavlbl, bllev->getHistoryString()); - } else if(a == pastlev) { - listener->panelChanged (EvWavpast, pastlev->getHistoryString()); - } else if(a == satlev) { - listener->panelChanged (EvWavsat, satlev->getHistoryString()); - } else if(a == edgcont) { - listener->panelChanged (EvWavedgcont, edgcont->getHistoryString()); + if (listener && (multiImage || getEnabled())) { + if (a == hueskin) { + listener->panelChanged(EvWavHueskin, hueskin->getHistoryString()); + } else if (a == hueskin2) { + listener->panelChanged(EvWavHueskin2, hueskin2->getHistoryString()); + } else if (a == hllev) { + listener->panelChanged(EvWavlhl, hllev->getHistoryString()); + } else if (a == bllev) { + listener->panelChanged(EvWavlbl, bllev->getHistoryString()); + } else if (a == pastlev) { + listener->panelChanged(EvWavpast, pastlev->getHistoryString()); + } else if (a == satlev) { + listener->panelChanged(EvWavsat, satlev->getHistoryString()); + } else if (a == edgcont) { + listener->panelChanged(EvWavedgcont, edgcont->getHistoryString()); } } } @@ -1965,16 +2912,18 @@ void Wavelet::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL void Wavelet::HSmethodUpdateUI() { if (!batchMode) { - if(HSmethod->get_active_row_number() == 0) { //without + if (HSmethod->get_active_row_number() == 0) { //without hllev->hide(); bllev->hide(); threshold->hide(); threshold2->hide(); + //curveEditorC->hide(); } else { //with hllev->show(); bllev->show(); threshold->show(); threshold2->show(); + //curveEditorC->show(); } } } @@ -1983,16 +2932,17 @@ void Wavelet::HSmethodChanged() { HSmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavHSmet, HSmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavHSmet, HSmethod->get_active_text()); } } void Wavelet::CHmethodUpdateUI() { if (!batchMode) { - if(CHmethod->get_active_row_number() == 0) { + if (CHmethod->get_active_row_number() == 0) { CHSLmethod->show(); + // sigmacol->show(); pastlev->hide(); satlev->hide(); chroma->hide(); @@ -2003,15 +2953,16 @@ void Wavelet::CHmethodUpdateUI() int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } - } else if(CHmethod->get_active_row_number() == 1) { + } else if (CHmethod->get_active_row_number() == 1) { CHSLmethod->show(); + // sigmacol->show(); pastlev->show(); satlev->show(); chroma->show(); @@ -2022,15 +2973,16 @@ void Wavelet::CHmethodUpdateUI() int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } } else { chro->show(); + // sigmacol->hide(); pastlev->hide(); satlev->hide(); chroma->hide(); @@ -2050,8 +3002,8 @@ void Wavelet::CHmethodChanged() { CHmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavCHmet, CHmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavCHmet, CHmethod->get_active_text()); } } @@ -2090,10 +3042,10 @@ void Wavelet::CHSLmethodChanged() void Wavelet::EDmethodUpdateUI() { if (!batchMode) { - if(EDmethod->get_active_row_number() == 0 ) { //SL + if (EDmethod->get_active_row_number() == 0) { //SL CCWcurveEditorG->hide(); edgcont->show(); - } else if(EDmethod->get_active_row_number() == 1) { //CU + } else if (EDmethod->get_active_row_number() == 1) { //CU CCWcurveEditorG->show(); edgcont->hide(); } @@ -2103,8 +3055,8 @@ void Wavelet::EDmethodChanged() { EDmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavEDmet, EDmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavEDmet, EDmethod->get_active_text()); } } @@ -2118,8 +3070,8 @@ void Wavelet::NPmethodChanged() { NPmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavNPmet, NPmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavNPmet, NPmethod->get_active_text()); } } @@ -2128,19 +3080,22 @@ void Wavelet::NPmethodChanged() void Wavelet::BAmethodUpdateUI() { if (!batchMode) { - if(BAmethod->get_active_row_number() == 0 ) { //none + if (BAmethod->get_active_row_number() == 0) { //none balance->hide(); opacityCurveEditorW->hide(); iter->hide(); + tmr->hide(); - } else if(BAmethod->get_active_row_number() == 1) { //sli + } else if (BAmethod->get_active_row_number() == 1) { //sli opacityCurveEditorW->hide(); balance->show(); iter->show(); - } else if(BAmethod->get_active_row_number() == 2) { //CU + tmr->show(); + } else if (BAmethod->get_active_row_number() == 2) { //CU opacityCurveEditorW->show(); balance->hide(); iter->show(); + tmr->show(); } } } @@ -2148,8 +3103,8 @@ void Wavelet::BAmethodChanged() { BAmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavBAmet, BAmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavBAmet, BAmethod->get_active_text()); } } @@ -2166,14 +3121,22 @@ void Wavelet::TMmethodUpdateUI() } } */ + if (TMmethod->get_active_row_number() == 1) { + edgs->show(); + scale->show(); + } else if (TMmethod->get_active_row_number() == 0) { + edgs->hide(); + scale->hide(); + } + } void Wavelet::TMmethodChanged() { TMmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavTMmet, TMmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavTMmet, TMmethod->get_active_text()); } } @@ -2187,8 +3150,8 @@ void Wavelet::BackmethodUpdateUI() { void Wavelet::BackmethodChanged() { //BackmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavBackmet, Backmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavBackmet, Backmethod->get_active_text()); } } @@ -2196,19 +3159,19 @@ void Wavelet::CLmethodUpdateUI() { if (!batchMode) { if (CLmethod->get_active_row_number() == 0) { - CLmethod->set_active (0); + CLmethod->set_active(0); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); } else if (CLmethod->get_active_row_number() == 1) { - CLmethod->set_active (1); + CLmethod->set_active(1); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); } else if (CLmethod->get_active_row_number() == 2) { - CLmethod->set_active (2); + CLmethod->set_active(2); Lmethod->set_sensitive(true); Dirmethod->set_sensitive(true); } else if (CLmethod->get_active_row_number() == 3) { - CLmethod->set_active (3); + CLmethod->set_active(3); Lmethod->set_sensitive(false); Dirmethod->set_sensitive(false); } @@ -2219,8 +3182,8 @@ void Wavelet::CLmethodChanged() { CLmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavCLmet, CLmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavCLmet, CLmethod->get_active_text()); } } @@ -2231,11 +3194,250 @@ void Wavelet::TilesmethodUpdateUI() { } */ + +void Wavelet::ushamethodChanged() +{ + if (ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { + Backmethod->set_active(2); + CLmethod->set_active(2); + Lmethod->set_active(6); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + Dirmethod->set_active(3); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); + } else if (ushamethod->get_active_row_number() == 0 && expclari->getEnabled() == true) { + Backmethod->set_active(0); + CLmethod->set_active(1); + Lmethod->set_active(2); + Dirmethod->set_active(3); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); + /* } else if (ushamethod->get_active_row_number() == 0 || expclari->getEnabled() == false) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + */ + } else if (expclari->getEnabled() == false) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + CLmethod->set_sensitive(true); + Backmethod->set_sensitive(true); + } + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavushamet, ushamethod->get_active_text()); + } +} + + + +void Wavelet::convertParamToNormal() +{ + const WaveletParams def_params; + disableListener(); + //contrast + offset->setValue(def_params.offset); + sigma->setValue(def_params.sigma); + lowthr->setValue(def_params.lowthr); + //chroma + expchroma->setEnabled(def_params.expchroma); + sigmacol->setValue(def_params.sigmacol); + CHmethod->set_active(2); + //denoise + chromfi->setValue(def_params.chromfi); + chromco->setValue(def_params.chromco); + //denmethod->set_active(4); + mixmethod->set_active(2); + slimethod->set_active(0); + levelsigm->setValue(def_params.levelsigm); + leveldenoise->setValue(def_params.leveldenoise); + limden->setValue(def_params.limden); + thrden->setValue(def_params.thrden); +// quamethod->set_active(0); + sigm->setValue(def_params.sigm); + //toning + exptoning->setEnabled(def_params.exptoning); + //gamut + median->set_active(def_params.median); + avoid->set_active(def_params.avoid); + hueskin->setValue(def_params.hueskin); + skinprotect->setValue(def_params.skinprotect); + //blur + expbl->setEnabled(def_params.expbl); + //edge sharpness + lipst->set_active(def_params.lipst); + lipstUpdateUI(); + edgesensi->setValue(def_params.edgesensi); + edgeampli->setValue(def_params.edgeampli); + NPmethod->set_active(0); + //resid + // oldsh->set_active(true); + radius->setValue(def_params.radius); + resblur->setValue(def_params.resblur); + resblurc->setValue(def_params.resblurc); + cbenab->set_active(false); + + //final touchup + BAmethod->set_active(0); + sigmafin->setValue(def_params.sigmafin); + enableListener(); + + // Update GUI based on converted widget parameters: +} + +void Wavelet::updateGUIToMode(int mode) +{ + if(mode ==0) { + offset->hide(); + sigma->hide(); + lowthr->hide(); + ctboxch->hide(); + sigmacol->hide(); + expgamut->hide(); + exptoning->hide(); + chroFrame->hide(); + expbl->hide(); + lipst->hide(); + dirFrame->hide(); + oldsh->hide(); + radius->hide(); + blurFrame->hide(); + cbenab->hide(); + sigmafin->hide(); + //denHBox->hide(); + mixHBox->hide(); + sliHBox->hide(); + sigm->hide(); + levelsigm->hide(); + CurveEditorwavnoiseh->hide(); + CurveEditorwavnoise->hide(); + // levden->hide(); + thrden->hide(); + leveldenoise->hide(); + limden->hide(); + } else { + offset->show(); + sigma->show(); + lowthr->show(); + ctboxch->show(); + sigmacol->show(); + expgamut->show(); + exptoning->show(); + chroFrame->show(); + expbl->show(); + lipst->show(); + dirFrame->show(); + oldsh->hide(); + radius->show(); + blurFrame->show(); + cbenab->show(); + sigmafin->show(); + //denHBox->hide(); + mixHBox->show(); + sigm->hide(); + levelsigm->show(); + limden->show(); + levden->show(); + sliHBox->show(); + if (slimethod->get_active_row_number() == 0){ + leveldenoise->show(); + thrden->show(); + CurveEditorwavnoiseh->hide(); + CurveEditorwavnoise->hide(); + } else { + thrden->hide(); + leveldenoise->show(); + CurveEditorwavnoiseh->show(); + CurveEditorwavnoise->show(); + } + disableListener(); + //denmethod->set_active(4); + enableListener(); + + } + +} + + +void Wavelet::complexmethodChanged() +{ + if (complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + + } else { + updateGUIToMode(1); + } + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavcomplexmet, complexmethod->get_active_text()); + } +} + +//void Wavelet::denmethodChanged() +//{ +// +// if (listener && (multiImage || getEnabled())) { +// listener->panelChanged(EvWavdenmethod, denmethod->get_active_text()); +// } +//} + +void Wavelet::mixmethodChanged() +{ + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavmixmethod, mixmethod->get_active_text()); + } +} + +void Wavelet::slimethodChanged() +{ + + if (slimethod->get_active_row_number() == 0 && complexmethod->get_active_row_number() == 0) { + updateGUIToMode(0); + convertParamToNormal(); + leveldenoise->show(); + } else if (slimethod->get_active_row_number() == 0 && complexmethod->get_active_row_number() == 1){ + updateGUIToMode(1); + leveldenoise->show(); + CurveEditorwavnoiseh->hide(); + CurveEditorwavnoise->hide(); + } else if (slimethod->get_active_row_number() == 1 && complexmethod->get_active_row_number() == 1){ + updateGUIToMode(1); + leveldenoise->show(); + CurveEditorwavnoiseh->show(); + CurveEditorwavnoise->show(); + } + + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavslimethod, slimethod->get_active_text()); + } +} + +void Wavelet::quamethodChanged() +{ + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavquamethod, quamethod->get_active_text()); + } +} + void Wavelet::TilesmethodChanged() { //TilesmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavTilesmet, Tilesmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavTilesmet, Tilesmethod->get_active_text()); } } @@ -2247,8 +3449,8 @@ void Wavelet::daubcoeffmethodUpdateUI() { void Wavelet::daubcoeffmethodChanged() { //daubcoeffmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavdaubcoeffmet, daubcoeffmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavdaubcoeffmet, daubcoeffmethod->get_active_text()); } } @@ -2261,8 +3463,8 @@ void Wavelet::MedgreinfUpdateUI() { void Wavelet::MedgreinfChanged() { //MedgreinfUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavedgreinf, Medgreinf->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavedgreinf, Medgreinf->get_active_text()); } } @@ -2275,8 +3477,8 @@ void Wavelet::DirmethodUpdateUI() { void Wavelet::DirmethodChanged() { //DirmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavDirmeto, Dirmethod->get_active_text ()); + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavDirmeto, Dirmethod->get_active_text()); } } @@ -2289,74 +3491,117 @@ void Wavelet::LmethodUpdateUI() { void Wavelet::LmethodChanged() { //LmethodUpdateUI(); - if (listener && (multiImage || getEnabled()) ) { - listener->panelChanged (EvWavLmet, Lmethod->get_active_text ()); + if (ushamethod->get_active_row_number() == 0 && expclari->getEnabled() == true) { + if (Lmethod->get_active_row_number() > 3) { + Lmethod->set_active(3); + } + } + + if (ushamethod->get_active_row_number() == 1 && expclari->getEnabled() == true) { + if (Lmethod->get_active_row_number() < 4) { + Lmethod->set_active(4); + } + } + + if (listener && (multiImage || getEnabled())) { + listener->panelChanged(EvWavLmet, Lmethod->get_active_text()); } } -void Wavelet::setBatchMode (bool batchMode) +void Wavelet::setBatchMode(bool batchMode) { - Lmethod->append (M("GENERAL_UNCHANGED")); - CLmethod->append (M("GENERAL_UNCHANGED")); - Backmethod->append (M("GENERAL_UNCHANGED")); - Tilesmethod->append (M("GENERAL_UNCHANGED")); - daubcoeffmethod->append (M("GENERAL_UNCHANGED")); - CHmethod->append (M("GENERAL_UNCHANGED")); - Medgreinf->append (M("GENERAL_UNCHANGED")); - CHSLmethod->append (M("GENERAL_UNCHANGED")); - EDmethod->append (M("GENERAL_UNCHANGED")); - NPmethod->append (M("GENERAL_UNCHANGED")); - BAmethod->append (M("GENERAL_UNCHANGED")); - TMmethod->append (M("GENERAL_UNCHANGED")); - HSmethod->append (M("GENERAL_UNCHANGED")); - Dirmethod->append (M("GENERAL_UNCHANGED")); - CCWcurveEditorG->setBatchMode (batchMode); - opaCurveEditorG->setBatchMode (batchMode); - opacityCurveEditorG->setBatchMode (batchMode); - opacityCurveEditorW->setBatchMode (batchMode); - opacityCurveEditorWL->setBatchMode (batchMode); - curveEditorRES->setBatchMode (batchMode); - curveEditorGAM->setBatchMode (batchMode); - rescon->showEditedCB (); - resconH->showEditedCB (); - reschro->showEditedCB (); - tmrs->showEditedCB (); - gamma->showEditedCB (); - sup->showEditedCB (); - sky->showEditedCB (); - thres->showEditedCB (); - threshold->showEditedCB (); - threshold2->showEditedCB (); - edgedetect->showEditedCB (); - edgedetectthr->showEditedCB (); - edgedetectthr2->showEditedCB (); - edgesensi->showEditedCB (); - edgeampli->showEditedCB (); - chroma->showEditedCB (); - chro->showEditedCB (); - contrast->showEditedCB (); - edgrad->showEditedCB (); - edgval->showEditedCB (); - edgthresh->showEditedCB (); - thr->showEditedCB (); - thrH->showEditedCB (); + Lmethod->append(M("GENERAL_UNCHANGED")); + CLmethod->append(M("GENERAL_UNCHANGED")); + Backmethod->append(M("GENERAL_UNCHANGED")); + Tilesmethod->append(M("GENERAL_UNCHANGED")); + complexmethod->append(M("GENERAL_UNCHANGED")); + //denmethod->append(M("GENERAL_UNCHANGED")); + mixmethod->append(M("GENERAL_UNCHANGED")); + slimethod->append(M("GENERAL_UNCHANGED")); + quamethod->append(M("GENERAL_UNCHANGED")); + daubcoeffmethod->append(M("GENERAL_UNCHANGED")); + CHmethod->append(M("GENERAL_UNCHANGED")); + Medgreinf->append(M("GENERAL_UNCHANGED")); + ushamethod->append(M("GENERAL_UNCHANGED")); + CHSLmethod->append(M("GENERAL_UNCHANGED")); + EDmethod->append(M("GENERAL_UNCHANGED")); + NPmethod->append(M("GENERAL_UNCHANGED")); + BAmethod->append(M("GENERAL_UNCHANGED")); + TMmethod->append(M("GENERAL_UNCHANGED")); + HSmethod->append(M("GENERAL_UNCHANGED")); + Dirmethod->append(M("GENERAL_UNCHANGED")); + CCWcurveEditorG->setBatchMode(batchMode); + opaCurveEditorG->setBatchMode(batchMode); + //curveEditorC->setBatchMode(batchMode); + opacityCurveEditorG->setBatchMode(batchMode); + CurveEditorwavnoise->setBatchMode(batchMode); + CurveEditorwavnoiseh->setBatchMode(batchMode); + CurveEditorwavguid->setBatchMode(batchMode); + CurveEditorwavhue->setBatchMode(batchMode); + opacityCurveEditorW->setBatchMode(batchMode); + opacityCurveEditorWL->setBatchMode(batchMode); + curveEditorbl->setBatchMode(batchMode); + curveEditorRES->setBatchMode(batchMode); + curveEditorGAM->setBatchMode(batchMode); + sigma->showEditedCB(); + offset->showEditedCB(); + lowthr->showEditedCB(); + rescon->showEditedCB(); + resconH->showEditedCB(); + reschro->showEditedCB(); + resblur->showEditedCB(); + resblurc->showEditedCB(); + tmrs->showEditedCB(); + edgs->showEditedCB(); + scale->showEditedCB(); + gamma->showEditedCB(); + sup->showEditedCB(); + sky->showEditedCB(); + thres->showEditedCB(); + threshold->showEditedCB(); + threshold2->showEditedCB(); + edgedetect->showEditedCB(); + edgedetectthr->showEditedCB(); + edgedetectthr2->showEditedCB(); + edgesensi->showEditedCB(); + edgeampli->showEditedCB(); + chroma->showEditedCB(); + chro->showEditedCB(); + contrast->showEditedCB(); + edgrad->showEditedCB(); + edgeffect->showEditedCB(); + edgval->showEditedCB(); + edgthresh->showEditedCB(); + thr->showEditedCB(); + thrH->showEditedCB(); + radius->showEditedCB(); skinprotect->showEditedCB(); - hueskin->showEditedCB (); - hueskin2->showEditedCB (); - hllev->showEditedCB (); - bllev->showEditedCB (); - pastlev->showEditedCB (); - satlev->showEditedCB (); - edgcont->showEditedCB (); - strength->showEditedCB (); - balance->showEditedCB (); - iter->showEditedCB (); - level0noise->showEditedCB (); - level1noise->showEditedCB (); - level2noise->showEditedCB (); - level3noise->showEditedCB (); + hueskin->showEditedCB(); + hueskin2->showEditedCB(); + hllev->showEditedCB(); + bllev->showEditedCB(); + pastlev->showEditedCB(); + satlev->showEditedCB(); + edgcont->showEditedCB(); + chrwav->showEditedCB(); + bluwav->showEditedCB(); + strength->showEditedCB(); + balance->showEditedCB(); + iter->showEditedCB(); + sigmafin->showEditedCB(); + sigmaton->showEditedCB(); + sigmacol->showEditedCB(); + sigmadir->showEditedCB(); + rangeab->showEditedCB(); + protab->showEditedCB(); + level0noise->showEditedCB(); + level1noise->showEditedCB(); + level2noise->showEditedCB(); + level3noise->showEditedCB(); + leveldenoise->showEditedCB(); + levelsigm->showEditedCB(); - ToolPanel::setBatchMode (batchMode); + ToolPanel::setBatchMode(batchMode); for (int i = 0; i < 9; i++) { correction[i]->showEditedCB(); @@ -2367,225 +3612,318 @@ void Wavelet::setBatchMode (bool batchMode) } } -void Wavelet::adjusterUpdateUI (Adjuster* a) +void Wavelet::adjusterUpdateUI(Adjuster* a) { /* - if (!batchMode) { - if (a == tmrs ) { - float tm; - tm=tmrs->getValue(); - if(tm==0.f) tmr->hide(); - else tmr->show(); - } - else if (a == gamma ) { - float tm; - tm=tmrs->getValue(); - if(tm==0.f) tmr->hide(); - else tmr->show(); - ); - } - } + if (!batchMode) { + if (a == tmrs ) { + float tm; + tm=tmrs->getValue(); + if(tm==0.f) tmr->hide(); + else tmr->show(); + } + else if (a == gamma ) { + float tm; + tm=tmrs->getValue(); + if(tm==0.f) tmr->hide(); + else tmr->show(); + + } + } */ } void Wavelet::adjusterChanged(Adjuster* a, double newval) { - if (listener && (multiImage || getEnabled()) ) { + if (listener && (multiImage || getEnabled())) { if (a == edgthresh) { - listener->panelChanged (EvWavtiles, edgthresh->getTextValue()); - } else if (a == rescon ) { - listener->panelChanged (EvWavrescon, rescon->getTextValue()); - } else if (a == resconH ) { - listener->panelChanged (EvWavresconH, resconH->getTextValue()); - } else if (a == reschro ) { - listener->panelChanged (EvWavreschro, reschro->getTextValue()); - } else if (a == tmrs ) { + listener->panelChanged(EvWavtiles, edgthresh->getTextValue()); + } else if (a == rescon) { + listener->panelChanged(EvWavrescon, rescon->getTextValue()); + } else if (a == sigma) { + listener->panelChanged(EvWavsigma, sigma->getTextValue()); + } else if (a == offset) { + listener->panelChanged(EvWavoffset, offset->getTextValue()); + } else if (a == lowthr) { + listener->panelChanged(EvWavlowthr, lowthr->getTextValue()); + } else if (a == resconH) { + listener->panelChanged(EvWavresconH, resconH->getTextValue()); + } else if (a == reschro) { + listener->panelChanged(EvWavreschro, reschro->getTextValue()); + } else if (a == resblur) { + listener->panelChanged(EvWavresblur, resblur->getTextValue()); + } else if (a == resblurc) { + listener->panelChanged(EvWavresblurc, resblurc->getTextValue()); + } else if (a == tmrs) { adjusterUpdateUI(a); - listener->panelChanged (EvWavtmrs, tmrs->getTextValue()); - } else if (a == gamma ) { + listener->panelChanged(EvWavtmrs, tmrs->getTextValue()); + + if (tmrs->getValue() != 0 && TMmethod->get_active_row_number() == 1) { + edgs->show(); + scale->show(); + } else if (TMmethod->get_active_row_number() == 0) { + edgs->hide(); + scale->hide(); + } + } else if (a == gamma) { adjusterUpdateUI(a); - listener->panelChanged (EvWavgamma, gamma->getTextValue()); - } else if (a == sky ) { - listener->panelChanged (EvWavsky, sky->getTextValue()); - } else if (a == sup ) { - listener->panelChanged (EvWavsup, sup->getTextValue()); - } else if (a == chroma ) { - listener->panelChanged (EvWavchroma, chroma->getTextValue()); - } else if (a == chro ) { - listener->panelChanged (EvWavchro, chro->getTextValue()); - } else if (a == contrast ) { - listener->panelChanged (EvWavunif, contrast->getTextValue()); - } else if (a == thr ) { - listener->panelChanged (EvWavthr, thr->getTextValue()); - } else if (a == thrH ) { - listener->panelChanged (EvWavthrH, thrH->getTextValue()); - } else if (a == threshold ) { - listener->panelChanged (EvWavThreshold, threshold->getTextValue()); - } else if (a == threshold2 ) { - listener->panelChanged (EvWavThreshold2, threshold2->getTextValue()); - } else if (a == edgedetect ) { - listener->panelChanged (EvWavedgedetect, edgedetect->getTextValue()); - } else if (a == edgedetectthr ) { - listener->panelChanged (EvWavedgedetectthr, edgedetectthr->getTextValue()); - } else if (a == edgedetectthr2 ) { - listener->panelChanged (EvWavedgedetectthr2, edgedetectthr2->getTextValue()); - } else if (a == edgesensi ) { - listener->panelChanged (EvWavedgesensi, edgesensi->getTextValue()); - } else if (a == edgeampli ) { - listener->panelChanged (EvWavedgeampli, edgeampli->getTextValue()); - } else if (a == edgrad ) { - listener->panelChanged (EvWavedgrad, edgrad->getTextValue()); - } else if (a == edgval ) { - listener->panelChanged (EvWavedgval, edgval->getTextValue()); - } else if (a == thres ) { + listener->panelChanged(EvWavgamma, gamma->getTextValue()); + } else if (a == edgs) { + adjusterUpdateUI(a); + listener->panelChanged(EvWavedgs, edgs->getTextValue()); + } else if (a == scale) { + adjusterUpdateUI(a); + listener->panelChanged(EvWavscale, scale->getTextValue()); + } else if (a == sky) { + listener->panelChanged(EvWavsky, sky->getTextValue()); + } else if (a == sup) { + listener->panelChanged(EvWavsup, sup->getTextValue()); + } else if (a == chroma) { + listener->panelChanged(EvWavchroma, chroma->getTextValue()); + } else if (a == chro) { + listener->panelChanged(EvWavchro, chro->getTextValue()); + } else if (a == contrast) { + listener->panelChanged(EvWavunif, contrast->getTextValue()); + } else if (a == thr) { + listener->panelChanged(EvWavthr, thr->getTextValue()); + } else if (a == thrH) { + listener->panelChanged(EvWavthrH, thrH->getTextValue()); + } else if (a == radius) { + listener->panelChanged(EvWavradius, radius->getTextValue()); + } else if (a == threshold) { + listener->panelChanged(EvWavThreshold, threshold->getTextValue()); + updateGUI(); + updateGUImaxlev(); + + } else if (a == threshold2) { + listener->panelChanged(EvWavThreshold2, threshold2->getTextValue()); + } else if (a == edgedetect) { + listener->panelChanged(EvWavedgedetect, edgedetect->getTextValue()); + } else if (a == edgedetectthr) { + listener->panelChanged(EvWavedgedetectthr, edgedetectthr->getTextValue()); + } else if (a == edgedetectthr2) { + listener->panelChanged(EvWavedgedetectthr2, edgedetectthr2->getTextValue()); + } else if (a == edgesensi) { + listener->panelChanged(EvWavedgesensi, edgesensi->getTextValue()); + } else if (a == edgeampli) { + listener->panelChanged(EvWavedgeampli, edgeampli->getTextValue()); + } else if (a == edgrad) { + listener->panelChanged(EvWavedgrad, edgrad->getTextValue()); + } else if (a == edgeffect) { + listener->panelChanged(EvWavedgeffect, edgeffect->getTextValue()); + } else if (a == edgval) { + listener->panelChanged(EvWavedgval, edgval->getTextValue()); + } else if (a == thres) { int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correction[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correction[z]->show(); } - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correctionch[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correctionch[z]->show(); } - if(z == 9) { + if (z == 9) { sup->show(); } else { sup->hide(); } + if(z >= 8 ) { + expnoise->setEnabled(false); + expnoise->set_sensitive(false); + } else { + // expnoise->setEnabled(pp->wavelet.expnoise); + expnoise->set_sensitive(true); + } - listener->panelChanged (EvWavthres, thres->getTextValue()); + listener->panelChanged(EvWavthres, thres->getTextValue()); + updateGUImaxlev(); + updateGUI(); } else if (a == skinprotect) { - listener->panelChanged (EvWavSkin, skinprotect->getTextValue()); + listener->panelChanged(EvWavSkin, skinprotect->getTextValue()); } else if (a == strength) { - listener->panelChanged (EvWavStrength, strength->getTextValue()); + listener->panelChanged(EvWavStrength, strength->getTextValue()); } else if (a == balance) { - listener->panelChanged (EvWavbalance, balance->getTextValue()); + listener->panelChanged(EvWavbalance, balance->getTextValue()); } else if (a == iter) { - listener->panelChanged (EvWaviter, iter->getTextValue()); - } else if (a == greenhigh ) { - listener->panelChanged (EvWavgreenhigh, greenhigh->getTextValue()); - } else if (a == bluehigh ) { - listener->panelChanged (EvWavbluehigh, bluehigh->getTextValue()); - } else if (a == greenmed ) { - listener->panelChanged (EvWavgreenmed, greenmed->getTextValue()); - } else if (a == bluemed ) { - listener->panelChanged (EvWavbluemed, bluemed->getTextValue()); - } else if (a == greenlow ) { - listener->panelChanged (EvWavgreenlow, greenlow->getTextValue()); - } else if (a == bluelow ) { - listener->panelChanged (EvWavbluelow, bluelow->getTextValue()); + listener->panelChanged(EvWaviter, iter->getTextValue()); + } else if (a == sigmafin) { + listener->panelChanged(EvWavsigmafin, sigmafin->getTextValue()); + } else if (a == sigmaton) { + listener->panelChanged(EvWavsigmaton, sigmaton->getTextValue()); + } else if (a == rangeab) { + listener->panelChanged(EvWavrangeab, rangeab->getTextValue()); + } else if (a == protab) { + listener->panelChanged(EvWavprotab, protab->getTextValue()); + } else if (a == sigmacol) { + listener->panelChanged(EvWavsigmacol, sigmacol->getTextValue()); + } else if (a == sigmadir) { + listener->panelChanged(EvWavsigmadir, sigmadir->getTextValue()); + } else if (a == greenhigh) { + listener->panelChanged(EvWavgreenhigh, greenhigh->getTextValue()); + } else if (a == bluehigh) { + listener->panelChanged(EvWavbluehigh, bluehigh->getTextValue()); + } else if (a == ballum) { + listener->panelChanged(EvWavballum, ballum->getTextValue()); + } else if (a == sigm) { + listener->panelChanged(EvWavsigm, sigm->getTextValue()); + } else if (a == levden) { + listener->panelChanged(EvWavlevden, levden->getTextValue()); + } else if (a == thrden) { + listener->panelChanged(EvWavthrden, thrden->getTextValue()); + } else if (a == limden) { + listener->panelChanged(EvWavlimden, limden->getTextValue()); + } else if (a == balchrom) { + listener->panelChanged(EvWavbalchrom, balchrom->getTextValue()); + } else if (a == chromfi) { + listener->panelChanged(EvWavchromfi, chromfi->getTextValue()); + } else if (a == chromco) { + listener->panelChanged(EvWavchromco, chromco->getTextValue()); + } else if (a == mergeL) { + listener->panelChanged(EvWavmergeL, mergeL->getTextValue()); + } else if (a == mergeC) { + listener->panelChanged(EvWavmergeC, mergeC->getTextValue()); + } else if (a == softrad) { + listener->panelChanged(EvWavsoftrad, softrad->getTextValue()); + } else if (a == softradend) { + listener->panelChanged(EvWavsoftradend, softradend->getTextValue()); + } else if (a == strend) { + listener->panelChanged(EvWavstrend, strend->getTextValue()); + } else if (a == detend) { + listener->panelChanged(EvWavdetend, detend->getTextValue()); + } else if (a == thrend) { + listener->panelChanged(EvWavthrend, thrend->getTextValue()); + } else if (a == greenmed) { + listener->panelChanged(EvWavgreenmed, greenmed->getTextValue()); + } else if (a == bluemed) { + listener->panelChanged(EvWavbluemed, bluemed->getTextValue()); + } else if (a == greenlow) { + listener->panelChanged(EvWavgreenlow, greenlow->getTextValue()); + } else if (a == bluelow) { + listener->panelChanged(EvWavbluelow, bluelow->getTextValue()); + } else if (a == chrwav) { + listener->panelChanged(EvWavchrwav, chrwav->getTextValue()); + } else if (a == bluwav) { + listener->panelChanged(EvWavbluwav, bluwav->getTextValue()); } if ((a == correction[0] || a == correction[1] || a == correction[2] || a == correction[3] || a == correction[4] || a == correction[5] || a == correction[6] || a == correction[7] || a == correction[8])) { - listener->panelChanged (EvWavelet, - Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", - Glib::ustring::format(std::fixed, std::setprecision(0), correction[0]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[1]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[2]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[3]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[4]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[5]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[6]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[7]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correction[8]->getValue())) - ); - } else if (a == correctionch[0] || a == correctionch[1] || a == correctionch[2] || a == correctionch[3] || a == correctionch[4] || a == correctionch[5] || a == correctionch[6] || a == correctionch[7] || a == correctionch[8] ) { - listener->panelChanged (EvWaveletch, - Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[0]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[1]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[2]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[3]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[4]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[5]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[6]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[7]->getValue()), - Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[8]->getValue())) - ); + listener->panelChanged(EvWavelet, + Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", + Glib::ustring::format(std::fixed, std::setprecision(0), correction[0]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[1]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[2]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[3]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[4]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[5]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[6]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[7]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correction[8]->getValue())) + ); + } else if (a == correctionch[0] || a == correctionch[1] || a == correctionch[2] || a == correctionch[3] || a == correctionch[4] || a == correctionch[5] || a == correctionch[6] || a == correctionch[7] || a == correctionch[8]) { + listener->panelChanged(EvWaveletch, + Glib::ustring::compose("%1, %2, %3, %4, %5, %6, %7, %8, %9", + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[0]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[1]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[2]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[3]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[4]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[5]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[6]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[7]->getValue()), + Glib::ustring::format(std::fixed, std::setprecision(0), correctionch[8]->getValue())) + ); } } } -void Wavelet::enabledUpdateUI () +void Wavelet::enabledUpdateUI() { if (!batchMode) { int y = thres->getValue(); int z; - for(z = y; z < 9; z++) { + for (z = y; z < 9; z++) { correction[z]->hide(); } - for(z = 0; z < y; z++) { + for (z = 0; z < y; z++) { correction[z]->show(); } - if(z == 9) { + if (z == 9) { sup->show(); } else { sup->hide(); } + if(z >= 8) { + expnoise->setEnabled(false); + expnoise->set_sensitive(false); + } else { + expnoise->set_sensitive(true); + } + // adjusterUpdateUI(tmrs); } } -void Wavelet::enabledChanged () +void Wavelet::enabledChanged() { enabledUpdateUI(); if (listener) { if (get_inconsistent()) { - listener->panelChanged (EvWavEnabled, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvWavEnabled, M("GENERAL_UNCHANGED")); } else if (getEnabled()) { - listener->panelChanged (EvWavEnabled, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavEnabled, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavEnabled, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavEnabled, M("GENERAL_DISABLED")); } } } -void Wavelet::medianToggled () +void Wavelet::medianToggled() { if (multiImage) { if (median->get_inconsistent()) { - median->set_inconsistent (false); - medianConn.block (true); - median->set_active (false); - medianConn.block (false); + median->set_inconsistent(false); + medianConn.block(true); + median->set_active(false); + medianConn.block(false); } else if (lastmedian) { - median->set_inconsistent (true); + median->set_inconsistent(true); } - lastmedian = median->get_active (); + lastmedian = median->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (median->get_inconsistent()) { - listener->panelChanged (EvWavmedian, M("GENERAL_UNCHANGED")); - } else if (median->get_active ()) { - listener->panelChanged (EvWavmedian, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavmedian, M("GENERAL_UNCHANGED")); + } else if (median->get_active()) { + listener->panelChanged(EvWavmedian, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavmedian, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavmedian, M("GENERAL_DISABLED")); } } } -void Wavelet::medianlevUpdateUI () +void Wavelet::medianlevUpdateUI() { if (!batchMode) { - if (medianlev->get_active ()) { + if (medianlev->get_active()) { edgedetect->show(); lipst->show(); separatoredge->show(); @@ -2597,7 +3935,7 @@ void Wavelet::medianlevUpdateUI () // edgeampli->show(); // NPmethod->show(); // labmNP->show(); - if (lipst->get_active ()) { + if (lipst->get_active()) { edgesensi->show(); edgeampli->show(); NPmethod->show(); @@ -2625,66 +3963,66 @@ void Wavelet::medianlevUpdateUI () } } -void Wavelet::medianlevToggled () +void Wavelet::medianlevToggled() { if (multiImage) { if (medianlev->get_inconsistent()) { - medianlev->set_inconsistent (false); - medianlevConn.block (true); - medianlev->set_active (false); - medianlevConn.block (false); + medianlev->set_inconsistent(false); + medianlevConn.block(true); + medianlev->set_active(false); + medianlevConn.block(false); } else if (lastmedianlev) { - medianlev->set_inconsistent (true); + medianlev->set_inconsistent(true); } - lastmedianlev = medianlev->get_active (); + lastmedianlev = medianlev->get_active(); } medianlevUpdateUI(); - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (medianlev->get_inconsistent()) { - listener->panelChanged (EvWavmedianlev, M("GENERAL_UNCHANGED")); - } else if (medianlev->get_active () ) { - listener->panelChanged (EvWavmedianlev, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavmedianlev, M("GENERAL_UNCHANGED")); + } else if (medianlev->get_active()) { + listener->panelChanged(EvWavmedianlev, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavmedianlev, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavmedianlev, M("GENERAL_DISABLED")); } } } -void Wavelet::linkedgToggled () +void Wavelet::linkedgToggled() { if (multiImage) { if (linkedg->get_inconsistent()) { - linkedg->set_inconsistent (false); - linkedgConn.block (true); - linkedg->set_active (false); - linkedgConn.block (false); + linkedg->set_inconsistent(false); + linkedgConn.block(true); + linkedg->set_active(false); + linkedgConn.block(false); } else if (lastlinkedg) { - linkedg->set_inconsistent (true); + linkedg->set_inconsistent(true); } - lastlinkedg = linkedg->get_active (); + lastlinkedg = linkedg->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (linkedg->get_inconsistent()) { - listener->panelChanged (EvWavlinkedg, M("GENERAL_UNCHANGED")); - } else if (linkedg->get_active () ) { - listener->panelChanged (EvWavlinkedg, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavlinkedg, M("GENERAL_UNCHANGED")); + } else if (linkedg->get_active()) { + listener->panelChanged(EvWavlinkedg, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavlinkedg, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavlinkedg, M("GENERAL_DISABLED")); } } } -void Wavelet::cbenabUpdateUI () +void Wavelet::cbenabUpdateUI() { if (!batchMode) { - if(cbenab->get_active ()) { + if (cbenab->get_active()) { chanMixerHLFrame->show(); chanMixerMidFrame->show(); chanMixerShadowsFrame->show(); @@ -2698,40 +4036,40 @@ void Wavelet::cbenabUpdateUI () } } -void Wavelet::cbenabToggled () +void Wavelet::cbenabToggled() { if (multiImage) { if (cbenab->get_inconsistent()) { - cbenab->set_inconsistent (false); - cbenabConn.block (true); - cbenab->set_active (false); - cbenabConn.block (false); + cbenab->set_inconsistent(false); + cbenabConn.block(true); + cbenab->set_active(false); + cbenabConn.block(false); } else if (lastcbenab) { - cbenab->set_inconsistent (true); + cbenab->set_inconsistent(true); } - lastcbenab = cbenab->get_active (); + lastcbenab = cbenab->get_active(); } cbenabUpdateUI(); - if (listener && (multiImage || getEnabled ())) { - if (cbenab->get_inconsistent() ) { - listener->panelChanged (EvWavcbenab, M("GENERAL_UNCHANGED")); - } else if (cbenab->get_active () ) { - listener->panelChanged (EvWavcbenab, M("GENERAL_ENABLED")); + if (listener && (multiImage || getEnabled())) { + if (cbenab->get_inconsistent()) { + listener->panelChanged(EvWavcbenab, M("GENERAL_UNCHANGED")); + } else if (cbenab->get_active()) { + listener->panelChanged(EvWavcbenab, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavcbenab, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavcbenab, M("GENERAL_DISABLED")); } } } -void Wavelet::lipstUpdateUI () +void Wavelet::lipstUpdateUI() { if (!batchMode) { - if (lipst->get_active ()) { + if (lipst->get_active()) { NPmethod->show(); edgesensi->show(); edgeampli->show(); @@ -2747,31 +4085,31 @@ void Wavelet::lipstUpdateUI () } -void Wavelet::lipstToggled () +void Wavelet::lipstToggled() { if (multiImage) { if (lipst->get_inconsistent()) { - lipst->set_inconsistent (false); - lipstConn.block (true); - lipst->set_active (false); - lipstConn.block (false); + lipst->set_inconsistent(false); + lipstConn.block(true); + lipst->set_active(false); + lipstConn.block(false); } else if (lastlipst) { - lipst->set_inconsistent (true); + lipst->set_inconsistent(true); } - lastlipst = lipst->get_active (); + lastlipst = lipst->get_active(); } lipstUpdateUI(); - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (lipst->get_inconsistent()) { - listener->panelChanged (EvWavlipst, M("GENERAL_UNCHANGED")); - } else if (lipst->get_active ()) { - listener->panelChanged (EvWavlipst, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavlipst, M("GENERAL_UNCHANGED")); + } else if (lipst->get_active()) { + listener->panelChanged(EvWavlipst, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavlipst, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavlipst, M("GENERAL_DISABLED")); } } } @@ -2802,62 +4140,120 @@ void Wavelet::edgreinfToggled () { } } */ -void Wavelet::avoidToggled () +void Wavelet::avoidToggled() { if (multiImage) { if (avoid->get_inconsistent()) { - avoid->set_inconsistent (false); - avoidConn.block (true); - avoid->set_active (false); - avoidConn.block (false); + avoid->set_inconsistent(false); + avoidConn.block(true); + avoid->set_active(false); + avoidConn.block(false); } else if (lastavoid) { - avoid->set_inconsistent (true); + avoid->set_inconsistent(true); } - lastavoid = avoid->get_active (); + lastavoid = avoid->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (avoid->get_inconsistent()) { - listener->panelChanged (EvWavavoid, M("GENERAL_UNCHANGED")); - } else if (avoid->get_active ()) { - listener->panelChanged (EvWavavoid, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavavoid, M("GENERAL_UNCHANGED")); + } else if (avoid->get_active()) { + listener->panelChanged(EvWavavoid, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavavoid, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavavoid, M("GENERAL_DISABLED")); } } } -void Wavelet::tmrToggled () +void Wavelet::showmaskToggled() +{ + if (multiImage) { + if (showmask->get_inconsistent()) { + showmask->set_inconsistent(false); + showmaskConn.block(true); + showmask->set_active(false); + showmaskConn.block(false); + } else if (lastshowmask) { + showmask->set_inconsistent(true); + } + + lastshowmask = showmask->get_active(); + } + + if (listener && (multiImage || getEnabled())) { + if (showmask->get_inconsistent()) { + listener->panelChanged(EvWavshowmask, M("GENERAL_UNCHANGED")); + } else if (showmask->get_active()) { + listener->panelChanged(EvWavshowmask, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvWavshowmask, M("GENERAL_DISABLED")); + } + } +} + +void Wavelet::oldshToggled() +{ + if (oldsh->get_active()) { + radius->hide(); + } else { + radius->show(); + } + + if (multiImage) { + if (oldsh->get_inconsistent()) { + oldsh->set_inconsistent(false); + oldshConn.block(true); + oldsh->set_active(false); + oldshConn.block(false); + } else if (lastoldsh) { + oldsh->set_inconsistent(true); + } + + lastoldsh = oldsh->get_active(); + } + + if (listener && (multiImage || getEnabled())) { + if (oldsh->get_inconsistent()) { + listener->panelChanged(EvWavoldsh, M("GENERAL_UNCHANGED")); + } else if (oldsh->get_active()) { + listener->panelChanged(EvWavoldsh, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvWavoldsh, M("GENERAL_DISABLED")); + } + } +} + +void Wavelet::tmrToggled() { if (multiImage) { if (tmr->get_inconsistent()) { - tmr->set_inconsistent (false); - tmrConn.block (true); - tmr->set_active (false); - tmrConn.block (false); + tmr->set_inconsistent(false); + tmrConn.block(true); + tmr->set_active(false); + tmrConn.block(false); } else if (lasttmr) { - tmr->set_inconsistent (true); + tmr->set_inconsistent(true); } - lasttmr = tmr->get_active (); + lasttmr = tmr->get_active(); } - if (listener && (multiImage || getEnabled ())) { + if (listener && (multiImage || getEnabled())) { if (tmr->get_inconsistent()) { - listener->panelChanged (EvWavtmr, M("GENERAL_UNCHANGED")); - } else if (tmr->get_active ()) { - listener->panelChanged (EvWavtmr, M("GENERAL_ENABLED")); + listener->panelChanged(EvWavtmr, M("GENERAL_UNCHANGED")); + } else if (tmr->get_active()) { + listener->panelChanged(EvWavtmr, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvWavtmr, M("GENERAL_DISABLED")); + listener->panelChanged(EvWavtmr, M("GENERAL_DISABLED")); } } } -void Wavelet::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) +void Wavelet::colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) { float R = 0.f, G = 0.f, B = 0.f; @@ -2897,7 +4293,7 @@ void Wavelet::colorForValue (double valX, double valY, enum ColorCaller::ElemTyp caller->ccGreen = double(G); caller->ccBlue = double(B); } -void Wavelet::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 Wavelet::setAdjusterBehavior(bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool radiusadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add) { for (int i = 0; i < 9; i++) { @@ -2915,8 +4311,11 @@ void Wavelet::setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool t resconH->setAddMode(resconHadd); reschro->setAddMode(reschroadd); tmrs->setAddMode(tmrsadd); + edgs->setAddMode(edgsadd); + scale->setAddMode(scaleadd); thr->setAddMode(thradd); thrH->setAddMode(thrHadd); + radius->setAddMode(radiusadd); sky->setAddMode(skyadd); edgrad->setAddMode(edgradadd); edgval->setAddMode(edgvaladd); @@ -2928,15 +4327,17 @@ void Wavelet::setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool t } -void Wavelet::neutralPressed () +void Wavelet::neutralPressed() { for (int i = 0; i < 9; i++) { correction[i]->setValue(0); adjusterChanged(correction[i], 0); } + sup->setValue(0); + adjusterChanged(sup, 0); } -void Wavelet::neutralchPressed () +void Wavelet::neutralchPressed() { for (int i = 0; i < 9; i++) { @@ -2946,7 +4347,7 @@ void Wavelet::neutralchPressed () } -void Wavelet::contrastPlusPressed () +void Wavelet::contrastPlusPressed() { for (int i = 0; i < 9; i++) { @@ -2957,7 +4358,7 @@ void Wavelet::contrastPlusPressed () } -void Wavelet::contrastMinusPressed () +void Wavelet::contrastMinusPressed() { for (int i = 0; i < 9; i++) { @@ -2967,7 +4368,7 @@ void Wavelet::contrastMinusPressed () } } -void Wavelet::foldAllButMe (GdkEventButton* event, MyExpander *expander) +void Wavelet::foldAllButMe(GdkEventButton* event, MyExpander *expander) { if (event->button == 3) { expsettings->set_expanded(expsettings == expander); @@ -2976,9 +4377,11 @@ void Wavelet::foldAllButMe (GdkEventButton* event, MyExpander *expander) exptoning->set_expanded(exptoning == expander); expnoise->set_expanded(expnoise == expander); expedge->set_expanded(expedge == expander); + expbl->set_expanded(expbl == expander); expgamut->set_expanded(expgamut == expander); expresid->set_expanded(expresid == expander); expfinal->set_expanded(expfinal == expander); + expclari->set_expanded(expclari == expander); } } @@ -2997,10 +4400,46 @@ void Wavelet::enableToggled(MyExpander *expander) event = EvWavenanoise; } else if (expander == expedge) { event = EvWavenaedge; + } else if (expander == expbl) { + event = EvWavenabl; } else if (expander == expresid) { event = EvWavenares; } else if (expander == expfinal) { event = EvWavenafin; + } else if (expander == expclari) { + if (expclari->getEnabled() == false) { + Backmethod->set_active(1); + CLmethod->set_active(3); + Lmethod->set_active(3); + Dirmethod->set_active(3); + Lmethod->set_sensitive(false); + Dirmethod->set_sensitive(false); + CLmethod->set_sensitive(true); + Backmethod->set_sensitive(true); + } else { + + if (ushamethod->get_active_row_number() == 1) { + Backmethod->set_active(2); + CLmethod->set_active(2); + Lmethod->set_active(6); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + Dirmethod->set_active(3); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); + } else if (ushamethod->get_active_row_number() == 0) { + Backmethod->set_active(0); + CLmethod->set_active(1); + Lmethod->set_active(2); + Dirmethod->set_active(3); + Lmethod->set_sensitive(true); + Dirmethod->set_sensitive(true); + CLmethod->set_sensitive(false); + Backmethod->set_sensitive(false); + } + } + + event = EvWavenaclari; } else // unknown expander, returning ! { @@ -3008,40 +4447,59 @@ void Wavelet::enableToggled(MyExpander *expander) } if (expander->get_inconsistent()) { - listener->panelChanged (event, M("GENERAL_UNCHANGED")); + listener->panelChanged(event, M("GENERAL_UNCHANGED")); } else if (expander->getEnabled()) { - listener->panelChanged (event, M("GENERAL_ENABLED")); + listener->panelChanged(event, M("GENERAL_ENABLED")); } else { - listener->panelChanged (event, M("GENERAL_DISABLED")); + listener->panelChanged(event, M("GENERAL_DISABLED")); } } } void Wavelet::writeOptions(std::vector &tpOpen) { - tpOpen.push_back (expsettings->get_expanded ()); - tpOpen.push_back (expcontrast->get_expanded ()); - tpOpen.push_back (expchroma->get_expanded ()); - tpOpen.push_back (exptoning->get_expanded ()); - tpOpen.push_back (expnoise->get_expanded ()); - tpOpen.push_back (expedge->get_expanded ()); - tpOpen.push_back (expgamut->get_expanded ()); - tpOpen.push_back (expresid->get_expanded ()); - tpOpen.push_back (expfinal->get_expanded ()); + tpOpen.push_back(expsettings->get_expanded()); + tpOpen.push_back(expcontrast->get_expanded()); + tpOpen.push_back(expchroma->get_expanded()); + tpOpen.push_back(exptoning->get_expanded()); + tpOpen.push_back(expnoise->get_expanded()); + tpOpen.push_back(expedge->get_expanded()); + tpOpen.push_back(expbl->get_expanded()); + tpOpen.push_back(expgamut->get_expanded()); + tpOpen.push_back(expresid->get_expanded()); + tpOpen.push_back(expfinal->get_expanded()); + tpOpen.push_back(expclari->get_expanded()); } -void Wavelet::updateToolState(std::vector &tpOpen) +void Wavelet::updateToolState(const std::vector& tpOpen) { - if(tpOpen.size() >= 9) { - expsettings->set_expanded(tpOpen.at(0)); - expcontrast->set_expanded(tpOpen.at(1)); - expchroma->set_expanded(tpOpen.at(2)); - exptoning->set_expanded(tpOpen.at(3)); - expnoise->set_expanded(tpOpen.at(4)); - expedge->set_expanded(tpOpen.at(5)); - expgamut->set_expanded(tpOpen.at(6)); - expresid->set_expanded(tpOpen.at(7)); - expfinal->set_expanded(tpOpen.at(8)); + if (tpOpen.empty()) { + expsettings->set_expanded(false); + expcontrast->set_expanded(false); + expchroma->set_expanded(false); + exptoning->set_expanded(false); + expnoise->set_expanded(false); + expedge->set_expanded(false); + expbl->set_expanded(false); + expgamut->set_expanded(false); + expresid->set_expanded(false); + expfinal->set_expanded(false); + expclari->set_expanded(false); + return; + } + + if (tpOpen.size() >= 11) { + expsettings->set_expanded(tpOpen[0]); + expcontrast->set_expanded(tpOpen[1]); + expchroma->set_expanded(tpOpen[2]); + exptoning->set_expanded(tpOpen[3]); + expnoise->set_expanded(tpOpen[4]); + expedge->set_expanded(tpOpen[5]); + expbl->set_expanded(tpOpen[6]); + expgamut->set_expanded(tpOpen[7]); + expresid->set_expanded(tpOpen[8]); + expfinal->set_expanded(tpOpen[9]); + expclari->set_expanded(tpOpen[10]); } } diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index 6551b58d4..a6814f374 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -14,24 +14,26 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * 2014 Jacques Desmis + * 2014 2020 Jacques Desmis */ #pragma once #include + #include "adjuster.h" -#include "toolpanel.h" -#include "curvelistener.h" -#include "thresholdadjuster.h" #include "colorprovider.h" +#include "curvelistener.h" #include "guiutils.h" +#include "thresholdadjuster.h" +#include "toolpanel.h" class CurveEditor; class CurveEditorGroup; class DiagonalCurveEditor; class EditDataProvider; class FlatCurveEditor; +class LabGrid; class Wavelet final : public ToolParamBlock, @@ -43,21 +45,23 @@ class Wavelet final : public FoldableToolPanel { public: - Wavelet (); - ~Wavelet () override; + static const Glib::ustring TOOL_NAME; - bool wavComputed_ (); + Wavelet(); + ~Wavelet() override; + bool wavComputed_(); void adjusterChanged(Adjuster* a, double 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) 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) override; - void writeOptions (std::vector &tpOpen); + 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 setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool edgsadd, bool scaleadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool radiusadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add); + void setBatchMode(bool batchMode) override; + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setEditProvider(EditDataProvider *provider) override; + void updateToolState(const std::vector& tpOpen); + 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; @@ -66,39 +70,105 @@ public: void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; private: - void foldAllButMe (GdkEventButton* event, MyExpander *expander); + rtengine::ProcEvent EvWavenaclari; + rtengine::ProcEvent EvWavushamet; + rtengine::ProcEvent EvWavballum; + rtengine::ProcEvent EvWavbalchrom; + rtengine::ProcEvent EvWavchromfi; + rtengine::ProcEvent EvWavchromco; + rtengine::ProcEvent EvWavmergeL; + rtengine::ProcEvent EvWavmergeC; + rtengine::ProcEvent EvWavsoftrad; + rtengine::ProcEvent EvWavsoftradend; + rtengine::ProcEvent EvWavshowmask; + rtengine::ProcEvent EvWavedgs; + rtengine::ProcEvent EvWavscale; + rtengine::ProcEvent EvWavradius; + rtengine::ProcEvent EvWavsigma; + rtengine::ProcEvent EvWavenabl; + rtengine::ProcEvent EvWavchrwav; + rtengine::ProcEvent EvWavoldsh; + rtengine::ProcEvent EvWavoffset; + rtengine::ProcEvent EvWavlowthr; + rtengine::ProcEvent EvWavbluwav; + rtengine::ProcEvent EvWavblshape; + rtengine::ProcEvent EvWavresblur; + rtengine::ProcEvent EvWavresblurc; + rtengine::ProcEvent EvWavedgeffect; + rtengine::ProcEvent EvWavsigmafin; + rtengine::ProcEvent EvWavsigmaton; + rtengine::ProcEvent EvWavsigmacol; + rtengine::ProcEvent EvWavsigmadir; + rtengine::ProcEvent EvWavLabGridValue; + rtengine::ProcEvent EvWavrangeab; + rtengine::ProcEvent EvWavprotab; + rtengine::ProcEvent EvWavlevelshc; + rtengine::ProcEvent EvWavcomplexmet; + rtengine::ProcEvent EvWavsigm; + rtengine::ProcEvent EvWavdenoise; + rtengine::ProcEvent EvWavdenmethod; + rtengine::ProcEvent EvWavmixmethod; + rtengine::ProcEvent EvWavquamethod; + rtengine::ProcEvent EvWavlevden; + rtengine::ProcEvent EvWavdenoiseh; + rtengine::ProcEvent EvWavstrend; + rtengine::ProcEvent EvWavdetend; + rtengine::ProcEvent EvWavlevdenois; + rtengine::ProcEvent EvWavslimethod; + rtengine::ProcEvent EvWavthrend; + rtengine::ProcEvent EvWavguid; + rtengine::ProcEvent EvWavhue; + rtengine::ProcEvent EvWavthrden; + rtengine::ProcEvent EvWavlevelsigm; + rtengine::ProcEvent EvWavlimden; - void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; - void BAmethodChanged (); - void NPmethodChanged (); - void BackmethodChanged (); - void CHSLmethodChanged (); - void CHmethodChanged (); - void CLmethodChanged (); - void DirmethodChanged (); - void EDmethodChanged (); - void HSmethodChanged (); - void LmethodChanged (); - void MedgreinfChanged (); - void TMmethodChanged (); - void TilesmethodChanged (); - void avoidToggled (); - void cbenabToggled (); - void contrastMinusPressed (); - void contrastPlusPressed (); - void daubcoeffmethodChanged (); - void enabledChanged () override; - void linkedgToggled (); - void lipstToggled (); - void medianToggled (); - void medianlevToggled (); - void neutralPressed (); - void neutral_pressed (); - void neutralchPressed (); - void tmrToggled (); + LabGrid *labgrid; + + void foldAllButMe(GdkEventButton* event, MyExpander *expander); + void setListener(ToolPanelListener *tpl) override; + + void colorForValue(double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; + void BAmethodChanged(); + void NPmethodChanged(); + void BackmethodChanged(); + void CHSLmethodChanged(); + void CHmethodChanged(); + void CLmethodChanged(); + void DirmethodChanged(); + void EDmethodChanged(); + void HSmethodChanged(); + void LmethodChanged(); + void MedgreinfChanged(); + void TMmethodChanged(); + void complexmethodChanged(); + //void denmethodChanged(); + void mixmethodChanged(); + void quamethodChanged(); + void slimethodChanged(); + void TilesmethodChanged(); + void avoidToggled(); + void showmaskToggled (); + void oldshToggled (); + void cbenabToggled(); + void contrastMinusPressed(); + void contrastPlusPressed(); + void daubcoeffmethodChanged(); + void enabledChanged() override; + void linkedgToggled(); + void lipstToggled(); + void medianToggled(); + void medianlevToggled(); + void neutralPressed(); + void neutral_pressed(); + void neutralchPressed(); + void tmrToggled(); void updatewavLabel (); - void wavChanged (double nlevel) override; - + void wavChanged(double nlevel) override; + void ushamethodChanged(); + void updateGUI(); + void updateGUImaxlev(); + void convertParamToNormal(); + void updateGUIToMode(int mode); void HSmethodUpdateUI(); void CHmethodUpdateUI(); // void CHSLmethodChangedUI(); @@ -113,26 +183,37 @@ private: // void MedgreinfUpdateUI(); // void DirmethodUpdateUI(); // void LmethodUpdateUI(); - void adjusterUpdateUI (Adjuster* a); - void enabledUpdateUI (); - void medianlevUpdateUI (); - void cbenabUpdateUI (); - void lipstUpdateUI (); + void adjusterUpdateUI(Adjuster* a); + void enabledUpdateUI(); + void medianlevUpdateUI(); + void cbenabUpdateUI(); + void lipstUpdateUI(); - void enableToggled(MyExpander *expander); + void enableToggled(MyExpander* expander); CurveEditorGroup* const curveEditorG; + //CurveEditorGroup* const curveEditorC; + //FlatCurveEditor* opacityShapeSH; CurveEditorGroup* const CCWcurveEditorG; + CurveEditorGroup* const curveEditorbl; CurveEditorGroup* const curveEditorRES; CurveEditorGroup* const curveEditorGAM; - Gtk::HSeparator* const separatorNeutral; - Gtk::HSeparator* const separatoredge; + Gtk::Separator* const separatorNeutral; + Gtk::Separator* const separatoredge; CurveEditorGroup* const opaCurveEditorG; FlatCurveEditor* opacityShapeRG; CurveEditorGroup* const opacityCurveEditorG; FlatCurveEditor* opacityShapeBY; + CurveEditorGroup* const CurveEditorwavnoise; + FlatCurveEditor* wavdenoise; + CurveEditorGroup* const CurveEditorwavnoiseh; + FlatCurveEditor* wavdenoiseh; + CurveEditorGroup* const CurveEditorwavguid; + FlatCurveEditor* wavguidf; + CurveEditorGroup* const CurveEditorwavhue; + FlatCurveEditor* wavhue; CurveEditorGroup* const opacityCurveEditorW; CurveEditorGroup* const opacityCurveEditorWL; FlatCurveEditor* opacityShape; @@ -142,6 +223,7 @@ private: DiagonalCurveEditor* clshape; FlatCurveEditor* ccshape; + FlatCurveEditor* blshape; Gtk::CheckButton* const median; Gtk::CheckButton* const medianlev; Gtk::CheckButton* const linkedg; @@ -149,14 +231,24 @@ private: Gtk::CheckButton* const lipst; Gtk::CheckButton* const avoid; Gtk::CheckButton* const tmr; + Gtk::CheckButton* const showmask; + Gtk::CheckButton* const oldsh; Gtk::Button* const neutralchButton; Adjuster* correction[9]; Adjuster* correctionch[9]; + Adjuster* const sigma; + Adjuster* const offset; + Adjuster* const lowthr; Adjuster* const rescon; Adjuster* const resconH; Adjuster* const reschro; + Adjuster* const resblur; + Adjuster* const resblurc; + Adjuster* const bluwav; Adjuster* const tmrs; + Adjuster* const edgs; + Adjuster* const scale; Adjuster* const gamma; Adjuster* const sup; Adjuster* const sky; @@ -166,13 +258,22 @@ private: Adjuster* const contrast; Adjuster* const thr; Adjuster* const thrH; + Adjuster* const radius; Adjuster* const skinprotect; Adjuster* const edgrad; + Adjuster* const edgeffect; Adjuster* const edgval; Adjuster* const edgthresh; Adjuster* const strength; Adjuster* const balance; Adjuster* const iter; + Adjuster* const sigmafin; + Adjuster* const sigmaton; + Adjuster* const sigmacol; + Adjuster* const sigmadir; + Adjuster* const rangeab; + Adjuster* const protab; + Adjuster* greenlow; Adjuster* bluelow; Adjuster* greenmed; @@ -191,7 +292,13 @@ private: ThresholdAdjuster* const level1noise; ThresholdAdjuster* const level2noise; ThresholdAdjuster* const level3noise; + ThresholdAdjuster* const leveldenoise; + ThresholdAdjuster* const levelsigm; + Adjuster* const sigm; + Adjuster* const levden; + Adjuster* const thrden; + Adjuster* const limden; Adjuster* const threshold; Adjuster* const threshold2; Adjuster* const edgedetect; @@ -199,6 +306,19 @@ private: Adjuster* const edgedetectthr2; Adjuster* const edgesensi; Adjuster* const edgeampli; + Adjuster* const ballum; + Adjuster* const balchrom; + Adjuster* const chromfi; + Adjuster* const chromco; + Adjuster* const mergeL; + Adjuster* const mergeC; + Adjuster* const softrad; + Adjuster* const softradend; + Adjuster* const strend; + Adjuster* const detend; + Adjuster* const thrend; + Adjuster* const chrwav; + MyComboBoxText* const Lmethod; sigc::connection Lmethodconn; MyComboBoxText* const CHmethod; @@ -219,6 +339,8 @@ private: sigc::connection CLmethodconn; MyComboBoxText* const Backmethod; sigc::connection Backmethodconn; + MyComboBoxText* const complexmethod; + sigc::connection complexmethodconn; MyComboBoxText* const Tilesmethod; sigc::connection Tilesmethodconn; MyComboBoxText* const daubcoeffmethod; @@ -227,13 +349,34 @@ private: sigc::connection Dirmethodconn; MyComboBoxText* const Medgreinf; sigc::connection MedgreinfConn; + MyComboBoxText* const ushamethod; + sigc::connection ushamethodconn; + //MyComboBoxText* const denmethod; + //sigc::connection denmethodconn; + MyComboBoxText* const mixmethod; + sigc::connection mixmethodconn; + MyComboBoxText* const quamethod; + sigc::connection quamethodconn; + MyComboBoxText* const slimethod; + sigc::connection slimethodconn; + Gtk::Frame* const chanMixerHLFrame; Gtk::Frame* const chanMixerMidFrame; Gtk::Frame* const chanMixerShadowsFrame; + Gtk::Frame* const shFrame; + Gtk::Frame* const contFrame; + Gtk::Frame* const blurFrame; + Gtk::Frame* const chromaFrame; + Gtk::Frame* const chroFrame; + Gtk::Frame* const fincFrame; + Gtk::Frame* const dirFrame; + Gtk::Frame* const tonFrame; + Gtk::Frame* const guidFrame; Gtk::Label* const wavLabels; Gtk::Label* const labmC; Gtk::Label* const labmNP; + Gtk::Label* const usharpLabel; MyExpander* const expchroma; MyExpander* const expcontrast; MyExpander* const expedge; @@ -243,18 +386,27 @@ private: MyExpander* const expresid; MyExpander* const expsettings; MyExpander* const exptoning; + MyExpander* const expclari; + MyExpander* const expbl; - Gtk::HBox* const neutrHBox; + Gtk::Box* const neutrHBox; + Gtk::Box* const usharpHBox; + Gtk::Box* const ctboxch; + Gtk::Box* const quaHBox; + Gtk::Box* const sliHBox; + //Gtk::Box* const denHBox; + Gtk::Box* const mixHBox; + Gtk::Box* const ctboxBA;// = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enableFinalConn; + sigc::connection enableChromaConn, enableContrastConn, enableEdgeConn, enabletmConn, enableFinalConn, enableclariConn; sigc::connection enableNoiseConn, enableResidConn, enableToningConn; - sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn; + sigc::connection medianConn, avoidConn, tmrConn, medianlevConn, linkedgConn, lipstConn, cbenabConn, neutralconn, showmaskConn, oldshConn; sigc::connection neutralPressedConn; sigc::connection contrastPlusPressedConn; sigc::connection contrastMinusPressedConn; sigc::connection neutralchPressedConn; - bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab; + bool lastmedian, lastmedianlev, lastlinkedg, lastavoid, lastlipst, lasttmr, lastcbenab, lastshowmask, lastoldsh; int nextnlevel; IdleRegister idle_register; diff --git a/rtgui/wbprovider.h b/rtgui/wbprovider.h index a56d93cd3..514a71300 100644 --- a/rtgui/wbprovider.h +++ b/rtgui/wbprovider.h @@ -18,12 +18,19 @@ */ #pragma once +namespace rtengine +{ + +enum class StandardObserver; + +} + class WBProvider { public: virtual ~WBProvider() {} - virtual void getAutoWB (double& temp, double& green, double equal, double tempBias) {} - virtual void getCamWB (double& temp, double& green) {} + virtual void getAutoWB (double& temp, double& green, double equal, rtengine::StandardObserver observer, double tempBias) {} + virtual void getCamWB (double& temp, double& green, rtengine::StandardObserver observer) {} virtual void spotWBRequested (int size) {} }; diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 2ab09c10a..761f2402a 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -22,6 +22,9 @@ #include "rtimage.h" #include "options.h" +#include "eventmapper.h" + +#include "../rtengine/colortemp.h" #define MINTEMP 1500 //1200 #define MAXTEMP 60000 //12000 @@ -34,6 +37,8 @@ using namespace rtengine; using namespace rtengine::procparams; +const Glib::ustring WhiteBalance::TOOL_NAME = "whitebalance"; + Glib::RefPtr WhiteBalance::wbPixbufs[toUnderlying(WBEntry::Type::CUSTOM) + 1]; void WhiteBalance::init () @@ -142,7 +147,7 @@ static double wbTemp2Slider(double temp) return sval; } -WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL"), false, true), wbp(nullptr), wblistener(nullptr) +WhiteBalance::WhiteBalance () : FoldableToolPanel(this, TOOL_NAME, M("TP_WBALANCE_LABEL"), true, true), wbp(nullptr), wblistener(nullptr) { Gtk::Grid* methodgrid = Gtk::manage(new Gtk::Grid()); @@ -175,6 +180,14 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB row[methodColumns.colId] = i + 100; } + if (currType == WBEntry::Type::AUTO) { + // Creating the auto category + row = *(refTreeModel->append()); + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colLabel] = M("TP_WBALANCE_AUTO_HEADER"); + row[methodColumns.colId] = i + 100; + } + if (currType == WBEntry::Type::WATER) { // Creating the under water subcategory header row = *(refTreeModel->append()); @@ -213,6 +226,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB || currType == WBEntry::Type::WATER || currType == WBEntry::Type::FLASH || currType == WBEntry::Type::LED + || currType == WBEntry::Type::AUTO ) { childrow = *(refTreeModel->append(row.children())); childrow[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; @@ -231,6 +245,10 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB custom_equal = 1.0; } + auto m = ProcEventMapper::getInstance(); + EvWBObserver10 = m->newEvent(ALLNORAW, "HISTORY_MSG_WBALANCE_OBSERVER10"); + + //Add the model columns to the Combo (which is a kind of view), //rendering them in the default way: method->pack_start(methodColumns.colIcon, false); @@ -239,10 +257,17 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB std::vector cells = method->get_cells(); Gtk::CellRendererText* cellRenderer = dynamic_cast(cells.at(1)); cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; + + resetButton = Gtk::manage (new Gtk::Button()); // No label, keep it short + setExpandAlignProperties(resetButton, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + resetButton->set_relief(Gtk::RELIEF_NONE); + resetButton->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + resetButton->set_image (*Gtk::manage (new RTImage ("undo-small.png"))); method->set_active (0); // Camera methodgrid->attach (*lab, 0, 0, 1, 1); methodgrid->attach (*method, 1, 0, 1, 1); + methodgrid->attach (*resetButton, 2, 0, 1, 1); pack_start (*methodgrid, Gtk::PACK_SHRINK, 0 ); opt = 0; @@ -302,7 +327,7 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB spotgrid->attach (*wbsizehelper, 2, 0, 1, 1); pack_start (*spotgrid, Gtk::PACK_SHRINK, 0 ); - Gtk::HSeparator *separator = Gtk::manage (new Gtk::HSeparator()); + Gtk::Separator *separator = Gtk::manage (new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); separator->get_style_context()->add_class("grid-row-separator"); pack_start (*separator, Gtk::PACK_SHRINK, 0); @@ -315,40 +340,57 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB Gtk::Image* itempbiasL = Gtk::manage (new RTImage ("circle-blue-small.png")); Gtk::Image* itempbiasR = Gtk::manage (new RTImage ("circle-yellow-small.png")); + StudLabel = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); + StudLabel->set_tooltip_text(M("TP_WBALANCE_STUDLABEL_TOOLTIP")); + + mulLabel = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); + mulLabel->set_tooltip_text(M("TP_WBALANCE_MULLABEL_TOOLTIP")); + mulLabel->show(); + 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)); equal = Gtk::manage (new Adjuster (M("TP_WBALANCE_EQBLUERED"), MINEQUAL, MAXEQUAL, 0.001, 1.0, iblueredL, iblueredR)); tempBias = Gtk::manage (new Adjuster(M("TP_WBALANCE_TEMPBIAS"), -0.5, 0.5, 0.01, 0.0, itempbiasL, itempbiasR)); + observer10 = Gtk::manage(new CheckBox(M("TP_WBALANCE_OBSERVER10"), multiImage)); + cache_customTemp (0); cache_customGreen (0); cache_customEqual (0); equal->set_tooltip_markup (M("TP_WBALANCE_EQBLUERED_TOOLTIP")); tempBias->set_tooltip_markup (M("TP_WBALANCE_TEMPBIAS_TOOLTIP")); + observer10->set_tooltip_text(M("TP_WBALANCE_OBSERVER10_TOOLTIP")); temp->show (); green->show (); equal->show (); tempBias->show (); - - /* Gtk::HBox* boxgreen = Gtk::manage (new Gtk::HBox ()); + observer10->show(); + + /* Gtk::Box* boxgreen = Gtk::manage (new Gtk::Box ()); boxgreen->show (); boxgreen->pack_start(*igreenL); boxgreen->pack_start(*green); boxgreen->pack_start(*igreenR);*/ + pack_start(*mulLabel); + pack_start(*StudLabel); pack_start (*temp); //pack_start (*boxgreen); pack_start (*green); pack_start (*equal); pack_start (*tempBias); + pack_start(*observer10); + temp->setAdjusterListener (this); green->setAdjusterListener (this); equal->setAdjusterListener (this); tempBias->setAdjusterListener (this); + observer10->setCheckBoxListener(this); spotbutton->signal_pressed().connect( sigc::mem_fun(*this, &WhiteBalance::spotPressed) ); methconn = method->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::optChanged) ); + resetButton->signal_pressed().connect( sigc::mem_fun(*this, &WhiteBalance::resetWB) ); spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) ); } @@ -371,6 +413,8 @@ void WhiteBalance::enabledChanged() } + + void WhiteBalance::adjusterChanged(Adjuster* a, double newval) { int tVal = (int)temp->getValue(); @@ -433,6 +477,36 @@ void WhiteBalance::adjusterChanged(Adjuster* a, double newval) } } +void WhiteBalance::checkBoxToggled(CheckBox* c, CheckValue newval) +{ + if (!(getEnabled() && listener)) { + return; + } + + if (c == observer10) { + // If camera WB, update the temperature and tint according to observer. + const Gtk::TreeModel::Row row = getActiveMethod(); + unsigned int methodId = findWBEntryId(row[methodColumns.colLabel], WBLT_GUI); + const WBEntry &currMethod = WBParams::getWbEntries()[methodId]; + if (row[methodColumns.colLabel] != M("GENERAL_UNCHANGED") && currMethod.type == WBEntry::Type::CAMERA && wbp) { + double ctemp, cgreen; + wbp->getCamWB(ctemp, cgreen, + observer10->getValue() == CheckValue::off + ? rtengine::StandardObserver::TWO_DEGREES + : rtengine::StandardObserver::TEN_DEGREES); + temp->setValue(temp->getAddMode() ? 0.0 : static_cast(ctemp)); + green->setValue(green->getAddMode() ? 0.0 : cgreen); + } + + listener->panelChanged( + EvWBObserver10, + c->getValue() == CheckValue::on ? M("GENERAL_ENABLED") + : c->getValue() == CheckValue::off + ? M("GENERAL_DISABLED") + : M("GENERAL_UNCHANGED")); + } +} + void WhiteBalance::optChanged () { Gtk::TreeModel::Row row = getActiveMethod(); @@ -448,6 +522,8 @@ void WhiteBalance::optChanged () methconn.block(prevState); return; } + StudLabel->hide(); + mulLabel->show(); if (opt != row[methodColumns.colId]) { @@ -458,17 +534,27 @@ void WhiteBalance::optChanged () green->setEditedState (UnEdited); equal->setEditedState (UnEdited); tempBias->setEditedState (UnEdited); + observer10->setEdited(false); } else { unsigned int methodId = findWBEntryId (row[methodColumns.colLabel], WBLT_GUI); const WBEntry& currMethod = WBParams::getWbEntries()[methodId]; tempBias->set_sensitive(currMethod.type == WBEntry::Type::AUTO); + bool autit = (currMethod.ppLabel == "autitcgreen"); + if (autit) { + StudLabel->show(); + } else { + StudLabel->hide(); + } switch (currMethod.type) { case WBEntry::Type::CAMERA: if (wbp) { double ctemp, cgreen; - wbp->getCamWB (ctemp, cgreen); + wbp->getCamWB(ctemp, cgreen, + observer10->getValue() == CheckValue::off + ? rtengine::StandardObserver::TWO_DEGREES + : rtengine::StandardObserver::TEN_DEGREES); temp->setValue (temp->getAddMode() ? 0.0 : (int)ctemp); green->setValue (green->getAddMode() ? 0.0 : cgreen); equal->setValue (equal->getAddMode() ? 0.0 : 1.0); @@ -477,6 +563,7 @@ void WhiteBalance::optChanged () temp->setEditedState (UnEdited); green->setEditedState (UnEdited); equal->setEditedState (UnEdited); + observer10->setEdited(false); } } @@ -487,7 +574,7 @@ void WhiteBalance::optChanged () if (batchMode) { temp->setEditedState (UnEdited); green->setEditedState (UnEdited); - // equal remain as is + // equal and observer remain as is } // Recomputing AutoWB will happen in improccoordinator.cc @@ -510,6 +597,7 @@ void WhiteBalance::optChanged () temp->setEditedState (Edited); green->setEditedState (Edited); equal->setEditedState (Edited); + observer10->setEdited(true); } break; @@ -533,6 +621,7 @@ void WhiteBalance::optChanged () temp->setEditedState (Edited); green->setEditedState (Edited); equal->setEditedState (Edited); + observer10->setEdited(true); } break; @@ -547,6 +636,9 @@ void WhiteBalance::optChanged () void WhiteBalance::spotPressed () { + StudLabel->hide(); + mulLabel->show(); + if (wblistener) { wblistener->spotWBRequested (getSize()); } @@ -567,6 +659,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) methconn.block (true); equal->setValue (pp->wb.equal); + observer10->setValue(rtengine::StandardObserver::TEN_DEGREES == pp->wb.observer); tempBias->setValue (pp->wb.tempBias); tempBias->set_sensitive(true); @@ -576,6 +669,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) green->setEditedState (UnEdited); equal->setEditedState (pedited->wb.equal ? Edited : UnEdited); tempBias->setEditedState (pedited->wb.tempBias ? Edited : UnEdited); + observer10->setEdited(pedited->wb.observer); } if (pedited && !pedited->wb.method) { @@ -616,7 +710,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) if (wbp) { double ctemp = -1.0; double cgreen = -1.0; - wbp->getCamWB (ctemp, cgreen); + wbp->getCamWB (ctemp, cgreen, pp->wb.observer); if (ctemp != -1.0) { // Set the camera's temperature value, or 0.0 if in ADD mode @@ -683,6 +777,14 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) } tempBias->set_sensitive(wbValues.type == WBEntry::Type::AUTO); + bool autit = (wbValues.ppLabel == "autitcgreen"); + if (autit) { + StudLabel->show(); + } else { + StudLabel->hide(); + mulLabel->show(); + } + } setEnabled(pp->wb.enabled); @@ -705,6 +807,7 @@ void WhiteBalance::write (ProcParams* pp, ParamsEdited* pedited) pedited->wb.green = green->getEditedState (); pedited->wb.equal = equal->getEditedState (); pedited->wb.tempBias = tempBias->getEditedState (); + pedited->wb.observer = observer10->getEdited(); pedited->wb.method = row[methodColumns.colLabel] != M("GENERAL_UNCHANGED"); pedited->wb.enabled = !get_inconsistent(); } @@ -720,6 +823,12 @@ void WhiteBalance::write (ProcParams* pp, ParamsEdited* pedited) pp->wb.temperature = temp->getIntValue (); pp->wb.green = green->getValue (); pp->wb.equal = equal->getValue (); + pp->wb.observer = + observer10->getValue() == CheckValue::on + ? rtengine::StandardObserver::TEN_DEGREES + : observer10->getValue() == CheckValue::off + ? rtengine::StandardObserver::TWO_DEGREES + : pp->wb.observer; pp->wb.tempBias = tempBias->getValue (); } @@ -732,7 +841,7 @@ void WhiteBalance::setDefaults (const ProcParams* defParams, const ParamsEdited* if (wbp && defParams->wb.method == "Camera") { double ctemp; double cgreen; - wbp->getCamWB (ctemp, cgreen); + wbp->getCamWB (ctemp, cgreen, defParams->wb.observer); // FIXME: Seems to be always -1.0, called too early? Broken! if (ctemp != -1.0) { @@ -799,6 +908,11 @@ void WhiteBalance::setWB (int vtemp, double vgreen) } +void WhiteBalance::resetWB () +{ + setActiveMethod("Camera"); +} + void WhiteBalance::setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd) { @@ -868,7 +982,7 @@ int WhiteBalance::_setActiveMethod(Glib::ustring &label, Gtk::TreeModel::Childre if (row[methodColumns.colLabel] == label) { method->set_active(iter); - found = method->get_active_row_number(); + found = row[methodColumns.colId]; } if (found != -1) { @@ -901,15 +1015,24 @@ inline Gtk::TreeRow WhiteBalance::getActiveMethod () return *(method->get_active()); } -void WhiteBalance::WBChanged(double temperature, double greenVal) +void WhiteBalance::WBChanged(double temperature, double greenVal, double rw, double gw, double bw, float studgood) { idle_register.add( - [this, temperature, greenVal]() -> bool + [this, temperature, greenVal, rw, gw, bw, studgood]() -> bool { disableListener(); - setEnabled(true); temp->setValue(temperature); green->setValue(greenVal); + mulLabel->set_text( + Glib::ustring::compose(M("TP_WBALANCE_MULLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(4), rw), + Glib::ustring::format(std::fixed, std::setprecision(2), gw), + Glib::ustring::format(std::fixed, std::setprecision(4), bw)) + ); + StudLabel->set_text( + Glib::ustring::compose(M("TP_WBALANCE_STUDLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(4), studgood)) + ); temp->setDefault(temperature); green->setDefault(greenVal); enableListener(); diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index b4d09f119..56d8b646c 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -21,6 +21,7 @@ #include #include "adjuster.h" +#include "checkbox.h" #include "guiutils.h" #include "toolpanel.h" #include "wbprovider.h" @@ -35,7 +36,7 @@ public: virtual void spotWBRequested(int size) = 0; }; -class WhiteBalance final : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoWBListener +class WhiteBalance final : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel, public rtengine::AutoWBListener { enum WB_LabelType { @@ -43,6 +44,10 @@ class WhiteBalance final : public ToolParamBlock, public AdjusterListener, publi WBLT_PP }; +private: + Gtk::Label* StudLabel; + Gtk::Label* mulLabel; + protected: class MethodColumns : public Gtk::TreeModel::ColumnRecord { @@ -57,16 +62,20 @@ protected: add(colId); } }; + + rtengine::ProcEvent EvWBObserver10; static Glib::RefPtr wbPixbufs[rtengine::toUnderlying(rtengine::procparams::WBEntry::Type::CUSTOM) + 1]; Glib::RefPtr refTreeModel; MethodColumns methodColumns; MyComboBox* method; + Gtk::Button* resetButton; MyComboBoxText* spotsize; Adjuster* temp; Adjuster* green; Adjuster* equal; Adjuster* tempBias; + CheckBox* observer10; Gtk::Button* spotbutton; int opt; @@ -94,6 +103,7 @@ protected: std::pair findWBEntry (const Glib::ustring& label, enum WB_LabelType lblType = WBLT_GUI); public: + static const Glib::ustring TOOL_NAME; WhiteBalance (); ~WhiteBalance () override; @@ -109,6 +119,7 @@ public: void spotPressed (); void spotSizeChanged (); void adjusterChanged(Adjuster* a, double newval) override; + void checkBoxToggled(CheckBox* c, CheckValue newval) override; int getSize (); void setWBProvider (WBProvider* p) { @@ -119,7 +130,8 @@ public: wblistener = l; } void setWB (int temp, double green); - void WBChanged (double temp, double green) override; + void resetWB (); + void WBChanged (double temp, double green, double rw, double gw, double bw, float studgood) override; void setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd); void trimValues (rtengine::procparams::ProcParams* pp) override; diff --git a/rtgui/xtransprocess.cc b/rtgui/xtransprocess.cc index a371bad88..d6850da63 100644 --- a/rtgui/xtransprocess.cc +++ b/rtgui/xtransprocess.cc @@ -27,14 +27,16 @@ using namespace rtengine; using namespace rtengine::procparams; -XTransProcess::XTransProcess () : FoldableToolPanel(this, "xtransprocess", M("TP_RAW_LABEL"), options.prevdemo != PD_Sidecar) +const Glib::ustring XTransProcess::TOOL_NAME = "xtransprocess"; + +XTransProcess::XTransProcess () : FoldableToolPanel(this, TOOL_NAME, M("TP_RAW_LABEL"), options.prevdemo != PD_Sidecar) { 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 ()); + Gtk::Box* hb1 = Gtk::manage (new Gtk::Box ()); hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); method = Gtk::manage (new MyComboBoxText ()); @@ -72,40 +74,34 @@ 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 ()); + dualDemosaicOptions = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); 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->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); dualDemosaicContrast->show(); dualDemosaicOptions->pack_start(*dualDemosaicContrast); pack_start( *dualDemosaicOptions, Gtk::PACK_SHRINK, 4); - borderbox = Gtk::manage(new Gtk::HBox()); + borderbox = Gtk::manage(new Gtk::Box()); 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->setDelay(std::max(options.adjusterMinDelay, 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 ); + pack_start( *Gtk::manage( new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)), Gtk::PACK_SHRINK, 0 ); ccSteps = Gtk::manage (new Adjuster (M("TP_RAW_FALSECOLOR"), 0, 5, 1, 0 )); ccSteps->setAdjusterListener (this); - if (ccSteps->delay < options.adjusterMaxDelay) { - ccSteps->delay = options.adjusterMaxDelay; - } + ccSteps->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); ccSteps->show(); pack_start( *ccSteps, Gtk::PACK_SHRINK, 4); diff --git a/rtgui/xtransprocess.h b/rtgui/xtransprocess.h index fc0dd7502..6639a3796 100644 --- a/rtgui/xtransprocess.h +++ b/rtgui/xtransprocess.h @@ -36,10 +36,10 @@ class XTransProcess final : protected: MyComboBoxText* method; - Gtk::HBox* borderbox; + Gtk::Box* borderbox; Adjuster* border; Adjuster* ccSteps; - Gtk::VBox *dualDemosaicOptions; + Gtk::Box* dualDemosaicOptions; Adjuster* dualDemosaicContrast; bool lastAutoContrast; @@ -52,6 +52,7 @@ protected: rtengine::ProcEvent EvDemosaicContrast; public: + static const Glib::ustring TOOL_NAME; XTransProcess (); ~XTransProcess () override; diff --git a/rtgui/xtransrawexposure.cc b/rtgui/xtransrawexposure.cc index 28059e69c..2e26b8f63 100644 --- a/rtgui/xtransrawexposure.cc +++ b/rtgui/xtransrawexposure.cc @@ -22,36 +22,31 @@ #include "guiutils.h" #include "options.h" - #include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; -XTransRAWExposure::XTransRAWExposure () : FoldableToolPanel(this, "xtransrawexposure", M("TP_EXPOS_BLACKPOINT_LABEL")) +const Glib::ustring XTransRAWExposure::TOOL_NAME = "xtransrawexposure"; + +XTransRAWExposure::XTransRAWExposure () : FoldableToolPanel(this, TOOL_NAME, M("TP_EXPOS_BLACKPOINT_LABEL")) { PexBlackRed = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_RED"), -2048, 2048, 1.0, 0)); //black level PexBlackRed->setAdjusterListener (this); - if (PexBlackRed->delay < options.adjusterMaxDelay) { - PexBlackRed->delay = options.adjusterMaxDelay; - } + PexBlackRed->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlackRed->show(); PexBlackGreen = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_GREEN"), -2048, 2048, 1.0, 0)); //black level PexBlackGreen->setAdjusterListener (this); - if (PexBlackGreen->delay < options.adjusterMaxDelay) { - PexBlackGreen->delay = options.adjusterMaxDelay; - } + PexBlackGreen->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlackGreen->show(); PexBlackBlue = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_BLUE"), -2048, 2048, 1.0, 0)); //black level PexBlackBlue->setAdjusterListener (this); - if (PexBlackBlue->delay < options.adjusterMaxDelay) { - PexBlackBlue->delay = options.adjusterMaxDelay; - } + PexBlackBlue->setDelay(std::max(options.adjusterMinDelay, options.adjusterMaxDelay)); PexBlackBlue->show(); diff --git a/rtgui/xtransrawexposure.h b/rtgui/xtransrawexposure.h index a8daf6972..c332bc510 100644 --- a/rtgui/xtransrawexposure.h +++ b/rtgui/xtransrawexposure.h @@ -37,6 +37,7 @@ protected: private: // Gtk::CheckButton* PextwoGreen; public: + static const Glib::ustring TOOL_NAME; XTransRAWExposure (); diff --git a/tools/INSTALL.readme b/tools/INSTALL.readme new file mode 100644 index 000000000..a4f19ec3c --- /dev/null +++ b/tools/INSTALL.readme @@ -0,0 +1,3 @@ +To install the RawTherapee application, open the .dmg and drag the RawTherapee app onto the /Applications folder. + +To use the optional rawtherapee-cli command line interface, move rawtherapee-cli into a folder in your $PATH and install the RawTherapee app as above. diff --git a/tools/findorphans.py b/tools/findorphans.py new file mode 100755 index 000000000..4933f4b2e --- /dev/null +++ b/tools/findorphans.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import clang.cindex +import subprocess +import sys + +index = clang.cindex.Index.create() +procevents = index.parse('rtengine/procevents.h',args=['-x', 'c++']) + +if(1): + for chld in procevents.cursor.get_children(): + if(chld.displayname == 'rtengine'): + for c in chld.get_children(): + if(c.displayname == 'ProcEventCode'): + for pec in c.get_children(): + #print(pec.kind, pec.displayname, pec.enum_value) + #print(pec.displayname, file=sys.stderr) + grp1 = subprocess.Popen(('grep', '-ro', '--exclude=procevents.h', '--exclude-dir=.git', pec.displayname), stdout=subprocess.PIPE) + wcr1 = subprocess.check_output(('wc', '-l'), stdin=grp1.stdout) + grp1.wait() + grp2 = subprocess.Popen(('grep', '-ro', '--exclude=procevents.h', '--exclude=refreshmap.cc', '--exclude-dir=.git', pec.displayname), stdout=subprocess.PIPE) + wcr2 = subprocess.check_output(('wc', '-l'), stdin=grp2.stdout) + grp2.wait() + print(pec.enum_value, pec.displayname,int(wcr1), int(wcr2)) + +with open('rtdata/languages/default', 'r') as deflang: + for line in deflang: + if(line[0] == '#'): + continue + if(line[0:2] == '//'): + continue + if(line[0:2] == '/*'): + #our language files support comment blocks????????????????????????????? + #or is this commented block bogus? + continue + if(line[0:2] == '*/'): + continue + else: + stringid = line.split(';')[0] + if(stringid.startswith('HISTORY_MSG')): + continue + #print(stringid, file=sys.stderr) + grp1 = subprocess.Popen(('grep', '-ro', '--exclude-dir=languages', '--exclude-dir=.git', stringid), stdout=subprocess.PIPE) + wcr1 = subprocess.check_output(('wc', '-l'), stdin=grp1.stdout) + grp1.wait() + print(stringid, int(wcr1)) diff --git a/tools/generatePngIcons b/tools/generatePngIcons index 70ee3ee1b..9fee79c52 100755 --- a/tools/generatePngIcons +++ b/tools/generatePngIcons @@ -1,6 +1,7 @@ #!/usr/bin/env bash # By Maciej Dworak -# Version 2018-07-21 +# Version 2021-06-04 +# Compatible with Inkscape 1.0 # This script generates PNG icons from SVG files using Inkscape. # If pngquant is installed, it will automatically use it to compress the PNGs. # @@ -96,17 +97,17 @@ printf '%s\n' "Output folder: ${outDir}" "" convertSvg() { if [[ ${OSTYPE^^} = "MSYS" ]]; then "/c/Program Files/Inkscape/inkscape.exe" \ - --without-gui \ --export-area-page \ --export-background-opacity="0" \ - --export-png="$1" \ + --export-type=png \ + --export-filename="$1" \ "$2" else inkscape \ - --without-gui \ --export-area-page \ --export-background-opacity="0" \ - --export-png="$1" \ + --export-type=png \ + --export-filename="$1" \ "$2" fi diff --git a/tools/generateRtexifUpdates b/tools/generateRtexifUpdates index 72a97862e..b4ace209d 100755 --- a/tools/generateRtexifUpdates +++ b/tools/generateRtexifUpdates @@ -32,7 +32,10 @@ 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" +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" #In :10.1 Sigma 50mm f/2.8 EX #Out: {10, "Sigma 50mm f/2.8 EX"}, @@ -55,7 +58,11 @@ sed -r -i \ # 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" +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/] = "/' \ @@ -65,28 +72,84 @@ sed -r -i \ #------------------------------------------------------------------------------ # 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" + +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" + +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" + +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" + +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" + # Sony has more lenses under the LensType2 tag printf '%s\n' "Saving ${tmpdir}/sony-lenstype2" -xmlstarlet sel -T -t -m "taginfo/table/tag[@name='LensType2']/values/key" -v "concat(@id,' ',val)" -n < <("$et" -listx -sony:all) | sort -fuV > "${tmpdir}/sony-lenstype2" -sed -r -i -e 's/^/ {/' -e 's/([0-9]+)[0-9.]*\t/\1, "/' -e 's/$/"},/' -e 's| F([0-9]+)| f/\1|g' "${tmpdir}/sony" -sed -r -i -e '/255\tTamron Lens (255)/d' -e 's/([0-9]+)[0-9.]*\t/\1, "/' -e 's/^/ choices.insert (p_t (/' -e 's/$/"));/' -e 's| F([0-9]+)| f/\1|g' "${tmpdir}/sony-lenstype2" + +xmlstarlet sel -T -t \ + -m "taginfo/table/tag[@name='LensType2']/values/key" \ + -v "concat(@id,' ',val)" \ + -n < <("$et" -listx -sony:all) | sort -fuV > "${tmpdir}/sony-lenstype2" + +sed -r -i \ + -e 's/^/ {/' \ + -e 's/([0-9]+)[0-9.]*\t/\1, "/' \ + -e 's/$/"},/' \ + -e 's| F([0-9]+)| f/\1|g' \ + "${tmpdir}/sony" + +sed -r -i \ + -e '/255\tTamron Lens (255)/d' \ + -e 's/([0-9]+)[0-9.]*\t/\1, "/' \ + -e 's/^/ choices.insert (p_t (/' \ + -e 's/$/"));/' \ + -e 's| F([0-9]+)| f/\1|g' \ + "${tmpdir}/sony-lenstype2" diff --git a/tools/generateUnusedKeys b/tools/generateUnusedKeys index 6d2b68390..7fceddf3d 100755 --- a/tools/generateUnusedKeys +++ b/tools/generateUnusedKeys @@ -69,6 +69,7 @@ dos2unix default 2>/dev/null # -Irl -m1 # Dynamically built keys like HISTORY_MSG_1 can't be grepped in the code, # so it renames KEY_1-KEY_9 to KEY_ so that they can be grepped and therefore ignored. +# See RAWParams::BayerSensor::getMethodStrings t1="$(date +%s)" printf '%s\n' 'Matching keys in "default" against .cc and .h files' 'Unmatched keys follow:' unset delLines @@ -84,11 +85,25 @@ done < <( \ -e "^(#|$)|TP_RAW_2PASS" \ -e "^(#|$)|TP_RAW_3PASSBEST" \ -e "^(#|$)|TP_RAW_4PASS" \ + -e "^(#|$)|TP_RAW_AMAZE" \ + -e "^(#|$)|TP_RAW_AMAZEBILINEAR" \ -e "^(#|$)|TP_RAW_AMAZEVNG4" \ - -e "^(#|$)|TP_RAW_DCBVNG4" \ - -e "^(#|$)|TP_RAW_MONO" \ - -e "^(#|$)|TP_RAW_NONE" \ + -e "^(#|$)|TP_RAW_RCD" \ + -e "^(#|$)|TP_RAW_RCDBILINEAR" \ -e "^(#|$)|TP_RAW_RCDVNG4" \ + -e "^(#|$)|TP_RAW_DCB" \ + -e "^(#|$)|TP_RAW_DCBBILINEAR" \ + -e "^(#|$)|TP_RAW_DCBVNG4" \ + -e "^(#|$)|TP_RAW_LMMSE" \ + -e "^(#|$)|TP_RAW_IGV" \ + -e "^(#|$)|TP_RAW_AHD" \ + -e "^(#|$)|TP_RAW_EAHD" \ + -e "^(#|$)|TP_RAW_HPHD" \ + -e "^(#|$)|TP_RAW_VNG4" \ + -e "^(#|$)|TP_RAW_FAST" \ + -e "^(#|$)|TP_RAW_MONO" \ + -e "^(#|$)|TP_RAW_PIXELSHIFT" \ + -e "^(#|$)|TP_RAW_NONE" \ "default" | \ sed -e "s/EXTPROGTARGET_[0-9]*/EXTPROGTARGET_/" \ -e "s/FILEBROWSER_POPUPCOLORLABEL[0-9]*/FILEBROWSER_POPUPCOLORLABEL/" \ diff --git a/tools/osx/INSTALL.readme.rtf b/tools/osx/INSTALL.readme.rtf new file mode 100644 index 000000000..6c8f2e334 --- /dev/null +++ b/tools/osx/INSTALL.readme.rtf @@ -0,0 +1,7 @@ +To use the RawTherapee Application: + You must drag the app from the .dmg into the /Applications folder. + +If you wish to use the Command-Line Interface: + An unsigned -cli is in the zip along with the .dmg. + You must install the app from the .dmg into /Applications and copy the -cli to your /usr/local/bin. + The -cli will load its libraries dynamically from the app in /Applications. diff --git a/tools/osx/Info.plist-bin.in b/tools/osx/Info.plist-bin.in deleted file mode 100644 index 33abd4f7a..000000000 --- a/tools/osx/Info.plist-bin.in +++ /dev/null @@ -1,10 +0,0 @@ - - - - - CFBundleName - RawTherapee-bin - CFBundleIdentifier - com.rawtherapee.rawtherapee - - diff --git a/tools/osx/Info.plist.in b/tools/osx/Info.plist.in index eec1ab490..2faa69f83 100644 --- a/tools/osx/Info.plist.in +++ b/tools/osx/Info.plist.in @@ -1,9 +1,46 @@ - - CFBundleDevelopmentRegion - English + LSEnvironment + + XDG_CONFIG_DIRS + /Applications/RawTherapee.app/Contents/Resources/share/gtk-3.0 + XDG_CONFIG_HOME + /Applications/RawTherapee.app/Contents/Resources/share + XDG_DATA_DIRS + /Applications/RawTherapee.app/Contents/Resources/share/gtk-3.0 + GTK_PATH + /Applications/RawTherapee.app/Contents/Resources/share/gtk-3.0 + GTK_IM_MODULE_FILE + /Applications/RawTherapee.app/Contents/Resources/etc/gtk-3.0/gtk.immodules + XDG_DATA_HOME + /Applications/RawTherapee.app/Contents/Resources/share + GSETTINGS_SCHEMA_DIR + /Applications/RawTherapee.app/Contents/Resources/share/glib-2.0/schemas + GDK_PIXBUF_MODULE_FILE + /Applications/RawTherapee.app/Contents/Resources/etc/gtk-3.0/gdk-pixbuf.loaders + GDK_PIXBUF_MODULEDIR + /Applications/RawTherapee.app/Contents/Frameworks + LIBDIR + /Applications/RawTherapee.app/Contents/Frameworks + DATADIR + /Applications/RawTherapee.app/Contents/Resources + GDK_RENDERING + similar + GTK_OVERLAY_SCROLLING + 0 + + LSMultipleInstancesProhibited + + LSMinimumSystemVersionByArchitecture + + arm64 + @minimum_arm64_version@ + x86_64 + @minimum_x86_64_version@ + + CFBundleAllowMixedLocalizations + CFBundleDisplayName RawTherapee CFBundleDocumentTypes @@ -21,7 +58,7 @@ CFBundleTypeRole Editor LSIsAppleDefaultForType - + LSItemContentTypes com.rawtherapee.pp3 @@ -36,6 +73,8 @@ arw CR2 cr2 + CR3 + cr3 CRF crf CRW @@ -115,7 +154,7 @@ CFBundleIconFile rawtherapee.icns CFBundleIdentifier - com.rawtherapee.rawtherapee + com.rawtherapee.RawTherapee CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -128,12 +167,13 @@ ???? CFBundleVersion @shortVersion@ - LSExecutableArchitectures + LSArchitecturePriority - @arch@ + arm64 + x86_64 NSHighResolutionCapable - + NSHumanReadableCopyright Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team UTExportedTypeDeclarations diff --git a/tools/osx/executable_loader.in b/tools/osx/executable_loader.in deleted file mode 100644 index 429173d8e..000000000 --- a/tools/osx/executable_loader.in +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -cd "$(dirname "$0")" || exit 1 - -cwd="$(pwd)" -app="${cwd%/Contents/*}" -lib="${app}/Contents/Frameworks" -resources="${app}/Contents/Resources" -etc="${resources}"/etc -export XDG_DATA_DIRS="${resources}/share" -export DYLD_LIBRARY_PATH="${lib}" -export GTK_PATH="${lib}/gtk-3.0/3.0.0" -export XDG_DATA_HOME="${resources}/share" -export GSETTINGS_SCHEMA_DIR="${resources}/share/glib-2.0/schemas" -export GDK_PIXBUF_MODULE_FILE="${etc}/gtk-3.0/gdk-pixbuf.loaders" -export GDK_PIXBUF_MODULEDIR="${lib}/gdk-pixbuf-2.0/2.10.0/loaders" - -export RT_SETTINGS="${HOME}/Library/Application Support/RawTherapee/config" -export RT_CACHE="${HOME}/Library/Application Support/RawTherapee/cache" - -# Strip out system argument -case "$1" in - -psn_*) shift ;; -esac - -# Prevent crash when directory name contains special characters -AppleLocale=`defaults read -g AppleLocale` -export LANG=${AppleLocale%@*}.UTF-8 - -exec "${cwd}/bin/rawtherapee-bin" "$@" diff --git a/tools/osx/info-plist.cmake b/tools/osx/info-plist.cmake new file mode 100644 index 000000000..9d64529f3 --- /dev/null +++ b/tools/osx/info-plist.cmake @@ -0,0 +1 @@ +configure_file(${PROJECT_SOURCE_DATA_DIR}/Info.plist.in ${CONTENTS}/Info.plist) diff --git a/tools/osx/libiconv_1.14_rt.patch b/tools/osx/libiconv_1.14_rt.patch deleted file mode 100644 index 7a01b1373..000000000 --- a/tools/osx/libiconv_1.14_rt.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/lib/iconv.c b/lib/iconv.c -index 3785296..24a0f07 100644 ---- a/lib/iconv.c -+++ b/lib/iconv.c -@@ -607,4 +607,25 @@ strong_alias (libiconv, iconv) - strong_alias (libiconv_close, iconv_close) - #endif - -+#undef iconv_open -+#undef iconv -+#undef iconv_close -+ -+LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode) -+{ -+ return libiconv_open(tocode, fromcode); -+} -+ -+LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd, -+ ICONV_CONST char * * inbuf, size_t *inbytesleft, -+ char * * outbuf, size_t *outbytesleft) -+{ -+ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft); -+} -+ -+LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd) -+{ -+ return libiconv_close(icd); -+} -+ - #endif diff --git a/tools/osx/libiconv_1.15_rt.patch b/tools/osx/libiconv_1.15_rt.patch deleted file mode 100644 index ca434154b..000000000 --- a/tools/osx/libiconv_1.15_rt.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/lib/iconv.c b/lib/iconv.c -index 31853a7..630a498 100644 ---- a/lib/iconv.c -+++ b/lib/iconv.c -@@ -611,4 +611,25 @@ strong_alias (libiconv, iconv) - strong_alias (libiconv_close, iconv_close) - #endif - -+#undef iconv_open -+#undef iconv -+#undef iconv_close -+ -+LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode) -+{ -+ return libiconv_open(tocode, fromcode); -+} -+ -+LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd, -+ ICONV_CONST char * * inbuf, size_t *inbytesleft, -+ char * * outbuf, size_t *outbytesleft) -+{ -+ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft); -+} -+ -+LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd) -+{ -+ return libiconv_close(icd); -+} -+ - #endif diff --git a/tools/osx/libiconv_1.16_rt.patch b/tools/osx/libiconv_1.16_rt.patch deleted file mode 100644 index 470f7780c..000000000 --- a/tools/osx/libiconv_1.16_rt.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/lib/iconv.c b/lib/iconv.c -index b7a04f8..41c5896 100644 ---- a/lib/iconv.c -+++ b/lib/iconv.c -@@ -610,5 +610,26 @@ strong_alias (libiconv_open, iconv_open) - strong_alias (libiconv, iconv) - strong_alias (libiconv_close, iconv_close) - #endif -+ -+#undef iconv_open -+#undef iconv -+#undef iconv_close -+ -+LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode) -+{ -+ return libiconv_open(tocode, fromcode); -+} -+ -+LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd, -+ ICONV_CONST char * * inbuf, size_t *inbytesleft, -+ char * * outbuf, size_t *outbytesleft) -+{ -+ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft); -+} -+ -+LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd) -+{ -+ return libiconv_close(icd); -+} - - #endif diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 3958326e8..ca381ec14 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -9,11 +9,11 @@ # - GTK_PREFIX # Formatting -fNormal="$(tput sgr0)" -fBold="$(tput bold)" +fNormal="$(tput sgr0)" >/dev/null 2>&1 +fBold="$(tput bold)" >/dev/null 2>&1 # Colors depend upon the user's terminal emulator color scheme - what is readable for you may be not readable for someone else. -fMagenta="$(tput setaf 5)" -fRed="$(tput setaf 1)" +fMagenta="$(tput setaf 5)" >/dev/null 2>&1 +fRed="$(tput setaf 1)" >/dev/null 2>&1 function msg { printf "\\n${fBold}-- %s${fNormal}\\n" "${@}" @@ -24,7 +24,7 @@ function msgError { } function GetDependencies { - otool -L "$1" | awk 'NR >= 2 && $1 !~ /^(\/usr\/lib|\/System|@executable_path|@rpath)\// { print $1 }' + otool -L "$1" | awk 'NR >= 2 && $1 !~ /^(\/usr\/lib|\/System|@executable_path|@rpath)\// { print $1 }' 2>&1 } function CheckLink { @@ -34,27 +34,43 @@ function CheckLink { done } +function ModifyInstallNames { + find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do + msg "Modifying install names: ${x}" + { + # id + if [[ ${x:(-6)} == ".dylib" ]] || [[ f${x:(-3)} == ".so" ]]; then + install_name_tool -id /Applications/"${LIB}"/$(basename ${x}) ${x} 2>/dev/null + fi + GetDependencies "${x}" | while read -r y + do + install_name_tool -change ${y} /Applications/"${LIB}"/$(basename ${y}) ${x} 2>/dev/null + done + } | bash -v + done +} + # Source check -if [[ ! -d "${CMAKE_BUILD_TYPE}" ]]; then +if [[ ! -d $CMAKE_BUILD_TYPE ]]; then msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." exit 1 fi # Update project version -if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then +if [[ -x $(which git) && -d $PROJECT_SOURCE_DIR/.git ]]; then ### This section is copied from tools/generateReleaseInfo # Get version description. # Depending on whether you checked out a branch (dev) or a tag (release), # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. gitDescribe="$(git describe --tags --always)" - + # Apple requires a numeric version of the form n.n.n # https://goo.gl/eWDQv6 - + # Get number of commits since tagging. This is what gitDescribe uses. # Works when checking out branch, tag or commit. gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))" - + # 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). @@ -65,21 +81,25 @@ if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0 fi ### Copy end. - + PROJECT_FULL_VERSION="$gitDescribe" PROJECT_VERSION="$gitVersionNumericBS" - fi +#In: CMAKE_OSX_DEPLOYMENT_TARGET=11.3 +#Out: 11.3 +CMAKE_OSX_DEPLOYMENT_TARGET="$(cmake .. -L -N | grep CMAKE_OSX_DEPLOYMENT_TARGET)"; CMAKE_OSX_DEPLOYMENT_TARGET="${CMAKE_OSX_DEPLOYMENT_TARGET#*=}" + +#In: CMAKE_OSX_ARCHITECTURES=x86_64 +#Out: x86_64 +CMAKE_OSX_ARCHITECTURES="$(cmake .. -L -N | grep CMAKE_OSX_ARCHITECTURES)"; CMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES#*=}" + MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')" -if [[ -z "${MINIMUM_SYSTEM_VERSION}" ]]; then - MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" +if [[ -z $MINIMUM_SYSTEM_VERSION ]]; then + MINIMUM_SYSTEM_VERSION=${CMAKE_OSX_DEPLOYMENT_TARGET} fi -case ${PROC_BIT_DEPTH} in - 64) arch=x86_64;; - 32) arch=i386;; -esac +arch=${CMAKE_OSX_ARCHITECTURES} cat <<__EOS__ PROJECT_NAME: ${PROJECT_NAME} @@ -92,6 +112,54 @@ GTK_PREFIX: ${GTK_PREFIX} PWD: ${PWD} __EOS__ +minimum_macos_version=${MINIMUM_SYSTEM_VERSION} + +# Retrieve cached values from cmake + +#In: LOCAL_PREFIX:STRING=/opt +#Out: /opt +LOCAL_PREFIX="$(cmake .. -L -N | grep LOCAL_PREFIX)"; LOCAL_PREFIX="${LOCAL_PREFIX#*=}" + +#In: OSX_UNIVERSAL_URL=file:/// etc. +#Out: file:/// etc. +UNIVERSAL_URL="$(cmake .. -L -N | grep OSX_UNIVERSAL_URL)"; UNIVERSAL_URL="${UNIVERSAL_URL#*=}" +if [[ -n $UNIVERSAL_URL ]]; then + echo "Universal app is ON. The URL is ${UNIVERSAL_URL}" +fi + +#In: pkgcfg_lib_EXPAT_expat:FILEPATH=/opt/local/lib/libexpat.dylib +#Out: /opt/local/lib/libexpat.dylib +EXPATLIB="$(cmake .. -LA -N | grep pkgcfg_lib_EXPAT_expat)"; pkgcfg_lib_EXPAT_expat="${pkgcfg_lib_EXPAT_expat#*=}" + +#In: CODESIGNID:STRING=Developer ID Application: Doctor Who (1234567890) +#Out: Developer ID Application: Doctor Who (1234567890) +CODESIGNID="$(cmake .. -L -N | grep CODESIGNID)"; CODESIGNID="${CODESIGNID#*=}" + +#In: NOTARY:STRING="--apple-id drwho@bbc.com --password abcd-efgh-hijk-lmno --team-id ABCDE12345" +#Out: --apple-id drwho@bbc.com --password abcd-efgh-hijk-lmno --team-id ABCDE12345 +NOTARY="$(cmake .. -L -N | grep NOTARY)"; NOTARY="${NOTARY#*=}" + +# In: FANCY_DMG:BOOL=ON +# Out: ON +FANCY_DMG="$(cmake .. -L -N | grep FANCY_DMG)"; FANCY_DMG="${FANCY_DMG#*=}" +if [[ -n $FANCY_DMG ]]; then + echo "Fancy .dmg build is ON." +fi + +# In: OSX_NIGHTLY:BOOL=ON +# Out: ON +OSX_NIGHTLY="$(cmake .. -L -N | grep OSX_NIGHTLY)"; NIGHTLY="${OSX_NIGHTLY#*=}" +if [[ -n $NIGHTLY ]]; then + echo "Nightly/generically-named zip is ON." +fi + +# In: OSX_CONTINUOUS:BOOL=ON +# Out: ON +OSX_CONTINUOUS="$(cmake .. -L -N | grep OSX_CONTINUOUS)"; NIGHTLY="${OSX_CONTINUOUS#*=}" && CONTINUOUS="${OSX_CONTINUOUS#*=}" +if [[ -n $CONTINUOUS ]]; then + echo "Continuous/generically-named zip is ON." +fi + APP="${PROJECT_NAME}.app" CONTENTS="${APP}/Contents" RESOURCES="${CONTENTS}/Resources" @@ -99,226 +167,294 @@ MACOS="${CONTENTS}/MacOS" LIB="${CONTENTS}/Frameworks" ETC="${RESOURCES}/etc" EXECUTABLE="${MACOS}/rawtherapee" -GDK_PREFIX="/usr/local/opt/gdk-pixbuf" +GDK_PREFIX="${LOCAL_PREFIX}/" msg "Removing old files:" -rm -rf "${APP}" "${PROJECT_NAME}_*.dmg" "*zip" +rm -rf "${APP}" *.dmg *.zip *.app msg "Creating bundle container:" -install -d "${RESOURCES}" \ - "${MACOS}" \ - "${LIB}" \ - "${ETC}" +install -d "${RESOURCES}" +install -d "${MACOS}" +install -d "${LIB}" +install -d "${ETC}" -msg "Copying release files:" +msg "Copying binary executable files." ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" -ditto "Resources" "${RESOURCES}" -msg "Copying dependencies from ${GTK_PREFIX}:" -CheckLink "${EXECUTABLE}" +msg "Copying Resources directory." +#cp AboutThisBuild.txt "${RESOURCES}" +ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}" -msg "Copying library modules from ${GTK_PREFIX}:" -ditto --arch "${arch}" {"${GDK_PREFIX}/lib","${LIB}"}/gdk-pixbuf-2.0 -ditto --arch "${arch}" {"${GTK_PREFIX}/lib","${LIB}"}/gtk-3.0 - -msg "Removing static libraries and cache files:" -find -E "${LIB}" -type f -regex '.*\.(a|la|cache)$' | while read -r; do rm "${REPLY}"; done - -msg "Copying configuration files from ${GTK_PREFIX}:" -install -d "${ETC}/gtk-3.0" - -# Make Frameworks folder flat -mv "${LIB}"/gdk-pixbuf-2.0/2*/loaders/*.so "${LIB}" -mv "${LIB}"/gtk-3.0/3*/immodules/*.so "${LIB}" -# the print*.so lead to errors when running gtk-query-immodules-3.0, just seeing what the app does without, since they are not in immodules -# and including them leads to errors and a completely empty gtk.immodules file -# mv "${LIB}"/gtk-3.0/3*/printbackends/*.so "${LIB}" -rm -r "${LIB}"/gtk-3.0 -rm -r "${LIB}"/gdk-pixbuf-2.0 - -"${GDK_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 > "${ETC}"/gtk-3.0/gtk.immodules -sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" - -mkdir -p ${RESOURCES}/share/glib-2.0 -cp -pRL {"/usr/local","${RESOURCES}"}/share/glib-2.0/schemas -"/usr/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" - -msg "Copying shared files from ${GTK_PREFIX}:" -cp -pRL {"/usr/local","${RESOURCES}"}/share/mime - -# GTK3 themes -ditto {"/usr/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css -ditto {"/usr/local","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css -# Adwaita icons -iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "48x48/devices") -for f in "${iconfolders[@]}"; do - mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} - cp /usr/local/share/icons/Adwaita/${f}/* "${RESOURCES}"/share/icons/Adwaita/${f} -done -ditto {"/usr/local","${RESOURCES}"}/share/icons/Adwaita/index.theme -"/usr/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" - -# Copy libjpeg-turbo into the app bundle -cp /usr/local/lib/libjpeg.*.dylib "${CONTENTS}/Frameworks" - -# Copy libexpat into the app bundle (which is keg-only) -cp /usr/local/Cellar/expat/*/lib/libexpat.1.dylib "${CONTENTS}/Frameworks" - -# Copy libz into the app bundle -cp /usr/lib/libz.1.dylib "${CONTENTS}/Frameworks" - -# Copy libtiff into the app bundle -cp /usr/local/lib/libtiff.5.dylib "${CONTENTS}/Frameworks" +echo "\n--------\n" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle date: $(date -Ru) UTC" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle epoch: $(date +%s)" >> "${RESOURCES}/AboutThisBuild.txt" +echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${RESOURCES}/AboutThisBuild.txt" # Copy the Lensfun database into the app bundle mkdir -p "${RESOURCES}/share/lensfun" -cp /usr/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" +lensfunversion=$(pkg-config --modversion lensfun | cut -f3 -d'.') +if [ $lensfunversion = 95 ] +then + ditto ${LOCAL_PREFIX}/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" + # Copy liblensfun to Frameworks + ditto ${LOCAL_PREFIX}/lib/liblensfun.2.dylib "${CONTENTS}/Frameworks/liblensfun.2.dylib" -# Copy liblensfun to Frameworks -cp /usr/local/lib/liblensfun.2.dylib "${CONTENTS}/Frameworks" +else + ditto ${LOCAL_PREFIX}/share/lensfun/version_1/* "${RESOURCES}/share/lensfun" + # Copy liblensfun to Frameworks + ditto ${LOCAL_PREFIX}/lib/liblensfun.1.dylib "${CONTENTS}/Frameworks/liblensfun.1.dylib" +fi # Copy libomp to Frameworks -cp /usr/local/lib/libomp.dylib "${CONTENTS}/Frameworks" +cp ${LOCAL_PREFIX}/lib/libomp.dylib "${CONTENTS}/Frameworks" -# Install names -find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do - msg "Modifying install names: ${x}" - { - # id - case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac - # names - GetDependencies "${x}" | while read -r y; do - echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'" - done - } | bash -v +msg "Copying dependencies from ${GTK_PREFIX}." +CheckLink "${EXECUTABLE}" 2>&1 + +# dylib install names +ModifyInstallNames 2>&1 + +## Copy libexpat into the app bundle (which is keg-only) +## if [[ -d /usr/local/Cellar/expat ]]; then ditto /usr/local/Cellar/expat/*/lib/libexpat.1.dylib "${CONTENTS}/Frameworks"; else cp "${EXPATLIB}" "${CONTENTS}/Frameworks/libexpat.1.dylib"; fi + +## Copy libz into the app bundle +## cp ${LOCAL_PREFIX}/lib/libz.1.dylib "${CONTENTS}/Frameworks" + +# Copy libpng16 to the app bundle +cp ${LOCAL_PREFIX}/lib/libpng16.16.dylib "${CONTENTS}/Frameworks/libpng16.16.dylib" + +# Copy libtiff 5 into the app bundle +cp ${LOCAL_PREFIX}/lib/libtiff.5.dylib "${CONTENTS}/Frameworks/libtiff.5.dylib" + +# Copy libomp to Frameworks +cp ${LOCAL_PREFIX}/lib/libomp.dylib "${CONTENTS}/Frameworks" + +# Prepare GTK+3 installation +msg "Copying configuration files from ${GTK_PREFIX}:" +cp -RL {"${GDK_PREFIX}/lib","${LIB}"}/gdk-pixbuf-2.0 +msg "Copying library modules from ${GTK_PREFIX}:" +cp -RL {"${GDK_PREFIX}/lib","${LIB}"}/gdk-pixbuf-2.0 +ditto --arch "${arch}" {"${GTK_PREFIX}/lib","${LIB}"}/gtk-3.0 +msg "Removing static libraries and cache files:" +find -E "${LIB}" -type f -regex '.*\.(a|la|cache)$' | while read -r; do rm "${REPLY}"; done + +# Make Frameworks folder flat +msg "Flattening the Frameworks folder" +cp -RL "${LIB}"/gdk-pixbuf-2.0/2*/loaders/* "${LIB}" +cp "${LIB}"/gtk-3.0/3*/immodules/*.{dylib,so} "${LIB}" >/dev/null 2>&1 +rm -r "${LIB}"/gtk-3.0 +rm -r "${LIB}"/gdk-pixbuf-2.0 + +# GTK+3 themes +msg "Copy GTK+3 theme and icon resources:" +ditto {"${LOCAL_PREFIX}","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css +ditto {"${LOCAL_PREFIX}","${RESOURCES}"}/share/themes/Default/gtk-3.0/gtk-keys.css + +# Adwaita icons +msg "Copy Adwaita icons" +iconfolders=("16x16/actions" "16x16/devices" "16x16/mimetypes" "16x16/places" "16x16/status" "16x16/ui" "48x48/devices") +for f in "${iconfolders[@]}"; do + mkdir -p ${RESOURCES}/share/icons/Adwaita/${f} + cp -RL ${LOCAL_PREFIX}/share/icons/Adwaita/${f}/* "${RESOURCES}"/share/icons/Adwaita/${f} +done +cp -RL {"${LOCAL_PREFIX}","${RESOURCES}"}/share/icons/Adwaita/index.theme +"${LOCAL_PREFIX}/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" || "${LOCAL_PREFIX}/bin/gtk-update-icon-cache-3.0" "${RESOURCES}/share/icons/Adwaita" +cp -RL "${LOCAL_PREFIX}/share/icons/hicolor" "${RESOURCES}/share/icons/hicolor" + +# fix libfreetype install name +for lib in "${LIB}"/*; do + install_name_tool -change libfreetype.6.dylib "${LIB}"/libfreetype.6.dylib "${lib}" 2>/dev/null done -msg "Registering @loader_path into the executable:" -echo " install_name_tool -add_rpath @executable_path/../../Frameworks '${EXECUTABLE}'" | bash -v -echo " install_name_tool -add_rpath @loader_path/../Frameworks '${EXECUTABLE}-cli'" | bash -v +# Build GTK3 pixbuf loaders & immodules database +msg "Build GTK3 databases:" +mkdir -p "${RESOURCES}"/share/gtk-3.0 +mkdir -p "${ETC}"/gtk-3.0 +"${LOCAL_PREFIX}"/bin/gdk-pixbuf-query-loaders "${LIB}"/libpixbufloader-*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders +"${LOCAL_PREFIX}"/bin/gtk-query-immodules-3.0 "${LIB}"/im-* > "${ETC}"/gtk-3.0/gtk.immodules || "${LOCAL_PREFIX}"/bin/gtk-query-immodules "${LIB}"/im-* > "${ETC}"/gtk-3.0/gtk.immodules +sed -i.bak -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}"/gtk-3.0/gdk-pixbuf.loaders "${ETC}/gtk-3.0/gtk.immodules" +sed -i.bak -e "s|${LOCAL_PREFIX}/share/|/Applications/RawTherapee.app/Contents/Resources/share/|" "${ETC}"/gtk-3.0/gtk.immodules +sed -i.bak -e "s|${LOCAL_PREFIX}/|/Applications/RawTherapee.app/Contents/Frameworks/|" "${ETC}"/gtk-3.0/gtk.immodules +rm "${ETC}"/*/*.bak + +# Install names +ModifyInstallNames 2>/dev/null + +# Mime directory +msg "Copying shared files from ${GTK_PREFIX}:" +ditto {"${LOCAL_PREFIX}","${RESOURCES}"}/share/mime msg "Installing required application bundle files:" PROJECT_SOURCE_DATA_DIR="${PROJECT_SOURCE_DIR}/tools/osx" -ditto "${PROJECT_SOURCE_DIR}/build/Resources" "${RESOURCES}" -# Executable loader -# Note: executable is renamed to 'rawtherapee-bin'. -mkdir "${MACOS}/bin" -mv "${MACOS}/rawtherapee" "${MACOS}/bin/rawtherapee-bin" -install -m 0755 "${PROJECT_SOURCE_DATA_DIR}/executable_loader.in" "${MACOS}/rawtherapee" +ditto "${PROJECT_SOURCE_DIR}/rtdata/fonts" "${ETC}/fonts" + # App bundle resources -cp "${PROJECT_SOURCE_DATA_DIR}/"{rawtherapee,profile}.icns "${RESOURCES}" -cp "${PROJECT_SOURCE_DATA_DIR}/PkgInfo" "${CONTENTS}" -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist.in" "${CONTENTS}/Info.plist" -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist-bin.in" "${CONTENTS}/MacOS/bin/Info.plist" -sed -i "" -e "s|@version@|${PROJECT_FULL_VERSION}| -s|@shortVersion@|${PROJECT_VERSION}| -s|@arch@|${arch}|" \ - "${CONTENTS}/Info.plist" -plutil -convert binary1 "${CONTENTS}/Info.plist" -plutil -convert binary1 "${CONTENTS}/MacOS/bin/Info.plist" -# Sign the app -CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" -if ! test -z "$CODESIGNID" ; then -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt.entitlements" "${CONTENTS}/Entitlements.plist" -plutil -convert binary1 "${CONTENTS}/Entitlements.plist" -install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt-bin.entitlements" "${CONTENTS}/MacOS/bin/Entitlements.plist" -plutil -convert binary1 "${CONTENTS}/MacOS/bin/Entitlements.plist" -codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee-bin" --timestamp -o runtime --entitlements "${APP}/Contents/MacOS/bin/Entitlements.plist" "${APP}/Contents/MacOS/bin/rawtherapee-bin" -codesign --deep --preserve-metadata=identifier,entitlements,runtime --strict -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee" --timestamp -o runtime --entitlements "${APP}/Contents/Entitlements.plist" "${APP}" +ditto "${PROJECT_SOURCE_DATA_DIR}/"{rawtherapee,profile}.icns "${RESOURCES}" +#ditto "${PROJECT_SOURCE_DATA_DIR}/PkgInfo" "${CONTENTS}" + +update-mime-database -V "${RESOURCES}/share/mime" +cp -RL "${LOCAL_PREFIX}/share/locale" "${RESOURCES}/share/locale" + +msg "Build glib database:" +mkdir -p ${RESOURCES}/share/glib-2.0 +cp -LR {"${LOCAL_PREFIX}","${RESOURCES}"}/share/glib-2.0/schemas +"${LOCAL_PREFIX}/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" + +# Append an LC_RPATH +msg "Registering @rpath into the main executable." +install_name_tool -add_rpath /Applications/"${LIB}" "${EXECUTABLE}" 2>/dev/null + +ModifyInstallNames 2>/dev/null + +# fix @rpath in Frameworks +msg "Registering @rpath in Frameworks folder." +for frameworklibs in "${LIB}"/*{dylib,so,cli}; do + install_name_tool -delete_rpath ${LOCAL_PREFIX}/lib "${frameworklibs}" 2>/dev/null + install_name_tool -add_rpath /Applications/"${LIB}" "${frameworklibs}" 2>/dev/null +done +install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABLE}"-cli 2>/dev/null +install_name_tool -add_rpath /Applications/"${LIB}" "${EXECUTABLE}"-cli 2>/dev/null +ditto "${EXECUTABLE}"-cli "${APP}"/.. + +# Merge the app with the other architecture to create the Universal app. +if [[ -n $UNIVERSAL_URL ]]; then + msg "Getting Universal countercomponent." + curl -L ${UNIVERSAL_URL} -o univ.zip + msg "Extracting app." + unzip univ.zip -d univapp + hdiutil attach -mountpoint ./RawTherapeeuniv univapp/*/*dmg + if [[ $arch = "arm64" ]]; then + cp -R RawTherapee.app RawTherapee-arm64.app + minimum_arm64_version=$(f=$(cat RawTherapee-arm64.app/Contents/Resources/AboutThisBuild.txt | grep mmacosx-version); echo "${f#*min=}" | cut -d ' ' -f1) + cp -R RawTherapeeuniv/RawTherapee.app RawTherapee-x86_64.app + minimum_x86_64_version=$(f=$(cat RawTherapee-x86_64.app/Contents/Resources/AboutThisBuild.txt | grep mmacosx-version); echo "${f#*min=}" | cut -d ' ' -f1) + echo "\n\n=====================================\n\n" >> RawTherapee.app/Contents/Resources/AboutThisBuild.txt + cat RawTherapee-x86_64.app/Contents/Resources/AboutThisBuild.txt >> RawTherapee.app/Contents/Resources/AboutThisBuild.txt + else + cp -R RawTherapee.app RawTherapee-x86_64.app + minimum_x86_64_version=$(f=$(cat RawTherapee-x86_64.app/Contents/Resources/AboutThisBuild.txt | grep mmacosx-version); echo "${f#*min=}" | cut -d ' ' -f1) + cp -R RawTherapeeuniv/RawTherapee.app RawTherapee-arm64.app + minimum_arm64_version=$(f=$(cat RawTherapee-arm64.app/Contents/Resources/AboutThisBuild.txt | grep mmacosx-version); echo "${f#*min=}" | cut -d ' ' -f1) + echo "\n\n=====================================\n\n" >> RawTherapee.app/Contents/Resources/AboutThisBuild.txt + cat RawTherapee-arm64.app/Contents/Resources/AboutThisBuild.txt >> RawTherapee.app/Contents/Resources/AboutThisBuild.txt + fi + cmake -DPROJECT_SOURCE_DATA_DIR=${PROJECT_SOURCE_DATA_DIR} -DCONTENTS=${CONTENTS} -Dversion=${PROJECT_FULL_VERSION} -DshortVersion=${PROJECT_VERSION} -Dminimum_arm64_version=${minimum_arm64_version} -Dminimum_x86_64_version=${minimum_x86_64_version} -Darch=${arch} -P ${PROJECT_SOURCE_DATA_DIR}/info-plist.cmake + hdiutil unmount ./RawTherapeeuniv + rm -r univapp + # Create the fat main RawTherapee binary and move it into the new bundle + lipo -create -output RawTherapee RawTherapee-arm64.app/Contents/MacOS/RawTherapee RawTherapee-x86_64.app/Contents/MacOS/RawTherapee + mv RawTherapee RawTherapee.app/Contents/MacOS + # Create all the fat dependencies and move them into the bundle + for lib in RawTherapee-arm64.app/Contents/Frameworks/* ; do + lipo -create -output $(basename $lib) RawTherapee-arm64.app/Contents/Frameworks/$(basename $lib) RawTherapee-x86_64.app/Contents/Frameworks/$(basename $lib) + done + sudo mv *cli *so *dylib RawTherapee.app/Contents/Frameworks + rm -r RawTherapee-arm64.app + rm -r RawTherapee-x86_64.app +else + minimum_arm64_version=$(f=$(cat RawTherapee.app/Contents/Resources/AboutThisBuild.txt | grep mmacosx-version); echo "${f#*min=}" | cut -d ' ' -f1) + minimum_x86_64_version=${minimum_arm64_version} + cmake -DPROJECT_SOURCE_DATA_DIR=${PROJECT_SOURCE_DATA_DIR} -DCONTENTS=${CONTENTS} -Dversion=${PROJECT_FULL_VERSION} -DshortVersion=${PROJECT_VERSION} -Dminimum_arm64_version=${minimum_arm64_version} -Dminimum_x86_64_version=${minimum_x86_64_version} -Darch=${arch} -P ${PROJECT_SOURCE_DATA_DIR}/info-plist.cmake +fi + +# Codesign the app +if [[ -n $CODESIGNID ]]; then + msg "Codesigning Application." + iconv -f UTF-8 -t ASCII "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements > "${CMAKE_BUILD_TYPE}"/rt.entitlements + mv "${EXECUTABLE}"-cli "${LIB}" + codesign --force --deep --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}" spctl -a -vvvv "${APP}" fi # Notarize the app -NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" -if ! test -z "$NOTARY" ; then +if [[ -n $NOTARY ]]; then + msg "Notarizing the application:" ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" - uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.rawtherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` - echo "Result= $uuid" # Display identifier string - sleep 15 - while : - do - fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status - status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` - if [ "$status1" = "success" ]; then - xcrun stapler staple *app # staple the ticket - xcrun stapler validate -v *app - echo "Notarization success" - break - elif [ "$status1" = "in" ]; then - echo "Notarization still in progress, sleeping for 15 seconds and trying again" - sleep 15 - else - echo "Notarization failed fullstatus below" - echo "$fullstatus" - exit 1 - fi - done + echo "Uploading..." + sudo xcrun notarytool submit "${APP}.zip" ${NOTARY} --wait fi function CreateDmg { - local srcDir="$(mktemp -dt $$)" - + local srcDir="$(mktemp -dt $$.XXXXXXXXXXXX)" + msg "Preparing disk image sources at ${srcDir}:" cp -R "${APP}" "${srcDir}" - cp AboutThisBuild.txt "${srcDir}" + cp "${RESOURCES}"/LICENSE "${srcDir}" ln -s /Applications "${srcDir}" - + # Web bookmarks function CreateWebloc { defaults write "${srcDir}/$1" URL "$2" mv "${srcDir}/$1".{plist,webloc} } - CreateWebloc 'Website' 'http://www.rawtherapee.com/' - CreateWebloc 'Manual' 'http://rawpedia.rawtherapee.com/' - + CreateWebloc 'Website' 'https://www.rawtherapee.com/' + CreateWebloc 'Documentation' 'https://rawpedia.rawtherapee.com/' + CreateWebloc 'Forum' 'https://discuss.pixls.us/c/software/rawtherapee' + CreateWebloc 'Report Bug' 'https://github.com/Beep6581/RawTherapee/issues/new' + # Disk image name - dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" + if [[ -n $UNIVERSAL_URL ]]; then + arch="Universal" + fi + dmg_name="${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}" lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" - if [[ ${lower_build_type} != release ]]; then + if [[ $lower_build_type != release ]]; then dmg_name="${dmg_name}_${lower_build_type}" fi - + msg "Creating disk image:" - hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" - - # Sign disk image - if ! test -z "$CODESIGNID" ; then - codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" - fi - - # Notarize the dmg - if ! test -z "$NOTARY" ; then - zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" - uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` - echo "dmg Result= $uuid" # Display identifier string - sleep 15 - while : - do - fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status - status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` - if [ "$status1" = "success" ]; then - xcrun stapler staple "${dmg_name}.dmg" # staple the ticket - xcrun stapler validate -v "${dmg_name}.dmg" - echo "dmg Notarization success" - break - elif [ "$status1" = "in" ]; then - echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" - sleep 15 - else - echo "dmg Notarization failed fullstatus below" - echo "$fullstatus" - exit 1 - fi - done + if [[ ! -z $FANCY_DMG ]]; then + echo "Building Fancy .dmg" + mkdir "${srcDir}/.background" + cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns" + cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png" "${srcDir}/.background/background.png" + SetFile -c incC "${srcDir}/.VolumeIcon.icns" + create-dmg "${dmg_name}.dmg" "${srcDir}" \ + --volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" \ + --appname "${PROJECT_NAME}" \ + --volicon "${srcDir}/.VolumeIcon.icns" \ + --sandbox-safe \ + --no-internet-enable \ + --eula LICENSE.txt \ + --hdiutil-verbose \ + --rez /Library/Developer/CommandLineTools/usr/bin/Rez + else + hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" fi - - + + # Sign disk image + if [[ -n $CODESIGNID ]]; then + msg "Signing disk image" + codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" + fi + + # Notarize the dmg + if ! test -z "$NOTARY"; then + msg "Notarizing the dmg:" + zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" + echo "Uploading..." + sudo xcrun notarytool submit "${dmg_name}.dmg.zip" ${NOTARY} --wait + fi + # Zip disk image for redistribution - zip "${dmg_name}.zip" "${dmg_name}.dmg" AboutThisBuild.txt - rm "${dmg_name}.dmg" - - msg "Removing disk image caches:" - rm -rf "${srcDir}" + msg "Zipping disk image for redistribution:" + mkdir "${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}_folder" + cp {"${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}.dmg","${PROJECT_NAME}.app/Contents/Frameworks/rawtherapee-cli","${PROJECT_SOURCE_DATA_DIR}/INSTALL.readme.rtf"} "${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}_folder" + zip -r "${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}.zip" "${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}_folder/" + if [[ -n $NIGHTLY ]]; then + cp "${PROJECT_NAME}_macOS_${MINIMUM_SYSTEM_VERSION}_${arch}_${PROJECT_FULL_VERSION}.zip" "${PROJECT_NAME}_macOS_${arch}_latest.zip" + fi + if [[ -n $CONTINUOUS ]]; then + BRANCH=$(git branch --show-current) + if test -z "${BRANCH}"; then + BRANCH=$(git rev-parse --short HEAD) + fi + mv "${PROJECT_NAME}_macOS_${arch}_latest.zip" "${PROJECT_NAME}_${BRANCH}_macOS_${CMAKE_BUILD_TYPE}.zip" + fi } + CreateDmg +msg "Finishing build:" +echo "Script complete." diff --git a/tools/osx/rt-bin.entitlements b/tools/osx/rt-bin.entitlements deleted file mode 100644 index 9e5e269cb..000000000 --- a/tools/osx/rt-bin.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - -com.apple.security.inherit - - - \ No newline at end of file diff --git a/tools/osx/rt.entitlements b/tools/osx/rt.entitlements index 082661401..8fc97c7da 100644 --- a/tools/osx/rt.entitlements +++ b/tools/osx/rt.entitlements @@ -1,20 +1,16 @@ - - application-identifier - com.rawtherapee.rawtherapee - com.apple.security.temporary-exception.files.absolute-path.read-write - - "/" - - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.files.user-selected.read-write - - com.apple.security.app-sandbox - - com.apple.security.files.downloads.read-write - - + + com.apple.application-identifier + com.rawtherapee.RawTherapee + com.apple.security.app-sandbox + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.temporary-exception.files.absolute-path.read-write + + / + + diff --git a/tools/osx/rtdmg-bkgd.png b/tools/osx/rtdmg-bkgd.png new file mode 100644 index 000000000..ecd9b9d42 Binary files /dev/null and b/tools/osx/rtdmg-bkgd.png differ diff --git a/tools/osx/rtdmg.icns b/tools/osx/rtdmg.icns new file mode 100644 index 000000000..31b53c8ab Binary files /dev/null and b/tools/osx/rtdmg.icns differ diff --git a/tools/win/InnoSetup/WindowsInnoSetup.iss.in b/tools/win/InnoSetup/WindowsInnoSetup.iss.in index e4ae43536..954d39991 100644 --- a/tools/win/InnoSetup/WindowsInnoSetup.iss.in +++ b/tools/win/InnoSetup/WindowsInnoSetup.iss.in @@ -47,7 +47,7 @@ AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName}\{#MyAppVersion} DefaultGroupName={#MyAppName} AllowNoIcons=yes -LicenseFile={#MyBuildBasePath}\LICENSE.txt +LicenseFile={#MyBuildBasePath}\LICENSE OutputDir={#MyBuildBasePath}\..\ OutputBaseFilename={#MyAppName}_{#MyAppVersion}_{#MySystemName}_{#MyBitDepth} SetupIconFile={#MySourceBasePath}\rtdata\images\rawtherapee.ico @@ -61,7 +61,9 @@ PrivilegesRequired=none [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" +Name: "armenian"; MessagesFile: "compiler:Languages\Armenian.isl" Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" +Name: "bulgarian"; MessagesFile: "compiler:Languages\Bulgarian.isl" Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl" Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" @@ -70,19 +72,18 @@ Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" -Name: "greek"; MessagesFile: "compiler:Languages\Greek.isl" Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" -Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl" +Name: "icelandic"; MessagesFile: "compiler:Languages\Icelandic.isl" Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" -Name: "serbiancyrillic"; MessagesFile: "compiler:Languages\SerbianCyrillic.isl" -Name: "serbianlatin"; MessagesFile: "compiler:Languages\SerbianLatin.isl" +Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl" Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" +Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" [Tasks] @@ -111,7 +112,7 @@ Source: "{#MyBuildBasePath}\sounds\*"; DestDir: "{app}\sounds\"; Flags: ignoreve Source: "{#MyBuildBasePath}\themes\*"; DestDir: "{app}\themes\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\AboutThisBuild.txt"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\AUTHORS.txt"; DestDir: "{app}"; Flags: ignoreversion -Source: "{#MyBuildBasePath}\LICENSE.txt"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#MyBuildBasePath}\LICENSE"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\RELEASE_NOTES.txt"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\options"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\*.dll"; DestDir: "{app}"; Flags: ignoreversion @@ -152,4 +153,4 @@ function IsElevatedUser(): Boolean; begin Result := IsAdminLoggedOn or IsPowerUserLoggedOn; end; - \ No newline at end of file +